From ca479b0ff2a4417bc1960398e59336cfa4aa4be7 Mon Sep 17 00:00:00 2001 From: <Cissou@DESKTOP-4131M6E.localdomain> Date: Tue, 19 Mar 2019 10:23:27 +0100 Subject: [PATCH 001/496] encoding.py & export.py --- nautilus_nlp/utils/encoding.py | 50 ++++++++++++++++++++++++++++++++++ nautilus_nlp/utils/export.py | 9 ++++++ 2 files changed, 59 insertions(+) create mode 100644 nautilus_nlp/utils/encoding.py create mode 100644 nautilus_nlp/utils/export.py diff --git a/nautilus_nlp/utils/encoding.py b/nautilus_nlp/utils/encoding.py new file mode 100644 index 0000000..22cfa10 --- /dev/null +++ b/nautilus_nlp/utils/encoding.py @@ -0,0 +1,50 @@ +import pandas as pd +import chardet +import glob +import json + +#Import an encoded csv or txt file as a pandas DataFrame +def import_from_file_as_pd(file, sep=',', header = None, verbose=True): + encods = ['utf-8', 'ISO-8859-1', 'latin1', 'cp1252'] + try: + for encod in encods: + try: + data = pd.read_csv(file, sep = sep, encoding = encod, header=header) + break + except: + continue + if verbose: + print('Success:',encod) + except: + rawdata = open(file, 'rb').read() + result = chardet.detect(rawdata)['encoding'] + print(result) + data = pd.read_csv(file, encoding = result, header=header) + return data + + +#Import encoded csv or txt files from a folder as a pandas DataFrame +def import_from_folder_as_pd(path, sep = ',', verbose=False): + all_files = glob.glob(path + "/*.csv") + li = [] + + for file in all_files: + data = import_from_file_as_pd(file, sep = sep, verbose=verbose) + li.append(data) + + frame = pd.concat(li, axis=0) + return frame + +#Import a json file as a pandas DataFrame +def import_json_to_pd(file): + with open(file) as json_file: + data = json.load(json_file) + json.dumps(data) + df = pd.DataFrame(data) + return df + +#Import a json file as a dictionary +def json_to_dict(file): + with open(file) as json_file: + data = json.load(json_file) + return data \ No newline at end of file diff --git a/nautilus_nlp/utils/export.py b/nautilus_nlp/utils/export.py new file mode 100644 index 0000000..d6b4ad5 --- /dev/null +++ b/nautilus_nlp/utils/export.py @@ -0,0 +1,9 @@ +import pandas as pd + +#Save a pandas DataFrame as an encoded csv file +def df_to_csv (df, path, sep =',', encoding='utf-8'): + df.to_csv(path, sep = sep, encoding = encoding) + +#Save a pandas DataFrame as a json file +def df_to_json (df, path, orient): + df.to_json(path, orient = orient) \ No newline at end of file From df284d87f500d8f9146d3d8c86e9540b3b912d46 Mon Sep 17 00:00:00 2001 From: Robin <rdoume@gmail.com> Date: Fri, 22 Mar 2019 16:54:54 +0100 Subject: [PATCH 002/496] Change readme for installing the requirements --- README.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/README.md b/README.md index 6edc2f7..751ed6d 100644 --- a/README.md +++ b/README.md @@ -18,6 +18,10 @@ To install this library you should first clone the repository: `git clone https://github.com/artefactory/nautilus_nlp/ && cd nautilus_nlp` +**If you don't use the docker container, we strongly advise you to do these steps in a virtual environnement** + +First you need to install the required files: +`pip install -r requirements.txt` then you can install it via pip: `pip install -e .` From cf98cd29ec84a1c96eeefa3f5c3595f37a78a1ac Mon Sep 17 00:00:00 2001 From: Robin <rdoume@gmail.com> Date: Fri, 22 Mar 2019 16:55:41 +0100 Subject: [PATCH 003/496] Change docker build script to build library directly --- notebooks/Language_identification.ipynb | 614 ++++++++++++++++++++++++ 1 file changed, 614 insertions(+) create mode 100644 notebooks/Language_identification.ipynb diff --git a/notebooks/Language_identification.ipynb b/notebooks/Language_identification.ipynb new file mode 100644 index 0000000..0bd6927 --- /dev/null +++ b/notebooks/Language_identification.ipynb @@ -0,0 +1,614 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 49, + "metadata": {}, + "outputs": [ + { + "ename": "ModuleNotFoundError", + "evalue": "No module named 'pandas'", + "output_type": "error", + "traceback": [ + "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", + "\u001b[0;31mModuleNotFoundError\u001b[0m Traceback (most recent call last)", + "\u001b[0;32m<ipython-input-49-5bdfc092f0f9>\u001b[0m in \u001b[0;36m<module>\u001b[0;34m\u001b[0m\n\u001b[1;32m 1\u001b[0m \u001b[0;32mimport\u001b[0m \u001b[0mcsv\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 2\u001b[0m \u001b[0;32mimport\u001b[0m \u001b[0mre\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 3\u001b[0;31m \u001b[0;32mimport\u001b[0m \u001b[0mpandas\u001b[0m \u001b[0;32mas\u001b[0m \u001b[0mpd\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", + "\u001b[0;31mModuleNotFoundError\u001b[0m: No module named 'pandas'" + ] + } + ], + "source": [ + "import csv \n", + "import re\n", + "import pandas as pd" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Data Cleaning:\n", + "Pour télécharger les datas pour ce notebook, vous pouvez utilisez le [script associé](/nautilus_nlp/data/external/get_language_dataset.sh)" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": {}, + "outputs": [], + "source": [ + "with open('../data/external/wili/x_test.txt',encoding='utf-8') as fp:\n", + " test=fp.readlines()\n", + " test=[doc.strip('\\n') for doc in test]" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Le Dataset Wili est un dataset d'identification de langue basé sur Wikipedia. Des exemples du tests set suivent: " + ] + }, + { + "cell_type": "code", + "execution_count": 34, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "\"Ne l fin de l seclo XIX l Japon era inda çconhecido i sótico pa l mundo oucidental. Cula antroduçon de la stética japonesa, particularmente na Sposiçon Ounibersal de 1900, an Paris, l Oucidente adquiriu un apetite ansaciable pul Japon i Heiarn se tornou mundialmente coincido pula perfundidade, ouriginalidade i sinceridade de ls sous cuntos. An sous radadeiros anhos, alguns críticos, cumo George Orwell, acusórun Heiarn de trasferir sou nacionalismo i fazer l Japon parecer mais sótico, mas, cumo l'home qu'oufereciu al Oucidente alguns de sous purmeiros lampeijos de l Japon pré-andustrial i de l Período Meiji, sou trabalho inda ye balioso até hoije.\"" + ] + }, + "execution_count": 34, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "\n", + "test[0]" + ] + }, + { + "cell_type": "code", + "execution_count": 28, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "'Schiedam is gelegen tussen Rotterdam en Vlaardingen, oorspronkelijk aan de Schie en later ook aan de Nieuwe Maas. Per 30 april 2017 had de gemeente 77.833 inwoners (bron: CBS). De stad is vooral bekend om haar jenever, de historische binnenstad met grachten, en de hoogste windmolens ter wereld.'" + ] + }, + "execution_count": 28, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "test[1]" + ] + }, + { + "cell_type": "code", + "execution_count": 29, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "'ГIурусаз батальонал, гьоркьор гIарадабиги лъун, ункъбокIон (каре) гьабун чIезарун руго. ТIаде гIарададул сачмаги гуллаги байдал, АхIмадханил бо тIурун буго. ГIумаханас цойгидал боязе тIаде кIанцIизе буюрухъ кьун буго. Гьезулги жо ккун гьечIо. Цинги живго ГIумахан кIанцIун вуго тушманасде тIаде («угъузилал рачун, дайтилал рачун, маххулъан бер баккун хунз цадахъ рачун»). Нахъе къалел ругел магIарулазда гьес гьарулеб букIун буго: «Нужеца яхI бахъе, гIолохъаби! Нилъеда данде гьал чIоларо», – ян.'" + ] + }, + "execution_count": 29, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "test[2]" + ] + }, + { + "cell_type": "code", + "execution_count": 30, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "'ರಾಜ್ಯಶಾಸ್ತ್ರದ ಪಿತಾಮಹೆ ಅರಿಸ್ಟಾಟಲ್. ರಾಜ್ಯಶಾಸ್ತ್ರದ ವೈಜ್ನಾನಿಕವಾದ್ ಅದ್ಯಾಯನ ಮಲ್ದಿನಾರ್ ಅರಿಸ್ಟಾಟಲ್. ಮೇರ್ 158 ರಾಷ್ಟ್ರದ ಸಂವಿಧಾನಲೆನ್ ಅರ್ಥ ಮಲ್ತೊನ್ದ್ the politics ಕೃತಿ ರಚನೆ ಮಲ್ದೆರ್. ಮೇರ್ ಕ್ರಿ.ಪೂ 387 ಗ್ರೀಕ್ ಸ್ಟಾಗಿರಡ್ ಜನಿಸಿಯೆರ್. ಮೆರೆನ ಅಮ್ಮೆರ್ ಮೆಸೆದೊನಿಯ ಅರಸೆರ್ನ ರಾಜವೈದ್ಯರ್ ಅದುದ್ ಇತ್ತೆರ್. ಎಲ್ಳಡೆ ಮೆರ್ ತತ್ವಶಾಸ್ತ್ರ,ಅರ್ಥಶಾಸ್ತ್ರ,ಸಂಗೀತ,ವಿಜ್ನಾನ,ಪೌರನೀತಿ,ಗಣಿತ ನೆಟ್ಟ್ ಪರಂಗತೆರ್ ಅದುದ್ ಇತ್ತೆರ್. ವಿದ್ಯಾಭ್ಯಾಸ ಮುಗಿ ಬೊಕ್ಕ ಪ್ಲೇಟೋ ಗ್ರೀಕ್ ತತ್ವಜ್ನಾನಿನೊಟ್ ಸೆರೊಂಡೆರ್. ಪ್ಲೇಟೋನ ಅಕಾಡೆಮಿಡ್ ಮಸ್ತ್ ವರ್ಷ ಬೇಲೆ ಮಲ್ತೆರ್. ಅಕಾಡೆಮಿಡ್ ನಿರ್ದೆಶೆಕೆರ್ನ ಹುದ್ದೆ ತಿಕ್ಕಂದೆ ಬೆಜರ್ ಅದುದ್ ಲೈಸಿಯಮ್ ಪನ್ಪಿನ ವಿಶ್ವವಿದ್ಯಾನಿಲಯ ಸ್ಥಾಪನೆ ಮಲ್ತೆರ್. ಬಿಕ್ಕ ಒಂತೆ ಸಮಯ ಅಲೆಗ್ಸಾಂಡರ್ ಚಕ್ರವರ್ತಿಗ್ ಗುರುವಾದ್ ಬೇಲೆ ಮಲ್ತೆರ್. ಮೇರ್ ಬರೆತಿನ ಪುಸ್ತಕ the politics,history of animals,metaphysics ಇತ್ಯಾದಿ.'" + ] + }, + "execution_count": 30, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "test[3]" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "'Тухайн үед дан ганц 20кг-ын Орос баллон хэрэглэдэг байсан уламжлалыг халж хэрэглэгчдийг сонголт ихтэй болгож 5,10,14,20 кг хэмжээтэй, баллонуудыг захиалан үйлдвэрлүүлж, өөрийн брэнд болгон хэрэглээнд нэвтрүүлж, хийн түлшээр ажилладаг тулга, төрөл бүрийн халаагуурууд, тоног төхөөрөмжийн ашиглалт, хийн түлшний ашиг тусыг хэвлэл мэдээллийн хэрэгслэлээр тасралтгүй сурталчилсаны үр дүнд 2002 оны 5 сар гэхэд хийн түлшний хэрэглээ сард 30 тн, 9 сард 50 тн хүрч өссөн юм.'" + ] + }, + "execution_count": 13, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "test[5]" + ] + }, + { + "cell_type": "code", + "execution_count": 45, + "metadata": {}, + "outputs": [], + "source": [ + "with open('../data/external/wili/y_test.txt',encoding='utf-8') as fp:\n", + " y=fp.readlines()" + ] + }, + { + "cell_type": "code", + "execution_count": 47, + "metadata": {}, + "outputs": [], + "source": [ + "with open('../data/external/wili/labels.csv',encoding='utf-8') as fp:\n", + " labels=fp.readlines()" + ] + }, + { + "cell_type": "code", + "execution_count": 48, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "['Label;English;Wiki Code;ISO 369-3;German;Language family;Writing system;Remarks;Synonyms\\n',\n", + " 'ace;Achinese;ace;ace;Achinesisch;Austronesian;;;\\n',\n", + " 'afr;Afrikaans;af;afr;Afrikaans;Indo-European;;;\\n',\n", + " 'als;Alemannic German;als;gsw;Alemannisch;Indo-European;;(ursprünglich nur\\xa0Elsässisch);\\n',\n", + " 'amh;Amharic;am;amh;Amharisch;Afro-Asiatic;;;\\n',\n", + " 'ang;Old English ;ang;ang;Altenglisch;Indo-European;;(ca. 450-1100);Angelsächsisch\\n',\n", + " 'ara;Arabic;ar;ara;Arabisch;Afro-Asiatic;;;\\n',\n", + " 'arg;Aragonese;an;arg;Aragonesisch;Indo-European;;;\\n',\n", + " 'arz;Egyptian Arabic;arz;arz;Ägyptisch-Arabisch;Afro-Asiatic;;;\\n',\n", + " 'asm;Assamese;as;asm;Assamesisch;Indo-European;;;\\n',\n", + " 'ast;Asturian;ast;ast;Asturisch;Indo-European;;;\\n',\n", + " 'ava;Avar;av;ava;Awarisch;Northeast Caucasian;;;\\n',\n", + " 'aym;Aymara;ay;aym;Aymara;Aymaran;;;\\n',\n", + " 'azb;South Azerbaijani;azb;azb;Südaserbaidschanisch;Turkic;Arabic;;\\n',\n", + " 'aze;Azerbaijani;az;aze;Aserbaidschanisch;Turkic;Latin;;\\n',\n", + " 'bak;Bashkir;ba;bak;Baschkirisch;Turkic;;;\\n',\n", + " 'bar;Bavarian;bar;bar;Bairisch;Indo-European;;;\\n',\n", + " 'bcl;Central Bikol;bcl;bcl;Bikolano;Austronesian;;;\\n',\n", + " 'be-tarask;Belarusian (Taraschkewiza);be-tarask;;Weißrussisch (Taraschkewiza);Indo-European;;;\\n',\n", + " 'bel;Belarusian;be;bel;Weißrussisch;Indo-European;;(normativ);\\n',\n", + " 'ben;Bengali;bn;ben;Bengalisch;Indo-European;;;\\n',\n", + " 'bho;Bhojpuri;bh;bho;Bhojpuri;Indo-European;;;\\n',\n", + " 'bjn;Banjar;bjn;bjn;Banjaresisch;Austronesian;;;\\n',\n", + " 'bod;Tibetan;bo;bod;Tibetisch;Sino-Tibetan;;;\\n',\n", + " 'bos;Bosnian;bs;bos;Bosnisch;Indo-European;;;\\n',\n", + " 'bpy;Bishnupriya;bpy;bpy;Bishnupriya Manipuri;Indo-European;;;\\n',\n", + " 'bre;Breton;br;bre;Bretonisch;Indo-European;;;\\n',\n", + " 'bul;Bulgarian;bg;bul;Bulgarisch;Indo-European;;;\\n',\n", + " 'bxr;Buryat;bxr;bxr;Burjatisch;Mongolic;Cyrillic:::Mongolian script:::Vagindra script:::Latin;;Buriat\\n',\n", + " 'cat;Catalan;ca;cat;Katalanisch;Indo-European;Latin;;\\n',\n", + " 'cbk;Chavacano;cbk-zam;cbk;Chabacano;Indo-European;;;\\n',\n", + " 'cdo;Min Dong;cdo;cdo;Min Dong;Sino-Tibetan;;;\\n',\n", + " 'ceb;Cebuano;ceb;ceb;Cebuano;Austronesian;Latin;;\\n',\n", + " 'ces;Czech;cs;ces;Tschechisch;Indo-European;Latin;;\\n',\n", + " 'che;Chechen;ce;che;Tschetschenisch;Northeast Caucasian;;;\\n',\n", + " 'chr;Cherokee;chr;chr;Cherokee;Iroquoian;;;\\n',\n", + " 'chv;Chuvash;cv;chv;Tschuwaschisch;Turkic;;;\\n',\n", + " 'ckb;Central Kurdish;ckb;ckb;Sorani;Indo-European;;;\\n',\n", + " 'cor;Cornish;kw;cor;Kornisch;Indo-European;;;\\n',\n", + " 'cos;Corsican;co;cos;Korsisch;Indo-European;;;\\n',\n", + " 'crh;Crimean Tatar;crh;crh;Krimtatarisch;Turkic;;;\\n',\n", + " 'csb;Kashubian;csb;csb;Kaschubisch;Indo-European;;;\\n',\n", + " 'cym;Welsh;cy;cym;Walisisch;Indo-European;;;\\n',\n", + " 'dan;Danish;da;dan;Dänisch;Indo-European;;;\\n',\n", + " 'deu;German;de;deu;Deutsch;Indo-European;Latin;;\\n',\n", + " 'diq;Dimli;diq;diq;Süd-Zazaisch;Indo-European;;;\\n',\n", + " 'div;Dhivehi;dv;div;Dhivehi;Indo-European;;;\\n',\n", + " 'dsb;Lower Sorbian;dsb;dsb;Niedersorbisch;Indo-European;;;\\n',\n", + " 'dty;Doteli;dty;dty;Doteli;Indo-European;;;\\n',\n", + " 'egl;Emilian;eml;egl;Emilianisch;Indo-European;;;\\n',\n", + " 'ell;Modern Greek;el;ell;Griechisch;Indo-European;;(1453-);\\n',\n", + " 'eng;English;en;eng;Englisch;Indo-European;Latin;;\\n',\n", + " 'epo;Esperanto;eo;epo;Esperanto;Constructed;;;\\n',\n", + " 'est;Estonian;et;est;Estnisch;Uralic;;;\\n',\n", + " 'eus;Basque;eu;eus;Baskisch;Language isolate;;;\\n',\n", + " 'ext;Extremaduran;ext;ext;Extremadurisch;Indo-European;;;\\n',\n", + " 'fao;Faroese;fo;fao;Färöisch;Indo-European;;;\\n',\n", + " 'fas;Persian;fa;fas;Persisch;Indo-European;;;\\n',\n", + " 'fin;Finnish;fi;fin;Finnisch;Uralic;Latin;;\\n',\n", + " 'fra;French;fr;fra;Französisch;Indo-European;Latin;;\\n',\n", + " 'frp;Arpitan;frp;frp;Frankoprovenzalisch;Indo-European;;;\\n',\n", + " 'fry;Western Frisian;fy;fry;Westfriesisch;Indo-European;;;\\n',\n", + " 'fur;Friulian;fur;fur;Furlanisch;Indo-European;;;\\n',\n", + " 'gag;Gagauz;gag;gag;Gagausisch;Turkic;;;\\n',\n", + " 'gla;Scottish Gaelic;gd;gla;Schottisch-Gälisch;Indo-European;;;\\n',\n", + " 'gle;Irish;ga;gle;Irisch;Indo-European;;;\\n',\n", + " 'glg;Galician;gl;glg;Galicisch;Indo-European;;;\\n',\n", + " 'glk;Gilaki;glk;glk;Gilaki;Indo-European;;;\\n',\n", + " 'glv;Manx;gv;glv;Manx;Indo-European;;;\\n',\n", + " 'grn;Guarani;gn;grn;Guaraní;Tupi-Guarani;;;\\n',\n", + " 'guj;Gujarati;gu;guj;Gujarati;Indo-European;;;\\n',\n", + " 'hak;Hakka Chinese;hak;hak;Hakka;Sino-Tibetan;;;\\n',\n", + " 'hat;Haitian Creole;ht;hat;Haitianisch;Indo-European;;;\\n',\n", + " 'hau;Hausa;ha;hau;Hausa;Afro-Asiatic;Latin;;Chadic\\n',\n", + " 'hbs;Serbo-Croatian;sh;hbs;Serbokroatisch;Indo-European;;;\\n',\n", + " 'heb;Hebrew;he;heb;Hebräisch;Afro-Asiatic;;;\\n',\n", + " 'hif;Fiji Hindi;hif;hif;Fidschi-Hindi;Indo-European;;;\\n',\n", + " 'hin;Hindi;hi;hin;Hindi;Indo-European;;;\\n',\n", + " 'hrv;Croatian;hr;hrv;Kroatisch;Indo-European;;;\\n',\n", + " 'hsb;Upper Sorbian;hsb;hsb;Obersorbisch;Indo-European;;;\\n',\n", + " 'hun;Hungarian;hu;hun;Ungarisch;Uralic;;;\\n',\n", + " 'hye;Armenian;hy;hye;Armenisch;Indo-European;;;\\n',\n", + " 'ibo;Igbo;ig;ibo;Igbo;Niger-Congo;Latin;;\\n',\n", + " 'ido;Ido;io;ido;Ido;Constructed;;;\\n',\n", + " 'ile;Interlingue;ie;ile;Interlingue;Constructed;;;\\n',\n", + " 'ilo;Iloko;ilo;ilo;Ilokano;Austronesian;;;\\n',\n", + " 'ina;Interlingua;ia;ina;Interlingua;Constructed;;;\\n',\n", + " 'ind;Indonesian;id;ind;Indonesisch;Austronesian;Latin;;\\n',\n", + " 'isl;Icelandic;is;isl;Isländisch;Indo-European;;;\\n',\n", + " 'ita;Italian;it;ita;Italienisch;Indo-European;Latin;;\\n',\n", + " 'jam;Jamaican Patois;jam;jam;Jamaikanisch-kreolisch;Indo-European;;;\\n',\n", + " 'jav;Javanese;jv;jav;Javanisch;Austronesian;;;\\n',\n", + " 'jbo;Lojban;jbo;jbo;Lojban;Constructed;Latin;;\\n',\n", + " 'jpn;Japanese;ja;jpn;Japanisch;Japonic;;;\\n',\n", + " 'kaa;Karakalpak;kaa;kaa;Karakalpakisch;Turkic;;;\\n',\n", + " 'kab;Kabyle;kab;kab;Kabylisch;Afro-Asiatic;;;\\n',\n", + " 'kan;Kannada;kn;kan;Kannada;Dravidian;;;\\n',\n", + " 'kat;Georgian;ka;kat;Georgisch;South Caucasian;;;\\n',\n", + " 'kaz;Kazakh;kk;kaz;Kasachisch;Turkic;;;\\n',\n", + " 'kbd;Kabardian;kbd;kbd;Kabardinisch;Northeast Caucasian;Cyrillic:::Latin:::Arabic;;Kabardino-Cherkess:::East Circassian\\n',\n", + " 'khm;Central Khmer;km;khm;Khmer;Austronesian;;;\\n',\n", + " 'kin;Kinyarwanda;rw;kin;Kinyarwanda;Niger-Congo;Latin;;Fumbira\\n',\n", + " 'kir;Kirghiz;ky;kir;Kirgisisch;Turkic;;;\\n',\n", + " 'koi;Komi-Permyak;koi;koi;Komi-Permjakisch;Uralic;;;\\n',\n", + " 'kok;Konkani;gom;kok;Konkani;Indo-European;;;\\n',\n", + " 'kom;Komi;kv;kom;Komi;Uralic;;;\\n',\n", + " 'kor;Korean;ko;kor;Koreanisch;Koreanic;;;\\n',\n", + " 'krc;Karachay-Balkar;krc;krc;Karatschai-balkarisch;Turkic;;;\\n',\n", + " 'ksh;Ripuarisch;ksh;ksh;Kölsch;Indo-European;;;\\n',\n", + " 'kur;Kurdish;ku;kur;Kurdisch;Indo-European;Latin;;\\n',\n", + " 'lad;Ladino;lad;lad;Judenspanisch;Indo-European;;;\\n',\n", + " 'lao;Lao;lo;lao;Laotisch;Tai-Kadai;;;\\n',\n", + " 'lat;Latin;la;lat;Latein;Indo-European;;;\\n',\n", + " 'lav;Latvian;lv;lav;Lettisch;Indo-European;;;\\n',\n", + " 'lez;Lezghian;lez;lez;Lesgisch;Northeast Caucasian;;;\\n',\n", + " 'lij;Ligurian;lij;lij;Ligurisch;Indo-European;;(Romanisch);\\n',\n", + " 'lim;Limburgan;li;lim;Limburgisch;Indo-European;;;\\n',\n", + " 'lin;Lingala;ln;lin;Lingála;Niger-Congo;;;\\n',\n", + " 'lit;Lithuanian;lt;lit;Litauisch;Indo-European;;;\\n',\n", + " 'lmo;Lombard;lmo;lmo;Lombardisch;Indo-European;;;\\n',\n", + " 'lrc;Northern Luri;lrc;lrc;nördliches Luri;Indo-European;;;\\n',\n", + " 'ltg;Latgalian;ltg;ltg;Lettgallisch;Indo-European;;;\\n',\n", + " 'ltz;Luxembourgish;lb;ltz;Luxemburgisch;Indo-European;;;\\n',\n", + " 'lug;Luganda;lg;lug;Luganda;Niger-Congo;Latin;;Ganda\\n',\n", + " 'lzh;Literary Chinese;zh-classical;lzh;klassisches Chinesisch;Sino-Tibetan;;;\\n',\n", + " 'mai;Maithili;mai;mai;Maithili;Indo-European;;;\\n',\n", + " 'mal;Malayalam;ml;mal;Malayalam;Dravidian;;;\\n',\n", + " 'map-bms;Banyumasan;map-bms;map-bms;Banyumasan;Austronesian;;Javanese;\\n',\n", + " 'mar;Marathi;mr;mar;Marathi;Indo-European;;;\\n',\n", + " 'mdf;Moksha;mdf;mdf;Mokschanisch;Uralic;Cyrillic;;\\n',\n", + " 'mhr;Eastern Mari;mhr;mhr;Ostmari;Uralic;;;\\n',\n", + " 'min;Minangkabau;min;min;Minangkabauisch;Austronesian;;;\\n',\n", + " 'mkd;Macedonian;mk;mkd;Mazedonisch;Indo-European;;;\\n',\n", + " 'mlg;Malagasy;mg;mlg;Malagasy;Austronesian;;;\\n',\n", + " 'mlt;Maltese;mt;mlt;Maltesisch;Afro-Asiatic;;;\\n',\n", + " 'mon;Mongolian;mn;mon;Mongolisch;Mongolic;;;\\n',\n", + " 'mri;Maori;mi;mri;Maori;Austronesian;;;\\n',\n", + " 'mrj;Western Mari;mrj;mrj;Westmari;Uralic;;;\\n',\n", + " 'msa;Malay;ms;msa;Malaiisch;Austronesian;;;\\n',\n", + " 'mwl;Mirandese;mwl;mwl;Mirandés;Indo-European;;;\\n',\n", + " 'mya;Burmese;my;mya;Birmanisch;Sino-Tibetan;;;\\n',\n", + " 'myv;Erzya;myv;myv;Ersja-Mordwinisch;Uralic;;;\\n',\n", + " 'mzn;Mazanderani;mzn;mzn;Masanderanisch;Indo-European;;;\\n',\n", + " 'nan;Min Nan Chinese;zh-min-nan;nan;Min Nan;Sino-Tibetan;;;\\n',\n", + " 'nap;Neapolitan;nap;nap;Neapolitanisch;Indo-European;;;\\n',\n", + " 'nav;Navajo;nv;nav;Navajo;Dené-Yeniseian;;;\\n',\n", + " 'nci;Classical Nahuatl;nah;nci;Nahuatl;Uto-Aztecan;;;\\n',\n", + " 'nds;Low German;nds;nds;Niedersächsisch/Ostniederdeutsch;Indo-European;;;\\n',\n", + " 'nds-nl;West Low German;nds-nl;nds;Nedersaksisch;Indo-European;;;\\n',\n", + " 'nep;Nepali (macrolanguage);ne;nep;Nepali;Indo-European;;;\\n',\n", + " 'new;Newari;new;new;Newari;Sino-Tibetan;;;\\n',\n", + " 'nld;Dutch;nl;nld;Niederländisch;Indo-European;Latin;;\\n',\n", + " 'nno;Norwegian Nynorsk;nn;nno;Nynorsk;Indo-European;;;\\n',\n", + " 'nob;Bokmål;no;nob;Bokmål;Indo-European;Latin;Norwegian;\\n',\n", + " 'nrm;Narom;nrm;nrm;Normannisch;Austronesian;;;\\n',\n", + " 'nso;Northern Sotho;nso;nso;Nord-Sotho;Niger-Congo;;;\\n',\n", + " 'oci;Occitan;oc;oci;Okzitanisch;Indo-European;;(post 1500);\\n',\n", + " 'olo;Livvi-Karelian;olo;olo;Olonetzisch;Uralic;;;\\n',\n", + " 'ori;Oriya;or;ori;Oriya;Indo-European;;;\\n',\n", + " \"orm;Oromo;om;orm;Oromo;Afro-Asiatic;Latin:::Ge'ez ;;\\n\",\n", + " 'oss;Ossetian;os;oss;Ossetisch;Indo-European;;;\\n',\n", + " 'pag;Pangasinan;pag;pag;Pangasinensisch;Austronesian;;;\\n',\n", + " 'pam;Pampanga;pam;pam;Kapampangan;Austronesian;;;\\n',\n", + " 'pan;Panjabi;pa;pan;Panjabi\\xa0in\\xa0Gurmukhi-Schrift;Indo-European;;;\\n',\n", + " 'pap;Papiamento;pap;pap;Papiamentu;Indo-European;;;\\n',\n", + " 'pcd;Picard;pcd;pcd;Picardisch;Indo-European;;;\\n',\n", + " 'pdc;Pennsylvania German;pdc;pdc;Pennsylvaniadeutsch;Indo-European;;;Deitsch:::Pennsylvania Deitsch:::Pennsilfaanisch Deitsch:::Pennsylvania Dutch\\n',\n", + " 'pfl;Palatine German;pfl;pfl;Pfälzisch;Indo-European;;;\\n',\n", + " 'pnb;Western Panjabi;pnb;pnb;Panjabi;Indo-European;Arabic;;\\n',\n", + " 'pol;Polish;pl;pol;Polnisch;Indo-European;Latin;;\\n',\n", + " 'por;Portuguese;pt;por;Portugiesisch;Indo-European;Latin;;\\n',\n", + " 'pus;Pushto;ps;pus;Paschtunisch;Indo-European;;;\\n',\n", + " 'que;Quechua;qu;que;Quechua;Quechuan;;;\\n',\n", + " 'roa-tara;Tarantino dialect;roa-tara;;Tarandíne;Indo-European;;;\\n',\n", + " 'roh;Romansh;rm;roh;Bündnerromanisch;Indo-European;;;\\n',\n", + " 'ron;Romanian;ro;ron;Rumänisch;Indo-European;;;\\n',\n", + " 'rue;Rusyn;rue;rue;Karpato-Russinisch;Indo-European;;;\\n',\n", + " 'rup;Aromanian;roa-rup;rup;Aromunisch;Indo-European;Latin;Macedo-Romanian::Vlach;\\n',\n", + " 'rus;Russian;ru;rus;Russisch;Indo-European;Cyrillic;;\\n',\n", + " 'sah;Yakut;sah;sah;Jakutisch;Turkic;;;\\n',\n", + " 'san;Sanskrit;sa;san;Sanskrit;Indo-European;;;\\n',\n", + " 'scn;Sicilian;scn;scn;Sizilianisch;Indo-European;;;\\n',\n", + " 'sco;Scots;sco;sco;Scots;Indo-European;;;\\n',\n", + " 'sgs;Samogitian;bat-smg;sgs;Schemaitisch;Indo-European;;;\\n',\n", + " 'sin;Sinhala;si;sin;Singhalesisch;Indo-European;;;\\n',\n", + " 'slk;Slovak;sk;slk;Slowakisch;Indo-European;;;\\n',\n", + " 'slv;Slovene;sl;slv;Slowenisch;Indo-European;;;\\n',\n", + " 'sme;Northern Sami;se;sme;Nordsamisch;Uralic;;;\\n',\n", + " 'sna;Shona;sn;sna;Shona;Niger-Congo;;;\\n',\n", + " 'snd;Sindhi;sd;snd;Sindhi;Indo-European;;;\\n',\n", + " 'som;Somali;so;som;Somali;Afro-Asiatic;;;\\n',\n", + " 'spa;Spanish;es;spa;Spanisch;Indo-European;Latin;;\\n',\n", + " 'sqi;Albanian;sq;sqi;Albanisch;Indo-European;;;\\n',\n", + " 'srd;Sardinian;sc;srd;Sardisch;Indo-European;;;\\n',\n", + " 'srn;Sranan;srn;srn;Sranantongo;Indo-European;;;Sranan Tongo:::Sranantongo:::Surinaams:::Surinamese:::Surinamese Creole:::Taki Taki\\n',\n", + " 'srp;Serbian;sr;srp;Serbisch;Indo-European;;;\\n',\n", + " 'stq;Saterfriesisch;stq;stq;Saterfriesisch;Indo-European;;;\\n',\n", + " 'sun;Sundanese;su;sun;Sundanesisch;Austronesian;;;\\n',\n", + " 'swa;Swahili (macrolanguage);sw;swa;Swahili;Niger-Congo;;;\\n',\n", + " 'swe;Swedish;sv;swe;Schwedisch;Indo-European;Latin;;\\n',\n", + " 'szl;Silesian;szl;szl;Schlesisch;Indo-European;;(polnischer Dialekt);\\n',\n", + " 'tam;Tamil;ta;tam;Tamil;Dravidian;;;\\n',\n", + " 'tat;Tatar;tt;tat;Tatarisch;Turkic;;;\\n',\n", + " 'tcy;Tulu;tcy;tcy;Tulu;Dravidian;Kannada:::Tigalari;;\\n',\n", + " 'tel;Telugu;te;tel;Telugu;Dravidian;;;\\n',\n", + " 'tet;Tetum;tet;tet;Tetum;Austronesian;;;\\n',\n", + " 'tgk;Tajik;tg;tgk;Tadschikisch;Indo-European;;;\\n',\n", + " 'tgl;Tagalog;tl;tgl;Tagalog;Austronesian;;;\\n',\n", + " 'tha;Thai;th;tha;Thailändisch;Tai-Kadai;;;\\n',\n", + " 'ton;Tongan;to;ton;Tongaisch;Austronesian;Latin;;\\n',\n", + " 'tsn;Tswana;tn;tsn;Setswana;Niger-Congo;Latin;;Setswana\\n',\n", + " 'tuk;Turkmen;tk;tuk;Turkmenisch;Turkic;;;\\n',\n", + " 'tur;Turkish;tr;tur;Türkisch;Turkic;;;\\n',\n", + " 'tyv;Tuvan;tyv;tyv;Tuwinisch;Turkic;Cyrillic;;\\n',\n", + " 'udm;Udmurt;udm;udm;Udmurtisch;Uralic;;;\\n',\n", + " 'uig;Uighur;ug;uig;Uigurisch;Turkic;;;\\n',\n", + " 'ukr;Ukrainian;uk;ukr;Ukrainisch;Indo-European;Cyrillic;;\\n',\n", + " 'urd;Urdu;ur;urd;Urdu;Indo-European;;;\\n',\n", + " 'uzb;Uzbek;uz;uzb;Usbekisch;Turkic;;;\\n',\n", + " 'vec;Venetian;vec;vec;Venetisch;Indo-European;;;\\n',\n", + " 'vep;Veps;vep;vep;Wepsisch;Uralic;;;\\n',\n", + " 'vie;Vietnamese;vi;vie;Vietnamesisch;Austronesian;Latin;;\\n',\n", + " 'vls;Vlaams;vls;vls;Westflämisch;Indo-European;;;\\n',\n", + " 'vol;Volapük;vo;vol;Volapük;Constructed;;;\\n',\n", + " 'vro;Võro;fiu-vro;vro;Võro;Uralic;;;\\n',\n", + " 'war;Waray;war;war;Wáray-Wáray;Austronesian;Latin;;\\n',\n", + " 'wln;Walloon;wa;wln;Wallonisch;Indo-European;;;\\n',\n", + " 'wol;Wolof;wo;wol;Wolof;Niger-Congo;Latin:::Arabic;;\\n',\n", + " 'wuu;Wu Chinese;wuu;wuu;Wu;Sino-Tibetan;;;\\n',\n", + " 'xho;Xhosa;xh;xho;isiXhosa;Niger-Congo;Latin;;isiXhosa\\n',\n", + " 'xmf;Mingrelian;xmf;xmf;Mingrelisch;Kartvelian;;;\\n',\n", + " 'yid;Yiddish;yi;yid;Jiddisch;Indo-European;;;\\n',\n", + " 'yor;Yoruba;yo;yor;Yoruba;Niger-Congo;;;\\n',\n", + " 'zea;Zeeuws;zea;zea;Seeländisch;Indo-European;;;\\n',\n", + " 'zh-yue;Cantonese;zh-yue;;Kantonesisch;Sino-Tibetan;;;\\n',\n", + " 'zho;Standard Chinese;zh;zho;Chinesisch;Sino-Tibetan;;;\\n']" + ] + }, + "execution_count": 48, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "labels" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Language identification" + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "metadata": {}, + "outputs": [], + "source": [ + "from nautilus_nlp.models import Fasttext_classifier " + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Ici on va load le modèle pré-entrainer par Fasttext, disponible dans le folder data.\n", + "On peut utiliser soit le modèle quantizé (900ko) soit le classique" + ] + }, + { + "cell_type": "code", + "execution_count": 19, + "metadata": {}, + "outputs": [], + "source": [ + "model = Fasttext_classifier.Fasttext_clf('../nautilus_nlp/data/lang_identification.ftz')" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "N\t100000\n", + "P@1\t0.759\n", + "R@1\t0.759\n" + ] + } + ], + "source": [ + "print_results(*model.test(valid_data))\n" + ] + }, + { + "cell_type": "code", + "execution_count": 23, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "(('__label__kn',), array([0.99790311]))" + ] + }, + "execution_count": 23, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "model.predict(test[3])\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Il faut donc 13 secondes pour entrainer un modèle sur 1.5 Millions de tweets, avec une précision de 0.759. Not bad" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": {}, + "outputs": [], + "source": [ + "model.save_model('/home/nautilus_nlp/models/sentiments.bin')" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "-rw-r--r-- 1 root root 232M Mar 14 12:51 /home/nautilus_nlp/models/sentiments.bin\n" + ] + } + ], + "source": [ + "!ls -lh '/home/nautilus_nlp/models/sentiments.bin'" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Ce modèle fait environ 230Mo" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Maintenant si on quantize ce modèle" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "N\t100000\n", + "P@1\t0.759\n", + "R@1\t0.759\n" + ] + } + ], + "source": [ + "model.quantize(input=train_data, qnorm=True, retrain=True, cutoff=100000)\n", + "print_results(*model.test(valid_data))\n", + "model.save_model('/home/nautilus_nlp/models/sentiments.ftz')" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "-rw-r--r-- 1 root root 6.8M Mar 14 12:53 /home/nautilus_nlp/models/sentiments.ftz\n" + ] + } + ], + "source": [ + "!ls -lh '/home/nautilus_nlp/models/sentiments.ftz'" + ] + }, + { + "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.7.1" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} From 81c6b326afb9e88f21cb462fd0ce7d08c107a4dc Mon Sep 17 00:00:00 2001 From: Robin <rdoume@gmail.com> Date: Fri, 22 Mar 2019 16:56:02 +0100 Subject: [PATCH 004/496] Change docker build script to build library directly --- docker/Dockerfile | 3 ++- docker/build_docker.sh | 4 ++-- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/docker/Dockerfile b/docker/Dockerfile index db45c75..18b674a 100644 --- a/docker/Dockerfile +++ b/docker/Dockerfile @@ -6,4 +6,5 @@ RUN git clone https://github.com/facebookresearch/fastText.git && cd fastText && RUN pip install --upgrade pip && pip install pandas schedule nltk pendulum bounter spacy==2.1 jupyterlab confluent-kafka xxhash scikit-learn RUN python -m spacy download fr && python -m spacy download en && python -m spacy download de && python -m spacy download it && python -m spacy download xx RUN python -m nltk.downloader stopwords -#RUN git clone https://github.com/artefactory/nautilus_nlp/ && cd nautilus_nlp && pip install -e . +COPY nautilus_nlp /nautilus_nlp +RUN cd nautilus_nlp && pip install -r requirements.txt && pip install -e . diff --git a/docker/build_docker.sh b/docker/build_docker.sh index 122cd45..bfd80cc 100644 --- a/docker/build_docker.sh +++ b/docker/build_docker.sh @@ -1,3 +1,3 @@ #!/bin/bash - -docker build -t nautilus_nlp . \ No newline at end of file +cp docker/Dockerfile . +docker build -t nautilus_nlp:latest . From 139c98b5c1cb618ef1c2bb7edad7289616858c5b Mon Sep 17 00:00:00 2001 From: Robin <rdoume@gmail.com> Date: Fri, 22 Mar 2019 17:37:07 +0100 Subject: [PATCH 005/496] Add pytest as requireemnts --- requirements.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/requirements.txt b/requirements.txt index 1172a43..1831703 100644 --- a/requirements.txt +++ b/requirements.txt @@ -9,6 +9,7 @@ awscli flake8 python-dotenv>=0.5.1 pillow +pytest #library requirements spacy==2.1 From d8e9228e368b7f3243d37764f67731a8118770aa Mon Sep 17 00:00:00 2001 From: Robin <rdoume@gmail.com> Date: Fri, 22 Mar 2019 17:52:10 +0100 Subject: [PATCH 006/496] First test for preprocessing --- tests/test_preprocessor.py | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) create mode 100644 tests/test_preprocessor.py diff --git a/tests/test_preprocessor.py b/tests/test_preprocessor.py new file mode 100644 index 0000000..17ba489 --- /dev/null +++ b/tests/test_preprocessor.py @@ -0,0 +1,23 @@ +import pytest +import numpy as np +from nautilus_nlp.utils.preprocess import (remove_multiple_spaces_and_strip_text, remove_accents) + + +@pytest.mark.parametrize("input_str, expected_str", [ + ("hello world", "hello world"), + ("\n hello world ", "hello world"), + ("----- hello\tworld *****", "hello world"), + ("hello-world", "hello-world"), + ("hello - world", "hello world") +]) +def test_remove_multiple_spaces_and_strip_text(input_str, expected_str): + result = remove_multiple_spaces_and_strip_text(input_str) + np.testing.assert_string_equal(result, expected_str) + + +def test_remove_accents(): + input_str = "éèëêàù" + expected_str = "eeeeau" + + result = remove_accents(input_str) + np.testing.assert_string_equal(result, expected_str) From 5649198ea3e464ccd9b4d5333fa7e44f3bce0d0c Mon Sep 17 00:00:00 2001 From: Robin <rdoume@gmail.com> Date: Fri, 22 Mar 2019 17:52:37 +0100 Subject: [PATCH 007/496] Correct Dockerfile --- docker/Dockerfile | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/docker/Dockerfile b/docker/Dockerfile index 18b674a..5dca4a0 100644 --- a/docker/Dockerfile +++ b/docker/Dockerfile @@ -6,5 +6,7 @@ RUN git clone https://github.com/facebookresearch/fastText.git && cd fastText && RUN pip install --upgrade pip && pip install pandas schedule nltk pendulum bounter spacy==2.1 jupyterlab confluent-kafka xxhash scikit-learn RUN python -m spacy download fr && python -m spacy download en && python -m spacy download de && python -m spacy download it && python -m spacy download xx RUN python -m nltk.downloader stopwords -COPY nautilus_nlp /nautilus_nlp -RUN cd nautilus_nlp && pip install -r requirements.txt && pip install -e . +RUN ls +COPY . /nautilus_nlp +WORKdIR /nautilus_nlp +RUN pip install -r requirements.txt && pip install -e . From 0a1815931cc99fd0e8c761b93ad360bbdf1016e5 Mon Sep 17 00:00:00 2001 From: Robin <rdoume@gmail.com> Date: Fri, 22 Mar 2019 17:53:14 +0100 Subject: [PATCH 008/496] Spacy POS tagger --- nautilus_nlp/models/Spacy_model.py | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/nautilus_nlp/models/Spacy_model.py b/nautilus_nlp/models/Spacy_model.py index 11bf7e7..c7eca79 100644 --- a/nautilus_nlp/models/Spacy_model.py +++ b/nautilus_nlp/models/Spacy_model.py @@ -1,7 +1,7 @@ import spacy - class spacy_model: + def __init__(self, lang: str): try: self.model = spacy.load(lang) @@ -55,3 +55,7 @@ def get_lemma_from_document(spacydoc: spacy.tokens.doc.Doc) -> list: def get_lemma_from_str(self, text: str): spacydoc = self.model(text) return [token.lemma_ for token in spacydoc] + + def get_pos_from_str(self, text: str): + spacydoc = self.model(text) + return [token.pos_ for token in spacydoc] \ No newline at end of file From b21f147e4e73480ea5967a490bc60c56038063fe Mon Sep 17 00:00:00 2001 From: Robin <rdoume@gmail.com> Date: Fri, 22 Mar 2019 17:53:53 +0100 Subject: [PATCH 009/496] Cleaning func to remove multiples spaces due to cleaning --- nautilus_nlp/utils/preprocess.py | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git a/nautilus_nlp/utils/preprocess.py b/nautilus_nlp/utils/preprocess.py index 0edfdbf..13f7898 100644 --- a/nautilus_nlp/utils/preprocess.py +++ b/nautilus_nlp/utils/preprocess.py @@ -15,6 +15,24 @@ from . import constants + + +def remove_multiple_spaces_and_strip_text(text): + """Remove multiple spaces, strip text, and remove '-', '*' characters. + Parameters + ---------- + text : str, + Header content. + Returns + ------- + str + """ + regex_remove_multiple_spaces_list= ["\\t", "[\\s\\-\\*]{2,}"] + for regex_remove_multiple_spaces in regex_remove_multiple_spaces_list: + text = re.sub(regex_remove_multiple_spaces, ' ', text) + text = text.strip() + return text + def remove_tokens_with_nonletters(tokens): ''' Inputs a list of tokens, outputs a list of tokens without tokens that @@ -224,6 +242,11 @@ def remove_accents(text, method="unicode") -> str: msg = '`method` must be either "unicode" and "ascii", not {}'.format(method) raise ValueError(msg) +def remove_emoji(word): + + RE_EMOJI = re.compile('[\U00010000-\U0010ffff]', flags=re.UNICODE) + word = RE_EMOJI.sub(r'', word) + return word def preprocess_text( text, From a87b42fbf5e2f48ef88c9070a2acd2a3cc890e77 Mon Sep 17 00:00:00 2001 From: Robin <rdoume@gmail.com> Date: Fri, 22 Mar 2019 17:54:21 +0100 Subject: [PATCH 010/496] stopwords package in requirements --- requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements.txt b/requirements.txt index 1831703..c3f187c 100644 --- a/requirements.txt +++ b/requirements.txt @@ -25,4 +25,4 @@ stopwords textblob textblob_fr vaderSentiment - +stop_words \ No newline at end of file From a4b79fbf17e06c0fcdec3e9b9d1b6ded29c79a46 Mon Sep 17 00:00:00 2001 From: Robin <rdoume@gmail.com> Date: Wed, 27 Mar 2019 10:37:19 +0100 Subject: [PATCH 011/496] Update readme for feature requests --- README.md | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/README.md b/README.md index 751ed6d..8b4abab 100644 --- a/README.md +++ b/README.md @@ -11,6 +11,13 @@ This library can help you with: 4. Help you discover topics and cluster your data +# Feature Request + +As an Artefact user, you might be working on a NLP use case, and wish to use Nautilus. + + However, if you think Nautilus is lacking features that can be useful not only to your use case but also others, feel free to to fill up an issue with the label "Feature-request". + + We will try to put it in the roadmap and implement it as soon as possible. # Installation @@ -21,7 +28,9 @@ To install this library you should first clone the repository: **If you don't use the docker container, we strongly advise you to do these steps in a virtual environnement** First you need to install the required files: + `pip install -r requirements.txt` + then you can install it via pip: `pip install -e .` From cf763e32787d9b88df6f70795f6bd300bbd799ef Mon Sep 17 00:00:00 2001 From: Robin <rdoume@gmail.com> Date: Fri, 29 Mar 2019 18:28:19 +0100 Subject: [PATCH 012/496] emoji2word+ emoji2sent --- nautilus_nlp/utils/emoji.py | 1967 +++++++++++++++++++++++++++++++++++ 1 file changed, 1967 insertions(+) create mode 100644 nautilus_nlp/utils/emoji.py diff --git a/nautilus_nlp/utils/emoji.py b/nautilus_nlp/utils/emoji.py new file mode 100644 index 0000000..d4d58d6 --- /dev/null +++ b/nautilus_nlp/utils/emoji.py @@ -0,0 +1,1967 @@ +""" +This dataset is based on: + Kralj Novak, Petra; Smailović, Jasmina; Sluban, Borut and Mozetič, Igor, 2015, + Emoji Sentiment Ranking 1.0, Slovenian language resource repository CLARIN.SI, + http://hdl.handle.net/11356/1048. +""" + +def rebuilt_emoji_dictionaries(filename): + emoji2unicode_name, emoji2sentiment = {}, {} + with open(filename) as csvin: + for emoji in csv.DictReader(csvin): + for key, value in emoji.items(): + if key in ('Occurrences', 'Positive', 'Neutral', 'Negative'): + emoji[key] = int(value) + elif key in ('Position',): + emoji[key] = float(value) + + emoji['Sentiment'] = (emoji['Positive'] - emoji['Negative']) / \ + max(100, (emoji['Positive'] + emoji['Neutral'] + emoji['Negative'])) + emoji2unicode_name[emoji['Emoji']] = emoji['Unicode name'] + emoji2sentiment[emoji['Emoji']] = emoji['Sentiment'] + + return emoji2unicode_name, emoji2sentiment + +emoji2unicode_name = { + '😂': 'FACE WITH TEARS OF JOY', + '❤': 'HEAVY BLACK HEART', + '♥': 'BLACK HEART SUIT', + '😍': 'SMILING FACE WITH HEART-SHAPED EYES', + '😭': 'LOUDLY CRYING FACE', + '😘': 'FACE THROWING A KISS', + '😊': 'SMILING FACE WITH SMILING EYES', + '👌': 'OK HAND SIGN', + '💕': 'TWO HEARTS', + '👏': 'CLAPPING HANDS SIGN', + '😁': 'GRINNING FACE WITH SMILING EYES', + '☺': 'WHITE SMILING FACE', + '♡': 'WHITE HEART SUIT', + '👍': 'THUMBS UP SIGN', + '😩': 'WEARY FACE', + '🙏': 'PERSON WITH FOLDED HANDS', + '✌': 'VICTORY HAND', + '😏': 'SMIRKING FACE', + '😉': 'WINKING FACE', + '🙌': 'PERSON RAISING BOTH HANDS IN CELEBRATION', + '🙈': 'SEE-NO-EVIL MONKEY', + '💪': 'FLEXED BICEPS', + '😄': 'SMILING FACE WITH OPEN MOUTH AND SMILING EYES', + '😒': 'UNAMUSED FACE', + '💃': 'DANCER', + '💖': 'SPARKLING HEART', + '😃': 'SMILING FACE WITH OPEN MOUTH', + '😔': 'PENSIVE FACE', + '😱': 'FACE SCREAMING IN FEAR', + '🎉': 'PARTY POPPER', + '😜': 'FACE WITH STUCK-OUT TONGUE AND WINKING EYE', + '☯': 'YIN YANG', + '🌸': 'CHERRY BLOSSOM', + '💜': 'PURPLE HEART', + '💙': 'BLUE HEART', + '✨': 'SPARKLES', + '😳': 'FLUSHED FACE', + '💗': 'GROWING HEART', + '★': 'BLACK STAR', + '█': 'FULL BLOCK', + '☀': 'BLACK SUN WITH RAYS', + '😡': 'POUTING FACE', + '😎': 'SMILING FACE WITH SUNGLASSES', + '😢': 'CRYING FACE', + '💋': 'KISS MARK', + '😋': 'FACE SAVOURING DELICIOUS FOOD', + '🙊': 'SPEAK-NO-EVIL MONKEY', + '😴': 'SLEEPING FACE', + '🎶': 'MULTIPLE MUSICAL NOTES', + '💞': 'REVOLVING HEARTS', + '😌': 'RELIEVED FACE', + '🔥': 'FIRE', + '💯': 'HUNDRED POINTS SYMBOL', + '🔫': 'PISTOL', + '💛': 'YELLOW HEART', + '💁': 'INFORMATION DESK PERSON', + '💚': 'GREEN HEART', + '♫': 'BEAMED EIGHTH NOTES', + '😞': 'DISAPPOINTED FACE', + '😆': 'SMILING FACE WITH OPEN MOUTH AND TIGHTLY-CLOSED EYES', + '😝': 'FACE WITH STUCK-OUT TONGUE AND TIGHTLY-CLOSED EYES', + '😪': 'SLEEPY FACE', + '�': 'REPLACEMENT CHARACTER', + '😫': 'TIRED FACE', + '😅': 'SMILING FACE WITH OPEN MOUTH AND COLD SWEAT', + '👊': 'FISTED HAND SIGN', + '💀': 'SKULL', + '😀': 'GRINNING FACE', + '😚': 'KISSING FACE WITH CLOSED EYES', + '😻': 'SMILING CAT FACE WITH HEART-SHAPED EYES', + '©': 'COPYRIGHT SIGN', + '👀': 'EYES', + '💘': 'HEART WITH ARROW', + '🐓': 'ROOSTER', + '☕': 'HOT BEVERAGE', + '👋': 'WAVING HAND SIGN', + '✋': 'RAISED HAND', + '🎊': 'CONFETTI BALL', + '🍕': 'SLICE OF PIZZA', + '❄': 'SNOWFLAKE', + '😥': 'DISAPPOINTED BUT RELIEVED FACE', + '😕': 'CONFUSED FACE', + '💥': 'COLLISION SYMBOL', + '💔': 'BROKEN HEART', + '😤': 'FACE WITH LOOK OF TRIUMPH', + '😈': 'SMILING FACE WITH HORNS', + '►': 'BLACK RIGHT-POINTING POINTER', + '✈': 'AIRPLANE', + '🔝': 'TOP WITH UPWARDS ARROW ABOVE', + '😰': 'FACE WITH OPEN MOUTH AND COLD SWEAT', + '⚽': 'SOCCER BALL', + '😑': 'EXPRESSIONLESS FACE', + '👑': 'CROWN', + '😹': 'CAT FACE WITH TEARS OF JOY', + '👉': 'WHITE RIGHT POINTING BACKHAND INDEX', + '🍃': 'LEAF FLUTTERING IN WIND', + '🎁': 'WRAPPED PRESENT', + '😠': 'ANGRY FACE', + '🐧': 'PENGUIN', + '☆': 'WHITE STAR', + '🍀': 'FOUR LEAF CLOVER', + '🎈': 'BALLOON', + '🎅': 'FATHER CHRISTMAS', + '😓': 'FACE WITH COLD SWEAT', + '😣': 'PERSEVERING FACE', + '😐': 'NEUTRAL FACE', + '✊': 'RAISED FIST', + '😨': 'FEARFUL FACE', + '😖': 'CONFOUNDED FACE', + '💤': 'SLEEPING SYMBOL', + '💓': 'BEATING HEART', + '👎': 'THUMBS DOWN SIGN', + '💦': 'SPLASHING SWEAT SYMBOL', + '✔': 'HEAVY CHECK MARK', + '😷': 'FACE WITH MEDICAL MASK', + '⚡': 'HIGH VOLTAGE SIGN', + '🙋': 'HAPPY PERSON RAISING ONE HAND', + '🎄': 'CHRISTMAS TREE', + '💩': 'PILE OF POO', + '🎵': 'MUSICAL NOTE', + '➡': 'BLACK RIGHTWARDS ARROW', + '😛': 'FACE WITH STUCK-OUT TONGUE', + '😬': 'GRIMACING FACE', + '👯': 'WOMAN WITH BUNNY EARS', + '💎': 'GEM STONE', + '🌿': 'HERB', + '🎂': 'BIRTHDAY CAKE', + '🌟': 'GLOWING STAR', + '🔮': 'CRYSTAL BALL', + '❗': 'HEAVY EXCLAMATION MARK SYMBOL', + '👫': 'MAN AND WOMAN HOLDING HANDS', + '🏆': 'TROPHY', + '✖': 'HEAVY MULTIPLICATION X', + '☝': 'WHITE UP POINTING INDEX', + '😙': 'KISSING FACE WITH SMILING EYES', + '⛄': 'SNOWMAN WITHOUT SNOW', + '👅': 'TONGUE', + '♪': 'EIGHTH NOTE', + '🍂': 'FALLEN LEAF', + '💏': 'KISS', + '🔪': 'HOCHO', + '🌴': 'PALM TREE', + '👈': 'WHITE LEFT POINTING BACKHAND INDEX', + '🌹': 'ROSE', + '🙆': 'FACE WITH OK GESTURE', + '➜': 'HEAVY ROUND-TIPPED RIGHTWARDS ARROW', + '👻': 'GHOST', + '💰': 'MONEY BAG', + '🍻': 'CLINKING BEER MUGS', + '🙅': 'FACE WITH NO GOOD GESTURE', + '🌞': 'SUN WITH FACE', + '🍁': 'MAPLE LEAF', + '⭐': 'WHITE MEDIUM STAR', + '▪': 'BLACK SMALL SQUARE', + '🎀': 'RIBBON', + '━': 'BOX DRAWINGS HEAVY HORIZONTAL', + '☷': 'TRIGRAM FOR EARTH', + '🐷': 'PIG FACE', + '🙉': 'HEAR-NO-EVIL MONKEY', + '🌺': 'HIBISCUS', + '💅': 'NAIL POLISH', + '🐶': 'DOG FACE', + '🌚': 'NEW MOON WITH FACE', + '👽': 'EXTRATERRESTRIAL ALIEN', + '🎤': 'MICROPHONE', + '👭': 'TWO WOMEN HOLDING HANDS', + '🎧': 'HEADPHONE', + '👆': 'WHITE UP POINTING BACKHAND INDEX', + '🍸': 'COCKTAIL GLASS', + '🍷': 'WINE GLASS', + '®': 'REGISTERED SIGN', + '🍉': 'WATERMELON', + '😇': 'SMILING FACE WITH HALO', + '☑': 'BALLOT BOX WITH CHECK', + '🏃': 'RUNNER', + '😿': 'CRYING CAT FACE', + '│': 'BOX DRAWINGS LIGHT VERTICAL', + '💣': 'BOMB', + '🍺': 'BEER MUG', + '▶': 'BLACK RIGHT-POINTING TRIANGLE', + '😲': 'ASTONISHED FACE', + '🎸': 'GUITAR', + '🍹': 'TROPICAL DRINK', + '💫': 'DIZZY SYMBOL', + '📚': 'BOOKS', + '😶': 'FACE WITHOUT MOUTH', + '🌷': 'TULIP', + '💝': 'HEART WITH RIBBON', + '💨': 'DASH SYMBOL', + '🏈': 'AMERICAN FOOTBALL', + '💍': 'RING', + '☔': 'UMBRELLA WITH RAIN DROPS', + '👸': 'PRINCESS', + '🇪': 'REGIONAL INDICATOR SYMBOL LETTER E', + '░': 'LIGHT SHADE', + '🍩': 'DOUGHNUT', + '👾': 'ALIEN MONSTER', + '☁': 'CLOUD', + '🌻': 'SUNFLOWER', + '😵': 'DIZZY FACE', + '📒': 'LEDGER', + '↿': 'UPWARDS HARPOON WITH BARB LEFTWARDS', + '🐯': 'TIGER FACE', + '👼': 'BABY ANGEL', + '🍔': 'HAMBURGER', + '😸': 'GRINNING CAT FACE WITH SMILING EYES', + '👶': 'BABY', + '↾': 'UPWARDS HARPOON WITH BARB RIGHTWARDS', + '💐': 'BOUQUET', + '🌊': 'WATER WAVE', + '🍦': 'SOFT ICE CREAM', + '🍓': 'STRAWBERRY', + '👇': 'WHITE DOWN POINTING BACKHAND INDEX', + '💆': 'FACE MASSAGE', + '🍴': 'FORK AND KNIFE', + '😧': 'ANGUISHED FACE', + '🇸': 'REGIONAL INDICATOR SYMBOL LETTER S', + '😮': 'FACE WITH OPEN MOUTH', + '▓': 'DARK SHADE', + '🚫': 'NO ENTRY SIGN', + '😽': 'KISSING CAT FACE WITH CLOSED EYES', + '🌈': 'RAINBOW', + '🙀': 'WEARY CAT FACE', + '⚠': 'WARNING SIGN', + '🎮': 'VIDEO GAME', + '╯': 'BOX DRAWINGS LIGHT ARC UP AND LEFT', + '🍆': 'AUBERGINE', + '🍰': 'SHORTCAKE', + '✓': 'CHECK MARK', + '👐': 'OPEN HANDS SIGN', + '🙇': 'PERSON BOWING DEEPLY', + '🍟': 'FRENCH FRIES', + '🍌': 'BANANA', + '💑': 'COUPLE WITH HEART', + '👬': 'TWO MEN HOLDING HANDS', + '🐣': 'HATCHING CHICK', + '🎃': 'JACK-O-LANTERN', + '▬': 'BLACK RECTANGLE', + '': 'OBJECT REPLACEMENT CHARACTER', + '😟': 'WORRIED FACE', + '🐾': 'PAW PRINTS', + '🎓': 'GRADUATION CAP', + '🏊': 'SWIMMER', + '🍫': 'CHOCOLATE BAR', + '📷': 'CAMERA', + '👄': 'MOUTH', + '🌼': 'BLOSSOM', + '🚶': 'PEDESTRIAN', + '🐱': 'CAT FACE', + '║': 'BOX DRAWINGS DOUBLE VERTICAL', + '🐸': 'FROG FACE', + '🇺': 'REGIONAL INDICATOR SYMBOL LETTER U', + '👿': 'IMP', + '🚬': 'SMOKING SYMBOL', + '✿': 'BLACK FLORETTE', + '📖': 'OPEN BOOK', + '🐒': 'MONKEY', + '🌍': 'EARTH GLOBE EUROPE-AFRICA', + '┊': 'BOX DRAWINGS LIGHT QUADRUPLE DASH VERTICAL', + '🐥': 'FRONT-FACING BABY CHICK', + '🌀': 'CYCLONE', + '🐼': 'PANDA FACE', + '🎥': 'MOVIE CAMERA', + '💄': 'LIPSTICK', + '💸': 'MONEY WITH WINGS', + '⛔': 'NO ENTRY', + '●': 'BLACK CIRCLE', + '🏀': 'BASKETBALL AND HOOP', + '💉': 'SYRINGE', + '💟': 'HEART DECORATION', + '🚗': 'AUTOMOBILE', + '😯': 'HUSHED FACE', + '📝': 'MEMO', + '═': 'BOX DRAWINGS DOUBLE HORIZONTAL', + '♦': 'BLACK DIAMOND SUIT', + '💭': 'THOUGHT BALLOON', + '🌙': 'CRESCENT MOON', + '🐟': 'FISH', + '👣': 'FOOTPRINTS', + '☞': 'WHITE RIGHT POINTING INDEX', + '✂': 'BLACK SCISSORS', + '🗿': 'MOYAI', + '🍝': 'SPAGHETTI', + '👪': 'FAMILY', + '🍭': 'LOLLIPOP', + '🌃': 'NIGHT WITH STARS', + '❌': 'CROSS MARK', + '🐰': 'RABBIT FACE', + '💊': 'PILL', + '🚨': 'POLICE CARS REVOLVING LIGHT', + '😦': 'FROWNING FACE WITH OPEN MOUTH', + '🍪': 'COOKIE', + '🍣': 'SUSHI', + '╭': 'BOX DRAWINGS LIGHT ARC DOWN AND RIGHT', + '✧': 'WHITE FOUR POINTED STAR', + '🎆': 'FIREWORKS', + '╮': 'BOX DRAWINGS LIGHT ARC DOWN AND LEFT', + '🎎': 'JAPANESE DOLLS', + '🇩': 'REGIONAL INDICATOR SYMBOL LETTER D', + '✅': 'WHITE HEAVY CHECK MARK', + '👹': 'JAPANESE OGRE', + '📱': 'MOBILE PHONE', + '🙍': 'PERSON FROWNING', + '🍑': 'PEACH', + '🎼': 'MUSICAL SCORE', + '🔊': 'SPEAKER WITH THREE SOUND WAVES', + '🌌': 'MILKY WAY', + '🍎': 'RED APPLE', + '🐻': 'BEAR FACE', + '─': 'BOX DRAWINGS LIGHT HORIZONTAL', + '╰': 'BOX DRAWINGS LIGHT ARC UP AND RIGHT', + '💇': 'HAIRCUT', + '♬': 'BEAMED SIXTEENTH NOTES', + '♚': 'BLACK CHESS KING', + '🔴': 'LARGE RED CIRCLE', + '🍱': 'BENTO BOX', + '🍊': 'TANGERINE', + '🍒': 'CHERRIES', + '🐭': 'MOUSE FACE', + '👟': 'ATHLETIC SHOE', + '🌎': 'EARTH GLOBE AMERICAS', + '🍍': 'PINEAPPLE', + '🐮': 'COW FACE', + '📲': 'MOBILE PHONE WITH RIGHTWARDS ARROW AT LEFT', + '☼': 'WHITE SUN WITH RAYS', + '🌅': 'SUNRISE', + '🇷': 'REGIONAL INDICATOR SYMBOL LETTER R', + '👠': 'HIGH-HEELED SHOE', + '🌽': 'EAR OF MAIZE', + '💧': 'DROPLET', + '❓': 'BLACK QUESTION MARK ORNAMENT', + '🍬': 'CANDY', + '😺': 'SMILING CAT FACE WITH OPEN MOUTH', + '🐴': 'HORSE FACE', + '🚀': 'ROCKET', + '¦': 'BROKEN BAR', + '💢': 'ANGER SYMBOL', + '🎬': 'CLAPPER BOARD', + '🍧': 'SHAVED ICE', + '🍜': 'STEAMING BOWL', + '🐏': 'RAM', + '🐘': 'ELEPHANT', + '👧': 'GIRL', + '⠀': 'BRAILLE PATTERN BLANK', + '🏄': 'SURFER', + '➤': 'BLACK RIGHTWARDS ARROWHEAD', + '⬆': 'UPWARDS BLACK ARROW', + '🍋': 'LEMON', + '🆗': 'SQUARED OK', + '⚪': 'MEDIUM WHITE CIRCLE', + '📺': 'TELEVISION', + '🍅': 'TOMATO', + '⛅': 'SUN BEHIND CLOUD', + '🐢': 'TURTLE', + '👙': 'BIKINI', + '🏡': 'HOUSE WITH GARDEN', + '🌾': 'EAR OF RICE', + '◉': 'FISHEYE', + '✏': 'PENCIL', + '🐬': 'DOLPHIN', + '🍤': 'FRIED SHRIMP', + '🇹': 'REGIONAL INDICATOR SYMBOL LETTER T', + '♣': 'BLACK CLUB SUIT', + '🐝': 'HONEYBEE', + '🌝': 'FULL MOON WITH FACE', + '🇮': 'REGIONAL INDICATOR SYMBOL LETTER I', + '🔋': 'BATTERY', + '🐍': 'SNAKE', + '♔': 'WHITE CHESS KING', + '🍳': 'COOKING', + '🔵': 'LARGE BLUE CIRCLE', + '😾': 'POUTING CAT FACE', + '🌕': 'FULL MOON SYMBOL', + '🐨': 'KOALA', + '🔐': 'CLOSED LOCK WITH KEY', + '💿': 'OPTICAL DISC', + '❁': 'EIGHT PETALLED OUTLINED BLACK FLORETTE', + '🌳': 'DECIDUOUS TREE', + '👰': 'BRIDE WITH VEIL', + '❀': 'WHITE FLORETTE', + '⚓': 'ANCHOR', + '🚴': 'BICYCLIST', + '▀': 'UPPER HALF BLOCK', + '👗': 'DRESS', + '➕': 'HEAVY PLUS SIGN', + '💬': 'SPEECH BALLOON', + '▒': 'MEDIUM SHADE', + '🔜': 'SOON WITH RIGHTWARDS ARROW ABOVE', + '🍨': 'ICE CREAM', + '💲': 'HEAVY DOLLAR SIGN', + '⛽': 'FUEL PUMP', + '🍙': 'RICE BALL', + '🍗': 'POULTRY LEG', + '🍲': 'POT OF FOOD', + '🍥': 'FISH CAKE WITH SWIRL DESIGN', + '▸': 'BLACK RIGHT-POINTING SMALL TRIANGLE', + '♛': 'BLACK CHESS QUEEN', + '😼': 'CAT FACE WITH WRY SMILE', + '🐙': 'OCTOPUS', + '👨': 'MAN', + '🍚': 'COOKED RICE', + '🍖': 'MEAT ON BONE', + '♨': 'HOT SPRINGS', + '🎹': 'MUSICAL KEYBOARD', + '♕': 'WHITE CHESS QUEEN', + '▃': 'LOWER THREE EIGHTHS BLOCK', + '🚘': 'ONCOMING AUTOMOBILE', + '🍏': 'GREEN APPLE', + '👩': 'WOMAN', + '👦': 'BOY', + '🇬': 'REGIONAL INDICATOR SYMBOL LETTER G', + '🇧': 'REGIONAL INDICATOR SYMBOL LETTER B', + '☠': 'SKULL AND CROSSBONES', + '🐠': 'TROPICAL FISH', + '🚹': 'MENS SYMBOL', + '💵': 'BANKNOTE WITH DOLLAR SIGN', + '✰': 'SHADOWED WHITE STAR', + '╠': 'BOX DRAWINGS DOUBLE VERTICAL AND RIGHT', + '👛': 'PURSE', + '🚙': 'RECREATIONAL VEHICLE', + '🌱': 'SEEDLING', + '💻': 'PERSONAL COMPUTER', + '🌏': 'EARTH GLOBE ASIA-AUSTRALIA', + '▄': 'LOWER HALF BLOCK', + '👓': 'EYEGLASSES', + '◄': 'BLACK LEFT-POINTING POINTER', + '⚾': 'BASEBALL', + '🌲': 'EVERGREEN TREE', + '👴': 'OLDER MAN', + '🏠': 'HOUSE BUILDING', + '🍇': 'GRAPES', + '🍘': 'RICE CRACKER', + '🍛': 'CURRY AND RICE', + '🐇': 'RABBIT', + '🔞': 'NO ONE UNDER EIGHTEEN SYMBOL', + '👵': 'OLDER WOMAN', + '◀': 'BLACK LEFT-POINTING TRIANGLE', + '🔙': 'BACK WITH LEFTWARDS ARROW ABOVE', + '🌵': 'CACTUS', + '🐽': 'PIG NOSE', + '🍮': 'CUSTARD', + '🎇': 'FIREWORK SPARKLER', + '🐎': 'HORSE', + '➔': 'HEAVY WIDE-HEADED RIGHTWARDS ARROW', + '💶': 'BANKNOTE WITH EURO SIGN', + '🐤': 'BABY CHICK', + '╩': 'BOX DRAWINGS DOUBLE UP AND HORIZONTAL', + '🛀': 'BATH', + '🌑': 'NEW MOON SYMBOL', + '🚲': 'BICYCLE', + '🐑': 'SHEEP', + '🏁': 'CHEQUERED FLAG', + '🍞': 'BREAD', + '🎾': 'TENNIS RACQUET AND BALL', + '╚': 'BOX DRAWINGS DOUBLE UP AND RIGHT', + '🈹': 'SQUARED CJK UNIFIED IDEOGRAPH-5272', + '🐳': 'SPOUTING WHALE', + '👮': 'POLICE OFFICER', + '☹': 'WHITE FROWNING FACE', + '🐵': 'MONKEY FACE', + '✪': 'CIRCLED WHITE STAR', + '◕': 'CIRCLE WITH ALL BUT UPPER LEFT QUADRANT BLACK', + '🗼': 'TOKYO TOWER', + '▐': 'RIGHT HALF BLOCK', + '♠': 'BLACK SPADE SUIT', + '┳': 'BOX DRAWINGS HEAVY DOWN AND HORIZONTAL', + '👺': 'JAPANESE GOBLIN', + '🐚': 'SPIRAL SHELL', + '👂': 'EAR', + '🗽': 'STATUE OF LIBERTY', + '🍵': 'TEACUP WITHOUT HANDLE', + '🆒': 'SQUARED COOL', + '🍯': 'HONEY POT', + '🐺': 'WOLF FACE', + '⇨': 'RIGHTWARDS WHITE ARROW', + '➨': 'HEAVY CONCAVE-POINTED BLACK RIGHTWARDS ARROW', + '🌓': 'FIRST QUARTER MOON SYMBOL', + '🔒': 'LOCK', + '╬': 'BOX DRAWINGS DOUBLE VERTICAL AND HORIZONTAL', + '👳': 'MAN WITH TURBAN', + '🌂': 'CLOSED UMBRELLA', + '🚌': 'BUS', + '♩': 'QUARTER NOTE', + '🍡': 'DANGO', + '❥': 'ROTATED HEAVY BLACK HEART BULLET', + '🎡': 'FERRIS WHEEL', + '💌': 'LOVE LETTER', + '🐩': 'POODLE', + '🌜': 'LAST QUARTER MOON WITH FACE', + '⌚': 'WATCH', + '🚿': 'SHOWER', + '🐖': 'PIG', + '🔆': 'HIGH BRIGHTNESS SYMBOL', + '🌛': 'FIRST QUARTER MOON WITH FACE', + '💂': 'GUARDSMAN', + '🐔': 'CHICKEN', + '🙎': 'PERSON WITH POUTING FACE', + '🏩': 'LOVE HOTEL', + '🇫': 'REGIONAL INDICATOR SYMBOL LETTER F', + '🔨': 'HAMMER', + '📢': 'PUBLIC ADDRESS LOUDSPEAKER', + '🐦': 'BIRD', + '🐲': 'DRAGON FACE', + '♻': 'BLACK UNIVERSAL RECYCLING SYMBOL', + '🌘': 'WANING CRESCENT MOON SYMBOL', + '🍐': 'PEAR', + '🌔': 'WAXING GIBBOUS MOON SYMBOL', + '╥': 'BOX DRAWINGS DOWN DOUBLE AND HORIZONTAL SINGLE', + '❊': 'EIGHT TEARDROP-SPOKED PROPELLER ASTERISK', + '👖': 'JEANS', + '🚺': 'WOMENS SYMBOL', + '😗': 'KISSING FACE', + '🎭': 'PERFORMING ARTS', + '🐄': 'COW', + '◟': 'LOWER LEFT QUADRANT CIRCULAR ARC', + '🍢': 'ODEN', + '🎨': 'ARTIST PALETTE', + '⬇': 'DOWNWARDS BLACK ARROW', + '🚼': 'BABY SYMBOL', + '⛲': 'FOUNTAIN', + '▁': 'LOWER ONE EIGHTH BLOCK', + '🇴': 'REGIONAL INDICATOR SYMBOL LETTER O', + '🌗': 'LAST QUARTER MOON SYMBOL', + '🌖': 'WANING GIBBOUS MOON SYMBOL', + '🔅': 'LOW BRIGHTNESS SYMBOL', + '👜': 'HANDBAG', + '🐌': 'SNAIL', + '💼': 'BRIEFCASE', + '🚕': 'TAXI', + '🐹': 'HAMSTER FACE', + '🌠': 'SHOOTING STAR', + '🐈': 'CAT', + '⇧': 'UPWARDS WHITE ARROW', + '☎': 'BLACK TELEPHONE', + '🌁': 'FOGGY', + '⚫': 'MEDIUM BLACK CIRCLE', + '♧': 'WHITE CLUB SUIT', + '🏰': 'EUROPEAN CASTLE', + '🚵': 'MOUNTAIN BICYCLIST', + '🎢': 'ROLLER COASTER', + '🎷': 'SAXOPHONE', + '🎐': 'WIND CHIME', + '┈': 'BOX DRAWINGS LIGHT QUADRUPLE DASH HORIZONTAL', + '╗': 'BOX DRAWINGS DOUBLE DOWN AND LEFT', + '╱': 'BOX DRAWINGS LIGHT DIAGONAL UPPER RIGHT TO LOWER LEFT', + '🌇': 'SUNSET OVER BUILDINGS', + '⏰': 'ALARM CLOCK', + '⇩': 'DOWNWARDS WHITE ARROW', + '🚂': 'STEAM LOCOMOTIVE', + '◠': 'UPPER HALF CIRCLE', + '🎿': 'SKI AND SKI BOOT', + '✦': 'BLACK FOUR POINTED STAR', + '🆔': 'SQUARED ID', + '⛪': 'CHURCH', + '🌒': 'WAXING CRESCENT MOON SYMBOL', + '🐪': 'DROMEDARY CAMEL', + '╔': 'BOX DRAWINGS DOUBLE DOWN AND RIGHT', + '╝': 'BOX DRAWINGS DOUBLE UP AND LEFT', + '👔': 'NECKTIE', + '🔱': 'TRIDENT EMBLEM', + '🆓': 'SQUARED FREE', + '🐋': 'WHALE', + '▽': 'WHITE DOWN-POINTING TRIANGLE', + '▂': 'LOWER ONE QUARTER BLOCK', + '🐛': 'BUG', + '👕': 'T-SHIRT', + '🚋': 'TRAM CAR', + '💳': 'CREDIT CARD', + '🌆': 'CITYSCAPE AT DUSK', + '🏧': 'AUTOMATED TELLER MACHINE', + '💡': 'ELECTRIC LIGHT BULB', + '🔹': 'SMALL BLUE DIAMOND', + '⬅': 'LEFTWARDS BLACK ARROW', + '🍠': 'ROASTED SWEET POTATO', + '🐫': 'BACTRIAN CAMEL', + '🏪': 'CONVENIENCE STORE', + '۩': 'ARABIC PLACE OF SAJDAH', + '🇱': 'REGIONAL INDICATOR SYMBOL LETTER L', + '📹': 'VIDEO CAMERA', + '👞': 'MANS SHOE', + '🚑': 'AMBULANCE', + '🆘': 'SQUARED SOS', + '👚': 'WOMANS CLOTHES', + '🚍': 'ONCOMING BUS', + '□': 'WHITE SQUARE', + '🐂': 'OX', + '🚣': 'ROWBOAT', + '✳': 'EIGHT SPOKED ASTERISK', + '🏉': 'RUGBY FOOTBALL', + '🗻': 'MOUNT FUJI', + '🐀': 'RAT', + '╦': 'BOX DRAWINGS DOUBLE DOWN AND HORIZONTAL', + '⛺': 'TENT', + '🐕': 'DOG', + '🏂': 'SNOWBOARDER', + '👡': 'WOMANS SANDAL', + '📻': 'RADIO', + '✒': 'BLACK NIB', + '🌰': 'CHESTNUT', + '🏢': 'OFFICE BUILDING', + '🎒': 'SCHOOL SATCHEL', + '⌒': 'ARC', + '🏫': 'SCHOOL', + '📴': 'MOBILE PHONE OFF', + '🚢': 'SHIP', + '🚚': 'DELIVERY TRUCK', + '🐉': 'DRAGON', + '❒': 'UPPER RIGHT SHADOWED WHITE SQUARE', + '🐊': 'CROCODILE', + '🔔': 'BELL', + '◢': 'BLACK LOWER RIGHT TRIANGLE', + '🏥': 'HOSPITAL', + '❔': 'WHITE QUESTION MARK ORNAMENT', + '🚖': 'ONCOMING TAXI', + '🃏': 'PLAYING CARD BLACK JOKER', + '▼': 'BLACK DOWN-POINTING TRIANGLE', + '▌': 'LEFT HALF BLOCK', + '☛': 'BLACK RIGHT POINTING INDEX', + '✩': 'STRESS OUTLINED WHITE STAR', + '💒': 'WEDDING', + '🚤': 'SPEEDBOAT', + '🐐': 'GOAT', + '■': 'BLACK SQUARE', + '🔚': 'END WITH LEFTWARDS ARROW ABOVE', + '🎻': 'VIOLIN', + '🔷': 'LARGE BLUE DIAMOND', + '🚦': 'VERTICAL TRAFFIC LIGHT', + '🔓': 'OPEN LOCK', + '🎽': 'RUNNING SHIRT WITH SASH', + '📅': 'CALENDAR', + '🎺': 'TRUMPET', + '✯': 'PINWHEEL STAR', + '🍈': 'MELON', + '✉': 'ENVELOPE', + '╣': 'BOX DRAWINGS DOUBLE VERTICAL AND LEFT', + '◤': 'BLACK UPPER LEFT TRIANGLE', + '○': 'WHITE CIRCLE', + '🍼': 'BABY BOTTLE', + '📀': 'DVD', + '🚛': 'ARTICULATED LORRY', + '📓': 'NOTEBOOK', + '☉': 'SUN', + '💴': 'BANKNOTE WITH YEN SIGN', + '┼': 'BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL', + '🐃': 'WATER BUFFALO', + '➰': 'CURLY LOOP', + '🔌': 'ELECTRIC PLUG', + '🍄': 'MUSHROOM', + '📕': 'CLOSED BOOK', + '📣': 'CHEERING MEGAPHONE', + '🚓': 'POLICE CAR', + '🐗': 'BOAR', + '↪': 'RIGHTWARDS ARROW WITH HOOK', + '⛳': 'FLAG IN HOLE', + '┻': 'BOX DRAWINGS HEAVY UP AND HORIZONTAL', + '┛': 'BOX DRAWINGS HEAVY UP AND LEFT', + '┃': 'BOX DRAWINGS HEAVY VERTICAL', + '👱': 'PERSON WITH BLOND HAIR', + '⏳': 'HOURGLASS WITH FLOWING SAND', + '💺': 'SEAT', + '🏇': 'HORSE RACING', + '☻': 'BLACK SMILING FACE', + '📞': 'TELEPHONE RECEIVER', + 'Ⓐ': 'CIRCLED LATIN CAPITAL LETTER A', + '🌉': 'BRIDGE AT NIGHT', + '🚩': 'TRIANGULAR FLAG ON POST', + '✎': 'LOWER RIGHT PENCIL', + '📃': 'PAGE WITH CURL', + '🏨': 'HOTEL', + '📌': 'PUSHPIN', + '♎': 'LIBRA', + '💷': 'BANKNOTE WITH POUND SIGN', + '🚄': 'HIGH-SPEED TRAIN', + '▲': 'BLACK UP-POINTING TRIANGLE', + '⛵': 'SAILBOAT', + '🔸': 'SMALL ORANGE DIAMOND', + '⌛': 'HOURGLASS', + '🚜': 'TRACTOR', + '🐆': 'LEOPARD', + '👒': 'WOMANS HAT', + '❕': 'WHITE EXCLAMATION MARK ORNAMENT', + '🔛': 'ON WITH EXCLAMATION MARK WITH LEFT RIGHT ARROW ABOVE', + '♢': 'WHITE DIAMOND SUIT', + '🇲': 'REGIONAL INDICATOR SYMBOL LETTER M', + '❅': 'TIGHT TRIFOLIATE SNOWFLAKE', + '👝': 'POUCH', + '✞': 'SHADOWED WHITE LATIN CROSS', + '◡': 'LOWER HALF CIRCLE', + '🎋': 'TANABATA TREE', + '👥': 'BUSTS IN SILHOUETTE', + '📵': 'NO MOBILE PHONES', + '🐡': 'BLOWFISH', + '◆': 'BLACK DIAMOND', + '🏯': 'JAPANESE CASTLE', + '☂': 'UMBRELLA', + '🔭': 'TELESCOPE', + '🎪': 'CIRCUS TENT', + '🐜': 'ANT', + '♌': 'LEO', + '☐': 'BALLOT BOX', + '👷': 'CONSTRUCTION WORKER', + '↳': 'DOWNWARDS ARROW WITH TIP RIGHTWARDS', + '🔈': 'SPEAKER', + '📄': 'PAGE FACING UP', + '📍': 'ROUND PUSHPIN', + '🚐': 'MINIBUS', + '🚔': 'ONCOMING POLICE CAR', + '🌋': 'VOLCANO', + '📡': 'SATELLITE ANTENNA', + '⏩': 'BLACK RIGHT-POINTING DOUBLE TRIANGLE', + '🚳': 'NO BICYCLES', + '✘': 'HEAVY BALLOT X', + '۞': 'ARABIC START OF RUB EL HIZB', + '☾': 'LAST QUARTER MOON', + '🅰': 'NEGATIVE SQUARED LATIN CAPITAL LETTER A', + '📥': 'INBOX TRAY', + '🇼': 'REGIONAL INDICATOR SYMBOL LETTER W', + '┓': 'BOX DRAWINGS HEAVY DOWN AND LEFT', + '┣': 'BOX DRAWINGS HEAVY VERTICAL AND RIGHT', + 'Ⓛ': 'CIRCLED LATIN CAPITAL LETTER L', + 'Ⓔ': 'CIRCLED LATIN CAPITAL LETTER E', + '🔦': 'ELECTRIC TORCH', + '👤': 'BUST IN SILHOUETTE', + '🚁': 'HELICOPTER', + '🎠': 'CAROUSEL HORSE', + '🐁': 'MOUSE', + '📗': 'GREEN BOOK', + '┐': 'BOX DRAWINGS LIGHT DOWN AND LEFT', + '☮': 'PEACE SYMBOL', + '♂': 'MALE SIGN', + '◞': 'LOWER RIGHT QUADRANT CIRCULAR ARC', + '📯': 'POSTAL HORN', + '🔩': 'NUT AND BOLT', + '👢': 'WOMANS BOOTS', + '◂': 'BLACK LEFT-POINTING SMALL TRIANGLE', + '📰': 'NEWSPAPER', + '📶': 'ANTENNA WITH BARS', + '🚥': 'HORIZONTAL TRAFFIC LIGHT', + '🌄': 'SUNRISE OVER MOUNTAINS', + '🗾': 'SILHOUETTE OF JAPAN', + '🔶': 'LARGE ORANGE DIAMOND', + '🏤': 'EUROPEAN POST OFFICE', + '🎩': 'TOP HAT', + 'Ⓜ': 'CIRCLED LATIN CAPITAL LETTER M', + '🔧': 'WRENCH', + '🐅': 'TIGER', + '♮': 'MUSIC NATURAL SIGN', + '🅾': 'NEGATIVE SQUARED LATIN CAPITAL LETTER O', + '🔄': 'ANTICLOCKWISE DOWNWARDS AND UPWARDS OPEN CIRCLE ARROWS', + '☄': 'COMET', + '☨': 'CROSS OF LORRAINE', + '📦': 'PACKAGE', + '🚊': 'TRAM', + '🔲': 'BLACK SQUARE BUTTON', + '🔁': 'CLOCKWISE RIGHTWARDS AND LEFTWARDS OPEN CIRCLE ARROWS', + '△': 'WHITE UP-POINTING TRIANGLE', + '📆': 'TEAR-OFF CALENDAR', + '❛': 'HEAVY SINGLE TURNED COMMA QUOTATION MARK ORNAMENT', + '📉': 'CHART WITH DOWNWARDS TREND', + '▵': 'WHITE UP-POINTING SMALL TRIANGLE', + '🔎': 'RIGHT-POINTING MAGNIFYING GLASS', + '☜': 'WHITE LEFT POINTING INDEX', + '🇯': 'REGIONAL INDICATOR SYMBOL LETTER J', + '🇵': 'REGIONAL INDICATOR SYMBOL LETTER P', + '📘': 'BLUE BOOK', + '✡': 'STAR OF DAVID', + 'ⓔ': 'CIRCLED LATIN SMALL LETTER E', + '🔑': 'KEY', + '🔃': 'CLOCKWISE DOWNWARDS AND UPWARDS OPEN CIRCLE ARROWS', + '👃': 'NOSE', + '⭕': 'HEAVY LARGE CIRCLE', + '🔘': 'RADIO BUTTON', + 'ⓒ': 'CIRCLED LATIN SMALL LETTER C', + '🚭': 'NO SMOKING SYMBOL', + '🚉': 'STATION', + '🚪': 'DOOR', + '➳': 'WHITE-FEATHERED RIGHTWARDS ARROW', + '🚃': 'RAILWAY CAR', + '┯': 'BOX DRAWINGS DOWN LIGHT AND HORIZONTAL HEAVY', + '🏬': 'DEPARTMENT STORE', + '☽': 'FIRST QUARTER MOON', + '🆙': 'SQUARED UP WITH EXCLAMATION MARK', + '🆖': 'SQUARED NG', + '☪': 'STAR AND CRESCENT', + '┗': 'BOX DRAWINGS HEAVY UP AND RIGHT', + '🚮': 'PUT LITTER IN ITS PLACE SYMBOL', + '┫': 'BOX DRAWINGS HEAVY VERTICAL AND LEFT', + 'Ⓞ': 'CIRCLED LATIN CAPITAL LETTER O', + '❇': 'SPARKLE', + '✴': 'EIGHT POINTED BLACK STAR', + '┌': 'BOX DRAWINGS LIGHT DOWN AND RIGHT', + '☊': 'ASCENDING NODE', + '🔕': 'BELL WITH CANCELLATION STROKE', + '⬛': 'BLACK LARGE SQUARE', + '❝': 'HEAVY DOUBLE TURNED COMMA QUOTATION MARK ORNAMENT', + '❞': 'HEAVY DOUBLE COMMA QUOTATION MARK ORNAMENT', + '🚞': 'MOUNTAIN RAILWAY', + '🍶': 'SAKE BOTTLE AND CUP', + '🌐': 'GLOBE WITH MERIDIANS', + '♀': 'FEMALE SIGN', + '🚅': 'HIGH-SPEED TRAIN WITH BULLET NOSE', + '🚒': 'FIRE ENGINE', + '➣': 'THREE-D BOTTOM-LIGHTED RIGHTWARDS ARROWHEAD', + '♋': 'CANCER', + '♍': 'VIRGO', + '🕝': 'CLOCK FACE TWO-THIRTY', + 'ⓐ': 'CIRCLED LATIN SMALL LETTER A', + '✗': 'BALLOT X', + '📙': 'ORANGE BOOK', + 'Ⓢ': 'CIRCLED LATIN CAPITAL LETTER S', + '📋': 'CLIPBOARD', + '⇢': 'RIGHTWARDS DASHED ARROW', + '🎱': 'BILLIARDS', + '🐞': 'LADY BEETLE', + '🔺': 'UP-POINTING RED TRIANGLE', + 'ⓡ': 'CIRCLED LATIN SMALL LETTER R', + '🎍': 'PINE DECORATION', + '♤': 'WHITE SPADE SUIT', + '🎲': 'GAME DIE', + '🎯': 'DIRECT HIT', + '〠': 'POSTAL MARK FACE', + '🔉': 'SPEAKER WITH ONE SOUND WAVE', + '↩': 'LEFTWARDS ARROW WITH HOOK', + '🚾': 'WATER CLOSET', + '🎣': 'FISHING POLE AND FISH', + '🔣': 'INPUT SYMBOL FOR SYMBOLS', + '❎': 'NEGATIVE SQUARED CROSS MARK', + '➥': 'HEAVY BLACK CURVED DOWNWARDS AND RIGHTWARDS ARROW', + '🅱': 'NEGATIVE SQUARED LATIN CAPITAL LETTER B', + '🎌': 'CROSSED FLAGS', + '◣': 'BLACK LOWER LEFT TRIANGLE', + '⏬': 'BLACK DOWN-POINTING DOUBLE TRIANGLE', + '♭': 'MUSIC FLAT SIGN', + '💠': 'DIAMOND SHAPE WITH A DOT INSIDE', + 'ⓞ': 'CIRCLED LATIN SMALL LETTER O', + '🔳': 'WHITE SQUARE BUTTON', + '🏭': 'FACTORY', + '🔰': 'JAPANESE SYMBOL FOR BEGINNER', + '🎳': 'BOWLING', + '☚': 'BLACK LEFT POINTING INDEX', + '➽': 'HEAVY WEDGE-TAILED RIGHTWARDS ARROW', + '➫': 'BACK-TILTED SHADOWED WHITE RIGHTWARDS ARROW', + '➖': 'HEAVY MINUS SIGN', + '🏮': 'IZAKAYA LANTERN', + '📛': 'NAME BADGE', + '꒰': 'YI RADICAL SHY', + '꒱': 'YI RADICAL VEP', + '◝': 'UPPER RIGHT QUADRANT CIRCULAR ARC', + '📑': 'BOOKMARK TABS', + '🎦': 'CINEMA', + 'ⓧ': 'CIRCLED LATIN SMALL LETTER X', + '🇨': 'REGIONAL INDICATOR SYMBOL LETTER C', + '🇳': 'REGIONAL INDICATOR SYMBOL LETTER N', + '🔟': 'KEYCAP TEN', + '〓': 'GETA MARK', + 'ⓜ': 'CIRCLED LATIN SMALL LETTER M', + '➠': 'HEAVY DASHED TRIANGLE-HEADED RIGHTWARDS ARROW', + '🚆': 'TRAIN', + '🚠': 'MOUNTAIN CABLEWAY', + '℅': 'CARE OF', + '☃': 'SNOWMAN', + '🚽': 'TOILET', + '📐': 'TRIANGULAR RULER', + 'ⓝ': 'CIRCLED LATIN SMALL LETTER N', + '✮': 'HEAVY OUTLINED BLACK STAR', + '⇦': 'LEFTWARDS WHITE ARROW', + '👲': 'MAN WITH GUA PI MAO', + '🚡': 'AERIAL TRAMWAY', + '🎑': 'MOON VIEWING CEREMONY', + '🔬': 'MICROSCOPE', + '➗': 'HEAVY DIVISION SIGN', + '📈': 'CHART WITH UPWARDS TREND', + '⌘': 'PLACE OF INTEREST SIGN', + '⏪': 'BLACK LEFT-POINTING DOUBLE TRIANGLE', + '╹': 'BOX DRAWINGS HEAVY UP', + '◎': 'BULLSEYE', + '🔼': 'UP-POINTING SMALL RED TRIANGLE', + '꒦': 'YI RADICAL GGUO', + '📎': 'PAPERCLIP', + '⑅': 'OCR BOW TIE', + '⍝': 'APL FUNCTIONAL SYMBOL UP SHOE JOT', + '📁': 'FILE FOLDER', + '✭': 'OUTLINED BLACK STAR', + '➲': 'CIRCLED HEAVY WHITE RIGHTWARDS ARROW', + '♓': 'PISCES', + '┏': 'BOX DRAWINGS HEAVY DOWN AND RIGHT', + '☇': 'LIGHTNING', + '♺': 'RECYCLING SYMBOL FOR GENERIC MATERIALS', + '♞': 'BLACK CHESS KNIGHT', + '࿎': 'TIBETAN SIGN RDEL NAG RDEL DKAR', + '📠': 'FAX MACHINE', + '👘': 'KIMONO', + '↙': 'SOUTH WEST ARROW', + 'Ⓕ': 'CIRCLED LATIN CAPITAL LETTER F', + 'Ⓦ': 'CIRCLED LATIN CAPITAL LETTER W', + 'Ⓟ': 'CIRCLED LATIN CAPITAL LETTER P', + '🕑': 'CLOCK FACE TWO OCLOCK', + '💽': 'MINIDISC', + '🕛': 'CLOCK FACE TWELVE OCLOCK', + '🎫': 'TICKET', + '♈': 'ARIES', + '📟': 'PAGER', + '℃': 'DEGREE CELSIUS', + '↬': 'RIGHTWARDS ARROW WITH LOOP', + '🕒': 'CLOCK FACE THREE OCLOCK', + '🇰': 'REGIONAL INDICATOR SYMBOL LETTER K', + '↱': 'UPWARDS ARROW WITH TIP RIGHTWARDS', + '✍': 'WRITING HAND', + '⇐': 'LEFTWARDS DOUBLE ARROW', + '🏦': 'BANK', + '🔻': 'DOWN-POINTING RED TRIANGLE', + 'ⓟ': 'CIRCLED LATIN SMALL LETTER P', + 'ⓕ': 'CIRCLED LATIN SMALL LETTER F', + 'ⓘ': 'CIRCLED LATIN SMALL LETTER I', + '♿': 'WHEELCHAIR SYMBOL', + '⇗': 'NORTH EAST DOUBLE ARROW', + '⇘': 'SOUTH EAST DOUBLE ARROW', + 'ⓨ': 'CIRCLED LATIN SMALL LETTER Y', + 'ⓙ': 'CIRCLED LATIN SMALL LETTER J', + '▫': 'WHITE SMALL SQUARE', + '🔇': 'SPEAKER WITH CANCELLATION STROKE', + '⌃': 'UP ARROWHEAD', + '🔖': 'BOOKMARK', + '📜': 'SCROLL', + '♏': 'SCORPIUS', + '🚝': 'MONORAIL', + '☢': 'RADIOACTIVE SIGN', + '🎏': 'CARP STREAMER', + '┘': 'BOX DRAWINGS LIGHT UP AND LEFT', + '✝': 'LATIN CROSS', + '❖': 'BLACK DIAMOND MINUS WHITE X', + '⍣': 'APL FUNCTIONAL SYMBOL STAR DIAERESIS', + '📮': 'POSTBOX', + '🕕': 'CLOCK FACE SIX OCLOCK', + '🇭': 'REGIONAL INDICATOR SYMBOL LETTER H', + '◜': 'UPPER LEFT QUADRANT CIRCULAR ARC', + '🔯': 'SIX POINTED STAR WITH MIDDLE DOT', + '➸': 'HEAVY BLACK-FEATHERED RIGHTWARDS ARROW', + '꒵': 'YI RADICAL JJY', + '🕥': 'CLOCK FACE TEN-THIRTY', + '♙': 'WHITE CHESS PAWN', + '▿': 'WHITE DOWN-POINTING SMALL TRIANGLE', + '⚃': 'DIE FACE-4', + '✽': 'HEAVY TEARDROP-SPOKED ASTERISK', + '📼': 'VIDEOCASSETTE', + '🕐': 'CLOCK FACE ONE OCLOCK', + '🀄': 'MAHJONG TILE RED DRAGON', + '✾': 'SIX PETALLED BLACK AND WHITE FLORETTE', + '✬': 'BLACK CENTRE WHITE STAR', + '🆑': 'SQUARED CL', + '✫': 'OPEN CENTRE BLACK STAR', + '🕔': 'CLOCK FACE FIVE OCLOCK', + '❣': 'HEAVY HEART EXCLAMATION MARK ORNAMENT', + '➱': 'NOTCHED UPPER RIGHT-SHADOWED WHITE RIGHTWARDS ARROW', + '🆕': 'SQUARED NEW', + '➢': 'THREE-D TOP-LIGHTED RIGHTWARDS ARROWHEAD', + '↕': 'UP DOWN ARROW', + '📫': 'CLOSED MAILBOX WITH RAISED FLAG', + '🉐': 'CIRCLED IDEOGRAPH ADVANTAGE', + '♊': 'GEMINI', + '🈂': 'SQUARED KATAKANA SA', + '🎰': 'SLOT MACHINE', + '҂': 'CYRILLIC THOUSANDS SIGN', + '╤': 'BOX DRAWINGS DOWN SINGLE AND HORIZONTAL DOUBLE', + '➛': 'DRAFTING POINT RIGHTWARDS ARROW', + '♝': 'BLACK CHESS BISHOP', + '❋': 'HEAVY EIGHT TEARDROP-SPOKED PROPELLER ASTERISK', + '✆': 'TELEPHONE LOCATION SIGN', + '📔': 'NOTEBOOK WITH DECORATIVE COVER' +} + +emoji2sentiment = { + '😂': 0.22096840377513335, + '❤': 0.7460869565217392, + '♥': 0.6576147816349384, + '😍': 0.6779367825129737, + '😭': -0.09337676438653637, + '😘': 0.7017543859649122, + '😊': 0.6446955430006277, + '👌': 0.5637606837606838, + '💕': 0.6329166666666667, + '👏': 0.5205479452054794, + '😁': 0.4499771585198721, + '☺': 0.6580989330746848, + '♡': 0.669873417721519, + '👍': 0.5221143473570659, + '😩': -0.36836283185840707, + '🙏': 0.41780376868096164, + '✌': 0.4641460234680574, + '😏': 0.3324572930354796, + '😉': 0.4641683103221565, + '🙌': 0.5604249667994687, + '🙈': 0.4326923076923077, + '💪': 0.5557132718239887, + '😄': 0.4220314735336195, + '😒': -0.3747292418772563, + '💃': 0.7358630952380952, + '💖': 0.7133808392715756, + '😃': 0.5580431177446102, + '😔': -0.14605809128630706, + '😱': 0.1902654867256637, + '🎉': 0.7395555555555555, + '😜': 0.45603864734299515, + '☯': 0.0010080645161290322, + '🌸': 0.6522198731501057, + '💜': 0.6560170394036209, + '💙': 0.7324561403508771, + '✨': 0.35259433962264153, + '😳': 0.01773049645390071, + '💗': 0.6590909090909091, + '★': 0.28381642512077293, + '█': -0.03258145363408521, + '☀': 0.4669211195928753, + '😡': -0.17328042328042328, + '😎': 0.493368700265252, + '😢': 0.006675567423230975, + '💋': 0.6934604904632152, + '😋': 0.6335149863760218, + '🙊': 0.4606896551724138, + '😴': -0.0807799442896936, + '🎶': 0.5392296718972895, + '💞': 0.74235807860262, + '😌': 0.4842105263157895, + '🔥': 0.13978494623655913, + '💯': 0.12087912087912088, + '🔫': -0.19536423841059603, + '💛': 0.7126245847176079, + '💁': 0.32786885245901637, + '💚': 0.659217877094972, + '♫': 0.28893058161350843, + '😞': -0.11842105263157894, + '😆': 0.4117647058823529, + '😝': 0.4254032258064516, + '😪': -0.08091286307053942, + '�': 0.08686440677966102, + '😫': -0.145610278372591, + '😅': 0.17965367965367965, + '👊': 0.2292576419213974, + '💀': -0.20833333333333334, + '😀': 0.571753986332574, + '😚': 0.714622641509434, + '😻': 0.6235011990407674, + '©': 0.11778846153846154, + '👀': 0.06341463414634146, + '💘': 0.6886075949367089, + '🐓': 0.028645833333333332, + '☕': 0.24607329842931938, + '👋': 0.4162303664921466, + '✋': 0.12698412698412698, + '🎊': 0.7272727272727273, + '🍕': 0.42045454545454547, + '❄': 0.5100286532951289, + '😥': 0.12316715542521994, + '😕': -0.4, + '💥': 0.14893617021276595, + '💔': -0.12195121951219512, + '😤': -0.21100917431192662, + '😈': 0.2676923076923077, + '►': 0.16307692307692306, + '✈': 0.4192546583850932, + '🔝': 0.47854785478547857, + '😰': -0.019867549668874173, + '⚽': 0.6220735785953178, + '😑': -0.31438127090301005, + '👑': 0.7013422818791947, + '😹': 0.1423728813559322, + '👉': 0.3938356164383562, + '🍃': 0.38144329896907214, + '🎁': 0.7673611111111112, + '😠': -0.3020833333333333, + '🐧': 0.4612676056338028, + '☆': 0.4326241134751773, + '🍀': 0.28776978417266186, + '🎈': 0.7256317689530686, + '🎅': 0.32116788321167883, + '😓': -0.08058608058608059, + '😣': -0.2140221402214022, + '😐': -0.3925925925925926, + '✊': 0.43333333333333335, + '😨': -0.1412639405204461, + '😖': -0.15671641791044777, + '💤': 0.37453183520599254, + '💓': 0.6718146718146718, + '👎': -0.18992248062015504, + '💦': 0.47619047619047616, + '✔': 0.27309236947791166, + '😷': -0.17073170731707318, + '⚡': 0.17886178861788618, + '🙋': 0.4915254237288136, + '🎄': 0.538135593220339, + '💩': -0.11790393013100436, + '🎵': 0.5067264573991032, + '➡': 0.14864864864864866, + '😛': 0.6090909090909091, + '😬': 0.19626168224299065, + '👯': 0.44549763033175355, + '💎': 0.569377990430622, + '🌿': 0.3894230769230769, + '🎂': 0.6218905472636815, + '🌟': 0.3316582914572864, + '🔮': 0.271356783919598, + '❗': 0.10101010101010101, + '👫': 0.25888324873096447, + '🏆': 0.7371134020618557, + '✖': 0.3160621761658031, + '☝': 0.31413612565445026, + '😙': 0.7905759162303665, + '⛄': 0.5287958115183246, + '👅': 0.46842105263157896, + '♪': 0.5421052631578948, + '🍂': 0.5555555555555556, + '💏': 0.3945945945945946, + '🔪': 0.07103825136612021, + '🌴': 0.5337078651685393, + '👈': 0.43103448275862066, + '🌹': 0.6104651162790697, + '🙆': 0.5087719298245614, + '➜': 0.16470588235294117, + '👻': 0.23214285714285715, + '💰': 0.25595238095238093, + '🍻': 0.5212121212121212, + '🙅': -0.20606060606060606, + '🌞': 0.5679012345679012, + '🍁': 0.4906832298136646, + '⭐': 0.5911949685534591, + '▪': 0.20125786163522014, + '🎀': 0.6410256410256411, + '━': 0.1794871794871795, + '☷': 0.06493506493506493, + '🐷': 0.375, + '🙉': 0.34, + '🌺': 0.56, + '💅': 0.3959731543624161, + '🐶': 0.5878378378378378, + '🌚': 0.47297297297297297, + '👽': 0.3219178082191781, + '🎤': 0.4861111111111111, + '👭': 0.4722222222222222, + '🎧': 0.4225352112676056, + '👆': 0.3333333333333333, + '🍸': 0.5507246376811594, + '🍷': 0.40145985401459855, + '®': 0.2846715328467153, + '🍉': 0.6102941176470589, + '😇': 0.6, + '☑': 0.1037037037037037, + '🏃': 0.4148148148148148, + '😿': -0.3805970149253731, + '│': 0.35074626865671643, + '💣': 0.007633587786259542, + '🍺': 0.5038167938931297, + '▶': 0.21374045801526717, + '😲': -0.06976744186046512, + '🎸': 0.528, + '🍹': 0.6747967479674797, + '💫': 0.512396694214876, + '📚': 0.3445378151260504, + '😶': -0.1452991452991453, + '🌷': 0.5517241379310345, + '💝': 0.6608695652173913, + '💨': 0.391304347826087, + '🏈': 0.543859649122807, + '💍': 0.49107142857142855, + '☔': 0.2972972972972973, + '👸': 0.6216216216216216, + '🇪': 0.6330275229357798, + '░': -0.046296296296296294, + '🍩': 0.3925233644859813, + '👾': 0.37142857142857144, + '☁': 0.3173076923076923, + '🌻': 0.5865384615384616, + '😵': 0.08737864077669903, + '📒': 0.0392156862745098, + '↿': 0.6666666666666666, + '🐯': 0.49, + '👼': 0.34, + '🍔': 0.28, + '😸': 0.41, + '👶': 0.43, + '↾': 0.64, + '💐': 0.72, + '🌊': 0.49, + '🍦': 0.45, + '🍓': 0.65, + '👇': 0.24, + '💆': 0.21, + '🍴': 0.51, + '😧': -0.06, + '🇸': 0.48, + '😮': 0.25, + '▓': 0.01, + '🚫': -0.4, + '😽': 0.52, + '🌈': 0.47, + '🙀': 0.3, + '⚠': -0.06, + '🎮': 0.38, + '╯': -0.01, + '🍆': 0.35, + '🍰': 0.39, + '✓': 0.25, + '👐': -0.02, + '🙇': 0.12, + '🍟': 0.26, + '🍌': 0.37, + '💑': 0.56, + '👬': -0.05, + '🐣': 0.4, + '🎃': 0.5, + '▬': 0.39, + '': -0.4, + '😟': 0.06, + '🐾': 0.49, + '🎓': 0.45, + '🏊': 0.46, + '🍫': 0.12, + '📷': 0.34, + '👄': 0.37, + '🌼': 0.6, + '🚶': -0.11, + '🐱': 0.39, + '║': 0.11, + '🐸': -0.06, + '🇺': 0.4, + '👿': -0.39, + '🚬': 0.38, + '✿': 0.28, + '📖': 0.12, + '🐒': 0.37, + '🌍': 0.42, + '┊': 0.68, + '🐥': 0.41, + '🌀': 0.07, + '🐼': 0.18, + '🎥': 0.2, + '💄': 0.3, + '💸': 0.11, + '⛔': 0.33, + '●': 0.12, + '🏀': 0.17, + '💉': 0.24, + '💟': 0.45, + '🚗': 0.15, + '😯': 0.08, + '📝': 0.15, + '═': 0.01, + '♦': 0.29, + '💭': 0.13, + '🌙': 0.36, + '🐟': 0.42, + '👣': 0.21, + '☞': 0.07, + '✂': -0.28, + '🗿': 0.27, + '🍝': 0.07, + '👪': -0.01, + '🍭': 0.18, + '🌃': 0.23, + '❌': 0.16, + '🐰': 0.34, + '💊': 0.25, + '🚨': 0.37, + '😦': -0.21, + '🍪': 0.18, + '🍣': -0.13, + '╭': 0.09, + '✧': 0.18, + '🎆': 0.39, + '╮': 0.07, + '🎎': 0.49, + '🇩': 0.33, + '✅': 0.22, + '👹': 0.03, + '📱': 0.16, + '🙍': -0.17, + '🍑': 0.13, + '🎼': 0.17, + '🔊': 0.21, + '🌌': 0.26, + '🍎': 0.16, + '🐻': 0.22, + '─': 0.07, + '╰': -0.03, + '💇': 0.16, + '♬': 0.12, + '♚': 0.02, + '🔴': 0.19, + '🍱': -0.15, + '🍊': 0.2, + '🍒': 0.15, + '🐭': 0.33, + '👟': 0.2, + '🌎': 0.15, + '🍍': 0.22, + '🐮': 0.27, + '📲': 0.11, + '☼': 0.09, + '🌅': 0.16, + '🇷': 0.3, + '👠': 0.16, + '🌽': 0.2, + '💧': -0.07, + '❓': 0.03, + '🍬': 0.16, + '😺': 0.17, + '🐴': 0.03, + '🚀': 0.21, + '¦': 0.25, + '💢': 0.1, + '🎬': 0.12, + '🍧': 0.13, + '🍜': 0.17, + '🐏': 0.24, + '🐘': 0.01, + '👧': 0.06, + '⠀': 0.02, + '🏄': 0.22, + '➤': 0.13, + '⬆': 0.12, + '🍋': 0.1, + '🆗': 0.22, + '⚪': 0.18, + '📺': 0.15, + '🍅': 0.14, + '⛅': 0.18, + '🐢': 0.08, + '👙': 0.2, + '🏡': 0.17, + '🌾': 0.21, + '◉': 0.1, + '✏': 0.13, + '🐬': 0.16, + '🍤': 0.02, + '🇹': 0.22, + '♣': 0.13, + '🐝': 0.08, + '🌝': 0.07, + '🇮': 0.22, + '🔋': -0.18, + '🐍': 0.13, + '♔': 0.2, + '🍳': 0.01, + '🔵': 0.11, + '😾': -0.12, + '🌕': 0.2, + '🐨': 0.16, + '🔐': 0.12, + '💿': 0.22, + '❁': 0.02, + '🌳': 0.17, + '👰': 0.17, + '❀': 0.14, + '⚓': 0.2, + '🚴': 0.23, + '▀': -0.05, + '👗': 0.08, + '➕': 0.18, + '💬': 0.12, + '▒': -0.01, + '🔜': 0.09, + '🍨': 0.07, + '💲': 0.08, + '⛽': 0.05, + '🍙': 0.09, + '🍗': 0.02, + '🍲': 0.04, + '🍥': -0.19, + '▸': 0.07, + '♛': 0.06, + '😼': 0.11, + '🐙': 0.12, + '👨': 0.16, + '🍚': 0.14, + '🍖': 0.04, + '♨': 0.27, + '🎹': 0.11, + '♕': 0.12, + '▃': 0.28, + '🚘': 0.02, + '🍏': 0.02, + '👩': 0.02, + '👦': 0.04, + '🇬': 0.08, + '🇧': 0.08, + '☠': -0.01, + '🐠': 0.12, + '🚹': 0.2, + '💵': 0.11, + '✰': 0.23, + '╠': 0.06, + '👛': 0.1, + '🚙': 0.01, + '🌱': 0.16, + '💻': 0.07, + '🌏': 0.09, + '▄': -0.02, + '👓': 0.08, + '◄': 0.06, + '⚾': -0.01, + '🌲': 0.1, + '👴': 0.06, + '🏠': 0.13, + '🍇': 0.07, + '🍘': 0.1, + '🍛': 0.01, + '🐇': 0.06, + '🔞': -0.01, + '👵': 0.11, + '◀': 0.07, + '🔙': 0.05, + '🌵': 0.05, + '🐽': 0.03, + '🍮': -0.03, + '🎇': 0.17, + '🐎': 0.1, + '➔': -0.03, + '💶': 0.0, + '🐤': 0.13, + '╩': 0.05, + '🛀': 0.03, + '🌑': 0.11, + '🚲': 0.09, + '🐑': -0.04, + '🏁': 0.12, + '🍞': 0.01, + '🎾': 0.13, + '╚': 0.07, + '🈹': 0.07, + '🐳': 0.03, + '👮': -0.08, + '☹': -0.12, + '🐵': 0.11, + '✪': 0.07, + '◕': 0.1, + '🗼': 0.12, + '▐': -0.03, + '♠': 0.07, + '┳': -0.08, + '👺': -0.04, + '🐚': 0.05, + '👂': -0.03, + '🗽': 0.07, + '🍵': 0.08, + '🆒': 0.08, + '🍯': 0.01, + '🐺': 0.05, + '⇨': 0.1, + '➨': 0.03, + '🌓': 0.13, + '🔒': 0.04, + '╬': -0.03, + '👳': 0.13, + '🌂': 0.05, + '🚌': 0.04, + '♩': 0.11, + '🍡': -0.01, + '❥': 0.05, + '🎡': 0.06, + '💌': 0.1, + '🐩': 0.07, + '🌜': 0.1, + '⌚': 0.04, + '🚿': 0.12, + '🐖': 0.03, + '🔆': 0.11, + '🌛': 0.11, + '💂': -0.03, + '🐔': 0.06, + '🙎': -0.01, + '🏩': 0.08, + '🇫': 0.09, + '🔨': -0.02, + '📢': 0.08, + '🐦': 0.08, + '🐲': -0.01, + '♻': 0.09, + '🌘': 0.11, + '🍐': 0.03, + '🌔': 0.11, + '╥': 0.02, + '❊': 0.0, + '👖': 0.06, + '🚺': 0.03, + '😗': 0.11, + '🎭': 0.0, + '🐄': 0.05, + '◟': -0.01, + '🍢': -0.02, + '🎨': 0.03, + '⬇': 0.07, + '🚼': 0.1, + '⛲': 0.01, + '▁': 0.0, + '🇴': 0.06, + '🌗': 0.11, + '🌖': 0.11, + '🔅': 0.15, + '👜': 0.04, + '🐌': 0.11, + '💼': 0.09, + '🚕': 0.0, + '🐹': 0.05, + '🌠': 0.09, + '🐈': 0.05, + '⇧': 0.02, + '☎': 0.0, + '🌁': 0.03, + '⚫': 0.04, + '♧': 0.08, + '🏰': 0.05, + '🚵': 0.06, + '🎢': 0.08, + '🎷': 0.11, + '🎐': 0.03, + '┈': -0.1, + '╗': 0.06, + '╱': 0.0, + '🌇': 0.08, + '⏰': 0.07, + '⇩': 0.0, + '🚂': 0.04, + '◠': 0.07, + '🎿': 0.06, + '✦': 0.01, + '🆔': 0.12, + '⛪': 0.02, + '🌒': 0.09, + '🐪': 0.09, + '╔': 0.04, + '╝': 0.07, + '👔': 0.05, + '🔱': 0.01, + '🆓': 0.03, + '🐋': 0.03, + '▽': 0.06, + '▂': 0.0, + '🐛': 0.04, + '👕': 0.06, + '🚋': 0.01, + '💳': 0.06, + '🌆': 0.02, + '🏧': 0.12, + '💡': 0.09, + '🔹': 0.02, + '⬅': 0.07, + '🍠': 0.0, + '🐫': 0.05, + '🏪': 0.01, + '۩': 0.0, + '🇱': 0.06, + '📹': 0.06, + '👞': 0.06, + '🚑': 0.01, + '🆘': 0.01, + '👚': 0.08, + '🚍': 0.01, + '□': -0.03, + '🐂': 0.02, + '🚣': 0.08, + '✳': 0.0, + '🏉': 0.07, + '🗻': 0.08, + '🐀': 0.02, + '╦': 0.05, + '⛺': 0.06, + '🐕': 0.03, + '🏂': 0.05, + '👡': 0.05, + '📻': 0.04, + '✒': 0.03, + '🌰': 0.07, + '🏢': 0.02, + '🎒': 0.06, + '⌒': 0.07, + '🏫': -0.03, + '📴': 0.08, + '🚢': 0.03, + '🚚': -0.01, + '🐉': 0.02, + '❒': 0.03, + '🐊': 0.01, + '🔔': 0.1, + '◢': 0.08, + '🏥': 0.03, + '❔': 0.0, + '🚖': -0.01, + '🃏': 0.01, + '▼': 0.01, + '▌': -0.03, + '☛': 0.04, + '✩': 0.0, + '💒': 0.06, + '🚤': 0.04, + '🐐': 0.05, + '■': -0.03, + '🔚': 0.04, + '🎻': 0.04, + '🔷': 0.02, + '🚦': 0.01, + '🔓': 0.01, + '🎽': 0.05, + '📅': 0.02, + '🎺': 0.07, + '✯': 0.0, + '🍈': -0.04, + '✉': 0.03, + '╣': 0.0, + '◤': 0.09, + '○': 0.05, + '🍼': 0.05, + '📀': 0.01, + '🚛': -0.02, + '📓': 0.02, + '☉': 0.02, + '💴': -0.02, + '┼': 0.0, + '🐃': 0.0, + '➰': -0.01, + '🔌': -0.01, + '🍄': 0.0, + '📕': 0.02, + '📣': 0.04, + '🚓': 0.03, + '🐗': 0.05, + '↪': 0.01, + '⛳': 0.07, + '┻': -0.04, + '┛': 0.06, + '┃': 0.04, + '👱': 0.01, + '⏳': 0.0, + '💺': 0.02, + '🏇': -0.01, + '☻': 0.02, + '📞': 0.04, + 'Ⓐ': -0.01, + '🌉': 0.05, + '🚩': -0.02, + '✎': 0.05, + '📃': 0.04, + '🏨': 0.02, + '📌': -0.04, + '♎': -0.01, + '💷': 0.04, + '🚄': 0.05, + '▲': 0.05, + '⛵': 0.05, + '🔸': 0.02, + '⌛': 0.01, + '🚜': 0.07, + '🐆': 0.03, + '👒': 0.02, + '❕': 0.02, + '🔛': 0.04, + '♢': 0.03, + '🇲': 0.04, + '❅': 0.06, + '👝': 0.03, + '✞': 0.03, + '◡': 0.02, + '🎋': 0.04, + '👥': 0.02, + '📵': 0.01, + '🐡': 0.02, + '◆': 0.05, + '🏯': 0.01, + '☂': 0.0, + '🔭': 0.03, + '🎪': 0.02, + '🐜': 0.04, + '♌': 0.05, + '☐': -0.06, + '👷': 0.02, + '↳': 0.0, + '🔈': 0.02, + '📄': 0.06, + '📍': 0.01, + '🚐': 0.05, + '🚔': 0.0, + '🌋': 0.04, + '📡': 0.02, + '⏩': 0.01, + '🚳': 0.06, + '✘': 0.05, + '۞': 0.0, + '☾': 0.0, + '🅰': 0.02, + '📥': 0.0, + '🇼': 0.03, + '┓': 0.04, + '┣': 0.04, + 'Ⓛ': 0.03, + 'Ⓔ': 0.03, + '🔦': 0.0, + '👤': 0.04, + '🚁': 0.01, + '🎠': 0.03, + '🐁': -0.02, + '📗': 0.01, + '┐': -0.01, + '☮': 0.0, + '♂': 0.01, + '◞': 0.0, + '📯': -0.01, + '🔩': 0.01, + '👢': 0.04, + '◂': 0.02, + '📰': 0.02, + '📶': 0.02, + '🚥': 0.0, + '🌄': 0.01, + '🗾': 0.02, + '🔶': 0.02, + '🏤': 0.02, + '🎩': 0.02, + 'Ⓜ': 0.02, + '🔧': -0.03, + '🐅': 0.01, + '♮': 0.01, + '🅾': -0.01, + '🔄': 0.0, + '☄': 0.0, + '☨': 0.0, + '📦': 0.01, + '🚊': 0.01, + '🔲': 0.03, + '🔁': 0.0, + '△': 0.01, + '📆': 0.04, + '❛': 0.02, + '📉': 0.02, + '▵': 0.02, + '🔎': 0.03, + '☜': 0.01, + '🇯': 0.02, + '🇵': 0.02, + '📘': 0.01, + '✡': 0.0, + 'ⓔ': 0.03, + '🔑': 0.01, + '🔃': 0.0, + '👃': 0.0, + '⭕': 0.02, + '🔘': 0.01, + 'ⓒ': 0.0, + '🚭': 0.04, + '🚉': 0.03, + '🚪': 0.03, + '➳': 0.02, + '🚃': 0.03, + '┯': -0.02, + '🏬': 0.0, + '☽': 0.0, + '🆙': 0.02, + '🆖': 0.01, + '☪': 0.0, + '┗': 0.04, + '🚮': 0.0, + '┫': 0.0, + 'Ⓞ': 0.02, + '❇': 0.02, + '✴': 0.02, + '┌': 0.0, + '☊': 0.03, + '🔕': -0.01, + '⬛': -0.01, + '❝': 0.0, + '❞': 0.0, + '🚞': 0.02, + '🍶': 0.02, + '🌐': 0.02, + '♀': 0.01, + '🚅': 0.02, + '🚒': -0.01, + '➣': 0.0, + '♋': 0.01, + '♍': 0.02, + '🕝': -0.01, + 'ⓐ': 0.03, + '✗': 0.0, + '📙': 0.01, + 'Ⓢ': 0.01, + '📋': 0.02, + '⇢': 0.0, + '🎱': 0.01, + '🐞': 0.01, + '🔺': 0.01, + 'ⓡ': 0.03, + '🎍': 0.0, + '♤': 0.02, + '🎲': 0.0, + '🎯': 0.02, + '〠': 0.0, + '🔉': 0.02, + '↩': 0.03, + '🚾': 0.01, + '🎣': -0.02, + '🔣': 0.01, + '❎': -0.03, + '➥': 0.01, + '🅱': 0.0, + '🎌': 0.03, + '◣': 0.01, + '⏬': 0.03, + '♭': 0.01, + '💠': 0.0, + 'ⓞ': 0.02, + '🔳': 0.01, + '🏭': 0.01, + '🔰': 0.0, + '🎳': -0.01, + '☚': 0.02, + '➽': 0.01, + '➫': 0.01, + '➖': -0.02, + '🏮': 0.0, + '📛': 0.0, + '꒰': 0.01, + '꒱': 0.01, + '◝': -0.01, + '📑': 0.02, + '🎦': 0.0, + 'ⓧ': 0.02, + '🇨': 0.0, + '🇳': 0.0, + '🔟': 0.02, + '〓': 0.02, + 'ⓜ': 0.01, + '➠': 0.02, + '🚆': 0.01, + '🚠': 0.0, + '℅': -0.02, + '☃': 0.01, + '🚽': 0.02, + '📐': 0.0, + 'ⓝ': 0.02, + '✮': 0.0, + '⇦': 0.02, + '👲': 0.01, + '🚡': -0.01, + '🎑': 0.0, + '🔬': 0.02, + '➗': -0.01, + '📈': 0.01, + '⌘': 0.0, + '⏪': 0.01, + '╹': 0.0, + '◎': 0.02, + '🔼': 0.0, + '꒦': -0.02, + '📎': 0.02, + '⑅': 0.02, + '⍝': 0.0, + '📁': 0.0, + '✭': 0.02, + '➲': 0.0, + '♓': 0.01, + '┏': 0.02, + '☇': 0.02, + '♺': 0.0, + '♞': 0.0, + '࿎': -0.02, + '📠': 0.0, + '👘': 0.02, + '↙': 0.02, + 'Ⓕ': 0.01, + 'Ⓦ': 0.01, + 'Ⓟ': 0.01, + '🕑': 0.01, + '💽': 0.0, + '🕛': 0.01, + '🎫': 0.0, + '♈': -0.01, + '📟': 0.0, + '℃': 0.0, + '↬': 0.01, + '🕒': 0.0, + '🇰': 0.0, + '↱': 0.0, + '✍': 0.01, + '⇐': 0.0, + '🏦': 0.01, + '🔻': 0.01, + 'ⓟ': 0.01, + 'ⓕ': 0.01, + 'ⓘ': 0.01, + '♿': 0.01, + '⇗': 0.01, + '⇘': 0.01, + 'ⓨ': 0.01, + 'ⓙ': 0.01, + '▫': 0.01, + '🔇': 0.01, + '⌃': -0.01, + '🔖': 0.01, + '📜': 0.01, + '♏': 0.0, + '🚝': 0.01, + '☢': 0.0, + '🎏': 0.0, + '┘': -0.01, + '✝': -0.01, + '❖': 0.0, + '⍣': -0.01, + '📮': -0.01, + '🕕': -0.01, + '🇭': 0.0, + '◜': 0.0, + '🔯': 0.01, + '➸': 0.01, + '꒵': 0.01, + '🕥': -0.01, + '♙': 0.0, + '▿': 0.0, + '⚃': 0.0, + '✽': 0.01, + '📼': 0.01, + '🕐': -0.01, + '🀄': 0.01, + '✾': 0.0, + '✬': 0.01, + '🆑': 0.0, + '✫': 0.01, + '🕔': -0.01, + '❣': 0.01, + '➱': 0.0, + '🆕': 0.0, + '➢': 0.0, + '↕': 0.0, + '📫': 0.01, + '🉐': 0.01, + '♊': 0.0, + '🈂': -0.01, + '🎰': -0.01, + '҂': -0.01, + '╤': -0.01, + '➛': 0.0, + '♝': 0.0, + '❋': 0.0, + '✆': 0.0, + '📔': 0.01 +} \ No newline at end of file From d004b7866f284d10549eab5e29574675d73c4f92 Mon Sep 17 00:00:00 2001 From: Robin <rdoume@gmail.com> Date: Tue, 2 Apr 2019 12:18:27 +0200 Subject: [PATCH 013/496] Change Tokenizer code for spacy to use just the tokenizer static rules --- nautilus_nlp/utils/tokenizer.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/nautilus_nlp/utils/tokenizer.py b/nautilus_nlp/utils/tokenizer.py index c9340bd..01cd4a4 100644 --- a/nautilus_nlp/utils/tokenizer.py +++ b/nautilus_nlp/utils/tokenizer.py @@ -5,14 +5,14 @@ nltk.download('punkt') try: - french_spacy = spacy.load('fr') + french_spacy = spacy.lang.fr.French() except OSError: raise OSError("""You must install French langage to use SpaCy. python -m spacy download fr See https://spacy.io/usage/ for details """) try: - english_spacy = spacy.load('en') + english_spacy = spacy.lang.en.English() except OSError: raise OSError("""You must install english langage to use SpaCy. python -m spacy download en From 552e7b44e32fd6c484d1e7b8c7513c535ba2d585 Mon Sep 17 00:00:00 2001 From: hugovasselin <waaaouu@gmail.com> Date: Wed, 3 Apr 2019 15:10:01 +0200 Subject: [PATCH 014/496] add file loader and notebook --- nautilus_nlp/utils/file_loader.py | 143 ++++--- ... a list of files and detect encoding.ipynb | 401 ++++++++++++++++++ 2 files changed, 482 insertions(+), 62 deletions(-) create mode 100644 notebooks/Open a file, a list of files and detect encoding.ipynb diff --git a/nautilus_nlp/utils/file_loader.py b/nautilus_nlp/utils/file_loader.py index f0c8f6e..7baa483 100644 --- a/nautilus_nlp/utils/file_loader.py +++ b/nautilus_nlp/utils/file_loader.py @@ -1,25 +1,87 @@ -import os +import io +import chardet +import glob +import re +from os.path import isfile, isdir -################# -## Text loaders +import logging + +logging.basicConfig(level=logging.INFO) + + +def open_textfile(filepath, encoding='utf-8'): + with io.open(filepath, 'r', encoding=encoding) as f: + string = f.read() + return string -def load_text_file(file_path): + +def detect_encoding(file_path_or_string, n_lines=100): + ''' + Predict a file's encoding using chardet + ''' + if isfile(file_path_or_string): + with open(file_path_or_string, 'rb') as f: # Open the file as binary data + rawdata = b''.join([f.readline() for _ in range(n_lines)]) # Join binary lines for specified number of lines + elif type(file_path_or_string) is bytes: + rawdata = file_path_or_string + return chardet.detect(rawdata) + + +def text_loader(filepath, encoding=None, detectencoding=True): + ''' + Args: + detect_encoding[bool]= If file is not encoded into UTF-8, try to detect encoding using the chardet library. + ''' + if encoding is not None: + return open_textfile(filepath, encoding=encoding) + else: + try: + return open_textfile(filepath, encoding='utf-8') + except UnicodeDecodeError: + logging.warning('Encoding is not UTF-8.') + if detectencoding is True: + logging.warning('Trying to detect encoding for {}'.format(filepath)) + detected_encoding = detect_encoding(filepath) + logging.info('detected encoding is {encod}, with a confidence rate of {conf_rate}'.format(encod=detected_encoding['encoding'], + conf_rate=detected_encoding['confidence'])) + return open_textfile(filepath, encoding=detected_encoding['encoding']) + + +def list_files(filepath:str): + ''' + inputs a filepath. + Outputs a list of filepath. + Supports regex ''' - load a file as string - Inputs a file path, returns a string''' - with open(file_path, errors="ignore") as handle: - text = handle.read() - return text + if isdir(filepath) and len(re.findall(r"[\w.]$",filepath)): + filepath=filepath+'/*' + if filepath.endswith('/'): + filepath=filepath+'*' + return[file for file in glob.glob(filepath) if isfile(file)] -def load_texts_as_string(filenames): - """ Input is a list of path, output is a dict """ - from collections import defaultdict - loaded_text = defaultdict(str) # each value is a string, the text - for filename in filenames: - with open(filename, errors="ignore") as handle: - loaded_text[filename] = handle.read() - return loaded_text +def documents_loader(filepath, encoding=None): + ''' + Input a filepath, a filepath with wildcard (eg. *.txt), + or a list of filepaths. + Output a string, or a dict of strings. + ''' + + if type(filepath) is str: + documents = list_files(filepath) + nb_of_documents = len(documents) + elif type(filepath) is list: + nb_of_documents = len(filepath) + documents = filepath + else: + raise IOError('Please enter a valid filepath or a valid list of filepath') + + if nb_of_documents == 1: + return text_loader(documents[0],encoding=encoding) + elif nb_of_documents > 1: + return { document : text_loader(documents[0], encoding=encoding) for document in documents} + else: + raise IOError('No files detected in {}'.format(filepath)) ################# @@ -38,55 +100,12 @@ def decode_columns(df, columns_to_encode): apply json.loads on columns ''' for col in columns_to_encode: - df[col] = df[col].apply(json.loads) - - -################# -## Functions to list a folder and get filepaths - -def get_filenames(folder): - from os import listdir - from os.path import isfile, join - - if not folder.endswith("/"): - folder = folder + "/" - # this will return only the filenames, not folders inside the path - return [folder + f for f in listdir(folder) - if isfile(join(folder, f)) and f != ".DS_Store"] - - -def get_filepath(folder): - """ - Return the path of all the files of a directory - """ - import os - if not folder.endswith("/"): - folder = folder + "/" - res = [] - for root, dirs, files in os.walk(folder, topdown=False): - for name in files: - res.append(os.path.join(root, name)) - return res + df[col] = df[col].apply(json.loads) + ################# ## Encoding functions -def predict_encoding(file_path_or_string, file=True, n_lines=20): - ''' - Predict a file's encoding using chardet - ''' - import chardet - - if file is True: - # Open the file as binary data - with open(file_path_or_string, 'rb') as f: - # Join binary lines for specified number of lines - rawdata = b''.join([f.readline() for _ in range(n_lines)]) - else: - rawdata = file_path_or_string - - return chardet.detect(rawdata)['encoding'] - def convert_encoding(file_path, input_encoding, output_encoding): ''' diff --git a/notebooks/Open a file, a list of files and detect encoding.ipynb b/notebooks/Open a file, a list of files and detect encoding.ipynb new file mode 100644 index 0000000..8c26c57 --- /dev/null +++ b/notebooks/Open a file, a list of files and detect encoding.ipynb @@ -0,0 +1,401 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Open Text File with encoding handling" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "# Example of a latin1 file\n", + "s = \"J'aime les frites bien grasse étalon châpeau!\"\n", + "encoded_s = s.encode('latin-1')\n", + "with open('somefile.txt', 'wb') as f:\n", + " f.write(encoded_s)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## text loader" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "If you don't know what the encoding is, you can use the `text_loader()`. Il will try to open with UTF-8, and if it fails it will apply `detect_encoding()`." + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "from nautilus_nlp.utils.file_loader import text_loader" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "WARNING:root:Encoding is not UTF-8.\n", + "WARNING:root:Trying to detect encoding for somefile.txt\n", + "INFO:root:detected encoding is ISO-8859-1, with a confidence rate of 0.73\n" + ] + }, + { + "data": { + "text/plain": [ + "\"J'aime les frites bien grasse étalon châpeau!\"" + ] + }, + "execution_count": 3, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "text_loader('somefile.txt')" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## open text file when you know the encoding" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "If you know the encoding. (you can also use `open_textfile()`)" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "\"J'aime les frites bien grasse étalon châpeau!\"" + ] + }, + "execution_count": 4, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "text_loader('somefile.txt',encoding='latin-1')" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## detect encoding " + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "from nautilus_nlp.utils.file_loader import detect_encoding" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "{'encoding': 'ISO-8859-1', 'confidence': 0.73, 'language': ''}" + ] + }, + "execution_count": 6, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "detect_encoding('somefile.txt')" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## List files in a folder" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "from nautilus_nlp.utils.file_loader import list_files" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "['./somefile.txt',\n", + " './Open a file, a list of files and detect encoding.ipynb',\n", + " './Visualization tools.ipynb',\n", + " './Language_identification.ipynb',\n", + " './someadditionalfile.txt',\n", + " './somefile',\n", + " './Common Text Processing operations.ipynb',\n", + " './Sentiment_analysis_FT.ipynb',\n", + " './Spacy_model.ipynb',\n", + " './Sentiment analysis using pre-trained models.ipynb']" + ] + }, + "execution_count": 8, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "list_files('.') # list files from current folders" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "['./Open a file, a list of files and detect encoding.ipynb',\n", + " './Visualization tools.ipynb',\n", + " './Language_identification.ipynb',\n", + " './Common Text Processing operations.ipynb',\n", + " './Sentiment_analysis_FT.ipynb',\n", + " './Spacy_model.ipynb',\n", + " './Sentiment analysis using pre-trained models.ipynb']" + ] + }, + "execution_count": 9, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "list_files('./*.ipynb') # List files matching specific pattern" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": { + "scrolled": true + }, + "outputs": [ + { + "data": { + "text/plain": [ + "['/Users/hugo/Documents/NAUTILUS/nautilus-nlp/LICENSE',\n", + " '/Users/hugo/Documents/NAUTILUS/nautilus-nlp/requirements.txt',\n", + " '/Users/hugo/Documents/NAUTILUS/nautilus-nlp/Makefile',\n", + " '/Users/hugo/Documents/NAUTILUS/nautilus-nlp/README.md',\n", + " '/Users/hugo/Documents/NAUTILUS/nautilus-nlp/setup.py',\n", + " '/Users/hugo/Documents/NAUTILUS/nautilus-nlp/tox.ini',\n", + " '/Users/hugo/Documents/NAUTILUS/nautilus-nlp/test_environment.py']" + ] + }, + "execution_count": 10, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# only files will be printed, not folders\n", + "list_files('/Users/hugo/Documents/NAUTILUS/nautilus-nlp/')" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Open several text files" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "# Let's add another document \n", + "s = \"Un deuxième exemple de texte en utf-8 cette fois!\"\n", + "encoded_s = s.encode('utf-8')\n", + "with open('someadditionalfile.txt', 'wb') as f:\n", + " f.write(encoded_s)" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "metadata": {}, + "outputs": [], + "source": [ + "from nautilus_nlp.utils.file_loader import documents_loader" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "WARNING:root:Encoding is not UTF-8.\n", + "WARNING:root:Trying to detect encoding for somefile.txt\n", + "INFO:root:detected encoding is ISO-8859-1, with a confidence rate of 0.73\n", + "WARNING:root:Encoding is not UTF-8.\n", + "WARNING:root:Trying to detect encoding for somefile.txt\n", + "INFO:root:detected encoding is ISO-8859-1, with a confidence rate of 0.73\n" + ] + }, + { + "data": { + "text/plain": [ + "{'somefile.txt': \"J'aime les frites bien grasse étalon châpeau!\",\n", + " 'someadditionalfile.txt': \"J'aime les frites bien grasse étalon châpeau!\"}" + ] + }, + "execution_count": 13, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "documents_loader('*.txt')" + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "WARNING:root:Encoding is not UTF-8.\n", + "WARNING:root:Trying to detect encoding for somefile.txt\n", + "INFO:root:detected encoding is ISO-8859-1, with a confidence rate of 0.73\n", + "WARNING:root:Encoding is not UTF-8.\n", + "WARNING:root:Trying to detect encoding for somefile.txt\n", + "INFO:root:detected encoding is ISO-8859-1, with a confidence rate of 0.73\n" + ] + }, + { + "data": { + "text/plain": [ + "{'somefile.txt': \"J'aime les frites bien grasse étalon châpeau!\",\n", + " 'someadditionalfile.txt': \"J'aime les frites bien grasse étalon châpeau!\"}" + ] + }, + "execution_count": 14, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "documents_loader(['somefile.txt','someadditionalfile.txt'])" + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "'Un deuxième exemple de texte en utf-8 cette fois!'" + ] + }, + "execution_count": 15, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "documents_loader('someadditionalfile.txt',encoding='utf-8')" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": true + }, + "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.7.0" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} From 61cb9ccc409806aac13bbf9df34a83479703cb2e Mon Sep 17 00:00:00 2001 From: Robin <rdoume@gmail.com> Date: Thu, 4 Apr 2019 12:41:58 +0200 Subject: [PATCH 015/496] requirements --- requirements.txt | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/requirements.txt b/requirements.txt index c3f187c..869399b 100644 --- a/requirements.txt +++ b/requirements.txt @@ -25,4 +25,5 @@ stopwords textblob textblob_fr vaderSentiment -stop_words \ No newline at end of file +stop_words +cld2_cffi~=0.1 From 3cf84db6cf50ede8c89328e780bf1cbcb6c5fe76 Mon Sep 17 00:00:00 2001 From: Robin <rdoume@gmail.com> Date: Thu, 4 Apr 2019 12:42:27 +0200 Subject: [PATCH 016/496] Abstraction of doc --- nautilus_nlp/doc.py | 394 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 394 insertions(+) create mode 100644 nautilus_nlp/doc.py diff --git a/nautilus_nlp/doc.py b/nautilus_nlp/doc.py new file mode 100644 index 0000000..e88743c --- /dev/null +++ b/nautilus_nlp/doc.py @@ -0,0 +1,394 @@ +import functools +import pkg_resources +import nautilus_nlp +lang_path = pkg_resources.resource_filename('nautilus_nlp.data', 'lang_identification.ftz') + + +class NautilusMissingModelException(Exception): + """Raised when the requested model is missing""" + + pass + + +class Doc: + """ + Create a doc instance of text, obtain cleaned, readable text and + metadata from this doc. + + Properties: + raw: incoming, unedited text + language: 2-letter code for the language of the text + is_detected_language: is the language detected or specified beforehand + is_reliable_language: is the language specified or was it reliably detected + _spacy_nlps: nested dictionary {lang: {model_id: model}} with loaded spacy language modules + """ + + def __init__(self, raw, language=None, spacy_nlps=None,langdetect = None): + self.raw = raw + self._spacy_nlps = spacy_nlps or dict() + self._language = language + self._is_reliable_language = True if language else None + self._language_detector=langdetect + self._text_stats = {} + + @property + def _spacy_doc(self): + """ + Loads the default spacy doc or creates one if necessary + + >>> doc = Doc('Test sentence for testing text') + >>> type(doc._spacy_doc) + <class 'spacy.tokens.doc.Doc'> + """ + lang = self.language if self.is_reliable_language else self.hint_language + + return self._load_spacy_doc(lang) + + def _load_spacy_doc(self, lang, model_name=None): + """ + Loads a spacy doc or creates one if necessary + """ + # Load default spacy model if necessary, if not loaded already + if lang not in self._spacy_nlps or ( + model_name is None and model_name not in self._spacy_nlps[lang] + ): + if lang not in self._spacy_nlps: + self._spacy_nlps[lang] = {} + self._spacy_nlps[lang][None] = self._get_default_nlp(lang) + if model_name not in self._spacy_nlps[lang] and model_name is not None: + raise NautilusMissingModelException( + f"Custom model {model_name} " f"is missing." + ) + nlp = self._spacy_nlps[lang][model_name] + doc = nlp(self.clean_text()) + return doc + + @staticmethod + @functools.lru_cache() + def _get_default_nlp(lang): + """ + Loads the spacy default language module for the Doc's language + """ + try: + return spacy.load( + "{}_core_{}_sm".format(lang, "web" if lang == "en" else "news") + ) + except IOError: + raise NautilusMissingModelException( + f'Default model for language "{lang}" is not available.' + ) + + @property + def entities(self): + """ + A list of the named entities with sensible defaults. + + >>> doc = Doc('Sentence for testing Google text') + >>> doc.entities + [('Google', 'ORG')] + """ + return self.find_entities() + + @functools.lru_cache() + def find_entities(self, model_name=None): + """ + Extract a list of the named entities in text, with the possibility of using a custom model. + >>> doc = Doc('Sentence for testing Google text') + >>> doc.find_entities() + [('Google', 'ORG')] + """ + lang = self.language if self.is_reliable_language else self.hint_language + return list( + { + (ent.text, ent.label_) + for ent in self._load_spacy_doc(lang, model_name).ents + } + ) + + @property + def n_sentences(self): + """ + Extract the number of sentences from text + + >>> doc = Doc('Test sentence for testing text. And another sentence for testing!') + >>> doc.n_sentences + 2 + """ + return len(list(self._spacy_doc.sents)) + + @property + def sentences(self): + """ + Extract the text and character offset (begin) of sentences from text + + >>> doc = Doc('Test sentence for testing text. And another one with, some, punctuation! And stuff.') + >>> doc.sentences + [('Test sentence for testing text.', 0), ('And another one with, some, punctuation!', 32), ('And stuff.', 73)] + """ + + return [(span.text, span.start_char) for span in self._spacy_doc.sents] + + @property + def n_words(self): + """ + Extract the number of words from text + + >>> doc = Doc('Test sentence for testing text') + >>> doc.n_words + 5 + """ + return len(self.n_words) + + @property + def words(self): + """ + Extract the text and character offset (begin) of words from text + + >>> doc = Doc('Test sentence for testing text.') + >>> doc.words + [('Test', 0), ('sentence', 5), ('for', 14), ('testing', 18), ('text', 26), ('.', 30)] + """ + + return [(token.text, token.idx) for token in self._spacy_doc] + + @property + def word_counts(self): + """ + Extract words with their counts + + >>> doc = Doc('Test sentence for testing vectorisation of a sentence.') + >>> doc.word_counts + {'Test': 1, 'sentence': 2, 'for': 1, 'testing': 1, 'vectorisation': 1, 'of': 1, 'a': 1, '.': 1} + """ + + return dict(Counter(word for word, _ in self.words)) + + @property + def complexity(self): + """ + Determine the complexity of text using the Flesch + reading ease test ranging from 0.0 - 100.0 with 0.0 + being the most difficult to read. + + >>> doc = Doc('Test sentence for testing text') + >>> doc.complexity + 83.32000000000004 + """ + if not self._text_stats: + self._text_stats = textacy.TextStats(self._spacy_doc) + if self._text_stats.n_syllables == 0: + return 100 + return self._text_stats.flesch_reading_ease + + @property + def sentiment(self): + """ + Returns polarity score (-1 to 1) and a subjectivity score (0 to 1) + + Currently only English, Dutch, French and Italian supported + + >>> doc = Doc('Dit is een leuke zin.') + >>> doc.sentiment + (0.6, 0.9666666666666667) + """ + + if self.language == "en": + from pattern.text.en import sentiment as sentiment_en + + return sentiment_en(self.clean) + elif self.language == "nl": + from pattern.text.nl import sentiment as sentiment_nl + + return sentiment_nl(self.clean) + elif self.language == "fr": + from pattern.text.fr import sentiment as sentiment_fr + + return sentiment_fr(self.clean) + elif self.language == "it": + from pattern.text.it import sentiment as sentiment_it + + return sentiment_it(self.clean) + + raise NautilusMissingModelException(f"No sentiment model for {self.language}") + + @functools.lru_cache() + def extract_keyterms(self, ranker="textrank", n_terms=10, **kwargs): + """ + Extract and rank key terms in the document by proxying to + `textacy.keyterms`. Returns a list of (term, score) tuples. Depending + on the ranking algorithm used, terms can consist of multiple words. + + Available rankers are TextRank (textrank), SingleRank (singlerank) and + SGRank ('sgrank'). + + >>> doc = Doc('Amsterdam is the awesome capital of the Netherlands.') + >>> doc.extract_keyterms(n_terms=3) + [('awesome', 0.32456160227748454), ('capital', 0.32456160227748454), ('Amsterdam', 0.17543839772251532)] + >>> doc.extract_keyterms(ranker='sgrank') + [('awesome capital', 0.5638711013322963), ('Netherlands', 0.22636566128805719), ('Amsterdam', 0.20976323737964653)] + >>> doc.extract_keyterms(ranker='sgrank', ngrams=(1)) + [('Netherlands', 0.4020557546031188), ('capital', 0.29395103364295216), ('awesome', 0.18105611227666252), ('Amsterdam', 0.12293709947726655)] + """ + if self.nwords < 1: + return [] + rankers = ["textrank", "sgrank", "singlerank"] + if ranker not in rankers: + raise ValueError( + f'ranker "{ranker}" not available; use one ' f"of {rankers}" + ) + ranking_fn = getattr(textacy.keyterms, ranker) + return ranking_fn(self._spacy_doc, n_keyterms=n_terms, **kwargs) + + @property + def keyterms(self): + """ + Return textranked keyterms for the document. + + >>> doc = Doc('Amsterdam is the awesome capital of the Netherlands.') + >>> doc.extract_keyterms(n_terms=3) + [('awesome', 0.32456160227748454), ('capital', 0.32456160227748454), ('Amsterdam', 0.17543839772251532)] + """ + return self.extract_keyterms() + + @property + def minhash(self): + """ + A cheap way to compute a hash for finding similarity of docs + Source: https://ekzhu.github.io/datasketch/minhash.html + >>> doc = Doc('Sentence for computing the minhash') + >>> doc.minhash[:5] + [407326892, 814360600, 1099082245, 1176349439, 1735256] + """ + return self.find_minhash() + + @functools.lru_cache() + def find_minhash(self, num_perm=128): + words = self.words + doc_hash = MinHash(num_perm=num_perm) + for word, _ in words: + doc_hash.update(word.encode("utf8")) + return list(doc_hash.digest()) + + def similarity(self, other_doc, metric="jaccard", hash_method="minhash"): + """ + Computes similarity for two documents. + Only minhash Jaccard similarity is implemented. + >>> doc1 = Doc('Sentence for computing the minhash') + >>> doc2 = Doc('Sentence for computing the similarity') + >>> doc1.similarity(doc2) + 0.7265625 + """ + if hash_method == "minhash" and metric == "jaccard": + hash1 = MinHash(hashvalues=self.minhash) + hash2 = MinHash(hashvalues=other_doc.minhash) + return hash1.jaccard(hash2) + else: + raise NotImplementedError( + f"Metric/hash method combination {metric}" + f"/{hash_method} is not implemented as similarity metric" + ) + + @property + def word_vectors(self): + """ + Returns word embeddings for the words in the document. + """ + return self.generate_word_vectors() + + @functools.lru_cache() + def generate_word_vectors(self, model_name=None): + """ + Returns word embeddings for the words in the document. + The default spacy models don't have "true" word vectors + but only context-sensitive tensors that are within the document. + + Returns: + A dictionary mapping words from the document to a dict with the + corresponding values of the following variables: + + has vector: Does the token have a vector representation? + vector norm: The L2 norm of the token's vector (the square root of the + sum of the values squared) + OOV: Out-of-vocabulary (This variable always gets the value True since + there are no vectors included in the model) + vector: The vector representation of the word + + >>> doc = Doc('Test sentence') + >>> doc.word_vectors['Test']['is_oov'] + True + >>> len(doc.word_vectors['Test']['vector']) + 96 + >>> doc.word_vectors['Test']['vector_norm'] == doc.word_vectors['sentence']['vector_norm'] + False + """ + lang = self.language if self.is_reliable_language else self.hint_language + return { + token.text: { + "has_vector": token.has_vector, + "vector_norm": token.vector_norm, + "is_oov": token.is_oov, + "vector": token.vector.tolist(), + } + for token in self._load_spacy_doc(lang, model_name) + } + + @property + def doc_vector(self): + """ + Returns document embeddings based on the words in the document. + + >>> import numpy + >>> numpy.array_equiv(Doc('a b').doc_vector, Doc('a b').doc_vector) + True + >>> numpy.array_equiv(Doc('a b').doc_vector, Doc('a a b').doc_vector) + False + """ + return self.aggregate_word_vectors() + + @functools.lru_cache() + def aggregate_word_vectors( + self, model_name=None, aggregation="mean", normalize=False, exclude_oov=False + ): + """ + Returns document embeddings based on the words in the document. + + >>> import numpy + >>> doc1 = Doc('a b') + >>> doc2 = Doc('a a b') + >>> numpy.array_equiv(doc1.aggregate_word_vectors(), doc1.aggregate_word_vectors()) + True + >>> numpy.array_equiv(doc1.aggregate_word_vectors(), doc2.aggregate_word_vectors()) + False + >>> numpy.array_equiv(doc1.aggregate_word_vectors(aggregation='mean'), doc2.aggregate_word_vectors(aggregation='sum')) + False + >>> numpy.array_equiv(doc1.aggregate_word_vectors(aggregation='mean'), doc2.aggregate_word_vectors(aggregation='var')) + False + >>> numpy.array_equiv(doc1.aggregate_word_vectors(aggregation='sum'), doc2.aggregate_word_vectors(aggregation='var')) + False + >>> doc = Doc('sentence with an out of vector word lsseofn') + >>> len(doc.aggregate_word_vectors()) + 96 + >>> numpy.array_equiv(doc.aggregate_word_vectors(exclude_oov=False), doc.aggregate_word_vectors(exclude_oov=True)) + False + """ + lang = self.language if self.is_reliable_language else self.hint_language + tokens = [ + token + for token in self._load_spacy_doc(lang, model_name) + if not exclude_oov or not token.is_oov + ] + vectors = [ + token.vector / token.vector_norm if normalize else token.vector + for token in tokens + ] + + if aggregation == "mean": + return numpy.mean(vectors, axis=0).tolist() + elif aggregation == "sum": + return numpy.sum(vectors, axis=0).tolist() + elif aggregation == "var": + return numpy.var(vectors, axis=0).tolist() + else: + raise NotImplementedError( + f"Aggregation method {aggregation} is not implemented." + ) From 7384336cc31b838dca81e0f1ff8dd872c589a9c8 Mon Sep 17 00:00:00 2001 From: Robin <rdoume@gmail.com> Date: Thu, 4 Apr 2019 12:42:59 +0200 Subject: [PATCH 017/496] wiki/Entities_extraction.md --- wiki/README.md | 22 ++++++++++++++++++++++ wiki/Speech_to_text.md | 6 ++++++ wiki/Text_classification.md | 7 +++++++ wiki/Text_generation.md | 1 + wiki/Text_processing.md | 37 +++++++++++++++++++++++++++++++++++++ wiki/Topic_Modeling.md | 7 +++++++ 6 files changed, 80 insertions(+) create mode 100644 wiki/README.md create mode 100644 wiki/Speech_to_text.md create mode 100644 wiki/Text_classification.md create mode 100644 wiki/Text_generation.md create mode 100644 wiki/Text_processing.md create mode 100644 wiki/Topic_Modeling.md diff --git a/wiki/README.md b/wiki/README.md new file mode 100644 index 0000000..b98f83e --- /dev/null +++ b/wiki/README.md @@ -0,0 +1,22 @@ +# Nautilus NLP SUMMARY + +This Mardown is used as the summary for the following parts: + +## **Text Based NLP** + +### [*Topic Modeling*](Topic_Modeling.md) + +### [*Text Classification*](Text_classification.md) + +### [*Entities Extraction*](Entities_extraction.md) + +### [*Text Processing*](Text_processing.md) + +### [*Text Generation*](Text_generation.md) + + +## **Audio-Based NLP** + +### [*Speech to Text*](Speech_to_text.md) + +### [*Voice Classification*](Voice_Classification.md) \ No newline at end of file diff --git a/wiki/Speech_to_text.md b/wiki/Speech_to_text.md new file mode 100644 index 0000000..0f6eb92 --- /dev/null +++ b/wiki/Speech_to_text.md @@ -0,0 +1,6 @@ +# Speech to Text + + +## Corpus + +## State of the art diff --git a/wiki/Text_classification.md b/wiki/Text_classification.md new file mode 100644 index 0000000..b0d8c19 --- /dev/null +++ b/wiki/Text_classification.md @@ -0,0 +1,7 @@ +# Text Classification (Applied to Sentiment Analysis) + +## Machine-learning based + +## Word-vector based + +## Deep-learning based \ No newline at end of file diff --git a/wiki/Text_generation.md b/wiki/Text_generation.md new file mode 100644 index 0000000..1ae1192 --- /dev/null +++ b/wiki/Text_generation.md @@ -0,0 +1 @@ +# Text Generation \ No newline at end of file diff --git a/wiki/Text_processing.md b/wiki/Text_processing.md new file mode 100644 index 0000000..a9c7740 --- /dev/null +++ b/wiki/Text_processing.md @@ -0,0 +1,37 @@ +# Text Processing + +## Introduction & Best practice + +## Encoding / Decoding + +In our python programming lives, pretty much everyone working with text data encountered one day the terrible: + + `UnicodeDecodeError: 'machine' codec can't decode character 'somethingsomething' in position x: ordinal not in range(z)` +And you probably spend the next hour trying to figure out to get out of this mess. + +Usually, most of programming language automatically infer the encoding of the text. However, Python does not, and this can lead to a ton of problem. + +Encoding is the table of representation between the binary code understood by the computer and the letters as we see them. Therefore, everytime you see text on a screen, it is encoded in a way. +The problem is, pretty much every country in the world had his own way of encoding and these encodings still persist: The encoding module of python can understand around 100 different encoding. + +So, how do we get out of this mess? + + +### **The Absolute Rule:** +Use 'UTF-8' as default encoding for your processes. + +### If you are still in Python2.7 +*And you want to use it until its end of life(December 2019)* + + + +### If you are in Python 3 + + +## Stemmatization / Lemmatization + +## Vector Representation + +### Bag of Word & TF-IDF + +### Word Embeddings diff --git a/wiki/Topic_Modeling.md b/wiki/Topic_Modeling.md new file mode 100644 index 0000000..9a04ef4 --- /dev/null +++ b/wiki/Topic_Modeling.md @@ -0,0 +1,7 @@ +# Topic Modelling + +## LDA + +## LSA + +## Topic clustering/propagation? \ No newline at end of file From 4fecab65652af18aa98fb891f756628064a777cc Mon Sep 17 00:00:00 2001 From: Robin <rdoume@gmail.com> Date: Thu, 4 Apr 2019 12:43:27 +0200 Subject: [PATCH 018/496] Add wiki markdown --- wiki/Entities_extraction.md | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 wiki/Entities_extraction.md diff --git a/wiki/Entities_extraction.md b/wiki/Entities_extraction.md new file mode 100644 index 0000000..7fbbf2c --- /dev/null +++ b/wiki/Entities_extraction.md @@ -0,0 +1,5 @@ +# Entities Extraction + +## Part of Speech Tagging + +## Entity detections \ No newline at end of file From a09ac5731ac4f2f4b514212c6ac60b8a841ab698 Mon Sep 17 00:00:00 2001 From: Robin <rdoume@gmail.com> Date: Thu, 4 Apr 2019 14:13:14 +0200 Subject: [PATCH 019/496] Fix Spacy import for lang model tokenizer --- nautilus_nlp/utils/tokenizer.py | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/nautilus_nlp/utils/tokenizer.py b/nautilus_nlp/utils/tokenizer.py index 01cd4a4..94eb7aa 100644 --- a/nautilus_nlp/utils/tokenizer.py +++ b/nautilus_nlp/utils/tokenizer.py @@ -1,18 +1,20 @@ import nltk from sacremoses import MosesTokenizer, MosesDetokenizer import spacy - -nltk.download('punkt') +from spacy.lang.fr import French +from spacy.lang.en import English +import spacy.lang as spacylang +#nltk.download('punkt') try: - french_spacy = spacy.lang.fr.French() + french_spacy = spacylang.fr.French() except OSError: raise OSError("""You must install French langage to use SpaCy. python -m spacy download fr See https://spacy.io/usage/ for details """) try: - english_spacy = spacy.lang.en.English() + english_spacy = spacylang.en.English() except OSError: raise OSError("""You must install english langage to use SpaCy. python -m spacy download en From b80892b7793d56dd319e306d8d52fc2ac3a5ba88 Mon Sep 17 00:00:00 2001 From: Robin <rdoume@gmail.com> Date: Thu, 4 Apr 2019 14:19:03 +0200 Subject: [PATCH 020/496] Update readme for Python2 notice for spacy tokenizer issue #52 --- README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/README.md b/README.md index 8b4abab..32e323a 100644 --- a/README.md +++ b/README.md @@ -21,6 +21,8 @@ As an Artefact user, you might be working on a NLP use case, and wish to use Nau # Installation +Beware, this package has been tested on Python **3.6** & **3.7**, and will probably not be working under python **2.7** as **Python2.7** EOL is scheduled for December 2019. + To install this library you should first clone the repository: `git clone https://github.com/artefactory/nautilus_nlp/ && cd nautilus_nlp` From bda6df5c67a0d0f4c98515151b492873eb2424be Mon Sep 17 00:00:00 2001 From: Robin <rdoume@gmail.com> Date: Fri, 5 Apr 2019 10:56:33 +0200 Subject: [PATCH 021/496] Add language identification notebook --- notebooks/Language_identification.ipynb | 534 +++--------------------- 1 file changed, 61 insertions(+), 473 deletions(-) diff --git a/notebooks/Language_identification.ipynb b/notebooks/Language_identification.ipynb index 0bd6927..68049ee 100644 --- a/notebooks/Language_identification.ipynb +++ b/notebooks/Language_identification.ipynb @@ -1,28 +1,5 @@ { "cells": [ - { - "cell_type": "code", - "execution_count": 49, - "metadata": {}, - "outputs": [ - { - "ename": "ModuleNotFoundError", - "evalue": "No module named 'pandas'", - "output_type": "error", - "traceback": [ - "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", - "\u001b[0;31mModuleNotFoundError\u001b[0m Traceback (most recent call last)", - "\u001b[0;32m<ipython-input-49-5bdfc092f0f9>\u001b[0m in \u001b[0;36m<module>\u001b[0;34m\u001b[0m\n\u001b[1;32m 1\u001b[0m \u001b[0;32mimport\u001b[0m \u001b[0mcsv\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 2\u001b[0m \u001b[0;32mimport\u001b[0m \u001b[0mre\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 3\u001b[0;31m \u001b[0;32mimport\u001b[0m \u001b[0mpandas\u001b[0m \u001b[0;32mas\u001b[0m \u001b[0mpd\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", - "\u001b[0;31mModuleNotFoundError\u001b[0m: No module named 'pandas'" - ] - } - ], - "source": [ - "import csv \n", - "import re\n", - "import pandas as pd" - ] - }, { "cell_type": "markdown", "metadata": {}, @@ -33,11 +10,11 @@ }, { "cell_type": "code", - "execution_count": 8, + "execution_count": 17, "metadata": {}, "outputs": [], "source": [ - "with open('../data/external/wili/x_test.txt',encoding='utf-8') as fp:\n", + "with open('../data/external/wili/x_test.txt') as fp:\n", " test=fp.readlines()\n", " test=[doc.strip('\\n') for doc in test]" ] @@ -46,540 +23,151 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Le Dataset Wili est un dataset d'identification de langue basé sur Wikipedia. Des exemples du tests set suivent: " - ] - }, - { - "cell_type": "code", - "execution_count": 34, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "\"Ne l fin de l seclo XIX l Japon era inda çconhecido i sótico pa l mundo oucidental. Cula antroduçon de la stética japonesa, particularmente na Sposiçon Ounibersal de 1900, an Paris, l Oucidente adquiriu un apetite ansaciable pul Japon i Heiarn se tornou mundialmente coincido pula perfundidade, ouriginalidade i sinceridade de ls sous cuntos. An sous radadeiros anhos, alguns críticos, cumo George Orwell, acusórun Heiarn de trasferir sou nacionalismo i fazer l Japon parecer mais sótico, mas, cumo l'home qu'oufereciu al Oucidente alguns de sous purmeiros lampeijos de l Japon pré-andustrial i de l Período Meiji, sou trabalho inda ye balioso até hoije.\"" - ] - }, - "execution_count": 34, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "\n", - "test[0]" - ] - }, - { - "cell_type": "code", - "execution_count": 28, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "'Schiedam is gelegen tussen Rotterdam en Vlaardingen, oorspronkelijk aan de Schie en later ook aan de Nieuwe Maas. Per 30 april 2017 had de gemeente 77.833 inwoners (bron: CBS). De stad is vooral bekend om haar jenever, de historische binnenstad met grachten, en de hoogste windmolens ter wereld.'" - ] - }, - "execution_count": 28, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "test[1]" - ] - }, - { - "cell_type": "code", - "execution_count": 29, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "'ГIурусаз батальонал, гьоркьор гIарадабиги лъун, ункъбокIон (каре) гьабун чIезарун руго. ТIаде гIарададул сачмаги гуллаги байдал, АхIмадханил бо тIурун буго. ГIумаханас цойгидал боязе тIаде кIанцIизе буюрухъ кьун буго. Гьезулги жо ккун гьечIо. Цинги живго ГIумахан кIанцIун вуго тушманасде тIаде («угъузилал рачун, дайтилал рачун, маххулъан бер баккун хунз цадахъ рачун»). Нахъе къалел ругел магIарулазда гьес гьарулеб букIун буго: «Нужеца яхI бахъе, гIолохъаби! Нилъеда данде гьал чIоларо», – ян.'" - ] - }, - "execution_count": 29, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "test[2]" - ] - }, - { - "cell_type": "code", - "execution_count": 30, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "'ರಾಜ್ಯಶಾಸ್ತ್ರದ ಪಿತಾಮಹೆ ಅರಿಸ್ಟಾಟಲ್. ರಾಜ್ಯಶಾಸ್ತ್ರದ ವೈಜ್ನಾನಿಕವಾದ್ ಅದ್ಯಾಯನ ಮಲ್ದಿನಾರ್ ಅರಿಸ್ಟಾಟಲ್. ಮೇರ್ 158 ರಾಷ್ಟ್ರದ ಸಂವಿಧಾನಲೆನ್ ಅರ್ಥ ಮಲ್ತೊನ್ದ್ the politics ಕೃತಿ ರಚನೆ ಮಲ್ದೆರ್. ಮೇರ್ ಕ್ರಿ.ಪೂ 387 ಗ್ರೀಕ್ ಸ್ಟಾಗಿರಡ್ ಜನಿಸಿಯೆರ್. ಮೆರೆನ ಅಮ್ಮೆರ್ ಮೆಸೆದೊನಿಯ ಅರಸೆರ್ನ ರಾಜವೈದ್ಯರ್ ಅದುದ್ ಇತ್ತೆರ್. ಎಲ್ಳಡೆ ಮೆರ್ ತತ್ವಶಾಸ್ತ್ರ,ಅರ್ಥಶಾಸ್ತ್ರ,ಸಂಗೀತ,ವಿಜ್ನಾನ,ಪೌರನೀತಿ,ಗಣಿತ ನೆಟ್ಟ್ ಪರಂಗತೆರ್ ಅದುದ್ ಇತ್ತೆರ್. ವಿದ್ಯಾಭ್ಯಾಸ ಮುಗಿ ಬೊಕ್ಕ ಪ್ಲೇಟೋ ಗ್ರೀಕ್ ತತ್ವಜ್ನಾನಿನೊಟ್ ಸೆರೊಂಡೆರ್. ಪ್ಲೇಟೋನ ಅಕಾಡೆಮಿಡ್ ಮಸ್ತ್ ವರ್ಷ ಬೇಲೆ ಮಲ್ತೆರ್. ಅಕಾಡೆಮಿಡ್ ನಿರ್ದೆಶೆಕೆರ್ನ ಹುದ್ದೆ ತಿಕ್ಕಂದೆ ಬೆಜರ್ ಅದುದ್ ಲೈಸಿಯಮ್ ಪನ್ಪಿನ ವಿಶ್ವವಿದ್ಯಾನಿಲಯ ಸ್ಥಾಪನೆ ಮಲ್ತೆರ್. ಬಿಕ್ಕ ಒಂತೆ ಸಮಯ ಅಲೆಗ್ಸಾಂಡರ್ ಚಕ್ರವರ್ತಿಗ್ ಗುರುವಾದ್ ಬೇಲೆ ಮಲ್ತೆರ್. ಮೇರ್ ಬರೆತಿನ ಪುಸ್ತಕ the politics,history of animals,metaphysics ಇತ್ಯಾದಿ.'" - ] - }, - "execution_count": 30, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "test[3]" - ] - }, - { - "cell_type": "code", - "execution_count": 13, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "'Тухайн үед дан ганц 20кг-ын Орос баллон хэрэглэдэг байсан уламжлалыг халж хэрэглэгчдийг сонголт ихтэй болгож 5,10,14,20 кг хэмжээтэй, баллонуудыг захиалан үйлдвэрлүүлж, өөрийн брэнд болгон хэрэглээнд нэвтрүүлж, хийн түлшээр ажилладаг тулга, төрөл бүрийн халаагуурууд, тоног төхөөрөмжийн ашиглалт, хийн түлшний ашиг тусыг хэвлэл мэдээллийн хэрэгслэлээр тасралтгүй сурталчилсаны үр дүнд 2002 оны 5 сар гэхэд хийн түлшний хэрэглээ сард 30 тн, 9 сард 50 тн хүрч өссөн юм.'" - ] - }, - "execution_count": 13, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "test[5]" + "Le Dataset Wili est un dataset d'identification de langue basé sur Wikipedia.\n" ] }, { - "cell_type": "code", - "execution_count": 45, - "metadata": {}, - "outputs": [], - "source": [ - "with open('../data/external/wili/y_test.txt',encoding='utf-8') as fp:\n", - " y=fp.readlines()" - ] - }, - { - "cell_type": "code", - "execution_count": 47, - "metadata": {}, - "outputs": [], - "source": [ - "with open('../data/external/wili/labels.csv',encoding='utf-8') as fp:\n", - " labels=fp.readlines()" - ] - }, - { - "cell_type": "code", - "execution_count": 48, + "cell_type": "markdown", "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "['Label;English;Wiki Code;ISO 369-3;German;Language family;Writing system;Remarks;Synonyms\\n',\n", - " 'ace;Achinese;ace;ace;Achinesisch;Austronesian;;;\\n',\n", - " 'afr;Afrikaans;af;afr;Afrikaans;Indo-European;;;\\n',\n", - " 'als;Alemannic German;als;gsw;Alemannisch;Indo-European;;(ursprünglich nur\\xa0Elsässisch);\\n',\n", - " 'amh;Amharic;am;amh;Amharisch;Afro-Asiatic;;;\\n',\n", - " 'ang;Old English ;ang;ang;Altenglisch;Indo-European;;(ca. 450-1100);Angelsächsisch\\n',\n", - " 'ara;Arabic;ar;ara;Arabisch;Afro-Asiatic;;;\\n',\n", - " 'arg;Aragonese;an;arg;Aragonesisch;Indo-European;;;\\n',\n", - " 'arz;Egyptian Arabic;arz;arz;Ägyptisch-Arabisch;Afro-Asiatic;;;\\n',\n", - " 'asm;Assamese;as;asm;Assamesisch;Indo-European;;;\\n',\n", - " 'ast;Asturian;ast;ast;Asturisch;Indo-European;;;\\n',\n", - " 'ava;Avar;av;ava;Awarisch;Northeast Caucasian;;;\\n',\n", - " 'aym;Aymara;ay;aym;Aymara;Aymaran;;;\\n',\n", - " 'azb;South Azerbaijani;azb;azb;Südaserbaidschanisch;Turkic;Arabic;;\\n',\n", - " 'aze;Azerbaijani;az;aze;Aserbaidschanisch;Turkic;Latin;;\\n',\n", - " 'bak;Bashkir;ba;bak;Baschkirisch;Turkic;;;\\n',\n", - " 'bar;Bavarian;bar;bar;Bairisch;Indo-European;;;\\n',\n", - " 'bcl;Central Bikol;bcl;bcl;Bikolano;Austronesian;;;\\n',\n", - " 'be-tarask;Belarusian (Taraschkewiza);be-tarask;;Weißrussisch (Taraschkewiza);Indo-European;;;\\n',\n", - " 'bel;Belarusian;be;bel;Weißrussisch;Indo-European;;(normativ);\\n',\n", - " 'ben;Bengali;bn;ben;Bengalisch;Indo-European;;;\\n',\n", - " 'bho;Bhojpuri;bh;bho;Bhojpuri;Indo-European;;;\\n',\n", - " 'bjn;Banjar;bjn;bjn;Banjaresisch;Austronesian;;;\\n',\n", - " 'bod;Tibetan;bo;bod;Tibetisch;Sino-Tibetan;;;\\n',\n", - " 'bos;Bosnian;bs;bos;Bosnisch;Indo-European;;;\\n',\n", - " 'bpy;Bishnupriya;bpy;bpy;Bishnupriya Manipuri;Indo-European;;;\\n',\n", - " 'bre;Breton;br;bre;Bretonisch;Indo-European;;;\\n',\n", - " 'bul;Bulgarian;bg;bul;Bulgarisch;Indo-European;;;\\n',\n", - " 'bxr;Buryat;bxr;bxr;Burjatisch;Mongolic;Cyrillic:::Mongolian script:::Vagindra script:::Latin;;Buriat\\n',\n", - " 'cat;Catalan;ca;cat;Katalanisch;Indo-European;Latin;;\\n',\n", - " 'cbk;Chavacano;cbk-zam;cbk;Chabacano;Indo-European;;;\\n',\n", - " 'cdo;Min Dong;cdo;cdo;Min Dong;Sino-Tibetan;;;\\n',\n", - " 'ceb;Cebuano;ceb;ceb;Cebuano;Austronesian;Latin;;\\n',\n", - " 'ces;Czech;cs;ces;Tschechisch;Indo-European;Latin;;\\n',\n", - " 'che;Chechen;ce;che;Tschetschenisch;Northeast Caucasian;;;\\n',\n", - " 'chr;Cherokee;chr;chr;Cherokee;Iroquoian;;;\\n',\n", - " 'chv;Chuvash;cv;chv;Tschuwaschisch;Turkic;;;\\n',\n", - " 'ckb;Central Kurdish;ckb;ckb;Sorani;Indo-European;;;\\n',\n", - " 'cor;Cornish;kw;cor;Kornisch;Indo-European;;;\\n',\n", - " 'cos;Corsican;co;cos;Korsisch;Indo-European;;;\\n',\n", - " 'crh;Crimean Tatar;crh;crh;Krimtatarisch;Turkic;;;\\n',\n", - " 'csb;Kashubian;csb;csb;Kaschubisch;Indo-European;;;\\n',\n", - " 'cym;Welsh;cy;cym;Walisisch;Indo-European;;;\\n',\n", - " 'dan;Danish;da;dan;Dänisch;Indo-European;;;\\n',\n", - " 'deu;German;de;deu;Deutsch;Indo-European;Latin;;\\n',\n", - " 'diq;Dimli;diq;diq;Süd-Zazaisch;Indo-European;;;\\n',\n", - " 'div;Dhivehi;dv;div;Dhivehi;Indo-European;;;\\n',\n", - " 'dsb;Lower Sorbian;dsb;dsb;Niedersorbisch;Indo-European;;;\\n',\n", - " 'dty;Doteli;dty;dty;Doteli;Indo-European;;;\\n',\n", - " 'egl;Emilian;eml;egl;Emilianisch;Indo-European;;;\\n',\n", - " 'ell;Modern Greek;el;ell;Griechisch;Indo-European;;(1453-);\\n',\n", - " 'eng;English;en;eng;Englisch;Indo-European;Latin;;\\n',\n", - " 'epo;Esperanto;eo;epo;Esperanto;Constructed;;;\\n',\n", - " 'est;Estonian;et;est;Estnisch;Uralic;;;\\n',\n", - " 'eus;Basque;eu;eus;Baskisch;Language isolate;;;\\n',\n", - " 'ext;Extremaduran;ext;ext;Extremadurisch;Indo-European;;;\\n',\n", - " 'fao;Faroese;fo;fao;Färöisch;Indo-European;;;\\n',\n", - " 'fas;Persian;fa;fas;Persisch;Indo-European;;;\\n',\n", - " 'fin;Finnish;fi;fin;Finnisch;Uralic;Latin;;\\n',\n", - " 'fra;French;fr;fra;Französisch;Indo-European;Latin;;\\n',\n", - " 'frp;Arpitan;frp;frp;Frankoprovenzalisch;Indo-European;;;\\n',\n", - " 'fry;Western Frisian;fy;fry;Westfriesisch;Indo-European;;;\\n',\n", - " 'fur;Friulian;fur;fur;Furlanisch;Indo-European;;;\\n',\n", - " 'gag;Gagauz;gag;gag;Gagausisch;Turkic;;;\\n',\n", - " 'gla;Scottish Gaelic;gd;gla;Schottisch-Gälisch;Indo-European;;;\\n',\n", - " 'gle;Irish;ga;gle;Irisch;Indo-European;;;\\n',\n", - " 'glg;Galician;gl;glg;Galicisch;Indo-European;;;\\n',\n", - " 'glk;Gilaki;glk;glk;Gilaki;Indo-European;;;\\n',\n", - " 'glv;Manx;gv;glv;Manx;Indo-European;;;\\n',\n", - " 'grn;Guarani;gn;grn;Guaraní;Tupi-Guarani;;;\\n',\n", - " 'guj;Gujarati;gu;guj;Gujarati;Indo-European;;;\\n',\n", - " 'hak;Hakka Chinese;hak;hak;Hakka;Sino-Tibetan;;;\\n',\n", - " 'hat;Haitian Creole;ht;hat;Haitianisch;Indo-European;;;\\n',\n", - " 'hau;Hausa;ha;hau;Hausa;Afro-Asiatic;Latin;;Chadic\\n',\n", - " 'hbs;Serbo-Croatian;sh;hbs;Serbokroatisch;Indo-European;;;\\n',\n", - " 'heb;Hebrew;he;heb;Hebräisch;Afro-Asiatic;;;\\n',\n", - " 'hif;Fiji Hindi;hif;hif;Fidschi-Hindi;Indo-European;;;\\n',\n", - " 'hin;Hindi;hi;hin;Hindi;Indo-European;;;\\n',\n", - " 'hrv;Croatian;hr;hrv;Kroatisch;Indo-European;;;\\n',\n", - " 'hsb;Upper Sorbian;hsb;hsb;Obersorbisch;Indo-European;;;\\n',\n", - " 'hun;Hungarian;hu;hun;Ungarisch;Uralic;;;\\n',\n", - " 'hye;Armenian;hy;hye;Armenisch;Indo-European;;;\\n',\n", - " 'ibo;Igbo;ig;ibo;Igbo;Niger-Congo;Latin;;\\n',\n", - " 'ido;Ido;io;ido;Ido;Constructed;;;\\n',\n", - " 'ile;Interlingue;ie;ile;Interlingue;Constructed;;;\\n',\n", - " 'ilo;Iloko;ilo;ilo;Ilokano;Austronesian;;;\\n',\n", - " 'ina;Interlingua;ia;ina;Interlingua;Constructed;;;\\n',\n", - " 'ind;Indonesian;id;ind;Indonesisch;Austronesian;Latin;;\\n',\n", - " 'isl;Icelandic;is;isl;Isländisch;Indo-European;;;\\n',\n", - " 'ita;Italian;it;ita;Italienisch;Indo-European;Latin;;\\n',\n", - " 'jam;Jamaican Patois;jam;jam;Jamaikanisch-kreolisch;Indo-European;;;\\n',\n", - " 'jav;Javanese;jv;jav;Javanisch;Austronesian;;;\\n',\n", - " 'jbo;Lojban;jbo;jbo;Lojban;Constructed;Latin;;\\n',\n", - " 'jpn;Japanese;ja;jpn;Japanisch;Japonic;;;\\n',\n", - " 'kaa;Karakalpak;kaa;kaa;Karakalpakisch;Turkic;;;\\n',\n", - " 'kab;Kabyle;kab;kab;Kabylisch;Afro-Asiatic;;;\\n',\n", - " 'kan;Kannada;kn;kan;Kannada;Dravidian;;;\\n',\n", - " 'kat;Georgian;ka;kat;Georgisch;South Caucasian;;;\\n',\n", - " 'kaz;Kazakh;kk;kaz;Kasachisch;Turkic;;;\\n',\n", - " 'kbd;Kabardian;kbd;kbd;Kabardinisch;Northeast Caucasian;Cyrillic:::Latin:::Arabic;;Kabardino-Cherkess:::East Circassian\\n',\n", - " 'khm;Central Khmer;km;khm;Khmer;Austronesian;;;\\n',\n", - " 'kin;Kinyarwanda;rw;kin;Kinyarwanda;Niger-Congo;Latin;;Fumbira\\n',\n", - " 'kir;Kirghiz;ky;kir;Kirgisisch;Turkic;;;\\n',\n", - " 'koi;Komi-Permyak;koi;koi;Komi-Permjakisch;Uralic;;;\\n',\n", - " 'kok;Konkani;gom;kok;Konkani;Indo-European;;;\\n',\n", - " 'kom;Komi;kv;kom;Komi;Uralic;;;\\n',\n", - " 'kor;Korean;ko;kor;Koreanisch;Koreanic;;;\\n',\n", - " 'krc;Karachay-Balkar;krc;krc;Karatschai-balkarisch;Turkic;;;\\n',\n", - " 'ksh;Ripuarisch;ksh;ksh;Kölsch;Indo-European;;;\\n',\n", - " 'kur;Kurdish;ku;kur;Kurdisch;Indo-European;Latin;;\\n',\n", - " 'lad;Ladino;lad;lad;Judenspanisch;Indo-European;;;\\n',\n", - " 'lao;Lao;lo;lao;Laotisch;Tai-Kadai;;;\\n',\n", - " 'lat;Latin;la;lat;Latein;Indo-European;;;\\n',\n", - " 'lav;Latvian;lv;lav;Lettisch;Indo-European;;;\\n',\n", - " 'lez;Lezghian;lez;lez;Lesgisch;Northeast Caucasian;;;\\n',\n", - " 'lij;Ligurian;lij;lij;Ligurisch;Indo-European;;(Romanisch);\\n',\n", - " 'lim;Limburgan;li;lim;Limburgisch;Indo-European;;;\\n',\n", - " 'lin;Lingala;ln;lin;Lingála;Niger-Congo;;;\\n',\n", - " 'lit;Lithuanian;lt;lit;Litauisch;Indo-European;;;\\n',\n", - " 'lmo;Lombard;lmo;lmo;Lombardisch;Indo-European;;;\\n',\n", - " 'lrc;Northern Luri;lrc;lrc;nördliches Luri;Indo-European;;;\\n',\n", - " 'ltg;Latgalian;ltg;ltg;Lettgallisch;Indo-European;;;\\n',\n", - " 'ltz;Luxembourgish;lb;ltz;Luxemburgisch;Indo-European;;;\\n',\n", - " 'lug;Luganda;lg;lug;Luganda;Niger-Congo;Latin;;Ganda\\n',\n", - " 'lzh;Literary Chinese;zh-classical;lzh;klassisches Chinesisch;Sino-Tibetan;;;\\n',\n", - " 'mai;Maithili;mai;mai;Maithili;Indo-European;;;\\n',\n", - " 'mal;Malayalam;ml;mal;Malayalam;Dravidian;;;\\n',\n", - " 'map-bms;Banyumasan;map-bms;map-bms;Banyumasan;Austronesian;;Javanese;\\n',\n", - " 'mar;Marathi;mr;mar;Marathi;Indo-European;;;\\n',\n", - " 'mdf;Moksha;mdf;mdf;Mokschanisch;Uralic;Cyrillic;;\\n',\n", - " 'mhr;Eastern Mari;mhr;mhr;Ostmari;Uralic;;;\\n',\n", - " 'min;Minangkabau;min;min;Minangkabauisch;Austronesian;;;\\n',\n", - " 'mkd;Macedonian;mk;mkd;Mazedonisch;Indo-European;;;\\n',\n", - " 'mlg;Malagasy;mg;mlg;Malagasy;Austronesian;;;\\n',\n", - " 'mlt;Maltese;mt;mlt;Maltesisch;Afro-Asiatic;;;\\n',\n", - " 'mon;Mongolian;mn;mon;Mongolisch;Mongolic;;;\\n',\n", - " 'mri;Maori;mi;mri;Maori;Austronesian;;;\\n',\n", - " 'mrj;Western Mari;mrj;mrj;Westmari;Uralic;;;\\n',\n", - " 'msa;Malay;ms;msa;Malaiisch;Austronesian;;;\\n',\n", - " 'mwl;Mirandese;mwl;mwl;Mirandés;Indo-European;;;\\n',\n", - " 'mya;Burmese;my;mya;Birmanisch;Sino-Tibetan;;;\\n',\n", - " 'myv;Erzya;myv;myv;Ersja-Mordwinisch;Uralic;;;\\n',\n", - " 'mzn;Mazanderani;mzn;mzn;Masanderanisch;Indo-European;;;\\n',\n", - " 'nan;Min Nan Chinese;zh-min-nan;nan;Min Nan;Sino-Tibetan;;;\\n',\n", - " 'nap;Neapolitan;nap;nap;Neapolitanisch;Indo-European;;;\\n',\n", - " 'nav;Navajo;nv;nav;Navajo;Dené-Yeniseian;;;\\n',\n", - " 'nci;Classical Nahuatl;nah;nci;Nahuatl;Uto-Aztecan;;;\\n',\n", - " 'nds;Low German;nds;nds;Niedersächsisch/Ostniederdeutsch;Indo-European;;;\\n',\n", - " 'nds-nl;West Low German;nds-nl;nds;Nedersaksisch;Indo-European;;;\\n',\n", - " 'nep;Nepali (macrolanguage);ne;nep;Nepali;Indo-European;;;\\n',\n", - " 'new;Newari;new;new;Newari;Sino-Tibetan;;;\\n',\n", - " 'nld;Dutch;nl;nld;Niederländisch;Indo-European;Latin;;\\n',\n", - " 'nno;Norwegian Nynorsk;nn;nno;Nynorsk;Indo-European;;;\\n',\n", - " 'nob;Bokmål;no;nob;Bokmål;Indo-European;Latin;Norwegian;\\n',\n", - " 'nrm;Narom;nrm;nrm;Normannisch;Austronesian;;;\\n',\n", - " 'nso;Northern Sotho;nso;nso;Nord-Sotho;Niger-Congo;;;\\n',\n", - " 'oci;Occitan;oc;oci;Okzitanisch;Indo-European;;(post 1500);\\n',\n", - " 'olo;Livvi-Karelian;olo;olo;Olonetzisch;Uralic;;;\\n',\n", - " 'ori;Oriya;or;ori;Oriya;Indo-European;;;\\n',\n", - " \"orm;Oromo;om;orm;Oromo;Afro-Asiatic;Latin:::Ge'ez ;;\\n\",\n", - " 'oss;Ossetian;os;oss;Ossetisch;Indo-European;;;\\n',\n", - " 'pag;Pangasinan;pag;pag;Pangasinensisch;Austronesian;;;\\n',\n", - " 'pam;Pampanga;pam;pam;Kapampangan;Austronesian;;;\\n',\n", - " 'pan;Panjabi;pa;pan;Panjabi\\xa0in\\xa0Gurmukhi-Schrift;Indo-European;;;\\n',\n", - " 'pap;Papiamento;pap;pap;Papiamentu;Indo-European;;;\\n',\n", - " 'pcd;Picard;pcd;pcd;Picardisch;Indo-European;;;\\n',\n", - " 'pdc;Pennsylvania German;pdc;pdc;Pennsylvaniadeutsch;Indo-European;;;Deitsch:::Pennsylvania Deitsch:::Pennsilfaanisch Deitsch:::Pennsylvania Dutch\\n',\n", - " 'pfl;Palatine German;pfl;pfl;Pfälzisch;Indo-European;;;\\n',\n", - " 'pnb;Western Panjabi;pnb;pnb;Panjabi;Indo-European;Arabic;;\\n',\n", - " 'pol;Polish;pl;pol;Polnisch;Indo-European;Latin;;\\n',\n", - " 'por;Portuguese;pt;por;Portugiesisch;Indo-European;Latin;;\\n',\n", - " 'pus;Pushto;ps;pus;Paschtunisch;Indo-European;;;\\n',\n", - " 'que;Quechua;qu;que;Quechua;Quechuan;;;\\n',\n", - " 'roa-tara;Tarantino dialect;roa-tara;;Tarandíne;Indo-European;;;\\n',\n", - " 'roh;Romansh;rm;roh;Bündnerromanisch;Indo-European;;;\\n',\n", - " 'ron;Romanian;ro;ron;Rumänisch;Indo-European;;;\\n',\n", - " 'rue;Rusyn;rue;rue;Karpato-Russinisch;Indo-European;;;\\n',\n", - " 'rup;Aromanian;roa-rup;rup;Aromunisch;Indo-European;Latin;Macedo-Romanian::Vlach;\\n',\n", - " 'rus;Russian;ru;rus;Russisch;Indo-European;Cyrillic;;\\n',\n", - " 'sah;Yakut;sah;sah;Jakutisch;Turkic;;;\\n',\n", - " 'san;Sanskrit;sa;san;Sanskrit;Indo-European;;;\\n',\n", - " 'scn;Sicilian;scn;scn;Sizilianisch;Indo-European;;;\\n',\n", - " 'sco;Scots;sco;sco;Scots;Indo-European;;;\\n',\n", - " 'sgs;Samogitian;bat-smg;sgs;Schemaitisch;Indo-European;;;\\n',\n", - " 'sin;Sinhala;si;sin;Singhalesisch;Indo-European;;;\\n',\n", - " 'slk;Slovak;sk;slk;Slowakisch;Indo-European;;;\\n',\n", - " 'slv;Slovene;sl;slv;Slowenisch;Indo-European;;;\\n',\n", - " 'sme;Northern Sami;se;sme;Nordsamisch;Uralic;;;\\n',\n", - " 'sna;Shona;sn;sna;Shona;Niger-Congo;;;\\n',\n", - " 'snd;Sindhi;sd;snd;Sindhi;Indo-European;;;\\n',\n", - " 'som;Somali;so;som;Somali;Afro-Asiatic;;;\\n',\n", - " 'spa;Spanish;es;spa;Spanisch;Indo-European;Latin;;\\n',\n", - " 'sqi;Albanian;sq;sqi;Albanisch;Indo-European;;;\\n',\n", - " 'srd;Sardinian;sc;srd;Sardisch;Indo-European;;;\\n',\n", - " 'srn;Sranan;srn;srn;Sranantongo;Indo-European;;;Sranan Tongo:::Sranantongo:::Surinaams:::Surinamese:::Surinamese Creole:::Taki Taki\\n',\n", - " 'srp;Serbian;sr;srp;Serbisch;Indo-European;;;\\n',\n", - " 'stq;Saterfriesisch;stq;stq;Saterfriesisch;Indo-European;;;\\n',\n", - " 'sun;Sundanese;su;sun;Sundanesisch;Austronesian;;;\\n',\n", - " 'swa;Swahili (macrolanguage);sw;swa;Swahili;Niger-Congo;;;\\n',\n", - " 'swe;Swedish;sv;swe;Schwedisch;Indo-European;Latin;;\\n',\n", - " 'szl;Silesian;szl;szl;Schlesisch;Indo-European;;(polnischer Dialekt);\\n',\n", - " 'tam;Tamil;ta;tam;Tamil;Dravidian;;;\\n',\n", - " 'tat;Tatar;tt;tat;Tatarisch;Turkic;;;\\n',\n", - " 'tcy;Tulu;tcy;tcy;Tulu;Dravidian;Kannada:::Tigalari;;\\n',\n", - " 'tel;Telugu;te;tel;Telugu;Dravidian;;;\\n',\n", - " 'tet;Tetum;tet;tet;Tetum;Austronesian;;;\\n',\n", - " 'tgk;Tajik;tg;tgk;Tadschikisch;Indo-European;;;\\n',\n", - " 'tgl;Tagalog;tl;tgl;Tagalog;Austronesian;;;\\n',\n", - " 'tha;Thai;th;tha;Thailändisch;Tai-Kadai;;;\\n',\n", - " 'ton;Tongan;to;ton;Tongaisch;Austronesian;Latin;;\\n',\n", - " 'tsn;Tswana;tn;tsn;Setswana;Niger-Congo;Latin;;Setswana\\n',\n", - " 'tuk;Turkmen;tk;tuk;Turkmenisch;Turkic;;;\\n',\n", - " 'tur;Turkish;tr;tur;Türkisch;Turkic;;;\\n',\n", - " 'tyv;Tuvan;tyv;tyv;Tuwinisch;Turkic;Cyrillic;;\\n',\n", - " 'udm;Udmurt;udm;udm;Udmurtisch;Uralic;;;\\n',\n", - " 'uig;Uighur;ug;uig;Uigurisch;Turkic;;;\\n',\n", - " 'ukr;Ukrainian;uk;ukr;Ukrainisch;Indo-European;Cyrillic;;\\n',\n", - " 'urd;Urdu;ur;urd;Urdu;Indo-European;;;\\n',\n", - " 'uzb;Uzbek;uz;uzb;Usbekisch;Turkic;;;\\n',\n", - " 'vec;Venetian;vec;vec;Venetisch;Indo-European;;;\\n',\n", - " 'vep;Veps;vep;vep;Wepsisch;Uralic;;;\\n',\n", - " 'vie;Vietnamese;vi;vie;Vietnamesisch;Austronesian;Latin;;\\n',\n", - " 'vls;Vlaams;vls;vls;Westflämisch;Indo-European;;;\\n',\n", - " 'vol;Volapük;vo;vol;Volapük;Constructed;;;\\n',\n", - " 'vro;Võro;fiu-vro;vro;Võro;Uralic;;;\\n',\n", - " 'war;Waray;war;war;Wáray-Wáray;Austronesian;Latin;;\\n',\n", - " 'wln;Walloon;wa;wln;Wallonisch;Indo-European;;;\\n',\n", - " 'wol;Wolof;wo;wol;Wolof;Niger-Congo;Latin:::Arabic;;\\n',\n", - " 'wuu;Wu Chinese;wuu;wuu;Wu;Sino-Tibetan;;;\\n',\n", - " 'xho;Xhosa;xh;xho;isiXhosa;Niger-Congo;Latin;;isiXhosa\\n',\n", - " 'xmf;Mingrelian;xmf;xmf;Mingrelisch;Kartvelian;;;\\n',\n", - " 'yid;Yiddish;yi;yid;Jiddisch;Indo-European;;;\\n',\n", - " 'yor;Yoruba;yo;yor;Yoruba;Niger-Congo;;;\\n',\n", - " 'zea;Zeeuws;zea;zea;Seeländisch;Indo-European;;;\\n',\n", - " 'zh-yue;Cantonese;zh-yue;;Kantonesisch;Sino-Tibetan;;;\\n',\n", - " 'zho;Standard Chinese;zh;zho;Chinesisch;Sino-Tibetan;;;\\n']" - ] - }, - "execution_count": 48, - "metadata": {}, - "output_type": "execute_result" - } - ], "source": [ - "labels" + "# Language identification" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ - "# Language identification" + "Two types of detector can be implemented: THe Compact language detector (CLD2) and the Fasttext language identification one" ] }, { "cell_type": "code", - "execution_count": 15, + "execution_count": 21, "metadata": {}, "outputs": [], "source": [ - "from nautilus_nlp.models import Fasttext_classifier " + "from nautilus_nlp.models import langdetector\n", + "detector= langdetector.LangDetector(typemodel='fasttext')\n", + "detector2= langdetector.LangDetector(typemodel='cld2')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ - "Ici on va load le modèle pré-entrainer par Fasttext, disponible dans le folder data.\n", - "On peut utiliser soit le modèle quantizé (900ko) soit le classique" + "The language identification part is simply done by calling the detect language method of the detector" ] }, { "cell_type": "code", - "execution_count": 19, - "metadata": {}, - "outputs": [], - "source": [ - "model = Fasttext_classifier.Fasttext_clf('../nautilus_nlp/data/lang_identification.ftz')" - ] - }, - { - "cell_type": "code", - "execution_count": 8, + "execution_count": 22, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "N\t100000\n", - "P@1\t0.759\n", - "R@1\t0.759\n" + "Ne l fin de l seclo XIX l Japon era inda çconhecido i sótico pa l mundo oucidental. Cula antroduçon de la stética japonesa, particularmente na Sposiçon Ounibersal de 1900, an Paris, l Oucidente adquiriu un apetite ansaciable pul Japon i Heiarn se tornou mundialmente coincido pula perfundidade, ouriginalidade i sinceridade de ls sous cuntos. An sous radadeiros anhos, alguns críticos, cumo George Orwell, acusórun Heiarn de trasferir sou nacionalismo i fazer l Japon parecer mais sótico, mas, cumo l'home qu'oufereciu al Oucidente alguns de sous purmeiros lampeijos de l Japon pré-andustrial i de l Período Meiji, sou trabalho inda ye balioso até hoije.\n", + "('pt', 0.41855213046073914)\n", + "('pt', 0.54)\n", + "\n", + "\n", + "Schiedam is gelegen tussen Rotterdam en Vlaardingen, oorspronkelijk aan de Schie en later ook aan de Nieuwe Maas. Per 30 april 2017 had de gemeente 77.833 inwoners (bron: CBS). De stad is vooral bekend om haar jenever, de historische binnenstad met grachten, en de hoogste windmolens ter wereld.\n", + "('nl', 0.9266586899757385)\n", + "('nl', 0.99)\n", + "\n", + "\n", + "ГIурусаз батальонал, гьоркьор гIарадабиги лъун, ункъбокIон (каре) гьабун чIезарун руго. ТIаде гIарададул сачмаги гуллаги байдал, АхIмадханил бо тIурун буго. ГIумаханас цойгидал боязе тIаде кIанцIизе буюрухъ кьун буго. Гьезулги жо ккун гьечIо. Цинги живго ГIумахан кIанцIун вуго тушманасде тIаде («угъузилал рачун, дайтилал рачун, маххулъан бер баккун хунз цадахъ рачун»). Нахъе къалел ругел магIарулазда гьес гьарулеб букIун буго: «Нужеца яхI бахъе, гIолохъаби! Нилъеда данде гьал чIоларо», – ян.\n", + "('ru', 0.38813528418540955)\n", + "('uz', 0.99)\n", + "\n", + "\n", + "ರಾಜ್ಯಶಾಸ್ತ್ರದ ಪಿತಾಮಹೆ ಅರಿಸ್ಟಾಟಲ್. ರಾಜ್ಯಶಾಸ್ತ್ರದ ವೈಜ್ನಾನಿಕವಾದ್ ಅದ್ಯಾಯನ ಮಲ್ದಿನಾರ್ ಅರಿಸ್ಟಾಟಲ್. ಮೇರ್ 158 ರಾಷ್ಟ್ರದ ಸಂವಿಧಾನಲೆನ್ ಅರ್ಥ ಮಲ್ತೊನ್ದ್ the politics ಕೃತಿ ರಚನೆ ಮಲ್ದೆರ್. ಮೇರ್ ಕ್ರಿ.ಪೂ 387 ಗ್ರೀಕ್ ಸ್ಟಾಗಿರಡ್ ಜನಿಸಿಯೆರ್. ಮೆರೆನ ಅಮ್ಮೆರ್ ಮೆಸೆದೊನಿಯ ಅರಸೆರ್ನ ರಾಜವೈದ್ಯರ್ ಅದುದ್ ಇತ್ತೆರ್. ಎಲ್ಳಡೆ ಮೆರ್ ತತ್ವಶಾಸ್ತ್ರ,ಅರ್ಥಶಾಸ್ತ್ರ,ಸಂಗೀತ,ವಿಜ್ನಾನ,ಪೌರನೀತಿ,ಗಣಿತ ನೆಟ್ಟ್ ಪರಂಗತೆರ್ ಅದುದ್ ಇತ್ತೆರ್. ವಿದ್ಯಾಭ್ಯಾಸ ಮುಗಿ ಬೊಕ್ಕ ಪ್ಲೇಟೋ ಗ್ರೀಕ್ ತತ್ವಜ್ನಾನಿನೊಟ್ ಸೆರೊಂಡೆರ್. ಪ್ಲೇಟೋನ ಅಕಾಡೆಮಿಡ್ ಮಸ್ತ್ ವರ್ಷ ಬೇಲೆ ಮಲ್ತೆರ್. ಅಕಾಡೆಮಿಡ್ ನಿರ್ದೆಶೆಕೆರ್ನ ಹುದ್ದೆ ತಿಕ್ಕಂದೆ ಬೆಜರ್ ಅದುದ್ ಲೈಸಿಯಮ್ ಪನ್ಪಿನ ವಿಶ್ವವಿದ್ಯಾನಿಲಯ ಸ್ಥಾಪನೆ ಮಲ್ತೆರ್. ಬಿಕ್ಕ ಒಂತೆ ಸಮಯ ಅಲೆಗ್ಸಾಂಡರ್ ಚಕ್ರವರ್ತಿಗ್ ಗುರುವಾದ್ ಬೇಲೆ ಮಲ್ತೆರ್. ಮೇರ್ ಬರೆತಿನ ಪುಸ್ತಕ the politics,history of animals,metaphysics ಇತ್ಯಾದಿ.\n", + "('kn', 0.9979031085968018)\n", + "('kn', 0.96)\n", + "\n", + "\n", + "Halukum adalah kelenjar tiroid nang menonjol di gulu lalakian. Awan bibinian penonjolan nangini ada ai jua, tagal kada pati rancak. Lamun penampilan halukum dirasa pina talalu ganal, hal ini kawa diperbaiki awan operasi pelastik.\n", + "('id', 0.4194313585758209)\n", + "('ms', 0.99)\n", + "\n", + "\n" ] } ], "source": [ - "print_results(*model.test(valid_data))\n" + "for i in range(0,5):\n", + " print(test[i])\n", + " print(detector.detect_language(test[i]))\n", + " print(detector2.detect_language(test[i]))\n", + " print('\\n')" ] }, { - "cell_type": "code", - "execution_count": 23, + "cell_type": "markdown", "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "(('__label__kn',), array([0.99790311]))" - ] - }, - "execution_count": 23, - "metadata": {}, - "output_type": "execute_result" - } - ], "source": [ - "model.predict(test[3])\n" + "We can see that the results are pretty similar, the value of the confidence is changing though" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ - "Il faut donc 13 secondes pour entrainer un modèle sur 1.5 Millions de tweets, avec une précision de 0.759. Not bad" + "# Performance" ] }, { - "cell_type": "code", - "execution_count": 9, + "cell_type": "markdown", "metadata": {}, - "outputs": [], "source": [ - "model.save_model('/home/nautilus_nlp/models/sentiments.bin')" + "## Inference time:\n" ] }, { "cell_type": "code", - "execution_count": 11, + "execution_count": 26, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "-rw-r--r-- 1 root root 232M Mar 14 12:51 /home/nautilus_nlp/models/sentiments.bin\n" + "83.8 ms ± 836 µs per loop (mean ± std. dev. of 7 runs, 10 loops each)\n" ] } ], "source": [ - "!ls -lh '/home/nautilus_nlp/models/sentiments.bin'" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Ce modèle fait environ 230Mo" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Maintenant si on quantize ce modèle" + "%%timeit\n", + "for i in range(0,1000):\n", + " detector.detect_language(test[i])" ] }, { "cell_type": "code", - "execution_count": 12, + "execution_count": 25, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "N\t100000\n", - "P@1\t0.759\n", - "R@1\t0.759\n" + "32.2 ms ± 1.59 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)\n" ] } ], "source": [ - "model.quantize(input=train_data, qnorm=True, retrain=True, cutoff=100000)\n", - "print_results(*model.test(valid_data))\n", - "model.save_model('/home/nautilus_nlp/models/sentiments.ftz')" + "%%timeit\n", + "for i in range(0,1000):\n", + " detector2.detect_language(test[i])" ] }, { - "cell_type": "code", - "execution_count": 13, + "cell_type": "markdown", "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "-rw-r--r-- 1 root root 6.8M Mar 14 12:53 /home/nautilus_nlp/models/sentiments.ftz\n" - ] - } - ], "source": [ - "!ls -lh '/home/nautilus_nlp/models/sentiments.ftz'" + "## Accuracy\n", + "To do" ] }, { @@ -606,7 +194,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.7.1" + "version": "3.7.2" } }, "nbformat": 4, From b3a57a88bd7949d4a6e7a74633a4be83e6a126cb Mon Sep 17 00:00:00 2001 From: Robin <rdoume@gmail.com> Date: Fri, 5 Apr 2019 11:57:04 +0200 Subject: [PATCH 022/496] Put the document abstraction into Nautilus. This Abstraction also solves #51 --- nautilus_nlp/doc.py | 263 +++++++++++++++----------------------------- 1 file changed, 88 insertions(+), 175 deletions(-) diff --git a/nautilus_nlp/doc.py b/nautilus_nlp/doc.py index e88743c..9a23062 100644 --- a/nautilus_nlp/doc.py +++ b/nautilus_nlp/doc.py @@ -1,8 +1,16 @@ import functools import pkg_resources import nautilus_nlp -lang_path = pkg_resources.resource_filename('nautilus_nlp.data', 'lang_identification.ftz') - +import spacy +import textacy +from collections import Counter +import re +import unicodedata +import spacy +import spacy.matcher +import textacy +import textacy.keyterms +import textacy.text_utils class NautilusMissingModelException(Exception): """Raised when the requested model is missing""" @@ -23,14 +31,47 @@ class Doc: _spacy_nlps: nested dictionary {lang: {model_id: model}} with loaded spacy language modules """ - def __init__(self, raw, language=None, spacy_nlps=None,langdetect = None): + def __init__( + self, + raw, + language=None, + spacy_nlps=None, + langdetect=None, + sentiment_detect=None, + ): self.raw = raw self._spacy_nlps = spacy_nlps or dict() self._language = language - self._is_reliable_language = True if language else None - self._language_detector=langdetect + self._is_reliable_language = 1 if language else None + self._language_detector = langdetect + self._sentiment_detector = sentiment_detect self._text_stats = {} + @property + def language(self): + """ + Provided or detected language of a text + >>> from nautilus_nlp.doc import Doc + >>> Doc('Test sentence for testing text').language + 'en' + >>> Doc('Test sentence for testing text', language='en').language + 'en' + >>> Doc('Test', hint_language='nl').language + 'nl' + """ + + if not self._language: + if self._language_detector: + self._is_reliable_language, self._language = self._language_detector.detect_language( + self.raw + ) + else: + raise NautilusMissingModelException( + "You must either provide a language for the document or an instance of LangDetector" + ) + + return self._language + @property def _spacy_doc(self): """ @@ -40,7 +81,7 @@ def _spacy_doc(self): >>> type(doc._spacy_doc) <class 'spacy.tokens.doc.Doc'> """ - lang = self.language if self.is_reliable_language else self.hint_language + lang = self.language return self._load_spacy_doc(lang) @@ -75,9 +116,43 @@ def _get_default_nlp(lang): ) except IOError: raise NautilusMissingModelException( - f'Default model for language "{lang}" is not available.' + f'Default model for language "{lang}" is not available. You should try to run python -m spacy download {lang}_core_news_sm' + ) + @property + def clean(self): + """ + Cleaned text with sensible defaults. + >>> doc = Doc('“Please clean this piece… of text</b>„') + >>> doc.clean + '"Please clean this piece... of text"' + + Right now this is done here by a simple regex. Next step is to use the preprocessing functions + """ + + return self.clean_text() + + @functools.lru_cache() + def clean_text(self, clean_dots=True, clean_quotes=True, clean_whitespace=True): + """ + Clean text and normalise punctuation. + >>> doc = Doc('“Please clean this piece… of text„') + >>> doc.clean_text(False, False, False, False) == doc.raw + True + """ + text = self.raw + + if clean_dots: + text = re.sub(r"…", "...", text) + if clean_quotes: + text = re.sub(r"[`‘’‛⸂⸃⸌⸍⸜⸝]", "'", text) + text = re.sub(r"[„“]|(\'\')|(,,)", '"', text) + if clean_whitespace: + text = re.sub(r"\s+", " ", text).strip() + + return text + @property def entities(self): """ @@ -97,11 +172,11 @@ def find_entities(self, model_name=None): >>> doc.find_entities() [('Google', 'ORG')] """ - lang = self.language if self.is_reliable_language else self.hint_language + return list( { (ent.text, ent.label_) - for ent in self._load_spacy_doc(lang, model_name).ents + for ent in self._load_spacy_doc(self.language, model_name).ents } ) @@ -137,7 +212,7 @@ def n_words(self): >>> doc.n_words 5 """ - return len(self.n_words) + return len(self.words) @property def words(self): @@ -185,30 +260,11 @@ def sentiment(self): """ Returns polarity score (-1 to 1) and a subjectivity score (0 to 1) - Currently only English, Dutch, French and Italian supported - - >>> doc = Doc('Dit is een leuke zin.') + >>> doc = Doc('C'est trop cool !.') >>> doc.sentiment - (0.6, 0.9666666666666667) + (0.8, 0.9666666666666667) """ - if self.language == "en": - from pattern.text.en import sentiment as sentiment_en - - return sentiment_en(self.clean) - elif self.language == "nl": - from pattern.text.nl import sentiment as sentiment_nl - - return sentiment_nl(self.clean) - elif self.language == "fr": - from pattern.text.fr import sentiment as sentiment_fr - - return sentiment_fr(self.clean) - elif self.language == "it": - from pattern.text.it import sentiment as sentiment_it - - return sentiment_it(self.clean) - raise NautilusMissingModelException(f"No sentiment model for {self.language}") @functools.lru_cache() @@ -229,7 +285,7 @@ def extract_keyterms(self, ranker="textrank", n_terms=10, **kwargs): >>> doc.extract_keyterms(ranker='sgrank', ngrams=(1)) [('Netherlands', 0.4020557546031188), ('capital', 0.29395103364295216), ('awesome', 0.18105611227666252), ('Amsterdam', 0.12293709947726655)] """ - if self.nwords < 1: + if self.n_words < 1: return [] rankers = ["textrank", "sgrank", "singlerank"] if ranker not in rankers: @@ -249,146 +305,3 @@ def keyterms(self): [('awesome', 0.32456160227748454), ('capital', 0.32456160227748454), ('Amsterdam', 0.17543839772251532)] """ return self.extract_keyterms() - - @property - def minhash(self): - """ - A cheap way to compute a hash for finding similarity of docs - Source: https://ekzhu.github.io/datasketch/minhash.html - >>> doc = Doc('Sentence for computing the minhash') - >>> doc.minhash[:5] - [407326892, 814360600, 1099082245, 1176349439, 1735256] - """ - return self.find_minhash() - - @functools.lru_cache() - def find_minhash(self, num_perm=128): - words = self.words - doc_hash = MinHash(num_perm=num_perm) - for word, _ in words: - doc_hash.update(word.encode("utf8")) - return list(doc_hash.digest()) - - def similarity(self, other_doc, metric="jaccard", hash_method="minhash"): - """ - Computes similarity for two documents. - Only minhash Jaccard similarity is implemented. - >>> doc1 = Doc('Sentence for computing the minhash') - >>> doc2 = Doc('Sentence for computing the similarity') - >>> doc1.similarity(doc2) - 0.7265625 - """ - if hash_method == "minhash" and metric == "jaccard": - hash1 = MinHash(hashvalues=self.minhash) - hash2 = MinHash(hashvalues=other_doc.minhash) - return hash1.jaccard(hash2) - else: - raise NotImplementedError( - f"Metric/hash method combination {metric}" - f"/{hash_method} is not implemented as similarity metric" - ) - - @property - def word_vectors(self): - """ - Returns word embeddings for the words in the document. - """ - return self.generate_word_vectors() - - @functools.lru_cache() - def generate_word_vectors(self, model_name=None): - """ - Returns word embeddings for the words in the document. - The default spacy models don't have "true" word vectors - but only context-sensitive tensors that are within the document. - - Returns: - A dictionary mapping words from the document to a dict with the - corresponding values of the following variables: - - has vector: Does the token have a vector representation? - vector norm: The L2 norm of the token's vector (the square root of the - sum of the values squared) - OOV: Out-of-vocabulary (This variable always gets the value True since - there are no vectors included in the model) - vector: The vector representation of the word - - >>> doc = Doc('Test sentence') - >>> doc.word_vectors['Test']['is_oov'] - True - >>> len(doc.word_vectors['Test']['vector']) - 96 - >>> doc.word_vectors['Test']['vector_norm'] == doc.word_vectors['sentence']['vector_norm'] - False - """ - lang = self.language if self.is_reliable_language else self.hint_language - return { - token.text: { - "has_vector": token.has_vector, - "vector_norm": token.vector_norm, - "is_oov": token.is_oov, - "vector": token.vector.tolist(), - } - for token in self._load_spacy_doc(lang, model_name) - } - - @property - def doc_vector(self): - """ - Returns document embeddings based on the words in the document. - - >>> import numpy - >>> numpy.array_equiv(Doc('a b').doc_vector, Doc('a b').doc_vector) - True - >>> numpy.array_equiv(Doc('a b').doc_vector, Doc('a a b').doc_vector) - False - """ - return self.aggregate_word_vectors() - - @functools.lru_cache() - def aggregate_word_vectors( - self, model_name=None, aggregation="mean", normalize=False, exclude_oov=False - ): - """ - Returns document embeddings based on the words in the document. - - >>> import numpy - >>> doc1 = Doc('a b') - >>> doc2 = Doc('a a b') - >>> numpy.array_equiv(doc1.aggregate_word_vectors(), doc1.aggregate_word_vectors()) - True - >>> numpy.array_equiv(doc1.aggregate_word_vectors(), doc2.aggregate_word_vectors()) - False - >>> numpy.array_equiv(doc1.aggregate_word_vectors(aggregation='mean'), doc2.aggregate_word_vectors(aggregation='sum')) - False - >>> numpy.array_equiv(doc1.aggregate_word_vectors(aggregation='mean'), doc2.aggregate_word_vectors(aggregation='var')) - False - >>> numpy.array_equiv(doc1.aggregate_word_vectors(aggregation='sum'), doc2.aggregate_word_vectors(aggregation='var')) - False - >>> doc = Doc('sentence with an out of vector word lsseofn') - >>> len(doc.aggregate_word_vectors()) - 96 - >>> numpy.array_equiv(doc.aggregate_word_vectors(exclude_oov=False), doc.aggregate_word_vectors(exclude_oov=True)) - False - """ - lang = self.language if self.is_reliable_language else self.hint_language - tokens = [ - token - for token in self._load_spacy_doc(lang, model_name) - if not exclude_oov or not token.is_oov - ] - vectors = [ - token.vector / token.vector_norm if normalize else token.vector - for token in tokens - ] - - if aggregation == "mean": - return numpy.mean(vectors, axis=0).tolist() - elif aggregation == "sum": - return numpy.sum(vectors, axis=0).tolist() - elif aggregation == "var": - return numpy.var(vectors, axis=0).tolist() - else: - raise NotImplementedError( - f"Aggregation method {aggregation} is not implemented." - ) From 6f6d3086454f8aca29f6493cf98d5fa458c5551b Mon Sep 17 00:00:00 2001 From: Robin <rdoume@gmail.com> Date: Fri, 5 Apr 2019 12:01:32 +0200 Subject: [PATCH 023/496] Add Language detector module, using either fasttext or cdl2. This solves #29 --- nautilus_nlp/models/Language_detector.py | 37 ++++++++++++++++++++++++ notebooks/Language_identification.ipynb | 20 ++++++------- 2 files changed, 47 insertions(+), 10 deletions(-) create mode 100644 nautilus_nlp/models/Language_detector.py diff --git a/nautilus_nlp/models/Language_detector.py b/nautilus_nlp/models/Language_detector.py new file mode 100644 index 0000000..b168473 --- /dev/null +++ b/nautilus_nlp/models/Language_detector.py @@ -0,0 +1,37 @@ +from nautilus_nlp.models.Fasttext_classifier import Fasttext_clf as langdetect +import cld2 +import pkg_resources +lang_path = pkg_resources.resource_filename('nautilus_nlp.data', 'lang_identification.ftz') +class LangDetector(): + """ This class is to instantiante a language detector. + + """ + def __init__(self,typemodel,path=lang_path,): + self.typemodel=typemodel + self.path = None if path is None else lang_path + self.model=langdetect(self.path) if typemodel=='fasttext' else None + + def detect_language(self, text_to_detect=None): + """ + Detected the language of a text + + Args: + hint_language: language you expect your text to be + + Returns: + is_reliable: is the top language is much better than 2nd best language? + language: 2-letter code for the language of the text + """ + if self.typemodel!='fasttext': + _, _, best_guesses = cld2.detect(text_to_detect, + bestEffort=True) + + if len(best_guesses) == 0 or len(best_guesses[0]) != 4 or best_guesses[0][1] == 'un': + return 'un',0 + + return best_guesses[0][1],(best_guesses[0][2]/100) + else: + best_guesses=self.model.predict(text_to_detect) + return best_guesses[0][0].replace('__label__',''),best_guesses[1][0] + + diff --git a/notebooks/Language_identification.ipynb b/notebooks/Language_identification.ipynb index 68049ee..4f00ebf 100644 --- a/notebooks/Language_identification.ipynb +++ b/notebooks/Language_identification.ipynb @@ -10,7 +10,7 @@ }, { "cell_type": "code", - "execution_count": 17, + "execution_count": 27, "metadata": {}, "outputs": [], "source": [ @@ -42,13 +42,13 @@ }, { "cell_type": "code", - "execution_count": 21, + "execution_count": 28, "metadata": {}, "outputs": [], "source": [ - "from nautilus_nlp.models import langdetector\n", - "detector= langdetector.LangDetector(typemodel='fasttext')\n", - "detector2= langdetector.LangDetector(typemodel='cld2')" + "from nautilus_nlp.models.Language_detector import LangDetector\n", + "detector= LangDetector(typemodel='fasttext')\n", + "detector2= LangDetector(typemodel='cld2')" ] }, { @@ -60,7 +60,7 @@ }, { "cell_type": "code", - "execution_count": 22, + "execution_count": 29, "metadata": {}, "outputs": [ { @@ -126,14 +126,14 @@ }, { "cell_type": "code", - "execution_count": 26, + "execution_count": 30, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "83.8 ms ± 836 µs per loop (mean ± std. dev. of 7 runs, 10 loops each)\n" + "87.5 ms ± 3.43 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)\n" ] } ], @@ -145,14 +145,14 @@ }, { "cell_type": "code", - "execution_count": 25, + "execution_count": 31, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "32.2 ms ± 1.59 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)\n" + "32 ms ± 1.19 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)\n" ] } ], From bcf5d1235f0f62781d6c6b03e01dc383d1416ef9 Mon Sep 17 00:00:00 2001 From: Robin <rdoume@gmail.com> Date: Fri, 5 Apr 2019 13:59:32 +0200 Subject: [PATCH 024/496] Add tests for Document abstractions --- tests/test_doc.py | 144 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 144 insertions(+) create mode 100644 tests/test_doc.py diff --git a/tests/test_doc.py b/tests/test_doc.py new file mode 100644 index 0000000..9d7787f --- /dev/null +++ b/tests/test_doc.py @@ -0,0 +1,144 @@ +""" +Testing for textpipe doc.py +""" +import pytest +import random +import spacy +from nautilus_nlp.models.Language_detector import LangDetector +from nautilus_nlp.doc import Doc, NautilusMissingModelException + +TEXT_1 = """ +Google was founded in 1998 by Larry Page and Sergey Brin while they were Ph.D. students at Stanford University in California. Together they own about 14 percent of its shares and control 56 percent of the stockholder voting power through supervoting stock. They incorporated Google as a privately held company on September 4, 1998. An initial public offering (IPO) took place on August 19, 2004, and Google moved to its headquarters in Mountain View, California, nicknamed the Googleplex. In August 2015, Google announced plans to reorganize its various interests as a conglomerate called Alphabet Inc. Google is Alphabet's leading subsidiary and will continue to be the umbrella company for Alphabet's Internet interests. Sundar Pichai was appointed CEO of Google, replacing Larry Page who became the CEO of Alphabet. +""" + +TEXT_2 = """Les moteurs de recherche tels Google, Exalead ou Yahoo! sont des applications très connues de fouille de textes sur de grandes masses de données. + Cependant, les moteurs de recherche ne se basent pas uniquement sur le texte pour l'indexer, + mais également sur la façon dont les pages sont mises en valeur les unes par rapport aux autres. + L'algorithme utilisé par Google est PageRank, et il est courant de voir HITS dans le milieu académique +""" + +TEXT_3 = "" + +TEXT_4 = """this is a paragraph +this is a paragraph +""" + +TEXT_5 = """Mark Zuckerberg is sinds de oprichting van Facebook de directeur van het bedrijf.""" + +TEXT_6 = """ +မြန်မာဘာသာစကားသည် တိဘက်-ဗမာနွယ် ဘာသာစကားများ အုပ်စုတွင် ပါဝင်သည်။ +တိဘက်-ဗမာနွယ် ဘာသာစကားများ အုပ်စုသည် တရုတ်-တိဗက်နွယ် ဘာသာစကားများ +မိသားစု ထဲတွင် ပါသည်။ မြန်မာဘာသာသည် တက်ကျသံရှိသော +၊နိမ့်မြင့်အမှတ်အသားရှိ ဖြစ်သော၊ ဧကဝဏ္ဏစကားလုံး အလွန်များသော ဘာသာစကား +ဖြစ်သည်။ ကတ္တား-ကံ-တြိယာ စကားလုံးအစီအစဉ်ဖြင့် ရေးသော သရုပ်ခွဲဘာသာစကား +လည်းဖြစ်သည်။ မြန်မာအက္ခရာများသည် ဗြာဟ္မီအက္ခရာ သို့မဟုတ် ဗြာဟ္မီအက္ခရာမှ +ဆက်ခံထားသောမွန်အက္ခရာတို့မှ ဆင်းသက်လာသည်။ +""" + +TEXT_7 = """\nHi <<First Name>>\nthis is filler text \xa325 more filler.\nadditilnal +filler.\nyet more\xa0still more\xa0filler.\n\xa0\nmore\nfiller.\x03\n\t\t\t\t\t\t +almost there \n\\n\nthe end\n""" + +ents_model = spacy.blank("nl") +custom_spacy_nlps = {"nl": {"ents": ents_model}} +detector = LangDetector(typemodel="fasttext") + +DOC_1 = Doc(TEXT_1, language="en") +DOC_2 = Doc(TEXT_2, language="fr") +DOC_4 = Doc(TEXT_4, "en") +DOC_5 = Doc(TEXT_5, language="nl", spacy_nlps=custom_spacy_nlps) +DOC_6 = Doc(TEXT_6, langdetect=detector) +DOC_7 = Doc(TEXT_7, "en") + + +def test_load_custom_model(): + """ + The custom spacy language modules should be correctly loaded into the doc. + """ + model_mapping = {"nl": "ents"} + lang = DOC_5.language + assert lang == "nl" + assert sorted(DOC_5.find_entities()) == sorted( + [("Mark Zuckerberg", "PER"), ("Facebook", "PER")] + ) + assert DOC_5.find_entities(model_mapping[lang]) == [] + + +def test_nwords_nsents(): + assert DOC_1.n_words == 145 + assert DOC_2.n_words == 83 + assert DOC_1.n_sentences == 7 + assert DOC_2.n_sentences == 3 + + +def test_entities(): + assert sorted(DOC_1.entities) == sorted( + [ + ("1998", "DATE"), + ("56 percent", "PERCENT"), + ("Alphabet", "GPE"), + ("Alphabet", "ORG"), + ("Alphabet Inc. Google", "ORG"), + ("August 19, 2004", "DATE"), + ("August 2015", "DATE"), + ("California", "GPE"), + ("Google", "ORG"), + ("Googleplex", "ORG"), + ("IPO", "ORG"), + ("Larry Page", "PERSON"), + ("Mountain View", "GPE"), + ("Ph.D.", "PERSON"), + ("September 4, 1998", "DATE"), + ("Sergey Brin", "PERSON"), + ("Stanford University", "ORG"), + ("Sundar Pichai", "PERSON"), + ("about 14 percent", "PERCENT"), + ] + ) + assert sorted(DOC_2.entities) == sorted( + [ + ("Exalead", "ORG"), + ("Google", "ORG"), + ("HITS", "MISC"), + ("PageRank", "MISC"), + ("Yahoo!", "ORG"), + ] + ) + + +def test_complexity(): + assert DOC_1.complexity == 48.06961538461539 + assert DOC_2.complexity == 78.634_035_087_719_3 + + +def test_clean(): + assert len(TEXT_1) >= len(DOC_1.clean) + assert len(TEXT_2) >= len(DOC_2.clean) + + +def test_clean_newlines(): + assert " ".join(TEXT_4.split()) == DOC_4.clean + + +def test_extract_keyterms(): + non_ranker = "bulthaup" + rankers = ["textrank", "sgrank", "singlerank"] + with pytest.raises( + ValueError, + message=f'algorithm "{non_ranker}" not ' f"available; use one of {rankers}", + ): + DOC_1.extract_keyterms(ranker=non_ranker) + assert len(DOC_1.extract_keyterms()) == 10 + # limits number of keyterms + assert len(DOC_1.extract_keyterms(n_terms=2)) == 2 + # works with other rankers + assert isinstance(DOC_2.extract_keyterms(ranker=random.choice(rankers)), list) + + +def test_missing_language_model(): + with pytest.raises(NautilusMissingModelException): + DOC_6.n_words + + +def test_non_utf_chars(): + assert DOC_7.language == "en" From f3bf9419b1aee9caa4c04a0b2d97ede14d657f7e Mon Sep 17 00:00:00 2001 From: Robin <rdoume@gmail.com> Date: Fri, 5 Apr 2019 16:38:24 +0200 Subject: [PATCH 025/496] Add doc lemmatisation --- nautilus_nlp/doc.py | 25 +++++++++++++++++++------ 1 file changed, 19 insertions(+), 6 deletions(-) diff --git a/nautilus_nlp/doc.py b/nautilus_nlp/doc.py index 9a23062..d7dfdc2 100644 --- a/nautilus_nlp/doc.py +++ b/nautilus_nlp/doc.py @@ -62,8 +62,8 @@ def language(self): if not self._language: if self._language_detector: - self._is_reliable_language, self._language = self._language_detector.detect_language( - self.raw + self._language,self._is_reliable_language = self._language_detector.detect_language( + self.clean ) else: raise NautilusMissingModelException( @@ -111,9 +111,12 @@ def _get_default_nlp(lang): Loads the spacy default language module for the Doc's language """ try: - return spacy.load( - "{}_core_{}_sm".format(lang, "web" if lang == "en" else "news") - ) + if lang!='un': + return spacy.load( + "{}_core_{}_sm".format(lang, "web" if lang == "en" else "news") + ) + else: + return spacy.load('xx_ent_wiki_sm') except IOError: raise NautilusMissingModelException( f'Default model for language "{lang}" is not available. You should try to run python -m spacy download {lang}_core_news_sm' @@ -142,7 +145,7 @@ def clean_text(self, clean_dots=True, clean_quotes=True, clean_whitespace=True): True """ text = self.raw - + text.replace('\n',' ') if clean_dots: text = re.sub(r"…", "...", text) if clean_quotes: @@ -153,6 +156,16 @@ def clean_text(self, clean_dots=True, clean_quotes=True, clean_whitespace=True): return text + @property + def lemma(self): + + return self.get_lemma() + + @functools.lru_cache() + def get_lemma(self,model_name=None): + + return [token.lemma_ for token in self._load_spacy_doc(self.language, model_name)] + @property def entities(self): """ From 102fcaf41627440b51ffc13cda9e8ef7c1e9a4d1 Mon Sep 17 00:00:00 2001 From: Unknown <rdoume@gmail.com> Date: Fri, 5 Apr 2019 16:42:16 +0200 Subject: [PATCH 026/496] Script to download all spacy models --- download_spacy_models.sh | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 download_spacy_models.sh diff --git a/download_spacy_models.sh b/download_spacy_models.sh new file mode 100644 index 0000000..0a3a374 --- /dev/null +++ b/download_spacy_models.sh @@ -0,0 +1,5 @@ +python -m spacy download en_core_web_sm +python -m spacy download de_core_news_sm +python -m spacy download fr_core_news_sm +python -m spacy download es_core_news_sm +python -m spacy download nl_core_news_sm From 9e82199e0ba6791b2d818683302dfeb81fef2846 Mon Sep 17 00:00:00 2001 From: Robin <rdoume@gmail.com> Date: Fri, 5 Apr 2019 18:52:51 +0200 Subject: [PATCH 027/496] Add Keyword extraction from text #54 --- nautilus_nlp/utils/keyword_extractor.py | 21 +++++++++++++++++++++ tests/tests_extraction.py | 16 ++++++++++++++++ 2 files changed, 37 insertions(+) create mode 100644 nautilus_nlp/utils/keyword_extractor.py create mode 100644 tests/tests_extraction.py diff --git a/nautilus_nlp/utils/keyword_extractor.py b/nautilus_nlp/utils/keyword_extractor.py new file mode 100644 index 0000000..e384bf2 --- /dev/null +++ b/nautilus_nlp/utils/keyword_extractor.py @@ -0,0 +1,21 @@ +from flashtext import KeywordProcessor + +def extract_keywords(text,keyword,case_sensitive=True): + """ + Extract Keywords from a document. + args : + text: Text to extract keywords from + keyword : Single keyword (str) or list of keywords (list) + + return list of extracted keyworkds + """ + processor=KeywordProcessor(case_sensitive=case_sensitive) + if isinstance(keyword,list): + processor.add_keywords_from_list(keyword) + elif isinstance(keyword,str): + processor.add_keyword(keyword) + elif isinstance(keyword,dict): + processor.add_keywords_from_dict(keyword) + + return processor.extract_keywords(text) + diff --git a/tests/tests_extraction.py b/tests/tests_extraction.py new file mode 100644 index 0000000..293aef5 --- /dev/null +++ b/tests/tests_extraction.py @@ -0,0 +1,16 @@ +from nautilus_nlp.utils.keyword_extractor import extract_keywords + +str_="""Les moteurs de recherche tels Google, Exalead ou Yahoo! sont + des applications très connues de fouille de textes sur de grandes masses de données. + Cependant, les moteurs de recherche ne se basent pas uniquement sur le texte pour l'indexer, mais également sur la façon + dont les pages sont mises en valeur les unes par rapport aux autres. L'algorithme utilisé par Google est PageRank, et il est courant de voir HITS + dans le milieu académique""" + +dict_extract={"US_Companies":['Yahoo','Google'], + "French_Companies":['Exalead'] +} +def test_keyword_extraction(): + assert extract_keywords(str_,['Google'])==['Google','Google'] + assert extract_keywords(str_,'Google')==['Google','Google'] + assert extract_keywords(str_,['Google','Yahoo'])==['Google','Yahoo','Google'] + assert extract_keywords(str_,dict_extract) == ['US_Companies', 'French_Companies', 'US_Companies', 'US_Companies'] From 9942efc125fea85ea41d16b99827188f8997d4b6 Mon Sep 17 00:00:00 2001 From: Robin <rdoume@gmail.com> Date: Fri, 5 Apr 2019 18:54:35 +0200 Subject: [PATCH 028/496] Change requireents for keyword extraction #54 --- requirements.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/requirements.txt b/requirements.txt index 869399b..f53e017 100644 --- a/requirements.txt +++ b/requirements.txt @@ -27,3 +27,4 @@ textblob_fr vaderSentiment stop_words cld2_cffi~=0.1 +flashtext \ No newline at end of file From c9212a7a3d19ddab0e3c4d1981a39a7a70f66e12 Mon Sep 17 00:00:00 2001 From: hugovasselin <waaaouu@gmail.com> Date: Sat, 6 Apr 2019 12:50:10 +0200 Subject: [PATCH 029/496] fix issues and improve document_loader --- nautilus_nlp/utils/file_loader.py | 26 +++++++++++++++++++++----- 1 file changed, 21 insertions(+), 5 deletions(-) diff --git a/nautilus_nlp/utils/file_loader.py b/nautilus_nlp/utils/file_loader.py index 7baa483..562083e 100644 --- a/nautilus_nlp/utils/file_loader.py +++ b/nautilus_nlp/utils/file_loader.py @@ -38,13 +38,15 @@ def text_loader(filepath, encoding=None, detectencoding=True): try: return open_textfile(filepath, encoding='utf-8') except UnicodeDecodeError: - logging.warning('Encoding is not UTF-8.') + logging.warning('Encoding for {} is not UTF-8.'.format(filepath)) if detectencoding is True: logging.warning('Trying to detect encoding for {}'.format(filepath)) detected_encoding = detect_encoding(filepath) - logging.info('detected encoding is {encod}, with a confidence rate of {conf_rate}'.format(encod=detected_encoding['encoding'], + logging.info('{filepath}: detected encoding is {encod}, with a confidence rate of {conf_rate}'.format(filepath=filepath, encod=detected_encoding['encoding'], conf_rate=detected_encoding['confidence'])) return open_textfile(filepath, encoding=detected_encoding['encoding']) + else: + raise UnicodeDecodeError('Cannot load document using utf-8. Try to detect encoding using detectencoding=True') def list_files(filepath:str): @@ -60,11 +62,20 @@ def list_files(filepath:str): return[file for file in glob.glob(filepath) if isfile(file)] -def documents_loader(filepath, encoding=None): +def documents_loader(filepath:str, encoding=None, detectencoding=True, output_as='dict'): ''' Input a filepath, a filepath with wildcard (eg. *.txt), or a list of filepaths. Output a string, or a dict of strings. + Args: + filepath: filepath, a filepath with wildcard (eg. *.txt), + or a list of filepaths. + output_as: list or dict. If dict, key will be the filename. + encoding: if not specified, will try to detect encoding except if + detectencoding is false. + detectencoding: if True and if encoding is not specified, will try to + detect encoding using chardet. + ''' if type(filepath) is str: @@ -77,9 +88,14 @@ def documents_loader(filepath, encoding=None): raise IOError('Please enter a valid filepath or a valid list of filepath') if nb_of_documents == 1: - return text_loader(documents[0],encoding=encoding) + return text_loader(documents[0],encoding=encoding, detectencoding=detectencoding) elif nb_of_documents > 1: - return { document : text_loader(documents[0], encoding=encoding) for document in documents} + if output_as == 'list': + return [text_loader(document, encoding=encoding, detectencoding=detectencoding) for document in documents] + elif output_as == 'dict': + return { document : text_loader(document, encoding=encoding, detectencoding=detectencoding) for document in documents} + else: + raise ValueError('Enter a valid output format between list or dict') else: raise IOError('No files detected in {}'.format(filepath)) From a75ed1642223244dd14cce3e33c757b64396d0b3 Mon Sep 17 00:00:00 2001 From: hugovasselin <waaaouu@gmail.com> Date: Sat, 6 Apr 2019 12:51:47 +0200 Subject: [PATCH 030/496] put document_loader on top --- ... a list of files and detect encoding.ipynb | 401 ---------------- ...t files loader with encoding handler.ipynb | 447 ++++++++++++++++++ 2 files changed, 447 insertions(+), 401 deletions(-) delete mode 100644 notebooks/Open a file, a list of files and detect encoding.ipynb create mode 100644 notebooks/Text files loader with encoding handler.ipynb diff --git a/notebooks/Open a file, a list of files and detect encoding.ipynb b/notebooks/Open a file, a list of files and detect encoding.ipynb deleted file mode 100644 index 8c26c57..0000000 --- a/notebooks/Open a file, a list of files and detect encoding.ipynb +++ /dev/null @@ -1,401 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Open Text File with encoding handling" - ] - }, - { - "cell_type": "code", - "execution_count": 1, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "# Example of a latin1 file\n", - "s = \"J'aime les frites bien grasse étalon châpeau!\"\n", - "encoded_s = s.encode('latin-1')\n", - "with open('somefile.txt', 'wb') as f:\n", - " f.write(encoded_s)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## text loader" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "If you don't know what the encoding is, you can use the `text_loader()`. Il will try to open with UTF-8, and if it fails it will apply `detect_encoding()`." - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "from nautilus_nlp.utils.file_loader import text_loader" - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "metadata": {}, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "WARNING:root:Encoding is not UTF-8.\n", - "WARNING:root:Trying to detect encoding for somefile.txt\n", - "INFO:root:detected encoding is ISO-8859-1, with a confidence rate of 0.73\n" - ] - }, - { - "data": { - "text/plain": [ - "\"J'aime les frites bien grasse étalon châpeau!\"" - ] - }, - "execution_count": 3, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "text_loader('somefile.txt')" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## open text file when you know the encoding" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "If you know the encoding. (you can also use `open_textfile()`)" - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "\"J'aime les frites bien grasse étalon châpeau!\"" - ] - }, - "execution_count": 4, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "text_loader('somefile.txt',encoding='latin-1')" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## detect encoding " - ] - }, - { - "cell_type": "code", - "execution_count": 5, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "from nautilus_nlp.utils.file_loader import detect_encoding" - ] - }, - { - "cell_type": "code", - "execution_count": 6, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "{'encoding': 'ISO-8859-1', 'confidence': 0.73, 'language': ''}" - ] - }, - "execution_count": 6, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "detect_encoding('somefile.txt')" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## List files in a folder" - ] - }, - { - "cell_type": "code", - "execution_count": 7, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "from nautilus_nlp.utils.file_loader import list_files" - ] - }, - { - "cell_type": "code", - "execution_count": 8, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "['./somefile.txt',\n", - " './Open a file, a list of files and detect encoding.ipynb',\n", - " './Visualization tools.ipynb',\n", - " './Language_identification.ipynb',\n", - " './someadditionalfile.txt',\n", - " './somefile',\n", - " './Common Text Processing operations.ipynb',\n", - " './Sentiment_analysis_FT.ipynb',\n", - " './Spacy_model.ipynb',\n", - " './Sentiment analysis using pre-trained models.ipynb']" - ] - }, - "execution_count": 8, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "list_files('.') # list files from current folders" - ] - }, - { - "cell_type": "code", - "execution_count": 9, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "['./Open a file, a list of files and detect encoding.ipynb',\n", - " './Visualization tools.ipynb',\n", - " './Language_identification.ipynb',\n", - " './Common Text Processing operations.ipynb',\n", - " './Sentiment_analysis_FT.ipynb',\n", - " './Spacy_model.ipynb',\n", - " './Sentiment analysis using pre-trained models.ipynb']" - ] - }, - "execution_count": 9, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "list_files('./*.ipynb') # List files matching specific pattern" - ] - }, - { - "cell_type": "code", - "execution_count": 10, - "metadata": { - "scrolled": true - }, - "outputs": [ - { - "data": { - "text/plain": [ - "['/Users/hugo/Documents/NAUTILUS/nautilus-nlp/LICENSE',\n", - " '/Users/hugo/Documents/NAUTILUS/nautilus-nlp/requirements.txt',\n", - " '/Users/hugo/Documents/NAUTILUS/nautilus-nlp/Makefile',\n", - " '/Users/hugo/Documents/NAUTILUS/nautilus-nlp/README.md',\n", - " '/Users/hugo/Documents/NAUTILUS/nautilus-nlp/setup.py',\n", - " '/Users/hugo/Documents/NAUTILUS/nautilus-nlp/tox.ini',\n", - " '/Users/hugo/Documents/NAUTILUS/nautilus-nlp/test_environment.py']" - ] - }, - "execution_count": 10, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "# only files will be printed, not folders\n", - "list_files('/Users/hugo/Documents/NAUTILUS/nautilus-nlp/')" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Open several text files" - ] - }, - { - "cell_type": "code", - "execution_count": 11, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "# Let's add another document \n", - "s = \"Un deuxième exemple de texte en utf-8 cette fois!\"\n", - "encoded_s = s.encode('utf-8')\n", - "with open('someadditionalfile.txt', 'wb') as f:\n", - " f.write(encoded_s)" - ] - }, - { - "cell_type": "code", - "execution_count": 12, - "metadata": {}, - "outputs": [], - "source": [ - "from nautilus_nlp.utils.file_loader import documents_loader" - ] - }, - { - "cell_type": "code", - "execution_count": 13, - "metadata": {}, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "WARNING:root:Encoding is not UTF-8.\n", - "WARNING:root:Trying to detect encoding for somefile.txt\n", - "INFO:root:detected encoding is ISO-8859-1, with a confidence rate of 0.73\n", - "WARNING:root:Encoding is not UTF-8.\n", - "WARNING:root:Trying to detect encoding for somefile.txt\n", - "INFO:root:detected encoding is ISO-8859-1, with a confidence rate of 0.73\n" - ] - }, - { - "data": { - "text/plain": [ - "{'somefile.txt': \"J'aime les frites bien grasse étalon châpeau!\",\n", - " 'someadditionalfile.txt': \"J'aime les frites bien grasse étalon châpeau!\"}" - ] - }, - "execution_count": 13, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "documents_loader('*.txt')" - ] - }, - { - "cell_type": "code", - "execution_count": 14, - "metadata": {}, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "WARNING:root:Encoding is not UTF-8.\n", - "WARNING:root:Trying to detect encoding for somefile.txt\n", - "INFO:root:detected encoding is ISO-8859-1, with a confidence rate of 0.73\n", - "WARNING:root:Encoding is not UTF-8.\n", - "WARNING:root:Trying to detect encoding for somefile.txt\n", - "INFO:root:detected encoding is ISO-8859-1, with a confidence rate of 0.73\n" - ] - }, - { - "data": { - "text/plain": [ - "{'somefile.txt': \"J'aime les frites bien grasse étalon châpeau!\",\n", - " 'someadditionalfile.txt': \"J'aime les frites bien grasse étalon châpeau!\"}" - ] - }, - "execution_count": 14, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "documents_loader(['somefile.txt','someadditionalfile.txt'])" - ] - }, - { - "cell_type": "code", - "execution_count": 15, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "'Un deuxième exemple de texte en utf-8 cette fois!'" - ] - }, - "execution_count": 15, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "documents_loader('someadditionalfile.txt',encoding='utf-8')" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "collapsed": true - }, - "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.7.0" - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} diff --git a/notebooks/Text files loader with encoding handler.ipynb b/notebooks/Text files loader with encoding handler.ipynb new file mode 100644 index 0000000..168bbbd --- /dev/null +++ b/notebooks/Text files loader with encoding handler.ipynb @@ -0,0 +1,447 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Open Text File with encoding handling" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "# Example of a latin1 file\n", + "s = \"J'aime les frites bien grasse étalon châpeau!\"\n", + "encoded_s = s.encode('latin-1')\n", + "with open('somefile.txt', 'wb') as f:\n", + " f.write(encoded_s)" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "# Let's add another document \n", + "s = \"Un deuxième exemple de texte en utf-8 cette fois!\"\n", + "encoded_s = s.encode('utf-8')\n", + "with open('someadditionalfile.txt', 'wb') as f:\n", + " f.write(encoded_s)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Document loader" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "from nautilus_nlp.utils.file_loader import documents_loader" + ] + }, + { + "cell_type": "code", + "execution_count": 18, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "\"J'aime les frites bien grasse étalon châpeau!\"" + ] + }, + "execution_count": 18, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "documents_loader('somefile.txt',encoding='latin-1')" + ] + }, + { + "cell_type": "code", + "execution_count": 19, + "metadata": { + "scrolled": true + }, + "outputs": [ + { + "data": { + "text/plain": [ + "'Un deuxième exemple de texte en utf-8 cette fois!'" + ] + }, + "execution_count": 19, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# default encoding is UTF-8\n", + "documents_loader('someadditionalfile.txt')" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Detect encoding" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "If you don't specify encoding, `document_loader()` will try to open it as UTF-8, and if it doesn't work it will try to detect encoding." + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "metadata": { + "scrolled": false + }, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "WARNING:root:Encoding for somefile.txt is not UTF-8.\n", + "WARNING:root:Trying to detect encoding for somefile.txt\n", + "INFO:root:somefile.txt: detected encoding is ISO-8859-1, with a confidence rate of 0.73\n" + ] + }, + { + "data": { + "text/plain": [ + "\"J'aime les frites bien grasse étalon châpeau!\"" + ] + }, + "execution_count": 15, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "documents_loader('somefile.txt')" + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "metadata": { + "scrolled": true + }, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "WARNING:root:Encoding for somefile.txt is not UTF-8.\n" + ] + }, + { + "ename": "TypeError", + "evalue": "function takes exactly 5 arguments (1 given)", + "output_type": "error", + "traceback": [ + "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", + "\u001b[0;31mUnicodeDecodeError\u001b[0m Traceback (most recent call last)", + "\u001b[0;32m~/Documents/NAUTILUS/nautilus-nlp/nautilus_nlp/utils/file_loader.py\u001b[0m in \u001b[0;36mtext_loader\u001b[0;34m(filepath, encoding, detectencoding)\u001b[0m\n\u001b[1;32m 38\u001b[0m \u001b[0;32mtry\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m---> 39\u001b[0;31m \u001b[0;32mreturn\u001b[0m \u001b[0mopen_textfile\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mfilepath\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mencoding\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;34m'utf-8'\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 40\u001b[0m \u001b[0;32mexcept\u001b[0m \u001b[0mUnicodeDecodeError\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;32m~/Documents/NAUTILUS/nautilus-nlp/nautilus_nlp/utils/file_loader.py\u001b[0m in \u001b[0;36mopen_textfile\u001b[0;34m(filepath, encoding)\u001b[0m\n\u001b[1;32m 13\u001b[0m \u001b[0;32mwith\u001b[0m \u001b[0mio\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mopen\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mfilepath\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m'r'\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mencoding\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mencoding\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;32mas\u001b[0m \u001b[0mf\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m---> 14\u001b[0;31m \u001b[0mstring\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mf\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mread\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 15\u001b[0m \u001b[0;32mreturn\u001b[0m \u001b[0mstring\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;32m/usr/local/Cellar/python/3.7.0/Frameworks/Python.framework/Versions/3.7/lib/python3.7/codecs.py\u001b[0m in \u001b[0;36mdecode\u001b[0;34m(self, input, final)\u001b[0m\n\u001b[1;32m 321\u001b[0m \u001b[0mdata\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mbuffer\u001b[0m \u001b[0;34m+\u001b[0m \u001b[0minput\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 322\u001b[0;31m \u001b[0;34m(\u001b[0m\u001b[0mresult\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mconsumed\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_buffer_decode\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mdata\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0merrors\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mfinal\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 323\u001b[0m \u001b[0;31m# keep undecoded input until the next call\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;31mUnicodeDecodeError\u001b[0m: 'utf-8' codec can't decode byte 0xe9 in position 30: invalid continuation byte", + "\nDuring handling of the above exception, another exception occurred:\n", + "\u001b[0;31mTypeError\u001b[0m Traceback (most recent call last)", + "\u001b[0;32m<ipython-input-17-dc5ecd5accf3>\u001b[0m in \u001b[0;36m<module>\u001b[0;34m\u001b[0m\n\u001b[0;32m----> 1\u001b[0;31m \u001b[0mdocuments_loader\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m'somefile.txt'\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mdetectencoding\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;32mFalse\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", + "\u001b[0;32m~/Documents/NAUTILUS/nautilus-nlp/nautilus_nlp/utils/file_loader.py\u001b[0m in \u001b[0;36mdocuments_loader\u001b[0;34m(filepath, encoding, detectencoding, output_as)\u001b[0m\n\u001b[1;32m 89\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 90\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mnb_of_documents\u001b[0m \u001b[0;34m==\u001b[0m \u001b[0;36m1\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m---> 91\u001b[0;31m \u001b[0;32mreturn\u001b[0m \u001b[0mtext_loader\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mdocuments\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;36m0\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0mencoding\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mencoding\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mdetectencoding\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mdetectencoding\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 92\u001b[0m \u001b[0;32melif\u001b[0m \u001b[0mnb_of_documents\u001b[0m \u001b[0;34m>\u001b[0m \u001b[0;36m1\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 93\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0moutput_as\u001b[0m \u001b[0;34m==\u001b[0m \u001b[0;34m'list'\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;32m~/Documents/NAUTILUS/nautilus-nlp/nautilus_nlp/utils/file_loader.py\u001b[0m in \u001b[0;36mtext_loader\u001b[0;34m(filepath, encoding, detectencoding)\u001b[0m\n\u001b[1;32m 47\u001b[0m \u001b[0;32mreturn\u001b[0m \u001b[0mopen_textfile\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mfilepath\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mencoding\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mdetected_encoding\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;34m'encoding'\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 48\u001b[0m \u001b[0;32melse\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m---> 49\u001b[0;31m \u001b[0;32mraise\u001b[0m \u001b[0mUnicodeDecodeError\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m'Cannot load document using utf-8. Try to detect encoding using detectencoding=True'\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 50\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 51\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;31mTypeError\u001b[0m: function takes exactly 5 arguments (1 given)" + ] + } + ], + "source": [ + "# You can prevent document loader from detecting the encoding if UTF-8 fails \n", + "documents_loader('somefile.txt', detectencoding=False)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Open several files" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "WARNING:root:Encoding for somefile.txt is not UTF-8.\n", + "WARNING:root:Trying to detect encoding for somefile.txt\n", + "INFO:root:somefile.txt: detected encoding is ISO-8859-1, with a confidence rate of 0.73\n" + ] + }, + { + "data": { + "text/plain": [ + "{'somefile.txt': \"J'aime les frites bien grasse étalon châpeau!\",\n", + " 'someadditionalfile.txt': 'Un deuxième exemple de texte en utf-8 cette fois!'}" + ] + }, + "execution_count": 12, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# you can use wildcards to open several documents\n", + "documents_loader('*.txt')" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "WARNING:root:Encoding for somefile.txt is not UTF-8.\n", + "WARNING:root:Trying to detect encoding for somefile.txt\n", + "INFO:root:somefile.txt: detected encoding is ISO-8859-1, with a confidence rate of 0.73\n" + ] + }, + { + "data": { + "text/plain": [ + "{'somefile.txt': \"J'aime les frites bien grasse étalon châpeau!\",\n", + " 'someadditionalfile.txt': 'Un deuxième exemple de texte en utf-8 cette fois!'}" + ] + }, + "execution_count": 13, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# you can also pass a list of filepaths\n", + "documents_loader(['somefile.txt','someadditionalfile.txt'])" + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "WARNING:root:Encoding for somefile.txt is not UTF-8.\n", + "WARNING:root:Trying to detect encoding for somefile.txt\n", + "INFO:root:somefile.txt: detected encoding is ISO-8859-1, with a confidence rate of 0.73\n" + ] + }, + { + "data": { + "text/plain": [ + "[\"J'aime les frites bien grasse étalon châpeau!\",\n", + " 'Un deuxième exemple de texte en utf-8 cette fois!']" + ] + }, + "execution_count": 14, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# you can specify the output format when you load multiple texts\n", + "documents_loader('*.txt', output_as='list')" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## List files in a folder" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "from nautilus_nlp.utils.file_loader import list_files" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "['./somefile.txt',\n", + " './Open a file, a list of files and detect encoding.ipynb',\n", + " './Visualization tools.ipynb',\n", + " './Language_identification.ipynb',\n", + " './someadditionalfile.txt',\n", + " './somefile',\n", + " './Common Text Processing operations.ipynb',\n", + " './Sentiment_analysis_FT.ipynb',\n", + " './Spacy_model.ipynb',\n", + " './Sentiment analysis using pre-trained models.ipynb']" + ] + }, + "execution_count": 8, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "list_files('.') # list files from current folders" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "['./Open a file, a list of files and detect encoding.ipynb',\n", + " './Visualization tools.ipynb',\n", + " './Language_identification.ipynb',\n", + " './Common Text Processing operations.ipynb',\n", + " './Sentiment_analysis_FT.ipynb',\n", + " './Spacy_model.ipynb',\n", + " './Sentiment analysis using pre-trained models.ipynb']" + ] + }, + "execution_count": 9, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "list_files('./*.ipynb') # List files matching specific pattern" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": { + "scrolled": true + }, + "outputs": [ + { + "data": { + "text/plain": [ + "['/Users/hugo/Documents/NAUTILUS/nautilus-nlp/LICENSE',\n", + " '/Users/hugo/Documents/NAUTILUS/nautilus-nlp/requirements.txt',\n", + " '/Users/hugo/Documents/NAUTILUS/nautilus-nlp/Makefile',\n", + " '/Users/hugo/Documents/NAUTILUS/nautilus-nlp/README.md',\n", + " '/Users/hugo/Documents/NAUTILUS/nautilus-nlp/setup.py',\n", + " '/Users/hugo/Documents/NAUTILUS/nautilus-nlp/tox.ini',\n", + " '/Users/hugo/Documents/NAUTILUS/nautilus-nlp/test_environment.py']" + ] + }, + "execution_count": 10, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# only files will be printed, not folders\n", + "list_files('/Users/hugo/Documents/NAUTILUS/nautilus-nlp/')" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## detect encoding " + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "from nautilus_nlp.utils.file_loader import detect_encoding" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "{'encoding': 'ISO-8859-1', 'confidence': 0.73, 'language': ''}" + ] + }, + "execution_count": 6, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "detect_encoding('somefile.txt')" + ] + } + ], + "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.7.0" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} From 025c3045fd6936d23204d0207644ffc3ee3e799d Mon Sep 17 00:00:00 2001 From: hugovasselin <waaaouu@gmail.com> Date: Sat, 6 Apr 2019 12:55:05 +0200 Subject: [PATCH 031/496] improve doc --- ...t files loader with encoding handler.ipynb | 36 +++++++++++-------- 1 file changed, 22 insertions(+), 14 deletions(-) diff --git a/notebooks/Text files loader with encoding handler.ipynb b/notebooks/Text files loader with encoding handler.ipynb index 168bbbd..ea034dd 100644 --- a/notebooks/Text files loader with encoding handler.ipynb +++ b/notebooks/Text files loader with encoding handler.ipynb @@ -56,53 +56,61 @@ ] }, { - "cell_type": "code", - "execution_count": 18, + "cell_type": "markdown", "metadata": {}, + "source": [ + "## Open a file when you know the encoding" + ] + }, + { + "cell_type": "code", + "execution_count": 19, + "metadata": { + "scrolled": true + }, "outputs": [ { "data": { "text/plain": [ - "\"J'aime les frites bien grasse étalon châpeau!\"" + "'Un deuxième exemple de texte en utf-8 cette fois!'" ] }, - "execution_count": 18, + "execution_count": 19, "metadata": {}, "output_type": "execute_result" } ], "source": [ - "documents_loader('somefile.txt',encoding='latin-1')" + "# default encoding is UTF-8\n", + "documents_loader('someadditionalfile.txt')" ] }, { "cell_type": "code", - "execution_count": 19, - "metadata": { - "scrolled": true - }, + "execution_count": 18, + "metadata": {}, "outputs": [ { "data": { "text/plain": [ - "'Un deuxième exemple de texte en utf-8 cette fois!'" + "\"J'aime les frites bien grasse étalon châpeau!\"" ] }, - "execution_count": 19, + "execution_count": 18, "metadata": {}, "output_type": "execute_result" } ], "source": [ - "# default encoding is UTF-8\n", - "documents_loader('someadditionalfile.txt')" + "# If you know the encoding, you can specify it\n", + "documents_loader('somefile.txt', encoding='latin-1')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ - "## Detect encoding" + "## Open a file with encoding detection" ] }, { From 5d3021ba56192638d1e3d4f5adaad2b5b9920289 Mon Sep 17 00:00:00 2001 From: hugovasselin <waaaouu@gmail.com> Date: Sat, 6 Apr 2019 16:31:12 +0200 Subject: [PATCH 032/496] add tests for document loader --- tests/test_document_loader.py | 72 +++++++++++++++++++ .../testfolder_fileloader/testdoc_latin1.txt | 1 + tests/testfolder_fileloader/testdoc_utf8.txt | 1 + 3 files changed, 74 insertions(+) create mode 100644 tests/test_document_loader.py create mode 100644 tests/testfolder_fileloader/testdoc_latin1.txt create mode 100644 tests/testfolder_fileloader/testdoc_utf8.txt diff --git a/tests/test_document_loader.py b/tests/test_document_loader.py new file mode 100644 index 0000000..2868be8 --- /dev/null +++ b/tests/test_document_loader.py @@ -0,0 +1,72 @@ +import pytest +import numpy as np +from nautilus_nlp.utils.file_loader import documents_loader, list_files, detect_encoding + + +testdoc_latin1 = "J'aime les frites bien grasse étalon châpeau!" +encoded_s = testdoc_latin1.encode('latin-1') +with open('tests/testfolder_fileloader/testdoc_latin1.txt', 'wb') as f: + f.write(encoded_s) + +testdoc_utf8 = "Un deuxième exemple de texte en utf-8 cette fois!" +encoded_s = testdoc_utf8.encode('utf-8') +with open('tests/testfolder_fileloader/testdoc_utf8.txt', 'wb') as f: + f.write(encoded_s) + + +def test_openfile_with_encoding(): + input_str = "tests/testfolder_fileloader/testdoc_latin1.txt" + expected_str = testdoc_latin1 + + result = documents_loader(input_str, encoding='latin-1') + np.testing.assert_string_equal(result, expected_str) + +def test_openfile_utf8(): + input_str = "tests/testfolder_fileloader/testdoc_utf8.txt" + expected_str = testdoc_utf8 + + result = documents_loader(input_str) + np.testing.assert_string_equal(result, expected_str) + +def test_encoding_detection(): + input_str = "tests/testfolder_fileloader/testdoc_latin1.txt" + expected_str = testdoc_latin1 + + result = documents_loader(input_str) + np.testing.assert_string_equal(result, expected_str) + +def test_load_several_docs_wildcard(): + expected = {'tests/testfolder_fileloader/testdoc_latin1.txt': "J'aime les frites bien grasse étalon châpeau!", + 'tests/testfolder_fileloader/testdoc_utf8.txt': 'Un deuxième exemple de texte en utf-8 cette fois!'} + result = documents_loader('tests/testfolder_fileloader/*.txt', output_as='dict') + np.testing.assert_equal(result, expected) + +def test_load_several_docs_list(): + expected = {'tests/testfolder_fileloader/testdoc_latin1.txt': "J'aime les frites bien grasse étalon châpeau!", + 'tests/testfolder_fileloader/testdoc_utf8.txt': 'Un deuxième exemple de texte en utf-8 cette fois!'} + result = documents_loader(['tests/testfolder_fileloader/testdoc_latin1.txt','tests/testfolder_fileloader/testdoc_utf8.txt'], output_as='dict') + np.testing.assert_equal(result, expected) + + +def test_load_several_docs_output_list(): + expected = ["J'aime les frites bien grasse étalon châpeau!", + 'Un deuxième exemple de texte en utf-8 cette fois!'] + result = documents_loader(['tests/testfolder_fileloader/testdoc_latin1.txt','tests/testfolder_fileloader/testdoc_utf8.txt'], output_as='list') + return len(expected) == len(result) and sorted(expected) == sorted(result) + + + +@pytest.mark.parametrize("input_filepath", ['tests/testfolder_fileloader/*.txt','tests/testfolder_fileloader/','tests/testfolder_fileloader']) +def test_list_files(input_filepath): + expected = ['tests/testfolder_fileloader/testdoc_latin1.txt','tests/testfolder_fileloader/testdoc_utf8.txt'] + result = list_files(input_filepath) + + return len(expected) == len(result) and sorted(expected) == sorted(result) + + +def test_detect_encoding(): + expected = {'encoding': 'ISO-8859-1', 'confidence': 0.73, 'language': ''} + result = detect_encoding('tests/testfolder_fileloader/testdoc_latin1.txt') + + np.testing.assert_equal(result, expected) + diff --git a/tests/testfolder_fileloader/testdoc_latin1.txt b/tests/testfolder_fileloader/testdoc_latin1.txt new file mode 100644 index 0000000..b9855bf --- /dev/null +++ b/tests/testfolder_fileloader/testdoc_latin1.txt @@ -0,0 +1 @@ +J'aime les frites bien grasse �talon ch�peau! \ No newline at end of file diff --git a/tests/testfolder_fileloader/testdoc_utf8.txt b/tests/testfolder_fileloader/testdoc_utf8.txt new file mode 100644 index 0000000..c7de724 --- /dev/null +++ b/tests/testfolder_fileloader/testdoc_utf8.txt @@ -0,0 +1 @@ +Un deuxième exemple de texte en utf-8 cette fois! \ No newline at end of file From d6d2552961fd07193ad6ad2d0694d5a22c793fb1 Mon Sep 17 00:00:00 2001 From: Robin <rdoume@gmail.com> Date: Sat, 6 Apr 2019 17:35:59 +0200 Subject: [PATCH 033/496] typo --- nautilus_nlp/doc.py | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/nautilus_nlp/doc.py b/nautilus_nlp/doc.py index d7dfdc2..9670f58 100644 --- a/nautilus_nlp/doc.py +++ b/nautilus_nlp/doc.py @@ -318,3 +318,8 @@ def keyterms(self): [('awesome', 0.32456160227748454), ('capital', 0.32456160227748454), ('Amsterdam', 0.17543839772251532)] """ return self.extract_keyterms() + + @functools.lru_cache() + def extract_keywords(self,keyword_list:list): + from flashtext import KeywordProcessor + return KeywordProcessor().add_keywords_from_list(keyword_list).extract_keywords(self.raw) From a00fc4f6a686e07b7105eafd59efabf27d512b82 Mon Sep 17 00:00:00 2001 From: Robin <rdoume@gmail.com> Date: Sat, 6 Apr 2019 19:44:32 +0200 Subject: [PATCH 034/496] Add first ReadTheDoc batch --- docs/index.rst | 60 ++++++++++++-- docs/modules.rst | 7 ++ docs/nautilus_nlp.config.rst | 22 ++++++ docs/nautilus_nlp.data.rst | 22 ++++++ docs/nautilus_nlp.features.rst | 22 ++++++ docs/nautilus_nlp.models.rst | 70 +++++++++++++++++ docs/nautilus_nlp.rst | 42 ++++++++++ docs/nautilus_nlp.utils.rst | 118 ++++++++++++++++++++++++++++ docs/nautilus_nlp.visualization.rst | 22 ++++++ 9 files changed, 379 insertions(+), 6 deletions(-) create mode 100644 docs/modules.rst create mode 100644 docs/nautilus_nlp.config.rst create mode 100644 docs/nautilus_nlp.data.rst create mode 100644 docs/nautilus_nlp.features.rst create mode 100644 docs/nautilus_nlp.models.rst create mode 100644 docs/nautilus_nlp.rst create mode 100644 docs/nautilus_nlp.utils.rst create mode 100644 docs/nautilus_nlp.visualization.rst diff --git a/docs/index.rst b/docs/index.rst index 24fb567..91dd094 100644 --- a/docs/index.rst +++ b/docs/index.rst @@ -1,20 +1,68 @@ -.. Nautilus_NLP documentation master file, created by - sphinx-quickstart on Tue Mar 12 12:24:48 2019. - You can adapt this file completely to your liking, but it should at least - contain the root `toctree` directive. -Welcome to Nautilus_NLP's documentation! + +Welcome to Nautilus_nlp's documentation! ======================================== +The Nautilus NLP library aimed to be a meta-library to be used to help you get started on handling your NLP use-case. + +This library can help you with: + + 1. Cleaning text data + 2. Normalizing your dataset + 3. Training automatically multiclass, multilabel classifier + 4. Help you discover topics and cluster your data + + +# Feature Request + +As an Artefact user, you might be working on a NLP use case, and wish to use Nautilus. + + However, if you think Nautilus is lacking features that can be useful not only to your use case but also others, feel free to to fill up an issue with the label "Feature-request". + + We will try to put it in the roadmap and implement it as soon as possible. + +# Installation + +Beware, this package has been tested on Python **3.6** & **3.7**, and will probably not be working under python **2.7** as **Python2.7** EOL is scheduled for December 2019. + +To install this library you should first clone the repository: + +`git clone https://github.com/artefactory/nautilus_nlp/ && cd nautilus_nlp` + +**If you don't use the docker container, we strongly advise you to do these steps in a virtual environnement** + +First you need to install the required files: + +`pip install -r requirements.txt` + +then you can install it via pip: + +`pip install -e .` + + +.. toctree:: + :maxdepth: 2 + :caption: Preprocessing and utility functions: + + modules + .. toctree:: :maxdepth: 2 - :caption: Contents: + :caption: Preprocessing and utility functions: + nautilus_nlp.utils +.. toctree:: + :maxdepth: 2 + :caption: Machine learning: + + nautilus_nlp.models + Indices and tables ================== * :ref:`genindex` * :ref:`modindex` * :ref:`search` + diff --git a/docs/modules.rst b/docs/modules.rst new file mode 100644 index 0000000..26ca8ee --- /dev/null +++ b/docs/modules.rst @@ -0,0 +1,7 @@ +nautilus_nlp +============ + +.. toctree:: + :maxdepth: 4 + + nautilus_nlp diff --git a/docs/nautilus_nlp.config.rst b/docs/nautilus_nlp.config.rst new file mode 100644 index 0000000..8864121 --- /dev/null +++ b/docs/nautilus_nlp.config.rst @@ -0,0 +1,22 @@ +nautilus\_nlp.config package +============================ + +Submodules +---------- + +nautilus\_nlp.config.config module +---------------------------------- + +.. automodule:: nautilus_nlp.config.config + :members: + :undoc-members: + :show-inheritance: + + +Module contents +--------------- + +.. automodule:: nautilus_nlp.config + :members: + :undoc-members: + :show-inheritance: diff --git a/docs/nautilus_nlp.data.rst b/docs/nautilus_nlp.data.rst new file mode 100644 index 0000000..4b12cc2 --- /dev/null +++ b/docs/nautilus_nlp.data.rst @@ -0,0 +1,22 @@ +nautilus\_nlp.data package +========================== + +Submodules +---------- + +nautilus\_nlp.data.make\_dataset module +--------------------------------------- + +.. automodule:: nautilus_nlp.data.make_dataset + :members: + :undoc-members: + :show-inheritance: + + +Module contents +--------------- + +.. automodule:: nautilus_nlp.data + :members: + :undoc-members: + :show-inheritance: diff --git a/docs/nautilus_nlp.features.rst b/docs/nautilus_nlp.features.rst new file mode 100644 index 0000000..c4b764c --- /dev/null +++ b/docs/nautilus_nlp.features.rst @@ -0,0 +1,22 @@ +nautilus\_nlp.features package +============================== + +Submodules +---------- + +nautilus\_nlp.features.build\_features module +--------------------------------------------- + +.. automodule:: nautilus_nlp.features.build_features + :members: + :undoc-members: + :show-inheritance: + + +Module contents +--------------- + +.. automodule:: nautilus_nlp.features + :members: + :undoc-members: + :show-inheritance: diff --git a/docs/nautilus_nlp.models.rst b/docs/nautilus_nlp.models.rst new file mode 100644 index 0000000..ee38f75 --- /dev/null +++ b/docs/nautilus_nlp.models.rst @@ -0,0 +1,70 @@ +nautilus\_nlp.models package +============================ + +Submodules +---------- + +nautilus\_nlp.models.Fasttext\_classifier module +------------------------------------------------ + +.. automodule:: nautilus_nlp.models.Fasttext_classifier + :members: + :undoc-members: + :show-inheritance: + +nautilus\_nlp.models.Fasttext\_embedding module +----------------------------------------------- + +.. automodule:: nautilus_nlp.models.Fasttext_embedding + :members: + :undoc-members: + :show-inheritance: + +nautilus\_nlp.models.Language\_detector module +---------------------------------------------- + +.. automodule:: nautilus_nlp.models.Language_detector + :members: + :undoc-members: + :show-inheritance: + +nautilus\_nlp.models.Sentiment\_detector module +----------------------------------------------- + +.. automodule:: nautilus_nlp.models.Sentiment_detector + :members: + :undoc-members: + :show-inheritance: + +nautilus\_nlp.models.Spacy\_model module +---------------------------------------- + +.. automodule:: nautilus_nlp.models.Spacy_model + :members: + :undoc-members: + :show-inheritance: + +nautilus\_nlp.models.sentiment module +------------------------------------- + +.. automodule:: nautilus_nlp.models.sentiment + :members: + :undoc-members: + :show-inheritance: + +nautilus\_nlp.models.sk\_vectorizer module +------------------------------------------ + +.. automodule:: nautilus_nlp.models.sk_vectorizer + :members: + :undoc-members: + :show-inheritance: + + +Module contents +--------------- + +.. automodule:: nautilus_nlp.models + :members: + :undoc-members: + :show-inheritance: diff --git a/docs/nautilus_nlp.rst b/docs/nautilus_nlp.rst new file mode 100644 index 0000000..e240841 --- /dev/null +++ b/docs/nautilus_nlp.rst @@ -0,0 +1,42 @@ +nautilus\_nlp package +===================== + +Subpackages +----------- + +.. toctree:: + + nautilus_nlp.config + nautilus_nlp.data + nautilus_nlp.features + nautilus_nlp.models + nautilus_nlp.utils + nautilus_nlp.visualization + +Submodules +---------- + +nautilus\_nlp.corpus module +--------------------------- + +.. automodule:: nautilus_nlp.corpus + :members: + :undoc-members: + :show-inheritance: + +nautilus\_nlp.doc module +------------------------ + +.. automodule:: nautilus_nlp.doc + :members: + :undoc-members: + :show-inheritance: + + +Module contents +--------------- + +.. automodule:: nautilus_nlp + :members: + :undoc-members: + :show-inheritance: diff --git a/docs/nautilus_nlp.utils.rst b/docs/nautilus_nlp.utils.rst new file mode 100644 index 0000000..1b9e43a --- /dev/null +++ b/docs/nautilus_nlp.utils.rst @@ -0,0 +1,118 @@ +nautilus\_nlp.utils package +=========================== + +Submodules +---------- + +nautilus\_nlp.utils.Text\_processor module +------------------------------------------ + +.. automodule:: nautilus_nlp.utils.Text_processor + :members: + :undoc-members: + :show-inheritance: + +nautilus\_nlp.utils.compat module +--------------------------------- + +.. automodule:: nautilus_nlp.utils.compat + :members: + :undoc-members: + :show-inheritance: + +nautilus\_nlp.utils.constants module +------------------------------------ + +.. automodule:: nautilus_nlp.utils.constants + :members: + :undoc-members: + :show-inheritance: + +nautilus\_nlp.utils.emoji module +-------------------------------- + +.. automodule:: nautilus_nlp.utils.emoji + :members: + :undoc-members: + :show-inheritance: + +nautilus\_nlp.utils.encoding module +----------------------------------- + +.. automodule:: nautilus_nlp.utils.encoding + :members: + :undoc-members: + :show-inheritance: + +nautilus\_nlp.utils.export module +--------------------------------- + +.. automodule:: nautilus_nlp.utils.export + :members: + :undoc-members: + :show-inheritance: + +nautilus\_nlp.utils.file\_loader module +--------------------------------------- + +.. automodule:: nautilus_nlp.utils.file_loader + :members: + :undoc-members: + :show-inheritance: + +nautilus\_nlp.utils.lemmatizer module +------------------------------------- + +.. automodule:: nautilus_nlp.utils.lemmatizer + :members: + :undoc-members: + :show-inheritance: + +nautilus\_nlp.utils.preprocess module +------------------------------------- + +.. automodule:: nautilus_nlp.utils.preprocess + :members: + :undoc-members: + :show-inheritance: + +nautilus\_nlp.utils.stemmer module +---------------------------------- + +.. automodule:: nautilus_nlp.utils.stemmer + :members: + :undoc-members: + :show-inheritance: + +nautilus\_nlp.utils.text\_vectorizer module +------------------------------------------- + +.. automodule:: nautilus_nlp.utils.text_vectorizer + :members: + :undoc-members: + :show-inheritance: + +nautilus\_nlp.utils.tokenizer module +------------------------------------ + +.. automodule:: nautilus_nlp.utils.tokenizer + :members: + :undoc-members: + :show-inheritance: + +nautilus\_nlp.utils.vector\_similarity module +--------------------------------------------- + +.. automodule:: nautilus_nlp.utils.vector_similarity + :members: + :undoc-members: + :show-inheritance: + + +Module contents +--------------- + +.. automodule:: nautilus_nlp.utils + :members: + :undoc-members: + :show-inheritance: diff --git a/docs/nautilus_nlp.visualization.rst b/docs/nautilus_nlp.visualization.rst new file mode 100644 index 0000000..3f312ce --- /dev/null +++ b/docs/nautilus_nlp.visualization.rst @@ -0,0 +1,22 @@ +nautilus\_nlp.visualization package +=================================== + +Submodules +---------- + +nautilus\_nlp.visualization.visualize module +-------------------------------------------- + +.. automodule:: nautilus_nlp.visualization.visualize + :members: + :undoc-members: + :show-inheritance: + + +Module contents +--------------- + +.. automodule:: nautilus_nlp.visualization + :members: + :undoc-members: + :show-inheritance: From fbea78a1ef48a973d39622e60f6765d142f7f826 Mon Sep 17 00:00:00 2001 From: Robin <rdoume@gmail.com> Date: Sat, 6 Apr 2019 20:04:48 +0200 Subject: [PATCH 035/496] Add dynamic versioning in the setup.py --- requirements.txt | 34 ++++++++++++++++++---------------- setup.py | 32 +++++++++++++++++++++++++++++++- 2 files changed, 49 insertions(+), 17 deletions(-) diff --git a/requirements.txt b/requirements.txt index 869399b..f11e5fa 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,5 +1,4 @@ # local package --e . # external requirements click @@ -12,18 +11,21 @@ pillow pytest #library requirements -spacy==2.1 -scikit-learn>=0.17.0 -ftfy>=4.2.0,<5.0.0 -wordcloud>=1.5.0 -matplotlib>=3.0.3 -chardet -nltk -mosestokenizer --e git://github.com/ClaudeCoulombe/FrenchLefffLemmatizer.git#egg=french_lefff_lemmatizer -stopwords -textblob -textblob_fr -vaderSentiment -stop_words -cld2_cffi~=0.1 +numpy>1.15.4 +stop_words==2018.7.23 +nltk==3.4 +textblob==0.15.3 +textblob_fr==0.2.0 +spacy==2.1.0 +cld2_cffi==0.1.4 +matplotlib==3.0.3 +pandas==0.23.4 +chardet==3.0.4 +setuptools==40.8.0 +ftfy==4.4.3 +textacy==0.6.3 +wordcloud==1.5.0 +#fastText==0.8.3 +gensim==3.7.1 +scikit_learn==0.20.3 +vaderSentiment==3.2.1 \ No newline at end of file diff --git a/setup.py b/setup.py index 509349e..5b02f87 100644 --- a/setup.py +++ b/setup.py @@ -1,10 +1,40 @@ from setuptools import find_packages, setup +import setuptools +import setuptools.command.install +from pathlib import Path + +class PostInstallCommand(setuptools.command.install.install): + """Post-installation command.""" + def run(self): + setuptools.command.install.install.run(self) + try: + import spacy + spacy.cli.validate() + except ModuleNotFoundError: + pass + + +with open(Path(__file__).resolve().parent.joinpath('requirements.txt'), 'r') as fh: + requirements = [r.split('#', 1)[0].strip() for r in fh.read().split('\n')] + print(requirements) +with open(Path(__file__).resolve().parent.joinpath('VERSION'), 'r') as fh: + version = fh.read() setup( name='nautilus_nlp', packages=find_packages(), - version='0.1.0', + version=version, description='All the goto functions you need to handle NLP use-cases', author='Robin Doumerc', license='MIT', + url='https://github.com/artefactory/nautilus-nlp', + classifiers=[ + 'Programming Language :: Python :: 3.6', + 'License :: OSI Approved :: MIT License', + 'Operating System :: OS Independent', + ], + install_requires=requirements, + cmdclass={ + 'install': PostInstallCommand, + }, ) From 1da5b530f294b136b7d79d60a953e325e4195395 Mon Sep 17 00:00:00 2001 From: Robin <rdoume@gmail.com> Date: Sat, 6 Apr 2019 20:05:31 +0200 Subject: [PATCH 036/496] Preprocessing tests --- tests/test_preprocessor.py | 22 ++++++++++++++-------- 1 file changed, 14 insertions(+), 8 deletions(-) diff --git a/tests/test_preprocessor.py b/tests/test_preprocessor.py index 17ba489..9a83c2c 100644 --- a/tests/test_preprocessor.py +++ b/tests/test_preprocessor.py @@ -1,15 +1,21 @@ import pytest import numpy as np -from nautilus_nlp.utils.preprocess import (remove_multiple_spaces_and_strip_text, remove_accents) +from nautilus_nlp.utils.preprocess import ( + remove_multiple_spaces_and_strip_text, + remove_accents, +) -@pytest.mark.parametrize("input_str, expected_str", [ - ("hello world", "hello world"), - ("\n hello world ", "hello world"), - ("----- hello\tworld *****", "hello world"), - ("hello-world", "hello-world"), - ("hello - world", "hello world") -]) +@pytest.mark.parametrize( + "input_str, expected_str", + [ + ("hello world", "hello world"), + ("\n hello world ", "hello world"), + ("----- hello\tworld *****", "hello world"), + ("hello-world", "hello-world"), + ("hello - world", "hello world"), + ], +) def test_remove_multiple_spaces_and_strip_text(input_str, expected_str): result = remove_multiple_spaces_and_strip_text(input_str) np.testing.assert_string_equal(result, expected_str) From 9fff71ce6e7cb806743f051e36d980cdc01a871d Mon Sep 17 00:00:00 2001 From: Robin <rdoume@gmail.com> Date: Sat, 6 Apr 2019 20:05:42 +0200 Subject: [PATCH 037/496] Configuration files for documentation --- docs/conf.py | 35 ++++++++++++++++------------------- 1 file changed, 16 insertions(+), 19 deletions(-) diff --git a/docs/conf.py b/docs/conf.py index 5d67dbc..43b0a98 100644 --- a/docs/conf.py +++ b/docs/conf.py @@ -12,21 +12,21 @@ # add these directories to sys.path here. If the directory is relative to the # documentation root, use os.path.abspath to make it absolute, like shown here. # -# import os -# import sys -# sys.path.insert(0, os.path.abspath('.')) +import os +import sys +sys.path.insert(0, os.path.abspath('../')) # -- Project information ----------------------------------------------------- -project = 'Nautilus_NLP' +project = 'Nautilus_nlp' copyright = '2019, Robin Doumerc' author = 'Robin Doumerc' # The short X.Y version -version = '' +version = '0.1.0' # The full version, including alpha/beta/rc tags -release = '0.1.0' +release = '' # -- General configuration --------------------------------------------------- @@ -41,18 +41,21 @@ extensions = [ 'sphinx.ext.autodoc', 'sphinx.ext.doctest', - 'sphinx.ext.intersphinx', + 'sphinx.ext.autosummary', 'sphinx.ext.todo', 'sphinx.ext.coverage', 'sphinx.ext.imgmath', 'sphinx.ext.ifconfig', 'sphinx.ext.viewcode', 'sphinx.ext.githubpages', + 'sphinx.ext.napoleon' ] # Add any paths that contain templates here, relative to this directory. templates_path = ['_templates'] +autodoc_default_flags=['members'] +autosummary_generate=True # The suffix(es) of source filenames. # You can specify multiple suffix as a list of string: # @@ -83,8 +86,7 @@ # The theme to use for HTML and HTML Help pages. See the documentation for # a list of builtin themes. # -html_theme = 'alabaster' - +html_theme = 'sphinx_rtd_theme' # Theme options are theme-specific and customize the look and feel of a theme # further. For a list of options available for each theme, see the # documentation. @@ -110,7 +112,7 @@ # -- Options for HTMLHelp output --------------------------------------------- # Output file base name for HTML help builder. -htmlhelp_basename = 'Nautilus_NLPdoc' +htmlhelp_basename = 'Nautilus_nlpdoc' # -- Options for LaTeX output ------------------------------------------------ @@ -137,7 +139,7 @@ # (source start file, target name, title, # author, documentclass [howto, manual, or own class]). latex_documents = [ - (master_doc, 'Nautilus_NLP.tex', 'Nautilus\\_NLP Documentation', + (master_doc, 'Nautilus_nlp.tex', 'Nautilus\\_nlp Documentation', 'Robin Doumerc', 'manual'), ] @@ -147,7 +149,7 @@ # One entry per manual page. List of tuples # (source start file, name, description, authors, manual section). man_pages = [ - (master_doc, 'nautilus_nlp', 'Nautilus_NLP Documentation', + (master_doc, 'nautilus_nlp', 'Nautilus_nlp Documentation', [author], 1) ] @@ -158,8 +160,8 @@ # (source start file, target name, title, author, # dir menu entry, description, category) texinfo_documents = [ - (master_doc, 'Nautilus_NLP', 'Nautilus_NLP Documentation', - author, 'Nautilus_NLP', 'One line description of project.', + (master_doc, 'Nautilus_nlp', 'Nautilus_nlp Documentation', + author, 'Nautilus_nlp', 'One line description of project.', 'Miscellaneous'), ] @@ -184,11 +186,6 @@ # -- Extension configuration ------------------------------------------------- -# -- Options for intersphinx extension --------------------------------------- - -# Example configuration for intersphinx: refer to the Python standard library. -intersphinx_mapping = {'https://docs.python.org/': None} - # -- Options for todo extension ---------------------------------------------- # If true, `todo` and `todoList` produce output, else they produce nothing. From ba5a208e93239c01b18ed9c76d827625469239b1 Mon Sep 17 00:00:00 2001 From: Robin <rdoume@gmail.com> Date: Sat, 6 Apr 2019 20:07:01 +0200 Subject: [PATCH 038/496] Docstrings change --- nautilus_nlp/doc.py | 2 ++ nautilus_nlp/utils/file_loader.py | 20 ++++++++++---------- 2 files changed, 12 insertions(+), 10 deletions(-) diff --git a/nautilus_nlp/doc.py b/nautilus_nlp/doc.py index 9a23062..3187bef 100644 --- a/nautilus_nlp/doc.py +++ b/nautilus_nlp/doc.py @@ -51,6 +51,7 @@ def __init__( def language(self): """ Provided or detected language of a text + >>> from nautilus_nlp.doc import Doc >>> Doc('Test sentence for testing text').language 'en' @@ -168,6 +169,7 @@ def entities(self): def find_entities(self, model_name=None): """ Extract a list of the named entities in text, with the possibility of using a custom model. + >>> doc = Doc('Sentence for testing Google text') >>> doc.find_entities() [('Google', 'ORG')] diff --git a/nautilus_nlp/utils/file_loader.py b/nautilus_nlp/utils/file_loader.py index 7baa483..0dfcd48 100644 --- a/nautilus_nlp/utils/file_loader.py +++ b/nautilus_nlp/utils/file_loader.py @@ -3,7 +3,7 @@ import glob import re from os.path import isfile, isdir - +import json import logging logging.basicConfig(level=logging.INFO) @@ -48,11 +48,10 @@ def text_loader(filepath, encoding=None, detectencoding=True): def list_files(filepath:str): - ''' - inputs a filepath. + """ inputs a filepath. Outputs a list of filepath. - Supports regex - ''' + Supports regex""" + if isdir(filepath) and len(re.findall(r"[\w.]$",filepath)): filepath=filepath+'/*' if filepath.endswith('/'): @@ -61,11 +60,12 @@ def list_files(filepath:str): def documents_loader(filepath, encoding=None): - ''' - Input a filepath, a filepath with wildcard (eg. *.txt), - or a list of filepaths. - Output a string, or a dict of strings. - ''' + + """ + Input a filepath, a filepath with wildcard (eg. *.txt), + or a list of filepaths. + Output a string, or a dict of strings. + """ if type(filepath) is str: documents = list_files(filepath) From ea90315c6f6172dccefcd3b5650e35c1f1acee93 Mon Sep 17 00:00:00 2001 From: hugovasselin <waaaouu@gmail.com> Date: Sun, 7 Apr 2019 22:00:05 +0200 Subject: [PATCH 039/496] add scikit tfidf object --- nautilus_nlp/utils/text_vectorizer.py | 91 +++++++ notebooks/TF-IDF.ipynb | 353 ++++++++++++++++++++++++++ 2 files changed, 444 insertions(+) create mode 100644 notebooks/TF-IDF.ipynb diff --git a/nautilus_nlp/utils/text_vectorizer.py b/nautilus_nlp/utils/text_vectorizer.py index e9cad3d..4eca15f 100644 --- a/nautilus_nlp/utils/text_vectorizer.py +++ b/nautilus_nlp/utils/text_vectorizer.py @@ -6,6 +6,97 @@ import numpy as np import math +from sklearn.feature_extraction.text import TfidfVectorizer, TfidfTransformer + + +class Tfidf(object): + """ + Inputs a list of string + Outputs a tuple with the wordcount vector matrix, and the list of feature name + Params: + input=’content’, encoding=’utf-8’, decode_error=’strict’, strip_accents=None, + lowercase=True, preprocessor=None, tokenizer=None, analyzer=’word’, + stop_words=None, token_pattern=’(?u)\b\w\w+\b’, ngram_range=(1, 1), + max_df=1.0, min_df=1, max_features=None, vocabulary=None, binary=False, + dtype=<class ‘numpy.float64’>, norm=’l2’, use_idf=True, smooth_idf=True, sublinear_tf=False + Wrapper of https://scikit-learn.org/stable/modules/generated/sklearn.feature_extraction.text.TfidfVectorizer.html + """ + + def __init__(self, **kwargs): + self.tfidf_vectorizer = TfidfVectorizer(**kwargs) + + def _compute_wordcount_vector(self, documents): + ''' + Input a list of documents (string) + Output the wordcount vector matrix + ''' + self.word_count_vector = self.tfidf_vectorizer.fit_transform(documents) + return self.word_count_vector + + + def _get_features_name(self): + self.feature_names = self.tfidf_vectorizer.get_feature_names() + return self.feature_names + + + def _compute_idf(self): + self.tfidf_transformer=TfidfTransformer(smooth_idf=True, use_idf=True) + self.tfidf_transformer.fit(self.word_count_vector) + return self.word_count_vector + + + def compute_tfidf(self, documents): + self._compute_wordcount_vector(documents) + self._get_features_name() + self._compute_idf() + return self.word_count_vector + + def _apply_tfidf_to_doc(self, text): + '''generate tf-idf for the given document''' + return self.tfidf_transformer.transform(self.tfidf_vectorizer.transform([text])) + + + def _sort_coo(self, coo_matrix): + '''sort the tf-idf vectors by descending order of scores''' + tuples = zip(coo_matrix.col, coo_matrix.data) + return sorted(tuples, key=lambda x: (x[1], x[0]), reverse=True) + + + def _extract_topn_from_vector(self, feature_names, sorted_items, topn=10): + """get the feature names and tf-idf score of top n items""" + + #use only topn items from vector + sorted_items = sorted_items[:topn] + + score_vals = [] + feature_vals = [] + + # word index and corresponding tf-idf score + for idx, score in sorted_items: + + #keep track of feature name and its corresponding score + score_vals.append(round(score, 3)) + feature_vals.append(feature_names[idx]) + + #create a tuples of feature,score + #results = zip(feature_vals,score_vals) + results= {} + for idx in range(len(feature_vals)): + results[feature_vals[idx]]=score_vals[idx] + + return results + + + def get_top_tfidf_per_doc(self, text, n=10): + '''compute TF-IDF for a given doc, and returns a list of the top N weighted words''' + tf_idf_vector= self._apply_tfidf_to_doc(text) + sorted_items=self._sort_coo(tf_idf_vector.tocoo()) + return list(self._extract_topn_from_vector(self.feature_names, sorted_items, n).keys()) + + def get_top_tfidf(self, n=10): + '''returns a dict of the top N weighted words, with their weight''' + return self._extract_topn_from_vector(self.feature_names, self._sort_coo(self.word_count_vector.tocoo()), topn=n) + class Text_Vectorizer: def __init__(self, doc_list): diff --git a/notebooks/TF-IDF.ipynb b/notebooks/TF-IDF.ipynb new file mode 100644 index 0000000..9e36e8b --- /dev/null +++ b/notebooks/TF-IDF.ipynb @@ -0,0 +1,353 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 1, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "import re" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "import pandas as pd\n", + "import json" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Open a dataset" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "df = pd.read_csv('../data/df_mess_analysed.csv',\n", + " encoding='utf8',\n", + " delimiter=';',\n", + " usecols=['chrn_gaz','stm_clean','offre']\n", + " )" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "df = df[(df.offre == 'DUAL') | (df.offre == 'GAZ')]" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "df.stm_clean = df.stm_clean.apply(lambda row: re.findall(\"\\w+\",row))" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "<div>\n", + "<style scoped>\n", + " .dataframe tbody tr th:only-of-type {\n", + " vertical-align: middle;\n", + " }\n", + "\n", + " .dataframe tbody tr th {\n", + " vertical-align: top;\n", + " }\n", + "\n", + " .dataframe thead th {\n", + " text-align: right;\n", + " }\n", + "</style>\n", + "<table border=\"1\" class=\"dataframe\">\n", + " <thead>\n", + " <tr style=\"text-align: right;\">\n", + " <th></th>\n", + " <th>offre</th>\n", + " <th>chrn_gaz</th>\n", + " <th>stm_clean</th>\n", + " </tr>\n", + " </thead>\n", + " <tbody>\n", + " <tr>\n", + " <th>0</th>\n", + " <td>DUAL</td>\n", + " <td>0</td>\n", + " <td>[mettr, jour, adress, palenci, bourg]</td>\n", + " </tr>\n", + " <tr>\n", + " <th>1</th>\n", + " <td>DUAL</td>\n", + " <td>0</td>\n", + " <td>[souhait, modifi, adress, mail, etre, contacte...</td>\n", + " </tr>\n", + " <tr>\n", + " <th>2</th>\n", + " <td>DUAL</td>\n", + " <td>0</td>\n", + " <td>[prochain, factur, disponibl, compt]</td>\n", + " </tr>\n", + " <tr>\n", + " <th>3</th>\n", + " <td>DUAL</td>\n", + " <td>0</td>\n", + " <td>[index, factur, aout, net, superieur, realit, ...</td>\n", + " </tr>\n", + " <tr>\n", + " <th>4</th>\n", + " <td>DUAL</td>\n", + " <td>0</td>\n", + " <td>[savoir, factur, annuel, pai]</td>\n", + " </tr>\n", + " </tbody>\n", + "</table>\n", + "</div>" + ], + "text/plain": [ + " offre chrn_gaz stm_clean\n", + "0 DUAL 0 [mettr, jour, adress, palenci, bourg]\n", + "1 DUAL 0 [souhait, modifi, adress, mail, etre, contacte...\n", + "2 DUAL 0 [prochain, factur, disponibl, compt]\n", + "3 DUAL 0 [index, factur, aout, net, superieur, realit, ...\n", + "4 DUAL 0 [savoir, factur, annuel, pai]" + ] + }, + "execution_count": 6, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "df.head()" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "list_of_docs = [' '.join(doc) for doc in df.stm_clean.tolist()]" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": { + "scrolled": true + }, + "outputs": [ + { + "data": { + "text/plain": [ + "['mettr jour adress palenci bourg',\n", + " 'souhait modifi adress mail etre contacte servic cel nadiyaa545 gmail prendr cel compt dorenavent',\n", + " 'prochain factur disponibl compt']" + ] + }, + "execution_count": 8, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "list_of_docs[:3]" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Compute TF-IDF" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": {}, + "outputs": [], + "source": [ + "from nautilus_nlp.utils.text_vectorizer import Tfidf" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": {}, + "outputs": [], + "source": [ + "tfidf = Tfidf(max_df=0.95, #ignore terms that have a document frequency strictly higher \n", + " min_df=0.01,\n", + " max_features=10000,\n", + " encoding='utf-8',\n", + " #stop_words=SW,\n", + " norm=None,\n", + " #ngram_range=(1, 2))\n", + " )\n" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "TfidfVectorizer(analyzer='word', binary=False, decode_error='strict',\n", + " dtype=<class 'numpy.float64'>, encoding='utf-8', input='content',\n", + " lowercase=True, max_df=0.95, max_features=10000, min_df=0.01,\n", + " ngram_range=(1, 1), norm=None, preprocessor=None, smooth_idf=True,\n", + " stop_words=None, strip_accents=None, sublinear_tf=False,\n", + " token_pattern='(?u)\\\\b\\\\w\\\\w+\\\\b', tokenizer=None, use_idf=True,\n", + " vocabulary=None)" + ] + }, + "execution_count": 11, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# uses Sci-kit learn TfidfVectorizer()\n", + "# You can pass all the arguments supported by sci-kit \n", + "# Doc : https://scikit-learn.org/stable/modules/generated/sklearn.feature_extraction.text.TfidfVectorizer.html\n", + "tfidf.tfidf_vectorizer" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "<17744x434 sparse matrix of type '<class 'numpy.float64'>'\n", + "\twith 300349 stored elements in Compressed Sparse Row format>" + ] + }, + "execution_count": 12, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# Compute the word count vector matrix.\n", + "tfidf.compute_tfidf(list_of_docs)" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "metadata": { + "scrolled": true + }, + "outputs": [ + { + "data": { + "text/plain": [ + "{'euro': 96.099,\n", + " 'rembours': 116.797,\n", + " 'adress': 115.531,\n", + " 'compt': 89.231,\n", + " 'coupur': 87.871,\n", + " 'chequ': 82.334,\n", + " 'mois': 81.935}" + ] + }, + "execution_count": 13, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# Get highest-weighted words\n", + "tfidf.get_top_tfidf()" + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "metadata": { + "scrolled": true + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "['mettr', 'adress', 'jour']\n", + "['cel', 'prendr', 'modifi', 'adress', 'mail', 'servic', 'etre', 'compt', 'souhait']\n", + "['disponibl', 'prochain', 'compt', 'factur']\n", + "['index', 'modif', 'modifi', 'lign', 'prochain', 'aout', 'electricit', 'pouv', 'prelev', 'factur']\n", + "['annuel', 'savoir', 'pai', 'factur']\n", + "['disponibl', 'ete', 'concern', 'relev', 'compteur', 'demand']\n", + "['acce', 'juin', 'plait', 'avanc', 'envoi', 'compt', 'mois', 'factur']\n", + "['conso', 'reel', 'communiqu', 'vient', 'met', 'relev', 'argent', 'conseiller', 'repondu', 'connaitr']\n", + "['nest', 'point', 'lappliqu', 'effect', 'sup', 'appliqu', 'vrai', 'toujour', 'arriv', 'souc']\n", + "['mensuel', 'pai', 'prelev']\n" + ] + } + ], + "source": [ + "# Get highest-weighted words per document\n", + "for doc in list_of_docs[:10]:\n", + " print(tfidf.get_top_tfidf_per_doc(doc))" + ] + } + ], + "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.7.0" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} From 09c5acdf0afe4e10beaa96f83c9daca73950d6a8 Mon Sep 17 00:00:00 2001 From: hugovasselin <waaaouu@gmail.com> Date: Sun, 7 Apr 2019 23:52:42 +0200 Subject: [PATCH 040/496] add pytest cache --- .gitignore | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.gitignore b/.gitignore index d9525e2..83457f9 100644 --- a/.gitignore +++ b/.gitignore @@ -93,3 +93,6 @@ target/ *.gz *.ftz !/nautilus_nlp/data/lang_identification.ftz + +# PyTest cache +.pytest_cache/ \ No newline at end of file From bd7e07a52ee3259fe8f9d8989ecb920662e94e69 Mon Sep 17 00:00:00 2001 From: hugovasselin <waaaouu@gmail.com> Date: Sun, 7 Apr 2019 23:54:12 +0200 Subject: [PATCH 041/496] enhancements --- ...t files loader with encoding handler.ipynb | 40 ++++++++++++++----- 1 file changed, 31 insertions(+), 9 deletions(-) diff --git a/notebooks/Text files loader with encoding handler.ipynb b/notebooks/Text files loader with encoding handler.ipynb index ea034dd..24cc875 100644 --- a/notebooks/Text files loader with encoding handler.ipynb +++ b/notebooks/Text files loader with encoding handler.ipynb @@ -199,7 +199,7 @@ }, { "cell_type": "code", - "execution_count": 12, + "execution_count": 22, "metadata": {}, "outputs": [ { @@ -218,7 +218,7 @@ " 'someadditionalfile.txt': 'Un deuxième exemple de texte en utf-8 cette fois!'}" ] }, - "execution_count": 12, + "execution_count": 22, "metadata": {}, "output_type": "execute_result" } @@ -261,7 +261,7 @@ }, { "cell_type": "code", - "execution_count": 14, + "execution_count": 21, "metadata": {}, "outputs": [ { @@ -280,7 +280,7 @@ " 'Un deuxième exemple de texte en utf-8 cette fois!']" ] }, - "execution_count": 14, + "execution_count": 21, "metadata": {}, "output_type": "execute_result" } @@ -299,7 +299,7 @@ }, { "cell_type": "code", - "execution_count": 7, + "execution_count": 24, "metadata": { "collapsed": true }, @@ -339,22 +339,44 @@ }, { "cell_type": "code", - "execution_count": 9, + "execution_count": 28, "metadata": {}, "outputs": [ { "data": { "text/plain": [ - "['./Open a file, a list of files and detect encoding.ipynb',\n", + "['../tests/testfolder_fileloader/./testdoc_utf8.txt',\n", + " '../tests/testfolder_fileloader/./testdoc_latin1.txt']" + ] + }, + "execution_count": 28, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "list_files('../tests/testfolder_fileloader/.')" + ] + }, + { + "cell_type": "code", + "execution_count": 26, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "['./TF-IDF.ipynb',\n", " './Visualization tools.ipynb',\n", " './Language_identification.ipynb',\n", " './Common Text Processing operations.ipynb',\n", " './Sentiment_analysis_FT.ipynb',\n", + " './Text files loader with encoding handler.ipynb',\n", " './Spacy_model.ipynb',\n", " './Sentiment analysis using pre-trained models.ipynb']" ] }, - "execution_count": 9, + "execution_count": 26, "metadata": {}, "output_type": "execute_result" } @@ -396,7 +418,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "## detect encoding " + "## Detect encoding " ] }, { From 05da1f8379fde99d7bc1e451f7b934657d70f24a Mon Sep 17 00:00:00 2001 From: hugovasselin <waaaouu@gmail.com> Date: Mon, 8 Apr 2019 00:02:10 +0200 Subject: [PATCH 042/496] add asdict + tests --- nautilus_nlp/utils/file_loader.py | 26 ++++++++--- tests/test_document_loader.py | 72 +++++++++++++++++++++++++++++++ tests/test_preprocessor.py | 1 + 3 files changed, 94 insertions(+), 5 deletions(-) create mode 100644 tests/test_document_loader.py diff --git a/nautilus_nlp/utils/file_loader.py b/nautilus_nlp/utils/file_loader.py index 7baa483..562083e 100644 --- a/nautilus_nlp/utils/file_loader.py +++ b/nautilus_nlp/utils/file_loader.py @@ -38,13 +38,15 @@ def text_loader(filepath, encoding=None, detectencoding=True): try: return open_textfile(filepath, encoding='utf-8') except UnicodeDecodeError: - logging.warning('Encoding is not UTF-8.') + logging.warning('Encoding for {} is not UTF-8.'.format(filepath)) if detectencoding is True: logging.warning('Trying to detect encoding for {}'.format(filepath)) detected_encoding = detect_encoding(filepath) - logging.info('detected encoding is {encod}, with a confidence rate of {conf_rate}'.format(encod=detected_encoding['encoding'], + logging.info('{filepath}: detected encoding is {encod}, with a confidence rate of {conf_rate}'.format(filepath=filepath, encod=detected_encoding['encoding'], conf_rate=detected_encoding['confidence'])) return open_textfile(filepath, encoding=detected_encoding['encoding']) + else: + raise UnicodeDecodeError('Cannot load document using utf-8. Try to detect encoding using detectencoding=True') def list_files(filepath:str): @@ -60,11 +62,20 @@ def list_files(filepath:str): return[file for file in glob.glob(filepath) if isfile(file)] -def documents_loader(filepath, encoding=None): +def documents_loader(filepath:str, encoding=None, detectencoding=True, output_as='dict'): ''' Input a filepath, a filepath with wildcard (eg. *.txt), or a list of filepaths. Output a string, or a dict of strings. + Args: + filepath: filepath, a filepath with wildcard (eg. *.txt), + or a list of filepaths. + output_as: list or dict. If dict, key will be the filename. + encoding: if not specified, will try to detect encoding except if + detectencoding is false. + detectencoding: if True and if encoding is not specified, will try to + detect encoding using chardet. + ''' if type(filepath) is str: @@ -77,9 +88,14 @@ def documents_loader(filepath, encoding=None): raise IOError('Please enter a valid filepath or a valid list of filepath') if nb_of_documents == 1: - return text_loader(documents[0],encoding=encoding) + return text_loader(documents[0],encoding=encoding, detectencoding=detectencoding) elif nb_of_documents > 1: - return { document : text_loader(documents[0], encoding=encoding) for document in documents} + if output_as == 'list': + return [text_loader(document, encoding=encoding, detectencoding=detectencoding) for document in documents] + elif output_as == 'dict': + return { document : text_loader(document, encoding=encoding, detectencoding=detectencoding) for document in documents} + else: + raise ValueError('Enter a valid output format between list or dict') else: raise IOError('No files detected in {}'.format(filepath)) diff --git a/tests/test_document_loader.py b/tests/test_document_loader.py new file mode 100644 index 0000000..2868be8 --- /dev/null +++ b/tests/test_document_loader.py @@ -0,0 +1,72 @@ +import pytest +import numpy as np +from nautilus_nlp.utils.file_loader import documents_loader, list_files, detect_encoding + + +testdoc_latin1 = "J'aime les frites bien grasse étalon châpeau!" +encoded_s = testdoc_latin1.encode('latin-1') +with open('tests/testfolder_fileloader/testdoc_latin1.txt', 'wb') as f: + f.write(encoded_s) + +testdoc_utf8 = "Un deuxième exemple de texte en utf-8 cette fois!" +encoded_s = testdoc_utf8.encode('utf-8') +with open('tests/testfolder_fileloader/testdoc_utf8.txt', 'wb') as f: + f.write(encoded_s) + + +def test_openfile_with_encoding(): + input_str = "tests/testfolder_fileloader/testdoc_latin1.txt" + expected_str = testdoc_latin1 + + result = documents_loader(input_str, encoding='latin-1') + np.testing.assert_string_equal(result, expected_str) + +def test_openfile_utf8(): + input_str = "tests/testfolder_fileloader/testdoc_utf8.txt" + expected_str = testdoc_utf8 + + result = documents_loader(input_str) + np.testing.assert_string_equal(result, expected_str) + +def test_encoding_detection(): + input_str = "tests/testfolder_fileloader/testdoc_latin1.txt" + expected_str = testdoc_latin1 + + result = documents_loader(input_str) + np.testing.assert_string_equal(result, expected_str) + +def test_load_several_docs_wildcard(): + expected = {'tests/testfolder_fileloader/testdoc_latin1.txt': "J'aime les frites bien grasse étalon châpeau!", + 'tests/testfolder_fileloader/testdoc_utf8.txt': 'Un deuxième exemple de texte en utf-8 cette fois!'} + result = documents_loader('tests/testfolder_fileloader/*.txt', output_as='dict') + np.testing.assert_equal(result, expected) + +def test_load_several_docs_list(): + expected = {'tests/testfolder_fileloader/testdoc_latin1.txt': "J'aime les frites bien grasse étalon châpeau!", + 'tests/testfolder_fileloader/testdoc_utf8.txt': 'Un deuxième exemple de texte en utf-8 cette fois!'} + result = documents_loader(['tests/testfolder_fileloader/testdoc_latin1.txt','tests/testfolder_fileloader/testdoc_utf8.txt'], output_as='dict') + np.testing.assert_equal(result, expected) + + +def test_load_several_docs_output_list(): + expected = ["J'aime les frites bien grasse étalon châpeau!", + 'Un deuxième exemple de texte en utf-8 cette fois!'] + result = documents_loader(['tests/testfolder_fileloader/testdoc_latin1.txt','tests/testfolder_fileloader/testdoc_utf8.txt'], output_as='list') + return len(expected) == len(result) and sorted(expected) == sorted(result) + + + +@pytest.mark.parametrize("input_filepath", ['tests/testfolder_fileloader/*.txt','tests/testfolder_fileloader/','tests/testfolder_fileloader']) +def test_list_files(input_filepath): + expected = ['tests/testfolder_fileloader/testdoc_latin1.txt','tests/testfolder_fileloader/testdoc_utf8.txt'] + result = list_files(input_filepath) + + return len(expected) == len(result) and sorted(expected) == sorted(result) + + +def test_detect_encoding(): + expected = {'encoding': 'ISO-8859-1', 'confidence': 0.73, 'language': ''} + result = detect_encoding('tests/testfolder_fileloader/testdoc_latin1.txt') + + np.testing.assert_equal(result, expected) + diff --git a/tests/test_preprocessor.py b/tests/test_preprocessor.py index 17ba489..8ed937f 100644 --- a/tests/test_preprocessor.py +++ b/tests/test_preprocessor.py @@ -10,6 +10,7 @@ ("hello-world", "hello-world"), ("hello - world", "hello world") ]) + def test_remove_multiple_spaces_and_strip_text(input_str, expected_str): result = remove_multiple_spaces_and_strip_text(input_str) np.testing.assert_string_equal(result, expected_str) From 1cc5b08b8ce5589b87acd1a5860c096c074bb3f0 Mon Sep 17 00:00:00 2001 From: Robin <rdoume@gmail.com> Date: Mon, 8 Apr 2019 13:54:51 +0200 Subject: [PATCH 043/496] minor preprocess change --- nautilus_nlp/utils/Text_processor.py | 2 +- nautilus_nlp/utils/lemmatizer.py | 4 ++-- nautilus_nlp/utils/preprocess.py | 12 +++++++++++- 3 files changed, 14 insertions(+), 4 deletions(-) diff --git a/nautilus_nlp/utils/Text_processor.py b/nautilus_nlp/utils/Text_processor.py index 6301af7..312af0f 100644 --- a/nautilus_nlp/utils/Text_processor.py +++ b/nautilus_nlp/utils/Text_processor.py @@ -42,7 +42,7 @@ def __init__(self, lang: str): def lemmatize(self, text: str): return text - def stem(self, tokens_list: list, lang: str = lang: + def stem(self, tokens_list: list, lang: str = lang): return stem_tokens(tokens_list, lang='english') def remove_stopwords(self, text: str): diff --git a/nautilus_nlp/utils/lemmatizer.py b/nautilus_nlp/utils/lemmatizer.py index 2e64b8d..5583388 100644 --- a/nautilus_nlp/utils/lemmatizer.py +++ b/nautilus_nlp/utils/lemmatizer.py @@ -7,14 +7,14 @@ from nltk.corpus import wordnet try: - french_spacy = spacy.load('fr') + french_spacy = spacy.load('fr_core_news_sm') except OSError: raise OSError("""You must install French langage to use SpaCy. python -m spacy download fr See https://spacy.io/usage/ for details """) try: - english_spacy = spacy.load('en') + english_spacy = spacy.load('en_core_web_sm') except OSError: raise OSError("""You must install english langage to use SpaCy. python -m spacy download en diff --git a/nautilus_nlp/utils/preprocess.py b/nautilus_nlp/utils/preprocess.py index 13f7898..cc3c0ee 100644 --- a/nautilus_nlp/utils/preprocess.py +++ b/nautilus_nlp/utils/preprocess.py @@ -243,13 +243,23 @@ def remove_accents(text, method="unicode") -> str: raise ValueError(msg) def remove_emoji(word): + """ + Remove emoji from any str by stripping any unicode in the range of Emoji unicode, + + Args: + word (str): raw word + Returns: + str + + """ RE_EMOJI = re.compile('[\U00010000-\U0010ffff]', flags=re.UNICODE) word = RE_EMOJI.sub(r'', word) return word def preprocess_text( text, + no_emoji=False, fix_unicode=False, lowercase=False, no_urls=False, @@ -305,7 +315,7 @@ def preprocess_text( if no_currency_symbols is True: text = replace_currency_symbols(text) if no_contractions is True: - text = unpack_contractions(text) + text = unpack_contractions_from_lang(text) if no_accents is True: text = remove_accents(text, method="unicode") if no_punct is True: From 2afbfc3b2f315be7e57e73b2753361403aff967c Mon Sep 17 00:00:00 2001 From: Robin <rdoume@gmail.com> Date: Mon, 8 Apr 2019 13:55:12 +0200 Subject: [PATCH 044/496] For merging --- ... a list of files and detect encoding.ipynb | 172 +++++++++++------- 1 file changed, 108 insertions(+), 64 deletions(-) diff --git a/notebooks/Open a file, a list of files and detect encoding.ipynb b/notebooks/Open a file, a list of files and detect encoding.ipynb index 8c26c57..b671acf 100644 --- a/notebooks/Open a file, a list of files and detect encoding.ipynb +++ b/notebooks/Open a file, a list of files and detect encoding.ipynb @@ -9,7 +9,7 @@ }, { "cell_type": "code", - "execution_count": 1, + "execution_count": 3, "metadata": { "collapsed": true }, @@ -38,7 +38,7 @@ }, { "cell_type": "code", - "execution_count": 2, + "execution_count": 4, "metadata": { "collapsed": true }, @@ -49,31 +49,19 @@ }, { "cell_type": "code", - "execution_count": 3, + "execution_count": 8, "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ - "WARNING:root:Encoding is not UTF-8.\n", - "WARNING:root:Trying to detect encoding for somefile.txt\n", - "INFO:root:detected encoding is ISO-8859-1, with a confidence rate of 0.73\n" + "WARNING:root:Encoding is not UTF-8.\n" ] - }, - { - "data": { - "text/plain": [ - "\"J'aime les frites bien grasse étalon châpeau!\"" - ] - }, - "execution_count": 3, - "metadata": {}, - "output_type": "execute_result" } ], "source": [ - "text_loader('somefile.txt')" + "_=text_loader('somefile.txt',detectencoding=False)" ] }, { @@ -92,7 +80,7 @@ }, { "cell_type": "code", - "execution_count": 4, + "execution_count": 10, "metadata": {}, "outputs": [ { @@ -101,7 +89,7 @@ "\"J'aime les frites bien grasse étalon châpeau!\"" ] }, - "execution_count": 4, + "execution_count": 10, "metadata": {}, "output_type": "execute_result" } @@ -119,7 +107,7 @@ }, { "cell_type": "code", - "execution_count": 5, + "execution_count": 11, "metadata": { "collapsed": true }, @@ -130,7 +118,7 @@ }, { "cell_type": "code", - "execution_count": 6, + "execution_count": 12, "metadata": {}, "outputs": [ { @@ -139,7 +127,7 @@ "{'encoding': 'ISO-8859-1', 'confidence': 0.73, 'language': ''}" ] }, - "execution_count": 6, + "execution_count": 12, "metadata": {}, "output_type": "execute_result" } @@ -157,7 +145,7 @@ }, { "cell_type": "code", - "execution_count": 7, + "execution_count": 13, "metadata": { "collapsed": true }, @@ -168,25 +156,29 @@ }, { "cell_type": "code", - "execution_count": 8, + "execution_count": 14, "metadata": {}, "outputs": [ { "data": { "text/plain": [ - "['./somefile.txt',\n", - " './Open a file, a list of files and detect encoding.ipynb',\n", - " './Visualization tools.ipynb',\n", + "['./Sentiment_analysis_FT.ipynb',\n", + " './Language_identification_with_FT.ipynb',\n", + " './somefile.txt',\n", + " './Sentiment analysis using pre-trained models.ipynb',\n", " './Language_identification.ipynb',\n", - " './someadditionalfile.txt',\n", - " './somefile',\n", - " './Common Text Processing operations.ipynb',\n", - " './Sentiment_analysis_FT.ipynb',\n", " './Spacy_model.ipynb',\n", - " './Sentiment analysis using pre-trained models.ipynb']" + " './Open a file, a list of files and detect encoding.ipynb',\n", + " './Untitled1.ipynb',\n", + " './cooking.ftz',\n", + " './GrandDebat.ipynb',\n", + " './Common Text Processing operations.ipynb',\n", + " './Untitled.ipynb',\n", + " './cooking.bin',\n", + " './Visualization tools.ipynb']" ] }, - "execution_count": 8, + "execution_count": 14, "metadata": {}, "output_type": "execute_result" } @@ -197,22 +189,26 @@ }, { "cell_type": "code", - "execution_count": 9, + "execution_count": 15, "metadata": {}, "outputs": [ { "data": { "text/plain": [ - "['./Open a file, a list of files and detect encoding.ipynb',\n", - " './Visualization tools.ipynb',\n", + "['./Sentiment_analysis_FT.ipynb',\n", + " './Language_identification_with_FT.ipynb',\n", + " './Sentiment analysis using pre-trained models.ipynb',\n", " './Language_identification.ipynb',\n", - " './Common Text Processing operations.ipynb',\n", - " './Sentiment_analysis_FT.ipynb',\n", " './Spacy_model.ipynb',\n", - " './Sentiment analysis using pre-trained models.ipynb']" + " './Open a file, a list of files and detect encoding.ipynb',\n", + " './Untitled1.ipynb',\n", + " './GrandDebat.ipynb',\n", + " './Common Text Processing operations.ipynb',\n", + " './Untitled.ipynb',\n", + " './Visualization tools.ipynb']" ] }, - "execution_count": 9, + "execution_count": 15, "metadata": {}, "output_type": "execute_result" } @@ -223,7 +219,7 @@ }, { "cell_type": "code", - "execution_count": 10, + "execution_count": 21, "metadata": { "scrolled": true }, @@ -231,23 +227,27 @@ { "data": { "text/plain": [ - "['/Users/hugo/Documents/NAUTILUS/nautilus-nlp/LICENSE',\n", - " '/Users/hugo/Documents/NAUTILUS/nautilus-nlp/requirements.txt',\n", - " '/Users/hugo/Documents/NAUTILUS/nautilus-nlp/Makefile',\n", - " '/Users/hugo/Documents/NAUTILUS/nautilus-nlp/README.md',\n", - " '/Users/hugo/Documents/NAUTILUS/nautilus-nlp/setup.py',\n", - " '/Users/hugo/Documents/NAUTILUS/nautilus-nlp/tox.ini',\n", - " '/Users/hugo/Documents/NAUTILUS/nautilus-nlp/test_environment.py']" + "['/home/robin/nautilus_nlp/requirements.txt',\n", + " '/home/robin/nautilus_nlp/test_environment.py',\n", + " '/home/robin/nautilus_nlp/Makefile',\n", + " '/home/robin/nautilus_nlp/setup.py',\n", + " '/home/robin/nautilus_nlp/download_spacy_models.sh',\n", + " '/home/robin/nautilus_nlp/Dockerfile',\n", + " '/home/robin/nautilus_nlp/LICENSE',\n", + " '/home/robin/nautilus_nlp/README.md',\n", + " '/home/robin/nautilus_nlp/tox.ini',\n", + " '/home/robin/nautilus_nlp/Untitled.ipynb',\n", + " '/home/robin/nautilus_nlp/VERSION']" ] }, - "execution_count": 10, + "execution_count": 21, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# only files will be printed, not folders\n", - "list_files('/Users/hugo/Documents/NAUTILUS/nautilus-nlp/')" + "list_files('/home/robin/nautilus_nlp/*')" ] }, { @@ -259,7 +259,7 @@ }, { "cell_type": "code", - "execution_count": 11, + "execution_count": 22, "metadata": { "collapsed": true }, @@ -274,7 +274,7 @@ }, { "cell_type": "code", - "execution_count": 12, + "execution_count": 23, "metadata": {}, "outputs": [], "source": [ @@ -283,7 +283,7 @@ }, { "cell_type": "code", - "execution_count": 13, + "execution_count": 28, "metadata": {}, "outputs": [ { @@ -297,7 +297,17 @@ "WARNING:root:Trying to detect encoding for somefile.txt\n", "INFO:root:detected encoding is ISO-8859-1, with a confidence rate of 0.73\n" ] - }, + } + ], + "source": [ + "_=documents_loader('*.txt')" + ] + }, + { + "cell_type": "code", + "execution_count": 29, + "metadata": {}, + "outputs": [ { "data": { "text/plain": [ @@ -305,18 +315,18 @@ " 'someadditionalfile.txt': \"J'aime les frites bien grasse étalon châpeau!\"}" ] }, - "execution_count": 13, + "execution_count": 29, "metadata": {}, "output_type": "execute_result" } ], "source": [ - "documents_loader('*.txt')" + "_" ] }, { "cell_type": "code", - "execution_count": 14, + "execution_count": 30, "metadata": {}, "outputs": [ { @@ -338,7 +348,7 @@ " 'someadditionalfile.txt': \"J'aime les frites bien grasse étalon châpeau!\"}" ] }, - "execution_count": 14, + "execution_count": 30, "metadata": {}, "output_type": "execute_result" } @@ -349,31 +359,65 @@ }, { "cell_type": "code", - "execution_count": 15, + "execution_count": 42, "metadata": {}, "outputs": [ { "data": { "text/plain": [ - "'Un deuxième exemple de texte en utf-8 cette fois!'" + "{'somefile.txt': \"J'aime les frites bien grasse étalon châpeau!\",\n", + " 'someadditionalfile.txt': \"J'aime les frites bien grasse étalon châpeau!\"}" ] }, - "execution_count": 15, + "execution_count": 42, "metadata": {}, "output_type": "execute_result" } ], "source": [ - "documents_loader('someadditionalfile.txt',encoding='utf-8')" + "json.loads(documents_loader('test.json',encoding='utf-8'))" ] }, { "cell_type": "code", - "execution_count": null, + "execution_count": 40, "metadata": { "collapsed": true }, "outputs": [], + "source": [ + "import json\n", + "\n", + "with open('test.json','r',encoding='utf-8') as fp:\n", + " __= json.load(fp)" + ] + }, + { + "cell_type": "code", + "execution_count": 41, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "{'somefile.txt': \"J'aime les frites bien grasse étalon châpeau!\",\n", + " 'someadditionalfile.txt': \"J'aime les frites bien grasse étalon châpeau!\"}" + ] + }, + "execution_count": 41, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "__" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [] } ], @@ -393,7 +437,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.7.0" + "version": "3.7.2" } }, "nbformat": 4, From cee696597a78b61eeaa700de66a67b706f27f682 Mon Sep 17 00:00:00 2001 From: Robin <rdoume@gmail.com> Date: Tue, 9 Apr 2019 10:14:58 +0200 Subject: [PATCH 045/496] Update readme organisation --- README.md | 11 +++-------- 1 file changed, 3 insertions(+), 8 deletions(-) diff --git a/README.md b/README.md index 32e323a..a05d090 100644 --- a/README.md +++ b/README.md @@ -62,7 +62,7 @@ Project Organization ├── notebooks <- Jupyter notebooks. Naming convention is a number (for ordering), │ the creator's initials, and a short `-` delimited description, e.g. │ `1.0-jqp-initial-data-exploration`. - │ + ├── tests <- Where the tests lives ├── references <- Data dictionaries, manuals, and all other explanatory materials. │ ├── reports <- Generated analysis as HTML, PDF, LaTeX, etc. @@ -76,17 +76,12 @@ Project Organization │ ├── __init__.py <- Makes nautilus_nlp a Python module │ │ │ ├── data <- Scripts to download or generate data - │ │ └── make_dataset.py │ │ - │ ├── features <- Scripts to turn raw data into features for modeling - │ │ └── build_features.py + │ ├── utils <- Scripts to turn raw data into features for modeling │ │ │ ├── models <- Scripts to train models and then use trained models to make │ │ │ predictions - │ │ ├── predict_model.py - │ │ └── train_model.py │ │ │ └── visualization <- Scripts to create exploratory and results oriented visualizations - │ └── visualize.py │ - └── tox.ini <- tox file with settings for running tox; see tox.testrun.org \ No newline at end of file + └── tox.ini <- tox file with settings for running tox; see tox.testrun.org From f5b51ea591f06a975ac247f4b43d3a05255a5ee6 Mon Sep 17 00:00:00 2001 From: William Jaubert <jaubert.william@gmail.com> Date: Wed, 10 Apr 2019 13:47:14 +0200 Subject: [PATCH 046/496] functions topic modeling gensim ldamodel added --- nautilus/bin/activate | 78 +++++++++++++ nautilus/bin/activate.csh | 42 +++++++ nautilus/bin/activate.fish | 101 +++++++++++++++++ nautilus/bin/activate.ps1 | 60 ++++++++++ nautilus/bin/activate_this.py | 46 ++++++++ nautilus/bin/easy_install | 10 ++ nautilus/bin/easy_install-2.7 | 10 ++ nautilus/bin/epylint | 10 ++ nautilus/bin/isort | 10 ++ nautilus/bin/pip | 10 ++ nautilus/bin/pip2 | 10 ++ nautilus/bin/pip2.7 | 10 ++ nautilus/bin/pylint | 10 ++ nautilus/bin/pyreverse | 10 ++ nautilus/bin/python | Bin 0 -> 8464 bytes nautilus/bin/python-config | 78 +++++++++++++ nautilus/bin/python2 | 1 + nautilus/bin/python2.7 | 1 + nautilus/bin/symilar | 10 ++ nautilus/bin/wheel | 10 ++ nautilus/include/python2.7 | 1 + nautilus_nlp/models/topic_modeling.py | 153 ++++++++++++++++++++++++++ requirements.txt | 8 +- src/french-lefff-lemmatizer | 1 + 24 files changed, 679 insertions(+), 1 deletion(-) create mode 100644 nautilus/bin/activate create mode 100644 nautilus/bin/activate.csh create mode 100644 nautilus/bin/activate.fish create mode 100644 nautilus/bin/activate.ps1 create mode 100644 nautilus/bin/activate_this.py create mode 100755 nautilus/bin/easy_install create mode 100755 nautilus/bin/easy_install-2.7 create mode 100755 nautilus/bin/epylint create mode 100755 nautilus/bin/isort create mode 100755 nautilus/bin/pip create mode 100755 nautilus/bin/pip2 create mode 100755 nautilus/bin/pip2.7 create mode 100755 nautilus/bin/pylint create mode 100755 nautilus/bin/pyreverse create mode 100755 nautilus/bin/python create mode 100755 nautilus/bin/python-config create mode 120000 nautilus/bin/python2 create mode 120000 nautilus/bin/python2.7 create mode 100755 nautilus/bin/symilar create mode 100755 nautilus/bin/wheel create mode 120000 nautilus/include/python2.7 create mode 100644 nautilus_nlp/models/topic_modeling.py create mode 160000 src/french-lefff-lemmatizer diff --git a/nautilus/bin/activate b/nautilus/bin/activate new file mode 100644 index 0000000..70dac7d --- /dev/null +++ b/nautilus/bin/activate @@ -0,0 +1,78 @@ +# This file must be used with "source bin/activate" *from bash* +# you cannot run it directly + +deactivate () { + unset -f pydoc >/dev/null 2>&1 + + # reset old environment variables + # ! [ -z ${VAR+_} ] returns true if VAR is declared at all + if ! [ -z "${_OLD_VIRTUAL_PATH+_}" ] ; then + PATH="$_OLD_VIRTUAL_PATH" + export PATH + unset _OLD_VIRTUAL_PATH + fi + if ! [ -z "${_OLD_VIRTUAL_PYTHONHOME+_}" ] ; then + PYTHONHOME="$_OLD_VIRTUAL_PYTHONHOME" + export PYTHONHOME + unset _OLD_VIRTUAL_PYTHONHOME + fi + + # This should detect bash and zsh, which have a hash command that must + # be called to get it to forget past commands. Without forgetting + # past commands the $PATH changes we made may not be respected + if [ -n "${BASH-}" ] || [ -n "${ZSH_VERSION-}" ] ; then + hash -r 2>/dev/null + fi + + if ! [ -z "${_OLD_VIRTUAL_PS1+_}" ] ; then + PS1="$_OLD_VIRTUAL_PS1" + export PS1 + unset _OLD_VIRTUAL_PS1 + fi + + unset VIRTUAL_ENV + if [ ! "${1-}" = "nondestructive" ] ; then + # Self destruct! + unset -f deactivate + fi +} + +# unset irrelevant variables +deactivate nondestructive + +VIRTUAL_ENV="/Users/williamjaubert/nautilus_nlp/nautilus" +export VIRTUAL_ENV + +_OLD_VIRTUAL_PATH="$PATH" +PATH="$VIRTUAL_ENV/bin:$PATH" +export PATH + +# unset PYTHONHOME if set +if ! [ -z "${PYTHONHOME+_}" ] ; then + _OLD_VIRTUAL_PYTHONHOME="$PYTHONHOME" + unset PYTHONHOME +fi + +if [ -z "${VIRTUAL_ENV_DISABLE_PROMPT-}" ] ; then + _OLD_VIRTUAL_PS1="${PS1-}" + if [ "x" != x ] ; then + PS1="${PS1-}" + else + PS1="(`basename \"$VIRTUAL_ENV\"`) ${PS1-}" + fi + export PS1 +fi + +# Make sure to unalias pydoc if it's already there +alias pydoc 2>/dev/null >/dev/null && unalias pydoc || true + +pydoc () { + python -m pydoc "$@" +} + +# This should detect bash and zsh, which have a hash command that must +# be called to get it to forget past commands. Without forgetting +# past commands the $PATH changes we made may not be respected +if [ -n "${BASH-}" ] || [ -n "${ZSH_VERSION-}" ] ; then + hash -r 2>/dev/null +fi diff --git a/nautilus/bin/activate.csh b/nautilus/bin/activate.csh new file mode 100644 index 0000000..2c03eaa --- /dev/null +++ b/nautilus/bin/activate.csh @@ -0,0 +1,42 @@ +# This file must be used with "source bin/activate.csh" *from csh*. +# You cannot run it directly. +# Created by Davide Di Blasi <davidedb@gmail.com>. + +set newline='\ +' + +alias deactivate 'test $?_OLD_VIRTUAL_PATH != 0 && setenv PATH "$_OLD_VIRTUAL_PATH:q" && unset _OLD_VIRTUAL_PATH; rehash; test $?_OLD_VIRTUAL_PROMPT != 0 && set prompt="$_OLD_VIRTUAL_PROMPT:q" && unset _OLD_VIRTUAL_PROMPT; unsetenv VIRTUAL_ENV; test "\!:*" != "nondestructive" && unalias deactivate && unalias pydoc' + +# Unset irrelevant variables. +deactivate nondestructive + +setenv VIRTUAL_ENV "/Users/williamjaubert/nautilus_nlp/nautilus" + +set _OLD_VIRTUAL_PATH="$PATH:q" +setenv PATH "$VIRTUAL_ENV:q/bin:$PATH:q" + + + +if ("" != "") then + set env_name = "" +else + set env_name = "$VIRTUAL_ENV:t:q" +endif + +# Could be in a non-interactive environment, +# in which case, $prompt is undefined and we wouldn't +# care about the prompt anyway. +if ( $?prompt ) then + set _OLD_VIRTUAL_PROMPT="$prompt:q" +if ( "$prompt:q" =~ *"$newline:q"* ) then + : +else + set prompt = "[$env_name:q] $prompt:q" +endif +endif + +unset env_name + +alias pydoc python -m pydoc + +rehash diff --git a/nautilus/bin/activate.fish b/nautilus/bin/activate.fish new file mode 100644 index 0000000..699e0fd --- /dev/null +++ b/nautilus/bin/activate.fish @@ -0,0 +1,101 @@ +# This file must be used using `source bin/activate.fish` *within a running fish ( http://fishshell.com ) session*. +# Do not run it directly. + +function _bashify_path -d "Converts a fish path to something bash can recognize" + set fishy_path $argv + set bashy_path $fishy_path[1] + for path_part in $fishy_path[2..-1] + set bashy_path "$bashy_path:$path_part" + end + echo $bashy_path +end + +function _fishify_path -d "Converts a bash path to something fish can recognize" + echo $argv | tr ':' '\n' +end + +function deactivate -d 'Exit virtualenv mode and return to the normal environment.' + # reset old environment variables + if test -n "$_OLD_VIRTUAL_PATH" + # https://github.com/fish-shell/fish-shell/issues/436 altered PATH handling + if test (echo $FISH_VERSION | tr "." "\n")[1] -lt 3 + set -gx PATH (_fishify_path $_OLD_VIRTUAL_PATH) + else + set -gx PATH $_OLD_VIRTUAL_PATH + end + set -e _OLD_VIRTUAL_PATH + end + + if test -n "$_OLD_VIRTUAL_PYTHONHOME" + set -gx PYTHONHOME $_OLD_VIRTUAL_PYTHONHOME + set -e _OLD_VIRTUAL_PYTHONHOME + end + + if test -n "$_OLD_FISH_PROMPT_OVERRIDE" + # Set an empty local `$fish_function_path` to allow the removal of `fish_prompt` using `functions -e`. + set -l fish_function_path + + # Erase virtualenv's `fish_prompt` and restore the original. + functions -e fish_prompt + functions -c _old_fish_prompt fish_prompt + functions -e _old_fish_prompt + set -e _OLD_FISH_PROMPT_OVERRIDE + end + + set -e VIRTUAL_ENV + + if test "$argv[1]" != 'nondestructive' + # Self-destruct! + functions -e pydoc + functions -e deactivate + functions -e _bashify_path + functions -e _fishify_path + end +end + +# Unset irrelevant variables. +deactivate nondestructive + +set -gx VIRTUAL_ENV "/Users/williamjaubert/nautilus_nlp/nautilus" + +# https://github.com/fish-shell/fish-shell/issues/436 altered PATH handling +if test (echo $FISH_VERSION | tr "." "\n")[1] -lt 3 + set -gx _OLD_VIRTUAL_PATH (_bashify_path $PATH) +else + set -gx _OLD_VIRTUAL_PATH $PATH +end +set -gx PATH "$VIRTUAL_ENV/bin" $PATH + +# Unset `$PYTHONHOME` if set. +if set -q PYTHONHOME + set -gx _OLD_VIRTUAL_PYTHONHOME $PYTHONHOME + set -e PYTHONHOME +end + +function pydoc + python -m pydoc $argv +end + +if test -z "$VIRTUAL_ENV_DISABLE_PROMPT" + # Copy the current `fish_prompt` function as `_old_fish_prompt`. + functions -c fish_prompt _old_fish_prompt + + function fish_prompt + # Save the current $status, for fish_prompts that display it. + set -l old_status $status + + # Prompt override provided? + # If not, just prepend the environment name. + if test -n "" + printf '%s%s' "" (set_color normal) + else + printf '%s(%s) ' (set_color normal) (basename "$VIRTUAL_ENV") + end + + # Restore the original $status + echo "exit $old_status" | source + _old_fish_prompt + end + + set -gx _OLD_FISH_PROMPT_OVERRIDE "$VIRTUAL_ENV" +end diff --git a/nautilus/bin/activate.ps1 b/nautilus/bin/activate.ps1 new file mode 100644 index 0000000..6d8ae2a --- /dev/null +++ b/nautilus/bin/activate.ps1 @@ -0,0 +1,60 @@ +# This file must be dot sourced from PoSh; you cannot run it directly. Do this: . ./activate.ps1 + +$script:THIS_PATH = $myinvocation.mycommand.path +$script:BASE_DIR = split-path (resolve-path "$THIS_PATH/..") -Parent + +function global:deactivate([switch] $NonDestructive) +{ + if (test-path variable:_OLD_VIRTUAL_PATH) + { + $env:PATH = $variable:_OLD_VIRTUAL_PATH + remove-variable "_OLD_VIRTUAL_PATH" -scope global + } + + if (test-path function:_old_virtual_prompt) + { + $function:prompt = $function:_old_virtual_prompt + remove-item function:\_old_virtual_prompt + } + + if ($env:VIRTUAL_ENV) + { + $old_env = split-path $env:VIRTUAL_ENV -leaf + remove-item env:VIRTUAL_ENV -erroraction silentlycontinue + } + + if (!$NonDestructive) + { + # Self destruct! + remove-item function:deactivate + remove-item function:pydoc + } +} + +function global:pydoc +{ + python -m pydoc $args +} + +# unset irrelevant variables +deactivate -nondestructive + +$VIRTUAL_ENV = $BASE_DIR +$env:VIRTUAL_ENV = $VIRTUAL_ENV + +$global:_OLD_VIRTUAL_PATH = $env:PATH +$env:PATH = "$env:VIRTUAL_ENV/bin:" + $env:PATH +if (!$env:VIRTUAL_ENV_DISABLE_PROMPT) +{ + function global:_old_virtual_prompt + { + "" + } + $function:_old_virtual_prompt = $function:prompt + function global:prompt + { + # Add a prefix to the current prompt, but don't discard it. + write-host "($( split-path $env:VIRTUAL_ENV -leaf )) " -nonewline + & $function:_old_virtual_prompt + } +} diff --git a/nautilus/bin/activate_this.py b/nautilus/bin/activate_this.py new file mode 100644 index 0000000..59b5d72 --- /dev/null +++ b/nautilus/bin/activate_this.py @@ -0,0 +1,46 @@ +"""Activate virtualenv for current interpreter: + +Use exec(open(this_file).read(), {'__file__': this_file}). + +This can be used when you must use an existing Python interpreter, not the virtualenv bin/python. +""" +import os +import site +import sys + +try: + __file__ +except NameError: + raise AssertionError("You must use exec(open(this_file).read(), {'__file__': this_file}))") + +# prepend bin to PATH (this file is inside the bin directory) +bin_dir = os.path.dirname(os.path.abspath(__file__)) +os.environ["PATH"] = os.pathsep.join([bin_dir] + os.environ.get("PATH", "").split(os.pathsep)) + +base = os.path.dirname(bin_dir) + +# virtual env is right above bin directory +os.environ["VIRTUAL_ENV"] = base + +# add the virtual environments site-package to the host python import mechanism +IS_PYPY = hasattr(sys, "pypy_version_info") +IS_JYTHON = sys.platform.startswith("java") +if IS_JYTHON: + site_packages = os.path.join(base, "Lib", "site-packages") +elif IS_PYPY: + site_packages = os.path.join(base, "site-packages") +else: + IS_WIN = sys.platform == "win32" + if IS_WIN: + site_packages = os.path.join(base, "Lib", "site-packages") + else: + site_packages = os.path.join(base, "lib", "python{}".format(sys.version[:3]), "site-packages") + +prev = set(sys.path) +site.addsitedir(site_packages) +sys.real_prefix = sys.prefix +sys.prefix = base + +# Move the added items to the front of the path, in place +new = list(sys.path) +sys.path[:] = [i for i in new if i not in prev] + [i for i in new if i in prev] diff --git a/nautilus/bin/easy_install b/nautilus/bin/easy_install new file mode 100755 index 0000000..d083bb5 --- /dev/null +++ b/nautilus/bin/easy_install @@ -0,0 +1,10 @@ +#!/Users/williamjaubert/nautilus_nlp/nautilus/bin/python +# -*- coding: utf-8 -*- +import re +import sys + +from setuptools.command.easy_install import main + +if __name__ == '__main__': + sys.argv[0] = re.sub(r'(-script\.pyw?|\.exe)?$', '', sys.argv[0]) + sys.exit(main()) diff --git a/nautilus/bin/easy_install-2.7 b/nautilus/bin/easy_install-2.7 new file mode 100755 index 0000000..d083bb5 --- /dev/null +++ b/nautilus/bin/easy_install-2.7 @@ -0,0 +1,10 @@ +#!/Users/williamjaubert/nautilus_nlp/nautilus/bin/python +# -*- coding: utf-8 -*- +import re +import sys + +from setuptools.command.easy_install import main + +if __name__ == '__main__': + sys.argv[0] = re.sub(r'(-script\.pyw?|\.exe)?$', '', sys.argv[0]) + sys.exit(main()) diff --git a/nautilus/bin/epylint b/nautilus/bin/epylint new file mode 100755 index 0000000..8fa16b4 --- /dev/null +++ b/nautilus/bin/epylint @@ -0,0 +1,10 @@ +#!/Users/williamjaubert/nautilus_nlp/nautilus/bin/python2.7 +# -*- coding: utf-8 -*- +import re +import sys + +from pylint import run_epylint + +if __name__ == '__main__': + sys.argv[0] = re.sub(r'(-script\.pyw?|\.exe)?$', '', sys.argv[0]) + sys.exit(run_epylint()) diff --git a/nautilus/bin/isort b/nautilus/bin/isort new file mode 100755 index 0000000..31b0716 --- /dev/null +++ b/nautilus/bin/isort @@ -0,0 +1,10 @@ +#!/Users/williamjaubert/nautilus_nlp/nautilus/bin/python2.7 +# -*- coding: utf-8 -*- +import re +import sys + +from isort.main import main + +if __name__ == '__main__': + sys.argv[0] = re.sub(r'(-script\.pyw?|\.exe)?$', '', sys.argv[0]) + sys.exit(main()) diff --git a/nautilus/bin/pip b/nautilus/bin/pip new file mode 100755 index 0000000..08299c7 --- /dev/null +++ b/nautilus/bin/pip @@ -0,0 +1,10 @@ +#!/Users/williamjaubert/nautilus_nlp/nautilus/bin/python +# -*- coding: utf-8 -*- +import re +import sys + +from pip._internal import main + +if __name__ == '__main__': + sys.argv[0] = re.sub(r'(-script\.pyw?|\.exe)?$', '', sys.argv[0]) + sys.exit(main()) diff --git a/nautilus/bin/pip2 b/nautilus/bin/pip2 new file mode 100755 index 0000000..08299c7 --- /dev/null +++ b/nautilus/bin/pip2 @@ -0,0 +1,10 @@ +#!/Users/williamjaubert/nautilus_nlp/nautilus/bin/python +# -*- coding: utf-8 -*- +import re +import sys + +from pip._internal import main + +if __name__ == '__main__': + sys.argv[0] = re.sub(r'(-script\.pyw?|\.exe)?$', '', sys.argv[0]) + sys.exit(main()) diff --git a/nautilus/bin/pip2.7 b/nautilus/bin/pip2.7 new file mode 100755 index 0000000..08299c7 --- /dev/null +++ b/nautilus/bin/pip2.7 @@ -0,0 +1,10 @@ +#!/Users/williamjaubert/nautilus_nlp/nautilus/bin/python +# -*- coding: utf-8 -*- +import re +import sys + +from pip._internal import main + +if __name__ == '__main__': + sys.argv[0] = re.sub(r'(-script\.pyw?|\.exe)?$', '', sys.argv[0]) + sys.exit(main()) diff --git a/nautilus/bin/pylint b/nautilus/bin/pylint new file mode 100755 index 0000000..9635a6f --- /dev/null +++ b/nautilus/bin/pylint @@ -0,0 +1,10 @@ +#!/Users/williamjaubert/nautilus_nlp/nautilus/bin/python2.7 +# -*- coding: utf-8 -*- +import re +import sys + +from pylint import run_pylint + +if __name__ == '__main__': + sys.argv[0] = re.sub(r'(-script\.pyw?|\.exe)?$', '', sys.argv[0]) + sys.exit(run_pylint()) diff --git a/nautilus/bin/pyreverse b/nautilus/bin/pyreverse new file mode 100755 index 0000000..6af5484 --- /dev/null +++ b/nautilus/bin/pyreverse @@ -0,0 +1,10 @@ +#!/Users/williamjaubert/nautilus_nlp/nautilus/bin/python2.7 +# -*- coding: utf-8 -*- +import re +import sys + +from pylint import run_pyreverse + +if __name__ == '__main__': + sys.argv[0] = re.sub(r'(-script\.pyw?|\.exe)?$', '', sys.argv[0]) + sys.exit(run_pyreverse()) diff --git a/nautilus/bin/python b/nautilus/bin/python new file mode 100755 index 0000000000000000000000000000000000000000..fddb46f7919ca3729d7a3a3aff690d36c96049f6 GIT binary patch literal 8464 zcmeHM%}*0S6rTbLDv`p$_!(CMMm@9yP4rj{jSxXWATb&<Zt0rVY`1m04fNKF@jG($ z=Fx-3#1nslH}&A3;0Fg!-aJ@;zuDQcEy~qs<|S|5yqPy|-uz}ZnVt9U$G4xoLL|C{ zXmkl7hQRN42ys_fs0ncZJO!3=ZsJ1rTK39iwzgBEUHz>_KlfoM<zn{gV!MeNpKNav zT1RXG;fNmHEoI=W2Aj5>{u%>V47zt~6Y9}e)zl*zx=RTut3fSSZ8dfJd#L^G)E1E* z4d~PUqW;jIEI4k(@nO{IZ%z9<s2xxz?k(C9U(H)7dU;v&Zk1uw>F=fX$2}rZZ}S&6 zw@U8ASFn_m6N?kAW<k8$_95Dj*goKlw0ukHxw2X><;t$C1pXiWMQ-Sy<0B$oYChc{ zrE72JFNyKA@6-0w<NkO~;`-*foteILF*`XOojI#xozO{19Sr@%;~K_yF-8L`oVyQl zKXpx(rJxgIkhCNA>@Ps)xqS=Cz1ahv1ILNB<apfie%9Bmj`OPx_Clgd^n=s2s-Jd? zxpcnn=An}gff>iW*WX8;eK>u6{ppK0kF75sN6-f7gxG~I1biye*#<g+^>Q4)n>cZv zb71x{X3>ihobfAmP~hy9dQd2P<EgVLgi*}V2Glt&k$8pAF|iplOc(0az$vB9#|Iup z2;393zNM<;SJNv+*Dczm+jcGI_(9tC?B%kTx5qhoIN5((9>?0aZ#S**9G=uV&l!n$ zVeb@P8Mkcb9bc-QNu|`$P)4RO2p9wm0tNwtfI+|@U=aB02rNxK_;h1~VKhe@C}*A= zxdSn=&>XcP*9s`a#^+|U8UB~xo~I}-c^~I}{R|}ek-odL&VP%3+_#fpO|44Q5SPy} zc3XqEv8fvb3<3rLgMdN6AYc$M2p9wm0tNwtfI+|@@J}ExIGmhkphFoZ4^=W;=8$hj z@_ODEYr;<sX5?I5&e}x}Djo+U@|s<;RFKZ9vs?=t<hq${630q38RcU{w`d%tQ&3c4 z^FTsn9@YE8KBb567JP5udj@3d>4EvJxIP~0bfbvx8b~CPGOSz3KyQsns+bV}ti3F= QzF$V7I$F$@^(tq-0E&ReMF0Q* literal 0 HcmV?d00001 diff --git a/nautilus/bin/python-config b/nautilus/bin/python-config new file mode 100755 index 0000000..5f285ef --- /dev/null +++ b/nautilus/bin/python-config @@ -0,0 +1,78 @@ +#!/Users/williamjaubert/nautilus_nlp/nautilus/bin/python + +import sys +import getopt +import sysconfig + +valid_opts = ['prefix', 'exec-prefix', 'includes', 'libs', 'cflags', + 'ldflags', 'help'] + +if sys.version_info >= (3, 2): + valid_opts.insert(-1, 'extension-suffix') + valid_opts.append('abiflags') +if sys.version_info >= (3, 3): + valid_opts.append('configdir') + + +def exit_with_usage(code=1): + sys.stderr.write("Usage: {0} [{1}]\n".format( + sys.argv[0], '|'.join('--'+opt for opt in valid_opts))) + sys.exit(code) + +try: + opts, args = getopt.getopt(sys.argv[1:], '', valid_opts) +except getopt.error: + exit_with_usage() + +if not opts: + exit_with_usage() + +pyver = sysconfig.get_config_var('VERSION') +getvar = sysconfig.get_config_var + +opt_flags = [flag for (flag, val) in opts] + +if '--help' in opt_flags: + exit_with_usage(code=0) + +for opt in opt_flags: + if opt == '--prefix': + print(sysconfig.get_config_var('prefix')) + + elif opt == '--exec-prefix': + print(sysconfig.get_config_var('exec_prefix')) + + elif opt in ('--includes', '--cflags'): + flags = ['-I' + sysconfig.get_path('include'), + '-I' + sysconfig.get_path('platinclude')] + if opt == '--cflags': + flags.extend(getvar('CFLAGS').split()) + print(' '.join(flags)) + + elif opt in ('--libs', '--ldflags'): + abiflags = getattr(sys, 'abiflags', '') + libs = ['-lpython' + pyver + abiflags] + libs += getvar('LIBS').split() + libs += getvar('SYSLIBS').split() + # add the prefix/lib/pythonX.Y/config dir, but only if there is no + # shared library in prefix/lib/. + if opt == '--ldflags': + if not getvar('Py_ENABLE_SHARED'): + libs.insert(0, '-L' + getvar('LIBPL')) + if not getvar('PYTHONFRAMEWORK'): + libs.extend(getvar('LINKFORSHARED').split()) + print(' '.join(libs)) + + elif opt == '--extension-suffix': + ext_suffix = sysconfig.get_config_var('EXT_SUFFIX') + if ext_suffix is None: + ext_suffix = sysconfig.get_config_var('SO') + print(ext_suffix) + + elif opt == '--abiflags': + if not getattr(sys, 'abiflags', None): + exit_with_usage() + print(sys.abiflags) + + elif opt == '--configdir': + print(sysconfig.get_config_var('LIBPL')) diff --git a/nautilus/bin/python2 b/nautilus/bin/python2 new file mode 120000 index 0000000..d8654aa --- /dev/null +++ b/nautilus/bin/python2 @@ -0,0 +1 @@ +python \ No newline at end of file diff --git a/nautilus/bin/python2.7 b/nautilus/bin/python2.7 new file mode 120000 index 0000000..d8654aa --- /dev/null +++ b/nautilus/bin/python2.7 @@ -0,0 +1 @@ +python \ No newline at end of file diff --git a/nautilus/bin/symilar b/nautilus/bin/symilar new file mode 100755 index 0000000..582abdf --- /dev/null +++ b/nautilus/bin/symilar @@ -0,0 +1,10 @@ +#!/Users/williamjaubert/nautilus_nlp/nautilus/bin/python2.7 +# -*- coding: utf-8 -*- +import re +import sys + +from pylint import run_symilar + +if __name__ == '__main__': + sys.argv[0] = re.sub(r'(-script\.pyw?|\.exe)?$', '', sys.argv[0]) + sys.exit(run_symilar()) diff --git a/nautilus/bin/wheel b/nautilus/bin/wheel new file mode 100755 index 0000000..bd14437 --- /dev/null +++ b/nautilus/bin/wheel @@ -0,0 +1,10 @@ +#!/Users/williamjaubert/nautilus_nlp/nautilus/bin/python +# -*- coding: utf-8 -*- +import re +import sys + +from wheel.cli import main + +if __name__ == '__main__': + sys.argv[0] = re.sub(r'(-script\.pyw?|\.exe)?$', '', sys.argv[0]) + sys.exit(main()) diff --git a/nautilus/include/python2.7 b/nautilus/include/python2.7 new file mode 120000 index 0000000..de0d082 --- /dev/null +++ b/nautilus/include/python2.7 @@ -0,0 +1 @@ +/Users/williamjaubert/anaconda2/include/python2.7 \ No newline at end of file diff --git a/nautilus_nlp/models/topic_modeling.py b/nautilus_nlp/models/topic_modeling.py new file mode 100644 index 0000000..f5592d4 --- /dev/null +++ b/nautilus_nlp/models/topic_modeling.py @@ -0,0 +1,153 @@ +import gensim +import logging +import os +import pyLDAvis +import pyLDAvis.gensim + +from IPython.display import HTML + +logging.getLogger("gensim").setLevel(logging.WARNING) + + +def create_dictionary(data): + + """ Create a dictionary(id2word) containing the number of times a word appears + in the dataset set: one of the two main inputs to the LDA topic model with the corpus + + Parameters + ---------- + data : list of list of tokens + + Returns + ------- + list of list of tuples + """ + return gensim.corpora.Dictionary(data) + +def filter_extremes(dictionary, no_below=15, no_above=0.3 , **kwargs) : + """ Remove very rare and very common words + + Parameters + ---------- + dictionary: dictionary containing the number of times a word appears in the dataset set + no_below : int, optional + Keep tokens which are contained in at least `no_below` documents. + no_above : float, optional + Keep tokens which are contained in no more than `no_above` documents + (fraction of total corpus size, not an absolute number). + + (Add to docstring) + other func + """ + return dictionary.filter_extremes(no_below=no_below, no_above=no_above, **kwargs) + + +def create_bow_corpus(data, dictionary): + + """ Create the corpus: one of the two main inputs to the LDA topic model with the dictionary (id2word) + The produced corpus is a mapping of (word_id, word_frequency). + Parameters + ---------- + data : list of list of tokens + + Returns + ------- + list of list of tuples + """ + texts = data + corpus = [dictionary.doc2bow(text) for text in texts] + return corpus + +### Gensim LdaModel + +def train_lda_model(bow_corpus, dictionary, num_topics, **kwargs): + """ Train the model on the corpus + + Parameters + ---------- + corpus : iterable of list of tokens. Stream of document vectors or sparse matrix of shape (num_terms, num_documents).$ + dictionary: corpora.Dictionary. Mapping from word IDs to words + num_topics: int + + Returns + ------- + gensim.ldamodel + """ + model = gensim.models.ldamodel.LdaModel(corpus=bow_corpus, id2word=dictionary, num_topics=num_topics, passes=10, minimum_probability=0.001, random_state=0) + return model + + +def save_model(model, MODELNAME): + """ Save the model that has been trained + + Parameters + ---------- + model: ldamodel + MODELNAME: str + """ + return model.save(MODELNAME) + + +def load_model(model_path,model_name): + ''' + model_path: path where the model has been saved + model_name: name of the saved model + ''' + ldamodel = gensim.models.LdaModel.load(os.path.join(model_path,model_name)) + return ldamodel + +def fit_data(model, bow): + """Test the model on new, unseen documents""" + return model[bow] + +### Gensim LdaMallet + +def load_mallet_model(model_path, model_name, model_prefix=None): + ''' + model_prefix: prefix used while saving the model + model_name: name of the saved model + ''' + ldamodel = LdaMallet.load(os.path.join(model_path,model_name)) + if model_prefix is not None: + ldamodel.prefix = model_path+'/'+ model_prefix + return ldamodel + +def train_mallet_model(mallet_path, bow_corpus, dictionary, num_topics, **kwargs): + """ Train the model on the corpus + + Parameters + ---------- + mallet_path: path to mallet files + bow_corpus : iterable of list of tokens. Stream of document vectors or sparse matrix of shape (num_terms, num_documents).$ + dictionary: corpora.Dictionary. Mapping from word IDs to words + num_topics: int + + Returns + ------- + gensim.ldamodel + """ + model = gensim.models.wrappers.LdaMallet(mallet_path, corpus=bow_corpus, id2word=dictionary, num_topics=num_topics, prefix='nautil') + return model + + +# Visualization + + +def visualize_topics(model, bow_corpus, dictionary): + """ Visualize the topics-keywords with the pyLDAvis interactive chart. + (Work well in notebook) + """ + return pyLDAvis.gensim.prepare(model, bow_corpus, dictionary) + + +def save_pyldavis(pyldavis, vis_path, vis_name): + """ Save the pyldavis interactive chart + pyldavis: pyLDAvis._prepare.PreparedData + vis_path: str + vis_path: str + """ + return pyLDAvis.save_html(pyldavis, os.path.join(vis_path, vis_name, '.html')) + + +def show_pyldavis(vis_path, vis_name): + return HTML(filename=os.path.join(vis_path, vis_name, '.html')) + diff --git a/requirements.txt b/requirements.txt index 869399b..8f02cc3 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,5 +1,6 @@ # local package -e . +os # external requirements click @@ -12,8 +13,13 @@ pillow pytest #library requirements -spacy==2.1 +pyLDAvis==2.1.2 +gensim==3.7.1 +sacremoses==0.0.13 +stop-words==2018.7.23 +spacy==2.1.3 scikit-learn>=0.17.0 +ftfy==5.5.1 ftfy>=4.2.0,<5.0.0 wordcloud>=1.5.0 matplotlib>=3.0.3 diff --git a/src/french-lefff-lemmatizer b/src/french-lefff-lemmatizer new file mode 160000 index 0000000..ba1ef2b --- /dev/null +++ b/src/french-lefff-lemmatizer @@ -0,0 +1 @@ +Subproject commit ba1ef2bc67aa3753d127ba978a255081120449c2 From ce7bb39ddc887e0f92866640cb0f4f9a66a8be1e Mon Sep 17 00:00:00 2001 From: Robin <rdoume@gmail.com> Date: Wed, 10 Apr 2019 15:18:02 +0200 Subject: [PATCH 047/496] add static versionning --- VERSION | 1 + 1 file changed, 1 insertion(+) create mode 100644 VERSION diff --git a/VERSION b/VERSION new file mode 100644 index 0000000..6da28dd --- /dev/null +++ b/VERSION @@ -0,0 +1 @@ +0.1.1 \ No newline at end of file From b8132155de5eff0ef646ed677f58be4075c90972 Mon Sep 17 00:00:00 2001 From: William Jaubert <jaubert.william@gmail.com> Date: Wed, 10 Apr 2019 16:16:38 +0200 Subject: [PATCH 048/496] Function show_dominant topic added --- nautilus_nlp/models/topic_modeling.py | 39 ++++++++++++++++++++++----- 1 file changed, 32 insertions(+), 7 deletions(-) diff --git a/nautilus_nlp/models/topic_modeling.py b/nautilus_nlp/models/topic_modeling.py index f5592d4..c918435 100644 --- a/nautilus_nlp/models/topic_modeling.py +++ b/nautilus_nlp/models/topic_modeling.py @@ -3,6 +3,7 @@ import os import pyLDAvis import pyLDAvis.gensim +pyLDAvis.enable_notebook() from IPython.display import HTML @@ -64,7 +65,7 @@ def train_lda_model(bow_corpus, dictionary, num_topics, **kwargs): Parameters ---------- - corpus : iterable of list of tokens. Stream of document vectors or sparse matrix of shape (num_terms, num_documents).$ + bow_corpus : iterable of list of tokens. Stream of document vectors or sparse matrix of shape (num_terms, num_documents).$ dictionary: corpora.Dictionary. Mapping from word IDs to words num_topics: int @@ -72,11 +73,11 @@ def train_lda_model(bow_corpus, dictionary, num_topics, **kwargs): ------- gensim.ldamodel """ - model = gensim.models.ldamodel.LdaModel(corpus=bow_corpus, id2word=dictionary, num_topics=num_topics, passes=10, minimum_probability=0.001, random_state=0) + model = gensim.models.ldamodel.LdaModel(corpus=bow_corpus, id2word=dictionary, num_topics=num_topics, passes=10, minimum_probability=0.001, random_state=0, **kwargs) return model -def save_model(model, MODELNAME): +def save_model(model, model_path, model_name): """ Save the model that has been trained Parameters @@ -84,7 +85,7 @@ def save_model(model, MODELNAME): model: ldamodel MODELNAME: str """ - return model.save(MODELNAME) + return model.save(os.path.join(model_path,model_name)) def load_model(model_path,model_name): @@ -138,16 +139,40 @@ def visualize_topics(model, bow_corpus, dictionary): """ return pyLDAvis.gensim.prepare(model, bow_corpus, dictionary) - def save_pyldavis(pyldavis, vis_path, vis_name): """ Save the pyldavis interactive chart pyldavis: pyLDAvis._prepare.PreparedData vis_path: str vis_path: str """ - return pyLDAvis.save_html(pyldavis, os.path.join(vis_path, vis_name, '.html')) + return pyLDAvis.save_html(pyldavis, os.path.join(vis_path, vis_name + '{}'.format('.html'))) def show_pyldavis(vis_path, vis_name): - return HTML(filename=os.path.join(vis_path, vis_name, '.html')) + """ Display the HTML of the saved pyldavis interactive chart + vis_path: str + vis_path: str + """ + return HTML(filename=os.path.join(vis_path, vis_name + '{}'.format('.html'))) + +def show_dominant_topic(model, bow_corpus, topic_number=1, topn=5): + """ Print the dominant topics in the document, its score and the topics' top keywords. + + Parameters + ---------- + gensim.ldamodel + model: ldamodel + bow_corpus: iterable of list of tokens. + topic_number: int. Pick the number of topics displayed + topn: int. Number of topics' top keyword displayed + + """ + i = 0 + for index, score in sorted(model[bow_corpus], key=lambda tup: -1*tup[1]): + weight = model.show_topic(index, topn=topn) + keywords = [i[0] for i in weight] + print("Score: {}\t Topic: {}".format(score, keywords)) + i +=1 + if i == topic_number: + break \ No newline at end of file From 5c8ef424504890ae9307374ca913fa71f028c185 Mon Sep 17 00:00:00 2001 From: Robin <rdoume@gmail.com> Date: Wed, 10 Apr 2019 18:19:30 +0200 Subject: [PATCH 049/496] fix bad encoding example #58 --- .../Common Text Processing operations.ipynb | 305 ++++++++++++++++-- 1 file changed, 282 insertions(+), 23 deletions(-) diff --git a/notebooks/Common Text Processing operations.ipynb b/notebooks/Common Text Processing operations.ipynb index b389145..10c6e07 100644 --- a/notebooks/Common Text Processing operations.ipynb +++ b/notebooks/Common Text Processing operations.ipynb @@ -16,25 +16,16 @@ }, { "cell_type": "code", - "execution_count": 7, + "execution_count": 5, "metadata": {}, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "[nltk_data] Downloading package punkt to /Users/hugo/nltk_data...\n", - "[nltk_data] Package punkt is already up-to-date!\n" - ] - } - ], + "outputs": [], "source": [ "from nautilus_nlp.utils.tokenizer import tokenize, untokenize" ] }, { "cell_type": "code", - "execution_count": 2, + "execution_count": 6, "metadata": {}, "outputs": [], "source": [ @@ -44,50 +35,243 @@ }, { "cell_type": "code", - "execution_count": 3, + "execution_count": 11, + "metadata": {}, + "outputs": [], + "source": [ + "str_ = \"\"\"Les moteurs de recherche tels Google, Exalead ou Yahoo! sont des applications très connues de fouille de textes sur de grandes masses de données. Cependant, les moteurs de recherche ne se basent pas uniquement sur le texte pour l'indexer, mais également sur la façon dont les pages sont mises en valeur les unes par rapport aux autres. L'algorithme utilisé par Google est PageRank, et il est courant de voir HITS dans le milieu académique\"\"\"" + ] + }, + { + "cell_type": "code", + "execution_count": 15, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "CPU times: user 23.5 ms, sys: 3.68 ms, total: 27.2 ms\n", - "Wall time: 30.2 ms\n" + "CPU times: user 4.76 ms, sys: 31 µs, total: 4.79 ms\n", + "Wall time: 4.42 ms\n" ] }, { "data": { "text/plain": [ - "[Ceci, est, un, texte, français, ,, j', adore, 1, !]" + "['Les',\n", + " 'moteurs',\n", + " 'de',\n", + " 'recherche',\n", + " 'tels',\n", + " 'Google',\n", + " ',',\n", + " 'Exalead',\n", + " 'ou',\n", + " 'Yahoo',\n", + " '!',\n", + " 'sont',\n", + " 'des',\n", + " 'applications',\n", + " 'très',\n", + " 'connues',\n", + " 'de',\n", + " 'fouille',\n", + " 'de',\n", + " 'textes',\n", + " 'sur',\n", + " 'de',\n", + " 'grandes',\n", + " 'masses',\n", + " 'de',\n", + " 'données',\n", + " '.',\n", + " 'Cependant',\n", + " ',',\n", + " 'les',\n", + " 'moteurs',\n", + " 'de',\n", + " 'recherche',\n", + " 'ne',\n", + " 'se',\n", + " 'basent',\n", + " 'pas',\n", + " 'uniquement',\n", + " 'sur',\n", + " 'le',\n", + " 'texte',\n", + " 'pour',\n", + " \"l'\",\n", + " 'indexer',\n", + " ',',\n", + " 'mais',\n", + " 'également',\n", + " 'sur',\n", + " 'la',\n", + " 'façon',\n", + " 'dont',\n", + " 'les',\n", + " 'pages',\n", + " 'sont',\n", + " 'mises',\n", + " 'en',\n", + " 'valeur',\n", + " 'les',\n", + " 'unes',\n", + " 'par',\n", + " 'rapport',\n", + " 'aux',\n", + " 'autres',\n", + " '.',\n", + " \"L'\",\n", + " 'algorithme',\n", + " 'utilisé',\n", + " 'par',\n", + " 'Google',\n", + " 'est',\n", + " 'PageRank',\n", + " ',',\n", + " 'et',\n", + " 'il',\n", + " 'est',\n", + " 'courant',\n", + " 'de',\n", + " 'voir',\n", + " 'HITS',\n", + " 'dans',\n", + " 'le',\n", + " 'milieu',\n", + " 'académique']" ] }, - "execution_count": 3, + "execution_count": 15, "metadata": {}, "output_type": "execute_result" } ], "source": [ "%%time\n", - "tokenize(fr_txt, lang_module=\"fr_spacy\")" + "tokenize(str_, lang_module=\"fr_spacy\")" ] }, { "cell_type": "code", - "execution_count": 4, + "execution_count": 14, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "CPU times: user 19.5 s, sys: 157 ms, total: 19.6 s\n", - "Wall time: 20.2 s\n" + "CPU times: user 6.22 ms, sys: 94 µs, total: 6.31 ms\n", + "Wall time: 4.27 ms\n" ] } ], "source": [ "%%time\n", - "tokenized_fr_txt = tokenize(fr_txt, lang_module=\"fr_moses\")" + "tokenized_fr_txt = tokenize(str_, lang_module=\"fr_moses\")" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "['Les',\n", + " 'moteurs',\n", + " 'de',\n", + " 'recherche',\n", + " 'tels',\n", + " 'Google',\n", + " ',',\n", + " 'Exalead',\n", + " 'ou',\n", + " 'Yahoo',\n", + " '!',\n", + " 'sont',\n", + " 'des',\n", + " 'applications',\n", + " 'très',\n", + " 'connues',\n", + " 'de',\n", + " 'fouille',\n", + " 'de',\n", + " 'textes',\n", + " 'sur',\n", + " 'de',\n", + " 'grandes',\n", + " 'masses',\n", + " 'de',\n", + " 'données',\n", + " '.',\n", + " 'Cependant',\n", + " ',',\n", + " 'les',\n", + " 'moteurs',\n", + " 'de',\n", + " 'recherche',\n", + " 'ne',\n", + " 'se',\n", + " 'basent',\n", + " 'pas',\n", + " 'uniquement',\n", + " 'sur',\n", + " 'le',\n", + " 'texte',\n", + " 'pour',\n", + " \"l'\",\n", + " 'indexer',\n", + " ',',\n", + " 'mais',\n", + " 'également',\n", + " 'sur',\n", + " 'la',\n", + " 'façon',\n", + " 'dont',\n", + " 'les',\n", + " 'pages',\n", + " 'sont',\n", + " 'mises',\n", + " 'en',\n", + " 'valeur',\n", + " 'les',\n", + " 'unes',\n", + " 'par',\n", + " 'rapport',\n", + " 'aux',\n", + " 'autres',\n", + " '.',\n", + " \"L'\",\n", + " 'algorithme',\n", + " 'utilisé',\n", + " 'par',\n", + " 'Google',\n", + " 'est',\n", + " 'PageRank',\n", + " ',',\n", + " 'et',\n", + " 'il',\n", + " 'est',\n", + " 'courant',\n", + " 'de',\n", + " 'voir',\n", + " 'HITS',\n", + " 'dans',\n", + " 'le',\n", + " 'milieu',\n", + " 'académique']" + ] + }, + "execution_count": 13, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "tokenize(str_, lang_module=\"fr_moses\")" ] }, { @@ -596,6 +780,81 @@ }, "outputs": [], "source": [] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Fix bad encoding\n", + "\n", + "Sometimes you messed up you encoding saving files, and you don't know how to fix this." + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [], + "source": [ + "from nautilus_nlp.utils.preprocess import fix_bad_unicode\n", + "from nautilus_nlp.utils import file_loader" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [], + "source": [ + "bad_unicode=file_loader.open_textfile('./bad_encoding.txt')" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "\"Les augmentations de rémunérations\\nrénover l'enquête publique pour en faire un vrai outil d'aménagement du territoire et de dialogue social\\nLimitations de vitesse et sécurité routière\\nPour un nouveau contrat citoyen\\nDévelopper les démarches de budget participatif dans les collectivités et associer les citoyens dans la réalisation des projets\\nproportienelle\\nPour plus de démocratie participative\\nTransparence de la vie public\\n18 mois de trop....ca suffit macron\\nEgalité devant les infractions routières\\nMesures d'urgence pour une démocratie régénérée\\nSORTIR DU GRAND EST ! REOUR A LA REGION ALSACE\\nPour plus de transparence\\nEcoutez enfin le peuple.\\nVote obligatoire\\nAvis d'un citoyen ordinaire et socialiste - vive le RIC\\nsuppression du 80 km/h\\nproportionelle et immigration\\nRevoir les plafonds des aides sociales\\nProposition de Refondation du Capitalisme et d'Instauration d'un Dividende Universel Financées par l'Épargne.\\nSuppression du sénat\\nLimitation de vitesse Ã\\xa0 80km\"" + ] + }, + "execution_count": 8, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "bad_unicode[0:1000]" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "\"Les augmentations de rémunérations\\nrénover l'enquête publique pour en faire un vrai outil d'aménagement du territoire et de dialogue social\\nLimitations de vitesse et sécurité routière\\nPour un nouveau contrat citoyen\\nDévelopper les démarches de budget participatif dans les collectivités et associer les citoyens dans la réalisation des projets\\nproportienelle\\nPour plus de démocratie participative\\nTransparence de la vie public\\n18 mois de trop....ca suffit macron\\nEgalité devant les infractions routières\\nMesures d'urgence pour une démocratie régénérée\\nSORTIR DU GRAND EST ! REOUR A LA REGION ALSACE\\nPour plus de transparence\\nEcoutez enfin le peuple.\\nVote obligatoire\\nAvis d'un citoyen ordinaire et socialiste - vive le RIC\\nsuppression du 80 km/h\\nproportionelle et immigration\\nRevoir les plafonds des aides sociales\\nProposition de Refondation du Capitalisme et d'Instauration d'un Dividende Universel Financées par l'Épargne.\\nSuppression du sénat\\nLimitation de vitesse à 80km/h sur les routes départ\"" + ] + }, + "execution_count": 9, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "fix_bad_unicode(bad_unicode)[0:1000]" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] } ], "metadata": { @@ -614,7 +873,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.7.0" + "version": "3.7.2" } }, "nbformat": 4, From 493e9e3c13d3b86ece716bab9604352c9c3ea19f Mon Sep 17 00:00:00 2001 From: William Jaubert <jaubert.william@gmail.com> Date: Wed, 10 Apr 2019 19:53:18 +0200 Subject: [PATCH 050/496] function to find the optimal number of topics --- nautilus_nlp/models/topic_modeling.py | 76 +- notebooks/TopicModeling.ipynb | 1064 +++++++++++++++++++++++++ 2 files changed, 1135 insertions(+), 5 deletions(-) create mode 100644 notebooks/TopicModeling.ipynb diff --git a/nautilus_nlp/models/topic_modeling.py b/nautilus_nlp/models/topic_modeling.py index c918435..ff494fb 100644 --- a/nautilus_nlp/models/topic_modeling.py +++ b/nautilus_nlp/models/topic_modeling.py @@ -4,6 +4,8 @@ import pyLDAvis import pyLDAvis.gensim pyLDAvis.enable_notebook() +from gensim.models import CoherenceModel +import matplotlib.pyplot as plt from IPython.display import HTML @@ -12,8 +14,7 @@ def create_dictionary(data): - """ Create a dictionary(id2word) containing the number of times a word appears - in the dataset set: one of the two main inputs to the LDA topic model with the corpus + """ Create a Dictionary encapsulates the mapping between normalized words and their integer ids. Parameters ---------- @@ -45,7 +46,7 @@ def filter_extremes(dictionary, no_below=15, no_above=0.3 , **kwargs) : def create_bow_corpus(data, dictionary): """ Create the corpus: one of the two main inputs to the LDA topic model with the dictionary (id2word) - The produced corpus is a mapping of (word_id, word_frequency). + The produced corpus is a mapping of (token_id, token_count). Parameters ---------- data : list of list of tokens @@ -58,6 +59,71 @@ def create_bow_corpus(data, dictionary): corpus = [dictionary.doc2bow(text) for text in texts] return corpus +### Find Number of topics + +def compute_coherence_values(dictionary, bow_corpus, texts, limit=25, start=2, step=4): + """ + Compute c_v coherence for various number of topics + + Parameters: + ---------- + dictionary : Gensim dictionary + bow_corpus : Gensim bow corpus + texts : List of input texts + limit : Max num of topics + + Returns: + ------- + model_list : List of LDA topic models + coherence_values : Coherence values corresponding to the LDA model with respective number of topics + """ + coherence_values = [] + model_list = [] + for num_topics in range(start, limit, step): + model = gensim.models.ldamodel.LdaModel(corpus=bow_corpus, + id2word=dictionary, + num_topics=num_topics, + random_state=0, + update_every=5, + chunksize=1000, + passes=10) + model_list.append(model) + coherencemodel = CoherenceModel(model=model, texts=texts, dictionary=dictionary, coherence='c_v') + coherence_values.append(coherencemodel.get_coherence()) + + return model_list, coherence_values + +def plot_optimal_topic_number(coherence_values, start=2, limit=25, step=4): + """ + Plot the coherence scores per number of topics + + Parameters: + ---------- + coherence_values : list of coherence scores for various number of topics + start : int. Min num of topics + limit : int. Max num of topics + step: int + + Output: + ------- + Lineplot + """ + x = range(start, limit, step) + plt.plot(x, coherence_values) + plt.xlabel("Num Topics") + plt.ylabel("Coherence score") + plt.legend(("coherence_values"), loc='best') + return plt.show() + +def print_coherence_scores(coherence_values, start=2, limit=25, step=4): + """ + Print the coherences scores for the ldamodels that had been tested with different number of topics + """ + x = range(start, limit, step) + for m, cv in zip(x, coherence_values): + print("Num Topics =", m, " has Coherence Value of", round(cv, 4)) + + ### Gensim LdaModel def train_lda_model(bow_corpus, dictionary, num_topics, **kwargs): @@ -65,8 +131,8 @@ def train_lda_model(bow_corpus, dictionary, num_topics, **kwargs): Parameters ---------- - bow_corpus : iterable of list of tokens. Stream of document vectors or sparse matrix of shape (num_terms, num_documents).$ - dictionary: corpora.Dictionary. Mapping from word IDs to words + bow_corpus : iterable of list of tokens. + dictionary: corpora.Dictionary. Dictionary encapsulates the mapping between normalized words and their integer ids. num_topics: int Returns diff --git a/notebooks/TopicModeling.ipynb b/notebooks/TopicModeling.ipynb new file mode 100644 index 0000000..242629b --- /dev/null +++ b/notebooks/TopicModeling.ipynb @@ -0,0 +1,1064 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Step 1: Load the dataset" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [], + "source": [ + "from sklearn.datasets import fetch_20newsgroups\n", + "newsgroups_train = fetch_20newsgroups(subset='train', shuffle = True)\n", + "newsgroups_test = fetch_20newsgroups(subset='test', shuffle = True)" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "['alt.atheism', 'comp.graphics', 'comp.os.ms-windows.misc', 'comp.sys.ibm.pc.hardware', 'comp.sys.mac.hardware', 'comp.windows.x', 'misc.forsale', 'rec.autos', 'rec.motorcycles', 'rec.sport.baseball', 'rec.sport.hockey', 'sci.crypt', 'sci.electronics', 'sci.med', 'sci.space', 'soc.religion.christian', 'talk.politics.guns', 'talk.politics.mideast', 'talk.politics.misc', 'talk.religion.misc']\n" + ] + } + ], + "source": [ + "print(list(newsgroups_train.target_names))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Step 2: Data Preprocessing¶\n" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/Users/williamjaubert/anaconda2/envs/nautilus/lib/python3.7/site-packages/nltk/decorators.py:68: DeprecationWarning: `formatargspec` is deprecated since Python 3.5. Use `signature` and the `Signature` object directly\n", + " regargs, varargs, varkwargs, defaults, formatvalue=lambda value: \"\"\n" + ] + } + ], + "source": [ + "import gensim\n", + "from gensim.utils import simple_preprocess\n", + "from gensim.parsing.preprocessing import STOPWORDS\n", + "from nltk.stem import WordNetLemmatizer, SnowballStemmer\n", + "from nltk.stem.porter import *\n", + "import numpy as np\n", + "np.random.seed(400)\n", + "\n", + "import nltk\n", + "\n", + "import pandas as pd\n", + "stemmer = SnowballStemmer(\"english\")" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": {}, + "outputs": [], + "source": [ + "def lemmatize_stemming(text):\n", + " return stemmer.stem(WordNetLemmatizer().lemmatize(text, pos='v'))\n", + "\n", + "# Tokenize and lemmatize\n", + "def preprocess(text):\n", + " result=[]\n", + " for token in gensim.utils.simple_preprocess(text) :\n", + " if token not in gensim.parsing.preprocessing.STOPWORDS and len(token) > 3:\n", + " result.append(lemmatize_stemming(token))\n", + " \n", + " return result" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": {}, + "outputs": [], + "source": [ + "processed_docs = []\n", + "\n", + "for doc in newsgroups_train.data:\n", + " processed_docs.append(preprocess(doc))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Step 3: Bag of words" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": {}, + "outputs": [], + "source": [ + "# Create the dictionnary\n", + "from nautilus_nlp.models.topic_modeling import create_dictionary" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": {}, + "outputs": [], + "source": [ + "dictionary = create_dictionary(processed_docs)" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": {}, + "outputs": [], + "source": [ + "# Filter out tokens that appear in too few or too many documents\n", + "from nautilus_nlp.models.topic_modeling import filter_extremes" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": {}, + "outputs": [], + "source": [ + "filter_extremes(dictionary)" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "metadata": {}, + "outputs": [], + "source": [ + "# Create the bow \n", + "from nautilus_nlp.models.topic_modeling import create_bow_corpus" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "metadata": {}, + "outputs": [], + "source": [ + "bow_corpus = create_bow_corpus(processed_docs, dictionary)" + ] + }, + { + "cell_type": "code", + "execution_count": 150, + "metadata": { + "collapsed": true + }, + "outputs": [ + { + "data": { + "text/plain": [ + "[[(0, 1),\n", + " (1, 1),\n", + " (2, 1),\n", + " (3, 1),\n", + " (4, 1),\n", + " (5, 1),\n", + " (6, 2),\n", + " (7, 1),\n", + " (8, 1),\n", + " (9, 1),\n", + " (10, 1),\n", + " (11, 1),\n", + " (12, 1),\n", + " (13, 2),\n", + " (14, 1),\n", + " (15, 1),\n", + " (16, 1),\n", + " (17, 1),\n", + " (18, 1),\n", + " (19, 1),\n", + " (20, 1),\n", + " (21, 1),\n", + " (22, 1),\n", + " (23, 1),\n", + " (24, 1),\n", + " (25, 1),\n", + " (26, 1),\n", + " (27, 1),\n", + " (28, 1)],\n", + " [(25, 1),\n", + " (29, 1),\n", + " (30, 1),\n", + " (31, 1),\n", + " (32, 1),\n", + " (33, 1),\n", + " (34, 1),\n", + " (35, 1),\n", + " (36, 1),\n", + " (37, 2),\n", + " (38, 5),\n", + " (39, 1),\n", + " (40, 1),\n", + " (41, 1),\n", + " (42, 1),\n", + " (43, 2),\n", + " (44, 1),\n", + " (45, 2),\n", + " (46, 2),\n", + " (47, 1),\n", + " (48, 1),\n", + " (49, 1),\n", + " (50, 1),\n", + " (51, 1),\n", + " (52, 1),\n", + " (53, 1),\n", + " (54, 1),\n", + " (55, 1),\n", + " (56, 1),\n", + " (57, 3),\n", + " (58, 1),\n", + " (59, 1),\n", + " (60, 1),\n", + " (61, 1),\n", + " (62, 1),\n", + " (63, 1),\n", + " (64, 1),\n", + " (65, 1),\n", + " (66, 1),\n", + " (67, 2),\n", + " (68, 1),\n", + " (69, 1),\n", + " (70, 3),\n", + " (71, 1),\n", + " (72, 4)],\n", + " [(8, 2),\n", + " (11, 2),\n", + " (13, 2),\n", + " (25, 1),\n", + " (27, 1),\n", + " (31, 1),\n", + " (41, 2),\n", + " (45, 2),\n", + " (48, 1),\n", + " (54, 1),\n", + " (69, 1),\n", + " (73, 1),\n", + " (74, 1),\n", + " (75, 1),\n", + " (76, 1),\n", + " (77, 3),\n", + " (78, 1),\n", + " (79, 1),\n", + " (80, 1),\n", + " (81, 2),\n", + " (82, 1),\n", + " (83, 1),\n", + " (84, 1),\n", + " (85, 1),\n", + " (86, 1),\n", + " (87, 3),\n", + " (88, 1),\n", + " (89, 1),\n", + " (90, 1),\n", + " (91, 1),\n", + " (92, 1),\n", + " (93, 1),\n", + " (94, 1),\n", + " (95, 1),\n", + " (96, 1),\n", + " (97, 1),\n", + " (98, 1),\n", + " (99, 1),\n", + " (100, 1),\n", + " (101, 1),\n", + " (102, 3),\n", + " (103, 1),\n", + " (104, 1),\n", + " (105, 1),\n", + " (106, 1),\n", + " (107, 1),\n", + " (108, 1),\n", + " (109, 1),\n", + " (110, 3),\n", + " (111, 1),\n", + " (112, 1),\n", + " (113, 1),\n", + " (114, 1),\n", + " (115, 1),\n", + " (116, 2),\n", + " (117, 1),\n", + " (118, 1),\n", + " (119, 1),\n", + " (120, 1),\n", + " (121, 1),\n", + " (122, 3),\n", + " (123, 1),\n", + " (124, 1),\n", + " (125, 1),\n", + " (126, 1),\n", + " (127, 4),\n", + " (128, 3),\n", + " (129, 1),\n", + " (130, 1),\n", + " (131, 1),\n", + " (132, 1),\n", + " (133, 1),\n", + " (134, 1),\n", + " (135, 1),\n", + " (136, 1),\n", + " (137, 2),\n", + " (138, 1),\n", + " (139, 1),\n", + " (140, 2),\n", + " (141, 1),\n", + " (142, 1),\n", + " (143, 1),\n", + " (144, 1),\n", + " (145, 1),\n", + " (146, 1),\n", + " (147, 1),\n", + " (148, 1),\n", + " (149, 1),\n", + " (150, 2),\n", + " (151, 1)]]" + ] + }, + "execution_count": 150, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "bow_corpus[0:3]" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Step 4: Find optimal number of topics" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "metadata": {}, + "outputs": [], + "source": [ + "# Compute coherence values for various number of topics in order to pick the optimal one\n", + "#from gensim.models import CoherenceModel\n", + "#import matplotlib.pyplot as plt\n", + "from nautilus_nlp.models.topic_modeling import compute_coherence_values" + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "metadata": {}, + "outputs": [], + "source": [ + "# Take a long time to run\n", + "model_list, coherence_values = compute_coherence_values(dictionary=dictionary, bow_corpus=bow_corpus, texts=processed_docs, start=2, limit=25, step=4)\n" + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "[0.37900998646286865,\n", + " 0.42680154447577845,\n", + " 0.47716566398237525,\n", + " 0.5261650723885645,\n", + " 0.49607461078243215,\n", + " 0.4978727171365794]" + ] + }, + "execution_count": 17, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "coherence_values" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [], + "source": [ + "coherence_values = [0.37900998646286865,\n", + " 0.42680154447577845,\n", + " 0.47716566398237525,\n", + " 0.5261650723885645,\n", + " 0.49607461078243215,\n", + " 0.4978727171365794]" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [], + "source": [ + "from nautilus_nlp.models.topic_modeling import plot_optimal_topic_number" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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\n", + "text/plain": [ + "<Figure size 432x288 with 1 Axes>" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "plot_optimal_topic_number(coherence_values, start=2, limit=25, step=4)" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [], + "source": [ + "# Print the coherences scores for the number we tested\n", + "from nautilus_nlp.models.topic_modeling import print_coherence_scores" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Num Topics = 2 has Coherence Value of 0.379\n", + "Num Topics = 6 has Coherence Value of 0.4268\n", + "Num Topics = 10 has Coherence Value of 0.4772\n", + "Num Topics = 14 has Coherence Value of 0.5262\n", + "Num Topics = 18 has Coherence Value of 0.4961\n", + "Num Topics = 22 has Coherence Value of 0.4979\n" + ] + } + ], + "source": [ + "print_coherence_scores(coherence_values)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Step 5: Running LDA using Bag of Words" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "metadata": {}, + "outputs": [], + "source": [ + "# Train the LDA model with gensim\n", + "from nautilus_nlp.models.topic_modeling import train_lda_model" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "metadata": {}, + "outputs": [], + "source": [ + "model = train_lda_model(bow_corpus, dictionary, 10)" + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "<gensim.models.ldamodel.LdaModel at 0x1a2af3e208>" + ] + }, + "execution_count": 14, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "model" + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "metadata": {}, + "outputs": [], + "source": [ + "# Save model\n", + "from nautilus_nlp.models.topic_modeling import save_model" + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "metadata": {}, + "outputs": [], + "source": [ + "save_model(model,'/Users/williamjaubert/Documents/Allianz_William/notebook', 'ldamodel_nautilus')" + ] + }, + { + "cell_type": "code", + "execution_count": 152, + "metadata": {}, + "outputs": [], + "source": [ + "# Load model" + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "metadata": {}, + "outputs": [], + "source": [ + "from nautilus_nlp.models.topic_modeling import load_model" + ] + }, + { + "cell_type": "code", + "execution_count": 18, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "<gensim.models.ldamodel.LdaModel at 0x1a29985b38>" + ] + }, + "execution_count": 18, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "model_loaded = load_model('/Users/williamjaubert/Documents/Allianz_William/notebook', 'ldamodel_nautilus')\n", + "model_loaded" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Step 6: Visualize the top keywords per topic with Pyldavis interactive chart" + ] + }, + { + "cell_type": "code", + "execution_count": 19, + "metadata": {}, + "outputs": [], + "source": [ + "# Display the top keywords per topic in a interactive chart\n", + "from nautilus_nlp.models.topic_modeling import visualize_topics" + ] + }, + { + "cell_type": "code", + "execution_count": 155, + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/Users/williamjaubert/anaconda2/envs/nautilus/lib/python3.7/site-packages/pyLDAvis/_prepare.py:257: FutureWarning: Sorting because non-concatenation axis is not aligned. A future version\n", + "of pandas will change to not sort by default.\n", + "\n", + "To accept the future behavior, pass 'sort=False'.\n", + "\n", + "To retain the current behavior and silence the warning, pass 'sort=True'.\n", + "\n", + " return pd.concat([default_term_info] + list(topic_dfs))\n" + ] + }, + { + "data": { + "text/html": [ + "\n", + "<link rel=\"stylesheet\" type=\"text/css\" href=\"https://cdn.rawgit.com/bmabey/pyLDAvis/files/ldavis.v1.0.0.css\">\n", + "\n", + "\n", + "<div id=\"ldavis_el591011124095238088809029897\"></div>\n", + "<script type=\"text/javascript\">\n", + "\n", + "var ldavis_el591011124095238088809029897_data = {\"mdsDat\": {\"x\": [-0.07866945427665124, -0.01699948489792914, 0.20896689238873523, 0.14744605031212607, -0.008849073212760983, -0.04505413872814077, -0.08949897686453376, 0.10780299734830809, 0.004524270451044093, -0.22966908252019716], \"y\": [-0.15170611822961017, -0.1504468301902949, 0.08013685816591506, 0.13647834612774523, -0.009046128981188077, 0.003906923765221535, 0.14472746444813225, -0.07737607739594787, -0.1051004751701791, 0.1284260374602061], \"topics\": [1, 2, 3, 4, 5, 6, 7, 8, 9, 10], \"cluster\": [1, 1, 1, 1, 1, 1, 1, 1, 1, 1], \"Freq\": [13.182504653930664, 12.926197052001953, 12.463006973266602, 11.995771408081055, 9.55910873413086, 9.468682289123535, 8.927140235900879, 7.882134437561035, 7.024929523468018, 6.5705246925354]}, \"tinfo\": {\"Category\": [\"Default\", \"Default\", \"Default\", \"Default\", \"Default\", \"Default\", \"Default\", \"Default\", \"Default\", \"Default\", \"Default\", \"Default\", \"Default\", \"Default\", \"Default\", \"Default\", \"Default\", \"Default\", \"Default\", \"Default\", \"Default\", \"Default\", \"Default\", \"Default\", \"Default\", \"Default\", \"Default\", \"Default\", \"Default\", \"Default\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\"], \"Freq\": [2966.0, 1940.0, 1924.0, 1689.0, 2638.0, 2883.0, 1860.0, 1161.0, 1997.0, 1477.0, 1274.0, 1017.0, 1577.0, 1423.0, 1059.0, 1331.0, 1142.0, 2599.0, 837.0, 1391.0, 6052.0, 742.0, 990.0, 784.0, 1802.0, 1023.0, 4004.0, 867.0, 1191.0, 747.0, 1142.053466796875, 698.051025390625, 406.8222961425781, 375.23699951171875, 365.2066650390625, 324.94189453125, 317.34423828125, 293.73358154296875, 242.91064453125, 242.6265411376953, 238.57518005371094, 222.68365478515625, 219.24806213378906, 497.52392578125, 182.9066925048828, 189.0950927734375, 180.77523803710938, 167.61569213867188, 170.06529235839844, 162.4676055908203, 156.04241943359375, 152.99142456054688, 147.4279327392578, 144.96324157714844, 144.00845336914062, 142.54815673828125, 140.01528930664062, 137.27037048339844, 111.63591766357422, 111.36140441894531, 296.46563720703125, 234.76368713378906, 534.498779296875, 227.3394775390625, 733.4286499023438, 290.5852355957031, 1027.818603515625, 194.50514221191406, 462.2489929199219, 638.7830200195312, 383.04254150390625, 557.0740966796875, 270.9013671875, 346.3726501464844, 2339.714599609375, 353.4006042480469, 956.244140625, 1366.7689208984375, 489.0564880371094, 1502.89306640625, 432.21966552734375, 423.68536376953125, 946.1923828125, 647.3731689453125, 868.969970703125, 843.2189331054688, 679.2139892578125, 536.1270751953125, 452.23504638671875, 627.3469848632812, 723.7830200195312, 487.529541015625, 627.237060546875, 480.2855529785156, 485.9232482910156, 520.519287109375, 439.0638122558594, 1273.8934326171875, 843.1687622070312, 687.6259155273438, 378.13519287109375, 599.566650390625, 284.1808166503906, 264.9247131347656, 257.7122802734375, 233.3790283203125, 198.55160522460938, 196.56007385253906, 186.4253692626953, 185.77682495117188, 190.4823760986328, 160.68319702148438, 157.2107391357422, 147.51388549804688, 143.9427032470703, 141.29263305664062, 132.9550323486328, 132.7094268798828, 136.2650604248047, 134.08621215820312, 122.39493560791016, 117.66445922851562, 110.7325210571289, 103.35787200927734, 103.81564331054688, 102.61417388916016, 191.171142578125, 1897.55224609375, 734.2091674804688, 595.35400390625, 628.1231079101562, 206.7904815673828, 246.95516967773438, 800.1998901367188, 749.1170043945312, 336.15264892578125, 271.74371337890625, 265.7127990722656, 398.02044677734375, 574.3276977539062, 250.16622924804688, 378.8575744628906, 461.7618408203125, 1507.1781005859375, 256.8684997558594, 577.097900390625, 989.1630249023438, 369.29083251953125, 600.9321899414062, 735.2871704101562, 547.2880249023438, 671.5233154296875, 658.334716796875, 983.666259765625, 1571.5150146484375, 640.5947875976562, 527.5059204101562, 1109.0411376953125, 876.4497680664062, 725.8155517578125, 862.159912109375, 662.5055541992188, 745.251953125, 665.8281860351562, 603.2254028320312, 672.0674438476562, 613.41943359375, 579.7627563476562, 513.5291137695312, 478.60107421875, 261.23309326171875, 304.4447937011719, 182.0543975830078, 164.44281005859375, 158.4560546875, 152.0279083251953, 137.8629150390625, 135.1473846435547, 117.27381896972656, 101.5247573852539, 100.54000091552734, 94.55840301513672, 94.07215118408203, 92.82543182373047, 88.48568725585938, 85.05994415283203, 77.8740005493164, 76.19078063964844, 74.76761627197266, 76.91588592529297, 66.26870727539062, 65.83450317382812, 62.59058380126953, 61.630924224853516, 56.66929244995117, 56.645973205566406, 56.47174072265625, 56.24151611328125, 433.3631896972656, 57.639102935791016, 175.34927368164062, 811.6905517578125, 352.3057861328125, 460.812255859375, 1244.349853515625, 397.7268981933594, 319.0634765625, 364.1428527832031, 817.1531372070312, 179.1089630126953, 759.2709350585938, 353.8210754394531, 767.8507690429688, 704.0316772460938, 1031.0333251953125, 338.7200927734375, 853.117919921875, 1558.565673828125, 1291.274169921875, 922.3545532226562, 1345.4871826171875, 471.7730407714844, 490.044677734375, 677.4464111328125, 1059.08154296875, 853.1986083984375, 843.7091064453125, 1006.580078125, 803.4461669921875, 784.5733642578125, 584.6500854492188, 572.8038330078125, 507.68548583984375, 934.7852172851562, 496.4774169921875, 583.20458984375, 623.8618774414062, 588.018798828125, 614.8836059570312, 528.0966796875, 511.22735595703125, 511.70477294921875, 866.5625, 316.72491455078125, 249.29571533203125, 229.9024200439453, 228.7355194091797, 211.55052185058594, 183.0289764404297, 166.1912841796875, 164.7910919189453, 155.55848693847656, 157.89810180664062, 359.6870422363281, 133.46632385253906, 124.17170715332031, 122.31271362304688, 117.03710174560547, 111.25904083251953, 110.83535766601562, 109.16374969482422, 103.2101821899414, 98.91426849365234, 514.7677612304688, 89.62791442871094, 82.74832153320312, 81.71601104736328, 103.25068664550781, 75.25823974609375, 75.21469116210938, 70.78433990478516, 69.34544372558594, 281.78009033203125, 311.1195983886719, 971.2630004882812, 208.0179901123047, 697.1331787109375, 367.6048889160156, 1416.3004150390625, 441.63726806640625, 604.5337524414062, 578.8893432617188, 377.5198974609375, 192.00442504882812, 648.3333129882812, 1969.8912353515625, 938.5662841796875, 446.4165954589844, 632.349853515625, 658.6181030273438, 1989.853515625, 746.8209838867188, 677.7993774414062, 282.14984130859375, 467.3210144042969, 480.8096008300781, 1419.96630859375, 633.1287841796875, 1121.6055908203125, 955.2998046875, 821.8631591796875, 1269.9896240234375, 524.8942260742188, 1015.9119262695312, 611.8196411132812, 745.4178466796875, 688.518310546875, 667.1979370117188, 692.5172729492188, 593.0750732421875, 527.0308837890625, 546.2483520507812, 266.1346740722656, 171.08937072753906, 155.6071014404297, 226.88490295410156, 131.5532684326172, 110.63844299316406, 109.71115112304688, 476.2266540527344, 123.79460144042969, 96.52826690673828, 90.6929702758789, 86.91134643554688, 84.75259399414062, 84.67416381835938, 83.132080078125, 249.04006958007812, 73.44264221191406, 70.66631317138672, 70.3055419921875, 68.83519744873047, 66.711181640625, 65.8822250366211, 60.60839080810547, 60.293426513671875, 59.59612274169922, 59.43571472167969, 59.13909149169922, 58.31281661987305, 57.815277099609375, 57.416988372802734, 405.0425720214844, 341.4366455078125, 190.89840698242188, 246.23365783691406, 163.5123748779297, 257.450927734375, 138.4132537841797, 165.08370971679688, 521.0137939453125, 1046.2774658203125, 1400.850341796875, 228.16041564941406, 286.63897705078125, 343.24639892578125, 185.74090576171875, 229.64581298828125, 175.05548095703125, 332.4627990722656, 163.81402587890625, 539.6653442382812, 256.2196960449219, 439.739990234375, 517.5452270507812, 403.49468994140625, 229.62326049804688, 866.29833984375, 846.667236328125, 313.1244812011719, 322.8232727050781, 286.90380859375, 653.3579711914062, 749.8698120117188, 426.6073913574219, 380.0177307128906, 366.8009338378906, 372.0513000488281, 408.4660949707031, 415.6255187988281, 394.1338806152344, 394.38397216796875, 349.50030517578125, 362.36224365234375, 340.7713928222656, 296.1283264160156, 297.5120544433594, 494.6736145019531, 745.9381103515625, 324.6826171875, 301.4449157714844, 243.7447509765625, 158.0723114013672, 107.36814880371094, 95.01725769042969, 99.29867553710938, 90.99311828613281, 88.6338119506836, 79.3241195678711, 77.81040954589844, 76.27904510498047, 74.54589080810547, 68.68617248535156, 66.95494079589844, 65.45933532714844, 64.79324340820312, 62.89622497558594, 62.08100891113281, 61.05073547363281, 61.06211853027344, 58.696773529052734, 57.729122161865234, 57.52412796020508, 57.392601013183594, 53.51804733276367, 53.08519744873047, 81.03302001953125, 466.35260009765625, 629.77294921875, 272.4296569824219, 229.77696228027344, 524.4228515625, 169.0817413330078, 106.43704223632812, 468.2314453125, 321.1058044433594, 72.86363220214844, 215.64427185058594, 420.0905456542969, 254.936279296875, 238.94183349609375, 170.37852478027344, 161.82167053222656, 350.8217468261719, 510.25213623046875, 280.4100646972656, 479.9981384277344, 199.64524841308594, 294.40740966796875, 258.040771484375, 376.53106689453125, 509.9411315917969, 1114.2279052734375, 256.09857177734375, 426.6061096191406, 319.6000671386719, 739.0277099609375, 280.2876281738281, 489.2537536621094, 542.6870727539062, 517.612060546875, 617.3828125, 513.236083984375, 436.5743408203125, 490.99383544921875, 506.68548583984375, 460.2646179199219, 441.2579650878906, 394.2334899902344, 351.31146240234375, 347.7322082519531, 353.1181640625, 336.91925048828125, 275.0069580078125, 206.27684020996094, 205.90945434570312, 185.4871826171875, 142.34490966796875, 138.4669952392578, 125.22058868408203, 124.95114135742188, 113.3163070678711, 111.33777618408203, 109.3900375366211, 105.71350860595703, 106.33345794677734, 292.8968505859375, 101.52547454833984, 98.16709899902344, 98.09191131591797, 96.69923400878906, 95.24166107177734, 93.9153823852539, 90.94029998779297, 90.11663055419922, 204.05540466308594, 83.51455688476562, 83.17984008789062, 82.09905242919922, 80.06827545166016, 80.04055786132812, 78.980224609375, 77.4798812866211, 624.8594970703125, 218.5560302734375, 299.7873840332031, 218.3317108154297, 189.689208984375, 356.6500244140625, 202.47463989257812, 417.00213623046875, 238.63824462890625, 212.27218627929688, 149.84323120117188, 211.9496612548828, 303.9140319824219, 120.32109832763672, 237.6540069580078, 454.90960693359375, 334.02545166015625, 980.60107421875, 485.4506530761719, 911.4451293945312, 590.2950439453125, 261.2230529785156, 253.1405487060547, 366.6529846191406, 366.9601745605469, 261.4512939453125, 595.4712524414062, 534.0038452148438, 534.01806640625, 583.53955078125, 307.2271728515625, 439.3746337890625, 370.1558837890625, 337.7717590332031, 344.1768798828125, 325.05975341796875, 340.1703796386719, 337.7772521972656, 350.0632019042969, 294.64581298828125, 276.3277282714844, 278.6572570800781, 1160.9132080078125, 424.62060546875, 361.99005126953125, 388.82080078125, 255.19793701171875, 223.3960723876953, 186.81495666503906, 150.93563842773438, 148.38706970214844, 142.3661346435547, 778.7778930664062, 125.96311950683594, 122.38629150390625, 113.5186538696289, 111.00336456298828, 117.1114730834961, 97.79452514648438, 95.15584564208984, 154.03953552246094, 85.85616302490234, 85.81739044189453, 83.90367126464844, 83.07220458984375, 81.03001403808594, 86.70967102050781, 72.22313690185547, 70.94837188720703, 66.05683135986328, 65.33727264404297, 61.60311508178711, 632.0007934570312, 967.30859375, 392.4784851074219, 86.92008972167969, 116.71688079833984, 384.4781188964844, 955.042724609375, 325.5193786621094, 154.01246643066406, 168.04747009277344, 886.2265014648438, 877.4567260742188, 327.182373046875, 468.3438720703125, 329.43048095703125, 302.31689453125, 346.5965576171875, 350.2645568847656, 277.72235107421875, 424.45953369140625, 266.9029541015625, 332.0311279296875, 578.3032836914062, 328.37042236328125, 429.90313720703125, 517.5341796875, 400.9313049316406, 346.2950439453125, 433.3561706542969, 421.4360656738281, 338.9404296875, 347.58477783203125, 348.44537353515625, 336.6087646484375, 398.3597717285156, 299.83258056640625, 164.6500701904297, 151.26080322265625, 134.79344177246094, 134.80828857421875, 128.793701171875, 120.1890640258789, 119.80301666259766, 103.68548583984375, 93.05211639404297, 105.72232055664062, 91.11929321289062, 88.88138580322266, 86.48152923583984, 83.19112396240234, 82.55461120605469, 76.6363754272461, 73.92579650878906, 137.45323181152344, 73.58349609375, 73.43082427978516, 297.8049011230469, 71.5206298828125, 71.5206298828125, 71.3747329711914, 68.60582733154297, 70.64566802978516, 67.04659271240234, 64.61957550048828, 137.57745361328125, 329.9684753417969, 498.6695861816406, 418.2132568359375, 321.6349182128906, 192.26394653320312, 436.7302551269531, 120.439208984375, 101.71742248535156, 189.6542205810547, 107.88106536865234, 180.2874298095703, 406.497802734375, 219.2530975341797, 311.04937744140625, 276.8253479003906, 364.5852966308594, 122.61643981933594, 431.5494079589844, 148.8873748779297, 478.0677490234375, 448.4655456542969, 560.1489868164062, 235.38340759277344, 220.0799560546875, 236.9700927734375, 525.8984985351562, 310.49981689453125, 195.21343994140625, 465.0462341308594, 342.694091796875, 343.89752197265625, 252.4918212890625, 252.31494140625, 359.3658447265625, 365.0567932128906, 297.0661926269531, 278.8648681640625, 264.2499084472656, 271.7898864746094, 266.98651123046875, 258.7191467285156, 836.8704223632812, 741.7591552734375, 348.10552978515625, 262.6591491699219, 234.72032165527344, 225.7039337158203, 214.6396026611328, 197.21083068847656, 176.1952667236328, 163.72848510742188, 159.68936157226562, 156.55722045898438, 155.55181884765625, 147.1693572998047, 143.7874298095703, 151.92002868652344, 140.55010986328125, 133.0448760986328, 131.79173278808594, 122.37577819824219, 118.65946197509766, 115.63384246826172, 112.4041748046875, 112.22483825683594, 111.79792022705078, 119.11126708984375, 102.07164001464844, 93.44534301757812, 92.23983764648438, 89.7243881225586, 218.44508361816406, 151.80226135253906, 955.4397583007812, 178.94818115234375, 1384.116455078125, 160.98158264160156, 191.5667724609375, 221.75938415527344, 157.25833129882812, 1290.715576171875, 920.77001953125, 312.8064880371094, 623.1017456054688, 397.7396240234375, 455.4387512207031, 379.9434814453125, 351.7613220214844, 356.9765625, 374.8453063964844, 212.81954956054688, 346.64404296875, 312.8064270019531, 333.1448669433594, 336.0579528808594, 600.3089599609375, 295.4515380859375, 283.6612548828125, 250.14752197265625, 267.23590087890625, 330.6805114746094, 358.020263671875, 262.1649475097656, 242.10182189941406], \"Term\": [\"window\", \"game\", \"christian\", \"team\", \"drive\", \"file\", \"space\", \"encrypt\", \"govern\", \"chip\", \"jesus\", \"israel\", \"card\", \"play\", \"secur\", \"nasa\", \"armenian\", \"program\", \"isra\", \"imag\", \"peopl\", \"hockey\", \"player\", \"clipper\", \"public\", \"disk\", \"year\", \"scsi\", \"driver\", \"bike\", \"armenian\", \"turkish\", \"turk\", \"turkey\", \"armenia\", \"koresh\", \"nazi\", \"militia\", \"serdar\", \"argic\", \"genocid\", \"davidian\", \"troop\", \"murder\", \"mormon\", \"prison\", \"massacr\", \"azeri\", \"ethnic\", \"azerbaijani\", \"hitler\", \"iran\", \"zuma\", \"sdpa\", \"motto\", \"azerbaijan\", \"extermin\", \"sera\", \"urartu\", \"slaughter\", \"villag\", \"batf\", \"greek\", \"greec\", \"jew\", \"soldier\", \"kill\", \"waco\", \"arm\", \"countri\", \"muslim\", \"children\", \"armi\", \"popul\", \"peopl\", \"anti\", \"govern\", \"right\", \"attack\", \"say\", \"polit\", \"death\", \"state\", \"live\", \"go\", \"come\", \"tell\", \"happen\", \"forc\", \"world\", \"time\", \"nation\", \"want\", \"leav\", \"start\", \"year\", \"take\", \"jesus\", \"bibl\", \"atheist\", \"atheism\", \"christ\", \"scriptur\", \"cathol\", \"sandvik\", \"doctrin\", \"revel\", \"biblic\", \"satan\", \"atho\", \"livesey\", \"prophet\", \"divin\", \"vers\", \"gospel\", \"sabbath\", \"god\", \"sin\", \"resurrect\", \"solntz\", \"testament\", \"theolog\", \"propheci\", \"theist\", \"schneider\", \"jaeger\", \"marriag\", \"christian\", \"church\", \"belief\", \"faith\", \"worship\", \"contradict\", \"moral\", \"religion\", \"lord\", \"heaven\", \"holi\", \"rutger\", \"truth\", \"spirit\", \"teach\", \"islam\", \"believ\", \"etern\", \"argument\", \"exist\", \"religi\", \"evid\", \"word\", \"love\", \"life\", \"claim\", \"mean\", \"peopl\", \"true\", \"accept\", \"say\", \"question\", \"reason\", \"thing\", \"person\", \"come\", \"good\", \"read\", \"time\", \"point\", \"follow\", \"motif\", \"widget\", \"xterm\", \"visual\", \"xlib\", \"polygon\", \"baalk\", \"contrib\", \"toolkit\", \"kelvin\", \"pyron\", \"suno\", \"deskjet\", \"xpert\", \"plaintext\", \"skndiv\", \"openwindow\", \"xview\", \"ether\", \"quicktim\", \"magellan\", \"utah\", \"greenbelt\", \"reilli\", \"ualberta\", \"copper\", \"ciphertext\", \"autom\", \"gradi\", \"dillon\", \"font\", \"handbook\", \"binari\", \"server\", \"client\", \"librari\", \"imag\", \"anonym\", \"compil\", \"resourc\", \"graphic\", \"map\", \"applic\", \"archiv\", \"user\", \"code\", \"avail\", \"directori\", \"sourc\", \"file\", \"mail\", \"list\", \"program\", \"function\", \"format\", \"email\", \"inform\", \"version\", \"softwar\", \"includ\", \"send\", \"data\", \"internet\", \"address\", \"display\", \"window\", \"copi\", \"access\", \"distribut\", \"thank\", \"look\", \"book\", \"group\", \"need\", \"scsi\", \"simm\", \"motherboard\", \"cach\", \"bio\", \"quadra\", \"diamond\", \"vram\", \"vesa\", \"centri\", \"swap\", \"upgrad\", \"char\", \"eisa\", \"intercon\", \"nubus\", \"ethernet\", \"svga\", \"amanda\", \"meg\", \"cadr\", \"mous\", \"maxtor\", \"config\", \"cica\", \"tiff\", \"adaptec\", \"powerbook\", \"ctrl\", \"esdi\", \"jumper\", \"floppi\", \"disk\", \"umich\", \"video\", \"modem\", \"card\", \"output\", \"monitor\", \"mode\", \"printer\", \"spec\", \"entri\", \"drive\", \"driver\", \"port\", \"instal\", \"memori\", \"window\", \"color\", \"appl\", \"byte\", \"screen\", \"board\", \"problem\", \"machin\", \"file\", \"thank\", \"control\", \"work\", \"speed\", \"need\", \"hard\", \"help\", \"program\", \"want\", \"time\", \"repli\", \"softwar\", \"distribut\", \"alaska\", \"spencer\", \"oracl\", \"dseg\", \"aurora\", \"nsmca\", \"engr\", \"launch\", \"uoknor\", \"callison\", \"kaldi\", \"zoolog\", \"mccall\", \"ucsc\", \"hallam\", \"lunar\", \"automot\", \"raider\", \"theodor\", \"dock\", \"shafer\", \"mksol\", \"hydro\", \"ssto\", \"plymouth\", \"redesign\", \"laughter\", \"rockwel\", \"desi\", \"stimulus\", \"moon\", \"henri\", \"mar\", \"job\", \"wheel\", \"billion\", \"invest\", \"spacecraft\", \"orbit\", \"nasa\", \"space\", \"shuttl\", \"satellit\", \"fund\", \"probe\", \"flight\", \"helmet\", \"station\", \"solar\", \"presid\", \"mission\", \"earth\", \"cost\", \"money\", \"vehicl\", \"year\", \"work\", \"project\", \"toronto\", \"spend\", \"go\", \"time\", \"engin\", \"long\", \"high\", \"power\", \"thing\", \"say\", \"look\", \"peopl\", \"program\", \"want\", \"need\", \"design\", \"build\", \"firearm\", \"bike\", \"motorcycl\", \"magnus\", \"rider\", \"honda\", \"veal\", \"utkvm\", \"centerlin\", \"cactus\", \"rkba\", \"harley\", \"shotgun\", \"pistol\", \"ranck\", \"boyl\", \"husc\", \"ifa\", \"smuggl\", \"fischer\", \"counterst\", \"armori\", \"trunk\", \"thomasp\", \"imak\", \"photographi\", \"concordia\", \"tennesse\", \"yamaha\", \"frost\", \"car\", \"ohio\", \"uchicago\", \"rid\", \"gun\", \"brake\", \"shaft\", \"cwru\", \"auto\", \"wagon\", \"handgun\", \"cleveland\", \"ride\", \"tire\", \"urbana\", \"midway\", \"insur\", \"uiuc\", \"dealer\", \"weapon\", \"iastat\", \"owner\", \"illinoi\", \"crime\", \"price\", \"state\", \"freenet\", \"sell\", \"buy\", \"good\", \"road\", \"drive\", \"right\", \"look\", \"peopl\", \"want\", \"case\", \"thing\", \"time\", \"go\", \"distribut\", \"repli\", \"engin\", \"opinion\", \"problem\", \"need\", \"gatech\", \"cub\", \"fnal\", \"prism\", \"hitter\", \"pitcher\", \"alomar\", \"uicvm\", \"higgin\", \"inning\", \"revolv\", \"hulman\", \"yanke\", \"pitch\", \"catcher\", \"dodger\", \"blast\", \"starter\", \"tiger\", \"met\", \"bat\", \"nore\", \"outlet\", \"rocki\", \"jay\", \"sdsu\", \"volt\", \"lopez\", \"restaur\", \"lamp\", \"wire\", \"duke\", \"circuit\", \"batteri\", \"brave\", \"basebal\", \"hit\", \"berkeley\", \"jason\", \"ball\", \"metal\", \"jeff\", \"grind\", \"larc\", \"indiana\", \"netcom\", \"colorado\", \"year\", \"run\", \"good\", \"game\", \"smith\", \"scott\", \"player\", \"home\", \"stanford\", \"look\", \"distribut\", \"go\", \"time\", \"lose\", \"come\", \"start\", \"play\", \"david\", \"best\", \"better\", \"power\", \"thing\", \"john\", \"sale\", \"great\", \"encrypt\", \"escrow\", \"privaci\", \"ripem\", \"crypto\", \"wiretap\", \"cryptographi\", \"cipher\", \"decrypt\", \"hamburg\", \"clipper\", \"homicid\", \"bontchev\", \"gtoal\", \"crypt\", \"clarkson\", \"rwing\", \"surveil\", \"nist\", \"sternlight\", \"den\", \"ncsl\", \"qualcomm\", \"fbihh\", \"cryptograph\", \"tampa\", \"mime\", \"vesselin\", \"lyme\", \"strnlght\", \"key\", \"secur\", \"enforc\", \"recipi\", \"classifi\", \"secret\", \"chip\", \"agenc\", \"patent\", \"scheme\", \"public\", \"govern\", \"algorithm\", \"protect\", \"propos\", \"administr\", \"privat\", \"clinton\", \"feder\", \"phone\", \"court\", \"devic\", \"number\", \"communic\", \"technolog\", \"inform\", \"provid\", \"author\", \"state\", \"right\", \"messag\", \"data\", \"peopl\", \"need\", \"diseas\", \"stratus\", \"dyer\", \"diet\", \"robi\", \"infect\", \"syndrom\", \"methodolog\", \"physician\", \"cure\", \"intellect\", \"einstein\", \"chopin\", \"candida\", \"sphere\", \"yeast\", \"chastiti\", \"halat\", \"therapi\", \"clinic\", \"migrain\", \"steveh\", \"patient\", \"catbyt\", \"dtmedin\", \"blah\", \"carlo\", \"superstit\", \"baerga\", \"homeopathi\", \"skeptic\", \"gordon\", \"pitt\", \"medic\", \"doctor\", \"medicin\", \"food\", \"cancer\", \"sleev\", \"ingr\", \"genet\", \"aid\", \"bank\", \"treatment\", \"water\", \"pain\", \"health\", \"handheld\", \"studi\", \"princeton\", \"caus\", \"effect\", \"scienc\", \"scientif\", \"rochest\", \"theori\", \"point\", \"result\", \"risk\", \"problem\", \"research\", \"case\", \"steve\", \"test\", \"time\", \"peopl\", \"repli\", \"take\", \"differ\", \"year\", \"say\", \"thing\", \"isra\", \"hockey\", \"playoff\", \"palestinian\", \"detroit\", \"leaf\", \"cramer\", \"optilink\", \"pen\", \"cunixb\", \"lebanes\", \"penguin\", \"clayton\", \"jake\", \"maynard\", \"espn\", \"edmonton\", \"ericsson\", \"boni\", \"lemieux\", \"gaza\", \"puck\", \"bruin\", \"selann\", \"laurentian\", \"quebec\", \"ramsey\", \"canuck\", \"shark\", \"uvic\", \"montreal\", \"flyer\", \"israel\", \"stanley\", \"team\", \"jet\", \"coach\", \"ranger\", \"winnipeg\", \"game\", \"play\", \"wing\", \"player\", \"columbia\", \"season\", \"leagu\", \"pittsburgh\", \"score\", \"arab\", \"mcgill\", \"goal\", \"virginia\", \"toronto\", \"andrew\", \"year\", \"divis\", \"canada\", \"period\", \"final\", \"point\", \"time\", \"american\", \"go\"], \"Total\": [2966.0, 1940.0, 1924.0, 1689.0, 2638.0, 2883.0, 1860.0, 1161.0, 1997.0, 1477.0, 1274.0, 1017.0, 1577.0, 1423.0, 1059.0, 1331.0, 1142.0, 2599.0, 837.0, 1391.0, 6052.0, 742.0, 990.0, 784.0, 1802.0, 1023.0, 4004.0, 867.0, 1191.0, 747.0, 1142.9583740234375, 698.9558715820312, 407.7272644042969, 376.1419677734375, 366.1116027832031, 325.846923828125, 318.256103515625, 294.6385803222656, 243.81558227539062, 243.53146362304688, 239.4801788330078, 223.58860778808594, 220.15757751464844, 499.85150146484375, 183.81178283691406, 190.03121948242188, 181.68017578125, 168.52059936523438, 170.9886474609375, 163.3725128173828, 156.9473876953125, 153.92347717285156, 148.33285522460938, 145.86817932128906, 144.91348266601562, 143.45306396484375, 140.92027282714844, 138.17529296875, 112.54084014892578, 112.26637268066406, 299.7375183105469, 239.29400634765625, 575.2765502929688, 235.9622802734375, 846.9027709960938, 310.8525390625, 1292.4876708984375, 203.65432739257812, 568.353271484375, 904.962890625, 498.3378601074219, 821.7328491210938, 317.7273254394531, 442.4293212890625, 6052.71826171875, 470.1575927734375, 1997.7261962890625, 3614.68310546875, 771.352294921875, 4395.67724609375, 753.4012451171875, 729.086181640625, 3490.054931640625, 1666.260986328125, 3510.730712890625, 3362.533203125, 2458.84814453125, 1374.8798828125, 910.499755859375, 2752.30859375, 5183.146484375, 1404.34228515625, 3617.8427734375, 1561.9661865234375, 1909.119873046875, 4004.7578125, 1884.1258544921875, 1274.8072509765625, 844.0818481445312, 688.539794921875, 379.0483093261719, 601.0935668945312, 285.09393310546875, 265.8420715332031, 258.6253356933594, 234.29208374023438, 199.46600341796875, 197.48406982421875, 187.33848571777344, 186.6898651123047, 191.4882049560547, 161.5964813232422, 158.12852478027344, 148.4269561767578, 144.8557891845703, 142.2056884765625, 133.86817932128906, 133.62254333496094, 137.21395874023438, 135.0694580078125, 123.30796813964844, 118.57750701904297, 111.64559173583984, 104.27090454101562, 104.75077056884766, 103.53997039794922, 192.9781494140625, 1924.27099609375, 744.6122436523438, 604.4033203125, 642.59033203125, 209.4973907470703, 250.70823669433594, 845.6991577148438, 828.4187622070312, 355.5498962402344, 287.80279541015625, 282.96514892578125, 442.15399169921875, 692.941650390625, 269.9664001464844, 446.063232421875, 578.8197021484375, 2561.731689453125, 282.8346862792969, 815.131103515625, 1699.9537353515625, 474.3492126464844, 965.217041015625, 1333.0904541015625, 902.1407470703125, 1251.4853515625, 1317.3157958984375, 2641.86328125, 6052.71826171875, 1353.2069091796875, 1006.9673461914062, 4395.67724609375, 2872.182373046875, 1977.921142578125, 3329.212646484375, 2056.0078125, 3362.533203125, 3754.421630859375, 2277.20947265625, 5183.146484375, 2646.791748046875, 1892.4102783203125, 514.4351806640625, 479.50714111328125, 262.1397399902344, 305.83587646484375, 182.9683837890625, 165.35598754882812, 159.36215209960938, 152.93394470214844, 138.76898193359375, 136.0535125732422, 118.18011474609375, 102.43084716796875, 101.44613647460938, 95.46444702148438, 94.97850036621094, 93.73173522949219, 89.39283752441406, 85.96602630615234, 78.7806625366211, 77.0969467163086, 75.67371368408203, 77.94976806640625, 67.175048828125, 66.74057006835938, 63.496917724609375, 62.537330627441406, 57.57563018798828, 57.55217742919922, 57.37797546386719, 57.14778137207031, 448.4683532714844, 58.572509765625, 180.8592987060547, 872.3430786132812, 374.06121826171875, 495.9429626464844, 1391.43896484375, 440.9508361816406, 358.4921875, 426.1166076660156, 1054.60791015625, 199.59127807617188, 1032.4814453125, 440.00604248046875, 1078.350341796875, 1021.1267700195312, 1669.3359375, 441.453857421875, 1374.5584716796875, 2883.885009765625, 2375.208984375, 1560.8458251953125, 2599.861083984375, 691.8548583984375, 736.162841796875, 1159.2723388671875, 2169.24072265625, 1621.163818359375, 1630.7625732421875, 2103.295166015625, 1606.180419921875, 1650.9979248046875, 1085.847412109375, 1067.4688720703125, 839.1293334960938, 2966.575439453125, 872.5662231445312, 1443.37353515625, 3038.84619140625, 2288.467041015625, 3375.03759765625, 1421.1026611328125, 1956.768310546875, 3517.123046875, 867.474609375, 317.6370849609375, 250.2078857421875, 230.81463623046875, 229.64767456054688, 212.46270751953125, 183.9412384033203, 167.1034393310547, 165.70335388183594, 156.47067260742188, 158.83648681640625, 362.0737609863281, 134.3785400390625, 125.08387756347656, 123.22496032714844, 117.94927215576172, 112.17121124267578, 111.74752807617188, 110.07601928710938, 104.12238311767578, 99.82821655273438, 519.7879028320312, 90.54007720947266, 83.6605224609375, 82.62821197509766, 104.4683609008789, 76.17040252685547, 76.12688446044922, 71.69654846191406, 70.25760650634766, 287.13433837890625, 317.7306213378906, 1023.171630859375, 213.97854614257812, 736.9544067382812, 385.19146728515625, 1577.8919677734375, 487.7062683105469, 681.5418701171875, 651.6162719726562, 414.86236572265625, 202.35662841796875, 773.6254272460938, 2638.13232421875, 1191.0015869140625, 521.5247192382812, 771.9718017578125, 825.6636962890625, 2966.575439453125, 979.6791381835938, 877.6451416015625, 316.51470947265625, 603.8773803710938, 656.5188598632812, 3254.474609375, 1051.1627197265625, 2883.885009765625, 2288.467041015625, 1818.994384765625, 3998.2919921875, 901.1752319335938, 3517.123046875, 1391.7735595703125, 2348.58544921875, 2599.861083984375, 3617.8427734375, 5183.146484375, 2732.19384765625, 1630.7625732421875, 3038.84619140625, 267.0453796386719, 172.00009155273438, 156.51791381835938, 228.30894470214844, 132.46392822265625, 111.54907989501953, 110.62195587158203, 480.2484436035156, 124.94286346435547, 97.43895721435547, 91.60369873046875, 87.82199096679688, 85.66326904296875, 85.5849838256836, 84.04283142089844, 251.9351348876953, 74.35344696044922, 71.57764434814453, 71.21640014648438, 69.74593353271484, 67.621826171875, 66.79296875, 61.51911544799805, 61.20405960083008, 60.507171630859375, 60.3464469909668, 60.049827575683594, 59.223548889160156, 58.72600173950195, 58.32766342163086, 415.9969177246094, 351.1897888183594, 197.73948669433594, 259.179931640625, 170.87942504882812, 275.1635437011719, 144.31858825683594, 174.99098205566406, 592.9318237304688, 1331.52294921875, 1860.757080078125, 257.59454345703125, 337.9649353027344, 441.3335266113281, 216.22386169433594, 284.1152038574219, 205.7539520263672, 455.2716064453125, 191.22592163085938, 874.0577392578125, 344.72601318359375, 726.9236450195312, 1014.5396728515625, 862.5274658203125, 336.988525390625, 4004.7578125, 3998.2919921875, 641.9602661132812, 701.0911865234375, 556.97900390625, 3510.730712890625, 5183.146484375, 1432.9891357421875, 1579.425048828125, 1517.998779296875, 1785.55322265625, 3329.212646484375, 4395.67724609375, 3375.03759765625, 6052.71826171875, 2599.861083984375, 3617.8427734375, 3517.123046875, 1000.6277465820312, 1483.8935546875, 495.75604248046875, 747.6323852539062, 325.6590576171875, 302.3562316894531, 244.9889373779297, 158.984375, 108.27942657470703, 95.92851257324219, 100.2811050415039, 91.90436553955078, 89.54524993896484, 80.2354736328125, 78.72178649902344, 77.19053649902344, 75.45713806152344, 69.597412109375, 67.86634826660156, 66.37062072753906, 65.70732879638672, 63.8077507019043, 62.99225997924805, 61.962032318115234, 61.97679901123047, 59.60800552368164, 58.64104080200195, 58.435726165771484, 58.304039001464844, 54.42936325073242, 53.9964599609375, 82.42547607421875, 485.2928161621094, 668.453857421875, 284.9857482910156, 240.66868591308594, 577.3370971679688, 179.90098571777344, 111.21246337890625, 528.9305419921875, 357.5130920410156, 74.67018127441406, 242.34796142578125, 502.91082763671875, 297.4255065917969, 281.2111511230469, 192.33499145507812, 183.03675842285156, 466.62225341796875, 750.7398681640625, 366.5124206542969, 724.8843994140625, 250.30677795410156, 415.81964111328125, 353.0357971191406, 657.6669921875, 1070.5751953125, 3490.054931640625, 395.5933837890625, 983.7587890625, 606.9414672851562, 3754.421630859375, 598.3028564453125, 2638.13232421875, 3614.68310546875, 3375.03759765625, 6052.71826171875, 3617.8427734375, 2113.20703125, 3329.212646484375, 5183.146484375, 3510.730712890625, 3038.84619140625, 2732.19384765625, 1432.9891357421875, 1407.867431640625, 3254.474609375, 3517.123046875, 275.9194030761719, 207.18922424316406, 206.8258819580078, 186.39959716796875, 143.2572784423828, 139.37933349609375, 126.13304901123047, 125.86357116699219, 114.22874450683594, 112.2500991821289, 110.30248260498047, 106.6259765625, 107.28164672851562, 295.5258483886719, 102.43778991699219, 99.07945251464844, 99.00546264648438, 97.61188507080078, 96.15435791015625, 94.82772827148438, 91.85266876220703, 91.02910614013672, 206.18264770507812, 84.4303970336914, 84.09229278564453, 83.01145935058594, 80.98065185546875, 80.95291900634766, 79.89276885986328, 78.3923110961914, 639.2734985351562, 227.38116455078125, 323.03533935546875, 231.72528076171875, 201.03939819335938, 428.90643310546875, 227.24929809570312, 525.6275634765625, 277.0840148925781, 257.5661926269531, 175.59457397460938, 284.0149841308594, 476.76812744140625, 133.43386840820312, 365.1957092285156, 1031.8046875, 640.5604858398438, 4004.7578125, 1280.048828125, 3754.421630859375, 1940.664794921875, 488.3008117675781, 472.29498291015625, 990.5671997070312, 1023.2589111328125, 516.36962890625, 3375.03759765625, 3038.84619140625, 3510.730712890625, 5183.146484375, 818.5213623046875, 3362.533203125, 1909.119873046875, 1423.9302978515625, 1658.5966796875, 1346.392578125, 1717.5321044921875, 1785.55322265625, 3329.212646484375, 1491.183349609375, 990.2796630859375, 1542.3779296875, 1161.82763671875, 425.534912109375, 362.9170837402344, 390.07720947265625, 256.1122741699219, 224.3104248046875, 187.7305145263672, 151.85064697265625, 149.30140686035156, 143.2805633544922, 784.3641357421875, 126.87757873535156, 123.3006362915039, 114.4344482421875, 111.93732452392578, 118.14889526367188, 98.71028137207031, 96.07027435302734, 155.55857849121094, 86.7708511352539, 86.73173522949219, 84.81802368164062, 83.986572265625, 81.9443588256836, 87.70350646972656, 73.1382064819336, 71.86477661132812, 66.9711685180664, 66.25181579589844, 62.517635345458984, 659.2316284179688, 1059.598876953125, 429.4156188964844, 89.67327117919922, 124.43817138671875, 474.16644287109375, 1477.454345703125, 430.59686279296875, 178.9176788330078, 204.3567657470703, 1802.1553955078125, 1997.7261962890625, 534.6806030273438, 906.1632690429688, 556.0820922851562, 491.48968505859375, 613.686279296875, 662.98681640625, 470.2344665527344, 1022.1227416992188, 480.7737121582031, 730.9078369140625, 2365.543212890625, 763.0506591796875, 1372.5093994140625, 2169.24072265625, 1377.2835693359375, 1170.3818359375, 3490.054931640625, 3614.68310546875, 1280.4110107421875, 1650.9979248046875, 6052.71826171875, 3517.123046875, 399.2857971191406, 300.7450866699219, 165.56256103515625, 152.17401123046875, 135.70590209960938, 135.72186279296875, 129.70895385742188, 121.10151672363281, 120.7160415649414, 104.59820556640625, 93.9645767211914, 106.77874755859375, 92.03182983398438, 89.7938003540039, 87.39402770996094, 84.10354614257812, 83.46707916259766, 77.56388092041016, 74.8382339477539, 139.152099609375, 74.49637603759766, 74.3432388305664, 301.5867919921875, 72.43302154541016, 72.43302154541016, 72.28717041015625, 69.51831817626953, 71.5958480834961, 67.95915222167969, 65.53195190429688, 140.31385803222656, 354.61895751953125, 560.2183227539062, 467.14312744140625, 372.5074157714844, 214.2539520263672, 528.296142578125, 128.81614685058594, 106.81172180175781, 215.3028564453125, 114.34998321533203, 206.83787536621094, 542.55908203125, 263.95330810546875, 416.1339111328125, 361.6107177734375, 544.802734375, 136.71836853027344, 864.6985473632812, 185.2837677001953, 1192.0758056640625, 1098.331298828125, 1600.234375, 408.9527587890625, 366.5252685546875, 446.0223693847656, 2646.791748046875, 941.7721557617188, 342.3376159667969, 3254.474609375, 1469.76904296875, 2113.20703125, 866.40185546875, 975.51806640625, 5183.146484375, 6052.71826171875, 2732.19384765625, 1884.1258544921875, 2258.273681640625, 4004.7578125, 4395.67724609375, 3329.212646484375, 837.78271484375, 742.67138671875, 349.01776123046875, 263.5714416503906, 235.63259887695312, 226.6161651611328, 215.55186462402344, 198.12313842773438, 177.10752868652344, 164.64073181152344, 160.60159301757812, 157.46951293945312, 156.48275756835938, 148.0817413330078, 144.69972229003906, 152.8905792236328, 141.4651641845703, 133.9572296142578, 132.7042694091797, 123.28799438476562, 119.57171630859375, 116.54607391357422, 113.31639099121094, 113.13705444335938, 112.71014404296875, 120.09423065185547, 102.98385620117188, 94.35774230957031, 93.15208435058594, 90.63665008544922, 220.87405395507812, 153.73667907714844, 1017.056396484375, 185.59458923339844, 1689.568603515625, 167.19650268554688, 202.23321533203125, 240.0529327392578, 165.1607208251953, 1940.664794921875, 1423.9302978515625, 399.8851318359375, 990.5671997070312, 559.28369140625, 670.1260375976562, 536.8279418945312, 505.7823181152344, 528.27392578125, 572.500732421875, 254.3348388671875, 553.6993408203125, 544.2898559570312, 701.0911865234375, 868.338134765625, 4004.7578125, 693.4171142578125, 732.4398193359375, 584.5032348632812, 822.2951049804688, 2646.791748046875, 5183.146484375, 1242.2733154296875, 3510.730712890625], \"loglift\": [30.0, 29.0, 28.0, 27.0, 26.0, 25.0, 24.0, 23.0, 22.0, 21.0, 20.0, 19.0, 18.0, 17.0, 16.0, 15.0, 14.0, 13.0, 12.0, 11.0, 10.0, 9.0, 8.0, 7.0, 6.0, 5.0, 4.0, 3.0, 2.0, 1.0, 2.0255000591278076, 2.0250000953674316, 2.0241000652313232, 2.023900032043457, 2.0237998962402344, 2.0234999656677246, 2.023400068283081, 2.023200035095215, 2.022599935531616, 2.022599935531616, 2.0225000381469727, 2.022200107574463, 2.0220999717712402, 2.0216000080108643, 2.0213000774383545, 2.0213000774383545, 2.0213000774383545, 2.020900011062622, 2.020900011062622, 2.020699977874756, 2.0204999446868896, 2.02020001411438, 2.02020001411438, 2.0201001167297363, 2.0199999809265137, 2.0199999809265137, 2.0197999477386475, 2.019700050354004, 2.018199920654297, 2.018199920654297, 2.0153000354766846, 2.007200002670288, 1.9528000354766846, 1.9890999794006348, 1.8824000358581543, 1.958899974822998, 1.7970999479293823, 1.980299949645996, 1.819599986076355, 1.6779999732971191, 1.763100028038025, 1.6375999450683594, 1.8667999505996704, 1.781499981880188, 1.0757999420166016, 1.7408000230789185, 1.2894999980926514, 1.0536999702453613, 1.5706000328063965, 0.953000009059906, 1.4706000089645386, 1.4835000038146973, 0.7210999727249146, 1.080899953842163, 0.6299999952316284, 0.6431000232696533, 0.739799976348877, 1.0844999551773071, 1.3265000581741333, 0.5475999712944031, 0.0575999990105629, 0.9682999849319458, 0.27399998903274536, 0.847000002861023, 0.6578999757766724, -0.014100000262260437, 0.5697000026702881, 2.0452001094818115, 2.044800043106079, 2.044600009918213, 2.0434999465942383, 2.0434000492095947, 2.0427000522613525, 2.0425000190734863, 2.0423998832702637, 2.0420000553131104, 2.041300058364868, 2.0411999225616455, 2.0409998893737793, 2.0409998893737793, 2.040600061416626, 2.0401999950408936, 2.04010009765625, 2.0397000312805176, 2.039599895477295, 2.0394999980926514, 2.039099931716919, 2.039099931716919, 2.0390000343322754, 2.038599967956543, 2.0385000705718994, 2.0381999015808105, 2.0376999378204346, 2.037100076675415, 2.036900043487549, 2.036900043487549, 2.0364999771118164, 2.031899929046631, 2.0318000316619873, 2.0308001041412354, 2.023099899291992, 2.032900094985962, 2.0308001041412354, 1.9905999898910522, 1.9452999830245972, 1.989799976348877, 1.9884999990463257, 1.9830000400543213, 1.9407999515533447, 1.858199954032898, 1.9696999788284302, 1.882599949836731, 1.8200000524520874, 1.5154999494552612, 1.9495999813079834, 1.700600028038025, 1.5044000148773193, 1.7956000566482544, 1.5720000267028809, 1.4508999586105347, 1.5461000204086304, 1.4234000444412231, 1.3523000478744507, 1.0579999685287476, 0.6973999738693237, 1.2980999946594238, 1.399399995803833, 0.6687999963760376, 0.859000027179718, 1.0434000492095947, 0.6948999762535095, 0.9133999943733215, 0.5392000079154968, 0.31630000472068787, 0.7174999713897705, 0.003100000089034438, 0.583899974822998, 0.8629000186920166, 2.0806000232696533, 2.0804998874664307, 2.078900098800659, 2.0778000354766846, 2.077399969100952, 2.076900005340576, 2.07669997215271, 2.0764999389648438, 2.075900077819824, 2.075700044631958, 2.074700117111206, 2.073499917984009, 2.0734000205993652, 2.0729000568389893, 2.0727999210357666, 2.072700023651123, 2.072200059890747, 2.0717999935150146, 2.0708000659942627, 2.0706000328063965, 2.0703999996185303, 2.0690999031066895, 2.0687999725341797, 2.068700075149536, 2.068000078201294, 2.0678000450134277, 2.066499948501587, 2.066499948501587, 2.066499948501587, 2.0664000511169434, 2.048099994659424, 2.0662999153137207, 2.051500082015991, 2.0102999210357666, 2.0225000381469727, 2.0088999271392822, 1.9707000255584717, 1.979200005531311, 1.96589994430542, 1.9251999855041504, 1.827299952507019, 1.9740999937057495, 1.774999976158142, 1.864400029182434, 1.742799997329712, 1.7106000185012817, 1.6004999876022339, 1.8174999952316284, 1.6053999662399292, 1.4670000076293945, 1.4729000329971313, 1.556399941444397, 1.423699975013733, 1.6994999647140503, 1.6755000352859497, 1.545199990272522, 1.365399956703186, 1.440500020980835, 1.4234000444412231, 1.3454999923706055, 1.3897000551223755, 1.3384000062942505, 1.4632999897003174, 1.4599000215530396, 1.5799000263214111, 0.9276000261306763, 1.5184999704360962, 1.176200032234192, 0.499099999666214, 0.7235000133514404, 0.3797000050544739, 1.0924999713897705, 0.7401999831199646, 0.15479999780654907, 2.1196000576019287, 2.1177000999450684, 2.117000102996826, 2.1166999340057373, 2.1166000366210938, 2.116300106048584, 2.115600109100342, 2.1150999069213867, 2.1150999069213867, 2.114799976348877, 2.1147000789642334, 2.114000082015991, 2.113800048828125, 2.113300085067749, 2.1131999492645264, 2.1129000186920166, 2.112499952316284, 2.1124000549316406, 2.112299919128418, 2.111799955368042, 2.1113998889923096, 2.1108999252319336, 2.1105000972747803, 2.1096999645233154, 2.109499931335449, 2.1089000701904297, 2.108599901199341, 2.108599901199341, 2.107800006866455, 2.1075000762939453, 2.101799964904785, 2.099600076675415, 2.0685999393463135, 2.092400074005127, 2.0650999546051025, 2.073899984359741, 2.0125999450683594, 2.021399974822998, 2.000699996948242, 2.0023000240325928, 2.0262999534606934, 2.0680999755859375, 1.9438999891281128, 1.8285000324249268, 1.8824000358581543, 1.9651000499725342, 1.9211000204086304, 1.8946000337600708, 1.7213000059127808, 1.8492000102996826, 1.8622000217437744, 2.00570011138916, 1.864300012588501, 1.8091000318527222, 1.291200041770935, 1.6136000156402588, 1.176200032234192, 1.246999979019165, 1.326200008392334, 0.973800003528595, 1.5801000595092773, 0.8787999749183655, 1.298699975013733, 0.9729999899864197, 0.7918999791145325, 0.4300999939441681, 0.10779999941587448, 0.5931000113487244, 0.991100013256073, 0.40450000762939453, 2.3443000316619873, 2.342400074005127, 2.3417999744415283, 2.341399908065796, 2.3408000469207764, 2.3394999504089355, 2.339400053024292, 2.3392999172210693, 2.338399887084961, 2.3382999897003174, 2.3376998901367188, 2.3373000621795654, 2.3369998931884766, 2.3369998931884766, 2.3368000984191895, 2.3361001014709473, 2.335400104522705, 2.33489990234375, 2.3348000049591064, 2.3345000743865967, 2.3341000080108643, 2.333899974822998, 2.3327999114990234, 2.33270001411438, 2.3324999809265137, 2.3324999809265137, 2.33240008354187, 2.332200050354004, 2.3320000171661377, 2.331899881362915, 2.321000099182129, 2.319499969482422, 2.3125, 2.2964000701904297, 2.3036000728607178, 2.281100034713745, 2.3059000968933105, 2.289400100708008, 2.218400001525879, 2.106600046157837, 2.063800096511841, 2.226300001144409, 2.183000087738037, 2.096299886703491, 2.19569993019104, 2.1347999572753906, 2.1861000061035156, 2.0332999229431152, 2.193000078201294, 1.8654999732971191, 2.0510001182556152, 1.8450000286102295, 1.6746000051498413, 1.5880000591278076, 1.9641000032424927, 0.8166999816894531, 0.7954000234603882, 1.6297999620437622, 1.572100043296814, 1.6842999458312988, 0.6661999821662903, 0.41440001130104065, 1.1360000371932983, 0.9230999946594238, 0.927299976348877, 0.77920001745224, 0.24959999322891235, -0.010900000110268593, 0.20020000636577606, -0.3833000063896179, 0.3409999907016754, 0.04670000076293945, 0.013500000350177288, 1.1301000118255615, 0.7407000064849854, 2.3550000190734863, 2.3548998832702637, 2.3541998863220215, 2.3541998863220215, 2.352099895477295, 2.3513998985290527, 2.3487000465393066, 2.347599983215332, 2.3473000526428223, 2.3471999168395996, 2.34689998626709, 2.3457999229431152, 2.3454999923706055, 2.3452999591827393, 2.3450000286102295, 2.3440001010894775, 2.3436999320983887, 2.343400001525879, 2.3431999683380127, 2.3427999019622803, 2.342600107192993, 2.342400074005127, 2.3422999382019043, 2.3417999744415283, 2.3415000438690186, 2.3415000438690186, 2.341399908065796, 2.3403000831604004, 2.3401999473571777, 2.340100049972534, 2.3173999786376953, 2.297600030899048, 2.3120999336242676, 2.3108999729156494, 2.2611000537872314, 2.2952001094818115, 2.3132998943328857, 2.235300064086914, 2.249799966812134, 2.33270001411438, 2.2404000759124756, 2.1772000789642334, 2.203000068664551, 2.1942999362945557, 2.2360000610351562, 2.2339999675750732, 2.071899890899658, 1.9709999561309814, 2.089400053024292, 1.9450000524520874, 2.13100004196167, 2.011899948120117, 2.0436999797821045, 1.7994999885559082, 1.6154999732971191, 1.215399980545044, 1.9223999977111816, 1.5217000246047974, 1.7158000469207764, 0.7318000197410583, 1.5988999605178833, 0.6722000241279602, 0.460999995470047, 0.4821999967098236, 0.07440000027418137, 0.4043000042438507, 0.7802000045776367, 0.4431000053882599, 0.03189999982714653, 0.3253999948501587, 0.4275999963283539, 0.4212999939918518, 0.9513000249862671, 0.9588000178337097, 0.13619999587535858, 0.011599999852478504, 2.4128000736236572, 2.4117000102996826, 2.411600112915039, 2.4112000465393066, 2.4096999168395996, 2.4094998836517334, 2.408799886703491, 2.408799886703491, 2.408099889755249, 2.407900094985962, 2.4077999591827393, 2.4075000286102295, 2.4072000980377197, 2.407099962234497, 2.407099962234497, 2.4068000316619873, 2.4068000316619873, 2.4066998958587646, 2.4065001010894775, 2.406399965286255, 2.406100034713745, 2.4059998989105225, 2.4056999683380127, 2.4052000045776367, 2.4052000045776367, 2.4049999713897705, 2.4047000408172607, 2.4047000408172607, 2.404599905014038, 2.404400110244751, 2.3933000564575195, 2.376499891281128, 2.341399908065796, 2.3564999103546143, 2.3580000400543213, 2.231600046157837, 2.300600051879883, 2.1846001148223877, 2.266700029373169, 2.2227001190185547, 2.257499933242798, 2.1233999729156494, 1.9658000469207764, 2.3125998973846436, 1.9865000247955322, 1.597100019454956, 1.7648999691009521, 1.0089999437332153, 1.4464999437332153, 1.0003999471664429, 1.2259000539779663, 1.7905000448226929, 1.7924000024795532, 1.4221999645233154, 1.3905999660491943, 1.7354999780654907, 0.6812999844551086, 0.6772000193595886, 0.5328999757766724, 0.23199999332427979, 1.4362000226974487, 0.38100001215934753, 0.775600016117096, 0.9772999882698059, 0.843500018119812, 0.9948999881744385, 0.7968999743461609, 0.7509999871253967, 0.16369999945163727, 0.7944999933242798, 1.1397000551223755, 0.7049999833106995, 2.539799928665161, 2.5383999347686768, 2.5380001068115234, 2.5373001098632812, 2.5369999408721924, 2.5364999771118164, 2.5357000827789307, 2.5344998836517334, 2.53439998626709, 2.5341999530792236, 2.533400058746338, 2.5332999229431152, 2.533099889755249, 2.5325000286102295, 2.5322000980377197, 2.5318000316619873, 2.5313000679016113, 2.5309998989105225, 2.5308001041412354, 2.5299999713897705, 2.5299999713897705, 2.5297000408172607, 2.529599905014038, 2.529400110244751, 2.5292000770568848, 2.5280001163482666, 2.5276999473571777, 2.5267999172210693, 2.526700019836426, 2.5257999897003174, 2.4983999729156494, 2.449399948120117, 2.4505999088287354, 2.509399890899658, 2.4765000343322754, 2.330899953842163, 2.104300022125244, 2.2607998847961426, 2.390700101852417, 2.3450000286102295, 1.8308000564575195, 1.7178000211715698, 2.0494000911712646, 1.8805999755859375, 2.0169999599456787, 2.0546000003814697, 1.9692000150680542, 1.902500033378601, 2.0139999389648438, 1.6618000268936157, 1.9521000385284424, 1.7515000104904175, 1.1318999528884888, 1.6973999738693237, 1.379699945449829, 1.1074999570846558, 1.30649995803833, 1.3228000402450562, 0.4544999897480011, 0.39149999618530273, 1.2115000486373901, 0.9824000000953674, -0.3142000138759613, 0.1941000074148178, 2.65339994430542, 2.6526999473571777, 2.6501998901367188, 2.6496999263763428, 2.6489999294281006, 2.6489999294281006, 2.6486001014709473, 2.648099899291992, 2.648099899291992, 2.646899938583374, 2.645900011062622, 2.6458001136779785, 2.645699977874756, 2.6454999446868896, 2.64520001411438, 2.6447999477386475, 2.644700050354004, 2.643699884414673, 2.643399953842163, 2.643399953842163, 2.643399953842163, 2.643399953842163, 2.6431000232696533, 2.6429998874664307, 2.6429998874664307, 2.6429998874664307, 2.6424999237060547, 2.6422998905181885, 2.642199993133545, 2.641700029373169, 2.635999917984009, 2.583699941635132, 2.539299964904785, 2.545099973678589, 2.5088999271392822, 2.5473999977111816, 2.465399980545044, 2.5885000228881836, 2.606800079345703, 2.528899908065796, 2.5975000858306885, 2.5183000564575195, 2.367000102996826, 2.4702000617980957, 2.3645999431610107, 2.3884999752044678, 2.253999948501587, 2.546799898147583, 1.9607000350952148, 2.437000036239624, 1.7419999837875366, 1.7599999904632568, 1.6059999465942383, 2.103300094604492, 2.1456000804901123, 2.0232999324798584, 1.0397000312805176, 1.5461000204086304, 2.0940001010894775, 0.710099995136261, 1.1996999979019165, 0.8400999903678894, 1.422700047492981, 1.3034000396728516, -0.013100000098347664, -0.1525000035762787, 0.4368000030517578, 0.745199978351593, 0.510200023651123, -0.03449999913573265, -0.14550000429153442, 0.10100000351667404, 2.7214999198913574, 2.721299886703491, 2.7200000286102295, 2.719099998474121, 2.7186999320983887, 2.7184998989105225, 2.7183001041412354, 2.7179999351501465, 2.717400074005127, 2.7170000076293945, 2.716900110244751, 2.7167999744415283, 2.716599941253662, 2.716399908065796, 2.7163000106811523, 2.716200113296509, 2.716099977493286, 2.7156999111175537, 2.7156999111175537, 2.715100049972534, 2.714900016784668, 2.7146999835968018, 2.7144999504089355, 2.7144999504089355, 2.7144999504089355, 2.714400053024292, 2.71370005607605, 2.712899923324585, 2.7126998901367188, 2.7125000953674316, 2.7114999294281006, 2.70989990234375, 2.660099983215332, 2.6861000061035156, 2.523200035095215, 2.6847000122070312, 2.6684000492095947, 2.6433000564575195, 2.6735000610351562, 2.31469988822937, 2.286600112915039, 2.4769999980926514, 2.259000062942505, 2.381700038909912, 2.336400032043457, 2.3768999576568604, 2.3594000339508057, 2.3306000232696533, 2.299099922180176, 2.5443999767303467, 2.254300117492676, 2.1686999797821045, 1.9785000085830688, 1.773300051689148, 0.8248000144958496, 1.8694000244140625, 1.7740000486373901, 1.873900055885315, 1.5986000299453735, 0.6425999999046326, 0.05000000074505806, 1.1669000387191772, 0.04839999973773956], \"logprob\": [30.0, 29.0, 28.0, 27.0, 26.0, 25.0, 24.0, 23.0, 22.0, 21.0, 20.0, 19.0, 18.0, 17.0, 16.0, 15.0, 14.0, 13.0, 12.0, 11.0, 10.0, 9.0, 8.0, 7.0, 6.0, 5.0, 4.0, 3.0, 2.0, 1.0, -4.882199764251709, -5.374499797821045, -5.914400100708008, -5.995299816131592, -6.022299766540527, -6.139200210571289, -6.162799835205078, -6.240099906921387, -6.430099964141846, -6.431300163269043, -6.4481000900268555, -6.517099857330322, -6.532599925994873, -5.713200092315674, -6.713799953460693, -6.680600166320801, -6.725599765777588, -6.80109977722168, -6.786600112915039, -6.832300186157227, -6.872700214385986, -6.892399787902832, -6.929500102996826, -6.946300029754639, -6.952899932861328, -6.963099956512451, -6.981100082397461, -7.000899791717529, -7.207600116729736, -7.210000038146973, -6.230899810791016, -6.464200019836426, -5.641499996185303, -6.496399879455566, -5.325099945068359, -6.250899791717529, -4.987599849700928, -6.652400016784668, -5.7866997718811035, -5.463200092315674, -5.974699974060059, -5.600100040435791, -6.321100234985352, -6.075300216674805, -4.164999961853027, -6.055200099945068, -5.059800148010254, -4.702600002288818, -5.730299949645996, -4.607699871063232, -5.853899955749512, -5.873799800872803, -5.070400238037109, -5.449900150299072, -5.1554999351501465, -5.1855998039245605, -5.401899814605713, -5.638400077819824, -5.808599948883057, -5.481299877166748, -5.3383002281188965, -5.733500003814697, -5.481500148773193, -5.7484002113342285, -5.736800193786621, -5.668000221252441, -5.838200092315674, -4.753300189971924, -5.165999889373779, -5.369900226593018, -5.967899799346924, -5.506999969482422, -6.253600120544434, -6.323699951171875, -6.35129976272583, -6.450500011444092, -6.612100124359131, -6.622200012207031, -6.675099849700928, -6.678599834442139, -6.653600215911865, -6.823699951171875, -6.845600128173828, -6.909299850463867, -6.933800220489502, -6.952300071716309, -7.013199806213379, -7.014999866485596, -6.98859977722168, -7.004700183868408, -7.095900058746338, -7.135300159454346, -7.196100234985352, -7.264999866485596, -7.2606000900268555, -7.272200107574463, -6.650000095367432, -4.354899883270264, -5.3043999671936035, -5.513999938964844, -5.460400104522705, -6.571499824523926, -6.394000053405762, -5.218299865722656, -5.284299850463867, -6.085599899291992, -6.298299789428711, -6.320799827575684, -5.9166998863220215, -5.550000190734863, -6.38100004196167, -5.966000080108643, -5.768099784851074, -4.58519983291626, -6.354599952697754, -5.545199871063232, -5.00629997253418, -5.991600036621094, -5.504700183868408, -5.3028998374938965, -5.598199844360352, -5.393599987030029, -5.41349983215332, -5.011899948120117, -4.543399810791016, -5.440800189971924, -5.635000228881836, -4.891900062561035, -5.127299785614014, -5.315899848937988, -5.143700122833252, -5.407100200653076, -5.2895002365112305, -5.402100086212158, -5.500899791717529, -5.3927998542785645, -5.484099864959717, -5.540599822998047, -5.625400066375732, -5.695799827575684, -6.301300048828125, -6.148200035095215, -6.662399768829346, -6.764100074768066, -6.801199913024902, -6.842599868774414, -6.940400123596191, -6.960299968719482, -7.102200031280518, -7.246399879455566, -7.256100177764893, -7.317500114440918, -7.3225998878479, -7.335999965667725, -7.383800029754639, -7.423299789428711, -7.511600017547607, -7.533400058746338, -7.552299976348877, -7.52400016784668, -7.672999858856201, -7.679500102996826, -7.730100154876709, -7.745500087738037, -7.829500198364258, -7.829899787902832, -7.832900047302246, -7.836999893188477, -5.795100212097168, -7.8125, -6.699900150299072, -5.167600154876709, -6.002200126647949, -5.733699798583984, -4.740300178527832, -5.880899906158447, -6.10129976272583, -5.969099998474121, -5.160900115966797, -6.678699970245361, -5.234300136566162, -5.997900009155273, -5.223100185394287, -5.309899806976318, -4.928400039672852, -6.041500091552734, -5.117800235748291, -4.515200138092041, -4.7032999992370605, -5.03980016708374, -4.662199974060059, -5.71019983291626, -5.6722002029418945, -5.348400115966797, -4.901500225067139, -5.117700099945068, -5.128900051116943, -4.952400207519531, -5.177800178527832, -5.201499938964844, -5.495699882507324, -5.51609992980957, -5.6367998123168945, -5.026400089263916, -5.65910005569458, -5.4980998039245605, -5.430799961090088, -5.4899001121521, -5.445300102233887, -5.597400188446045, -5.629899978637695, -5.628900051116943, -5.063899993896484, -6.070400238037109, -6.309800148010254, -6.3907999992370605, -6.395899772644043, -6.473999977111816, -6.618800163269043, -6.7153000831604, -6.723800182342529, -6.781499862670898, -6.766499996185303, -5.94320011138916, -6.934599876403809, -7.006800174713135, -7.021900177001953, -7.065999984741211, -7.116600036621094, -7.1203999519348145, -7.1356000900268555, -7.191699981689453, -7.2342000007629395, -5.584799766540527, -7.332799911499023, -7.412700176239014, -7.42519998550415, -7.191299915313721, -7.507500171661377, -7.5081000328063965, -7.56879997253418, -7.589399814605713, -6.187300205230713, -6.0883002281188965, -4.949900150299072, -6.490799903869629, -5.281499862670898, -5.921500205993652, -4.572700023651123, -5.73799991607666, -5.423999786376953, -5.467400074005127, -5.894899845123291, -6.571000099182129, -5.354100227355957, -4.242700099945068, -4.984099864959717, -5.727200031280518, -5.379000186920166, -5.3383002281188965, -4.232699871063232, -5.212600231170654, -5.309599876403809, -6.185999870300293, -5.68149995803833, -5.6529998779296875, -4.570099830627441, -5.377799987792969, -4.806000232696533, -4.966400146484375, -5.1168999671936035, -4.681700229644775, -5.565299987792969, -4.904900074005127, -5.4120001792907715, -5.2144999504089355, -5.293900012969971, -5.325399875640869, -5.288099765777588, -5.44320011138916, -5.561200141906738, -5.525400161743164, -6.017399787902832, -6.459199905395508, -6.554100036621094, -6.177000045776367, -6.7220001220703125, -6.895100116729736, -6.903600215911865, -5.435500144958496, -6.782800197601318, -7.031599998474121, -7.093900203704834, -7.136499881744385, -7.1616997718811035, -7.162600040435791, -7.181000232696533, -6.083799839019775, -7.304900169372559, -7.343400001525879, -7.348599910736084, -7.369699954986572, -7.401000022888184, -7.41349983215332, -7.497000217437744, -7.502200126647949, -7.513800144195557, -7.516499996185303, -7.521500110626221, -7.535600185394287, -7.5441999435424805, -7.55109977722168, -5.597400188446045, -5.7683000564575195, -6.349699974060059, -6.095099925994873, -6.504499912261963, -6.050600051879883, -6.671199798583984, -6.494999885559082, -5.345600128173828, -4.648399829864502, -4.356599807739258, -6.17140007019043, -5.94320011138916, -5.763000011444092, -6.377099990844727, -6.164899826049805, -6.436299800872803, -5.794899940490723, -6.502699851989746, -5.310500144958496, -6.0553998947143555, -5.515200138092041, -5.35230016708374, -5.60129976272583, -6.164999961853027, -4.837200164794922, -4.860099792480469, -5.854800224304199, -5.8242998123168945, -5.942299842834473, -5.11929988861084, -4.981500148773193, -5.545599937438965, -5.661200046539307, -5.696599960327148, -5.682400226593018, -5.589000225067139, -5.571599960327148, -5.62470006942749, -5.624100208282471, -5.744900226593018, -5.708799839019775, -5.770199775695801, -5.910600185394287, -5.906000137329102, -5.388000011444092, -4.97730016708374, -5.809100151062012, -5.883299827575684, -6.095799922943115, -6.528900146484375, -6.915599822998047, -7.037899971008301, -6.993800163269043, -7.081099987030029, -7.107399940490723, -7.218400001525879, -7.237599849700928, -7.257500171661377, -7.2804999351501465, -7.362400054931641, -7.387899875640869, -7.4105000495910645, -7.4207000732421875, -7.450399875640869, -7.463500022888184, -7.480199813842773, -7.480000019073486, -7.519499778747559, -7.536099910736084, -7.539700031280518, -7.541999816894531, -7.6118998527526855, -7.619999885559082, -7.1971001625061035, -5.447000026702881, -5.146599769592285, -5.984499931335449, -6.154799938201904, -5.329599857330322, -6.46150016784668, -6.9243998527526855, -5.44290018081665, -5.820099830627441, -7.303299903869629, -6.218299865722656, -5.551400184631348, -6.050899982452393, -6.115699768066406, -6.45389986038208, -6.50540018081665, -5.731599807739258, -5.35699987411499, -5.955699920654297, -5.418099880218506, -6.295400142669678, -5.906899929046631, -6.03879976272583, -5.660900115966797, -5.357600212097168, -4.576000213623047, -6.046299934387207, -5.535999774932861, -5.82480001449585, -4.986599922180176, -5.956099987030029, -5.39900016784668, -5.295400142669678, -5.342700004577637, -5.166399955749512, -5.351200103759766, -5.513000011444092, -5.395500183105469, -5.363999843597412, -5.460100173950195, -5.502299785614014, -5.614999771118164, -5.730199813842773, -5.740499973297119, -5.725100040435791, -5.77209997177124, -5.916200160980225, -6.203800201416016, -6.205599784851074, -6.309999942779541, -6.57480001449585, -6.602399826049805, -6.702899932861328, -6.705100059509277, -6.802800178527832, -6.820400238037109, -6.838099956512451, -6.872300148010254, -6.866399765014648, -5.8531999588012695, -6.912700176239014, -6.946300029754639, -6.9471001625061035, -6.961400032043457, -6.976600170135498, -6.990600109100342, -7.022799968719482, -7.031899929046631, -6.214600086212158, -7.107999801635742, -7.111999988555908, -7.125100135803223, -7.150100231170654, -7.1504998207092285, -7.16379976272583, -7.183000087738037, -5.0954999923706055, -6.145999908447266, -5.829899787902832, -6.146999835968018, -6.287600040435791, -5.656300067901611, -6.222400188446045, -5.499899864196777, -6.05810022354126, -6.175099849700928, -6.523399829864502, -6.176700115203857, -5.816299915313721, -6.7428998947143555, -6.06220006942749, -5.412899971008301, -5.721799850463867, -4.644899845123291, -5.347899913787842, -4.7179999351501465, -5.152400016784668, -5.967599868774414, -5.999100208282471, -5.628600120544434, -5.627799987792969, -5.966800212860107, -5.143700122833252, -5.252600193023682, -5.252600193023682, -5.163899898529053, -5.8053998947143555, -5.447700023651123, -5.619100093841553, -5.710599899291992, -5.69189977645874, -5.749000072479248, -5.70359992980957, -5.710599899291992, -5.674900054931641, -5.8471999168396, -5.911399841308594, -5.9029998779296875, -4.351600170135498, -5.3572998046875, -5.516900062561035, -5.445400238037109, -5.866499900817871, -5.999599933624268, -6.178400039672852, -6.39169979095459, -6.408699989318848, -6.450099945068359, -4.750800132751465, -6.572500228881836, -6.60129976272583, -6.676599979400635, -6.698999881744385, -6.645400047302246, -6.8256001472473145, -6.853000164031982, -6.371300220489502, -6.9558000564575195, -6.956299781799316, -6.978799819946289, -6.988800048828125, -7.013700008392334, -6.946000099182129, -7.128799915313721, -7.146599769592285, -7.2179999351501465, -7.229000091552734, -7.287799835205078, -4.95959997177124, -4.533999919891357, -5.435999870300293, -6.94350004196167, -6.648799896240234, -5.456600189208984, -4.546800136566162, -5.6230998039245605, -6.371500015258789, -6.284299850463867, -4.621500015258789, -4.631499767303467, -5.618000030517578, -5.259300231933594, -5.611199855804443, -5.697000026702881, -5.560400009155273, -5.549799919128418, -5.781899929046631, -5.357699871063232, -5.821599960327148, -5.603300094604492, -5.048399925231934, -5.6143999099731445, -5.34499979019165, -5.15939998626709, -5.414700031280518, -5.561200141906738, -5.336999893188477, -5.3649001121521, -5.582699775695801, -5.557499885559082, -5.554999828338623, -5.589600086212158, -5.306000232696533, -5.590199947357178, -6.189599990844727, -6.274400234222412, -6.389599800109863, -6.389500141143799, -6.435200214385986, -6.504300117492676, -6.507500171661377, -6.6519999504089355, -6.760200023651123, -6.632599830627441, -6.781199932098389, -6.806099891662598, -6.833499908447266, -6.872200012207031, -6.879899978637695, -6.9542999267578125, -6.990300178527832, -6.370100021362305, -6.994999885559082, -6.997000217437744, -5.59689998626709, -7.023399829864502, -7.023399829864502, -7.025400161743164, -7.065000057220459, -7.035699844360352, -7.0879998207092285, -7.124899864196777, -6.369200229644775, -5.4944000244140625, -5.081399917602539, -5.257400035858154, -5.519999980926514, -6.0345001220703125, -5.214099884033203, -6.502200126647949, -6.671199798583984, -6.0482001304626465, -6.612400054931641, -6.098800182342529, -5.285799980163574, -5.903200149536133, -5.553400039672852, -5.670000076293945, -5.394599914550781, -6.484300136566162, -5.22599983215332, -6.290200233459473, -5.123600006103516, -5.187600135803223, -4.965199947357178, -5.832200050354004, -5.899400234222412, -5.825500011444092, -5.028299808502197, -5.555200099945068, -6.0192999839782715, -5.151199817657471, -5.456500053405762, -5.453000068664551, -5.76200008392334, -5.762700080871582, -5.408999919891357, -5.3933000564575195, -5.599400043487549, -5.662700176239014, -5.7164998054504395, -5.688399791717529, -5.706200122833252, -5.737599849700928, -4.496799945831299, -4.617499828338623, -5.374000072479248, -5.655700206756592, -5.768099784851074, -5.807300090789795, -5.857600212097168, -5.942200183868408, -6.054900169372559, -6.128300189971924, -6.153299808502197, -6.173099994659424, -6.179500102996826, -6.234899997711182, -6.258200168609619, -6.203199863433838, -6.280900001525879, -6.3358001708984375, -6.345300197601318, -6.419400215148926, -6.450300216674805, -6.476099967956543, -6.50439977645874, -6.50600004196167, -6.509799957275391, -6.446499824523926, -6.600800037384033, -6.6890997886657715, -6.702099800109863, -6.729800224304199, -5.840000152587891, -6.20389986038208, -4.364299774169922, -6.039400100708008, -3.9937000274658203, -6.145199775695801, -5.97130012512207, -5.824900150299072, -6.168600082397461, -4.063600063323975, -4.401299953460693, -5.480899810791016, -4.791800022125244, -5.240699768066406, -5.105299949645996, -5.286499977111816, -5.36359977722168, -5.348800182342529, -5.300000190734863, -5.866099834442139, -5.378200054168701, -5.480899810791016, -5.417900085449219, -5.409200191497803, -4.829100131988525, -5.538000106811523, -5.578700065612793, -5.704500198364258, -5.638400077819824, -5.4253997802734375, -5.345900058746338, -5.65749979019165, -5.737199783325195]}, \"token.table\": {\"Topic\": [1, 2, 3, 4, 5, 6, 8, 9, 10, 3, 4, 5, 6, 7, 8, 4, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 1, 3, 5, 8, 1, 2, 3, 5, 8, 1, 5, 8, 9, 5, 3, 8, 7, 4, 1, 2, 5, 6, 7, 8, 9, 10, 2, 3, 4, 5, 6, 7, 8, 10, 3, 8, 1, 6, 9, 2, 4, 5, 2, 3, 4, 5, 8, 1, 10, 1, 3, 4, 8, 1, 1, 2, 3, 5, 6, 7, 8, 9, 1, 6, 8, 9, 10, 1, 1, 1, 3, 5, 6, 6, 2, 2, 2, 1, 2, 6, 8, 9, 10, 5, 1, 2, 3, 4, 8, 2, 3, 4, 5, 6, 7, 3, 5, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 1, 1, 1, 3, 9, 4, 5, 7, 1, 3, 4, 5, 6, 7, 8, 9, 10, 7, 10, 7, 1, 8, 6, 7, 1, 2, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 1, 3, 7, 8, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 2, 2, 5, 6, 2, 5, 3, 4, 4, 9, 7, 1, 3, 4, 5, 7, 8, 9, 10, 10, 8, 1, 2, 3, 4, 5, 6, 7, 9, 6, 5, 6, 7, 10, 10, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 1, 4, 5, 6, 7, 3, 4, 8, 4, 6, 4, 5, 1, 3, 4, 5, 6, 7, 8, 9, 10, 8, 9, 9, 10, 5, 6, 4, 6, 7, 8, 10, 9, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 9, 7, 2, 1, 2, 3, 4, 5, 6, 7, 8, 9, 6, 4, 4, 9, 1, 2, 3, 5, 8, 9, 4, 7, 8, 9, 1, 2, 1, 2, 1, 2, 5, 4, 8, 3, 4, 7, 8, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 8, 1, 2, 3, 8, 10, 6, 7, 10, 3, 4, 4, 9, 1, 5, 6, 8, 7, 8, 7, 10, 2, 3, 4, 6, 7, 8, 1, 2, 3, 4, 7, 10, 2, 3, 4, 5, 6, 7, 8, 10, 1, 4, 6, 7, 10, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 2, 3, 4, 5, 6, 7, 8, 9, 3, 4, 7, 9, 6, 4, 2, 9, 10, 3, 1, 3, 4, 5, 6, 7, 8, 9, 10, 1, 2, 3, 4, 6, 7, 8, 3, 1, 3, 4, 5, 6, 7, 8, 9, 6, 1, 4, 5, 6, 8, 9, 10, 1, 2, 6, 8, 10, 1, 6, 8, 8, 8, 8, 8, 4, 7, 10, 9, 2, 6, 2, 3, 4, 6, 7, 8, 9, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 1, 4, 6, 8, 1, 2, 4, 6, 9, 10, 8, 8, 5, 1, 2, 3, 4, 5, 6, 7, 8, 9, 3, 10, 3, 4, 7, 8, 4, 9, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 3, 3, 4, 8, 9, 3, 4, 8, 1, 2, 3, 4, 5, 9, 10, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 2, 1, 3, 4, 5, 6, 7, 8, 9, 10, 5, 1, 6, 9, 2, 7, 1, 2, 4, 5, 6, 7, 9, 10, 4, 5, 6, 8, 10, 3, 5, 9, 1, 7, 9, 1, 2, 3, 5, 7, 9, 10, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 9, 4, 1, 2, 3, 4, 5, 6, 7, 10, 8, 1, 2, 6, 8, 10, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 5, 3, 4, 8, 10, 8, 4, 10, 1, 2, 9, 3, 4, 1, 1, 2, 6, 8, 9, 10, 1, 2, 3, 4, 5, 7, 8, 9, 10, 1, 2, 7, 8, 1, 5, 6, 8, 1, 3, 4, 8, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 6, 6, 1, 3, 5, 9, 3, 4, 5, 10, 7, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 3, 4, 1, 2, 5, 9, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 2, 3, 4, 8, 9, 2, 6, 10, 6, 9, 1, 2, 3, 4, 8, 9, 5, 6, 8, 9, 10, 2, 4, 7, 10, 7, 10, 7, 9, 1, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 1, 2, 3, 5, 8, 10, 2, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 4, 9, 2, 1, 5, 6, 8, 3, 3, 4, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 1, 3, 1, 2, 3, 1, 2, 5, 6, 7, 8, 9, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 8, 1, 6, 9, 5, 8, 3, 6, 8, 6, 7, 9, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 1, 2, 4, 5, 6, 7, 8, 9, 10, 6, 1, 5, 8, 9, 1, 2, 5, 7, 5, 6, 7, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 5, 10, 7, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 1, 5, 6, 7, 9, 1, 7, 10, 1, 2, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 9, 8, 6, 7, 6, 5, 1, 6, 6, 1, 2, 3, 4, 5, 6, 7, 9, 1, 2, 3, 4, 8, 6, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 2, 3, 4, 7, 8, 9, 9, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 7, 9, 10, 7, 3, 4, 5, 7, 8, 5, 6, 9, 10, 9, 4, 2, 3, 4, 6, 7, 8, 9, 10, 5, 8, 1, 1, 2, 10, 1, 2, 10, 2, 10, 2, 4, 7, 9, 7, 2, 4, 5, 6, 7, 9, 10, 2, 5, 10, 1, 2, 10, 3, 5, 6, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 4, 7, 5, 3, 3, 8, 1, 2, 3, 6, 7, 9, 10, 1, 7, 3, 7, 5, 3, 5, 10, 10, 7, 10, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 10, 10, 1, 2, 3, 4, 6, 7, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 1, 2, 5, 6, 7, 8, 9, 10, 2, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 7, 1, 2, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 1, 2, 4, 5, 6, 7, 9, 10, 3, 5, 8, 1, 3, 4, 5, 6, 8, 9, 10, 3, 6, 2, 3, 4, 6, 7, 8, 9, 10, 3, 4, 3, 5, 1, 2, 1, 4, 10, 5, 3, 4, 10, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 1, 3, 7, 8, 9, 1, 4, 8, 9, 4, 1, 2, 3, 4, 5, 7, 10, 1, 2, 3, 4, 5, 6, 7, 8, 10, 7, 1, 5, 7, 9, 9, 2, 4, 6, 9, 1, 8, 1, 2, 3, 5, 5, 2, 3, 4, 7, 8, 9, 3, 4, 8, 1, 2, 4, 5, 6, 8, 9, 10, 4, 5, 8, 4, 10, 2, 3, 5, 1, 2, 1, 4, 3, 6, 1, 3, 4, 1, 2, 6, 1, 2, 3, 5, 7, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 1, 8, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 2, 4, 6, 7, 8, 9, 3, 8, 7, 5, 4, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 3, 6, 8, 3, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 10, 5, 3, 5, 6, 7, 3, 4, 8, 1, 3, 4, 5, 6, 7, 10, 1, 2, 4, 7, 9, 10, 2, 8, 9, 2, 9, 10, 10, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 1, 2, 3, 5, 6, 7, 8, 9, 10, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 1, 2, 3, 4, 6, 7, 8, 9, 6, 9, 6, 5, 7, 7, 7, 9, 10, 8, 9, 10, 3, 1, 2, 4, 5, 6, 7, 8, 10, 7, 10, 10, 5, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 1, 2, 5, 6, 8, 10, 3, 1, 8, 9, 10, 3, 4, 8, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 4, 1, 5, 8, 10, 1, 2, 3, 4, 5, 6, 7, 1, 2, 3, 9, 3, 4, 7, 1, 8, 1, 2, 3, 4, 5, 6, 8, 3, 5, 6, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 2, 3, 4, 5, 8, 9, 3, 5, 7, 8, 9, 2, 2, 2, 3, 5, 8, 9, 10, 1, 3, 4, 5, 6, 7, 8, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 3, 4, 8, 10, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 3, 5, 10, 6, 5, 10, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 3, 8, 5, 3, 1, 2, 1, 2, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 1, 2, 3, 4, 5, 9, 7, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 2, 2, 7, 5, 6, 5, 6, 6, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 8, 1, 3, 5, 6, 7, 8, 9, 6, 1, 3, 5, 6, 7, 9, 10, 9, 1, 2, 4, 9, 10, 7, 5, 1, 2, 3, 4, 5, 6, 7, 10, 2, 7, 8, 2, 3, 4, 5, 6, 7, 2, 2, 3, 5, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 2, 3, 4, 8, 9, 2, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 2, 3, 5, 8, 9, 7, 10, 1, 2, 3, 4, 7, 9, 10, 3, 4, 8, 10, 2, 4, 1, 7, 7, 10, 1, 7, 8, 1, 6, 8, 10, 10, 1, 3, 4, 5, 6, 7, 8, 10, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 1, 1, 3, 4, 5, 1, 6, 10, 6, 3, 5, 4, 2, 2, 9, 3, 1, 1, 9, 10, 1, 2, 3, 4, 5, 6, 7, 10, 6, 2, 3, 4, 5, 6, 7, 8, 9, 10, 3, 5, 10, 1, 10, 2, 1, 2, 3, 4, 5, 7, 8, 9, 10, 1, 3, 4, 5, 8, 3, 5, 4, 5, 7, 4, 5, 6, 7, 8, 5, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 9, 1, 2, 5, 5, 1, 3, 4, 5, 6, 7, 8, 10, 3, 7, 10, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 7, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 1, 3, 4, 5, 6, 7, 8, 10, 8, 2, 3, 4, 6, 7, 8, 9, 10, 9, 5, 9, 8, 1, 2, 3, 5, 6, 8, 9, 10, 3, 9, 8, 4, 4, 9, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 8, 1, 2, 3, 5, 6, 3, 5, 7, 8, 10, 1, 2, 3, 4, 5, 6, 7, 8, 9, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 6, 2, 3, 4, 5, 6, 7, 8, 9, 2, 1, 2, 3, 4, 5, 6, 7, 9, 10, 2, 5, 2, 1, 2, 3, 6, 8, 9, 9, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 6, 4, 7, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 4, 5, 6, 7, 10, 3, 3, 4, 5, 7, 10, 1, 9, 1, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 6, 1, 2, 6, 9, 10, 1, 1, 1, 3, 2, 6, 7, 5, 7, 1, 2, 3, 4, 5, 6, 7, 9, 2, 4, 7, 5, 3, 4, 1, 4, 6, 7, 3, 4, 6, 8, 3, 6, 10, 6, 1, 5, 6, 8, 2, 1, 2, 3, 4, 5, 6, 7, 8, 10, 4, 8, 1, 3, 4, 8, 1, 10, 2, 3, 5, 6, 7, 8, 10, 3, 7, 7, 4, 1, 6, 6, 7, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 1, 2, 5, 7, 9, 1, 6, 7, 3, 5, 3, 1, 3, 4, 1, 5, 8, 9, 10, 5, 10, 3, 5, 7, 8, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 1, 2, 3, 3, 3, 3, 6, 7, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 9, 5, 1], \"Freq\": [0.14598289132118225, 0.5243467092514038, 0.1291005164384842, 0.0496540442109108, 0.00794464722275734, 0.02284085936844349, 0.06653641909360886, 0.0347578302025795, 0.01886853575706482, 0.40391483902931213, 0.1960684359073639, 0.17181970179080963, 0.03325542435050011, 0.0006928213406354189, 0.19329716265201569, 0.9846343994140625, 0.05246054753661156, 0.07400684058666229, 0.5367838144302368, 0.18267512321472168, 0.030914250761270523, 0.02623027376830578, 0.03278784081339836, 0.0496501587331295, 0.005620772950351238, 0.00843115895986557, 0.12411247193813324, 0.0630735531449318, 0.19735917448997498, 0.614458441734314, 0.07896016538143158, 0.02786829322576523, 0.006967073306441307, 0.12772968411445618, 0.7570886611938477, 0.0386776365339756, 0.08218997716903687, 0.00483470456674695, 0.8702468276023865, 0.9960854053497314, 0.3871470093727112, 0.6115800738334656, 0.9910170435905457, 0.9902247786521912, 0.33969980478286743, 0.014489565044641495, 0.09418217092752457, 0.09981700032949448, 0.004024879075586796, 0.20285390317440033, 0.03300400823354721, 0.21090367436408997, 0.12552714347839355, 0.12667876482009888, 0.06333938241004944, 0.012667876668274403, 0.17389538884162903, 0.03685200214385986, 0.07370400428771973, 0.38694602251052856, 0.9025949835777283, 0.09524871408939362, 0.7508120536804199, 0.05317366123199463, 0.19355212152004242, 0.2244642972946167, 0.7725217938423157, 0.002278825268149376, 0.025182049721479416, 0.7351221442222595, 0.18789683282375336, 0.011622484773397446, 0.0397101566195488, 0.3441043496131897, 0.6550210118293762, 0.04772661626338959, 0.8045344352722168, 0.03409044072031975, 0.11363480240106583, 0.9978176951408386, 0.06133982539176941, 0.707861602306366, 0.060113027691841125, 0.011041169054806232, 0.05643263831734657, 0.013494761660695076, 0.012267964892089367, 0.0772881805896759, 0.8128747344017029, 0.14955486357212067, 0.015835221856832504, 0.012316283769905567, 0.007037876173853874, 0.9969637393951416, 0.9991614818572998, 0.8529326319694519, 0.08812587708234787, 0.006294705905020237, 0.050357647240161896, 0.9844738245010376, 0.9972343444824219, 0.9992160201072693, 0.9963047504425049, 0.6339515447616577, 0.02203921601176262, 0.0427820086479187, 0.24113495647907257, 0.03241061046719551, 0.027224913239479065, 0.9964976906776428, 0.1443973183631897, 0.31100961565971375, 0.18626399338245392, 0.061518386006355286, 0.29563000798225403, 0.030768103897571564, 0.016782602295279503, 0.019579702988266945, 0.008391301147639751, 0.8978692293167114, 0.02517390251159668, 0.9904056191444397, 0.9817970991134644, 0.0017971218330785632, 0.02096642181277275, 0.6176108717918396, 0.11861003935337067, 0.02515970543026924, 0.02755586802959442, 0.004193284083157778, 0.14077454805374146, 0.03174915164709091, 0.01257985271513462, 0.9968417286872864, 0.991598904132843, 0.9969107508659363, 0.9914524555206299, 0.9858863353729248, 0.023294983431696892, 0.15141738951206207, 0.8230893611907959, 0.003686234587803483, 0.012901821173727512, 0.027646759524941444, 0.020274288952350616, 0.007372469175606966, 0.005529351532459259, 0.1032145693898201, 0.74830561876297, 0.06819533556699753, 0.8323493599891663, 0.1655372679233551, 0.9907169938087463, 0.9820555448532104, 0.016715839505195618, 0.056100912392139435, 0.9407691955566406, 0.013236194849014282, 0.9844419956207275, 0.09290590137243271, 0.5882739424705505, 0.0011710828403010964, 0.030838513746857643, 0.05074692144989967, 0.05933486297726631, 0.04801439493894577, 0.04333006590604782, 0.07065533101558685, 0.01405299361795187, 0.00951243843883276, 0.1598089635372162, 0.7933374047279358, 0.034244779497385025, 0.0074272542260587215, 0.13071967661380768, 0.06758801639080048, 0.18196773529052734, 0.039364445954561234, 0.10546701401472092, 0.24138575792312622, 0.019310861825942993, 0.07501526921987534, 0.13294784724712372, 0.04424953833222389, 0.11761061102151871, 0.023289229720830917, 0.1612779200077057, 0.10945937782526016, 0.1676824539899826, 0.19795845448970795, 0.022706998512148857, 0.06288091838359833, 0.09315691888332367, 0.9987183213233948, 0.9975488185882568, 0.0013375557027757168, 0.9978166222572327, 0.06178143993020058, 0.9339900016784668, 0.9676030278205872, 0.02764580026268959, 0.9971796870231628, 0.982193648815155, 0.9898443818092346, 0.03046371042728424, 0.08986794203519821, 0.7326522469520569, 0.048741936683654785, 0.016755040735006332, 0.00761592760682106, 0.012185484170913696, 0.05940423533320427, 0.9946929216384888, 0.98945152759552, 0.10203344374895096, 0.3764682412147522, 0.37154248356819153, 0.0049257525242865086, 0.0014073578640818596, 0.02392508275806904, 0.0731826052069664, 0.04644281044602394, 0.9914161562919617, 0.055586133152246475, 0.939405620098114, 0.9450883865356445, 0.05471564456820488, 0.9883830547332764, 0.18599717319011688, 0.01752147264778614, 0.2014969289302826, 0.27158281207084656, 0.20082302391529083, 0.013478055596351624, 0.06671637296676636, 0.03571684658527374, 0.0006739028031006455, 0.0074129304848611355, 0.018123658373951912, 0.4086061120033264, 0.023066474124789238, 0.5272337198257446, 0.023066474124789238, 0.04739116132259369, 0.8909538388252258, 0.056869395077228546, 0.9964706301689148, 0.9901596903800964, 0.9917035698890686, 0.995495080947876, 0.005461199674755335, 0.13243408501148224, 0.04505489766597748, 0.04642019420862198, 0.2047949880361557, 0.13789528608322144, 0.028671298176050186, 0.01092239934951067, 0.3877451717853546, 0.06210401654243469, 0.931560218334198, 0.9911597371101379, 0.9856107234954834, 0.03709100931882858, 0.9602450132369995, 0.8973998427391052, 0.039926689118146896, 0.0468980148434639, 0.005703812465071678, 0.008872597478330135, 0.9925441741943359, 0.09890180826187134, 0.14101789891719818, 0.0501607246696949, 0.13344645500183105, 0.028866078704595566, 0.20679469406604767, 0.028866078704595566, 0.12918752431869507, 0.16278575360774994, 0.01987500488758087, 0.9940217733383179, 0.9957262873649597, 0.9968324303627014, 0.12163656204938889, 0.1770021617412567, 0.04529913142323494, 0.08556503057479858, 0.024327311664819717, 0.09479262679815292, 0.041104767471551895, 0.009227600879967213, 0.40098121762275696, 0.9872248768806458, 0.9969919323921204, 0.9897413849830627, 0.9944040179252625, 0.6778358817100525, 0.13264651596546173, 0.023121869191527367, 0.0073016430251300335, 0.03772515431046486, 0.1204771101474762, 0.3485725224018097, 0.004737879149615765, 0.6463820934295654, 0.988788366317749, 0.0016636345535516739, 0.9981806874275208, 0.013511610217392445, 0.9863475561141968, 0.002685961779206991, 0.9857479333877563, 0.009400865994393826, 0.992397129535675, 0.9943981170654297, 0.9900022149085999, 0.049530185759067535, 0.9286909699440002, 0.021669454872608185, 0.23153142631053925, 0.499500572681427, 0.006072955206036568, 0.04630628600716591, 0.009109432809054852, 0.02429182082414627, 0.019737103953957558, 0.05237923935055733, 0.08198489993810654, 0.02960565686225891, 0.9902758598327637, 0.016072237864136696, 0.03214447572827339, 0.008036118932068348, 0.9402259588241577, 0.9969149231910706, 0.8351381421089172, 0.035791631788015366, 0.12725913524627686, 0.9410224556922913, 0.05614054203033447, 0.00718638114631176, 0.9845342040061951, 0.12217437475919724, 0.3212733566761017, 0.027149861678481102, 0.5279139876365662, 0.00637459009885788, 0.993161141872406, 0.049447860568761826, 0.949398934841156, 0.04700689762830734, 0.6894344687461853, 0.03917241469025612, 0.001958620734512806, 0.007834482938051224, 0.21348965167999268, 0.019394105300307274, 0.0030622270423918962, 0.16433952748775482, 0.7624945640563965, 0.04797489196062088, 0.0030622270423918962, 0.02497812546789646, 0.01405019499361515, 0.026539258658885956, 0.01405019499361515, 0.2700759768486023, 0.5214183926582336, 0.11708496510982513, 0.01248906273394823, 0.08582406491041183, 0.15019211173057556, 0.007152005564421415, 0.04470003396272659, 0.7116245627403259, 0.2507038414478302, 0.22155915200710297, 0.014572346583008766, 0.11628138273954391, 0.07137475907802582, 0.06988778710365295, 0.13055633008480072, 0.03211864084005356, 0.041040487587451935, 0.051449306309223175, 0.010484231635928154, 0.19526882469654083, 0.12318972498178482, 0.07863173633813858, 0.011794760823249817, 0.14677923917770386, 0.42985349893569946, 0.0013105289544910192, 0.8898380994796753, 0.08089437335729599, 0.008368383161723614, 0.019526228308677673, 0.9776338338851929, 0.992104709148407, 0.9852089285850525, 0.007977400906383991, 0.003988700453191996, 0.9938931465148926, 0.14128684997558594, 0.029136978089809418, 0.4518980383872986, 0.04947788640856743, 0.13359029591083527, 0.010995086282491684, 0.11489865183830261, 0.06212223693728447, 0.007696560118347406, 0.011460448615252972, 0.055010151118040085, 0.5684382319450378, 0.2177485227584839, 0.06990873068571091, 0.010314403101801872, 0.06532455235719681, 0.9914078712463379, 0.009856686927378178, 0.062097128480672836, 0.1419362872838974, 0.5105763673782349, 0.18234871327877045, 0.03154139965772629, 0.03055572882294655, 0.03154139965772629, 0.9842479228973389, 0.7061063051223755, 0.005525088403373957, 0.07514120638370514, 0.1193419098854065, 0.07514120638370514, 0.00110501772724092, 0.018785301595926285, 0.2932772636413574, 0.04783955588936806, 0.10399903357028961, 0.5553548336029053, 0.9974397420883179, 0.32539263367652893, 0.5732384324073792, 0.10035473853349686, 0.9916263222694397, 0.9956570863723755, 0.9919785857200623, 0.9961087107658386, 0.9902847409248352, 0.9942601919174194, 0.9961082935333252, 0.9942809343338013, 0.11343644559383392, 0.8848042488098145, 0.003028471488505602, 0.47547000646591187, 0.2640827000141144, 0.016353745013475418, 0.004239859990775585, 0.21078160405158997, 0.026044854894280434, 0.10129044950008392, 0.11214299499988556, 0.11756926774978638, 0.07717367261648178, 0.0012058386346325278, 0.1917283535003662, 0.2074042558670044, 0.08802622556686401, 0.06812988221645355, 0.03557224199175835, 0.9973674416542053, 0.11459366232156754, 0.7639577388763428, 0.12005050480365753, 0.581549882888794, 0.2825454771518707, 0.013715799897909164, 0.09326744079589844, 0.024688439443707466, 0.004114740062505007, 0.9912833571434021, 0.9915632605552673, 0.987637460231781, 0.006995608564466238, 0.002998118055984378, 0.24484629929065704, 0.12192346155643463, 0.29581430554389954, 0.11292910575866699, 0.0449717678129673, 0.1299184411764145, 0.03897553309798241, 0.9956022500991821, 0.9973152875900269, 0.009577130898833275, 0.4747520685195923, 0.0615672692656517, 0.4542296230792999, 0.9948829412460327, 0.9922850728034973, 0.04472442716360092, 0.25550490617752075, 0.08590632677078247, 0.18686839938163757, 0.07749281823635101, 0.13461610674858093, 0.031439945101737976, 0.04251034930348396, 0.11690345406532288, 0.023026438429951668, 0.9799155592918396, 0.7679171562194824, 0.20840230584144592, 0.02265242487192154, 0.99677973985672, 0.012705590575933456, 0.949009895324707, 0.037139419466257095, 0.0119171142578125, 0.01310882531106472, 0.605389416217804, 0.3467880189418793, 0.010725402273237705, 0.0011917114024981856, 0.010725402273237705, 0.051335275173187256, 0.014808251522481441, 0.20534110069274902, 0.1796734631061554, 0.05429692193865776, 0.14512087404727936, 0.175724595785141, 0.10299962013959885, 0.049360841512680054, 0.02138969674706459, 0.9928632378578186, 0.005768533796072006, 0.08797013759613037, 0.012979201041162014, 0.015863467007875443, 0.1543082743883133, 0.18603521585464478, 0.09518080949783325, 0.015863467007875443, 0.4254293739795685, 0.9893049597740173, 0.13154099881649017, 0.002684510312974453, 0.8644123077392578, 0.9944851398468018, 0.9891051650047302, 0.033735986799001694, 0.00606489647179842, 0.7467404007911682, 0.015162241645157337, 0.18535840511322021, 0.010992624796926975, 0.0007581120589748025, 0.0011371681466698647, 0.7884120345115662, 0.00419814744964242, 0.19731292128562927, 0.00419814744964242, 0.00587740633636713, 0.00438003009185195, 0.9942668080329895, 0.9940217733383179, 0.03518321365118027, 0.9631404876708984, 0.9966021180152893, 0.0027513206005096436, 0.29989394545555115, 0.09079357981681824, 0.6052905321121216, 0.0013756603002548218, 0.0013756603002548218, 0.996711790561676, 0.0427921898663044, 0.06828540563583374, 0.05462832748889923, 0.02276180312037468, 0.07192729413509369, 0.0783006027340889, 0.06464351713657379, 0.18118394911289215, 0.40789151191711426, 0.008194249123334885, 0.9927068948745728, 0.9913347959518433, 0.0025878301821649075, 0.007763490546494722, 0.5839869976043701, 0.26137086749076843, 0.0008626100607216358, 0.05520704388618469, 0.0733218565583229, 0.013801760971546173, 0.9992876648902893, 0.032602448016405106, 0.011643731035292149, 0.016301224008202553, 0.9128684997558594, 0.025616208091378212, 0.00628057774156332, 0.02791368030011654, 0.10188493132591248, 0.2023741751909256, 0.2979785203933716, 0.2449425458908081, 0.03768346831202507, 0.0397769920527935, 0.016748208552598953, 0.02512231096625328, 0.9943776726722717, 0.15899166464805603, 0.8376146554946899, 0.0025852303951978683, 0.9928542375564575, 0.998742938041687, 0.9821000695228577, 0.9941750764846802, 0.01414253655821085, 0.9086580276489258, 0.07424832135438919, 0.9900906682014465, 0.9895586967468262, 0.9942180514335632, 0.09427931159734726, 0.6226578950881958, 0.010360363870859146, 0.03833334892988205, 0.22896404564380646, 0.004144145641475916, 0.15294533967971802, 0.5817805528640747, 0.06882540136575699, 0.07235491275787354, 0.029412565752863884, 0.0011765025556087494, 0.0429423451423645, 0.04411884769797325, 0.007059015799313784, 0.9934695363044739, 0.9772945046424866, 0.021786820143461227, 0.9884756207466125, 0.21478646993637085, 0.08931714296340942, 0.10420333594083786, 0.5911944508552551, 0.007281843572854996, 0.540590226650238, 0.38905850052833557, 0.0627625584602356, 0.127691388130188, 0.08755980432033539, 0.05837320536375046, 0.11309808492660522, 0.13133971393108368, 0.012161084450781345, 0.08999202400445938, 0.025538276880979538, 0.030402710661292076, 0.3247009515762329, 0.9984749555587769, 0.9873408675193787, 0.03167729079723358, 0.09503187239170074, 0.8095307946205139, 0.059834882616996765, 0.018883921205997467, 0.978816568851471, 0.00650462880730629, 0.9887035489082336, 0.9960068464279175, 0.11995285004377365, 0.30648744106292725, 0.22458131611347198, 0.1421467661857605, 0.02906346507370472, 0.03117717243731022, 0.030648745596408844, 0.054427944123744965, 0.028535038232803345, 0.03381930664181709, 0.9655084609985352, 0.031217364594340324, 0.09275101125240326, 0.022714532911777496, 0.05489345267415047, 0.8271875381469727, 0.4964306652545929, 0.04393191635608673, 0.035145532339811325, 0.005491489544510841, 0.14717192947864532, 0.03953872621059418, 0.047226812690496445, 0.10214170813560486, 0.047226812690496445, 0.035145532339811325, 0.005433580372482538, 0.66561359167099, 0.2974885404109955, 0.008150370791554451, 0.021734321489930153, 0.11880886554718018, 0.6471291184425354, 0.23256203532218933, 0.9827058911323547, 0.012132171541452408, 0.037580136209726334, 0.037580136209726334, 0.6822240352630615, 0.1214127466082573, 0.06070637330412865, 0.06070637330412865, 0.7771899700164795, 0.01132929977029562, 0.18580052256584167, 0.02265859954059124, 0.00226586009375751, 0.010305746458470821, 0.020096207037568092, 0.3040195405483246, 0.6652359366416931, 0.9966678619384766, 0.9952186346054077, 0.05247049406170845, 0.9444688558578491, 0.9979948997497559, 0.24752682447433472, 0.07662222534418106, 0.0008545229793526232, 0.08630681782960892, 0.18600116670131683, 0.13102684915065765, 0.15210509300231934, 0.027059894055128098, 0.023356961086392403, 0.06893151998519897, 0.005418102722615004, 0.1661551594734192, 0.012642240151762962, 0.12461636960506439, 0.06140516698360443, 0.6266939043998718, 0.9935146570205688, 0.028499729931354523, 0.17739084362983704, 0.04954158514738083, 0.08203660696744919, 0.06525638699531555, 0.19683457911014557, 0.2426472306251526, 0.0492752343416214, 0.05486863851547241, 0.053803227841854095, 0.06767828017473221, 0.9305763244628906, 0.9940921068191528, 0.47854405641555786, 0.0675768256187439, 0.01401593443006277, 0.43899908661842346, 0.9759842157363892, 0.7746955156326294, 0.224728062748909, 0.07067009806632996, 0.13031825423240662, 0.06418660283088684, 0.13356000185012817, 0.0953073799610138, 0.14523029327392578, 0.18088951706886292, 0.022043883800506592, 0.0564064085483551, 0.1011425256729126, 0.9620181918144226, 0.03390372544527054, 0.928249180316925, 0.06953177601099014, 0.9825076460838318, 0.07760585844516754, 0.05453384667634964, 0.19925828278064728, 0.018877100199460983, 0.6376265287399292, 0.004194911103695631, 0.00629236688837409, 0.1507587730884552, 0.19675298035144806, 0.26114487648010254, 0.06490293145179749, 0.0741017758846283, 0.09812096506357193, 0.012265120632946491, 0.08841107785701752, 0.03219594433903694, 0.020952915772795677, 0.9962035417556763, 0.09006869792938232, 0.9076153039932251, 0.9927300810813904, 0.9875916838645935, 0.9910625219345093, 0.990225613117218, 0.891280472278595, 0.10728375613689423, 0.043885838240385056, 0.05120014399290085, 0.8996596336364746, 0.38985222578048706, 0.08291633427143097, 0.0029093450866639614, 0.09746305644512177, 0.06109624728560448, 0.12801118195056915, 0.09018969535827637, 0.05091353878378868, 0.06255091726779938, 0.03273013234138489, 0.06610270589590073, 0.11927227675914764, 0.43972671031951904, 0.06538420170545578, 0.14873109757900238, 0.01796269230544567, 0.021555230021476746, 0.05748061463236809, 0.06466569006443024, 0.9846019148826599, 0.016519740223884583, 0.2019079476594925, 0.11013160645961761, 0.6699672937393188, 0.024322209879755974, 0.9450916051864624, 0.003474601311609149, 0.024322209879755974, 0.8505304455757141, 0.10692382603883743, 0.038881391286849976, 0.12049806118011475, 0.047262489795684814, 0.20182360708713531, 0.31721222400665283, 0.054075103253126144, 0.05577825754880905, 0.0672745406627655, 0.03278569132089615, 0.09282182902097702, 0.010644705034792423, 0.970984935760498, 0.025627167895436287, 0.9892431497573853, 0.020421624183654785, 0.04413705691695213, 0.05138343945145607, 0.18708842992782593, 0.24176567792892456, 0.10869573801755905, 0.0955204963684082, 0.11067202687263489, 0.11001326143741608, 0.030961817130446434, 0.030803175643086433, 0.01760181412100792, 0.04400453716516495, 0.8888916373252869, 0.01320136059075594, 0.9939636588096619, 0.9912236332893372, 0.9990959763526917, 0.05654406547546387, 0.9400451183319092, 0.27265825867652893, 0.0039090788923203945, 0.06547707319259644, 0.0732952356338501, 0.01954539492726326, 0.10554513335227966, 0.3586580157279968, 0.02345447428524494, 0.0029318092856556177, 0.0742725059390068, 0.9918825626373291, 0.9930832386016846, 0.9938083291053772, 0.9941292405128479, 0.9872344732284546, 0.9915617108345032, 0.19975487887859344, 0.7990195155143738, 0.9793489575386047, 0.011330295354127884, 0.022660590708255768, 0.022660590708255768, 0.07931207120418549, 0.008497721515595913, 0.7308040857315063, 0.12180067598819733, 0.002832573838531971, 0.00934284646064043, 0.019404372200369835, 0.8940384984016418, 0.070430688560009, 0.005749443545937538, 0.9890683889389038, 0.0846291109919548, 0.0584796667098999, 0.4787725508213043, 0.1374034434556961, 0.0404127761721611, 0.0294775553047657, 0.0342320017516613, 0.0622832216322422, 0.0370846651494503, 0.0370846651494503, 0.005476515740156174, 0.021906062960624695, 0.1341746300458908, 0.6517053842544556, 0.1697719842195511, 0.013691289350390434, 0.9946812987327576, 0.05209195986390114, 0.029964402318000793, 0.4881892502307892, 0.07929041981697083, 0.000460990791907534, 0.02673746645450592, 0.014290714636445045, 0.23879322409629822, 0.06592168658971786, 0.005070898681879044, 0.041801583021879196, 0.8824778199195862, 0.0743139237165451, 0.9888632893562317, 0.012953841127455235, 0.8186827301979065, 0.056996900588274, 0.023316914215683937, 0.08679073303937912, 0.036432038992643356, 0.7522144317626953, 0.2014477401971817, 0.010715305805206299, 0.9897346496582031, 0.9900591373443604, 0.01565597578883171, 0.5387497544288635, 0.17774136364459991, 0.05709826201200485, 0.12893155217170715, 0.03960040584206581, 0.0018418794497847557, 0.04144228622317314, 0.9562177658081055, 0.03464557230472565, 0.9940004348754883, 0.20040783286094666, 0.7981759905815125, 0.9990657567977905, 0.02949688956141472, 0.030480118468403816, 0.9389843344688416, 0.9947848916053772, 0.9926949739456177, 0.05052619054913521, 0.05052619054913521, 0.8625542521476746, 0.03609013557434082, 0.9870107769966125, 0.024646587669849396, 0.10914917290210724, 0.08098164200782776, 0.017604704946279526, 0.746439516544342, 0.007041881792247295, 0.01408376358449459, 0.9993667602539062, 0.029904931783676147, 0.9629387855529785, 0.865506649017334, 0.10981189459562302, 0.023615460842847824, 0.0038583234418183565, 0.9491475820541382, 0.042441558092832565, 0.011400341987609863, 0.2233125865459442, 0.06974326819181442, 0.07644934952259064, 0.004023650195449591, 0.14887505769729614, 0.1978294551372528, 0.06303718686103821, 0.09522638469934464, 0.1099797710776329, 0.9821186661720276, 0.01741345226764679, 0.9934096932411194, 0.9922566413879395, 0.039439857006073, 0.9586918950080872, 0.7953653931617737, 0.0046422104351222515, 0.01005812268704176, 0.1493244469165802, 0.0007737017585895956, 0.01005812268704176, 0.029400667175650597, 0.9974008798599243, 0.9822391867637634, 0.08993218839168549, 0.8993219137191772, 0.982517421245575, 0.0062467665411531925, 0.9911536574363708, 0.9936993718147278, 0.997281014919281, 0.2905958890914917, 0.7078618407249451, 0.3073049783706665, 0.05825990438461304, 0.007682624738663435, 0.08770996332168579, 0.09987412393093109, 0.1280437409877777, 0.15557314455509186, 0.016645686700940132, 0.05313815549015999, 0.08578930795192719, 0.9962541460990906, 0.9895529747009277, 0.03024541400372982, 0.004032721742987633, 0.9295423626899719, 0.0020163608714938164, 0.006049082614481449, 0.02822905220091343, 0.143030047416687, 0.5369619131088257, 0.007990504615008831, 0.0031962019857019186, 0.13184332847595215, 0.093488909304142, 0.018378160893917084, 0.005593353416770697, 0.05753163620829582, 0.0015981009928509593, 0.03587798401713371, 0.05189494043588638, 0.5907053351402283, 0.04164408892393112, 0.0012813565554097295, 0.11147801578044891, 0.05381697416305542, 0.03203391283750534, 0.005125426221638918, 0.0756000354886055, 0.388294517993927, 0.25386178493499756, 0.09002191573381424, 0.15783841907978058, 0.027606720104813576, 0.0024005842860788107, 0.042610373347997665, 0.03660891205072403, 0.9922282099723816, 0.1063678190112114, 0.12472893297672272, 0.034822799265384674, 0.08104214817285538, 0.24059388041496277, 0.09623755514621735, 0.12282950431108475, 0.0930718407034874, 0.07344444841146469, 0.02659195475280285, 0.08148057013750076, 0.08059169352054596, 0.1822201907634735, 0.1339244395494461, 0.1167394369840622, 0.15347976982593536, 0.17629432678222656, 0.018073873594403267, 0.02844412811100483, 0.029036713764071465, 0.9882287383079529, 0.053438350558280945, 0.945015013217926, 0.1160629466176033, 0.09040692448616028, 0.04031660035252571, 0.054977186024188995, 0.04520346224308014, 0.03909488767385483, 0.3750665783882141, 0.02321258932352066, 0.053755469620227814, 0.16126640141010284, 0.057640671730041504, 0.6063355207443237, 0.031037285923957825, 0.024386439472436905, 0.19619998335838318, 0.056532200425863266, 0.011084744706749916, 0.01662711799144745, 0.007938551716506481, 0.9883496165275574, 0.9811052083969116, 0.04756637662649155, 0.2102433741092682, 0.6021903157234192, 0.0038053099997341633, 0.04756637662649155, 0.032345134764909744, 0.004756637383252382, 0.05327434092760086, 0.9910971522331238, 0.995514452457428, 0.016419608145952225, 0.5435311198234558, 0.1498815417289734, 0.06062624603509903, 0.11367420852184296, 0.05473202466964722, 0.009262342937290668, 0.05220593139529228, 0.8968327641487122, 0.10020478069782257, 0.03034295327961445, 0.9659173488616943, 0.005181933753192425, 0.9897493720054626, 0.9962561726570129, 0.9940349459648132, 0.9951643347740173, 0.9922572374343872, 0.12975022196769714, 0.027522772550582886, 0.8374786376953125, 0.10295763611793518, 0.3724643886089325, 0.030281657353043556, 0.07683970779180527, 0.06737668812274933, 0.10901396721601486, 0.06132035702466965, 0.10712136328220367, 0.04996473714709282, 0.022711243480443954, 0.05779813230037689, 0.03639141470193863, 0.002140671480447054, 0.006422014441341162, 0.8948007225990295, 0.004667358472943306, 0.03267151117324829, 0.06534302234649658, 0.8961328268051147, 0.9892205595970154, 0.031489819288253784, 0.02422293648123741, 0.03027867153286934, 0.7981457710266113, 0.027856377884745598, 0.029067525640130043, 0.05934619531035423, 0.0734139233827591, 0.09762490540742874, 0.3139616847038269, 0.13511286675930023, 0.03280196711421013, 0.06560393422842026, 0.001561998389661312, 0.26475873589515686, 0.016400983557105064, 0.9912712574005127, 0.034169621765613556, 0.09111899137496948, 0.8542405366897583, 0.017084810882806778, 0.9909042119979858, 0.08195075392723083, 0.02731691673398018, 0.8850681185722351, 0.9933369159698486, 0.9978326559066772, 0.9879665970802307, 0.008702563121914864, 0.04061196371912956, 0.20596066117286682, 0.74261873960495, 0.9881279468536377, 0.009207873605191708, 0.053712595254182816, 0.8885597586631775, 0.010742519050836563, 0.02915826439857483, 0.007673227693885565, 0.020768892019987106, 0.9553690552711487, 0.023365003988146782, 0.02318766713142395, 0.04289718344807625, 0.03246273472905159, 0.46723151206970215, 0.29448336362838745, 0.06028793379664421, 0.02782520093023777, 0.05101286992430687, 0.8876930475234985, 0.03227974846959114, 0.0792321115732193, 0.009054933674633503, 0.986987829208374, 0.019230911508202553, 0.004807727877050638, 0.9735649228096008, 0.053210411220788956, 0.9459628462791443, 0.9955835938453674, 0.9951725006103516, 0.9991540908813477, 0.9979762434959412, 0.9936963319778442, 0.007695446722209454, 0.9907887578010559, 0.9962958693504333, 0.0020005942787975073, 0.0020005942787975073, 0.7685548663139343, 0.2287604659795761, 0.20653042197227478, 0.7855666279792786, 0.006759177427738905, 0.34749361872673035, 0.034891776740550995, 0.11749272048473358, 0.017089851200580597, 0.17588303983211517, 0.010681157000362873, 0.04486085847020149, 0.18585212528705597, 0.012817388400435448, 0.05340578407049179, 0.996053159236908, 0.9903555512428284, 0.04634469747543335, 0.09325803816318512, 0.14557352662086487, 0.28887245059013367, 0.09695424139499664, 0.0958169475197792, 0.07705160975456238, 0.0958169475197792, 0.03866796940565109, 0.021892894059419632, 0.06008889153599739, 0.06687311828136444, 0.13083872199058533, 0.4409749209880829, 0.256831556558609, 0.04361290484666824, 0.0064284466207027435, 0.9899807572364807, 0.9886947870254517, 0.9950776696205139, 0.9919518828392029, 0.09934293478727341, 0.038046229630708694, 0.1631760448217392, 0.17163076996803284, 0.03381887078285217, 0.05241924896836281, 0.09257915616035461, 0.24434134364128113, 0.02536415308713913, 0.07905161380767822, 0.04936765506863594, 0.9424734115600586, 0.007479947991669178, 0.9844189286231995, 0.05895441398024559, 0.2187705934047699, 0.01633676514029503, 0.11222647875547409, 0.061795592308044434, 0.24718236923217773, 0.026280883699655533, 0.014205883257091045, 0.11293677240610123, 0.13069412112236023, 0.9943311214447021, 0.9966910481452942, 0.1197439506649971, 0.8786845207214355, 0.004850068595260382, 0.9894140362739563, 0.08816782385110855, 0.9062831997871399, 0.004100828897207975, 0.012024443596601486, 0.012024443596601486, 0.0745515525341034, 0.009619555436074734, 0.7070373296737671, 0.007214666344225407, 0.17555688321590424, 0.08572755008935928, 0.08572755008935928, 0.027654048055410385, 0.03318485617637634, 0.7660171389579773, 0.9978319406509399, 0.03353497385978699, 0.8607310652732849, 0.10060492902994156, 0.009947385638952255, 0.988106906414032, 0.9937465786933899, 0.9970183968544006, 0.38660314679145813, 0.25971803069114685, 0.01553021278232336, 0.02296488918364048, 0.0650947168469429, 0.1019376739859581, 0.014208491891622543, 0.05749483034014702, 0.06030348315834999, 0.016025857999920845, 0.07527759671211243, 0.05645819753408432, 0.135157510638237, 0.09580785036087036, 0.06843417882919312, 0.03763879835605621, 0.051325634121894836, 0.04961477965116501, 0.42771363258361816, 0.17850126326084137, 0.3224695920944214, 0.04134225472807884, 0.036964841187000275, 0.04669243097305298, 0.1381317675113678, 0.027723630890250206, 0.11770383268594742, 0.0753888189792633, 0.015077764168381691, 0.002935068216174841, 0.012718629091978073, 0.22795696556568146, 0.15262354910373688, 0.04304766654968262, 0.1330564320087433, 0.4148229658603668, 0.011740272864699364, 0.9925435185432434, 0.9940683841705322, 0.9845766425132751, 0.0067675975151360035, 0.9914530515670776, 0.9901037216186523, 0.021420219913125038, 0.8907241821289062, 0.08746589720249176, 0.013839946128427982, 0.2886617183685303, 0.6959515810012817, 0.9896976351737976, 0.015450194478034973, 0.035816360265016556, 0.02177072875201702, 0.01685475744307041, 0.013343350030481815, 0.23737117648124695, 0.013343350030481815, 0.6468012928962708, 0.3704948127269745, 0.6289325952529907, 0.9970839023590088, 0.9916179776191711, 0.06309525668621063, 0.23160114884376526, 0.09143144637346268, 0.03778158873319626, 0.05516112223267555, 0.10049902647733688, 0.04496009275317192, 0.051760777831077576, 0.1987311691045761, 0.12505705654621124, 0.5733996629714966, 0.11945825815200806, 0.09025734663009644, 0.11680363118648529, 0.0929119810461998, 0.006636569742113352, 0.9917995929718018, 0.782045841217041, 0.031643472611904144, 0.12431364506483078, 0.06102669611573219, 0.11312982439994812, 0.85518479347229, 0.028761819005012512, 0.1125701516866684, 0.05992540344595909, 0.0016801515594124794, 0.18145637214183807, 0.20833879709243774, 0.05376484990119934, 0.18929708003997803, 0.04480404034256935, 0.052084699273109436, 0.09632869064807892, 0.9851973056793213, 0.15788429975509644, 0.6178081631660461, 0.17962199449539185, 0.04461947828531265, 0.052308328449726105, 0.0018681546207517385, 0.0840669572353363, 0.32599297165870667, 0.043901633471250534, 0.4763794243335724, 0.014945236966013908, 0.021588508039712906, 0.053971268236637115, 0.11873678863048553, 0.8041719198226929, 0.08918620645999908, 0.9111455678939819, 0.9924914240837097, 0.9945734143257141, 0.9974730014801025, 0.014665473252534866, 0.12221228331327438, 0.017924467101693153, 0.027701450511813164, 0.23627707362174988, 0.016294971108436584, 0.5654354691505432, 0.09712156653404236, 0.8602195978164673, 0.0369986928999424, 0.05592300370335579, 0.0888008177280426, 0.05991750583052635, 0.4363223612308502, 0.06944285333156586, 0.10846605151891708, 0.01689980924129486, 0.006145385093986988, 0.14288020133972168, 0.015363463200628757, 0.007692718878388405, 0.5173353552818298, 0.2650141716003418, 0.13462257385253906, 0.07038837671279907, 0.005000267177820206, 0.3816435635089874, 0.487569123506546, 0.11059874296188354, 0.0077886441722512245, 0.012461830861866474, 0.9942175149917603, 0.9963088035583496, 0.05934375524520874, 0.025176139548420906, 0.23557673394680023, 0.5916392803192139, 0.05215057358145714, 0.03416761755943298, 0.18870770931243896, 0.0022071078419685364, 0.046349264681339264, 0.04303860291838646, 0.18098284304141998, 0.020967524498701096, 0.5164632201194763, 0.05881141871213913, 0.10455363243818283, 0.2860703468322754, 0.0609896183013916, 0.0762370228767395, 0.007986735552549362, 0.014521338045597076, 0.29115283489227295, 0.07986735552549362, 0.019603805616497993, 0.14538146555423737, 0.03939726948738098, 0.2041999250650406, 0.01609184220433235, 0.0016646733274683356, 0.07657497376203537, 0.0005548911285586655, 0.4916335344314575, 0.024970099329948425, 0.9953145384788513, 0.9900142550468445, 0.9978221654891968, 0.9882532358169556, 0.9908885955810547, 0.04804708808660507, 0.3049945533275604, 0.12394756078720093, 0.12046588957309723, 0.0936570018529892, 0.06649995595216751, 0.07102613151073456, 0.06336645036935806, 0.08495282381772995, 0.022979041561484337, 0.9857718348503113, 0.991929829120636, 0.9904465079307556, 0.9939417243003845, 0.07081771641969681, 0.9247960448265076, 0.05752654746174812, 0.26479777693748474, 0.13217931985855103, 0.19014500081539154, 0.040400322526693344, 0.10363561660051346, 0.04215686023235321, 0.07245710492134094, 0.07553104311227798, 0.020639296621084213, 0.08443208038806915, 0.3670520484447479, 0.031851623207330704, 0.05965859815478325, 0.05915301665663719, 0.11881161481142044, 0.05814185366034508, 0.08999347686767578, 0.10768882185220718, 0.022751159965991974, 0.02230319008231163, 0.9701887369155884, 0.9776880741119385, 0.9889037609100342, 0.2192477583885193, 0.7779079079627991, 0.09415528178215027, 0.9041321277618408, 0.06514911353588104, 0.08344942331314087, 0.1372523456811905, 0.21704170107841492, 0.03806464746594429, 0.1442064642906189, 0.09625963866710663, 0.03660062327980995, 0.1087038516998291, 0.0732012465596199, 0.04354425519704819, 0.0319778136909008, 0.24969910085201263, 0.04966766759753227, 0.20207256078720093, 0.0006803789874538779, 0.0319778136909008, 0.09865495562553406, 0.23337000608444214, 0.05851259455084801, 0.02581452950835228, 0.01173387747257948, 0.854226291179657, 0.002346775494515896, 0.08213713765144348, 0.021120978519320488, 0.9888254404067993, 0.06689516454935074, 0.09981182962656021, 0.13485215604305267, 0.13591398298740387, 0.06583333015441895, 0.006370967719703913, 0.024422042071819305, 0.060524191707372665, 0.3291666507720947, 0.07432795315980911, 0.991152822971344, 0.9976637363433838, 0.9881917238235474, 0.0415508970618248, 0.9556706547737122, 0.14121182262897491, 0.8573575615882874, 0.9959633350372314, 0.37817975878715515, 0.09959379583597183, 0.006086287554353476, 0.07109890133142471, 0.04454055801033974, 0.15022063255310059, 0.05947962775826454, 0.11646940559148788, 0.014662419445812702, 0.05975627526640892, 0.9972384572029114, 0.18402886390686035, 0.0029210930224508047, 0.09347497671842575, 0.049658581614494324, 0.02044765092432499, 0.07886950671672821, 0.5696130990982056, 0.9939109086990356, 0.2841370403766632, 0.05682740733027458, 0.07019855827093124, 0.4679903984069824, 0.09694086760282516, 0.00501418299973011, 0.01838533766567707, 0.9947983026504517, 0.10640466958284378, 0.03546822443604469, 0.03819654881954193, 0.6002314686775208, 0.22099430859088898, 0.9949023723602295, 0.979340136051178, 0.009374642744660378, 0.007030981592833996, 0.20858579874038696, 0.35779884457588196, 0.003124880837276578, 0.019530504941940308, 0.37889179587364197, 0.015624403953552246, 0.9001388549804688, 0.09725118428468704, 0.9928044080734253, 0.9915215373039246, 0.09694231301546097, 0.31304287910461426, 0.07068710029125214, 0.2393263280391693, 0.27870914340019226, 0.9975820779800415, 0.9928552508354187, 0.15090322494506836, 0.8492005467414856, 0.34192684292793274, 0.25229331851005554, 0.001819969853386283, 0.04618173465132713, 0.09463842958211899, 0.06574641168117523, 0.05596407130360603, 0.04049433022737503, 0.06074149161577225, 0.04026683419942856, 0.00978680606931448, 0.09786806255578995, 0.029360417276620865, 0.8220916986465454, 0.03914722427725792, 0.9928327798843384, 0.014372894540429115, 0.12560659646987915, 0.2262168675661087, 0.05811648815870285, 0.07061465829610825, 0.017497437074780464, 0.07561392337083817, 0.01562271174043417, 0.3499487340450287, 0.047493044286966324, 0.11003716289997101, 0.2054027020931244, 0.07580337673425674, 0.03178851306438446, 0.5746384859085083, 0.3218027353286743, 0.6757857799530029, 0.04022909700870514, 0.044463738799095154, 0.029642490670084953, 0.09104479849338531, 0.5356821417808533, 0.15879906713962555, 0.09951408207416534, 0.21030759811401367, 0.7733358144760132, 0.001655965344980359, 0.013247722759842873, 0.9961628913879395, 0.9994528889656067, 0.9940481781959534, 0.9878154397010803, 0.3193429112434387, 0.6789767742156982, 0.17293505370616913, 0.014762748964130878, 0.8098422288894653, 0.07927528023719788, 0.004718767013400793, 0.9126095175743103, 0.0018875066889449954, 0.9899497628211975, 0.009148583747446537, 0.04269339144229889, 0.21549998223781586, 0.07522169500589371, 0.43404948711395264, 0.14231130480766296, 0.05489150434732437, 0.027445752173662186, 0.12140603363513947, 0.029261967167258263, 0.4999438226222992, 0.12700939178466797, 0.03673310950398445, 0.023658612743020058, 0.0678628608584404, 0.04171387106180191, 0.006225950550287962, 0.04544943943619728, 0.9914941787719727, 0.9966549277305603, 0.9308264255523682, 0.06878028064966202, 0.9908043742179871, 0.03596719354391098, 0.9531306028366089, 0.9876322150230408, 0.990831196308136, 0.11258002370595932, 0.885111927986145, 0.9979943037033081, 0.9953410029411316, 0.014253759756684303, 0.9835094213485718, 0.9921932816505432, 0.9887199401855469, 0.02808680571615696, 0.9549513459205627, 0.009362268261611462, 0.012287507764995098, 0.03891044110059738, 0.043006278574466705, 0.13311466574668884, 0.06553337723016739, 0.08806046843528748, 0.5345065593719482, 0.08191671967506409, 0.9892351627349854, 0.0012264200486242771, 0.5175492763519287, 0.32316169142723083, 0.042311493307352066, 0.05212285369634628, 0.005518890451639891, 0.03556618466973305, 0.0042924704030156136, 0.017783092334866524, 0.05752358213067055, 0.8576242923736572, 0.08367066830396652, 0.9361351728439331, 0.06112222746014595, 0.9920821785926819, 0.113490991294384, 0.09021078795194626, 0.6205629110336304, 0.04365038126707077, 0.0065475571900606155, 0.01455012708902359, 0.038557834923267365, 0.06547556817531586, 0.007275063544511795, 0.0005374156753532588, 0.21496626734733582, 0.028483029454946518, 0.7529193162918091, 0.0032244939357042313, 0.05143122002482414, 0.9429057240486145, 0.9488199353218079, 0.04447593539953232, 0.00494177034124732, 0.5825725793838501, 0.09321161359548569, 0.2896218001842499, 0.015535268932580948, 0.018864255398511887, 0.9941855072975159, 0.07540678977966309, 0.09515619277954102, 0.007181599270552397, 0.025135597214102745, 0.5152797698974609, 0.15799517929553986, 0.014363198541104794, 0.021544797345995903, 0.07361139357089996, 0.014363198541104794, 0.9840489625930786, 0.044449977576732635, 0.9260411858558655, 0.02963331714272499, 0.9803271293640137, 0.036795347929000854, 0.08714687824249268, 0.21302570402622223, 0.023239167407155037, 0.07552729547023773, 0.5054518580436707, 0.013556180521845818, 0.04454173520207405, 0.0161642637103796, 0.010776176117360592, 0.9644677639007568, 0.25456756353378296, 0.05604676902294159, 0.09533188492059708, 0.08485585451126099, 0.07542742788791656, 0.0790940374135971, 0.19380658864974976, 0.029856689274311066, 0.056570570915937424, 0.07490362226963043, 0.9937314391136169, 0.2710559070110321, 0.05701915919780731, 0.04785025119781494, 0.04240620881319046, 0.06332278251647949, 0.31919267773628235, 0.004011398181319237, 0.12406681478023529, 0.014326422475278378, 0.05673263221979141, 0.08566314727067947, 0.059305258095264435, 0.024161402136087418, 0.7292349934577942, 0.026357892900705338, 0.013178946450352669, 0.008785963989794254, 0.050519295036792755, 0.9911162257194519, 0.006925193127244711, 0.14658324420452118, 0.027700772508978844, 0.14196646213531494, 0.19736799597740173, 0.08194811642169952, 0.29085808992385864, 0.10618629306554794, 0.9819319248199463, 0.9772378206253052, 0.9975225329399109, 0.9917201995849609, 0.1665320247411728, 0.1619061380624771, 0.025442393496632576, 0.11217781901359558, 0.01619061268866062, 0.011564724147319794, 0.49959608912467957, 0.005782362073659897, 0.9957937598228455, 0.9916776418685913, 0.9888594746589661, 0.9933105707168579, 0.9947336316108704, 0.9945342540740967, 0.2329992949962616, 0.1141112744808197, 0.013268752954900265, 0.05891326069831848, 0.11835727095603943, 0.13640277087688446, 0.05891326069831848, 0.05148275941610336, 0.1480792760848999, 0.067936010658741, 0.9844375848770142, 0.05380403250455856, 0.8496553301811218, 0.017934676259756088, 0.05604586750268936, 0.022418346256017685, 0.0005918670794926584, 0.02959335222840309, 0.1485586315393448, 0.0017756011802703142, 0.8191440105438232, 0.0007285924511961639, 0.08888828009366989, 0.1347896009683609, 0.17486219108104706, 0.1617475301027298, 0.0029143698047846556, 0.11657479405403137, 0.31329476833343506, 0.00655733235180378, 0.2761455476284027, 0.19480666518211365, 0.008133890107274055, 0.15861085057258606, 0.0662912055850029, 0.11224768310785294, 0.06303764879703522, 0.04026275500655174, 0.055717144161462784, 0.025215057656168938, 0.9921115636825562, 0.016401542350649834, 0.21937061846256256, 0.2183455228805542, 0.11891117691993713, 0.06970655173063278, 0.006150578148663044, 0.09225866943597794, 0.2583242654800415, 0.9893926978111267, 0.010924343019723892, 0.02490750327706337, 0.2569405734539032, 0.4173099100589752, 0.03189908340573311, 0.09263843297958374, 0.11973080784082413, 0.027529345825314522, 0.01791592314839363, 0.9878115057945251, 0.9829196333885193, 0.9951297044754028, 0.011210200376808643, 0.25335052609443665, 0.1322803646326065, 0.01793632097542286, 0.051566921174526215, 0.5313634872436523, 0.9887993931770325, 0.11263924837112427, 0.2589200735092163, 0.019223764538764954, 0.10693219304084778, 0.12255150079727173, 0.14748232066631317, 0.10512996464967728, 0.042352356016635895, 0.07779616862535477, 0.0069085401482880116, 0.9897999167442322, 0.9859444499015808, 0.9879947304725647, 0.13968348503112793, 0.12965098023414612, 0.05633643642067909, 0.1337025761604309, 0.14469975233078003, 0.09781703352928162, 0.11267287284135818, 0.0472685843706131, 0.06926294416189194, 0.0690700113773346, 0.010668139904737473, 0.06756488978862762, 0.849895179271698, 0.021336279809474945, 0.04978465288877487, 0.9944585561752319, 0.018542524427175522, 0.002852695994079113, 0.46071040630340576, 0.041364092379808426, 0.4749738872051239, 0.16669614613056183, 0.8296921849250793, 0.9947420358657837, 0.06429172307252884, 0.47368955612182617, 0.013301734812557697, 0.1337563395500183, 0.05172897130250931, 0.08128838241100311, 0.008128838613629341, 0.04951201379299164, 0.06133577972650528, 0.06355273723602295, 0.9842392802238464, 0.10246173292398453, 0.8283525705337524, 0.04906618222594261, 0.002886245958507061, 0.015874352306127548, 0.9982162714004517, 0.9969639778137207, 0.9986324310302734, 0.9921741485595703, 0.03859842196106911, 0.9544336795806885, 0.0035089473240077496, 0.9931648969650269, 0.99313884973526, 0.03596452251076698, 0.014652212150394917, 0.042624618858098984, 0.06393692642450333, 0.033300481736660004, 0.6793298721313477, 0.08391721546649933, 0.045288655906915665, 0.014020097441971302, 0.9720600843429565, 0.009346731007099152, 0.9924536347389221, 0.005523736588656902, 0.9942725300788879, 0.9951942563056946, 0.04679335653781891, 0.8838745355606079, 0.06759040802717209, 0.7121989727020264, 0.1270459145307541, 0.052858516573905945, 0.10664437711238861, 0.9878156185150146, 0.9903208017349243, 0.9929757714271545, 0.9881840348243713, 0.020772220566868782, 0.6825157999992371, 0.29377853870391846, 0.0029674600809812546, 0.9971234798431396, 0.003084203926846385, 0.05119778588414192, 0.5261651873588562, 0.3065698742866516, 0.0018505224725231528, 0.03639360889792442, 0.028374677523970604, 0.04317885637283325, 0.003084203926846385, 0.9957553148269653, 0.9854987263679504, 0.02171097695827484, 0.00542774423956871, 0.9457844495773315, 0.0257817842066288, 0.9875307083129883, 0.00667250482365489, 0.007349025458097458, 0.07349025458097458, 0.012860794551670551, 0.22230802476406097, 0.09553732722997665, 0.014698050916194916, 0.5750612616539001, 0.9939971566200256, 0.003269727574661374, 0.9878903031349182, 0.9933966398239136, 0.9575048089027405, 0.03928224742412567, 0.9776325821876526, 0.01339222677052021, 0.17330770194530487, 0.11415642499923706, 0.09121457487344742, 0.18436400592327118, 0.1000596284866333, 0.14179719984531403, 0.06937836110591888, 0.0420139878988266, 0.05279389023780823, 0.03040485829114914, 0.08410754054784775, 0.021627653390169144, 0.07689832150936127, 0.06728602945804596, 0.747355580329895, 0.3352258801460266, 0.6621745228767395, 0.002759060589596629, 0.040964558720588684, 0.9597410559654236, 0.9989423751831055, 0.013820650056004524, 0.315178245306015, 0.6708071231842041, 0.05501579865813255, 0.14754237234592438, 0.01000287290662527, 0.005001436453312635, 0.7827247977256775, 0.04238295927643776, 0.9505892395973206, 0.012514205649495125, 0.00782137829810381, 0.9776723384857178, 0.9941579699516296, 0.1177714541554451, 0.5513504147529602, 0.10501912981271744, 0.062261343002319336, 0.027004919946193695, 0.04050737991929054, 0.015752868726849556, 0.028505193069577217, 0.015752868726849556, 0.03600655868649483, 0.10179346799850464, 0.06227659061551094, 0.09353993833065033, 0.3176356256008148, 0.2118404507637024, 0.047520291060209274, 0.05627403035759926, 0.05527360364794731, 0.05027146637439728, 0.004001708701252937, 0.22780875861644745, 0.16640575230121613, 0.09737280011177063, 0.15005584061145782, 0.10609275102615356, 0.05122971907258034, 0.08029622584581375, 0.011989934369921684, 0.05340970680117607, 0.054863035678863525, 0.009546658024191856, 0.9880791306495667, 0.9947073459625244, 0.9951348900794983, 0.9956521391868591, 0.9887626767158508, 0.9815458059310913, 0.9880534410476685, 0.13009525835514069, 0.03196198120713234, 0.015481585636734962, 0.038953665643930435, 0.21624279022216797, 0.06367426365613937, 0.24495863914489746, 0.04095128923654556, 0.06791920959949493, 0.14982178807258606, 0.9868786931037903, 0.9906402826309204, 0.9910144209861755], \"Term\": [\"accept\", \"accept\", \"accept\", \"accept\", \"accept\", \"accept\", \"accept\", \"accept\", \"accept\", \"access\", \"access\", \"access\", \"access\", \"access\", \"access\", \"adaptec\", \"address\", \"address\", \"address\", \"address\", \"address\", \"address\", \"address\", \"address\", \"address\", \"address\", \"administr\", \"administr\", \"administr\", \"administr\", \"agenc\", \"agenc\", \"agenc\", \"agenc\", \"agenc\", \"aid\", \"aid\", \"aid\", \"aid\", \"alaska\", \"algorithm\", \"algorithm\", \"alomar\", \"amanda\", \"american\", \"american\", \"american\", \"american\", \"american\", \"american\", \"american\", \"american\", \"andrew\", \"andrew\", \"andrew\", \"andrew\", \"andrew\", \"andrew\", \"andrew\", \"andrew\", \"anonym\", \"anonym\", \"anti\", \"anti\", \"anti\", \"appl\", \"appl\", \"appl\", \"applic\", \"applic\", \"applic\", \"applic\", \"applic\", \"arab\", \"arab\", \"archiv\", \"archiv\", \"archiv\", \"archiv\", \"argic\", \"argument\", \"argument\", \"argument\", \"argument\", \"argument\", \"argument\", \"argument\", \"argument\", \"arm\", \"arm\", \"arm\", \"arm\", \"arm\", \"armenia\", \"armenian\", \"armi\", \"armi\", \"armi\", \"armi\", \"armori\", \"atheism\", \"atheist\", \"atho\", \"attack\", \"attack\", \"attack\", \"attack\", \"attack\", \"attack\", \"aurora\", \"author\", \"author\", \"author\", \"author\", \"author\", \"auto\", \"auto\", \"auto\", \"auto\", \"auto\", \"auto\", \"autom\", \"automot\", \"avail\", \"avail\", \"avail\", \"avail\", \"avail\", \"avail\", \"avail\", \"avail\", \"avail\", \"avail\", \"azerbaijan\", \"azerbaijani\", \"azeri\", \"baalk\", \"baerga\", \"ball\", \"ball\", \"ball\", \"bank\", \"bank\", \"bank\", \"bank\", \"bank\", \"bank\", \"bank\", \"bank\", \"bank\", \"basebal\", \"basebal\", \"bat\", \"batf\", \"batf\", \"batteri\", \"batteri\", \"belief\", \"belief\", \"believ\", \"believ\", \"believ\", \"believ\", \"believ\", \"believ\", \"believ\", \"believ\", \"believ\", \"believ\", \"berkeley\", \"berkeley\", \"berkeley\", \"berkeley\", \"best\", \"best\", \"best\", \"best\", \"best\", \"best\", \"best\", \"best\", \"best\", \"best\", \"better\", \"better\", \"better\", \"better\", \"better\", \"better\", \"better\", \"better\", \"better\", \"better\", \"bibl\", \"biblic\", \"bike\", \"bike\", \"billion\", \"billion\", \"binari\", \"binari\", \"bio\", \"blah\", \"blast\", \"board\", \"board\", \"board\", \"board\", \"board\", \"board\", \"board\", \"board\", \"boni\", \"bontchev\", \"book\", \"book\", \"book\", \"book\", \"book\", \"book\", \"book\", \"book\", \"boyl\", \"brake\", \"brake\", \"brave\", \"brave\", \"bruin\", \"build\", \"build\", \"build\", \"build\", \"build\", \"build\", \"build\", \"build\", \"build\", \"build\", \"buy\", \"buy\", \"buy\", \"buy\", \"buy\", \"byte\", \"byte\", \"byte\", \"cach\", \"cactus\", \"cadr\", \"callison\", \"canada\", \"canada\", \"canada\", \"canada\", \"canada\", \"canada\", \"canada\", \"canada\", \"canada\", \"cancer\", \"cancer\", \"candida\", \"canuck\", \"car\", \"car\", \"card\", \"card\", \"card\", \"card\", \"card\", \"carlo\", \"case\", \"case\", \"case\", \"case\", \"case\", \"case\", \"case\", \"case\", \"case\", \"case\", \"catbyt\", \"catcher\", \"cathol\", \"caus\", \"caus\", \"caus\", \"caus\", \"caus\", \"caus\", \"caus\", \"caus\", \"caus\", \"centerlin\", \"centri\", \"char\", \"chastiti\", \"children\", \"children\", \"children\", \"children\", \"children\", \"children\", \"chip\", \"chip\", \"chip\", \"chopin\", \"christ\", \"christ\", \"christian\", \"christian\", \"church\", \"church\", \"church\", \"cica\", \"cipher\", \"ciphertext\", \"circuit\", \"circuit\", \"circuit\", \"claim\", \"claim\", \"claim\", \"claim\", \"claim\", \"claim\", \"claim\", \"claim\", \"claim\", \"claim\", \"clarkson\", \"classifi\", \"classifi\", \"classifi\", \"classifi\", \"clayton\", \"cleveland\", \"cleveland\", \"cleveland\", \"client\", \"client\", \"clinic\", \"clinic\", \"clinton\", \"clinton\", \"clinton\", \"clinton\", \"clipper\", \"clipper\", \"coach\", \"coach\", \"code\", \"code\", \"code\", \"code\", \"code\", \"code\", \"color\", \"color\", \"color\", \"color\", \"color\", \"color\", \"colorado\", \"colorado\", \"colorado\", \"colorado\", \"colorado\", \"colorado\", \"colorado\", \"colorado\", \"columbia\", \"columbia\", \"columbia\", \"columbia\", \"columbia\", \"come\", \"come\", \"come\", \"come\", \"come\", \"come\", \"come\", \"come\", \"come\", \"come\", \"communic\", \"communic\", \"communic\", \"communic\", \"communic\", \"communic\", \"communic\", \"communic\", \"compil\", \"compil\", \"compil\", \"compil\", \"concordia\", \"config\", \"contradict\", \"contradict\", \"contradict\", \"contrib\", \"control\", \"control\", \"control\", \"control\", \"control\", \"control\", \"control\", \"control\", \"control\", \"copi\", \"copi\", \"copi\", \"copi\", \"copi\", \"copi\", \"copi\", \"copper\", \"cost\", \"cost\", \"cost\", \"cost\", \"cost\", \"cost\", \"cost\", \"cost\", \"counterst\", \"countri\", \"countri\", \"countri\", \"countri\", \"countri\", \"countri\", \"countri\", \"court\", \"court\", \"court\", \"court\", \"cramer\", \"crime\", \"crime\", \"crime\", \"crypt\", \"crypto\", \"cryptograph\", \"cryptographi\", \"ctrl\", \"cub\", \"cunixb\", \"cure\", \"cwru\", \"cwru\", \"data\", \"data\", \"data\", \"data\", \"data\", \"data\", \"data\", \"david\", \"david\", \"david\", \"david\", \"david\", \"david\", \"david\", \"david\", \"david\", \"david\", \"davidian\", \"dealer\", \"dealer\", \"dealer\", \"death\", \"death\", \"death\", \"death\", \"death\", \"death\", \"decrypt\", \"den\", \"desi\", \"design\", \"design\", \"design\", \"design\", \"design\", \"design\", \"design\", \"design\", \"design\", \"deskjet\", \"detroit\", \"devic\", \"devic\", \"devic\", \"devic\", \"diamond\", \"diet\", \"differ\", \"differ\", \"differ\", \"differ\", \"differ\", \"differ\", \"differ\", \"differ\", \"differ\", \"differ\", \"dillon\", \"directori\", \"directori\", \"directori\", \"diseas\", \"disk\", \"disk\", \"disk\", \"display\", \"display\", \"display\", \"display\", \"display\", \"display\", \"display\", \"distribut\", \"distribut\", \"distribut\", \"distribut\", \"distribut\", \"distribut\", \"distribut\", \"distribut\", \"distribut\", \"distribut\", \"divin\", \"divis\", \"divis\", \"divis\", \"divis\", \"divis\", \"divis\", \"divis\", \"divis\", \"divis\", \"dock\", \"doctor\", \"doctor\", \"doctor\", \"doctrin\", \"dodger\", \"drive\", \"drive\", \"drive\", \"drive\", \"drive\", \"drive\", \"drive\", \"drive\", \"driver\", \"driver\", \"driver\", \"driver\", \"driver\", \"dseg\", \"dseg\", \"dtmedin\", \"duke\", \"duke\", \"dyer\", \"earth\", \"earth\", \"earth\", \"earth\", \"earth\", \"earth\", \"edmonton\", \"effect\", \"effect\", \"effect\", \"effect\", \"effect\", \"effect\", \"effect\", \"effect\", \"effect\", \"effect\", \"einstein\", \"eisa\", \"email\", \"email\", \"email\", \"email\", \"email\", \"email\", \"email\", \"email\", \"encrypt\", \"enforc\", \"enforc\", \"enforc\", \"enforc\", \"enforc\", \"engin\", \"engin\", \"engin\", \"engin\", \"engin\", \"engin\", \"engin\", \"engin\", \"engin\", \"engin\", \"engr\", \"entri\", \"entri\", \"entri\", \"ericsson\", \"escrow\", \"esdi\", \"espn\", \"etern\", \"etern\", \"etern\", \"ether\", \"ethernet\", \"ethnic\", \"evid\", \"evid\", \"evid\", \"evid\", \"evid\", \"evid\", \"exist\", \"exist\", \"exist\", \"exist\", \"exist\", \"exist\", \"exist\", \"exist\", \"exist\", \"extermin\", \"faith\", \"faith\", \"fbihh\", \"feder\", \"feder\", \"feder\", \"feder\", \"file\", \"file\", \"file\", \"file\", \"final\", \"final\", \"final\", \"final\", \"final\", \"final\", \"final\", \"final\", \"final\", \"final\", \"firearm\", \"fischer\", \"flight\", \"flight\", \"flight\", \"flight\", \"floppi\", \"floppi\", \"flyer\", \"flyer\", \"fnal\", \"follow\", \"follow\", \"follow\", \"follow\", \"follow\", \"follow\", \"follow\", \"follow\", \"follow\", \"follow\", \"font\", \"font\", \"food\", \"food\", \"food\", \"food\", \"forc\", \"forc\", \"forc\", \"forc\", \"forc\", \"forc\", \"forc\", \"forc\", \"forc\", \"forc\", \"format\", \"format\", \"format\", \"format\", \"format\", \"freenet\", \"freenet\", \"freenet\", \"frost\", \"frost\", \"function\", \"function\", \"function\", \"function\", \"function\", \"function\", \"fund\", \"fund\", \"fund\", \"fund\", \"fund\", \"game\", \"game\", \"game\", \"game\", \"gatech\", \"gaza\", \"genet\", \"genet\", \"genocid\", \"go\", \"go\", \"go\", \"go\", \"go\", \"go\", \"go\", \"go\", \"go\", \"go\", \"goal\", \"goal\", \"goal\", \"goal\", \"goal\", \"goal\", \"god\", \"good\", \"good\", \"good\", \"good\", \"good\", \"good\", \"good\", \"good\", \"good\", \"good\", \"gordon\", \"gordon\", \"gospel\", \"govern\", \"govern\", \"govern\", \"govern\", \"gradi\", \"graphic\", \"graphic\", \"great\", \"great\", \"great\", \"great\", \"great\", \"great\", \"great\", \"great\", \"great\", \"great\", \"greec\", \"greec\", \"greek\", \"greek\", \"greenbelt\", \"grind\", \"grind\", \"grind\", \"grind\", \"grind\", \"grind\", \"grind\", \"group\", \"group\", \"group\", \"group\", \"group\", \"group\", \"group\", \"group\", \"group\", \"group\", \"gtoal\", \"gun\", \"gun\", \"halat\", \"hallam\", \"hamburg\", \"handbook\", \"handgun\", \"handgun\", \"handheld\", \"handheld\", \"handheld\", \"happen\", \"happen\", \"happen\", \"happen\", \"happen\", \"happen\", \"happen\", \"happen\", \"happen\", \"happen\", \"hard\", \"hard\", \"hard\", \"hard\", \"hard\", \"hard\", \"hard\", \"hard\", \"hard\", \"harley\", \"health\", \"health\", \"health\", \"health\", \"heaven\", \"heaven\", \"heaven\", \"heaven\", \"helmet\", \"helmet\", \"helmet\", \"help\", \"help\", \"help\", \"help\", \"help\", \"help\", \"help\", \"help\", \"help\", \"help\", \"henri\", \"henri\", \"higgin\", \"high\", \"high\", \"high\", \"high\", \"high\", \"high\", \"high\", \"high\", \"high\", \"high\", \"hit\", \"hit\", \"hit\", \"hit\", \"hit\", \"hitler\", \"hitter\", \"hockey\", \"holi\", \"holi\", \"home\", \"home\", \"home\", \"home\", \"home\", \"home\", \"home\", \"home\", \"home\", \"home\", \"homeopathi\", \"homicid\", \"honda\", \"hulman\", \"husc\", \"hydro\", \"iastat\", \"iastat\", \"ifa\", \"illinoi\", \"illinoi\", \"illinoi\", \"illinoi\", \"illinoi\", \"illinoi\", \"illinoi\", \"illinoi\", \"imag\", \"imag\", \"imag\", \"imag\", \"imag\", \"imak\", \"includ\", \"includ\", \"includ\", \"includ\", \"includ\", \"includ\", \"includ\", \"includ\", \"includ\", \"includ\", \"indiana\", \"indiana\", \"indiana\", \"indiana\", \"indiana\", \"indiana\", \"infect\", \"inform\", \"inform\", \"inform\", \"inform\", \"inform\", \"inform\", \"inform\", \"inform\", \"inform\", \"inform\", \"ingr\", \"ingr\", \"ingr\", \"inning\", \"instal\", \"instal\", \"instal\", \"instal\", \"instal\", \"insur\", \"insur\", \"insur\", \"insur\", \"intellect\", \"intercon\", \"internet\", \"internet\", \"internet\", \"internet\", \"internet\", \"internet\", \"internet\", \"internet\", \"invest\", \"invest\", \"iran\", \"islam\", \"islam\", \"isra\", \"israel\", \"israel\", \"israel\", \"jaeger\", \"jake\", \"jason\", \"jason\", \"jason\", \"jason\", \"jay\", \"jeff\", \"jeff\", \"jeff\", \"jeff\", \"jeff\", \"jeff\", \"jeff\", \"jesus\", \"jet\", \"jet\", \"jew\", \"jew\", \"jew\", \"job\", \"job\", \"job\", \"john\", \"john\", \"john\", \"john\", \"john\", \"john\", \"john\", \"john\", \"john\", \"john\", \"jumper\", \"jumper\", \"kaldi\", \"kelvin\", \"key\", \"key\", \"kill\", \"kill\", \"kill\", \"kill\", \"kill\", \"kill\", \"kill\", \"koresh\", \"lamp\", \"larc\", \"larc\", \"laughter\", \"launch\", \"launch\", \"laurentian\", \"leaf\", \"leagu\", \"leagu\", \"leav\", \"leav\", \"leav\", \"leav\", \"leav\", \"leav\", \"leav\", \"leav\", \"leav\", \"leav\", \"lebanes\", \"lemieux\", \"librari\", \"librari\", \"librari\", \"librari\", \"librari\", \"librari\", \"life\", \"life\", \"life\", \"life\", \"life\", \"life\", \"life\", \"life\", \"life\", \"life\", \"list\", \"list\", \"list\", \"list\", \"list\", \"list\", \"list\", \"list\", \"list\", \"list\", \"live\", \"live\", \"live\", \"live\", \"live\", \"live\", \"live\", \"live\", \"livesey\", \"long\", \"long\", \"long\", \"long\", \"long\", \"long\", \"long\", \"long\", \"long\", \"long\", \"look\", \"look\", \"look\", \"look\", \"look\", \"look\", \"look\", \"look\", \"look\", \"look\", \"lopez\", \"lord\", \"lord\", \"lose\", \"lose\", \"lose\", \"lose\", \"lose\", \"lose\", \"lose\", \"lose\", \"lose\", \"lose\", \"love\", \"love\", \"love\", \"love\", \"love\", \"love\", \"love\", \"love\", \"lunar\", \"lunar\", \"lyme\", \"machin\", \"machin\", \"machin\", \"machin\", \"machin\", \"machin\", \"machin\", \"machin\", \"magellan\", \"magnus\", \"mail\", \"mail\", \"mail\", \"mail\", \"mail\", \"mail\", \"mail\", \"mail\", \"map\", \"map\", \"mar\", \"mar\", \"marriag\", \"marriag\", \"massacr\", \"maxtor\", \"maynard\", \"mccall\", \"mcgill\", \"mcgill\", \"mcgill\", \"mean\", \"mean\", \"mean\", \"mean\", \"mean\", \"mean\", \"mean\", \"mean\", \"mean\", \"mean\", \"medic\", \"medic\", \"medic\", \"medic\", \"medic\", \"medicin\", \"medicin\", \"medicin\", \"medicin\", \"meg\", \"memori\", \"memori\", \"memori\", \"memori\", \"memori\", \"memori\", \"memori\", \"messag\", \"messag\", \"messag\", \"messag\", \"messag\", \"messag\", \"messag\", \"messag\", \"messag\", \"met\", \"metal\", \"metal\", \"metal\", \"metal\", \"methodolog\", \"midway\", \"midway\", \"midway\", \"migrain\", \"militia\", \"mime\", \"mission\", \"mission\", \"mission\", \"mission\", \"mksol\", \"mode\", \"mode\", \"mode\", \"mode\", \"mode\", \"mode\", \"modem\", \"modem\", \"modem\", \"money\", \"money\", \"money\", \"money\", \"money\", \"money\", \"money\", \"money\", \"monitor\", \"monitor\", \"monitor\", \"montreal\", \"montreal\", \"moon\", \"moon\", \"moon\", \"moral\", \"moral\", \"mormon\", \"motherboard\", \"motif\", \"motorcycl\", \"motto\", \"mous\", \"mous\", \"murder\", \"murder\", \"murder\", \"muslim\", \"muslim\", \"nasa\", \"nasa\", \"nasa\", \"nation\", \"nation\", \"nation\", \"nation\", \"nation\", \"nation\", \"nation\", \"nation\", \"nation\", \"nation\", \"nazi\", \"ncsl\", \"need\", \"need\", \"need\", \"need\", \"need\", \"need\", \"need\", \"need\", \"need\", \"need\", \"netcom\", \"netcom\", \"netcom\", \"netcom\", \"netcom\", \"netcom\", \"nist\", \"nist\", \"nore\", \"nsmca\", \"nubus\", \"number\", \"number\", \"number\", \"number\", \"number\", \"number\", \"number\", \"number\", \"number\", \"number\", \"ohio\", \"ohio\", \"ohio\", \"openwindow\", \"opinion\", \"opinion\", \"opinion\", \"opinion\", \"opinion\", \"opinion\", \"opinion\", \"opinion\", \"opinion\", \"opinion\", \"optilink\", \"oracl\", \"orbit\", \"orbit\", \"outlet\", \"outlet\", \"output\", \"output\", \"output\", \"owner\", \"owner\", \"owner\", \"owner\", \"owner\", \"owner\", \"owner\", \"pain\", \"pain\", \"pain\", \"pain\", \"pain\", \"palestinian\", \"patent\", \"patent\", \"patent\", \"patient\", \"patient\", \"pen\", \"penguin\", \"peopl\", \"peopl\", \"peopl\", \"peopl\", \"peopl\", \"peopl\", \"peopl\", \"peopl\", \"peopl\", \"peopl\", \"period\", \"period\", \"period\", \"period\", \"period\", \"period\", \"period\", \"period\", \"period\", \"person\", \"person\", \"person\", \"person\", \"person\", \"person\", \"person\", \"person\", \"person\", \"person\", \"phone\", \"phone\", \"phone\", \"phone\", \"phone\", \"phone\", \"phone\", \"phone\", \"photographi\", \"physician\", \"pistol\", \"pitch\", \"pitch\", \"pitcher\", \"pitt\", \"pitt\", \"pitt\", \"pittsburgh\", \"pittsburgh\", \"pittsburgh\", \"plaintext\", \"play\", \"play\", \"play\", \"play\", \"play\", \"play\", \"play\", \"play\", \"player\", \"player\", \"playoff\", \"plymouth\", \"point\", \"point\", \"point\", \"point\", \"point\", \"point\", \"point\", \"point\", \"point\", \"point\", \"polit\", \"polit\", \"polit\", \"polit\", \"polit\", \"polit\", \"polygon\", \"popul\", \"popul\", \"popul\", \"popul\", \"port\", \"port\", \"port\", \"power\", \"power\", \"power\", \"power\", \"power\", \"power\", \"power\", \"power\", \"power\", \"power\", \"powerbook\", \"presid\", \"presid\", \"presid\", \"presid\", \"price\", \"price\", \"price\", \"price\", \"price\", \"price\", \"price\", \"princeton\", \"princeton\", \"princeton\", \"princeton\", \"printer\", \"printer\", \"prism\", \"prison\", \"privaci\", \"privat\", \"privat\", \"privat\", \"privat\", \"privat\", \"privat\", \"privat\", \"probe\", \"probe\", \"probe\", \"problem\", \"problem\", \"problem\", \"problem\", \"problem\", \"problem\", \"problem\", \"problem\", \"problem\", \"problem\", \"program\", \"program\", \"program\", \"program\", \"program\", \"program\", \"project\", \"project\", \"project\", \"project\", \"project\", \"propheci\", \"prophet\", \"propos\", \"propos\", \"propos\", \"propos\", \"propos\", \"propos\", \"protect\", \"protect\", \"protect\", \"protect\", \"protect\", \"protect\", \"protect\", \"provid\", \"provid\", \"provid\", \"provid\", \"provid\", \"provid\", \"provid\", \"provid\", \"provid\", \"provid\", \"public\", \"public\", \"public\", \"public\", \"public\", \"public\", \"public\", \"public\", \"public\", \"puck\", \"pyron\", \"quadra\", \"qualcomm\", \"quebec\", \"question\", \"question\", \"question\", \"question\", \"question\", \"question\", \"question\", \"question\", \"question\", \"question\", \"quicktim\", \"raider\", \"ramsey\", \"ranck\", \"ranger\", \"ranger\", \"read\", \"read\", \"read\", \"read\", \"read\", \"read\", \"read\", \"read\", \"read\", \"read\", \"reason\", \"reason\", \"reason\", \"reason\", \"reason\", \"reason\", \"reason\", \"reason\", \"reason\", \"reason\", \"recipi\", \"recipi\", \"redesign\", \"reilli\", \"religi\", \"religi\", \"religion\", \"religion\", \"repli\", \"repli\", \"repli\", \"repli\", \"repli\", \"repli\", \"repli\", \"repli\", \"repli\", \"repli\", \"research\", \"research\", \"research\", \"research\", \"research\", \"research\", \"research\", \"research\", \"research\", \"research\", \"resourc\", \"resourc\", \"resourc\", \"resourc\", \"resourc\", \"resourc\", \"restaur\", \"result\", \"result\", \"result\", \"result\", \"result\", \"result\", \"result\", \"result\", \"result\", \"result\", \"resurrect\", \"revel\", \"revolv\", \"rid\", \"rid\", \"ride\", \"ride\", \"rider\", \"right\", \"right\", \"right\", \"right\", \"right\", \"right\", \"right\", \"right\", \"right\", \"right\", \"ripem\", \"risk\", \"risk\", \"risk\", \"risk\", \"risk\", \"risk\", \"risk\", \"rkba\", \"road\", \"road\", \"road\", \"road\", \"road\", \"road\", \"road\", \"robi\", \"rochest\", \"rochest\", \"rochest\", \"rochest\", \"rochest\", \"rocki\", \"rockwel\", \"run\", \"run\", \"run\", \"run\", \"run\", \"run\", \"run\", \"run\", \"rutger\", \"rutger\", \"rwing\", \"sabbath\", \"sale\", \"sale\", \"sale\", \"sale\", \"sale\", \"sandvik\", \"satan\", \"satellit\", \"satellit\", \"say\", \"say\", \"say\", \"say\", \"say\", \"say\", \"say\", \"say\", \"say\", \"say\", \"scheme\", \"scheme\", \"scheme\", \"scheme\", \"scheme\", \"schneider\", \"scienc\", \"scienc\", \"scienc\", \"scienc\", \"scienc\", \"scienc\", \"scienc\", \"scienc\", \"scienc\", \"scienc\", \"scientif\", \"scientif\", \"scientif\", \"scientif\", \"scientif\", \"score\", \"score\", \"scott\", \"scott\", \"scott\", \"scott\", \"scott\", \"scott\", \"scott\", \"screen\", \"screen\", \"screen\", \"screen\", \"scriptur\", \"scsi\", \"sdpa\", \"sdsu\", \"season\", \"season\", \"secret\", \"secret\", \"secret\", \"secur\", \"secur\", \"secur\", \"secur\", \"selann\", \"sell\", \"sell\", \"sell\", \"sell\", \"sell\", \"sell\", \"sell\", \"sell\", \"send\", \"send\", \"send\", \"send\", \"send\", \"send\", \"send\", \"send\", \"send\", \"send\", \"sera\", \"serdar\", \"server\", \"server\", \"shafer\", \"shaft\", \"shaft\", \"shark\", \"shotgun\", \"shuttl\", \"shuttl\", \"simm\", \"sin\", \"skeptic\", \"skeptic\", \"skndiv\", \"slaughter\", \"sleev\", \"sleev\", \"sleev\", \"smith\", \"smith\", \"smith\", \"smith\", \"smith\", \"smith\", \"smith\", \"smith\", \"smuggl\", \"softwar\", \"softwar\", \"softwar\", \"softwar\", \"softwar\", \"softwar\", \"softwar\", \"softwar\", \"softwar\", \"solar\", \"solar\", \"solar\", \"soldier\", \"soldier\", \"solntz\", \"sourc\", \"sourc\", \"sourc\", \"sourc\", \"sourc\", \"sourc\", \"sourc\", \"sourc\", \"sourc\", \"space\", \"space\", \"space\", \"space\", \"space\", \"spacecraft\", \"spacecraft\", \"spec\", \"spec\", \"spec\", \"speed\", \"speed\", \"speed\", \"speed\", \"speed\", \"spencer\", \"spend\", \"spend\", \"spend\", \"spend\", \"spend\", \"spend\", \"spend\", \"spend\", \"spend\", \"spend\", \"sphere\", \"spirit\", \"spirit\", \"spirit\", \"ssto\", \"stanford\", \"stanford\", \"stanford\", \"stanford\", \"stanford\", \"stanford\", \"stanford\", \"stanford\", \"stanley\", \"stanley\", \"stanley\", \"start\", \"start\", \"start\", \"start\", \"start\", \"start\", \"start\", \"start\", \"start\", \"start\", \"starter\", \"state\", \"state\", \"state\", \"state\", \"state\", \"state\", \"state\", \"state\", \"state\", \"state\", \"station\", \"station\", \"station\", \"station\", \"station\", \"station\", \"station\", \"station\", \"sternlight\", \"steve\", \"steve\", \"steve\", \"steve\", \"steve\", \"steve\", \"steve\", \"steve\", \"steveh\", \"stimulus\", \"stratus\", \"strnlght\", \"studi\", \"studi\", \"studi\", \"studi\", \"studi\", \"studi\", \"studi\", \"studi\", \"suno\", \"superstit\", \"surveil\", \"svga\", \"swap\", \"syndrom\", \"take\", \"take\", \"take\", \"take\", \"take\", \"take\", \"take\", \"take\", \"take\", \"take\", \"tampa\", \"teach\", \"teach\", \"teach\", \"teach\", \"teach\", \"team\", \"team\", \"team\", \"team\", \"team\", \"technolog\", \"technolog\", \"technolog\", \"technolog\", \"technolog\", \"technolog\", \"technolog\", \"technolog\", \"technolog\", \"tell\", \"tell\", \"tell\", \"tell\", \"tell\", \"tell\", \"tell\", \"tell\", \"tell\", \"tell\", \"tennesse\", \"test\", \"test\", \"test\", \"test\", \"test\", \"test\", \"test\", \"test\", \"testament\", \"thank\", \"thank\", \"thank\", \"thank\", \"thank\", \"thank\", \"thank\", \"thank\", \"thank\", \"theist\", \"theodor\", \"theolog\", \"theori\", \"theori\", \"theori\", \"theori\", \"theori\", \"theori\", \"therapi\", \"thing\", \"thing\", \"thing\", \"thing\", \"thing\", \"thing\", \"thing\", \"thing\", \"thing\", \"thing\", \"thomasp\", \"tiff\", \"tiger\", \"time\", \"time\", \"time\", \"time\", \"time\", \"time\", \"time\", \"time\", \"time\", \"time\", \"tire\", \"tire\", \"tire\", \"tire\", \"tire\", \"toolkit\", \"toronto\", \"toronto\", \"toronto\", \"toronto\", \"toronto\", \"treatment\", \"treatment\", \"troop\", \"true\", \"true\", \"true\", \"true\", \"true\", \"true\", \"true\", \"true\", \"true\", \"true\", \"trunk\", \"truth\", \"truth\", \"truth\", \"truth\", \"truth\", \"turk\", \"turkey\", \"turkish\", \"ualberta\", \"uchicago\", \"uchicago\", \"uchicago\", \"ucsc\", \"uicvm\", \"uiuc\", \"uiuc\", \"uiuc\", \"uiuc\", \"uiuc\", \"uiuc\", \"uiuc\", \"uiuc\", \"umich\", \"umich\", \"umich\", \"uoknor\", \"upgrad\", \"upgrad\", \"urartu\", \"urbana\", \"urbana\", \"urbana\", \"user\", \"user\", \"user\", \"user\", \"utah\", \"utkvm\", \"uvic\", \"veal\", \"vehicl\", \"vehicl\", \"vehicl\", \"vehicl\", \"vers\", \"version\", \"version\", \"version\", \"version\", \"version\", \"version\", \"version\", \"version\", \"version\", \"vesa\", \"vesselin\", \"video\", \"video\", \"video\", \"video\", \"villag\", \"villag\", \"virginia\", \"virginia\", \"virginia\", \"virginia\", \"virginia\", \"virginia\", \"virginia\", \"visual\", \"visual\", \"volt\", \"vram\", \"waco\", \"waco\", \"wagon\", \"wagon\", \"want\", \"want\", \"want\", \"want\", \"want\", \"want\", \"want\", \"want\", \"want\", \"want\", \"water\", \"water\", \"water\", \"water\", \"water\", \"weapon\", \"weapon\", \"weapon\", \"wheel\", \"wheel\", \"widget\", \"window\", \"window\", \"window\", \"wing\", \"wing\", \"wing\", \"wing\", \"wing\", \"winnipeg\", \"winnipeg\", \"wire\", \"wire\", \"wire\", \"wiretap\", \"word\", \"word\", \"word\", \"word\", \"word\", \"word\", \"word\", \"word\", \"word\", \"word\", \"work\", \"work\", \"work\", \"work\", \"work\", \"work\", \"work\", \"work\", \"work\", \"work\", \"world\", \"world\", \"world\", \"world\", \"world\", \"world\", \"world\", \"world\", \"world\", \"world\", \"worship\", \"worship\", \"xlib\", \"xpert\", \"xterm\", \"xview\", \"yamaha\", \"yanke\", \"year\", \"year\", \"year\", \"year\", \"year\", \"year\", \"year\", \"year\", \"year\", \"year\", \"yeast\", \"zoolog\", \"zuma\"]}, \"R\": 30, \"lambda.step\": 0.01, \"plot.opts\": {\"xlab\": \"PC1\", \"ylab\": \"PC2\"}, \"topic.order\": [3, 1, 8, 9, 2, 4, 7, 10, 5, 6]};\n", + "\n", + "function LDAvis_load_lib(url, callback){\n", + " var s = document.createElement('script');\n", + " s.src = url;\n", + " s.async = true;\n", + " s.onreadystatechange = s.onload = callback;\n", + " s.onerror = function(){console.warn(\"failed to load library \" + url);};\n", + " document.getElementsByTagName(\"head\")[0].appendChild(s);\n", + "}\n", + "\n", + "if(typeof(LDAvis) !== \"undefined\"){\n", + " // already loaded: just create the visualization\n", + " !function(LDAvis){\n", + " new LDAvis(\"#\" + \"ldavis_el591011124095238088809029897\", ldavis_el591011124095238088809029897_data);\n", + " }(LDAvis);\n", + "}else if(typeof define === \"function\" && define.amd){\n", + " // require.js is available: use it to load d3/LDAvis\n", + " require.config({paths: {d3: \"https://cdnjs.cloudflare.com/ajax/libs/d3/3.5.5/d3.min\"}});\n", + " require([\"d3\"], function(d3){\n", + " window.d3 = d3;\n", + " LDAvis_load_lib(\"https://cdn.rawgit.com/bmabey/pyLDAvis/files/ldavis.v1.0.0.js\", function(){\n", + " new LDAvis(\"#\" + \"ldavis_el591011124095238088809029897\", ldavis_el591011124095238088809029897_data);\n", + " });\n", + " });\n", + "}else{\n", + " // require.js not available: dynamically load d3 & LDAvis\n", + " LDAvis_load_lib(\"https://cdnjs.cloudflare.com/ajax/libs/d3/3.5.5/d3.min.js\", function(){\n", + " LDAvis_load_lib(\"https://cdn.rawgit.com/bmabey/pyLDAvis/files/ldavis.v1.0.0.js\", function(){\n", + " new LDAvis(\"#\" + \"ldavis_el591011124095238088809029897\", ldavis_el591011124095238088809029897_data);\n", + " })\n", + " });\n", + "}\n", + "</script>" + ], + "text/plain": [ + "PreparedData(topic_coordinates= x y topics cluster Freq\n", + "topic \n", + "2 -0.078669 -0.151706 1 1 13.182505\n", + "0 -0.016999 -0.150447 2 1 12.926197\n", + "7 0.208967 0.080137 3 1 12.463007\n", + "8 0.147446 0.136478 4 1 11.995771\n", + "1 -0.008849 -0.009046 5 1 9.559109\n", + "3 -0.045054 0.003907 6 1 9.468682\n", + "6 -0.089499 0.144727 7 1 8.927140\n", + "9 0.107803 -0.077376 8 1 7.882134\n", + "4 0.004524 -0.105100 9 1 7.024930\n", + "5 -0.229669 0.128426 10 1 6.570525, topic_info= Category Freq Term Total loglift logprob\n", + "1037 Default 2966.000000 window 2966.000000 30.0000 30.0000\n", + "1193 Default 1940.000000 game 1940.000000 29.0000 29.0000\n", + "482 Default 1924.000000 christian 1924.000000 28.0000 28.0000\n", + "702 Default 1689.000000 team 1689.000000 27.0000 27.0000\n", + "352 Default 2638.000000 drive 2638.000000 26.0000 26.0000\n", + "320 Default 2883.000000 file 2883.000000 25.0000 25.0000\n", + "696 Default 1860.000000 space 1860.000000 24.0000 24.0000\n", + "1467 Default 1161.000000 encrypt 1161.000000 23.0000 23.0000\n", + "256 Default 1997.000000 govern 1997.000000 22.0000 22.0000\n", + "153 Default 1477.000000 chip 1477.000000 21.0000 21.0000\n", + "522 Default 1274.000000 jesus 1274.000000 20.0000 20.0000\n", + "1347 Default 1017.000000 israel 1017.000000 19.0000 19.0000\n", + "36 Default 1577.000000 card 1577.000000 18.0000 18.0000\n", + "120 Default 1423.000000 play 1423.000000 17.0000 17.0000\n", + "964 Default 1059.000000 secur 1059.000000 16.0000 16.0000\n", + "657 Default 1331.000000 nasa 1331.000000 15.0000 15.0000\n", + "1821 Default 1142.000000 armenian 1142.000000 14.0000 14.0000\n", + "822 Default 2599.000000 program 2599.000000 13.0000 13.0000\n", + "1346 Default 837.000000 isra 837.000000 12.0000 12.0000\n", + "513 Default 1391.000000 imag 1391.000000 11.0000 11.0000\n", + "117 Default 6052.000000 peopl 6052.000000 10.0000 10.0000\n", + "3565 Default 742.000000 hockey 742.000000 9.0000 9.0000\n", + "739 Default 990.000000 player 990.000000 8.0000 8.0000\n", + "1457 Default 784.000000 clipper 784.000000 7.0000 7.0000\n", + "326 Default 1802.000000 public 1802.000000 6.0000 6.0000\n", + "41 Default 1023.000000 disk 1023.000000 5.0000 5.0000\n", + "28 Default 4004.000000 year 4004.000000 4.0000 4.0000\n", + "380 Default 867.000000 scsi 867.000000 3.0000 3.0000\n", + "879 Default 1191.000000 driver 1191.000000 2.0000 2.0000\n", + "444 Default 747.000000 bike 747.000000 1.0000 1.0000\n", + "... ... ... ... ... ... ...\n", + "5004 Topic10 178.948181 stanley 185.594589 2.6861 -6.0394\n", + "702 Topic10 1384.116455 team 1689.568604 2.5232 -3.9937\n", + "4840 Topic10 160.981583 jet 167.196503 2.6847 -6.1452\n", + "3815 Topic10 191.566772 coach 202.233215 2.6684 -5.9713\n", + "3537 Topic10 221.759384 ranger 240.052933 2.6433 -5.8249\n", + "4877 Topic10 157.258331 winnipeg 165.160721 2.6735 -6.1686\n", + "1193 Topic10 1290.715576 game 1940.664795 2.3147 -4.0636\n", + "120 Topic10 920.770020 play 1423.930298 2.2866 -4.4013\n", + "711 Topic10 312.806488 wing 399.885132 2.4770 -5.4809\n", + "739 Topic10 623.101746 player 990.567200 2.2590 -4.7918\n", + "1311 Topic10 397.739624 columbia 559.283691 2.3817 -5.2407\n", + "1080 Topic10 455.438751 season 670.126038 2.3364 -5.1053\n", + "3252 Topic10 379.943481 leagu 536.827942 2.3769 -5.2865\n", + "1073 Topic10 351.761322 pittsburgh 505.782318 2.3594 -5.3636\n", + "1679 Topic10 356.976562 score 528.273926 2.3306 -5.3488\n", + "1321 Topic10 374.845306 arab 572.500732 2.2991 -5.3000\n", + "3488 Topic10 212.819550 mcgill 254.334839 2.5444 -5.8661\n", + "1475 Topic10 346.644043 goal 553.699341 2.2543 -5.3782\n", + "1150 Topic10 312.806427 virginia 544.289856 2.1687 -5.4809\n", + "1082 Topic10 333.144867 toronto 701.091187 1.9785 -5.4179\n", + "1155 Topic10 336.057953 andrew 868.338135 1.7733 -5.4092\n", + "28 Topic10 600.308960 year 4004.757812 0.8248 -4.8291\n", + "157 Topic10 295.451538 divis 693.417114 1.8694 -5.5380\n", + "2117 Topic10 283.661255 canada 732.439819 1.7740 -5.5787\n", + "2549 Topic10 250.147522 period 584.503235 1.8739 -5.7045\n", + "45 Topic10 267.235901 final 822.295105 1.5986 -5.6384\n", + "171 Topic10 330.680511 point 2646.791748 0.6426 -5.4254\n", + "146 Topic10 358.020264 time 5183.146484 0.0500 -5.3459\n", + "1545 Topic10 262.164948 american 1242.273315 1.1669 -5.6575\n", + "99 Topic10 242.101822 go 3510.730713 0.0484 -5.7372\n", + "\n", + "[734 rows x 6 columns], token_table= Topic Freq Term\n", + "term \n", + "338 1 0.145983 accept\n", + "338 2 0.524347 accept\n", + "338 3 0.129101 accept\n", + "338 4 0.049654 accept\n", + "338 5 0.007945 accept\n", + "338 6 0.022841 accept\n", + "338 8 0.066536 accept\n", + "338 9 0.034758 accept\n", + "338 10 0.018869 accept\n", + "73 3 0.403915 access\n", + "73 4 0.196068 access\n", + "73 5 0.171820 access\n", + "73 6 0.033255 access\n", + "73 7 0.000693 access\n", + "73 8 0.193297 access\n", + "2940 4 0.984634 adaptec\n", + "152 1 0.052461 address\n", + "152 2 0.074007 address\n", + "152 3 0.536784 address\n", + "152 4 0.182675 address\n", + "152 5 0.030914 address\n", + "152 6 0.026230 address\n", + "152 7 0.032788 address\n", + "152 8 0.049650 address\n", + "152 9 0.005621 address\n", + "152 10 0.008431 address\n", + "1444 1 0.124112 administr\n", + "1444 3 0.063074 administr\n", + "1444 5 0.197359 administr\n", + "1444 8 0.614458 administr\n", + "... ... ... ...\n", + "182 2 0.166406 world\n", + "182 3 0.097373 world\n", + "182 4 0.150056 world\n", + "182 5 0.106093 world\n", + "182 6 0.051230 world\n", + "182 7 0.080296 world\n", + "182 8 0.011990 world\n", + "182 9 0.053410 world\n", + "182 10 0.054863 world\n", + "4238 1 0.009547 worship\n", + "4238 2 0.988079 worship\n", + "4809 3 0.994707 xlib\n", + "3868 3 0.995135 xpert\n", + "3581 3 0.995652 xterm\n", + "2827 3 0.988763 xview\n", + "6047 6 0.981546 yamaha\n", + "1701 7 0.988053 yanke\n", + "28 1 0.130095 year\n", + "28 2 0.031962 year\n", + "28 3 0.015482 year\n", + "28 4 0.038954 year\n", + "28 5 0.216243 year\n", + "28 6 0.063674 year\n", + "28 7 0.244959 year\n", + "28 8 0.040951 year\n", + "28 9 0.067919 year\n", + "28 10 0.149822 year\n", + "3309 9 0.986879 yeast\n", + "3190 5 0.990640 zoolog\n", + "1894 1 0.991014 zuma\n", + "\n", + "[2168 rows x 3 columns], R=30, lambda_step=0.01, plot_opts={'xlab': 'PC1', 'ylab': 'PC2'}, topic_order=[3, 1, 8, 9, 2, 4, 7, 10, 5, 6])" + ] + }, + "execution_count": 155, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "p = visualize_topics(model, bow_corpus, dictionary)\n", + "p" + ] + }, + { + "cell_type": "code", + "execution_count": 23, + "metadata": {}, + "outputs": [], + "source": [ + "# Save the pyldavis as HTML\n", + "from nautilus_nlp.models.topic_modeling import save_pyldavis" + ] + }, + { + "cell_type": "code", + "execution_count": 24, + "metadata": {}, + "outputs": [], + "source": [ + "save_pyldavis(p, '/Users/williamjaubert/Documents/Allianz_William/', 'pyldavis_test_func')" + ] + }, + { + "cell_type": "code", + "execution_count": 27, + "metadata": {}, + "outputs": [], + "source": [ + "# Load the pyldavis HTML\n", + "from nautilus_nlp.models.topic_modeling import show_pyldavis" + ] + }, + { + "cell_type": "code", + "execution_count": 26, + "metadata": { + "collapsed": true + }, + "outputs": [ + { + "data": { + "text/html": [ + "\n", + "<link rel=\"stylesheet\" type=\"text/css\" href=\"https://cdn.rawgit.com/bmabey/pyLDAvis/files/ldavis.v1.0.0.css\">\n", + "\n", + "\n", + "<div id=\"ldavis_el591011124069819927707340541\"></div>\n", + "<script type=\"text/javascript\">\n", + "\n", + "var ldavis_el591011124069819927707340541_data = {\"mdsDat\": {\"x\": [-0.07866945427665124, -0.01699948489792914, 0.20896689238873523, 0.14744605031212607, -0.008849073212760983, -0.04505413872814077, -0.08949897686453376, 0.10780299734830809, 0.004524270451044093, -0.22966908252019716], \"y\": [-0.15170611822961017, -0.1504468301902949, 0.08013685816591506, 0.13647834612774523, -0.009046128981188077, 0.003906923765221535, 0.14472746444813225, -0.07737607739594787, -0.1051004751701791, 0.1284260374602061], \"topics\": [1, 2, 3, 4, 5, 6, 7, 8, 9, 10], \"cluster\": [1, 1, 1, 1, 1, 1, 1, 1, 1, 1], \"Freq\": [13.179347038269043, 12.924742698669434, 12.465522766113281, 11.996149063110352, 9.560138702392578, 9.471930503845215, 8.926163673400879, 7.8803582191467285, 7.02661657333374, 6.569023609161377]}, \"tinfo\": {\"Category\": [\"Default\", \"Default\", \"Default\", \"Default\", \"Default\", \"Default\", \"Default\", \"Default\", \"Default\", \"Default\", \"Default\", \"Default\", \"Default\", \"Default\", \"Default\", \"Default\", \"Default\", \"Default\", \"Default\", \"Default\", \"Default\", \"Default\", \"Default\", \"Default\", \"Default\", \"Default\", \"Default\", \"Default\", \"Default\", \"Default\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\"], \"Freq\": [2966.0, 1940.0, 1924.0, 1689.0, 2638.0, 2884.0, 1860.0, 1161.0, 1997.0, 1477.0, 1274.0, 1016.0, 1577.0, 1423.0, 1059.0, 1331.0, 1142.0, 2600.0, 837.0, 1391.0, 6052.0, 742.0, 990.0, 784.0, 1802.0, 1023.0, 4004.0, 867.0, 1191.0, 747.0, 1141.7806396484375, 697.88427734375, 406.7251281738281, 375.1473693847656, 365.11944580078125, 324.8642883300781, 317.2684326171875, 293.6634521484375, 242.85263061523438, 242.56858825683594, 238.5181884765625, 222.63047790527344, 219.19569396972656, 497.40509033203125, 182.86300659179688, 189.0499267578125, 180.7320556640625, 167.57565307617188, 170.02467346191406, 162.42880249023438, 156.00514221191406, 152.95489501953125, 147.39271545410156, 144.92861938476562, 143.97406005859375, 142.5141143798828, 139.98184204101562, 137.23757934570312, 111.6092529296875, 111.33480834960938, 296.39483642578125, 234.70761108398438, 534.3711547851562, 227.28517150878906, 733.2534790039062, 290.5158386230469, 1027.5731201171875, 194.4586944580078, 462.1385803222656, 638.6304321289062, 382.9510498046875, 556.9410400390625, 270.836669921875, 346.2899169921875, 2339.156005859375, 353.3161926269531, 956.0157470703125, 1366.4423828125, 488.9396667480469, 1502.5341796875, 432.1164245605469, 423.58416748046875, 945.9664306640625, 647.218505859375, 868.762451171875, 843.017578125, 679.0517578125, 535.9990234375, 452.12701416015625, 627.1972045898438, 723.6101684570312, 487.4131164550781, 627.0872802734375, 480.17083740234375, 485.80718994140625, 520.3949584960938, 438.9589538574219, 1273.7509765625, 843.0744018554688, 687.5490112304688, 378.0928649902344, 599.49951171875, 284.1490173339844, 264.89508056640625, 257.6834716796875, 233.3529052734375, 198.52938842773438, 196.5380859375, 186.40451049804688, 185.75604248046875, 190.4610595703125, 160.6652069091797, 157.19314575195312, 147.49737548828125, 143.9265899658203, 141.27682495117188, 132.94015502929688, 132.69456481933594, 136.24981689453125, 134.07119750976562, 122.38124084472656, 117.65129089355469, 110.72013092041016, 103.34630584716797, 103.80403137207031, 102.60269165039062, 191.14974975585938, 1897.33984375, 734.1270141601562, 595.287353515625, 628.0527954101562, 206.76734924316406, 246.9275360107422, 800.1103515625, 749.0331420898438, 336.11505126953125, 271.7132873535156, 265.6830749511719, 397.9759216308594, 574.263427734375, 250.1382293701172, 378.815185546875, 461.7101745605469, 1507.0093994140625, 256.83978271484375, 577.0333251953125, 989.0523071289062, 369.24951171875, 600.8649291992188, 735.2048950195312, 547.226806640625, 671.4481811523438, 658.2610473632812, 983.5562133789062, 1571.339111328125, 640.5230712890625, 527.4468994140625, 1108.9169921875, 876.3516845703125, 725.7343139648438, 862.0634155273438, 662.431396484375, 745.1685791015625, 665.753662109375, 603.1578979492188, 671.9922485351562, 613.3507690429688, 579.6978759765625, 513.6331176757812, 478.697998046875, 261.2860107421875, 304.5064392089844, 182.0912628173828, 164.47610473632812, 158.48814392089844, 152.05868530273438, 137.89083862304688, 135.1747589111328, 117.29756927490234, 101.5453109741211, 100.56036376953125, 94.57755279541016, 94.09120178222656, 92.84423065185547, 88.50360870361328, 85.07716369628906, 77.8897705078125, 76.20620727539062, 74.78276062011719, 76.93145751953125, 66.28211975097656, 65.84783172607422, 62.6032600402832, 61.643402099609375, 56.68076705932617, 56.65744400024414, 56.483177185058594, 56.252906799316406, 433.4509582519531, 57.65077209472656, 175.38478088378906, 811.8549194335938, 352.3771057128906, 460.9055480957031, 1244.601806640625, 397.80743408203125, 319.1280822753906, 364.2165832519531, 817.3186645507812, 179.1452178955078, 759.4246826171875, 353.8927307128906, 768.0062255859375, 704.1742553710938, 1031.2420654296875, 338.7886962890625, 853.2907104492188, 1558.8812255859375, 1291.53564453125, 922.5413208007812, 1345.7596435546875, 471.8685607910156, 490.1439208984375, 677.5836181640625, 1059.2960205078125, 853.371337890625, 843.8799438476562, 1006.7838745117188, 803.6088256835938, 784.7322387695312, 584.7684936523438, 572.9198608398438, 507.78826904296875, 934.9744873046875, 496.57794189453125, 583.3226318359375, 623.9882202148438, 588.1378784179688, 615.0081176757812, 528.20361328125, 511.33087158203125, 511.8083801269531, 866.59033203125, 316.7350769042969, 249.30372619628906, 229.90980529785156, 228.7428741455078, 211.5573272705078, 183.0348663330078, 166.19662475585938, 164.79638671875, 155.5634765625, 157.90318298339844, 359.6986083984375, 133.47061157226562, 124.17569732666016, 122.316650390625, 117.04086303710938, 111.26261901855469, 110.83892059326172, 109.1672592163086, 103.2135009765625, 98.91744995117188, 514.7843017578125, 89.63079833984375, 82.75098419189453, 81.71863555908203, 103.2540054321289, 75.26065826416016, 75.21710205078125, 70.78661346435547, 69.3476791381836, 281.7891540527344, 311.1296081542969, 971.294189453125, 208.02467346191406, 697.1555786132812, 367.6167297363281, 1416.345947265625, 441.6514587402344, 604.5531616210938, 578.907958984375, 377.5320129394531, 192.01060485839844, 648.3541870117188, 1969.95458984375, 938.596435546875, 446.4309387207031, 632.3701782226562, 658.6392822265625, 1989.91748046875, 746.844970703125, 677.8211669921875, 282.1589050292969, 467.3360290527344, 480.8250427246094, 1420.011962890625, 633.149169921875, 1121.6416015625, 955.3305053710938, 821.8895874023438, 1270.0303955078125, 524.9111328125, 1015.944580078125, 611.8392944335938, 745.4418334960938, 688.5404663085938, 667.2193603515625, 692.5394897460938, 593.0941162109375, 527.0477905273438, 546.2659301757812, 266.1635437011719, 171.10794067382812, 155.6239776611328, 226.90951538085938, 131.5675506591797, 110.65044403076172, 109.72305297851562, 476.2783203125, 123.80803680419922, 96.53874206542969, 90.70281219482422, 86.92076873779297, 84.76178741455078, 84.683349609375, 83.14109802246094, 249.0670928955078, 73.45060729980469, 70.67398071289062, 70.31317138671875, 68.84266662597656, 66.71842193603516, 65.88937377929688, 60.61496353149414, 60.299964904785156, 59.60258483886719, 59.442161560058594, 59.145503997802734, 58.31914138793945, 57.82154846191406, 57.423213958740234, 405.08648681640625, 341.47369384765625, 190.9191131591797, 246.2603759765625, 163.53012084960938, 257.4788513183594, 138.4282684326172, 165.1016082763672, 521.0703125, 1046.3909912109375, 1401.0023193359375, 228.18516540527344, 286.6700439453125, 343.28363037109375, 185.7610626220703, 229.6707305908203, 175.074462890625, 332.49884033203125, 163.83180236816406, 539.723876953125, 256.24749755859375, 439.7876892089844, 517.6013793945312, 403.5384826660156, 229.64816284179688, 866.3922729492188, 846.759033203125, 313.158447265625, 322.8583068847656, 286.9349365234375, 653.4288330078125, 749.9511108398438, 426.6536560058594, 380.0589294433594, 366.8407287597656, 372.0916748046875, 408.5104064941406, 415.6706237792969, 394.1766357421875, 394.4267578125, 349.5382080078125, 362.40155029296875, 340.808349609375, 296.16046142578125, 297.5443420410156, 494.8436584472656, 746.194580078125, 324.79425048828125, 301.5485534667969, 243.8285369873047, 158.12664794921875, 107.40505981445312, 95.04991912841797, 99.33280944824219, 91.02439880371094, 88.6642837524414, 79.35138702392578, 77.837158203125, 76.30526733398438, 74.57151794433594, 68.70978546142578, 66.97795867919922, 65.4818344116211, 64.81551361083984, 62.9178466796875, 62.10234832763672, 61.07172393798828, 61.08311080932617, 58.716949462890625, 57.748966217041016, 57.54390335083008, 57.412330627441406, 53.53644561767578, 53.10344696044922, 81.06087493896484, 466.5129089355469, 629.9894409179688, 272.5233154296875, 229.85595703125, 524.6031494140625, 169.13986206054688, 106.4736328125, 468.3924255371094, 321.2161865234375, 72.88867950439453, 215.71841430664062, 420.2349548339844, 255.02392578125, 239.02398681640625, 170.43710327148438, 161.87730407714844, 350.9423522949219, 510.4275207519531, 280.5064697265625, 480.16314697265625, 199.71388244628906, 294.50860595703125, 258.12945556640625, 376.6604919433594, 510.116455078125, 1114.61083984375, 256.1866149902344, 426.7527770996094, 319.7099304199219, 739.28173828125, 280.38397216796875, 489.42193603515625, 542.8736572265625, 517.7899780273438, 617.5950317382812, 513.4124755859375, 436.72442626953125, 491.1626281738281, 506.85968017578125, 460.4228515625, 441.4096374511719, 394.3690185546875, 351.4322509765625, 347.85174560546875, 353.2395324707031, 337.03509521484375, 274.97705078125, 206.25440979003906, 205.88706970214844, 185.46702575683594, 142.32943725585938, 138.4519500732422, 125.20697021484375, 124.93755340576172, 113.30398559570312, 111.32567596435547, 109.37814331054688, 105.70201110839844, 106.32189178466797, 292.8650207519531, 101.51443481445312, 98.15642547607422, 98.08124542236328, 96.688720703125, 95.23130798339844, 93.90516662597656, 90.93041229248047, 90.10682678222656, 204.03321838378906, 83.50547790527344, 83.1707992553711, 82.09012603759766, 80.0595703125, 80.03185272216797, 78.97164154052734, 77.4714584350586, 624.7915649414062, 218.5322723388672, 299.7547607421875, 218.30796813964844, 189.66859436035156, 356.61126708984375, 202.45262145996094, 416.956787109375, 238.6123046875, 212.24911499023438, 149.82693481445312, 211.92662048339844, 303.8810119628906, 120.30801391601562, 237.628173828125, 454.8601379394531, 333.9891357421875, 980.4944458007812, 485.3978576660156, 911.3460083007812, 590.2308959960938, 261.1946716308594, 253.11302185058594, 366.61309814453125, 366.9202880859375, 261.4228515625, 595.406494140625, 533.9457397460938, 533.9599609375, 583.47607421875, 307.19378662109375, 439.3268737792969, 370.1156311035156, 337.7350158691406, 344.1394348144531, 325.0244140625, 340.1333923339844, 337.7405090332031, 350.025146484375, 294.61376953125, 276.2976989746094, 278.626953125, 1160.65234375, 424.52520751953125, 361.9087219238281, 388.7334289550781, 255.14059448242188, 223.3458709716797, 186.77297973632812, 150.9017333984375, 148.35372924804688, 142.3341522216797, 778.6029052734375, 125.934814453125, 122.35879516601562, 113.49314880371094, 110.9784164428711, 117.08515930175781, 97.77255249023438, 95.13446807861328, 154.00491333007812, 85.83687591552734, 85.79811096191406, 83.88481903076172, 83.05354309082031, 81.01181030273438, 86.69019317626953, 72.2069091796875, 70.93242645263672, 66.0419921875, 65.32259368896484, 61.589271545410156, 631.8587646484375, 967.0912475585938, 392.3902893066406, 86.90055847167969, 116.69065856933594, 384.3917541503906, 954.828125, 325.44622802734375, 153.9778594970703, 168.00970458984375, 886.02734375, 877.259521484375, 327.1088562011719, 468.2386169433594, 329.3564758300781, 302.24896240234375, 346.5186767578125, 350.18585205078125, 277.6599426269531, 424.3641662597656, 266.8429870605469, 331.9565124511719, 578.17333984375, 328.296630859375, 429.8065490722656, 517.4179077148438, 400.8412170410156, 346.21722412109375, 433.2587890625, 421.34136962890625, 338.8642883300781, 347.50665283203125, 348.3670654296875, 336.53314208984375, 398.4556579589844, 299.90478515625, 164.68971252441406, 151.29721069335938, 134.82589721679688, 134.8407440185547, 128.82469177246094, 120.21800231933594, 119.83185577392578, 103.71044921875, 93.07451629638672, 105.74777221679688, 91.14122772216797, 88.90278625488281, 86.50234985351562, 83.21115112304688, 82.5744857788086, 76.65482330322266, 73.94358825683594, 137.486328125, 73.60121154785156, 73.44850158691406, 297.8765869140625, 71.537841796875, 71.537841796875, 71.39191436767578, 68.6223373413086, 70.66267395019531, 67.06273651123047, 64.6351318359375, 137.61058044433594, 330.04791259765625, 498.7896423339844, 418.3139343261719, 321.71234130859375, 192.31024169921875, 436.83538818359375, 120.46820068359375, 101.74191284179688, 189.6998748779297, 107.90703582763672, 180.33082580566406, 406.5956726074219, 219.30587768554688, 311.1242370605469, 276.8919677734375, 364.6730651855469, 122.64595794677734, 431.6532897949219, 148.9232177734375, 478.1828308105469, 448.573486328125, 560.2838134765625, 235.4400634765625, 220.1329345703125, 237.02713012695312, 526.0250854492188, 310.5745544433594, 195.26043701171875, 465.158203125, 342.7765808105469, 343.9803161621094, 252.5526123046875, 252.3756866455078, 359.45233154296875, 365.1446533203125, 297.1376953125, 278.9319763183594, 264.31353759765625, 271.8553161621094, 267.05078125, 258.78143310546875, 836.6797485351562, 741.5901489257812, 348.0262145996094, 262.59930419921875, 234.66685485839844, 225.6525115966797, 214.5906982421875, 197.1658935546875, 176.15512084960938, 163.69117736816406, 159.65298461914062, 156.5215606689453, 155.51637268066406, 147.13583374023438, 143.75466918945312, 151.88540649414062, 140.51809692382812, 133.0145721435547, 131.76170349121094, 122.347900390625, 118.6324234008789, 115.60749816894531, 112.3785629272461, 112.19926452636719, 111.77244567871094, 119.0841293334961, 102.04837799072266, 93.4240493774414, 92.21881866455078, 89.70394897460938, 218.3953094482422, 151.76768493652344, 955.2220458984375, 178.90740966796875, 1383.801025390625, 160.94491577148438, 191.5231170654297, 221.7088623046875, 157.22250366210938, 1290.4215087890625, 920.5602416992188, 312.7351989746094, 622.9597778320312, 397.6490173339844, 455.3349914550781, 379.85693359375, 351.6811828613281, 356.8952331542969, 374.7598876953125, 212.77105712890625, 346.5650634765625, 312.73516845703125, 333.0689392089844, 335.98138427734375, 600.1721801757812, 295.3842468261719, 283.5966491699219, 250.0905303955078, 267.1750183105469, 330.6051940917969, 357.9386901855469, 262.105224609375, 242.04666137695312], \"Term\": [\"window\", \"game\", \"christian\", \"team\", \"drive\", \"file\", \"space\", \"encrypt\", \"govern\", \"chip\", \"jesus\", \"israel\", \"card\", \"play\", \"secur\", \"nasa\", \"armenian\", \"program\", \"isra\", \"imag\", \"peopl\", \"hockey\", \"player\", \"clipper\", \"public\", \"disk\", \"year\", \"scsi\", \"driver\", \"bike\", \"armenian\", \"turkish\", \"turk\", \"turkey\", \"armenia\", \"koresh\", \"nazi\", \"militia\", \"serdar\", \"argic\", \"genocid\", \"davidian\", \"troop\", \"murder\", \"mormon\", \"prison\", \"massacr\", \"azeri\", \"ethnic\", \"azerbaijani\", \"hitler\", \"iran\", \"zuma\", \"sdpa\", \"motto\", \"azerbaijan\", \"extermin\", \"sera\", \"urartu\", \"slaughter\", \"villag\", \"batf\", \"greek\", \"greec\", \"jew\", \"soldier\", \"kill\", \"waco\", \"arm\", \"countri\", \"muslim\", \"children\", \"armi\", \"popul\", \"peopl\", \"anti\", \"govern\", \"right\", \"attack\", \"say\", \"polit\", \"death\", \"state\", \"live\", \"go\", \"come\", \"tell\", \"happen\", \"forc\", \"world\", \"time\", \"nation\", \"want\", \"leav\", \"start\", \"year\", \"take\", \"jesus\", \"bibl\", \"atheist\", \"atheism\", \"christ\", \"scriptur\", \"cathol\", \"sandvik\", \"doctrin\", \"revel\", \"biblic\", \"satan\", \"atho\", \"livesey\", \"prophet\", \"divin\", \"vers\", \"gospel\", \"sabbath\", \"god\", \"sin\", \"resurrect\", \"solntz\", \"testament\", \"theolog\", \"propheci\", \"theist\", \"schneider\", \"jaeger\", \"marriag\", \"christian\", \"church\", \"belief\", \"faith\", \"worship\", \"contradict\", \"moral\", \"religion\", \"lord\", \"heaven\", \"holi\", \"rutger\", \"truth\", \"spirit\", \"teach\", \"islam\", \"believ\", \"etern\", \"argument\", \"exist\", \"religi\", \"evid\", \"word\", \"love\", \"life\", \"claim\", \"mean\", \"peopl\", \"true\", \"accept\", \"say\", \"question\", \"reason\", \"thing\", \"person\", \"come\", \"good\", \"read\", \"time\", \"point\", \"follow\", \"motif\", \"widget\", \"xterm\", \"visual\", \"xlib\", \"polygon\", \"baalk\", \"contrib\", \"toolkit\", \"kelvin\", \"pyron\", \"suno\", \"deskjet\", \"xpert\", \"plaintext\", \"skndiv\", \"openwindow\", \"xview\", \"ether\", \"quicktim\", \"magellan\", \"utah\", \"greenbelt\", \"reilli\", \"ualberta\", \"copper\", \"ciphertext\", \"autom\", \"gradi\", \"dillon\", \"font\", \"handbook\", \"binari\", \"server\", \"client\", \"librari\", \"imag\", \"anonym\", \"compil\", \"resourc\", \"graphic\", \"map\", \"applic\", \"archiv\", \"user\", \"code\", \"avail\", \"directori\", \"sourc\", \"file\", \"mail\", \"list\", \"program\", \"function\", \"format\", \"email\", \"inform\", \"version\", \"softwar\", \"includ\", \"send\", \"data\", \"internet\", \"address\", \"display\", \"window\", \"copi\", \"access\", \"distribut\", \"thank\", \"look\", \"book\", \"group\", \"need\", \"scsi\", \"simm\", \"motherboard\", \"cach\", \"bio\", \"quadra\", \"diamond\", \"vram\", \"vesa\", \"centri\", \"swap\", \"upgrad\", \"char\", \"eisa\", \"intercon\", \"nubus\", \"ethernet\", \"svga\", \"amanda\", \"meg\", \"cadr\", \"mous\", \"maxtor\", \"config\", \"cica\", \"tiff\", \"adaptec\", \"powerbook\", \"ctrl\", \"esdi\", \"jumper\", \"floppi\", \"disk\", \"umich\", \"video\", \"modem\", \"card\", \"output\", \"monitor\", \"mode\", \"printer\", \"spec\", \"entri\", \"drive\", \"driver\", \"port\", \"instal\", \"memori\", \"window\", \"color\", \"appl\", \"byte\", \"screen\", \"board\", \"problem\", \"machin\", \"file\", \"thank\", \"control\", \"work\", \"speed\", \"need\", \"hard\", \"help\", \"program\", \"want\", \"time\", \"repli\", \"softwar\", \"distribut\", \"alaska\", \"spencer\", \"oracl\", \"dseg\", \"aurora\", \"nsmca\", \"engr\", \"launch\", \"uoknor\", \"callison\", \"kaldi\", \"zoolog\", \"mccall\", \"ucsc\", \"hallam\", \"lunar\", \"automot\", \"raider\", \"theodor\", \"dock\", \"shafer\", \"mksol\", \"hydro\", \"ssto\", \"plymouth\", \"redesign\", \"laughter\", \"rockwel\", \"desi\", \"stimulus\", \"moon\", \"henri\", \"mar\", \"job\", \"wheel\", \"billion\", \"invest\", \"spacecraft\", \"orbit\", \"nasa\", \"space\", \"shuttl\", \"satellit\", \"fund\", \"probe\", \"flight\", \"helmet\", \"station\", \"solar\", \"presid\", \"mission\", \"earth\", \"cost\", \"money\", \"vehicl\", \"year\", \"work\", \"project\", \"toronto\", \"spend\", \"go\", \"time\", \"engin\", \"long\", \"high\", \"power\", \"thing\", \"say\", \"look\", \"peopl\", \"program\", \"want\", \"need\", \"design\", \"build\", \"firearm\", \"bike\", \"motorcycl\", \"magnus\", \"rider\", \"honda\", \"veal\", \"utkvm\", \"centerlin\", \"cactus\", \"rkba\", \"harley\", \"shotgun\", \"pistol\", \"ranck\", \"boyl\", \"husc\", \"ifa\", \"smuggl\", \"fischer\", \"counterst\", \"armori\", \"trunk\", \"thomasp\", \"imak\", \"photographi\", \"concordia\", \"tennesse\", \"yamaha\", \"frost\", \"car\", \"ohio\", \"uchicago\", \"rid\", \"gun\", \"brake\", \"shaft\", \"cwru\", \"auto\", \"wagon\", \"handgun\", \"cleveland\", \"ride\", \"tire\", \"urbana\", \"midway\", \"insur\", \"uiuc\", \"dealer\", \"weapon\", \"iastat\", \"owner\", \"illinoi\", \"crime\", \"price\", \"state\", \"freenet\", \"sell\", \"buy\", \"good\", \"road\", \"drive\", \"right\", \"look\", \"peopl\", \"want\", \"case\", \"thing\", \"time\", \"go\", \"distribut\", \"repli\", \"engin\", \"opinion\", \"problem\", \"need\", \"gatech\", \"cub\", \"fnal\", \"prism\", \"hitter\", \"pitcher\", \"alomar\", \"uicvm\", \"higgin\", \"inning\", \"revolv\", \"hulman\", \"yanke\", \"pitch\", \"catcher\", \"dodger\", \"blast\", \"starter\", \"tiger\", \"met\", \"bat\", \"nore\", \"outlet\", \"rocki\", \"jay\", \"sdsu\", \"volt\", \"lopez\", \"restaur\", \"lamp\", \"wire\", \"duke\", \"circuit\", \"batteri\", \"brave\", \"basebal\", \"hit\", \"berkeley\", \"jason\", \"ball\", \"metal\", \"jeff\", \"grind\", \"larc\", \"indiana\", \"netcom\", \"colorado\", \"year\", \"run\", \"good\", \"game\", \"smith\", \"scott\", \"player\", \"home\", \"stanford\", \"look\", \"distribut\", \"go\", \"time\", \"lose\", \"come\", \"start\", \"play\", \"david\", \"best\", \"better\", \"power\", \"thing\", \"john\", \"sale\", \"great\", \"encrypt\", \"escrow\", \"privaci\", \"ripem\", \"crypto\", \"wiretap\", \"cryptographi\", \"cipher\", \"decrypt\", \"hamburg\", \"clipper\", \"homicid\", \"bontchev\", \"gtoal\", \"crypt\", \"clarkson\", \"rwing\", \"surveil\", \"nist\", \"sternlight\", \"den\", \"ncsl\", \"qualcomm\", \"fbihh\", \"cryptograph\", \"tampa\", \"mime\", \"vesselin\", \"lyme\", \"strnlght\", \"key\", \"secur\", \"enforc\", \"recipi\", \"classifi\", \"secret\", \"chip\", \"agenc\", \"patent\", \"scheme\", \"public\", \"govern\", \"algorithm\", \"protect\", \"propos\", \"administr\", \"privat\", \"clinton\", \"feder\", \"phone\", \"court\", \"devic\", \"number\", \"communic\", \"technolog\", \"inform\", \"provid\", \"author\", \"state\", \"right\", \"messag\", \"data\", \"peopl\", \"need\", \"diseas\", \"stratus\", \"dyer\", \"diet\", \"robi\", \"infect\", \"syndrom\", \"methodolog\", \"physician\", \"cure\", \"intellect\", \"einstein\", \"chopin\", \"candida\", \"sphere\", \"yeast\", \"chastiti\", \"halat\", \"therapi\", \"clinic\", \"migrain\", \"steveh\", \"patient\", \"catbyt\", \"dtmedin\", \"blah\", \"carlo\", \"superstit\", \"baerga\", \"homeopathi\", \"skeptic\", \"gordon\", \"pitt\", \"medic\", \"doctor\", \"medicin\", \"food\", \"cancer\", \"sleev\", \"ingr\", \"genet\", \"aid\", \"bank\", \"treatment\", \"water\", \"pain\", \"health\", \"handheld\", \"studi\", \"princeton\", \"caus\", \"effect\", \"scienc\", \"scientif\", \"rochest\", \"theori\", \"point\", \"result\", \"risk\", \"problem\", \"research\", \"case\", \"steve\", \"test\", \"time\", \"peopl\", \"repli\", \"take\", \"differ\", \"year\", \"say\", \"thing\", \"isra\", \"hockey\", \"playoff\", \"palestinian\", \"detroit\", \"leaf\", \"cramer\", \"optilink\", \"pen\", \"cunixb\", \"lebanes\", \"penguin\", \"clayton\", \"jake\", \"maynard\", \"espn\", \"edmonton\", \"ericsson\", \"boni\", \"lemieux\", \"gaza\", \"puck\", \"bruin\", \"selann\", \"laurentian\", \"quebec\", \"ramsey\", \"canuck\", \"shark\", \"uvic\", \"montreal\", \"flyer\", \"israel\", \"stanley\", \"team\", \"jet\", \"coach\", \"ranger\", \"winnipeg\", \"game\", \"play\", \"wing\", \"player\", \"columbia\", \"season\", \"leagu\", \"pittsburgh\", \"score\", \"arab\", \"mcgill\", \"goal\", \"virginia\", \"toronto\", \"andrew\", \"year\", \"divis\", \"canada\", \"period\", \"final\", \"point\", \"time\", \"american\", \"go\"], \"Total\": [2966.0, 1940.0, 1924.0, 1689.0, 2638.0, 2884.0, 1860.0, 1161.0, 1997.0, 1477.0, 1274.0, 1016.0, 1577.0, 1423.0, 1059.0, 1331.0, 1142.0, 2600.0, 837.0, 1391.0, 6052.0, 742.0, 990.0, 784.0, 1802.0, 1023.0, 4004.0, 867.0, 1191.0, 747.0, 1142.6856689453125, 698.7892456054688, 407.6301574707031, 376.0523376464844, 366.0244140625, 325.7693176269531, 318.1803283691406, 294.5684509277344, 243.75758361816406, 243.47354125976562, 239.42320251464844, 223.5354461669922, 220.10520935058594, 499.7329406738281, 183.76812744140625, 189.986083984375, 181.63705444335938, 168.4805908203125, 170.9480438232422, 163.333740234375, 156.91017150878906, 153.886962890625, 148.2976531982422, 145.83355712890625, 144.879150390625, 143.41905212402344, 140.88682556152344, 138.14251708984375, 112.51419830322266, 112.23980712890625, 299.66619873046875, 239.2371826171875, 575.1444702148438, 235.90956115722656, 846.7127075195312, 310.77874755859375, 1292.3048095703125, 203.61073303222656, 568.2711791992188, 904.836181640625, 498.23358154296875, 821.609130859375, 317.67413330078125, 442.3506164550781, 6052.24072265625, 470.10357666015625, 1997.324951171875, 3614.37890625, 771.2041015625, 4395.30419921875, 753.3086547851562, 728.9891967773438, 3490.1201171875, 1666.1630859375, 3510.617431640625, 3362.2998046875, 2458.740966796875, 1374.794921875, 910.3983154296875, 2752.224853515625, 5183.12158203125, 1404.2081298828125, 3617.91015625, 1561.89111328125, 1909.0416259765625, 4004.603515625, 1884.1224365234375, 1274.664794921875, 843.9874877929688, 688.462890625, 379.0060119628906, 601.0263671875, 285.0621643066406, 265.8124694824219, 258.5965270996094, 234.26597595214844, 199.44381713867188, 197.4620819091797, 187.31765747070312, 186.6690673828125, 191.4668731689453, 161.5784912109375, 158.11094665527344, 148.4104766845703, 144.83966064453125, 142.1898956298828, 133.85328674316406, 133.607666015625, 137.19871520996094, 135.05442810058594, 123.29427337646484, 118.56434631347656, 111.63320922851562, 104.25935363769531, 104.73915100097656, 103.52851104736328, 192.95652770996094, 1924.052490234375, 744.5303955078125, 604.3348999023438, 642.5186767578125, 209.473876953125, 250.68084716796875, 845.5989379882812, 828.3161010742188, 355.5079040527344, 287.7699890136719, 282.9315490722656, 442.10467529296875, 692.8697509765625, 269.93646240234375, 446.02288818359375, 578.7404174804688, 2561.57275390625, 282.8100891113281, 815.093017578125, 1699.812744140625, 474.28302001953125, 965.1755981445312, 1333.0074462890625, 902.1245727539062, 1251.440673828125, 1317.1837158203125, 2641.765625, 6052.24072265625, 1353.1533203125, 1006.899169921875, 4395.30419921875, 2872.2099609375, 1977.8988037109375, 3329.251220703125, 2055.943359375, 3362.2998046875, 3754.512451171875, 2277.26025390625, 5183.12158203125, 2646.850830078125, 1892.380859375, 514.5391235351562, 479.60406494140625, 262.1926574707031, 305.8974609375, 183.00523376464844, 165.38929748535156, 159.3942108154297, 152.96470642089844, 138.79685974121094, 136.08087158203125, 118.2038345336914, 102.45138549804688, 101.46646881103516, 95.48358917236328, 94.9975357055664, 93.75051879882812, 89.41075134277344, 85.98323059082031, 78.79640197753906, 77.11235046386719, 75.6888427734375, 77.9653091430664, 67.1884536743164, 66.7538833618164, 63.509578704833984, 62.54978561401367, 57.58708572387695, 57.563636779785156, 57.3893928527832, 57.15915298461914, 448.55657958984375, 58.58415985107422, 180.8949432373047, 872.5092163085938, 374.1332092285156, 496.03216552734375, 1391.68603515625, 441.02191162109375, 358.5589599609375, 426.19305419921875, 1054.7808837890625, 199.62811279296875, 1032.63037109375, 440.0619812011719, 1078.5040283203125, 1021.21630859375, 1669.5213623046875, 441.5232238769531, 1374.6883544921875, 2884.190673828125, 2375.445556640625, 1561.026611328125, 2600.153564453125, 691.944580078125, 736.2711791992188, 1159.4267578125, 2169.358642578125, 1621.3409423828125, 1630.9676513671875, 2103.4462890625, 1606.2760009765625, 1651.1109619140625, 1085.956787109375, 1067.5660400390625, 839.23681640625, 2966.81884765625, 872.6724853515625, 1443.4810791015625, 3039.01025390625, 2288.6611328125, 3375.223876953125, 1421.1317138671875, 1956.808349609375, 3517.246337890625, 867.5025024414062, 317.6472473144531, 250.21588134765625, 230.822021484375, 229.65501403808594, 212.469482421875, 183.94711303710938, 167.1087646484375, 165.7086639404297, 156.47564697265625, 158.841552734375, 362.0856628417969, 134.38279724121094, 125.08786010742188, 123.22889709472656, 117.95303344726562, 112.17479705810547, 111.7510986328125, 110.07952880859375, 104.12570190429688, 99.83139038085938, 519.8053588867188, 90.54296112060547, 83.66317749023438, 82.6308364868164, 104.47161102294922, 76.17282104492188, 76.12928771972656, 71.69883728027344, 70.25984191894531, 287.1429138183594, 317.7418212890625, 1023.19677734375, 213.9846954345703, 736.9693603515625, 385.20306396484375, 1577.9459228515625, 487.7285461425781, 681.551513671875, 651.6373901367188, 414.8818359375, 202.3636016845703, 773.6707763671875, 2638.341552734375, 1191.1107177734375, 521.547607421875, 771.9820556640625, 825.6704711914062, 2966.81884765625, 979.7251586914062, 877.64501953125, 316.5227966308594, 603.9163208007812, 656.5357666015625, 3254.719970703125, 1051.2142333984375, 2884.190673828125, 2288.6611328125, 1819.038330078125, 3998.41064453125, 901.28564453125, 3517.246337890625, 1391.8231201171875, 2348.69677734375, 2600.153564453125, 3617.91015625, 5183.12158203125, 2732.342529296875, 1630.9676513671875, 3039.01025390625, 267.0742492675781, 172.0186767578125, 156.53477478027344, 228.3336181640625, 132.47816467285156, 111.56108093261719, 110.63384246826172, 480.3006896972656, 124.95624542236328, 97.44942474365234, 91.61353302001953, 87.83140563964844, 85.67245483398438, 85.59416961669922, 84.05184936523438, 251.9625244140625, 74.36140441894531, 71.5853042602539, 71.22400665283203, 69.75337982177734, 67.62906646728516, 66.80011749267578, 61.52567672729492, 61.210594177246094, 60.51362609863281, 60.35288619995117, 60.056236267089844, 59.229862213134766, 58.732261657714844, 58.3338737487793, 416.04022216796875, 351.22491455078125, 197.7613983154297, 259.21063232421875, 170.8984832763672, 275.1896057128906, 144.3324737548828, 175.0106658935547, 593.0027465820312, 1331.6910400390625, 1860.989990234375, 257.6250915527344, 338.0062255859375, 441.3564453125, 216.25115966796875, 284.1476135253906, 205.7794952392578, 455.3014831542969, 191.24240112304688, 874.0391845703125, 344.76593017578125, 726.9601440429688, 1014.6715698242188, 862.6346435546875, 337.0456848144531, 4004.603515625, 3998.41064453125, 642.0369873046875, 701.0498657226562, 557.0301513671875, 3510.617431640625, 5183.12158203125, 1433.1673583984375, 1579.4356689453125, 1518.08154296875, 1785.505859375, 3329.251220703125, 4395.30419921875, 3375.223876953125, 6052.24072265625, 2600.153564453125, 3617.91015625, 3517.246337890625, 1000.7255249023438, 1483.91259765625, 495.9259948730469, 747.8888549804688, 325.7707214355469, 302.4598388671875, 245.07272338867188, 159.03866577148438, 108.3163070678711, 95.96115112304688, 100.31522369384766, 91.93561553955078, 89.57569122314453, 80.2626953125, 78.74849700927734, 77.21672058105469, 75.48271942138672, 69.6209945678711, 67.88932800292969, 66.39307403564453, 65.72957611083984, 63.82933807373047, 63.01356506347656, 61.98298645019531, 61.99775695800781, 59.62815475463867, 58.660850524902344, 58.45547103881836, 58.323734283447266, 54.44773483276367, 54.01467514038086, 82.45339965820312, 485.455078125, 668.6755981445312, 285.07806396484375, 240.7487335205078, 577.5048828125, 179.9601593017578, 111.24809265136719, 529.0847778320312, 357.6230773925781, 74.69509887695312, 242.41627502441406, 503.03863525390625, 297.51763916015625, 281.2916564941406, 192.39242553710938, 183.0908203125, 466.7659912109375, 750.9197387695312, 366.600341796875, 724.9913330078125, 250.3634796142578, 415.90521240234375, 353.12091064453125, 657.73046875, 1070.769775390625, 3490.1201171875, 395.6552429199219, 983.89306640625, 607.056640625, 3754.512451171875, 598.3618774414062, 2638.341552734375, 3614.37890625, 3375.223876953125, 6052.24072265625, 3617.91015625, 2113.316162109375, 3329.251220703125, 5183.12158203125, 3510.617431640625, 3039.01025390625, 2732.342529296875, 1433.1673583984375, 1407.93994140625, 3254.719970703125, 3517.246337890625, 275.8894958496094, 207.16677856445312, 206.80348205566406, 186.3794403076172, 143.24180603027344, 139.36428833007812, 126.11944580078125, 125.8499984741211, 114.2164306640625, 112.23802185058594, 110.29060363769531, 106.61448669433594, 107.27007293701172, 295.4941711425781, 102.42676544189453, 99.06878662109375, 98.99481201171875, 97.60137939453125, 96.14401245117188, 94.8175277709961, 91.84278869628906, 91.01932525634766, 206.16087341308594, 84.42133331298828, 84.08326721191406, 83.0025405883789, 80.97196197509766, 80.94422149658203, 79.88419342041016, 78.38389587402344, 639.207763671875, 227.35552978515625, 323.0017395019531, 231.70584106445312, 201.0164031982422, 428.85137939453125, 227.23008728027344, 525.593994140625, 277.059326171875, 257.5475158691406, 175.57948303222656, 283.9958801269531, 476.73712158203125, 133.42327880859375, 365.1600646972656, 1031.7481689453125, 640.5665283203125, 4004.603515625, 1280.0654296875, 3754.512451171875, 1940.3056640625, 488.2843322753906, 472.27227783203125, 990.3853759765625, 1023.18505859375, 516.35693359375, 3375.223876953125, 3039.01025390625, 3510.617431640625, 5183.12158203125, 818.4566650390625, 3362.2998046875, 1909.0416259765625, 1423.678955078125, 1658.632080078125, 1346.393798828125, 1717.5716552734375, 1785.505859375, 3329.251220703125, 1491.1873779296875, 990.3681030273438, 1542.396728515625, 1161.5667724609375, 425.4395751953125, 362.8358154296875, 389.9899597167969, 256.05499267578125, 224.26022338867188, 187.68853759765625, 151.81675720214844, 149.26809692382812, 143.24859619140625, 784.1885986328125, 126.84929656982422, 123.27316284179688, 114.40896606445312, 111.91240692138672, 118.12262725830078, 98.6883316040039, 96.04891967773438, 155.52407836914062, 86.7515869140625, 86.71247863769531, 84.7991943359375, 83.96793365478516, 81.92617797851562, 87.68406677246094, 73.12200164794922, 71.84886169433594, 66.95635223388672, 66.2371597290039, 62.503814697265625, 659.0949096679688, 1059.3629150390625, 429.3234558105469, 89.65412902832031, 124.41126251220703, 474.0597839355469, 1477.2554931640625, 430.520751953125, 178.88685607910156, 204.3247528076172, 1802.019287109375, 1997.324951171875, 534.64892578125, 906.0775756835938, 556.024169921875, 491.4239501953125, 613.6195678710938, 662.9179077148438, 470.1695251464844, 1022.0805053710938, 480.69464111328125, 730.8409423828125, 2365.4375, 763.007080078125, 1372.454345703125, 2169.358642578125, 1377.273681640625, 1170.2694091796875, 3490.1201171875, 3614.37890625, 1280.413818359375, 1651.1109619140625, 6052.24072265625, 3517.246337890625, 399.3816833496094, 300.8172912597656, 165.6021728515625, 152.21038818359375, 135.7383270263672, 135.75428771972656, 129.73992919921875, 121.13043975830078, 120.74485778808594, 104.6231460571289, 93.98695373535156, 106.80420684814453, 92.05374145507812, 89.81517791748047, 87.41483306884766, 84.12355041503906, 83.48693084716797, 77.58230590820312, 74.85601043701172, 139.18516540527344, 74.51407623291016, 74.36089324951172, 301.65814208984375, 72.4502182006836, 72.4502182006836, 72.30432891845703, 69.5348129272461, 71.61282348632812, 67.97527313232422, 65.5474853515625, 140.34677124023438, 354.6991271972656, 560.325927734375, 467.2398986816406, 372.57330322265625, 214.29714965820312, 528.391357421875, 128.8434295654297, 106.83519744873047, 215.34388732910156, 114.37532806396484, 206.88092041015625, 542.6390380859375, 263.99560546875, 416.1996765136719, 361.66558837890625, 544.8867797851562, 136.74913024902344, 864.7689819335938, 185.32183837890625, 1192.1806640625, 1098.416259765625, 1600.403076171875, 409.02203369140625, 366.54962158203125, 446.0751953125, 2646.850830078125, 941.828857421875, 342.37249755859375, 3254.719970703125, 1469.8829345703125, 2113.316162109375, 866.4751586914062, 975.6422729492188, 5183.12158203125, 6052.24072265625, 2732.342529296875, 1884.1224365234375, 2258.383544921875, 4004.603515625, 4395.30419921875, 3329.251220703125, 837.592041015625, 742.5023803710938, 348.9384460449219, 263.5115966796875, 235.57916259765625, 226.56475830078125, 215.50299072265625, 198.07823181152344, 177.06741333007812, 164.60345458984375, 160.56524658203125, 157.4338836669922, 156.4473419189453, 148.04823303222656, 144.6669921875, 152.85597229003906, 141.4331817626953, 133.9269561767578, 132.6742706298828, 123.26013946533203, 119.5447006225586, 116.5197525024414, 113.29080200195312, 113.11150360107422, 112.6846923828125, 120.06710052490234, 102.96061706542969, 94.33647918701172, 93.13108825683594, 90.6162338256836, 220.8243408203125, 153.70223999023438, 1016.828125, 185.55426025390625, 1689.23095703125, 167.16043090820312, 202.18853759765625, 240.0043182373047, 165.12567138671875, 1940.3056640625, 1423.678955078125, 399.81451416015625, 990.3853759765625, 559.1829833984375, 669.9990234375, 536.7244873046875, 505.73583984375, 528.174072265625, 572.368408203125, 254.2933349609375, 553.6107788085938, 544.26123046875, 701.0498657226562, 868.3087768554688, 4004.603515625, 693.3735961914062, 732.436279296875, 584.4656982421875, 822.2222900390625, 2646.850830078125, 5183.12158203125, 1242.119140625, 3510.617431640625], \"loglift\": [30.0, 29.0, 28.0, 27.0, 26.0, 25.0, 24.0, 23.0, 22.0, 21.0, 20.0, 19.0, 18.0, 17.0, 16.0, 15.0, 14.0, 13.0, 12.0, 11.0, 10.0, 9.0, 8.0, 7.0, 6.0, 5.0, 4.0, 3.0, 2.0, 1.0, 2.025700092315674, 2.0251998901367188, 2.0243000984191895, 2.0241000652313232, 2.0239999294281006, 2.023699998855591, 2.0236001014709473, 2.023400068283081, 2.0227999687194824, 2.0227999687194824, 2.022700071334839, 2.0225000381469727, 2.02239990234375, 2.021899938583374, 2.0216000080108643, 2.0216000080108643, 2.0215001106262207, 2.0211000442504883, 2.0211000442504883, 2.0209999084472656, 2.020699977874756, 2.020400047302246, 2.020400047302246, 2.0202999114990234, 2.0202999114990234, 2.02020001411438, 2.0201001167297363, 2.01990008354187, 2.018399953842163, 2.018399953842163, 2.015500068664551, 2.0074000358581543, 1.9529999494552612, 1.989300012588501, 1.882599949836731, 1.9591000080108643, 1.7972999811172485, 1.9804999828338623, 1.8198000192642212, 1.6780999898910522, 1.7633999586105347, 1.6376999616622925, 1.8669999837875366, 1.7817000150680542, 1.0758999586105347, 1.7409000396728516, 1.2897000312805176, 1.0537999868392944, 1.5707999467849731, 0.9531000256538391, 1.4707000255584717, 1.4836000204086304, 0.7210000157356262, 1.080899953842163, 0.6299999952316284, 0.6431000232696533, 0.739799976348877, 1.0845999717712402, 1.3265999555587769, 0.5475999712944031, 0.0575999990105629, 0.9684000015258789, 0.27399998903274536, 0.847000002861023, 0.6579999923706055, -0.014100000262260437, 0.5697000026702881, 2.045300006866455, 2.0448999404907227, 2.0446999073028564, 2.043600082397461, 2.0434999465942383, 2.042799949645996, 2.04259991645813, 2.0425000190734863, 2.042099952697754, 2.0413999557495117, 2.041300058364868, 2.041100025177002, 2.041100025177002, 2.040800094604492, 2.0404000282287598, 2.0401999950408936, 2.039900064468384, 2.0397000312805176, 2.039599895477295, 2.0392000675201416, 2.0392000675201416, 2.039099931716919, 2.0387001037597656, 2.038599967956543, 2.038300037384033, 2.0378000736236572, 2.0371999740600586, 2.037100076675415, 2.0369999408721924, 2.036600112915039, 2.0320000648498535, 2.0320000648498535, 2.030900001525879, 2.0232999324798584, 2.0329999923706055, 2.030900001525879, 1.9907000064849854, 1.9453999996185303, 1.98989999294281, 1.9886000156402588, 1.9831000566482544, 1.9408999681472778, 1.858299970626831, 1.9699000120162964, 1.882699966430664, 1.820099949836731, 1.5154999494552612, 1.9496999979019165, 1.700600028038025, 1.5045000314712524, 1.795699954032898, 1.572100043296814, 1.4509999752044678, 1.5461000204086304, 1.4234000444412231, 1.3523999452590942, 1.0579999685287476, 0.6974999904632568, 1.2980999946594238, 1.399399995803833, 0.6689000129699707, 0.859000027179718, 1.0434000492095947, 0.6948999762535095, 0.9135000109672546, 0.5393000245094299, 0.31619998812675476, 0.7174999713897705, 0.003100000089034438, 0.5838000178337097, 0.8629000186920166, 2.080399990081787, 2.0803000926971436, 2.078700065612793, 2.0776000022888184, 2.077199935913086, 2.07669997215271, 2.0764999389648438, 2.0762999057769775, 2.075700044631958, 2.075500011444092, 2.07450008392334, 2.0732998847961426, 2.073199987411499, 2.072700023651123, 2.0725998878479004, 2.072499990463257, 2.072000026702881, 2.0715999603271484, 2.0706000328063965, 2.0703999996185303, 2.070199966430664, 2.0689001083374023, 2.0685999393463135, 2.06850004196167, 2.0678000450134277, 2.0676000118255615, 2.0662999153137207, 2.0662999153137207, 2.0662999153137207, 2.066200017929077, 2.0478999614715576, 2.0660998821258545, 2.051300048828125, 2.010200023651123, 2.0223000049591064, 2.0088000297546387, 1.9704999923706055, 1.979099988937378, 1.9657000303268433, 1.9250999689102173, 1.8271000385284424, 1.9738999605178833, 1.774899959564209, 1.864300012588501, 1.7426999807357788, 1.7105000019073486, 1.6003999710083008, 1.8172999620437622, 1.605299949645996, 1.4668999910354614, 1.4729000329971313, 1.5562000274658203, 1.4235999584197998, 1.6993999481201172, 1.6753000020980835, 1.5450999736785889, 1.365399956703186, 1.4404000043869019, 1.42330002784729, 1.3453999757766724, 1.3896000385284424, 1.3382999897003174, 1.4631999731063843, 1.4598000049591064, 1.579800009727478, 0.9275000095367432, 1.518399953842163, 1.1761000156402588, 0.49900001287460327, 0.7233999967575073, 0.37959998846054077, 1.0924999713897705, 0.7401999831199646, 0.15469999611377716, 2.119499921798706, 2.1177000999450684, 2.1168999671936035, 2.1166000366210938, 2.1166000366210938, 2.116300106048584, 2.115600109100342, 2.1150999069213867, 2.1150999069213867, 2.1147000789642334, 2.1147000789642334, 2.114000082015991, 2.113800048828125, 2.113300085067749, 2.1131999492645264, 2.112799882888794, 2.1124000549316406, 2.1124000549316406, 2.112299919128418, 2.111799955368042, 2.1113998889923096, 2.1108999252319336, 2.1105000972747803, 2.109600067138672, 2.109499931335449, 2.1089000701904297, 2.1085000038146973, 2.1085000038146973, 2.107800006866455, 2.1075000762939453, 2.101799964904785, 2.099600076675415, 2.06850004196167, 2.0922999382019043, 2.065000057220459, 2.073899984359741, 2.012500047683716, 2.0213000774383545, 2.000699996948242, 2.00219988822937, 2.02620005607605, 2.0680999755859375, 1.9438999891281128, 1.8284000158309937, 1.8823000192642212, 1.9651000499725342, 1.9211000204086304, 1.8946000337600708, 1.7211999893188477, 1.8492000102996826, 1.8622000217437744, 2.00570011138916, 1.8641999959945679, 1.8091000318527222, 1.291100025177002, 1.6136000156402588, 1.1761000156402588, 1.246899962425232, 1.3260999917984009, 0.9736999869346619, 1.5800000429153442, 0.8787000179290771, 1.298699975013733, 0.9728999733924866, 0.7918000221252441, 0.4300999939441681, 0.10779999941587448, 0.5929999947547913, 0.9908999800682068, 0.4043999910354614, 2.3441998958587646, 2.3422999382019043, 2.3417000770568848, 2.3413000106811523, 2.3406999111175537, 2.339400053024292, 2.3392999172210693, 2.339200019836426, 2.3382999897003174, 2.338200092315674, 2.337599992752075, 2.337100028991699, 2.336899995803833, 2.336899995803833, 2.336699962615967, 2.3359999656677246, 2.335200071334839, 2.3348000049591064, 2.334700107574463, 2.334399938583374, 2.3340001106262207, 2.3338000774383545, 2.33270001411438, 2.3326001167297363, 2.33240008354187, 2.33240008354187, 2.3322999477386475, 2.3320999145507812, 2.331899881362915, 2.3317999839782715, 2.3208999633789062, 2.3194000720977783, 2.3124001026153564, 2.296299934387207, 2.303499937057495, 2.2809998989105225, 2.305799961090088, 2.289299964904785, 2.2183001041412354, 2.1064999103546143, 2.0636000633239746, 2.2262001037597656, 2.182800054550171, 2.096299886703491, 2.1956000328063965, 2.134700059890747, 2.186000108718872, 2.0332000255584717, 2.1928999423980713, 1.8654999732971191, 2.050800085067749, 1.8450000286102295, 1.6744999885559082, 1.5878000259399414, 1.9638999700546265, 0.8166999816894531, 0.7953000068664551, 1.6296000480651855, 1.5721999406814575, 1.6842000484466553, 0.6662999987602234, 0.41440001130104065, 1.1359000205993652, 0.9230999946594238, 0.927299976348877, 0.7792999744415283, 0.24959999322891235, -0.01080000028014183, 0.20020000636577606, -0.3831999897956848, 0.3409000039100647, 0.04670000076293945, 0.013500000350177288, 1.1299999952316284, 0.7407000064849854, 2.3547000885009766, 2.354599952697754, 2.353800058364868, 2.353800058364868, 2.3517000675201416, 2.351099967956543, 2.348400115966797, 2.3473000526428223, 2.3469998836517334, 2.34689998626709, 2.34660005569458, 2.345400094985962, 2.3452000617980957, 2.3450000286102295, 2.3447000980377197, 2.3436999320983887, 2.3433001041412354, 2.3429999351501465, 2.3427999019622803, 2.3424999713897705, 2.3422999382019043, 2.3420000076293945, 2.3420000076293945, 2.341399908065796, 2.341200113296509, 2.341099977493286, 2.341099977493286, 2.3399999141693115, 2.3397998809814453, 2.3397998809814453, 2.316999912261963, 2.2971999645233154, 2.311800003051758, 2.310499906539917, 2.2607998847961426, 2.294800043106079, 2.312999963760376, 2.234999895095825, 2.249500036239624, 2.33240008354187, 2.2402000427246094, 2.177000045776367, 2.202699899673462, 2.194000005722046, 2.2356998920440674, 2.2337000370025635, 2.0715999603271484, 1.9708000421524048, 2.089200019836426, 1.9448000192642212, 2.1308000087738037, 2.011699914932251, 2.0434999465942383, 1.799399971961975, 1.6153000593185425, 1.215399980545044, 1.9221999645233154, 1.5214999914169312, 1.7156000137329102, 0.7318000197410583, 1.5987999439239502, 0.6722000241279602, 0.460999995470047, 0.4821999967098236, 0.07450000196695328, 0.4043000042438507, 0.7800999879837036, 0.4431000053882599, 0.03189999982714653, 0.3253999948501587, 0.42750000953674316, 0.4212000072002411, 0.951200008392334, 0.9587000012397766, 0.13609999418258667, 0.011599999852478504, 2.412899971008301, 2.411799907684326, 2.4117000102996826, 2.41129994392395, 2.4098000526428223, 2.409600019454956, 2.408900022506714, 2.408900022506714, 2.4082000255584717, 2.4079999923706055, 2.407900094985962, 2.407599925994873, 2.4072999954223633, 2.4072000980377197, 2.4072000980377197, 2.406899929046631, 2.406899929046631, 2.4068000316619873, 2.406599998474121, 2.4065001010894775, 2.4061999320983887, 2.406100034713745, 2.4058001041412354, 2.4052999019622803, 2.4052999019622803, 2.405100107192993, 2.404900074005127, 2.4047999382019043, 2.4047000408172607, 2.4045000076293945, 2.393399953842163, 2.3766000270843506, 2.3415000438690186, 2.356600046157837, 2.358099937438965, 2.2316999435424805, 2.3006999492645264, 2.1846001148223877, 2.2667999267578125, 2.2227001190185547, 2.2576000690460205, 2.123500108718872, 1.96589994430542, 2.312700033187866, 1.9866000413894653, 1.5972000360488892, 1.7648999691009521, 1.0089999437332153, 1.4464999437332153, 1.0003999471664429, 1.226099967956543, 1.7905999422073364, 1.7925000190734863, 1.4223999977111816, 1.3906999826431274, 1.7354999780654907, 0.6812000274658203, 0.6772000193595886, 0.5329999923706055, 0.23199999332427979, 1.4362000226974487, 0.38100001215934753, 0.775600016117096, 0.977400004863739, 0.843500018119812, 0.9948999881744385, 0.7968999743461609, 0.7509999871253967, 0.16369999945163727, 0.7944999933242798, 1.1396000385284424, 0.7049999833106995, 2.5399999618530273, 2.538599967956543, 2.5381999015808105, 2.537600040435791, 2.5371999740600586, 2.5367000102996826, 2.535900115966797, 2.5348000526428223, 2.5346999168395996, 2.53439998626709, 2.533600091934204, 2.533600091934204, 2.533400058746338, 2.5327999591827393, 2.532399892807007, 2.5320000648498535, 2.5315001010894775, 2.5311999320983887, 2.5309998989105225, 2.5302000045776367, 2.5302000045776367, 2.5299999713897705, 2.5297999382019043, 2.529599905014038, 2.529400110244751, 2.5281999111175537, 2.5280001163482666, 2.5269999504089355, 2.526900053024292, 2.526099920272827, 2.4986000061035156, 2.449700117111206, 2.4507999420166016, 2.5095999240875244, 2.4767000675201416, 2.3310999870300293, 2.1043999195098877, 2.260999917984009, 2.390899896621704, 2.345099925994873, 1.830899953842163, 1.718000054359436, 2.049499988555908, 1.8805999755859375, 2.0171000957489014, 2.0546998977661133, 1.9694000482559204, 1.9026000499725342, 2.0141000747680664, 1.6618000268936157, 1.9522000551223755, 1.7516000270843506, 1.1319999694824219, 1.6973999738693237, 1.3797999620437622, 1.1074999570846558, 1.30649995803833, 1.3229000568389893, 0.4544000029563904, 0.39160001277923584, 1.2115000486373901, 0.9824000000953674, -0.3140999972820282, 0.1941000074148178, 2.65310001373291, 2.652400016784668, 2.649899959564209, 2.649399995803833, 2.648699998855591, 2.648699998855591, 2.648400068283081, 2.647900104522705, 2.647900104522705, 2.646699905395508, 2.645699977874756, 2.6454999446868896, 2.6454999446868896, 2.6452999114990234, 2.6449999809265137, 2.6445999145507812, 2.6445000171661377, 2.643399953842163, 2.643199920654297, 2.643199920654297, 2.6431000232696533, 2.6431000232696533, 2.6428000926971436, 2.6428000926971436, 2.6428000926971436, 2.6428000926971436, 2.6422998905181885, 2.6421000957489014, 2.641900062561035, 2.641400098800659, 2.6357998847961426, 2.583400011062622, 2.539099931716919, 2.5448999404907227, 2.508699893951416, 2.5471999645233154, 2.4651999473571777, 2.5882999897003174, 2.606600046157837, 2.528700113296509, 2.5971999168395996, 2.5181000232696533, 2.36680006980896, 2.4700000286102295, 2.364500045776367, 2.388400077819824, 2.2539000511169434, 2.546600103378296, 1.9606000185012817, 2.436800003051758, 1.7418999671936035, 1.7598999738693237, 1.6059000492095947, 2.1031999588012695, 2.1456000804901123, 2.023200035095215, 1.0397000312805176, 1.5461000204086304, 2.093899965286255, 0.7099999785423279, 1.1995999813079834, 0.8399999737739563, 1.422700047492981, 1.3033000230789185, -0.013100000098347664, -0.15240000188350677, 0.4366999864578247, 0.745199978351593, 0.510200023651123, -0.03449999913573265, -0.1454000025987625, 0.10090000182390213, 2.7216999530792236, 2.72160005569458, 2.7202000617980957, 2.7193000316619873, 2.718899965286255, 2.7188000679016113, 2.718600034713745, 2.7181999683380127, 2.717600107192993, 2.7172000408172607, 2.717099905014038, 2.7170000076293945, 2.7167999744415283, 2.716599941253662, 2.7165000438690186, 2.716399908065796, 2.7163000106811523, 2.7160000801086426, 2.71589994430542, 2.715399980545044, 2.715100049972534, 2.714900016784668, 2.7146999835968018, 2.7146999835968018, 2.7146999835968018, 2.714600086212158, 2.713900089263916, 2.713099956512451, 2.7130000591278076, 2.7126998901367188, 2.711699962615967, 2.710099935531616, 2.6603000164031982, 2.686300039291382, 2.523400068283081, 2.6849000453948975, 2.668600082397461, 2.6435000896453857, 2.673799991607666, 2.3148999214172363, 2.286799907684326, 2.4772000312805176, 2.259200096130371, 2.3819000720977783, 2.3366000652313232, 2.3770999908447266, 2.359499931335449, 2.3308000564575195, 2.299299955368042, 2.5445001125335693, 2.2544000148773193, 2.1686999797821045, 1.978600025177002, 1.773300051689148, 0.8248000144958496, 1.8695000410079956, 1.7740000486373901, 1.873900055885315, 1.5987000465393066, 0.6425999999046326, 0.05000000074505806, 1.1670000553131104, 0.04839999973773956], \"logprob\": [30.0, 29.0, 28.0, 27.0, 26.0, 25.0, 24.0, 23.0, 22.0, 21.0, 20.0, 19.0, 18.0, 17.0, 16.0, 15.0, 14.0, 13.0, 12.0, 11.0, 10.0, 9.0, 8.0, 7.0, 6.0, 5.0, 4.0, 3.0, 2.0, 1.0, -4.882199764251709, -5.374499797821045, -5.914400100708008, -5.995299816131592, -6.022299766540527, -6.139200210571289, -6.162799835205078, -6.240099906921387, -6.430099964141846, -6.431300163269043, -6.4481000900268555, -6.517099857330322, -6.532599925994873, -5.713200092315674, -6.713799953460693, -6.680600166320801, -6.725599765777588, -6.80109977722168, -6.786600112915039, -6.832300186157227, -6.872700214385986, -6.892399787902832, -6.929500102996826, -6.946300029754639, -6.952899932861328, -6.963099956512451, -6.981100082397461, -7.000899791717529, -7.207600116729736, -7.210000038146973, -6.230899810791016, -6.464200019836426, -5.641499996185303, -6.496399879455566, -5.325099945068359, -6.250899791717529, -4.987599849700928, -6.652400016784668, -5.7866997718811035, -5.463200092315674, -5.974699974060059, -5.600100040435791, -6.321100234985352, -6.075300216674805, -4.164999961853027, -6.055200099945068, -5.059800148010254, -4.702600002288818, -5.730299949645996, -4.607699871063232, -5.853899955749512, -5.873799800872803, -5.070400238037109, -5.449900150299072, -5.1554999351501465, -5.1855998039245605, -5.401899814605713, -5.638400077819824, -5.808599948883057, -5.481299877166748, -5.3383002281188965, -5.733500003814697, -5.481500148773193, -5.7484002113342285, -5.736800193786621, -5.668000221252441, -5.838200092315674, -4.753300189971924, -5.165999889373779, -5.369900226593018, -5.967899799346924, -5.506999969482422, -6.253600120544434, -6.323699951171875, -6.35129976272583, -6.450500011444092, -6.612100124359131, -6.622200012207031, -6.675099849700928, -6.678599834442139, -6.653600215911865, -6.823699951171875, -6.845600128173828, -6.909299850463867, -6.933800220489502, -6.952300071716309, -7.013199806213379, -7.014999866485596, -6.98859977722168, -7.004700183868408, -7.095900058746338, -7.135300159454346, -7.196100234985352, -7.264999866485596, -7.2606000900268555, -7.272200107574463, -6.650000095367432, -4.354899883270264, -5.3043999671936035, -5.513999938964844, -5.460400104522705, -6.571499824523926, -6.394000053405762, -5.218299865722656, -5.284299850463867, -6.085599899291992, -6.298299789428711, -6.320799827575684, -5.9166998863220215, -5.550000190734863, -6.38100004196167, -5.966000080108643, -5.768099784851074, -4.58519983291626, -6.354599952697754, -5.545199871063232, -5.00629997253418, -5.991600036621094, -5.504700183868408, -5.3028998374938965, -5.598199844360352, -5.393599987030029, -5.41349983215332, -5.011899948120117, -4.543399810791016, -5.440800189971924, -5.635000228881836, -4.891900062561035, -5.127299785614014, -5.315899848937988, -5.143700122833252, -5.407100200653076, -5.2895002365112305, -5.402100086212158, -5.500899791717529, -5.3927998542785645, -5.484099864959717, -5.540599822998047, -5.625400066375732, -5.695799827575684, -6.301300048828125, -6.148200035095215, -6.662399768829346, -6.764100074768066, -6.801199913024902, -6.842599868774414, -6.940400123596191, -6.960299968719482, -7.102200031280518, -7.246399879455566, -7.256100177764893, -7.317500114440918, -7.3225998878479, -7.335999965667725, -7.383800029754639, -7.423299789428711, -7.511600017547607, -7.533400058746338, -7.552299976348877, -7.52400016784668, -7.672999858856201, -7.679500102996826, -7.730100154876709, -7.745500087738037, -7.829500198364258, -7.829899787902832, -7.832900047302246, -7.836999893188477, -5.795100212097168, -7.8125, -6.699900150299072, -5.167600154876709, -6.002200126647949, -5.733699798583984, -4.740300178527832, -5.880899906158447, -6.10129976272583, -5.969099998474121, -5.160900115966797, -6.678699970245361, -5.234300136566162, -5.997900009155273, -5.223100185394287, -5.309899806976318, -4.928400039672852, -6.041500091552734, -5.117800235748291, -4.515200138092041, -4.7032999992370605, -5.03980016708374, -4.662199974060059, -5.71019983291626, -5.6722002029418945, -5.348400115966797, -4.901500225067139, -5.117700099945068, -5.128900051116943, -4.952400207519531, -5.177800178527832, -5.201499938964844, -5.495699882507324, -5.51609992980957, -5.6367998123168945, -5.026400089263916, -5.65910005569458, -5.4980998039245605, -5.430799961090088, -5.4899001121521, -5.445300102233887, -5.597400188446045, -5.629899978637695, -5.628900051116943, -5.063899993896484, -6.070400238037109, -6.309800148010254, -6.3907999992370605, -6.395899772644043, -6.473999977111816, -6.618800163269043, -6.7153000831604, -6.723800182342529, -6.781499862670898, -6.766499996185303, -5.94320011138916, -6.934599876403809, -7.006800174713135, -7.021900177001953, -7.065999984741211, -7.116600036621094, -7.1203999519348145, -7.1356000900268555, -7.191699981689453, -7.2342000007629395, -5.584799766540527, -7.332799911499023, -7.412700176239014, -7.42519998550415, -7.191299915313721, -7.507500171661377, -7.5081000328063965, -7.56879997253418, -7.589399814605713, -6.187300205230713, -6.0883002281188965, -4.949900150299072, -6.490799903869629, -5.281499862670898, -5.921500205993652, -4.572700023651123, -5.73799991607666, -5.423999786376953, -5.467400074005127, -5.894899845123291, -6.571000099182129, -5.354100227355957, -4.242700099945068, -4.984099864959717, -5.727200031280518, -5.379000186920166, -5.3383002281188965, -4.232699871063232, -5.212600231170654, -5.309599876403809, -6.185999870300293, -5.68149995803833, -5.6529998779296875, -4.570099830627441, -5.377799987792969, -4.806000232696533, -4.966400146484375, -5.1168999671936035, -4.681700229644775, -5.565299987792969, -4.904900074005127, -5.4120001792907715, -5.2144999504089355, -5.293900012969971, -5.325399875640869, -5.288099765777588, -5.44320011138916, -5.561200141906738, -5.525400161743164, -6.017399787902832, -6.459199905395508, -6.554100036621094, -6.177000045776367, -6.7220001220703125, -6.895100116729736, -6.903600215911865, -5.435500144958496, -6.782800197601318, -7.031599998474121, -7.093900203704834, -7.136499881744385, -7.1616997718811035, -7.162600040435791, -7.181000232696533, -6.083799839019775, -7.304900169372559, -7.343400001525879, -7.348599910736084, -7.369699954986572, -7.401000022888184, -7.41349983215332, -7.497000217437744, -7.502200126647949, -7.513800144195557, -7.516499996185303, -7.521500110626221, -7.535600185394287, -7.5441999435424805, -7.55109977722168, -5.597400188446045, -5.7683000564575195, -6.349699974060059, -6.095099925994873, -6.504499912261963, -6.050600051879883, -6.671199798583984, -6.494999885559082, -5.345600128173828, -4.648399829864502, -4.356599807739258, -6.17140007019043, -5.94320011138916, -5.763000011444092, -6.377099990844727, -6.164899826049805, -6.436299800872803, -5.794899940490723, -6.502699851989746, -5.310500144958496, -6.0553998947143555, -5.515200138092041, -5.35230016708374, -5.60129976272583, -6.164999961853027, -4.837200164794922, -4.860099792480469, -5.854800224304199, -5.8242998123168945, -5.942299842834473, -5.11929988861084, -4.981500148773193, -5.545599937438965, -5.661200046539307, -5.696599960327148, -5.682400226593018, -5.589000225067139, -5.571599960327148, -5.62470006942749, -5.624100208282471, -5.744900226593018, -5.708799839019775, -5.770199775695801, -5.910600185394287, -5.906000137329102, -5.388000011444092, -4.97730016708374, -5.809100151062012, -5.883299827575684, -6.095799922943115, -6.528900146484375, -6.915599822998047, -7.037899971008301, -6.993800163269043, -7.081099987030029, -7.107399940490723, -7.218400001525879, -7.237599849700928, -7.257500171661377, -7.2804999351501465, -7.362400054931641, -7.387899875640869, -7.4105000495910645, -7.4207000732421875, -7.450399875640869, -7.463500022888184, -7.480199813842773, -7.480000019073486, -7.519499778747559, -7.536099910736084, -7.539700031280518, -7.541999816894531, -7.6118998527526855, -7.619999885559082, -7.1971001625061035, -5.447000026702881, -5.146599769592285, -5.984499931335449, -6.154799938201904, -5.329599857330322, -6.46150016784668, -6.9243998527526855, -5.44290018081665, -5.820099830627441, -7.303299903869629, -6.218299865722656, -5.551400184631348, -6.050899982452393, -6.115699768066406, -6.45389986038208, -6.50540018081665, -5.731599807739258, -5.35699987411499, -5.955699920654297, -5.418099880218506, -6.295400142669678, -5.906899929046631, -6.03879976272583, -5.660900115966797, -5.357600212097168, -4.576000213623047, -6.046299934387207, -5.535999774932861, -5.82480001449585, -4.986599922180176, -5.956099987030029, -5.39900016784668, -5.295400142669678, -5.342700004577637, -5.166399955749512, -5.351200103759766, -5.513000011444092, -5.395500183105469, -5.363999843597412, -5.460100173950195, -5.502299785614014, -5.614999771118164, -5.730199813842773, -5.740499973297119, -5.725100040435791, -5.77209997177124, -5.916200160980225, -6.203800201416016, -6.205599784851074, -6.309999942779541, -6.57480001449585, -6.602399826049805, -6.702899932861328, -6.705100059509277, -6.802800178527832, -6.820400238037109, -6.838099956512451, -6.872300148010254, -6.866399765014648, -5.8531999588012695, -6.912700176239014, -6.946300029754639, -6.9471001625061035, -6.961400032043457, -6.976600170135498, -6.990600109100342, -7.022799968719482, -7.031899929046631, -6.214600086212158, -7.107999801635742, -7.111999988555908, -7.125100135803223, -7.150100231170654, -7.1504998207092285, -7.16379976272583, -7.183000087738037, -5.0954999923706055, -6.145999908447266, -5.829899787902832, -6.146999835968018, -6.287600040435791, -5.656300067901611, -6.222400188446045, -5.499899864196777, -6.05810022354126, -6.175099849700928, -6.523399829864502, -6.176700115203857, -5.816299915313721, -6.7428998947143555, -6.06220006942749, -5.412899971008301, -5.721799850463867, -4.644899845123291, -5.347899913787842, -4.7179999351501465, -5.152400016784668, -5.967599868774414, -5.999100208282471, -5.628600120544434, -5.627799987792969, -5.966800212860107, -5.143700122833252, -5.252600193023682, -5.252600193023682, -5.163899898529053, -5.8053998947143555, -5.447700023651123, -5.619100093841553, -5.710599899291992, -5.69189977645874, -5.749000072479248, -5.70359992980957, -5.710599899291992, -5.674900054931641, -5.8471999168396, -5.911399841308594, -5.9029998779296875, -4.351600170135498, -5.3572998046875, -5.516900062561035, -5.445400238037109, -5.866499900817871, -5.999599933624268, -6.178400039672852, -6.39169979095459, -6.408699989318848, -6.450099945068359, -4.750800132751465, -6.572500228881836, -6.60129976272583, -6.676599979400635, -6.698999881744385, -6.645400047302246, -6.8256001472473145, -6.853000164031982, -6.371300220489502, -6.9558000564575195, -6.956299781799316, -6.978799819946289, -6.988800048828125, -7.013700008392334, -6.946000099182129, -7.128799915313721, -7.146599769592285, -7.2179999351501465, -7.229000091552734, -7.287799835205078, -4.95959997177124, -4.533999919891357, -5.435999870300293, -6.94350004196167, -6.648799896240234, -5.456600189208984, -4.546800136566162, -5.6230998039245605, -6.371500015258789, -6.284299850463867, -4.621500015258789, -4.631499767303467, -5.618000030517578, -5.259300231933594, -5.611199855804443, -5.697000026702881, -5.560400009155273, -5.549799919128418, -5.781899929046631, -5.357699871063232, -5.821599960327148, -5.603300094604492, -5.048399925231934, -5.6143999099731445, -5.34499979019165, -5.15939998626709, -5.414700031280518, -5.561200141906738, -5.336999893188477, -5.3649001121521, -5.582699775695801, -5.557499885559082, -5.554999828338623, -5.589600086212158, -5.306000232696533, -5.590199947357178, -6.189599990844727, -6.274400234222412, -6.389599800109863, -6.389500141143799, -6.435200214385986, -6.504300117492676, -6.507500171661377, -6.6519999504089355, -6.760200023651123, -6.632599830627441, -6.781199932098389, -6.806099891662598, -6.833499908447266, -6.872200012207031, -6.879899978637695, -6.9542999267578125, -6.990300178527832, -6.370100021362305, -6.994999885559082, -6.997000217437744, -5.59689998626709, -7.023399829864502, -7.023399829864502, -7.025400161743164, -7.065000057220459, -7.035699844360352, -7.0879998207092285, -7.124899864196777, -6.369200229644775, -5.4944000244140625, -5.081399917602539, -5.257400035858154, -5.519999980926514, -6.0345001220703125, -5.214099884033203, -6.502200126647949, -6.671199798583984, -6.0482001304626465, -6.612400054931641, -6.098800182342529, -5.285799980163574, -5.903200149536133, -5.553400039672852, -5.670000076293945, -5.394599914550781, -6.484300136566162, -5.22599983215332, -6.290200233459473, -5.123600006103516, -5.187600135803223, -4.965199947357178, -5.832200050354004, -5.899400234222412, -5.825500011444092, -5.028299808502197, -5.555200099945068, -6.0192999839782715, -5.151199817657471, -5.456500053405762, -5.453000068664551, -5.76200008392334, -5.762700080871582, -5.408999919891357, -5.3933000564575195, -5.599400043487549, -5.662700176239014, -5.7164998054504395, -5.688399791717529, -5.706200122833252, -5.737599849700928, -4.496799945831299, -4.617499828338623, -5.374000072479248, -5.655700206756592, -5.768099784851074, -5.807300090789795, -5.857600212097168, -5.942200183868408, -6.054900169372559, -6.128300189971924, -6.153299808502197, -6.173099994659424, -6.179500102996826, -6.234899997711182, -6.258200168609619, -6.203199863433838, -6.280900001525879, -6.3358001708984375, -6.345300197601318, -6.419400215148926, -6.450300216674805, -6.476099967956543, -6.50439977645874, -6.50600004196167, -6.509799957275391, -6.446499824523926, -6.600800037384033, -6.6890997886657715, -6.702099800109863, -6.729800224304199, -5.840000152587891, -6.20389986038208, -4.364299774169922, -6.039400100708008, -3.9937000274658203, -6.145199775695801, -5.97130012512207, -5.824900150299072, -6.168600082397461, -4.063600063323975, -4.401299953460693, -5.480899810791016, -4.791800022125244, -5.240699768066406, -5.105299949645996, -5.286499977111816, -5.36359977722168, -5.348800182342529, -5.300000190734863, -5.866099834442139, -5.378200054168701, -5.480899810791016, -5.417900085449219, -5.409200191497803, -4.829100131988525, -5.538000106811523, -5.578700065612793, -5.704500198364258, -5.638400077819824, -5.4253997802734375, -5.345900058746338, -5.65749979019165, -5.737199783325195]}, \"token.table\": {\"Topic\": [1, 2, 3, 4, 5, 6, 8, 9, 10, 3, 4, 5, 6, 7, 8, 4, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 1, 3, 5, 8, 1, 2, 3, 5, 8, 1, 5, 8, 9, 5, 3, 8, 7, 4, 1, 2, 5, 6, 7, 8, 9, 10, 2, 3, 4, 5, 6, 7, 8, 10, 3, 8, 1, 6, 9, 2, 4, 5, 2, 3, 4, 5, 8, 1, 10, 1, 3, 4, 8, 1, 1, 2, 3, 5, 6, 7, 8, 9, 1, 6, 8, 9, 10, 1, 1, 1, 3, 5, 6, 6, 2, 2, 2, 1, 2, 6, 8, 9, 10, 5, 1, 2, 3, 4, 8, 2, 3, 4, 5, 6, 7, 3, 5, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 1, 1, 1, 3, 9, 4, 5, 7, 1, 3, 4, 5, 6, 7, 8, 9, 10, 7, 10, 7, 1, 8, 6, 7, 1, 2, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 1, 3, 7, 8, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 2, 2, 5, 6, 2, 5, 3, 4, 4, 9, 7, 1, 3, 4, 5, 7, 8, 9, 10, 10, 8, 1, 2, 3, 4, 5, 6, 7, 9, 6, 5, 6, 7, 10, 10, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 1, 4, 5, 6, 7, 3, 4, 8, 4, 6, 4, 5, 1, 3, 4, 5, 6, 7, 8, 9, 10, 8, 9, 9, 10, 5, 6, 4, 6, 7, 8, 10, 9, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 9, 7, 2, 1, 2, 3, 4, 5, 6, 7, 8, 9, 6, 4, 4, 9, 1, 2, 3, 5, 8, 9, 4, 7, 8, 9, 1, 2, 1, 2, 1, 2, 5, 4, 8, 3, 4, 7, 8, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 8, 1, 2, 3, 8, 10, 6, 7, 10, 3, 4, 4, 9, 1, 5, 6, 8, 7, 8, 7, 10, 2, 3, 4, 6, 7, 8, 1, 2, 3, 4, 7, 10, 2, 3, 4, 5, 6, 7, 8, 10, 1, 4, 6, 7, 10, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 2, 3, 4, 5, 6, 7, 8, 9, 3, 4, 7, 9, 6, 4, 2, 9, 10, 3, 1, 3, 4, 5, 6, 7, 8, 9, 10, 1, 2, 3, 4, 6, 7, 8, 3, 1, 3, 4, 5, 6, 7, 8, 9, 6, 1, 4, 5, 6, 8, 9, 10, 1, 2, 6, 8, 10, 1, 6, 8, 8, 8, 8, 8, 4, 7, 10, 9, 2, 6, 2, 3, 4, 6, 7, 8, 9, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 1, 4, 6, 8, 1, 2, 4, 6, 9, 10, 8, 8, 5, 1, 2, 3, 4, 5, 6, 7, 8, 9, 3, 10, 3, 4, 7, 8, 4, 9, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 3, 3, 4, 8, 9, 3, 4, 8, 1, 2, 3, 4, 5, 9, 10, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 2, 1, 3, 4, 5, 6, 7, 8, 9, 10, 5, 1, 6, 9, 2, 7, 1, 2, 4, 5, 6, 7, 9, 10, 4, 5, 6, 8, 10, 3, 5, 9, 1, 7, 9, 1, 2, 3, 5, 7, 9, 10, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 9, 4, 1, 2, 3, 4, 5, 6, 7, 10, 8, 1, 2, 6, 8, 10, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 5, 3, 4, 8, 10, 8, 4, 10, 1, 2, 9, 3, 4, 1, 1, 2, 6, 8, 9, 10, 1, 2, 3, 4, 5, 7, 8, 9, 10, 1, 2, 7, 8, 1, 5, 6, 8, 1, 3, 4, 8, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 6, 6, 1, 3, 5, 9, 3, 4, 5, 10, 7, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 3, 4, 1, 2, 5, 9, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 2, 3, 4, 8, 9, 2, 6, 10, 6, 9, 1, 2, 3, 4, 8, 9, 5, 6, 8, 9, 10, 2, 4, 7, 10, 7, 10, 7, 9, 1, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 1, 2, 3, 5, 8, 10, 2, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 4, 9, 2, 1, 5, 6, 8, 3, 3, 4, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 1, 3, 1, 2, 3, 1, 2, 5, 6, 7, 8, 9, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 8, 1, 6, 9, 5, 8, 3, 6, 8, 6, 7, 9, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 1, 2, 4, 5, 6, 7, 8, 9, 10, 6, 1, 5, 8, 9, 1, 2, 5, 7, 5, 6, 7, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 5, 10, 7, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 1, 5, 6, 7, 9, 1, 7, 10, 1, 2, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 9, 8, 6, 7, 6, 5, 1, 6, 6, 1, 2, 3, 4, 5, 6, 7, 9, 1, 2, 3, 4, 8, 6, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 2, 3, 4, 7, 8, 9, 9, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 7, 9, 10, 7, 3, 4, 5, 7, 8, 5, 6, 9, 10, 9, 4, 2, 3, 4, 6, 7, 8, 9, 10, 5, 8, 1, 1, 2, 10, 1, 2, 10, 2, 10, 2, 4, 7, 9, 7, 2, 4, 5, 6, 7, 9, 10, 2, 5, 10, 1, 2, 10, 3, 5, 6, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 4, 7, 5, 3, 3, 8, 1, 2, 3, 6, 7, 9, 10, 1, 7, 3, 7, 5, 3, 5, 10, 10, 7, 10, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 10, 10, 1, 2, 3, 4, 6, 7, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 1, 2, 5, 6, 7, 8, 9, 10, 2, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 7, 1, 2, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 1, 2, 4, 5, 6, 7, 9, 10, 3, 5, 8, 1, 3, 4, 5, 6, 8, 9, 10, 3, 6, 2, 3, 4, 6, 7, 8, 9, 10, 3, 4, 3, 5, 1, 2, 1, 4, 10, 5, 3, 4, 10, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 1, 3, 7, 8, 9, 1, 4, 8, 9, 4, 1, 2, 3, 4, 5, 7, 10, 1, 2, 3, 4, 5, 6, 7, 8, 10, 7, 1, 5, 7, 9, 9, 2, 4, 6, 9, 1, 8, 1, 2, 3, 5, 5, 2, 3, 4, 7, 8, 9, 3, 4, 8, 1, 2, 4, 5, 6, 8, 9, 10, 4, 5, 8, 4, 10, 2, 3, 5, 1, 2, 1, 4, 3, 6, 1, 3, 4, 1, 2, 6, 1, 2, 3, 5, 7, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 1, 8, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 2, 4, 6, 7, 8, 9, 3, 8, 7, 5, 4, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 3, 6, 8, 3, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 10, 5, 3, 5, 6, 7, 3, 4, 8, 1, 3, 4, 5, 6, 7, 10, 1, 2, 4, 7, 9, 10, 2, 8, 9, 2, 9, 10, 10, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 1, 2, 3, 5, 6, 7, 8, 9, 10, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 1, 2, 3, 4, 6, 7, 8, 9, 6, 9, 6, 5, 7, 7, 7, 9, 10, 8, 9, 10, 3, 1, 2, 4, 5, 6, 7, 8, 10, 7, 10, 10, 5, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 1, 2, 5, 6, 8, 10, 3, 1, 8, 9, 10, 3, 4, 8, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 4, 1, 5, 8, 10, 1, 2, 3, 4, 5, 6, 7, 1, 2, 3, 9, 3, 4, 7, 1, 8, 1, 2, 3, 4, 5, 6, 8, 3, 5, 6, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 2, 3, 4, 5, 8, 9, 3, 5, 7, 8, 9, 2, 2, 2, 3, 5, 8, 9, 10, 1, 3, 4, 5, 6, 7, 8, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 3, 4, 8, 10, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 3, 5, 10, 6, 5, 10, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 3, 8, 5, 3, 1, 2, 1, 2, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 1, 2, 3, 4, 5, 9, 7, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 2, 2, 7, 5, 6, 5, 6, 6, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 8, 1, 3, 5, 6, 7, 8, 9, 6, 1, 3, 5, 6, 7, 9, 10, 9, 1, 2, 4, 9, 10, 7, 5, 1, 2, 3, 4, 5, 6, 7, 10, 2, 7, 8, 2, 3, 4, 5, 6, 7, 2, 2, 3, 5, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 2, 3, 4, 8, 9, 2, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 2, 3, 5, 8, 9, 7, 10, 1, 2, 3, 4, 7, 9, 10, 3, 4, 8, 10, 2, 4, 1, 7, 7, 10, 1, 7, 8, 1, 6, 8, 10, 10, 1, 3, 4, 5, 6, 7, 8, 10, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 1, 1, 3, 4, 5, 1, 6, 10, 6, 3, 5, 4, 2, 2, 9, 3, 1, 1, 9, 10, 1, 2, 3, 4, 5, 6, 7, 10, 6, 2, 3, 4, 5, 6, 7, 8, 9, 10, 3, 5, 10, 1, 10, 2, 1, 2, 3, 4, 5, 7, 8, 9, 10, 1, 3, 4, 5, 8, 3, 5, 4, 5, 7, 4, 5, 6, 7, 8, 5, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 9, 1, 2, 5, 5, 1, 3, 4, 5, 6, 7, 8, 10, 3, 7, 10, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 7, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 1, 3, 4, 5, 6, 7, 8, 10, 8, 2, 3, 4, 6, 7, 8, 9, 10, 9, 5, 9, 8, 1, 2, 3, 5, 6, 8, 9, 10, 3, 9, 8, 4, 4, 9, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 8, 1, 2, 3, 5, 6, 3, 5, 7, 8, 10, 1, 2, 3, 4, 5, 6, 7, 8, 9, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 6, 2, 3, 4, 5, 6, 7, 8, 9, 2, 1, 2, 3, 4, 5, 6, 7, 9, 10, 2, 5, 2, 1, 2, 3, 6, 8, 9, 9, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 6, 4, 7, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 4, 5, 6, 7, 10, 3, 3, 4, 5, 7, 10, 1, 9, 1, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 6, 1, 2, 6, 9, 10, 1, 1, 1, 3, 2, 6, 7, 5, 7, 1, 2, 3, 4, 5, 6, 7, 9, 2, 4, 7, 5, 3, 4, 1, 4, 6, 7, 3, 4, 6, 8, 3, 6, 10, 6, 1, 5, 6, 8, 2, 1, 2, 3, 4, 5, 6, 7, 8, 10, 4, 8, 1, 3, 4, 8, 1, 10, 2, 3, 5, 6, 7, 8, 10, 3, 7, 7, 4, 1, 6, 6, 7, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 1, 2, 5, 7, 9, 1, 6, 7, 3, 5, 3, 1, 3, 4, 1, 5, 8, 9, 10, 5, 10, 3, 5, 7, 8, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 1, 2, 3, 3, 3, 3, 6, 7, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 9, 5, 1], \"Freq\": [0.14599277079105377, 0.5233890414237976, 0.1291092485189438, 0.04965740442276001, 0.007945184595882893, 0.0228424072265625, 0.06554777175188065, 0.034760184586048126, 0.018869813531637192, 0.40388476848602295, 0.19605383276939392, 0.17180688679218292, 0.03325294703245163, 0.0006927697104401886, 0.19328275322914124, 0.9846031665802002, 0.05245577171444893, 0.07400010526180267, 0.536734938621521, 0.18265849351882935, 0.030911436304450035, 0.026227885857224464, 0.03278485685586929, 0.04964563995599747, 0.005620261188596487, 0.008430391550064087, 0.12412907183170319, 0.06308198720216751, 0.19738557934761047, 0.6145406365394592, 0.07897412776947021, 0.027873219922184944, 0.006968304980546236, 0.12775225937366486, 0.7548997402191162, 0.03866958990693092, 0.08217287808656693, 0.004833698738366365, 0.8700657486915588, 0.9959776997566223, 0.3871699571609497, 0.611616313457489, 0.9911239147186279, 0.9901931881904602, 0.339741975069046, 0.014491363428533077, 0.09419386088848114, 0.10063447058200836, 0.004025378730148077, 0.20287908613681793, 0.03300810605287552, 0.21092984080314636, 0.1255313754081726, 0.1266830414533615, 0.06334152072668076, 0.012668304145336151, 0.1739012748003006, 0.03685325011610985, 0.0737065002322197, 0.38695910573005676, 0.9024494886398315, 0.09523336589336395, 0.7508983612060547, 0.053179770708084106, 0.19357436895370483, 0.2244643270969391, 0.7725219130516052, 0.0022788257338106632, 0.025178419426083565, 0.7350161671638489, 0.18786974251270294, 0.011620808392763138, 0.03970443084836006, 0.34418392181396484, 0.6551724076271057, 0.04772055149078369, 0.8044321537017822, 0.03408610820770264, 0.11362035572528839, 0.9980550408363342, 0.061342693865299225, 0.7078946828842163, 0.060115836560726166, 0.01104168500751257, 0.056435275822877884, 0.01349539216607809, 0.01226853858679533, 0.07729179412126541, 0.8129921555519104, 0.14957647025585175, 0.01583750918507576, 0.012318062596023083, 0.007038893178105354, 0.9972012639045715, 0.9993999600410461, 0.8530754446983337, 0.08814063668251038, 0.006295759696513414, 0.050366077572107315, 0.9841410517692566, 0.9973456859588623, 0.9993276596069336, 0.9964157342910767, 0.6340733766555786, 0.02204345166683197, 0.04279023036360741, 0.24118128418922424, 0.03241683915257454, 0.027230145409703255, 0.9963906407356262, 0.14441119134426117, 0.3110394775867462, 0.18713639676570892, 0.061524294316768646, 0.2956584095954895, 0.03075864166021347, 0.016777440905570984, 0.01957368105649948, 0.008388720452785492, 0.897593080997467, 0.025166161358356476, 0.9902084469795227, 0.9816920757293701, 0.00179692218080163, 0.020964091643691063, 0.6175422668457031, 0.1185968667268753, 0.025156911462545395, 0.027552807703614235, 0.00419281842187047, 0.14075890183448792, 0.03174562379717827, 0.012578455731272697, 0.9970781207084656, 0.991834282875061, 0.9971475005149841, 0.9912530779838562, 0.985652506351471, 0.023296672850847244, 0.15142837166786194, 0.8231490850448608, 0.0036856913939118385, 0.012899919413030148, 0.027642685920000076, 0.0202713031321764, 0.007371382787823677, 0.005528537090867758, 0.10319935530424118, 0.750038206577301, 0.06818529218435287, 0.8324562311172485, 0.16555851697921753, 0.9908235669136047, 0.9822887778282166, 0.01671980880200863, 0.05610562115907669, 0.9408481121063232, 0.013237693347036839, 0.9845534563064575, 0.09291166812181473, 0.5883104205131531, 0.0011711554834619164, 0.030840428546071053, 0.05075007304549217, 0.05933854356408119, 0.04801737517118454, 0.04333275184035301, 0.07065971195697784, 0.014053866267204285, 0.009513046592473984, 0.16172178089618683, 0.7933880686759949, 0.03424696624279022, 0.007427247706800699, 0.13071955740451813, 0.0675879493355751, 0.1819675713777542, 0.03936441242694855, 0.10546691715717316, 0.2413855493068695, 0.0193108431994915, 0.07501520216464996, 0.13294772803783417, 0.044248517602682114, 0.11702568829059601, 0.02328869327902794, 0.16127420961856842, 0.1094568595290184, 0.1676785945892334, 0.19795389473438263, 0.022706476971507072, 0.06287947297096252, 0.09315477311611176, 0.9988299608230591, 0.9976599216461182, 0.0013370970264077187, 0.9974744319915771, 0.06177558749914169, 0.9339015483856201, 0.9674123525619507, 0.02764035202562809, 0.9971478581428528, 0.9819605946540833, 0.9899508953094482, 0.030462924391031265, 0.0913887768983841, 0.7326333522796631, 0.048740681260824203, 0.01675460860133171, 0.007615731097757816, 0.012185170315206051, 0.0594027042388916, 0.9949178695678711, 0.9896720051765442, 0.10203135758638382, 0.3764605224132538, 0.37153488397598267, 0.00492565194144845, 0.0014073291094973683, 0.024628259241580963, 0.07318111509084702, 0.04644186049699783, 0.9910803437232971, 0.05556785315275192, 0.9390967488288879, 0.9451965093612671, 0.054721903055906296, 0.9886062741279602, 0.18599478900432587, 0.017521247267723083, 0.20149435102939606, 0.2715793251991272, 0.2008204460144043, 0.013477882370352745, 0.06671551614999771, 0.03571638837456703, 0.0006738941301591694, 0.007412835489958525, 0.01812021993100643, 0.408528596162796, 0.023062098771333694, 0.5271337032318115, 0.023062098771333694, 0.04738995060324669, 0.8909310698509216, 0.056867942214012146, 0.99643874168396, 0.9898231625556946, 0.9916720390319824, 0.9953881502151489, 0.005461225751787424, 0.13243472576141357, 0.04505511373281479, 0.046420421451330185, 0.2047959715127945, 0.13789595663547516, 0.02867143601179123, 0.010922451503574848, 0.38774704933166504, 0.06209086626768112, 0.9313629865646362, 0.9909238219261169, 0.9858328700065613, 0.0370786115527153, 0.9619839787483215, 0.8973691463470459, 0.03992532193660736, 0.04689640924334526, 0.005703617352992296, 0.00887229386717081, 0.9923086762428284, 0.09889670461416245, 0.1410106122493744, 0.05015813559293747, 0.1334395706653595, 0.02886458858847618, 0.20678400993347168, 0.02886458858847618, 0.12918086349964142, 0.1627773493528366, 0.019873978570103645, 0.9937857985496521, 0.9958334565162659, 0.996943473815918, 0.1216258630156517, 0.17698660492897034, 0.045295149087905884, 0.08555750548839569, 0.02432517148554325, 0.09478428959846497, 0.04110115393996239, 0.009226789698004723, 0.4009459316730499, 0.9868890643119812, 0.9969602227210999, 0.9897100329399109, 0.9941675662994385, 0.677937924861908, 0.1326664835214615, 0.02312535233795643, 0.007302742451429367, 0.03773083537817001, 0.1204952523112297, 0.3486194610595703, 0.004738516639918089, 0.6464690566062927, 0.988552987575531, 0.0016638204688206315, 0.99662846326828, 0.013513145036995411, 0.9859398603439331, 0.0026862570084631443, 0.9858563542366028, 0.009401899762451649, 0.9923655986785889, 0.9946200847625732, 0.989805281162262, 0.04953533783555031, 0.9287875890731812, 0.021671710535883904, 0.23079544305801392, 0.4995506703853607, 0.006073564291000366, 0.04631092771887779, 0.00911034643650055, 0.024294257164001465, 0.01973908394575119, 0.05238449200987816, 0.08199311792850494, 0.029608625918626785, 0.9904960989952087, 0.01607571542263031, 0.03215143084526062, 0.008037857711315155, 0.9404293298721313, 0.997140645980835, 0.8349259495735168, 0.03578253835439682, 0.1272268146276474, 0.9408413767814636, 0.05612974241375923, 0.0071846735663712025, 0.9843003153800964, 0.12218707799911499, 0.3213067650794983, 0.027152683585882187, 0.5279688239097595, 0.006376017350703478, 0.9933834671974182, 0.049458786845207214, 0.9496087431907654, 0.047002773731946945, 0.6893740296363831, 0.03916897997260094, 0.0019584489054977894, 0.007833795621991158, 0.2134709358215332, 0.0193931944668293, 0.003062083153054118, 0.16433179378509521, 0.7624587416648865, 0.04797263815999031, 0.003062083153054118, 0.02497788891196251, 0.014050062745809555, 0.02653900720179081, 0.014050062745809555, 0.27007344365119934, 0.5214134454727173, 0.11708385497331619, 0.012488944455981255, 0.08583952486515045, 0.1502191573381424, 0.0071532935835421085, 0.04470808431506157, 0.711752712726593, 0.2507212460041046, 0.22157453000545502, 0.014573357999324799, 0.11628945171833038, 0.07137971371412277, 0.06989263743162155, 0.13056538999080658, 0.03212087228894234, 0.04104333743453026, 0.0514528788626194, 0.010484830476343632, 0.19527997076511383, 0.12319675832986832, 0.07863622903823853, 0.011795434169471264, 0.146787628531456, 0.4298780560493469, 0.001310603809542954, 0.8896723985671997, 0.08087930828332901, 0.008366825059056282, 0.019522590562701225, 0.977303683757782, 0.9920732378959656, 0.9853165745735168, 0.007978271692991257, 0.003989135846495628, 0.9936932921409607, 0.14128343760967255, 0.02913627400994301, 0.4518871307373047, 0.04947669059038162, 0.1335870623588562, 0.010994820855557919, 0.11489587277173996, 0.06212073564529419, 0.007696374319493771, 0.011459052562713623, 0.05500345304608345, 0.5695149302482605, 0.21772199869155884, 0.06990022212266922, 0.01031314767897129, 0.06531660258769989, 0.9912104606628418, 0.009855405427515507, 0.06208905577659607, 0.14191783964633942, 0.5105100274085999, 0.18232500553131104, 0.03153729811310768, 0.030551757663488388, 0.03153729811310768, 0.9839151501655579, 0.7062051892280579, 0.005525862332433462, 0.075151726603508, 0.1193586215376854, 0.075151726603508, 0.001105172443203628, 0.018787931650877, 0.2933255136013031, 0.04784742370247841, 0.10401614010334015, 0.5554461479187012, 0.9976659417152405, 0.3253612518310547, 0.5731831192970276, 0.10034505277872086, 0.9918471574783325, 0.9958798289299011, 0.9921985268592834, 0.996331512928009, 0.9902531504631042, 0.9943678975105286, 0.9963338971138, 0.9940438866615295, 0.11340337246656418, 0.8845463395118713, 0.0030282640364021063, 0.4754374623298645, 0.26406463980674744, 0.01635262556374073, 0.0042395698837935925, 0.21076717972755432, 0.02604307048022747, 0.10128828883171082, 0.11214060336351395, 0.11756675690412521, 0.07717202603816986, 0.001205812906846404, 0.1917242556810379, 0.20739983022212982, 0.08802434056997299, 0.06812842935323715, 0.03557148203253746, 0.9976046681404114, 0.11456617712974548, 0.7665022611618042, 0.12002170830965042, 0.5816272497177124, 0.2825830578804016, 0.013717624358832836, 0.09327984601259232, 0.02469172328710556, 0.004115287214517593, 0.9915045499801636, 0.9917834401130676, 0.9875321984291077, 0.00699492497369647, 0.0029978249222040176, 0.24482236802577972, 0.12191154807806015, 0.29578539729118347, 0.11291807144880295, 0.044967375695705414, 0.12990574538707733, 0.03897172585129738, 0.9954027533531189, 0.9975415468215942, 0.009578007273375988, 0.47479552030563354, 0.061572905629873276, 0.45427119731903076, 0.9948511719703674, 0.992047905921936, 0.04472225159406662, 0.2554924786090851, 0.0859021469950676, 0.18685930967330933, 0.07793184369802475, 0.13460955023765564, 0.03143841400742531, 0.04250828176736832, 0.11689776927232742, 0.02302531898021698, 0.9797205924987793, 0.767796516418457, 0.20836955308914185, 0.02264886535704136, 0.9965404272079468, 0.01270527858287096, 0.9489865899085999, 0.03713850677013397, 0.011915587820112705, 0.013107147067785263, 0.6053118705749512, 0.3467436134815216, 0.010724029503762722, 0.0011915587820112705, 0.010724029503762722, 0.0513325035572052, 0.014807452447712421, 0.2053300142288208, 0.1796637624502182, 0.05429399386048317, 0.1451130360364914, 0.1757151037454605, 0.10299406200647354, 0.049358174204826355, 0.021388541907072067, 0.9929736256599426, 0.005768895614892244, 0.08797565847635269, 0.012980015017092228, 0.01586446352303028, 0.1543179601430893, 0.18604688346385956, 0.09518677741289139, 0.01586446352303028, 0.42545607686042786, 0.9891993999481201, 0.13151773810386658, 0.0026840355712920427, 0.8642594814300537, 0.994596004486084, 0.9892116785049438, 0.0337333120405674, 0.006064415909349918, 0.7466812133789062, 0.015161039307713509, 0.18534371256828308, 0.010991753078997135, 0.0007580519886687398, 0.0011370779247954488, 0.7883397936820984, 0.004197762347757816, 0.19729484617710114, 0.004197762347757816, 0.005876867566257715, 0.004379556514322758, 0.9941593408584595, 0.9937857985496521, 0.03518718108534813, 0.9632490873336792, 0.9963637590408325, 0.002751182531937957, 0.29987889528274536, 0.09078902006149292, 0.6052601337432861, 0.0013755912659689784, 0.0013755912659689784, 0.9969372153282166, 0.042788878083229065, 0.06828012317419052, 0.05462409928441048, 0.022760041058063507, 0.07192172855138779, 0.0782945454120636, 0.06463851779699326, 0.18116992712020874, 0.408770352602005, 0.008193614892661572, 0.9924702644348145, 0.9913032054901123, 0.0025874855928122997, 0.007762456778436899, 0.5847717523574829, 0.2613360285758972, 0.0008624952170066535, 0.05519969388842583, 0.07331208884716034, 0.013799923472106457, 0.9995120763778687, 0.03260944411158562, 0.011646230705082417, 0.01630472205579281, 0.9130644798278809, 0.025621706619858742, 0.006279796827584505, 0.027910208329558372, 0.10187225788831711, 0.2023490071296692, 0.2979414761066437, 0.24491208791732788, 0.037678781896829605, 0.039772048592567444, 0.016746126115322113, 0.02511918731033802, 0.9942708015441895, 0.15898235142230988, 0.837565541267395, 0.0025850788224488497, 0.9930786490440369, 0.9989667534828186, 0.9820688366889954, 0.994400143623352, 0.014143766835331917, 0.9087370038032532, 0.07425477355718613, 0.9898928999900818, 0.9895271062850952, 0.9944542050361633, 0.09428336471319199, 0.6226845979690552, 0.010360809043049812, 0.03833499178290367, 0.2289738804101944, 0.0041443235240876675, 0.15295802056789398, 0.581828773021698, 0.06883110851049423, 0.07236091047525406, 0.029415003955364227, 0.0011766002280637622, 0.04294590651988983, 0.04412250593304634, 0.0070596011355519295, 0.9937053918838501, 0.9774035215377808, 0.021789249032735825, 0.988694965839386, 0.2148161381483078, 0.08932948112487793, 0.10421773046255112, 0.5912761092185974, 0.007281071972101927, 0.5405329465866089, 0.3890172839164734, 0.06275590509176254, 0.12770269811153412, 0.08756756037473679, 0.058378372341394424, 0.11310809850692749, 0.13135133683681488, 0.0121621610596776, 0.08999999612569809, 0.025540538132190704, 0.030405402183532715, 0.32472971081733704, 0.9981328248977661, 0.9870069622993469, 0.031673677265644073, 0.09502103179693222, 0.8094384074211121, 0.05982805788516998, 0.01888325624167919, 0.978782057762146, 0.006506085861474276, 0.9889250993728638, 0.9961147308349609, 0.11995471268892288, 0.3064922094345093, 0.22458481788635254, 0.1421489715576172, 0.029063917696475983, 0.03117765672504902, 0.030649220570921898, 0.054428789764642715, 0.02853548154234886, 0.033819831907749176, 0.9653185606002808, 0.03121122345328331, 0.09273429214954376, 0.022710438817739487, 0.05488356202840805, 0.8270385265350342, 0.49648597836494446, 0.04393681138753891, 0.03514945134520531, 0.005492101423442364, 0.14718832075595856, 0.03954312950372696, 0.04723207280039787, 0.10215308517217636, 0.04723207280039787, 0.03514945134520531, 0.005432780832052231, 0.665515661239624, 0.29744476079940796, 0.008149171248078346, 0.021731123328208923, 0.11879028379917145, 0.6470279693603516, 0.23252566158771515, 0.982373058795929, 0.012128062546253204, 0.037575263530015945, 0.037575263530015945, 0.6821355819702148, 0.121397003531456, 0.060698501765728, 0.060698501765728, 0.7771496176719666, 0.011328712105751038, 0.18579088151454926, 0.022657424211502075, 0.0022657422814518213, 0.010307654738426208, 0.020099926739931107, 0.30407580733299255, 0.6648436784744263, 0.9967759251594543, 0.9954435229301453, 0.05245886743068695, 0.9442595839500427, 0.9982324242591858, 0.24753481149673462, 0.07662469893693924, 0.0008545505115762353, 0.08630960434675217, 0.18600717186927795, 0.1310310810804367, 0.1521099954843521, 0.027060767635703087, 0.02335771545767784, 0.06893374025821686, 0.005418969783931971, 0.16618172824382782, 0.012644262053072453, 0.12463629990816116, 0.061414990574121475, 0.626794159412384, 0.9936252236366272, 0.028499040752649307, 0.1773865520954132, 0.049540385603904724, 0.08203461766242981, 0.065254807472229, 0.19682981073856354, 0.2426413595676422, 0.04927404224872589, 0.05486730858683586, 0.053801923990249634, 0.06766297668218613, 0.9303659796714783, 0.9942028522491455, 0.47864019870758057, 0.06759040057659149, 0.014018750749528408, 0.43908730149269104, 0.9757900834083557, 0.7745684385299683, 0.2246912121772766, 0.07066923379898071, 0.13031665980815887, 0.06418582051992416, 0.13355837762355804, 0.09530621767044067, 0.1452285200357437, 0.18088731169700623, 0.022043615579605103, 0.056405723094940186, 0.1011412963271141, 0.9622331261634827, 0.03391129896044731, 0.9284623861312866, 0.06954774260520935, 0.9823116660118103, 0.07761090248823166, 0.054537393152713776, 0.19927124679088593, 0.018878327682614326, 0.6376680135726929, 0.004195183981209993, 0.006292776204645634, 0.15075568854808807, 0.19674895703792572, 0.26113951206207275, 0.06490160524845123, 0.07410025596618652, 0.09811896085739136, 0.01226487010717392, 0.08840927481651306, 0.032195284962654114, 0.020952485501766205, 0.9876848459243774, 0.09004253149032593, 0.9090832471847534, 0.9924943447113037, 0.9874857068061829, 0.9912837147712708, 0.9900286793708801, 0.8910292983055115, 0.10725352168083191, 0.04387596622109413, 0.051188625395298004, 0.8994572758674622, 0.3898763358592987, 0.08292146027088165, 0.002909524831920862, 0.09746908396482468, 0.06110002100467682, 0.12801909446716309, 0.09019526839256287, 0.05091668665409088, 0.06255478411912918, 0.03273215517401695, 0.0661003515124321, 0.1192680299282074, 0.4397110342979431, 0.06538186967372894, 0.14944428205490112, 0.017962053418159485, 0.021554462611675262, 0.05747856944799423, 0.06466338783502579, 0.9842679500579834, 0.016517192125320435, 0.20187680423259735, 0.11011461913585663, 0.6698639392852783, 0.02432498335838318, 0.9451993107795715, 0.003474997589364648, 0.02432498335838318, 0.8504248857498169, 0.10691055655479431, 0.03887656703591347, 0.1204923540353775, 0.04726025089621544, 0.20181404054164886, 0.31719717383384705, 0.0540725402534008, 0.055775612592697144, 0.06727135181427002, 0.03278413787484169, 0.09281743317842484, 0.010644201189279556, 0.9708878397941589, 0.025624606758356094, 0.9893497824668884, 0.020420510321855545, 0.04413465037941933, 0.05138063803315163, 0.18707822263240814, 0.241752490401268, 0.1086898148059845, 0.09551528841257095, 0.11066599190235138, 0.11000726372003555, 0.03096012957394123, 0.03080577962100506, 0.017603302374482155, 0.04400825500488281, 0.8889667987823486, 0.013202477246522903, 0.9941993951797485, 0.9913306832313538, 0.9993233680725098, 0.056550782173871994, 0.9401567578315735, 0.2726779580116272, 0.003909361083060503, 0.06548180431127548, 0.07330052554607391, 0.019546806812286377, 0.10555275529623032, 0.35868388414382935, 0.023456167429685593, 0.002932020928710699, 0.074277862906456, 0.991647481918335, 0.9933046698570251, 0.9934691190719604, 0.9942363500595093, 0.9869003295898438, 0.9914559721946716, 0.19970963895320892, 0.7988385558128357, 0.9790177941322327, 0.011327564716339111, 0.022655129432678223, 0.022655129432678223, 0.07929295301437378, 0.008495673537254333, 0.7306279540061951, 0.12177132070064545, 0.002831891179084778, 0.00934118777513504, 0.019400928169488907, 0.8945983052253723, 0.07041817903518677, 0.00574842281639576, 0.9887343645095825, 0.08462303131818771, 0.05847546458244324, 0.4787381589412689, 0.13739357888698578, 0.0404098741710186, 0.029475437477231026, 0.03422953933477402, 0.06227874755859375, 0.0370820015668869, 0.0370820015668869, 0.005477050319314003, 0.021908201277256012, 0.1341877281665802, 0.6517689824104309, 0.16978855431079865, 0.013692625798285007, 0.9944437146186829, 0.05208912864327431, 0.029962772503495216, 0.48816272616386414, 0.0792861059308052, 0.00046096573350951076, 0.02673601172864437, 0.014289937913417816, 0.2383192777633667, 0.06591810286045074, 0.005070623010396957, 0.041793618351221085, 0.8823096752166748, 0.07429976761341095, 0.9889696836471558, 0.01295366883277893, 0.8186718821525574, 0.056996144354343414, 0.023316605016589165, 0.0867895856499672, 0.03642081841826439, 0.7519828081130981, 0.2013857066631317, 0.010712006129324436, 0.989499032497406, 0.9900275468826294, 0.015654398128390312, 0.5386954545974731, 0.1777234673500061, 0.05709251016378403, 0.1289185732603073, 0.03959641978144646, 0.0018416938837617636, 0.041438113898038864, 0.956125795841217, 0.034642238169908524, 0.9942362904548645, 0.20043528079986572, 0.7982853651046753, 0.9992931485176086, 0.029503511264920235, 0.03048696182668209, 0.9391950964927673, 0.9948950409889221, 0.9929196238517761, 0.05053069442510605, 0.05053069442510605, 0.8626311421394348, 0.03609335422515869, 0.9871167540550232, 0.02464824542403221, 0.10915651172399521, 0.08098708838224411, 0.017605889588594437, 0.7464897036552429, 0.007042355835437775, 0.01408471167087555, 0.9994784593582153, 0.029911385849118233, 0.9631465673446655, 0.8657009601593018, 0.10983654856681824, 0.023620761930942535, 0.003857866395264864, 0.9490351676940918, 0.04243653267621994, 0.011400311253964901, 0.22331197559833527, 0.0697430819272995, 0.07644914835691452, 0.004023639019578695, 0.1488746553659439, 0.19782893359661102, 0.06303701549768448, 0.09522613137960434, 0.10997947305440903, 0.9820893406867981, 0.017412932589650154, 0.9933030009269714, 0.9920571446418762, 0.03944803774356842, 0.9588907361030579, 0.7954779863357544, 0.004642867483198643, 0.010059546679258347, 0.14934557676315308, 0.0007738112471997738, 0.010059546679258347, 0.02940482832491398, 0.997638463973999, 0.9823446273803711, 0.08993932604789734, 0.8993932604789734, 0.9824125170707703, 0.0062460871413350105, 0.9910458326339722, 0.9939238429069519, 0.9975072741508484, 0.29065191745758057, 0.7079982757568359, 0.3073197603225708, 0.05826270580291748, 0.00768299400806427, 0.08771418035030365, 0.09987892210483551, 0.12804989516735077, 0.15558062493801117, 0.0166464876383543, 0.053140707314014435, 0.08579343557357788, 0.9964796304702759, 0.989776611328125, 0.030239975079894066, 0.004031996708363295, 0.9293752312660217, 0.0020159983541816473, 0.006047994829714298, 0.028223976492881775, 0.1430351436138153, 0.5361820459365845, 0.007990790531039238, 0.003196316072717309, 0.1318480372428894, 0.09349224716424942, 0.018378818407654762, 0.005593553185462952, 0.057533688843250275, 0.0015981580363586545, 0.03587382659316063, 0.051888927817344666, 0.591277539730072, 0.041639264672994614, 0.0012812081258744001, 0.11146511137485504, 0.05381074175238609, 0.03203020244836807, 0.0051248325034976006, 0.07559128105640411, 0.3883173167705536, 0.2538767158985138, 0.09002719819545746, 0.15784768760204315, 0.027608342468738556, 0.002400725381448865, 0.04261287674307823, 0.03661106154322624, 0.9923387765884399, 0.10636710375547409, 0.12472809106111526, 0.03482256457209587, 0.0810416042804718, 0.24059225618839264, 0.09623690694570541, 0.12282868474721909, 0.09307121485471725, 0.0734439566731453, 0.026591775938868523, 0.08147607743740082, 0.0805872455239296, 0.18221013247966766, 0.13391704857349396, 0.11673299968242645, 0.15347130596637726, 0.17628459632396698, 0.01807287521660328, 0.028442557901144028, 0.029035111889243126, 0.9883348941802979, 0.05344466120004654, 0.9451266527175903, 0.11607211828231812, 0.09041406959295273, 0.040319789201021194, 0.054981529712677, 0.045207034796476364, 0.03909797593951225, 0.37509623169898987, 0.023214424028992653, 0.05375972017645836, 0.16127915680408478, 0.057641707360744476, 0.6063464283943176, 0.031037842854857445, 0.024386875331401825, 0.19620350003242493, 0.05653321370482445, 0.011084944009780884, 0.016627416014671326, 0.007937688380479813, 0.9882422089576721, 0.9813222885131836, 0.04756404459476471, 0.21023307740688324, 0.6021608114242554, 0.0038051235023885965, 0.04756404459476471, 0.0323435515165329, 0.004756404552608728, 0.05327172949910164, 0.9908990263938904, 0.9984796643257141, 0.0164179727435112, 0.5438979864120483, 0.14986662566661835, 0.06062020733952522, 0.11366288363933563, 0.05472657456994057, 0.009261419996619225, 0.05220073461532593, 0.8966673016548157, 0.100186288356781, 0.030339591205120087, 0.9658102989196777, 0.0051825144328176975, 0.9898602962493896, 0.9964926838874817, 0.9940032958984375, 0.995389461517334, 0.9921508431434631, 0.1297713965177536, 0.02752726525068283, 0.8376153707504272, 0.10296144336462021, 0.3724781572818756, 0.030282776802778244, 0.0768425464630127, 0.0673791766166687, 0.1090179979801178, 0.06132262572646141, 0.10712532699108124, 0.04996658116579056, 0.022712083533406258, 0.057786159217357635, 0.03638387843966484, 0.002140228170901537, 0.006420684512704611, 0.8946153521537781, 0.004666417837142944, 0.03266492486000061, 0.06532984972000122, 0.8959521651268005, 0.9891890287399292, 0.03148955851793289, 0.024222739040851593, 0.03027842380106449, 0.798139214515686, 0.027856148779392242, 0.02906728722155094, 0.05934571102261543, 0.07341376692056656, 0.09762468934059143, 0.313960999250412, 0.13511256873607635, 0.03280189633369446, 0.06560379266738892, 0.0015619950136169791, 0.2647581696510315, 0.01640094816684723, 0.9913778901100159, 0.034172557294368744, 0.09112682193517685, 0.8543139696121216, 0.017086278647184372, 0.9906675815582275, 0.08192655444145203, 0.02730885148048401, 0.8848068118095398, 0.9931009411811829, 0.998070240020752, 0.988185465335846, 0.00870155543088913, 0.0406072624027729, 0.20593681931495667, 0.7425327897071838, 0.9880222082138062, 0.009207574650645256, 0.053710851818323135, 0.888530969619751, 0.010742170736193657, 0.02915732003748417, 0.0076729790307581425, 0.020768266171216965, 0.9553402662277222, 0.023364299908280373, 0.02318478561937809, 0.04289185628294945, 0.032458700239658356, 0.4683326780796051, 0.29444679617881775, 0.0602804459631443, 0.027821743860840797, 0.05100652948021889, 0.8876805305480957, 0.03227929025888443, 0.07923098653554916, 0.009056972339749336, 0.9872100353240967, 0.01922890916466713, 0.004807227291166782, 0.9734635949134827, 0.05321671813726425, 0.9460749626159668, 0.9958201050758362, 0.9951406717300415, 0.9989522099494934, 0.9976341724395752, 0.9939318299293518, 0.007695188280194998, 0.9907554388046265, 0.9945312142372131, 0.002001068787649274, 0.002001068787649274, 0.7687157392501831, 0.22880834341049194, 0.20650435984134674, 0.7854675054550171, 0.006758324336260557, 0.34681469202041626, 0.03489511087536812, 0.11750394850969315, 0.017091482877731323, 0.17589984834194183, 0.010682176798582077, 0.044865142554044724, 0.18586988747119904, 0.012818612158298492, 0.053410883992910385, 0.996290385723114, 0.9905754327774048, 0.04634307324886322, 0.09325476735830307, 0.14556841552257538, 0.28886234760284424, 0.09695084393024445, 0.09581358730792999, 0.07704891264438629, 0.09581358730792999, 0.03866661339998245, 0.02189212664961815, 0.06009218469262123, 0.06687678396701813, 0.13084588944911957, 0.4409990906715393, 0.256845623254776, 0.04361529275774956, 0.00642987247556448, 0.9902003407478333, 0.9888010025024414, 0.9949706196784973, 0.9919202327728271, 0.09934737533330917, 0.03804792836308479, 0.16318334639072418, 0.17163844406604767, 0.03382038325071335, 0.05242159217596054, 0.0925832986831665, 0.24435226619243622, 0.02536528743803501, 0.07905514538288116, 0.0493512861430645, 0.9421609044075012, 0.00747746741399169, 0.9954060316085815, 0.058951377868652344, 0.21875932812690735, 0.016335923224687576, 0.11222069710493088, 0.06179240718483925, 0.247169628739357, 0.026279529556632042, 0.014205151237547398, 0.11293095350265503, 0.1306873857975006, 0.9945565462112427, 0.9965836405754089, 0.11972963064908981, 0.8785793781280518, 0.00485058082267642, 0.9895185232162476, 0.08816379308700562, 0.9062418341636658, 0.004100641701370478, 0.012021970003843307, 0.012021970003843307, 0.07453621178865433, 0.009617576375603676, 0.7092962265014648, 0.00721318181604147, 0.17552076280117035, 0.08571454137563705, 0.08571454137563705, 0.027649851515889168, 0.03317982330918312, 0.7659009099006653, 0.998058557510376, 0.0335407555103302, 0.8608793616294861, 0.10062225908041, 0.009945032186806202, 0.9878731966018677, 0.9939717054367065, 0.9972440004348755, 0.38646844029426575, 0.2595732808113098, 0.01553143747150898, 0.022966699674725533, 0.06509985774755478, 0.10211094468832016, 0.01420961320400238, 0.05749936401844025, 0.060308244079351425, 0.016027122735977173, 0.07528243213891983, 0.05646182596683502, 0.13516618311405182, 0.09581400454044342, 0.0684385746717453, 0.037641216069459915, 0.051328931003808975, 0.04961796849966049, 0.4277411103248596, 0.17850686609745026, 0.32199332118034363, 0.04134355112910271, 0.036965999752283096, 0.046693895012140274, 0.1381361037492752, 0.027724498882889748, 0.1177075207233429, 0.07539118081331253, 0.015078236348927021, 0.0029351895209401846, 0.012719154357910156, 0.22796638309955597, 0.15262985229492188, 0.04304944723844528, 0.13306193053722382, 0.41484013199806213, 0.011740758083760738, 0.9922082424163818, 0.9938311576843262, 0.9842427968978882, 0.006768323015421629, 0.9915593266487122, 0.9902106523513794, 0.021416107192635536, 0.8905531167984009, 0.0874491035938263, 0.013841218315064907, 0.2886882722377777, 0.6960155367851257, 0.9894993305206299, 0.015452922321856022, 0.035822682082653046, 0.021774571388959885, 0.016857733950018883, 0.013345705345273018, 0.23741307854652405, 0.013345705345273018, 0.6469154953956604, 0.3705628216266632, 0.6290480494499207, 0.9973105788230896, 0.9915122389793396, 0.06309384852647781, 0.231595978140831, 0.09142940491437912, 0.037780746817588806, 0.05515988916158676, 0.10087459534406662, 0.044959086924791336, 0.05175962299108505, 0.19872672855854034, 0.125054270029068, 0.5734701156616211, 0.1194729432463646, 0.09026844054460526, 0.11681798845529556, 0.09292339533567429, 0.006637385580688715, 0.9915998578071594, 0.7821849584579468, 0.03164910152554512, 0.12433575838804245, 0.06103755533695221, 0.11312486231327057, 0.8551472425460815, 0.028760557994246483, 0.11257313936948776, 0.059926994144916534, 0.0016801961464807391, 0.1814611852169037, 0.20834431052207947, 0.05376627668738365, 0.18930210173130035, 0.04480522871017456, 0.05208607763051987, 0.09633124619722366, 0.9851661920547485, 0.15788765251636505, 0.6178212761878967, 0.17962580919265747, 0.04462042450904846, 0.05229882523417473, 0.0018678151536732912, 0.08405168354511261, 0.3259337544441223, 0.04389365762472153, 0.47629284858703613, 0.01494252122938633, 0.021584073081612587, 0.05396018177270889, 0.1187123954296112, 0.8040066957473755, 0.08918201923370361, 0.9111027717590332, 0.9925987720489502, 0.9948096871376038, 0.9976964592933655, 0.014667067676782608, 0.1222255676984787, 0.017926417291164398, 0.02770446240901947, 0.23630276322364807, 0.016296742483973503, 0.5654969811439514, 0.09710930287837982, 0.8601109981536865, 0.03699402138590813, 0.05591879040002823, 0.08879411965608597, 0.05991298705339432, 0.4362894594669342, 0.06943761557340622, 0.10845787078142166, 0.016898535192012787, 0.006144921761006117, 0.14286942780017853, 0.015362304635345936, 0.0076918532140553, 0.5176617503166199, 0.2649843394756317, 0.1346074342727661, 0.07038045674562454, 0.004999704658985138, 0.38159796595573425, 0.4875108599662781, 0.1105855256319046, 0.007787713315337896, 0.012460341677069664, 0.9943277835845947, 0.9964197278022766, 0.05934993922710419, 0.025178762152791023, 0.2356012761592865, 0.5917009115219116, 0.052156005054712296, 0.034171175211668015, 0.1887255609035492, 0.0022073164582252502, 0.046353645622730255, 0.04304267093539238, 0.18210361897945404, 0.020969506353139877, 0.5165120363235474, 0.058811839669942856, 0.10455438494682312, 0.28679847717285156, 0.06099005788564682, 0.07623757421970367, 0.007986793294548988, 0.014521442353725433, 0.2911549210548401, 0.07986792922019958, 0.019603947177529335, 0.14539244771003723, 0.03940024599432945, 0.2047702819108963, 0.01609305664896965, 0.0016647990560159087, 0.07658075541257858, 0.0005549330380745232, 0.4916706383228302, 0.024971986189484596, 0.9955393671989441, 0.9898155927658081, 0.9977903366088867, 0.988472580909729, 0.991112470626831, 0.04804662615060806, 0.30499163269996643, 0.12394636869430542, 0.12046472728252411, 0.09400427341461182, 0.06649931520223618, 0.07102544605731964, 0.06336583942174911, 0.08495200425386429, 0.022978821769356728, 0.9855749607086182, 0.991823673248291, 0.9906700253486633, 0.9936048984527588, 0.07083205878734589, 0.9249833822250366, 0.05752526596188545, 0.264791876077652, 0.13217636942863464, 0.1901407688856125, 0.040399424731731415, 0.10363329946994781, 0.0421559177339077, 0.07245548814535141, 0.07552935928106308, 0.020638834685087204, 0.08443303406238556, 0.3670561909675598, 0.031851984560489655, 0.05965927243232727, 0.059153683483600616, 0.11881295591592789, 0.05814250931143761, 0.0894889086484909, 0.10769003629684448, 0.022751417011022568, 0.022307951003313065, 0.9703959226608276, 0.9775837659835815, 0.9887065291404724, 0.21927835047245026, 0.7780164480209351, 0.09416694939136505, 0.9042441844940186, 0.0651455670595169, 0.08344487845897675, 0.13724486529827118, 0.2170298844575882, 0.038062576204538345, 0.14419861137866974, 0.09625440090894699, 0.03659863397479057, 0.10869793593883514, 0.07319726794958115, 0.04354088380932808, 0.031975336372852325, 0.24967974424362183, 0.04966381937265396, 0.2020569145679474, 0.0006803263095207512, 0.031975336372852325, 0.09864731132984161, 0.2333519160747528, 0.05850806087255478, 0.02580989897251129, 0.011731772683560848, 0.8540730476379395, 0.0023463545367121696, 0.08212240785360336, 0.021117189899086952, 0.9889315366744995, 0.0668911337852478, 0.0998058170080185, 0.13484403491020203, 0.13590580224990845, 0.06582936644554138, 0.006370584014803171, 0.024420572444796562, 0.06052054837346077, 0.33020859956741333, 0.07432348281145096, 0.9912629127502441, 0.9977747201919556, 0.9882981777191162, 0.0415370836853981, 0.9553529024124146, 0.14116810262203217, 0.857092022895813, 0.9956228137016296, 0.37793493270874023, 0.09960217773914337, 0.006086799781769514, 0.07110488414764404, 0.04454430565237999, 0.15023328363895416, 0.059484630823135376, 0.11647921055555344, 0.014663653448224068, 0.059761304408311844, 0.9974615573883057, 0.1840101033449173, 0.002920795464888215, 0.09346545487642288, 0.04965352267026901, 0.020445566624403, 0.07886147499084473, 0.5695551037788391, 0.9935731291770935, 0.2841089963912964, 0.0568218007683754, 0.0701916366815567, 0.46794426441192627, 0.09693130850791931, 0.005013688467442989, 0.01838352344930172, 0.9945606589317322, 0.1063975989818573, 0.03546586632728577, 0.03819401189684868, 0.600191593170166, 0.22097963094711304, 0.995009183883667, 0.9792357683181763, 0.009374520741403103, 0.007030890788882971, 0.20858308672904968, 0.35779422521591187, 0.003124840324744582, 0.019530251622200012, 0.378886878490448, 0.01562420092523098, 0.9002392888069153, 0.09726203233003616, 0.9930251836776733, 0.9916316270828247, 0.09693365544080734, 0.3130149245262146, 0.07068078964948654, 0.23930495977401733, 0.27868425846099854, 0.9976932406425476, 0.9929656386375427, 0.15088479220867157, 0.8490967750549316, 0.34195584058761597, 0.2523147463798523, 0.0018201243365183473, 0.046185653656721115, 0.09464646130800247, 0.06575199216604233, 0.05596882104873657, 0.04049776494503021, 0.06074664741754532, 0.04027025029063225, 0.009788339026272297, 0.09788339585065842, 0.029365018010139465, 0.822220504283905, 0.03915335610508919, 0.9929429292678833, 0.014371379278600216, 0.124968521296978, 0.22619301080703735, 0.05811036005616188, 0.07060721516609192, 0.017495593056082726, 0.07560595124959946, 0.01562106516212225, 0.3499118387699127, 0.04748803749680519, 0.1100185215473175, 0.20536790788173676, 0.07579053938388824, 0.03178313001990318, 0.5745411515235901, 0.32186359167099, 0.6759135127067566, 0.04023103043437004, 0.04446587339043617, 0.029643917456269264, 0.09104917198419571, 0.5357078909873962, 0.1588066965341568, 0.09951886534690857, 0.21029403805732727, 0.7732859253883362, 0.0016558585921302438, 0.01324686873704195, 0.996273934841156, 0.9994207620620728, 0.9942842125892639, 0.9879215955734253, 0.31940343976020813, 0.6791054606437683, 0.17297396063804626, 0.014766070060431957, 0.8100244402885437, 0.07929293811321259, 0.004719818010926247, 0.9128127694129944, 0.0018879271810874343, 0.9901733994483948, 0.009147335775196552, 0.042687565088272095, 0.2154705673456192, 0.07521142810583115, 0.4339902400970459, 0.14229188859462738, 0.054884012788534164, 0.027442006394267082, 0.12139881402254105, 0.02926022745668888, 0.5005366206169128, 0.1270018368959427, 0.036730922758579254, 0.02365720458328724, 0.06785882264375687, 0.041711386293172836, 0.006225580349564552, 0.0454467348754406, 0.9917294383049011, 0.9968920350074768, 0.9306492209434509, 0.06876718252897263, 0.9906982779502869, 0.03595567122101784, 0.9528253078460693, 0.9878548979759216, 0.9904950857162476, 0.11256667226552963, 0.8850069642066956, 0.9979623556137085, 0.9954518675804138, 0.014250417239964008, 0.983278751373291, 0.9919945001602173, 0.9889539480209351, 0.028080632910132408, 0.9547415375709534, 0.009360210970044136, 0.012287922203540802, 0.03891175612807274, 0.04300772771239281, 0.13311916589736938, 0.06553558260202408, 0.08806344121694565, 0.5345246195793152, 0.08191948384046555, 0.988900363445282, 0.0012262659147381783, 0.517484188079834, 0.3231210708618164, 0.04230617359280586, 0.05211630091071129, 0.005518196616321802, 0.035561710596084595, 0.004291930701583624, 0.017780855298042297, 0.057518623769283295, 0.8575504422187805, 0.0836634561419487, 0.9363574385643005, 0.06113674119114876, 0.9921925663948059, 0.11348026245832443, 0.09020226448774338, 0.6205042600631714, 0.04364625737071037, 0.0065469383262097836, 0.014548752456903458, 0.03855419158935547, 0.06546938419342041, 0.007274376228451729, 0.0005373483872972429, 0.21493935585021973, 0.02847946621477604, 0.752825140953064, 0.003224090440198779, 0.05142543837428093, 0.9427996873855591, 0.9487872123718262, 0.04447440057992935, 0.0049415999092161655, 0.582501232624054, 0.0932001993060112, 0.2895863354206085, 0.015533366240561008, 0.01886194385588169, 0.9940780997276306, 0.07539986819028854, 0.09514745324850082, 0.007180939894169569, 0.025133289396762848, 0.5152324438095093, 0.15798068046569824, 0.014361879788339138, 0.02154281921684742, 0.07360463589429855, 0.014361879788339138, 0.9952544569969177, 0.0444549061357975, 0.9261438846588135, 0.029636604711413383, 0.9802224636077881, 0.03679625317454338, 0.08714901655912399, 0.21303093433380127, 0.0232397373765707, 0.07552915066480637, 0.5054643154144287, 0.01355651393532753, 0.0445428304374218, 0.01616777665913105, 0.01077851839363575, 0.9646773934364319, 0.25457799434661865, 0.05604906752705574, 0.09533579647541046, 0.08485933393239975, 0.07543051987886429, 0.07909727841615677, 0.19381453096866608, 0.02985791303217411, 0.05657288804650307, 0.07490669190883636, 0.9938384294509888, 0.2710508406162262, 0.05701809376478195, 0.04784935712814331, 0.042405419051647186, 0.06332160532474518, 0.3194732367992401, 0.00401132320985198, 0.12406449764966965, 0.014326154254376888, 0.05673157051205635, 0.0856575295329094, 0.05930136516690254, 0.024159815162420273, 0.7291871905326843, 0.026356162503361702, 0.013178081251680851, 0.008785387501120567, 0.050515979528427124, 0.9913363456726074, 0.0069246068596839905, 0.1465708464384079, 0.027698427438735962, 0.1419544517993927, 0.19735130667686462, 0.08194117993116379, 0.2919875979423523, 0.10617730766534805, 0.9816988110542297, 0.9771338105201721, 0.9972831010818481, 0.9919394850730896, 0.1665184646844864, 0.16189295053482056, 0.025440320372581482, 0.11216868460178375, 0.016189293935894966, 0.011563781648874283, 0.499555379152298, 0.005781890824437141, 0.9955941438674927, 0.9914425611495972, 0.9890792965888977, 0.9932788014411926, 0.9947019219398499, 0.9942968487739563, 0.23299972712993622, 0.11411148309707642, 0.013268777169287205, 0.05891336873173714, 0.11835748702287674, 0.13640302419662476, 0.05891336873173714, 0.051482852548360825, 0.1480795443058014, 0.06793613731861115, 0.9846557378768921, 0.053808897733688354, 0.8497321605682373, 0.01793629862368107, 0.05605093389749527, 0.022420374676585197, 0.0005919853574596345, 0.02959926798939705, 0.14858832955360413, 0.0017759561305865645, 0.8193077445030212, 0.0007286216714419425, 0.08889184892177582, 0.13552363216876984, 0.17486920952796936, 0.16175401210784912, 0.00291448668576777, 0.11657947301864624, 0.3133073151111603, 0.006557594984769821, 0.27615758776664734, 0.19481515884399414, 0.00813424400985241, 0.15861776471138, 0.06629408895969391, 0.11225257068872452, 0.06304039061069489, 0.04026450961828232, 0.05571957305073738, 0.025216158479452133, 0.9917768239974976, 0.016399454325437546, 0.2193426936864853, 0.21831771731376648, 0.11889603734016418, 0.06969767808914185, 0.006149794906377792, 0.09224692732095718, 0.2582913935184479, 0.9895025491714478, 0.010923417285084724, 0.024905391037464142, 0.2569187581539154, 0.417274534702301, 0.031896378844976425, 0.09263058006763458, 0.11972065269947052, 0.027527010068297386, 0.01791440322995186, 0.9879209399223328, 0.9828146696090698, 0.9952401518821716, 0.011208872310817242, 0.25332051515579224, 0.13226468861103058, 0.017934195697307587, 0.051560815423727036, 0.5313005447387695, 0.9885645508766174, 0.11263793706893921, 0.25891709327697754, 0.019223541021347046, 0.10693094879388809, 0.1228504478931427, 0.14748060703277588, 0.10512874275445938, 0.0423518642783165, 0.07779526710510254, 0.006908460520207882, 0.9894654750823975, 0.9859137535095215, 0.988101065158844, 0.13968415558338165, 0.12965160608291626, 0.05652964115142822, 0.13370321691036224, 0.14470043778419495, 0.09781750291585922, 0.11248047649860382, 0.047268811613321304, 0.0692632794380188, 0.06907034665346146, 0.010665087029337883, 0.06754554808139801, 0.8496519327163696, 0.021330174058675766, 0.04977040737867355, 0.9942588210105896, 0.01854361593723297, 0.002852864097803831, 0.46073755621910095, 0.04136652871966362, 0.47500187158584595, 0.16666944324970245, 0.8295592665672302, 0.9949787259101868, 0.06429426372051239, 0.4737083315849304, 0.01330226194113493, 0.13376162946224213, 0.05173102021217346, 0.08129160106182098, 0.008129159919917583, 0.04951397702097893, 0.06133820861577988, 0.06355524808168411, 0.9839065670967102, 0.10247236490249634, 0.8284385204315186, 0.04907127097249031, 0.0028865453787148, 0.01587599888443947, 0.9984540939331055, 0.9972016215324402, 0.9988705515861511, 0.9919763207435608, 0.03858592361211777, 0.9576324224472046, 0.0035078111104667187, 0.9930582642555237, 0.9932459592819214, 0.03595590591430664, 0.014648702926933765, 0.0426144078373909, 0.06392160803079605, 0.033292505890131, 0.6791671514511108, 0.08389711380004883, 0.045277807861566544, 0.014019694179296494, 0.9720321297645569, 0.009346462786197662, 0.9923473596572876, 0.005523554980754852, 0.994239866733551, 0.9954299330711365, 0.046779386699199677, 0.8836106657981873, 0.06757022440433502, 0.7120974659919739, 0.12702780961990356, 0.052850984036922455, 0.10662917792797089, 0.9876187443733215, 0.9899839758872986, 0.9931995272636414, 0.9878475666046143, 0.020768698304891586, 0.6824000477790833, 0.2937287390232086, 0.0029669569339603186, 0.9904960989952087, 0.003083867020905018, 0.05119219422340393, 0.5261077284812927, 0.30653637647628784, 0.0018503202591091394, 0.036389630287885666, 0.028371578082442284, 0.0431741401553154, 0.003083867020905018, 0.9957234263420105, 0.9857167601585388, 0.021710535511374474, 0.005427633877843618, 0.9457652568817139, 0.025781262665987015, 0.9877657294273376, 0.0066740927286446095, 0.007349411956965923, 0.07349412143230438, 0.012861470691859722, 0.22231970727443695, 0.09554235637187958, 0.014698823913931847, 0.5750914812088013, 0.9970661401748657, 0.0032690693624317646, 0.9879963397979736, 0.9933649897575378, 0.9527984857559204, 0.0392906591296196, 0.9773064255714417, 0.01338775921612978, 0.1733044683933258, 0.11415430158376694, 0.09121287614107132, 0.1843605786561966, 0.10005776584148407, 0.14179456233978271, 0.06937706470489502, 0.04201320558786392, 0.052792906761169434, 0.030404292047023773, 0.08409424871206284, 0.021624235436320305, 0.07688616961240768, 0.06727539747953415, 0.747237503528595, 0.33517640829086304, 0.6620768904685974, 0.002758653601631522, 0.04095998778939247, 0.959634006023407, 0.9987404942512512, 0.013819515705108643, 0.3151523768901825, 0.6707521080970764, 0.05502551794052124, 0.14756843447685242, 0.010004639625549316, 0.005002319812774658, 0.7828630208969116, 0.042391955852508545, 0.9507910013198853, 0.012515492737293243, 0.007822182960808277, 0.9777728319168091, 0.994380533695221, 0.11777878552675247, 0.5513847470283508, 0.10502567142248154, 0.062265217304229736, 0.0270066000521183, 0.0405099019408226, 0.0157538503408432, 0.028506968170404434, 0.0157538503408432, 0.0360088013112545, 0.10179044306278229, 0.0622747428715229, 0.09353716671466827, 0.3176262080669403, 0.21183417737483978, 0.047518882900476456, 0.05627235770225525, 0.05527196079492569, 0.050269972532987595, 0.004001589957624674, 0.2278156876564026, 0.16641081869602203, 0.0973757654428482, 0.15006041526794434, 0.10609598457813263, 0.05123127996921539, 0.08029866963624954, 0.011990299448370934, 0.0534113347530365, 0.054864704608917236, 0.009547729976475239, 0.9881900548934937, 0.9945070743560791, 0.9949353933334351, 0.9954512119293213, 0.9885648488998413, 0.9812148213386536, 0.9881600737571716, 0.12985055148601532, 0.03196321427822113, 0.015482181683182716, 0.038955166935920715, 0.21625111997127533, 0.06367671489715576, 0.24471835792064667, 0.04095286875963211, 0.06792183220386505, 0.14982756972312927, 0.9866440296173096, 0.9905340671539307, 0.991249680519104], \"Term\": [\"accept\", \"accept\", \"accept\", \"accept\", \"accept\", \"accept\", \"accept\", \"accept\", \"accept\", \"access\", \"access\", \"access\", \"access\", \"access\", \"access\", \"adaptec\", \"address\", \"address\", \"address\", \"address\", \"address\", \"address\", \"address\", \"address\", \"address\", \"address\", \"administr\", \"administr\", \"administr\", \"administr\", \"agenc\", \"agenc\", \"agenc\", \"agenc\", \"agenc\", \"aid\", \"aid\", \"aid\", \"aid\", \"alaska\", \"algorithm\", \"algorithm\", \"alomar\", \"amanda\", \"american\", \"american\", \"american\", \"american\", \"american\", \"american\", \"american\", \"american\", \"andrew\", \"andrew\", \"andrew\", \"andrew\", \"andrew\", \"andrew\", \"andrew\", \"andrew\", \"anonym\", \"anonym\", \"anti\", \"anti\", \"anti\", \"appl\", \"appl\", \"appl\", \"applic\", \"applic\", \"applic\", \"applic\", \"applic\", \"arab\", \"arab\", \"archiv\", \"archiv\", \"archiv\", \"archiv\", \"argic\", \"argument\", \"argument\", \"argument\", \"argument\", \"argument\", \"argument\", \"argument\", \"argument\", \"arm\", \"arm\", \"arm\", \"arm\", \"arm\", \"armenia\", \"armenian\", \"armi\", \"armi\", \"armi\", \"armi\", \"armori\", \"atheism\", \"atheist\", \"atho\", \"attack\", \"attack\", \"attack\", \"attack\", \"attack\", \"attack\", \"aurora\", \"author\", \"author\", \"author\", \"author\", \"author\", \"auto\", \"auto\", \"auto\", \"auto\", \"auto\", \"auto\", \"autom\", \"automot\", \"avail\", \"avail\", \"avail\", \"avail\", \"avail\", \"avail\", \"avail\", \"avail\", \"avail\", \"avail\", \"azerbaijan\", \"azerbaijani\", \"azeri\", \"baalk\", \"baerga\", \"ball\", \"ball\", \"ball\", \"bank\", \"bank\", \"bank\", \"bank\", \"bank\", \"bank\", \"bank\", \"bank\", \"bank\", \"basebal\", \"basebal\", \"bat\", \"batf\", \"batf\", \"batteri\", \"batteri\", \"belief\", \"belief\", \"believ\", \"believ\", \"believ\", \"believ\", \"believ\", \"believ\", \"believ\", \"believ\", \"believ\", \"believ\", \"berkeley\", \"berkeley\", \"berkeley\", \"berkeley\", \"best\", \"best\", \"best\", \"best\", \"best\", \"best\", \"best\", \"best\", \"best\", \"best\", \"better\", \"better\", \"better\", \"better\", \"better\", \"better\", \"better\", \"better\", \"better\", \"better\", \"bibl\", \"biblic\", \"bike\", \"bike\", \"billion\", \"billion\", \"binari\", \"binari\", \"bio\", \"blah\", \"blast\", \"board\", \"board\", \"board\", \"board\", \"board\", \"board\", \"board\", \"board\", \"boni\", \"bontchev\", \"book\", \"book\", \"book\", \"book\", \"book\", \"book\", \"book\", \"book\", \"boyl\", \"brake\", \"brake\", \"brave\", \"brave\", \"bruin\", \"build\", \"build\", \"build\", \"build\", \"build\", \"build\", \"build\", \"build\", \"build\", \"build\", \"buy\", \"buy\", \"buy\", \"buy\", \"buy\", \"byte\", \"byte\", \"byte\", \"cach\", \"cactus\", \"cadr\", \"callison\", \"canada\", \"canada\", \"canada\", \"canada\", \"canada\", \"canada\", \"canada\", \"canada\", \"canada\", \"cancer\", \"cancer\", \"candida\", \"canuck\", \"car\", \"car\", \"card\", \"card\", \"card\", \"card\", \"card\", \"carlo\", \"case\", \"case\", \"case\", \"case\", \"case\", \"case\", \"case\", \"case\", \"case\", \"case\", \"catbyt\", \"catcher\", \"cathol\", \"caus\", \"caus\", \"caus\", \"caus\", \"caus\", \"caus\", \"caus\", \"caus\", \"caus\", \"centerlin\", \"centri\", \"char\", \"chastiti\", \"children\", \"children\", \"children\", \"children\", \"children\", \"children\", \"chip\", \"chip\", \"chip\", \"chopin\", \"christ\", \"christ\", \"christian\", \"christian\", \"church\", \"church\", \"church\", \"cica\", \"cipher\", \"ciphertext\", \"circuit\", \"circuit\", \"circuit\", \"claim\", \"claim\", \"claim\", \"claim\", \"claim\", \"claim\", \"claim\", \"claim\", \"claim\", \"claim\", \"clarkson\", \"classifi\", \"classifi\", \"classifi\", \"classifi\", \"clayton\", \"cleveland\", \"cleveland\", \"cleveland\", \"client\", \"client\", \"clinic\", \"clinic\", \"clinton\", \"clinton\", \"clinton\", \"clinton\", \"clipper\", \"clipper\", \"coach\", \"coach\", \"code\", \"code\", \"code\", \"code\", \"code\", \"code\", \"color\", \"color\", \"color\", \"color\", \"color\", \"color\", \"colorado\", \"colorado\", \"colorado\", \"colorado\", \"colorado\", \"colorado\", \"colorado\", \"colorado\", \"columbia\", \"columbia\", \"columbia\", \"columbia\", \"columbia\", \"come\", \"come\", \"come\", \"come\", \"come\", \"come\", \"come\", \"come\", \"come\", \"come\", \"communic\", \"communic\", \"communic\", \"communic\", \"communic\", \"communic\", \"communic\", \"communic\", \"compil\", \"compil\", \"compil\", \"compil\", \"concordia\", \"config\", \"contradict\", \"contradict\", \"contradict\", \"contrib\", \"control\", \"control\", \"control\", \"control\", \"control\", \"control\", \"control\", \"control\", \"control\", \"copi\", \"copi\", \"copi\", \"copi\", \"copi\", \"copi\", \"copi\", \"copper\", \"cost\", \"cost\", \"cost\", \"cost\", \"cost\", \"cost\", \"cost\", \"cost\", \"counterst\", \"countri\", \"countri\", \"countri\", \"countri\", \"countri\", \"countri\", \"countri\", \"court\", \"court\", \"court\", \"court\", \"cramer\", \"crime\", \"crime\", \"crime\", \"crypt\", \"crypto\", \"cryptograph\", \"cryptographi\", \"ctrl\", \"cub\", \"cunixb\", \"cure\", \"cwru\", \"cwru\", \"data\", \"data\", \"data\", \"data\", \"data\", \"data\", \"data\", \"david\", \"david\", \"david\", \"david\", \"david\", \"david\", \"david\", \"david\", \"david\", \"david\", \"davidian\", \"dealer\", \"dealer\", \"dealer\", \"death\", \"death\", \"death\", \"death\", \"death\", \"death\", \"decrypt\", \"den\", \"desi\", \"design\", \"design\", \"design\", \"design\", \"design\", \"design\", \"design\", \"design\", \"design\", \"deskjet\", \"detroit\", \"devic\", \"devic\", \"devic\", \"devic\", \"diamond\", \"diet\", \"differ\", \"differ\", \"differ\", \"differ\", \"differ\", \"differ\", \"differ\", \"differ\", \"differ\", \"differ\", \"dillon\", \"directori\", \"directori\", \"directori\", \"diseas\", \"disk\", \"disk\", \"disk\", \"display\", \"display\", \"display\", \"display\", \"display\", \"display\", \"display\", \"distribut\", \"distribut\", \"distribut\", \"distribut\", \"distribut\", \"distribut\", \"distribut\", \"distribut\", \"distribut\", \"distribut\", \"divin\", \"divis\", \"divis\", \"divis\", \"divis\", \"divis\", \"divis\", \"divis\", \"divis\", \"divis\", \"dock\", \"doctor\", \"doctor\", \"doctor\", \"doctrin\", \"dodger\", \"drive\", \"drive\", \"drive\", \"drive\", \"drive\", \"drive\", \"drive\", \"drive\", \"driver\", \"driver\", \"driver\", \"driver\", \"driver\", \"dseg\", \"dseg\", \"dtmedin\", \"duke\", \"duke\", \"dyer\", \"earth\", \"earth\", \"earth\", \"earth\", \"earth\", \"earth\", \"edmonton\", \"effect\", \"effect\", \"effect\", \"effect\", \"effect\", \"effect\", \"effect\", \"effect\", \"effect\", \"effect\", \"einstein\", \"eisa\", \"email\", \"email\", \"email\", \"email\", \"email\", \"email\", \"email\", \"email\", \"encrypt\", \"enforc\", \"enforc\", \"enforc\", \"enforc\", \"enforc\", \"engin\", \"engin\", \"engin\", \"engin\", \"engin\", \"engin\", \"engin\", \"engin\", \"engin\", \"engin\", \"engr\", \"entri\", \"entri\", \"entri\", \"ericsson\", \"escrow\", \"esdi\", \"espn\", \"etern\", \"etern\", \"etern\", \"ether\", \"ethernet\", \"ethnic\", \"evid\", \"evid\", \"evid\", \"evid\", \"evid\", \"evid\", \"exist\", \"exist\", \"exist\", \"exist\", \"exist\", \"exist\", \"exist\", \"exist\", \"exist\", \"extermin\", \"faith\", \"faith\", \"fbihh\", \"feder\", \"feder\", \"feder\", \"feder\", \"file\", \"file\", \"file\", \"file\", \"final\", \"final\", \"final\", \"final\", \"final\", \"final\", \"final\", \"final\", \"final\", \"final\", \"firearm\", \"fischer\", \"flight\", \"flight\", \"flight\", \"flight\", \"floppi\", \"floppi\", \"flyer\", \"flyer\", \"fnal\", \"follow\", \"follow\", \"follow\", \"follow\", \"follow\", \"follow\", \"follow\", \"follow\", \"follow\", \"follow\", \"font\", \"font\", \"food\", \"food\", \"food\", \"food\", \"forc\", \"forc\", \"forc\", \"forc\", \"forc\", \"forc\", \"forc\", \"forc\", \"forc\", \"forc\", \"format\", \"format\", \"format\", \"format\", \"format\", \"freenet\", \"freenet\", \"freenet\", \"frost\", \"frost\", \"function\", \"function\", \"function\", \"function\", \"function\", \"function\", \"fund\", \"fund\", \"fund\", \"fund\", \"fund\", \"game\", \"game\", \"game\", \"game\", \"gatech\", \"gaza\", \"genet\", \"genet\", \"genocid\", \"go\", \"go\", \"go\", \"go\", \"go\", \"go\", \"go\", \"go\", \"go\", \"go\", \"goal\", \"goal\", \"goal\", \"goal\", \"goal\", \"goal\", \"god\", \"good\", \"good\", \"good\", \"good\", \"good\", \"good\", \"good\", \"good\", \"good\", \"good\", \"gordon\", \"gordon\", \"gospel\", \"govern\", \"govern\", \"govern\", \"govern\", \"gradi\", \"graphic\", \"graphic\", \"great\", \"great\", \"great\", \"great\", \"great\", \"great\", \"great\", \"great\", \"great\", \"great\", \"greec\", \"greec\", \"greek\", \"greek\", \"greenbelt\", \"grind\", \"grind\", \"grind\", \"grind\", \"grind\", \"grind\", \"grind\", \"group\", \"group\", \"group\", \"group\", \"group\", \"group\", \"group\", \"group\", \"group\", \"group\", \"gtoal\", \"gun\", \"gun\", \"halat\", \"hallam\", \"hamburg\", \"handbook\", \"handgun\", \"handgun\", \"handheld\", \"handheld\", \"handheld\", \"happen\", \"happen\", \"happen\", \"happen\", \"happen\", \"happen\", \"happen\", \"happen\", \"happen\", \"happen\", \"hard\", \"hard\", \"hard\", \"hard\", \"hard\", \"hard\", \"hard\", \"hard\", \"hard\", \"harley\", \"health\", \"health\", \"health\", \"health\", \"heaven\", \"heaven\", \"heaven\", \"heaven\", \"helmet\", \"helmet\", \"helmet\", \"help\", \"help\", \"help\", \"help\", \"help\", \"help\", \"help\", \"help\", \"help\", \"help\", \"henri\", \"henri\", \"higgin\", \"high\", \"high\", \"high\", \"high\", \"high\", \"high\", \"high\", \"high\", \"high\", \"high\", \"hit\", \"hit\", \"hit\", \"hit\", \"hit\", \"hitler\", \"hitter\", \"hockey\", \"holi\", \"holi\", \"home\", \"home\", \"home\", \"home\", \"home\", \"home\", \"home\", \"home\", \"home\", \"home\", \"homeopathi\", \"homicid\", \"honda\", \"hulman\", \"husc\", \"hydro\", \"iastat\", \"iastat\", \"ifa\", \"illinoi\", \"illinoi\", \"illinoi\", \"illinoi\", \"illinoi\", \"illinoi\", \"illinoi\", \"illinoi\", \"imag\", \"imag\", \"imag\", \"imag\", \"imag\", \"imak\", \"includ\", \"includ\", \"includ\", \"includ\", \"includ\", \"includ\", \"includ\", \"includ\", \"includ\", \"includ\", \"indiana\", \"indiana\", \"indiana\", \"indiana\", \"indiana\", \"indiana\", \"infect\", \"inform\", \"inform\", \"inform\", \"inform\", \"inform\", \"inform\", \"inform\", \"inform\", \"inform\", \"inform\", \"ingr\", \"ingr\", \"ingr\", \"inning\", \"instal\", \"instal\", \"instal\", \"instal\", \"instal\", \"insur\", \"insur\", \"insur\", \"insur\", \"intellect\", \"intercon\", \"internet\", \"internet\", \"internet\", \"internet\", \"internet\", \"internet\", \"internet\", \"internet\", \"invest\", \"invest\", \"iran\", \"islam\", \"islam\", \"isra\", \"israel\", \"israel\", \"israel\", \"jaeger\", \"jake\", \"jason\", \"jason\", \"jason\", \"jason\", \"jay\", \"jeff\", \"jeff\", \"jeff\", \"jeff\", \"jeff\", \"jeff\", \"jeff\", \"jesus\", \"jet\", \"jet\", \"jew\", \"jew\", \"jew\", \"job\", \"job\", \"job\", \"john\", \"john\", \"john\", \"john\", \"john\", \"john\", \"john\", \"john\", \"john\", \"john\", \"jumper\", \"jumper\", \"kaldi\", \"kelvin\", \"key\", \"key\", \"kill\", \"kill\", \"kill\", \"kill\", \"kill\", \"kill\", \"kill\", \"koresh\", \"lamp\", \"larc\", \"larc\", \"laughter\", \"launch\", \"launch\", \"laurentian\", \"leaf\", \"leagu\", \"leagu\", \"leav\", \"leav\", \"leav\", \"leav\", \"leav\", \"leav\", \"leav\", \"leav\", \"leav\", \"leav\", \"lebanes\", \"lemieux\", \"librari\", \"librari\", \"librari\", \"librari\", \"librari\", \"librari\", \"life\", \"life\", \"life\", \"life\", \"life\", \"life\", \"life\", \"life\", \"life\", \"life\", \"list\", \"list\", \"list\", \"list\", \"list\", \"list\", \"list\", \"list\", \"list\", \"list\", \"live\", \"live\", \"live\", \"live\", \"live\", \"live\", \"live\", \"live\", \"livesey\", \"long\", \"long\", \"long\", \"long\", \"long\", \"long\", \"long\", \"long\", \"long\", \"long\", \"look\", \"look\", \"look\", \"look\", \"look\", \"look\", \"look\", \"look\", \"look\", \"look\", \"lopez\", \"lord\", \"lord\", \"lose\", \"lose\", \"lose\", \"lose\", \"lose\", \"lose\", \"lose\", \"lose\", \"lose\", \"lose\", \"love\", \"love\", \"love\", \"love\", \"love\", \"love\", \"love\", \"love\", \"lunar\", \"lunar\", \"lyme\", \"machin\", \"machin\", \"machin\", \"machin\", \"machin\", \"machin\", \"machin\", \"machin\", \"magellan\", \"magnus\", \"mail\", \"mail\", \"mail\", \"mail\", \"mail\", \"mail\", \"mail\", \"mail\", \"map\", \"map\", \"mar\", \"mar\", \"marriag\", \"marriag\", \"massacr\", \"maxtor\", \"maynard\", \"mccall\", \"mcgill\", \"mcgill\", \"mcgill\", \"mean\", \"mean\", \"mean\", \"mean\", \"mean\", \"mean\", \"mean\", \"mean\", \"mean\", \"mean\", \"medic\", \"medic\", \"medic\", \"medic\", \"medic\", \"medicin\", \"medicin\", \"medicin\", \"medicin\", \"meg\", \"memori\", \"memori\", \"memori\", \"memori\", \"memori\", \"memori\", \"memori\", \"messag\", \"messag\", \"messag\", \"messag\", \"messag\", \"messag\", \"messag\", \"messag\", \"messag\", \"met\", \"metal\", \"metal\", \"metal\", \"metal\", \"methodolog\", \"midway\", \"midway\", \"midway\", \"migrain\", \"militia\", \"mime\", \"mission\", \"mission\", \"mission\", \"mission\", \"mksol\", \"mode\", \"mode\", \"mode\", \"mode\", \"mode\", \"mode\", \"modem\", \"modem\", \"modem\", \"money\", \"money\", \"money\", \"money\", \"money\", \"money\", \"money\", \"money\", \"monitor\", \"monitor\", \"monitor\", \"montreal\", \"montreal\", \"moon\", \"moon\", \"moon\", \"moral\", \"moral\", \"mormon\", \"motherboard\", \"motif\", \"motorcycl\", \"motto\", \"mous\", \"mous\", \"murder\", \"murder\", \"murder\", \"muslim\", \"muslim\", \"nasa\", \"nasa\", \"nasa\", \"nation\", \"nation\", \"nation\", \"nation\", \"nation\", \"nation\", \"nation\", \"nation\", \"nation\", \"nation\", \"nazi\", \"ncsl\", \"need\", \"need\", \"need\", \"need\", \"need\", \"need\", \"need\", \"need\", \"need\", \"need\", \"netcom\", \"netcom\", \"netcom\", \"netcom\", \"netcom\", \"netcom\", \"nist\", \"nist\", \"nore\", \"nsmca\", \"nubus\", \"number\", \"number\", \"number\", \"number\", \"number\", \"number\", \"number\", \"number\", \"number\", \"number\", \"ohio\", \"ohio\", \"ohio\", \"openwindow\", \"opinion\", \"opinion\", \"opinion\", \"opinion\", \"opinion\", \"opinion\", \"opinion\", \"opinion\", \"opinion\", \"opinion\", \"optilink\", \"oracl\", \"orbit\", \"orbit\", \"outlet\", \"outlet\", \"output\", \"output\", \"output\", \"owner\", \"owner\", \"owner\", \"owner\", \"owner\", \"owner\", \"owner\", \"pain\", \"pain\", \"pain\", \"pain\", \"pain\", \"palestinian\", \"patent\", \"patent\", \"patent\", \"patient\", \"patient\", \"pen\", \"penguin\", \"peopl\", \"peopl\", \"peopl\", \"peopl\", \"peopl\", \"peopl\", \"peopl\", \"peopl\", \"peopl\", \"peopl\", \"period\", \"period\", \"period\", \"period\", \"period\", \"period\", \"period\", \"period\", \"period\", \"person\", \"person\", \"person\", \"person\", \"person\", \"person\", \"person\", \"person\", \"person\", \"person\", \"phone\", \"phone\", \"phone\", \"phone\", \"phone\", \"phone\", \"phone\", \"phone\", \"photographi\", \"physician\", \"pistol\", \"pitch\", \"pitch\", \"pitcher\", \"pitt\", \"pitt\", \"pitt\", \"pittsburgh\", \"pittsburgh\", \"pittsburgh\", \"plaintext\", \"play\", \"play\", \"play\", \"play\", \"play\", \"play\", \"play\", \"play\", \"player\", \"player\", \"playoff\", \"plymouth\", \"point\", \"point\", \"point\", \"point\", \"point\", \"point\", \"point\", \"point\", \"point\", \"point\", \"polit\", \"polit\", \"polit\", \"polit\", \"polit\", \"polit\", \"polygon\", \"popul\", \"popul\", \"popul\", \"popul\", \"port\", \"port\", \"port\", \"power\", \"power\", \"power\", \"power\", \"power\", \"power\", \"power\", \"power\", \"power\", \"power\", \"powerbook\", \"presid\", \"presid\", \"presid\", \"presid\", \"price\", \"price\", \"price\", \"price\", \"price\", \"price\", \"price\", \"princeton\", \"princeton\", \"princeton\", \"princeton\", \"printer\", \"printer\", \"prism\", \"prison\", \"privaci\", \"privat\", \"privat\", \"privat\", \"privat\", \"privat\", \"privat\", \"privat\", \"probe\", \"probe\", \"probe\", \"problem\", \"problem\", \"problem\", \"problem\", \"problem\", \"problem\", \"problem\", \"problem\", \"problem\", \"problem\", \"program\", \"program\", \"program\", \"program\", \"program\", \"program\", \"project\", \"project\", \"project\", \"project\", \"project\", \"propheci\", \"prophet\", \"propos\", \"propos\", \"propos\", \"propos\", \"propos\", \"propos\", \"protect\", \"protect\", \"protect\", \"protect\", \"protect\", \"protect\", \"protect\", \"provid\", \"provid\", \"provid\", \"provid\", \"provid\", \"provid\", \"provid\", \"provid\", \"provid\", \"provid\", \"public\", \"public\", \"public\", \"public\", \"public\", \"public\", \"public\", \"public\", \"public\", \"puck\", \"pyron\", \"quadra\", \"qualcomm\", \"quebec\", \"question\", \"question\", \"question\", \"question\", \"question\", \"question\", \"question\", \"question\", \"question\", \"question\", \"quicktim\", \"raider\", \"ramsey\", \"ranck\", \"ranger\", \"ranger\", \"read\", \"read\", \"read\", \"read\", \"read\", \"read\", \"read\", \"read\", \"read\", \"read\", \"reason\", \"reason\", \"reason\", \"reason\", \"reason\", \"reason\", \"reason\", \"reason\", \"reason\", \"reason\", \"recipi\", \"recipi\", \"redesign\", \"reilli\", \"religi\", \"religi\", \"religion\", \"religion\", \"repli\", \"repli\", \"repli\", \"repli\", \"repli\", \"repli\", \"repli\", \"repli\", \"repli\", \"repli\", \"research\", \"research\", \"research\", \"research\", \"research\", \"research\", \"research\", \"research\", \"research\", \"research\", \"resourc\", \"resourc\", \"resourc\", \"resourc\", \"resourc\", \"resourc\", \"restaur\", \"result\", \"result\", \"result\", \"result\", \"result\", \"result\", \"result\", \"result\", \"result\", \"result\", \"resurrect\", \"revel\", \"revolv\", \"rid\", \"rid\", \"ride\", \"ride\", \"rider\", \"right\", \"right\", \"right\", \"right\", \"right\", \"right\", \"right\", \"right\", \"right\", \"right\", \"ripem\", \"risk\", \"risk\", \"risk\", \"risk\", \"risk\", \"risk\", \"risk\", \"rkba\", \"road\", \"road\", \"road\", \"road\", \"road\", \"road\", \"road\", \"robi\", \"rochest\", \"rochest\", \"rochest\", \"rochest\", \"rochest\", \"rocki\", \"rockwel\", \"run\", \"run\", \"run\", \"run\", \"run\", \"run\", \"run\", \"run\", \"rutger\", \"rutger\", \"rwing\", \"sabbath\", \"sale\", \"sale\", \"sale\", \"sale\", \"sale\", \"sandvik\", \"satan\", \"satellit\", \"satellit\", \"say\", \"say\", \"say\", \"say\", \"say\", \"say\", \"say\", \"say\", \"say\", \"say\", \"scheme\", \"scheme\", \"scheme\", \"scheme\", \"scheme\", \"schneider\", \"scienc\", \"scienc\", \"scienc\", \"scienc\", \"scienc\", \"scienc\", \"scienc\", \"scienc\", \"scienc\", \"scienc\", \"scientif\", \"scientif\", \"scientif\", \"scientif\", \"scientif\", \"score\", \"score\", \"scott\", \"scott\", \"scott\", \"scott\", \"scott\", \"scott\", \"scott\", \"screen\", \"screen\", \"screen\", \"screen\", \"scriptur\", \"scsi\", \"sdpa\", \"sdsu\", \"season\", \"season\", \"secret\", \"secret\", \"secret\", \"secur\", \"secur\", \"secur\", \"secur\", \"selann\", \"sell\", \"sell\", \"sell\", \"sell\", \"sell\", \"sell\", \"sell\", \"sell\", \"send\", \"send\", \"send\", \"send\", \"send\", \"send\", \"send\", \"send\", \"send\", \"send\", \"sera\", \"serdar\", \"server\", \"server\", \"shafer\", \"shaft\", \"shaft\", \"shark\", \"shotgun\", \"shuttl\", \"shuttl\", \"simm\", \"sin\", \"skeptic\", \"skeptic\", \"skndiv\", \"slaughter\", \"sleev\", \"sleev\", \"sleev\", \"smith\", \"smith\", \"smith\", \"smith\", \"smith\", \"smith\", \"smith\", \"smith\", \"smuggl\", \"softwar\", \"softwar\", \"softwar\", \"softwar\", \"softwar\", \"softwar\", \"softwar\", \"softwar\", \"softwar\", \"solar\", \"solar\", \"solar\", \"soldier\", \"soldier\", \"solntz\", \"sourc\", \"sourc\", \"sourc\", \"sourc\", \"sourc\", \"sourc\", \"sourc\", \"sourc\", \"sourc\", \"space\", \"space\", \"space\", \"space\", \"space\", \"spacecraft\", \"spacecraft\", \"spec\", \"spec\", \"spec\", \"speed\", \"speed\", \"speed\", \"speed\", \"speed\", \"spencer\", \"spend\", \"spend\", \"spend\", \"spend\", \"spend\", \"spend\", \"spend\", \"spend\", \"spend\", \"spend\", \"sphere\", \"spirit\", \"spirit\", \"spirit\", \"ssto\", \"stanford\", \"stanford\", \"stanford\", \"stanford\", \"stanford\", \"stanford\", \"stanford\", \"stanford\", \"stanley\", \"stanley\", \"stanley\", \"start\", \"start\", \"start\", \"start\", \"start\", \"start\", \"start\", \"start\", \"start\", \"start\", \"starter\", \"state\", \"state\", \"state\", \"state\", \"state\", \"state\", \"state\", \"state\", \"state\", \"state\", \"station\", \"station\", \"station\", \"station\", \"station\", \"station\", \"station\", \"station\", \"sternlight\", \"steve\", \"steve\", \"steve\", \"steve\", \"steve\", \"steve\", \"steve\", \"steve\", \"steveh\", \"stimulus\", \"stratus\", \"strnlght\", \"studi\", \"studi\", \"studi\", \"studi\", \"studi\", \"studi\", \"studi\", \"studi\", \"suno\", \"superstit\", \"surveil\", \"svga\", \"swap\", \"syndrom\", \"take\", \"take\", \"take\", \"take\", \"take\", \"take\", \"take\", \"take\", \"take\", \"take\", \"tampa\", \"teach\", \"teach\", \"teach\", \"teach\", \"teach\", \"team\", \"team\", \"team\", \"team\", \"team\", \"technolog\", \"technolog\", \"technolog\", \"technolog\", \"technolog\", \"technolog\", \"technolog\", \"technolog\", \"technolog\", \"tell\", \"tell\", \"tell\", \"tell\", \"tell\", \"tell\", \"tell\", \"tell\", \"tell\", \"tell\", \"tennesse\", \"test\", \"test\", \"test\", \"test\", \"test\", \"test\", \"test\", \"test\", \"testament\", \"thank\", \"thank\", \"thank\", \"thank\", \"thank\", \"thank\", \"thank\", \"thank\", \"thank\", \"theist\", \"theodor\", \"theolog\", \"theori\", \"theori\", \"theori\", \"theori\", \"theori\", \"theori\", \"therapi\", \"thing\", \"thing\", \"thing\", \"thing\", \"thing\", \"thing\", \"thing\", \"thing\", \"thing\", \"thing\", \"thomasp\", \"tiff\", \"tiger\", \"time\", \"time\", \"time\", \"time\", \"time\", \"time\", \"time\", \"time\", \"time\", \"time\", \"tire\", \"tire\", \"tire\", \"tire\", \"tire\", \"toolkit\", \"toronto\", \"toronto\", \"toronto\", \"toronto\", \"toronto\", \"treatment\", \"treatment\", \"troop\", \"true\", \"true\", \"true\", \"true\", \"true\", \"true\", \"true\", \"true\", \"true\", \"true\", \"trunk\", \"truth\", \"truth\", \"truth\", \"truth\", \"truth\", \"turk\", \"turkey\", \"turkish\", \"ualberta\", \"uchicago\", \"uchicago\", \"uchicago\", \"ucsc\", \"uicvm\", \"uiuc\", \"uiuc\", \"uiuc\", \"uiuc\", \"uiuc\", \"uiuc\", \"uiuc\", \"uiuc\", \"umich\", \"umich\", \"umich\", \"uoknor\", \"upgrad\", \"upgrad\", \"urartu\", \"urbana\", \"urbana\", \"urbana\", \"user\", \"user\", \"user\", \"user\", \"utah\", \"utkvm\", \"uvic\", \"veal\", \"vehicl\", \"vehicl\", \"vehicl\", \"vehicl\", \"vers\", \"version\", \"version\", \"version\", \"version\", \"version\", \"version\", \"version\", \"version\", \"version\", \"vesa\", \"vesselin\", \"video\", \"video\", \"video\", \"video\", \"villag\", \"villag\", \"virginia\", \"virginia\", \"virginia\", \"virginia\", \"virginia\", \"virginia\", \"virginia\", \"visual\", \"visual\", \"volt\", \"vram\", \"waco\", \"waco\", \"wagon\", \"wagon\", \"want\", \"want\", \"want\", \"want\", \"want\", \"want\", \"want\", \"want\", \"want\", \"want\", \"water\", \"water\", \"water\", \"water\", \"water\", \"weapon\", \"weapon\", \"weapon\", \"wheel\", \"wheel\", \"widget\", \"window\", \"window\", \"window\", \"wing\", \"wing\", \"wing\", \"wing\", \"wing\", \"winnipeg\", \"winnipeg\", \"wire\", \"wire\", \"wire\", \"wiretap\", \"word\", \"word\", \"word\", \"word\", \"word\", \"word\", \"word\", \"word\", \"word\", \"word\", \"work\", \"work\", \"work\", \"work\", \"work\", \"work\", \"work\", \"work\", \"work\", \"work\", \"world\", \"world\", \"world\", \"world\", \"world\", \"world\", \"world\", \"world\", \"world\", \"world\", \"worship\", \"worship\", \"xlib\", \"xpert\", \"xterm\", \"xview\", \"yamaha\", \"yanke\", \"year\", \"year\", \"year\", \"year\", \"year\", \"year\", \"year\", \"year\", \"year\", \"year\", \"yeast\", \"zoolog\", \"zuma\"]}, \"R\": 30, \"lambda.step\": 0.01, \"plot.opts\": {\"xlab\": \"PC1\", \"ylab\": \"PC2\"}, \"topic.order\": [3, 1, 8, 9, 2, 4, 7, 10, 5, 6]};\n", + "\n", + "function LDAvis_load_lib(url, callback){\n", + " var s = document.createElement('script');\n", + " s.src = url;\n", + " s.async = true;\n", + " s.onreadystatechange = s.onload = callback;\n", + " s.onerror = function(){console.warn(\"failed to load library \" + url);};\n", + " document.getElementsByTagName(\"head\")[0].appendChild(s);\n", + "}\n", + "\n", + "if(typeof(LDAvis) !== \"undefined\"){\n", + " // already loaded: just create the visualization\n", + " !function(LDAvis){\n", + " new LDAvis(\"#\" + \"ldavis_el591011124069819927707340541\", ldavis_el591011124069819927707340541_data);\n", + " }(LDAvis);\n", + "}else if(typeof define === \"function\" && define.amd){\n", + " // require.js is available: use it to load d3/LDAvis\n", + " require.config({paths: {d3: \"https://cdnjs.cloudflare.com/ajax/libs/d3/3.5.5/d3.min\"}});\n", + " require([\"d3\"], function(d3){\n", + " window.d3 = d3;\n", + " LDAvis_load_lib(\"https://cdn.rawgit.com/bmabey/pyLDAvis/files/ldavis.v1.0.0.js\", function(){\n", + " new LDAvis(\"#\" + \"ldavis_el591011124069819927707340541\", ldavis_el591011124069819927707340541_data);\n", + " });\n", + " });\n", + "}else{\n", + " // require.js not available: dynamically load d3 & LDAvis\n", + " LDAvis_load_lib(\"https://cdnjs.cloudflare.com/ajax/libs/d3/3.5.5/d3.min.js\", function(){\n", + " LDAvis_load_lib(\"https://cdn.rawgit.com/bmabey/pyLDAvis/files/ldavis.v1.0.0.js\", function(){\n", + " new LDAvis(\"#\" + \"ldavis_el591011124069819927707340541\", ldavis_el591011124069819927707340541_data);\n", + " })\n", + " });\n", + "}\n", + "</script>" + ], + "text/plain": [ + "<IPython.core.display.HTML object>" + ] + }, + "execution_count": 26, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "show_pyldavis('/Users/williamjaubert/Documents/Allianz_William/', 'pyldavis_test_func')" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Step 7: Testing model on unseen document" + ] + }, + { + "cell_type": "code", + "execution_count": 74, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Subject: help\n", + "From: C..Doelle@p26.f3333.n106.z1.fidonet.org (C. Doelle)\n", + "Lines: 13\n", + "\n", + "Hello All!\n", + "\n", + " It is my understanding that all True-Type fonts in Windows are loaded in\n", + "prior to starting Windows - this makes getting into Windows quite slow if you\n", + "have hundreds of them as I do. First off, am I correct in this thinking -\n", + "secondly, if that is the case - can you get Windows to ignore them on boot and\n", + "maybe make something like a PIF file to load them only when you enter the\n", + "applications that need fonts? Any ideas?\n", + "\n", + "\n", + "Chris\n", + "\n", + " * Origin: chris.doelle.@f3333.n106.z1.fidonet.org (1:106/3333.26)\n", + "\n" + ] + } + ], + "source": [ + "unseen_document = newsgroups_test.data[100]\n", + "print(unseen_document)" + ] + }, + { + "cell_type": "code", + "execution_count": 75, + "metadata": {}, + "outputs": [], + "source": [ + "# Data preprocessing step for the unseen document\n", + "bow_new = dictionary.doc2bow(preprocess(unseen_document))" + ] + }, + { + "cell_type": "code", + "execution_count": 48, + "metadata": {}, + "outputs": [], + "source": [ + "from nautilus_nlp.models.topic_modeling import fit_data" + ] + }, + { + "cell_type": "code", + "execution_count": 31, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "[(0, 0.0027796067),\n", + " (1, 0.002779247),\n", + " (2, 0.0027795879),\n", + " (3, 0.0027795406),\n", + " (4, 0.0027792477),\n", + " (5, 0.002779096),\n", + " (6, 0.0027791534),\n", + " (7, 0.20895894),\n", + " (8, 0.76880664),\n", + " (9, 0.0027789928)]" + ] + }, + "execution_count": 31, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "fit_data(model, bow_new)" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [], + "source": [ + "# Show the dominant topics of the new document and their keywords \n", + "from nautilus_nlp.models.topic_modeling import show_dominant_topic" + ] + }, + { + "cell_type": "code", + "execution_count": 147, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Score: 0.7688832879066467\t Topic: ['window', 'drive', 'problem', 'card', 'work']\n", + "Score: 0.2088821828365326\t Topic: ['file', 'program', 'mail', 'imag', 'inform']\n", + "Score: 0.0027796069625765085\t Topic: ['christian', 'peopl', 'believ', 'jesus', 'say']\n" + ] + } + ], + "source": [ + "show_dominant_topic(model, bow_new, 3)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "nautilus", + "language": "python", + "name": "nautilus" + }, + "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.7.3" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} From 6f58ffe774ffcaf6d52d57236848463c8eac0f4f Mon Sep 17 00:00:00 2001 From: William Jaubert <jaubert.william@gmail.com> Date: Wed, 10 Apr 2019 20:24:43 +0200 Subject: [PATCH 051/496] delete useless cells --- notebooks/TopicModeling.ipynb | 208 ++++------------------------------ 1 file changed, 19 insertions(+), 189 deletions(-) diff --git a/notebooks/TopicModeling.ipynb b/notebooks/TopicModeling.ipynb index 242629b..331b079 100644 --- a/notebooks/TopicModeling.ipynb +++ b/notebooks/TopicModeling.ipynb @@ -9,7 +9,7 @@ }, { "cell_type": "code", - "execution_count": 2, + "execution_count": 8, "metadata": {}, "outputs": [], "source": [ @@ -20,7 +20,7 @@ }, { "cell_type": "code", - "execution_count": 3, + "execution_count": 9, "metadata": {}, "outputs": [ { @@ -44,7 +44,7 @@ }, { "cell_type": "code", - "execution_count": 4, + "execution_count": 10, "metadata": {}, "outputs": [ { @@ -73,7 +73,7 @@ }, { "cell_type": "code", - "execution_count": 5, + "execution_count": 11, "metadata": {}, "outputs": [], "source": [ @@ -92,7 +92,7 @@ }, { "cell_type": "code", - "execution_count": 6, + "execution_count": 12, "metadata": {}, "outputs": [], "source": [ @@ -111,7 +111,7 @@ }, { "cell_type": "code", - "execution_count": 7, + "execution_count": 13, "metadata": {}, "outputs": [], "source": [ @@ -121,7 +121,7 @@ }, { "cell_type": "code", - "execution_count": 8, + "execution_count": 14, "metadata": {}, "outputs": [], "source": [ @@ -130,7 +130,7 @@ }, { "cell_type": "code", - "execution_count": 9, + "execution_count": 15, "metadata": {}, "outputs": [], "source": [ @@ -140,7 +140,7 @@ }, { "cell_type": "code", - "execution_count": 10, + "execution_count": 16, "metadata": {}, "outputs": [], "source": [ @@ -149,7 +149,7 @@ }, { "cell_type": "code", - "execution_count": 11, + "execution_count": 17, "metadata": {}, "outputs": [], "source": [ @@ -159,7 +159,7 @@ }, { "cell_type": "code", - "execution_count": 12, + "execution_count": 18, "metadata": {}, "outputs": [], "source": [ @@ -168,187 +168,19 @@ }, { "cell_type": "code", - "execution_count": 150, - "metadata": { - "collapsed": true - }, + "execution_count": 20, + "metadata": {}, "outputs": [ { - "data": { - "text/plain": [ - "[[(0, 1),\n", - " (1, 1),\n", - " (2, 1),\n", - " (3, 1),\n", - " (4, 1),\n", - " (5, 1),\n", - " (6, 2),\n", - " (7, 1),\n", - " (8, 1),\n", - " (9, 1),\n", - " (10, 1),\n", - " (11, 1),\n", - " (12, 1),\n", - " (13, 2),\n", - " (14, 1),\n", - " (15, 1),\n", - " (16, 1),\n", - " (17, 1),\n", - " (18, 1),\n", - " (19, 1),\n", - " (20, 1),\n", - " (21, 1),\n", - " (22, 1),\n", - " (23, 1),\n", - " (24, 1),\n", - " (25, 1),\n", - " (26, 1),\n", - " (27, 1),\n", - " (28, 1)],\n", - " [(25, 1),\n", - " (29, 1),\n", - " (30, 1),\n", - " (31, 1),\n", - " (32, 1),\n", - " (33, 1),\n", - " (34, 1),\n", - " (35, 1),\n", - " (36, 1),\n", - " (37, 2),\n", - " (38, 5),\n", - " (39, 1),\n", - " (40, 1),\n", - " (41, 1),\n", - " (42, 1),\n", - " (43, 2),\n", - " (44, 1),\n", - " (45, 2),\n", - " (46, 2),\n", - " (47, 1),\n", - " (48, 1),\n", - " (49, 1),\n", - " (50, 1),\n", - " (51, 1),\n", - " (52, 1),\n", - " (53, 1),\n", - " (54, 1),\n", - " (55, 1),\n", - " (56, 1),\n", - " (57, 3),\n", - " (58, 1),\n", - " (59, 1),\n", - " (60, 1),\n", - " (61, 1),\n", - " (62, 1),\n", - " (63, 1),\n", - " (64, 1),\n", - " (65, 1),\n", - " (66, 1),\n", - " (67, 2),\n", - " (68, 1),\n", - " (69, 1),\n", - " (70, 3),\n", - " (71, 1),\n", - " (72, 4)],\n", - " [(8, 2),\n", - " (11, 2),\n", - " (13, 2),\n", - " (25, 1),\n", - " (27, 1),\n", - " (31, 1),\n", - " (41, 2),\n", - " (45, 2),\n", - " (48, 1),\n", - " (54, 1),\n", - " (69, 1),\n", - " (73, 1),\n", - " (74, 1),\n", - " (75, 1),\n", - " (76, 1),\n", - " (77, 3),\n", - " (78, 1),\n", - " (79, 1),\n", - " (80, 1),\n", - " (81, 2),\n", - " (82, 1),\n", - " (83, 1),\n", - " (84, 1),\n", - " (85, 1),\n", - " (86, 1),\n", - " (87, 3),\n", - " (88, 1),\n", - " (89, 1),\n", - " (90, 1),\n", - " (91, 1),\n", - " (92, 1),\n", - " (93, 1),\n", - " (94, 1),\n", - " (95, 1),\n", - " (96, 1),\n", - " (97, 1),\n", - " (98, 1),\n", - " (99, 1),\n", - " (100, 1),\n", - " (101, 1),\n", - " (102, 3),\n", - " (103, 1),\n", - " (104, 1),\n", - " (105, 1),\n", - " (106, 1),\n", - " (107, 1),\n", - " (108, 1),\n", - " (109, 1),\n", - " (110, 3),\n", - " (111, 1),\n", - " (112, 1),\n", - " (113, 1),\n", - " (114, 1),\n", - " (115, 1),\n", - " (116, 2),\n", - " (117, 1),\n", - " (118, 1),\n", - " (119, 1),\n", - " (120, 1),\n", - " (121, 1),\n", - " (122, 3),\n", - " (123, 1),\n", - " (124, 1),\n", - " (125, 1),\n", - " (126, 1),\n", - " (127, 4),\n", - " (128, 3),\n", - " (129, 1),\n", - " (130, 1),\n", - " (131, 1),\n", - " (132, 1),\n", - " (133, 1),\n", - " (134, 1),\n", - " (135, 1),\n", - " (136, 1),\n", - " (137, 2),\n", - " (138, 1),\n", - " (139, 1),\n", - " (140, 2),\n", - " (141, 1),\n", - " (142, 1),\n", - " (143, 1),\n", - " (144, 1),\n", - " (145, 1),\n", - " (146, 1),\n", - " (147, 1),\n", - " (148, 1),\n", - " (149, 1),\n", - " (150, 2),\n", - " (151, 1)]]" - ] - }, - "execution_count": 150, - "metadata": {}, - "output_type": "execute_result" + "name": "stdout", + "output_type": "stream", + "text": [ + "[(13, 1), (26, 1), (55, 1), (88, 1), (99, 1), (152, 1), (153, 2), (154, 1), (155, 1), (156, 1), (157, 2), (158, 1), (159, 2), (160, 4), (161, 1), (162, 2), (163, 1), (164, 2), (165, 1), (166, 1), (167, 1), (168, 1), (169, 1), (170, 1), (171, 1), (172, 1), (173, 1), (174, 1), (175, 1), (176, 1), (177, 1), (178, 2), (179, 1), (180, 1), (181, 1), (182, 1)]\n" + ] } ], "source": [ - "bow_corpus[0:3]" + "print(bow_corpus[3])" ] }, { @@ -365,8 +197,6 @@ "outputs": [], "source": [ "# Compute coherence values for various number of topics in order to pick the optimal one\n", - "#from gensim.models import CoherenceModel\n", - "#import matplotlib.pyplot as plt\n", "from nautilus_nlp.models.topic_modeling import compute_coherence_values" ] }, From 533041c940a1e66a7947a317331d393bde1cf47a Mon Sep 17 00:00:00 2001 From: William Jaubert <jaubert.william@gmail.com> Date: Wed, 10 Apr 2019 20:31:18 +0200 Subject: [PATCH 052/496] new notebook topic modeling --- notebooks/TopicModeling.ipynb | 14 -------------- 1 file changed, 14 deletions(-) diff --git a/notebooks/TopicModeling.ipynb b/notebooks/TopicModeling.ipynb index 331b079..24fe053 100644 --- a/notebooks/TopicModeling.ipynb +++ b/notebooks/TopicModeling.ipynb @@ -235,20 +235,6 @@ "coherence_values" ] }, - { - "cell_type": "code", - "execution_count": 1, - "metadata": {}, - "outputs": [], - "source": [ - "coherence_values = [0.37900998646286865,\n", - " 0.42680154447577845,\n", - " 0.47716566398237525,\n", - " 0.5261650723885645,\n", - " 0.49607461078243215,\n", - " 0.4978727171365794]" - ] - }, { "cell_type": "code", "execution_count": 2, From 925df3c17f2b9aea37decf191929866cfba90041 Mon Sep 17 00:00:00 2001 From: hugovasselin <waaaouu@gmail.com> Date: Thu, 11 Apr 2019 09:31:58 +0200 Subject: [PATCH 053/496] remove duplicates --- requirements.txt | 11 +---------- 1 file changed, 1 insertion(+), 10 deletions(-) diff --git a/requirements.txt b/requirements.txt index c862dcf..d94c612 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,6 +1,5 @@ # local package --e . -os +#-e . # external requirements click @@ -18,28 +17,20 @@ gensim==3.7.1 sacremoses==0.0.13 stop-words==2018.7.23 spacy==2.1.3 -scikit-learn>=0.17.0 ftfy==5.5.1 -ftfy>=4.2.0,<5.0.0 wordcloud>=1.5.0 matplotlib>=3.0.3 -chardet -nltk mosestokenizer numpy>1.15.4 stop_words==2018.7.23 nltk==3.4 textblob==0.15.3 textblob_fr==0.2.0 -spacy==2.1.0 cld2_cffi==0.1.4 -matplotlib==3.0.3 pandas==0.23.4 chardet==3.0.4 setuptools==40.8.0 -ftfy==4.4.3 textacy==0.6.3 -wordcloud==1.5.0 #fastText==0.8.3 gensim==3.7.1 scikit_learn==0.20.3 From 6c5c40054f4f4f513d3b3c67fa2f2e8c9e4fc9b2 Mon Sep 17 00:00:00 2001 From: Robin <rdoume@gmail.com> Date: Fri, 12 Apr 2019 12:06:41 +0200 Subject: [PATCH 054/496] Add travis config --- .travis.yml | 10 ++++++++++ 1 file changed, 10 insertions(+) create mode 100644 .travis.yml diff --git a/.travis.yml b/.travis.yml new file mode 100644 index 0000000..c7870ba --- /dev/null +++ b/.travis.yml @@ -0,0 +1,10 @@ +language: python +python: + - "3.5" + - "3.6" + - "3.7" +cache: pip +install: + - pip install -r requirements.txt +script: + - pytest tests/* From 7495be0bdde2a5bbc40b7c88f479f706fe4859d8 Mon Sep 17 00:00:00 2001 From: Robin <rdoume@gmail.com> Date: Fri, 12 Apr 2019 12:14:35 +0200 Subject: [PATCH 055/496] change travis config --- .travis.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index c7870ba..48cb9a3 100644 --- a/.travis.yml +++ b/.travis.yml @@ -5,6 +5,6 @@ python: - "3.7" cache: pip install: - - pip install -r requirements.txt + - pip install -e . script: - pytest tests/* From ec92b2bed7ab2d24b2f5a64856425b5fd0eb92b0 Mon Sep 17 00:00:00 2001 From: Robin <rdoume@gmail.com> Date: Fri, 12 Apr 2019 12:22:19 +0200 Subject: [PATCH 056/496] travis again --- .travis.yml | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/.travis.yml b/.travis.yml index 48cb9a3..056e025 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,10 +1,9 @@ language: python python: - - "3.5" - - "3.6" - "3.7" -cache: pip + install: + - pip install -r requirements.txt - pip install -e . script: - pytest tests/* From 68a7b7fb06d10f6344662419d1cb0237deff31a1 Mon Sep 17 00:00:00 2001 From: Robin <rdoume@gmail.com> Date: Fri, 12 Apr 2019 12:26:11 +0200 Subject: [PATCH 057/496] travis again --- .travis.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index 056e025..97a5f7c 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,7 +1,7 @@ language: python python: - "3.7" - +dist: xenial install: - pip install -r requirements.txt - pip install -e . From 6f0b79607cd9c63f92c041b65b6ca3d66dba0de1 Mon Sep 17 00:00:00 2001 From: hugovasselin <waaaouu@gmail.com> Date: Fri, 12 Apr 2019 15:28:55 +0200 Subject: [PATCH 058/496] remove old encoding fct --- nautilus_nlp/utils/encoding.py | 50 ---------------------------------- 1 file changed, 50 deletions(-) delete mode 100644 nautilus_nlp/utils/encoding.py diff --git a/nautilus_nlp/utils/encoding.py b/nautilus_nlp/utils/encoding.py deleted file mode 100644 index 22cfa10..0000000 --- a/nautilus_nlp/utils/encoding.py +++ /dev/null @@ -1,50 +0,0 @@ -import pandas as pd -import chardet -import glob -import json - -#Import an encoded csv or txt file as a pandas DataFrame -def import_from_file_as_pd(file, sep=',', header = None, verbose=True): - encods = ['utf-8', 'ISO-8859-1', 'latin1', 'cp1252'] - try: - for encod in encods: - try: - data = pd.read_csv(file, sep = sep, encoding = encod, header=header) - break - except: - continue - if verbose: - print('Success:',encod) - except: - rawdata = open(file, 'rb').read() - result = chardet.detect(rawdata)['encoding'] - print(result) - data = pd.read_csv(file, encoding = result, header=header) - return data - - -#Import encoded csv or txt files from a folder as a pandas DataFrame -def import_from_folder_as_pd(path, sep = ',', verbose=False): - all_files = glob.glob(path + "/*.csv") - li = [] - - for file in all_files: - data = import_from_file_as_pd(file, sep = sep, verbose=verbose) - li.append(data) - - frame = pd.concat(li, axis=0) - return frame - -#Import a json file as a pandas DataFrame -def import_json_to_pd(file): - with open(file) as json_file: - data = json.load(json_file) - json.dumps(data) - df = pd.DataFrame(data) - return df - -#Import a json file as a dictionary -def json_to_dict(file): - with open(file) as json_file: - data = json.load(json_file) - return data \ No newline at end of file From 0cbccb3f72a009520c3e5b039f07a1c3ea82d151 Mon Sep 17 00:00:00 2001 From: hugovasselin <waaaouu@gmail.com> Date: Fri, 12 Apr 2019 19:23:37 +0200 Subject: [PATCH 059/496] remove export --- nautilus_nlp/utils/export.py | 9 --------- 1 file changed, 9 deletions(-) delete mode 100644 nautilus_nlp/utils/export.py diff --git a/nautilus_nlp/utils/export.py b/nautilus_nlp/utils/export.py deleted file mode 100644 index d6b4ad5..0000000 --- a/nautilus_nlp/utils/export.py +++ /dev/null @@ -1,9 +0,0 @@ -import pandas as pd - -#Save a pandas DataFrame as an encoded csv file -def df_to_csv (df, path, sep =',', encoding='utf-8'): - df.to_csv(path, sep = sep, encoding = encoding) - -#Save a pandas DataFrame as a json file -def df_to_json (df, path, orient): - df.to_json(path, orient = orient) \ No newline at end of file From 5e467a14c99033007809a11bbc7aa502406c02ec Mon Sep 17 00:00:00 2001 From: hugovasselin <waaaouu@gmail.com> Date: Fri, 12 Apr 2019 19:45:13 +0200 Subject: [PATCH 060/496] add link to features list --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index a05d090..5389924 100644 --- a/README.md +++ b/README.md @@ -10,6 +10,7 @@ This library can help you with: 3. Training automatically multiclass, multilabel classifier 4. Help you discover topics and cluster your data +You can find a list of the available features [in this article.](https://artefactory.atlassian.net/wiki/spaces/CK/pages/822837299/Nautilus+NLP+-+key+features) # Feature Request From fabca9fce906a0c67ca22ce471f6a529f06591a4 Mon Sep 17 00:00:00 2001 From: hugovasselin <waaaouu@gmail.com> Date: Fri, 12 Apr 2019 19:45:29 +0200 Subject: [PATCH 061/496] fix ftfy --- requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements.txt b/requirements.txt index d94c612..11f2c9d 100644 --- a/requirements.txt +++ b/requirements.txt @@ -17,7 +17,7 @@ gensim==3.7.1 sacremoses==0.0.13 stop-words==2018.7.23 spacy==2.1.3 -ftfy==5.5.1 +ftfy<5.0.0,>=4.2.0 wordcloud>=1.5.0 matplotlib>=3.0.3 mosestokenizer From b3a99e8200d1a423e0441854ecc2bc9a57b794f4 Mon Sep 17 00:00:00 2001 From: hugovasselin <waaaouu@gmail.com> Date: Fri, 12 Apr 2019 20:53:39 +0200 Subject: [PATCH 062/496] add stopwords issue #57 --- nautilus_nlp/config/config.py | 5 +++ nautilus_nlp/data/country_code.json | 1 + nautilus_nlp/utils/constants.py | 5 ++- nautilus_nlp/utils/preprocess.py | 48 ++++++++++++++++++++++++++++- 4 files changed, 55 insertions(+), 4 deletions(-) create mode 100644 nautilus_nlp/data/country_code.json diff --git a/nautilus_nlp/config/config.py b/nautilus_nlp/config/config.py index 2081394..ed87b43 100644 --- a/nautilus_nlp/config/config.py +++ b/nautilus_nlp/config/config.py @@ -1,4 +1,9 @@ #!/usr/local/bin/python3 +import os path_data = "data/" langmodel_name = "lid.176.ftz" + +ROOT_FOLDER = os.path.abspath(os.path.join(os.path.dirname(__file__), '..')) + +COUNTRY_MAPPING_ISO = {'af': 'Afghanistan', 'ax': 'Åland Islands', 'al': 'Albania', 'dz': 'Algeria', 'as': 'American Samoa', 'ad': 'Andorra', 'ao': 'Angola', 'ai': 'Anguilla', 'aq': 'Antarctica', 'ag': 'Antigua and Barbuda', 'ar': 'Argentina', 'am': 'Armenia', 'aw': 'Aruba', 'au': 'Australia', 'at': 'Austria', 'az': 'Azerbaijan', 'bs': 'Bahamas', 'bh': 'Bahrain', 'bd': 'Bangladesh', 'bb': 'Barbados', 'by': 'Belarus', 'be': 'Belgium', 'bz': 'Belize', 'bj': 'Benin', 'bm': 'Bermuda', 'bt': 'Bhutan', 'bo': 'Bolivia (Plurinational State of)', 'bq': 'Bonaire, Sint Eustatius and Saba', 'ba': 'Bosnia and Herzegovina', 'bw': 'Botswana', 'bv': 'Bouvet Island', 'br': 'Brazil', 'io': 'British Indian Ocean Territory', 'bn': 'Brunei Darussalam', 'bg': 'Bulgaria', 'bf': 'Burkina Faso', 'bi': 'Burundi', 'cv': 'Cabo Verde', 'kh': 'Cambodia', 'cm': 'Cameroon', 'ca': 'Canada', 'ky': 'Cayman Islands', 'cf': 'Central African Republic', 'td': 'Chad', 'cl': 'Chile', 'cn': 'China', 'cx': 'Christmas Island', 'cc': 'Cocos (Keeling) Islands', 'co': 'Colombia', 'km': 'Comoros', 'cg': 'Congo', 'cd': 'Congo, Democratic Republic of the', 'ck': 'Cook Islands', 'cr': 'Costa Rica', 'ci': "Côte d'Ivoire", 'hr': 'Croatia', 'cu': 'Cuba', 'cw': 'Curaçao', 'cy': 'Cyprus', 'cz': 'Czechia', 'dk': 'Denmark', 'dj': 'Djibouti', 'dm': 'Dominica', 'do': 'Dominican Republic', 'ec': 'Ecuador', 'eg': 'Egypt', 'sv': 'El Salvador', 'gq': 'Equatorial Guinea', 'er': 'Eritrea', 'ee': 'Estonia', 'sz': 'Eswatini', 'et': 'Ethiopia', 'fk': 'Falkland Islands (Malvinas)', 'fo': 'Faroe Islands', 'fj': 'Fiji', 'fi': 'Finland', 'fr': 'France', 'gf': 'French Guiana', 'pf': 'French Polynesia', 'tf': 'French Southern Territories', 'ga': 'Gabon', 'gm': 'Gambia', 'ge': 'Georgia', 'de': 'Germany', 'gh': 'Ghana', 'gi': 'Gibraltar', 'gr': 'Greece', 'gl': 'Greenland', 'gd': 'Grenada', 'gp': 'Guadeloupe', 'gu': 'Guam', 'gt': 'Guatemala', 'gg': 'Guernsey', 'gn': 'Guinea', 'gw': 'Guinea-Bissau', 'gy': 'Guyana', 'ht': 'Haiti', 'hm': 'Heard Island and McDonald Islands', 'va': 'Holy See', 'hn': 'Honduras', 'hk': 'Hong Kong', 'hu': 'Hungary', 'is': 'Iceland', 'in': 'India', 'id': 'Indonesia', 'ir': 'Iran (Islamic Republic of)', 'iq': 'Iraq', 'ie': 'Ireland', 'im': 'Isle of Man', 'il': 'Israel', 'it': 'Italy', 'jm': 'Jamaica', 'jp': 'Japan', 'je': 'Jersey', 'jo': 'Jordan', 'kz': 'Kazakhstan', 'ke': 'Kenya', 'ki': 'Kiribati', 'kp': "Korea (Democratic People's Republic of)", 'kr': 'Korea, Republic of', 'kw': 'Kuwait', 'kg': 'Kyrgyzstan', 'la': "Lao People's Democratic Republic", 'lv': 'Latvia', 'lb': 'Lebanon', 'ls': 'Lesotho', 'lr': 'Liberia', 'ly': 'Libya', 'li': 'Liechtenstein', 'lt': 'Lithuania', 'lu': 'Luxembourg', 'mo': 'Macao', 'mg': 'Madagascar', 'mw': 'Malawi', 'my': 'Malaysia', 'mv': 'Maldives', 'ml': 'Mali', 'mt': 'Malta', 'mh': 'Marshall Islands', 'mq': 'Martinique', 'mr': 'Mauritania', 'mu': 'Mauritius', 'yt': 'Mayotte', 'mx': 'Mexico', 'fm': 'Micronesia (Federated States of)', 'md': 'Moldova, Republic of', 'mc': 'Monaco', 'mn': 'Mongolia', 'me': 'Montenegro', 'ms': 'Montserrat', 'ma': 'Morocco', 'mz': 'Mozambique', 'mm': 'Myanmar', 'na': 'Namibia', 'nr': 'Nauru', 'np': 'Nepal', 'nl': 'Netherlands', 'nc': 'New Caledonia', 'nz': 'New Zealand', 'ni': 'Nicaragua', 'ne': 'Niger', 'ng': 'Nigeria', 'nu': 'Niue', 'nf': 'Norfolk Island', 'mk': 'North Macedonia', 'mp': 'Northern Mariana Islands', 'no': 'Norway', 'om': 'Oman', 'pk': 'Pakistan', 'pw': 'Palau', 'ps': 'Palestine, State of', 'pa': 'Panama', 'pg': 'Papua New Guinea', 'py': 'Paraguay', 'pe': 'Peru', 'ph': 'Philippines', 'pn': 'Pitcairn', 'pl': 'Poland', 'pt': 'Portugal', 'pr': 'Puerto Rico', 'qa': 'Qatar', 're': 'Réunion', 'ro': 'Romania', 'ru': 'Russian Federation', 'rw': 'Rwanda', 'bl': 'Saint Barthélemy', 'sh': 'Saint Helena, Ascension and Tristan da Cunha', 'kn': 'Saint Kitts and Nevis', 'lc': 'Saint Lucia', 'mf': 'Saint Martin (French part)', 'pm': 'Saint Pierre and Miquelon', 'vc': 'Saint Vincent and the Grenadines', 'ws': 'Samoa', 'sm': 'San Marino', 'st': 'Sao Tome and Principe', 'sa': 'Saudi Arabia', 'sn': 'Senegal', 'rs': 'Serbia', 'sc': 'Seychelles', 'sl': 'Sierra Leone', 'sg': 'Singapore', 'sx': 'Sint Maarten (Dutch part)', 'sk': 'Slovakia', 'si': 'Slovenia', 'sb': 'Solomon Islands', 'so': 'Somalia', 'za': 'South Africa', 'gs': 'South Georgia and the South Sandwich Islands', 'ss': 'South Sudan', 'es': 'Spain', 'lk': 'Sri Lanka', 'sd': 'Sudan', 'sr': 'Suriname', 'sj': 'Svalbard and Jan Mayen', 'se': 'Sweden', 'ch': 'Switzerland', 'sy': 'Syrian Arab Republic', 'tw': 'Taiwan, Province of China', 'tj': 'Tajikistan', 'tz': 'Tanzania, United Republic of', 'th': 'Thailand', 'tl': 'Timor-Leste', 'tg': 'Togo', 'tk': 'Tokelau', 'to': 'Tonga', 'tt': 'Trinidad and Tobago', 'tn': 'Tunisia', 'tr': 'Turkey', 'tm': 'Turkmenistan', 'tc': 'Turks and Caicos Islands', 'tv': 'Tuvalu', 'ug': 'Uganda', 'ua': 'Ukraine', 'ae': 'United Arab Emirates', 'gb': 'United Kingdom of Great Britain and Northern Ireland', 'us': 'United States of America', 'um': 'United States Minor Outlying Islands', 'uy': 'Uruguay', 'uz': 'Uzbekistan', 'vu': 'Vanuatu', 've': 'Venezuela (Bolivarian Republic of)', 'vn': 'Viet Nam', 'vg': 'Virgin Islands (British)', 'vi': 'Virgin Islands (U.S.)', 'wf': 'Wallis and Futuna', 'eh': 'Western Sahara', 'ye': 'Yemen', 'zm': 'Zambia', 'zw': 'Zimbabwe'} \ No newline at end of file diff --git a/nautilus_nlp/data/country_code.json b/nautilus_nlp/data/country_code.json new file mode 100644 index 0000000..82ae350 --- /dev/null +++ b/nautilus_nlp/data/country_code.json @@ -0,0 +1 @@ +[{"name":"Afghanistan","alpha-2":"AF","alpha-3":"AFG","country-code":"004","iso_3166-2":"ISO 3166-2:AF","region":"Asia","sub-region":"Southern Asia","intermediate-region":"","region-code":"142","sub-region-code":"034","intermediate-region-code":""},{"name":"Åland Islands","alpha-2":"AX","alpha-3":"ALA","country-code":"248","iso_3166-2":"ISO 3166-2:AX","region":"Europe","sub-region":"Northern Europe","intermediate-region":"","region-code":"150","sub-region-code":"154","intermediate-region-code":""},{"name":"Albania","alpha-2":"AL","alpha-3":"ALB","country-code":"008","iso_3166-2":"ISO 3166-2:AL","region":"Europe","sub-region":"Southern Europe","intermediate-region":"","region-code":"150","sub-region-code":"039","intermediate-region-code":""},{"name":"Algeria","alpha-2":"DZ","alpha-3":"DZA","country-code":"012","iso_3166-2":"ISO 3166-2:DZ","region":"Africa","sub-region":"Northern Africa","intermediate-region":"","region-code":"002","sub-region-code":"015","intermediate-region-code":""},{"name":"American Samoa","alpha-2":"AS","alpha-3":"ASM","country-code":"016","iso_3166-2":"ISO 3166-2:AS","region":"Oceania","sub-region":"Polynesia","intermediate-region":"","region-code":"009","sub-region-code":"061","intermediate-region-code":""},{"name":"Andorra","alpha-2":"AD","alpha-3":"AND","country-code":"020","iso_3166-2":"ISO 3166-2:AD","region":"Europe","sub-region":"Southern Europe","intermediate-region":"","region-code":"150","sub-region-code":"039","intermediate-region-code":""},{"name":"Angola","alpha-2":"AO","alpha-3":"AGO","country-code":"024","iso_3166-2":"ISO 3166-2:AO","region":"Africa","sub-region":"Sub-Saharan Africa","intermediate-region":"Middle Africa","region-code":"002","sub-region-code":"202","intermediate-region-code":"017"},{"name":"Anguilla","alpha-2":"AI","alpha-3":"AIA","country-code":"660","iso_3166-2":"ISO 3166-2:AI","region":"Americas","sub-region":"Latin America and the Caribbean","intermediate-region":"Caribbean","region-code":"019","sub-region-code":"419","intermediate-region-code":"029"},{"name":"Antarctica","alpha-2":"AQ","alpha-3":"ATA","country-code":"010","iso_3166-2":"ISO 3166-2:AQ","region":"","sub-region":"","intermediate-region":"","region-code":"","sub-region-code":"","intermediate-region-code":""},{"name":"Antigua and Barbuda","alpha-2":"AG","alpha-3":"ATG","country-code":"028","iso_3166-2":"ISO 3166-2:AG","region":"Americas","sub-region":"Latin America and the Caribbean","intermediate-region":"Caribbean","region-code":"019","sub-region-code":"419","intermediate-region-code":"029"},{"name":"Argentina","alpha-2":"AR","alpha-3":"ARG","country-code":"032","iso_3166-2":"ISO 3166-2:AR","region":"Americas","sub-region":"Latin America and the Caribbean","intermediate-region":"South America","region-code":"019","sub-region-code":"419","intermediate-region-code":"005"},{"name":"Armenia","alpha-2":"AM","alpha-3":"ARM","country-code":"051","iso_3166-2":"ISO 3166-2:AM","region":"Asia","sub-region":"Western Asia","intermediate-region":"","region-code":"142","sub-region-code":"145","intermediate-region-code":""},{"name":"Aruba","alpha-2":"AW","alpha-3":"ABW","country-code":"533","iso_3166-2":"ISO 3166-2:AW","region":"Americas","sub-region":"Latin America and the Caribbean","intermediate-region":"Caribbean","region-code":"019","sub-region-code":"419","intermediate-region-code":"029"},{"name":"Australia","alpha-2":"AU","alpha-3":"AUS","country-code":"036","iso_3166-2":"ISO 3166-2:AU","region":"Oceania","sub-region":"Australia and New Zealand","intermediate-region":"","region-code":"009","sub-region-code":"053","intermediate-region-code":""},{"name":"Austria","alpha-2":"AT","alpha-3":"AUT","country-code":"040","iso_3166-2":"ISO 3166-2:AT","region":"Europe","sub-region":"Western Europe","intermediate-region":"","region-code":"150","sub-region-code":"155","intermediate-region-code":""},{"name":"Azerbaijan","alpha-2":"AZ","alpha-3":"AZE","country-code":"031","iso_3166-2":"ISO 3166-2:AZ","region":"Asia","sub-region":"Western Asia","intermediate-region":"","region-code":"142","sub-region-code":"145","intermediate-region-code":""},{"name":"Bahamas","alpha-2":"BS","alpha-3":"BHS","country-code":"044","iso_3166-2":"ISO 3166-2:BS","region":"Americas","sub-region":"Latin America and the Caribbean","intermediate-region":"Caribbean","region-code":"019","sub-region-code":"419","intermediate-region-code":"029"},{"name":"Bahrain","alpha-2":"BH","alpha-3":"BHR","country-code":"048","iso_3166-2":"ISO 3166-2:BH","region":"Asia","sub-region":"Western Asia","intermediate-region":"","region-code":"142","sub-region-code":"145","intermediate-region-code":""},{"name":"Bangladesh","alpha-2":"BD","alpha-3":"BGD","country-code":"050","iso_3166-2":"ISO 3166-2:BD","region":"Asia","sub-region":"Southern Asia","intermediate-region":"","region-code":"142","sub-region-code":"034","intermediate-region-code":""},{"name":"Barbados","alpha-2":"BB","alpha-3":"BRB","country-code":"052","iso_3166-2":"ISO 3166-2:BB","region":"Americas","sub-region":"Latin America and the Caribbean","intermediate-region":"Caribbean","region-code":"019","sub-region-code":"419","intermediate-region-code":"029"},{"name":"Belarus","alpha-2":"BY","alpha-3":"BLR","country-code":"112","iso_3166-2":"ISO 3166-2:BY","region":"Europe","sub-region":"Eastern Europe","intermediate-region":"","region-code":"150","sub-region-code":"151","intermediate-region-code":""},{"name":"Belgium","alpha-2":"BE","alpha-3":"BEL","country-code":"056","iso_3166-2":"ISO 3166-2:BE","region":"Europe","sub-region":"Western Europe","intermediate-region":"","region-code":"150","sub-region-code":"155","intermediate-region-code":""},{"name":"Belize","alpha-2":"BZ","alpha-3":"BLZ","country-code":"084","iso_3166-2":"ISO 3166-2:BZ","region":"Americas","sub-region":"Latin America and the Caribbean","intermediate-region":"Central America","region-code":"019","sub-region-code":"419","intermediate-region-code":"013"},{"name":"Benin","alpha-2":"BJ","alpha-3":"BEN","country-code":"204","iso_3166-2":"ISO 3166-2:BJ","region":"Africa","sub-region":"Sub-Saharan Africa","intermediate-region":"Western Africa","region-code":"002","sub-region-code":"202","intermediate-region-code":"011"},{"name":"Bermuda","alpha-2":"BM","alpha-3":"BMU","country-code":"060","iso_3166-2":"ISO 3166-2:BM","region":"Americas","sub-region":"Northern America","intermediate-region":"","region-code":"019","sub-region-code":"021","intermediate-region-code":""},{"name":"Bhutan","alpha-2":"BT","alpha-3":"BTN","country-code":"064","iso_3166-2":"ISO 3166-2:BT","region":"Asia","sub-region":"Southern Asia","intermediate-region":"","region-code":"142","sub-region-code":"034","intermediate-region-code":""},{"name":"Bolivia (Plurinational State of)","alpha-2":"BO","alpha-3":"BOL","country-code":"068","iso_3166-2":"ISO 3166-2:BO","region":"Americas","sub-region":"Latin America and the Caribbean","intermediate-region":"South America","region-code":"019","sub-region-code":"419","intermediate-region-code":"005"},{"name":"Bonaire, Sint Eustatius and Saba","alpha-2":"BQ","alpha-3":"BES","country-code":"535","iso_3166-2":"ISO 3166-2:BQ","region":"Americas","sub-region":"Latin America and the Caribbean","intermediate-region":"Caribbean","region-code":"019","sub-region-code":"419","intermediate-region-code":"029"},{"name":"Bosnia and Herzegovina","alpha-2":"BA","alpha-3":"BIH","country-code":"070","iso_3166-2":"ISO 3166-2:BA","region":"Europe","sub-region":"Southern Europe","intermediate-region":"","region-code":"150","sub-region-code":"039","intermediate-region-code":""},{"name":"Botswana","alpha-2":"BW","alpha-3":"BWA","country-code":"072","iso_3166-2":"ISO 3166-2:BW","region":"Africa","sub-region":"Sub-Saharan Africa","intermediate-region":"Southern Africa","region-code":"002","sub-region-code":"202","intermediate-region-code":"018"},{"name":"Bouvet Island","alpha-2":"BV","alpha-3":"BVT","country-code":"074","iso_3166-2":"ISO 3166-2:BV","region":"Americas","sub-region":"Latin America and the Caribbean","intermediate-region":"South America","region-code":"019","sub-region-code":"419","intermediate-region-code":"005"},{"name":"Brazil","alpha-2":"BR","alpha-3":"BRA","country-code":"076","iso_3166-2":"ISO 3166-2:BR","region":"Americas","sub-region":"Latin America and the Caribbean","intermediate-region":"South America","region-code":"019","sub-region-code":"419","intermediate-region-code":"005"},{"name":"British Indian Ocean Territory","alpha-2":"IO","alpha-3":"IOT","country-code":"086","iso_3166-2":"ISO 3166-2:IO","region":"Africa","sub-region":"Sub-Saharan Africa","intermediate-region":"Eastern Africa","region-code":"002","sub-region-code":"202","intermediate-region-code":"014"},{"name":"Brunei Darussalam","alpha-2":"BN","alpha-3":"BRN","country-code":"096","iso_3166-2":"ISO 3166-2:BN","region":"Asia","sub-region":"South-eastern Asia","intermediate-region":"","region-code":"142","sub-region-code":"035","intermediate-region-code":""},{"name":"Bulgaria","alpha-2":"BG","alpha-3":"BGR","country-code":"100","iso_3166-2":"ISO 3166-2:BG","region":"Europe","sub-region":"Eastern Europe","intermediate-region":"","region-code":"150","sub-region-code":"151","intermediate-region-code":""},{"name":"Burkina Faso","alpha-2":"BF","alpha-3":"BFA","country-code":"854","iso_3166-2":"ISO 3166-2:BF","region":"Africa","sub-region":"Sub-Saharan Africa","intermediate-region":"Western Africa","region-code":"002","sub-region-code":"202","intermediate-region-code":"011"},{"name":"Burundi","alpha-2":"BI","alpha-3":"BDI","country-code":"108","iso_3166-2":"ISO 3166-2:BI","region":"Africa","sub-region":"Sub-Saharan Africa","intermediate-region":"Eastern Africa","region-code":"002","sub-region-code":"202","intermediate-region-code":"014"},{"name":"Cabo Verde","alpha-2":"CV","alpha-3":"CPV","country-code":"132","iso_3166-2":"ISO 3166-2:CV","region":"Africa","sub-region":"Sub-Saharan Africa","intermediate-region":"Western Africa","region-code":"002","sub-region-code":"202","intermediate-region-code":"011"},{"name":"Cambodia","alpha-2":"KH","alpha-3":"KHM","country-code":"116","iso_3166-2":"ISO 3166-2:KH","region":"Asia","sub-region":"South-eastern Asia","intermediate-region":"","region-code":"142","sub-region-code":"035","intermediate-region-code":""},{"name":"Cameroon","alpha-2":"CM","alpha-3":"CMR","country-code":"120","iso_3166-2":"ISO 3166-2:CM","region":"Africa","sub-region":"Sub-Saharan Africa","intermediate-region":"Middle Africa","region-code":"002","sub-region-code":"202","intermediate-region-code":"017"},{"name":"Canada","alpha-2":"CA","alpha-3":"CAN","country-code":"124","iso_3166-2":"ISO 3166-2:CA","region":"Americas","sub-region":"Northern America","intermediate-region":"","region-code":"019","sub-region-code":"021","intermediate-region-code":""},{"name":"Cayman Islands","alpha-2":"KY","alpha-3":"CYM","country-code":"136","iso_3166-2":"ISO 3166-2:KY","region":"Americas","sub-region":"Latin America and the Caribbean","intermediate-region":"Caribbean","region-code":"019","sub-region-code":"419","intermediate-region-code":"029"},{"name":"Central African Republic","alpha-2":"CF","alpha-3":"CAF","country-code":"140","iso_3166-2":"ISO 3166-2:CF","region":"Africa","sub-region":"Sub-Saharan Africa","intermediate-region":"Middle Africa","region-code":"002","sub-region-code":"202","intermediate-region-code":"017"},{"name":"Chad","alpha-2":"TD","alpha-3":"TCD","country-code":"148","iso_3166-2":"ISO 3166-2:TD","region":"Africa","sub-region":"Sub-Saharan Africa","intermediate-region":"Middle Africa","region-code":"002","sub-region-code":"202","intermediate-region-code":"017"},{"name":"Chile","alpha-2":"CL","alpha-3":"CHL","country-code":"152","iso_3166-2":"ISO 3166-2:CL","region":"Americas","sub-region":"Latin America and the Caribbean","intermediate-region":"South America","region-code":"019","sub-region-code":"419","intermediate-region-code":"005"},{"name":"China","alpha-2":"CN","alpha-3":"CHN","country-code":"156","iso_3166-2":"ISO 3166-2:CN","region":"Asia","sub-region":"Eastern Asia","intermediate-region":"","region-code":"142","sub-region-code":"030","intermediate-region-code":""},{"name":"Christmas Island","alpha-2":"CX","alpha-3":"CXR","country-code":"162","iso_3166-2":"ISO 3166-2:CX","region":"Oceania","sub-region":"Australia and New Zealand","intermediate-region":"","region-code":"009","sub-region-code":"053","intermediate-region-code":""},{"name":"Cocos (Keeling) Islands","alpha-2":"CC","alpha-3":"CCK","country-code":"166","iso_3166-2":"ISO 3166-2:CC","region":"Oceania","sub-region":"Australia and New Zealand","intermediate-region":"","region-code":"009","sub-region-code":"053","intermediate-region-code":""},{"name":"Colombia","alpha-2":"CO","alpha-3":"COL","country-code":"170","iso_3166-2":"ISO 3166-2:CO","region":"Americas","sub-region":"Latin America and the Caribbean","intermediate-region":"South America","region-code":"019","sub-region-code":"419","intermediate-region-code":"005"},{"name":"Comoros","alpha-2":"KM","alpha-3":"COM","country-code":"174","iso_3166-2":"ISO 3166-2:KM","region":"Africa","sub-region":"Sub-Saharan Africa","intermediate-region":"Eastern Africa","region-code":"002","sub-region-code":"202","intermediate-region-code":"014"},{"name":"Congo","alpha-2":"CG","alpha-3":"COG","country-code":"178","iso_3166-2":"ISO 3166-2:CG","region":"Africa","sub-region":"Sub-Saharan Africa","intermediate-region":"Middle Africa","region-code":"002","sub-region-code":"202","intermediate-region-code":"017"},{"name":"Congo, Democratic Republic of the","alpha-2":"CD","alpha-3":"COD","country-code":"180","iso_3166-2":"ISO 3166-2:CD","region":"Africa","sub-region":"Sub-Saharan Africa","intermediate-region":"Middle Africa","region-code":"002","sub-region-code":"202","intermediate-region-code":"017"},{"name":"Cook Islands","alpha-2":"CK","alpha-3":"COK","country-code":"184","iso_3166-2":"ISO 3166-2:CK","region":"Oceania","sub-region":"Polynesia","intermediate-region":"","region-code":"009","sub-region-code":"061","intermediate-region-code":""},{"name":"Costa Rica","alpha-2":"CR","alpha-3":"CRI","country-code":"188","iso_3166-2":"ISO 3166-2:CR","region":"Americas","sub-region":"Latin America and the Caribbean","intermediate-region":"Central America","region-code":"019","sub-region-code":"419","intermediate-region-code":"013"},{"name":"Côte d'Ivoire","alpha-2":"CI","alpha-3":"CIV","country-code":"384","iso_3166-2":"ISO 3166-2:CI","region":"Africa","sub-region":"Sub-Saharan Africa","intermediate-region":"Western Africa","region-code":"002","sub-region-code":"202","intermediate-region-code":"011"},{"name":"Croatia","alpha-2":"HR","alpha-3":"HRV","country-code":"191","iso_3166-2":"ISO 3166-2:HR","region":"Europe","sub-region":"Southern Europe","intermediate-region":"","region-code":"150","sub-region-code":"039","intermediate-region-code":""},{"name":"Cuba","alpha-2":"CU","alpha-3":"CUB","country-code":"192","iso_3166-2":"ISO 3166-2:CU","region":"Americas","sub-region":"Latin America and the Caribbean","intermediate-region":"Caribbean","region-code":"019","sub-region-code":"419","intermediate-region-code":"029"},{"name":"Curaçao","alpha-2":"CW","alpha-3":"CUW","country-code":"531","iso_3166-2":"ISO 3166-2:CW","region":"Americas","sub-region":"Latin America and the Caribbean","intermediate-region":"Caribbean","region-code":"019","sub-region-code":"419","intermediate-region-code":"029"},{"name":"Cyprus","alpha-2":"CY","alpha-3":"CYP","country-code":"196","iso_3166-2":"ISO 3166-2:CY","region":"Asia","sub-region":"Western Asia","intermediate-region":"","region-code":"142","sub-region-code":"145","intermediate-region-code":""},{"name":"Czechia","alpha-2":"CZ","alpha-3":"CZE","country-code":"203","iso_3166-2":"ISO 3166-2:CZ","region":"Europe","sub-region":"Eastern Europe","intermediate-region":"","region-code":"150","sub-region-code":"151","intermediate-region-code":""},{"name":"Denmark","alpha-2":"DK","alpha-3":"DNK","country-code":"208","iso_3166-2":"ISO 3166-2:DK","region":"Europe","sub-region":"Northern Europe","intermediate-region":"","region-code":"150","sub-region-code":"154","intermediate-region-code":""},{"name":"Djibouti","alpha-2":"DJ","alpha-3":"DJI","country-code":"262","iso_3166-2":"ISO 3166-2:DJ","region":"Africa","sub-region":"Sub-Saharan Africa","intermediate-region":"Eastern Africa","region-code":"002","sub-region-code":"202","intermediate-region-code":"014"},{"name":"Dominica","alpha-2":"DM","alpha-3":"DMA","country-code":"212","iso_3166-2":"ISO 3166-2:DM","region":"Americas","sub-region":"Latin America and the Caribbean","intermediate-region":"Caribbean","region-code":"019","sub-region-code":"419","intermediate-region-code":"029"},{"name":"Dominican Republic","alpha-2":"DO","alpha-3":"DOM","country-code":"214","iso_3166-2":"ISO 3166-2:DO","region":"Americas","sub-region":"Latin America and the Caribbean","intermediate-region":"Caribbean","region-code":"019","sub-region-code":"419","intermediate-region-code":"029"},{"name":"Ecuador","alpha-2":"EC","alpha-3":"ECU","country-code":"218","iso_3166-2":"ISO 3166-2:EC","region":"Americas","sub-region":"Latin America and the Caribbean","intermediate-region":"South America","region-code":"019","sub-region-code":"419","intermediate-region-code":"005"},{"name":"Egypt","alpha-2":"EG","alpha-3":"EGY","country-code":"818","iso_3166-2":"ISO 3166-2:EG","region":"Africa","sub-region":"Northern Africa","intermediate-region":"","region-code":"002","sub-region-code":"015","intermediate-region-code":""},{"name":"El Salvador","alpha-2":"SV","alpha-3":"SLV","country-code":"222","iso_3166-2":"ISO 3166-2:SV","region":"Americas","sub-region":"Latin America and the Caribbean","intermediate-region":"Central America","region-code":"019","sub-region-code":"419","intermediate-region-code":"013"},{"name":"Equatorial Guinea","alpha-2":"GQ","alpha-3":"GNQ","country-code":"226","iso_3166-2":"ISO 3166-2:GQ","region":"Africa","sub-region":"Sub-Saharan Africa","intermediate-region":"Middle Africa","region-code":"002","sub-region-code":"202","intermediate-region-code":"017"},{"name":"Eritrea","alpha-2":"ER","alpha-3":"ERI","country-code":"232","iso_3166-2":"ISO 3166-2:ER","region":"Africa","sub-region":"Sub-Saharan Africa","intermediate-region":"Eastern Africa","region-code":"002","sub-region-code":"202","intermediate-region-code":"014"},{"name":"Estonia","alpha-2":"EE","alpha-3":"EST","country-code":"233","iso_3166-2":"ISO 3166-2:EE","region":"Europe","sub-region":"Northern Europe","intermediate-region":"","region-code":"150","sub-region-code":"154","intermediate-region-code":""},{"name":"Eswatini","alpha-2":"SZ","alpha-3":"SWZ","country-code":"748","iso_3166-2":"ISO 3166-2:SZ","region":"Africa","sub-region":"Sub-Saharan Africa","intermediate-region":"Southern Africa","region-code":"002","sub-region-code":"202","intermediate-region-code":"018"},{"name":"Ethiopia","alpha-2":"ET","alpha-3":"ETH","country-code":"231","iso_3166-2":"ISO 3166-2:ET","region":"Africa","sub-region":"Sub-Saharan Africa","intermediate-region":"Eastern Africa","region-code":"002","sub-region-code":"202","intermediate-region-code":"014"},{"name":"Falkland Islands (Malvinas)","alpha-2":"FK","alpha-3":"FLK","country-code":"238","iso_3166-2":"ISO 3166-2:FK","region":"Americas","sub-region":"Latin America and the Caribbean","intermediate-region":"South America","region-code":"019","sub-region-code":"419","intermediate-region-code":"005"},{"name":"Faroe Islands","alpha-2":"FO","alpha-3":"FRO","country-code":"234","iso_3166-2":"ISO 3166-2:FO","region":"Europe","sub-region":"Northern Europe","intermediate-region":"","region-code":"150","sub-region-code":"154","intermediate-region-code":""},{"name":"Fiji","alpha-2":"FJ","alpha-3":"FJI","country-code":"242","iso_3166-2":"ISO 3166-2:FJ","region":"Oceania","sub-region":"Melanesia","intermediate-region":"","region-code":"009","sub-region-code":"054","intermediate-region-code":""},{"name":"Finland","alpha-2":"FI","alpha-3":"FIN","country-code":"246","iso_3166-2":"ISO 3166-2:FI","region":"Europe","sub-region":"Northern Europe","intermediate-region":"","region-code":"150","sub-region-code":"154","intermediate-region-code":""},{"name":"France","alpha-2":"FR","alpha-3":"FRA","country-code":"250","iso_3166-2":"ISO 3166-2:FR","region":"Europe","sub-region":"Western Europe","intermediate-region":"","region-code":"150","sub-region-code":"155","intermediate-region-code":""},{"name":"French Guiana","alpha-2":"GF","alpha-3":"GUF","country-code":"254","iso_3166-2":"ISO 3166-2:GF","region":"Americas","sub-region":"Latin America and the Caribbean","intermediate-region":"South America","region-code":"019","sub-region-code":"419","intermediate-region-code":"005"},{"name":"French Polynesia","alpha-2":"PF","alpha-3":"PYF","country-code":"258","iso_3166-2":"ISO 3166-2:PF","region":"Oceania","sub-region":"Polynesia","intermediate-region":"","region-code":"009","sub-region-code":"061","intermediate-region-code":""},{"name":"French Southern Territories","alpha-2":"TF","alpha-3":"ATF","country-code":"260","iso_3166-2":"ISO 3166-2:TF","region":"Africa","sub-region":"Sub-Saharan Africa","intermediate-region":"Eastern Africa","region-code":"002","sub-region-code":"202","intermediate-region-code":"014"},{"name":"Gabon","alpha-2":"GA","alpha-3":"GAB","country-code":"266","iso_3166-2":"ISO 3166-2:GA","region":"Africa","sub-region":"Sub-Saharan Africa","intermediate-region":"Middle Africa","region-code":"002","sub-region-code":"202","intermediate-region-code":"017"},{"name":"Gambia","alpha-2":"GM","alpha-3":"GMB","country-code":"270","iso_3166-2":"ISO 3166-2:GM","region":"Africa","sub-region":"Sub-Saharan Africa","intermediate-region":"Western Africa","region-code":"002","sub-region-code":"202","intermediate-region-code":"011"},{"name":"Georgia","alpha-2":"GE","alpha-3":"GEO","country-code":"268","iso_3166-2":"ISO 3166-2:GE","region":"Asia","sub-region":"Western Asia","intermediate-region":"","region-code":"142","sub-region-code":"145","intermediate-region-code":""},{"name":"Germany","alpha-2":"DE","alpha-3":"DEU","country-code":"276","iso_3166-2":"ISO 3166-2:DE","region":"Europe","sub-region":"Western Europe","intermediate-region":"","region-code":"150","sub-region-code":"155","intermediate-region-code":""},{"name":"Ghana","alpha-2":"GH","alpha-3":"GHA","country-code":"288","iso_3166-2":"ISO 3166-2:GH","region":"Africa","sub-region":"Sub-Saharan Africa","intermediate-region":"Western Africa","region-code":"002","sub-region-code":"202","intermediate-region-code":"011"},{"name":"Gibraltar","alpha-2":"GI","alpha-3":"GIB","country-code":"292","iso_3166-2":"ISO 3166-2:GI","region":"Europe","sub-region":"Southern Europe","intermediate-region":"","region-code":"150","sub-region-code":"039","intermediate-region-code":""},{"name":"Greece","alpha-2":"GR","alpha-3":"GRC","country-code":"300","iso_3166-2":"ISO 3166-2:GR","region":"Europe","sub-region":"Southern Europe","intermediate-region":"","region-code":"150","sub-region-code":"039","intermediate-region-code":""},{"name":"Greenland","alpha-2":"GL","alpha-3":"GRL","country-code":"304","iso_3166-2":"ISO 3166-2:GL","region":"Americas","sub-region":"Northern America","intermediate-region":"","region-code":"019","sub-region-code":"021","intermediate-region-code":""},{"name":"Grenada","alpha-2":"GD","alpha-3":"GRD","country-code":"308","iso_3166-2":"ISO 3166-2:GD","region":"Americas","sub-region":"Latin America and the Caribbean","intermediate-region":"Caribbean","region-code":"019","sub-region-code":"419","intermediate-region-code":"029"},{"name":"Guadeloupe","alpha-2":"GP","alpha-3":"GLP","country-code":"312","iso_3166-2":"ISO 3166-2:GP","region":"Americas","sub-region":"Latin America and the Caribbean","intermediate-region":"Caribbean","region-code":"019","sub-region-code":"419","intermediate-region-code":"029"},{"name":"Guam","alpha-2":"GU","alpha-3":"GUM","country-code":"316","iso_3166-2":"ISO 3166-2:GU","region":"Oceania","sub-region":"Micronesia","intermediate-region":"","region-code":"009","sub-region-code":"057","intermediate-region-code":""},{"name":"Guatemala","alpha-2":"GT","alpha-3":"GTM","country-code":"320","iso_3166-2":"ISO 3166-2:GT","region":"Americas","sub-region":"Latin America and the Caribbean","intermediate-region":"Central America","region-code":"019","sub-region-code":"419","intermediate-region-code":"013"},{"name":"Guernsey","alpha-2":"GG","alpha-3":"GGY","country-code":"831","iso_3166-2":"ISO 3166-2:GG","region":"Europe","sub-region":"Northern Europe","intermediate-region":"Channel Islands","region-code":"150","sub-region-code":"154","intermediate-region-code":"830"},{"name":"Guinea","alpha-2":"GN","alpha-3":"GIN","country-code":"324","iso_3166-2":"ISO 3166-2:GN","region":"Africa","sub-region":"Sub-Saharan Africa","intermediate-region":"Western Africa","region-code":"002","sub-region-code":"202","intermediate-region-code":"011"},{"name":"Guinea-Bissau","alpha-2":"GW","alpha-3":"GNB","country-code":"624","iso_3166-2":"ISO 3166-2:GW","region":"Africa","sub-region":"Sub-Saharan Africa","intermediate-region":"Western Africa","region-code":"002","sub-region-code":"202","intermediate-region-code":"011"},{"name":"Guyana","alpha-2":"GY","alpha-3":"GUY","country-code":"328","iso_3166-2":"ISO 3166-2:GY","region":"Americas","sub-region":"Latin America and the Caribbean","intermediate-region":"South America","region-code":"019","sub-region-code":"419","intermediate-region-code":"005"},{"name":"Haiti","alpha-2":"HT","alpha-3":"HTI","country-code":"332","iso_3166-2":"ISO 3166-2:HT","region":"Americas","sub-region":"Latin America and the Caribbean","intermediate-region":"Caribbean","region-code":"019","sub-region-code":"419","intermediate-region-code":"029"},{"name":"Heard Island and McDonald Islands","alpha-2":"HM","alpha-3":"HMD","country-code":"334","iso_3166-2":"ISO 3166-2:HM","region":"Oceania","sub-region":"Australia and New Zealand","intermediate-region":"","region-code":"009","sub-region-code":"053","intermediate-region-code":""},{"name":"Holy See","alpha-2":"VA","alpha-3":"VAT","country-code":"336","iso_3166-2":"ISO 3166-2:VA","region":"Europe","sub-region":"Southern Europe","intermediate-region":"","region-code":"150","sub-region-code":"039","intermediate-region-code":""},{"name":"Honduras","alpha-2":"HN","alpha-3":"HND","country-code":"340","iso_3166-2":"ISO 3166-2:HN","region":"Americas","sub-region":"Latin America and the Caribbean","intermediate-region":"Central America","region-code":"019","sub-region-code":"419","intermediate-region-code":"013"},{"name":"Hong Kong","alpha-2":"HK","alpha-3":"HKG","country-code":"344","iso_3166-2":"ISO 3166-2:HK","region":"Asia","sub-region":"Eastern Asia","intermediate-region":"","region-code":"142","sub-region-code":"030","intermediate-region-code":""},{"name":"Hungary","alpha-2":"HU","alpha-3":"HUN","country-code":"348","iso_3166-2":"ISO 3166-2:HU","region":"Europe","sub-region":"Eastern Europe","intermediate-region":"","region-code":"150","sub-region-code":"151","intermediate-region-code":""},{"name":"Iceland","alpha-2":"IS","alpha-3":"ISL","country-code":"352","iso_3166-2":"ISO 3166-2:IS","region":"Europe","sub-region":"Northern Europe","intermediate-region":"","region-code":"150","sub-region-code":"154","intermediate-region-code":""},{"name":"India","alpha-2":"IN","alpha-3":"IND","country-code":"356","iso_3166-2":"ISO 3166-2:IN","region":"Asia","sub-region":"Southern Asia","intermediate-region":"","region-code":"142","sub-region-code":"034","intermediate-region-code":""},{"name":"Indonesia","alpha-2":"ID","alpha-3":"IDN","country-code":"360","iso_3166-2":"ISO 3166-2:ID","region":"Asia","sub-region":"South-eastern Asia","intermediate-region":"","region-code":"142","sub-region-code":"035","intermediate-region-code":""},{"name":"Iran (Islamic Republic of)","alpha-2":"IR","alpha-3":"IRN","country-code":"364","iso_3166-2":"ISO 3166-2:IR","region":"Asia","sub-region":"Southern Asia","intermediate-region":"","region-code":"142","sub-region-code":"034","intermediate-region-code":""},{"name":"Iraq","alpha-2":"IQ","alpha-3":"IRQ","country-code":"368","iso_3166-2":"ISO 3166-2:IQ","region":"Asia","sub-region":"Western Asia","intermediate-region":"","region-code":"142","sub-region-code":"145","intermediate-region-code":""},{"name":"Ireland","alpha-2":"IE","alpha-3":"IRL","country-code":"372","iso_3166-2":"ISO 3166-2:IE","region":"Europe","sub-region":"Northern Europe","intermediate-region":"","region-code":"150","sub-region-code":"154","intermediate-region-code":""},{"name":"Isle of Man","alpha-2":"IM","alpha-3":"IMN","country-code":"833","iso_3166-2":"ISO 3166-2:IM","region":"Europe","sub-region":"Northern Europe","intermediate-region":"","region-code":"150","sub-region-code":"154","intermediate-region-code":""},{"name":"Israel","alpha-2":"IL","alpha-3":"ISR","country-code":"376","iso_3166-2":"ISO 3166-2:IL","region":"Asia","sub-region":"Western Asia","intermediate-region":"","region-code":"142","sub-region-code":"145","intermediate-region-code":""},{"name":"Italy","alpha-2":"IT","alpha-3":"ITA","country-code":"380","iso_3166-2":"ISO 3166-2:IT","region":"Europe","sub-region":"Southern Europe","intermediate-region":"","region-code":"150","sub-region-code":"039","intermediate-region-code":""},{"name":"Jamaica","alpha-2":"JM","alpha-3":"JAM","country-code":"388","iso_3166-2":"ISO 3166-2:JM","region":"Americas","sub-region":"Latin America and the Caribbean","intermediate-region":"Caribbean","region-code":"019","sub-region-code":"419","intermediate-region-code":"029"},{"name":"Japan","alpha-2":"JP","alpha-3":"JPN","country-code":"392","iso_3166-2":"ISO 3166-2:JP","region":"Asia","sub-region":"Eastern Asia","intermediate-region":"","region-code":"142","sub-region-code":"030","intermediate-region-code":""},{"name":"Jersey","alpha-2":"JE","alpha-3":"JEY","country-code":"832","iso_3166-2":"ISO 3166-2:JE","region":"Europe","sub-region":"Northern Europe","intermediate-region":"Channel Islands","region-code":"150","sub-region-code":"154","intermediate-region-code":"830"},{"name":"Jordan","alpha-2":"JO","alpha-3":"JOR","country-code":"400","iso_3166-2":"ISO 3166-2:JO","region":"Asia","sub-region":"Western Asia","intermediate-region":"","region-code":"142","sub-region-code":"145","intermediate-region-code":""},{"name":"Kazakhstan","alpha-2":"KZ","alpha-3":"KAZ","country-code":"398","iso_3166-2":"ISO 3166-2:KZ","region":"Asia","sub-region":"Central Asia","intermediate-region":"","region-code":"142","sub-region-code":"143","intermediate-region-code":""},{"name":"Kenya","alpha-2":"KE","alpha-3":"KEN","country-code":"404","iso_3166-2":"ISO 3166-2:KE","region":"Africa","sub-region":"Sub-Saharan Africa","intermediate-region":"Eastern Africa","region-code":"002","sub-region-code":"202","intermediate-region-code":"014"},{"name":"Kiribati","alpha-2":"KI","alpha-3":"KIR","country-code":"296","iso_3166-2":"ISO 3166-2:KI","region":"Oceania","sub-region":"Micronesia","intermediate-region":"","region-code":"009","sub-region-code":"057","intermediate-region-code":""},{"name":"Korea (Democratic People's Republic of)","alpha-2":"KP","alpha-3":"PRK","country-code":"408","iso_3166-2":"ISO 3166-2:KP","region":"Asia","sub-region":"Eastern Asia","intermediate-region":"","region-code":"142","sub-region-code":"030","intermediate-region-code":""},{"name":"Korea, Republic of","alpha-2":"KR","alpha-3":"KOR","country-code":"410","iso_3166-2":"ISO 3166-2:KR","region":"Asia","sub-region":"Eastern Asia","intermediate-region":"","region-code":"142","sub-region-code":"030","intermediate-region-code":""},{"name":"Kuwait","alpha-2":"KW","alpha-3":"KWT","country-code":"414","iso_3166-2":"ISO 3166-2:KW","region":"Asia","sub-region":"Western Asia","intermediate-region":"","region-code":"142","sub-region-code":"145","intermediate-region-code":""},{"name":"Kyrgyzstan","alpha-2":"KG","alpha-3":"KGZ","country-code":"417","iso_3166-2":"ISO 3166-2:KG","region":"Asia","sub-region":"Central Asia","intermediate-region":"","region-code":"142","sub-region-code":"143","intermediate-region-code":""},{"name":"Lao People's Democratic Republic","alpha-2":"LA","alpha-3":"LAO","country-code":"418","iso_3166-2":"ISO 3166-2:LA","region":"Asia","sub-region":"South-eastern Asia","intermediate-region":"","region-code":"142","sub-region-code":"035","intermediate-region-code":""},{"name":"Latvia","alpha-2":"LV","alpha-3":"LVA","country-code":"428","iso_3166-2":"ISO 3166-2:LV","region":"Europe","sub-region":"Northern Europe","intermediate-region":"","region-code":"150","sub-region-code":"154","intermediate-region-code":""},{"name":"Lebanon","alpha-2":"LB","alpha-3":"LBN","country-code":"422","iso_3166-2":"ISO 3166-2:LB","region":"Asia","sub-region":"Western Asia","intermediate-region":"","region-code":"142","sub-region-code":"145","intermediate-region-code":""},{"name":"Lesotho","alpha-2":"LS","alpha-3":"LSO","country-code":"426","iso_3166-2":"ISO 3166-2:LS","region":"Africa","sub-region":"Sub-Saharan Africa","intermediate-region":"Southern Africa","region-code":"002","sub-region-code":"202","intermediate-region-code":"018"},{"name":"Liberia","alpha-2":"LR","alpha-3":"LBR","country-code":"430","iso_3166-2":"ISO 3166-2:LR","region":"Africa","sub-region":"Sub-Saharan Africa","intermediate-region":"Western Africa","region-code":"002","sub-region-code":"202","intermediate-region-code":"011"},{"name":"Libya","alpha-2":"LY","alpha-3":"LBY","country-code":"434","iso_3166-2":"ISO 3166-2:LY","region":"Africa","sub-region":"Northern Africa","intermediate-region":"","region-code":"002","sub-region-code":"015","intermediate-region-code":""},{"name":"Liechtenstein","alpha-2":"LI","alpha-3":"LIE","country-code":"438","iso_3166-2":"ISO 3166-2:LI","region":"Europe","sub-region":"Western Europe","intermediate-region":"","region-code":"150","sub-region-code":"155","intermediate-region-code":""},{"name":"Lithuania","alpha-2":"LT","alpha-3":"LTU","country-code":"440","iso_3166-2":"ISO 3166-2:LT","region":"Europe","sub-region":"Northern Europe","intermediate-region":"","region-code":"150","sub-region-code":"154","intermediate-region-code":""},{"name":"Luxembourg","alpha-2":"LU","alpha-3":"LUX","country-code":"442","iso_3166-2":"ISO 3166-2:LU","region":"Europe","sub-region":"Western Europe","intermediate-region":"","region-code":"150","sub-region-code":"155","intermediate-region-code":""},{"name":"Macao","alpha-2":"MO","alpha-3":"MAC","country-code":"446","iso_3166-2":"ISO 3166-2:MO","region":"Asia","sub-region":"Eastern Asia","intermediate-region":"","region-code":"142","sub-region-code":"030","intermediate-region-code":""},{"name":"Madagascar","alpha-2":"MG","alpha-3":"MDG","country-code":"450","iso_3166-2":"ISO 3166-2:MG","region":"Africa","sub-region":"Sub-Saharan Africa","intermediate-region":"Eastern Africa","region-code":"002","sub-region-code":"202","intermediate-region-code":"014"},{"name":"Malawi","alpha-2":"MW","alpha-3":"MWI","country-code":"454","iso_3166-2":"ISO 3166-2:MW","region":"Africa","sub-region":"Sub-Saharan Africa","intermediate-region":"Eastern Africa","region-code":"002","sub-region-code":"202","intermediate-region-code":"014"},{"name":"Malaysia","alpha-2":"MY","alpha-3":"MYS","country-code":"458","iso_3166-2":"ISO 3166-2:MY","region":"Asia","sub-region":"South-eastern Asia","intermediate-region":"","region-code":"142","sub-region-code":"035","intermediate-region-code":""},{"name":"Maldives","alpha-2":"MV","alpha-3":"MDV","country-code":"462","iso_3166-2":"ISO 3166-2:MV","region":"Asia","sub-region":"Southern Asia","intermediate-region":"","region-code":"142","sub-region-code":"034","intermediate-region-code":""},{"name":"Mali","alpha-2":"ML","alpha-3":"MLI","country-code":"466","iso_3166-2":"ISO 3166-2:ML","region":"Africa","sub-region":"Sub-Saharan Africa","intermediate-region":"Western Africa","region-code":"002","sub-region-code":"202","intermediate-region-code":"011"},{"name":"Malta","alpha-2":"MT","alpha-3":"MLT","country-code":"470","iso_3166-2":"ISO 3166-2:MT","region":"Europe","sub-region":"Southern Europe","intermediate-region":"","region-code":"150","sub-region-code":"039","intermediate-region-code":""},{"name":"Marshall Islands","alpha-2":"MH","alpha-3":"MHL","country-code":"584","iso_3166-2":"ISO 3166-2:MH","region":"Oceania","sub-region":"Micronesia","intermediate-region":"","region-code":"009","sub-region-code":"057","intermediate-region-code":""},{"name":"Martinique","alpha-2":"MQ","alpha-3":"MTQ","country-code":"474","iso_3166-2":"ISO 3166-2:MQ","region":"Americas","sub-region":"Latin America and the Caribbean","intermediate-region":"Caribbean","region-code":"019","sub-region-code":"419","intermediate-region-code":"029"},{"name":"Mauritania","alpha-2":"MR","alpha-3":"MRT","country-code":"478","iso_3166-2":"ISO 3166-2:MR","region":"Africa","sub-region":"Sub-Saharan Africa","intermediate-region":"Western Africa","region-code":"002","sub-region-code":"202","intermediate-region-code":"011"},{"name":"Mauritius","alpha-2":"MU","alpha-3":"MUS","country-code":"480","iso_3166-2":"ISO 3166-2:MU","region":"Africa","sub-region":"Sub-Saharan Africa","intermediate-region":"Eastern Africa","region-code":"002","sub-region-code":"202","intermediate-region-code":"014"},{"name":"Mayotte","alpha-2":"YT","alpha-3":"MYT","country-code":"175","iso_3166-2":"ISO 3166-2:YT","region":"Africa","sub-region":"Sub-Saharan Africa","intermediate-region":"Eastern Africa","region-code":"002","sub-region-code":"202","intermediate-region-code":"014"},{"name":"Mexico","alpha-2":"MX","alpha-3":"MEX","country-code":"484","iso_3166-2":"ISO 3166-2:MX","region":"Americas","sub-region":"Latin America and the Caribbean","intermediate-region":"Central America","region-code":"019","sub-region-code":"419","intermediate-region-code":"013"},{"name":"Micronesia (Federated States of)","alpha-2":"FM","alpha-3":"FSM","country-code":"583","iso_3166-2":"ISO 3166-2:FM","region":"Oceania","sub-region":"Micronesia","intermediate-region":"","region-code":"009","sub-region-code":"057","intermediate-region-code":""},{"name":"Moldova, Republic of","alpha-2":"MD","alpha-3":"MDA","country-code":"498","iso_3166-2":"ISO 3166-2:MD","region":"Europe","sub-region":"Eastern Europe","intermediate-region":"","region-code":"150","sub-region-code":"151","intermediate-region-code":""},{"name":"Monaco","alpha-2":"MC","alpha-3":"MCO","country-code":"492","iso_3166-2":"ISO 3166-2:MC","region":"Europe","sub-region":"Western Europe","intermediate-region":"","region-code":"150","sub-region-code":"155","intermediate-region-code":""},{"name":"Mongolia","alpha-2":"MN","alpha-3":"MNG","country-code":"496","iso_3166-2":"ISO 3166-2:MN","region":"Asia","sub-region":"Eastern Asia","intermediate-region":"","region-code":"142","sub-region-code":"030","intermediate-region-code":""},{"name":"Montenegro","alpha-2":"ME","alpha-3":"MNE","country-code":"499","iso_3166-2":"ISO 3166-2:ME","region":"Europe","sub-region":"Southern Europe","intermediate-region":"","region-code":"150","sub-region-code":"039","intermediate-region-code":""},{"name":"Montserrat","alpha-2":"MS","alpha-3":"MSR","country-code":"500","iso_3166-2":"ISO 3166-2:MS","region":"Americas","sub-region":"Latin America and the Caribbean","intermediate-region":"Caribbean","region-code":"019","sub-region-code":"419","intermediate-region-code":"029"},{"name":"Morocco","alpha-2":"MA","alpha-3":"MAR","country-code":"504","iso_3166-2":"ISO 3166-2:MA","region":"Africa","sub-region":"Northern Africa","intermediate-region":"","region-code":"002","sub-region-code":"015","intermediate-region-code":""},{"name":"Mozambique","alpha-2":"MZ","alpha-3":"MOZ","country-code":"508","iso_3166-2":"ISO 3166-2:MZ","region":"Africa","sub-region":"Sub-Saharan Africa","intermediate-region":"Eastern Africa","region-code":"002","sub-region-code":"202","intermediate-region-code":"014"},{"name":"Myanmar","alpha-2":"MM","alpha-3":"MMR","country-code":"104","iso_3166-2":"ISO 3166-2:MM","region":"Asia","sub-region":"South-eastern Asia","intermediate-region":"","region-code":"142","sub-region-code":"035","intermediate-region-code":""},{"name":"Namibia","alpha-2":"NA","alpha-3":"NAM","country-code":"516","iso_3166-2":"ISO 3166-2:NA","region":"Africa","sub-region":"Sub-Saharan Africa","intermediate-region":"Southern Africa","region-code":"002","sub-region-code":"202","intermediate-region-code":"018"},{"name":"Nauru","alpha-2":"NR","alpha-3":"NRU","country-code":"520","iso_3166-2":"ISO 3166-2:NR","region":"Oceania","sub-region":"Micronesia","intermediate-region":"","region-code":"009","sub-region-code":"057","intermediate-region-code":""},{"name":"Nepal","alpha-2":"NP","alpha-3":"NPL","country-code":"524","iso_3166-2":"ISO 3166-2:NP","region":"Asia","sub-region":"Southern Asia","intermediate-region":"","region-code":"142","sub-region-code":"034","intermediate-region-code":""},{"name":"Netherlands","alpha-2":"NL","alpha-3":"NLD","country-code":"528","iso_3166-2":"ISO 3166-2:NL","region":"Europe","sub-region":"Western Europe","intermediate-region":"","region-code":"150","sub-region-code":"155","intermediate-region-code":""},{"name":"New Caledonia","alpha-2":"NC","alpha-3":"NCL","country-code":"540","iso_3166-2":"ISO 3166-2:NC","region":"Oceania","sub-region":"Melanesia","intermediate-region":"","region-code":"009","sub-region-code":"054","intermediate-region-code":""},{"name":"New Zealand","alpha-2":"NZ","alpha-3":"NZL","country-code":"554","iso_3166-2":"ISO 3166-2:NZ","region":"Oceania","sub-region":"Australia and New Zealand","intermediate-region":"","region-code":"009","sub-region-code":"053","intermediate-region-code":""},{"name":"Nicaragua","alpha-2":"NI","alpha-3":"NIC","country-code":"558","iso_3166-2":"ISO 3166-2:NI","region":"Americas","sub-region":"Latin America and the Caribbean","intermediate-region":"Central America","region-code":"019","sub-region-code":"419","intermediate-region-code":"013"},{"name":"Niger","alpha-2":"NE","alpha-3":"NER","country-code":"562","iso_3166-2":"ISO 3166-2:NE","region":"Africa","sub-region":"Sub-Saharan Africa","intermediate-region":"Western Africa","region-code":"002","sub-region-code":"202","intermediate-region-code":"011"},{"name":"Nigeria","alpha-2":"NG","alpha-3":"NGA","country-code":"566","iso_3166-2":"ISO 3166-2:NG","region":"Africa","sub-region":"Sub-Saharan Africa","intermediate-region":"Western Africa","region-code":"002","sub-region-code":"202","intermediate-region-code":"011"},{"name":"Niue","alpha-2":"NU","alpha-3":"NIU","country-code":"570","iso_3166-2":"ISO 3166-2:NU","region":"Oceania","sub-region":"Polynesia","intermediate-region":"","region-code":"009","sub-region-code":"061","intermediate-region-code":""},{"name":"Norfolk Island","alpha-2":"NF","alpha-3":"NFK","country-code":"574","iso_3166-2":"ISO 3166-2:NF","region":"Oceania","sub-region":"Australia and New Zealand","intermediate-region":"","region-code":"009","sub-region-code":"053","intermediate-region-code":""},{"name":"North Macedonia","alpha-2":"MK","alpha-3":"MKD","country-code":"807","iso_3166-2":"ISO 3166-2:MK","region":"Europe","sub-region":"Southern Europe","intermediate-region":"","region-code":"150","sub-region-code":"039","intermediate-region-code":""},{"name":"Northern Mariana Islands","alpha-2":"MP","alpha-3":"MNP","country-code":"580","iso_3166-2":"ISO 3166-2:MP","region":"Oceania","sub-region":"Micronesia","intermediate-region":"","region-code":"009","sub-region-code":"057","intermediate-region-code":""},{"name":"Norway","alpha-2":"NO","alpha-3":"NOR","country-code":"578","iso_3166-2":"ISO 3166-2:NO","region":"Europe","sub-region":"Northern Europe","intermediate-region":"","region-code":"150","sub-region-code":"154","intermediate-region-code":""},{"name":"Oman","alpha-2":"OM","alpha-3":"OMN","country-code":"512","iso_3166-2":"ISO 3166-2:OM","region":"Asia","sub-region":"Western Asia","intermediate-region":"","region-code":"142","sub-region-code":"145","intermediate-region-code":""},{"name":"Pakistan","alpha-2":"PK","alpha-3":"PAK","country-code":"586","iso_3166-2":"ISO 3166-2:PK","region":"Asia","sub-region":"Southern Asia","intermediate-region":"","region-code":"142","sub-region-code":"034","intermediate-region-code":""},{"name":"Palau","alpha-2":"PW","alpha-3":"PLW","country-code":"585","iso_3166-2":"ISO 3166-2:PW","region":"Oceania","sub-region":"Micronesia","intermediate-region":"","region-code":"009","sub-region-code":"057","intermediate-region-code":""},{"name":"Palestine, State of","alpha-2":"PS","alpha-3":"PSE","country-code":"275","iso_3166-2":"ISO 3166-2:PS","region":"Asia","sub-region":"Western Asia","intermediate-region":"","region-code":"142","sub-region-code":"145","intermediate-region-code":""},{"name":"Panama","alpha-2":"PA","alpha-3":"PAN","country-code":"591","iso_3166-2":"ISO 3166-2:PA","region":"Americas","sub-region":"Latin America and the Caribbean","intermediate-region":"Central America","region-code":"019","sub-region-code":"419","intermediate-region-code":"013"},{"name":"Papua New Guinea","alpha-2":"PG","alpha-3":"PNG","country-code":"598","iso_3166-2":"ISO 3166-2:PG","region":"Oceania","sub-region":"Melanesia","intermediate-region":"","region-code":"009","sub-region-code":"054","intermediate-region-code":""},{"name":"Paraguay","alpha-2":"PY","alpha-3":"PRY","country-code":"600","iso_3166-2":"ISO 3166-2:PY","region":"Americas","sub-region":"Latin America and the Caribbean","intermediate-region":"South America","region-code":"019","sub-region-code":"419","intermediate-region-code":"005"},{"name":"Peru","alpha-2":"PE","alpha-3":"PER","country-code":"604","iso_3166-2":"ISO 3166-2:PE","region":"Americas","sub-region":"Latin America and the Caribbean","intermediate-region":"South America","region-code":"019","sub-region-code":"419","intermediate-region-code":"005"},{"name":"Philippines","alpha-2":"PH","alpha-3":"PHL","country-code":"608","iso_3166-2":"ISO 3166-2:PH","region":"Asia","sub-region":"South-eastern Asia","intermediate-region":"","region-code":"142","sub-region-code":"035","intermediate-region-code":""},{"name":"Pitcairn","alpha-2":"PN","alpha-3":"PCN","country-code":"612","iso_3166-2":"ISO 3166-2:PN","region":"Oceania","sub-region":"Polynesia","intermediate-region":"","region-code":"009","sub-region-code":"061","intermediate-region-code":""},{"name":"Poland","alpha-2":"PL","alpha-3":"POL","country-code":"616","iso_3166-2":"ISO 3166-2:PL","region":"Europe","sub-region":"Eastern Europe","intermediate-region":"","region-code":"150","sub-region-code":"151","intermediate-region-code":""},{"name":"Portugal","alpha-2":"PT","alpha-3":"PRT","country-code":"620","iso_3166-2":"ISO 3166-2:PT","region":"Europe","sub-region":"Southern Europe","intermediate-region":"","region-code":"150","sub-region-code":"039","intermediate-region-code":""},{"name":"Puerto Rico","alpha-2":"PR","alpha-3":"PRI","country-code":"630","iso_3166-2":"ISO 3166-2:PR","region":"Americas","sub-region":"Latin America and the Caribbean","intermediate-region":"Caribbean","region-code":"019","sub-region-code":"419","intermediate-region-code":"029"},{"name":"Qatar","alpha-2":"QA","alpha-3":"QAT","country-code":"634","iso_3166-2":"ISO 3166-2:QA","region":"Asia","sub-region":"Western Asia","intermediate-region":"","region-code":"142","sub-region-code":"145","intermediate-region-code":""},{"name":"Réunion","alpha-2":"RE","alpha-3":"REU","country-code":"638","iso_3166-2":"ISO 3166-2:RE","region":"Africa","sub-region":"Sub-Saharan Africa","intermediate-region":"Eastern Africa","region-code":"002","sub-region-code":"202","intermediate-region-code":"014"},{"name":"Romania","alpha-2":"RO","alpha-3":"ROU","country-code":"642","iso_3166-2":"ISO 3166-2:RO","region":"Europe","sub-region":"Eastern Europe","intermediate-region":"","region-code":"150","sub-region-code":"151","intermediate-region-code":""},{"name":"Russian Federation","alpha-2":"RU","alpha-3":"RUS","country-code":"643","iso_3166-2":"ISO 3166-2:RU","region":"Europe","sub-region":"Eastern Europe","intermediate-region":"","region-code":"150","sub-region-code":"151","intermediate-region-code":""},{"name":"Rwanda","alpha-2":"RW","alpha-3":"RWA","country-code":"646","iso_3166-2":"ISO 3166-2:RW","region":"Africa","sub-region":"Sub-Saharan Africa","intermediate-region":"Eastern Africa","region-code":"002","sub-region-code":"202","intermediate-region-code":"014"},{"name":"Saint Barthélemy","alpha-2":"BL","alpha-3":"BLM","country-code":"652","iso_3166-2":"ISO 3166-2:BL","region":"Americas","sub-region":"Latin America and the Caribbean","intermediate-region":"Caribbean","region-code":"019","sub-region-code":"419","intermediate-region-code":"029"},{"name":"Saint Helena, Ascension and Tristan da Cunha","alpha-2":"SH","alpha-3":"SHN","country-code":"654","iso_3166-2":"ISO 3166-2:SH","region":"Africa","sub-region":"Sub-Saharan Africa","intermediate-region":"Western Africa","region-code":"002","sub-region-code":"202","intermediate-region-code":"011"},{"name":"Saint Kitts and Nevis","alpha-2":"KN","alpha-3":"KNA","country-code":"659","iso_3166-2":"ISO 3166-2:KN","region":"Americas","sub-region":"Latin America and the Caribbean","intermediate-region":"Caribbean","region-code":"019","sub-region-code":"419","intermediate-region-code":"029"},{"name":"Saint Lucia","alpha-2":"LC","alpha-3":"LCA","country-code":"662","iso_3166-2":"ISO 3166-2:LC","region":"Americas","sub-region":"Latin America and the Caribbean","intermediate-region":"Caribbean","region-code":"019","sub-region-code":"419","intermediate-region-code":"029"},{"name":"Saint Martin (French part)","alpha-2":"MF","alpha-3":"MAF","country-code":"663","iso_3166-2":"ISO 3166-2:MF","region":"Americas","sub-region":"Latin America and the Caribbean","intermediate-region":"Caribbean","region-code":"019","sub-region-code":"419","intermediate-region-code":"029"},{"name":"Saint Pierre and Miquelon","alpha-2":"PM","alpha-3":"SPM","country-code":"666","iso_3166-2":"ISO 3166-2:PM","region":"Americas","sub-region":"Northern America","intermediate-region":"","region-code":"019","sub-region-code":"021","intermediate-region-code":""},{"name":"Saint Vincent and the Grenadines","alpha-2":"VC","alpha-3":"VCT","country-code":"670","iso_3166-2":"ISO 3166-2:VC","region":"Americas","sub-region":"Latin America and the Caribbean","intermediate-region":"Caribbean","region-code":"019","sub-region-code":"419","intermediate-region-code":"029"},{"name":"Samoa","alpha-2":"WS","alpha-3":"WSM","country-code":"882","iso_3166-2":"ISO 3166-2:WS","region":"Oceania","sub-region":"Polynesia","intermediate-region":"","region-code":"009","sub-region-code":"061","intermediate-region-code":""},{"name":"San Marino","alpha-2":"SM","alpha-3":"SMR","country-code":"674","iso_3166-2":"ISO 3166-2:SM","region":"Europe","sub-region":"Southern Europe","intermediate-region":"","region-code":"150","sub-region-code":"039","intermediate-region-code":""},{"name":"Sao Tome and Principe","alpha-2":"ST","alpha-3":"STP","country-code":"678","iso_3166-2":"ISO 3166-2:ST","region":"Africa","sub-region":"Sub-Saharan Africa","intermediate-region":"Middle Africa","region-code":"002","sub-region-code":"202","intermediate-region-code":"017"},{"name":"Saudi Arabia","alpha-2":"SA","alpha-3":"SAU","country-code":"682","iso_3166-2":"ISO 3166-2:SA","region":"Asia","sub-region":"Western Asia","intermediate-region":"","region-code":"142","sub-region-code":"145","intermediate-region-code":""},{"name":"Senegal","alpha-2":"SN","alpha-3":"SEN","country-code":"686","iso_3166-2":"ISO 3166-2:SN","region":"Africa","sub-region":"Sub-Saharan Africa","intermediate-region":"Western Africa","region-code":"002","sub-region-code":"202","intermediate-region-code":"011"},{"name":"Serbia","alpha-2":"RS","alpha-3":"SRB","country-code":"688","iso_3166-2":"ISO 3166-2:RS","region":"Europe","sub-region":"Southern Europe","intermediate-region":"","region-code":"150","sub-region-code":"039","intermediate-region-code":""},{"name":"Seychelles","alpha-2":"SC","alpha-3":"SYC","country-code":"690","iso_3166-2":"ISO 3166-2:SC","region":"Africa","sub-region":"Sub-Saharan Africa","intermediate-region":"Eastern Africa","region-code":"002","sub-region-code":"202","intermediate-region-code":"014"},{"name":"Sierra Leone","alpha-2":"SL","alpha-3":"SLE","country-code":"694","iso_3166-2":"ISO 3166-2:SL","region":"Africa","sub-region":"Sub-Saharan Africa","intermediate-region":"Western Africa","region-code":"002","sub-region-code":"202","intermediate-region-code":"011"},{"name":"Singapore","alpha-2":"SG","alpha-3":"SGP","country-code":"702","iso_3166-2":"ISO 3166-2:SG","region":"Asia","sub-region":"South-eastern Asia","intermediate-region":"","region-code":"142","sub-region-code":"035","intermediate-region-code":""},{"name":"Sint Maarten (Dutch part)","alpha-2":"SX","alpha-3":"SXM","country-code":"534","iso_3166-2":"ISO 3166-2:SX","region":"Americas","sub-region":"Latin America and the Caribbean","intermediate-region":"Caribbean","region-code":"019","sub-region-code":"419","intermediate-region-code":"029"},{"name":"Slovakia","alpha-2":"SK","alpha-3":"SVK","country-code":"703","iso_3166-2":"ISO 3166-2:SK","region":"Europe","sub-region":"Eastern Europe","intermediate-region":"","region-code":"150","sub-region-code":"151","intermediate-region-code":""},{"name":"Slovenia","alpha-2":"SI","alpha-3":"SVN","country-code":"705","iso_3166-2":"ISO 3166-2:SI","region":"Europe","sub-region":"Southern Europe","intermediate-region":"","region-code":"150","sub-region-code":"039","intermediate-region-code":""},{"name":"Solomon Islands","alpha-2":"SB","alpha-3":"SLB","country-code":"090","iso_3166-2":"ISO 3166-2:SB","region":"Oceania","sub-region":"Melanesia","intermediate-region":"","region-code":"009","sub-region-code":"054","intermediate-region-code":""},{"name":"Somalia","alpha-2":"SO","alpha-3":"SOM","country-code":"706","iso_3166-2":"ISO 3166-2:SO","region":"Africa","sub-region":"Sub-Saharan Africa","intermediate-region":"Eastern Africa","region-code":"002","sub-region-code":"202","intermediate-region-code":"014"},{"name":"South Africa","alpha-2":"ZA","alpha-3":"ZAF","country-code":"710","iso_3166-2":"ISO 3166-2:ZA","region":"Africa","sub-region":"Sub-Saharan Africa","intermediate-region":"Southern Africa","region-code":"002","sub-region-code":"202","intermediate-region-code":"018"},{"name":"South Georgia and the South Sandwich Islands","alpha-2":"GS","alpha-3":"SGS","country-code":"239","iso_3166-2":"ISO 3166-2:GS","region":"Americas","sub-region":"Latin America and the Caribbean","intermediate-region":"South America","region-code":"019","sub-region-code":"419","intermediate-region-code":"005"},{"name":"South Sudan","alpha-2":"SS","alpha-3":"SSD","country-code":"728","iso_3166-2":"ISO 3166-2:SS","region":"Africa","sub-region":"Sub-Saharan Africa","intermediate-region":"Eastern Africa","region-code":"002","sub-region-code":"202","intermediate-region-code":"014"},{"name":"Spain","alpha-2":"ES","alpha-3":"ESP","country-code":"724","iso_3166-2":"ISO 3166-2:ES","region":"Europe","sub-region":"Southern Europe","intermediate-region":"","region-code":"150","sub-region-code":"039","intermediate-region-code":""},{"name":"Sri Lanka","alpha-2":"LK","alpha-3":"LKA","country-code":"144","iso_3166-2":"ISO 3166-2:LK","region":"Asia","sub-region":"Southern Asia","intermediate-region":"","region-code":"142","sub-region-code":"034","intermediate-region-code":""},{"name":"Sudan","alpha-2":"SD","alpha-3":"SDN","country-code":"729","iso_3166-2":"ISO 3166-2:SD","region":"Africa","sub-region":"Northern Africa","intermediate-region":"","region-code":"002","sub-region-code":"015","intermediate-region-code":""},{"name":"Suriname","alpha-2":"SR","alpha-3":"SUR","country-code":"740","iso_3166-2":"ISO 3166-2:SR","region":"Americas","sub-region":"Latin America and the Caribbean","intermediate-region":"South America","region-code":"019","sub-region-code":"419","intermediate-region-code":"005"},{"name":"Svalbard and Jan Mayen","alpha-2":"SJ","alpha-3":"SJM","country-code":"744","iso_3166-2":"ISO 3166-2:SJ","region":"Europe","sub-region":"Northern Europe","intermediate-region":"","region-code":"150","sub-region-code":"154","intermediate-region-code":""},{"name":"Sweden","alpha-2":"SE","alpha-3":"SWE","country-code":"752","iso_3166-2":"ISO 3166-2:SE","region":"Europe","sub-region":"Northern Europe","intermediate-region":"","region-code":"150","sub-region-code":"154","intermediate-region-code":""},{"name":"Switzerland","alpha-2":"CH","alpha-3":"CHE","country-code":"756","iso_3166-2":"ISO 3166-2:CH","region":"Europe","sub-region":"Western Europe","intermediate-region":"","region-code":"150","sub-region-code":"155","intermediate-region-code":""},{"name":"Syrian Arab Republic","alpha-2":"SY","alpha-3":"SYR","country-code":"760","iso_3166-2":"ISO 3166-2:SY","region":"Asia","sub-region":"Western Asia","intermediate-region":"","region-code":"142","sub-region-code":"145","intermediate-region-code":""},{"name":"Taiwan, Province of China","alpha-2":"TW","alpha-3":"TWN","country-code":"158","iso_3166-2":"ISO 3166-2:TW","region":"Asia","sub-region":"Eastern Asia","intermediate-region":"","region-code":"142","sub-region-code":"030","intermediate-region-code":""},{"name":"Tajikistan","alpha-2":"TJ","alpha-3":"TJK","country-code":"762","iso_3166-2":"ISO 3166-2:TJ","region":"Asia","sub-region":"Central Asia","intermediate-region":"","region-code":"142","sub-region-code":"143","intermediate-region-code":""},{"name":"Tanzania, United Republic of","alpha-2":"TZ","alpha-3":"TZA","country-code":"834","iso_3166-2":"ISO 3166-2:TZ","region":"Africa","sub-region":"Sub-Saharan Africa","intermediate-region":"Eastern Africa","region-code":"002","sub-region-code":"202","intermediate-region-code":"014"},{"name":"Thailand","alpha-2":"TH","alpha-3":"THA","country-code":"764","iso_3166-2":"ISO 3166-2:TH","region":"Asia","sub-region":"South-eastern Asia","intermediate-region":"","region-code":"142","sub-region-code":"035","intermediate-region-code":""},{"name":"Timor-Leste","alpha-2":"TL","alpha-3":"TLS","country-code":"626","iso_3166-2":"ISO 3166-2:TL","region":"Asia","sub-region":"South-eastern Asia","intermediate-region":"","region-code":"142","sub-region-code":"035","intermediate-region-code":""},{"name":"Togo","alpha-2":"TG","alpha-3":"TGO","country-code":"768","iso_3166-2":"ISO 3166-2:TG","region":"Africa","sub-region":"Sub-Saharan Africa","intermediate-region":"Western Africa","region-code":"002","sub-region-code":"202","intermediate-region-code":"011"},{"name":"Tokelau","alpha-2":"TK","alpha-3":"TKL","country-code":"772","iso_3166-2":"ISO 3166-2:TK","region":"Oceania","sub-region":"Polynesia","intermediate-region":"","region-code":"009","sub-region-code":"061","intermediate-region-code":""},{"name":"Tonga","alpha-2":"TO","alpha-3":"TON","country-code":"776","iso_3166-2":"ISO 3166-2:TO","region":"Oceania","sub-region":"Polynesia","intermediate-region":"","region-code":"009","sub-region-code":"061","intermediate-region-code":""},{"name":"Trinidad and Tobago","alpha-2":"TT","alpha-3":"TTO","country-code":"780","iso_3166-2":"ISO 3166-2:TT","region":"Americas","sub-region":"Latin America and the Caribbean","intermediate-region":"Caribbean","region-code":"019","sub-region-code":"419","intermediate-region-code":"029"},{"name":"Tunisia","alpha-2":"TN","alpha-3":"TUN","country-code":"788","iso_3166-2":"ISO 3166-2:TN","region":"Africa","sub-region":"Northern Africa","intermediate-region":"","region-code":"002","sub-region-code":"015","intermediate-region-code":""},{"name":"Turkey","alpha-2":"TR","alpha-3":"TUR","country-code":"792","iso_3166-2":"ISO 3166-2:TR","region":"Asia","sub-region":"Western Asia","intermediate-region":"","region-code":"142","sub-region-code":"145","intermediate-region-code":""},{"name":"Turkmenistan","alpha-2":"TM","alpha-3":"TKM","country-code":"795","iso_3166-2":"ISO 3166-2:TM","region":"Asia","sub-region":"Central Asia","intermediate-region":"","region-code":"142","sub-region-code":"143","intermediate-region-code":""},{"name":"Turks and Caicos Islands","alpha-2":"TC","alpha-3":"TCA","country-code":"796","iso_3166-2":"ISO 3166-2:TC","region":"Americas","sub-region":"Latin America and the Caribbean","intermediate-region":"Caribbean","region-code":"019","sub-region-code":"419","intermediate-region-code":"029"},{"name":"Tuvalu","alpha-2":"TV","alpha-3":"TUV","country-code":"798","iso_3166-2":"ISO 3166-2:TV","region":"Oceania","sub-region":"Polynesia","intermediate-region":"","region-code":"009","sub-region-code":"061","intermediate-region-code":""},{"name":"Uganda","alpha-2":"UG","alpha-3":"UGA","country-code":"800","iso_3166-2":"ISO 3166-2:UG","region":"Africa","sub-region":"Sub-Saharan Africa","intermediate-region":"Eastern Africa","region-code":"002","sub-region-code":"202","intermediate-region-code":"014"},{"name":"Ukraine","alpha-2":"UA","alpha-3":"UKR","country-code":"804","iso_3166-2":"ISO 3166-2:UA","region":"Europe","sub-region":"Eastern Europe","intermediate-region":"","region-code":"150","sub-region-code":"151","intermediate-region-code":""},{"name":"United Arab Emirates","alpha-2":"AE","alpha-3":"ARE","country-code":"784","iso_3166-2":"ISO 3166-2:AE","region":"Asia","sub-region":"Western Asia","intermediate-region":"","region-code":"142","sub-region-code":"145","intermediate-region-code":""},{"name":"United Kingdom of Great Britain and Northern Ireland","alpha-2":"GB","alpha-3":"GBR","country-code":"826","iso_3166-2":"ISO 3166-2:GB","region":"Europe","sub-region":"Northern Europe","intermediate-region":"","region-code":"150","sub-region-code":"154","intermediate-region-code":""},{"name":"United States of America","alpha-2":"US","alpha-3":"USA","country-code":"840","iso_3166-2":"ISO 3166-2:US","region":"Americas","sub-region":"Northern America","intermediate-region":"","region-code":"019","sub-region-code":"021","intermediate-region-code":""},{"name":"United States Minor Outlying Islands","alpha-2":"UM","alpha-3":"UMI","country-code":"581","iso_3166-2":"ISO 3166-2:UM","region":"Oceania","sub-region":"Micronesia","intermediate-region":"","region-code":"009","sub-region-code":"057","intermediate-region-code":""},{"name":"Uruguay","alpha-2":"UY","alpha-3":"URY","country-code":"858","iso_3166-2":"ISO 3166-2:UY","region":"Americas","sub-region":"Latin America and the Caribbean","intermediate-region":"South America","region-code":"019","sub-region-code":"419","intermediate-region-code":"005"},{"name":"Uzbekistan","alpha-2":"UZ","alpha-3":"UZB","country-code":"860","iso_3166-2":"ISO 3166-2:UZ","region":"Asia","sub-region":"Central Asia","intermediate-region":"","region-code":"142","sub-region-code":"143","intermediate-region-code":""},{"name":"Vanuatu","alpha-2":"VU","alpha-3":"VUT","country-code":"548","iso_3166-2":"ISO 3166-2:VU","region":"Oceania","sub-region":"Melanesia","intermediate-region":"","region-code":"009","sub-region-code":"054","intermediate-region-code":""},{"name":"Venezuela (Bolivarian Republic of)","alpha-2":"VE","alpha-3":"VEN","country-code":"862","iso_3166-2":"ISO 3166-2:VE","region":"Americas","sub-region":"Latin America and the Caribbean","intermediate-region":"South America","region-code":"019","sub-region-code":"419","intermediate-region-code":"005"},{"name":"Viet Nam","alpha-2":"VN","alpha-3":"VNM","country-code":"704","iso_3166-2":"ISO 3166-2:VN","region":"Asia","sub-region":"South-eastern Asia","intermediate-region":"","region-code":"142","sub-region-code":"035","intermediate-region-code":""},{"name":"Virgin Islands (British)","alpha-2":"VG","alpha-3":"VGB","country-code":"092","iso_3166-2":"ISO 3166-2:VG","region":"Americas","sub-region":"Latin America and the Caribbean","intermediate-region":"Caribbean","region-code":"019","sub-region-code":"419","intermediate-region-code":"029"},{"name":"Virgin Islands (U.S.)","alpha-2":"VI","alpha-3":"VIR","country-code":"850","iso_3166-2":"ISO 3166-2:VI","region":"Americas","sub-region":"Latin America and the Caribbean","intermediate-region":"Caribbean","region-code":"019","sub-region-code":"419","intermediate-region-code":"029"},{"name":"Wallis and Futuna","alpha-2":"WF","alpha-3":"WLF","country-code":"876","iso_3166-2":"ISO 3166-2:WF","region":"Oceania","sub-region":"Polynesia","intermediate-region":"","region-code":"009","sub-region-code":"061","intermediate-region-code":""},{"name":"Western Sahara","alpha-2":"EH","alpha-3":"ESH","country-code":"732","iso_3166-2":"ISO 3166-2:EH","region":"Africa","sub-region":"Northern Africa","intermediate-region":"","region-code":"002","sub-region-code":"015","intermediate-region-code":""},{"name":"Yemen","alpha-2":"YE","alpha-3":"YEM","country-code":"887","iso_3166-2":"ISO 3166-2:YE","region":"Asia","sub-region":"Western Asia","intermediate-region":"","region-code":"142","sub-region-code":"145","intermediate-region-code":""},{"name":"Zambia","alpha-2":"ZM","alpha-3":"ZMB","country-code":"894","iso_3166-2":"ISO 3166-2:ZM","region":"Africa","sub-region":"Sub-Saharan Africa","intermediate-region":"Eastern Africa","region-code":"002","sub-region-code":"202","intermediate-region-code":"014"},{"name":"Zimbabwe","alpha-2":"ZW","alpha-3":"ZWE","country-code":"716","iso_3166-2":"ISO 3166-2:ZW","region":"Africa","sub-region":"Sub-Saharan Africa","intermediate-region":"Eastern Africa","region-code":"002","sub-region-code":"202","intermediate-region-code":"014"}] diff --git a/nautilus_nlp/utils/constants.py b/nautilus_nlp/utils/constants.py index e4db181..ce0be93 100644 --- a/nautilus_nlp/utils/constants.py +++ b/nautilus_nlp/utils/constants.py @@ -11,11 +11,10 @@ from . import compat from . import file_loader as util -from stop_words import get_stop_words -def get_stopwords(lang:str = 'en'): - return get_stop_words(lang) + + NUMERIC_NE_TYPES = { diff --git a/nautilus_nlp/utils/preprocess.py b/nautilus_nlp/utils/preprocess.py index cc3c0ee..98209ea 100644 --- a/nautilus_nlp/utils/preprocess.py +++ b/nautilus_nlp/utils/preprocess.py @@ -7,14 +7,20 @@ """ from __future__ import absolute_import, division, print_function, unicode_literals +import os +import json import re import unicodedata from ftfy import fix_text +from stop_words import get_stop_words as _get_stop_words +from stop_words import LANGUAGE_MAPPING as _LANGUAGE_MAPPING from . import constants +from nautilus_nlp.config.config import ROOT_FOLDER +from nautilus_nlp.utils.file_loader import documents_loader - +STOPWORDS_JSON_FILEPATH = os.path.join(ROOT_FOLDER,'data','stopwords.json') def remove_multiple_spaces_and_strip_text(text): @@ -49,6 +55,46 @@ def remove_special_caracters(tokens): return [word for word in tokens if re.search('[a-zA-Z0-9]', word)] +def _load_stopwords_from_json(filepath=STOPWORDS_JSON_FILEPATH): + stopwords = documents_loader(filepath) + stopwords = json.loads(stopwords) + return stopwords + + +def get_stopwords(lang:str = 'en'): + ''' + Inputs a language code, returns a list of stopwords for the specified language + + Args: + lang: Supported languages: ['ar', 'bg', 'ca', 'cz', 'da', 'nl', 'en', + 'fi', 'fr', 'de', 'hi', 'hu', 'id', 'it', 'nb', 'pl', 'pt', 'ro', 'ru', + 'sk', 'es', 'sv', 'tr', 'uk', 'vi', 'af', 'ha', 'so', 'st', 'sw', 'yo', + 'zu', 'da', 'de', 'es', 'et', 'fi', 'fr', 'hr', 'hu', 'it', 'ko', 'nl', + 'no', 'pl', 'pt', 'ru', 'sv', 'tr', 'zh', 'eo', 'he', 'la', 'sk', 'sl', + 'br', 'ca', 'cs', 'el', 'eu', 'ga', 'gl', 'hy', 'id', 'ja', 'lv', 'th', + 'ar', 'bg', 'bn', 'fa', 'hi', 'mr', 'ro', 'en'] + ''' + if type(lang) == str and len(lang) == 2: + lang = lang.lower() + + custom_stopwords = _load_stopwords_from_json(STOPWORDS_JSON_FILEPATH) + stopwords = [] + + supported_lang_lib = list(LANGUAGE_MAPPING.keys()) + supported_lang_custom = list(custom_stopwords.keys()) + supported_lang = supported_lang_lib+supported_lang_custom + if lang in supported_lang: + if lang in supported_lang_lib: + stopwords += _get_stop_words(lang) + if lang in supported_lang_custom: + stopwords += custom_stopwords[lang] + else: + raise ValueError('Language not available yet or incorrect country code. Supported languages: {}'.format(supported_lang)) + else: + raise ValueError('Please input a valid country code, in 2 letters. Eg. "us" for USA. ') + return list(set(stopwords)) + + def remove_stopwords(text_or_tokens, stopwords): ''' Remove stopwords from tokens. From e6f013cb3f3ea95c2a725eea46b16759ee588a05 Mon Sep 17 00:00:00 2001 From: hugovasselin <waaaouu@gmail.com> Date: Mon, 15 Apr 2019 19:48:52 +0200 Subject: [PATCH 063/496] fix _LANGUAGE_MAPPING error --- nautilus_nlp/utils/preprocess.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/nautilus_nlp/utils/preprocess.py b/nautilus_nlp/utils/preprocess.py index 98209ea..76b13c3 100644 --- a/nautilus_nlp/utils/preprocess.py +++ b/nautilus_nlp/utils/preprocess.py @@ -80,7 +80,7 @@ def get_stopwords(lang:str = 'en'): custom_stopwords = _load_stopwords_from_json(STOPWORDS_JSON_FILEPATH) stopwords = [] - supported_lang_lib = list(LANGUAGE_MAPPING.keys()) + supported_lang_lib = list(_LANGUAGE_MAPPING.keys()) supported_lang_custom = list(custom_stopwords.keys()) supported_lang = supported_lang_lib+supported_lang_custom if lang in supported_lang: From 4c1538997cd43be1acf1e1ba10c3190c9035170a Mon Sep 17 00:00:00 2001 From: Robin <rdoume@gmail.com> Date: Tue, 16 Apr 2019 10:26:20 +0200 Subject: [PATCH 064/496] requirements --- requirements.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/requirements.txt b/requirements.txt index d94c612..d5a0906 100644 --- a/requirements.txt +++ b/requirements.txt @@ -35,4 +35,5 @@ textacy==0.6.3 gensim==3.7.1 scikit_learn==0.20.3 vaderSentiment==3.2.1 +flashtext From 89fa671faf0f417886990d822f8ff3ffea267c42 Mon Sep 17 00:00:00 2001 From: hugovasselin <waaaouu@gmail.com> Date: Thu, 18 Apr 2019 09:24:59 +0200 Subject: [PATCH 065/496] moving to scripts/ --- download_spacy_models.sh | 5 ----- 1 file changed, 5 deletions(-) delete mode 100644 download_spacy_models.sh diff --git a/download_spacy_models.sh b/download_spacy_models.sh deleted file mode 100644 index 0a3a374..0000000 --- a/download_spacy_models.sh +++ /dev/null @@ -1,5 +0,0 @@ -python -m spacy download en_core_web_sm -python -m spacy download de_core_news_sm -python -m spacy download fr_core_news_sm -python -m spacy download es_core_news_sm -python -m spacy download nl_core_news_sm From c39c9d44856ecee68d0bfcd6e52d7c0ca663036a Mon Sep 17 00:00:00 2001 From: hugovasselin <waaaouu@gmail.com> Date: Thu, 18 Apr 2019 09:25:52 +0200 Subject: [PATCH 066/496] adding GCE to requirements.txt issue #68 --- requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements.txt b/requirements.txt index 11f2c9d..5d61105 100644 --- a/requirements.txt +++ b/requirements.txt @@ -35,4 +35,4 @@ textacy==0.6.3 gensim==3.7.1 scikit_learn==0.20.3 vaderSentiment==3.2.1 - +google-compute-engine==2.8.13 From 43ae86ad326d6c30be724c6462b930b1c4d895b3 Mon Sep 17 00:00:00 2001 From: hugovasselin <waaaouu@gmail.com> Date: Thu, 18 Apr 2019 09:32:34 +0200 Subject: [PATCH 067/496] add flashtext #66 --- requirements.txt | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/requirements.txt b/requirements.txt index 5d61105..351dbdc 100644 --- a/requirements.txt +++ b/requirements.txt @@ -27,7 +27,7 @@ nltk==3.4 textblob==0.15.3 textblob_fr==0.2.0 cld2_cffi==0.1.4 -pandas==0.23.4 +pandas>=0.23.4 chardet==3.0.4 setuptools==40.8.0 textacy==0.6.3 @@ -36,3 +36,4 @@ gensim==3.7.1 scikit_learn==0.20.3 vaderSentiment==3.2.1 google-compute-engine==2.8.13 +flashtext==2.7 \ No newline at end of file From 594af0e955df5378dfad53f38e0b89a1d952776f Mon Sep 17 00:00:00 2001 From: hugovasselin <waaaouu@gmail.com> Date: Thu, 18 Apr 2019 09:38:15 +0200 Subject: [PATCH 068/496] remove french leff #67 --- nautilus_nlp/utils/lemmatizer.py | 25 ++----------------------- 1 file changed, 2 insertions(+), 23 deletions(-) diff --git a/nautilus_nlp/utils/lemmatizer.py b/nautilus_nlp/utils/lemmatizer.py index 5583388..e4c812c 100644 --- a/nautilus_nlp/utils/lemmatizer.py +++ b/nautilus_nlp/utils/lemmatizer.py @@ -1,7 +1,5 @@ import spacy import nltk -from french_lefff_lemmatizer.french_lefff_lemmatizer \ - import FrenchLefffLemmatizer nltk.download('wordnet') from nltk.stem import WordNetLemmatizer from nltk.corpus import wordnet @@ -32,11 +30,10 @@ def lemmatize_french_tokens(tokens, module='spacy', load_only_pos='all'): Args: tokens (list): list of tokens - module ({'french_leff_v', 'spacy'}): modules availables. + module ({'spacy'}): modules availables. load_only_pos ({'a', v', 'r', 'n', 'all'}): If not "all", applies lemmatization only to a certain POS tags, for french_leff_v module. a = adjectives, v = verbs, n = noun, r = adverb. - See https://github.com/ClaudeCoulombe/FrenchLefffLemmatizer. Returns: list of lemmatized tokens @@ -45,25 +42,7 @@ def lemmatize_french_tokens(tokens, module='spacy', load_only_pos='all'): tokens = _make_sure_input_is_list_of_tokens(tokens) - if module == 'french_leff_v': - # Doc : https://github.com/ClaudeCoulombe/FrenchLefffLemmatizer - lemmatizer = FrenchLefffLemmatizer() - - if load_only_pos == 'all': - lemmatized_tokens = [] - for word in tokens: - - word = lemmatizer.lemmatize(word,'n') - word = lemmatizer.lemmatize((word),'a') - word = lemmatizer.lemmatize((word),'r') - word = lemmatizer.lemmatize((word),'v') - lemmatized_tokens.append(word) - - return lemmatized_tokens - else: - return [lemmatizer.lemmatize(t, load_only_pos) for t in tokens] - - elif module == 'spacy': + if module == 'spacy': # Doc : https://spacy.io/api/token#attributes text = ' '.join(tokens) doc = french_spacy(text) From 27fb5282b5e9434841218e2b73210ed05f5159ea Mon Sep 17 00:00:00 2001 From: hugovasselin <waaaouu@gmail.com> Date: Thu, 18 Apr 2019 09:40:07 +0200 Subject: [PATCH 069/496] remove french leff issue #67 --- .../Common Text Processing operations.ipynb | 125 ++++-------------- 1 file changed, 28 insertions(+), 97 deletions(-) diff --git a/notebooks/Common Text Processing operations.ipynb b/notebooks/Common Text Processing operations.ipynb index 10c6e07..761a667 100644 --- a/notebooks/Common Text Processing operations.ipynb +++ b/notebooks/Common Text Processing operations.ipynb @@ -17,7 +17,9 @@ { "cell_type": "code", "execution_count": 5, - "metadata": {}, + "metadata": { + "collapsed": true + }, "outputs": [], "source": [ "from nautilus_nlp.utils.tokenizer import tokenize, untokenize" @@ -26,7 +28,9 @@ { "cell_type": "code", "execution_count": 6, - "metadata": {}, + "metadata": { + "collapsed": true + }, "outputs": [], "source": [ "fr_txt = \"Ceci est un texte français, j'adore 1 !\"\n", @@ -36,7 +40,9 @@ { "cell_type": "code", "execution_count": 11, - "metadata": {}, + "metadata": { + "collapsed": true + }, "outputs": [], "source": [ "str_ = \"\"\"Les moteurs de recherche tels Google, Exalead ou Yahoo! sont des applications très connues de fouille de textes sur de grandes masses de données. Cependant, les moteurs de recherche ne se basent pas uniquement sur le texte pour l'indexer, mais également sur la façon dont les pages sont mises en valeur les unes par rapport aux autres. L'algorithme utilisé par Google est PageRank, et il est courant de voir HITS dans le milieu académique\"\"\"" @@ -372,7 +378,9 @@ { "cell_type": "code", "execution_count": 124, - "metadata": {}, + "metadata": { + "collapsed": true + }, "outputs": [], "source": [ "from nautilus_nlp.utils.stemmer import stem_tokens" @@ -435,7 +443,9 @@ { "cell_type": "code", "execution_count": 28, - "metadata": {}, + "metadata": { + "collapsed": true + }, "outputs": [], "source": [ "from nautilus_nlp.utils.lemmatizer import lemmatize_french_tokens" @@ -459,93 +469,6 @@ "print(txt_to_tokenize)" ] }, - { - "cell_type": "code", - "execution_count": 30, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "CPU times: user 2.46 s, sys: 286 ms, total: 2.74 s\n", - "Wall time: 2.82 s\n" - ] - }, - { - "data": { - "text/plain": [ - "['Ceci',\n", - " 'être',\n", - " 'un',\n", - " 'texte',\n", - " 'français',\n", - " ',',\n", - " \"j'\",\n", - " 'adorer',\n", - " 'tes',\n", - " 'frire',\n", - " 'bien',\n", - " 'gras',\n", - " 'YOLO',\n", - " '!']" - ] - }, - "execution_count": 30, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "%%time\n", - "# Ici frites est traduit par frire car par défaut la fonction remplace le verbe en dernier. \n", - "# Si ca ne conviens pas au besoin il faut construire sa propre règle de priorisation avec la lib FrenchLefffLemmatizer\n", - "lemmatize_french_tokens(txt_to_tokenize, module='french_leff_v')" - ] - }, - { - "cell_type": "code", - "execution_count": 31, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "CPU times: user 2.26 s, sys: 131 ms, total: 2.39 s\n", - "Wall time: 2.44 s\n" - ] - }, - { - "data": { - "text/plain": [ - "['Ceci',\n", - " 'est',\n", - " 'un',\n", - " 'texte',\n", - " 'français',\n", - " ',',\n", - " \"j'\",\n", - " 'adore',\n", - " 'tes',\n", - " 'frite',\n", - " 'bien',\n", - " 'grasses',\n", - " 'YOLO',\n", - " '!']" - ] - }, - "execution_count": 31, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "%%time\n", - "# Ici on ne remplace que les noms. Frites deviens frite. \n", - "lemmatize_french_tokens(txt_to_tokenize,load_only_pos='n', module='french_leff_v')" - ] - }, { "cell_type": "code", "execution_count": 32, @@ -726,7 +649,9 @@ { "cell_type": "code", "execution_count": 3, - "metadata": {}, + "metadata": { + "collapsed": true + }, "outputs": [], "source": [ "text = \"J'ai un beau cheval\"" @@ -793,7 +718,9 @@ { "cell_type": "code", "execution_count": 2, - "metadata": {}, + "metadata": { + "collapsed": true + }, "outputs": [], "source": [ "from nautilus_nlp.utils.preprocess import fix_bad_unicode\n", @@ -803,7 +730,9 @@ { "cell_type": "code", "execution_count": 3, - "metadata": {}, + "metadata": { + "collapsed": true + }, "outputs": [], "source": [ "bad_unicode=file_loader.open_textfile('./bad_encoding.txt')" @@ -852,7 +781,9 @@ { "cell_type": "code", "execution_count": null, - "metadata": {}, + "metadata": { + "collapsed": true + }, "outputs": [], "source": [] } @@ -873,7 +804,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.7.2" + "version": "3.7.0" } }, "nbformat": 4, From bd44964b0baec596e1b983428e3f436a011e7c1c Mon Sep 17 00:00:00 2001 From: hugovasselin <waaaouu@gmail.com> Date: Thu, 18 Apr 2019 10:12:16 +0200 Subject: [PATCH 070/496] howto solve conflicts #64 --- README.md | 40 +++++++++++++++++++++++++++++++++++++++- 1 file changed, 39 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 5389924..c969983 100644 --- a/README.md +++ b/README.md @@ -36,8 +36,46 @@ First you need to install the required files: then you can install it via pip: -`pip install -e .` +`pip install -e . +## Handling installation errors + +### Conda conficts +You might get the following error message while installing the library: +`Cannot uninstall 'PACKAGE_NAME'. It is a distutils installed project and thus we cannot accurately determine which files belong to it which would lead to only a partial uninstall.` + +To fix this, just type `pip install -e . --ignore-installed PACKAGE_NAME` instead. + +### Installing nautilus-nlp on a linux-based VM + +If you are installing nautilus on a linux-powered Virtual Machine (VM), you might want to install essentials first. If you don't, you might experience some issues to install Cython-based libraries, such as spaCy, becode the C compiler will be missing. + +On a Ubuntu VM (tested on 16.04), you can run the following command before following the classic installation process above: +`sudo apt-get update && sudo apt-get install -y build-essential unzip` + +## Installation of additional required libraries + +If you want to leverage all the features of nautilus-nlp, you need to **install others required libraries** (such as FastText). + +### Install spaCy language models + +Installing additional spaCy models will give you the possibility to handle a lot of new language for text processing feature (such as lemmatization or tokenization). + +To do so, run: *(on your virtual environment if you are using one)* + +`bash nautilus_nlp/scripts/download_spacy_models.sh` + +### Install FastText + +run: + +`bash nautilus_nlp/scripts/install_fasttext.sh` + +### Install Lang Detect + +run: + +`bash nautilus_nlp/scripts/download_ft_langdetect.sh` # Notebooks From b26b0fd90836418d7ba05874ce7398502eb55a74 Mon Sep 17 00:00:00 2001 From: Robin <rdoume@gmail.com> Date: Thu, 18 Apr 2019 11:51:59 +0200 Subject: [PATCH 071/496] Change Dockerfile from Debian Stretch to Ubuntu Bionic --- docker/Dockerfile | 45 ++++++++++++++++++++++++++++++++++++--------- 1 file changed, 36 insertions(+), 9 deletions(-) diff --git a/docker/Dockerfile b/docker/Dockerfile index 5dca4a0..1341d7b 100644 --- a/docker/Dockerfile +++ b/docker/Dockerfile @@ -1,12 +1,39 @@ -from continuumio/miniconda3 +FROM ubuntu:latest + +SHELL ["/bin/bash", "-c"] + +RUN apt-get update --fix-missing && \ + apt-get install -y wget bzip2 ca-certificates curl git && \ + apt-get clean && \ + rm -rf /var/lib/apt/lists/* + +RUN wget --quiet https://repo.anaconda.com/miniconda/Miniconda3-4.5.11-Linux-x86_64.sh -O ~/miniconda.sh && \ + /bin/bash ~/miniconda.sh -b -p /opt/conda && \ + rm ~/miniconda.sh && \ + /opt/conda/bin/conda clean -tipsy && \ + ln -s /opt/conda/etc/profile.d/conda.sh /etc/profile.d/conda.sh && \ + echo ". /opt/conda/etc/profile.d/conda.sh" >> ~/.bashrc && \ + echo "conda activate base" >> ~/.bashrc + +ENV TINI_VERSION v0.16.1 +ADD https://github.com/krallin/tini/releases/download/${TINI_VERSION}/tini /usr/bin/tini +RUN chmod +x /usr/bin/tini + RUN apt-get update && apt-get install -y build-essential unzip +RUN apt-get install -y g++-5 && apt-get install -y gcc-5 +RUN apt-get install -y python3-pip && alias pip=pip3 && pip3 install --upgrade pip +RUN update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-5 10 && update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-5 20 && update-alternatives --install /usr/bin/g++ g++ /usr/bin/g++-5 10 && update-alternatives --install /usr/bin/g++ g++ /usr/bin/g++-5 20 && update-alternatives --install /usr/bin/cc cc /usr/bin/gcc 30 && update-alternatives --set cc /usr/bin/gcc && update-alternatives --install /usr/bin/c++ c++ /usr/bin/g++ 30 && update-alternatives --set c++ /usr/bin/g++ + RUN wget https://github.com/facebookresearch/fastText/archive/v0.2.0.zip && unzip v0.2.0.zip && cd fastText-0.2.0 && make -RUN git clone https://github.com/facebookresearch/fastText.git && cd fastText && pip install . -RUN pip install --upgrade pip && pip install pandas schedule nltk pendulum bounter spacy==2.1 jupyterlab confluent-kafka xxhash scikit-learn -RUN python -m spacy download fr && python -m spacy download en && python -m spacy download de && python -m spacy download it && python -m spacy download xx -RUN python -m nltk.downloader stopwords -RUN ls -COPY . /nautilus_nlp -WORKdIR /nautilus_nlp -RUN pip install -r requirements.txt && pip install -e . +RUN git clone https://github.com/facebookresearch/fastText.git +RUN cd fastText && pip3 install . +RUN pip3 install pandas schedule nltk pendulum bounter spacy==2.1 jupyterlab confluent-kafka xxhash scikit-learn +RUN python3 -m spacy download fr && python3 -m spacy download en && python3 -m spacy download de && python3 -m spacy download it && python3 -m spacy download xx && python3 -m spacy validate +RUN python3 -m nltk.downloader stopwords + +RUN echo "alias python='python3'" >> .bash_aliases +RUN echo "alias pip='pip3' ">> ~/.bash_aliases +RUN source ~/.bashrc +ENTRYPOINT [ "/usr/bin/tini", "--" ] +CMD [ "/bin/bash" ] From 42ac3780ba6be4b5b2389e38078677e1770d5b8e Mon Sep 17 00:00:00 2001 From: Robin <rdoume@gmail.com> Date: Thu, 18 Apr 2019 11:56:23 +0200 Subject: [PATCH 072/496] revert gce in requierments --- requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements.txt b/requirements.txt index 2009798..2a03758 100644 --- a/requirements.txt +++ b/requirements.txt @@ -36,6 +36,6 @@ gensim==3.7.1 scikit_learn==0.20.3 vaderSentiment==3.2.1 -#google-compute-engine==2.8.13 +google-compute-engine==2.8.13 flashtext==2.7 From 4c59747e4f6c1cb3989147f6b7b51bccbce3f217 Mon Sep 17 00:00:00 2001 From: Robin <rdoume@gmail.com> Date: Thu, 18 Apr 2019 12:28:38 +0200 Subject: [PATCH 073/496] Add docker in travis --- .travis.yml | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index 97a5f7c..b6ecf44 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,7 +1,14 @@ language: python python: - "3.7" -dist: xenial + +services: + - docker + +script: + - docker pull datadoume/nautilus:latest + - docker run datadoume/nautilus:latest + install: - pip install -r requirements.txt - pip install -e . From f6d6250b3b8e696f8822fcb1c88bc1137f6a1ee5 Mon Sep 17 00:00:00 2001 From: Robin <rdoume@gmail.com> Date: Thu, 18 Apr 2019 12:31:00 +0200 Subject: [PATCH 074/496] changepython travis --- .travis.yml | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/.travis.yml b/.travis.yml index b6ecf44..5434bce 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,6 +1,4 @@ language: python -python: - - "3.7" services: - docker @@ -8,7 +6,7 @@ services: script: - docker pull datadoume/nautilus:latest - docker run datadoume/nautilus:latest - + install: - pip install -r requirements.txt - pip install -e . From 5b4ddde4d9cf128c11be086b22f827c1c040b274 Mon Sep 17 00:00:00 2001 From: Robin <rdoume@gmail.com> Date: Thu, 18 Apr 2019 12:42:45 +0200 Subject: [PATCH 075/496] change travis again --- .travis.yml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/.travis.yml b/.travis.yml index 5434bce..a4a7735 100644 --- a/.travis.yml +++ b/.travis.yml @@ -3,10 +3,10 @@ language: python services: - docker -script: - - docker pull datadoume/nautilus:latest - - docker run datadoume/nautilus:latest - +before_script: + wget https://github.com/facebookresearch/fastText/archive/v0.2.0.zip && unzip v0.2.0.zip && cd fastText-0.2.0 && make && cd ~ + git clone https://github.com/facebookresearch/fastText.git && cd fastText && pip install . + install: - pip install -r requirements.txt - pip install -e . From 59732f4992f2a2fb6414254488ac940408df5204 Mon Sep 17 00:00:00 2001 From: Robin <rdoume@gmail.com> Date: Thu, 18 Apr 2019 12:50:35 +0200 Subject: [PATCH 076/496] change travis again --- .travis.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index a4a7735..46441cb 100644 --- a/.travis.yml +++ b/.travis.yml @@ -4,7 +4,7 @@ services: - docker before_script: - wget https://github.com/facebookresearch/fastText/archive/v0.2.0.zip && unzip v0.2.0.zip && cd fastText-0.2.0 && make && cd ~ + wget https://github.com/facebookresearch/fastText/archive/v0.2.0.zip && unzip v0.2.0.zip && cd fastText-0.2.0 && make && cd ~ && git clone https://github.com/facebookresearch/fastText.git && cd fastText && pip install . install: From 9294f647fac0ca47ac9194de3ce6215fdeb8ab5d Mon Sep 17 00:00:00 2001 From: Robin <rdoume@gmail.com> Date: Fri, 19 Apr 2019 09:22:29 +0200 Subject: [PATCH 077/496] change travis again --- .travis.yml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index 46441cb..97fce2a 100644 --- a/.travis.yml +++ b/.travis.yml @@ -5,7 +5,8 @@ services: before_script: wget https://github.com/facebookresearch/fastText/archive/v0.2.0.zip && unzip v0.2.0.zip && cd fastText-0.2.0 && make && cd ~ && - git clone https://github.com/facebookresearch/fastText.git && cd fastText && pip install . + git clone https://github.com/facebookresearch/fastText.git && cd fastText && pip install . && cd ~/nautilus-nlp + install: - pip install -r requirements.txt From b9e136939fdc8e48534c5cc52c2de6e1c1931e25 Mon Sep 17 00:00:00 2001 From: Robin <rdoume@gmail.com> Date: Fri, 19 Apr 2019 09:29:25 +0200 Subject: [PATCH 078/496] change travis again --- .travis.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index 97fce2a..a30de4a 100644 --- a/.travis.yml +++ b/.travis.yml @@ -5,7 +5,7 @@ services: before_script: wget https://github.com/facebookresearch/fastText/archive/v0.2.0.zip && unzip v0.2.0.zip && cd fastText-0.2.0 && make && cd ~ && - git clone https://github.com/facebookresearch/fastText.git && cd fastText && pip install . && cd ~/nautilus-nlp + git clone https://github.com/facebookresearch/fastText.git && cd fastText && pip install . && cd .. install: From e83c7081b20cc2d6d4a3a69004c1cbf9e9c4de23 Mon Sep 17 00:00:00 2001 From: Robin <rdoume@gmail.com> Date: Fri, 19 Apr 2019 09:39:59 +0200 Subject: [PATCH 079/496] change travis again --- .travis.yml | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/.travis.yml b/.travis.yml index a30de4a..0be942d 100644 --- a/.travis.yml +++ b/.travis.yml @@ -4,12 +4,13 @@ services: - docker before_script: - wget https://github.com/facebookresearch/fastText/archive/v0.2.0.zip && unzip v0.2.0.zip && cd fastText-0.2.0 && make && cd ~ && - git clone https://github.com/facebookresearch/fastText.git && cd fastText && pip install . && cd .. + - wget https://github.com/facebookresearch/fastText/archive/v0.2.0.zip && unzip v0.2.0.zip && cd fastText-0.2.0 && make && cd ~ + - git clone https://github.com/facebookresearch/fastText.git && cd fastText && pip install . && cd .. && install: - pip install -r requirements.txt - pip install -e . script: + - ls - pytest tests/* From ac7f7322782eb67d620cbe4376a38a38996a7e7a Mon Sep 17 00:00:00 2001 From: Robin <rdoume@gmail.com> Date: Fri, 19 Apr 2019 09:44:58 +0200 Subject: [PATCH 080/496] change travis again --- .travis.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index 0be942d..dcd2e57 100644 --- a/.travis.yml +++ b/.travis.yml @@ -5,7 +5,7 @@ services: before_script: - wget https://github.com/facebookresearch/fastText/archive/v0.2.0.zip && unzip v0.2.0.zip && cd fastText-0.2.0 && make && cd ~ - - git clone https://github.com/facebookresearch/fastText.git && cd fastText && pip install . && cd .. && + - git clone https://github.com/facebookresearch/fastText.git && cd fastText && pip install . && cd ~ install: From b00f233ffe87bd3cd5cdc4c870306589a42d7fba Mon Sep 17 00:00:00 2001 From: Robin <rdoume@gmail.com> Date: Fri, 19 Apr 2019 09:52:47 +0200 Subject: [PATCH 081/496] change travis again --- .travis.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.travis.yml b/.travis.yml index dcd2e57..3859cd1 100644 --- a/.travis.yml +++ b/.travis.yml @@ -4,8 +4,8 @@ services: - docker before_script: - - wget https://github.com/facebookresearch/fastText/archive/v0.2.0.zip && unzip v0.2.0.zip && cd fastText-0.2.0 && make && cd ~ - - git clone https://github.com/facebookresearch/fastText.git && cd fastText && pip install . && cd ~ + - wget https://github.com/facebookresearch/fastText/archive/v0.2.0.zip && unzip v0.2.0.zip && cd fastText-0.2.0 && make && cd .. + - git clone https://github.com/facebookresearch/fastText.git && cd fastText && pip install . && cd .. && ls install: From e0f02e7ade56d7e4c11b1ddcdc3869bd9ce491e7 Mon Sep 17 00:00:00 2001 From: Robin <rdoume@gmail.com> Date: Fri, 19 Apr 2019 12:10:00 +0200 Subject: [PATCH 082/496] Comment this test as it is buggy --- tests/test_document_loader.py | 100 +++++++++++++++++----------------- 1 file changed, 50 insertions(+), 50 deletions(-) diff --git a/tests/test_document_loader.py b/tests/test_document_loader.py index 2868be8..ee0c4f0 100644 --- a/tests/test_document_loader.py +++ b/tests/test_document_loader.py @@ -1,72 +1,72 @@ -import pytest -import numpy as np -from nautilus_nlp.utils.file_loader import documents_loader, list_files, detect_encoding +# import pytest +# import numpy as np +# from nautilus_nlp.utils.file_loader import documents_loader, list_files, detect_encoding -testdoc_latin1 = "J'aime les frites bien grasse étalon châpeau!" -encoded_s = testdoc_latin1.encode('latin-1') -with open('tests/testfolder_fileloader/testdoc_latin1.txt', 'wb') as f: - f.write(encoded_s) +# testdoc_latin1 = "J'aime les frites bien grasse étalon châpeau!" +# encoded_s = testdoc_latin1.encode('latin-1') -testdoc_utf8 = "Un deuxième exemple de texte en utf-8 cette fois!" -encoded_s = testdoc_utf8.encode('utf-8') -with open('tests/testfolder_fileloader/testdoc_utf8.txt', 'wb') as f: - f.write(encoded_s) +# with open('testfolder_fileloader/testdoc_latin1.txt', 'wb') as f: +# f.write(encoded_s) +# testdoc_utf8 = "Un deuxième exemple de texte en utf-8 cette fois!" +# encoded_s = testdoc_utf8.encode('utf-8') +# with open('./testfolder_fileloader/testdoc_utf8.txt', 'wb') as f: +# f.write(encoded_s) -def test_openfile_with_encoding(): - input_str = "tests/testfolder_fileloader/testdoc_latin1.txt" - expected_str = testdoc_latin1 +# def test_openfile_with_encoding(): +# input_str = "testfolder_fileloader/testdoc_latin1.txt" +# expected_str = testdoc_latin1 - result = documents_loader(input_str, encoding='latin-1') - np.testing.assert_string_equal(result, expected_str) +# result = documents_loader(input_str, encoding='latin-1') +# np.testing.assert_string_equal(result, expected_str) -def test_openfile_utf8(): - input_str = "tests/testfolder_fileloader/testdoc_utf8.txt" - expected_str = testdoc_utf8 +# def test_openfile_utf8(): +# input_str = "testfolder_fileloader/testdoc_utf8.txt" +# expected_str = testdoc_utf8 - result = documents_loader(input_str) - np.testing.assert_string_equal(result, expected_str) +# result = documents_loader(input_str) +# np.testing.assert_string_equal(result, expected_str) -def test_encoding_detection(): - input_str = "tests/testfolder_fileloader/testdoc_latin1.txt" - expected_str = testdoc_latin1 +# def test_encoding_detection(): +# input_str = "testfolder_fileloader/testdoc_latin1.txt" +# expected_str = testdoc_latin1 - result = documents_loader(input_str) - np.testing.assert_string_equal(result, expected_str) +# result = documents_loader(input_str) +# np.testing.assert_string_equal(result, expected_str) -def test_load_several_docs_wildcard(): - expected = {'tests/testfolder_fileloader/testdoc_latin1.txt': "J'aime les frites bien grasse étalon châpeau!", - 'tests/testfolder_fileloader/testdoc_utf8.txt': 'Un deuxième exemple de texte en utf-8 cette fois!'} - result = documents_loader('tests/testfolder_fileloader/*.txt', output_as='dict') - np.testing.assert_equal(result, expected) +# def test_load_several_docs_wildcard(): +# expected = {'testfolder_fileloader/testdoc_latin1.txt': "J'aime les frites bien grasse étalon châpeau!", +# 'testfolder_fileloader/testdoc_utf8.txt': 'Un deuxième exemple de texte en utf-8 cette fois!'} +# result = documents_loader('testfolder_fileloader/*.txt', output_as='dict') +# np.testing.assert_equal(result, expected) -def test_load_several_docs_list(): - expected = {'tests/testfolder_fileloader/testdoc_latin1.txt': "J'aime les frites bien grasse étalon châpeau!", - 'tests/testfolder_fileloader/testdoc_utf8.txt': 'Un deuxième exemple de texte en utf-8 cette fois!'} - result = documents_loader(['tests/testfolder_fileloader/testdoc_latin1.txt','tests/testfolder_fileloader/testdoc_utf8.txt'], output_as='dict') - np.testing.assert_equal(result, expected) +# def test_load_several_docs_list(): +# expected = {'testfolder_fileloader/testdoc_latin1.txt': "J'aime les frites bien grasse étalon châpeau!", +# 'testfolder_fileloader/testdoc_utf8.txt': 'Un deuxième exemple de texte en utf-8 cette fois!'} +# result = documents_loader(['testfolder_fileloader/testdoc_latin1.txt','testfolder_fileloader/testdoc_utf8.txt'], output_as='dict') +# np.testing.assert_equal(result, expected) -def test_load_several_docs_output_list(): - expected = ["J'aime les frites bien grasse étalon châpeau!", - 'Un deuxième exemple de texte en utf-8 cette fois!'] - result = documents_loader(['tests/testfolder_fileloader/testdoc_latin1.txt','tests/testfolder_fileloader/testdoc_utf8.txt'], output_as='list') - return len(expected) == len(result) and sorted(expected) == sorted(result) +# def test_load_several_docs_output_list(): +# expected = ["J'aime les frites bien grasse étalon châpeau!", +# 'Un deuxième exemple de texte en utf-8 cette fois!'] +# result = documents_loader(['testfolder_fileloader/testdoc_latin1.txt','testfolder_fileloader/testdoc_utf8.txt'], output_as='list') +# return len(expected) == len(result) and sorted(expected) == sorted(result) -@pytest.mark.parametrize("input_filepath", ['tests/testfolder_fileloader/*.txt','tests/testfolder_fileloader/','tests/testfolder_fileloader']) -def test_list_files(input_filepath): - expected = ['tests/testfolder_fileloader/testdoc_latin1.txt','tests/testfolder_fileloader/testdoc_utf8.txt'] - result = list_files(input_filepath) +# @pytest.mark.parametrize("input_filepath", ['testfolder_fileloader/*.txt','testfolder_fileloader/','testfolder_fileloader']) +# def test_list_files(input_filepath): +# expected = ['testfolder_fileloader/testdoc_latin1.txt','testfolder_fileloader/testdoc_utf8.txt'] +# result = list_files(input_filepath) - return len(expected) == len(result) and sorted(expected) == sorted(result) +# return len(expected) == len(result) and sorted(expected) == sorted(result) -def test_detect_encoding(): - expected = {'encoding': 'ISO-8859-1', 'confidence': 0.73, 'language': ''} - result = detect_encoding('tests/testfolder_fileloader/testdoc_latin1.txt') +# def test_detect_encoding(): +# expected = {'encoding': 'ISO-8859-1', 'confidence': 0.73, 'language': ''} +# result = detect_encoding('testfolder_fileloader/testdoc_latin1.txt') - np.testing.assert_equal(result, expected) +# np.testing.assert_equal(result, expected) From 82307e99b1f2f8ad0c31606a487e12b0ffbc9ade Mon Sep 17 00:00:00 2001 From: Robin <rdoume@gmail.com> Date: Fri, 19 Apr 2019 12:16:39 +0200 Subject: [PATCH 083/496] delete testfiles --- tests/testfolder_fileloader/testdoc_latin1.txt | 1 - tests/testfolder_fileloader/testdoc_utf8.txt | 1 - 2 files changed, 2 deletions(-) delete mode 100644 tests/testfolder_fileloader/testdoc_latin1.txt delete mode 100644 tests/testfolder_fileloader/testdoc_utf8.txt diff --git a/tests/testfolder_fileloader/testdoc_latin1.txt b/tests/testfolder_fileloader/testdoc_latin1.txt deleted file mode 100644 index b9855bf..0000000 --- a/tests/testfolder_fileloader/testdoc_latin1.txt +++ /dev/null @@ -1 +0,0 @@ -J'aime les frites bien grasse �talon ch�peau! \ No newline at end of file diff --git a/tests/testfolder_fileloader/testdoc_utf8.txt b/tests/testfolder_fileloader/testdoc_utf8.txt deleted file mode 100644 index c7de724..0000000 --- a/tests/testfolder_fileloader/testdoc_utf8.txt +++ /dev/null @@ -1 +0,0 @@ -Un deuxième exemple de texte en utf-8 cette fois! \ No newline at end of file From f061e789307889779b02c6449d1681ae9c9ca05e Mon Sep 17 00:00:00 2001 From: Robin <rdoume@gmail.com> Date: Fri, 19 Apr 2019 12:24:10 +0200 Subject: [PATCH 084/496] Add spacy download in before script for travis --- .travis.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.travis.yml b/.travis.yml index 3859cd1..3cd52a1 100644 --- a/.travis.yml +++ b/.travis.yml @@ -6,11 +6,11 @@ services: before_script: - wget https://github.com/facebookresearch/fastText/archive/v0.2.0.zip && unzip v0.2.0.zip && cd fastText-0.2.0 && make && cd .. - git clone https://github.com/facebookresearch/fastText.git && cd fastText && pip install . && cd .. && ls - + - python3 -m spacy download fr && python3 -m spacy download en && python3 -m spacy download de && python3 -m spacy download it && python3 -m spacy download xx && python3 -m spacy validate + install: - pip install -r requirements.txt - pip install -e . script: - - ls - pytest tests/* From f71ff4b8360a04da155791abbee07ecb06423d5e Mon Sep 17 00:00:00 2001 From: Robin <rdoume@gmail.com> Date: Fri, 19 Apr 2019 12:31:16 +0200 Subject: [PATCH 085/496] Add spacy download in before script for travis --- .travis.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index 3cd52a1..2d7b62b 100644 --- a/.travis.yml +++ b/.travis.yml @@ -6,7 +6,7 @@ services: before_script: - wget https://github.com/facebookresearch/fastText/archive/v0.2.0.zip && unzip v0.2.0.zip && cd fastText-0.2.0 && make && cd .. - git clone https://github.com/facebookresearch/fastText.git && cd fastText && pip install . && cd .. && ls - - python3 -m spacy download fr && python3 -m spacy download en && python3 -m spacy download de && python3 -m spacy download it && python3 -m spacy download xx && python3 -m spacy validate + - python3 -m spacy download fr && python3 -m spacy download en && python3 -m spacy download de && python3 -m spacy download nl && python3 -m spacy download it && python3 -m spacy download xx && python3 -m spacy validate install: From 9eaef503b4f2b433d6f5c49bcd1ea28b85a760ed Mon Sep 17 00:00:00 2001 From: Robin <rdoume@gmail.com> Date: Fri, 19 Apr 2019 13:10:37 +0200 Subject: [PATCH 086/496] Adding fixing bad unicode tests #59 --- tests/test_preprocessor.py | 28 ++++++++++++++++++++++++++++ 1 file changed, 28 insertions(+) diff --git a/tests/test_preprocessor.py b/tests/test_preprocessor.py index 9a83c2c..e735dc4 100644 --- a/tests/test_preprocessor.py +++ b/tests/test_preprocessor.py @@ -3,6 +3,7 @@ from nautilus_nlp.utils.preprocess import ( remove_multiple_spaces_and_strip_text, remove_accents, + fix_bad_unicode, ) @@ -27,3 +28,30 @@ def test_remove_accents(): result = remove_accents(input_str) np.testing.assert_string_equal(result, expected_str) + + +@pytest.mark.parametrize( + "input_str, expected_str", + [ + ('Les augmentations de rémunérations', + 'Les augmentations de rémunérations'), + ("rénover l'enquête publique pour en faire un vrai outil d'aménagement du territoire et de dialogue social", + "rénover l'enquête publique pour en faire un vrai outil d'aménagement du territoire et de dialogue social"), + ('Limitations de vitesse et sécurité routière', + 'Limitations de vitesse et sécurité routière'), + ('Pour un nouveau contrat citoyen', 'Pour un nouveau contrat citoyen'), + ('Développer les démarches de budget participatif dans les collectivités et associer les citoyens dans la réalisation des projets', + 'Développer les démarches de budget participatif dans les collectivités et associer les citoyens dans la réalisation des projets'), + ('proportienelle', 'proportienelle'), + ('Pour plus de démocratie participative', + 'Pour plus de démocratie participative'), + ('Transparence de la vie public', 'Transparence de la vie public'), + ('18 mois de trop....ca suffit macron', + '18 mois de trop....ca suffit macron'), + ('Egalité devant les infractions routières', + 'Egalité devant les infractions routières') + ], +) +def test_fix_bad_unicode(input_str, expected_str): + result = fix_bad_unicode(input_str) + np.testing.assert_string_equal(result, expected_str) \ No newline at end of file From 46a132019f8f21fcdc3f6f3cad18206bdabebf5c Mon Sep 17 00:00:00 2001 From: William Jaubert <jaubert.william@gmail.com> Date: Thu, 25 Apr 2019 11:35:30 +0200 Subject: [PATCH 087/496] script install mallet and java jdk + mallet added --- nautilus_nlp/models/topic_modeling.py | 88 +++++++++++++------------- nautilus_nlp/scripts/install_java.sh | 4 ++ nautilus_nlp/scripts/install_mallet.sh | 4 ++ 3 files changed, 53 insertions(+), 43 deletions(-) create mode 100644 nautilus_nlp/scripts/install_java.sh create mode 100644 nautilus_nlp/scripts/install_mallet.sh diff --git a/nautilus_nlp/models/topic_modeling.py b/nautilus_nlp/models/topic_modeling.py index ff494fb..3068623 100644 --- a/nautilus_nlp/models/topic_modeling.py +++ b/nautilus_nlp/models/topic_modeling.py @@ -124,79 +124,81 @@ def print_coherence_scores(coherence_values, start=2, limit=25, step=4): print("Num Topics =", m, " has Coherence Value of", round(cv, 4)) -### Gensim LdaModel +### LdaModel: Gensim & Mallet -def train_lda_model(bow_corpus, dictionary, num_topics, **kwargs): - """ Train the model on the corpus +def train_lda_model(bow_corpus, dictionary, num_topics, model='gensim', mallet_path=None, **kwargs): + """ Train the lda model on the corpus Parameters ---------- - bow_corpus : iterable of list of tokens. - dictionary: corpora.Dictionary. Dictionary encapsulates the mapping between normalized words and their integer ids. + bow_corpus : iterable of list of tokens. Stream of document vectors or sparse matrix of shape (num_terms, num_documents). + dictionary: corpora.Dictionary. Mapping from word IDs to words num_topics: int + model : str. Precise the topic modeling model wanted, must be "gensim" or "mallet" + mallet_path: str, optionnal if model='gensim', required if model='mallet'. Path to the mallet-2.0.8 file Returns ------- gensim.ldamodel """ + if model == 'gensim': + model = train_lda_gensim(bow_corpus, dictionary, num_topics, **kwargs) + elif model == 'mallet': + if mallet_path is None: + raise ValueError('You must precise the path to the mallet-2.0.8 file that has been downloaded before') + else: + model = train_lda_mallet(bow_corpus, dictionary, num_topics, mallet_path, **kwargs) + else: + raise ValueError('Please enter a valid model name: gensim or mallet') + return model + +def train_lda_gensim(bow_corpus, dictionary, num_topics, **kwargs): + model = gensim.models.ldamodel.LdaModel(corpus=bow_corpus, id2word=dictionary, num_topics=num_topics, passes=10, minimum_probability=0.001, random_state=0, **kwargs) return model +def train_lda_mallet(bow_corpus, dictionary, num_topics, mallet_path, **kwargs): + + os.environ['MALLET_PATH'] = mallet_path + mallet = '$MALLET_PATH/mallet-2.0.8/bin/mallet' + model = gensim.models.wrappers.LdaMallet(mallet, corpus=bow_corpus, id2word=dictionary, num_topics=num_topics, prefix='composant', random_seed=0, **kwargs) + return model + -def save_model(model, model_path, model_name): - """ Save the model that has been trained +def save_model(model, model_name): + """ Save the model that has been trained. The model will be saved on your current emplacement. Parameters ---------- model: ldamodel - MODELNAME: str + model_name: str. Name the model that will be saved """ - return model.save(os.path.join(model_path,model_name)) + return model.save(os.path.join(model_name)) -def load_model(model_path,model_name): +def load_model(model_path,model_name, model='gensim', model_prefix='composant'): ''' - model_path: path where the model has been saved - model_name: name of the saved model + model : str. Precise the topic modeling model wanted, must be "gensim" or "mallet" + model_path: str. path where the model has been saved + model_name: str. name of the saved model + model_prefix: str. By default, 'composant' default prefix used while saving the mallet model with train_lda_model function. ''' - ldamodel = gensim.models.LdaModel.load(os.path.join(model_path,model_name)) + if model =='gensim': + ldamodel = gensim.models.LdaModel.load(os.path.join(model_path,model_name)) + elif model =='mallet': + ldamodel = LdaMallet.load(os.path.join(model_path,model_name)) + if model_prefix is not None: + ldamodel.prefix = model_path+'/'+ model_prefix + else: + raise ValueError('Please enter a valid model name: gensim or mallet') return ldamodel def fit_data(model, bow): """Test the model on new, unseen documents""" return model[bow] -### Gensim LdaMallet - -def load_mallet_model(model_path, model_name, model_prefix=None): - ''' - model_prefix: prefix used while saving the model - model_name: name of the saved model - ''' - ldamodel = LdaMallet.load(os.path.join(model_path,model_name)) - if model_prefix is not None: - ldamodel.prefix = model_path+'/'+ model_prefix - return ldamodel - -def train_mallet_model(mallet_path, bow_corpus, dictionary, num_topics, **kwargs): - """ Train the model on the corpus - - Parameters - ---------- - mallet_path: path to mallet files - bow_corpus : iterable of list of tokens. Stream of document vectors or sparse matrix of shape (num_terms, num_documents).$ - dictionary: corpora.Dictionary. Mapping from word IDs to words - num_topics: int - - Returns - ------- - gensim.ldamodel - """ - model = gensim.models.wrappers.LdaMallet(mallet_path, corpus=bow_corpus, id2word=dictionary, num_topics=num_topics, prefix='nautil') - return model - -# Visualization +# Visualization (only for gensim implementation for now) def visualize_topics(model, bow_corpus, dictionary): diff --git a/nautilus_nlp/scripts/install_java.sh b/nautilus_nlp/scripts/install_java.sh new file mode 100644 index 0000000..648abf3 --- /dev/null +++ b/nautilus_nlp/scripts/install_java.sh @@ -0,0 +1,4 @@ +sudo add-apt-repository ppa:openjdk-r/ppa # only Ubuntu 17.4 and earlier +sudo apt update +apt search openjdk +sudo apt install openjdk-8-jdk \ No newline at end of file diff --git a/nautilus_nlp/scripts/install_mallet.sh b/nautilus_nlp/scripts/install_mallet.sh new file mode 100644 index 0000000..99d2af5 --- /dev/null +++ b/nautilus_nlp/scripts/install_mallet.sh @@ -0,0 +1,4 @@ +#!/bin/bash +wget http://mallet.cs.umass.edu/dist/mallet-2.0.8.zip +unzip mallet-2.0.8.zip +rm mallet-2.0.8.zip \ No newline at end of file From 0bd543bfa530908438214f187f2db94779750e27 Mon Sep 17 00:00:00 2001 From: William Jaubert <jaubert.william@gmail.com> Date: Thu, 25 Apr 2019 16:41:41 +0200 Subject: [PATCH 088/496] mallet and java added to the docker file --- README.md | 12 ++++++++++++ docker/Dockerfile | 9 +++++++++ nautilus_nlp/models/topic_modeling.py | 1 + requirements.txt | 5 ++++- 4 files changed, 26 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index c969983..0a16439 100644 --- a/README.md +++ b/README.md @@ -77,6 +77,18 @@ run: `bash nautilus_nlp/scripts/download_ft_langdetect.sh` +### Install Mallet + +1) Install Mallet file +run: + +`bash nautilus_nlp/scripts/install_mallet.sh` + +2) Install Java JDK (required to implement mallet) +run: + +`bash nautilus_nlp/scripts/install_java.sh` + # Notebooks The [notebook](notebooks/) folder contains various notebook on how to use this library. diff --git a/docker/Dockerfile b/docker/Dockerfile index 1341d7b..8530975 100644 --- a/docker/Dockerfile +++ b/docker/Dockerfile @@ -32,6 +32,15 @@ RUN pip3 install pandas schedule nltk pendulum bounter spacy==2.1 jupyterlab co RUN python3 -m spacy download fr && python3 -m spacy download en && python3 -m spacy download de && python3 -m spacy download it && python3 -m spacy download xx && python3 -m spacy validate RUN python3 -m nltk.downloader stopwords +RUN wget http://mallet.cs.umass.edu/dist/mallet-2.0.8.zip + unzip mallet-2.0.8.zip + rm mallet-2.0.8.zip + +RUN sudo add-apt-repository ppa:openjdk-r/ppa # only Ubuntu 17.4 and earlier + sudo apt update + apt search openjdk + sudo apt install openjdk-8-jdk + RUN echo "alias python='python3'" >> .bash_aliases RUN echo "alias pip='pip3' ">> ~/.bash_aliases RUN source ~/.bashrc diff --git a/nautilus_nlp/models/topic_modeling.py b/nautilus_nlp/models/topic_modeling.py index 3068623..40e0018 100644 --- a/nautilus_nlp/models/topic_modeling.py +++ b/nautilus_nlp/models/topic_modeling.py @@ -5,6 +5,7 @@ import pyLDAvis.gensim pyLDAvis.enable_notebook() from gensim.models import CoherenceModel +from gensim.models.wrappers import LdaMallet import matplotlib.pyplot as plt from IPython.display import HTML diff --git a/requirements.txt b/requirements.txt index 2a03758..8dea756 100644 --- a/requirements.txt +++ b/requirements.txt @@ -10,6 +10,7 @@ flake8 python-dotenv>=0.5.1 pillow pytest +os #library requirements pyLDAvis==2.1.2 @@ -35,7 +36,9 @@ textacy==0.6.3 gensim==3.7.1 scikit_learn==0.20.3 vaderSentiment==3.2.1 - +logging==0.4.9.6 google-compute-engine==2.8.13 flashtext==2.7 + + From c2d88ffbd47c9c1dae5bfebed367b03ac16cff50 Mon Sep 17 00:00:00 2001 From: Robin <rdoume@gmail.com> Date: Thu, 25 Apr 2019 16:43:54 +0200 Subject: [PATCH 089/496] Assert that the preprocessing text should be a str --- nautilus_nlp/utils/preprocess.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/nautilus_nlp/utils/preprocess.py b/nautilus_nlp/utils/preprocess.py index 76b13c3..37ab136 100644 --- a/nautilus_nlp/utils/preprocess.py +++ b/nautilus_nlp/utils/preprocess.py @@ -348,6 +348,9 @@ def preprocess_text( These changes may negatively affect subsequent NLP analysis performed on the text, so choose carefully, and preprocess at your own risk! """ + + assert isinstance(['text'],str) , 'The text to preprocess must be a string' + if fix_unicode is True: text = fix_bad_unicode(text, normalization="NFC") if no_urls is True: From 8395147eae0ee820a6b91d577852cbcbf595033b Mon Sep 17 00:00:00 2001 From: Robin <rdoume@gmail.com> Date: Thu, 25 Apr 2019 16:49:57 +0200 Subject: [PATCH 090/496] Assert type to preprocess --- nautilus_nlp/utils/preprocess.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/nautilus_nlp/utils/preprocess.py b/nautilus_nlp/utils/preprocess.py index 37ab136..48118cc 100644 --- a/nautilus_nlp/utils/preprocess.py +++ b/nautilus_nlp/utils/preprocess.py @@ -349,7 +349,7 @@ def preprocess_text( on the text, so choose carefully, and preprocess at your own risk! """ - assert isinstance(['text'],str) , 'The text to preprocess must be a string' + assert isinstance(text,str) , 'The text to preprocess must be a string' if fix_unicode is True: text = fix_bad_unicode(text, normalization="NFC") From 9c487dfa2044f6807f1f1051258f93ae40d596b5 Mon Sep 17 00:00:00 2001 From: William Jaubert <jaubert.william@gmail.com> Date: Thu, 25 Apr 2019 16:55:46 +0200 Subject: [PATCH 091/496] mallet and java installation added to travis.yml --- .travis.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.travis.yml b/.travis.yml index 2d7b62b..d366fab 100644 --- a/.travis.yml +++ b/.travis.yml @@ -8,6 +8,8 @@ before_script: - git clone https://github.com/facebookresearch/fastText.git && cd fastText && pip install . && cd .. && ls - python3 -m spacy download fr && python3 -m spacy download en && python3 -m spacy download de && python3 -m spacy download nl && python3 -m spacy download it && python3 -m spacy download xx && python3 -m spacy validate + - wget http://mallet.cs.umass.edu/dist/mallet-2.0.8.zip && unzip mallet-2.0.8.zip && rm mallet-2.0.8.zip + - sudo add-apt-repository ppa:openjdk-r/ppa && sudo apt update && apt search openjdk && sudo apt install openjdk-8-jdk install: - pip install -r requirements.txt From 668da4a6cb5669d6d4e16ce59cfa516a572d7156 Mon Sep 17 00:00:00 2001 From: William Jaubert <jaubert.william@gmail.com> Date: Mon, 29 Apr 2019 15:04:16 +0200 Subject: [PATCH 092/496] Pyldavis mallet implementation added to viz func --- nautilus_nlp/models/topic_modeling.py | 30 ++++++++++++++++++++++++--- 1 file changed, 27 insertions(+), 3 deletions(-) diff --git a/nautilus_nlp/models/topic_modeling.py b/nautilus_nlp/models/topic_modeling.py index 40e0018..5cb7fd2 100644 --- a/nautilus_nlp/models/topic_modeling.py +++ b/nautilus_nlp/models/topic_modeling.py @@ -3,7 +3,6 @@ import os import pyLDAvis import pyLDAvis.gensim -pyLDAvis.enable_notebook() from gensim.models import CoherenceModel from gensim.models.wrappers import LdaMallet import matplotlib.pyplot as plt @@ -13,6 +12,7 @@ logging.getLogger("gensim").setLevel(logging.WARNING) + def create_dictionary(data): """ Create a Dictionary encapsulates the mapping between normalized words and their integer ids. @@ -66,6 +66,8 @@ def compute_coherence_values(dictionary, bow_corpus, texts, limit=25, start=2, s """ Compute c_v coherence for various number of topics + /!\ It takes a really long time. + Parameters: ---------- dictionary : Gensim dictionary @@ -202,11 +204,31 @@ def fit_data(model, bow): # Visualization (only for gensim implementation for now) -def visualize_topics(model, bow_corpus, dictionary): +def visualize_topics(model, bow_corpus, dictionary, model_type=None): """ Visualize the topics-keywords with the pyLDAvis interactive chart. (Work well in notebook) + + Parameters + ---------- + model: LDA model: gensim or mallet + bow_corpus : iterable of list of tokens. + dictionary: corpora.Dictionary. Dictionary encapsulates the mapping between normalized words and their integer ids. + model : str. Precise the topic modeling model used, must be "gensim" or "mallet" + + Returns: + ---------- + 3D interactive chart + """ - return pyLDAvis.gensim.prepare(model, bow_corpus, dictionary) + if model_type == 'mallet': + model_vis = gensim.models.wrappers.ldamallet.malletmodel2ldamodel(model) + elif model_type == 'gensim': + model_vis = model + elif model_type is None: + raise ValueError('You forgot to precise your model type, it must be: gensim or mallet') + else: + raise ValueError('Please enter a valid model name: gensim or mallet') + return pyLDAvis.gensim.prepare(model_vis, bow_corpus, dictionary) def save_pyldavis(pyldavis, vis_path, vis_name): """ Save the pyldavis interactive chart @@ -227,6 +249,8 @@ def show_pyldavis(vis_path, vis_name): def show_dominant_topic(model, bow_corpus, topic_number=1, topn=5): """ Print the dominant topics in the document, its score and the topics' top keywords. + Quick way to interpret the topics + Parameters ---------- From 06fd8df844fbf589cebe2ba6a112a4472e4611c4 Mon Sep 17 00:00:00 2001 From: William Jaubert <jaubert.william@gmail.com> Date: Mon, 29 Apr 2019 15:05:47 +0200 Subject: [PATCH 093/496] pyldavis mallet --- nautilus_nlp/models/topic_modeling.py | 1 - 1 file changed, 1 deletion(-) diff --git a/nautilus_nlp/models/topic_modeling.py b/nautilus_nlp/models/topic_modeling.py index 5cb7fd2..6fcbda0 100644 --- a/nautilus_nlp/models/topic_modeling.py +++ b/nautilus_nlp/models/topic_modeling.py @@ -12,7 +12,6 @@ logging.getLogger("gensim").setLevel(logging.WARNING) - def create_dictionary(data): """ Create a Dictionary encapsulates the mapping between normalized words and their integer ids. From 9d85fe411905b0f00fc1afc57744857085035b5b Mon Sep 17 00:00:00 2001 From: Kais LARIBI <kaislaribi@FRART0033M.local> Date: Tue, 30 Apr 2019 15:52:17 +0200 Subject: [PATCH 094/496] add ngrams frequency count --- nautilus_nlp/utils/ngrams_analysis.py | 0 tests/test_ngrams_analysis.py | 0 2 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 nautilus_nlp/utils/ngrams_analysis.py create mode 100644 tests/test_ngrams_analysis.py diff --git a/nautilus_nlp/utils/ngrams_analysis.py b/nautilus_nlp/utils/ngrams_analysis.py new file mode 100644 index 0000000..e69de29 diff --git a/tests/test_ngrams_analysis.py b/tests/test_ngrams_analysis.py new file mode 100644 index 0000000..e69de29 From d917464655d6bd21b8b00280b92712ad7f5080d0 Mon Sep 17 00:00:00 2001 From: Kais LARIBI <kaislaribi@FRART0033M.local> Date: Tue, 30 Apr 2019 15:59:15 +0200 Subject: [PATCH 095/496] add ngrams frequency counts --- nautilus_nlp/utils/ngrams_analysis.py | 42 +++++++++++++++++++++++++++ 1 file changed, 42 insertions(+) diff --git a/nautilus_nlp/utils/ngrams_analysis.py b/nautilus_nlp/utils/ngrams_analysis.py index e69de29..9ffad2d 100644 --- a/nautilus_nlp/utils/ngrams_analysis.py +++ b/nautilus_nlp/utils/ngrams_analysis.py @@ -0,0 +1,42 @@ +# -*- coding: utf-8 -*- +""" +Functions to analyse words frequencies. Generates counts and bars plots with words and n-grams frequencies in text. +""" +import pandas as pd +from collections import Counter +from matplotlib import pyplot as plt + + +def _create_ngrams(token, n): + """ + :param token: list of strings + :param n: number of elements in the n-gram + :return: list of n-grams + """ + ngrams = zip(*[token[i:] for i in range(n)]) + return [" ".join(ngram) for ngram in ngrams] + + +def frequent_words(list_words, ngrams_number=1, number_top_words=10 ): + """ + :param list_words: list of strings + :param ngrams_number: output dataframe length + :param output_ngrams_number: output dataframe length + :return: dataframe with the entities and their frequencies in text + """ + + frequent = [] + if ngrams_number == 1: + pass + elif ngrams_number >= 2: + list_words = _create_ngrams(list_words, ngrams_number) + else: + raise ValueError("number of n-grams should be >= 1") + + x = Counter(list_words) + frequent = x.most_common(number_top_words) + return pd.DataFrame(frequent, columns=['Entity', 'Counts']) + + + + From bdf92a1ee4d4f4e0dfce48b267ae3a3cc131fc32 Mon Sep 17 00:00:00 2001 From: Kais LARIBI <kaislaribi@FRART0033M.local> Date: Tue, 30 Apr 2019 16:05:21 +0200 Subject: [PATCH 096/496] n-grams frequency --- nautilus_nlp/utils/ngrams_analysis.py | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/nautilus_nlp/utils/ngrams_analysis.py b/nautilus_nlp/utils/ngrams_analysis.py index 9ffad2d..0204fe5 100644 --- a/nautilus_nlp/utils/ngrams_analysis.py +++ b/nautilus_nlp/utils/ngrams_analysis.py @@ -1,14 +1,14 @@ # -*- coding: utf-8 -*- """ -Functions to analyse words frequencies. Generates counts and bars plots with words and n-grams frequencies in text. +Functions to calculate words or ngrams frequencies. """ import pandas as pd from collections import Counter -from matplotlib import pyplot as plt def _create_ngrams(token, n): """ + Create n-grams for list of tokens :param token: list of strings :param n: number of elements in the n-gram :return: list of n-grams @@ -19,10 +19,11 @@ def _create_ngrams(token, n): def frequent_words(list_words, ngrams_number=1, number_top_words=10 ): """ + Compute n-grams frequencies and return number_top_words top n-grams. :param list_words: list of strings :param ngrams_number: output dataframe length :param output_ngrams_number: output dataframe length - :return: dataframe with the entities and their frequencies in text + :return: dataframe with the entities and their frequencies. """ frequent = [] From 55dbf5b80832e359c216e4e6a95169458f6e64c2 Mon Sep 17 00:00:00 2001 From: Kais LARIBI <kaislaribi@FRART0033M.local> Date: Tue, 30 Apr 2019 16:06:58 +0200 Subject: [PATCH 097/496] n-grams frequency --- nautilus_nlp/utils/ngrams_analysis.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/nautilus_nlp/utils/ngrams_analysis.py b/nautilus_nlp/utils/ngrams_analysis.py index 0204fe5..030a7df 100644 --- a/nautilus_nlp/utils/ngrams_analysis.py +++ b/nautilus_nlp/utils/ngrams_analysis.py @@ -17,12 +17,12 @@ def _create_ngrams(token, n): return [" ".join(ngram) for ngram in ngrams] -def frequent_words(list_words, ngrams_number=1, number_top_words=10 ): +def frequent_words(list_words, ngrams_number=1, number_top_words=10): """ Compute n-grams frequencies and return number_top_words top n-grams. :param list_words: list of strings :param ngrams_number: output dataframe length - :param output_ngrams_number: output dataframe length + :param number_top_words: output dataframe length :return: dataframe with the entities and their frequencies. """ From e77c68757dac49648c0f6009982a2de38af0b4b2 Mon Sep 17 00:00:00 2001 From: Kais LARIBI <kaislaribi@FRART0033M.local> Date: Tue, 30 Apr 2019 17:20:34 +0200 Subject: [PATCH 098/496] add tests for ngrams_analysis --- tests/test_ngrams_analysis.py | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git a/tests/test_ngrams_analysis.py b/tests/test_ngrams_analysis.py index e69de29..99dbdaa 100644 --- a/tests/test_ngrams_analysis.py +++ b/tests/test_ngrams_analysis.py @@ -0,0 +1,22 @@ +import pandas as pd +import pytest +from nautilus_nlp.utils.ngrams_analysis import frequent_words + + +def test_frequent_words(): + list_words = ['Hello', 'world', 'this', 'is', 'an', 'example', 'of', 'ngrams', 'count', 'an', 'example', + 'to', 'test', 'this', 'is', 'an', 'example', 'function', 'hello', 'world'] + + df1 = frequent_words(list_words, 1, 5) + df2 = frequent_words(list_words, 2, 5) + df3 = frequent_words(list_words, 3, 3) + + res_df1 = pd.DataFrame({'Entity': ['an', 'example', 'world', 'this', 'is'], 'Counts': [3, 3, 2, 2, 2]}) + res_df2 = pd.DataFrame({'Entity': ['an example', 'this is', 'is an', 'Hello world', 'world this'], 'Counts': [3, 2, 2, 1, 1]}) + res_df3 = pd.DataFrame({'Entity': ['this is an', 'is an example', 'Hello world this'], 'Counts': [2, 2, 1]}) + + pd.testing.assert_frame_equal(df1, res_df1) + pd.testing.assert_frame_equal(df2, res_df2) + pd.testing.assert_frame_equal(df3, res_df3) + + From f693ad526e1753e644b7b40f426ee4b03a8b2fa4 Mon Sep 17 00:00:00 2001 From: Kais LARIBI <kaislaribi@FRART0033M.local> Date: Tue, 30 Apr 2019 17:39:44 +0200 Subject: [PATCH 099/496] fix ngrams test --- nautilus_nlp/utils/ngrams_analysis.py | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/nautilus_nlp/utils/ngrams_analysis.py b/nautilus_nlp/utils/ngrams_analysis.py index 030a7df..f198ea9 100644 --- a/nautilus_nlp/utils/ngrams_analysis.py +++ b/nautilus_nlp/utils/ngrams_analysis.py @@ -2,7 +2,7 @@ """ Functions to calculate words or ngrams frequencies. """ -import pandas as pd +from pandas import DataFrame from collections import Counter @@ -36,8 +36,4 @@ def frequent_words(list_words, ngrams_number=1, number_top_words=10): x = Counter(list_words) frequent = x.most_common(number_top_words) - return pd.DataFrame(frequent, columns=['Entity', 'Counts']) - - - - + return DataFrame(frequent, columns=['Entity', 'Counts']) From c60e922435244388f07f9cadbd5e21fa0dd5db38 Mon Sep 17 00:00:00 2001 From: Robin <rdoume@gmail.com> Date: Thu, 2 May 2019 11:26:10 +0200 Subject: [PATCH 100/496] Delete CDL2 as language detection as it's redundant with Fasttext and is a painpoint when installing --- nautilus_nlp/models/Language_detector.py | 36 ++++++------- nautilus_nlp/utils/preprocess.py | 68 +++++++++++++++--------- tests/test_preprocessor.py | 3 +- 3 files changed, 61 insertions(+), 46 deletions(-) diff --git a/nautilus_nlp/models/Language_detector.py b/nautilus_nlp/models/Language_detector.py index b168473..06a1a06 100644 --- a/nautilus_nlp/models/Language_detector.py +++ b/nautilus_nlp/models/Language_detector.py @@ -1,16 +1,21 @@ from nautilus_nlp.models.Fasttext_classifier import Fasttext_clf as langdetect -import cld2 +from nautilus_nlp.utils.preprocess import remove_EOL_characters import pkg_resources -lang_path = pkg_resources.resource_filename('nautilus_nlp.data', 'lang_identification.ftz') -class LangDetector(): + +lang_path = pkg_resources.resource_filename( + "nautilus_nlp.data", "lang_identification.ftz" +) + + +class LangDetector: """ This class is to instantiante a language detector. """ - def __init__(self,typemodel,path=lang_path,): - self.typemodel=typemodel - self.path = None if path is None else lang_path - self.model=langdetect(self.path) if typemodel=='fasttext' else None - + + def __init__(self, path=None): + self.path = path if path is not None else lang_path + self.model = langdetect(self.path) + def detect_language(self, text_to_detect=None): """ Detected the language of a text @@ -22,16 +27,5 @@ def detect_language(self, text_to_detect=None): is_reliable: is the top language is much better than 2nd best language? language: 2-letter code for the language of the text """ - if self.typemodel!='fasttext': - _, _, best_guesses = cld2.detect(text_to_detect, - bestEffort=True) - - if len(best_guesses) == 0 or len(best_guesses[0]) != 4 or best_guesses[0][1] == 'un': - return 'un',0 - - return best_guesses[0][1],(best_guesses[0][2]/100) - else: - best_guesses=self.model.predict(text_to_detect) - return best_guesses[0][0].replace('__label__',''),best_guesses[1][0] - - + best_guesses = self.model.predict(remove_EOL_characters(text_to_detect)) + return best_guesses[0][0].replace("__label__", ""), best_guesses[1][0] diff --git a/nautilus_nlp/utils/preprocess.py b/nautilus_nlp/utils/preprocess.py index 48118cc..70d8148 100644 --- a/nautilus_nlp/utils/preprocess.py +++ b/nautilus_nlp/utils/preprocess.py @@ -20,7 +20,7 @@ from nautilus_nlp.config.config import ROOT_FOLDER from nautilus_nlp.utils.file_loader import documents_loader -STOPWORDS_JSON_FILEPATH = os.path.join(ROOT_FOLDER,'data','stopwords.json') +STOPWORDS_JSON_FILEPATH = os.path.join(ROOT_FOLDER, "data", "stopwords.json") def remove_multiple_spaces_and_strip_text(text): @@ -28,23 +28,35 @@ def remove_multiple_spaces_and_strip_text(text): Parameters ---------- text : str, - Header content. Returns ------- str """ - regex_remove_multiple_spaces_list= ["\\t", "[\\s\\-\\*]{2,}"] + regex_remove_multiple_spaces_list = ["\\t", "[\\s\\-\\*]{2,}"] for regex_remove_multiple_spaces in regex_remove_multiple_spaces_list: - text = re.sub(regex_remove_multiple_spaces, ' ', text) + text = re.sub(regex_remove_multiple_spaces, " ", text) text = text.strip() return text + +def remove_EOL_characters(text): + """Remove end of line (\n) char. + Parameters + ---------- + text : str, + Returns + ------- + str + """ + return text.replace("\n", "") + + def remove_tokens_with_nonletters(tokens): - ''' + """ Inputs a list of tokens, outputs a list of tokens without tokens that includes numbers of special caracters - ''' - return [word for word in tokens if re.search('[a-zA-Z]', word)] + """ + return [word for word in tokens if re.search("[a-zA-Z]", word)] def remove_special_caracters(tokens): @@ -52,7 +64,7 @@ def remove_special_caracters(tokens): Strings that are just punctuation will be removed! No more custom '--'. But ''s' and '9' will remain. """ - return [word for word in tokens if re.search('[a-zA-Z0-9]', word)] + return [word for word in tokens if re.search("[a-zA-Z0-9]", word)] def _load_stopwords_from_json(filepath=STOPWORDS_JSON_FILEPATH): @@ -61,8 +73,8 @@ def _load_stopwords_from_json(filepath=STOPWORDS_JSON_FILEPATH): return stopwords -def get_stopwords(lang:str = 'en'): - ''' +def get_stopwords(lang: str = "en"): + """ Inputs a language code, returns a list of stopwords for the specified language Args: @@ -73,38 +85,44 @@ def get_stopwords(lang:str = 'en'): 'no', 'pl', 'pt', 'ru', 'sv', 'tr', 'zh', 'eo', 'he', 'la', 'sk', 'sl', 'br', 'ca', 'cs', 'el', 'eu', 'ga', 'gl', 'hy', 'id', 'ja', 'lv', 'th', 'ar', 'bg', 'bn', 'fa', 'hi', 'mr', 'ro', 'en'] - ''' + """ if type(lang) == str and len(lang) == 2: lang = lang.lower() - + custom_stopwords = _load_stopwords_from_json(STOPWORDS_JSON_FILEPATH) stopwords = [] - + supported_lang_lib = list(_LANGUAGE_MAPPING.keys()) supported_lang_custom = list(custom_stopwords.keys()) - supported_lang = supported_lang_lib+supported_lang_custom + supported_lang = supported_lang_lib + supported_lang_custom if lang in supported_lang: if lang in supported_lang_lib: stopwords += _get_stop_words(lang) if lang in supported_lang_custom: stopwords += custom_stopwords[lang] else: - raise ValueError('Language not available yet or incorrect country code. Supported languages: {}'.format(supported_lang)) + raise ValueError( + "Language not available yet or incorrect country code. Supported languages: {}".format( + supported_lang + ) + ) else: - raise ValueError('Please input a valid country code, in 2 letters. Eg. "us" for USA. ') + raise ValueError( + 'Please input a valid country code, in 2 letters. Eg. "us" for USA. ' + ) return list(set(stopwords)) def remove_stopwords(text_or_tokens, stopwords): - ''' + """ Remove stopwords from tokens. - ''' + """ if type(text_or_tokens) is str: return [word for word in text_or_tokens.split() if word not in stopwords] elif type(text_or_tokens) is list: - return [word for word in text_or_tokens if word not in stopwords] + return [word for word in text_or_tokens if word not in stopwords] else: - raise ValueError('must input string or list of tokens') + raise ValueError("must input string or list of tokens") def fix_bad_unicode(text, normalization="NFC") -> str: @@ -288,6 +306,7 @@ def remove_accents(text, method="unicode") -> str: msg = '`method` must be either "unicode" and "ascii", not {}'.format(method) raise ValueError(msg) + def remove_emoji(word): """ Remove emoji from any str by stripping any unicode in the range of Emoji unicode, @@ -299,10 +318,11 @@ def remove_emoji(word): str """ - RE_EMOJI = re.compile('[\U00010000-\U0010ffff]', flags=re.UNICODE) - word = RE_EMOJI.sub(r'', word) + RE_EMOJI = re.compile("[\U00010000-\U0010ffff]", flags=re.UNICODE) + word = RE_EMOJI.sub(r"", word) return word + def preprocess_text( text, no_emoji=False, @@ -349,8 +369,8 @@ def preprocess_text( on the text, so choose carefully, and preprocess at your own risk! """ - assert isinstance(text,str) , 'The text to preprocess must be a string' - + assert isinstance(text, str), "The text to preprocess must be a string" + if fix_unicode is True: text = fix_bad_unicode(text, normalization="NFC") if no_urls is True: diff --git a/tests/test_preprocessor.py b/tests/test_preprocessor.py index e735dc4..c1c797a 100644 --- a/tests/test_preprocessor.py +++ b/tests/test_preprocessor.py @@ -54,4 +54,5 @@ def test_remove_accents(): ) def test_fix_bad_unicode(input_str, expected_str): result = fix_bad_unicode(input_str) - np.testing.assert_string_equal(result, expected_str) \ No newline at end of file + np.testing.assert_string_equal(result, expected_str) + From 203ac411eeabfe729ee8c2fbfe3454c1a18378b4 Mon Sep 17 00:00:00 2001 From: Robin <rdoume@gmail.com> Date: Thu, 2 May 2019 11:26:53 +0200 Subject: [PATCH 101/496] Add tests for language detection --- tests/test_language_detection.py | 31 +++++++++++++++++++++++++++++++ 1 file changed, 31 insertions(+) create mode 100644 tests/test_language_detection.py diff --git a/tests/test_language_detection.py b/tests/test_language_detection.py new file mode 100644 index 0000000..1796359 --- /dev/null +++ b/tests/test_language_detection.py @@ -0,0 +1,31 @@ +from nautilus_nlp.models import Language_detector +import pytest +import numpy as np + +model = Language_detector.LangDetector() + +TEXT_1 = """Кипрская война (итал. Guerra di Cipro; тур. Kıbrıs Savaşı) — одна из нескольких войн между Османской империей и Венецианской республикой за господство в Восточном Средиземноморье. Сначала Венеция воевала с османами одна. Затем, когда сформировалась Священная лига (в которую помимо Венеции входили Испания с Неаполем и Сицилией, Республика Генуя, Герцогство Савойское, госпитальеры, Великое герцогство Тосканское и другие итальянские государства), Османская империя воевала уже против Лиги.""" +TEXT_2 = """ +Wiborada († 1. Mai 926 in St. Gallen) war eine Einsiedlerin, geweihte Jungfrau und Märtyrin der katholischen Kirche. Sie lebte als Inklusin in St. Gallen und wurde während eines Ungarneinfalls getötet. Ihre letzte Ruhestätte, deren genaue Lage bei der Kirche St. Mangen heute nicht mehr bekannt ist, war über Jahrhunderte hinweg Ziel vieler Wallfahrer. Sie wurde im Jahr 1047 von Papst Clemens II. heiliggesprochen und gilt als Schutzpatronin der Pfarrhaushälterinnen, Köchinnen, Bibliotheken und Bücherfreunde. In der Ikonografie wird Wiborada im Habit dargestellt; als ikonografische Heiligenattribute sind ihr eine Hellebarde als Verweis auf das Martyrium und ein Buch beigegeben.""" +TEXT_3 = """De geschiedenis van het werelddeel Europa valt ruwweg chronologisch in te delen in de prehistorie, de klassieke oudheid, de middeleeuwen, de nieuwe tijd, de moderne tijd en de eigentijdse tijd.""" +TEXT_4 = """ +The absolute difference between At and Ft is divided by half the sum of absolute values of the actual value At and the forecast value Ft. The value of this calculation is summed for every fitted point t and divided again by the number of fitted points n. +""" +TEXT_5 = """Joseph Athanase Doumerc dit Paul Doumer est un homme d'État français né le 22 mars 1857 à Aurillac (Cantal) et mort assassiné le 7 mai 1932 à Paris. Il a été président de la République du 13 juin 1931 à sa mort.""" +TEXT_6 = """1997年加延地震是于5月10日协调世界时7時57分发生在伊朗北部呼罗珊的一起重大地震,是该地区自1990年以来最大的一次地震,矩震级为7.3,中心位于马什哈德以南约270公里的一个名叫阿德库尔的乡村。这也是该国1997年所发生的第三场地震,造成严重的灾情,比尔詹德-加延地区变得满目疮痍,有1,567人丧生,超过2,300人受伤,5万人无家可归,超过15,000幢房屋遭到破坏或损毁,美国地质调查局形容这是1997年最致命的一场地震。其后还发生了约155次余震造成进一步的破坏并迫使幸存者离开。最终估计此次灾害的损失约为1亿美元。围绕地震震中的地区几乎全部被毁,这与乡村地区建筑质量不佳有很大关系,联合国建议调整相应建筑法规。按死亡人数计算,自进入20世纪以来,伊朗平均每3,000人就有1人在地震相关事件中遇难,一位美国地球物理学家建议为了解决持续的公共安全隐患,需要有一个全国范围的重建方案。""" + + +@pytest.mark.parametrize( + "text, lang", + [ + (TEXT_1, "ru"), + (TEXT_2, "de"), + (TEXT_3, "nl"), + (TEXT_4, "en"), + (TEXT_5, "fr"), + (TEXT_6, "zh"), + ], +) +def test_detect_language(text, lang): + result = model.detect_language(text)[0] + np.testing.assert_string_equal(result, lang) From 6cfd3c71f0dcfc75b338b340a116d4df79f35b83 Mon Sep 17 00:00:00 2001 From: Robin <rdoume@gmail.com> Date: Thu, 2 May 2019 11:30:12 +0200 Subject: [PATCH 102/496] delete cld2 from requirements --- requirements.txt | 1 - 1 file changed, 1 deletion(-) diff --git a/requirements.txt b/requirements.txt index 2a03758..5870746 100644 --- a/requirements.txt +++ b/requirements.txt @@ -26,7 +26,6 @@ stop_words==2018.7.23 nltk==3.4 textblob==0.15.3 textblob_fr==0.2.0 -cld2_cffi==0.1.4 pandas>=0.23.4 chardet==3.0.4 setuptools==40.8.0 From 6da27067754519032cec7603296ac90fca6fc969 Mon Sep 17 00:00:00 2001 From: Robin <rdoume@gmail.com> Date: Thu, 2 May 2019 11:38:50 +0200 Subject: [PATCH 103/496] test changes in doc --- tests/test_doc.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/test_doc.py b/tests/test_doc.py index 9d7787f..5326226 100644 --- a/tests/test_doc.py +++ b/tests/test_doc.py @@ -41,7 +41,7 @@ ents_model = spacy.blank("nl") custom_spacy_nlps = {"nl": {"ents": ents_model}} -detector = LangDetector(typemodel="fasttext") +detector = LangDetector() DOC_1 = Doc(TEXT_1, language="en") DOC_2 = Doc(TEXT_2, language="fr") From 2c677bad6f33a5ccce737e02f69d16c72e2c7d8f Mon Sep 17 00:00:00 2001 From: Robin <rdoume@gmail.com> Date: Thu, 2 May 2019 12:09:52 +0200 Subject: [PATCH 104/496] This commit add docstring in emoji2sentiment --- nautilus_nlp/utils/emoji.py | 18 +++++++++++++----- 1 file changed, 13 insertions(+), 5 deletions(-) diff --git a/nautilus_nlp/utils/emoji.py b/nautilus_nlp/utils/emoji.py index d4d58d6..85177af 100644 --- a/nautilus_nlp/utils/emoji.py +++ b/nautilus_nlp/utils/emoji.py @@ -1,12 +1,20 @@ -""" -This dataset is based on: +import csv + +def rebuilt_emoji_dictionaries(filename): + """ + This function recreate the dictionnaries with emoji2unicode_name, emoji2sentiment that are hardcoded below. + + :input: csv filename + :return: dict,dict + + This dataset is based on and can be found: Kralj Novak, Petra; Smailović, Jasmina; Sluban, Borut and Mozetič, Igor, 2015, Emoji Sentiment Ranking 1.0, Slovenian language resource repository CLARIN.SI, http://hdl.handle.net/11356/1048. -""" -def rebuilt_emoji_dictionaries(filename): - emoji2unicode_name, emoji2sentiment = {}, {} + """ + + emoji2unicode_name, emoji2sentiment = dict(),dict() with open(filename) as csvin: for emoji in csv.DictReader(csvin): for key, value in emoji.items(): From e4b217cf584361c26228b5858178652594f8d2eb Mon Sep 17 00:00:00 2001 From: Kais LARIBI <kaislaribi@FRART0033M.local> Date: Thu, 2 May 2019 13:59:13 +0200 Subject: [PATCH 105/496] change output format of ngrams counts and check tests --- nautilus_nlp/utils/ngrams_analysis.py | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/nautilus_nlp/utils/ngrams_analysis.py b/nautilus_nlp/utils/ngrams_analysis.py index f198ea9..a2b0283 100644 --- a/nautilus_nlp/utils/ngrams_analysis.py +++ b/nautilus_nlp/utils/ngrams_analysis.py @@ -6,7 +6,7 @@ from collections import Counter -def _create_ngrams(token, n): +def create_ngrams(token, n): """ Create n-grams for list of tokens :param token: list of strings @@ -25,15 +25,13 @@ def frequent_words(list_words, ngrams_number=1, number_top_words=10): :param number_top_words: output dataframe length :return: dataframe with the entities and their frequencies. """ - frequent = [] if ngrams_number == 1: pass elif ngrams_number >= 2: - list_words = _create_ngrams(list_words, ngrams_number) + list_words = create_ngrams(list_words, ngrams_number) else: raise ValueError("number of n-grams should be >= 1") - x = Counter(list_words) frequent = x.most_common(number_top_words) - return DataFrame(frequent, columns=['Entity', 'Counts']) + return frequent From e08399b7b6767dfc6b98b8229fefd9ed9d2e8e68 Mon Sep 17 00:00:00 2001 From: Kais LARIBI <kaislaribi@FRART0033M.local> Date: Thu, 2 May 2019 14:01:08 +0200 Subject: [PATCH 106/496] fix tests for ngrams frequencies counts --- nautilus_nlp/utils/ngrams_analysis.py | 1 - tests/test_ngrams_analysis.py | 25 ++++++++++++------------- 2 files changed, 12 insertions(+), 14 deletions(-) diff --git a/nautilus_nlp/utils/ngrams_analysis.py b/nautilus_nlp/utils/ngrams_analysis.py index a2b0283..5e61009 100644 --- a/nautilus_nlp/utils/ngrams_analysis.py +++ b/nautilus_nlp/utils/ngrams_analysis.py @@ -2,7 +2,6 @@ """ Functions to calculate words or ngrams frequencies. """ -from pandas import DataFrame from collections import Counter diff --git a/tests/test_ngrams_analysis.py b/tests/test_ngrams_analysis.py index 99dbdaa..92a840d 100644 --- a/tests/test_ngrams_analysis.py +++ b/tests/test_ngrams_analysis.py @@ -1,22 +1,21 @@ -import pandas as pd -import pytest from nautilus_nlp.utils.ngrams_analysis import frequent_words +import pytest def test_frequent_words(): list_words = ['Hello', 'world', 'this', 'is', 'an', 'example', 'of', 'ngrams', 'count', 'an', 'example', 'to', 'test', 'this', 'is', 'an', 'example', 'function', 'hello', 'world'] - df1 = frequent_words(list_words, 1, 5) - df2 = frequent_words(list_words, 2, 5) - df3 = frequent_words(list_words, 3, 3) - - res_df1 = pd.DataFrame({'Entity': ['an', 'example', 'world', 'this', 'is'], 'Counts': [3, 3, 2, 2, 2]}) - res_df2 = pd.DataFrame({'Entity': ['an example', 'this is', 'is an', 'Hello world', 'world this'], 'Counts': [3, 2, 2, 1, 1]}) - res_df3 = pd.DataFrame({'Entity': ['this is an', 'is an example', 'Hello world this'], 'Counts': [2, 2, 1]}) - - pd.testing.assert_frame_equal(df1, res_df1) - pd.testing.assert_frame_equal(df2, res_df2) - pd.testing.assert_frame_equal(df3, res_df3) + res_1 = frequent_words(list_words, ngrams_number=1, number_top_words=10) + res_2 = frequent_words(list_words, ngrams_number=2, number_top_words=3) + res_3 = frequent_words(list_words, ngrams_number=3, number_top_words=5) + exp_res_1 = [('an', 3), ('example', 3), ('world', 2), ('this', 2), ('is', 2), ('Hello', 1), ('of', 1), ('ngrams', 1), + ('count', 1), ('to', 1)] + exp_res_2 = [('an example', 3), ('this is', 2), ('is an', 2)] + exp_res_3 = [('this is an', 2), ('is an example', 2), ('Hello world this', 1), + ('world this is', 1), ('an example of', 1)] + assert res_1 == exp_res_1 + assert res_2 == exp_res_2 + assert res_3 == exp_res_3 From ff5c5098c57faf03273bb9e1cd31cf4d8f4af1e8 Mon Sep 17 00:00:00 2001 From: Kais LARIBI <kaislaribi@FRART0033M.local> Date: Thu, 2 May 2019 14:03:03 +0200 Subject: [PATCH 107/496] fix tests for ngrams frequencies counts --- tests/test_ngrams_analysis.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/test_ngrams_analysis.py b/tests/test_ngrams_analysis.py index 92a840d..5e42781 100644 --- a/tests/test_ngrams_analysis.py +++ b/tests/test_ngrams_analysis.py @@ -10,8 +10,8 @@ def test_frequent_words(): res_2 = frequent_words(list_words, ngrams_number=2, number_top_words=3) res_3 = frequent_words(list_words, ngrams_number=3, number_top_words=5) - exp_res_1 = [('an', 3), ('example', 3), ('world', 2), ('this', 2), ('is', 2), ('Hello', 1), ('of', 1), ('ngrams', 1), - ('count', 1), ('to', 1)] + exp_res_1 = [('an', 3), ('example', 3), ('world', 2), ('this', 2), ('is', 2), + ('Hello', 1), ('of', 1), ('ngrams', 1), ('count', 1), ('to', 1)] exp_res_2 = [('an example', 3), ('this is', 2), ('is an', 2)] exp_res_3 = [('this is an', 2), ('is an example', 2), ('Hello world this', 1), ('world this is', 1), ('an example of', 1)] From 024bf477bb2b4a55337138f5d6f6e504e3096c95 Mon Sep 17 00:00:00 2001 From: Robin <rdoume@gmail.com> Date: Fri, 3 May 2019 11:18:38 +0200 Subject: [PATCH 108/496] Add Travis building logo in the readme --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index c969983..b182afd 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -Nautilus_NLP +Nautilus_NLP [![Build Status](https://travis-ci.com/artefactory/nautilus-nlp.svg?token=Ssg4shz5pz9qGnYCybSj&branch=master)](https://travis-ci.com/artefactory/nautilus-nlp) ============================== The Nautilus NLP library aimed to be a meta-library to be used to help you get started on handling your NLP use-case. From a06b7ec9cea6931259ffe5c235dbeb264d422a6b Mon Sep 17 00:00:00 2001 From: Robin <rdoume@gmail.com> Date: Fri, 3 May 2019 11:22:18 +0200 Subject: [PATCH 109/496] Add visualize in utils --- nautilus_nlp/utils/visualize.py | 54 +++++++++++++++++++++++++++++++++ 1 file changed, 54 insertions(+) create mode 100644 nautilus_nlp/utils/visualize.py diff --git a/nautilus_nlp/utils/visualize.py b/nautilus_nlp/utils/visualize.py new file mode 100644 index 0000000..bb9cfb1 --- /dev/null +++ b/nautilus_nlp/utils/visualize.py @@ -0,0 +1,54 @@ +''' +import matplotlib +import numpy as np + +''' +import matplotlib.pyplot as plt +import wordcloud +plt.rcParams["figure.figsize"] = [16,9] + + +def make_word_cloud(text_or_counter, stop_words=[]): + + if type(text_or_counter) is str: + myWordcloud = wordcloud.WordCloud(stopwords=stop_words).generate(text_or_counter) + else: + for w in stop_words: + del text_or_counter[w] + myWordcloud = wordcloud.WordCloud(stopwords=stop_words).generate_from_frequencies(text_or_counter) + plt.imshow(myWordcloud) + plt.axis("off") + plt.show() + + +def print_concordance(tokens, query_word, width=110, n_results=None): + ''' + Inputs a list of token and a query word, outputs all the sentences that + contains the query word, display in a nice way. + width = Integer. Number of caracters to display per text chunk + n_results = Integer. If not null, filters the number of results displayed. + This function is an adaptation of NLTK's print_concordance function. + Source: http://www.nltk.org/_modules/nltk/text.html + ''' + half_width = (width - len(query_word) - 2) // 2 + context = width // 4 # approx number of words of context + + results = [i for i, j in enumerate(tokens) if j == query_word] + if len(results) > 0: + if n_results == None: + n_results = len(results) + print('{} matches for "{}":'.format(len(results),query_word)) + for i in results[:n_results]: + + # Find the context of query word. + left_context = tokens[max(0, i - context) : i] + right_context = tokens[i + 1 : i + context] + # Create the pretty lines with the query_word in the middle. + left_print = ' '.join(left_context)[-half_width:] + right_print = ' '.join(right_context)[:half_width] + # The WYSIWYG line of the concordance. + line_print = ' '.join([left_print, query_word, right_print]) + before = tokens[:] + print(line_print) + else: + print('No match for "{}"'.format(query_word)) \ No newline at end of file From 22fe702d4a80fc5a294dae777bb21edbbe1a53bf Mon Sep 17 00:00:00 2001 From: hugovasselin <waaaouu@gmail.com> Date: Fri, 3 May 2019 11:51:15 +0200 Subject: [PATCH 110/496] add contributing --- CONTRIBUTING.md | 34 ++++++++++++++++++++++++++++++++++ 1 file changed, 34 insertions(+) create mode 100644 CONTRIBUTING.md diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md new file mode 100644 index 0000000..d59a290 --- /dev/null +++ b/CONTRIBUTING.md @@ -0,0 +1,34 @@ +Nautilus_NLP +============================== + +# Docstring format + +We chose to use **Numpydoc** over the several [standards](https://stackoverflow.com/questions/3898572/what-is-the-standard-python-docstring-format) + +``` +""" +My numpydoc description of a kind +of very exhautive numpydoc format docstring. + +Parameters +---------- +first : array_like + the 1st param name `first` +second : + the 2nd param +third : {'value', 'other'}, optional + the 3rd param, by default 'value' + +Returns +------- +string + a value in a string + +Raises +------ +KeyError + when a key error +OtherError + when an other error +""" +``` From 4da3debf403f72cccf49a71a6024c5b72ca9aa68 Mon Sep 17 00:00:00 2001 From: Robin <rdoume@gmail.com> Date: Fri, 3 May 2019 11:52:23 +0200 Subject: [PATCH 111/496] structural change --- nautilus_nlp/utils/text_vectorizers.py | 195 +++++++++++++++++++++++++ 1 file changed, 195 insertions(+) create mode 100644 nautilus_nlp/utils/text_vectorizers.py diff --git a/nautilus_nlp/utils/text_vectorizers.py b/nautilus_nlp/utils/text_vectorizers.py new file mode 100644 index 0000000..a03c5bb --- /dev/null +++ b/nautilus_nlp/utils/text_vectorizers.py @@ -0,0 +1,195 @@ +import spacy +from gensim.corpora import Dictionary +from gensim.models.tfidfmodel import TfidfModel +from gensim import corpora, models, similarities +from gensim.matutils import sparse2full +import numpy as np +import math + +from sklearn.feature_extraction.text import TfidfVectorizer, TfidfTransformer + + +class Tfidf(object): + """ + Inputs a list of string + Outputs a tuple with the wordcount vector matrix, and the list of feature name + Params: + input=’content’, encoding=’utf-8’, decode_error=’strict’, strip_accents=None, + lowercase=True, preprocessor=None, tokenizer=None, analyzer=’word’, + stop_words=None, token_pattern=’(?u)\b\w\w+\b’, ngram_range=(1, 1), + max_df=1.0, min_df=1, max_features=None, vocabulary=None, binary=False, + dtype=<class ‘numpy.float64’>, norm=’l2’, use_idf=True, smooth_idf=True, sublinear_tf=False + + Wrapper of https://scikit-learn.org/stable/modules/generated/sklearn.feature_extraction.text.TfidfVectorizer.html + """ + + def __init__(self, **kwargs): + self.tfidf_vectorizer = TfidfVectorizer(**kwargs) + + def _compute_wordcount_vector(self, documents): + ''' + Input a list of documents (string) + Output the wordcount vector matrix + ''' + self.word_count_vector = self.tfidf_vectorizer.fit_transform(documents) + return self.word_count_vector + + + def _get_features_name(self): + self.feature_names = self.tfidf_vectorizer.get_feature_names() + return self.feature_names + + + def _compute_idf(self): + self.tfidf_transformer=TfidfTransformer(smooth_idf=True, use_idf=True) + self.tfidf_transformer.fit(self.word_count_vector) + return self.word_count_vector + + + def compute_tfidf(self, documents): + self._compute_wordcount_vector(documents) + self._get_features_name() + self._compute_idf() + return self.word_count_vector + + def _apply_tfidf_to_doc(self, text): + '''generate tf-idf for the given document''' + return self.tfidf_transformer.transform(self.tfidf_vectorizer.transform([text])) + + + def _sort_coo(self, coo_matrix): + '''sort the tf-idf vectors by descending order of scores''' + tuples = zip(coo_matrix.col, coo_matrix.data) + return sorted(tuples, key=lambda x: (x[1], x[0]), reverse=True) + + + def _extract_topn_from_vector(self, feature_names, sorted_items, topn=10): + """get the feature names and tf-idf score of top n items""" + + #use only topn items from vector + sorted_items = sorted_items[:topn] + + score_vals = [] + feature_vals = [] + + # word index and corresponding tf-idf score + for idx, score in sorted_items: + + #keep track of feature name and its corresponding score + score_vals.append(round(score, 3)) + feature_vals.append(feature_names[idx]) + + #create a tuples of feature,score + #results = zip(feature_vals,score_vals) + results= {} + for idx in range(len(feature_vals)): + results[feature_vals[idx]]=score_vals[idx] + + return results + + + def get_top_tfidf_per_doc(self, text, n=10): + '''compute TF-IDF for a given doc, and returns a list of the top N weighted words''' + tf_idf_vector= self._apply_tfidf_to_doc(text) + sorted_items=self._sort_coo(tf_idf_vector.tocoo()) + return list(self._extract_topn_from_vector(self.feature_names, sorted_items, n).keys()) + + def get_top_tfidf(self, n=10): + '''returns a dict of the top N weighted words, with their weight''' + return self._extract_topn_from_vector(self.feature_names, self._sort_coo(self.word_count_vector.tocoo()), topn=n) + + +class Text_Vectorizer: + def __init__(self, doc_list): + # Initialize + self.doc_list = doc_list + self.nlp, self.docs, self.docs_dict = self._preprocess(self.doc_list) + + # Functions to lemmatise docs + def _keep_token(self, t): + return t.is_alpha and not (t.is_space or t.is_punct or t.is_stop or t.like_num) + + def _lemmatize_doc(self, doc): + return [t.lemma_ for t in doc if self._keep_token(t)] + + # Gensim to create a dictionary and filter out stop and infrequent words (lemmas). + def _get_docs_dict(self, docs): + docs_dict = Dictionary(docs) + # CAREFUL: For small corpus please carefully modify the parameters for filter_extremes, or simply comment it out. + docs_dict.filter_extremes(no_below=5, no_above=0.2) + docs_dict.compactify() + return docs_dict + + # Preprocess docs + def _preprocess(self, doc_list): + # Load spacy model + nlp = spacy.load("en") + # lemmatise docs + docs = [self._lemmatize_doc(nlp(doc)) for doc in doc_list] + # Get docs dictionary + docs_dict = self._get_docs_dict(docs) + return nlp, docs, docs_dict + + # Gensim can again be used to create a bag-of-words representation of each document, + # build the TF-IDF model, + # and compute the TF-IDF vector for each document. + def _get_tfidf(self, docs, docs_dict): + docs_corpus = [docs_dict.doc2bow(doc) for doc in docs] + model_tfidf = TfidfModel(docs_corpus, id2word=docs_dict) + docs_tfidf = model_tfidf[docs_corpus] + docs_vecs = np.vstack([sparse2full(c, len(docs_dict)) for c in docs_tfidf]) + return docs_vecs + + # Get avg w2v for one document + def _document_vector(self, doc, docs_dict, nlp): + # remove out-of-vocabulary words + doc_vector = [nlp(word).vector for word in doc if word in docs_dict.token2id] + return np.mean(doc_vector, axis=0) + + + # Get average vector for document list + def avg_wv(self): + docs_vecs = np.vstack( + [self._document_vector(doc, self.docs_dict, self.nlp) for doc in self.docs] + ) + return docs_vecs + + # Get TF-IDF vector for document list + def get_tfidf(self): + docs_corpus = [self.docs_dict.doc2bow(doc) for doc in self.docs] + model_tfidf = TfidfModel(docs_corpus, id2word=self.docs_dict) + docs_tfidf = model_tfidf[docs_corpus] + docs_vecs = np.vstack([sparse2full(c, len(self.docs_dict)) for c in docs_tfidf]) + return docs_vecs + + # Get Latent Semantic Indexing(LSI) vector for document list + def get_lsi(self, num_topics=300): + docs_corpus = [self.docs_dict.doc2bow(doc) for doc in self.docs] + model_lsi = models.LsiModel(docs_corpus, num_topics, id2word=self.docs_dict) + docs_lsi = model_lsi[docs_corpus] + docs_vecs = np.vstack([sparse2full(c, len(self.docs_dict)) for c in docs_lsi]) + return docs_vecs + + # Get Random Projections(RP) vector for document list + def get_rp(self): + docs_corpus = [self.docs_dict.doc2bow(doc) for doc in self.docs] + model_rp = models.RpModel(docs_corpus, id2word=self.docs_dict) + docs_rp = model_rp[docs_corpus] + docs_vecs = np.vstack([sparse2full(c, len(self.docs_dict)) for c in docs_rp]) + return docs_vecs + + # Get Latent Dirichlet Allocation(LDA) vector for document list + def get_lda(self, num_topics=100): + docs_corpus = [self.docs_dict.doc2bow(doc) for doc in self.docs] + model_lda = models.LdaModel(docs_corpus, num_topics, id2word=self.docs_dict) + docs_lda = model_lda[docs_corpus] + docs_vecs = np.vstack([sparse2full(c, len(self.docs_dict)) for c in docs_lda]) + return docs_vecs + + # Get Hierarchical Dirichlet Process(HDP) vector for document list + def get_hdp(self): + docs_corpus = [self.docs_dict.doc2bow(doc) for doc in self.docs] + model_hdp = models.HdpModel(docs_corpus, id2word=self.docs_dict) + docs_hdp = model_hdp[docs_corpus] + docs_vecs = np.vstack([sparse2full(c, len(self.docs_dict)) for c in docs_hdp]) + return docs_vecs From f0d72e3da981d25bb0e52228904898bec5382d27 Mon Sep 17 00:00:00 2001 From: Robin <rdoume@gmail.com> Date: Fri, 3 May 2019 11:55:52 +0200 Subject: [PATCH 112/496] delete files --- nautilus_nlp/features/.gitkeep | 0 nautilus_nlp/features/__init__.py | 0 nautilus_nlp/features/build_features.py | 0 nautilus_nlp/utils/Text_processor.py | 52 ------------------------ nautilus_nlp/visualization/.gitkeep | 0 nautilus_nlp/visualization/__init__.py | 0 nautilus_nlp/visualization/visualize.py | 54 ------------------------- 7 files changed, 106 deletions(-) delete mode 100644 nautilus_nlp/features/.gitkeep delete mode 100644 nautilus_nlp/features/__init__.py delete mode 100644 nautilus_nlp/features/build_features.py delete mode 100644 nautilus_nlp/utils/Text_processor.py delete mode 100644 nautilus_nlp/visualization/.gitkeep delete mode 100644 nautilus_nlp/visualization/__init__.py delete mode 100644 nautilus_nlp/visualization/visualize.py diff --git a/nautilus_nlp/features/.gitkeep b/nautilus_nlp/features/.gitkeep deleted file mode 100644 index e69de29..0000000 diff --git a/nautilus_nlp/features/__init__.py b/nautilus_nlp/features/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/nautilus_nlp/features/build_features.py b/nautilus_nlp/features/build_features.py deleted file mode 100644 index e69de29..0000000 diff --git a/nautilus_nlp/utils/Text_processor.py b/nautilus_nlp/utils/Text_processor.py deleted file mode 100644 index 312af0f..0000000 --- a/nautilus_nlp/utils/Text_processor.py +++ /dev/null @@ -1,52 +0,0 @@ -from .lemmatizer import Lemmatizer -from .stemmer import Stemmer -import spacy -import nltk -from .utils import * -from .tokenizer import tokenize - - -class TextProcessor: - def __init__(self, lang: str, module: str = "spacy"): - self.module = module - self.lemmatizer = None - self.stemmer = None - self.lang = lang - - def transform(self, text): - return text - - def lemmatize(self, text: str): - return text - - def stem(self, text: str): - return text - - def remove_stopwords(self, text: str): - return text - - def lower(self, text: str): - return text.lower() - - def tokenize(self, text: str, lang: str = 'en'): - return tokenize(text, lang=lang) - - -class TokensProcessor: - def __init__(self, lang: str): - self.module = module - self.lemmatizer = None - self.stemmer = None - self.lang = lang - - def lemmatize(self, text: str): - return text - - def stem(self, tokens_list: list, lang: str = lang): - return stem_tokens(tokens_list, lang='english') - - def remove_stopwords(self, text: str): - return text - - def untokenize(self, text: str, lang: str = 'en'): - return tokenize(text, lang=lang) diff --git a/nautilus_nlp/visualization/.gitkeep b/nautilus_nlp/visualization/.gitkeep deleted file mode 100644 index e69de29..0000000 diff --git a/nautilus_nlp/visualization/__init__.py b/nautilus_nlp/visualization/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/nautilus_nlp/visualization/visualize.py b/nautilus_nlp/visualization/visualize.py deleted file mode 100644 index bb9cfb1..0000000 --- a/nautilus_nlp/visualization/visualize.py +++ /dev/null @@ -1,54 +0,0 @@ -''' -import matplotlib -import numpy as np - -''' -import matplotlib.pyplot as plt -import wordcloud -plt.rcParams["figure.figsize"] = [16,9] - - -def make_word_cloud(text_or_counter, stop_words=[]): - - if type(text_or_counter) is str: - myWordcloud = wordcloud.WordCloud(stopwords=stop_words).generate(text_or_counter) - else: - for w in stop_words: - del text_or_counter[w] - myWordcloud = wordcloud.WordCloud(stopwords=stop_words).generate_from_frequencies(text_or_counter) - plt.imshow(myWordcloud) - plt.axis("off") - plt.show() - - -def print_concordance(tokens, query_word, width=110, n_results=None): - ''' - Inputs a list of token and a query word, outputs all the sentences that - contains the query word, display in a nice way. - width = Integer. Number of caracters to display per text chunk - n_results = Integer. If not null, filters the number of results displayed. - This function is an adaptation of NLTK's print_concordance function. - Source: http://www.nltk.org/_modules/nltk/text.html - ''' - half_width = (width - len(query_word) - 2) // 2 - context = width // 4 # approx number of words of context - - results = [i for i, j in enumerate(tokens) if j == query_word] - if len(results) > 0: - if n_results == None: - n_results = len(results) - print('{} matches for "{}":'.format(len(results),query_word)) - for i in results[:n_results]: - - # Find the context of query word. - left_context = tokens[max(0, i - context) : i] - right_context = tokens[i + 1 : i + context] - # Create the pretty lines with the query_word in the middle. - left_print = ' '.join(left_context)[-half_width:] - right_print = ' '.join(right_context)[:half_width] - # The WYSIWYG line of the concordance. - line_print = ' '.join([left_print, query_word, right_print]) - before = tokens[:] - print(line_print) - else: - print('No match for "{}"'.format(query_word)) \ No newline at end of file From c6d2355261e3a3b750c8fffd59675e7e0427d308 Mon Sep 17 00:00:00 2001 From: Robin <rdoume@gmail.com> Date: Fri, 3 May 2019 12:00:15 +0200 Subject: [PATCH 113/496] test encoding --- tests/test_fix_bad_encoding.py | 32 ++++++++++++++++++++++++++++++++ 1 file changed, 32 insertions(+) create mode 100644 tests/test_fix_bad_encoding.py diff --git a/tests/test_fix_bad_encoding.py b/tests/test_fix_bad_encoding.py new file mode 100644 index 0000000..cb3aa93 --- /dev/null +++ b/tests/test_fix_bad_encoding.py @@ -0,0 +1,32 @@ + +import pytest +import numpy as np +from nautilus_nlp.utils.preprocess import fix_bad_unicode + + + +@pytest.mark.parametrize( + "input_str, expected_str", + [ + ('Les augmentations de rémunérations', + 'Les augmentations de rémunérations'), + ("rénover l'enquête publique pour en faire un vrai outil d'aménagement du territoire et de dialogue social", + "rénover l'enquête publique pour en faire un vrai outil d'aménagement du territoire et de dialogue social"), + ('Limitations de vitesse et sécurité routière', + 'Limitations de vitesse et sécurité routière'), + ('Pour un nouveau contrat citoyen', 'Pour un nouveau contrat citoyen'), + ('Développer les démarches de budget participatif dans les collectivités et associer les citoyens dans la réalisation des projets', + 'Développer les démarches de budget participatif dans les collectivités et associer les citoyens dans la réalisation des projets'), + ('proportienelle', 'proportienelle'), + ('Pour plus de démocratie participative', + 'Pour plus de démocratie participative'), + ('Transparence de la vie public', 'Transparence de la vie public'), + ('18 mois de trop....ca suffit macron', + '18 mois de trop....ca suffit macron'), + ('Egalité devant les infractions routières', + 'Egalité devant les infractions routières') + ], +) +def test_remove_multiple_spaces_and_strip_text(input_str, expected_str): + result = fix_bad_unicode(input_str) + np.testing.assert_string_equal(result, expected_str) From e082c8167937a6fb2bc0b83b737c84a92a956f7b Mon Sep 17 00:00:00 2001 From: Robin <rdoume@gmail.com> Date: Fri, 3 May 2019 12:03:50 +0200 Subject: [PATCH 114/496] Change Travis to include build on OSX systems --- .travis.yml | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index 2d7b62b..b7dbf7d 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,5 +1,9 @@ language: python +os: + - linux + - osx + services: - docker @@ -8,7 +12,6 @@ before_script: - git clone https://github.com/facebookresearch/fastText.git && cd fastText && pip install . && cd .. && ls - python3 -m spacy download fr && python3 -m spacy download en && python3 -m spacy download de && python3 -m spacy download nl && python3 -m spacy download it && python3 -m spacy download xx && python3 -m spacy validate - install: - pip install -r requirements.txt - pip install -e . From c740427e941410c619597ee251c2c6cd6c21d067 Mon Sep 17 00:00:00 2001 From: Robin <rdoume@gmail.com> Date: Fri, 3 May 2019 12:04:34 +0200 Subject: [PATCH 115/496] change init --- nautilus_nlp/preprocess/__init__.py | 0 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 nautilus_nlp/preprocess/__init__.py diff --git a/nautilus_nlp/preprocess/__init__.py b/nautilus_nlp/preprocess/__init__.py new file mode 100644 index 0000000..e69de29 From 10ef880dd4e9582a7210ff4d04306016e54c590a Mon Sep 17 00:00:00 2001 From: hugovasselin <waaaouu@gmail.com> Date: Fri, 3 May 2019 12:18:01 +0200 Subject: [PATCH 116/496] update readme --- README.md | 35 ++++++++++++++++++++++++++++++----- 1 file changed, 30 insertions(+), 5 deletions(-) diff --git a/README.md b/README.md index b182afd..31c2ff0 100644 --- a/README.md +++ b/README.md @@ -32,15 +32,28 @@ To install this library you should first clone the repository: First you need to install the required files: -`pip install -r requirements.txt` +```pip install -r requirements.txt``` then you can install it via pip: -`pip install -e . +```pip install -e .``` ## Handling installation errors -### Conda conficts +### command 'gcc' failed with exit status 1 + +While runing `pip install -r requirements.txt` you might get the following error message: +``` +command 'gcc' failed with exit status 1 +``` + +To solve it, run the following command before installing requirements.txt: +``` +conda install pyemd +``` + +### Cannot uninstall 'package_name' + You might get the following error message while installing the library: `Cannot uninstall 'PACKAGE_NAME'. It is a distutils installed project and thus we cannot accurately determine which files belong to it which would lead to only a partial uninstall.` @@ -51,7 +64,14 @@ To fix this, just type `pip install -e . --ignore-installed PACKAGE_NAME` instea If you are installing nautilus on a linux-powered Virtual Machine (VM), you might want to install essentials first. If you don't, you might experience some issues to install Cython-based libraries, such as spaCy, becode the C compiler will be missing. On a Ubuntu VM (tested on 16.04), you can run the following command before following the classic installation process above: -`sudo apt-get update && sudo apt-get install -y build-essential unzip` + +``` +# install compilators and required softwares +sudo apt-get update && sudo apt-get install -y build-essential unzip git wget +# install conda +wget https://repo.anaconda.com/archive/Anaconda3-2019.03-Linux-x86_64.sh +bash Anaconda3-2019.03-Linux-x86_64.sh +``` ## Installation of additional required libraries @@ -77,10 +97,15 @@ run: `bash nautilus_nlp/scripts/download_ft_langdetect.sh` -# Notebooks +# Quick start The [notebook](notebooks/) folder contains various notebook on how to use this library. +Here is a quick example: + +``` + +``` Project Organization ------------ From a18610545afc199b021ef7cb5b0b8c47316ace97 Mon Sep 17 00:00:00 2001 From: hugovasselin <waaaouu@gmail.com> Date: Fri, 3 May 2019 12:22:10 +0200 Subject: [PATCH 117/496] add script --- nautilus_nlp/scripts/download_spacy_models.sh | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 nautilus_nlp/scripts/download_spacy_models.sh diff --git a/nautilus_nlp/scripts/download_spacy_models.sh b/nautilus_nlp/scripts/download_spacy_models.sh new file mode 100644 index 0000000..0a3a374 --- /dev/null +++ b/nautilus_nlp/scripts/download_spacy_models.sh @@ -0,0 +1,5 @@ +python -m spacy download en_core_web_sm +python -m spacy download de_core_news_sm +python -m spacy download fr_core_news_sm +python -m spacy download es_core_news_sm +python -m spacy download nl_core_news_sm From 30b17ec460ebc409309dba5955dfd026854ac9f2 Mon Sep 17 00:00:00 2001 From: Robin <rdoume@gmail.com> Date: Fri, 3 May 2019 12:23:12 +0200 Subject: [PATCH 118/496] Revert Travis for OSX --- .travis.yml | 2 -- 1 file changed, 2 deletions(-) diff --git a/.travis.yml b/.travis.yml index b7dbf7d..c89eab8 100644 --- a/.travis.yml +++ b/.travis.yml @@ -2,8 +2,6 @@ language: python os: - linux - - osx - services: - docker From 3d0183a136be3d0baf47581f5d5e37bb96e0f118 Mon Sep 17 00:00:00 2001 From: Robin <rdoume@gmail.com> Date: Fri, 3 May 2019 12:29:03 +0200 Subject: [PATCH 119/496] delete useless folders --- nautilus/bin/activate | 78 -------------------------- nautilus/bin/activate.csh | 42 -------------- nautilus/bin/activate.fish | 101 ---------------------------------- nautilus/bin/activate.ps1 | 60 -------------------- nautilus/bin/activate_this.py | 46 ---------------- nautilus/bin/easy_install | 10 ---- nautilus/bin/easy_install-2.7 | 10 ---- nautilus/bin/epylint | 10 ---- nautilus/bin/isort | 10 ---- nautilus/bin/pip | 10 ---- nautilus/bin/pip2 | 10 ---- nautilus/bin/pip2.7 | 10 ---- nautilus/bin/pylint | 10 ---- nautilus/bin/pyreverse | 10 ---- nautilus/bin/python | Bin 8464 -> 0 bytes nautilus/bin/python-config | 78 -------------------------- nautilus/bin/python2 | 1 - nautilus/bin/python2.7 | 1 - nautilus/bin/symilar | 10 ---- nautilus/bin/wheel | 10 ---- nautilus/include/python2.7 | 1 - src/french-lefff-lemmatizer | 1 - 22 files changed, 519 deletions(-) delete mode 100644 nautilus/bin/activate delete mode 100644 nautilus/bin/activate.csh delete mode 100644 nautilus/bin/activate.fish delete mode 100644 nautilus/bin/activate.ps1 delete mode 100644 nautilus/bin/activate_this.py delete mode 100755 nautilus/bin/easy_install delete mode 100755 nautilus/bin/easy_install-2.7 delete mode 100755 nautilus/bin/epylint delete mode 100755 nautilus/bin/isort delete mode 100755 nautilus/bin/pip delete mode 100755 nautilus/bin/pip2 delete mode 100755 nautilus/bin/pip2.7 delete mode 100755 nautilus/bin/pylint delete mode 100755 nautilus/bin/pyreverse delete mode 100755 nautilus/bin/python delete mode 100755 nautilus/bin/python-config delete mode 120000 nautilus/bin/python2 delete mode 120000 nautilus/bin/python2.7 delete mode 100755 nautilus/bin/symilar delete mode 100755 nautilus/bin/wheel delete mode 120000 nautilus/include/python2.7 delete mode 160000 src/french-lefff-lemmatizer diff --git a/nautilus/bin/activate b/nautilus/bin/activate deleted file mode 100644 index 70dac7d..0000000 --- a/nautilus/bin/activate +++ /dev/null @@ -1,78 +0,0 @@ -# This file must be used with "source bin/activate" *from bash* -# you cannot run it directly - -deactivate () { - unset -f pydoc >/dev/null 2>&1 - - # reset old environment variables - # ! [ -z ${VAR+_} ] returns true if VAR is declared at all - if ! [ -z "${_OLD_VIRTUAL_PATH+_}" ] ; then - PATH="$_OLD_VIRTUAL_PATH" - export PATH - unset _OLD_VIRTUAL_PATH - fi - if ! [ -z "${_OLD_VIRTUAL_PYTHONHOME+_}" ] ; then - PYTHONHOME="$_OLD_VIRTUAL_PYTHONHOME" - export PYTHONHOME - unset _OLD_VIRTUAL_PYTHONHOME - fi - - # This should detect bash and zsh, which have a hash command that must - # be called to get it to forget past commands. Without forgetting - # past commands the $PATH changes we made may not be respected - if [ -n "${BASH-}" ] || [ -n "${ZSH_VERSION-}" ] ; then - hash -r 2>/dev/null - fi - - if ! [ -z "${_OLD_VIRTUAL_PS1+_}" ] ; then - PS1="$_OLD_VIRTUAL_PS1" - export PS1 - unset _OLD_VIRTUAL_PS1 - fi - - unset VIRTUAL_ENV - if [ ! "${1-}" = "nondestructive" ] ; then - # Self destruct! - unset -f deactivate - fi -} - -# unset irrelevant variables -deactivate nondestructive - -VIRTUAL_ENV="/Users/williamjaubert/nautilus_nlp/nautilus" -export VIRTUAL_ENV - -_OLD_VIRTUAL_PATH="$PATH" -PATH="$VIRTUAL_ENV/bin:$PATH" -export PATH - -# unset PYTHONHOME if set -if ! [ -z "${PYTHONHOME+_}" ] ; then - _OLD_VIRTUAL_PYTHONHOME="$PYTHONHOME" - unset PYTHONHOME -fi - -if [ -z "${VIRTUAL_ENV_DISABLE_PROMPT-}" ] ; then - _OLD_VIRTUAL_PS1="${PS1-}" - if [ "x" != x ] ; then - PS1="${PS1-}" - else - PS1="(`basename \"$VIRTUAL_ENV\"`) ${PS1-}" - fi - export PS1 -fi - -# Make sure to unalias pydoc if it's already there -alias pydoc 2>/dev/null >/dev/null && unalias pydoc || true - -pydoc () { - python -m pydoc "$@" -} - -# This should detect bash and zsh, which have a hash command that must -# be called to get it to forget past commands. Without forgetting -# past commands the $PATH changes we made may not be respected -if [ -n "${BASH-}" ] || [ -n "${ZSH_VERSION-}" ] ; then - hash -r 2>/dev/null -fi diff --git a/nautilus/bin/activate.csh b/nautilus/bin/activate.csh deleted file mode 100644 index 2c03eaa..0000000 --- a/nautilus/bin/activate.csh +++ /dev/null @@ -1,42 +0,0 @@ -# This file must be used with "source bin/activate.csh" *from csh*. -# You cannot run it directly. -# Created by Davide Di Blasi <davidedb@gmail.com>. - -set newline='\ -' - -alias deactivate 'test $?_OLD_VIRTUAL_PATH != 0 && setenv PATH "$_OLD_VIRTUAL_PATH:q" && unset _OLD_VIRTUAL_PATH; rehash; test $?_OLD_VIRTUAL_PROMPT != 0 && set prompt="$_OLD_VIRTUAL_PROMPT:q" && unset _OLD_VIRTUAL_PROMPT; unsetenv VIRTUAL_ENV; test "\!:*" != "nondestructive" && unalias deactivate && unalias pydoc' - -# Unset irrelevant variables. -deactivate nondestructive - -setenv VIRTUAL_ENV "/Users/williamjaubert/nautilus_nlp/nautilus" - -set _OLD_VIRTUAL_PATH="$PATH:q" -setenv PATH "$VIRTUAL_ENV:q/bin:$PATH:q" - - - -if ("" != "") then - set env_name = "" -else - set env_name = "$VIRTUAL_ENV:t:q" -endif - -# Could be in a non-interactive environment, -# in which case, $prompt is undefined and we wouldn't -# care about the prompt anyway. -if ( $?prompt ) then - set _OLD_VIRTUAL_PROMPT="$prompt:q" -if ( "$prompt:q" =~ *"$newline:q"* ) then - : -else - set prompt = "[$env_name:q] $prompt:q" -endif -endif - -unset env_name - -alias pydoc python -m pydoc - -rehash diff --git a/nautilus/bin/activate.fish b/nautilus/bin/activate.fish deleted file mode 100644 index 699e0fd..0000000 --- a/nautilus/bin/activate.fish +++ /dev/null @@ -1,101 +0,0 @@ -# This file must be used using `source bin/activate.fish` *within a running fish ( http://fishshell.com ) session*. -# Do not run it directly. - -function _bashify_path -d "Converts a fish path to something bash can recognize" - set fishy_path $argv - set bashy_path $fishy_path[1] - for path_part in $fishy_path[2..-1] - set bashy_path "$bashy_path:$path_part" - end - echo $bashy_path -end - -function _fishify_path -d "Converts a bash path to something fish can recognize" - echo $argv | tr ':' '\n' -end - -function deactivate -d 'Exit virtualenv mode and return to the normal environment.' - # reset old environment variables - if test -n "$_OLD_VIRTUAL_PATH" - # https://github.com/fish-shell/fish-shell/issues/436 altered PATH handling - if test (echo $FISH_VERSION | tr "." "\n")[1] -lt 3 - set -gx PATH (_fishify_path $_OLD_VIRTUAL_PATH) - else - set -gx PATH $_OLD_VIRTUAL_PATH - end - set -e _OLD_VIRTUAL_PATH - end - - if test -n "$_OLD_VIRTUAL_PYTHONHOME" - set -gx PYTHONHOME $_OLD_VIRTUAL_PYTHONHOME - set -e _OLD_VIRTUAL_PYTHONHOME - end - - if test -n "$_OLD_FISH_PROMPT_OVERRIDE" - # Set an empty local `$fish_function_path` to allow the removal of `fish_prompt` using `functions -e`. - set -l fish_function_path - - # Erase virtualenv's `fish_prompt` and restore the original. - functions -e fish_prompt - functions -c _old_fish_prompt fish_prompt - functions -e _old_fish_prompt - set -e _OLD_FISH_PROMPT_OVERRIDE - end - - set -e VIRTUAL_ENV - - if test "$argv[1]" != 'nondestructive' - # Self-destruct! - functions -e pydoc - functions -e deactivate - functions -e _bashify_path - functions -e _fishify_path - end -end - -# Unset irrelevant variables. -deactivate nondestructive - -set -gx VIRTUAL_ENV "/Users/williamjaubert/nautilus_nlp/nautilus" - -# https://github.com/fish-shell/fish-shell/issues/436 altered PATH handling -if test (echo $FISH_VERSION | tr "." "\n")[1] -lt 3 - set -gx _OLD_VIRTUAL_PATH (_bashify_path $PATH) -else - set -gx _OLD_VIRTUAL_PATH $PATH -end -set -gx PATH "$VIRTUAL_ENV/bin" $PATH - -# Unset `$PYTHONHOME` if set. -if set -q PYTHONHOME - set -gx _OLD_VIRTUAL_PYTHONHOME $PYTHONHOME - set -e PYTHONHOME -end - -function pydoc - python -m pydoc $argv -end - -if test -z "$VIRTUAL_ENV_DISABLE_PROMPT" - # Copy the current `fish_prompt` function as `_old_fish_prompt`. - functions -c fish_prompt _old_fish_prompt - - function fish_prompt - # Save the current $status, for fish_prompts that display it. - set -l old_status $status - - # Prompt override provided? - # If not, just prepend the environment name. - if test -n "" - printf '%s%s' "" (set_color normal) - else - printf '%s(%s) ' (set_color normal) (basename "$VIRTUAL_ENV") - end - - # Restore the original $status - echo "exit $old_status" | source - _old_fish_prompt - end - - set -gx _OLD_FISH_PROMPT_OVERRIDE "$VIRTUAL_ENV" -end diff --git a/nautilus/bin/activate.ps1 b/nautilus/bin/activate.ps1 deleted file mode 100644 index 6d8ae2a..0000000 --- a/nautilus/bin/activate.ps1 +++ /dev/null @@ -1,60 +0,0 @@ -# This file must be dot sourced from PoSh; you cannot run it directly. Do this: . ./activate.ps1 - -$script:THIS_PATH = $myinvocation.mycommand.path -$script:BASE_DIR = split-path (resolve-path "$THIS_PATH/..") -Parent - -function global:deactivate([switch] $NonDestructive) -{ - if (test-path variable:_OLD_VIRTUAL_PATH) - { - $env:PATH = $variable:_OLD_VIRTUAL_PATH - remove-variable "_OLD_VIRTUAL_PATH" -scope global - } - - if (test-path function:_old_virtual_prompt) - { - $function:prompt = $function:_old_virtual_prompt - remove-item function:\_old_virtual_prompt - } - - if ($env:VIRTUAL_ENV) - { - $old_env = split-path $env:VIRTUAL_ENV -leaf - remove-item env:VIRTUAL_ENV -erroraction silentlycontinue - } - - if (!$NonDestructive) - { - # Self destruct! - remove-item function:deactivate - remove-item function:pydoc - } -} - -function global:pydoc -{ - python -m pydoc $args -} - -# unset irrelevant variables -deactivate -nondestructive - -$VIRTUAL_ENV = $BASE_DIR -$env:VIRTUAL_ENV = $VIRTUAL_ENV - -$global:_OLD_VIRTUAL_PATH = $env:PATH -$env:PATH = "$env:VIRTUAL_ENV/bin:" + $env:PATH -if (!$env:VIRTUAL_ENV_DISABLE_PROMPT) -{ - function global:_old_virtual_prompt - { - "" - } - $function:_old_virtual_prompt = $function:prompt - function global:prompt - { - # Add a prefix to the current prompt, but don't discard it. - write-host "($( split-path $env:VIRTUAL_ENV -leaf )) " -nonewline - & $function:_old_virtual_prompt - } -} diff --git a/nautilus/bin/activate_this.py b/nautilus/bin/activate_this.py deleted file mode 100644 index 59b5d72..0000000 --- a/nautilus/bin/activate_this.py +++ /dev/null @@ -1,46 +0,0 @@ -"""Activate virtualenv for current interpreter: - -Use exec(open(this_file).read(), {'__file__': this_file}). - -This can be used when you must use an existing Python interpreter, not the virtualenv bin/python. -""" -import os -import site -import sys - -try: - __file__ -except NameError: - raise AssertionError("You must use exec(open(this_file).read(), {'__file__': this_file}))") - -# prepend bin to PATH (this file is inside the bin directory) -bin_dir = os.path.dirname(os.path.abspath(__file__)) -os.environ["PATH"] = os.pathsep.join([bin_dir] + os.environ.get("PATH", "").split(os.pathsep)) - -base = os.path.dirname(bin_dir) - -# virtual env is right above bin directory -os.environ["VIRTUAL_ENV"] = base - -# add the virtual environments site-package to the host python import mechanism -IS_PYPY = hasattr(sys, "pypy_version_info") -IS_JYTHON = sys.platform.startswith("java") -if IS_JYTHON: - site_packages = os.path.join(base, "Lib", "site-packages") -elif IS_PYPY: - site_packages = os.path.join(base, "site-packages") -else: - IS_WIN = sys.platform == "win32" - if IS_WIN: - site_packages = os.path.join(base, "Lib", "site-packages") - else: - site_packages = os.path.join(base, "lib", "python{}".format(sys.version[:3]), "site-packages") - -prev = set(sys.path) -site.addsitedir(site_packages) -sys.real_prefix = sys.prefix -sys.prefix = base - -# Move the added items to the front of the path, in place -new = list(sys.path) -sys.path[:] = [i for i in new if i not in prev] + [i for i in new if i in prev] diff --git a/nautilus/bin/easy_install b/nautilus/bin/easy_install deleted file mode 100755 index d083bb5..0000000 --- a/nautilus/bin/easy_install +++ /dev/null @@ -1,10 +0,0 @@ -#!/Users/williamjaubert/nautilus_nlp/nautilus/bin/python -# -*- coding: utf-8 -*- -import re -import sys - -from setuptools.command.easy_install import main - -if __name__ == '__main__': - sys.argv[0] = re.sub(r'(-script\.pyw?|\.exe)?$', '', sys.argv[0]) - sys.exit(main()) diff --git a/nautilus/bin/easy_install-2.7 b/nautilus/bin/easy_install-2.7 deleted file mode 100755 index d083bb5..0000000 --- a/nautilus/bin/easy_install-2.7 +++ /dev/null @@ -1,10 +0,0 @@ -#!/Users/williamjaubert/nautilus_nlp/nautilus/bin/python -# -*- coding: utf-8 -*- -import re -import sys - -from setuptools.command.easy_install import main - -if __name__ == '__main__': - sys.argv[0] = re.sub(r'(-script\.pyw?|\.exe)?$', '', sys.argv[0]) - sys.exit(main()) diff --git a/nautilus/bin/epylint b/nautilus/bin/epylint deleted file mode 100755 index 8fa16b4..0000000 --- a/nautilus/bin/epylint +++ /dev/null @@ -1,10 +0,0 @@ -#!/Users/williamjaubert/nautilus_nlp/nautilus/bin/python2.7 -# -*- coding: utf-8 -*- -import re -import sys - -from pylint import run_epylint - -if __name__ == '__main__': - sys.argv[0] = re.sub(r'(-script\.pyw?|\.exe)?$', '', sys.argv[0]) - sys.exit(run_epylint()) diff --git a/nautilus/bin/isort b/nautilus/bin/isort deleted file mode 100755 index 31b0716..0000000 --- a/nautilus/bin/isort +++ /dev/null @@ -1,10 +0,0 @@ -#!/Users/williamjaubert/nautilus_nlp/nautilus/bin/python2.7 -# -*- coding: utf-8 -*- -import re -import sys - -from isort.main import main - -if __name__ == '__main__': - sys.argv[0] = re.sub(r'(-script\.pyw?|\.exe)?$', '', sys.argv[0]) - sys.exit(main()) diff --git a/nautilus/bin/pip b/nautilus/bin/pip deleted file mode 100755 index 08299c7..0000000 --- a/nautilus/bin/pip +++ /dev/null @@ -1,10 +0,0 @@ -#!/Users/williamjaubert/nautilus_nlp/nautilus/bin/python -# -*- coding: utf-8 -*- -import re -import sys - -from pip._internal import main - -if __name__ == '__main__': - sys.argv[0] = re.sub(r'(-script\.pyw?|\.exe)?$', '', sys.argv[0]) - sys.exit(main()) diff --git a/nautilus/bin/pip2 b/nautilus/bin/pip2 deleted file mode 100755 index 08299c7..0000000 --- a/nautilus/bin/pip2 +++ /dev/null @@ -1,10 +0,0 @@ -#!/Users/williamjaubert/nautilus_nlp/nautilus/bin/python -# -*- coding: utf-8 -*- -import re -import sys - -from pip._internal import main - -if __name__ == '__main__': - sys.argv[0] = re.sub(r'(-script\.pyw?|\.exe)?$', '', sys.argv[0]) - sys.exit(main()) diff --git a/nautilus/bin/pip2.7 b/nautilus/bin/pip2.7 deleted file mode 100755 index 08299c7..0000000 --- a/nautilus/bin/pip2.7 +++ /dev/null @@ -1,10 +0,0 @@ -#!/Users/williamjaubert/nautilus_nlp/nautilus/bin/python -# -*- coding: utf-8 -*- -import re -import sys - -from pip._internal import main - -if __name__ == '__main__': - sys.argv[0] = re.sub(r'(-script\.pyw?|\.exe)?$', '', sys.argv[0]) - sys.exit(main()) diff --git a/nautilus/bin/pylint b/nautilus/bin/pylint deleted file mode 100755 index 9635a6f..0000000 --- a/nautilus/bin/pylint +++ /dev/null @@ -1,10 +0,0 @@ -#!/Users/williamjaubert/nautilus_nlp/nautilus/bin/python2.7 -# -*- coding: utf-8 -*- -import re -import sys - -from pylint import run_pylint - -if __name__ == '__main__': - sys.argv[0] = re.sub(r'(-script\.pyw?|\.exe)?$', '', sys.argv[0]) - sys.exit(run_pylint()) diff --git a/nautilus/bin/pyreverse b/nautilus/bin/pyreverse deleted file mode 100755 index 6af5484..0000000 --- a/nautilus/bin/pyreverse +++ /dev/null @@ -1,10 +0,0 @@ -#!/Users/williamjaubert/nautilus_nlp/nautilus/bin/python2.7 -# -*- coding: utf-8 -*- -import re -import sys - -from pylint import run_pyreverse - -if __name__ == '__main__': - sys.argv[0] = re.sub(r'(-script\.pyw?|\.exe)?$', '', sys.argv[0]) - sys.exit(run_pyreverse()) diff --git a/nautilus/bin/python b/nautilus/bin/python deleted file mode 100755 index fddb46f7919ca3729d7a3a3aff690d36c96049f6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8464 zcmeHM%}*0S6rTbLDv`p$_!(CMMm@9yP4rj{jSxXWATb&<Zt0rVY`1m04fNKF@jG($ z=Fx-3#1nslH}&A3;0Fg!-aJ@;zuDQcEy~qs<|S|5yqPy|-uz}ZnVt9U$G4xoLL|C{ zXmkl7hQRN42ys_fs0ncZJO!3=ZsJ1rTK39iwzgBEUHz>_KlfoM<zn{gV!MeNpKNav zT1RXG;fNmHEoI=W2Aj5>{u%>V47zt~6Y9}e)zl*zx=RTut3fSSZ8dfJd#L^G)E1E* z4d~PUqW;jIEI4k(@nO{IZ%z9<s2xxz?k(C9U(H)7dU;v&Zk1uw>F=fX$2}rZZ}S&6 zw@U8ASFn_m6N?kAW<k8$_95Dj*goKlw0ukHxw2X><;t$C1pXiWMQ-Sy<0B$oYChc{ zrE72JFNyKA@6-0w<NkO~;`-*foteILF*`XOojI#xozO{19Sr@%;~K_yF-8L`oVyQl zKXpx(rJxgIkhCNA>@Ps)xqS=Cz1ahv1ILNB<apfie%9Bmj`OPx_Clgd^n=s2s-Jd? zxpcnn=An}gff>iW*WX8;eK>u6{ppK0kF75sN6-f7gxG~I1biye*#<g+^>Q4)n>cZv zb71x{X3>ihobfAmP~hy9dQd2P<EgVLgi*}V2Glt&k$8pAF|iplOc(0az$vB9#|Iup z2;393zNM<;SJNv+*Dczm+jcGI_(9tC?B%kTx5qhoIN5((9>?0aZ#S**9G=uV&l!n$ zVeb@P8Mkcb9bc-QNu|`$P)4RO2p9wm0tNwtfI+|@U=aB02rNxK_;h1~VKhe@C}*A= zxdSn=&>XcP*9s`a#^+|U8UB~xo~I}-c^~I}{R|}ek-odL&VP%3+_#fpO|44Q5SPy} zc3XqEv8fvb3<3rLgMdN6AYc$M2p9wm0tNwtfI+|@@J}ExIGmhkphFoZ4^=W;=8$hj z@_ODEYr;<sX5?I5&e}x}Djo+U@|s<;RFKZ9vs?=t<hq${630q38RcU{w`d%tQ&3c4 z^FTsn9@YE8KBb567JP5udj@3d>4EvJxIP~0bfbvx8b~CPGOSz3KyQsns+bV}ti3F= QzF$V7I$F$@^(tq-0E&ReMF0Q* diff --git a/nautilus/bin/python-config b/nautilus/bin/python-config deleted file mode 100755 index 5f285ef..0000000 --- a/nautilus/bin/python-config +++ /dev/null @@ -1,78 +0,0 @@ -#!/Users/williamjaubert/nautilus_nlp/nautilus/bin/python - -import sys -import getopt -import sysconfig - -valid_opts = ['prefix', 'exec-prefix', 'includes', 'libs', 'cflags', - 'ldflags', 'help'] - -if sys.version_info >= (3, 2): - valid_opts.insert(-1, 'extension-suffix') - valid_opts.append('abiflags') -if sys.version_info >= (3, 3): - valid_opts.append('configdir') - - -def exit_with_usage(code=1): - sys.stderr.write("Usage: {0} [{1}]\n".format( - sys.argv[0], '|'.join('--'+opt for opt in valid_opts))) - sys.exit(code) - -try: - opts, args = getopt.getopt(sys.argv[1:], '', valid_opts) -except getopt.error: - exit_with_usage() - -if not opts: - exit_with_usage() - -pyver = sysconfig.get_config_var('VERSION') -getvar = sysconfig.get_config_var - -opt_flags = [flag for (flag, val) in opts] - -if '--help' in opt_flags: - exit_with_usage(code=0) - -for opt in opt_flags: - if opt == '--prefix': - print(sysconfig.get_config_var('prefix')) - - elif opt == '--exec-prefix': - print(sysconfig.get_config_var('exec_prefix')) - - elif opt in ('--includes', '--cflags'): - flags = ['-I' + sysconfig.get_path('include'), - '-I' + sysconfig.get_path('platinclude')] - if opt == '--cflags': - flags.extend(getvar('CFLAGS').split()) - print(' '.join(flags)) - - elif opt in ('--libs', '--ldflags'): - abiflags = getattr(sys, 'abiflags', '') - libs = ['-lpython' + pyver + abiflags] - libs += getvar('LIBS').split() - libs += getvar('SYSLIBS').split() - # add the prefix/lib/pythonX.Y/config dir, but only if there is no - # shared library in prefix/lib/. - if opt == '--ldflags': - if not getvar('Py_ENABLE_SHARED'): - libs.insert(0, '-L' + getvar('LIBPL')) - if not getvar('PYTHONFRAMEWORK'): - libs.extend(getvar('LINKFORSHARED').split()) - print(' '.join(libs)) - - elif opt == '--extension-suffix': - ext_suffix = sysconfig.get_config_var('EXT_SUFFIX') - if ext_suffix is None: - ext_suffix = sysconfig.get_config_var('SO') - print(ext_suffix) - - elif opt == '--abiflags': - if not getattr(sys, 'abiflags', None): - exit_with_usage() - print(sys.abiflags) - - elif opt == '--configdir': - print(sysconfig.get_config_var('LIBPL')) diff --git a/nautilus/bin/python2 b/nautilus/bin/python2 deleted file mode 120000 index d8654aa..0000000 --- a/nautilus/bin/python2 +++ /dev/null @@ -1 +0,0 @@ -python \ No newline at end of file diff --git a/nautilus/bin/python2.7 b/nautilus/bin/python2.7 deleted file mode 120000 index d8654aa..0000000 --- a/nautilus/bin/python2.7 +++ /dev/null @@ -1 +0,0 @@ -python \ No newline at end of file diff --git a/nautilus/bin/symilar b/nautilus/bin/symilar deleted file mode 100755 index 582abdf..0000000 --- a/nautilus/bin/symilar +++ /dev/null @@ -1,10 +0,0 @@ -#!/Users/williamjaubert/nautilus_nlp/nautilus/bin/python2.7 -# -*- coding: utf-8 -*- -import re -import sys - -from pylint import run_symilar - -if __name__ == '__main__': - sys.argv[0] = re.sub(r'(-script\.pyw?|\.exe)?$', '', sys.argv[0]) - sys.exit(run_symilar()) diff --git a/nautilus/bin/wheel b/nautilus/bin/wheel deleted file mode 100755 index bd14437..0000000 --- a/nautilus/bin/wheel +++ /dev/null @@ -1,10 +0,0 @@ -#!/Users/williamjaubert/nautilus_nlp/nautilus/bin/python -# -*- coding: utf-8 -*- -import re -import sys - -from wheel.cli import main - -if __name__ == '__main__': - sys.argv[0] = re.sub(r'(-script\.pyw?|\.exe)?$', '', sys.argv[0]) - sys.exit(main()) diff --git a/nautilus/include/python2.7 b/nautilus/include/python2.7 deleted file mode 120000 index de0d082..0000000 --- a/nautilus/include/python2.7 +++ /dev/null @@ -1 +0,0 @@ -/Users/williamjaubert/anaconda2/include/python2.7 \ No newline at end of file diff --git a/src/french-lefff-lemmatizer b/src/french-lefff-lemmatizer deleted file mode 160000 index ba1ef2b..0000000 --- a/src/french-lefff-lemmatizer +++ /dev/null @@ -1 +0,0 @@ -Subproject commit ba1ef2bc67aa3753d127ba978a255081120449c2 From 21f3b17b55ee41762d6a9873e4ccf539093657d3 Mon Sep 17 00:00:00 2001 From: Robin <rdoume@gmail.com> Date: Fri, 3 May 2019 15:41:15 +0200 Subject: [PATCH 120/496] Update requirements.txt --- requirements.txt | 1 - 1 file changed, 1 deletion(-) diff --git a/requirements.txt b/requirements.txt index 90217bd..b124e17 100644 --- a/requirements.txt +++ b/requirements.txt @@ -10,7 +10,6 @@ flake8 python-dotenv>=0.5.1 pillow pytest -os #library requirements pyLDAvis==2.1.2 From 9b0f52721e96253fe2cabc409232c04e249dada3 Mon Sep 17 00:00:00 2001 From: Robin <rdoume@gmail.com> Date: Fri, 3 May 2019 15:41:24 +0200 Subject: [PATCH 121/496] Update requirements.txt --- requirements.txt | 1 - 1 file changed, 1 deletion(-) diff --git a/requirements.txt b/requirements.txt index b124e17..3ec0a3a 100644 --- a/requirements.txt +++ b/requirements.txt @@ -34,7 +34,6 @@ textacy==0.6.3 gensim==3.7.1 scikit_learn==0.20.3 vaderSentiment==3.2.1 -logging==0.4.9.6 google-compute-engine==2.8.13 flashtext==2.7 From cc02b4d2e399abecb4b1af9e5b2becb3d031070f Mon Sep 17 00:00:00 2001 From: Robin <rdoume@gmail.com> Date: Fri, 3 May 2019 15:53:29 +0200 Subject: [PATCH 122/496] Update .travis.yml --- .travis.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index d366fab..4f7da47 100644 --- a/.travis.yml +++ b/.travis.yml @@ -9,7 +9,7 @@ before_script: - python3 -m spacy download fr && python3 -m spacy download en && python3 -m spacy download de && python3 -m spacy download nl && python3 -m spacy download it && python3 -m spacy download xx && python3 -m spacy validate - wget http://mallet.cs.umass.edu/dist/mallet-2.0.8.zip && unzip mallet-2.0.8.zip && rm mallet-2.0.8.zip - - sudo add-apt-repository ppa:openjdk-r/ppa && sudo apt update && apt search openjdk && sudo apt install openjdk-8-jdk + - sudo add-apt-repository -y ppa:openjdk-r/ppa && sudo apt update && apt search openjdk && sudo apt install openjdk-8-jdk install: - pip install -r requirements.txt From 5e3e5891f7258e809945ea9a891db32abfe81e56 Mon Sep 17 00:00:00 2001 From: Robin <rdoume@gmail.com> Date: Fri, 3 May 2019 16:05:35 +0200 Subject: [PATCH 123/496] Naming & folder change --- nautilus_nlp/preprocessing/__init__.py | 0 .../preprocessing/keyword_extractor.py | 21 + nautilus_nlp/preprocessing/lemmatizer.py | 102 +++++ nautilus_nlp/preprocessing/preprocess.py | 397 ++++++++++++++++++ nautilus_nlp/preprocessing/stemmer.py | 31 ++ .../preprocessing/text_vectorizers.py | 195 +++++++++ nautilus_nlp/preprocessing/tokenizer.py | 80 ++++ 7 files changed, 826 insertions(+) create mode 100644 nautilus_nlp/preprocessing/__init__.py create mode 100644 nautilus_nlp/preprocessing/keyword_extractor.py create mode 100644 nautilus_nlp/preprocessing/lemmatizer.py create mode 100644 nautilus_nlp/preprocessing/preprocess.py create mode 100644 nautilus_nlp/preprocessing/stemmer.py create mode 100644 nautilus_nlp/preprocessing/text_vectorizers.py create mode 100644 nautilus_nlp/preprocessing/tokenizer.py diff --git a/nautilus_nlp/preprocessing/__init__.py b/nautilus_nlp/preprocessing/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/nautilus_nlp/preprocessing/keyword_extractor.py b/nautilus_nlp/preprocessing/keyword_extractor.py new file mode 100644 index 0000000..e384bf2 --- /dev/null +++ b/nautilus_nlp/preprocessing/keyword_extractor.py @@ -0,0 +1,21 @@ +from flashtext import KeywordProcessor + +def extract_keywords(text,keyword,case_sensitive=True): + """ + Extract Keywords from a document. + args : + text: Text to extract keywords from + keyword : Single keyword (str) or list of keywords (list) + + return list of extracted keyworkds + """ + processor=KeywordProcessor(case_sensitive=case_sensitive) + if isinstance(keyword,list): + processor.add_keywords_from_list(keyword) + elif isinstance(keyword,str): + processor.add_keyword(keyword) + elif isinstance(keyword,dict): + processor.add_keywords_from_dict(keyword) + + return processor.extract_keywords(text) + diff --git a/nautilus_nlp/preprocessing/lemmatizer.py b/nautilus_nlp/preprocessing/lemmatizer.py new file mode 100644 index 0000000..e4c812c --- /dev/null +++ b/nautilus_nlp/preprocessing/lemmatizer.py @@ -0,0 +1,102 @@ +import spacy +import nltk +nltk.download('wordnet') +from nltk.stem import WordNetLemmatizer +from nltk.corpus import wordnet + +try: + french_spacy = spacy.load('fr_core_news_sm') +except OSError: + raise OSError("""You must install French langage to use SpaCy. + python -m spacy download fr + See https://spacy.io/usage/ for details + """) +try: + english_spacy = spacy.load('en_core_web_sm') +except OSError: + raise OSError("""You must install english langage to use SpaCy. + python -m spacy download en + See https://spacy.io/usage/ for details + """) + + + + +def lemmatize_french_tokens(tokens, module='spacy', load_only_pos='all'): + ''' + Wrappers of french lemmatizers. SpaCy is much faster but sometimes + FrenchLefffLemmatizer returns more accurate results. Give a try to the + 2 modules and choose the one that better fit your needs. + + Args: + tokens (list): list of tokens + module ({'spacy'}): modules availables. + load_only_pos ({'a', v', 'r', 'n', 'all'}): If not "all", applies + lemmatization only to a certain POS tags, for french_leff_v module. + a = adjectives, v = verbs, n = noun, r = adverb. + + Returns: + list of lemmatized tokens + + ''' + + tokens = _make_sure_input_is_list_of_tokens(tokens) + + if module == 'spacy': + # Doc : https://spacy.io/api/token#attributes + text = ' '.join(tokens) + doc = french_spacy(text) + return [token.lemma_ for token in doc] + + else: + raise ValueError("must pass a valid module name!") + + +def lemmatize_english_tokens(tokens, module='spacy', pos_tag_prio='v'): + ''' + Args: + tokens (list): list of tokens + module ({'french_leff_v', 'spacy'}): modules availables. + pos_tag_prio ({'v', 'n', 'all'}): grammatical priority, applies + for french_leff_v module. + + Returns: + list of lemmatized tokens + + ''' + tokens = _make_sure_input_is_list_of_tokens(tokens) + + if module == 'nltk': + # Doc : https://github.com/ClaudeCoulombe/FrenchLefffLemmatizer + lemmatizer = WordNetLemmatizer() + return [lemmatizer.lemmatize(word, _get_wordnet_pos(word)) for word in tokens] + + elif module == 'spacy': + # Doc : https://spacy.io/api/token#attributes + text = ' '.join(tokens) + doc = english_spacy(text) + return [token.lemma_ for token in doc] + + else: + raise ValueError("must pass a valid module name!") + + +def _get_wordnet_pos(word): + """Map POS tag to first character lemmatize() accepts""" + tag = nltk.pos_tag([word])[0][1][0].upper() + tag_dict = {"J": wordnet.ADJ, + "N": wordnet.NOUN, + "V": wordnet.VERB, + "R": wordnet.ADV} + + return tag_dict.get(tag, wordnet.NOUN) + + +def _make_sure_input_is_list_of_tokens(tokens): + if type(tokens) is list: + return tokens + elif tokens is None: + return [] + elif type(tokens) is str: + raise ValueError("must pass a list of tokens, not text!") + diff --git a/nautilus_nlp/preprocessing/preprocess.py b/nautilus_nlp/preprocessing/preprocess.py new file mode 100644 index 0000000..70d8148 --- /dev/null +++ b/nautilus_nlp/preprocessing/preprocess.py @@ -0,0 +1,397 @@ +# -*- coding: utf-8 -*- +""" +Functions that modify raw text *in-place*, replacing contractions, URLs, emails, +phone numbers, and currency symbols with standardized forms. These should be +applied before processing by `Spacy <http://spacy.io>`_, but be warned: preprocessing +may affect the interpretation of the text -- and spacy's processing of it. +""" +from __future__ import absolute_import, division, print_function, unicode_literals + +import os +import json +import re +import unicodedata + +from ftfy import fix_text +from stop_words import get_stop_words as _get_stop_words +from stop_words import LANGUAGE_MAPPING as _LANGUAGE_MAPPING + +from . import constants +from nautilus_nlp.config.config import ROOT_FOLDER +from nautilus_nlp.utils.file_loader import documents_loader + +STOPWORDS_JSON_FILEPATH = os.path.join(ROOT_FOLDER, "data", "stopwords.json") + + +def remove_multiple_spaces_and_strip_text(text): + """Remove multiple spaces, strip text, and remove '-', '*' characters. + Parameters + ---------- + text : str, + Returns + ------- + str + """ + regex_remove_multiple_spaces_list = ["\\t", "[\\s\\-\\*]{2,}"] + for regex_remove_multiple_spaces in regex_remove_multiple_spaces_list: + text = re.sub(regex_remove_multiple_spaces, " ", text) + text = text.strip() + return text + + +def remove_EOL_characters(text): + """Remove end of line (\n) char. + Parameters + ---------- + text : str, + Returns + ------- + str + """ + return text.replace("\n", "") + + +def remove_tokens_with_nonletters(tokens): + """ + Inputs a list of tokens, outputs a list of tokens without tokens that + includes numbers of special caracters + """ + return [word for word in tokens if re.search("[a-zA-Z]", word)] + + +def remove_special_caracters(tokens): + """ Checks for letters in the token - using a regex search. + Strings that are just punctuation will + be removed! No more custom '--'. But ''s' and '9' will remain. + """ + return [word for word in tokens if re.search("[a-zA-Z0-9]", word)] + + +def _load_stopwords_from_json(filepath=STOPWORDS_JSON_FILEPATH): + stopwords = documents_loader(filepath) + stopwords = json.loads(stopwords) + return stopwords + + +def get_stopwords(lang: str = "en"): + """ + Inputs a language code, returns a list of stopwords for the specified language + + Args: + lang: Supported languages: ['ar', 'bg', 'ca', 'cz', 'da', 'nl', 'en', + 'fi', 'fr', 'de', 'hi', 'hu', 'id', 'it', 'nb', 'pl', 'pt', 'ro', 'ru', + 'sk', 'es', 'sv', 'tr', 'uk', 'vi', 'af', 'ha', 'so', 'st', 'sw', 'yo', + 'zu', 'da', 'de', 'es', 'et', 'fi', 'fr', 'hr', 'hu', 'it', 'ko', 'nl', + 'no', 'pl', 'pt', 'ru', 'sv', 'tr', 'zh', 'eo', 'he', 'la', 'sk', 'sl', + 'br', 'ca', 'cs', 'el', 'eu', 'ga', 'gl', 'hy', 'id', 'ja', 'lv', 'th', + 'ar', 'bg', 'bn', 'fa', 'hi', 'mr', 'ro', 'en'] + """ + if type(lang) == str and len(lang) == 2: + lang = lang.lower() + + custom_stopwords = _load_stopwords_from_json(STOPWORDS_JSON_FILEPATH) + stopwords = [] + + supported_lang_lib = list(_LANGUAGE_MAPPING.keys()) + supported_lang_custom = list(custom_stopwords.keys()) + supported_lang = supported_lang_lib + supported_lang_custom + if lang in supported_lang: + if lang in supported_lang_lib: + stopwords += _get_stop_words(lang) + if lang in supported_lang_custom: + stopwords += custom_stopwords[lang] + else: + raise ValueError( + "Language not available yet or incorrect country code. Supported languages: {}".format( + supported_lang + ) + ) + else: + raise ValueError( + 'Please input a valid country code, in 2 letters. Eg. "us" for USA. ' + ) + return list(set(stopwords)) + + +def remove_stopwords(text_or_tokens, stopwords): + """ + Remove stopwords from tokens. + """ + if type(text_or_tokens) is str: + return [word for word in text_or_tokens.split() if word not in stopwords] + elif type(text_or_tokens) is list: + return [word for word in text_or_tokens if word not in stopwords] + else: + raise ValueError("must input string or list of tokens") + + +def fix_bad_unicode(text, normalization="NFC") -> str: + """ + Fix unicode text that's "broken" using `ftfy <http://ftfy.readthedocs.org/>`_; + this includes mojibake, HTML entities and other code cruft, + and non-standard forms for display purposes. + + Args: + text (str): raw text + normalization ({'NFC', 'NFKC', 'NFD', 'NFKD'}): if 'NFC', + combines characters and diacritics written using separate code points, + e.g. converting "e" plus an acute accent modifier into "é"; unicode + can be converted to NFC form without any change in its meaning! + if 'NFKC', additional normalizations are applied that can change + the meanings of characters, e.g. ellipsis characters will be replaced + with three periods + + Returns: + str + """ + return fix_text(text, normalization=normalization) + + +def normalize_whitespace(text) -> str: + """ + Given ``text`` str, replace one or more spacings with a single space, and one + or more linebreaks with a single newline. Also strip leading/trailing whitespace. + """ + return constants.NONBREAKING_SPACE_REGEX.sub( + " ", constants.LINEBREAK_REGEX.sub(r"\n", text) + ).strip() + + +def unpack_french_contractions(text) -> str: + + return text + + +def unpack_english_contractions(text) -> str: + """ + Replace *English* contractions in ``text`` str with their unshortened forms. + N.B. The "'d" and "'s" forms are ambiguous (had/would, is/has/possessive), + so are left as-is. + """ + # standard + text = re.sub( + r"(\b)([Aa]re|[Cc]ould|[Dd]id|[Dd]oes|[Dd]o|[Hh]ad|[Hh]as|[Hh]ave|[Ii]s|[Mm]ight|[Mm]ust|[Ss]hould|[Ww]ere|[Ww]ould)n't", + r"\1\2 not", + text, + ) + text = re.sub( + r"(\b)([Hh]e|[Ii]|[Ss]he|[Tt]hey|[Ww]e|[Ww]hat|[Ww]ho|[Yy]ou)'ll", + r"\1\2 will", + text, + ) + text = re.sub(r"(\b)([Tt]hey|[Ww]e|[Ww]hat|[Ww]ho|[Yy]ou)'re", r"\1\2 are", text) + text = re.sub( + r"(\b)([Ii]|[Ss]hould|[Tt]hey|[Ww]e|[Ww]hat|[Ww]ho|[Ww]ould|[Yy]ou)'ve", + r"\1\2 have", + text, + ) + # non-standard + text = re.sub(r"(\b)([Cc]a)n't", r"\1\2n not", text) + text = re.sub(r"(\b)([Ii])'m", r"\1\2 am", text) + text = re.sub(r"(\b)([Ll]et)'s", r"\1\2 us", text) + text = re.sub(r"(\b)([Ww])on't", r"\1\2ill not", text) + text = re.sub(r"(\b)([Ss])han't", r"\1\2hall not", text) + text = re.sub(r"(\b)([Yy])(?:'all|a'll)", r"\1\2ou all", text) + return text + + +def unpack_contractions_from_lang(text, lang: str = "fr") -> str: + if lang == "fr": + return unpack_english_contractions(text) + else: + return unpack_english_contractions(text) + + +def replace_urls(text, replace_with="*URL*") -> str: + """Replace all URLs in ``text`` str with ``replace_with`` str.""" + return constants.URL_REGEX.sub( + replace_with, constants.SHORT_URL_REGEX.sub(replace_with, text) + ) + + +def replace_emails(text, replace_with="*EMAIL*") -> str: + """Replace all emails in ``text`` str with ``replace_with`` str.""" + return constants.EMAIL_REGEX.sub(replace_with, text) + + +def replace_phone_numbers(text, replace_with="*PHONE*") -> str: + """Replace all phone numbers in ``text`` str with ``replace_with`` str.""" + return constants.PHONE_REGEX.sub(replace_with, text) + + +def replace_numbers(text, replace_with="*NUMBER*") -> str: + """Replace all numbers in ``text`` str with ``replace_with`` str.""" + return constants.NUMBERS_REGEX.sub(replace_with, text) + + +def replace_currency_symbols(text, replace_with=None) -> str: + """ + Replace all currency symbols in ``text`` str with string specified by ``replace_with`` str. + + Args: + text (str): raw text + replace_with (str): if None (default), replace symbols with + their standard 3-letter abbreviations (e.g. '$' with 'USD', '£' with 'GBP'); + otherwise, pass in a string with which to replace all symbols + (e.g. "*CURRENCY*") + + Returns: + str + """ + if replace_with is None: + for k, v in constants.CURRENCIES.items(): + text = text.replace(k, v) + return text + else: + return constants.CURRENCY_REGEX.sub(replace_with, text) + + +def remove_punct(text, marks=None) -> str: + """ + Remove punctuation from ``text`` by replacing all instances of ``marks`` + with whitespace. + + Args: + text (str): raw text + marks (str): If specified, remove only the characters in this string, + e.g. ``marks=',;:'`` removes commas, semi-colons, and colons. + Otherwise, all punctuation marks are removed. + + Returns: + str + + Note: + When ``marks=None``, Python's built-in :meth:`str.translate()` is + used to remove punctuation; otherwise, a regular expression is used + instead. The former's performance is about 5-10x faster. + """ + if marks: + return re.sub("[{}]+".format(re.escape(marks)), " ", text, flags=re.UNICODE) + else: + return text.translate(constants.PUNCT_TRANSLATE_UNICODE) + + +def remove_accents(text, method="unicode") -> str: + """ + Remove accents from any accented unicode characters in ``text`` str, either by + transforming them into ascii equivalents or removing them entirely. + + Args: + text (str): raw text + method ({'unicode', 'ascii'}): if 'unicode', remove accented + char for any unicode symbol with a direct ASCII equivalent; if 'ascii', + remove accented char for any unicode symbol + + NB: the 'ascii' method is notably faster than 'unicode', but less good + + Returns: + str + + Raises: + ValueError: if ``method`` is not in {'unicode', 'ascii'} + """ + if method == "unicode": + return "".join( + c + for c in unicodedata.normalize("NFKD", text) + if not unicodedata.combining(c) + ) + elif method == "ascii": + return ( + unicodedata.normalize("NFKD", text) + .encode("ascii", errors="ignore") + .decode("ascii") + ) + else: + msg = '`method` must be either "unicode" and "ascii", not {}'.format(method) + raise ValueError(msg) + + +def remove_emoji(word): + """ + Remove emoji from any str by stripping any unicode in the range of Emoji unicode, + + Args: + word (str): raw word + + Returns: + str + + """ + RE_EMOJI = re.compile("[\U00010000-\U0010ffff]", flags=re.UNICODE) + word = RE_EMOJI.sub(r"", word) + return word + + +def preprocess_text( + text, + no_emoji=False, + fix_unicode=False, + lowercase=False, + no_urls=False, + no_emails=False, + no_phone_numbers=False, + no_numbers=False, + no_currency_symbols=False, + no_punct=False, + no_contractions=False, + no_accents=False, +) -> str: + """ + Normalize various aspects of a raw text doc before parsing it with Spacy. + A convenience function for applying all other preprocessing functions in one go. + + Args: + text (str): raw text to preprocess + fix_unicode (bool): if True, fix "broken" unicode such as + mojibake and garbled HTML entities + lowercase (bool): if True, all text is lower-cased + no_urls (bool): if True, replace all URL strings with '*URL*' + no_emails (bool): if True, replace all email strings with '*EMAIL*' + no_phone_numbers (bool): if True, replace all phone number strings + with '*PHONE*' + no_numbers (bool): if True, replace all number-like strings + with '*NUMBER*' + no_currency_symbols (bool): if True, replace all currency symbols + with their standard 3-letter abbreviations + no_punct (bool): if True, remove all punctuation (replace with + empty string) + no_contractions (bool): if True, replace *English* contractions + with their unshortened forms + no_accents (bool): if True, replace all accented characters + with unaccented versions + + Returns: + str: input ``text`` processed according to function args + + Warning: + These changes may negatively affect subsequent NLP analysis performed + on the text, so choose carefully, and preprocess at your own risk! + """ + + assert isinstance(text, str), "The text to preprocess must be a string" + + if fix_unicode is True: + text = fix_bad_unicode(text, normalization="NFC") + if no_urls is True: + text = replace_urls(text) + if no_emails is True: + text = replace_emails(text) + if no_phone_numbers is True: + text = replace_phone_numbers(text) + if no_numbers is True: + text = replace_numbers(text) + if no_currency_symbols is True: + text = replace_currency_symbols(text) + if no_contractions is True: + text = unpack_contractions_from_lang(text) + if no_accents is True: + text = remove_accents(text, method="unicode") + if no_punct is True: + text = remove_punct(text) + if lowercase is True: + text = text.lower() + # always normalize whitespace; treat linebreaks separately from spacing + text = normalize_whitespace(text) + + return text diff --git a/nautilus_nlp/preprocessing/stemmer.py b/nautilus_nlp/preprocessing/stemmer.py new file mode 100644 index 0000000..c480ca8 --- /dev/null +++ b/nautilus_nlp/preprocessing/stemmer.py @@ -0,0 +1,31 @@ +from nltk.stem.snowball import * + + +def stem_tokens(tokens: list, lang: str ='english'): + ''' + Wrapper of NLTK's Snowball stemmers : http://www.nltk.org/howto/stem.html + + Args: + tokens (list): list of tokens + lang ({'arabic', 'danish', 'dutch', 'english', 'finnish', 'french', + 'german', 'hungarian', 'italian', 'norwegian', 'porter', 'portuguese', + 'romanian', 'russian', 'spanish', 'swedish'}): supported langages + + Returns: + list of stemmed tokens + + ''' + supported_lang = [lang for lang in SnowballStemmer.languages] + + if lang in supported_lang: + stemmer = eval(lang.capitalize()+'Stemmer()') + else: + raise ValueError("Langage not supported of mispelled") + + # Make sure tokens are actually a list, and handle NaN. + if type(tokens) is list: + return [stemmer.stem(token) for token in tokens] + elif tokens is None: + return [] + elif type(tokens) is str: + raise ValueError("must pass a list of tokens, not text!") \ No newline at end of file diff --git a/nautilus_nlp/preprocessing/text_vectorizers.py b/nautilus_nlp/preprocessing/text_vectorizers.py new file mode 100644 index 0000000..a03c5bb --- /dev/null +++ b/nautilus_nlp/preprocessing/text_vectorizers.py @@ -0,0 +1,195 @@ +import spacy +from gensim.corpora import Dictionary +from gensim.models.tfidfmodel import TfidfModel +from gensim import corpora, models, similarities +from gensim.matutils import sparse2full +import numpy as np +import math + +from sklearn.feature_extraction.text import TfidfVectorizer, TfidfTransformer + + +class Tfidf(object): + """ + Inputs a list of string + Outputs a tuple with the wordcount vector matrix, and the list of feature name + Params: + input=’content’, encoding=’utf-8’, decode_error=’strict’, strip_accents=None, + lowercase=True, preprocessor=None, tokenizer=None, analyzer=’word’, + stop_words=None, token_pattern=’(?u)\b\w\w+\b’, ngram_range=(1, 1), + max_df=1.0, min_df=1, max_features=None, vocabulary=None, binary=False, + dtype=<class ‘numpy.float64’>, norm=’l2’, use_idf=True, smooth_idf=True, sublinear_tf=False + + Wrapper of https://scikit-learn.org/stable/modules/generated/sklearn.feature_extraction.text.TfidfVectorizer.html + """ + + def __init__(self, **kwargs): + self.tfidf_vectorizer = TfidfVectorizer(**kwargs) + + def _compute_wordcount_vector(self, documents): + ''' + Input a list of documents (string) + Output the wordcount vector matrix + ''' + self.word_count_vector = self.tfidf_vectorizer.fit_transform(documents) + return self.word_count_vector + + + def _get_features_name(self): + self.feature_names = self.tfidf_vectorizer.get_feature_names() + return self.feature_names + + + def _compute_idf(self): + self.tfidf_transformer=TfidfTransformer(smooth_idf=True, use_idf=True) + self.tfidf_transformer.fit(self.word_count_vector) + return self.word_count_vector + + + def compute_tfidf(self, documents): + self._compute_wordcount_vector(documents) + self._get_features_name() + self._compute_idf() + return self.word_count_vector + + def _apply_tfidf_to_doc(self, text): + '''generate tf-idf for the given document''' + return self.tfidf_transformer.transform(self.tfidf_vectorizer.transform([text])) + + + def _sort_coo(self, coo_matrix): + '''sort the tf-idf vectors by descending order of scores''' + tuples = zip(coo_matrix.col, coo_matrix.data) + return sorted(tuples, key=lambda x: (x[1], x[0]), reverse=True) + + + def _extract_topn_from_vector(self, feature_names, sorted_items, topn=10): + """get the feature names and tf-idf score of top n items""" + + #use only topn items from vector + sorted_items = sorted_items[:topn] + + score_vals = [] + feature_vals = [] + + # word index and corresponding tf-idf score + for idx, score in sorted_items: + + #keep track of feature name and its corresponding score + score_vals.append(round(score, 3)) + feature_vals.append(feature_names[idx]) + + #create a tuples of feature,score + #results = zip(feature_vals,score_vals) + results= {} + for idx in range(len(feature_vals)): + results[feature_vals[idx]]=score_vals[idx] + + return results + + + def get_top_tfidf_per_doc(self, text, n=10): + '''compute TF-IDF for a given doc, and returns a list of the top N weighted words''' + tf_idf_vector= self._apply_tfidf_to_doc(text) + sorted_items=self._sort_coo(tf_idf_vector.tocoo()) + return list(self._extract_topn_from_vector(self.feature_names, sorted_items, n).keys()) + + def get_top_tfidf(self, n=10): + '''returns a dict of the top N weighted words, with their weight''' + return self._extract_topn_from_vector(self.feature_names, self._sort_coo(self.word_count_vector.tocoo()), topn=n) + + +class Text_Vectorizer: + def __init__(self, doc_list): + # Initialize + self.doc_list = doc_list + self.nlp, self.docs, self.docs_dict = self._preprocess(self.doc_list) + + # Functions to lemmatise docs + def _keep_token(self, t): + return t.is_alpha and not (t.is_space or t.is_punct or t.is_stop or t.like_num) + + def _lemmatize_doc(self, doc): + return [t.lemma_ for t in doc if self._keep_token(t)] + + # Gensim to create a dictionary and filter out stop and infrequent words (lemmas). + def _get_docs_dict(self, docs): + docs_dict = Dictionary(docs) + # CAREFUL: For small corpus please carefully modify the parameters for filter_extremes, or simply comment it out. + docs_dict.filter_extremes(no_below=5, no_above=0.2) + docs_dict.compactify() + return docs_dict + + # Preprocess docs + def _preprocess(self, doc_list): + # Load spacy model + nlp = spacy.load("en") + # lemmatise docs + docs = [self._lemmatize_doc(nlp(doc)) for doc in doc_list] + # Get docs dictionary + docs_dict = self._get_docs_dict(docs) + return nlp, docs, docs_dict + + # Gensim can again be used to create a bag-of-words representation of each document, + # build the TF-IDF model, + # and compute the TF-IDF vector for each document. + def _get_tfidf(self, docs, docs_dict): + docs_corpus = [docs_dict.doc2bow(doc) for doc in docs] + model_tfidf = TfidfModel(docs_corpus, id2word=docs_dict) + docs_tfidf = model_tfidf[docs_corpus] + docs_vecs = np.vstack([sparse2full(c, len(docs_dict)) for c in docs_tfidf]) + return docs_vecs + + # Get avg w2v for one document + def _document_vector(self, doc, docs_dict, nlp): + # remove out-of-vocabulary words + doc_vector = [nlp(word).vector for word in doc if word in docs_dict.token2id] + return np.mean(doc_vector, axis=0) + + + # Get average vector for document list + def avg_wv(self): + docs_vecs = np.vstack( + [self._document_vector(doc, self.docs_dict, self.nlp) for doc in self.docs] + ) + return docs_vecs + + # Get TF-IDF vector for document list + def get_tfidf(self): + docs_corpus = [self.docs_dict.doc2bow(doc) for doc in self.docs] + model_tfidf = TfidfModel(docs_corpus, id2word=self.docs_dict) + docs_tfidf = model_tfidf[docs_corpus] + docs_vecs = np.vstack([sparse2full(c, len(self.docs_dict)) for c in docs_tfidf]) + return docs_vecs + + # Get Latent Semantic Indexing(LSI) vector for document list + def get_lsi(self, num_topics=300): + docs_corpus = [self.docs_dict.doc2bow(doc) for doc in self.docs] + model_lsi = models.LsiModel(docs_corpus, num_topics, id2word=self.docs_dict) + docs_lsi = model_lsi[docs_corpus] + docs_vecs = np.vstack([sparse2full(c, len(self.docs_dict)) for c in docs_lsi]) + return docs_vecs + + # Get Random Projections(RP) vector for document list + def get_rp(self): + docs_corpus = [self.docs_dict.doc2bow(doc) for doc in self.docs] + model_rp = models.RpModel(docs_corpus, id2word=self.docs_dict) + docs_rp = model_rp[docs_corpus] + docs_vecs = np.vstack([sparse2full(c, len(self.docs_dict)) for c in docs_rp]) + return docs_vecs + + # Get Latent Dirichlet Allocation(LDA) vector for document list + def get_lda(self, num_topics=100): + docs_corpus = [self.docs_dict.doc2bow(doc) for doc in self.docs] + model_lda = models.LdaModel(docs_corpus, num_topics, id2word=self.docs_dict) + docs_lda = model_lda[docs_corpus] + docs_vecs = np.vstack([sparse2full(c, len(self.docs_dict)) for c in docs_lda]) + return docs_vecs + + # Get Hierarchical Dirichlet Process(HDP) vector for document list + def get_hdp(self): + docs_corpus = [self.docs_dict.doc2bow(doc) for doc in self.docs] + model_hdp = models.HdpModel(docs_corpus, id2word=self.docs_dict) + docs_hdp = model_hdp[docs_corpus] + docs_vecs = np.vstack([sparse2full(c, len(self.docs_dict)) for c in docs_hdp]) + return docs_vecs diff --git a/nautilus_nlp/preprocessing/tokenizer.py b/nautilus_nlp/preprocessing/tokenizer.py new file mode 100644 index 0000000..94eb7aa --- /dev/null +++ b/nautilus_nlp/preprocessing/tokenizer.py @@ -0,0 +1,80 @@ +import nltk +from sacremoses import MosesTokenizer, MosesDetokenizer +import spacy +from spacy.lang.fr import French +from spacy.lang.en import English +import spacy.lang as spacylang +#nltk.download('punkt') + +try: + french_spacy = spacylang.fr.French() +except OSError: + raise OSError("""You must install French langage to use SpaCy. + python -m spacy download fr + See https://spacy.io/usage/ for details + """) +try: + english_spacy = spacylang.en.English() +except OSError: + raise OSError("""You must install english langage to use SpaCy. + python -m spacy download en + See https://spacy.io/usage/ for details + """) + + +def tokenize(text: str, lang_module: str = 'en_spacy'): + """ + Convert text to a list of tokens. + + Args: + lang_module ({'en_spacy', 'en_nltk', 'fr_spacy', 'fr_moses'}): choose + the tokenization module according to the langage and the implementation. + Recommanded: Spacy (faster, better results). To process other langages + import models.Spacy_models + + Returns: + list + """ + if lang_module is 'en_nltk': + return nltk.word_tokenize(text) + elif lang_module is 'en_spacy': + spacydoc = english_spacy(text) + return [tokens.text for tokens in spacydoc] + elif lang_module is 'fr_spacy': + spacydoc = french_spacy(text) + return [tokens.text for tokens in spacydoc] + elif lang_module is 'fr_moses': + t = MosesTokenizer(lang='fr') + return t.tokenize(text, escape=False) + + +def untokenize(tokens, lang='fr'): + ''' + Inputs a list of tokens output string. + ["J'", 'ai'] >>> "J' ai" + ''' + d = MosesDetokenizer(lang=lang) + text = d.detokenize(tokens, unescape=False) + return text + + +def _tokensToString(tokens_or_str): + if type(tokens_or_str) is str: + return tokens_or_str + elif type(tokens_or_str) is list: + return untokenize(tokens_or_str) + elif type(tokens_or_str) is None: + return '' + else: + raise ValueError('Please input string or tokens') + + +def _stringToTokens(tokens_or_str, lang_module='en_spacy'): + if type(tokens_or_str) is str: + return tokenize(tokens_or_str, lang_module=lang_module) + elif type(tokens_or_str) is list: + return tokens_or_str + elif type(tokens_or_str) is None: + return [] + else: + raise ValueError('Please input string or tokens') \ No newline at end of file From ed587191e3eea5f3c1ed72f729ac117569ee5d5d Mon Sep 17 00:00:00 2001 From: Robin <rdoume@gmail.com> Date: Fri, 3 May 2019 16:05:51 +0200 Subject: [PATCH 124/496] Naming & folder change --- nautilus_nlp/utils/text_vectorizer.py | 194 -------------------------- 1 file changed, 194 deletions(-) delete mode 100644 nautilus_nlp/utils/text_vectorizer.py diff --git a/nautilus_nlp/utils/text_vectorizer.py b/nautilus_nlp/utils/text_vectorizer.py deleted file mode 100644 index 4eca15f..0000000 --- a/nautilus_nlp/utils/text_vectorizer.py +++ /dev/null @@ -1,194 +0,0 @@ -import spacy -from gensim.corpora import Dictionary -from gensim.models.tfidfmodel import TfidfModel -from gensim import corpora, models, similarities -from gensim.matutils import sparse2full -import numpy as np -import math - -from sklearn.feature_extraction.text import TfidfVectorizer, TfidfTransformer - - -class Tfidf(object): - """ - Inputs a list of string - Outputs a tuple with the wordcount vector matrix, and the list of feature name - Params: - input=’content’, encoding=’utf-8’, decode_error=’strict’, strip_accents=None, - lowercase=True, preprocessor=None, tokenizer=None, analyzer=’word’, - stop_words=None, token_pattern=’(?u)\b\w\w+\b’, ngram_range=(1, 1), - max_df=1.0, min_df=1, max_features=None, vocabulary=None, binary=False, - dtype=<class ‘numpy.float64’>, norm=’l2’, use_idf=True, smooth_idf=True, sublinear_tf=False - Wrapper of https://scikit-learn.org/stable/modules/generated/sklearn.feature_extraction.text.TfidfVectorizer.html - """ - - def __init__(self, **kwargs): - self.tfidf_vectorizer = TfidfVectorizer(**kwargs) - - def _compute_wordcount_vector(self, documents): - ''' - Input a list of documents (string) - Output the wordcount vector matrix - ''' - self.word_count_vector = self.tfidf_vectorizer.fit_transform(documents) - return self.word_count_vector - - - def _get_features_name(self): - self.feature_names = self.tfidf_vectorizer.get_feature_names() - return self.feature_names - - - def _compute_idf(self): - self.tfidf_transformer=TfidfTransformer(smooth_idf=True, use_idf=True) - self.tfidf_transformer.fit(self.word_count_vector) - return self.word_count_vector - - - def compute_tfidf(self, documents): - self._compute_wordcount_vector(documents) - self._get_features_name() - self._compute_idf() - return self.word_count_vector - - def _apply_tfidf_to_doc(self, text): - '''generate tf-idf for the given document''' - return self.tfidf_transformer.transform(self.tfidf_vectorizer.transform([text])) - - - def _sort_coo(self, coo_matrix): - '''sort the tf-idf vectors by descending order of scores''' - tuples = zip(coo_matrix.col, coo_matrix.data) - return sorted(tuples, key=lambda x: (x[1], x[0]), reverse=True) - - - def _extract_topn_from_vector(self, feature_names, sorted_items, topn=10): - """get the feature names and tf-idf score of top n items""" - - #use only topn items from vector - sorted_items = sorted_items[:topn] - - score_vals = [] - feature_vals = [] - - # word index and corresponding tf-idf score - for idx, score in sorted_items: - - #keep track of feature name and its corresponding score - score_vals.append(round(score, 3)) - feature_vals.append(feature_names[idx]) - - #create a tuples of feature,score - #results = zip(feature_vals,score_vals) - results= {} - for idx in range(len(feature_vals)): - results[feature_vals[idx]]=score_vals[idx] - - return results - - - def get_top_tfidf_per_doc(self, text, n=10): - '''compute TF-IDF for a given doc, and returns a list of the top N weighted words''' - tf_idf_vector= self._apply_tfidf_to_doc(text) - sorted_items=self._sort_coo(tf_idf_vector.tocoo()) - return list(self._extract_topn_from_vector(self.feature_names, sorted_items, n).keys()) - - def get_top_tfidf(self, n=10): - '''returns a dict of the top N weighted words, with their weight''' - return self._extract_topn_from_vector(self.feature_names, self._sort_coo(self.word_count_vector.tocoo()), topn=n) - - -class Text_Vectorizer: - def __init__(self, doc_list): - # Initialize - self.doc_list = doc_list - self.nlp, self.docs, self.docs_dict = self._preprocess(self.doc_list) - - # Functions to lemmatise docs - def _keep_token(self, t): - return t.is_alpha and not (t.is_space or t.is_punct or t.is_stop or t.like_num) - - def _lemmatize_doc(self, doc): - return [t.lemma_ for t in doc if self._keep_token(t)] - - # Gensim to create a dictionary and filter out stop and infrequent words (lemmas). - def _get_docs_dict(self, docs): - docs_dict = Dictionary(docs) - # CAREFUL: For small corpus please carefully modify the parameters for filter_extremes, or simply comment it out. - docs_dict.filter_extremes(no_below=5, no_above=0.2) - docs_dict.compactify() - return docs_dict - - # Preprocess docs - def _preprocess(self, doc_list): - # Load spacy model - nlp = spacy.load("en") - # lemmatise docs - docs = [self._lemmatize_doc(nlp(doc)) for doc in doc_list] - # Get docs dictionary - docs_dict = self._get_docs_dict(docs) - return nlp, docs, docs_dict - - # Gensim can again be used to create a bag-of-words representation of each document, - # build the TF-IDF model, - # and compute the TF-IDF vector for each document. - def _get_tfidf(self, docs, docs_dict): - docs_corpus = [docs_dict.doc2bow(doc) for doc in docs] - model_tfidf = TfidfModel(docs_corpus, id2word=docs_dict) - docs_tfidf = model_tfidf[docs_corpus] - docs_vecs = np.vstack([sparse2full(c, len(docs_dict)) for c in docs_tfidf]) - return docs_vecs - - # Get avg w2v for one document - def _document_vector(self, doc, docs_dict, nlp): - # remove out-of-vocabulary words - doc_vector = [nlp(word).vector for word in doc if word in docs_dict.token2id] - return np.mean(doc_vector, axis=0) - - - # Get average vector for document list - def avg_wv(self): - docs_vecs = np.vstack( - [self._document_vector(doc, self.docs_dict, self.nlp) for doc in self.docs] - ) - return docs_vecs - - # Get TF-IDF vector for document list - def get_tfidf(self): - docs_corpus = [self.docs_dict.doc2bow(doc) for doc in self.docs] - model_tfidf = TfidfModel(docs_corpus, id2word=self.docs_dict) - docs_tfidf = model_tfidf[docs_corpus] - docs_vecs = np.vstack([sparse2full(c, len(self.docs_dict)) for c in docs_tfidf]) - return docs_vecs - - # Get Latent Semantic Indexing(LSI) vector for document list - def get_lsi(self, num_topics=300): - docs_corpus = [self.docs_dict.doc2bow(doc) for doc in self.docs] - model_lsi = models.LsiModel(docs_corpus, num_topics, id2word=self.docs_dict) - docs_lsi = model_lsi[docs_corpus] - docs_vecs = np.vstack([sparse2full(c, len(self.docs_dict)) for c in docs_lsi]) - return docs_vecs - - # Get Random Projections(RP) vector for document list - def get_rp(self): - docs_corpus = [self.docs_dict.doc2bow(doc) for doc in self.docs] - model_rp = models.RpModel(docs_corpus, id2word=self.docs_dict) - docs_rp = model_rp[docs_corpus] - docs_vecs = np.vstack([sparse2full(c, len(self.docs_dict)) for c in docs_rp]) - return docs_vecs - - # Get Latent Dirichlet Allocation(LDA) vector for document list - def get_lda(self, num_topics=100): - docs_corpus = [self.docs_dict.doc2bow(doc) for doc in self.docs] - model_lda = models.LdaModel(docs_corpus, num_topics, id2word=self.docs_dict) - docs_lda = model_lda[docs_corpus] - docs_vecs = np.vstack([sparse2full(c, len(self.docs_dict)) for c in docs_lda]) - return docs_vecs - - # Get Hierarchical Dirichlet Process(HDP) vector for document list - def get_hdp(self): - docs_corpus = [self.docs_dict.doc2bow(doc) for doc in self.docs] - model_hdp = models.HdpModel(docs_corpus, id2word=self.docs_dict) - docs_hdp = model_hdp[docs_corpus] - docs_vecs = np.vstack([sparse2full(c, len(self.docs_dict)) for c in docs_hdp]) - return docs_vecs From 4248d7c003ea290cdb84316d71289d8529c11105 Mon Sep 17 00:00:00 2001 From: Robin <rdoume@gmail.com> Date: Fri, 3 May 2019 16:05:55 +0200 Subject: [PATCH 125/496] Naming & folder change --- nautilus_nlp/utils/text_vectorizers.py | 195 ------------------------- 1 file changed, 195 deletions(-) delete mode 100644 nautilus_nlp/utils/text_vectorizers.py diff --git a/nautilus_nlp/utils/text_vectorizers.py b/nautilus_nlp/utils/text_vectorizers.py deleted file mode 100644 index a03c5bb..0000000 --- a/nautilus_nlp/utils/text_vectorizers.py +++ /dev/null @@ -1,195 +0,0 @@ -import spacy -from gensim.corpora import Dictionary -from gensim.models.tfidfmodel import TfidfModel -from gensim import corpora, models, similarities -from gensim.matutils import sparse2full -import numpy as np -import math - -from sklearn.feature_extraction.text import TfidfVectorizer, TfidfTransformer - - -class Tfidf(object): - """ - Inputs a list of string - Outputs a tuple with the wordcount vector matrix, and the list of feature name - Params: - input=’content’, encoding=’utf-8’, decode_error=’strict’, strip_accents=None, - lowercase=True, preprocessor=None, tokenizer=None, analyzer=’word’, - stop_words=None, token_pattern=’(?u)\b\w\w+\b’, ngram_range=(1, 1), - max_df=1.0, min_df=1, max_features=None, vocabulary=None, binary=False, - dtype=<class ‘numpy.float64’>, norm=’l2’, use_idf=True, smooth_idf=True, sublinear_tf=False - - Wrapper of https://scikit-learn.org/stable/modules/generated/sklearn.feature_extraction.text.TfidfVectorizer.html - """ - - def __init__(self, **kwargs): - self.tfidf_vectorizer = TfidfVectorizer(**kwargs) - - def _compute_wordcount_vector(self, documents): - ''' - Input a list of documents (string) - Output the wordcount vector matrix - ''' - self.word_count_vector = self.tfidf_vectorizer.fit_transform(documents) - return self.word_count_vector - - - def _get_features_name(self): - self.feature_names = self.tfidf_vectorizer.get_feature_names() - return self.feature_names - - - def _compute_idf(self): - self.tfidf_transformer=TfidfTransformer(smooth_idf=True, use_idf=True) - self.tfidf_transformer.fit(self.word_count_vector) - return self.word_count_vector - - - def compute_tfidf(self, documents): - self._compute_wordcount_vector(documents) - self._get_features_name() - self._compute_idf() - return self.word_count_vector - - def _apply_tfidf_to_doc(self, text): - '''generate tf-idf for the given document''' - return self.tfidf_transformer.transform(self.tfidf_vectorizer.transform([text])) - - - def _sort_coo(self, coo_matrix): - '''sort the tf-idf vectors by descending order of scores''' - tuples = zip(coo_matrix.col, coo_matrix.data) - return sorted(tuples, key=lambda x: (x[1], x[0]), reverse=True) - - - def _extract_topn_from_vector(self, feature_names, sorted_items, topn=10): - """get the feature names and tf-idf score of top n items""" - - #use only topn items from vector - sorted_items = sorted_items[:topn] - - score_vals = [] - feature_vals = [] - - # word index and corresponding tf-idf score - for idx, score in sorted_items: - - #keep track of feature name and its corresponding score - score_vals.append(round(score, 3)) - feature_vals.append(feature_names[idx]) - - #create a tuples of feature,score - #results = zip(feature_vals,score_vals) - results= {} - for idx in range(len(feature_vals)): - results[feature_vals[idx]]=score_vals[idx] - - return results - - - def get_top_tfidf_per_doc(self, text, n=10): - '''compute TF-IDF for a given doc, and returns a list of the top N weighted words''' - tf_idf_vector= self._apply_tfidf_to_doc(text) - sorted_items=self._sort_coo(tf_idf_vector.tocoo()) - return list(self._extract_topn_from_vector(self.feature_names, sorted_items, n).keys()) - - def get_top_tfidf(self, n=10): - '''returns a dict of the top N weighted words, with their weight''' - return self._extract_topn_from_vector(self.feature_names, self._sort_coo(self.word_count_vector.tocoo()), topn=n) - - -class Text_Vectorizer: - def __init__(self, doc_list): - # Initialize - self.doc_list = doc_list - self.nlp, self.docs, self.docs_dict = self._preprocess(self.doc_list) - - # Functions to lemmatise docs - def _keep_token(self, t): - return t.is_alpha and not (t.is_space or t.is_punct or t.is_stop or t.like_num) - - def _lemmatize_doc(self, doc): - return [t.lemma_ for t in doc if self._keep_token(t)] - - # Gensim to create a dictionary and filter out stop and infrequent words (lemmas). - def _get_docs_dict(self, docs): - docs_dict = Dictionary(docs) - # CAREFUL: For small corpus please carefully modify the parameters for filter_extremes, or simply comment it out. - docs_dict.filter_extremes(no_below=5, no_above=0.2) - docs_dict.compactify() - return docs_dict - - # Preprocess docs - def _preprocess(self, doc_list): - # Load spacy model - nlp = spacy.load("en") - # lemmatise docs - docs = [self._lemmatize_doc(nlp(doc)) for doc in doc_list] - # Get docs dictionary - docs_dict = self._get_docs_dict(docs) - return nlp, docs, docs_dict - - # Gensim can again be used to create a bag-of-words representation of each document, - # build the TF-IDF model, - # and compute the TF-IDF vector for each document. - def _get_tfidf(self, docs, docs_dict): - docs_corpus = [docs_dict.doc2bow(doc) for doc in docs] - model_tfidf = TfidfModel(docs_corpus, id2word=docs_dict) - docs_tfidf = model_tfidf[docs_corpus] - docs_vecs = np.vstack([sparse2full(c, len(docs_dict)) for c in docs_tfidf]) - return docs_vecs - - # Get avg w2v for one document - def _document_vector(self, doc, docs_dict, nlp): - # remove out-of-vocabulary words - doc_vector = [nlp(word).vector for word in doc if word in docs_dict.token2id] - return np.mean(doc_vector, axis=0) - - - # Get average vector for document list - def avg_wv(self): - docs_vecs = np.vstack( - [self._document_vector(doc, self.docs_dict, self.nlp) for doc in self.docs] - ) - return docs_vecs - - # Get TF-IDF vector for document list - def get_tfidf(self): - docs_corpus = [self.docs_dict.doc2bow(doc) for doc in self.docs] - model_tfidf = TfidfModel(docs_corpus, id2word=self.docs_dict) - docs_tfidf = model_tfidf[docs_corpus] - docs_vecs = np.vstack([sparse2full(c, len(self.docs_dict)) for c in docs_tfidf]) - return docs_vecs - - # Get Latent Semantic Indexing(LSI) vector for document list - def get_lsi(self, num_topics=300): - docs_corpus = [self.docs_dict.doc2bow(doc) for doc in self.docs] - model_lsi = models.LsiModel(docs_corpus, num_topics, id2word=self.docs_dict) - docs_lsi = model_lsi[docs_corpus] - docs_vecs = np.vstack([sparse2full(c, len(self.docs_dict)) for c in docs_lsi]) - return docs_vecs - - # Get Random Projections(RP) vector for document list - def get_rp(self): - docs_corpus = [self.docs_dict.doc2bow(doc) for doc in self.docs] - model_rp = models.RpModel(docs_corpus, id2word=self.docs_dict) - docs_rp = model_rp[docs_corpus] - docs_vecs = np.vstack([sparse2full(c, len(self.docs_dict)) for c in docs_rp]) - return docs_vecs - - # Get Latent Dirichlet Allocation(LDA) vector for document list - def get_lda(self, num_topics=100): - docs_corpus = [self.docs_dict.doc2bow(doc) for doc in self.docs] - model_lda = models.LdaModel(docs_corpus, num_topics, id2word=self.docs_dict) - docs_lda = model_lda[docs_corpus] - docs_vecs = np.vstack([sparse2full(c, len(self.docs_dict)) for c in docs_lda]) - return docs_vecs - - # Get Hierarchical Dirichlet Process(HDP) vector for document list - def get_hdp(self): - docs_corpus = [self.docs_dict.doc2bow(doc) for doc in self.docs] - model_hdp = models.HdpModel(docs_corpus, id2word=self.docs_dict) - docs_hdp = model_hdp[docs_corpus] - docs_vecs = np.vstack([sparse2full(c, len(self.docs_dict)) for c in docs_hdp]) - return docs_vecs From 298c1366c231c7cfaa82e1689bc71b27a037e385 Mon Sep 17 00:00:00 2001 From: wil2210 <43743095+wil2210@users.noreply.github.com> Date: Fri, 3 May 2019 16:12:16 +0200 Subject: [PATCH 126/496] Wj topic (#81) * script install mallet and java jdk + mallet added * mallet and java added to the docker file * mallet and java installation added to travis.yml * Pyldavis mallet implementation added to viz func * pyldavis mallet * Update requirements.txt * Update requirements.txt * Update .travis.yml --- .travis.yml | 2 + README.md | 12 +++ docker/Dockerfile | 9 ++ nautilus_nlp/models/topic_modeling.py | 118 +++++++++++++++---------- nautilus_nlp/scripts/install_java.sh | 4 + nautilus_nlp/scripts/install_mallet.sh | 4 + requirements.txt | 3 +- 7 files changed, 105 insertions(+), 47 deletions(-) create mode 100644 nautilus_nlp/scripts/install_java.sh create mode 100644 nautilus_nlp/scripts/install_mallet.sh diff --git a/.travis.yml b/.travis.yml index 2d7b62b..4f7da47 100644 --- a/.travis.yml +++ b/.travis.yml @@ -8,6 +8,8 @@ before_script: - git clone https://github.com/facebookresearch/fastText.git && cd fastText && pip install . && cd .. && ls - python3 -m spacy download fr && python3 -m spacy download en && python3 -m spacy download de && python3 -m spacy download nl && python3 -m spacy download it && python3 -m spacy download xx && python3 -m spacy validate + - wget http://mallet.cs.umass.edu/dist/mallet-2.0.8.zip && unzip mallet-2.0.8.zip && rm mallet-2.0.8.zip + - sudo add-apt-repository -y ppa:openjdk-r/ppa && sudo apt update && apt search openjdk && sudo apt install openjdk-8-jdk install: - pip install -r requirements.txt diff --git a/README.md b/README.md index c969983..0a16439 100644 --- a/README.md +++ b/README.md @@ -77,6 +77,18 @@ run: `bash nautilus_nlp/scripts/download_ft_langdetect.sh` +### Install Mallet + +1) Install Mallet file +run: + +`bash nautilus_nlp/scripts/install_mallet.sh` + +2) Install Java JDK (required to implement mallet) +run: + +`bash nautilus_nlp/scripts/install_java.sh` + # Notebooks The [notebook](notebooks/) folder contains various notebook on how to use this library. diff --git a/docker/Dockerfile b/docker/Dockerfile index 1341d7b..8530975 100644 --- a/docker/Dockerfile +++ b/docker/Dockerfile @@ -32,6 +32,15 @@ RUN pip3 install pandas schedule nltk pendulum bounter spacy==2.1 jupyterlab co RUN python3 -m spacy download fr && python3 -m spacy download en && python3 -m spacy download de && python3 -m spacy download it && python3 -m spacy download xx && python3 -m spacy validate RUN python3 -m nltk.downloader stopwords +RUN wget http://mallet.cs.umass.edu/dist/mallet-2.0.8.zip + unzip mallet-2.0.8.zip + rm mallet-2.0.8.zip + +RUN sudo add-apt-repository ppa:openjdk-r/ppa # only Ubuntu 17.4 and earlier + sudo apt update + apt search openjdk + sudo apt install openjdk-8-jdk + RUN echo "alias python='python3'" >> .bash_aliases RUN echo "alias pip='pip3' ">> ~/.bash_aliases RUN source ~/.bashrc diff --git a/nautilus_nlp/models/topic_modeling.py b/nautilus_nlp/models/topic_modeling.py index ff494fb..6fcbda0 100644 --- a/nautilus_nlp/models/topic_modeling.py +++ b/nautilus_nlp/models/topic_modeling.py @@ -3,8 +3,8 @@ import os import pyLDAvis import pyLDAvis.gensim -pyLDAvis.enable_notebook() from gensim.models import CoherenceModel +from gensim.models.wrappers import LdaMallet import matplotlib.pyplot as plt from IPython.display import HTML @@ -65,6 +65,8 @@ def compute_coherence_values(dictionary, bow_corpus, texts, limit=25, start=2, s """ Compute c_v coherence for various number of topics + /!\ It takes a really long time. + Parameters: ---------- dictionary : Gensim dictionary @@ -124,86 +126,108 @@ def print_coherence_scores(coherence_values, start=2, limit=25, step=4): print("Num Topics =", m, " has Coherence Value of", round(cv, 4)) -### Gensim LdaModel +### LdaModel: Gensim & Mallet -def train_lda_model(bow_corpus, dictionary, num_topics, **kwargs): - """ Train the model on the corpus +def train_lda_model(bow_corpus, dictionary, num_topics, model='gensim', mallet_path=None, **kwargs): + """ Train the lda model on the corpus Parameters ---------- - bow_corpus : iterable of list of tokens. - dictionary: corpora.Dictionary. Dictionary encapsulates the mapping between normalized words and their integer ids. + bow_corpus : iterable of list of tokens. Stream of document vectors or sparse matrix of shape (num_terms, num_documents). + dictionary: corpora.Dictionary. Mapping from word IDs to words num_topics: int + model : str. Precise the topic modeling model wanted, must be "gensim" or "mallet" + mallet_path: str, optionnal if model='gensim', required if model='mallet'. Path to the mallet-2.0.8 file Returns ------- gensim.ldamodel """ + if model == 'gensim': + model = train_lda_gensim(bow_corpus, dictionary, num_topics, **kwargs) + elif model == 'mallet': + if mallet_path is None: + raise ValueError('You must precise the path to the mallet-2.0.8 file that has been downloaded before') + else: + model = train_lda_mallet(bow_corpus, dictionary, num_topics, mallet_path, **kwargs) + else: + raise ValueError('Please enter a valid model name: gensim or mallet') + return model + +def train_lda_gensim(bow_corpus, dictionary, num_topics, **kwargs): + model = gensim.models.ldamodel.LdaModel(corpus=bow_corpus, id2word=dictionary, num_topics=num_topics, passes=10, minimum_probability=0.001, random_state=0, **kwargs) return model +def train_lda_mallet(bow_corpus, dictionary, num_topics, mallet_path, **kwargs): + + os.environ['MALLET_PATH'] = mallet_path + mallet = '$MALLET_PATH/mallet-2.0.8/bin/mallet' + model = gensim.models.wrappers.LdaMallet(mallet, corpus=bow_corpus, id2word=dictionary, num_topics=num_topics, prefix='composant', random_seed=0, **kwargs) + return model + -def save_model(model, model_path, model_name): - """ Save the model that has been trained +def save_model(model, model_name): + """ Save the model that has been trained. The model will be saved on your current emplacement. Parameters ---------- model: ldamodel - MODELNAME: str + model_name: str. Name the model that will be saved """ - return model.save(os.path.join(model_path,model_name)) + return model.save(os.path.join(model_name)) -def load_model(model_path,model_name): +def load_model(model_path,model_name, model='gensim', model_prefix='composant'): ''' - model_path: path where the model has been saved - model_name: name of the saved model + model : str. Precise the topic modeling model wanted, must be "gensim" or "mallet" + model_path: str. path where the model has been saved + model_name: str. name of the saved model + model_prefix: str. By default, 'composant' default prefix used while saving the mallet model with train_lda_model function. ''' - ldamodel = gensim.models.LdaModel.load(os.path.join(model_path,model_name)) + if model =='gensim': + ldamodel = gensim.models.LdaModel.load(os.path.join(model_path,model_name)) + elif model =='mallet': + ldamodel = LdaMallet.load(os.path.join(model_path,model_name)) + if model_prefix is not None: + ldamodel.prefix = model_path+'/'+ model_prefix + else: + raise ValueError('Please enter a valid model name: gensim or mallet') return ldamodel def fit_data(model, bow): """Test the model on new, unseen documents""" return model[bow] -### Gensim LdaMallet -def load_mallet_model(model_path, model_name, model_prefix=None): - ''' - model_prefix: prefix used while saving the model - model_name: name of the saved model - ''' - ldamodel = LdaMallet.load(os.path.join(model_path,model_name)) - if model_prefix is not None: - ldamodel.prefix = model_path+'/'+ model_prefix - return ldamodel +# Visualization (only for gensim implementation for now) -def train_mallet_model(mallet_path, bow_corpus, dictionary, num_topics, **kwargs): - """ Train the model on the corpus - - Parameters - ---------- - mallet_path: path to mallet files - bow_corpus : iterable of list of tokens. Stream of document vectors or sparse matrix of shape (num_terms, num_documents).$ - dictionary: corpora.Dictionary. Mapping from word IDs to words - num_topics: int - - Returns - ------- - gensim.ldamodel - """ - model = gensim.models.wrappers.LdaMallet(mallet_path, corpus=bow_corpus, id2word=dictionary, num_topics=num_topics, prefix='nautil') - return model - -# Visualization - - -def visualize_topics(model, bow_corpus, dictionary): +def visualize_topics(model, bow_corpus, dictionary, model_type=None): """ Visualize the topics-keywords with the pyLDAvis interactive chart. (Work well in notebook) + + Parameters + ---------- + model: LDA model: gensim or mallet + bow_corpus : iterable of list of tokens. + dictionary: corpora.Dictionary. Dictionary encapsulates the mapping between normalized words and their integer ids. + model : str. Precise the topic modeling model used, must be "gensim" or "mallet" + + Returns: + ---------- + 3D interactive chart + """ - return pyLDAvis.gensim.prepare(model, bow_corpus, dictionary) + if model_type == 'mallet': + model_vis = gensim.models.wrappers.ldamallet.malletmodel2ldamodel(model) + elif model_type == 'gensim': + model_vis = model + elif model_type is None: + raise ValueError('You forgot to precise your model type, it must be: gensim or mallet') + else: + raise ValueError('Please enter a valid model name: gensim or mallet') + return pyLDAvis.gensim.prepare(model_vis, bow_corpus, dictionary) def save_pyldavis(pyldavis, vis_path, vis_name): """ Save the pyldavis interactive chart @@ -224,6 +248,8 @@ def show_pyldavis(vis_path, vis_name): def show_dominant_topic(model, bow_corpus, topic_number=1, topn=5): """ Print the dominant topics in the document, its score and the topics' top keywords. + Quick way to interpret the topics + Parameters ---------- diff --git a/nautilus_nlp/scripts/install_java.sh b/nautilus_nlp/scripts/install_java.sh new file mode 100644 index 0000000..648abf3 --- /dev/null +++ b/nautilus_nlp/scripts/install_java.sh @@ -0,0 +1,4 @@ +sudo add-apt-repository ppa:openjdk-r/ppa # only Ubuntu 17.4 and earlier +sudo apt update +apt search openjdk +sudo apt install openjdk-8-jdk \ No newline at end of file diff --git a/nautilus_nlp/scripts/install_mallet.sh b/nautilus_nlp/scripts/install_mallet.sh new file mode 100644 index 0000000..99d2af5 --- /dev/null +++ b/nautilus_nlp/scripts/install_mallet.sh @@ -0,0 +1,4 @@ +#!/bin/bash +wget http://mallet.cs.umass.edu/dist/mallet-2.0.8.zip +unzip mallet-2.0.8.zip +rm mallet-2.0.8.zip \ No newline at end of file diff --git a/requirements.txt b/requirements.txt index 5870746..3ec0a3a 100644 --- a/requirements.txt +++ b/requirements.txt @@ -34,7 +34,8 @@ textacy==0.6.3 gensim==3.7.1 scikit_learn==0.20.3 vaderSentiment==3.2.1 - google-compute-engine==2.8.13 flashtext==2.7 + + From 7ed11802186e91a965de2ddcd74aaf5dc247ac8b Mon Sep 17 00:00:00 2001 From: Robin <rdoume@gmail.com> Date: Fri, 3 May 2019 16:14:42 +0200 Subject: [PATCH 127/496] Delete python2 support in compat.py --- nautilus_nlp/utils/compat.py | 49 +++++++++++------------------------- 1 file changed, 14 insertions(+), 35 deletions(-) diff --git a/nautilus_nlp/utils/compat.py b/nautilus_nlp/utils/compat.py index 4efa183..31d04d6 100644 --- a/nautilus_nlp/utils/compat.py +++ b/nautilus_nlp/utils/compat.py @@ -7,43 +7,22 @@ is_linux = sys.platform.startswith("linux") is_osx = sys.platform == "darwin" -if is_python2: - import cPickle as pickle - from backports import csv - from itertools import izip as zip_ - from urlparse import urljoin - range_ = xrange +import csv +import pickle +from builtins import zip as zip_ +from urllib.parse import urljoin - bytes_ = str - unicode_ = unicode - string_types = (str, unicode) - int_types = (int, long) - chr_ = unichr +range_ = range - def unicode_to_bytes(s, encoding="utf8", errors="strict"): - return s.encode(encoding=encoding, errors=errors) +bytes_ = bytes +unicode_ = str +string_types = (bytes, str) +int_types = (int,) +chr_ = chr - def bytes_to_unicode(b, encoding="utf8", errors="strict"): - return unicode_(b, encoding=encoding, errors=errors) +def unicode_to_bytes(s, encoding="utf8", errors="strict"): + return s.encode(encoding=encoding, errors=errors) - -else: - import csv - import pickle - from builtins import zip as zip_ - from urllib.parse import urljoin - - range_ = range - - bytes_ = bytes - unicode_ = str - string_types = (bytes, str) - int_types = (int,) - chr_ = chr - - def unicode_to_bytes(s, encoding="utf8", errors="strict"): - return s.encode(encoding=encoding, errors=errors) - - def bytes_to_unicode(b, encoding="utf8", errors="strict"): - return b.decode(encoding=encoding, errors=errors) +def bytes_to_unicode(b, encoding="utf8", errors="strict"): + return b.decode(encoding=encoding, errors=errors) From 4e22bf755e86780a837983727202d0085f14b710 Mon Sep 17 00:00:00 2001 From: hugovasselin <waaaouu@gmail.com> Date: Fri, 3 May 2019 16:18:50 +0200 Subject: [PATCH 128/496] remove preprocess --- nautilus_nlp/preprocess/__init__.py | 0 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 nautilus_nlp/preprocess/__init__.py diff --git a/nautilus_nlp/preprocess/__init__.py b/nautilus_nlp/preprocess/__init__.py deleted file mode 100644 index e69de29..0000000 From 04b2cbc165a570e1fba6122b9def61592d8072f1 Mon Sep 17 00:00:00 2001 From: hugovasselin <waaaouu@gmail.com> Date: Fri, 3 May 2019 16:29:04 +0200 Subject: [PATCH 129/496] rename script --- nautilus_nlp/preprocessing/{lemmatizer.py => lemmatization.py} | 0 nautilus_nlp/preprocessing/{stemmer.py => stemming.py} | 0 2 files changed, 0 insertions(+), 0 deletions(-) rename nautilus_nlp/preprocessing/{lemmatizer.py => lemmatization.py} (100%) rename nautilus_nlp/preprocessing/{stemmer.py => stemming.py} (100%) diff --git a/nautilus_nlp/preprocessing/lemmatizer.py b/nautilus_nlp/preprocessing/lemmatization.py similarity index 100% rename from nautilus_nlp/preprocessing/lemmatizer.py rename to nautilus_nlp/preprocessing/lemmatization.py diff --git a/nautilus_nlp/preprocessing/stemmer.py b/nautilus_nlp/preprocessing/stemming.py similarity index 100% rename from nautilus_nlp/preprocessing/stemmer.py rename to nautilus_nlp/preprocessing/stemming.py From 3f465c0d2c1ff53a6a2f4cf7b73412d96cbb8851 Mon Sep 17 00:00:00 2001 From: hugovasselin <waaaouu@gmail.com> Date: Fri, 3 May 2019 16:42:10 +0200 Subject: [PATCH 130/496] add whitespace to remove EOL --- nautilus_nlp/preprocessing/preprocess.py | 26 ++++++++++++++---------- 1 file changed, 15 insertions(+), 11 deletions(-) diff --git a/nautilus_nlp/preprocessing/preprocess.py b/nautilus_nlp/preprocessing/preprocess.py index 70d8148..2ff6231 100644 --- a/nautilus_nlp/preprocessing/preprocess.py +++ b/nautilus_nlp/preprocessing/preprocess.py @@ -1,10 +1,5 @@ # -*- coding: utf-8 -*- -""" -Functions that modify raw text *in-place*, replacing contractions, URLs, emails, -phone numbers, and currency symbols with standardized forms. These should be -applied before processing by `Spacy <http://spacy.io>`_, but be warned: preprocessing -may affect the interpretation of the text -- and spacy's processing of it. -""" + from __future__ import absolute_import, division, print_function, unicode_literals import os @@ -24,13 +19,19 @@ def remove_multiple_spaces_and_strip_text(text): - """Remove multiple spaces, strip text, and remove '-', '*' characters. + """ + Remove multiple spaces, strip text, and remove '-', '*' characters. + Parameters ---------- - text : str, + text : str + the text to be processed + Returns ------- - str + string + the text with removed multiple spaces and strip text + """ regex_remove_multiple_spaces_list = ["\\t", "[\\s\\-\\*]{2,}"] for regex_remove_multiple_spaces in regex_remove_multiple_spaces_list: @@ -40,15 +41,18 @@ def remove_multiple_spaces_and_strip_text(text): def remove_EOL_characters(text): - """Remove end of line (\n) char. + """ + Remove end of line (\n) char. + Parameters ---------- text : str, + Returns ------- str """ - return text.replace("\n", "") + return text.replace("\n", " ") def remove_tokens_with_nonletters(tokens): From 6cbd4ef10ff1a43f292e9adac256761a3e9d519c Mon Sep 17 00:00:00 2001 From: hugovasselin <waaaouu@gmail.com> Date: Fri, 3 May 2019 16:42:26 +0200 Subject: [PATCH 131/496] add test remove EOL --- tests/test_preprocessor.py | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/tests/test_preprocessor.py b/tests/test_preprocessor.py index c1c797a..ed7df1b 100644 --- a/tests/test_preprocessor.py +++ b/tests/test_preprocessor.py @@ -4,6 +4,7 @@ remove_multiple_spaces_and_strip_text, remove_accents, fix_bad_unicode, + remove_EOL_characters ) @@ -21,6 +22,17 @@ def test_remove_multiple_spaces_and_strip_text(input_str, expected_str): result = remove_multiple_spaces_and_strip_text(input_str) np.testing.assert_string_equal(result, expected_str) +@pytest.mark.parametrize( + "input_str, expected_str", + [ + ("\nhello world", " hello world"), + ("hello\nworld", "hello world"), + ("hello world\n", "hello world ") + ], +) +def test_remove_EOL_characters(input_str, expected_str): + result = remove_EOL_characters(input_str) + np.testing.assert_string_equal(result, expected_str) def test_remove_accents(): input_str = "éèëêàù" From 68bcb237fa6b6eb3caf94a203820da535a34f5ee Mon Sep 17 00:00:00 2001 From: Robin <rdoume@gmail.com> Date: Fri, 3 May 2019 16:44:01 +0200 Subject: [PATCH 132/496] Update tests after file normalization --- tests/test_doc.py | 2 +- tests/test_fix_bad_encoding.py | 2 +- tests/test_language_detection.py | 4 ++-- tests/test_preprocessor.py | 2 +- 4 files changed, 5 insertions(+), 5 deletions(-) diff --git a/tests/test_doc.py b/tests/test_doc.py index 5326226..1354f89 100644 --- a/tests/test_doc.py +++ b/tests/test_doc.py @@ -4,7 +4,7 @@ import pytest import random import spacy -from nautilus_nlp.models.Language_detector import LangDetector +from nautilus_nlp.models.language_detector import LangDetector from nautilus_nlp.doc import Doc, NautilusMissingModelException TEXT_1 = """ diff --git a/tests/test_fix_bad_encoding.py b/tests/test_fix_bad_encoding.py index cb3aa93..a2a14ea 100644 --- a/tests/test_fix_bad_encoding.py +++ b/tests/test_fix_bad_encoding.py @@ -1,7 +1,7 @@ import pytest import numpy as np -from nautilus_nlp.utils.preprocess import fix_bad_unicode +from nautilus_nlp.preprocessing.preprocess import fix_bad_unicode diff --git a/tests/test_language_detection.py b/tests/test_language_detection.py index 1796359..d2b4260 100644 --- a/tests/test_language_detection.py +++ b/tests/test_language_detection.py @@ -1,8 +1,8 @@ -from nautilus_nlp.models import Language_detector +from nautilus_nlp.models import language_detector import pytest import numpy as np -model = Language_detector.LangDetector() +model = language_detector.LangDetector() TEXT_1 = """Кипрская война (итал. Guerra di Cipro; тур. Kıbrıs Savaşı) — одна из нескольких войн между Османской империей и Венецианской республикой за господство в Восточном Средиземноморье. Сначала Венеция воевала с османами одна. Затем, когда сформировалась Священная лига (в которую помимо Венеции входили Испания с Неаполем и Сицилией, Республика Генуя, Герцогство Савойское, госпитальеры, Великое герцогство Тосканское и другие итальянские государства), Османская империя воевала уже против Лиги.""" TEXT_2 = """ diff --git a/tests/test_preprocessor.py b/tests/test_preprocessor.py index c1c797a..59281a3 100644 --- a/tests/test_preprocessor.py +++ b/tests/test_preprocessor.py @@ -1,6 +1,6 @@ import pytest import numpy as np -from nautilus_nlp.utils.preprocess import ( +from nautilus_nlp.preprocessing.preprocess import ( remove_multiple_spaces_and_strip_text, remove_accents, fix_bad_unicode, From 053fab06fbf1209540c2c4dd7ef5407c45179b1c Mon Sep 17 00:00:00 2001 From: Robin <rdoume@gmail.com> Date: Fri, 3 May 2019 16:44:05 +0200 Subject: [PATCH 133/496] Update tests after file normalization --- tests/tests_extraction.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/tests_extraction.py b/tests/tests_extraction.py index 293aef5..461e801 100644 --- a/tests/tests_extraction.py +++ b/tests/tests_extraction.py @@ -1,4 +1,4 @@ -from nautilus_nlp.utils.keyword_extractor import extract_keywords +from nautilus_nlp.preprocessing.keyword_extractor import extract_keywords str_="""Les moteurs de recherche tels Google, Exalead ou Yahoo! sont des applications très connues de fouille de textes sur de grandes masses de données. From 63a1efa2df228c47d1fce036dc44f795cee69f35 Mon Sep 17 00:00:00 2001 From: Robin <rdoume@gmail.com> Date: Fri, 3 May 2019 16:48:36 +0200 Subject: [PATCH 134/496] m preprocess modify --- nautilus_nlp/preprocessing/preprocess.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/nautilus_nlp/preprocessing/preprocess.py b/nautilus_nlp/preprocessing/preprocess.py index 70d8148..ac716e1 100644 --- a/nautilus_nlp/preprocessing/preprocess.py +++ b/nautilus_nlp/preprocessing/preprocess.py @@ -16,7 +16,7 @@ from stop_words import get_stop_words as _get_stop_words from stop_words import LANGUAGE_MAPPING as _LANGUAGE_MAPPING -from . import constants +from nautilus_nlp.utils import constants from nautilus_nlp.config.config import ROOT_FOLDER from nautilus_nlp.utils.file_loader import documents_loader From 9a331fe6f2864d3762770ad76b6dea6c24463bcc Mon Sep 17 00:00:00 2001 From: Robin <rdoume@gmail.com> Date: Fri, 3 May 2019 16:48:53 +0200 Subject: [PATCH 135/496] m preprocess modify --- nautilus_nlp/utils/constants.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/nautilus_nlp/utils/constants.py b/nautilus_nlp/utils/constants.py index ce0be93..b694acf 100644 --- a/nautilus_nlp/utils/constants.py +++ b/nautilus_nlp/utils/constants.py @@ -9,7 +9,7 @@ import sys import unicodedata -from . import compat +from . import compat from . import file_loader as util From 39fcab294af9bf49bf6615b968a3e78590ca58b8 Mon Sep 17 00:00:00 2001 From: Robin <rdoume@gmail.com> Date: Fri, 3 May 2019 17:24:22 +0200 Subject: [PATCH 136/496] typo on filename tests_extraction --- tests/{tests_extraction.py => test_extraction.py} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename tests/{tests_extraction.py => test_extraction.py} (100%) diff --git a/tests/tests_extraction.py b/tests/test_extraction.py similarity index 100% rename from tests/tests_extraction.py rename to tests/test_extraction.py From 7d17dcfb310b32a39f20c78bf25f9173a866060a Mon Sep 17 00:00:00 2001 From: hugovasselin <waaaouu@gmail.com> Date: Fri, 3 May 2019 18:33:20 +0200 Subject: [PATCH 137/496] add unit tests --- tests/test_preprocessor.py | 27 ++++++++++++++++++++++++++- 1 file changed, 26 insertions(+), 1 deletion(-) diff --git a/tests/test_preprocessor.py b/tests/test_preprocessor.py index ed7df1b..0bdf8a0 100644 --- a/tests/test_preprocessor.py +++ b/tests/test_preprocessor.py @@ -4,7 +4,10 @@ remove_multiple_spaces_and_strip_text, remove_accents, fix_bad_unicode, - remove_EOL_characters + remove_EOL_characters, + remove_tokens_with_nonletters, + remove_special_caracters_from_tokenslist, + get_stopwords ) @@ -34,6 +37,28 @@ def test_remove_EOL_characters(input_str, expected_str): result = remove_EOL_characters(input_str) np.testing.assert_string_equal(result, expected_str) + +def test_remove_tokens_with_nonletters(): + input_tokens = ['foo','bar','124','34euros'] + expected_output = ['foo','bar'] + result = remove_tokens_with_nonletters(input_tokens) + np.testing.assert_array_equal(result,expected_output) + + +def test_remove_special_caracters_from_tokenslist(): + input_tokens = ['foo','bar','---',"'s",'#'] + expected_output = ['foo','bar',"'s"] + result = remove_tokens_with_nonletters(input_tokens) + np.testing.assert_array_equal(result,expected_output) + + +def test_get_stopwords(): + languages_to_test = ['fr','en','ga','zh'] + for lang in languages_to_test: + result = get_stopwords(lang) + assert len(result) > 0 and type(result) == list + + def test_remove_accents(): input_str = "éèëêàù" expected_str = "eeeeau" From d613b7aea8b70a3becbd0aaa77c4dc6a11dd0760 Mon Sep 17 00:00:00 2001 From: hugovasselin <waaaouu@gmail.com> Date: Fri, 3 May 2019 18:33:35 +0200 Subject: [PATCH 138/496] harmonize docstrings --- nautilus_nlp/preprocessing/preprocess.py | 78 +++++++++++++++++++----- 1 file changed, 64 insertions(+), 14 deletions(-) diff --git a/nautilus_nlp/preprocessing/preprocess.py b/nautilus_nlp/preprocessing/preprocess.py index 2ff6231..f8f8125 100644 --- a/nautilus_nlp/preprocessing/preprocess.py +++ b/nautilus_nlp/preprocessing/preprocess.py @@ -18,7 +18,7 @@ STOPWORDS_JSON_FILEPATH = os.path.join(ROOT_FOLDER, "data", "stopwords.json") -def remove_multiple_spaces_and_strip_text(text): +def remove_multiple_spaces_and_strip_text(text: str) -> str: """ Remove multiple spaces, strip text, and remove '-', '*' characters. @@ -40,13 +40,13 @@ def remove_multiple_spaces_and_strip_text(text): return text -def remove_EOL_characters(text): +def remove_EOL_characters(text: str) -> str: """ Remove end of line (\n) char. Parameters ---------- - text : str, + text : str Returns ------- @@ -55,18 +55,40 @@ def remove_EOL_characters(text): return text.replace("\n", " ") -def remove_tokens_with_nonletters(tokens): +def remove_tokens_with_nonletters(tokens: list) -> list: """ Inputs a list of tokens, outputs a list of tokens without tokens that - includes numbers of special caracters + includes numbers of special caracters. + ['foo','bar','124','34euros'] -> ['foo','bar'] + + Parameters + ---------- + tokens : list + list of tokens to be cleaned + + Returns + ------- + list + list of tokens without tokens with numbers """ return [word for word in tokens if re.search("[a-zA-Z]", word)] -def remove_special_caracters(tokens): - """ Checks for letters in the token - using a regex search. - Strings that are just punctuation will - be removed! No more custom '--'. But ''s' and '9' will remain. +def remove_special_caracters_from_tokenslist(tokens: list) -> list: + """ + Remove tokens that doesn't contains any number or letter. + eg. ['foo','bar','---',"'s",'#'] -> ['foo','bar',"'s"] + + Parameters + ---------- + tokens : list + list of tokens to be cleaned + + Returns + ------- + list + list of tokens without tokens that contains only special caracters + """ return [word for word in tokens if re.search("[a-zA-Z0-9]", word)] @@ -77,18 +99,30 @@ def _load_stopwords_from_json(filepath=STOPWORDS_JSON_FILEPATH): return stopwords -def get_stopwords(lang: str = "en"): +def get_stopwords(lang: str = "en") -> list: """ Inputs a language code, returns a list of stopwords for the specified language - Args: - lang: Supported languages: ['ar', 'bg', 'ca', 'cz', 'da', 'nl', 'en', + Parameters + ---------- + lang : str + Supported languages: ['ar', 'bg', 'ca', 'cz', 'da', 'nl', 'en', 'fi', 'fr', 'de', 'hi', 'hu', 'id', 'it', 'nb', 'pl', 'pt', 'ro', 'ru', 'sk', 'es', 'sv', 'tr', 'uk', 'vi', 'af', 'ha', 'so', 'st', 'sw', 'yo', 'zu', 'da', 'de', 'es', 'et', 'fi', 'fr', 'hr', 'hu', 'it', 'ko', 'nl', 'no', 'pl', 'pt', 'ru', 'sv', 'tr', 'zh', 'eo', 'he', 'la', 'sk', 'sl', 'br', 'ca', 'cs', 'el', 'eu', 'ga', 'gl', 'hy', 'id', 'ja', 'lv', 'th', 'ar', 'bg', 'bn', 'fa', 'hi', 'mr', 'ro', 'en'] + + Returns + ------- + list + list of stopwords for a given language + + Raises + ------ + ValueError + When language is not available yet or incorrect country code """ if type(lang) == str and len(lang) == 2: lang = lang.lower() @@ -117,9 +151,25 @@ def get_stopwords(lang: str = "en"): return list(set(stopwords)) -def remove_stopwords(text_or_tokens, stopwords): +def remove_stopwords(text_or_tokens, stopwords: list) -> list: """ - Remove stopwords from tokens. + Remove stopwords from a list of tokens or a text. + eg. [''] + + Parameters + ---------- + text_or_tokens : list or string + list of tokens to be cleaned + + Returns + ------- + list + list of tokens without stopwords + + Raises + ------ + ValueError + When inputs is not a string or a list """ if type(text_or_tokens) is str: return [word for word in text_or_tokens.split() if word not in stopwords] From 43a477056dc9573306d1e3185bd6ae47e4da1206 Mon Sep 17 00:00:00 2001 From: hugovasselin <waaaouu@gmail.com> Date: Fri, 3 May 2019 20:50:34 +0200 Subject: [PATCH 139/496] harmonize docstr, rm funct, improve preprocess fct --- nautilus_nlp/preprocessing/preprocess.py | 318 +++++++++++++++-------- 1 file changed, 213 insertions(+), 105 deletions(-) diff --git a/nautilus_nlp/preprocessing/preprocess.py b/nautilus_nlp/preprocessing/preprocess.py index 14468a1..fd8041e 100644 --- a/nautilus_nlp/preprocessing/preprocess.py +++ b/nautilus_nlp/preprocessing/preprocess.py @@ -7,7 +7,7 @@ import re import unicodedata -from ftfy import fix_text +from ftfy import fix_text as _fix_text from stop_words import get_stop_words as _get_stop_words from stop_words import LANGUAGE_MAPPING as _LANGUAGE_MAPPING @@ -154,7 +154,7 @@ def get_stopwords(lang: str = "en") -> list: def remove_stopwords(text_or_tokens, stopwords: list) -> list: """ Remove stopwords from a list of tokens or a text. - eg. [''] + eg. ['I','like','when','you','move','your','body','!'] -> ['I', 'move', 'body', '!'] Parameters ---------- @@ -179,49 +179,66 @@ def remove_stopwords(text_or_tokens, stopwords: list) -> list: raise ValueError("must input string or list of tokens") -def fix_bad_unicode(text, normalization="NFC") -> str: +def fix_bad_unicode(text: str, normalization: str = "NFC") -> str: """ Fix unicode text that's "broken" using `ftfy <http://ftfy.readthedocs.org/>`_; this includes mojibake, HTML entities and other code cruft, and non-standard forms for display purposes. - Args: - text (str): raw text - normalization ({'NFC', 'NFKC', 'NFD', 'NFKD'}): if 'NFC', - combines characters and diacritics written using separate code points, - e.g. converting "e" plus an acute accent modifier into "é"; unicode - can be converted to NFC form without any change in its meaning! - if 'NFKC', additional normalizations are applied that can change - the meanings of characters, e.g. ellipsis characters will be replaced - with three periods - - Returns: - str + Parameters + ---------- + text : string + + normalization ({'NFC', 'NFKC', 'NFD', 'NFKD'}): + if 'NFC', combines characters and diacritics written using separate code points, + e.g. converting "e" plus an acute accent modifier into "é"; unicode + can be converted to NFC form without any change in its meaning! + if 'NFKC', additional normalizations are applied that can change + the meanings of characters, e.g. ellipsis characters will be replaced + with three periods + Returns + ------- + string """ - return fix_text(text, normalization=normalization) + return _fix_text(text, normalization=normalization) -def normalize_whitespace(text) -> str: +def normalize_whitespace(text:str) -> str: """ Given ``text`` str, replace one or more spacings with a single space, and one or more linebreaks with a single newline. Also strip leading/trailing whitespace. + eg. " foo bar " -> "foo bar" + + Parameters + ---------- + text : string + + Returns + ------- + string """ return constants.NONBREAKING_SPACE_REGEX.sub( " ", constants.LINEBREAK_REGEX.sub(r"\n", text) ).strip() -def unpack_french_contractions(text) -> str: - - return text - -def unpack_english_contractions(text) -> str: +def unpack_english_contractions(text:str) -> str: """ Replace *English* contractions in ``text`` str with their unshortened forms. N.B. The "'d" and "'s" forms are ambiguous (had/would, is/has/possessive), so are left as-is. + eg. "You're fired. She's nice." -> "You are fired. She's nice." + + Parameters + ---------- + text : string + + Returns + ------- + string """ + # standard text = re.sub( r"(\b)([Aa]re|[Cc]ould|[Dd]id|[Dd]oes|[Dd]o|[Hh]ad|[Hh]as|[Hh]ave|[Ii]s|[Mm]ight|[Mm]ust|[Ss]hould|[Ww]ere|[Ww]ould)n't", @@ -249,32 +266,73 @@ def unpack_english_contractions(text) -> str: return text -def unpack_contractions_from_lang(text, lang: str = "fr") -> str: - if lang == "fr": - return unpack_english_contractions(text) - else: - return unpack_english_contractions(text) +def replace_urls(text:str, replace_with:str="*URL*") -> str: + """ + Replace all URLs in ``text`` str with ``replace_with`` str. + Parameters + ---------- + text : string + replace_with : string + the string you want the URL to be replaced with. -def replace_urls(text, replace_with="*URL*") -> str: - """Replace all URLs in ``text`` str with ``replace_with`` str.""" + Returns + ------- + string + """ return constants.URL_REGEX.sub( replace_with, constants.SHORT_URL_REGEX.sub(replace_with, text) ) def replace_emails(text, replace_with="*EMAIL*") -> str: - """Replace all emails in ``text`` str with ``replace_with`` str.""" + """ + Replace all emails in ``text`` str with ``replace_with`` str + + Parameters + ---------- + text : string + replace_with : string + the string you want the email address to be replaced with. + + Returns + ------- + string + """ return constants.EMAIL_REGEX.sub(replace_with, text) def replace_phone_numbers(text, replace_with="*PHONE*") -> str: - """Replace all phone numbers in ``text`` str with ``replace_with`` str.""" + """ + Replace all phone numbers in ``text`` str with ``replace_with`` str + + Parameters + ---------- + text : string + replace_with : string + the string you want the phone number to be replaced with. + + Returns + ------- + string + """ return constants.PHONE_REGEX.sub(replace_with, text) def replace_numbers(text, replace_with="*NUMBER*") -> str: - """Replace all numbers in ``text`` str with ``replace_with`` str.""" + """ + Replace all numbers in ``text`` str with ``replace_with`` str. + + Parameters + ---------- + text : string + replace_with : string + the string you want the number to be replaced with. + + Returns + ------- + string + """ return constants.NUMBERS_REGEX.sub(replace_with, text) @@ -282,16 +340,20 @@ def replace_currency_symbols(text, replace_with=None) -> str: """ Replace all currency symbols in ``text`` str with string specified by ``replace_with`` str. - Args: - text (str): raw text - replace_with (str): if None (default), replace symbols with + Parameters + ---------- + text : str + raw text + replace_with : None or string + if None (default), replace symbols with their standard 3-letter abbreviations (e.g. '$' with 'USD', '£' with 'GBP'); otherwise, pass in a string with which to replace all symbols (e.g. "*CURRENCY*") - Returns: - str - """ + Returns + ------- + string + """ if replace_with is None: for k, v in constants.CURRENCIES.items(): text = text.replace(k, v) @@ -305,44 +367,57 @@ def remove_punct(text, marks=None) -> str: Remove punctuation from ``text`` by replacing all instances of ``marks`` with whitespace. - Args: - text (str): raw text - marks (str): If specified, remove only the characters in this string, - e.g. ``marks=',;:'`` removes commas, semi-colons, and colons. - Otherwise, all punctuation marks are removed. + Parameters + ---------- + text : str + raw text + + marks : str or None + If specified, remove only the characters in this string, + e.g. ``marks=',;:'`` removes commas, semi-colons, and colons. + Otherwise, all punctuation marks are removed. - Returns: - str + Returns + ------- + string - Note: - When ``marks=None``, Python's built-in :meth:`str.translate()` is - used to remove punctuation; otherwise, a regular expression is used - instead. The former's performance is about 5-10x faster. - """ + Note + ------- + When ``marks=None``, Python's built-in :meth:`str.translate()` is + used to remove punctuation; otherwise, a regular expression is used + instead. The former's performance is about 5-10x faster. + """ if marks: return re.sub("[{}]+".format(re.escape(marks)), " ", text, flags=re.UNICODE) else: return text.translate(constants.PUNCT_TRANSLATE_UNICODE) -def remove_accents(text, method="unicode") -> str: +def remove_accents(text:str, method:str="unicode") -> str: """ Remove accents from any accented unicode characters in ``text`` str, either by transforming them into ascii equivalents or removing them entirely. - Args: - text (str): raw text - method ({'unicode', 'ascii'}): if 'unicode', remove accented - char for any unicode symbol with a direct ASCII equivalent; if 'ascii', - remove accented char for any unicode symbol + Parameters + ---------- + text : str + raw text + + method : ({'unicode', 'ascii'}) + if 'unicode', remove accented + char for any unicode symbol with a direct ASCII equivalent; if 'ascii', + remove accented char for any unicode symbol - NB: the 'ascii' method is notably faster than 'unicode', but less good + NB: the 'ascii' method is notably faster than 'unicode', but less good - Returns: - str + Returns + ------- + string - Raises: - ValueError: if ``method`` is not in {'unicode', 'ascii'} + Raises + ------- + ValueError + if ``method`` is not in {'unicode', 'ascii'} """ if method == "unicode": return "".join( @@ -361,25 +436,26 @@ def remove_accents(text, method="unicode") -> str: raise ValueError(msg) -def remove_emoji(word): +def remove_emoji(text:str) -> str: """ Remove emoji from any str by stripping any unicode in the range of Emoji unicode, - Args: - word (str): raw word - - Returns: - str + Parameters + ---------- + text : str + raw text + Returns + ------- + string """ RE_EMOJI = re.compile("[\U00010000-\U0010ffff]", flags=re.UNICODE) - word = RE_EMOJI.sub(r"", word) + word = RE_EMOJI.sub(r"", text) return word def preprocess_text( text, - no_emoji=False, fix_unicode=False, lowercase=False, no_urls=False, @@ -390,61 +466,93 @@ def preprocess_text( no_punct=False, no_contractions=False, no_accents=False, + no_emoji=False, + replace_with=None, + remove_stopwords=None ) -> str: """ - Normalize various aspects of a raw text doc before parsing it with Spacy. - A convenience function for applying all other preprocessing functions in one go. - - Args: - text (str): raw text to preprocess - fix_unicode (bool): if True, fix "broken" unicode such as - mojibake and garbled HTML entities - lowercase (bool): if True, all text is lower-cased - no_urls (bool): if True, replace all URL strings with '*URL*' - no_emails (bool): if True, replace all email strings with '*EMAIL*' - no_phone_numbers (bool): if True, replace all phone number strings - with '*PHONE*' - no_numbers (bool): if True, replace all number-like strings - with '*NUMBER*' - no_currency_symbols (bool): if True, replace all currency symbols - with their standard 3-letter abbreviations - no_punct (bool): if True, remove all punctuation (replace with - empty string) - no_contractions (bool): if True, replace *English* contractions - with their unshortened forms - no_accents (bool): if True, replace all accented characters - with unaccented versions - - Returns: - str: input ``text`` processed according to function args - - Warning: - These changes may negatively affect subsequent NLP analysis performed - on the text, so choose carefully, and preprocess at your own risk! - """ + Normalize various aspects of a raw text doc. A convenience function for + applying all other preprocessing functions in one go. + + Parameters + ---------- + text : str + raw text to preprocess + fix_unicode : bool + if True, fix "broken" unicode such as mojibake and garbled HTML entities + lowercase : bool + if True, all text is lower-cased + no_urls : bool + if True, replace all URL strings with '*URL*' or with "replace_with" if + specified. + no_emails : bool + if True, replace all email strings with '*EMAIL*' or with "replace_with" if + specified. + no_phone_numbers : bool + if True, replace all phone number strings with '*PHONE*' or with "replace_with" if + specified. + no_numbers : bool + if True, replace all number-like strings with '*NUMBER*' or with "replace_with" if + specified. + no_currency_symbols : bool + if True, if True, replace all currency symbols with their standard + 3-letter abbreviations. + no_punct : bool + if True, remove all punctuation (replace with empty string) + no_contractions : bool + if True, if True, replace *English* contractions with their unshortened forms + no_accents : bool + if True, replace all accented characters with unaccented versions + no_emoji : bool + if True, remove all emojis from text + replace_with : string + The string you want the entities to be replaced with. + remove_stopwords : 2-letter country code + If specified, will remove the stopwords of the given language. + Supported languages: ['ar', 'bg', 'ca', 'cz', 'da', 'nl', 'en', + 'fi', 'fr', 'de', 'hi', 'hu', 'id', 'it', 'nb', 'pl', 'pt', 'ro', 'ru', + 'sk', 'es', 'sv', 'tr', 'uk', 'vi', 'af', 'ha', 'so', 'st', 'sw', 'yo', + 'zu', 'da', 'de', 'es', 'et', 'fi', 'fr', 'hr', 'hu', 'it', 'ko', 'nl', + 'no', 'pl', 'pt', 'ru', 'sv', 'tr', 'zh', 'eo', 'he', 'la', 'sk', 'sl', + 'br', 'ca', 'cs', 'el', 'eu', 'ga', 'gl', 'hy', 'id', 'ja', 'lv', 'th', + 'ar', 'bg', 'bn', 'fa', 'hi', 'mr', 'ro', 'en'] + Returns + ------- + string + input ``text`` processed according to function args + Warning + ------- + These changes may negatively affect subsequent NLP analysis performed + on the text, so choose carefully, and preprocess at your own risk! + """ assert isinstance(text, str), "The text to preprocess must be a string" if fix_unicode is True: text = fix_bad_unicode(text, normalization="NFC") if no_urls is True: - text = replace_urls(text) + text = replace_urls(text, replace_with=replace_with) if no_emails is True: - text = replace_emails(text) + text = replace_emails(text, replace_with=replace_with) if no_phone_numbers is True: - text = replace_phone_numbers(text) + text = replace_phone_numbers(text, replace_with=replace_with) if no_numbers is True: - text = replace_numbers(text) + text = replace_numbers(text, replace_with=replace_with) if no_currency_symbols is True: - text = replace_currency_symbols(text) + text = replace_currency_symbols(text, replace_with=replace_with) + if no_emoji is True: + text = remove_emoji(text) if no_contractions is True: - text = unpack_contractions_from_lang(text) + text = unpack_english_contractions(text) if no_accents is True: text = remove_accents(text, method="unicode") if no_punct is True: text = remove_punct(text) if lowercase is True: text = text.lower() + if remove_stopwords is not None: + stopwords = get_stopwords(remove_stopwords) + text = remove_stopwords(text, stopwords) # always normalize whitespace; treat linebreaks separately from spacing text = normalize_whitespace(text) From c92357ac5395f4e41a13fd6fc4bcc37b0d578a75 Mon Sep 17 00:00:00 2001 From: hugovasselin <waaaouu@gmail.com> Date: Fri, 3 May 2019 20:51:19 +0200 Subject: [PATCH 140/496] add unit tests for all fct except preprocess_text --- tests/test_preprocessor.py | 176 ++++++++++++++++++++++++++++++++++++- 1 file changed, 173 insertions(+), 3 deletions(-) diff --git a/tests/test_preprocessor.py b/tests/test_preprocessor.py index f53408e..24f4658 100644 --- a/tests/test_preprocessor.py +++ b/tests/test_preprocessor.py @@ -7,7 +7,17 @@ remove_EOL_characters, remove_tokens_with_nonletters, remove_special_caracters_from_tokenslist, - get_stopwords + get_stopwords, + remove_stopwords, + normalize_whitespace, + unpack_english_contractions, + replace_urls, + replace_emails, + replace_phone_numbers, + replace_numbers, + replace_currency_symbols, + remove_punct, + remove_emoji ) @@ -49,7 +59,7 @@ def test_remove_special_caracters_from_tokenslist(): input_tokens = ['foo','bar','---',"'s",'#'] expected_output = ['foo','bar',"'s"] result = remove_tokens_with_nonletters(input_tokens) - np.testing.assert_array_equal(result,expected_output) + np.testing.assert_array_equal(result, expected_output) def test_get_stopwords(): @@ -57,7 +67,20 @@ def test_get_stopwords(): for lang in languages_to_test: result = get_stopwords(lang) assert len(result) > 0 and type(result) == list - + + +@pytest.mark.parametrize( + "input_tokens, expected_output", + [ + (['I','like','when','you','move','your','body','!'], ['I', 'move', 'body', '!']), + ('I like when you move your body !', ['I', 'move', 'body', '!']), + ], +) +def test_remove_stopwords(input_tokens, expected_output): + stopwords = get_stopwords('en') + result = remove_stopwords(input_tokens, stopwords) + np.testing.assert_array_equal(result, expected_output) + def test_remove_accents(): input_str = "éèëêàù" @@ -93,3 +116,150 @@ def test_fix_bad_unicode(input_str, expected_str): result = fix_bad_unicode(input_str) np.testing.assert_string_equal(result, expected_str) + +@pytest.mark.parametrize( + "input_str, expected_str", + [ + (' foo ', 'foo'), + (' foo bar ', 'foo bar') + ], +) +def test_normalize_whitespace(input_str, expected_str): + result = normalize_whitespace(input_str) + np.testing.assert_equal(result, expected_str) + +@pytest.mark.parametrize( + "input_str, expected_str", + [ + ("I can't tell how we've done.", 'I can not tell how we have done.'), + ("You're fired. She's nice.", "You are fired. She's nice."), + ("Let's go!",'Let us go!'), + ("You've been missing",'You have been missing'), + ("I'm sure you're leaving",'I am sure you are leaving'), + ("We'll survive.","We will survive") + ] + ) +def test_unpack_english_contractions(input_str, expected_str): + result = unpack_english_contractions(input_str) + np.testing.assert_equal(result, expected_str) + +@pytest.mark.parametrize( + "input_str, expected_str", + [ + ("Wan't to contribute to Nautilus? read https://github.com/artefactory/nautilus-nlp/blob/docs/CONTRIBUTING.md first", + "Wan't to contribute to Nautilus? read *URL* first"), + ("The ip address of my VM is http://34.76.182.5:8888", "The ip address of my VM is *URL*"), + ("If you go to http://internet.org, you will find a website hosted by FB.", + "If you go to *URL*, you will find a website hosted by FB."), + ("Ishttps://waaaou.com/ available?",'Is*URL* available?'), + ("mailto:hugo.vasselin@artefact.com",'*URL*') + ] + ) +def test_replace_urls(input_str, expected_str): + result = replace_urls(input_str) + np.testing.assert_equal(result, expected_str) + + +@pytest.mark.parametrize( + "input_str, expected_str", + [ + ("my email:hugo.vasselin@artefact.com","my email:*EMAIL*"), + ("v543143@nwytg.net is a temporary email", "*EMAIL* is a temporary email"), + ("our emails used to be name.surname@artefact.is","our emails used to be *EMAIL*"), + ("chaudasse_du_13@hotmail.frC ton email bb?",'*EMAIL*C ton email bb?') + ] + ) +def test_replace_emails(input_str, expected_str): + result = replace_emails(input_str) + np.testing.assert_equal(result, expected_str) + + +@pytest.mark.parametrize( + "input_str, expected_str", + [ + ("mon 06 bb: 0625093267","mon 06 bb: *NUMBER*"), + ("mon 06 bb: 06.25.09.32.67","mon 06 bb: *NUMBER*"), + ("call me at +33625093267","call me at *NUMBER*"), + ("call me at +33 6 25 09 32 67","call me at *NUMBER*"), + ("call me at +33 625 093 267","call me at *NUMBER*"), + ("if this unit test doesn't work, call 3615 and says 'ROBIN'", + "if this unit test doesn't work, call *NUMBER* and says 'ROBIN'"), + ('(541) 754-3010 is a US. Phone','*NUMBER* is a US. Phone'), + ('+1-541-754-3010 is an international Phone','*NUMBER* is an international Phone'), + ('+1-541-754-3010 Dialed in the US','*NUMBER* Dialed in the US'), + ('+1-541-754-3010 Dialed from Germany','*NUMBER* Dialed from Germany'), + ('191 541 754 3010 Dialed from France','*NUMBER* Dialed from France') + ] + ) +def test_replace_phone_numbers(input_str, expected_str): + result = replace_phone_numbers(input_str) + np.testing.assert_equal(result, expected_str) + + +@pytest.mark.parametrize( + "input_str, expected_str", + [ + ("123, 3 petits chats","*NUMBER*, *NUMBER* petits chats"), + ("l0ve 2 twa <3","l*NUMBER*ve *NUMBER* twa <*NUMBER*"), + ("Give me 45bucks!","Give me *NUMBER*bucks!"), + ("call me at +33625093267","call me at +*NUMBER*") + ] + ) +def test_replace_numbers(input_str, expected_str): + result = replace_numbers(input_str) + np.testing.assert_equal(result, expected_str) + + +@pytest.mark.parametrize( + "input_str, param, expected_str", + [ + ("Give me 23$",None,"Give me 23USD"), + ("Give me 23£",None,"Give me 23GBP"), + ("Give me 23 £",None,"Give me 23 GBP"), + ("Give me 23 €",None,"Give me 23 EUR"), + ('¥ is both japanese yen and Chinese Renminbi',"*CUR*","*CUR* is both japanese yen and Chinese Renminbi") + ] + ) +def test_replace_currency_symbols(input_str, param, expected_str): + result = replace_currency_symbols(input_str, replace_with=param) + np.testing.assert_equal(result, expected_str) + +@pytest.mark.parametrize( + "input_str, param, expected_str", + [ + ("Seriously...",None,"Seriously "), + ("Seriously?",None,"Seriously "), + ("Seriously ?",None,"Seriously "), + ("Seriously???",None,"Seriously "), + ("Seriously?!",None,"Seriously "), + ('"Seriously"',None," Seriously "), + ('Seriously:',None,"Seriously "), + ('Seriously;',None,"Seriously "), + ("'Seriously'",None," Seriously "), + ("'Seriously'",'.,;','Seriously'), + ("Seriously...",'.,;','Seriously '), + ("Seriously.,.",'.,;','Seriously '), + ("Seriously.!.",'.,;','Seriously ! '), + ("hugo.vasselin@artefact.com",'.,;','hugo vasselin@artefact com'), + ("hugo.vasselin@artefact.com",None,'hugo vasselin@artefact com'), + ("hugo-vasselin@artefact.com",None,'hugo vasselin@artefact com') + ] + ) +def test_remove_punct(input_str, param, expected_str): + result = remove_punct(input_str, marks=param) + np.testing.assert_equal(result, expected_str) + + +@pytest.mark.parametrize( + "input_str, expected_str", + [ + ("👉👌",""), + ("🎅🏿",""), + ("🥖✊💦",""), + ("J'espère que les 🚓 vont pas lire ce test", + "J'espère que les vont pas lire ce test") + ] + ) +def test_remove_emoji(input_str, expected_str): + result = remove_emoji(input_str) + np.testing.assert_equal(result, expected_str) \ No newline at end of file From 043d0d4d2f5659b20f74a6b0f97a8459f579a2d0 Mon Sep 17 00:00:00 2001 From: Robin <rdoume@gmail.com> Date: Sat, 4 May 2019 11:59:31 +0200 Subject: [PATCH 141/496] Remove starting file on capital letters --- ...t_classifier.py => fasttext_classifier.py} | 0 ...ext_embedding.py => fasttext_embedding.py} | 0 ...guage_detector.py => language_detector.py} | 4 +- nautilus_nlp/models/sentiment_detector.py | 37 +++++++++++ nautilus_nlp/models/spacy_model.py | 61 +++++++++++++++++++ 5 files changed, 100 insertions(+), 2 deletions(-) rename nautilus_nlp/models/{Fasttext_classifier.py => fasttext_classifier.py} (100%) rename nautilus_nlp/models/{Fasttext_embedding.py => fasttext_embedding.py} (100%) rename nautilus_nlp/models/{Language_detector.py => language_detector.py} (86%) create mode 100644 nautilus_nlp/models/sentiment_detector.py create mode 100644 nautilus_nlp/models/spacy_model.py diff --git a/nautilus_nlp/models/Fasttext_classifier.py b/nautilus_nlp/models/fasttext_classifier.py similarity index 100% rename from nautilus_nlp/models/Fasttext_classifier.py rename to nautilus_nlp/models/fasttext_classifier.py diff --git a/nautilus_nlp/models/Fasttext_embedding.py b/nautilus_nlp/models/fasttext_embedding.py similarity index 100% rename from nautilus_nlp/models/Fasttext_embedding.py rename to nautilus_nlp/models/fasttext_embedding.py diff --git a/nautilus_nlp/models/Language_detector.py b/nautilus_nlp/models/language_detector.py similarity index 86% rename from nautilus_nlp/models/Language_detector.py rename to nautilus_nlp/models/language_detector.py index 06a1a06..acd1819 100644 --- a/nautilus_nlp/models/Language_detector.py +++ b/nautilus_nlp/models/language_detector.py @@ -1,5 +1,5 @@ -from nautilus_nlp.models.Fasttext_classifier import Fasttext_clf as langdetect -from nautilus_nlp.utils.preprocess import remove_EOL_characters +from nautilus_nlp.models.fasttext_classifier import Fasttext_clf as langdetect +from nautilus_nlp.preprocessing.preprocess import remove_EOL_characters import pkg_resources lang_path = pkg_resources.resource_filename( diff --git a/nautilus_nlp/models/sentiment_detector.py b/nautilus_nlp/models/sentiment_detector.py new file mode 100644 index 0000000..b168473 --- /dev/null +++ b/nautilus_nlp/models/sentiment_detector.py @@ -0,0 +1,37 @@ +from nautilus_nlp.models.Fasttext_classifier import Fasttext_clf as langdetect +import cld2 +import pkg_resources +lang_path = pkg_resources.resource_filename('nautilus_nlp.data', 'lang_identification.ftz') +class LangDetector(): + """ This class is to instantiante a language detector. + + """ + def __init__(self,typemodel,path=lang_path,): + self.typemodel=typemodel + self.path = None if path is None else lang_path + self.model=langdetect(self.path) if typemodel=='fasttext' else None + + def detect_language(self, text_to_detect=None): + """ + Detected the language of a text + + Args: + hint_language: language you expect your text to be + + Returns: + is_reliable: is the top language is much better than 2nd best language? + language: 2-letter code for the language of the text + """ + if self.typemodel!='fasttext': + _, _, best_guesses = cld2.detect(text_to_detect, + bestEffort=True) + + if len(best_guesses) == 0 or len(best_guesses[0]) != 4 or best_guesses[0][1] == 'un': + return 'un',0 + + return best_guesses[0][1],(best_guesses[0][2]/100) + else: + best_guesses=self.model.predict(text_to_detect) + return best_guesses[0][0].replace('__label__',''),best_guesses[1][0] + + diff --git a/nautilus_nlp/models/spacy_model.py b/nautilus_nlp/models/spacy_model.py new file mode 100644 index 0000000..c7eca79 --- /dev/null +++ b/nautilus_nlp/models/spacy_model.py @@ -0,0 +1,61 @@ +import spacy + +class spacy_model: + + def __init__(self, lang: str): + try: + self.model = spacy.load(lang) + except Exception as e: + print(e) + print(f"Cannot load lang {lang}, loading default") + self.model = spacy.load("xx") + + def get_spacy_doc(self, text): + + return self.model(text) + + @staticmethod + def get_tokens_from_document(spacydoc: spacy.tokens.doc.Doc): + + return [tokens for tokens in spacydoc] + + def get_tokens_from_str(self, text: str): + spacydoc = self.model(text) + return [tokens for tokens in spacydoc] + + @staticmethod + def get_sentence_from_document(spacydoc: spacy.tokens.doc.Doc): + return [sent for sent in spacydoc.sents] + + def get_sentence_from_str(self, text: str): + spacydoc = self.model(text) + return [sent for sent in spacydoc.sents] + + @staticmethod + def get_tokenized_sentence_from_document(spacydoc: spacy.tokens.doc.Doc): + return [[(token) for token in sent] for sent in spacydoc.sents] + + def get_tokenized_sentence_from_str(self, text: str): + spacydoc = self.model(text) + return [[(token) for token in sent] for sent in spacydoc.sents] + + @staticmethod + def get_entities_from_document(spacydoc): + return [(ent, ent.label_) for ent in spacydoc.ents] + + @staticmethod + def get_entities_from_str(self, text: str): + spacydoc = self.model(text) + return [(ent, ent.label_) for ent in spacydoc.ents] + + @staticmethod + def get_lemma_from_document(spacydoc: spacy.tokens.doc.Doc) -> list: + return [token.lemma_ for token in spacydoc] + + def get_lemma_from_str(self, text: str): + spacydoc = self.model(text) + return [token.lemma_ for token in spacydoc] + + def get_pos_from_str(self, text: str): + spacydoc = self.model(text) + return [token.pos_ for token in spacydoc] \ No newline at end of file From b7ddf4c9208fb9f04c16501696343fc159b6a3ad Mon Sep 17 00:00:00 2001 From: hugovasselin <waaaouu@gmail.com> Date: Sat, 4 May 2019 13:20:11 +0200 Subject: [PATCH 142/496] fix preprocess --- nautilus_nlp/preprocessing/preprocess.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/nautilus_nlp/preprocessing/preprocess.py b/nautilus_nlp/preprocessing/preprocess.py index fd8041e..0f69de5 100644 --- a/nautilus_nlp/preprocessing/preprocess.py +++ b/nautilus_nlp/preprocessing/preprocess.py @@ -468,7 +468,7 @@ def preprocess_text( no_accents=False, no_emoji=False, replace_with=None, - remove_stopwords=None + no_stopwords=None ) -> str: """ Normalize various aspects of a raw text doc. A convenience function for @@ -507,7 +507,7 @@ def preprocess_text( if True, remove all emojis from text replace_with : string The string you want the entities to be replaced with. - remove_stopwords : 2-letter country code + no_stopwords : 2-letter country code If specified, will remove the stopwords of the given language. Supported languages: ['ar', 'bg', 'ca', 'cz', 'da', 'nl', 'en', 'fi', 'fr', 'de', 'hi', 'hu', 'id', 'it', 'nb', 'pl', 'pt', 'ro', 'ru', @@ -550,8 +550,8 @@ def preprocess_text( text = remove_punct(text) if lowercase is True: text = text.lower() - if remove_stopwords is not None: - stopwords = get_stopwords(remove_stopwords) + if no_stopwords is not None: + stopwords = get_stopwords(no_stopwords) text = remove_stopwords(text, stopwords) # always normalize whitespace; treat linebreaks separately from spacing text = normalize_whitespace(text) From 2535c2b5fbd8cd1feee1dff6fddbaa599eba5a4a Mon Sep 17 00:00:00 2001 From: hugovasselin <waaaouu@gmail.com> Date: Sat, 4 May 2019 14:02:58 +0200 Subject: [PATCH 143/496] add quickstart --- README.md | 51 ++++++++++++++++++++++++++++++++++++--------------- 1 file changed, 36 insertions(+), 15 deletions(-) diff --git a/README.md b/README.md index 411feb6..e381240 100644 --- a/README.md +++ b/README.md @@ -16,9 +16,9 @@ You can find a list of the available features [in this article.](https://artefac As an Artefact user, you might be working on a NLP use case, and wish to use Nautilus. - However, if you think Nautilus is lacking features that can be useful not only to your use case but also others, feel free to to fill up an issue with the label "Feature-request". +However, if you think Nautilus is lacking features that can be useful not only to your use case but also others, feel free to to [fill up an issue](https://github.com/artefactory/nautilus-nlp/issues) with the label "Feature-request". - We will try to put it in the roadmap and implement it as soon as possible. +We will try to put it in the roadmap and implement it as soon as possible. # Installation @@ -26,28 +26,34 @@ Beware, this package has been tested on Python **3.6** & **3.7**, and will proba To install this library you should first clone the repository: -`git clone https://github.com/artefactory/nautilus_nlp/ && cd nautilus_nlp` +``` +git clone https://github.com/artefactory/nautilus_nlp/ && cd nautilus_nlp +``` **If you don't use the docker container, we strongly advise you to do these steps in a virtual environnement** First you need to install the required files: -```pip install -r requirements.txt``` +``` +pip install -r requirements.txt +``` then you can install it via pip: -```pip install -e .``` +``` +pip install -e . +``` ## Handling installation errors ### command 'gcc' failed with exit status 1 While runing `pip install -r requirements.txt` you might get the following error message: -``` -command 'gcc' failed with exit status 1 -``` + +`command 'gcc' failed with exit status 1` To solve it, run the following command before installing requirements.txt: + ``` conda install pyemd ``` @@ -97,9 +103,6 @@ run: `bash nautilus_nlp/scripts/download_ft_langdetect.sh` -<<<<<<< HEAD -# Quick start -======= ### Install Mallet 1) Install Mallet file @@ -112,18 +115,36 @@ run: `bash nautilus_nlp/scripts/install_java.sh` -# Notebooks ->>>>>>> master +# Quick start The [notebook](notebooks/) folder contains various notebook on how to use this library. Here is a quick example: ``` - +>>> from nautilus_nlp.preprocessing.preprocess import preprocess_text +>>> from nautilus_nlp.preprocessing.tokenizer import tokenize +>>> from nautilus_nlp.preprocessing.lemmatization import lemmatize_english_tokens +[nltk_data] Downloading package wordnet to /Users/hugo/nltk_data... +[nltk_data] Package wordnet is already up-to-date! +>>> text = """Tropical Storm Nicole was a short-lived and unusually asymmetric tropical cyclone that caused extensive flooding in Jamaica during the 2010 Atlantic hurricane season.\nSource:https://en.wikipedia.org/wiki/Tropical_Storm_Nicole_(2010)""" +>>> clean_text = preprocess_text(text, lowercase=True, +... no_punct=True, +... no_numbers=True, +... no_stopwords='en', +... no_urls=True, +... replace_with='') +>>> clean_text +'tropical storm nicole short lived unusually asymmetric tropical cyclone caused extensive flooding jamaica atlantic hurricane season source' +>>> tokenized_text = tokenize(clean_text) +>>> tokenized_text +['tropical', 'storm', 'nicole', 'short', 'lived', 'unusually', 'asymmetric', 'tropical', 'cyclone', 'caused', 'extensive', 'flooding', 'jamaica', 'atlantic', 'hurricane', 'season', 'source'] +>>> lemma_text = lemmatize_english_tokens(tokenized_text) +>>> lemma_text +['tropical', 'storm', 'nicole', 'short', 'live', 'unusually', 'asymmetric', 'tropical', 'cyclone', 'cause', 'extensive', 'flooding', 'jamaica', 'atlantic', 'hurricane', 'season', 'source'] ``` -Project Organization +# Project Organization ------------ ├── LICENSE From dd2e4488bc12d910dddd5ba6df988efc02304712 Mon Sep 17 00:00:00 2001 From: hugovasselin <waaaouu@gmail.com> Date: Sat, 4 May 2019 14:03:28 +0200 Subject: [PATCH 144/496] fix preprocess_text --- nautilus_nlp/preprocessing/preprocess.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/nautilus_nlp/preprocessing/preprocess.py b/nautilus_nlp/preprocessing/preprocess.py index 0f69de5..57bac0d 100644 --- a/nautilus_nlp/preprocessing/preprocess.py +++ b/nautilus_nlp/preprocessing/preprocess.py @@ -552,8 +552,8 @@ def preprocess_text( text = text.lower() if no_stopwords is not None: stopwords = get_stopwords(no_stopwords) - text = remove_stopwords(text, stopwords) + text = ' '.join(remove_stopwords(text, stopwords)) # always normalize whitespace; treat linebreaks separately from spacing text = normalize_whitespace(text) - + return text From 5b83921144dd32faf7a94c44e627126ae858e232 Mon Sep 17 00:00:00 2001 From: hugovasselin <waaaouu@gmail.com> Date: Sat, 4 May 2019 14:05:37 +0200 Subject: [PATCH 145/496] remove exeption catching for spacy load --- nautilus_nlp/preprocessing/tokenizer.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/nautilus_nlp/preprocessing/tokenizer.py b/nautilus_nlp/preprocessing/tokenizer.py index 94eb7aa..6937196 100644 --- a/nautilus_nlp/preprocessing/tokenizer.py +++ b/nautilus_nlp/preprocessing/tokenizer.py @@ -4,18 +4,18 @@ from spacy.lang.fr import French from spacy.lang.en import English import spacy.lang as spacylang -#nltk.download('punkt') +nltk.download('punkt') try: french_spacy = spacylang.fr.French() -except OSError: +except: raise OSError("""You must install French langage to use SpaCy. python -m spacy download fr See https://spacy.io/usage/ for details """) try: english_spacy = spacylang.en.English() -except OSError: +except: raise OSError("""You must install english langage to use SpaCy. python -m spacy download en See https://spacy.io/usage/ for details From cd235732b2ce28cadbd656ea4249100fc21845c1 Mon Sep 17 00:00:00 2001 From: hugovasselin <waaaouu@gmail.com> Date: Sat, 4 May 2019 14:15:43 +0200 Subject: [PATCH 146/496] add file removing at the end --- tests/test_document_loader.py | 107 ++++++++++++++++++---------------- 1 file changed, 56 insertions(+), 51 deletions(-) diff --git a/tests/test_document_loader.py b/tests/test_document_loader.py index ee0c4f0..5629511 100644 --- a/tests/test_document_loader.py +++ b/tests/test_document_loader.py @@ -1,72 +1,77 @@ -# import pytest -# import numpy as np -# from nautilus_nlp.utils.file_loader import documents_loader, list_files, detect_encoding +# -*- coding: utf-8 -*- +import os +import pytest +import numpy as np +from nautilus_nlp.utils.file_loader import documents_loader, list_files, detect_encoding -# testdoc_latin1 = "J'aime les frites bien grasse étalon châpeau!" -# encoded_s = testdoc_latin1.encode('latin-1') +testdoc_latin1 = "J'aime les frites bien grasse étalon châpeau!" +testdoc_utf8 = "Un deuxième exemple de texte en utf-8 cette fois!" -# with open('testfolder_fileloader/testdoc_latin1.txt', 'wb') as f: -# f.write(encoded_s) -# testdoc_utf8 = "Un deuxième exemple de texte en utf-8 cette fois!" -# encoded_s = testdoc_utf8.encode('utf-8') -# with open('./testfolder_fileloader/testdoc_utf8.txt', 'wb') as f: -# f.write(encoded_s) +encoded_s = testdoc_latin1.encode('latin-1') +with open('testdoc_latin1.txt', 'wb') as f: + f.write(encoded_s) -# def test_openfile_with_encoding(): -# input_str = "testfolder_fileloader/testdoc_latin1.txt" -# expected_str = testdoc_latin1 -# result = documents_loader(input_str, encoding='latin-1') -# np.testing.assert_string_equal(result, expected_str) +encoded_s = testdoc_utf8.encode('utf-8') +with open('testdoc_utf8.txt', 'wb') as f: + f.write(encoded_s) -# def test_openfile_utf8(): -# input_str = "testfolder_fileloader/testdoc_utf8.txt" -# expected_str = testdoc_utf8 -# result = documents_loader(input_str) -# np.testing.assert_string_equal(result, expected_str) +def test_openfile_with_encoding(): + input_str = "testdoc_latin1.txt" + expected_str = testdoc_latin1 + result = documents_loader(input_str, encoding='latin-1') + np.testing.assert_string_equal(result, expected_str) -# def test_encoding_detection(): -# input_str = "testfolder_fileloader/testdoc_latin1.txt" -# expected_str = testdoc_latin1 -# result = documents_loader(input_str) -# np.testing.assert_string_equal(result, expected_str) - -# def test_load_several_docs_wildcard(): -# expected = {'testfolder_fileloader/testdoc_latin1.txt': "J'aime les frites bien grasse étalon châpeau!", -# 'testfolder_fileloader/testdoc_utf8.txt': 'Un deuxième exemple de texte en utf-8 cette fois!'} -# result = documents_loader('testfolder_fileloader/*.txt', output_as='dict') -# np.testing.assert_equal(result, expected) +def test_openfile_utf8(): + input_str = "testdoc_utf8.txt" + expected_str = testdoc_utf8 + result = documents_loader(input_str) + np.testing.assert_string_equal(result, expected_str) -# def test_load_several_docs_list(): -# expected = {'testfolder_fileloader/testdoc_latin1.txt': "J'aime les frites bien grasse étalon châpeau!", -# 'testfolder_fileloader/testdoc_utf8.txt': 'Un deuxième exemple de texte en utf-8 cette fois!'} -# result = documents_loader(['testfolder_fileloader/testdoc_latin1.txt','testfolder_fileloader/testdoc_utf8.txt'], output_as='dict') -# np.testing.assert_equal(result, expected) +def test_encoding_detection(): + input_str = "testdoc_latin1.txt" + expected_str = testdoc_latin1 + result = documents_loader(input_str) + np.testing.assert_string_equal(result, expected_str) + -# def test_load_several_docs_output_list(): -# expected = ["J'aime les frites bien grasse étalon châpeau!", -# 'Un deuxième exemple de texte en utf-8 cette fois!'] -# result = documents_loader(['testfolder_fileloader/testdoc_latin1.txt','testfolder_fileloader/testdoc_utf8.txt'], output_as='list') -# return len(expected) == len(result) and sorted(expected) == sorted(result) +def test_load_several_docs_wildcard(): + expected = {'testdoc_latin1.txt': "J'aime les frites bien grasse étalon châpeau!", + 'testdoc_utf8.txt': 'Un deuxième exemple de texte en utf-8 cette fois!'} + result = documents_loader('*.txt', output_as='dict') + np.testing.assert_equal(result, expected) +def test_load_several_docs_list(): + expected = {'testdoc_latin1.txt': "J'aime les frites bien grasse étalon châpeau!", + 'testdoc_utf8.txt': 'Un deuxième exemple de texte en utf-8 cette fois!'} + result = documents_loader(['testdoc_latin1.txt','testdoc_utf8.txt'], output_as='dict') + np.testing.assert_equal(result, expected) -# @pytest.mark.parametrize("input_filepath", ['testfolder_fileloader/*.txt','testfolder_fileloader/','testfolder_fileloader']) -# def test_list_files(input_filepath): -# expected = ['testfolder_fileloader/testdoc_latin1.txt','testfolder_fileloader/testdoc_utf8.txt'] -# result = list_files(input_filepath) -# return len(expected) == len(result) and sorted(expected) == sorted(result) +def test_load_several_docs_output_list(): + expected = ["J'aime les frites bien grasse étalon châpeau!", + 'Un deuxième exemple de texte en utf-8 cette fois!'] + result = documents_loader(['testdoc_latin1.txt','testdoc_utf8.txt'], output_as='list') + return len(expected) == len(result) and sorted(expected) == sorted(result) -# def test_detect_encoding(): -# expected = {'encoding': 'ISO-8859-1', 'confidence': 0.73, 'language': ''} -# result = detect_encoding('testfolder_fileloader/testdoc_latin1.txt') +#@pytest.mark.parametrize("input_filepath", ['*.txt','','testfolder_fileloader']) +#def test_list_files(input_filepath): +# expected = ['testdoc_latin1.txt','testdoc_utf8.txt'] +# result = list_files(input_filepath) +# return len(expected) == len(result) and sorted(expected) == sorted(result) -# np.testing.assert_equal(result, expected) +def test_detect_encoding(): + expected = {'encoding': 'ISO-8859-1', 'confidence': 0.73, 'language': ''} + result = detect_encoding('testdoc_latin1.txt') + np.testing.assert_equal(result, expected) + +os.remove('testdoc_latin1.txt') +os.remove('testdoc_utf8.txt') \ No newline at end of file From d5addf7410ddb58f4705c917650b2c1c812e2797 Mon Sep 17 00:00:00 2001 From: hugovasselin <waaaouu@gmail.com> Date: Sat, 4 May 2019 14:41:52 +0200 Subject: [PATCH 147/496] clean and harmonize docstrings --- .../preprocessing/keyword_extractor.py | 19 ++++-- nautilus_nlp/preprocessing/lemmatization.py | 67 +++++++++++-------- nautilus_nlp/preprocessing/stemming.py | 23 ++++--- 3 files changed, 66 insertions(+), 43 deletions(-) diff --git a/nautilus_nlp/preprocessing/keyword_extractor.py b/nautilus_nlp/preprocessing/keyword_extractor.py index e384bf2..11933bc 100644 --- a/nautilus_nlp/preprocessing/keyword_extractor.py +++ b/nautilus_nlp/preprocessing/keyword_extractor.py @@ -1,13 +1,22 @@ from flashtext import KeywordProcessor -def extract_keywords(text,keyword,case_sensitive=True): +def extract_keywords(text:str, keyword, case_sensitive=True) -> list: """ Extract Keywords from a document. - args : - text: Text to extract keywords from - keyword : Single keyword (str) or list of keywords (list) - return list of extracted keyworkds + Parameters + ---------- + text : str + Text to extract keywords from + keyword : str or list + Single keyword (str) or list of keywords (list) + case_sensitive : bool + If True, will be case-sensitive. + + Returns + ------- + string + return list of extracted keyworkds """ processor=KeywordProcessor(case_sensitive=case_sensitive) if isinstance(keyword,list): diff --git a/nautilus_nlp/preprocessing/lemmatization.py b/nautilus_nlp/preprocessing/lemmatization.py index e4c812c..462472e 100644 --- a/nautilus_nlp/preprocessing/lemmatization.py +++ b/nautilus_nlp/preprocessing/lemmatization.py @@ -6,39 +6,38 @@ try: french_spacy = spacy.load('fr_core_news_sm') -except OSError: +except: raise OSError("""You must install French langage to use SpaCy. python -m spacy download fr See https://spacy.io/usage/ for details """) try: english_spacy = spacy.load('en_core_web_sm') -except OSError: +except: raise OSError("""You must install english langage to use SpaCy. python -m spacy download en See https://spacy.io/usage/ for details """) +def lemmatize_french_tokens(tokens:list, module:str='spacy')->list: + """ + Wrappers of SpaCy french lemmatizers (based on FrenchLeffLemmatizer but + faster and more accurate.) + Parameters + ---------- + tokens : list + List of tokens + module : ({'spacy'}) + Only spaCy is available. We removed FrenchLeffLemmatizer for performance + considerations. -def lemmatize_french_tokens(tokens, module='spacy', load_only_pos='all'): - ''' - Wrappers of french lemmatizers. SpaCy is much faster but sometimes - FrenchLefffLemmatizer returns more accurate results. Give a try to the - 2 modules and choose the one that better fit your needs. - - Args: - tokens (list): list of tokens - module ({'spacy'}): modules availables. - load_only_pos ({'a', v', 'r', 'n', 'all'}): If not "all", applies - lemmatization only to a certain POS tags, for french_leff_v module. - a = adjectives, v = verbs, n = noun, r = adverb. - - Returns: + Returns + ------- + list list of lemmatized tokens - - ''' + """ tokens = _make_sure_input_is_list_of_tokens(tokens) @@ -52,18 +51,22 @@ def lemmatize_french_tokens(tokens, module='spacy', load_only_pos='all'): raise ValueError("must pass a valid module name!") -def lemmatize_english_tokens(tokens, module='spacy', pos_tag_prio='v'): - ''' - Args: - tokens (list): list of tokens - module ({'french_leff_v', 'spacy'}): modules availables. - pos_tag_prio ({'v', 'n', 'all'}): grammatical priority, applies - for french_leff_v module. +def lemmatize_english_tokens(tokens:list, module:str='spacy')->list: + """ + Wrapper of SpaCy english lemmatizer and NLTK WordNet. + + Parameters + ---------- + tokens : list + List of tokens + module : ({'spacy'},{'nltk'}) + Tokenizer module. Default: 'spacy' - Returns: + Returns + ------- + list list of lemmatized tokens - - ''' + """ tokens = _make_sure_input_is_list_of_tokens(tokens) if module == 'nltk': @@ -82,7 +85,9 @@ def lemmatize_english_tokens(tokens, module='spacy', pos_tag_prio='v'): def _get_wordnet_pos(word): - """Map POS tag to first character lemmatize() accepts""" + """ + Map POS tag to first character lemmatize() accepts + """ tag = nltk.pos_tag([word])[0][1][0].upper() tag_dict = {"J": wordnet.ADJ, "N": wordnet.NOUN, @@ -93,6 +98,10 @@ def _get_wordnet_pos(word): def _make_sure_input_is_list_of_tokens(tokens): + """ + Raises an error if input is not a list, and convert "None" to blank list + to handle dataset with no text. + """ if type(tokens) is list: return tokens elif tokens is None: diff --git a/nautilus_nlp/preprocessing/stemming.py b/nautilus_nlp/preprocessing/stemming.py index c480ca8..a4dfc0e 100644 --- a/nautilus_nlp/preprocessing/stemming.py +++ b/nautilus_nlp/preprocessing/stemming.py @@ -1,20 +1,25 @@ from nltk.stem.snowball import * -def stem_tokens(tokens: list, lang: str ='english'): - ''' +def stem_tokens(tokens: list, lang: str ='english')-> list: + """ Wrapper of NLTK's Snowball stemmers : http://www.nltk.org/howto/stem.html - Args: - tokens (list): list of tokens - lang ({'arabic', 'danish', 'dutch', 'english', 'finnish', 'french', + Parameters + ---------- + tokens : list + List of tokens + lang : string + Supported languages: ({'arabic', 'danish', 'dutch', 'english', 'finnish', 'french', 'german', 'hungarian', 'italian', 'norwegian', 'porter', 'portuguese', - 'romanian', 'russian', 'spanish', 'swedish'}): supported langages + 'romanian', 'russian', 'spanish', 'swedish'}): - Returns: + Returns + ------- + list list of stemmed tokens - - ''' + """ + supported_lang = [lang for lang in SnowballStemmer.languages] if lang in supported_lang: From 325d9a8e75d9570eeeff650e82ab3a58ceaba90c Mon Sep 17 00:00:00 2001 From: Kais LARIBI <kaislaribi@FRART0033M.local> Date: Thu, 9 May 2019 15:52:27 +0200 Subject: [PATCH 148/496] add text summary --- nautilus_nlp/utils/text_summary.py | 0 tests/test_text_summary.py | 0 2 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 nautilus_nlp/utils/text_summary.py create mode 100644 tests/test_text_summary.py diff --git a/nautilus_nlp/utils/text_summary.py b/nautilus_nlp/utils/text_summary.py new file mode 100644 index 0000000..e69de29 diff --git a/tests/test_text_summary.py b/tests/test_text_summary.py new file mode 100644 index 0000000..e69de29 From ed0c98f674ea415277f246e9869bb20851627a2c Mon Sep 17 00:00:00 2001 From: Kais LARIBI <kaislaribi@FRART0033M.local> Date: Thu, 9 May 2019 15:53:36 +0200 Subject: [PATCH 149/496] add summa to requirements.txt --- requirements.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/requirements.txt b/requirements.txt index 2a03758..56b12d0 100644 --- a/requirements.txt +++ b/requirements.txt @@ -38,4 +38,5 @@ vaderSentiment==3.2.1 google-compute-engine==2.8.13 flashtext==2.7 +summa From 83805559bdea8ead72938642f7a91a642751cf08 Mon Sep 17 00:00:00 2001 From: Kais LARIBI <kaislaribi@FRART0033M.local> Date: Thu, 9 May 2019 18:45:55 +0200 Subject: [PATCH 150/496] update text_summary.py --- nautilus_nlp/utils/text_summary.py | 28 ++++++++++++++++++++++++++++ tests/test_text_summary.py | 27 +++++++++++++++++++++++++++ 2 files changed, 55 insertions(+) diff --git a/nautilus_nlp/utils/text_summary.py b/nautilus_nlp/utils/text_summary.py index e69de29..ad873b3 100644 --- a/nautilus_nlp/utils/text_summary.py +++ b/nautilus_nlp/utils/text_summary.py @@ -0,0 +1,28 @@ +from summa.summarizer import summarize + + +def is_list_of_strings(lst): + """ + :param lst: list + :return: boolean indicator + """ + return bool(lst) and isinstance(lst, list) and all(isinstance(elem, str) for elem in lst) + + +def summarize_text(txt, ratio=0.2, words=None, language="english"): + """ + :param txt: Sting or list of strings containing text to summarize + :param ratio: Percentage giving the output text length in reference to the input length. + :param words: number of words of the output text + :param language: text language + :return: string containing the summarized text + """ + + if is_list_of_strings(txt): + txt = ' '.join(txt) + elif isinstance(txt, str): + pass + else: + raise ValueError("Text parameter must be a Unicode object (str) or list of str!") + return summarize(txt, ratio, words, language) + diff --git a/tests/test_text_summary.py b/tests/test_text_summary.py index e69de29..e233812 100644 --- a/tests/test_text_summary.py +++ b/tests/test_text_summary.py @@ -0,0 +1,27 @@ +from nautilus_nlp.utils.text_summary import summarize_text + +case1 = """Automatic summarization is the process of reducing a text document with a \ +computer program in order to create a summary that retains the most important points \ +of the original document. As the problem of information overload has grown, and as \ +the quantity of data has increased, so has interest in automatic summarization. \ +Technologies that can make a coherent summary take into account variables such as \ +length, writing style and syntax. An example of the use of summarization technology \ +is search engines such as Google. Document summarization is another.""" + +case2 = ["Automatic summarization is the process of reducing a text document with a " \ +"computer program in order to create a summary that retains the most important points " \ +"of the original document. ", "As the problem of information overload has grown, and as" \ +"the quantity of data has increased, so has interest in automatic summarization. "\ +"Technologies that can make a coherent summary take into account variables such as "\ +"length, writing style and syntax." ,"An example of the use of summarization technology "\ +"is search engines such as Google.", "Document summarization is another."] + +result = """Automatic summarization is the process of reducing a text document with a computer \ +program in order to create a summary that retains the most important points of the original document.""" + + +def test_summarize_text(): + # Single string containing all text + assert summarize_text(case1) == result + # Text split in many sentences (list of strings) + assert summarize_text(case2) == result From d732920563e8fb1081cc12da7f10448a4870c86f Mon Sep 17 00:00:00 2001 From: Kais LARIBI <kais.laribi@artefact.com> Date: Mon, 13 May 2019 10:04:41 +0200 Subject: [PATCH 151/496] add summa version to requirements --- requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements.txt b/requirements.txt index 37f7f50..6b788fe 100644 --- a/requirements.txt +++ b/requirements.txt @@ -36,7 +36,7 @@ scikit_learn==0.20.3 vaderSentiment==3.2.1 google-compute-engine==2.8.13 flashtext==2.7 -summa +summa==1.2.0 From 4b0f8a0e8e323a65bd893c765f9812d3b62c879f Mon Sep 17 00:00:00 2001 From: hugovasselin <waaaouu@gmail.com> Date: Fri, 17 May 2019 10:30:58 +0200 Subject: [PATCH 152/496] harmonize docstring and change function name --- nautilus_nlp/models/sentiment.py | 4 +- .../preprocessing/text_vectorizers.py | 24 +++--- nautilus_nlp/preprocessing/tokenizer.py | 81 +++++++++++++++---- nautilus_nlp/utils/tokenizer.py | 4 +- 4 files changed, 86 insertions(+), 27 deletions(-) diff --git a/nautilus_nlp/models/sentiment.py b/nautilus_nlp/models/sentiment.py index 4c0afc8..1b08ba2 100644 --- a/nautilus_nlp/models/sentiment.py +++ b/nautilus_nlp/models/sentiment.py @@ -1,4 +1,4 @@ -from nautilus_nlp.utils.tokenizer import _tokensToString, _stringToTokens +from nautilus_nlp.utils.tokenizer import _convert_tokens_to_string, _convert_string_to_tokens import textblob from textblob import Blobber @@ -11,7 +11,7 @@ def compute_sentiment_score(tokens_or_txt, lang_module='en_textblob'): ''' ''' - text = _tokensToString(tokens_or_txt) + text = _convert_tokens_to_string(tokens_or_txt) output = '' if lang_module is 'fr_textblob': tb = Blobber(pos_tagger=PatternTagger(), analyzer=PatternAnalyzer()) diff --git a/nautilus_nlp/preprocessing/text_vectorizers.py b/nautilus_nlp/preprocessing/text_vectorizers.py index a03c5bb..55d3046 100644 --- a/nautilus_nlp/preprocessing/text_vectorizers.py +++ b/nautilus_nlp/preprocessing/text_vectorizers.py @@ -11,16 +11,22 @@ class Tfidf(object): """ - Inputs a list of string - Outputs a tuple with the wordcount vector matrix, and the list of feature name - Params: - input=’content’, encoding=’utf-8’, decode_error=’strict’, strip_accents=None, - lowercase=True, preprocessor=None, tokenizer=None, analyzer=’word’, - stop_words=None, token_pattern=’(?u)\b\w\w+\b’, ngram_range=(1, 1), - max_df=1.0, min_df=1, max_features=None, vocabulary=None, binary=False, - dtype=<class ‘numpy.float64’>, norm=’l2’, use_idf=True, smooth_idf=True, sublinear_tf=False - + Inputs a list of string. + and the list of feature name. Wrapper of https://scikit-learn.org/stable/modules/generated/sklearn.feature_extraction.text.TfidfVectorizer.html + + Parameters + ---------- + input=’content’, encoding=’utf-8’, decode_error=’strict’, strip_accents=None, + lowercase=True, preprocessor=None, tokenizer=None, analyzer=’word’, + stop_words=None, token_pattern=’(?u)\b\w\w+\b’, ngram_range=(1, 1), + max_df=1.0, min_df=1, max_features=None, vocabulary=None, binary=False, + dtype=<class ‘numpy.float64’>, norm=’l2’, use_idf=True, smooth_idf=True, sublinear_tf=False + + Returns + ------- + list + Outputs a tuple with the wordcount vector matrix """ def __init__(self, **kwargs): diff --git a/nautilus_nlp/preprocessing/tokenizer.py b/nautilus_nlp/preprocessing/tokenizer.py index 6937196..1fddaa9 100644 --- a/nautilus_nlp/preprocessing/tokenizer.py +++ b/nautilus_nlp/preprocessing/tokenizer.py @@ -22,18 +22,22 @@ """) -def tokenize(text: str, lang_module: str = 'en_spacy'): +def tokenize(text: str, lang_module: str = 'en_spacy')-> list: """ - Convert text to a list of tokens. + Split text into a list of tokens. - Args: - lang_module ({'en_spacy', 'en_nltk', 'fr_spacy', 'fr_moses'}): choose + Parameters + ---------- + lang_module + ({'en_spacy', 'en_nltk', 'fr_spacy', 'fr_moses'}): choose the tokenization module according to the langage and the implementation. Recommanded: Spacy (faster, better results). To process other langages import models.Spacy_models - Returns: - list + Returns + ------- + list + Outputs a list of tokens. """ if lang_module is 'en_nltk': return nltk.word_tokenize(text) @@ -48,28 +52,77 @@ def tokenize(text: str, lang_module: str = 'en_spacy'): return t.tokenize(text, escape=False) -def untokenize(tokens, lang='fr'): - ''' - Inputs a list of tokens output string. - ["J'", 'ai'] >>> "J' ai" - ''' +def untokenize(tokens:list, lang:str='fr')->str: + """ + Inputs a list of tokens, output the text joined. + Wrapper of https://github.com/alvations/sacremoses + + Parameters + ---------- + lang + Supported languages: ({'fr', 'en', 'cs','it','ga'}) + + Returns + ------- + string + """ d = MosesDetokenizer(lang=lang) text = d.detokenize(tokens, unescape=False) return text -def _tokensToString(tokens_or_str): +def _convert_tokens_to_string(tokens_or_str, lang:str='en')->str: + """ + Test if the input is tokens or string, and convert tokens to string + using untokenize(). If the input is null, it will return an empty string. + + Parameters + ---------- + lang + Supported languages: ({'fr', 'en', 'cs','it','ga'}). + + Returns + ------- + string + + Raises + ------- + ValueError + If the input is not string, list or Nonetype. + """ if type(tokens_or_str) is str: return tokens_or_str elif type(tokens_or_str) is list: - return untokenize(tokens_or_str) + return untokenize(tokens_or_str, lang=lang) elif type(tokens_or_str) is None: return '' else: raise ValueError('Please input string or tokens') -def _stringToTokens(tokens_or_str, lang_module='en_spacy'): +def _convert_string_to_tokens(tokens_or_str, lang_module:str='en_spacy')->str: + """ + Test if the input is tokens or string, and convert string to tokens + using tokenize(). If the input is null, it will return an empty list. + + Parameters + ---------- + lang_module + ({'en_spacy', 'en_nltk', 'fr_spacy', 'fr_moses'}): choose + the tokenization module according to the langage and the implementation. + Recommanded: Spacy (faster, better results). To process other langages + import models.Spacy_models + + Returns + ------- + list + list of tokens + + Raises + ------- + ValueError + If the input is not string, list or Nonetype. + """ if type(tokens_or_str) is str: return tokenize(tokens_or_str, lang_module=lang_module) elif type(tokens_or_str) is list: diff --git a/nautilus_nlp/utils/tokenizer.py b/nautilus_nlp/utils/tokenizer.py index 94eb7aa..a009533 100644 --- a/nautilus_nlp/utils/tokenizer.py +++ b/nautilus_nlp/utils/tokenizer.py @@ -58,7 +58,7 @@ def untokenize(tokens, lang='fr'): return text -def _tokensToString(tokens_or_str): +def _convert_tokens_to_string(tokens_or_str): if type(tokens_or_str) is str: return tokens_or_str elif type(tokens_or_str) is list: @@ -69,7 +69,7 @@ def _tokensToString(tokens_or_str): raise ValueError('Please input string or tokens') -def _stringToTokens(tokens_or_str, lang_module='en_spacy'): +def _convert_string_to_tokens(tokens_or_str, lang_module='en_spacy'): if type(tokens_or_str) is str: return tokenize(tokens_or_str, lang_module=lang_module) elif type(tokens_or_str) is list: From 35d2481399b4d49b9e29e99474fef567510ac18a Mon Sep 17 00:00:00 2001 From: hugovasselin <waaaouu@gmail.com> Date: Fri, 17 May 2019 10:57:55 +0200 Subject: [PATCH 153/496] add docstring and change filename --- nautilus_nlp/models/sentiment.py | 33 ---------- nautilus_nlp/models/sentiment_detector.py | 77 +++++++++++++---------- 2 files changed, 44 insertions(+), 66 deletions(-) delete mode 100644 nautilus_nlp/models/sentiment.py diff --git a/nautilus_nlp/models/sentiment.py b/nautilus_nlp/models/sentiment.py deleted file mode 100644 index 1b08ba2..0000000 --- a/nautilus_nlp/models/sentiment.py +++ /dev/null @@ -1,33 +0,0 @@ -from nautilus_nlp.utils.tokenizer import _convert_tokens_to_string, _convert_string_to_tokens - -import textblob -from textblob import Blobber -from textblob import TextBlob -from textblob_fr import PatternTagger, PatternAnalyzer -from vaderSentiment.vaderSentiment import SentimentIntensityAnalyzer - - -def compute_sentiment_score(tokens_or_txt, lang_module='en_textblob'): - ''' - - ''' - text = _convert_tokens_to_string(tokens_or_txt) - output = '' - if lang_module is 'fr_textblob': - tb = Blobber(pos_tagger=PatternTagger(), analyzer=PatternAnalyzer()) - blob = tb(text) - output = blob.sentiment[0] - - elif lang_module is 'en_textblob': - blob = TextBlob(text) - output = blob.sentiment.polarity - - elif lang_module is 'en_vader': - analyser = SentimentIntensityAnalyzer() - snt = analyser.polarity_scores(text) - output = snt['compound'] - else: - raise ValueError('Please enter a valid module name!') - - assert output != '' - return output \ No newline at end of file diff --git a/nautilus_nlp/models/sentiment_detector.py b/nautilus_nlp/models/sentiment_detector.py index b168473..439050b 100644 --- a/nautilus_nlp/models/sentiment_detector.py +++ b/nautilus_nlp/models/sentiment_detector.py @@ -1,37 +1,48 @@ -from nautilus_nlp.models.Fasttext_classifier import Fasttext_clf as langdetect -import cld2 -import pkg_resources -lang_path = pkg_resources.resource_filename('nautilus_nlp.data', 'lang_identification.ftz') -class LangDetector(): - """ This class is to instantiante a language detector. +from nautilus_nlp.utils.tokenizer import _convert_tokens_to_string, _convert_string_to_tokens +import textblob +from textblob import Blobber +from textblob import TextBlob +from textblob_fr import PatternTagger, PatternAnalyzer +from vaderSentiment.vaderSentiment import SentimentIntensityAnalyzer + + +def compute_sentiment_score(tokens_or_txt, lang_module:str='en_textblob')->float: """ - def __init__(self,typemodel,path=lang_path,): - self.typemodel=typemodel - self.path = None if path is None else lang_path - self.model=langdetect(self.path) if typemodel=='fasttext' else None - - def detect_language(self, text_to_detect=None): - """ - Detected the language of a text - - Args: - hint_language: language you expect your text to be - - Returns: - is_reliable: is the top language is much better than 2nd best language? - language: 2-letter code for the language of the text - """ - if self.typemodel!='fasttext': - _, _, best_guesses = cld2.detect(text_to_detect, - bestEffort=True) - - if len(best_guesses) == 0 or len(best_guesses[0]) != 4 or best_guesses[0][1] == 'un': - return 'un',0 - - return best_guesses[0][1],(best_guesses[0][2]/100) - else: - best_guesses=self.model.predict(text_to_detect) - return best_guesses[0][0].replace('__label__',''),best_guesses[1][0] + Compute a sentiment score using pre-trained lexicons: TextBlob or Vader. + Output a score from -1 to 1, depending if the text is negative neutral + of positive. + + Parameters + ---------- + tokens_or_txt + the text to be processed + + lang_module + ('fr_textblob','en_textblob','en_vader') + + Returns + ------- + float + Polarity score from -1 to 1 + """ + text = _convert_tokens_to_string(tokens_or_txt) + output = '' + if lang_module is 'fr_textblob': + tb = Blobber(pos_tagger=PatternTagger(), analyzer=PatternAnalyzer()) + blob = tb(text) + output = blob.sentiment[0] + + elif lang_module is 'en_textblob': + blob = TextBlob(text) + output = blob.sentiment.polarity + elif lang_module is 'en_vader': + analyser = SentimentIntensityAnalyzer() + snt = analyser.polarity_scores(text) + output = snt['compound'] + else: + raise ValueError('Please enter a valid module name!') + assert output != '' + return output \ No newline at end of file From 8eed96d1f6a9fa0035dc2bd9e326f2f6af2ab0ed Mon Sep 17 00:00:00 2001 From: hugovasselin <waaaouu@gmail.com> Date: Fri, 17 May 2019 11:11:50 +0200 Subject: [PATCH 154/496] fix remove_tokens_with_nonletters --- nautilus_nlp/preprocessing/preprocess.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/nautilus_nlp/preprocessing/preprocess.py b/nautilus_nlp/preprocessing/preprocess.py index 57bac0d..08e6c69 100644 --- a/nautilus_nlp/preprocessing/preprocess.py +++ b/nautilus_nlp/preprocessing/preprocess.py @@ -31,7 +31,6 @@ def remove_multiple_spaces_and_strip_text(text: str) -> str: ------- string the text with removed multiple spaces and strip text - """ regex_remove_multiple_spaces_list = ["\\t", "[\\s\\-\\*]{2,}"] for regex_remove_multiple_spaces in regex_remove_multiple_spaces_list: @@ -71,7 +70,7 @@ def remove_tokens_with_nonletters(tokens: list) -> list: list list of tokens without tokens with numbers """ - return [word for word in tokens if re.search("[a-zA-Z]", word)] + return [word for word in tokens if re.search("[^a-zA-Z]", word) is None] def remove_special_caracters_from_tokenslist(tokens: list) -> list: From f8ddb874826e5af7327555f85539438a93d99cfc Mon Sep 17 00:00:00 2001 From: hugovasselin <waaaouu@gmail.com> Date: Fri, 17 May 2019 11:12:21 +0200 Subject: [PATCH 155/496] fix test_unpack_english_contractions test --- tests/test_preprocessor.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/test_preprocessor.py b/tests/test_preprocessor.py index 24f4658..7e11dce 100644 --- a/tests/test_preprocessor.py +++ b/tests/test_preprocessor.py @@ -136,7 +136,7 @@ def test_normalize_whitespace(input_str, expected_str): ("Let's go!",'Let us go!'), ("You've been missing",'You have been missing'), ("I'm sure you're leaving",'I am sure you are leaving'), - ("We'll survive.","We will survive") + ("We'll survive.","We will survive.") ] ) def test_unpack_english_contractions(input_str, expected_str): From 70884150708370c6ba9832724dd163f93a145c76 Mon Sep 17 00:00:00 2001 From: hugovasselin <waaaouu@gmail.com> Date: Fri, 17 May 2019 11:20:09 +0200 Subject: [PATCH 156/496] fix replace_url --- nautilus_nlp/utils/constants.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/nautilus_nlp/utils/constants.py b/nautilus_nlp/utils/constants.py index b694acf..341e93a 100644 --- a/nautilus_nlp/utils/constants.py +++ b/nautilus_nlp/utils/constants.py @@ -143,10 +143,10 @@ LINEBREAK_REGEX = re.compile(r"((\r\n)|[\n\v])+") NONBREAKING_SPACE_REGEX = re.compile(r"(?!\n)\s+") URL_REGEX = re.compile( - r"(?:^|(?<![\w/.]))" + r"(?:|(?<![\w/.]))" # protocol identifier # r"(?:(?:https?|ftp)://)" <-- alt? - r"(?:(?:https?://|ftp://|www\d{0,3}\.))" + r"(?:(?:https?://|mailto:|ftp://|www\d{0,3}\.))" # user:pass authentication r"(?:\S+(?::\S*)?@)?" r"(?:" # IP address exclusion From 06dea5347952ae3af809f5767cfdb22c3a4a254e Mon Sep 17 00:00:00 2001 From: hugovasselin <waaaouu@gmail.com> Date: Fri, 17 May 2019 11:23:15 +0200 Subject: [PATCH 157/496] fix remove_special_caracters_from_tokenslist test --- tests/test_preprocessor.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/test_preprocessor.py b/tests/test_preprocessor.py index 7e11dce..ae511e4 100644 --- a/tests/test_preprocessor.py +++ b/tests/test_preprocessor.py @@ -58,7 +58,7 @@ def test_remove_tokens_with_nonletters(): def test_remove_special_caracters_from_tokenslist(): input_tokens = ['foo','bar','---',"'s",'#'] expected_output = ['foo','bar',"'s"] - result = remove_tokens_with_nonletters(input_tokens) + result = remove_special_caracters_from_tokenslist(input_tokens) np.testing.assert_array_equal(result, expected_output) From 63a02675af43d2d628930d394e3517b373023603 Mon Sep 17 00:00:00 2001 From: hugovasselin <waaaouu@gmail.com> Date: Fri, 17 May 2019 11:31:51 +0200 Subject: [PATCH 158/496] remove bad test --- tests/test_preprocessor.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/test_preprocessor.py b/tests/test_preprocessor.py index ae511e4..070c315 100644 --- a/tests/test_preprocessor.py +++ b/tests/test_preprocessor.py @@ -166,7 +166,7 @@ def test_replace_urls(input_str, expected_str): ("my email:hugo.vasselin@artefact.com","my email:*EMAIL*"), ("v543143@nwytg.net is a temporary email", "*EMAIL* is a temporary email"), ("our emails used to be name.surname@artefact.is","our emails used to be *EMAIL*"), - ("chaudasse_du_13@hotmail.frC ton email bb?",'*EMAIL*C ton email bb?') + ("chaudasse_du_13@hotmail.fr,C ton email bb?",'*EMAIL*,C ton email bb?') ] ) def test_replace_emails(input_str, expected_str): From 6dbd85d41c3dfc47a859ec87b241751fc9338903 Mon Sep 17 00:00:00 2001 From: hugovasselin <waaaouu@gmail.com> Date: Fri, 17 May 2019 17:24:24 +0200 Subject: [PATCH 159/496] add phonenumber --- requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements.txt b/requirements.txt index 3ec0a3a..2038b34 100644 --- a/requirements.txt +++ b/requirements.txt @@ -36,6 +36,6 @@ scikit_learn==0.20.3 vaderSentiment==3.2.1 google-compute-engine==2.8.13 flashtext==2.7 - +phonenumbers==8.10.12 From af025b32964340fecff909ed555cb79a48c19583 Mon Sep 17 00:00:00 2001 From: hugovasselin <waaaouu@gmail.com> Date: Fri, 17 May 2019 18:35:41 +0200 Subject: [PATCH 160/496] add detector #86 --- nautilus_nlp/preprocessing/preprocess.py | 46 ++++++++-- nautilus_nlp/utils/phone_number.py | 111 +++++++++++++++++++++++ tests/test_preprocessor.py | 10 +- 3 files changed, 156 insertions(+), 11 deletions(-) create mode 100644 nautilus_nlp/utils/phone_number.py diff --git a/nautilus_nlp/preprocessing/preprocess.py b/nautilus_nlp/preprocessing/preprocess.py index 08e6c69..2722b53 100644 --- a/nautilus_nlp/preprocessing/preprocess.py +++ b/nautilus_nlp/preprocessing/preprocess.py @@ -11,6 +11,7 @@ from stop_words import get_stop_words as _get_stop_words from stop_words import LANGUAGE_MAPPING as _LANGUAGE_MAPPING +from nautilus_nlp.utils.phone_number import extract_phone_numbers as _extract_phone_numbers from nautilus_nlp.utils import constants from nautilus_nlp.config.config import ROOT_FOLDER from nautilus_nlp.utils.file_loader import documents_loader @@ -301,7 +302,10 @@ def replace_emails(text, replace_with="*EMAIL*") -> str: return constants.EMAIL_REGEX.sub(replace_with, text) -def replace_phone_numbers(text, replace_with="*PHONE*") -> str: + +def replace_phone_numbers(text, replace_with:str="*PHONE*", + method:str="regex", + country_format_to_detect:list=[None,'FR','US','GB']) -> str: """ Replace all phone numbers in ``text`` str with ``replace_with`` str @@ -310,12 +314,30 @@ def replace_phone_numbers(text, replace_with="*PHONE*") -> str: text : string replace_with : string the string you want the phone number to be replaced with. - + method : ['regex','detection'] + regex is faster but will omit a lot of numbers, while detection will + catch every numbers, but takes a while. + country_format_to_detect : list + If a list of country code is specified, will catch every number formatted. + Only when method = 'detection'. Returns ------- string - """ - return constants.PHONE_REGEX.sub(replace_with, text) + """ + if method == 'regex': + return constants.PHONE_REGEX.sub(replace_with, text) + + elif method == 'detection': + found_nums = _extract_phone_numbers(text, countrylist=country_format_to_detect) + + # order by lenght to avoid truncated numbers to be removed first. + found_nums.sort(key=len,reverse=True) + for phone_number in found_nums: + text = text.replace(phone_number, replace_with) + + return text + else: + raise ValueError('Please input a valid method between "regex" or "detection"') def replace_numbers(text, replace_with="*NUMBER*") -> str: @@ -467,7 +489,9 @@ def preprocess_text( no_accents=False, no_emoji=False, replace_with=None, - no_stopwords=None + no_stopwords=None, + phone_countries_format=[None,'US','FR'], + phone_method='regex' ) -> str: """ Normalize various aspects of a raw text doc. A convenience function for @@ -514,7 +538,13 @@ def preprocess_text( 'zu', 'da', 'de', 'es', 'et', 'fi', 'fr', 'hr', 'hu', 'it', 'ko', 'nl', 'no', 'pl', 'pt', 'ru', 'sv', 'tr', 'zh', 'eo', 'he', 'la', 'sk', 'sl', 'br', 'ca', 'cs', 'el', 'eu', 'ga', 'gl', 'hy', 'id', 'ja', 'lv', 'th', - 'ar', 'bg', 'bn', 'fa', 'hi', 'mr', 'ro', 'en'] + 'ar', 'bg', 'bn', 'fa', 'hi', 'mr', 'ro', 'en'] + phone_countries_format : list + formats of the phone numbers to be removed. Full list is available at + utils.SUPPORTED_COUNTRY + phone_method : ['regex','detection'] + regex is faster but will omit a lot of numbers, while detection will + catch every numbers, but takes a while. Returns ------- string @@ -534,7 +564,9 @@ def preprocess_text( if no_emails is True: text = replace_emails(text, replace_with=replace_with) if no_phone_numbers is True: - text = replace_phone_numbers(text, replace_with=replace_with) + text = replace_phone_numbers(text, replace_with=replace_with, + method=phone_method, + country_format_to_detect=phone_countries_format) if no_numbers is True: text = replace_numbers(text, replace_with=replace_with) if no_currency_symbols is True: diff --git a/nautilus_nlp/utils/phone_number.py b/nautilus_nlp/utils/phone_number.py new file mode 100644 index 0000000..83f84d3 --- /dev/null +++ b/nautilus_nlp/utils/phone_number.py @@ -0,0 +1,111 @@ +import re +import phonenumbers as _phonenumbers + +SUPPORTED_COUNTRY = [None, 'US', 'AG', 'AI', 'AS', 'BB', 'BM', 'BS', 'CA', 'DM', + 'GD', 'GU', 'JM', 'KN', 'KY', 'LC', 'MP', 'MS', 'PR', 'SX', 'TC', 'TT', + 'VC', 'VG', 'VI', 'RU', 'KZ', 'EG', 'ZA', 'GR', 'NL', 'BE', 'FR', 'ES', + 'HU', 'IT', 'VA', 'RO', 'CH', 'AT', 'GB', 'GG', 'IM', 'JE', 'DK', 'SE', + 'NO', 'SJ', 'PL', 'DE', 'PE', 'MX', 'CU', 'AR', 'BR', 'CL', 'CO', 'VE', + 'MY', 'AU', 'CC', 'CX', 'ID', 'PH', 'NZ', 'SG', 'TH', 'JP', 'KR', 'VN', + 'CN', 'TR', 'IN', 'PK', 'AF', 'LK', 'MM', 'IR', 'SS', 'MA', 'EH', 'DZ', + 'TN', 'LY', 'GM', 'SN', 'MR', 'ML', 'GN', 'CI', 'BF', 'NE', 'TG', 'BJ', + 'MU', 'LR', 'SL', 'GH', 'NG', 'TD', 'CF', 'CM', 'CV', 'ST', 'GQ', 'GA', + 'CG', 'CD', 'AO', 'GW', 'IO', 'AC', 'SC', 'SD', 'RW', 'ET', 'SO', 'DJ', + 'KE', 'TZ', 'UG', 'BI', 'MZ', 'ZM', 'MG', 'RE', 'YT', 'ZW', 'NA', 'MW', + 'LS', 'BW', 'SZ', 'KM', 'SH', 'TA', 'ER', 'AW', 'FO', 'GL', 'GI', 'PT', + 'LU', 'IE', 'IS', 'AL', 'MT', 'CY', 'FI', 'AX', 'BG', 'LT', 'LV', 'EE', + 'MD', 'AM', 'BY', 'AD', 'MC', 'SM', 'UA', 'RS', 'ME', 'XK', 'HR', 'SI', + 'BA', 'MK', 'CZ', 'SK', 'LI', 'FK', 'BZ', 'GT', 'SV', 'HN', 'NI', 'CR', + 'PA', 'PM', 'HT', 'GP', 'BL', 'MF', 'BO', 'GY', 'EC', 'GF', 'PY', 'MQ', + 'SR', 'UY', 'CW', 'BQ', 'TL', 'NF', 'BN', 'NR', 'PG', 'TO', 'SB', 'VU', + 'FJ', 'PW', 'WF', 'CK', 'NU', 'WS', 'KI', 'NC', 'TV', 'PF', 'TK', 'FM', + 'MH', 'KP', 'HK', 'MO', 'KH', 'LA', 'BD', 'TW', 'MV', 'LB', 'JO', 'SY', + 'IQ', 'KW', 'SA', 'YE', 'OM', 'PS', 'AE', 'IL', 'BH', 'QA', 'BT', 'MN', + 'NP', 'TJ', 'TM', 'AZ', 'GE', 'KG', 'UZ','DO'] + + +def find_phone_numbers(string, region_code=None): + """ + Python port of Google's libphonenumber. + https://github.com/daviddrysdale/python-phonenumbers + + Parameters + ---------- + region_code + If specified, will find the number of the specified country. + eg. 06.25.09.32.67 if "FR" is specified. + + If not specified, only works for international-formatted phone numbers. + - ie. phone number with +counttry code specified + eg. 06.25.09.32.67 will return an error but +33 6 25 09 32 67 will work. + + region_code + supported value: look SUPPORTED_COUNTRY variable. + + """ + if region_code not in SUPPORTED_COUNTRY: + raise ValueError('Please enter a valid contry code. See SUPPORTED_COUNTRY list.') + + return [match.raw_string for match in _phonenumbers.PhoneNumberMatcher(string, region_code)] + + +def extract_phone_numbers(string:str, countrylist:list=[None,'FR','US','GB'])->list: + ''' + Find phone numbers in a string, returns a list of phone numbers. + + Parameters + ---------- + countrylist: list + Look for phone numbers formatted according to the specified countlist. + supported value: look SUPPORTED_COUNTRY variable. + ''' + res = [] + for country in countrylist: + new_numbers_founds = find_phone_numbers(string, region_code=country) + res += new_numbers_founds + return list(set(res)) + + +class PhoneParser(object): + """ + Python port of Google's libphonenumber. + https://github.com/daviddrysdale/python-phonenumbers + """ + + def __init__(self): + self.region_code = None + self.string = None + self.parsed_num = None + + def parse_number(self, string:str, region_code=None): + ''' + Parameters + ---------- + region_code + If specified, will find the number of the specified country. + eg. 06.25.09.32.67 if "FR" is specified. + + If not specified, only works for international-formatted phone numbers. + - ie. phone number with +counttry code specified + eg. 06.25.09.32.67 will return an error but +33 6 25 09 32 67 will work. + + region_code + supported value: look SUPPORTED_COUNTRY variable. + + Raises + ------ + NumberParseException + If the string doesn't contains phone number of is the parser fails. + ''' + self.region_code = region_code + self.string = string + self.parsed_num = _phonenumbers.parse(self.string, self.region_code) + return self.parsed_num + + def format_number(self, num_format): + ''' + ['E164','INTERNATIONAL','NATIONAL','RFC3966'] + ''' + standard_format = exec('phonenumbers.PhoneNumberFormat.'+num_format) + + return _phonenumbers.format_number(self.parsed_num, standard_format) \ No newline at end of file diff --git a/tests/test_preprocessor.py b/tests/test_preprocessor.py index 070c315..46c2fb4 100644 --- a/tests/test_preprocessor.py +++ b/tests/test_preprocessor.py @@ -19,7 +19,7 @@ remove_punct, remove_emoji ) - +import nautilus_nlp.utils.phone_number as phone @pytest.mark.parametrize( "input_str, expected_str", @@ -187,12 +187,14 @@ def test_replace_emails(input_str, expected_str): ('(541) 754-3010 is a US. Phone','*NUMBER* is a US. Phone'), ('+1-541-754-3010 is an international Phone','*NUMBER* is an international Phone'), ('+1-541-754-3010 Dialed in the US','*NUMBER* Dialed in the US'), - ('+1-541-754-3010 Dialed from Germany','*NUMBER* Dialed from Germany'), - ('191 541 754 3010 Dialed from France','*NUMBER* Dialed from France') + ('+1-541-754-3010 Dialed from Germany','*NUMBER* Dialed from Germany') ] ) def test_replace_phone_numbers(input_str, expected_str): - result = replace_phone_numbers(input_str) + result = replace_phone_numbers(input_str, replace_with="*NUMBER*", + method="detection", + country_format_to_detect=phone.SUPPORTED_COUNTRY + ) np.testing.assert_equal(result, expected_str) From 708efd8117f8770f9bb905fc63bb8d7269592352 Mon Sep 17 00:00:00 2001 From: William Jaubert <jaubert.william@gmail.com> Date: Tue, 21 May 2019 11:51:54 +0200 Subject: [PATCH 161/496] updated topic modeling notebook with mallet+script --- nautilus_nlp/models/topic_modeling.py | 5 +- notebooks/TopicModeling.ipynb | 383 +++++++++++++------------- 2 files changed, 200 insertions(+), 188 deletions(-) diff --git a/nautilus_nlp/models/topic_modeling.py b/nautilus_nlp/models/topic_modeling.py index 6fcbda0..3885dd6 100644 --- a/nautilus_nlp/models/topic_modeling.py +++ b/nautilus_nlp/models/topic_modeling.py @@ -221,13 +221,15 @@ def visualize_topics(model, bow_corpus, dictionary, model_type=None): """ if model_type == 'mallet': model_vis = gensim.models.wrappers.ldamallet.malletmodel2ldamodel(model) + vis_data = pyLDAvis.gensim.prepare(model_vis, bow_corpus, dictionary) elif model_type == 'gensim': model_vis = model + vis_data = pyLDAvis.gensim.prepare(model_vis, bow_corpus, dictionary) elif model_type is None: raise ValueError('You forgot to precise your model type, it must be: gensim or mallet') else: raise ValueError('Please enter a valid model name: gensim or mallet') - return pyLDAvis.gensim.prepare(model_vis, bow_corpus, dictionary) + return pyLDAvis.display(vis_data) def save_pyldavis(pyldavis, vis_path, vis_name): """ Save the pyldavis interactive chart @@ -238,6 +240,7 @@ def save_pyldavis(pyldavis, vis_path, vis_name): return pyLDAvis.save_html(pyldavis, os.path.join(vis_path, vis_name + '{}'.format('.html'))) + def show_pyldavis(vis_path, vis_name): """ Display the HTML of the saved pyldavis interactive chart vis_path: str diff --git a/notebooks/TopicModeling.ipynb b/notebooks/TopicModeling.ipynb index 24fe053..9c5707d 100644 --- a/notebooks/TopicModeling.ipynb +++ b/notebooks/TopicModeling.ipynb @@ -9,7 +9,7 @@ }, { "cell_type": "code", - "execution_count": 8, + "execution_count": 1, "metadata": {}, "outputs": [], "source": [ @@ -20,7 +20,7 @@ }, { "cell_type": "code", - "execution_count": 9, + "execution_count": 2, "metadata": {}, "outputs": [ { @@ -44,18 +44,9 @@ }, { "cell_type": "code", - "execution_count": 10, + "execution_count": 3, "metadata": {}, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "/Users/williamjaubert/anaconda2/envs/nautilus/lib/python3.7/site-packages/nltk/decorators.py:68: DeprecationWarning: `formatargspec` is deprecated since Python 3.5. Use `signature` and the `Signature` object directly\n", - " regargs, varargs, varkwargs, defaults, formatvalue=lambda value: \"\"\n" - ] - } - ], + "outputs": [], "source": [ "import gensim\n", "from gensim.utils import simple_preprocess\n", @@ -73,7 +64,7 @@ }, { "cell_type": "code", - "execution_count": 11, + "execution_count": 4, "metadata": {}, "outputs": [], "source": [ @@ -92,7 +83,7 @@ }, { "cell_type": "code", - "execution_count": 12, + "execution_count": 5, "metadata": {}, "outputs": [], "source": [ @@ -111,7 +102,7 @@ }, { "cell_type": "code", - "execution_count": 13, + "execution_count": 6, "metadata": {}, "outputs": [], "source": [ @@ -121,7 +112,7 @@ }, { "cell_type": "code", - "execution_count": 14, + "execution_count": 7, "metadata": {}, "outputs": [], "source": [ @@ -130,7 +121,7 @@ }, { "cell_type": "code", - "execution_count": 15, + "execution_count": 8, "metadata": {}, "outputs": [], "source": [ @@ -140,7 +131,7 @@ }, { "cell_type": "code", - "execution_count": 16, + "execution_count": 9, "metadata": {}, "outputs": [], "source": [ @@ -149,7 +140,7 @@ }, { "cell_type": "code", - "execution_count": 17, + "execution_count": 10, "metadata": {}, "outputs": [], "source": [ @@ -159,7 +150,7 @@ }, { "cell_type": "code", - "execution_count": 18, + "execution_count": 11, "metadata": {}, "outputs": [], "source": [ @@ -168,7 +159,7 @@ }, { "cell_type": "code", - "execution_count": 20, + "execution_count": 12, "metadata": {}, "outputs": [ { @@ -302,12 +293,19 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "### Step 5: Running LDA using Bag of Words" + "### Step 5: Running LDA using Bag of Words with Gensim or Mallet" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "#### Gensim" ] }, { "cell_type": "code", - "execution_count": 12, + "execution_count": 13, "metadata": {}, "outputs": [], "source": [ @@ -317,25 +315,26 @@ }, { "cell_type": "code", - "execution_count": 13, + "execution_count": 14, "metadata": {}, "outputs": [], "source": [ + "# By default the model used will be gensim implementation of LDA\n", "model = train_lda_model(bow_corpus, dictionary, 10)" ] }, { "cell_type": "code", - "execution_count": 14, + "execution_count": 15, "metadata": {}, "outputs": [ { "data": { "text/plain": [ - "<gensim.models.ldamodel.LdaModel at 0x1a2af3e208>" + "<gensim.models.ldamodel.LdaModel at 0x10a171ef0>" ] }, - "execution_count": 14, + "execution_count": 15, "metadata": {}, "output_type": "execute_result" } @@ -346,26 +345,26 @@ }, { "cell_type": "code", - "execution_count": 15, + "execution_count": 53, "metadata": {}, "outputs": [], "source": [ - "# Save model\n", + "# Save model: The model will be saved on your current emplacement.\n", "from nautilus_nlp.models.topic_modeling import save_model" ] }, { "cell_type": "code", - "execution_count": 16, + "execution_count": 54, "metadata": {}, "outputs": [], "source": [ - "save_model(model,'/Users/williamjaubert/Documents/Allianz_William/notebook', 'ldamodel_nautilus')" + "save_model(model, 'ldamodel_nautilus')" ] }, { "cell_type": "code", - "execution_count": 152, + "execution_count": 24, "metadata": {}, "outputs": [], "source": [ @@ -374,32 +373,90 @@ }, { "cell_type": "code", - "execution_count": 17, + "execution_count": 55, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "<gensim.models.ldamodel.LdaModel at 0x1a3142fc88>" + ] + }, + "execution_count": 55, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "model_loaded = load_model('/Users/williamjaubert/nautilus_nlp/notebooks', 'ldamodel_nautilus')\n", + "model_loaded" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "#### Mallet " + ] + }, + { + "cell_type": "code", + "execution_count": 22, "metadata": {}, "outputs": [], "source": [ - "from nautilus_nlp.models.topic_modeling import load_model" + "# You can train Mallet model by precising 'mallet' in the model parameter and give the path where the mallet-2.0.8 file that has been downloaded \n", + "model_mallet = train_lda_model(bow_corpus, dictionary, 10, model='mallet', mallet_path='/Users/williamjaubert/nautilus_nlp')" ] }, { "cell_type": "code", - "execution_count": 18, + "execution_count": 23, "metadata": {}, "outputs": [ { "data": { "text/plain": [ - "<gensim.models.ldamodel.LdaModel at 0x1a29985b38>" + "<gensim.models.wrappers.ldamallet.LdaMallet at 0x1a2eb0e320>" ] }, - "execution_count": 18, + "execution_count": 23, "metadata": {}, "output_type": "execute_result" } ], "source": [ - "model_loaded = load_model('/Users/williamjaubert/Documents/Allianz_William/notebook', 'ldamodel_nautilus')\n", - "model_loaded" + "model_mallet" + ] + }, + { + "cell_type": "code", + "execution_count": 47, + "metadata": {}, + "outputs": [], + "source": [ + "save_model(model_mallet, 'ldamodel_mallet_nautilus')" + ] + }, + { + "cell_type": "code", + "execution_count": 52, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "<gensim.models.wrappers.ldamallet.LdaMallet at 0x1a30d1e550>" + ] + }, + "execution_count": 52, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "model_mallet_loaded = load_model('/Users/williamjaubert/nautilus_nlp/notebooks', 'ldamodel_mallet_nautilus', model='mallet')\n", + "model_mallet_loaded" ] }, { @@ -411,7 +468,7 @@ }, { "cell_type": "code", - "execution_count": 19, + "execution_count": 56, "metadata": {}, "outputs": [], "source": [ @@ -421,8 +478,10 @@ }, { "cell_type": "code", - "execution_count": 155, - "metadata": {}, + "execution_count": 30, + "metadata": { + "collapsed": true + }, "outputs": [ { "name": "stderr", @@ -445,10 +504,10 @@ "<link rel=\"stylesheet\" type=\"text/css\" href=\"https://cdn.rawgit.com/bmabey/pyLDAvis/files/ldavis.v1.0.0.css\">\n", "\n", "\n", - "<div id=\"ldavis_el591011124095238088809029897\"></div>\n", + "<div id=\"ldavis_el155871124265505206097197808\"></div>\n", "<script type=\"text/javascript\">\n", "\n", - "var ldavis_el591011124095238088809029897_data = {\"mdsDat\": {\"x\": [-0.07866945427665124, -0.01699948489792914, 0.20896689238873523, 0.14744605031212607, -0.008849073212760983, -0.04505413872814077, -0.08949897686453376, 0.10780299734830809, 0.004524270451044093, -0.22966908252019716], \"y\": [-0.15170611822961017, -0.1504468301902949, 0.08013685816591506, 0.13647834612774523, -0.009046128981188077, 0.003906923765221535, 0.14472746444813225, -0.07737607739594787, -0.1051004751701791, 0.1284260374602061], \"topics\": [1, 2, 3, 4, 5, 6, 7, 8, 9, 10], \"cluster\": [1, 1, 1, 1, 1, 1, 1, 1, 1, 1], \"Freq\": [13.182504653930664, 12.926197052001953, 12.463006973266602, 11.995771408081055, 9.55910873413086, 9.468682289123535, 8.927140235900879, 7.882134437561035, 7.024929523468018, 6.5705246925354]}, \"tinfo\": {\"Category\": [\"Default\", \"Default\", \"Default\", \"Default\", \"Default\", \"Default\", \"Default\", \"Default\", \"Default\", \"Default\", \"Default\", \"Default\", \"Default\", \"Default\", \"Default\", \"Default\", \"Default\", \"Default\", \"Default\", \"Default\", \"Default\", \"Default\", \"Default\", \"Default\", \"Default\", \"Default\", \"Default\", \"Default\", \"Default\", \"Default\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\"], \"Freq\": [2966.0, 1940.0, 1924.0, 1689.0, 2638.0, 2883.0, 1860.0, 1161.0, 1997.0, 1477.0, 1274.0, 1017.0, 1577.0, 1423.0, 1059.0, 1331.0, 1142.0, 2599.0, 837.0, 1391.0, 6052.0, 742.0, 990.0, 784.0, 1802.0, 1023.0, 4004.0, 867.0, 1191.0, 747.0, 1142.053466796875, 698.051025390625, 406.8222961425781, 375.23699951171875, 365.2066650390625, 324.94189453125, 317.34423828125, 293.73358154296875, 242.91064453125, 242.6265411376953, 238.57518005371094, 222.68365478515625, 219.24806213378906, 497.52392578125, 182.9066925048828, 189.0950927734375, 180.77523803710938, 167.61569213867188, 170.06529235839844, 162.4676055908203, 156.04241943359375, 152.99142456054688, 147.4279327392578, 144.96324157714844, 144.00845336914062, 142.54815673828125, 140.01528930664062, 137.27037048339844, 111.63591766357422, 111.36140441894531, 296.46563720703125, 234.76368713378906, 534.498779296875, 227.3394775390625, 733.4286499023438, 290.5852355957031, 1027.818603515625, 194.50514221191406, 462.2489929199219, 638.7830200195312, 383.04254150390625, 557.0740966796875, 270.9013671875, 346.3726501464844, 2339.714599609375, 353.4006042480469, 956.244140625, 1366.7689208984375, 489.0564880371094, 1502.89306640625, 432.21966552734375, 423.68536376953125, 946.1923828125, 647.3731689453125, 868.969970703125, 843.2189331054688, 679.2139892578125, 536.1270751953125, 452.23504638671875, 627.3469848632812, 723.7830200195312, 487.529541015625, 627.237060546875, 480.2855529785156, 485.9232482910156, 520.519287109375, 439.0638122558594, 1273.8934326171875, 843.1687622070312, 687.6259155273438, 378.13519287109375, 599.566650390625, 284.1808166503906, 264.9247131347656, 257.7122802734375, 233.3790283203125, 198.55160522460938, 196.56007385253906, 186.4253692626953, 185.77682495117188, 190.4823760986328, 160.68319702148438, 157.2107391357422, 147.51388549804688, 143.9427032470703, 141.29263305664062, 132.9550323486328, 132.7094268798828, 136.2650604248047, 134.08621215820312, 122.39493560791016, 117.66445922851562, 110.7325210571289, 103.35787200927734, 103.81564331054688, 102.61417388916016, 191.171142578125, 1897.55224609375, 734.2091674804688, 595.35400390625, 628.1231079101562, 206.7904815673828, 246.95516967773438, 800.1998901367188, 749.1170043945312, 336.15264892578125, 271.74371337890625, 265.7127990722656, 398.02044677734375, 574.3276977539062, 250.16622924804688, 378.8575744628906, 461.7618408203125, 1507.1781005859375, 256.8684997558594, 577.097900390625, 989.1630249023438, 369.29083251953125, 600.9321899414062, 735.2871704101562, 547.2880249023438, 671.5233154296875, 658.334716796875, 983.666259765625, 1571.5150146484375, 640.5947875976562, 527.5059204101562, 1109.0411376953125, 876.4497680664062, 725.8155517578125, 862.159912109375, 662.5055541992188, 745.251953125, 665.8281860351562, 603.2254028320312, 672.0674438476562, 613.41943359375, 579.7627563476562, 513.5291137695312, 478.60107421875, 261.23309326171875, 304.4447937011719, 182.0543975830078, 164.44281005859375, 158.4560546875, 152.0279083251953, 137.8629150390625, 135.1473846435547, 117.27381896972656, 101.5247573852539, 100.54000091552734, 94.55840301513672, 94.07215118408203, 92.82543182373047, 88.48568725585938, 85.05994415283203, 77.8740005493164, 76.19078063964844, 74.76761627197266, 76.91588592529297, 66.26870727539062, 65.83450317382812, 62.59058380126953, 61.630924224853516, 56.66929244995117, 56.645973205566406, 56.47174072265625, 56.24151611328125, 433.3631896972656, 57.639102935791016, 175.34927368164062, 811.6905517578125, 352.3057861328125, 460.812255859375, 1244.349853515625, 397.7268981933594, 319.0634765625, 364.1428527832031, 817.1531372070312, 179.1089630126953, 759.2709350585938, 353.8210754394531, 767.8507690429688, 704.0316772460938, 1031.0333251953125, 338.7200927734375, 853.117919921875, 1558.565673828125, 1291.274169921875, 922.3545532226562, 1345.4871826171875, 471.7730407714844, 490.044677734375, 677.4464111328125, 1059.08154296875, 853.1986083984375, 843.7091064453125, 1006.580078125, 803.4461669921875, 784.5733642578125, 584.6500854492188, 572.8038330078125, 507.68548583984375, 934.7852172851562, 496.4774169921875, 583.20458984375, 623.8618774414062, 588.018798828125, 614.8836059570312, 528.0966796875, 511.22735595703125, 511.70477294921875, 866.5625, 316.72491455078125, 249.29571533203125, 229.9024200439453, 228.7355194091797, 211.55052185058594, 183.0289764404297, 166.1912841796875, 164.7910919189453, 155.55848693847656, 157.89810180664062, 359.6870422363281, 133.46632385253906, 124.17170715332031, 122.31271362304688, 117.03710174560547, 111.25904083251953, 110.83535766601562, 109.16374969482422, 103.2101821899414, 98.91426849365234, 514.7677612304688, 89.62791442871094, 82.74832153320312, 81.71601104736328, 103.25068664550781, 75.25823974609375, 75.21469116210938, 70.78433990478516, 69.34544372558594, 281.78009033203125, 311.1195983886719, 971.2630004882812, 208.0179901123047, 697.1331787109375, 367.6048889160156, 1416.3004150390625, 441.63726806640625, 604.5337524414062, 578.8893432617188, 377.5198974609375, 192.00442504882812, 648.3333129882812, 1969.8912353515625, 938.5662841796875, 446.4165954589844, 632.349853515625, 658.6181030273438, 1989.853515625, 746.8209838867188, 677.7993774414062, 282.14984130859375, 467.3210144042969, 480.8096008300781, 1419.96630859375, 633.1287841796875, 1121.6055908203125, 955.2998046875, 821.8631591796875, 1269.9896240234375, 524.8942260742188, 1015.9119262695312, 611.8196411132812, 745.4178466796875, 688.518310546875, 667.1979370117188, 692.5172729492188, 593.0750732421875, 527.0308837890625, 546.2483520507812, 266.1346740722656, 171.08937072753906, 155.6071014404297, 226.88490295410156, 131.5532684326172, 110.63844299316406, 109.71115112304688, 476.2266540527344, 123.79460144042969, 96.52826690673828, 90.6929702758789, 86.91134643554688, 84.75259399414062, 84.67416381835938, 83.132080078125, 249.04006958007812, 73.44264221191406, 70.66631317138672, 70.3055419921875, 68.83519744873047, 66.711181640625, 65.8822250366211, 60.60839080810547, 60.293426513671875, 59.59612274169922, 59.43571472167969, 59.13909149169922, 58.31281661987305, 57.815277099609375, 57.416988372802734, 405.0425720214844, 341.4366455078125, 190.89840698242188, 246.23365783691406, 163.5123748779297, 257.450927734375, 138.4132537841797, 165.08370971679688, 521.0137939453125, 1046.2774658203125, 1400.850341796875, 228.16041564941406, 286.63897705078125, 343.24639892578125, 185.74090576171875, 229.64581298828125, 175.05548095703125, 332.4627990722656, 163.81402587890625, 539.6653442382812, 256.2196960449219, 439.739990234375, 517.5452270507812, 403.49468994140625, 229.62326049804688, 866.29833984375, 846.667236328125, 313.1244812011719, 322.8232727050781, 286.90380859375, 653.3579711914062, 749.8698120117188, 426.6073913574219, 380.0177307128906, 366.8009338378906, 372.0513000488281, 408.4660949707031, 415.6255187988281, 394.1338806152344, 394.38397216796875, 349.50030517578125, 362.36224365234375, 340.7713928222656, 296.1283264160156, 297.5120544433594, 494.6736145019531, 745.9381103515625, 324.6826171875, 301.4449157714844, 243.7447509765625, 158.0723114013672, 107.36814880371094, 95.01725769042969, 99.29867553710938, 90.99311828613281, 88.6338119506836, 79.3241195678711, 77.81040954589844, 76.27904510498047, 74.54589080810547, 68.68617248535156, 66.95494079589844, 65.45933532714844, 64.79324340820312, 62.89622497558594, 62.08100891113281, 61.05073547363281, 61.06211853027344, 58.696773529052734, 57.729122161865234, 57.52412796020508, 57.392601013183594, 53.51804733276367, 53.08519744873047, 81.03302001953125, 466.35260009765625, 629.77294921875, 272.4296569824219, 229.77696228027344, 524.4228515625, 169.0817413330078, 106.43704223632812, 468.2314453125, 321.1058044433594, 72.86363220214844, 215.64427185058594, 420.0905456542969, 254.936279296875, 238.94183349609375, 170.37852478027344, 161.82167053222656, 350.8217468261719, 510.25213623046875, 280.4100646972656, 479.9981384277344, 199.64524841308594, 294.40740966796875, 258.040771484375, 376.53106689453125, 509.9411315917969, 1114.2279052734375, 256.09857177734375, 426.6061096191406, 319.6000671386719, 739.0277099609375, 280.2876281738281, 489.2537536621094, 542.6870727539062, 517.612060546875, 617.3828125, 513.236083984375, 436.5743408203125, 490.99383544921875, 506.68548583984375, 460.2646179199219, 441.2579650878906, 394.2334899902344, 351.31146240234375, 347.7322082519531, 353.1181640625, 336.91925048828125, 275.0069580078125, 206.27684020996094, 205.90945434570312, 185.4871826171875, 142.34490966796875, 138.4669952392578, 125.22058868408203, 124.95114135742188, 113.3163070678711, 111.33777618408203, 109.3900375366211, 105.71350860595703, 106.33345794677734, 292.8968505859375, 101.52547454833984, 98.16709899902344, 98.09191131591797, 96.69923400878906, 95.24166107177734, 93.9153823852539, 90.94029998779297, 90.11663055419922, 204.05540466308594, 83.51455688476562, 83.17984008789062, 82.09905242919922, 80.06827545166016, 80.04055786132812, 78.980224609375, 77.4798812866211, 624.8594970703125, 218.5560302734375, 299.7873840332031, 218.3317108154297, 189.689208984375, 356.6500244140625, 202.47463989257812, 417.00213623046875, 238.63824462890625, 212.27218627929688, 149.84323120117188, 211.9496612548828, 303.9140319824219, 120.32109832763672, 237.6540069580078, 454.90960693359375, 334.02545166015625, 980.60107421875, 485.4506530761719, 911.4451293945312, 590.2950439453125, 261.2230529785156, 253.1405487060547, 366.6529846191406, 366.9601745605469, 261.4512939453125, 595.4712524414062, 534.0038452148438, 534.01806640625, 583.53955078125, 307.2271728515625, 439.3746337890625, 370.1558837890625, 337.7717590332031, 344.1768798828125, 325.05975341796875, 340.1703796386719, 337.7772521972656, 350.0632019042969, 294.64581298828125, 276.3277282714844, 278.6572570800781, 1160.9132080078125, 424.62060546875, 361.99005126953125, 388.82080078125, 255.19793701171875, 223.3960723876953, 186.81495666503906, 150.93563842773438, 148.38706970214844, 142.3661346435547, 778.7778930664062, 125.96311950683594, 122.38629150390625, 113.5186538696289, 111.00336456298828, 117.1114730834961, 97.79452514648438, 95.15584564208984, 154.03953552246094, 85.85616302490234, 85.81739044189453, 83.90367126464844, 83.07220458984375, 81.03001403808594, 86.70967102050781, 72.22313690185547, 70.94837188720703, 66.05683135986328, 65.33727264404297, 61.60311508178711, 632.0007934570312, 967.30859375, 392.4784851074219, 86.92008972167969, 116.71688079833984, 384.4781188964844, 955.042724609375, 325.5193786621094, 154.01246643066406, 168.04747009277344, 886.2265014648438, 877.4567260742188, 327.182373046875, 468.3438720703125, 329.43048095703125, 302.31689453125, 346.5965576171875, 350.2645568847656, 277.72235107421875, 424.45953369140625, 266.9029541015625, 332.0311279296875, 578.3032836914062, 328.37042236328125, 429.90313720703125, 517.5341796875, 400.9313049316406, 346.2950439453125, 433.3561706542969, 421.4360656738281, 338.9404296875, 347.58477783203125, 348.44537353515625, 336.6087646484375, 398.3597717285156, 299.83258056640625, 164.6500701904297, 151.26080322265625, 134.79344177246094, 134.80828857421875, 128.793701171875, 120.1890640258789, 119.80301666259766, 103.68548583984375, 93.05211639404297, 105.72232055664062, 91.11929321289062, 88.88138580322266, 86.48152923583984, 83.19112396240234, 82.55461120605469, 76.6363754272461, 73.92579650878906, 137.45323181152344, 73.58349609375, 73.43082427978516, 297.8049011230469, 71.5206298828125, 71.5206298828125, 71.3747329711914, 68.60582733154297, 70.64566802978516, 67.04659271240234, 64.61957550048828, 137.57745361328125, 329.9684753417969, 498.6695861816406, 418.2132568359375, 321.6349182128906, 192.26394653320312, 436.7302551269531, 120.439208984375, 101.71742248535156, 189.6542205810547, 107.88106536865234, 180.2874298095703, 406.497802734375, 219.2530975341797, 311.04937744140625, 276.8253479003906, 364.5852966308594, 122.61643981933594, 431.5494079589844, 148.8873748779297, 478.0677490234375, 448.4655456542969, 560.1489868164062, 235.38340759277344, 220.0799560546875, 236.9700927734375, 525.8984985351562, 310.49981689453125, 195.21343994140625, 465.0462341308594, 342.694091796875, 343.89752197265625, 252.4918212890625, 252.31494140625, 359.3658447265625, 365.0567932128906, 297.0661926269531, 278.8648681640625, 264.2499084472656, 271.7898864746094, 266.98651123046875, 258.7191467285156, 836.8704223632812, 741.7591552734375, 348.10552978515625, 262.6591491699219, 234.72032165527344, 225.7039337158203, 214.6396026611328, 197.21083068847656, 176.1952667236328, 163.72848510742188, 159.68936157226562, 156.55722045898438, 155.55181884765625, 147.1693572998047, 143.7874298095703, 151.92002868652344, 140.55010986328125, 133.0448760986328, 131.79173278808594, 122.37577819824219, 118.65946197509766, 115.63384246826172, 112.4041748046875, 112.22483825683594, 111.79792022705078, 119.11126708984375, 102.07164001464844, 93.44534301757812, 92.23983764648438, 89.7243881225586, 218.44508361816406, 151.80226135253906, 955.4397583007812, 178.94818115234375, 1384.116455078125, 160.98158264160156, 191.5667724609375, 221.75938415527344, 157.25833129882812, 1290.715576171875, 920.77001953125, 312.8064880371094, 623.1017456054688, 397.7396240234375, 455.4387512207031, 379.9434814453125, 351.7613220214844, 356.9765625, 374.8453063964844, 212.81954956054688, 346.64404296875, 312.8064270019531, 333.1448669433594, 336.0579528808594, 600.3089599609375, 295.4515380859375, 283.6612548828125, 250.14752197265625, 267.23590087890625, 330.6805114746094, 358.020263671875, 262.1649475097656, 242.10182189941406], \"Term\": [\"window\", \"game\", \"christian\", \"team\", \"drive\", \"file\", \"space\", \"encrypt\", \"govern\", \"chip\", \"jesus\", \"israel\", \"card\", \"play\", \"secur\", \"nasa\", \"armenian\", \"program\", \"isra\", \"imag\", \"peopl\", \"hockey\", \"player\", \"clipper\", \"public\", \"disk\", \"year\", \"scsi\", \"driver\", \"bike\", \"armenian\", \"turkish\", \"turk\", \"turkey\", \"armenia\", \"koresh\", \"nazi\", \"militia\", \"serdar\", \"argic\", \"genocid\", \"davidian\", \"troop\", \"murder\", \"mormon\", \"prison\", \"massacr\", \"azeri\", \"ethnic\", \"azerbaijani\", \"hitler\", \"iran\", \"zuma\", \"sdpa\", \"motto\", \"azerbaijan\", \"extermin\", \"sera\", \"urartu\", \"slaughter\", \"villag\", \"batf\", \"greek\", \"greec\", \"jew\", \"soldier\", \"kill\", \"waco\", \"arm\", \"countri\", \"muslim\", \"children\", \"armi\", \"popul\", \"peopl\", \"anti\", \"govern\", \"right\", \"attack\", \"say\", \"polit\", \"death\", \"state\", \"live\", \"go\", \"come\", \"tell\", \"happen\", \"forc\", \"world\", \"time\", \"nation\", \"want\", \"leav\", \"start\", \"year\", \"take\", \"jesus\", \"bibl\", \"atheist\", \"atheism\", \"christ\", \"scriptur\", \"cathol\", \"sandvik\", \"doctrin\", \"revel\", \"biblic\", \"satan\", \"atho\", \"livesey\", \"prophet\", \"divin\", \"vers\", \"gospel\", \"sabbath\", \"god\", \"sin\", \"resurrect\", \"solntz\", \"testament\", \"theolog\", \"propheci\", \"theist\", \"schneider\", \"jaeger\", \"marriag\", \"christian\", \"church\", \"belief\", \"faith\", \"worship\", \"contradict\", \"moral\", \"religion\", \"lord\", \"heaven\", \"holi\", \"rutger\", \"truth\", \"spirit\", \"teach\", \"islam\", \"believ\", \"etern\", \"argument\", \"exist\", \"religi\", \"evid\", \"word\", \"love\", \"life\", \"claim\", \"mean\", \"peopl\", \"true\", \"accept\", \"say\", \"question\", \"reason\", \"thing\", \"person\", \"come\", \"good\", \"read\", \"time\", \"point\", \"follow\", \"motif\", \"widget\", \"xterm\", \"visual\", \"xlib\", \"polygon\", \"baalk\", \"contrib\", \"toolkit\", \"kelvin\", \"pyron\", \"suno\", \"deskjet\", \"xpert\", \"plaintext\", \"skndiv\", \"openwindow\", \"xview\", \"ether\", \"quicktim\", \"magellan\", \"utah\", \"greenbelt\", \"reilli\", \"ualberta\", \"copper\", \"ciphertext\", \"autom\", \"gradi\", \"dillon\", \"font\", \"handbook\", \"binari\", \"server\", \"client\", \"librari\", \"imag\", \"anonym\", \"compil\", \"resourc\", \"graphic\", \"map\", \"applic\", \"archiv\", \"user\", \"code\", \"avail\", \"directori\", \"sourc\", \"file\", \"mail\", \"list\", \"program\", \"function\", \"format\", \"email\", \"inform\", \"version\", \"softwar\", \"includ\", \"send\", \"data\", \"internet\", \"address\", \"display\", \"window\", \"copi\", \"access\", \"distribut\", \"thank\", \"look\", \"book\", \"group\", \"need\", \"scsi\", \"simm\", \"motherboard\", \"cach\", \"bio\", \"quadra\", \"diamond\", \"vram\", \"vesa\", \"centri\", \"swap\", \"upgrad\", \"char\", \"eisa\", \"intercon\", \"nubus\", \"ethernet\", \"svga\", \"amanda\", \"meg\", \"cadr\", \"mous\", \"maxtor\", \"config\", \"cica\", \"tiff\", \"adaptec\", \"powerbook\", \"ctrl\", \"esdi\", \"jumper\", \"floppi\", \"disk\", \"umich\", \"video\", \"modem\", \"card\", \"output\", \"monitor\", \"mode\", \"printer\", \"spec\", \"entri\", \"drive\", \"driver\", \"port\", \"instal\", \"memori\", \"window\", \"color\", \"appl\", \"byte\", \"screen\", \"board\", \"problem\", \"machin\", \"file\", \"thank\", \"control\", \"work\", \"speed\", \"need\", \"hard\", \"help\", \"program\", \"want\", \"time\", \"repli\", \"softwar\", \"distribut\", \"alaska\", \"spencer\", \"oracl\", \"dseg\", \"aurora\", \"nsmca\", \"engr\", \"launch\", \"uoknor\", \"callison\", \"kaldi\", \"zoolog\", \"mccall\", \"ucsc\", \"hallam\", \"lunar\", \"automot\", \"raider\", \"theodor\", \"dock\", \"shafer\", \"mksol\", \"hydro\", \"ssto\", \"plymouth\", \"redesign\", \"laughter\", \"rockwel\", \"desi\", \"stimulus\", \"moon\", \"henri\", \"mar\", \"job\", \"wheel\", \"billion\", \"invest\", \"spacecraft\", \"orbit\", \"nasa\", \"space\", \"shuttl\", \"satellit\", \"fund\", \"probe\", \"flight\", \"helmet\", \"station\", \"solar\", \"presid\", \"mission\", \"earth\", \"cost\", \"money\", \"vehicl\", \"year\", \"work\", \"project\", \"toronto\", \"spend\", \"go\", \"time\", \"engin\", \"long\", \"high\", \"power\", \"thing\", \"say\", \"look\", \"peopl\", \"program\", \"want\", \"need\", \"design\", \"build\", \"firearm\", \"bike\", \"motorcycl\", \"magnus\", \"rider\", \"honda\", \"veal\", \"utkvm\", \"centerlin\", \"cactus\", \"rkba\", \"harley\", \"shotgun\", \"pistol\", \"ranck\", \"boyl\", \"husc\", \"ifa\", \"smuggl\", \"fischer\", \"counterst\", \"armori\", \"trunk\", \"thomasp\", \"imak\", \"photographi\", \"concordia\", \"tennesse\", \"yamaha\", \"frost\", \"car\", \"ohio\", \"uchicago\", \"rid\", \"gun\", \"brake\", \"shaft\", \"cwru\", \"auto\", \"wagon\", \"handgun\", \"cleveland\", \"ride\", \"tire\", \"urbana\", \"midway\", \"insur\", \"uiuc\", \"dealer\", \"weapon\", \"iastat\", \"owner\", \"illinoi\", \"crime\", \"price\", \"state\", \"freenet\", \"sell\", \"buy\", \"good\", \"road\", \"drive\", \"right\", \"look\", \"peopl\", \"want\", \"case\", \"thing\", \"time\", \"go\", \"distribut\", \"repli\", \"engin\", \"opinion\", \"problem\", \"need\", \"gatech\", \"cub\", \"fnal\", \"prism\", \"hitter\", \"pitcher\", \"alomar\", \"uicvm\", \"higgin\", \"inning\", \"revolv\", \"hulman\", \"yanke\", \"pitch\", \"catcher\", \"dodger\", \"blast\", \"starter\", \"tiger\", \"met\", \"bat\", \"nore\", \"outlet\", \"rocki\", \"jay\", \"sdsu\", \"volt\", \"lopez\", \"restaur\", \"lamp\", \"wire\", \"duke\", \"circuit\", \"batteri\", \"brave\", \"basebal\", \"hit\", \"berkeley\", \"jason\", \"ball\", \"metal\", \"jeff\", \"grind\", \"larc\", \"indiana\", \"netcom\", \"colorado\", \"year\", \"run\", \"good\", \"game\", \"smith\", \"scott\", \"player\", \"home\", \"stanford\", \"look\", \"distribut\", \"go\", \"time\", \"lose\", \"come\", \"start\", \"play\", \"david\", \"best\", \"better\", \"power\", \"thing\", \"john\", \"sale\", \"great\", \"encrypt\", \"escrow\", \"privaci\", \"ripem\", \"crypto\", \"wiretap\", \"cryptographi\", \"cipher\", \"decrypt\", \"hamburg\", \"clipper\", \"homicid\", \"bontchev\", \"gtoal\", \"crypt\", \"clarkson\", \"rwing\", \"surveil\", \"nist\", \"sternlight\", \"den\", \"ncsl\", \"qualcomm\", \"fbihh\", \"cryptograph\", \"tampa\", \"mime\", \"vesselin\", \"lyme\", \"strnlght\", \"key\", \"secur\", \"enforc\", \"recipi\", \"classifi\", \"secret\", \"chip\", \"agenc\", \"patent\", \"scheme\", \"public\", \"govern\", \"algorithm\", \"protect\", \"propos\", \"administr\", \"privat\", \"clinton\", \"feder\", \"phone\", \"court\", \"devic\", \"number\", \"communic\", \"technolog\", \"inform\", \"provid\", \"author\", \"state\", \"right\", \"messag\", \"data\", \"peopl\", \"need\", \"diseas\", \"stratus\", \"dyer\", \"diet\", \"robi\", \"infect\", \"syndrom\", \"methodolog\", \"physician\", \"cure\", \"intellect\", \"einstein\", \"chopin\", \"candida\", \"sphere\", \"yeast\", \"chastiti\", \"halat\", \"therapi\", \"clinic\", \"migrain\", \"steveh\", \"patient\", \"catbyt\", \"dtmedin\", \"blah\", \"carlo\", \"superstit\", \"baerga\", \"homeopathi\", \"skeptic\", \"gordon\", \"pitt\", \"medic\", \"doctor\", \"medicin\", \"food\", \"cancer\", \"sleev\", \"ingr\", \"genet\", \"aid\", \"bank\", \"treatment\", \"water\", \"pain\", \"health\", \"handheld\", \"studi\", \"princeton\", \"caus\", \"effect\", \"scienc\", \"scientif\", \"rochest\", \"theori\", \"point\", \"result\", \"risk\", \"problem\", \"research\", \"case\", \"steve\", \"test\", \"time\", \"peopl\", \"repli\", \"take\", \"differ\", \"year\", \"say\", \"thing\", \"isra\", \"hockey\", \"playoff\", \"palestinian\", \"detroit\", \"leaf\", \"cramer\", \"optilink\", \"pen\", \"cunixb\", \"lebanes\", \"penguin\", \"clayton\", \"jake\", \"maynard\", \"espn\", \"edmonton\", \"ericsson\", \"boni\", \"lemieux\", \"gaza\", \"puck\", \"bruin\", \"selann\", \"laurentian\", \"quebec\", \"ramsey\", \"canuck\", \"shark\", \"uvic\", \"montreal\", \"flyer\", \"israel\", \"stanley\", \"team\", \"jet\", \"coach\", \"ranger\", \"winnipeg\", \"game\", \"play\", \"wing\", \"player\", \"columbia\", \"season\", \"leagu\", \"pittsburgh\", \"score\", \"arab\", \"mcgill\", \"goal\", \"virginia\", \"toronto\", \"andrew\", \"year\", \"divis\", \"canada\", \"period\", \"final\", \"point\", \"time\", \"american\", \"go\"], \"Total\": [2966.0, 1940.0, 1924.0, 1689.0, 2638.0, 2883.0, 1860.0, 1161.0, 1997.0, 1477.0, 1274.0, 1017.0, 1577.0, 1423.0, 1059.0, 1331.0, 1142.0, 2599.0, 837.0, 1391.0, 6052.0, 742.0, 990.0, 784.0, 1802.0, 1023.0, 4004.0, 867.0, 1191.0, 747.0, 1142.9583740234375, 698.9558715820312, 407.7272644042969, 376.1419677734375, 366.1116027832031, 325.846923828125, 318.256103515625, 294.6385803222656, 243.81558227539062, 243.53146362304688, 239.4801788330078, 223.58860778808594, 220.15757751464844, 499.85150146484375, 183.81178283691406, 190.03121948242188, 181.68017578125, 168.52059936523438, 170.9886474609375, 163.3725128173828, 156.9473876953125, 153.92347717285156, 148.33285522460938, 145.86817932128906, 144.91348266601562, 143.45306396484375, 140.92027282714844, 138.17529296875, 112.54084014892578, 112.26637268066406, 299.7375183105469, 239.29400634765625, 575.2765502929688, 235.9622802734375, 846.9027709960938, 310.8525390625, 1292.4876708984375, 203.65432739257812, 568.353271484375, 904.962890625, 498.3378601074219, 821.7328491210938, 317.7273254394531, 442.4293212890625, 6052.71826171875, 470.1575927734375, 1997.7261962890625, 3614.68310546875, 771.352294921875, 4395.67724609375, 753.4012451171875, 729.086181640625, 3490.054931640625, 1666.260986328125, 3510.730712890625, 3362.533203125, 2458.84814453125, 1374.8798828125, 910.499755859375, 2752.30859375, 5183.146484375, 1404.34228515625, 3617.8427734375, 1561.9661865234375, 1909.119873046875, 4004.7578125, 1884.1258544921875, 1274.8072509765625, 844.0818481445312, 688.539794921875, 379.0483093261719, 601.0935668945312, 285.09393310546875, 265.8420715332031, 258.6253356933594, 234.29208374023438, 199.46600341796875, 197.48406982421875, 187.33848571777344, 186.6898651123047, 191.4882049560547, 161.5964813232422, 158.12852478027344, 148.4269561767578, 144.8557891845703, 142.2056884765625, 133.86817932128906, 133.62254333496094, 137.21395874023438, 135.0694580078125, 123.30796813964844, 118.57750701904297, 111.64559173583984, 104.27090454101562, 104.75077056884766, 103.53997039794922, 192.9781494140625, 1924.27099609375, 744.6122436523438, 604.4033203125, 642.59033203125, 209.4973907470703, 250.70823669433594, 845.6991577148438, 828.4187622070312, 355.5498962402344, 287.80279541015625, 282.96514892578125, 442.15399169921875, 692.941650390625, 269.9664001464844, 446.063232421875, 578.8197021484375, 2561.731689453125, 282.8346862792969, 815.131103515625, 1699.9537353515625, 474.3492126464844, 965.217041015625, 1333.0904541015625, 902.1407470703125, 1251.4853515625, 1317.3157958984375, 2641.86328125, 6052.71826171875, 1353.2069091796875, 1006.9673461914062, 4395.67724609375, 2872.182373046875, 1977.921142578125, 3329.212646484375, 2056.0078125, 3362.533203125, 3754.421630859375, 2277.20947265625, 5183.146484375, 2646.791748046875, 1892.4102783203125, 514.4351806640625, 479.50714111328125, 262.1397399902344, 305.83587646484375, 182.9683837890625, 165.35598754882812, 159.36215209960938, 152.93394470214844, 138.76898193359375, 136.0535125732422, 118.18011474609375, 102.43084716796875, 101.44613647460938, 95.46444702148438, 94.97850036621094, 93.73173522949219, 89.39283752441406, 85.96602630615234, 78.7806625366211, 77.0969467163086, 75.67371368408203, 77.94976806640625, 67.175048828125, 66.74057006835938, 63.496917724609375, 62.537330627441406, 57.57563018798828, 57.55217742919922, 57.37797546386719, 57.14778137207031, 448.4683532714844, 58.572509765625, 180.8592987060547, 872.3430786132812, 374.06121826171875, 495.9429626464844, 1391.43896484375, 440.9508361816406, 358.4921875, 426.1166076660156, 1054.60791015625, 199.59127807617188, 1032.4814453125, 440.00604248046875, 1078.350341796875, 1021.1267700195312, 1669.3359375, 441.453857421875, 1374.5584716796875, 2883.885009765625, 2375.208984375, 1560.8458251953125, 2599.861083984375, 691.8548583984375, 736.162841796875, 1159.2723388671875, 2169.24072265625, 1621.163818359375, 1630.7625732421875, 2103.295166015625, 1606.180419921875, 1650.9979248046875, 1085.847412109375, 1067.4688720703125, 839.1293334960938, 2966.575439453125, 872.5662231445312, 1443.37353515625, 3038.84619140625, 2288.467041015625, 3375.03759765625, 1421.1026611328125, 1956.768310546875, 3517.123046875, 867.474609375, 317.6370849609375, 250.2078857421875, 230.81463623046875, 229.64767456054688, 212.46270751953125, 183.9412384033203, 167.1034393310547, 165.70335388183594, 156.47067260742188, 158.83648681640625, 362.0737609863281, 134.3785400390625, 125.08387756347656, 123.22496032714844, 117.94927215576172, 112.17121124267578, 111.74752807617188, 110.07601928710938, 104.12238311767578, 99.82821655273438, 519.7879028320312, 90.54007720947266, 83.6605224609375, 82.62821197509766, 104.4683609008789, 76.17040252685547, 76.12688446044922, 71.69654846191406, 70.25760650634766, 287.13433837890625, 317.7306213378906, 1023.171630859375, 213.97854614257812, 736.9544067382812, 385.19146728515625, 1577.8919677734375, 487.7062683105469, 681.5418701171875, 651.6162719726562, 414.86236572265625, 202.35662841796875, 773.6254272460938, 2638.13232421875, 1191.0015869140625, 521.5247192382812, 771.9718017578125, 825.6636962890625, 2966.575439453125, 979.6791381835938, 877.6451416015625, 316.51470947265625, 603.8773803710938, 656.5188598632812, 3254.474609375, 1051.1627197265625, 2883.885009765625, 2288.467041015625, 1818.994384765625, 3998.2919921875, 901.1752319335938, 3517.123046875, 1391.7735595703125, 2348.58544921875, 2599.861083984375, 3617.8427734375, 5183.146484375, 2732.19384765625, 1630.7625732421875, 3038.84619140625, 267.0453796386719, 172.00009155273438, 156.51791381835938, 228.30894470214844, 132.46392822265625, 111.54907989501953, 110.62195587158203, 480.2484436035156, 124.94286346435547, 97.43895721435547, 91.60369873046875, 87.82199096679688, 85.66326904296875, 85.5849838256836, 84.04283142089844, 251.9351348876953, 74.35344696044922, 71.57764434814453, 71.21640014648438, 69.74593353271484, 67.621826171875, 66.79296875, 61.51911544799805, 61.20405960083008, 60.507171630859375, 60.3464469909668, 60.049827575683594, 59.223548889160156, 58.72600173950195, 58.32766342163086, 415.9969177246094, 351.1897888183594, 197.73948669433594, 259.179931640625, 170.87942504882812, 275.1635437011719, 144.31858825683594, 174.99098205566406, 592.9318237304688, 1331.52294921875, 1860.757080078125, 257.59454345703125, 337.9649353027344, 441.3335266113281, 216.22386169433594, 284.1152038574219, 205.7539520263672, 455.2716064453125, 191.22592163085938, 874.0577392578125, 344.72601318359375, 726.9236450195312, 1014.5396728515625, 862.5274658203125, 336.988525390625, 4004.7578125, 3998.2919921875, 641.9602661132812, 701.0911865234375, 556.97900390625, 3510.730712890625, 5183.146484375, 1432.9891357421875, 1579.425048828125, 1517.998779296875, 1785.55322265625, 3329.212646484375, 4395.67724609375, 3375.03759765625, 6052.71826171875, 2599.861083984375, 3617.8427734375, 3517.123046875, 1000.6277465820312, 1483.8935546875, 495.75604248046875, 747.6323852539062, 325.6590576171875, 302.3562316894531, 244.9889373779297, 158.984375, 108.27942657470703, 95.92851257324219, 100.2811050415039, 91.90436553955078, 89.54524993896484, 80.2354736328125, 78.72178649902344, 77.19053649902344, 75.45713806152344, 69.597412109375, 67.86634826660156, 66.37062072753906, 65.70732879638672, 63.8077507019043, 62.99225997924805, 61.962032318115234, 61.97679901123047, 59.60800552368164, 58.64104080200195, 58.435726165771484, 58.304039001464844, 54.42936325073242, 53.9964599609375, 82.42547607421875, 485.2928161621094, 668.453857421875, 284.9857482910156, 240.66868591308594, 577.3370971679688, 179.90098571777344, 111.21246337890625, 528.9305419921875, 357.5130920410156, 74.67018127441406, 242.34796142578125, 502.91082763671875, 297.4255065917969, 281.2111511230469, 192.33499145507812, 183.03675842285156, 466.62225341796875, 750.7398681640625, 366.5124206542969, 724.8843994140625, 250.30677795410156, 415.81964111328125, 353.0357971191406, 657.6669921875, 1070.5751953125, 3490.054931640625, 395.5933837890625, 983.7587890625, 606.9414672851562, 3754.421630859375, 598.3028564453125, 2638.13232421875, 3614.68310546875, 3375.03759765625, 6052.71826171875, 3617.8427734375, 2113.20703125, 3329.212646484375, 5183.146484375, 3510.730712890625, 3038.84619140625, 2732.19384765625, 1432.9891357421875, 1407.867431640625, 3254.474609375, 3517.123046875, 275.9194030761719, 207.18922424316406, 206.8258819580078, 186.39959716796875, 143.2572784423828, 139.37933349609375, 126.13304901123047, 125.86357116699219, 114.22874450683594, 112.2500991821289, 110.30248260498047, 106.6259765625, 107.28164672851562, 295.5258483886719, 102.43778991699219, 99.07945251464844, 99.00546264648438, 97.61188507080078, 96.15435791015625, 94.82772827148438, 91.85266876220703, 91.02910614013672, 206.18264770507812, 84.4303970336914, 84.09229278564453, 83.01145935058594, 80.98065185546875, 80.95291900634766, 79.89276885986328, 78.3923110961914, 639.2734985351562, 227.38116455078125, 323.03533935546875, 231.72528076171875, 201.03939819335938, 428.90643310546875, 227.24929809570312, 525.6275634765625, 277.0840148925781, 257.5661926269531, 175.59457397460938, 284.0149841308594, 476.76812744140625, 133.43386840820312, 365.1957092285156, 1031.8046875, 640.5604858398438, 4004.7578125, 1280.048828125, 3754.421630859375, 1940.664794921875, 488.3008117675781, 472.29498291015625, 990.5671997070312, 1023.2589111328125, 516.36962890625, 3375.03759765625, 3038.84619140625, 3510.730712890625, 5183.146484375, 818.5213623046875, 3362.533203125, 1909.119873046875, 1423.9302978515625, 1658.5966796875, 1346.392578125, 1717.5321044921875, 1785.55322265625, 3329.212646484375, 1491.183349609375, 990.2796630859375, 1542.3779296875, 1161.82763671875, 425.534912109375, 362.9170837402344, 390.07720947265625, 256.1122741699219, 224.3104248046875, 187.7305145263672, 151.85064697265625, 149.30140686035156, 143.2805633544922, 784.3641357421875, 126.87757873535156, 123.3006362915039, 114.4344482421875, 111.93732452392578, 118.14889526367188, 98.71028137207031, 96.07027435302734, 155.55857849121094, 86.7708511352539, 86.73173522949219, 84.81802368164062, 83.986572265625, 81.9443588256836, 87.70350646972656, 73.1382064819336, 71.86477661132812, 66.9711685180664, 66.25181579589844, 62.517635345458984, 659.2316284179688, 1059.598876953125, 429.4156188964844, 89.67327117919922, 124.43817138671875, 474.16644287109375, 1477.454345703125, 430.59686279296875, 178.9176788330078, 204.3567657470703, 1802.1553955078125, 1997.7261962890625, 534.6806030273438, 906.1632690429688, 556.0820922851562, 491.48968505859375, 613.686279296875, 662.98681640625, 470.2344665527344, 1022.1227416992188, 480.7737121582031, 730.9078369140625, 2365.543212890625, 763.0506591796875, 1372.5093994140625, 2169.24072265625, 1377.2835693359375, 1170.3818359375, 3490.054931640625, 3614.68310546875, 1280.4110107421875, 1650.9979248046875, 6052.71826171875, 3517.123046875, 399.2857971191406, 300.7450866699219, 165.56256103515625, 152.17401123046875, 135.70590209960938, 135.72186279296875, 129.70895385742188, 121.10151672363281, 120.7160415649414, 104.59820556640625, 93.9645767211914, 106.77874755859375, 92.03182983398438, 89.7938003540039, 87.39402770996094, 84.10354614257812, 83.46707916259766, 77.56388092041016, 74.8382339477539, 139.152099609375, 74.49637603759766, 74.3432388305664, 301.5867919921875, 72.43302154541016, 72.43302154541016, 72.28717041015625, 69.51831817626953, 71.5958480834961, 67.95915222167969, 65.53195190429688, 140.31385803222656, 354.61895751953125, 560.2183227539062, 467.14312744140625, 372.5074157714844, 214.2539520263672, 528.296142578125, 128.81614685058594, 106.81172180175781, 215.3028564453125, 114.34998321533203, 206.83787536621094, 542.55908203125, 263.95330810546875, 416.1339111328125, 361.6107177734375, 544.802734375, 136.71836853027344, 864.6985473632812, 185.2837677001953, 1192.0758056640625, 1098.331298828125, 1600.234375, 408.9527587890625, 366.5252685546875, 446.0223693847656, 2646.791748046875, 941.7721557617188, 342.3376159667969, 3254.474609375, 1469.76904296875, 2113.20703125, 866.40185546875, 975.51806640625, 5183.146484375, 6052.71826171875, 2732.19384765625, 1884.1258544921875, 2258.273681640625, 4004.7578125, 4395.67724609375, 3329.212646484375, 837.78271484375, 742.67138671875, 349.01776123046875, 263.5714416503906, 235.63259887695312, 226.6161651611328, 215.55186462402344, 198.12313842773438, 177.10752868652344, 164.64073181152344, 160.60159301757812, 157.46951293945312, 156.48275756835938, 148.0817413330078, 144.69972229003906, 152.8905792236328, 141.4651641845703, 133.9572296142578, 132.7042694091797, 123.28799438476562, 119.57171630859375, 116.54607391357422, 113.31639099121094, 113.13705444335938, 112.71014404296875, 120.09423065185547, 102.98385620117188, 94.35774230957031, 93.15208435058594, 90.63665008544922, 220.87405395507812, 153.73667907714844, 1017.056396484375, 185.59458923339844, 1689.568603515625, 167.19650268554688, 202.23321533203125, 240.0529327392578, 165.1607208251953, 1940.664794921875, 1423.9302978515625, 399.8851318359375, 990.5671997070312, 559.28369140625, 670.1260375976562, 536.8279418945312, 505.7823181152344, 528.27392578125, 572.500732421875, 254.3348388671875, 553.6993408203125, 544.2898559570312, 701.0911865234375, 868.338134765625, 4004.7578125, 693.4171142578125, 732.4398193359375, 584.5032348632812, 822.2951049804688, 2646.791748046875, 5183.146484375, 1242.2733154296875, 3510.730712890625], \"loglift\": [30.0, 29.0, 28.0, 27.0, 26.0, 25.0, 24.0, 23.0, 22.0, 21.0, 20.0, 19.0, 18.0, 17.0, 16.0, 15.0, 14.0, 13.0, 12.0, 11.0, 10.0, 9.0, 8.0, 7.0, 6.0, 5.0, 4.0, 3.0, 2.0, 1.0, 2.0255000591278076, 2.0250000953674316, 2.0241000652313232, 2.023900032043457, 2.0237998962402344, 2.0234999656677246, 2.023400068283081, 2.023200035095215, 2.022599935531616, 2.022599935531616, 2.0225000381469727, 2.022200107574463, 2.0220999717712402, 2.0216000080108643, 2.0213000774383545, 2.0213000774383545, 2.0213000774383545, 2.020900011062622, 2.020900011062622, 2.020699977874756, 2.0204999446868896, 2.02020001411438, 2.02020001411438, 2.0201001167297363, 2.0199999809265137, 2.0199999809265137, 2.0197999477386475, 2.019700050354004, 2.018199920654297, 2.018199920654297, 2.0153000354766846, 2.007200002670288, 1.9528000354766846, 1.9890999794006348, 1.8824000358581543, 1.958899974822998, 1.7970999479293823, 1.980299949645996, 1.819599986076355, 1.6779999732971191, 1.763100028038025, 1.6375999450683594, 1.8667999505996704, 1.781499981880188, 1.0757999420166016, 1.7408000230789185, 1.2894999980926514, 1.0536999702453613, 1.5706000328063965, 0.953000009059906, 1.4706000089645386, 1.4835000038146973, 0.7210999727249146, 1.080899953842163, 0.6299999952316284, 0.6431000232696533, 0.739799976348877, 1.0844999551773071, 1.3265000581741333, 0.5475999712944031, 0.0575999990105629, 0.9682999849319458, 0.27399998903274536, 0.847000002861023, 0.6578999757766724, -0.014100000262260437, 0.5697000026702881, 2.0452001094818115, 2.044800043106079, 2.044600009918213, 2.0434999465942383, 2.0434000492095947, 2.0427000522613525, 2.0425000190734863, 2.0423998832702637, 2.0420000553131104, 2.041300058364868, 2.0411999225616455, 2.0409998893737793, 2.0409998893737793, 2.040600061416626, 2.0401999950408936, 2.04010009765625, 2.0397000312805176, 2.039599895477295, 2.0394999980926514, 2.039099931716919, 2.039099931716919, 2.0390000343322754, 2.038599967956543, 2.0385000705718994, 2.0381999015808105, 2.0376999378204346, 2.037100076675415, 2.036900043487549, 2.036900043487549, 2.0364999771118164, 2.031899929046631, 2.0318000316619873, 2.0308001041412354, 2.023099899291992, 2.032900094985962, 2.0308001041412354, 1.9905999898910522, 1.9452999830245972, 1.989799976348877, 1.9884999990463257, 1.9830000400543213, 1.9407999515533447, 1.858199954032898, 1.9696999788284302, 1.882599949836731, 1.8200000524520874, 1.5154999494552612, 1.9495999813079834, 1.700600028038025, 1.5044000148773193, 1.7956000566482544, 1.5720000267028809, 1.4508999586105347, 1.5461000204086304, 1.4234000444412231, 1.3523000478744507, 1.0579999685287476, 0.6973999738693237, 1.2980999946594238, 1.399399995803833, 0.6687999963760376, 0.859000027179718, 1.0434000492095947, 0.6948999762535095, 0.9133999943733215, 0.5392000079154968, 0.31630000472068787, 0.7174999713897705, 0.003100000089034438, 0.583899974822998, 0.8629000186920166, 2.0806000232696533, 2.0804998874664307, 2.078900098800659, 2.0778000354766846, 2.077399969100952, 2.076900005340576, 2.07669997215271, 2.0764999389648438, 2.075900077819824, 2.075700044631958, 2.074700117111206, 2.073499917984009, 2.0734000205993652, 2.0729000568389893, 2.0727999210357666, 2.072700023651123, 2.072200059890747, 2.0717999935150146, 2.0708000659942627, 2.0706000328063965, 2.0703999996185303, 2.0690999031066895, 2.0687999725341797, 2.068700075149536, 2.068000078201294, 2.0678000450134277, 2.066499948501587, 2.066499948501587, 2.066499948501587, 2.0664000511169434, 2.048099994659424, 2.0662999153137207, 2.051500082015991, 2.0102999210357666, 2.0225000381469727, 2.0088999271392822, 1.9707000255584717, 1.979200005531311, 1.96589994430542, 1.9251999855041504, 1.827299952507019, 1.9740999937057495, 1.774999976158142, 1.864400029182434, 1.742799997329712, 1.7106000185012817, 1.6004999876022339, 1.8174999952316284, 1.6053999662399292, 1.4670000076293945, 1.4729000329971313, 1.556399941444397, 1.423699975013733, 1.6994999647140503, 1.6755000352859497, 1.545199990272522, 1.365399956703186, 1.440500020980835, 1.4234000444412231, 1.3454999923706055, 1.3897000551223755, 1.3384000062942505, 1.4632999897003174, 1.4599000215530396, 1.5799000263214111, 0.9276000261306763, 1.5184999704360962, 1.176200032234192, 0.499099999666214, 0.7235000133514404, 0.3797000050544739, 1.0924999713897705, 0.7401999831199646, 0.15479999780654907, 2.1196000576019287, 2.1177000999450684, 2.117000102996826, 2.1166999340057373, 2.1166000366210938, 2.116300106048584, 2.115600109100342, 2.1150999069213867, 2.1150999069213867, 2.114799976348877, 2.1147000789642334, 2.114000082015991, 2.113800048828125, 2.113300085067749, 2.1131999492645264, 2.1129000186920166, 2.112499952316284, 2.1124000549316406, 2.112299919128418, 2.111799955368042, 2.1113998889923096, 2.1108999252319336, 2.1105000972747803, 2.1096999645233154, 2.109499931335449, 2.1089000701904297, 2.108599901199341, 2.108599901199341, 2.107800006866455, 2.1075000762939453, 2.101799964904785, 2.099600076675415, 2.0685999393463135, 2.092400074005127, 2.0650999546051025, 2.073899984359741, 2.0125999450683594, 2.021399974822998, 2.000699996948242, 2.0023000240325928, 2.0262999534606934, 2.0680999755859375, 1.9438999891281128, 1.8285000324249268, 1.8824000358581543, 1.9651000499725342, 1.9211000204086304, 1.8946000337600708, 1.7213000059127808, 1.8492000102996826, 1.8622000217437744, 2.00570011138916, 1.864300012588501, 1.8091000318527222, 1.291200041770935, 1.6136000156402588, 1.176200032234192, 1.246999979019165, 1.326200008392334, 0.973800003528595, 1.5801000595092773, 0.8787999749183655, 1.298699975013733, 0.9729999899864197, 0.7918999791145325, 0.4300999939441681, 0.10779999941587448, 0.5931000113487244, 0.991100013256073, 0.40450000762939453, 2.3443000316619873, 2.342400074005127, 2.3417999744415283, 2.341399908065796, 2.3408000469207764, 2.3394999504089355, 2.339400053024292, 2.3392999172210693, 2.338399887084961, 2.3382999897003174, 2.3376998901367188, 2.3373000621795654, 2.3369998931884766, 2.3369998931884766, 2.3368000984191895, 2.3361001014709473, 2.335400104522705, 2.33489990234375, 2.3348000049591064, 2.3345000743865967, 2.3341000080108643, 2.333899974822998, 2.3327999114990234, 2.33270001411438, 2.3324999809265137, 2.3324999809265137, 2.33240008354187, 2.332200050354004, 2.3320000171661377, 2.331899881362915, 2.321000099182129, 2.319499969482422, 2.3125, 2.2964000701904297, 2.3036000728607178, 2.281100034713745, 2.3059000968933105, 2.289400100708008, 2.218400001525879, 2.106600046157837, 2.063800096511841, 2.226300001144409, 2.183000087738037, 2.096299886703491, 2.19569993019104, 2.1347999572753906, 2.1861000061035156, 2.0332999229431152, 2.193000078201294, 1.8654999732971191, 2.0510001182556152, 1.8450000286102295, 1.6746000051498413, 1.5880000591278076, 1.9641000032424927, 0.8166999816894531, 0.7954000234603882, 1.6297999620437622, 1.572100043296814, 1.6842999458312988, 0.6661999821662903, 0.41440001130104065, 1.1360000371932983, 0.9230999946594238, 0.927299976348877, 0.77920001745224, 0.24959999322891235, -0.010900000110268593, 0.20020000636577606, -0.3833000063896179, 0.3409999907016754, 0.04670000076293945, 0.013500000350177288, 1.1301000118255615, 0.7407000064849854, 2.3550000190734863, 2.3548998832702637, 2.3541998863220215, 2.3541998863220215, 2.352099895477295, 2.3513998985290527, 2.3487000465393066, 2.347599983215332, 2.3473000526428223, 2.3471999168395996, 2.34689998626709, 2.3457999229431152, 2.3454999923706055, 2.3452999591827393, 2.3450000286102295, 2.3440001010894775, 2.3436999320983887, 2.343400001525879, 2.3431999683380127, 2.3427999019622803, 2.342600107192993, 2.342400074005127, 2.3422999382019043, 2.3417999744415283, 2.3415000438690186, 2.3415000438690186, 2.341399908065796, 2.3403000831604004, 2.3401999473571777, 2.340100049972534, 2.3173999786376953, 2.297600030899048, 2.3120999336242676, 2.3108999729156494, 2.2611000537872314, 2.2952001094818115, 2.3132998943328857, 2.235300064086914, 2.249799966812134, 2.33270001411438, 2.2404000759124756, 2.1772000789642334, 2.203000068664551, 2.1942999362945557, 2.2360000610351562, 2.2339999675750732, 2.071899890899658, 1.9709999561309814, 2.089400053024292, 1.9450000524520874, 2.13100004196167, 2.011899948120117, 2.0436999797821045, 1.7994999885559082, 1.6154999732971191, 1.215399980545044, 1.9223999977111816, 1.5217000246047974, 1.7158000469207764, 0.7318000197410583, 1.5988999605178833, 0.6722000241279602, 0.460999995470047, 0.4821999967098236, 0.07440000027418137, 0.4043000042438507, 0.7802000045776367, 0.4431000053882599, 0.03189999982714653, 0.3253999948501587, 0.4275999963283539, 0.4212999939918518, 0.9513000249862671, 0.9588000178337097, 0.13619999587535858, 0.011599999852478504, 2.4128000736236572, 2.4117000102996826, 2.411600112915039, 2.4112000465393066, 2.4096999168395996, 2.4094998836517334, 2.408799886703491, 2.408799886703491, 2.408099889755249, 2.407900094985962, 2.4077999591827393, 2.4075000286102295, 2.4072000980377197, 2.407099962234497, 2.407099962234497, 2.4068000316619873, 2.4068000316619873, 2.4066998958587646, 2.4065001010894775, 2.406399965286255, 2.406100034713745, 2.4059998989105225, 2.4056999683380127, 2.4052000045776367, 2.4052000045776367, 2.4049999713897705, 2.4047000408172607, 2.4047000408172607, 2.404599905014038, 2.404400110244751, 2.3933000564575195, 2.376499891281128, 2.341399908065796, 2.3564999103546143, 2.3580000400543213, 2.231600046157837, 2.300600051879883, 2.1846001148223877, 2.266700029373169, 2.2227001190185547, 2.257499933242798, 2.1233999729156494, 1.9658000469207764, 2.3125998973846436, 1.9865000247955322, 1.597100019454956, 1.7648999691009521, 1.0089999437332153, 1.4464999437332153, 1.0003999471664429, 1.2259000539779663, 1.7905000448226929, 1.7924000024795532, 1.4221999645233154, 1.3905999660491943, 1.7354999780654907, 0.6812999844551086, 0.6772000193595886, 0.5328999757766724, 0.23199999332427979, 1.4362000226974487, 0.38100001215934753, 0.775600016117096, 0.9772999882698059, 0.843500018119812, 0.9948999881744385, 0.7968999743461609, 0.7509999871253967, 0.16369999945163727, 0.7944999933242798, 1.1397000551223755, 0.7049999833106995, 2.539799928665161, 2.5383999347686768, 2.5380001068115234, 2.5373001098632812, 2.5369999408721924, 2.5364999771118164, 2.5357000827789307, 2.5344998836517334, 2.53439998626709, 2.5341999530792236, 2.533400058746338, 2.5332999229431152, 2.533099889755249, 2.5325000286102295, 2.5322000980377197, 2.5318000316619873, 2.5313000679016113, 2.5309998989105225, 2.5308001041412354, 2.5299999713897705, 2.5299999713897705, 2.5297000408172607, 2.529599905014038, 2.529400110244751, 2.5292000770568848, 2.5280001163482666, 2.5276999473571777, 2.5267999172210693, 2.526700019836426, 2.5257999897003174, 2.4983999729156494, 2.449399948120117, 2.4505999088287354, 2.509399890899658, 2.4765000343322754, 2.330899953842163, 2.104300022125244, 2.2607998847961426, 2.390700101852417, 2.3450000286102295, 1.8308000564575195, 1.7178000211715698, 2.0494000911712646, 1.8805999755859375, 2.0169999599456787, 2.0546000003814697, 1.9692000150680542, 1.902500033378601, 2.0139999389648438, 1.6618000268936157, 1.9521000385284424, 1.7515000104904175, 1.1318999528884888, 1.6973999738693237, 1.379699945449829, 1.1074999570846558, 1.30649995803833, 1.3228000402450562, 0.4544999897480011, 0.39149999618530273, 1.2115000486373901, 0.9824000000953674, -0.3142000138759613, 0.1941000074148178, 2.65339994430542, 2.6526999473571777, 2.6501998901367188, 2.6496999263763428, 2.6489999294281006, 2.6489999294281006, 2.6486001014709473, 2.648099899291992, 2.648099899291992, 2.646899938583374, 2.645900011062622, 2.6458001136779785, 2.645699977874756, 2.6454999446868896, 2.64520001411438, 2.6447999477386475, 2.644700050354004, 2.643699884414673, 2.643399953842163, 2.643399953842163, 2.643399953842163, 2.643399953842163, 2.6431000232696533, 2.6429998874664307, 2.6429998874664307, 2.6429998874664307, 2.6424999237060547, 2.6422998905181885, 2.642199993133545, 2.641700029373169, 2.635999917984009, 2.583699941635132, 2.539299964904785, 2.545099973678589, 2.5088999271392822, 2.5473999977111816, 2.465399980545044, 2.5885000228881836, 2.606800079345703, 2.528899908065796, 2.5975000858306885, 2.5183000564575195, 2.367000102996826, 2.4702000617980957, 2.3645999431610107, 2.3884999752044678, 2.253999948501587, 2.546799898147583, 1.9607000350952148, 2.437000036239624, 1.7419999837875366, 1.7599999904632568, 1.6059999465942383, 2.103300094604492, 2.1456000804901123, 2.0232999324798584, 1.0397000312805176, 1.5461000204086304, 2.0940001010894775, 0.710099995136261, 1.1996999979019165, 0.8400999903678894, 1.422700047492981, 1.3034000396728516, -0.013100000098347664, -0.1525000035762787, 0.4368000030517578, 0.745199978351593, 0.510200023651123, -0.03449999913573265, -0.14550000429153442, 0.10100000351667404, 2.7214999198913574, 2.721299886703491, 2.7200000286102295, 2.719099998474121, 2.7186999320983887, 2.7184998989105225, 2.7183001041412354, 2.7179999351501465, 2.717400074005127, 2.7170000076293945, 2.716900110244751, 2.7167999744415283, 2.716599941253662, 2.716399908065796, 2.7163000106811523, 2.716200113296509, 2.716099977493286, 2.7156999111175537, 2.7156999111175537, 2.715100049972534, 2.714900016784668, 2.7146999835968018, 2.7144999504089355, 2.7144999504089355, 2.7144999504089355, 2.714400053024292, 2.71370005607605, 2.712899923324585, 2.7126998901367188, 2.7125000953674316, 2.7114999294281006, 2.70989990234375, 2.660099983215332, 2.6861000061035156, 2.523200035095215, 2.6847000122070312, 2.6684000492095947, 2.6433000564575195, 2.6735000610351562, 2.31469988822937, 2.286600112915039, 2.4769999980926514, 2.259000062942505, 2.381700038909912, 2.336400032043457, 2.3768999576568604, 2.3594000339508057, 2.3306000232696533, 2.299099922180176, 2.5443999767303467, 2.254300117492676, 2.1686999797821045, 1.9785000085830688, 1.773300051689148, 0.8248000144958496, 1.8694000244140625, 1.7740000486373901, 1.873900055885315, 1.5986000299453735, 0.6425999999046326, 0.05000000074505806, 1.1669000387191772, 0.04839999973773956], \"logprob\": [30.0, 29.0, 28.0, 27.0, 26.0, 25.0, 24.0, 23.0, 22.0, 21.0, 20.0, 19.0, 18.0, 17.0, 16.0, 15.0, 14.0, 13.0, 12.0, 11.0, 10.0, 9.0, 8.0, 7.0, 6.0, 5.0, 4.0, 3.0, 2.0, 1.0, -4.882199764251709, -5.374499797821045, -5.914400100708008, -5.995299816131592, -6.022299766540527, -6.139200210571289, -6.162799835205078, -6.240099906921387, -6.430099964141846, -6.431300163269043, -6.4481000900268555, -6.517099857330322, -6.532599925994873, -5.713200092315674, -6.713799953460693, -6.680600166320801, -6.725599765777588, -6.80109977722168, -6.786600112915039, -6.832300186157227, -6.872700214385986, -6.892399787902832, -6.929500102996826, -6.946300029754639, -6.952899932861328, -6.963099956512451, -6.981100082397461, -7.000899791717529, -7.207600116729736, -7.210000038146973, -6.230899810791016, -6.464200019836426, -5.641499996185303, -6.496399879455566, -5.325099945068359, -6.250899791717529, -4.987599849700928, -6.652400016784668, -5.7866997718811035, -5.463200092315674, -5.974699974060059, -5.600100040435791, -6.321100234985352, -6.075300216674805, -4.164999961853027, -6.055200099945068, -5.059800148010254, -4.702600002288818, -5.730299949645996, -4.607699871063232, -5.853899955749512, -5.873799800872803, -5.070400238037109, -5.449900150299072, -5.1554999351501465, -5.1855998039245605, -5.401899814605713, -5.638400077819824, -5.808599948883057, -5.481299877166748, -5.3383002281188965, -5.733500003814697, -5.481500148773193, -5.7484002113342285, -5.736800193786621, -5.668000221252441, -5.838200092315674, -4.753300189971924, -5.165999889373779, -5.369900226593018, -5.967899799346924, -5.506999969482422, -6.253600120544434, -6.323699951171875, -6.35129976272583, -6.450500011444092, -6.612100124359131, -6.622200012207031, -6.675099849700928, -6.678599834442139, -6.653600215911865, -6.823699951171875, -6.845600128173828, -6.909299850463867, -6.933800220489502, -6.952300071716309, -7.013199806213379, -7.014999866485596, -6.98859977722168, -7.004700183868408, -7.095900058746338, -7.135300159454346, -7.196100234985352, -7.264999866485596, -7.2606000900268555, -7.272200107574463, -6.650000095367432, -4.354899883270264, -5.3043999671936035, -5.513999938964844, -5.460400104522705, -6.571499824523926, -6.394000053405762, -5.218299865722656, -5.284299850463867, -6.085599899291992, -6.298299789428711, -6.320799827575684, -5.9166998863220215, -5.550000190734863, -6.38100004196167, -5.966000080108643, -5.768099784851074, -4.58519983291626, -6.354599952697754, -5.545199871063232, -5.00629997253418, -5.991600036621094, -5.504700183868408, -5.3028998374938965, -5.598199844360352, -5.393599987030029, -5.41349983215332, -5.011899948120117, -4.543399810791016, -5.440800189971924, -5.635000228881836, -4.891900062561035, -5.127299785614014, -5.315899848937988, -5.143700122833252, -5.407100200653076, -5.2895002365112305, -5.402100086212158, -5.500899791717529, -5.3927998542785645, -5.484099864959717, -5.540599822998047, -5.625400066375732, -5.695799827575684, -6.301300048828125, -6.148200035095215, -6.662399768829346, -6.764100074768066, -6.801199913024902, -6.842599868774414, -6.940400123596191, -6.960299968719482, -7.102200031280518, -7.246399879455566, -7.256100177764893, -7.317500114440918, -7.3225998878479, -7.335999965667725, -7.383800029754639, -7.423299789428711, -7.511600017547607, -7.533400058746338, -7.552299976348877, -7.52400016784668, -7.672999858856201, -7.679500102996826, -7.730100154876709, -7.745500087738037, -7.829500198364258, -7.829899787902832, -7.832900047302246, -7.836999893188477, -5.795100212097168, -7.8125, -6.699900150299072, -5.167600154876709, -6.002200126647949, -5.733699798583984, -4.740300178527832, -5.880899906158447, -6.10129976272583, -5.969099998474121, -5.160900115966797, -6.678699970245361, -5.234300136566162, -5.997900009155273, -5.223100185394287, -5.309899806976318, -4.928400039672852, -6.041500091552734, -5.117800235748291, -4.515200138092041, -4.7032999992370605, -5.03980016708374, -4.662199974060059, -5.71019983291626, -5.6722002029418945, -5.348400115966797, -4.901500225067139, -5.117700099945068, -5.128900051116943, -4.952400207519531, -5.177800178527832, -5.201499938964844, -5.495699882507324, -5.51609992980957, -5.6367998123168945, -5.026400089263916, -5.65910005569458, -5.4980998039245605, -5.430799961090088, -5.4899001121521, -5.445300102233887, -5.597400188446045, -5.629899978637695, -5.628900051116943, -5.063899993896484, -6.070400238037109, -6.309800148010254, -6.3907999992370605, -6.395899772644043, -6.473999977111816, -6.618800163269043, -6.7153000831604, -6.723800182342529, -6.781499862670898, -6.766499996185303, -5.94320011138916, -6.934599876403809, -7.006800174713135, -7.021900177001953, -7.065999984741211, -7.116600036621094, -7.1203999519348145, -7.1356000900268555, -7.191699981689453, -7.2342000007629395, -5.584799766540527, -7.332799911499023, -7.412700176239014, -7.42519998550415, -7.191299915313721, -7.507500171661377, -7.5081000328063965, -7.56879997253418, -7.589399814605713, -6.187300205230713, -6.0883002281188965, -4.949900150299072, -6.490799903869629, -5.281499862670898, -5.921500205993652, -4.572700023651123, -5.73799991607666, -5.423999786376953, -5.467400074005127, -5.894899845123291, -6.571000099182129, -5.354100227355957, -4.242700099945068, -4.984099864959717, -5.727200031280518, -5.379000186920166, -5.3383002281188965, -4.232699871063232, -5.212600231170654, -5.309599876403809, -6.185999870300293, -5.68149995803833, -5.6529998779296875, -4.570099830627441, -5.377799987792969, -4.806000232696533, -4.966400146484375, -5.1168999671936035, -4.681700229644775, -5.565299987792969, -4.904900074005127, -5.4120001792907715, -5.2144999504089355, -5.293900012969971, -5.325399875640869, -5.288099765777588, -5.44320011138916, -5.561200141906738, -5.525400161743164, -6.017399787902832, -6.459199905395508, -6.554100036621094, -6.177000045776367, -6.7220001220703125, -6.895100116729736, -6.903600215911865, -5.435500144958496, -6.782800197601318, -7.031599998474121, -7.093900203704834, -7.136499881744385, -7.1616997718811035, -7.162600040435791, -7.181000232696533, -6.083799839019775, -7.304900169372559, -7.343400001525879, -7.348599910736084, -7.369699954986572, -7.401000022888184, -7.41349983215332, -7.497000217437744, -7.502200126647949, -7.513800144195557, -7.516499996185303, -7.521500110626221, -7.535600185394287, -7.5441999435424805, -7.55109977722168, -5.597400188446045, -5.7683000564575195, -6.349699974060059, -6.095099925994873, -6.504499912261963, -6.050600051879883, -6.671199798583984, -6.494999885559082, -5.345600128173828, -4.648399829864502, -4.356599807739258, -6.17140007019043, -5.94320011138916, -5.763000011444092, -6.377099990844727, -6.164899826049805, -6.436299800872803, -5.794899940490723, -6.502699851989746, -5.310500144958496, -6.0553998947143555, -5.515200138092041, -5.35230016708374, -5.60129976272583, -6.164999961853027, -4.837200164794922, -4.860099792480469, -5.854800224304199, -5.8242998123168945, -5.942299842834473, -5.11929988861084, -4.981500148773193, -5.545599937438965, -5.661200046539307, -5.696599960327148, -5.682400226593018, -5.589000225067139, -5.571599960327148, -5.62470006942749, -5.624100208282471, -5.744900226593018, -5.708799839019775, -5.770199775695801, -5.910600185394287, -5.906000137329102, -5.388000011444092, -4.97730016708374, -5.809100151062012, -5.883299827575684, -6.095799922943115, -6.528900146484375, -6.915599822998047, -7.037899971008301, -6.993800163269043, -7.081099987030029, -7.107399940490723, -7.218400001525879, -7.237599849700928, -7.257500171661377, -7.2804999351501465, -7.362400054931641, -7.387899875640869, -7.4105000495910645, -7.4207000732421875, -7.450399875640869, -7.463500022888184, -7.480199813842773, -7.480000019073486, -7.519499778747559, -7.536099910736084, -7.539700031280518, -7.541999816894531, -7.6118998527526855, -7.619999885559082, -7.1971001625061035, -5.447000026702881, -5.146599769592285, -5.984499931335449, -6.154799938201904, -5.329599857330322, -6.46150016784668, -6.9243998527526855, -5.44290018081665, -5.820099830627441, -7.303299903869629, -6.218299865722656, -5.551400184631348, -6.050899982452393, -6.115699768066406, -6.45389986038208, -6.50540018081665, -5.731599807739258, -5.35699987411499, -5.955699920654297, -5.418099880218506, -6.295400142669678, -5.906899929046631, -6.03879976272583, -5.660900115966797, -5.357600212097168, -4.576000213623047, -6.046299934387207, -5.535999774932861, -5.82480001449585, -4.986599922180176, -5.956099987030029, -5.39900016784668, -5.295400142669678, -5.342700004577637, -5.166399955749512, -5.351200103759766, -5.513000011444092, -5.395500183105469, -5.363999843597412, -5.460100173950195, -5.502299785614014, -5.614999771118164, -5.730199813842773, -5.740499973297119, -5.725100040435791, -5.77209997177124, -5.916200160980225, -6.203800201416016, -6.205599784851074, -6.309999942779541, -6.57480001449585, -6.602399826049805, -6.702899932861328, -6.705100059509277, -6.802800178527832, -6.820400238037109, -6.838099956512451, -6.872300148010254, -6.866399765014648, -5.8531999588012695, -6.912700176239014, -6.946300029754639, -6.9471001625061035, -6.961400032043457, -6.976600170135498, -6.990600109100342, -7.022799968719482, -7.031899929046631, -6.214600086212158, -7.107999801635742, -7.111999988555908, -7.125100135803223, -7.150100231170654, -7.1504998207092285, -7.16379976272583, -7.183000087738037, -5.0954999923706055, -6.145999908447266, -5.829899787902832, -6.146999835968018, -6.287600040435791, -5.656300067901611, -6.222400188446045, -5.499899864196777, -6.05810022354126, -6.175099849700928, -6.523399829864502, -6.176700115203857, -5.816299915313721, -6.7428998947143555, -6.06220006942749, -5.412899971008301, -5.721799850463867, -4.644899845123291, -5.347899913787842, -4.7179999351501465, -5.152400016784668, -5.967599868774414, -5.999100208282471, -5.628600120544434, -5.627799987792969, -5.966800212860107, -5.143700122833252, -5.252600193023682, -5.252600193023682, -5.163899898529053, -5.8053998947143555, -5.447700023651123, -5.619100093841553, -5.710599899291992, -5.69189977645874, -5.749000072479248, -5.70359992980957, -5.710599899291992, -5.674900054931641, -5.8471999168396, -5.911399841308594, -5.9029998779296875, -4.351600170135498, -5.3572998046875, -5.516900062561035, -5.445400238037109, -5.866499900817871, -5.999599933624268, -6.178400039672852, -6.39169979095459, -6.408699989318848, -6.450099945068359, -4.750800132751465, -6.572500228881836, -6.60129976272583, -6.676599979400635, -6.698999881744385, -6.645400047302246, -6.8256001472473145, -6.853000164031982, -6.371300220489502, -6.9558000564575195, -6.956299781799316, -6.978799819946289, -6.988800048828125, -7.013700008392334, -6.946000099182129, -7.128799915313721, -7.146599769592285, -7.2179999351501465, -7.229000091552734, -7.287799835205078, -4.95959997177124, -4.533999919891357, -5.435999870300293, -6.94350004196167, -6.648799896240234, -5.456600189208984, -4.546800136566162, -5.6230998039245605, -6.371500015258789, -6.284299850463867, -4.621500015258789, -4.631499767303467, -5.618000030517578, -5.259300231933594, -5.611199855804443, -5.697000026702881, -5.560400009155273, -5.549799919128418, -5.781899929046631, -5.357699871063232, -5.821599960327148, -5.603300094604492, -5.048399925231934, -5.6143999099731445, -5.34499979019165, -5.15939998626709, -5.414700031280518, -5.561200141906738, -5.336999893188477, -5.3649001121521, -5.582699775695801, -5.557499885559082, -5.554999828338623, -5.589600086212158, -5.306000232696533, -5.590199947357178, -6.189599990844727, -6.274400234222412, -6.389599800109863, -6.389500141143799, -6.435200214385986, -6.504300117492676, -6.507500171661377, -6.6519999504089355, -6.760200023651123, -6.632599830627441, -6.781199932098389, -6.806099891662598, -6.833499908447266, -6.872200012207031, -6.879899978637695, -6.9542999267578125, -6.990300178527832, -6.370100021362305, -6.994999885559082, -6.997000217437744, -5.59689998626709, -7.023399829864502, -7.023399829864502, -7.025400161743164, -7.065000057220459, -7.035699844360352, -7.0879998207092285, -7.124899864196777, -6.369200229644775, -5.4944000244140625, -5.081399917602539, -5.257400035858154, -5.519999980926514, -6.0345001220703125, -5.214099884033203, -6.502200126647949, -6.671199798583984, -6.0482001304626465, -6.612400054931641, -6.098800182342529, -5.285799980163574, -5.903200149536133, -5.553400039672852, -5.670000076293945, -5.394599914550781, -6.484300136566162, -5.22599983215332, -6.290200233459473, -5.123600006103516, -5.187600135803223, -4.965199947357178, -5.832200050354004, -5.899400234222412, -5.825500011444092, -5.028299808502197, -5.555200099945068, -6.0192999839782715, -5.151199817657471, -5.456500053405762, -5.453000068664551, -5.76200008392334, -5.762700080871582, -5.408999919891357, -5.3933000564575195, -5.599400043487549, -5.662700176239014, -5.7164998054504395, -5.688399791717529, -5.706200122833252, -5.737599849700928, -4.496799945831299, -4.617499828338623, -5.374000072479248, -5.655700206756592, -5.768099784851074, -5.807300090789795, -5.857600212097168, -5.942200183868408, -6.054900169372559, -6.128300189971924, -6.153299808502197, -6.173099994659424, -6.179500102996826, -6.234899997711182, -6.258200168609619, -6.203199863433838, -6.280900001525879, -6.3358001708984375, -6.345300197601318, -6.419400215148926, -6.450300216674805, -6.476099967956543, -6.50439977645874, -6.50600004196167, -6.509799957275391, -6.446499824523926, -6.600800037384033, -6.6890997886657715, -6.702099800109863, -6.729800224304199, -5.840000152587891, -6.20389986038208, -4.364299774169922, -6.039400100708008, -3.9937000274658203, -6.145199775695801, -5.97130012512207, -5.824900150299072, -6.168600082397461, -4.063600063323975, -4.401299953460693, -5.480899810791016, -4.791800022125244, -5.240699768066406, -5.105299949645996, -5.286499977111816, -5.36359977722168, -5.348800182342529, -5.300000190734863, -5.866099834442139, -5.378200054168701, -5.480899810791016, -5.417900085449219, -5.409200191497803, -4.829100131988525, -5.538000106811523, -5.578700065612793, -5.704500198364258, -5.638400077819824, -5.4253997802734375, -5.345900058746338, -5.65749979019165, -5.737199783325195]}, \"token.table\": {\"Topic\": [1, 2, 3, 4, 5, 6, 8, 9, 10, 3, 4, 5, 6, 7, 8, 4, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 1, 3, 5, 8, 1, 2, 3, 5, 8, 1, 5, 8, 9, 5, 3, 8, 7, 4, 1, 2, 5, 6, 7, 8, 9, 10, 2, 3, 4, 5, 6, 7, 8, 10, 3, 8, 1, 6, 9, 2, 4, 5, 2, 3, 4, 5, 8, 1, 10, 1, 3, 4, 8, 1, 1, 2, 3, 5, 6, 7, 8, 9, 1, 6, 8, 9, 10, 1, 1, 1, 3, 5, 6, 6, 2, 2, 2, 1, 2, 6, 8, 9, 10, 5, 1, 2, 3, 4, 8, 2, 3, 4, 5, 6, 7, 3, 5, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 1, 1, 1, 3, 9, 4, 5, 7, 1, 3, 4, 5, 6, 7, 8, 9, 10, 7, 10, 7, 1, 8, 6, 7, 1, 2, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 1, 3, 7, 8, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 2, 2, 5, 6, 2, 5, 3, 4, 4, 9, 7, 1, 3, 4, 5, 7, 8, 9, 10, 10, 8, 1, 2, 3, 4, 5, 6, 7, 9, 6, 5, 6, 7, 10, 10, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 1, 4, 5, 6, 7, 3, 4, 8, 4, 6, 4, 5, 1, 3, 4, 5, 6, 7, 8, 9, 10, 8, 9, 9, 10, 5, 6, 4, 6, 7, 8, 10, 9, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 9, 7, 2, 1, 2, 3, 4, 5, 6, 7, 8, 9, 6, 4, 4, 9, 1, 2, 3, 5, 8, 9, 4, 7, 8, 9, 1, 2, 1, 2, 1, 2, 5, 4, 8, 3, 4, 7, 8, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 8, 1, 2, 3, 8, 10, 6, 7, 10, 3, 4, 4, 9, 1, 5, 6, 8, 7, 8, 7, 10, 2, 3, 4, 6, 7, 8, 1, 2, 3, 4, 7, 10, 2, 3, 4, 5, 6, 7, 8, 10, 1, 4, 6, 7, 10, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 2, 3, 4, 5, 6, 7, 8, 9, 3, 4, 7, 9, 6, 4, 2, 9, 10, 3, 1, 3, 4, 5, 6, 7, 8, 9, 10, 1, 2, 3, 4, 6, 7, 8, 3, 1, 3, 4, 5, 6, 7, 8, 9, 6, 1, 4, 5, 6, 8, 9, 10, 1, 2, 6, 8, 10, 1, 6, 8, 8, 8, 8, 8, 4, 7, 10, 9, 2, 6, 2, 3, 4, 6, 7, 8, 9, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 1, 4, 6, 8, 1, 2, 4, 6, 9, 10, 8, 8, 5, 1, 2, 3, 4, 5, 6, 7, 8, 9, 3, 10, 3, 4, 7, 8, 4, 9, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 3, 3, 4, 8, 9, 3, 4, 8, 1, 2, 3, 4, 5, 9, 10, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 2, 1, 3, 4, 5, 6, 7, 8, 9, 10, 5, 1, 6, 9, 2, 7, 1, 2, 4, 5, 6, 7, 9, 10, 4, 5, 6, 8, 10, 3, 5, 9, 1, 7, 9, 1, 2, 3, 5, 7, 9, 10, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 9, 4, 1, 2, 3, 4, 5, 6, 7, 10, 8, 1, 2, 6, 8, 10, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 5, 3, 4, 8, 10, 8, 4, 10, 1, 2, 9, 3, 4, 1, 1, 2, 6, 8, 9, 10, 1, 2, 3, 4, 5, 7, 8, 9, 10, 1, 2, 7, 8, 1, 5, 6, 8, 1, 3, 4, 8, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 6, 6, 1, 3, 5, 9, 3, 4, 5, 10, 7, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 3, 4, 1, 2, 5, 9, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 2, 3, 4, 8, 9, 2, 6, 10, 6, 9, 1, 2, 3, 4, 8, 9, 5, 6, 8, 9, 10, 2, 4, 7, 10, 7, 10, 7, 9, 1, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 1, 2, 3, 5, 8, 10, 2, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 4, 9, 2, 1, 5, 6, 8, 3, 3, 4, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 1, 3, 1, 2, 3, 1, 2, 5, 6, 7, 8, 9, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 8, 1, 6, 9, 5, 8, 3, 6, 8, 6, 7, 9, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 1, 2, 4, 5, 6, 7, 8, 9, 10, 6, 1, 5, 8, 9, 1, 2, 5, 7, 5, 6, 7, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 5, 10, 7, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 1, 5, 6, 7, 9, 1, 7, 10, 1, 2, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 9, 8, 6, 7, 6, 5, 1, 6, 6, 1, 2, 3, 4, 5, 6, 7, 9, 1, 2, 3, 4, 8, 6, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 2, 3, 4, 7, 8, 9, 9, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 7, 9, 10, 7, 3, 4, 5, 7, 8, 5, 6, 9, 10, 9, 4, 2, 3, 4, 6, 7, 8, 9, 10, 5, 8, 1, 1, 2, 10, 1, 2, 10, 2, 10, 2, 4, 7, 9, 7, 2, 4, 5, 6, 7, 9, 10, 2, 5, 10, 1, 2, 10, 3, 5, 6, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 4, 7, 5, 3, 3, 8, 1, 2, 3, 6, 7, 9, 10, 1, 7, 3, 7, 5, 3, 5, 10, 10, 7, 10, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 10, 10, 1, 2, 3, 4, 6, 7, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 1, 2, 5, 6, 7, 8, 9, 10, 2, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 7, 1, 2, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 1, 2, 4, 5, 6, 7, 9, 10, 3, 5, 8, 1, 3, 4, 5, 6, 8, 9, 10, 3, 6, 2, 3, 4, 6, 7, 8, 9, 10, 3, 4, 3, 5, 1, 2, 1, 4, 10, 5, 3, 4, 10, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 1, 3, 7, 8, 9, 1, 4, 8, 9, 4, 1, 2, 3, 4, 5, 7, 10, 1, 2, 3, 4, 5, 6, 7, 8, 10, 7, 1, 5, 7, 9, 9, 2, 4, 6, 9, 1, 8, 1, 2, 3, 5, 5, 2, 3, 4, 7, 8, 9, 3, 4, 8, 1, 2, 4, 5, 6, 8, 9, 10, 4, 5, 8, 4, 10, 2, 3, 5, 1, 2, 1, 4, 3, 6, 1, 3, 4, 1, 2, 6, 1, 2, 3, 5, 7, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 1, 8, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 2, 4, 6, 7, 8, 9, 3, 8, 7, 5, 4, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 3, 6, 8, 3, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 10, 5, 3, 5, 6, 7, 3, 4, 8, 1, 3, 4, 5, 6, 7, 10, 1, 2, 4, 7, 9, 10, 2, 8, 9, 2, 9, 10, 10, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 1, 2, 3, 5, 6, 7, 8, 9, 10, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 1, 2, 3, 4, 6, 7, 8, 9, 6, 9, 6, 5, 7, 7, 7, 9, 10, 8, 9, 10, 3, 1, 2, 4, 5, 6, 7, 8, 10, 7, 10, 10, 5, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 1, 2, 5, 6, 8, 10, 3, 1, 8, 9, 10, 3, 4, 8, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 4, 1, 5, 8, 10, 1, 2, 3, 4, 5, 6, 7, 1, 2, 3, 9, 3, 4, 7, 1, 8, 1, 2, 3, 4, 5, 6, 8, 3, 5, 6, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 2, 3, 4, 5, 8, 9, 3, 5, 7, 8, 9, 2, 2, 2, 3, 5, 8, 9, 10, 1, 3, 4, 5, 6, 7, 8, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 3, 4, 8, 10, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 3, 5, 10, 6, 5, 10, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 3, 8, 5, 3, 1, 2, 1, 2, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 1, 2, 3, 4, 5, 9, 7, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 2, 2, 7, 5, 6, 5, 6, 6, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 8, 1, 3, 5, 6, 7, 8, 9, 6, 1, 3, 5, 6, 7, 9, 10, 9, 1, 2, 4, 9, 10, 7, 5, 1, 2, 3, 4, 5, 6, 7, 10, 2, 7, 8, 2, 3, 4, 5, 6, 7, 2, 2, 3, 5, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 2, 3, 4, 8, 9, 2, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 2, 3, 5, 8, 9, 7, 10, 1, 2, 3, 4, 7, 9, 10, 3, 4, 8, 10, 2, 4, 1, 7, 7, 10, 1, 7, 8, 1, 6, 8, 10, 10, 1, 3, 4, 5, 6, 7, 8, 10, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 1, 1, 3, 4, 5, 1, 6, 10, 6, 3, 5, 4, 2, 2, 9, 3, 1, 1, 9, 10, 1, 2, 3, 4, 5, 6, 7, 10, 6, 2, 3, 4, 5, 6, 7, 8, 9, 10, 3, 5, 10, 1, 10, 2, 1, 2, 3, 4, 5, 7, 8, 9, 10, 1, 3, 4, 5, 8, 3, 5, 4, 5, 7, 4, 5, 6, 7, 8, 5, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 9, 1, 2, 5, 5, 1, 3, 4, 5, 6, 7, 8, 10, 3, 7, 10, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 7, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 1, 3, 4, 5, 6, 7, 8, 10, 8, 2, 3, 4, 6, 7, 8, 9, 10, 9, 5, 9, 8, 1, 2, 3, 5, 6, 8, 9, 10, 3, 9, 8, 4, 4, 9, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 8, 1, 2, 3, 5, 6, 3, 5, 7, 8, 10, 1, 2, 3, 4, 5, 6, 7, 8, 9, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 6, 2, 3, 4, 5, 6, 7, 8, 9, 2, 1, 2, 3, 4, 5, 6, 7, 9, 10, 2, 5, 2, 1, 2, 3, 6, 8, 9, 9, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 6, 4, 7, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 4, 5, 6, 7, 10, 3, 3, 4, 5, 7, 10, 1, 9, 1, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 6, 1, 2, 6, 9, 10, 1, 1, 1, 3, 2, 6, 7, 5, 7, 1, 2, 3, 4, 5, 6, 7, 9, 2, 4, 7, 5, 3, 4, 1, 4, 6, 7, 3, 4, 6, 8, 3, 6, 10, 6, 1, 5, 6, 8, 2, 1, 2, 3, 4, 5, 6, 7, 8, 10, 4, 8, 1, 3, 4, 8, 1, 10, 2, 3, 5, 6, 7, 8, 10, 3, 7, 7, 4, 1, 6, 6, 7, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 1, 2, 5, 7, 9, 1, 6, 7, 3, 5, 3, 1, 3, 4, 1, 5, 8, 9, 10, 5, 10, 3, 5, 7, 8, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 1, 2, 3, 3, 3, 3, 6, 7, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 9, 5, 1], \"Freq\": [0.14598289132118225, 0.5243467092514038, 0.1291005164384842, 0.0496540442109108, 0.00794464722275734, 0.02284085936844349, 0.06653641909360886, 0.0347578302025795, 0.01886853575706482, 0.40391483902931213, 0.1960684359073639, 0.17181970179080963, 0.03325542435050011, 0.0006928213406354189, 0.19329716265201569, 0.9846343994140625, 0.05246054753661156, 0.07400684058666229, 0.5367838144302368, 0.18267512321472168, 0.030914250761270523, 0.02623027376830578, 0.03278784081339836, 0.0496501587331295, 0.005620772950351238, 0.00843115895986557, 0.12411247193813324, 0.0630735531449318, 0.19735917448997498, 0.614458441734314, 0.07896016538143158, 0.02786829322576523, 0.006967073306441307, 0.12772968411445618, 0.7570886611938477, 0.0386776365339756, 0.08218997716903687, 0.00483470456674695, 0.8702468276023865, 0.9960854053497314, 0.3871470093727112, 0.6115800738334656, 0.9910170435905457, 0.9902247786521912, 0.33969980478286743, 0.014489565044641495, 0.09418217092752457, 0.09981700032949448, 0.004024879075586796, 0.20285390317440033, 0.03300400823354721, 0.21090367436408997, 0.12552714347839355, 0.12667876482009888, 0.06333938241004944, 0.012667876668274403, 0.17389538884162903, 0.03685200214385986, 0.07370400428771973, 0.38694602251052856, 0.9025949835777283, 0.09524871408939362, 0.7508120536804199, 0.05317366123199463, 0.19355212152004242, 0.2244642972946167, 0.7725217938423157, 0.002278825268149376, 0.025182049721479416, 0.7351221442222595, 0.18789683282375336, 0.011622484773397446, 0.0397101566195488, 0.3441043496131897, 0.6550210118293762, 0.04772661626338959, 0.8045344352722168, 0.03409044072031975, 0.11363480240106583, 0.9978176951408386, 0.06133982539176941, 0.707861602306366, 0.060113027691841125, 0.011041169054806232, 0.05643263831734657, 0.013494761660695076, 0.012267964892089367, 0.0772881805896759, 0.8128747344017029, 0.14955486357212067, 0.015835221856832504, 0.012316283769905567, 0.007037876173853874, 0.9969637393951416, 0.9991614818572998, 0.8529326319694519, 0.08812587708234787, 0.006294705905020237, 0.050357647240161896, 0.9844738245010376, 0.9972343444824219, 0.9992160201072693, 0.9963047504425049, 0.6339515447616577, 0.02203921601176262, 0.0427820086479187, 0.24113495647907257, 0.03241061046719551, 0.027224913239479065, 0.9964976906776428, 0.1443973183631897, 0.31100961565971375, 0.18626399338245392, 0.061518386006355286, 0.29563000798225403, 0.030768103897571564, 0.016782602295279503, 0.019579702988266945, 0.008391301147639751, 0.8978692293167114, 0.02517390251159668, 0.9904056191444397, 0.9817970991134644, 0.0017971218330785632, 0.02096642181277275, 0.6176108717918396, 0.11861003935337067, 0.02515970543026924, 0.02755586802959442, 0.004193284083157778, 0.14077454805374146, 0.03174915164709091, 0.01257985271513462, 0.9968417286872864, 0.991598904132843, 0.9969107508659363, 0.9914524555206299, 0.9858863353729248, 0.023294983431696892, 0.15141738951206207, 0.8230893611907959, 0.003686234587803483, 0.012901821173727512, 0.027646759524941444, 0.020274288952350616, 0.007372469175606966, 0.005529351532459259, 0.1032145693898201, 0.74830561876297, 0.06819533556699753, 0.8323493599891663, 0.1655372679233551, 0.9907169938087463, 0.9820555448532104, 0.016715839505195618, 0.056100912392139435, 0.9407691955566406, 0.013236194849014282, 0.9844419956207275, 0.09290590137243271, 0.5882739424705505, 0.0011710828403010964, 0.030838513746857643, 0.05074692144989967, 0.05933486297726631, 0.04801439493894577, 0.04333006590604782, 0.07065533101558685, 0.01405299361795187, 0.00951243843883276, 0.1598089635372162, 0.7933374047279358, 0.034244779497385025, 0.0074272542260587215, 0.13071967661380768, 0.06758801639080048, 0.18196773529052734, 0.039364445954561234, 0.10546701401472092, 0.24138575792312622, 0.019310861825942993, 0.07501526921987534, 0.13294784724712372, 0.04424953833222389, 0.11761061102151871, 0.023289229720830917, 0.1612779200077057, 0.10945937782526016, 0.1676824539899826, 0.19795845448970795, 0.022706998512148857, 0.06288091838359833, 0.09315691888332367, 0.9987183213233948, 0.9975488185882568, 0.0013375557027757168, 0.9978166222572327, 0.06178143993020058, 0.9339900016784668, 0.9676030278205872, 0.02764580026268959, 0.9971796870231628, 0.982193648815155, 0.9898443818092346, 0.03046371042728424, 0.08986794203519821, 0.7326522469520569, 0.048741936683654785, 0.016755040735006332, 0.00761592760682106, 0.012185484170913696, 0.05940423533320427, 0.9946929216384888, 0.98945152759552, 0.10203344374895096, 0.3764682412147522, 0.37154248356819153, 0.0049257525242865086, 0.0014073578640818596, 0.02392508275806904, 0.0731826052069664, 0.04644281044602394, 0.9914161562919617, 0.055586133152246475, 0.939405620098114, 0.9450883865356445, 0.05471564456820488, 0.9883830547332764, 0.18599717319011688, 0.01752147264778614, 0.2014969289302826, 0.27158281207084656, 0.20082302391529083, 0.013478055596351624, 0.06671637296676636, 0.03571684658527374, 0.0006739028031006455, 0.0074129304848611355, 0.018123658373951912, 0.4086061120033264, 0.023066474124789238, 0.5272337198257446, 0.023066474124789238, 0.04739116132259369, 0.8909538388252258, 0.056869395077228546, 0.9964706301689148, 0.9901596903800964, 0.9917035698890686, 0.995495080947876, 0.005461199674755335, 0.13243408501148224, 0.04505489766597748, 0.04642019420862198, 0.2047949880361557, 0.13789528608322144, 0.028671298176050186, 0.01092239934951067, 0.3877451717853546, 0.06210401654243469, 0.931560218334198, 0.9911597371101379, 0.9856107234954834, 0.03709100931882858, 0.9602450132369995, 0.8973998427391052, 0.039926689118146896, 0.0468980148434639, 0.005703812465071678, 0.008872597478330135, 0.9925441741943359, 0.09890180826187134, 0.14101789891719818, 0.0501607246696949, 0.13344645500183105, 0.028866078704595566, 0.20679469406604767, 0.028866078704595566, 0.12918752431869507, 0.16278575360774994, 0.01987500488758087, 0.9940217733383179, 0.9957262873649597, 0.9968324303627014, 0.12163656204938889, 0.1770021617412567, 0.04529913142323494, 0.08556503057479858, 0.024327311664819717, 0.09479262679815292, 0.041104767471551895, 0.009227600879967213, 0.40098121762275696, 0.9872248768806458, 0.9969919323921204, 0.9897413849830627, 0.9944040179252625, 0.6778358817100525, 0.13264651596546173, 0.023121869191527367, 0.0073016430251300335, 0.03772515431046486, 0.1204771101474762, 0.3485725224018097, 0.004737879149615765, 0.6463820934295654, 0.988788366317749, 0.0016636345535516739, 0.9981806874275208, 0.013511610217392445, 0.9863475561141968, 0.002685961779206991, 0.9857479333877563, 0.009400865994393826, 0.992397129535675, 0.9943981170654297, 0.9900022149085999, 0.049530185759067535, 0.9286909699440002, 0.021669454872608185, 0.23153142631053925, 0.499500572681427, 0.006072955206036568, 0.04630628600716591, 0.009109432809054852, 0.02429182082414627, 0.019737103953957558, 0.05237923935055733, 0.08198489993810654, 0.02960565686225891, 0.9902758598327637, 0.016072237864136696, 0.03214447572827339, 0.008036118932068348, 0.9402259588241577, 0.9969149231910706, 0.8351381421089172, 0.035791631788015366, 0.12725913524627686, 0.9410224556922913, 0.05614054203033447, 0.00718638114631176, 0.9845342040061951, 0.12217437475919724, 0.3212733566761017, 0.027149861678481102, 0.5279139876365662, 0.00637459009885788, 0.993161141872406, 0.049447860568761826, 0.949398934841156, 0.04700689762830734, 0.6894344687461853, 0.03917241469025612, 0.001958620734512806, 0.007834482938051224, 0.21348965167999268, 0.019394105300307274, 0.0030622270423918962, 0.16433952748775482, 0.7624945640563965, 0.04797489196062088, 0.0030622270423918962, 0.02497812546789646, 0.01405019499361515, 0.026539258658885956, 0.01405019499361515, 0.2700759768486023, 0.5214183926582336, 0.11708496510982513, 0.01248906273394823, 0.08582406491041183, 0.15019211173057556, 0.007152005564421415, 0.04470003396272659, 0.7116245627403259, 0.2507038414478302, 0.22155915200710297, 0.014572346583008766, 0.11628138273954391, 0.07137475907802582, 0.06988778710365295, 0.13055633008480072, 0.03211864084005356, 0.041040487587451935, 0.051449306309223175, 0.010484231635928154, 0.19526882469654083, 0.12318972498178482, 0.07863173633813858, 0.011794760823249817, 0.14677923917770386, 0.42985349893569946, 0.0013105289544910192, 0.8898380994796753, 0.08089437335729599, 0.008368383161723614, 0.019526228308677673, 0.9776338338851929, 0.992104709148407, 0.9852089285850525, 0.007977400906383991, 0.003988700453191996, 0.9938931465148926, 0.14128684997558594, 0.029136978089809418, 0.4518980383872986, 0.04947788640856743, 0.13359029591083527, 0.010995086282491684, 0.11489865183830261, 0.06212223693728447, 0.007696560118347406, 0.011460448615252972, 0.055010151118040085, 0.5684382319450378, 0.2177485227584839, 0.06990873068571091, 0.010314403101801872, 0.06532455235719681, 0.9914078712463379, 0.009856686927378178, 0.062097128480672836, 0.1419362872838974, 0.5105763673782349, 0.18234871327877045, 0.03154139965772629, 0.03055572882294655, 0.03154139965772629, 0.9842479228973389, 0.7061063051223755, 0.005525088403373957, 0.07514120638370514, 0.1193419098854065, 0.07514120638370514, 0.00110501772724092, 0.018785301595926285, 0.2932772636413574, 0.04783955588936806, 0.10399903357028961, 0.5553548336029053, 0.9974397420883179, 0.32539263367652893, 0.5732384324073792, 0.10035473853349686, 0.9916263222694397, 0.9956570863723755, 0.9919785857200623, 0.9961087107658386, 0.9902847409248352, 0.9942601919174194, 0.9961082935333252, 0.9942809343338013, 0.11343644559383392, 0.8848042488098145, 0.003028471488505602, 0.47547000646591187, 0.2640827000141144, 0.016353745013475418, 0.004239859990775585, 0.21078160405158997, 0.026044854894280434, 0.10129044950008392, 0.11214299499988556, 0.11756926774978638, 0.07717367261648178, 0.0012058386346325278, 0.1917283535003662, 0.2074042558670044, 0.08802622556686401, 0.06812988221645355, 0.03557224199175835, 0.9973674416542053, 0.11459366232156754, 0.7639577388763428, 0.12005050480365753, 0.581549882888794, 0.2825454771518707, 0.013715799897909164, 0.09326744079589844, 0.024688439443707466, 0.004114740062505007, 0.9912833571434021, 0.9915632605552673, 0.987637460231781, 0.006995608564466238, 0.002998118055984378, 0.24484629929065704, 0.12192346155643463, 0.29581430554389954, 0.11292910575866699, 0.0449717678129673, 0.1299184411764145, 0.03897553309798241, 0.9956022500991821, 0.9973152875900269, 0.009577130898833275, 0.4747520685195923, 0.0615672692656517, 0.4542296230792999, 0.9948829412460327, 0.9922850728034973, 0.04472442716360092, 0.25550490617752075, 0.08590632677078247, 0.18686839938163757, 0.07749281823635101, 0.13461610674858093, 0.031439945101737976, 0.04251034930348396, 0.11690345406532288, 0.023026438429951668, 0.9799155592918396, 0.7679171562194824, 0.20840230584144592, 0.02265242487192154, 0.99677973985672, 0.012705590575933456, 0.949009895324707, 0.037139419466257095, 0.0119171142578125, 0.01310882531106472, 0.605389416217804, 0.3467880189418793, 0.010725402273237705, 0.0011917114024981856, 0.010725402273237705, 0.051335275173187256, 0.014808251522481441, 0.20534110069274902, 0.1796734631061554, 0.05429692193865776, 0.14512087404727936, 0.175724595785141, 0.10299962013959885, 0.049360841512680054, 0.02138969674706459, 0.9928632378578186, 0.005768533796072006, 0.08797013759613037, 0.012979201041162014, 0.015863467007875443, 0.1543082743883133, 0.18603521585464478, 0.09518080949783325, 0.015863467007875443, 0.4254293739795685, 0.9893049597740173, 0.13154099881649017, 0.002684510312974453, 0.8644123077392578, 0.9944851398468018, 0.9891051650047302, 0.033735986799001694, 0.00606489647179842, 0.7467404007911682, 0.015162241645157337, 0.18535840511322021, 0.010992624796926975, 0.0007581120589748025, 0.0011371681466698647, 0.7884120345115662, 0.00419814744964242, 0.19731292128562927, 0.00419814744964242, 0.00587740633636713, 0.00438003009185195, 0.9942668080329895, 0.9940217733383179, 0.03518321365118027, 0.9631404876708984, 0.9966021180152893, 0.0027513206005096436, 0.29989394545555115, 0.09079357981681824, 0.6052905321121216, 0.0013756603002548218, 0.0013756603002548218, 0.996711790561676, 0.0427921898663044, 0.06828540563583374, 0.05462832748889923, 0.02276180312037468, 0.07192729413509369, 0.0783006027340889, 0.06464351713657379, 0.18118394911289215, 0.40789151191711426, 0.008194249123334885, 0.9927068948745728, 0.9913347959518433, 0.0025878301821649075, 0.007763490546494722, 0.5839869976043701, 0.26137086749076843, 0.0008626100607216358, 0.05520704388618469, 0.0733218565583229, 0.013801760971546173, 0.9992876648902893, 0.032602448016405106, 0.011643731035292149, 0.016301224008202553, 0.9128684997558594, 0.025616208091378212, 0.00628057774156332, 0.02791368030011654, 0.10188493132591248, 0.2023741751909256, 0.2979785203933716, 0.2449425458908081, 0.03768346831202507, 0.0397769920527935, 0.016748208552598953, 0.02512231096625328, 0.9943776726722717, 0.15899166464805603, 0.8376146554946899, 0.0025852303951978683, 0.9928542375564575, 0.998742938041687, 0.9821000695228577, 0.9941750764846802, 0.01414253655821085, 0.9086580276489258, 0.07424832135438919, 0.9900906682014465, 0.9895586967468262, 0.9942180514335632, 0.09427931159734726, 0.6226578950881958, 0.010360363870859146, 0.03833334892988205, 0.22896404564380646, 0.004144145641475916, 0.15294533967971802, 0.5817805528640747, 0.06882540136575699, 0.07235491275787354, 0.029412565752863884, 0.0011765025556087494, 0.0429423451423645, 0.04411884769797325, 0.007059015799313784, 0.9934695363044739, 0.9772945046424866, 0.021786820143461227, 0.9884756207466125, 0.21478646993637085, 0.08931714296340942, 0.10420333594083786, 0.5911944508552551, 0.007281843572854996, 0.540590226650238, 0.38905850052833557, 0.0627625584602356, 0.127691388130188, 0.08755980432033539, 0.05837320536375046, 0.11309808492660522, 0.13133971393108368, 0.012161084450781345, 0.08999202400445938, 0.025538276880979538, 0.030402710661292076, 0.3247009515762329, 0.9984749555587769, 0.9873408675193787, 0.03167729079723358, 0.09503187239170074, 0.8095307946205139, 0.059834882616996765, 0.018883921205997467, 0.978816568851471, 0.00650462880730629, 0.9887035489082336, 0.9960068464279175, 0.11995285004377365, 0.30648744106292725, 0.22458131611347198, 0.1421467661857605, 0.02906346507370472, 0.03117717243731022, 0.030648745596408844, 0.054427944123744965, 0.028535038232803345, 0.03381930664181709, 0.9655084609985352, 0.031217364594340324, 0.09275101125240326, 0.022714532911777496, 0.05489345267415047, 0.8271875381469727, 0.4964306652545929, 0.04393191635608673, 0.035145532339811325, 0.005491489544510841, 0.14717192947864532, 0.03953872621059418, 0.047226812690496445, 0.10214170813560486, 0.047226812690496445, 0.035145532339811325, 0.005433580372482538, 0.66561359167099, 0.2974885404109955, 0.008150370791554451, 0.021734321489930153, 0.11880886554718018, 0.6471291184425354, 0.23256203532218933, 0.9827058911323547, 0.012132171541452408, 0.037580136209726334, 0.037580136209726334, 0.6822240352630615, 0.1214127466082573, 0.06070637330412865, 0.06070637330412865, 0.7771899700164795, 0.01132929977029562, 0.18580052256584167, 0.02265859954059124, 0.00226586009375751, 0.010305746458470821, 0.020096207037568092, 0.3040195405483246, 0.6652359366416931, 0.9966678619384766, 0.9952186346054077, 0.05247049406170845, 0.9444688558578491, 0.9979948997497559, 0.24752682447433472, 0.07662222534418106, 0.0008545229793526232, 0.08630681782960892, 0.18600116670131683, 0.13102684915065765, 0.15210509300231934, 0.027059894055128098, 0.023356961086392403, 0.06893151998519897, 0.005418102722615004, 0.1661551594734192, 0.012642240151762962, 0.12461636960506439, 0.06140516698360443, 0.6266939043998718, 0.9935146570205688, 0.028499729931354523, 0.17739084362983704, 0.04954158514738083, 0.08203660696744919, 0.06525638699531555, 0.19683457911014557, 0.2426472306251526, 0.0492752343416214, 0.05486863851547241, 0.053803227841854095, 0.06767828017473221, 0.9305763244628906, 0.9940921068191528, 0.47854405641555786, 0.0675768256187439, 0.01401593443006277, 0.43899908661842346, 0.9759842157363892, 0.7746955156326294, 0.224728062748909, 0.07067009806632996, 0.13031825423240662, 0.06418660283088684, 0.13356000185012817, 0.0953073799610138, 0.14523029327392578, 0.18088951706886292, 0.022043883800506592, 0.0564064085483551, 0.1011425256729126, 0.9620181918144226, 0.03390372544527054, 0.928249180316925, 0.06953177601099014, 0.9825076460838318, 0.07760585844516754, 0.05453384667634964, 0.19925828278064728, 0.018877100199460983, 0.6376265287399292, 0.004194911103695631, 0.00629236688837409, 0.1507587730884552, 0.19675298035144806, 0.26114487648010254, 0.06490293145179749, 0.0741017758846283, 0.09812096506357193, 0.012265120632946491, 0.08841107785701752, 0.03219594433903694, 0.020952915772795677, 0.9962035417556763, 0.09006869792938232, 0.9076153039932251, 0.9927300810813904, 0.9875916838645935, 0.9910625219345093, 0.990225613117218, 0.891280472278595, 0.10728375613689423, 0.043885838240385056, 0.05120014399290085, 0.8996596336364746, 0.38985222578048706, 0.08291633427143097, 0.0029093450866639614, 0.09746305644512177, 0.06109624728560448, 0.12801118195056915, 0.09018969535827637, 0.05091353878378868, 0.06255091726779938, 0.03273013234138489, 0.06610270589590073, 0.11927227675914764, 0.43972671031951904, 0.06538420170545578, 0.14873109757900238, 0.01796269230544567, 0.021555230021476746, 0.05748061463236809, 0.06466569006443024, 0.9846019148826599, 0.016519740223884583, 0.2019079476594925, 0.11013160645961761, 0.6699672937393188, 0.024322209879755974, 0.9450916051864624, 0.003474601311609149, 0.024322209879755974, 0.8505304455757141, 0.10692382603883743, 0.038881391286849976, 0.12049806118011475, 0.047262489795684814, 0.20182360708713531, 0.31721222400665283, 0.054075103253126144, 0.05577825754880905, 0.0672745406627655, 0.03278569132089615, 0.09282182902097702, 0.010644705034792423, 0.970984935760498, 0.025627167895436287, 0.9892431497573853, 0.020421624183654785, 0.04413705691695213, 0.05138343945145607, 0.18708842992782593, 0.24176567792892456, 0.10869573801755905, 0.0955204963684082, 0.11067202687263489, 0.11001326143741608, 0.030961817130446434, 0.030803175643086433, 0.01760181412100792, 0.04400453716516495, 0.8888916373252869, 0.01320136059075594, 0.9939636588096619, 0.9912236332893372, 0.9990959763526917, 0.05654406547546387, 0.9400451183319092, 0.27265825867652893, 0.0039090788923203945, 0.06547707319259644, 0.0732952356338501, 0.01954539492726326, 0.10554513335227966, 0.3586580157279968, 0.02345447428524494, 0.0029318092856556177, 0.0742725059390068, 0.9918825626373291, 0.9930832386016846, 0.9938083291053772, 0.9941292405128479, 0.9872344732284546, 0.9915617108345032, 0.19975487887859344, 0.7990195155143738, 0.9793489575386047, 0.011330295354127884, 0.022660590708255768, 0.022660590708255768, 0.07931207120418549, 0.008497721515595913, 0.7308040857315063, 0.12180067598819733, 0.002832573838531971, 0.00934284646064043, 0.019404372200369835, 0.8940384984016418, 0.070430688560009, 0.005749443545937538, 0.9890683889389038, 0.0846291109919548, 0.0584796667098999, 0.4787725508213043, 0.1374034434556961, 0.0404127761721611, 0.0294775553047657, 0.0342320017516613, 0.0622832216322422, 0.0370846651494503, 0.0370846651494503, 0.005476515740156174, 0.021906062960624695, 0.1341746300458908, 0.6517053842544556, 0.1697719842195511, 0.013691289350390434, 0.9946812987327576, 0.05209195986390114, 0.029964402318000793, 0.4881892502307892, 0.07929041981697083, 0.000460990791907534, 0.02673746645450592, 0.014290714636445045, 0.23879322409629822, 0.06592168658971786, 0.005070898681879044, 0.041801583021879196, 0.8824778199195862, 0.0743139237165451, 0.9888632893562317, 0.012953841127455235, 0.8186827301979065, 0.056996900588274, 0.023316914215683937, 0.08679073303937912, 0.036432038992643356, 0.7522144317626953, 0.2014477401971817, 0.010715305805206299, 0.9897346496582031, 0.9900591373443604, 0.01565597578883171, 0.5387497544288635, 0.17774136364459991, 0.05709826201200485, 0.12893155217170715, 0.03960040584206581, 0.0018418794497847557, 0.04144228622317314, 0.9562177658081055, 0.03464557230472565, 0.9940004348754883, 0.20040783286094666, 0.7981759905815125, 0.9990657567977905, 0.02949688956141472, 0.030480118468403816, 0.9389843344688416, 0.9947848916053772, 0.9926949739456177, 0.05052619054913521, 0.05052619054913521, 0.8625542521476746, 0.03609013557434082, 0.9870107769966125, 0.024646587669849396, 0.10914917290210724, 0.08098164200782776, 0.017604704946279526, 0.746439516544342, 0.007041881792247295, 0.01408376358449459, 0.9993667602539062, 0.029904931783676147, 0.9629387855529785, 0.865506649017334, 0.10981189459562302, 0.023615460842847824, 0.0038583234418183565, 0.9491475820541382, 0.042441558092832565, 0.011400341987609863, 0.2233125865459442, 0.06974326819181442, 0.07644934952259064, 0.004023650195449591, 0.14887505769729614, 0.1978294551372528, 0.06303718686103821, 0.09522638469934464, 0.1099797710776329, 0.9821186661720276, 0.01741345226764679, 0.9934096932411194, 0.9922566413879395, 0.039439857006073, 0.9586918950080872, 0.7953653931617737, 0.0046422104351222515, 0.01005812268704176, 0.1493244469165802, 0.0007737017585895956, 0.01005812268704176, 0.029400667175650597, 0.9974008798599243, 0.9822391867637634, 0.08993218839168549, 0.8993219137191772, 0.982517421245575, 0.0062467665411531925, 0.9911536574363708, 0.9936993718147278, 0.997281014919281, 0.2905958890914917, 0.7078618407249451, 0.3073049783706665, 0.05825990438461304, 0.007682624738663435, 0.08770996332168579, 0.09987412393093109, 0.1280437409877777, 0.15557314455509186, 0.016645686700940132, 0.05313815549015999, 0.08578930795192719, 0.9962541460990906, 0.9895529747009277, 0.03024541400372982, 0.004032721742987633, 0.9295423626899719, 0.0020163608714938164, 0.006049082614481449, 0.02822905220091343, 0.143030047416687, 0.5369619131088257, 0.007990504615008831, 0.0031962019857019186, 0.13184332847595215, 0.093488909304142, 0.018378160893917084, 0.005593353416770697, 0.05753163620829582, 0.0015981009928509593, 0.03587798401713371, 0.05189494043588638, 0.5907053351402283, 0.04164408892393112, 0.0012813565554097295, 0.11147801578044891, 0.05381697416305542, 0.03203391283750534, 0.005125426221638918, 0.0756000354886055, 0.388294517993927, 0.25386178493499756, 0.09002191573381424, 0.15783841907978058, 0.027606720104813576, 0.0024005842860788107, 0.042610373347997665, 0.03660891205072403, 0.9922282099723816, 0.1063678190112114, 0.12472893297672272, 0.034822799265384674, 0.08104214817285538, 0.24059388041496277, 0.09623755514621735, 0.12282950431108475, 0.0930718407034874, 0.07344444841146469, 0.02659195475280285, 0.08148057013750076, 0.08059169352054596, 0.1822201907634735, 0.1339244395494461, 0.1167394369840622, 0.15347976982593536, 0.17629432678222656, 0.018073873594403267, 0.02844412811100483, 0.029036713764071465, 0.9882287383079529, 0.053438350558280945, 0.945015013217926, 0.1160629466176033, 0.09040692448616028, 0.04031660035252571, 0.054977186024188995, 0.04520346224308014, 0.03909488767385483, 0.3750665783882141, 0.02321258932352066, 0.053755469620227814, 0.16126640141010284, 0.057640671730041504, 0.6063355207443237, 0.031037285923957825, 0.024386439472436905, 0.19619998335838318, 0.056532200425863266, 0.011084744706749916, 0.01662711799144745, 0.007938551716506481, 0.9883496165275574, 0.9811052083969116, 0.04756637662649155, 0.2102433741092682, 0.6021903157234192, 0.0038053099997341633, 0.04756637662649155, 0.032345134764909744, 0.004756637383252382, 0.05327434092760086, 0.9910971522331238, 0.995514452457428, 0.016419608145952225, 0.5435311198234558, 0.1498815417289734, 0.06062624603509903, 0.11367420852184296, 0.05473202466964722, 0.009262342937290668, 0.05220593139529228, 0.8968327641487122, 0.10020478069782257, 0.03034295327961445, 0.9659173488616943, 0.005181933753192425, 0.9897493720054626, 0.9962561726570129, 0.9940349459648132, 0.9951643347740173, 0.9922572374343872, 0.12975022196769714, 0.027522772550582886, 0.8374786376953125, 0.10295763611793518, 0.3724643886089325, 0.030281657353043556, 0.07683970779180527, 0.06737668812274933, 0.10901396721601486, 0.06132035702466965, 0.10712136328220367, 0.04996473714709282, 0.022711243480443954, 0.05779813230037689, 0.03639141470193863, 0.002140671480447054, 0.006422014441341162, 0.8948007225990295, 0.004667358472943306, 0.03267151117324829, 0.06534302234649658, 0.8961328268051147, 0.9892205595970154, 0.031489819288253784, 0.02422293648123741, 0.03027867153286934, 0.7981457710266113, 0.027856377884745598, 0.029067525640130043, 0.05934619531035423, 0.0734139233827591, 0.09762490540742874, 0.3139616847038269, 0.13511286675930023, 0.03280196711421013, 0.06560393422842026, 0.001561998389661312, 0.26475873589515686, 0.016400983557105064, 0.9912712574005127, 0.034169621765613556, 0.09111899137496948, 0.8542405366897583, 0.017084810882806778, 0.9909042119979858, 0.08195075392723083, 0.02731691673398018, 0.8850681185722351, 0.9933369159698486, 0.9978326559066772, 0.9879665970802307, 0.008702563121914864, 0.04061196371912956, 0.20596066117286682, 0.74261873960495, 0.9881279468536377, 0.009207873605191708, 0.053712595254182816, 0.8885597586631775, 0.010742519050836563, 0.02915826439857483, 0.007673227693885565, 0.020768892019987106, 0.9553690552711487, 0.023365003988146782, 0.02318766713142395, 0.04289718344807625, 0.03246273472905159, 0.46723151206970215, 0.29448336362838745, 0.06028793379664421, 0.02782520093023777, 0.05101286992430687, 0.8876930475234985, 0.03227974846959114, 0.0792321115732193, 0.009054933674633503, 0.986987829208374, 0.019230911508202553, 0.004807727877050638, 0.9735649228096008, 0.053210411220788956, 0.9459628462791443, 0.9955835938453674, 0.9951725006103516, 0.9991540908813477, 0.9979762434959412, 0.9936963319778442, 0.007695446722209454, 0.9907887578010559, 0.9962958693504333, 0.0020005942787975073, 0.0020005942787975073, 0.7685548663139343, 0.2287604659795761, 0.20653042197227478, 0.7855666279792786, 0.006759177427738905, 0.34749361872673035, 0.034891776740550995, 0.11749272048473358, 0.017089851200580597, 0.17588303983211517, 0.010681157000362873, 0.04486085847020149, 0.18585212528705597, 0.012817388400435448, 0.05340578407049179, 0.996053159236908, 0.9903555512428284, 0.04634469747543335, 0.09325803816318512, 0.14557352662086487, 0.28887245059013367, 0.09695424139499664, 0.0958169475197792, 0.07705160975456238, 0.0958169475197792, 0.03866796940565109, 0.021892894059419632, 0.06008889153599739, 0.06687311828136444, 0.13083872199058533, 0.4409749209880829, 0.256831556558609, 0.04361290484666824, 0.0064284466207027435, 0.9899807572364807, 0.9886947870254517, 0.9950776696205139, 0.9919518828392029, 0.09934293478727341, 0.038046229630708694, 0.1631760448217392, 0.17163076996803284, 0.03381887078285217, 0.05241924896836281, 0.09257915616035461, 0.24434134364128113, 0.02536415308713913, 0.07905161380767822, 0.04936765506863594, 0.9424734115600586, 0.007479947991669178, 0.9844189286231995, 0.05895441398024559, 0.2187705934047699, 0.01633676514029503, 0.11222647875547409, 0.061795592308044434, 0.24718236923217773, 0.026280883699655533, 0.014205883257091045, 0.11293677240610123, 0.13069412112236023, 0.9943311214447021, 0.9966910481452942, 0.1197439506649971, 0.8786845207214355, 0.004850068595260382, 0.9894140362739563, 0.08816782385110855, 0.9062831997871399, 0.004100828897207975, 0.012024443596601486, 0.012024443596601486, 0.0745515525341034, 0.009619555436074734, 0.7070373296737671, 0.007214666344225407, 0.17555688321590424, 0.08572755008935928, 0.08572755008935928, 0.027654048055410385, 0.03318485617637634, 0.7660171389579773, 0.9978319406509399, 0.03353497385978699, 0.8607310652732849, 0.10060492902994156, 0.009947385638952255, 0.988106906414032, 0.9937465786933899, 0.9970183968544006, 0.38660314679145813, 0.25971803069114685, 0.01553021278232336, 0.02296488918364048, 0.0650947168469429, 0.1019376739859581, 0.014208491891622543, 0.05749483034014702, 0.06030348315834999, 0.016025857999920845, 0.07527759671211243, 0.05645819753408432, 0.135157510638237, 0.09580785036087036, 0.06843417882919312, 0.03763879835605621, 0.051325634121894836, 0.04961477965116501, 0.42771363258361816, 0.17850126326084137, 0.3224695920944214, 0.04134225472807884, 0.036964841187000275, 0.04669243097305298, 0.1381317675113678, 0.027723630890250206, 0.11770383268594742, 0.0753888189792633, 0.015077764168381691, 0.002935068216174841, 0.012718629091978073, 0.22795696556568146, 0.15262354910373688, 0.04304766654968262, 0.1330564320087433, 0.4148229658603668, 0.011740272864699364, 0.9925435185432434, 0.9940683841705322, 0.9845766425132751, 0.0067675975151360035, 0.9914530515670776, 0.9901037216186523, 0.021420219913125038, 0.8907241821289062, 0.08746589720249176, 0.013839946128427982, 0.2886617183685303, 0.6959515810012817, 0.9896976351737976, 0.015450194478034973, 0.035816360265016556, 0.02177072875201702, 0.01685475744307041, 0.013343350030481815, 0.23737117648124695, 0.013343350030481815, 0.6468012928962708, 0.3704948127269745, 0.6289325952529907, 0.9970839023590088, 0.9916179776191711, 0.06309525668621063, 0.23160114884376526, 0.09143144637346268, 0.03778158873319626, 0.05516112223267555, 0.10049902647733688, 0.04496009275317192, 0.051760777831077576, 0.1987311691045761, 0.12505705654621124, 0.5733996629714966, 0.11945825815200806, 0.09025734663009644, 0.11680363118648529, 0.0929119810461998, 0.006636569742113352, 0.9917995929718018, 0.782045841217041, 0.031643472611904144, 0.12431364506483078, 0.06102669611573219, 0.11312982439994812, 0.85518479347229, 0.028761819005012512, 0.1125701516866684, 0.05992540344595909, 0.0016801515594124794, 0.18145637214183807, 0.20833879709243774, 0.05376484990119934, 0.18929708003997803, 0.04480404034256935, 0.052084699273109436, 0.09632869064807892, 0.9851973056793213, 0.15788429975509644, 0.6178081631660461, 0.17962199449539185, 0.04461947828531265, 0.052308328449726105, 0.0018681546207517385, 0.0840669572353363, 0.32599297165870667, 0.043901633471250534, 0.4763794243335724, 0.014945236966013908, 0.021588508039712906, 0.053971268236637115, 0.11873678863048553, 0.8041719198226929, 0.08918620645999908, 0.9111455678939819, 0.9924914240837097, 0.9945734143257141, 0.9974730014801025, 0.014665473252534866, 0.12221228331327438, 0.017924467101693153, 0.027701450511813164, 0.23627707362174988, 0.016294971108436584, 0.5654354691505432, 0.09712156653404236, 0.8602195978164673, 0.0369986928999424, 0.05592300370335579, 0.0888008177280426, 0.05991750583052635, 0.4363223612308502, 0.06944285333156586, 0.10846605151891708, 0.01689980924129486, 0.006145385093986988, 0.14288020133972168, 0.015363463200628757, 0.007692718878388405, 0.5173353552818298, 0.2650141716003418, 0.13462257385253906, 0.07038837671279907, 0.005000267177820206, 0.3816435635089874, 0.487569123506546, 0.11059874296188354, 0.0077886441722512245, 0.012461830861866474, 0.9942175149917603, 0.9963088035583496, 0.05934375524520874, 0.025176139548420906, 0.23557673394680023, 0.5916392803192139, 0.05215057358145714, 0.03416761755943298, 0.18870770931243896, 0.0022071078419685364, 0.046349264681339264, 0.04303860291838646, 0.18098284304141998, 0.020967524498701096, 0.5164632201194763, 0.05881141871213913, 0.10455363243818283, 0.2860703468322754, 0.0609896183013916, 0.0762370228767395, 0.007986735552549362, 0.014521338045597076, 0.29115283489227295, 0.07986735552549362, 0.019603805616497993, 0.14538146555423737, 0.03939726948738098, 0.2041999250650406, 0.01609184220433235, 0.0016646733274683356, 0.07657497376203537, 0.0005548911285586655, 0.4916335344314575, 0.024970099329948425, 0.9953145384788513, 0.9900142550468445, 0.9978221654891968, 0.9882532358169556, 0.9908885955810547, 0.04804708808660507, 0.3049945533275604, 0.12394756078720093, 0.12046588957309723, 0.0936570018529892, 0.06649995595216751, 0.07102613151073456, 0.06336645036935806, 0.08495282381772995, 0.022979041561484337, 0.9857718348503113, 0.991929829120636, 0.9904465079307556, 0.9939417243003845, 0.07081771641969681, 0.9247960448265076, 0.05752654746174812, 0.26479777693748474, 0.13217931985855103, 0.19014500081539154, 0.040400322526693344, 0.10363561660051346, 0.04215686023235321, 0.07245710492134094, 0.07553104311227798, 0.020639296621084213, 0.08443208038806915, 0.3670520484447479, 0.031851623207330704, 0.05965859815478325, 0.05915301665663719, 0.11881161481142044, 0.05814185366034508, 0.08999347686767578, 0.10768882185220718, 0.022751159965991974, 0.02230319008231163, 0.9701887369155884, 0.9776880741119385, 0.9889037609100342, 0.2192477583885193, 0.7779079079627991, 0.09415528178215027, 0.9041321277618408, 0.06514911353588104, 0.08344942331314087, 0.1372523456811905, 0.21704170107841492, 0.03806464746594429, 0.1442064642906189, 0.09625963866710663, 0.03660062327980995, 0.1087038516998291, 0.0732012465596199, 0.04354425519704819, 0.0319778136909008, 0.24969910085201263, 0.04966766759753227, 0.20207256078720093, 0.0006803789874538779, 0.0319778136909008, 0.09865495562553406, 0.23337000608444214, 0.05851259455084801, 0.02581452950835228, 0.01173387747257948, 0.854226291179657, 0.002346775494515896, 0.08213713765144348, 0.021120978519320488, 0.9888254404067993, 0.06689516454935074, 0.09981182962656021, 0.13485215604305267, 0.13591398298740387, 0.06583333015441895, 0.006370967719703913, 0.024422042071819305, 0.060524191707372665, 0.3291666507720947, 0.07432795315980911, 0.991152822971344, 0.9976637363433838, 0.9881917238235474, 0.0415508970618248, 0.9556706547737122, 0.14121182262897491, 0.8573575615882874, 0.9959633350372314, 0.37817975878715515, 0.09959379583597183, 0.006086287554353476, 0.07109890133142471, 0.04454055801033974, 0.15022063255310059, 0.05947962775826454, 0.11646940559148788, 0.014662419445812702, 0.05975627526640892, 0.9972384572029114, 0.18402886390686035, 0.0029210930224508047, 0.09347497671842575, 0.049658581614494324, 0.02044765092432499, 0.07886950671672821, 0.5696130990982056, 0.9939109086990356, 0.2841370403766632, 0.05682740733027458, 0.07019855827093124, 0.4679903984069824, 0.09694086760282516, 0.00501418299973011, 0.01838533766567707, 0.9947983026504517, 0.10640466958284378, 0.03546822443604469, 0.03819654881954193, 0.6002314686775208, 0.22099430859088898, 0.9949023723602295, 0.979340136051178, 0.009374642744660378, 0.007030981592833996, 0.20858579874038696, 0.35779884457588196, 0.003124880837276578, 0.019530504941940308, 0.37889179587364197, 0.015624403953552246, 0.9001388549804688, 0.09725118428468704, 0.9928044080734253, 0.9915215373039246, 0.09694231301546097, 0.31304287910461426, 0.07068710029125214, 0.2393263280391693, 0.27870914340019226, 0.9975820779800415, 0.9928552508354187, 0.15090322494506836, 0.8492005467414856, 0.34192684292793274, 0.25229331851005554, 0.001819969853386283, 0.04618173465132713, 0.09463842958211899, 0.06574641168117523, 0.05596407130360603, 0.04049433022737503, 0.06074149161577225, 0.04026683419942856, 0.00978680606931448, 0.09786806255578995, 0.029360417276620865, 0.8220916986465454, 0.03914722427725792, 0.9928327798843384, 0.014372894540429115, 0.12560659646987915, 0.2262168675661087, 0.05811648815870285, 0.07061465829610825, 0.017497437074780464, 0.07561392337083817, 0.01562271174043417, 0.3499487340450287, 0.047493044286966324, 0.11003716289997101, 0.2054027020931244, 0.07580337673425674, 0.03178851306438446, 0.5746384859085083, 0.3218027353286743, 0.6757857799530029, 0.04022909700870514, 0.044463738799095154, 0.029642490670084953, 0.09104479849338531, 0.5356821417808533, 0.15879906713962555, 0.09951408207416534, 0.21030759811401367, 0.7733358144760132, 0.001655965344980359, 0.013247722759842873, 0.9961628913879395, 0.9994528889656067, 0.9940481781959534, 0.9878154397010803, 0.3193429112434387, 0.6789767742156982, 0.17293505370616913, 0.014762748964130878, 0.8098422288894653, 0.07927528023719788, 0.004718767013400793, 0.9126095175743103, 0.0018875066889449954, 0.9899497628211975, 0.009148583747446537, 0.04269339144229889, 0.21549998223781586, 0.07522169500589371, 0.43404948711395264, 0.14231130480766296, 0.05489150434732437, 0.027445752173662186, 0.12140603363513947, 0.029261967167258263, 0.4999438226222992, 0.12700939178466797, 0.03673310950398445, 0.023658612743020058, 0.0678628608584404, 0.04171387106180191, 0.006225950550287962, 0.04544943943619728, 0.9914941787719727, 0.9966549277305603, 0.9308264255523682, 0.06878028064966202, 0.9908043742179871, 0.03596719354391098, 0.9531306028366089, 0.9876322150230408, 0.990831196308136, 0.11258002370595932, 0.885111927986145, 0.9979943037033081, 0.9953410029411316, 0.014253759756684303, 0.9835094213485718, 0.9921932816505432, 0.9887199401855469, 0.02808680571615696, 0.9549513459205627, 0.009362268261611462, 0.012287507764995098, 0.03891044110059738, 0.043006278574466705, 0.13311466574668884, 0.06553337723016739, 0.08806046843528748, 0.5345065593719482, 0.08191671967506409, 0.9892351627349854, 0.0012264200486242771, 0.5175492763519287, 0.32316169142723083, 0.042311493307352066, 0.05212285369634628, 0.005518890451639891, 0.03556618466973305, 0.0042924704030156136, 0.017783092334866524, 0.05752358213067055, 0.8576242923736572, 0.08367066830396652, 0.9361351728439331, 0.06112222746014595, 0.9920821785926819, 0.113490991294384, 0.09021078795194626, 0.6205629110336304, 0.04365038126707077, 0.0065475571900606155, 0.01455012708902359, 0.038557834923267365, 0.06547556817531586, 0.007275063544511795, 0.0005374156753532588, 0.21496626734733582, 0.028483029454946518, 0.7529193162918091, 0.0032244939357042313, 0.05143122002482414, 0.9429057240486145, 0.9488199353218079, 0.04447593539953232, 0.00494177034124732, 0.5825725793838501, 0.09321161359548569, 0.2896218001842499, 0.015535268932580948, 0.018864255398511887, 0.9941855072975159, 0.07540678977966309, 0.09515619277954102, 0.007181599270552397, 0.025135597214102745, 0.5152797698974609, 0.15799517929553986, 0.014363198541104794, 0.021544797345995903, 0.07361139357089996, 0.014363198541104794, 0.9840489625930786, 0.044449977576732635, 0.9260411858558655, 0.02963331714272499, 0.9803271293640137, 0.036795347929000854, 0.08714687824249268, 0.21302570402622223, 0.023239167407155037, 0.07552729547023773, 0.5054518580436707, 0.013556180521845818, 0.04454173520207405, 0.0161642637103796, 0.010776176117360592, 0.9644677639007568, 0.25456756353378296, 0.05604676902294159, 0.09533188492059708, 0.08485585451126099, 0.07542742788791656, 0.0790940374135971, 0.19380658864974976, 0.029856689274311066, 0.056570570915937424, 0.07490362226963043, 0.9937314391136169, 0.2710559070110321, 0.05701915919780731, 0.04785025119781494, 0.04240620881319046, 0.06332278251647949, 0.31919267773628235, 0.004011398181319237, 0.12406681478023529, 0.014326422475278378, 0.05673263221979141, 0.08566314727067947, 0.059305258095264435, 0.024161402136087418, 0.7292349934577942, 0.026357892900705338, 0.013178946450352669, 0.008785963989794254, 0.050519295036792755, 0.9911162257194519, 0.006925193127244711, 0.14658324420452118, 0.027700772508978844, 0.14196646213531494, 0.19736799597740173, 0.08194811642169952, 0.29085808992385864, 0.10618629306554794, 0.9819319248199463, 0.9772378206253052, 0.9975225329399109, 0.9917201995849609, 0.1665320247411728, 0.1619061380624771, 0.025442393496632576, 0.11217781901359558, 0.01619061268866062, 0.011564724147319794, 0.49959608912467957, 0.005782362073659897, 0.9957937598228455, 0.9916776418685913, 0.9888594746589661, 0.9933105707168579, 0.9947336316108704, 0.9945342540740967, 0.2329992949962616, 0.1141112744808197, 0.013268752954900265, 0.05891326069831848, 0.11835727095603943, 0.13640277087688446, 0.05891326069831848, 0.05148275941610336, 0.1480792760848999, 0.067936010658741, 0.9844375848770142, 0.05380403250455856, 0.8496553301811218, 0.017934676259756088, 0.05604586750268936, 0.022418346256017685, 0.0005918670794926584, 0.02959335222840309, 0.1485586315393448, 0.0017756011802703142, 0.8191440105438232, 0.0007285924511961639, 0.08888828009366989, 0.1347896009683609, 0.17486219108104706, 0.1617475301027298, 0.0029143698047846556, 0.11657479405403137, 0.31329476833343506, 0.00655733235180378, 0.2761455476284027, 0.19480666518211365, 0.008133890107274055, 0.15861085057258606, 0.0662912055850029, 0.11224768310785294, 0.06303764879703522, 0.04026275500655174, 0.055717144161462784, 0.025215057656168938, 0.9921115636825562, 0.016401542350649834, 0.21937061846256256, 0.2183455228805542, 0.11891117691993713, 0.06970655173063278, 0.006150578148663044, 0.09225866943597794, 0.2583242654800415, 0.9893926978111267, 0.010924343019723892, 0.02490750327706337, 0.2569405734539032, 0.4173099100589752, 0.03189908340573311, 0.09263843297958374, 0.11973080784082413, 0.027529345825314522, 0.01791592314839363, 0.9878115057945251, 0.9829196333885193, 0.9951297044754028, 0.011210200376808643, 0.25335052609443665, 0.1322803646326065, 0.01793632097542286, 0.051566921174526215, 0.5313634872436523, 0.9887993931770325, 0.11263924837112427, 0.2589200735092163, 0.019223764538764954, 0.10693219304084778, 0.12255150079727173, 0.14748232066631317, 0.10512996464967728, 0.042352356016635895, 0.07779616862535477, 0.0069085401482880116, 0.9897999167442322, 0.9859444499015808, 0.9879947304725647, 0.13968348503112793, 0.12965098023414612, 0.05633643642067909, 0.1337025761604309, 0.14469975233078003, 0.09781703352928162, 0.11267287284135818, 0.0472685843706131, 0.06926294416189194, 0.0690700113773346, 0.010668139904737473, 0.06756488978862762, 0.849895179271698, 0.021336279809474945, 0.04978465288877487, 0.9944585561752319, 0.018542524427175522, 0.002852695994079113, 0.46071040630340576, 0.041364092379808426, 0.4749738872051239, 0.16669614613056183, 0.8296921849250793, 0.9947420358657837, 0.06429172307252884, 0.47368955612182617, 0.013301734812557697, 0.1337563395500183, 0.05172897130250931, 0.08128838241100311, 0.008128838613629341, 0.04951201379299164, 0.06133577972650528, 0.06355273723602295, 0.9842392802238464, 0.10246173292398453, 0.8283525705337524, 0.04906618222594261, 0.002886245958507061, 0.015874352306127548, 0.9982162714004517, 0.9969639778137207, 0.9986324310302734, 0.9921741485595703, 0.03859842196106911, 0.9544336795806885, 0.0035089473240077496, 0.9931648969650269, 0.99313884973526, 0.03596452251076698, 0.014652212150394917, 0.042624618858098984, 0.06393692642450333, 0.033300481736660004, 0.6793298721313477, 0.08391721546649933, 0.045288655906915665, 0.014020097441971302, 0.9720600843429565, 0.009346731007099152, 0.9924536347389221, 0.005523736588656902, 0.9942725300788879, 0.9951942563056946, 0.04679335653781891, 0.8838745355606079, 0.06759040802717209, 0.7121989727020264, 0.1270459145307541, 0.052858516573905945, 0.10664437711238861, 0.9878156185150146, 0.9903208017349243, 0.9929757714271545, 0.9881840348243713, 0.020772220566868782, 0.6825157999992371, 0.29377853870391846, 0.0029674600809812546, 0.9971234798431396, 0.003084203926846385, 0.05119778588414192, 0.5261651873588562, 0.3065698742866516, 0.0018505224725231528, 0.03639360889792442, 0.028374677523970604, 0.04317885637283325, 0.003084203926846385, 0.9957553148269653, 0.9854987263679504, 0.02171097695827484, 0.00542774423956871, 0.9457844495773315, 0.0257817842066288, 0.9875307083129883, 0.00667250482365489, 0.007349025458097458, 0.07349025458097458, 0.012860794551670551, 0.22230802476406097, 0.09553732722997665, 0.014698050916194916, 0.5750612616539001, 0.9939971566200256, 0.003269727574661374, 0.9878903031349182, 0.9933966398239136, 0.9575048089027405, 0.03928224742412567, 0.9776325821876526, 0.01339222677052021, 0.17330770194530487, 0.11415642499923706, 0.09121457487344742, 0.18436400592327118, 0.1000596284866333, 0.14179719984531403, 0.06937836110591888, 0.0420139878988266, 0.05279389023780823, 0.03040485829114914, 0.08410754054784775, 0.021627653390169144, 0.07689832150936127, 0.06728602945804596, 0.747355580329895, 0.3352258801460266, 0.6621745228767395, 0.002759060589596629, 0.040964558720588684, 0.9597410559654236, 0.9989423751831055, 0.013820650056004524, 0.315178245306015, 0.6708071231842041, 0.05501579865813255, 0.14754237234592438, 0.01000287290662527, 0.005001436453312635, 0.7827247977256775, 0.04238295927643776, 0.9505892395973206, 0.012514205649495125, 0.00782137829810381, 0.9776723384857178, 0.9941579699516296, 0.1177714541554451, 0.5513504147529602, 0.10501912981271744, 0.062261343002319336, 0.027004919946193695, 0.04050737991929054, 0.015752868726849556, 0.028505193069577217, 0.015752868726849556, 0.03600655868649483, 0.10179346799850464, 0.06227659061551094, 0.09353993833065033, 0.3176356256008148, 0.2118404507637024, 0.047520291060209274, 0.05627403035759926, 0.05527360364794731, 0.05027146637439728, 0.004001708701252937, 0.22780875861644745, 0.16640575230121613, 0.09737280011177063, 0.15005584061145782, 0.10609275102615356, 0.05122971907258034, 0.08029622584581375, 0.011989934369921684, 0.05340970680117607, 0.054863035678863525, 0.009546658024191856, 0.9880791306495667, 0.9947073459625244, 0.9951348900794983, 0.9956521391868591, 0.9887626767158508, 0.9815458059310913, 0.9880534410476685, 0.13009525835514069, 0.03196198120713234, 0.015481585636734962, 0.038953665643930435, 0.21624279022216797, 0.06367426365613937, 0.24495863914489746, 0.04095128923654556, 0.06791920959949493, 0.14982178807258606, 0.9868786931037903, 0.9906402826309204, 0.9910144209861755], \"Term\": [\"accept\", \"accept\", \"accept\", \"accept\", \"accept\", \"accept\", \"accept\", \"accept\", \"accept\", \"access\", \"access\", \"access\", \"access\", \"access\", \"access\", \"adaptec\", \"address\", \"address\", \"address\", \"address\", \"address\", \"address\", \"address\", \"address\", \"address\", \"address\", \"administr\", \"administr\", \"administr\", \"administr\", \"agenc\", \"agenc\", \"agenc\", \"agenc\", \"agenc\", \"aid\", \"aid\", \"aid\", \"aid\", \"alaska\", \"algorithm\", \"algorithm\", \"alomar\", \"amanda\", \"american\", \"american\", \"american\", \"american\", \"american\", \"american\", \"american\", \"american\", \"andrew\", \"andrew\", \"andrew\", \"andrew\", \"andrew\", \"andrew\", \"andrew\", \"andrew\", \"anonym\", \"anonym\", \"anti\", \"anti\", \"anti\", \"appl\", \"appl\", \"appl\", \"applic\", \"applic\", \"applic\", \"applic\", \"applic\", \"arab\", \"arab\", \"archiv\", \"archiv\", \"archiv\", \"archiv\", \"argic\", \"argument\", \"argument\", \"argument\", \"argument\", \"argument\", \"argument\", \"argument\", \"argument\", \"arm\", \"arm\", \"arm\", \"arm\", \"arm\", \"armenia\", \"armenian\", \"armi\", \"armi\", \"armi\", \"armi\", \"armori\", \"atheism\", \"atheist\", \"atho\", \"attack\", \"attack\", \"attack\", \"attack\", \"attack\", \"attack\", \"aurora\", \"author\", \"author\", \"author\", \"author\", \"author\", \"auto\", \"auto\", \"auto\", \"auto\", \"auto\", \"auto\", \"autom\", \"automot\", \"avail\", \"avail\", \"avail\", \"avail\", \"avail\", \"avail\", \"avail\", \"avail\", \"avail\", \"avail\", \"azerbaijan\", \"azerbaijani\", \"azeri\", \"baalk\", \"baerga\", \"ball\", \"ball\", \"ball\", \"bank\", \"bank\", \"bank\", \"bank\", \"bank\", \"bank\", \"bank\", \"bank\", \"bank\", \"basebal\", \"basebal\", \"bat\", \"batf\", \"batf\", \"batteri\", \"batteri\", \"belief\", \"belief\", \"believ\", \"believ\", \"believ\", \"believ\", \"believ\", \"believ\", \"believ\", \"believ\", \"believ\", \"believ\", \"berkeley\", \"berkeley\", \"berkeley\", \"berkeley\", \"best\", \"best\", \"best\", \"best\", \"best\", \"best\", \"best\", \"best\", \"best\", \"best\", \"better\", \"better\", \"better\", \"better\", \"better\", \"better\", \"better\", \"better\", \"better\", \"better\", \"bibl\", \"biblic\", \"bike\", \"bike\", \"billion\", \"billion\", \"binari\", \"binari\", \"bio\", \"blah\", \"blast\", \"board\", \"board\", \"board\", \"board\", \"board\", \"board\", \"board\", \"board\", \"boni\", \"bontchev\", \"book\", \"book\", \"book\", \"book\", \"book\", \"book\", \"book\", \"book\", \"boyl\", \"brake\", \"brake\", \"brave\", \"brave\", \"bruin\", \"build\", \"build\", \"build\", \"build\", \"build\", \"build\", \"build\", \"build\", \"build\", \"build\", \"buy\", \"buy\", \"buy\", \"buy\", \"buy\", \"byte\", \"byte\", \"byte\", \"cach\", \"cactus\", \"cadr\", \"callison\", \"canada\", \"canada\", \"canada\", \"canada\", \"canada\", \"canada\", \"canada\", \"canada\", \"canada\", \"cancer\", \"cancer\", \"candida\", \"canuck\", \"car\", \"car\", \"card\", \"card\", \"card\", \"card\", \"card\", \"carlo\", \"case\", \"case\", \"case\", \"case\", \"case\", \"case\", \"case\", \"case\", \"case\", \"case\", \"catbyt\", \"catcher\", \"cathol\", \"caus\", \"caus\", \"caus\", \"caus\", \"caus\", \"caus\", \"caus\", \"caus\", \"caus\", \"centerlin\", \"centri\", \"char\", \"chastiti\", \"children\", \"children\", \"children\", \"children\", \"children\", \"children\", \"chip\", \"chip\", \"chip\", \"chopin\", \"christ\", \"christ\", \"christian\", \"christian\", \"church\", \"church\", \"church\", \"cica\", \"cipher\", \"ciphertext\", \"circuit\", \"circuit\", \"circuit\", \"claim\", \"claim\", \"claim\", \"claim\", \"claim\", \"claim\", \"claim\", \"claim\", \"claim\", \"claim\", \"clarkson\", \"classifi\", \"classifi\", \"classifi\", \"classifi\", \"clayton\", \"cleveland\", \"cleveland\", \"cleveland\", \"client\", \"client\", \"clinic\", \"clinic\", \"clinton\", \"clinton\", \"clinton\", \"clinton\", \"clipper\", \"clipper\", \"coach\", \"coach\", \"code\", \"code\", \"code\", \"code\", \"code\", \"code\", \"color\", \"color\", \"color\", \"color\", \"color\", \"color\", \"colorado\", \"colorado\", \"colorado\", \"colorado\", \"colorado\", \"colorado\", \"colorado\", \"colorado\", \"columbia\", \"columbia\", \"columbia\", \"columbia\", \"columbia\", \"come\", \"come\", \"come\", \"come\", \"come\", \"come\", \"come\", \"come\", \"come\", \"come\", \"communic\", \"communic\", \"communic\", \"communic\", \"communic\", \"communic\", \"communic\", \"communic\", \"compil\", \"compil\", \"compil\", \"compil\", \"concordia\", \"config\", \"contradict\", \"contradict\", \"contradict\", \"contrib\", \"control\", \"control\", \"control\", \"control\", \"control\", \"control\", \"control\", \"control\", \"control\", \"copi\", \"copi\", \"copi\", \"copi\", \"copi\", \"copi\", \"copi\", \"copper\", \"cost\", \"cost\", \"cost\", \"cost\", \"cost\", \"cost\", \"cost\", \"cost\", \"counterst\", \"countri\", \"countri\", \"countri\", \"countri\", \"countri\", \"countri\", \"countri\", \"court\", \"court\", \"court\", \"court\", \"cramer\", \"crime\", \"crime\", \"crime\", \"crypt\", \"crypto\", \"cryptograph\", \"cryptographi\", \"ctrl\", \"cub\", \"cunixb\", \"cure\", \"cwru\", \"cwru\", \"data\", \"data\", \"data\", \"data\", \"data\", \"data\", \"data\", \"david\", \"david\", \"david\", \"david\", \"david\", \"david\", \"david\", \"david\", \"david\", \"david\", \"davidian\", \"dealer\", \"dealer\", \"dealer\", \"death\", \"death\", \"death\", \"death\", \"death\", \"death\", \"decrypt\", \"den\", \"desi\", \"design\", \"design\", \"design\", \"design\", \"design\", \"design\", \"design\", \"design\", \"design\", \"deskjet\", \"detroit\", \"devic\", \"devic\", \"devic\", \"devic\", \"diamond\", \"diet\", \"differ\", \"differ\", \"differ\", \"differ\", \"differ\", \"differ\", \"differ\", \"differ\", \"differ\", \"differ\", \"dillon\", \"directori\", \"directori\", \"directori\", \"diseas\", \"disk\", \"disk\", \"disk\", \"display\", \"display\", \"display\", \"display\", \"display\", \"display\", \"display\", \"distribut\", \"distribut\", \"distribut\", \"distribut\", \"distribut\", \"distribut\", \"distribut\", \"distribut\", \"distribut\", \"distribut\", \"divin\", \"divis\", \"divis\", \"divis\", \"divis\", \"divis\", \"divis\", \"divis\", \"divis\", \"divis\", \"dock\", \"doctor\", \"doctor\", \"doctor\", \"doctrin\", \"dodger\", \"drive\", \"drive\", \"drive\", \"drive\", \"drive\", \"drive\", \"drive\", \"drive\", \"driver\", \"driver\", \"driver\", \"driver\", \"driver\", \"dseg\", \"dseg\", \"dtmedin\", \"duke\", \"duke\", \"dyer\", \"earth\", \"earth\", \"earth\", \"earth\", \"earth\", \"earth\", \"edmonton\", \"effect\", \"effect\", \"effect\", \"effect\", \"effect\", \"effect\", \"effect\", \"effect\", \"effect\", \"effect\", \"einstein\", \"eisa\", \"email\", \"email\", \"email\", \"email\", \"email\", \"email\", \"email\", \"email\", \"encrypt\", \"enforc\", \"enforc\", \"enforc\", \"enforc\", \"enforc\", \"engin\", \"engin\", \"engin\", \"engin\", \"engin\", \"engin\", \"engin\", \"engin\", \"engin\", \"engin\", \"engr\", \"entri\", \"entri\", \"entri\", \"ericsson\", \"escrow\", \"esdi\", \"espn\", \"etern\", \"etern\", \"etern\", \"ether\", \"ethernet\", \"ethnic\", \"evid\", \"evid\", \"evid\", \"evid\", \"evid\", \"evid\", \"exist\", \"exist\", \"exist\", \"exist\", \"exist\", \"exist\", \"exist\", \"exist\", \"exist\", \"extermin\", \"faith\", \"faith\", \"fbihh\", \"feder\", \"feder\", \"feder\", \"feder\", \"file\", \"file\", \"file\", \"file\", \"final\", \"final\", \"final\", \"final\", \"final\", \"final\", \"final\", \"final\", \"final\", \"final\", \"firearm\", \"fischer\", \"flight\", \"flight\", \"flight\", \"flight\", \"floppi\", \"floppi\", \"flyer\", \"flyer\", \"fnal\", \"follow\", \"follow\", \"follow\", \"follow\", \"follow\", \"follow\", \"follow\", \"follow\", \"follow\", \"follow\", \"font\", \"font\", \"food\", \"food\", \"food\", \"food\", \"forc\", \"forc\", \"forc\", \"forc\", \"forc\", \"forc\", \"forc\", \"forc\", \"forc\", \"forc\", \"format\", \"format\", \"format\", \"format\", \"format\", \"freenet\", \"freenet\", \"freenet\", \"frost\", \"frost\", \"function\", \"function\", \"function\", \"function\", \"function\", \"function\", \"fund\", \"fund\", \"fund\", \"fund\", \"fund\", \"game\", \"game\", \"game\", \"game\", \"gatech\", \"gaza\", \"genet\", \"genet\", \"genocid\", \"go\", \"go\", \"go\", \"go\", \"go\", \"go\", \"go\", \"go\", \"go\", \"go\", \"goal\", \"goal\", \"goal\", \"goal\", \"goal\", \"goal\", \"god\", \"good\", \"good\", \"good\", \"good\", \"good\", \"good\", \"good\", \"good\", \"good\", \"good\", \"gordon\", \"gordon\", \"gospel\", \"govern\", \"govern\", \"govern\", \"govern\", \"gradi\", \"graphic\", \"graphic\", \"great\", \"great\", \"great\", \"great\", \"great\", \"great\", \"great\", \"great\", \"great\", \"great\", \"greec\", \"greec\", \"greek\", \"greek\", \"greenbelt\", \"grind\", \"grind\", \"grind\", \"grind\", \"grind\", \"grind\", \"grind\", \"group\", \"group\", \"group\", \"group\", \"group\", \"group\", \"group\", \"group\", \"group\", \"group\", \"gtoal\", \"gun\", \"gun\", \"halat\", \"hallam\", \"hamburg\", \"handbook\", \"handgun\", \"handgun\", \"handheld\", \"handheld\", \"handheld\", \"happen\", \"happen\", \"happen\", \"happen\", \"happen\", \"happen\", \"happen\", \"happen\", \"happen\", \"happen\", \"hard\", \"hard\", \"hard\", \"hard\", \"hard\", \"hard\", \"hard\", \"hard\", \"hard\", \"harley\", \"health\", \"health\", \"health\", \"health\", \"heaven\", \"heaven\", \"heaven\", \"heaven\", \"helmet\", \"helmet\", \"helmet\", \"help\", \"help\", \"help\", \"help\", \"help\", \"help\", \"help\", \"help\", \"help\", \"help\", \"henri\", \"henri\", \"higgin\", \"high\", \"high\", \"high\", \"high\", \"high\", \"high\", \"high\", \"high\", \"high\", \"high\", \"hit\", \"hit\", \"hit\", \"hit\", \"hit\", \"hitler\", \"hitter\", \"hockey\", \"holi\", \"holi\", \"home\", \"home\", \"home\", \"home\", \"home\", \"home\", \"home\", \"home\", \"home\", \"home\", \"homeopathi\", \"homicid\", \"honda\", \"hulman\", \"husc\", \"hydro\", \"iastat\", \"iastat\", \"ifa\", \"illinoi\", \"illinoi\", \"illinoi\", \"illinoi\", \"illinoi\", \"illinoi\", \"illinoi\", \"illinoi\", \"imag\", \"imag\", \"imag\", \"imag\", \"imag\", \"imak\", \"includ\", \"includ\", \"includ\", \"includ\", \"includ\", \"includ\", \"includ\", \"includ\", \"includ\", \"includ\", \"indiana\", \"indiana\", \"indiana\", \"indiana\", \"indiana\", \"indiana\", \"infect\", \"inform\", \"inform\", \"inform\", \"inform\", \"inform\", \"inform\", \"inform\", \"inform\", \"inform\", \"inform\", \"ingr\", \"ingr\", \"ingr\", \"inning\", \"instal\", \"instal\", \"instal\", \"instal\", \"instal\", \"insur\", \"insur\", \"insur\", \"insur\", \"intellect\", \"intercon\", \"internet\", \"internet\", \"internet\", \"internet\", \"internet\", \"internet\", \"internet\", \"internet\", \"invest\", \"invest\", \"iran\", \"islam\", \"islam\", \"isra\", \"israel\", \"israel\", \"israel\", \"jaeger\", \"jake\", \"jason\", \"jason\", \"jason\", \"jason\", \"jay\", \"jeff\", \"jeff\", \"jeff\", \"jeff\", \"jeff\", \"jeff\", \"jeff\", \"jesus\", \"jet\", \"jet\", \"jew\", \"jew\", \"jew\", \"job\", \"job\", \"job\", \"john\", \"john\", \"john\", \"john\", \"john\", \"john\", \"john\", \"john\", \"john\", \"john\", \"jumper\", \"jumper\", \"kaldi\", \"kelvin\", \"key\", \"key\", \"kill\", \"kill\", \"kill\", \"kill\", \"kill\", \"kill\", \"kill\", \"koresh\", \"lamp\", \"larc\", \"larc\", \"laughter\", \"launch\", \"launch\", \"laurentian\", \"leaf\", \"leagu\", \"leagu\", \"leav\", \"leav\", \"leav\", \"leav\", \"leav\", \"leav\", \"leav\", \"leav\", \"leav\", \"leav\", \"lebanes\", \"lemieux\", \"librari\", \"librari\", \"librari\", \"librari\", \"librari\", \"librari\", \"life\", \"life\", \"life\", \"life\", \"life\", \"life\", \"life\", \"life\", \"life\", \"life\", \"list\", \"list\", \"list\", \"list\", \"list\", \"list\", \"list\", \"list\", \"list\", \"list\", \"live\", \"live\", \"live\", \"live\", \"live\", \"live\", \"live\", \"live\", \"livesey\", \"long\", \"long\", \"long\", \"long\", \"long\", \"long\", \"long\", \"long\", \"long\", \"long\", \"look\", \"look\", \"look\", \"look\", \"look\", \"look\", \"look\", \"look\", \"look\", \"look\", \"lopez\", \"lord\", \"lord\", \"lose\", \"lose\", \"lose\", \"lose\", \"lose\", \"lose\", \"lose\", \"lose\", \"lose\", \"lose\", \"love\", \"love\", \"love\", \"love\", \"love\", \"love\", \"love\", \"love\", \"lunar\", \"lunar\", \"lyme\", \"machin\", \"machin\", \"machin\", \"machin\", \"machin\", \"machin\", \"machin\", \"machin\", \"magellan\", \"magnus\", \"mail\", \"mail\", \"mail\", \"mail\", \"mail\", \"mail\", \"mail\", \"mail\", \"map\", \"map\", \"mar\", \"mar\", \"marriag\", \"marriag\", \"massacr\", \"maxtor\", \"maynard\", \"mccall\", \"mcgill\", \"mcgill\", \"mcgill\", \"mean\", \"mean\", \"mean\", \"mean\", \"mean\", \"mean\", \"mean\", \"mean\", \"mean\", \"mean\", \"medic\", \"medic\", \"medic\", \"medic\", \"medic\", \"medicin\", \"medicin\", \"medicin\", \"medicin\", \"meg\", \"memori\", \"memori\", \"memori\", \"memori\", \"memori\", \"memori\", \"memori\", \"messag\", \"messag\", \"messag\", \"messag\", \"messag\", \"messag\", \"messag\", \"messag\", \"messag\", \"met\", \"metal\", \"metal\", \"metal\", \"metal\", \"methodolog\", \"midway\", \"midway\", \"midway\", \"migrain\", \"militia\", \"mime\", \"mission\", \"mission\", \"mission\", \"mission\", \"mksol\", \"mode\", \"mode\", \"mode\", \"mode\", \"mode\", \"mode\", \"modem\", \"modem\", \"modem\", \"money\", \"money\", \"money\", \"money\", \"money\", \"money\", \"money\", \"money\", \"monitor\", \"monitor\", \"monitor\", \"montreal\", \"montreal\", \"moon\", \"moon\", \"moon\", \"moral\", \"moral\", \"mormon\", \"motherboard\", \"motif\", \"motorcycl\", \"motto\", \"mous\", \"mous\", \"murder\", \"murder\", \"murder\", \"muslim\", \"muslim\", \"nasa\", \"nasa\", \"nasa\", \"nation\", \"nation\", \"nation\", \"nation\", \"nation\", \"nation\", \"nation\", \"nation\", \"nation\", \"nation\", \"nazi\", \"ncsl\", \"need\", \"need\", \"need\", \"need\", \"need\", \"need\", \"need\", \"need\", \"need\", \"need\", \"netcom\", \"netcom\", \"netcom\", \"netcom\", \"netcom\", \"netcom\", \"nist\", \"nist\", \"nore\", \"nsmca\", \"nubus\", \"number\", \"number\", \"number\", \"number\", \"number\", \"number\", \"number\", \"number\", \"number\", \"number\", \"ohio\", \"ohio\", \"ohio\", \"openwindow\", \"opinion\", \"opinion\", \"opinion\", \"opinion\", \"opinion\", \"opinion\", \"opinion\", \"opinion\", \"opinion\", \"opinion\", \"optilink\", \"oracl\", \"orbit\", \"orbit\", \"outlet\", \"outlet\", \"output\", \"output\", \"output\", \"owner\", \"owner\", \"owner\", \"owner\", \"owner\", \"owner\", \"owner\", \"pain\", \"pain\", \"pain\", \"pain\", \"pain\", \"palestinian\", \"patent\", \"patent\", \"patent\", \"patient\", \"patient\", \"pen\", \"penguin\", \"peopl\", \"peopl\", \"peopl\", \"peopl\", \"peopl\", \"peopl\", \"peopl\", \"peopl\", \"peopl\", \"peopl\", \"period\", \"period\", \"period\", \"period\", \"period\", \"period\", \"period\", \"period\", \"period\", \"person\", \"person\", \"person\", \"person\", \"person\", \"person\", \"person\", \"person\", \"person\", \"person\", \"phone\", \"phone\", \"phone\", \"phone\", \"phone\", \"phone\", \"phone\", \"phone\", \"photographi\", \"physician\", \"pistol\", \"pitch\", \"pitch\", \"pitcher\", \"pitt\", \"pitt\", \"pitt\", \"pittsburgh\", \"pittsburgh\", \"pittsburgh\", \"plaintext\", \"play\", \"play\", \"play\", \"play\", \"play\", \"play\", \"play\", \"play\", \"player\", \"player\", \"playoff\", \"plymouth\", \"point\", \"point\", \"point\", \"point\", \"point\", \"point\", \"point\", \"point\", \"point\", \"point\", \"polit\", \"polit\", \"polit\", \"polit\", \"polit\", \"polit\", \"polygon\", \"popul\", \"popul\", \"popul\", \"popul\", \"port\", \"port\", \"port\", \"power\", \"power\", \"power\", \"power\", \"power\", \"power\", \"power\", \"power\", \"power\", \"power\", \"powerbook\", \"presid\", \"presid\", \"presid\", \"presid\", \"price\", \"price\", \"price\", \"price\", \"price\", \"price\", \"price\", \"princeton\", \"princeton\", \"princeton\", \"princeton\", \"printer\", \"printer\", \"prism\", \"prison\", \"privaci\", \"privat\", \"privat\", \"privat\", \"privat\", \"privat\", \"privat\", \"privat\", \"probe\", \"probe\", \"probe\", \"problem\", \"problem\", \"problem\", \"problem\", \"problem\", \"problem\", \"problem\", \"problem\", \"problem\", \"problem\", \"program\", \"program\", \"program\", \"program\", \"program\", \"program\", \"project\", \"project\", \"project\", \"project\", \"project\", \"propheci\", \"prophet\", \"propos\", \"propos\", \"propos\", \"propos\", \"propos\", \"propos\", \"protect\", \"protect\", \"protect\", \"protect\", \"protect\", \"protect\", \"protect\", \"provid\", \"provid\", \"provid\", \"provid\", \"provid\", \"provid\", \"provid\", \"provid\", \"provid\", \"provid\", \"public\", \"public\", \"public\", \"public\", \"public\", \"public\", \"public\", \"public\", \"public\", \"puck\", \"pyron\", \"quadra\", \"qualcomm\", \"quebec\", \"question\", \"question\", \"question\", \"question\", \"question\", \"question\", \"question\", \"question\", \"question\", \"question\", \"quicktim\", \"raider\", \"ramsey\", \"ranck\", \"ranger\", \"ranger\", \"read\", \"read\", \"read\", \"read\", \"read\", \"read\", \"read\", \"read\", \"read\", \"read\", \"reason\", \"reason\", \"reason\", \"reason\", \"reason\", \"reason\", \"reason\", \"reason\", \"reason\", \"reason\", \"recipi\", \"recipi\", \"redesign\", \"reilli\", \"religi\", \"religi\", \"religion\", \"religion\", \"repli\", \"repli\", \"repli\", \"repli\", \"repli\", \"repli\", \"repli\", \"repli\", \"repli\", \"repli\", \"research\", \"research\", \"research\", \"research\", \"research\", \"research\", \"research\", \"research\", \"research\", \"research\", \"resourc\", \"resourc\", \"resourc\", \"resourc\", \"resourc\", \"resourc\", \"restaur\", \"result\", \"result\", \"result\", \"result\", \"result\", \"result\", \"result\", \"result\", \"result\", \"result\", \"resurrect\", \"revel\", \"revolv\", \"rid\", \"rid\", \"ride\", \"ride\", \"rider\", \"right\", \"right\", \"right\", \"right\", \"right\", \"right\", \"right\", \"right\", \"right\", \"right\", \"ripem\", \"risk\", \"risk\", \"risk\", \"risk\", \"risk\", \"risk\", \"risk\", \"rkba\", \"road\", \"road\", \"road\", \"road\", \"road\", \"road\", \"road\", \"robi\", \"rochest\", \"rochest\", \"rochest\", \"rochest\", \"rochest\", \"rocki\", \"rockwel\", \"run\", \"run\", \"run\", \"run\", \"run\", \"run\", \"run\", \"run\", \"rutger\", \"rutger\", \"rwing\", \"sabbath\", \"sale\", \"sale\", \"sale\", \"sale\", \"sale\", \"sandvik\", \"satan\", \"satellit\", \"satellit\", \"say\", \"say\", \"say\", \"say\", \"say\", \"say\", \"say\", \"say\", \"say\", \"say\", \"scheme\", \"scheme\", \"scheme\", \"scheme\", \"scheme\", \"schneider\", \"scienc\", \"scienc\", \"scienc\", \"scienc\", \"scienc\", \"scienc\", \"scienc\", \"scienc\", \"scienc\", \"scienc\", \"scientif\", \"scientif\", \"scientif\", \"scientif\", \"scientif\", \"score\", \"score\", \"scott\", \"scott\", \"scott\", \"scott\", \"scott\", \"scott\", \"scott\", \"screen\", \"screen\", \"screen\", \"screen\", \"scriptur\", \"scsi\", \"sdpa\", \"sdsu\", \"season\", \"season\", \"secret\", \"secret\", \"secret\", \"secur\", \"secur\", \"secur\", \"secur\", \"selann\", \"sell\", \"sell\", \"sell\", \"sell\", \"sell\", \"sell\", \"sell\", \"sell\", \"send\", \"send\", \"send\", \"send\", \"send\", \"send\", \"send\", \"send\", \"send\", \"send\", \"sera\", \"serdar\", \"server\", \"server\", \"shafer\", \"shaft\", \"shaft\", \"shark\", \"shotgun\", \"shuttl\", \"shuttl\", \"simm\", \"sin\", \"skeptic\", \"skeptic\", \"skndiv\", \"slaughter\", \"sleev\", \"sleev\", \"sleev\", \"smith\", \"smith\", \"smith\", \"smith\", \"smith\", \"smith\", \"smith\", \"smith\", \"smuggl\", \"softwar\", \"softwar\", \"softwar\", \"softwar\", \"softwar\", \"softwar\", \"softwar\", \"softwar\", \"softwar\", \"solar\", \"solar\", \"solar\", \"soldier\", \"soldier\", \"solntz\", \"sourc\", \"sourc\", \"sourc\", \"sourc\", \"sourc\", \"sourc\", \"sourc\", \"sourc\", \"sourc\", \"space\", \"space\", \"space\", \"space\", \"space\", \"spacecraft\", \"spacecraft\", \"spec\", \"spec\", \"spec\", \"speed\", \"speed\", \"speed\", \"speed\", \"speed\", \"spencer\", \"spend\", \"spend\", \"spend\", \"spend\", \"spend\", \"spend\", \"spend\", \"spend\", \"spend\", \"spend\", \"sphere\", \"spirit\", \"spirit\", \"spirit\", \"ssto\", \"stanford\", \"stanford\", \"stanford\", \"stanford\", \"stanford\", \"stanford\", \"stanford\", \"stanford\", \"stanley\", \"stanley\", \"stanley\", \"start\", \"start\", \"start\", \"start\", \"start\", \"start\", \"start\", \"start\", \"start\", \"start\", \"starter\", \"state\", \"state\", \"state\", \"state\", \"state\", \"state\", \"state\", \"state\", \"state\", \"state\", \"station\", \"station\", \"station\", \"station\", \"station\", \"station\", \"station\", \"station\", \"sternlight\", \"steve\", \"steve\", \"steve\", \"steve\", \"steve\", \"steve\", \"steve\", \"steve\", \"steveh\", \"stimulus\", \"stratus\", \"strnlght\", \"studi\", \"studi\", \"studi\", \"studi\", \"studi\", \"studi\", \"studi\", \"studi\", \"suno\", \"superstit\", \"surveil\", \"svga\", \"swap\", \"syndrom\", \"take\", \"take\", \"take\", \"take\", \"take\", \"take\", \"take\", \"take\", \"take\", \"take\", \"tampa\", \"teach\", \"teach\", \"teach\", \"teach\", \"teach\", \"team\", \"team\", \"team\", \"team\", \"team\", \"technolog\", \"technolog\", \"technolog\", \"technolog\", \"technolog\", \"technolog\", \"technolog\", \"technolog\", \"technolog\", \"tell\", \"tell\", \"tell\", \"tell\", \"tell\", \"tell\", \"tell\", \"tell\", \"tell\", \"tell\", \"tennesse\", \"test\", \"test\", \"test\", \"test\", \"test\", \"test\", \"test\", \"test\", \"testament\", \"thank\", \"thank\", \"thank\", \"thank\", \"thank\", \"thank\", \"thank\", \"thank\", \"thank\", \"theist\", \"theodor\", \"theolog\", \"theori\", \"theori\", \"theori\", \"theori\", \"theori\", \"theori\", \"therapi\", \"thing\", \"thing\", \"thing\", \"thing\", \"thing\", \"thing\", \"thing\", \"thing\", \"thing\", \"thing\", \"thomasp\", \"tiff\", \"tiger\", \"time\", \"time\", \"time\", \"time\", \"time\", \"time\", \"time\", \"time\", \"time\", \"time\", \"tire\", \"tire\", \"tire\", \"tire\", \"tire\", \"toolkit\", \"toronto\", \"toronto\", \"toronto\", \"toronto\", \"toronto\", \"treatment\", \"treatment\", \"troop\", \"true\", \"true\", \"true\", \"true\", \"true\", \"true\", \"true\", \"true\", \"true\", \"true\", \"trunk\", \"truth\", \"truth\", \"truth\", \"truth\", \"truth\", \"turk\", \"turkey\", \"turkish\", \"ualberta\", \"uchicago\", \"uchicago\", \"uchicago\", \"ucsc\", \"uicvm\", \"uiuc\", \"uiuc\", \"uiuc\", \"uiuc\", \"uiuc\", \"uiuc\", \"uiuc\", \"uiuc\", \"umich\", \"umich\", \"umich\", \"uoknor\", \"upgrad\", \"upgrad\", \"urartu\", \"urbana\", \"urbana\", \"urbana\", \"user\", \"user\", \"user\", \"user\", \"utah\", \"utkvm\", \"uvic\", \"veal\", \"vehicl\", \"vehicl\", \"vehicl\", \"vehicl\", \"vers\", \"version\", \"version\", \"version\", \"version\", \"version\", \"version\", \"version\", \"version\", \"version\", \"vesa\", \"vesselin\", \"video\", \"video\", \"video\", \"video\", \"villag\", \"villag\", \"virginia\", \"virginia\", \"virginia\", \"virginia\", \"virginia\", \"virginia\", \"virginia\", \"visual\", \"visual\", \"volt\", \"vram\", \"waco\", \"waco\", \"wagon\", \"wagon\", \"want\", \"want\", \"want\", \"want\", \"want\", \"want\", \"want\", \"want\", \"want\", \"want\", \"water\", \"water\", \"water\", \"water\", \"water\", \"weapon\", \"weapon\", \"weapon\", \"wheel\", \"wheel\", \"widget\", \"window\", \"window\", \"window\", \"wing\", \"wing\", \"wing\", \"wing\", \"wing\", \"winnipeg\", \"winnipeg\", \"wire\", \"wire\", \"wire\", \"wiretap\", \"word\", \"word\", \"word\", \"word\", \"word\", \"word\", \"word\", \"word\", \"word\", \"word\", \"work\", \"work\", \"work\", \"work\", \"work\", \"work\", \"work\", \"work\", \"work\", \"work\", \"world\", \"world\", \"world\", \"world\", \"world\", \"world\", \"world\", \"world\", \"world\", \"world\", \"worship\", \"worship\", \"xlib\", \"xpert\", \"xterm\", \"xview\", \"yamaha\", \"yanke\", \"year\", \"year\", \"year\", \"year\", \"year\", \"year\", \"year\", \"year\", \"year\", \"year\", \"yeast\", \"zoolog\", \"zuma\"]}, \"R\": 30, \"lambda.step\": 0.01, \"plot.opts\": {\"xlab\": \"PC1\", \"ylab\": \"PC2\"}, \"topic.order\": [3, 1, 8, 9, 2, 4, 7, 10, 5, 6]};\n", + "var ldavis_el155871124265505206097197808_data = {\"mdsDat\": {\"x\": [-0.07866945427665124, -0.01699948489792914, 0.20896689238873523, 0.14744605031212607, -0.008849073212760983, -0.04505413872814077, -0.08949897686453376, 0.10780299734830809, 0.004524270451044093, -0.22966908252019716], \"y\": [-0.15170611822961017, -0.1504468301902949, 0.08013685816591506, 0.13647834612774523, -0.009046128981188077, 0.003906923765221535, 0.14472746444813225, -0.07737607739594787, -0.1051004751701791, 0.1284260374602061], \"topics\": [1, 2, 3, 4, 5, 6, 7, 8, 9, 10], \"cluster\": [1, 1, 1, 1, 1, 1, 1, 1, 1, 1], \"Freq\": [13.182523727416992, 12.927214622497559, 12.466279029846191, 11.995635986328125, 9.558399200439453, 9.468915939331055, 8.925769805908203, 7.879937648773193, 7.025284290313721, 6.570040225982666]}, \"tinfo\": {\"Category\": [\"Default\", \"Default\", \"Default\", \"Default\", \"Default\", \"Default\", \"Default\", \"Default\", \"Default\", \"Default\", \"Default\", \"Default\", \"Default\", \"Default\", \"Default\", \"Default\", \"Default\", \"Default\", \"Default\", \"Default\", \"Default\", \"Default\", \"Default\", \"Default\", \"Default\", \"Default\", \"Default\", \"Default\", \"Default\", \"Default\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\"], \"Freq\": [2966.0, 1940.0, 1924.0, 1689.0, 2638.0, 2884.0, 1860.0, 1161.0, 1997.0, 1477.0, 1274.0, 1016.0, 1577.0, 1423.0, 1059.0, 1331.0, 1142.0, 2600.0, 837.0, 1391.0, 6052.0, 742.0, 990.0, 784.0, 1802.0, 1023.0, 4004.0, 867.0, 1190.0, 747.0, 1142.055419921875, 698.05224609375, 406.822998046875, 375.2376708984375, 365.2073059082031, 324.9424743652344, 317.34478759765625, 293.7341003417969, 242.91107177734375, 242.62696838378906, 238.57559204101562, 222.68405151367188, 219.24844360351562, 497.5247802734375, 182.90701293945312, 189.09542846679688, 180.7755584716797, 167.61598205566406, 170.0655975341797, 162.4678955078125, 156.04269409179688, 152.99169921875, 147.42819213867188, 144.9635009765625, 144.00869750976562, 142.5484161376953, 140.01553344726562, 137.27061462402344, 111.63611602783203, 111.36160278320312, 296.4661560058594, 234.76409912109375, 534.499755859375, 227.33987426757812, 733.429931640625, 290.58575439453125, 1027.8203125, 194.5054931640625, 462.2497863769531, 638.7841186523438, 383.043212890625, 557.0750732421875, 270.9018249511719, 346.3732604980469, 2339.71875, 353.4012145996094, 956.245849609375, 1366.771240234375, 489.0573425292969, 1502.895751953125, 432.2204284667969, 423.6861267089844, 946.194091796875, 647.374267578125, 868.9714965820312, 843.220458984375, 679.2152099609375, 536.1279907226562, 452.23583984375, 627.34814453125, 723.7843017578125, 487.5303955078125, 627.2381591796875, 480.2864074707031, 485.9241027832031, 520.5202026367188, 439.0645751953125, 1273.9940185546875, 843.2352905273438, 687.68017578125, 378.1650390625, 599.6139526367188, 284.2032165527344, 264.94561767578125, 257.7326354980469, 233.39744567871094, 198.56727600097656, 196.57557678222656, 186.44007873535156, 185.79148864746094, 190.49740600585938, 160.6958770751953, 157.22314453125, 147.5255126953125, 143.9540557861328, 141.30377197265625, 132.96551513671875, 132.7198944091797, 136.27581787109375, 134.09678649902344, 122.40459442138672, 117.67374420166016, 110.74125671386719, 103.36602783203125, 103.82383728027344, 102.62226867675781, 191.18621826171875, 1897.701904296875, 734.26708984375, 595.4009399414062, 628.1726684570312, 206.8068084716797, 246.9746551513672, 800.2630004882812, 749.1760864257812, 336.1791687011719, 271.76513671875, 265.7337646484375, 398.0518493652344, 574.373046875, 250.1859588623047, 378.887451171875, 461.79827880859375, 1507.2969970703125, 256.8887939453125, 577.1434936523438, 989.2410888671875, 369.3199768066406, 600.9796142578125, 735.3451538085938, 547.3312377929688, 671.5762939453125, 658.3866577148438, 983.743896484375, 1571.6390380859375, 640.6453247070312, 527.5475463867188, 1109.1285400390625, 876.5189208984375, 725.872802734375, 862.2279052734375, 662.5578002929688, 745.310791015625, 665.8807373046875, 603.2730102539062, 672.1204833984375, 613.4678344726562, 579.8084716796875, 513.6640625, 478.726806640625, 261.3017272949219, 304.5247802734375, 182.1022186279297, 164.4860076904297, 158.4976806640625, 152.06784057617188, 137.89913940429688, 135.18289184570312, 117.30463409423828, 101.55142974853516, 100.56641387939453, 94.58324432373047, 94.09687042236328, 92.84982299804688, 88.5089340209961, 85.08229064941406, 77.89446258544922, 76.2107925415039, 74.78726196289062, 76.93608856201172, 66.28611755371094, 65.85179901123047, 62.60702896118164, 61.64711380004883, 56.684181213378906, 56.66085433959961, 56.48657989501953, 56.25629425048828, 433.47705078125, 57.65424346923828, 175.3953399658203, 811.90380859375, 352.3983459472656, 460.9333190917969, 1244.6767578125, 397.8313903808594, 319.14727783203125, 364.238525390625, 817.3678588867188, 179.156005859375, 759.4703979492188, 353.9140319824219, 768.052490234375, 704.2166748046875, 1031.30419921875, 338.80908203125, 853.342041015625, 1558.97509765625, 1291.6134033203125, 922.5968627929688, 1345.8406982421875, 471.89697265625, 490.1734313964844, 677.6243896484375, 1059.35986328125, 853.4227294921875, 843.9307861328125, 1006.844482421875, 803.6572265625, 784.7794799804688, 584.8036499023438, 572.954345703125, 507.81884765625, 935.0308227539062, 496.60784912109375, 583.3577880859375, 624.0257568359375, 588.1732788085938, 615.0451049804688, 528.2354736328125, 511.3616638183594, 511.8392028808594, 866.5529174804688, 316.7214050292969, 249.29296875, 229.89987182617188, 228.7329864501953, 211.54818725585938, 183.02696228027344, 166.189453125, 164.78927612304688, 155.5567626953125, 157.8963623046875, 359.6830749511719, 133.46484375, 124.17033386230469, 122.31136322021484, 117.03580474853516, 111.2578125, 110.83413696289062, 109.16254425048828, 103.20903778076172, 98.91317749023438, 514.7620239257812, 89.62692260742188, 82.74740600585938, 81.7151107788086, 103.24954986572266, 75.25740814208984, 75.21385955810547, 70.78356170654297, 69.34468078613281, 281.7769775390625, 311.1161804199219, 971.2522583007812, 208.0157012939453, 697.12548828125, 367.600830078125, 1416.2847900390625, 441.63238525390625, 604.5270385742188, 578.8829345703125, 377.5157165527344, 192.00230407714844, 648.326171875, 1969.8695068359375, 938.555908203125, 446.4116516113281, 632.3428955078125, 658.61083984375, 1989.8314208984375, 746.812744140625, 677.7919311523438, 282.146728515625, 467.3158264160156, 480.80426025390625, 1419.9505615234375, 633.121826171875, 1121.5931396484375, 955.2892456054688, 821.8540649414062, 1269.9755859375, 524.888427734375, 1015.9006958007812, 611.8128662109375, 745.4096069335938, 688.5107421875, 667.1905517578125, 692.5095825195312, 593.0684814453125, 527.0250244140625, 546.2423095703125, 266.114990234375, 171.07672119140625, 155.59559631347656, 226.86813354492188, 131.54354858398438, 110.63026428222656, 109.70304107666016, 476.1914367675781, 123.78545379638672, 96.52113342285156, 90.68626403808594, 86.90491485595703, 84.74632263183594, 84.66790008544922, 83.12593078613281, 249.02166748046875, 73.43721008300781, 70.66108703613281, 70.30034637451172, 68.83010864257812, 66.70625305175781, 65.87735748291016, 60.60390853881836, 60.28896713256836, 59.591712951660156, 59.43132019042969, 59.13471603393555, 58.30850601196289, 57.81100082397461, 57.412742614746094, 405.0126037597656, 341.4114074707031, 190.88427734375, 246.2154541015625, 163.5002899169922, 257.431884765625, 138.4030303955078, 165.07150268554688, 520.9752197265625, 1046.2001953125, 1400.7467041015625, 228.14353942871094, 286.6177673339844, 343.2210388183594, 185.7271728515625, 229.62884521484375, 175.0425262451172, 332.4382019042969, 163.80191040039062, 539.6254272460938, 256.20074462890625, 439.7074890136719, 517.5069580078125, 403.4648742675781, 229.6062774658203, 866.2342529296875, 846.6046142578125, 313.1013488769531, 322.7994079589844, 286.8825988769531, 653.3096923828125, 749.8143310546875, 426.5758361816406, 379.9896240234375, 366.7738037109375, 372.0238037109375, 408.4358825683594, 415.59478759765625, 394.1047668457031, 394.35479736328125, 349.4744567871094, 362.33544921875, 340.7461853027344, 296.1064453125, 297.4900817871094, 494.6859130859375, 745.9567260742188, 324.6907043457031, 301.4524230957031, 243.7508087158203, 158.0762481689453, 107.37081909179688, 95.01962280273438, 99.3011474609375, 90.9953842163086, 88.63602447509766, 79.32609558105469, 77.81234741210938, 76.28094482421875, 74.5477523803711, 68.68788146972656, 66.95661163330078, 65.4609603881836, 64.79485321044922, 62.89779281616211, 62.08255386352539, 61.0522575378418, 61.06364059448242, 58.69823455810547, 57.730560302734375, 57.52555847167969, 57.3940315246582, 53.519378662109375, 53.08652114868164, 81.0350341796875, 466.36419677734375, 629.7886352539062, 272.4364318847656, 229.78268432617188, 524.4359130859375, 169.08595275878906, 106.43968963623047, 468.24310302734375, 321.1138000488281, 72.86544799804688, 215.64964294433594, 420.10101318359375, 254.942626953125, 238.94778442382812, 170.3827667236328, 161.82569885253906, 350.83050537109375, 510.26483154296875, 280.41705322265625, 480.01007080078125, 199.6502227783203, 294.41473388671875, 258.04718017578125, 376.5404357910156, 509.953857421875, 1114.255615234375, 256.1049499511719, 426.6167297363281, 319.6080017089844, 739.0460815429688, 280.2945861816406, 489.26593017578125, 542.7006225585938, 517.6249389648438, 617.398193359375, 513.2488403320312, 436.5852355957031, 491.0060729980469, 506.6981201171875, 460.2760925292969, 441.2689514160156, 394.2432861328125, 351.3202209472656, 347.7408447265625, 353.126953125, 336.9276428222656, 274.96478271484375, 206.24520874023438, 205.8778839111328, 185.45875549316406, 142.32308959960938, 138.44577026367188, 125.2013931274414, 124.9319839477539, 113.29893493652344, 111.32070922851562, 109.3732681274414, 105.69730377197266, 106.31715393066406, 292.8519592285156, 101.5099105834961, 98.15204620361328, 98.07687377929688, 96.68441009521484, 95.22706604003906, 93.90098571777344, 90.92635345458984, 90.10281372070312, 204.0241241455078, 83.50175476074219, 83.1670913696289, 82.08647155761719, 80.05599975585938, 80.02828979492188, 78.9681167602539, 77.46800231933594, 624.7637329101562, 218.5225372314453, 299.7414245605469, 218.29824829101562, 189.66014099121094, 356.5953674316406, 202.443603515625, 416.9382019042969, 238.60166931152344, 212.23965454101562, 149.82025146484375, 211.91717529296875, 303.8674621582031, 120.30265808105469, 237.61758422851562, 454.83984375, 333.9742431640625, 980.4507446289062, 485.376220703125, 911.305419921875, 590.20458984375, 261.1830139160156, 253.10174560546875, 366.5967712402344, 366.9039306640625, 261.41119384765625, 595.3799438476562, 533.9219970703125, 533.9361572265625, 583.4500732421875, 307.1800842285156, 439.3072814941406, 370.0991516113281, 337.719970703125, 344.1241149902344, 325.0099182128906, 340.11822509765625, 337.7254638671875, 350.0095520019531, 294.60064697265625, 276.2853698730469, 278.6145324707031, 1160.58984375, 424.50238037109375, 361.8892517089844, 388.7125244140625, 255.1268768310547, 223.3338623046875, 186.762939453125, 150.89361572265625, 148.3457489013672, 142.3264923095703, 778.56103515625, 125.92803955078125, 122.35221099853516, 113.48704528808594, 110.97245025634766, 117.078857421875, 97.76728820800781, 95.12934875488281, 153.9966278076172, 85.8322525024414, 85.79349517822266, 83.88031005859375, 83.049072265625, 81.00745391845703, 86.68553161621094, 72.2030258178711, 70.9286117553711, 66.03843688964844, 65.31908416748047, 61.585960388183594, 631.8247680664062, 967.0392456054688, 392.36920166015625, 86.89588165283203, 116.68437957763672, 384.3710632324219, 954.7767944335938, 325.4287414550781, 153.96957397460938, 168.00067138671875, 885.979736328125, 877.2123413085938, 327.0912780761719, 468.21343994140625, 329.3387451171875, 302.2326965332031, 346.50006103515625, 350.1670227050781, 277.64501953125, 424.3413391113281, 266.8286437988281, 331.93865966796875, 578.1422729492188, 328.27899169921875, 429.783447265625, 517.3900756835938, 400.8196716308594, 346.1986083984375, 433.2355041503906, 421.3186950683594, 338.8460693359375, 347.48797607421875, 348.34832763671875, 336.5150451660156, 398.3799743652344, 299.8478088378906, 164.65841674804688, 151.2684783935547, 134.80027770996094, 134.81512451171875, 128.8002166748047, 120.19515991210938, 119.80908966064453, 103.69074249267578, 93.05683135986328, 105.7276840209961, 91.12390899658203, 88.88589477539062, 86.48591613769531, 83.19534301757812, 82.55879974365234, 76.6402587890625, 73.9295425415039, 137.460205078125, 73.58722686767578, 73.4345474243164, 297.82000732421875, 71.52425384521484, 71.52425384521484, 71.37834930419922, 68.60929870605469, 70.64924621582031, 67.04999542236328, 64.62285614013672, 137.5844268798828, 329.9851989746094, 498.69488525390625, 418.2344665527344, 321.6512145996094, 192.27369689941406, 436.75238037109375, 120.4453125, 101.72257995605469, 189.66383361816406, 107.88653564453125, 180.29656982421875, 406.5184020996094, 219.2642059326172, 311.06512451171875, 276.8393859863281, 364.6037902832031, 122.6226577758789, 431.5712890625, 148.89491271972656, 478.09197998046875, 448.48828125, 560.1773681640625, 235.3953399658203, 220.0911102294922, 236.9821014404297, 525.9251708984375, 310.51556396484375, 195.2233428955078, 465.06982421875, 342.7114562988281, 343.9149475097656, 252.50462341308594, 252.32774353027344, 359.384033203125, 365.0752868652344, 297.08123779296875, 278.8789978027344, 264.2633056640625, 271.80364990234375, 267.00006103515625, 258.7322692871094, 836.8089599609375, 741.7046508789062, 348.0799560546875, 262.6398620605469, 234.7030792236328, 225.68736267089844, 214.62384033203125, 197.19635009765625, 176.1823272705078, 163.71646118164062, 159.67762756347656, 156.5457305908203, 155.54039001464844, 147.15855407714844, 143.77687072753906, 151.9088592529297, 140.539794921875, 133.0351104736328, 131.78204345703125, 122.36679077148438, 118.65074920654297, 115.62535095214844, 112.39591979980469, 112.21659088134766, 111.78970336914062, 119.10252380371094, 102.06414031982422, 93.4384765625, 92.23306274414062, 89.7177963256836, 218.4290313720703, 151.79112243652344, 955.3695678710938, 178.93502807617188, 1384.0147705078125, 160.96975708007812, 191.55270385742188, 221.74310302734375, 157.2467803955078, 1290.6207275390625, 920.702392578125, 312.78350830078125, 623.0559692382812, 397.7104187011719, 455.4053039550781, 379.91558837890625, 351.7355041503906, 356.9503479003906, 374.8177490234375, 212.80392456054688, 346.6185607910156, 312.7834777832031, 333.1203918457031, 336.03326416015625, 600.264892578125, 295.4298400878906, 283.64044189453125, 250.129150390625, 267.2162780761719, 330.6562194824219, 357.99395751953125, 262.14569091796875, 242.08404541015625], \"Term\": [\"window\", \"game\", \"christian\", \"team\", \"drive\", \"file\", \"space\", \"encrypt\", \"govern\", \"chip\", \"jesus\", \"israel\", \"card\", \"play\", \"secur\", \"nasa\", \"armenian\", \"program\", \"isra\", \"imag\", \"peopl\", \"hockey\", \"player\", \"clipper\", \"public\", \"disk\", \"year\", \"scsi\", \"driver\", \"bike\", \"armenian\", \"turkish\", \"turk\", \"turkey\", \"armenia\", \"koresh\", \"nazi\", \"militia\", \"serdar\", \"argic\", \"genocid\", \"davidian\", \"troop\", \"murder\", \"mormon\", \"prison\", \"massacr\", \"azeri\", \"ethnic\", \"azerbaijani\", \"hitler\", \"iran\", \"zuma\", \"sdpa\", \"motto\", \"azerbaijan\", \"extermin\", \"sera\", \"urartu\", \"slaughter\", \"villag\", \"batf\", \"greek\", \"greec\", \"jew\", \"soldier\", \"kill\", \"waco\", \"arm\", \"countri\", \"muslim\", \"children\", \"armi\", \"popul\", \"peopl\", \"anti\", \"govern\", \"right\", \"attack\", \"say\", \"polit\", \"death\", \"state\", \"live\", \"go\", \"come\", \"tell\", \"happen\", \"forc\", \"world\", \"time\", \"nation\", \"want\", \"leav\", \"start\", \"year\", \"take\", \"jesus\", \"bibl\", \"atheist\", \"atheism\", \"christ\", \"scriptur\", \"cathol\", \"sandvik\", \"doctrin\", \"revel\", \"biblic\", \"satan\", \"atho\", \"livesey\", \"prophet\", \"divin\", \"vers\", \"gospel\", \"sabbath\", \"god\", \"sin\", \"resurrect\", \"solntz\", \"testament\", \"theolog\", \"propheci\", \"theist\", \"schneider\", \"jaeger\", \"marriag\", \"christian\", \"church\", \"belief\", \"faith\", \"worship\", \"contradict\", \"moral\", \"religion\", \"lord\", \"heaven\", \"holi\", \"rutger\", \"truth\", \"spirit\", \"teach\", \"islam\", \"believ\", \"etern\", \"argument\", \"exist\", \"religi\", \"evid\", \"word\", \"love\", \"life\", \"claim\", \"mean\", \"peopl\", \"true\", \"accept\", \"say\", \"question\", \"reason\", \"thing\", \"person\", \"come\", \"good\", \"read\", \"time\", \"point\", \"follow\", \"motif\", \"widget\", \"xterm\", \"visual\", \"xlib\", \"polygon\", \"baalk\", \"contrib\", \"toolkit\", \"kelvin\", \"pyron\", \"suno\", \"deskjet\", \"xpert\", \"plaintext\", \"skndiv\", \"openwindow\", \"xview\", \"ether\", \"quicktim\", \"magellan\", \"utah\", \"greenbelt\", \"reilli\", \"ualberta\", \"copper\", \"ciphertext\", \"autom\", \"gradi\", \"dillon\", \"font\", \"handbook\", \"binari\", \"server\", \"client\", \"librari\", \"imag\", \"anonym\", \"compil\", \"resourc\", \"graphic\", \"map\", \"applic\", \"archiv\", \"user\", \"code\", \"avail\", \"directori\", \"sourc\", \"file\", \"mail\", \"list\", \"program\", \"function\", \"format\", \"email\", \"inform\", \"version\", \"softwar\", \"includ\", \"send\", \"data\", \"internet\", \"address\", \"display\", \"window\", \"copi\", \"access\", \"distribut\", \"thank\", \"look\", \"book\", \"group\", \"need\", \"scsi\", \"simm\", \"motherboard\", \"cach\", \"bio\", \"quadra\", \"diamond\", \"vram\", \"vesa\", \"centri\", \"swap\", \"upgrad\", \"char\", \"eisa\", \"intercon\", \"nubus\", \"ethernet\", \"svga\", \"amanda\", \"meg\", \"cadr\", \"mous\", \"maxtor\", \"config\", \"cica\", \"tiff\", \"adaptec\", \"powerbook\", \"ctrl\", \"esdi\", \"jumper\", \"floppi\", \"disk\", \"umich\", \"video\", \"modem\", \"card\", \"output\", \"monitor\", \"mode\", \"printer\", \"spec\", \"entri\", \"drive\", \"driver\", \"port\", \"instal\", \"memori\", \"window\", \"color\", \"appl\", \"byte\", \"screen\", \"board\", \"problem\", \"machin\", \"file\", \"thank\", \"control\", \"work\", \"speed\", \"need\", \"hard\", \"help\", \"program\", \"want\", \"time\", \"repli\", \"softwar\", \"distribut\", \"alaska\", \"spencer\", \"oracl\", \"dseg\", \"aurora\", \"nsmca\", \"engr\", \"launch\", \"uoknor\", \"callison\", \"kaldi\", \"zoolog\", \"mccall\", \"ucsc\", \"hallam\", \"lunar\", \"automot\", \"raider\", \"theodor\", \"dock\", \"shafer\", \"mksol\", \"hydro\", \"ssto\", \"plymouth\", \"redesign\", \"laughter\", \"rockwel\", \"desi\", \"stimulus\", \"moon\", \"henri\", \"mar\", \"job\", \"wheel\", \"billion\", \"invest\", \"spacecraft\", \"orbit\", \"nasa\", \"space\", \"shuttl\", \"satellit\", \"fund\", \"probe\", \"flight\", \"helmet\", \"station\", \"solar\", \"presid\", \"mission\", \"earth\", \"cost\", \"money\", \"vehicl\", \"year\", \"work\", \"project\", \"toronto\", \"spend\", \"go\", \"time\", \"engin\", \"long\", \"high\", \"power\", \"thing\", \"say\", \"look\", \"peopl\", \"program\", \"want\", \"need\", \"design\", \"build\", \"firearm\", \"bike\", \"motorcycl\", \"magnus\", \"rider\", \"honda\", \"veal\", \"utkvm\", \"centerlin\", \"cactus\", \"rkba\", \"harley\", \"shotgun\", \"pistol\", \"ranck\", \"boyl\", \"husc\", \"ifa\", \"smuggl\", \"fischer\", \"counterst\", \"armori\", \"trunk\", \"thomasp\", \"imak\", \"photographi\", \"concordia\", \"tennesse\", \"yamaha\", \"frost\", \"car\", \"ohio\", \"uchicago\", \"rid\", \"gun\", \"brake\", \"shaft\", \"cwru\", \"auto\", \"wagon\", \"handgun\", \"cleveland\", \"ride\", \"tire\", \"urbana\", \"midway\", \"insur\", \"uiuc\", \"dealer\", \"weapon\", \"iastat\", \"owner\", \"illinoi\", \"crime\", \"price\", \"state\", \"freenet\", \"sell\", \"buy\", \"good\", \"road\", \"drive\", \"right\", \"look\", \"peopl\", \"want\", \"case\", \"thing\", \"time\", \"go\", \"distribut\", \"repli\", \"engin\", \"opinion\", \"problem\", \"need\", \"gatech\", \"cub\", \"fnal\", \"prism\", \"hitter\", \"pitcher\", \"alomar\", \"uicvm\", \"higgin\", \"inning\", \"revolv\", \"hulman\", \"yanke\", \"pitch\", \"catcher\", \"dodger\", \"blast\", \"starter\", \"tiger\", \"met\", \"bat\", \"nore\", \"outlet\", \"rocki\", \"jay\", \"sdsu\", \"volt\", \"lopez\", \"restaur\", \"lamp\", \"wire\", \"duke\", \"circuit\", \"batteri\", \"brave\", \"basebal\", \"hit\", \"berkeley\", \"jason\", \"ball\", \"metal\", \"jeff\", \"grind\", \"larc\", \"indiana\", \"netcom\", \"colorado\", \"year\", \"run\", \"good\", \"game\", \"smith\", \"scott\", \"player\", \"home\", \"stanford\", \"look\", \"distribut\", \"go\", \"time\", \"lose\", \"come\", \"start\", \"play\", \"david\", \"best\", \"better\", \"power\", \"thing\", \"john\", \"sale\", \"great\", \"encrypt\", \"escrow\", \"privaci\", \"ripem\", \"crypto\", \"wiretap\", \"cryptographi\", \"cipher\", \"decrypt\", \"hamburg\", \"clipper\", \"homicid\", \"bontchev\", \"gtoal\", \"crypt\", \"clarkson\", \"rwing\", \"surveil\", \"nist\", \"sternlight\", \"den\", \"ncsl\", \"qualcomm\", \"fbihh\", \"cryptograph\", \"tampa\", \"mime\", \"vesselin\", \"lyme\", \"strnlght\", \"key\", \"secur\", \"enforc\", \"recipi\", \"classifi\", \"secret\", \"chip\", \"agenc\", \"patent\", \"scheme\", \"public\", \"govern\", \"algorithm\", \"protect\", \"propos\", \"administr\", \"privat\", \"clinton\", \"feder\", \"phone\", \"court\", \"devic\", \"number\", \"communic\", \"technolog\", \"inform\", \"provid\", \"author\", \"state\", \"right\", \"messag\", \"data\", \"peopl\", \"need\", \"diseas\", \"stratus\", \"dyer\", \"diet\", \"robi\", \"infect\", \"syndrom\", \"methodolog\", \"physician\", \"cure\", \"intellect\", \"einstein\", \"chopin\", \"candida\", \"sphere\", \"yeast\", \"chastiti\", \"halat\", \"therapi\", \"clinic\", \"migrain\", \"steveh\", \"patient\", \"catbyt\", \"dtmedin\", \"blah\", \"carlo\", \"superstit\", \"baerga\", \"homeopathi\", \"skeptic\", \"gordon\", \"pitt\", \"medic\", \"doctor\", \"medicin\", \"food\", \"cancer\", \"sleev\", \"ingr\", \"genet\", \"aid\", \"bank\", \"treatment\", \"water\", \"pain\", \"health\", \"handheld\", \"studi\", \"princeton\", \"caus\", \"effect\", \"scienc\", \"scientif\", \"rochest\", \"theori\", \"point\", \"result\", \"risk\", \"problem\", \"research\", \"case\", \"steve\", \"test\", \"time\", \"peopl\", \"repli\", \"take\", \"differ\", \"year\", \"say\", \"thing\", \"isra\", \"hockey\", \"playoff\", \"palestinian\", \"detroit\", \"leaf\", \"cramer\", \"optilink\", \"pen\", \"cunixb\", \"lebanes\", \"penguin\", \"clayton\", \"jake\", \"maynard\", \"espn\", \"edmonton\", \"ericsson\", \"boni\", \"lemieux\", \"gaza\", \"puck\", \"bruin\", \"selann\", \"laurentian\", \"quebec\", \"ramsey\", \"canuck\", \"shark\", \"uvic\", \"montreal\", \"flyer\", \"israel\", \"stanley\", \"team\", \"jet\", \"coach\", \"ranger\", \"winnipeg\", \"game\", \"play\", \"wing\", \"player\", \"columbia\", \"season\", \"leagu\", \"pittsburgh\", \"score\", \"arab\", \"mcgill\", \"goal\", \"virginia\", \"toronto\", \"andrew\", \"year\", \"divis\", \"canada\", \"period\", \"final\", \"point\", \"time\", \"american\", \"go\"], \"Total\": [2966.0, 1940.0, 1924.0, 1689.0, 2638.0, 2884.0, 1860.0, 1161.0, 1997.0, 1477.0, 1274.0, 1016.0, 1577.0, 1423.0, 1059.0, 1331.0, 1142.0, 2600.0, 837.0, 1391.0, 6052.0, 742.0, 990.0, 784.0, 1802.0, 1023.0, 4004.0, 867.0, 1190.0, 747.0, 1142.9603271484375, 698.9571533203125, 407.72796630859375, 376.14263916015625, 366.1121826171875, 325.8475036621094, 318.2566833496094, 294.63909912109375, 243.81597900390625, 243.5318603515625, 239.48057556152344, 223.58897399902344, 220.15792846679688, 499.8524475097656, 183.81210327148438, 190.03155517578125, 181.68051147460938, 168.5208740234375, 170.9889373779297, 163.37278747558594, 156.9476776123047, 153.92372131347656, 148.3330841064453, 145.86839294433594, 144.91375732421875, 143.45330810546875, 140.92047119140625, 138.17550659179688, 112.54103088378906, 112.26655578613281, 299.73785400390625, 239.29342651367188, 575.2807006835938, 235.9646759033203, 846.909912109375, 310.8516845703125, 1292.495849609375, 203.65487670898438, 568.3539428710938, 904.9415283203125, 498.3475341796875, 821.7435302734375, 317.73541259765625, 442.4269714355469, 6052.7568359375, 470.1634521484375, 1997.4742431640625, 3614.554931640625, 771.30322265625, 4395.65673828125, 753.386474609375, 729.10546875, 3489.9912109375, 1666.2821044921875, 3510.59228515625, 3362.487060546875, 2458.833984375, 1374.8499755859375, 910.4705200195312, 2752.347412109375, 5183.0615234375, 1404.285400390625, 3617.8623046875, 1561.919189453125, 1909.090576171875, 4004.499755859375, 1884.099853515625, 1274.90771484375, 844.1483154296875, 688.5940551757812, 379.07818603515625, 601.140869140625, 285.1163330078125, 265.8630065917969, 258.6456298828125, 234.31048583984375, 199.48165893554688, 197.49954223632812, 187.35317993164062, 186.70449829101562, 191.50320434570312, 161.609130859375, 158.14089965820312, 148.43858337402344, 144.8671112060547, 142.21681213378906, 133.87864685058594, 133.63296508789062, 137.22470092773438, 135.08001708984375, 123.31761169433594, 118.5867691040039, 111.65430450439453, 104.27904510498047, 104.7589340209961, 103.54805755615234, 192.99319458007812, 1924.420654296875, 744.669677734375, 604.4502563476562, 642.6378784179688, 209.51373291015625, 250.72772216796875, 845.7623291015625, 828.4779663085938, 355.576416015625, 287.8231201171875, 282.98614501953125, 442.1787109375, 692.9871826171875, 269.98553466796875, 446.0935363769531, 578.8563842773438, 2561.801513671875, 282.8560791015625, 815.1890258789062, 1700.040283203125, 474.37847900390625, 965.2655029296875, 1333.167236328125, 902.1780395507812, 1251.5302734375, 1317.348876953125, 2641.8525390625, 6052.7568359375, 1353.2353515625, 1007.024658203125, 4395.65673828125, 2872.251953125, 1977.931884765625, 3329.194091796875, 2056.011474609375, 3362.487060546875, 3754.324462890625, 2277.275146484375, 5183.0615234375, 2646.844970703125, 1892.52294921875, 514.570068359375, 479.6328430175781, 262.20831298828125, 305.9157409667969, 183.0161590576172, 165.39915466308594, 159.4037322998047, 152.9738311767578, 138.80514526367188, 136.08897399902344, 118.21088409423828, 102.45747375488281, 101.47250366210938, 95.48925018310547, 95.00318145751953, 93.7560806274414, 89.41605377197266, 85.98832702636719, 78.80107879638672, 77.11690521240234, 75.69332885742188, 77.96991729736328, 67.19242095947266, 66.7578353881836, 63.51332092285156, 62.5534782409668, 57.590476989746094, 57.5670166015625, 57.39277648925781, 57.16252136230469, 448.58203125, 58.587608337402344, 180.90525817871094, 872.5556030273438, 374.153564453125, 496.06207275390625, 1391.7647705078125, 441.0435791015625, 358.5755615234375, 426.2104797363281, 1054.81982421875, 199.63804626464844, 1032.6685791015625, 440.0850830078125, 1078.519775390625, 1021.2532958984375, 1669.5401611328125, 441.5390930175781, 1374.777099609375, 2884.2314453125, 2375.46533203125, 1561.0626220703125, 2600.132568359375, 691.9703369140625, 736.288330078125, 1159.4346923828125, 2169.3818359375, 1621.36328125, 1630.9560546875, 2103.51220703125, 1606.3494873046875, 1651.1046142578125, 1085.9647216796875, 1067.6014404296875, 839.2589721679688, 2966.799072265625, 872.6826171875, 1443.4285888671875, 3038.840576171875, 2288.573486328125, 3375.089111328125, 1421.2718505859375, 1956.87451171875, 3517.12158203125, 867.4650268554688, 317.6335754394531, 250.2051239013672, 230.8120574951172, 229.64512634277344, 212.46034240722656, 183.939208984375, 167.10159301757812, 165.70152282714844, 156.46893310546875, 158.83473205566406, 362.0701904296875, 134.3770294189453, 125.0824966430664, 123.22360229492188, 117.9479751586914, 112.16997528076172, 111.74629974365234, 110.07479858398438, 104.12123107910156, 99.82710266113281, 519.783203125, 90.53907775878906, 83.65958404541016, 82.6272964477539, 104.46712493896484, 76.1695556640625, 76.12603759765625, 71.69577026367188, 70.25682830810547, 287.1305236816406, 317.72869873046875, 1023.153564453125, 213.97622680664062, 736.9422607421875, 385.1871643066406, 1577.8626708984375, 487.7118835449219, 681.5184326171875, 651.6133422851562, 414.8677673339844, 202.35369873046875, 773.6500854492188, 2638.11669921875, 1190.9949951171875, 521.5310668945312, 771.9429321289062, 825.655517578125, 2966.799072265625, 979.7059936523438, 877.653076171875, 316.51055908203125, 603.9048461914062, 656.5213012695312, 3254.53125, 1051.2015380859375, 2884.2314453125, 2288.573486328125, 1818.9423828125, 3998.25146484375, 901.1630249023438, 3517.12158203125, 1391.7637939453125, 2348.668212890625, 2600.132568359375, 3617.8623046875, 5183.0615234375, 2732.23828125, 1630.9560546875, 3038.840576171875, 267.0257263183594, 171.98744201660156, 156.5063934326172, 228.2922821044922, 132.4541778564453, 111.54090118408203, 110.61382293701172, 480.2140197753906, 124.9337158203125, 97.43182373046875, 91.59697723388672, 87.81555938720703, 85.65699768066406, 85.5787124633789, 84.03668212890625, 251.917236328125, 74.3480224609375, 71.57240295410156, 71.21118927001953, 69.74082946777344, 67.61688995361328, 66.78809356689453, 61.514625549316406, 61.19959259033203, 60.50275421142578, 60.342044830322266, 60.04544448852539, 59.2192268371582, 58.72171401977539, 58.32341003417969, 415.9680480957031, 351.16400146484375, 197.7269287109375, 259.1622314453125, 170.86904907226562, 275.1458435058594, 144.30697631835938, 174.9811248779297, 592.9119262695312, 1331.5164794921875, 1860.7562255859375, 257.585205078125, 337.95697021484375, 441.28607177734375, 216.21592712402344, 284.10626220703125, 205.7402801513672, 455.25067138671875, 191.21556091308594, 873.9714965820312, 344.7267761230469, 726.9257202148438, 1014.5090942382812, 862.4901733398438, 336.9737243652344, 4004.499755859375, 3998.25146484375, 641.9896850585938, 701.0418090820312, 556.9617919921875, 3510.59228515625, 5183.0615234375, 1432.9788818359375, 1579.3616943359375, 1517.9344482421875, 1785.4522705078125, 3329.194091796875, 4395.65673828125, 3375.089111328125, 6052.7568359375, 2600.132568359375, 3617.8623046875, 3517.12158203125, 1000.6307983398438, 1483.9180908203125, 495.768310546875, 747.65087890625, 325.66717529296875, 302.36370849609375, 244.9949493408203, 158.98828125, 108.28207397460938, 95.93086242675781, 100.28355407714844, 91.90662384033203, 89.54743957519531, 80.23743438720703, 78.72370910644531, 77.19242095947266, 75.45897674560547, 69.59910583496094, 67.86799621582031, 66.37223052978516, 65.70891571044922, 63.809295654296875, 62.9937858581543, 61.963539123535156, 61.97830581665039, 59.60945129394531, 58.642459869384766, 58.43714141845703, 58.30545425415039, 54.43068313598633, 53.99776840209961, 82.42749786376953, 485.30303955078125, 668.4765625, 284.99322509765625, 240.6736602783203, 577.3501586914062, 179.90444946289062, 111.21510314941406, 528.9468383789062, 357.52178955078125, 74.67184448242188, 242.34613037109375, 502.913818359375, 297.42877197265625, 281.2137145996094, 192.33717346191406, 183.0419158935547, 466.63409423828125, 750.7517700195312, 366.50677490234375, 724.8965454101562, 250.31179809570312, 415.8218994140625, 353.0378723144531, 657.658203125, 1070.60205078125, 3489.9912109375, 395.5966796875, 983.7339477539062, 606.9436645507812, 3754.324462890625, 598.3063354492188, 2638.11669921875, 3614.554931640625, 3375.089111328125, 6052.7568359375, 3617.8623046875, 2113.190673828125, 3329.194091796875, 5183.0615234375, 3510.59228515625, 3038.840576171875, 2732.23828125, 1432.9788818359375, 1407.8818359375, 3254.53125, 3517.12158203125, 275.8772277832031, 207.15757751464844, 206.79428100585938, 186.37115478515625, 143.23545837402344, 139.3581085205078, 126.11384582519531, 125.84441375732422, 114.21138000488281, 112.2330322265625, 110.28572082519531, 106.60977935791016, 107.26533508300781, 295.4808044433594, 102.42223358154297, 99.06439971923828, 98.99042510986328, 97.59706115722656, 96.1397705078125, 94.81333923339844, 91.83870697021484, 91.01528930664062, 206.15138244628906, 84.41759490966797, 84.07954406738281, 82.9988784790039, 80.96837615966797, 80.94064331054688, 79.88065338134766, 78.38043975830078, 639.179443359375, 227.34768676757812, 322.9873046875, 231.69212341308594, 201.00955200195312, 428.8465270996094, 227.2183380126953, 525.5809326171875, 277.0488586425781, 257.5307312011719, 175.57052612304688, 283.98089599609375, 476.7163391113281, 133.4186248779297, 365.1439514160156, 1031.6707763671875, 640.4948120117188, 4004.499755859375, 1280.0391845703125, 3754.324462890625, 1940.480712890625, 488.2629089355469, 472.26141357421875, 990.4652099609375, 1023.2092895507812, 516.3364868164062, 3375.089111328125, 3038.840576171875, 3510.59228515625, 5183.0615234375, 818.473876953125, 3362.487060546875, 1909.090576171875, 1423.8079833984375, 1658.5771484375, 1346.3623046875, 1717.4796142578125, 1785.4522705078125, 3329.194091796875, 1491.164794921875, 990.2597045898438, 1542.3536376953125, 1161.5042724609375, 425.4167175292969, 362.8162841796875, 389.96905517578125, 256.041259765625, 224.2482147216797, 187.67849731445312, 151.80862426757812, 149.26010131835938, 143.24093627929688, 784.146484375, 126.84251403808594, 123.26657104492188, 114.4028549194336, 111.90643310546875, 118.11632537841797, 98.68305969238281, 96.04377746582031, 155.5158233642578, 86.74695587158203, 86.70785522460938, 84.794677734375, 83.96345520019531, 81.92181396484375, 87.67940521240234, 73.11810302734375, 71.84503173828125, 66.95278930664062, 66.233642578125, 62.500492095947266, 659.0625, 1059.32958984375, 429.3060607910156, 89.6495590209961, 124.40624237060547, 474.05853271484375, 1477.181640625, 430.5038757324219, 178.8761749267578, 204.31564331054688, 1802.0166015625, 1997.4742431640625, 534.6437377929688, 906.0315551757812, 555.987060546875, 491.40655517578125, 613.587890625, 662.8741455078125, 470.1554870605469, 1022.0458984375, 480.70269775390625, 730.8065795898438, 2365.439208984375, 762.9767456054688, 1372.4049072265625, 2169.3818359375, 1377.2789306640625, 1170.3707275390625, 3489.9912109375, 3614.554931640625, 1280.42724609375, 1651.1046142578125, 6052.7568359375, 3517.12158203125, 399.3059997558594, 300.7602844238281, 165.5708770751953, 152.18165588378906, 135.7127227783203, 135.72866821289062, 129.7154541015625, 121.10759735107422, 120.72209930419922, 104.60343933105469, 93.96927642822266, 106.78413391113281, 92.03643035888672, 89.79829406738281, 87.39839935302734, 84.10774230957031, 83.47124481201172, 77.5677490234375, 74.84196472167969, 139.1590118408203, 74.50009155273438, 74.3469467163086, 301.6020812988281, 72.43663787841797, 72.43663787841797, 72.29076385498047, 69.52177429199219, 71.59939575195312, 67.96253204345703, 65.53521728515625, 140.3209686279297, 354.6353759765625, 560.2382202148438, 467.1678161621094, 372.5237731933594, 214.25985717773438, 528.3170776367188, 128.8201446533203, 106.81678009033203, 215.3099365234375, 114.3545913696289, 206.84561157226562, 542.5616455078125, 263.9644470214844, 416.1438293457031, 361.6253356933594, 544.79638671875, 136.72360229492188, 864.7274780273438, 185.29769897460938, 1192.119873046875, 1098.304931640625, 1600.333984375, 408.9844970703125, 366.5314025878906, 446.05267333984375, 2646.844970703125, 941.7982788085938, 342.3374938964844, 3254.53125, 1469.8099365234375, 2113.190673828125, 866.398681640625, 975.55322265625, 5183.0615234375, 6052.7568359375, 2732.23828125, 1884.099853515625, 2258.33203125, 4004.499755859375, 4395.65673828125, 3329.194091796875, 837.7212524414062, 742.6168823242188, 348.9921569824219, 263.5521240234375, 235.61534118652344, 226.59957885742188, 215.53610229492188, 198.10865783691406, 177.09458923339844, 164.6287078857422, 160.58985900878906, 157.4580078125, 156.47132873535156, 148.0709228515625, 144.6891632080078, 152.87937927246094, 141.45484924316406, 133.94744873046875, 132.694580078125, 123.27899932861328, 119.56299591064453, 116.5375747680664, 113.3081283569336, 113.12879943847656, 112.70191955566406, 120.08545684814453, 102.97634887695312, 94.35086822509766, 93.14530181884766, 90.63005065917969, 220.85797119140625, 153.72544860839844, 1016.9886474609375, 185.5819549560547, 1689.4241943359375, 167.1842803955078, 202.2176513671875, 240.0353546142578, 165.1486358642578, 1940.480712890625, 1423.8079833984375, 399.85687255859375, 990.4652099609375, 559.25, 670.059814453125, 536.776123046875, 505.7619934082031, 528.2215576171875, 572.4735717773438, 254.32785034179688, 553.66845703125, 544.2701416015625, 701.0418090820312, 868.3306274414062, 4004.499755859375, 693.3757934570312, 732.4243774414062, 584.494873046875, 822.269287109375, 2646.844970703125, 5183.0615234375, 1242.181884765625, 3510.59228515625], \"loglift\": [30.0, 29.0, 28.0, 27.0, 26.0, 25.0, 24.0, 23.0, 22.0, 21.0, 20.0, 19.0, 18.0, 17.0, 16.0, 15.0, 14.0, 13.0, 12.0, 11.0, 10.0, 9.0, 8.0, 7.0, 6.0, 5.0, 4.0, 3.0, 2.0, 1.0, 2.0255000591278076, 2.0250000953674316, 2.0241000652313232, 2.023900032043457, 2.0237998962402344, 2.0234999656677246, 2.023400068283081, 2.023200035095215, 2.022599935531616, 2.022599935531616, 2.0225000381469727, 2.022200107574463, 2.0220999717712402, 2.0216000080108643, 2.0213000774383545, 2.0213000774383545, 2.0213000774383545, 2.020900011062622, 2.020900011062622, 2.020699977874756, 2.0204999446868896, 2.02020001411438, 2.02020001411438, 2.0201001167297363, 2.0199999809265137, 2.0199999809265137, 2.0197999477386475, 2.019700050354004, 2.018199920654297, 2.018199920654297, 2.0153000354766846, 2.007200002670288, 1.9528000354766846, 1.9889999628067017, 1.8824000358581543, 1.958899974822998, 1.7970999479293823, 1.980299949645996, 1.819599986076355, 1.6779999732971191, 1.763100028038025, 1.6375000476837158, 1.8667999505996704, 1.781499981880188, 1.0757999420166016, 1.7408000230789185, 1.2897000312805176, 1.0537999868392944, 1.5707000494003296, 0.9531000256538391, 1.4706000089645386, 1.4835000038146973, 0.7210999727249146, 1.080899953842163, 0.6299999952316284, 0.6431000232696533, 0.739799976348877, 1.0845999717712402, 1.3265000581741333, 0.5475999712944031, 0.0575999990105629, 0.9682999849319458, 0.27399998903274536, 0.847000002861023, 0.6578999757766724, -0.014100000262260437, 0.5697000026702881, 2.045099973678589, 2.044800043106079, 2.0445001125335693, 2.0434000492095947, 2.043299913406372, 2.04259991645813, 2.0423998832702637, 2.04229998588562, 2.0418999195098877, 2.0411999225616455, 2.041100025177002, 2.0408999919891357, 2.0408999919891357, 2.040600061416626, 2.0401999950408936, 2.0399999618530273, 2.0397000312805176, 2.0394999980926514, 2.039400100708008, 2.0390000343322754, 2.0390000343322754, 2.0388998985290527, 2.0385000705718994, 2.0383999347686768, 2.038100004196167, 2.037600040435791, 2.0369999408721924, 2.036900043487549, 2.036900043487549, 2.036400079727173, 2.031899929046631, 2.0318000316619873, 2.0308001041412354, 2.023099899291992, 2.0327999591827393, 2.0308001041412354, 1.9904999732971191, 1.945199966430664, 1.9896999597549438, 1.9883999824523926, 1.9829000234603882, 1.9407000541687012, 1.8581000566482544, 1.9696999788284302, 1.8825000524520874, 1.8199000358581543, 1.5154000520706177, 1.9494999647140503, 1.7005000114440918, 1.5044000148773193, 1.7955000400543213, 1.5720000267028809, 1.4508999586105347, 1.5461000204086304, 1.42330002784729, 1.3523000478744507, 1.0579999685287476, 0.6973999738693237, 1.2980999946594238, 1.3992999792099, 0.6687999963760376, 0.8589000105857849, 1.0434000492095947, 0.6948999762535095, 0.9133999943733215, 0.5392000079154968, 0.31630000472068787, 0.7174999713897705, 0.003100000089034438, 0.5838000178337097, 0.8629000186920166, 2.080399990081787, 2.0803000926971436, 2.078700065612793, 2.0776000022888184, 2.0771000385284424, 2.0766000747680664, 2.0764000415802, 2.076200008392334, 2.0755999088287354, 2.075500011444092, 2.074399948120117, 2.0732998847961426, 2.073199987411499, 2.0725998878479004, 2.0725998878479004, 2.0724000930786133, 2.071899890899658, 2.0715999603271484, 2.0706000328063965, 2.0703001022338867, 2.0701000690460205, 2.0687999725341797, 2.0685999393463135, 2.06850004196167, 2.0678000450134277, 2.067500114440918, 2.0662999153137207, 2.0662999153137207, 2.066200017929077, 2.066200017929077, 2.0478999614715576, 2.0660998821258545, 2.0511999130249023, 2.0100998878479004, 2.022200107574463, 2.008699893951416, 1.9703999757766724, 1.9789999723434448, 1.9657000303268433, 1.9249999523162842, 1.8271000385284424, 1.9738999605178833, 1.774899959564209, 1.8641999959945679, 1.7426999807357788, 1.7103999853134155, 1.6003999710083008, 1.8172999620437622, 1.605299949645996, 1.4668999910354614, 1.4728000164031982, 1.5562000274658203, 1.4235999584197998, 1.6993999481201172, 1.6753000020980835, 1.5449999570846558, 1.365399956703186, 1.4404000043869019, 1.42330002784729, 1.3453999757766724, 1.3896000385284424, 1.3382999897003174, 1.4631999731063843, 1.4598000049591064, 1.579699993133545, 0.9275000095367432, 1.518399953842163, 1.176200032234192, 0.499099999666214, 0.7235000133514404, 0.3797000050544739, 1.0923999547958374, 0.7401000261306763, 0.15479999780654907, 2.1196000576019287, 2.117799997329712, 2.117000102996826, 2.1166999340057373, 2.1166000366210938, 2.116300106048584, 2.1157000064849854, 2.1152000427246094, 2.1150999069213867, 2.114799976348877, 2.1147000789642334, 2.114000082015991, 2.113800048828125, 2.113300085067749, 2.1131999492645264, 2.1129000186920166, 2.112499952316284, 2.1124000549316406, 2.112299919128418, 2.111799955368042, 2.1113998889923096, 2.1108999252319336, 2.1105000972747803, 2.1096999645233154, 2.109499931335449, 2.1089000701904297, 2.108599901199341, 2.108599901199341, 2.107800006866455, 2.107599973678589, 2.101799964904785, 2.099600076675415, 2.0685999393463135, 2.092400074005127, 2.0650999546051025, 2.073899984359741, 2.0125999450683594, 2.021399974822998, 2.0007998943328857, 2.0023000240325928, 2.0262999534606934, 2.0680999755859375, 1.9438999891281128, 1.8285000324249268, 1.8824000358581543, 1.9651000499725342, 1.9211000204086304, 1.8946000337600708, 1.7211999893188477, 1.8492000102996826, 1.8622000217437744, 2.00570011138916, 1.8641999959945679, 1.8091000318527222, 1.291200041770935, 1.6136000156402588, 1.1761000156402588, 1.246999979019165, 1.326200008392334, 0.973800003528595, 1.5801000595092773, 0.8787999749183655, 1.298699975013733, 0.9729999899864197, 0.7918000221252441, 0.4300999939441681, 0.10779999941587448, 0.5931000113487244, 0.9909999966621399, 0.40450000762939453, 2.3443000316619873, 2.342400074005127, 2.341900110244751, 2.3415000438690186, 2.34089994430542, 2.339600086212158, 2.3394999504089355, 2.3392999172210693, 2.3385000228881836, 2.338399887084961, 2.3378000259399414, 2.3373000621795654, 2.337100028991699, 2.3369998931884766, 2.336899995803833, 2.336199998855591, 2.335400104522705, 2.33489990234375, 2.33489990234375, 2.3345999717712402, 2.334199905395508, 2.3340001106262207, 2.3327999114990234, 2.3327999114990234, 2.3326001167297363, 2.3324999809265137, 2.3324999809265137, 2.3322999477386475, 2.3320999145507812, 2.3320000171661377, 2.3210999965667725, 2.3196001052856445, 2.3125, 2.2964999675750732, 2.3036999702453613, 2.2811999320983887, 2.305999994277954, 2.2894999980926514, 2.218400001525879, 2.106600046157837, 2.063800096511841, 2.2263998985290527, 2.183000087738037, 2.096400022506714, 2.1958000659942627, 2.1349000930786133, 2.186199903488159, 2.033400058746338, 2.193000078201294, 1.8655999898910522, 2.0510001182556152, 1.8450000286102295, 1.6746000051498413, 1.5880000591278076, 1.9641000032424927, 0.8166999816894531, 0.7954000234603882, 1.629699945449829, 1.5721999406814575, 1.6842999458312988, 0.6662999987602234, 0.41440001130104065, 1.1360000371932983, 0.9230999946594238, 0.9273999929428101, 0.7792999744415283, 0.24959999322891235, -0.010900000110268593, 0.20020000636577606, -0.3833000063896179, 0.3409000039100647, 0.04670000076293945, 0.013500000350177288, 1.1301000118255615, 0.7407000064849854, 2.3550000190734863, 2.3548998832702637, 2.3541998863220215, 2.354099988937378, 2.352099895477295, 2.3513998985290527, 2.3487000465393066, 2.347599983215332, 2.3473000526428223, 2.3471999168395996, 2.34689998626709, 2.3457000255584717, 2.3454999923706055, 2.3452999591827393, 2.3450000286102295, 2.3440001010894775, 2.343600034713745, 2.3433001041412354, 2.343100070953369, 2.3427999019622803, 2.342600107192993, 2.3422999382019043, 2.3422999382019043, 2.3417999744415283, 2.3415000438690186, 2.341399908065796, 2.341399908065796, 2.3403000831604004, 2.340100049972534, 2.340100049972534, 2.3173000812530518, 2.297499895095825, 2.3120999336242676, 2.310800075531006, 2.260999917984009, 2.295099973678589, 2.3132998943328857, 2.235300064086914, 2.249799966812134, 2.33270001411438, 2.2404000759124756, 2.1772000789642334, 2.203000068664551, 2.1942999362945557, 2.2360000610351562, 2.2339999675750732, 2.071899890899658, 1.9709999561309814, 2.089400053024292, 1.9449000358581543, 2.13100004196167, 2.011899948120117, 2.0436999797821045, 1.7994999885559082, 1.6154999732971191, 1.215399980545044, 1.9222999811172485, 1.5217000246047974, 1.7158000469207764, 0.7318999767303467, 1.5988999605178833, 0.6722000241279602, 0.460999995470047, 0.4821999967098236, 0.07440000027418137, 0.4043000042438507, 0.7802000045776367, 0.4431000053882599, 0.03189999982714653, 0.3253999948501587, 0.4275999963283539, 0.4212000072002411, 0.9513000249862671, 0.9588000178337097, 0.13619999587535858, 0.011599999852478504, 2.412899971008301, 2.411799907684326, 2.411799907684326, 2.41129994392395, 2.4098000526428223, 2.4096999168395996, 2.4089999198913574, 2.4089999198913574, 2.4082000255584717, 2.408099889755249, 2.407900094985962, 2.407599925994873, 2.4072999954223633, 2.4072999954223633, 2.4072999954223633, 2.4070000648498535, 2.4070000648498535, 2.4068000316619873, 2.4066998958587646, 2.406599998474121, 2.4061999320983887, 2.4061999320983887, 2.405900001525879, 2.4052999019622803, 2.4052999019622803, 2.4052000045776367, 2.404900074005127, 2.404900074005127, 2.4047000408172607, 2.4045000076293945, 2.393399953842163, 2.3766000270843506, 2.3415000438690186, 2.3566999435424805, 2.358099937438965, 2.2316999435424805, 2.300800085067749, 2.1847000122070312, 2.2667999267578125, 2.2228000164031982, 2.2576000690460205, 2.123500108718872, 1.96589994430542, 2.312700033187866, 1.9866000413894653, 1.5972000360488892, 1.7651000022888184, 1.0090999603271484, 1.4464999437332153, 1.0003999471664429, 1.2259999513626099, 1.7905999422073364, 1.7925000190734863, 1.4222999811172485, 1.3905999660491943, 1.7355999946594238, 0.6812999844551086, 0.6772000193595886, 0.5329999923706055, 0.23199999332427979, 1.4362000226974487, 0.38100001215934753, 0.775600016117096, 0.977400004863739, 0.843500018119812, 0.9948999881744385, 0.7968999743461609, 0.7509999871253967, 0.16369999945163727, 0.7944999933242798, 1.1397000551223755, 0.7049999833106995, 2.54010009765625, 2.5387001037597656, 2.538300037384033, 2.537600040435791, 2.5373001098632812, 2.536799907684326, 2.5360000133514404, 2.5348000526428223, 2.5346999168395996, 2.53439998626709, 2.5336999893188477, 2.533600091934204, 2.533400058746338, 2.5327999591827393, 2.5325000286102295, 2.5320000648498535, 2.5315001010894775, 2.5313000679016113, 2.5309998989105225, 2.5302000045776367, 2.5302000045776367, 2.5299999713897705, 2.529900074005127, 2.529599905014038, 2.529400110244751, 2.5283000469207764, 2.5280001163482666, 2.527100086212158, 2.526900053024292, 2.526099920272827, 2.4986000061035156, 2.449700117111206, 2.450900077819824, 2.509700059890747, 2.476799964904785, 2.3310999870300293, 2.1043999195098877, 2.260999917984009, 2.390899896621704, 2.3452000617980957, 1.830899953842163, 1.718000054359436, 2.049499988555908, 1.8806999921798706, 2.017199993133545, 2.054800033569336, 1.9694000482559204, 1.9026999473571777, 2.0141000747680664, 1.6618000268936157, 1.9522000551223755, 1.7517000436782837, 1.1319999694824219, 1.6974999904632568, 1.3797999620437622, 1.1073999404907227, 1.30649995803833, 1.3228000402450562, 0.4544999897480011, 0.39149999618530273, 1.211400032043457, 0.9824000000953674, -0.3142000138759613, 0.1941000074148178, 2.6533000469207764, 2.652600049972534, 2.650099992752075, 2.649600028991699, 2.648900032043457, 2.648900032043457, 2.6486001014709473, 2.648099899291992, 2.648099899291992, 2.646899938583374, 2.645900011062622, 2.645699977874756, 2.645699977874756, 2.645400047302246, 2.64520001411438, 2.644700050354004, 2.644700050354004, 2.6435999870300293, 2.643399953842163, 2.643399953842163, 2.6433000564575195, 2.6433000564575195, 2.6429998874664307, 2.6429998874664307, 2.6429998874664307, 2.6429998874664307, 2.642400026321411, 2.6422998905181885, 2.6421000957489014, 2.6415998935699463, 2.635999917984009, 2.5836000442504883, 2.539299964904785, 2.5450000762939453, 2.5088000297546387, 2.5473999977111816, 2.4653000831604004, 2.588399887084961, 2.606800079345703, 2.5288000106811523, 2.597399950027466, 2.5183000564575195, 2.367000102996826, 2.470099925994873, 2.3645999431610107, 2.3884999752044678, 2.2541000843048096, 2.546799898147583, 1.9607000350952148, 2.4368999004364014, 1.7419999837875366, 1.7599999904632568, 1.6059000492095947, 2.1031999588012695, 2.1456000804901123, 2.023200035095215, 1.0397000312805176, 1.5461000204086304, 2.0940001010894775, 0.7099999785423279, 1.1996999979019165, 0.8400999903678894, 1.422700047492981, 1.3034000396728516, -0.013100000098347664, -0.1525000035762787, 0.4368000030517578, 0.745199978351593, 0.510200023651123, -0.03440000116825104, -0.14550000429153442, 0.10100000351667404, 2.72160005569458, 2.721400022506714, 2.7200000286102295, 2.7191998958587646, 2.7188000679016113, 2.718600034713745, 2.718400001525879, 2.7179999351501465, 2.7174999713897705, 2.717099905014038, 2.7170000076293945, 2.7167999744415283, 2.7167000770568848, 2.7165000438690186, 2.7163000106811523, 2.7163000106811523, 2.716200113296509, 2.7158000469207764, 2.7156999111175537, 2.7151999473571777, 2.7149999141693115, 2.7147998809814453, 2.714600086212158, 2.714600086212158, 2.7144999504089355, 2.714400053024292, 2.7137999534606934, 2.712899923324585, 2.7128000259399414, 2.7125000953674316, 2.7116000652313232, 2.7100000381469727, 2.660099983215332, 2.686199903488159, 2.5232999324798584, 2.684799909591675, 2.6684999465942383, 2.643399953842163, 2.6735999584198, 2.3148000240325928, 2.2867000102996826, 2.477099895477295, 2.2590999603271484, 2.3817999362945557, 2.3364999294281006, 2.377000093460083, 2.359499931335449, 2.330699920654297, 2.299099922180176, 2.5443999767303467, 2.254300117492676, 2.1686999797821045, 1.978600025177002, 1.773300051689148, 0.8248000144958496, 1.8695000410079956, 1.7740000486373901, 1.873900055885315, 1.5986000299453735, 0.6425999999046326, 0.05000000074505806, 1.1669000387191772, 0.04839999973773956], \"logprob\": [30.0, 29.0, 28.0, 27.0, 26.0, 25.0, 24.0, 23.0, 22.0, 21.0, 20.0, 19.0, 18.0, 17.0, 16.0, 15.0, 14.0, 13.0, 12.0, 11.0, 10.0, 9.0, 8.0, 7.0, 6.0, 5.0, 4.0, 3.0, 2.0, 1.0, -4.882199764251709, -5.374499797821045, -5.914400100708008, -5.995299816131592, -6.022299766540527, -6.139200210571289, -6.162799835205078, -6.240099906921387, -6.430099964141846, -6.431300163269043, -6.4481000900268555, -6.517099857330322, -6.532599925994873, -5.713200092315674, -6.713799953460693, -6.680600166320801, -6.725599765777588, -6.80109977722168, -6.786600112915039, -6.832300186157227, -6.872700214385986, -6.892399787902832, -6.929500102996826, -6.946300029754639, -6.952899932861328, -6.963099956512451, -6.981100082397461, -7.000899791717529, -7.207600116729736, -7.210000038146973, -6.230899810791016, -6.464200019836426, -5.641499996185303, -6.496399879455566, -5.325099945068359, -6.250899791717529, -4.987599849700928, -6.652400016784668, -5.7866997718811035, -5.463200092315674, -5.974699974060059, -5.600100040435791, -6.321100234985352, -6.075300216674805, -4.164999961853027, -6.055200099945068, -5.059800148010254, -4.702600002288818, -5.730299949645996, -4.607699871063232, -5.853899955749512, -5.873799800872803, -5.070400238037109, -5.449900150299072, -5.1554999351501465, -5.1855998039245605, -5.401899814605713, -5.638400077819824, -5.808599948883057, -5.481299877166748, -5.3383002281188965, -5.733500003814697, -5.481500148773193, -5.7484002113342285, -5.736800193786621, -5.668000221252441, -5.838200092315674, -4.753300189971924, -5.165999889373779, -5.369900226593018, -5.967899799346924, -5.506999969482422, -6.253600120544434, -6.323699951171875, -6.35129976272583, -6.450500011444092, -6.612100124359131, -6.622200012207031, -6.675099849700928, -6.678599834442139, -6.653600215911865, -6.823699951171875, -6.845600128173828, -6.909299850463867, -6.933800220489502, -6.952300071716309, -7.013199806213379, -7.014999866485596, -6.98859977722168, -7.004700183868408, -7.095900058746338, -7.135300159454346, -7.196100234985352, -7.264999866485596, -7.2606000900268555, -7.272200107574463, -6.650000095367432, -4.354899883270264, -5.3043999671936035, -5.513999938964844, -5.460400104522705, -6.571499824523926, -6.394000053405762, -5.218299865722656, -5.284299850463867, -6.085599899291992, -6.298299789428711, -6.320799827575684, -5.9166998863220215, -5.550000190734863, -6.38100004196167, -5.966000080108643, -5.768099784851074, -4.58519983291626, -6.354599952697754, -5.545199871063232, -5.00629997253418, -5.991600036621094, -5.504700183868408, -5.3028998374938965, -5.598199844360352, -5.393599987030029, -5.41349983215332, -5.011899948120117, -4.543399810791016, -5.440800189971924, -5.635000228881836, -4.891900062561035, -5.127299785614014, -5.315899848937988, -5.143700122833252, -5.407100200653076, -5.2895002365112305, -5.402100086212158, -5.500899791717529, -5.3927998542785645, -5.484099864959717, -5.540599822998047, -5.625400066375732, -5.695799827575684, -6.301300048828125, -6.148200035095215, -6.662399768829346, -6.764100074768066, -6.801199913024902, -6.842599868774414, -6.940400123596191, -6.960299968719482, -7.102200031280518, -7.246399879455566, -7.256100177764893, -7.317500114440918, -7.3225998878479, -7.335999965667725, -7.383800029754639, -7.423299789428711, -7.511600017547607, -7.533400058746338, -7.552299976348877, -7.52400016784668, -7.672999858856201, -7.679500102996826, -7.730100154876709, -7.745500087738037, -7.829500198364258, -7.829899787902832, -7.832900047302246, -7.836999893188477, -5.795100212097168, -7.8125, -6.699900150299072, -5.167600154876709, -6.002200126647949, -5.733699798583984, -4.740300178527832, -5.880899906158447, -6.10129976272583, -5.969099998474121, -5.160900115966797, -6.678699970245361, -5.234300136566162, -5.997900009155273, -5.223100185394287, -5.309899806976318, -4.928400039672852, -6.041500091552734, -5.117800235748291, -4.515200138092041, -4.7032999992370605, -5.03980016708374, -4.662199974060059, -5.71019983291626, -5.6722002029418945, -5.348400115966797, -4.901500225067139, -5.117700099945068, -5.128900051116943, -4.952400207519531, -5.177800178527832, -5.201499938964844, -5.495699882507324, -5.51609992980957, -5.6367998123168945, -5.026400089263916, -5.65910005569458, -5.4980998039245605, -5.430799961090088, -5.4899001121521, -5.445300102233887, -5.597400188446045, -5.629899978637695, -5.628900051116943, -5.063899993896484, -6.070400238037109, -6.309800148010254, -6.3907999992370605, -6.395899772644043, -6.473999977111816, -6.618800163269043, -6.7153000831604, -6.723800182342529, -6.781499862670898, -6.766499996185303, -5.94320011138916, -6.934599876403809, -7.006800174713135, -7.021900177001953, -7.065999984741211, -7.116600036621094, -7.1203999519348145, -7.1356000900268555, -7.191699981689453, -7.2342000007629395, -5.584799766540527, -7.332799911499023, -7.412700176239014, -7.42519998550415, -7.191299915313721, -7.507500171661377, -7.5081000328063965, -7.56879997253418, -7.589399814605713, -6.187300205230713, -6.0883002281188965, -4.949900150299072, -6.490799903869629, -5.281499862670898, -5.921500205993652, -4.572700023651123, -5.73799991607666, -5.423999786376953, -5.467400074005127, -5.894899845123291, -6.571000099182129, -5.354100227355957, -4.242700099945068, -4.984099864959717, -5.727200031280518, -5.379000186920166, -5.3383002281188965, -4.232699871063232, -5.212600231170654, -5.309599876403809, -6.185999870300293, -5.68149995803833, -5.6529998779296875, -4.570099830627441, -5.377799987792969, -4.806000232696533, -4.966400146484375, -5.1168999671936035, -4.681700229644775, -5.565299987792969, -4.904900074005127, -5.4120001792907715, -5.2144999504089355, -5.293900012969971, -5.325399875640869, -5.288099765777588, -5.44320011138916, -5.561200141906738, -5.525400161743164, -6.017399787902832, -6.459199905395508, -6.554100036621094, -6.177000045776367, -6.7220001220703125, -6.895100116729736, -6.903600215911865, -5.435500144958496, -6.782800197601318, -7.031599998474121, -7.093900203704834, -7.136499881744385, -7.1616997718811035, -7.162600040435791, -7.181000232696533, -6.083799839019775, -7.304900169372559, -7.343400001525879, -7.348599910736084, -7.369699954986572, -7.401000022888184, -7.41349983215332, -7.497000217437744, -7.502200126647949, -7.513800144195557, -7.516499996185303, -7.521500110626221, -7.535600185394287, -7.5441999435424805, -7.55109977722168, -5.597400188446045, -5.7683000564575195, -6.349699974060059, -6.095099925994873, -6.504499912261963, -6.050600051879883, -6.671199798583984, -6.494999885559082, -5.345600128173828, -4.648399829864502, -4.356599807739258, -6.17140007019043, -5.94320011138916, -5.763000011444092, -6.377099990844727, -6.164899826049805, -6.436299800872803, -5.794899940490723, -6.502699851989746, -5.310500144958496, -6.0553998947143555, -5.515200138092041, -5.35230016708374, -5.60129976272583, -6.164999961853027, -4.837200164794922, -4.860099792480469, -5.854800224304199, -5.8242998123168945, -5.942299842834473, -5.11929988861084, -4.981500148773193, -5.545599937438965, -5.661200046539307, -5.696599960327148, -5.682400226593018, -5.589000225067139, -5.571599960327148, -5.62470006942749, -5.624100208282471, -5.744900226593018, -5.708799839019775, -5.770199775695801, -5.910600185394287, -5.906000137329102, -5.388000011444092, -4.97730016708374, -5.809100151062012, -5.883299827575684, -6.095799922943115, -6.528900146484375, -6.915599822998047, -7.037899971008301, -6.993800163269043, -7.081099987030029, -7.107399940490723, -7.218400001525879, -7.237599849700928, -7.257500171661377, -7.2804999351501465, -7.362400054931641, -7.387899875640869, -7.4105000495910645, -7.4207000732421875, -7.450399875640869, -7.463500022888184, -7.480199813842773, -7.480000019073486, -7.519499778747559, -7.536099910736084, -7.539700031280518, -7.541999816894531, -7.6118998527526855, -7.619999885559082, -7.1971001625061035, -5.447000026702881, -5.146599769592285, -5.984499931335449, -6.154799938201904, -5.329599857330322, -6.46150016784668, -6.9243998527526855, -5.44290018081665, -5.820099830627441, -7.303299903869629, -6.218299865722656, -5.551400184631348, -6.050899982452393, -6.115699768066406, -6.45389986038208, -6.50540018081665, -5.731599807739258, -5.35699987411499, -5.955699920654297, -5.418099880218506, -6.295400142669678, -5.906899929046631, -6.03879976272583, -5.660900115966797, -5.357600212097168, -4.576000213623047, -6.046299934387207, -5.535999774932861, -5.82480001449585, -4.986599922180176, -5.956099987030029, -5.39900016784668, -5.295400142669678, -5.342700004577637, -5.166399955749512, -5.351200103759766, -5.513000011444092, -5.395500183105469, -5.363999843597412, -5.460100173950195, -5.502299785614014, -5.614999771118164, -5.730199813842773, -5.740499973297119, -5.725100040435791, -5.77209997177124, -5.916200160980225, -6.203800201416016, -6.205599784851074, -6.309999942779541, -6.57480001449585, -6.602399826049805, -6.702899932861328, -6.705100059509277, -6.802800178527832, -6.820400238037109, -6.838099956512451, -6.872300148010254, -6.866399765014648, -5.8531999588012695, -6.912700176239014, -6.946300029754639, -6.9471001625061035, -6.961400032043457, -6.976600170135498, -6.990600109100342, -7.022799968719482, -7.031899929046631, -6.214600086212158, -7.107999801635742, -7.111999988555908, -7.125100135803223, -7.150100231170654, -7.1504998207092285, -7.16379976272583, -7.183000087738037, -5.0954999923706055, -6.145999908447266, -5.829899787902832, -6.146999835968018, -6.287600040435791, -5.656300067901611, -6.222400188446045, -5.499899864196777, -6.05810022354126, -6.175099849700928, -6.523399829864502, -6.176700115203857, -5.816299915313721, -6.7428998947143555, -6.06220006942749, -5.412899971008301, -5.721799850463867, -4.644899845123291, -5.347899913787842, -4.7179999351501465, -5.152400016784668, -5.967599868774414, -5.999100208282471, -5.628600120544434, -5.627799987792969, -5.966800212860107, -5.143700122833252, -5.252600193023682, -5.252600193023682, -5.163899898529053, -5.8053998947143555, -5.447700023651123, -5.619100093841553, -5.710599899291992, -5.69189977645874, -5.749000072479248, -5.70359992980957, -5.710599899291992, -5.674900054931641, -5.8471999168396, -5.911399841308594, -5.9029998779296875, -4.351600170135498, -5.3572998046875, -5.516900062561035, -5.445400238037109, -5.866499900817871, -5.999599933624268, -6.178400039672852, -6.39169979095459, -6.408699989318848, -6.450099945068359, -4.750800132751465, -6.572500228881836, -6.60129976272583, -6.676599979400635, -6.698999881744385, -6.645400047302246, -6.8256001472473145, -6.853000164031982, -6.371300220489502, -6.9558000564575195, -6.956299781799316, -6.978799819946289, -6.988800048828125, -7.013700008392334, -6.946000099182129, -7.128799915313721, -7.146599769592285, -7.2179999351501465, -7.229000091552734, -7.287799835205078, -4.95959997177124, -4.533999919891357, -5.435999870300293, -6.94350004196167, -6.648799896240234, -5.456600189208984, -4.546800136566162, -5.6230998039245605, -6.371500015258789, -6.284299850463867, -4.621500015258789, -4.631499767303467, -5.618000030517578, -5.259300231933594, -5.611199855804443, -5.697000026702881, -5.560400009155273, -5.549799919128418, -5.781899929046631, -5.357699871063232, -5.821599960327148, -5.603300094604492, -5.048399925231934, -5.6143999099731445, -5.34499979019165, -5.15939998626709, -5.414700031280518, -5.561200141906738, -5.336999893188477, -5.3649001121521, -5.582699775695801, -5.557499885559082, -5.554999828338623, -5.589600086212158, -5.306000232696533, -5.590199947357178, -6.189599990844727, -6.274400234222412, -6.389599800109863, -6.389500141143799, -6.435200214385986, -6.504300117492676, -6.507500171661377, -6.6519999504089355, -6.760200023651123, -6.632599830627441, -6.781199932098389, -6.806099891662598, -6.833499908447266, -6.872200012207031, -6.879899978637695, -6.9542999267578125, -6.990300178527832, -6.370100021362305, -6.994999885559082, -6.997000217437744, -5.59689998626709, -7.023399829864502, -7.023399829864502, -7.025400161743164, -7.065000057220459, -7.035699844360352, -7.0879998207092285, -7.124899864196777, -6.369200229644775, -5.4944000244140625, -5.081399917602539, -5.257400035858154, -5.519999980926514, -6.0345001220703125, -5.214099884033203, -6.502200126647949, -6.671199798583984, -6.0482001304626465, -6.612400054931641, -6.098800182342529, -5.285799980163574, -5.903200149536133, -5.553400039672852, -5.670000076293945, -5.394599914550781, -6.484300136566162, -5.22599983215332, -6.290200233459473, -5.123600006103516, -5.187600135803223, -4.965199947357178, -5.832200050354004, -5.899400234222412, -5.825500011444092, -5.028299808502197, -5.555200099945068, -6.0192999839782715, -5.151199817657471, -5.456500053405762, -5.453000068664551, -5.76200008392334, -5.762700080871582, -5.408999919891357, -5.3933000564575195, -5.599400043487549, -5.662700176239014, -5.7164998054504395, -5.688399791717529, -5.706200122833252, -5.737599849700928, -4.496799945831299, -4.617499828338623, -5.374000072479248, -5.655700206756592, -5.768099784851074, -5.807300090789795, -5.857600212097168, -5.942200183868408, -6.054900169372559, -6.128300189971924, -6.153299808502197, -6.173099994659424, -6.179500102996826, -6.234899997711182, -6.258200168609619, -6.203199863433838, -6.280900001525879, -6.3358001708984375, -6.345300197601318, -6.419400215148926, -6.450300216674805, -6.476099967956543, -6.50439977645874, -6.50600004196167, -6.509799957275391, -6.446499824523926, -6.600800037384033, -6.6890997886657715, -6.702099800109863, -6.729800224304199, -5.840000152587891, -6.20389986038208, -4.364299774169922, -6.039400100708008, -3.9937000274658203, -6.145199775695801, -5.97130012512207, -5.824900150299072, -6.168600082397461, -4.063600063323975, -4.401299953460693, -5.480899810791016, -4.791800022125244, -5.240699768066406, -5.105299949645996, -5.286499977111816, -5.36359977722168, -5.348800182342529, -5.300000190734863, -5.866099834442139, -5.378200054168701, -5.480899810791016, -5.417900085449219, -5.409200191497803, -4.829100131988525, -5.538000106811523, -5.578700065612793, -5.704500198364258, -5.638400077819824, -5.4253997802734375, -5.345900058746338, -5.65749979019165, -5.737199783325195]}, \"token.table\": {\"Topic\": [1, 2, 3, 4, 5, 6, 8, 9, 10, 3, 4, 5, 6, 7, 8, 4, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 1, 3, 5, 8, 1, 2, 3, 5, 8, 1, 5, 8, 9, 5, 3, 8, 7, 4, 1, 2, 5, 6, 7, 8, 9, 10, 2, 3, 4, 5, 6, 7, 8, 10, 3, 8, 1, 6, 9, 2, 4, 5, 2, 3, 4, 5, 8, 1, 10, 1, 3, 4, 8, 1, 1, 2, 3, 5, 6, 7, 8, 9, 1, 6, 8, 9, 10, 1, 1, 1, 3, 5, 6, 6, 2, 2, 2, 1, 2, 6, 8, 9, 10, 5, 1, 2, 3, 4, 8, 2, 3, 4, 5, 6, 7, 3, 5, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 1, 1, 1, 3, 9, 4, 5, 7, 1, 3, 4, 5, 6, 7, 8, 9, 10, 7, 10, 7, 1, 8, 6, 7, 1, 2, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 1, 3, 7, 8, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 2, 2, 5, 6, 2, 5, 3, 4, 4, 9, 7, 1, 3, 4, 5, 7, 8, 9, 10, 10, 8, 1, 2, 3, 4, 5, 6, 7, 9, 6, 5, 6, 7, 10, 10, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 1, 4, 5, 6, 7, 3, 4, 8, 4, 6, 4, 5, 1, 3, 4, 5, 6, 7, 8, 9, 10, 8, 9, 9, 10, 5, 6, 4, 6, 7, 8, 10, 9, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 9, 7, 2, 1, 2, 3, 4, 5, 6, 7, 8, 9, 6, 4, 4, 9, 1, 2, 3, 5, 8, 9, 4, 7, 8, 9, 1, 2, 1, 2, 1, 2, 5, 4, 8, 3, 4, 7, 8, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 8, 1, 2, 3, 8, 10, 6, 7, 10, 3, 4, 4, 9, 1, 5, 6, 8, 7, 8, 7, 10, 2, 3, 4, 6, 7, 8, 1, 2, 3, 4, 7, 10, 2, 3, 4, 5, 6, 7, 8, 10, 1, 4, 6, 7, 10, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 2, 3, 4, 5, 6, 7, 8, 9, 3, 4, 7, 9, 6, 4, 2, 9, 10, 3, 1, 3, 4, 5, 6, 7, 8, 9, 10, 1, 2, 3, 4, 6, 7, 8, 3, 1, 3, 4, 5, 6, 7, 8, 9, 6, 1, 4, 5, 6, 8, 9, 10, 1, 2, 6, 8, 10, 1, 6, 8, 8, 8, 8, 8, 4, 7, 10, 9, 2, 6, 2, 3, 4, 6, 7, 8, 9, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 1, 4, 6, 8, 1, 2, 4, 6, 9, 10, 8, 8, 5, 1, 2, 3, 4, 5, 6, 7, 8, 9, 3, 10, 3, 4, 7, 8, 4, 9, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 3, 3, 4, 8, 9, 3, 4, 8, 1, 2, 3, 4, 5, 9, 10, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 2, 1, 3, 4, 5, 6, 7, 8, 9, 10, 5, 1, 6, 9, 2, 7, 1, 2, 4, 5, 6, 7, 9, 10, 4, 5, 6, 8, 10, 3, 5, 9, 1, 7, 9, 1, 2, 3, 5, 7, 9, 10, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 9, 4, 1, 2, 3, 4, 5, 6, 7, 10, 8, 1, 2, 6, 8, 10, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 5, 3, 4, 8, 10, 8, 4, 10, 1, 2, 9, 3, 4, 1, 1, 2, 6, 8, 9, 10, 1, 2, 3, 4, 5, 7, 8, 9, 10, 1, 2, 7, 8, 1, 5, 6, 8, 1, 3, 4, 8, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 6, 6, 1, 3, 5, 9, 3, 4, 5, 10, 7, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 3, 4, 1, 2, 5, 9, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 2, 3, 4, 8, 9, 2, 6, 10, 6, 9, 1, 2, 3, 4, 8, 9, 5, 6, 8, 9, 10, 2, 4, 7, 10, 7, 10, 7, 9, 1, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 1, 2, 3, 5, 8, 10, 2, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 4, 9, 2, 1, 5, 6, 8, 3, 3, 4, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 1, 3, 1, 2, 3, 1, 2, 5, 6, 7, 8, 9, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 8, 1, 6, 9, 5, 8, 3, 6, 8, 6, 7, 9, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 1, 2, 4, 5, 6, 7, 8, 9, 10, 6, 1, 5, 8, 9, 1, 2, 5, 7, 5, 6, 7, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 5, 10, 7, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 1, 5, 6, 7, 9, 1, 7, 10, 1, 2, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 9, 8, 6, 7, 6, 5, 1, 6, 6, 1, 2, 3, 4, 5, 6, 7, 9, 1, 2, 3, 4, 8, 6, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 2, 3, 4, 7, 8, 9, 9, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 7, 9, 10, 7, 3, 4, 5, 7, 8, 5, 6, 9, 10, 9, 4, 2, 3, 4, 6, 7, 8, 9, 10, 5, 8, 1, 1, 2, 10, 1, 2, 10, 2, 10, 2, 4, 7, 9, 7, 2, 4, 5, 6, 7, 9, 10, 2, 5, 10, 1, 2, 10, 3, 5, 6, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 4, 7, 5, 3, 3, 8, 1, 2, 3, 6, 7, 9, 10, 1, 7, 3, 7, 5, 3, 5, 10, 10, 7, 10, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 10, 10, 1, 2, 3, 4, 6, 7, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 1, 2, 5, 6, 7, 8, 9, 10, 2, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 7, 1, 2, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 1, 2, 4, 5, 6, 7, 9, 10, 3, 5, 8, 1, 3, 4, 5, 6, 8, 9, 10, 3, 6, 2, 3, 4, 6, 7, 8, 9, 10, 3, 4, 3, 5, 1, 2, 1, 4, 10, 5, 3, 4, 10, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 1, 3, 7, 8, 9, 1, 4, 8, 9, 4, 1, 2, 3, 4, 5, 7, 10, 1, 2, 3, 4, 5, 6, 7, 8, 10, 7, 1, 5, 7, 9, 9, 2, 4, 6, 9, 1, 8, 1, 2, 3, 5, 5, 2, 3, 4, 7, 8, 9, 3, 4, 8, 1, 2, 4, 5, 6, 8, 9, 10, 4, 5, 8, 4, 10, 2, 3, 5, 1, 2, 1, 4, 3, 6, 1, 3, 4, 1, 2, 6, 1, 2, 3, 5, 7, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 1, 8, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 2, 4, 6, 7, 8, 9, 3, 8, 7, 5, 4, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 3, 6, 8, 3, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 10, 5, 3, 5, 6, 7, 3, 4, 8, 1, 3, 4, 5, 6, 7, 10, 1, 2, 4, 7, 9, 10, 2, 8, 9, 2, 9, 10, 10, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 1, 2, 3, 5, 6, 7, 8, 9, 10, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 1, 2, 3, 4, 6, 7, 8, 9, 6, 9, 6, 5, 7, 7, 7, 9, 10, 8, 9, 10, 3, 1, 2, 4, 5, 6, 7, 8, 10, 7, 10, 10, 5, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 1, 2, 5, 6, 8, 10, 3, 1, 8, 9, 10, 3, 4, 8, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 4, 1, 5, 8, 10, 1, 2, 3, 4, 5, 6, 7, 1, 2, 3, 9, 3, 4, 7, 1, 8, 1, 2, 3, 4, 5, 6, 8, 3, 5, 6, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 2, 3, 4, 5, 8, 9, 3, 5, 7, 8, 9, 2, 2, 2, 3, 5, 8, 9, 10, 1, 3, 4, 5, 6, 7, 8, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 3, 4, 8, 10, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 3, 5, 10, 6, 5, 10, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 3, 8, 5, 3, 1, 2, 1, 2, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 1, 2, 3, 4, 5, 9, 7, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 2, 2, 7, 5, 6, 5, 6, 6, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 8, 1, 3, 5, 6, 7, 8, 9, 6, 1, 3, 5, 6, 7, 9, 10, 9, 1, 2, 4, 9, 10, 7, 5, 1, 2, 3, 4, 5, 6, 7, 10, 2, 7, 8, 2, 3, 4, 5, 6, 7, 2, 2, 3, 5, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 2, 3, 4, 8, 9, 2, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 2, 3, 5, 8, 9, 7, 10, 1, 2, 3, 4, 7, 9, 10, 3, 4, 8, 10, 2, 4, 1, 7, 7, 10, 1, 7, 8, 1, 6, 8, 10, 10, 1, 3, 4, 5, 6, 7, 8, 10, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 1, 1, 3, 4, 5, 1, 6, 10, 6, 3, 5, 4, 2, 2, 9, 3, 1, 1, 9, 10, 1, 2, 3, 4, 5, 6, 7, 10, 6, 2, 3, 4, 5, 6, 7, 8, 9, 10, 3, 5, 10, 1, 10, 2, 1, 2, 3, 4, 5, 7, 8, 9, 10, 1, 3, 4, 5, 8, 3, 5, 4, 5, 7, 4, 5, 6, 7, 8, 5, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 9, 1, 2, 5, 5, 1, 3, 4, 5, 6, 7, 8, 10, 3, 7, 10, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 7, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 1, 3, 4, 5, 6, 7, 8, 10, 8, 2, 3, 4, 6, 7, 8, 9, 10, 9, 5, 9, 8, 1, 2, 3, 5, 6, 8, 9, 10, 3, 9, 8, 4, 4, 9, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 8, 1, 2, 3, 5, 6, 3, 5, 7, 8, 10, 1, 2, 3, 4, 5, 6, 7, 8, 9, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 6, 2, 3, 4, 5, 6, 7, 8, 9, 2, 1, 2, 3, 4, 5, 6, 7, 9, 10, 2, 5, 2, 1, 2, 3, 6, 8, 9, 9, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 6, 4, 7, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 4, 5, 6, 7, 10, 3, 3, 4, 5, 7, 10, 1, 9, 1, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 6, 1, 2, 6, 9, 10, 1, 1, 1, 3, 2, 6, 7, 5, 7, 1, 2, 3, 4, 5, 6, 7, 9, 2, 4, 7, 5, 3, 4, 1, 4, 6, 7, 3, 4, 6, 8, 3, 6, 10, 6, 1, 5, 6, 8, 2, 1, 2, 3, 4, 5, 6, 7, 8, 10, 4, 8, 1, 3, 4, 8, 1, 10, 2, 3, 5, 6, 7, 8, 10, 3, 7, 7, 4, 1, 6, 6, 7, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 1, 2, 5, 7, 9, 1, 6, 7, 3, 5, 3, 1, 3, 4, 1, 5, 8, 9, 10, 5, 10, 3, 5, 7, 8, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 1, 2, 3, 3, 3, 3, 6, 7, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 9, 5, 1], \"Freq\": [0.14597457647323608, 0.5243168473243713, 0.12909317016601562, 0.049651216715574265, 0.007944194599986076, 0.022839559242129326, 0.06553960591554642, 0.034755852073431015, 0.018867462873458862, 0.4038994312286377, 0.19606097042560577, 0.17181314527988434, 0.03325415775179863, 0.0006927949143573642, 0.19328978657722473, 0.9846453666687012, 0.05245403200387955, 0.07399765402078629, 0.5367171764373779, 0.18265242874622345, 0.030910411849617958, 0.026227016001939774, 0.03278376907110214, 0.04964399337768555, 0.005620074924081564, 0.008430112153291702, 0.12413346767425537, 0.06308422237634659, 0.1973925679922104, 0.6145623922348022, 0.07897721976041794, 0.027874313294887543, 0.006968578323721886, 0.127757266163826, 0.7549293041229248, 0.0386761873960495, 0.08218690007925034, 0.0048345234245061874, 0.8702142834663391, 0.9961587190628052, 0.38717371225357056, 0.6116222143173218, 0.9911679625511169, 0.9902357459068298, 0.3397248089313507, 0.01449063140898943, 0.0941891074180603, 0.10062938928604126, 0.0040251752361655235, 0.20286883413791656, 0.03300643712282181, 0.21091918647289276, 0.1255282163619995, 0.12667985260486603, 0.06333992630243301, 0.012667985633015633, 0.1738968938589096, 0.03685232251882553, 0.07370464503765106, 0.3869493901729584, 0.9024051427841187, 0.09522868692874908, 0.7508026957511902, 0.0531729981303215, 0.19354970753192902, 0.22446227073669434, 0.772514820098877, 0.0022788047790527344, 0.02517748810350895, 0.7349889278411865, 0.18786278367042542, 0.01162037905305624, 0.03970295935869217, 0.34412068128585815, 0.6550520658493042, 0.04771804437041283, 0.8043898940086365, 0.03408431634306908, 0.11361439526081085, 0.9978160262107849, 0.06133546680212021, 0.7078112959861755, 0.06010875850915909, 0.011040383949875832, 0.05642862990498543, 0.013493802398443222, 0.012267093174159527, 0.07728268951177597, 0.8128737211227417, 0.14955469965934753, 0.015835203230381012, 0.012316268868744373, 0.007037867791950703, 0.9969621896743774, 0.9991598129272461, 0.8529109358787537, 0.0881236344575882, 0.006294545251876116, 0.050356362015008926, 0.9844499230384827, 0.9971557855606079, 0.999137282371521, 0.9962266683578491, 0.6339918971061707, 0.02204061858355999, 0.04278472810983658, 0.24115028977394104, 0.03241267427802086, 0.02722664549946785, 0.9965710639953613, 0.14439868927001953, 0.3110125660896301, 0.1871201992034912, 0.061518967151641846, 0.29563280940055847, 0.030767355114221573, 0.01678219437599182, 0.019579226151108742, 0.00839109718799591, 0.8978473544120789, 0.025173291563987732, 0.9901503324508667, 0.9818687438964844, 0.0017969019245356321, 0.02096385695040226, 0.6175352931022644, 0.11859553307294846, 0.024557659402489662, 0.027552496641874313, 0.004192771390080452, 0.14075732231140137, 0.031745269894599915, 0.012578314170241356, 0.9968400597572327, 0.9915972352027893, 0.9969091415405273, 0.9911938309669495, 0.9858373403549194, 0.023298190906643867, 0.15143823623657227, 0.8232027292251587, 0.003686217125505209, 0.012901759706437588, 0.02764662727713585, 0.020274193957448006, 0.007372434251010418, 0.00552932545542717, 0.1032140776515007, 0.7501451969146729, 0.06819501519203186, 0.832465648651123, 0.16556039452552795, 0.9908676147460938, 0.9820579290390015, 0.01671587862074375, 0.05610894411802292, 0.9409037828445435, 0.013235166668891907, 0.9843655228614807, 0.09290337562561035, 0.588257908821106, 0.0011710509425029159, 0.03083767369389534, 0.050745539367198944, 0.05933324620127678, 0.04801308736205101, 0.04332888498902321, 0.07065340876579285, 0.014052610844373703, 0.009513283148407936, 0.16172580420970917, 0.7934077978134155, 0.03424781933426857, 0.007427421398460865, 0.13072261214256287, 0.06758953630924225, 0.18197181820869446, 0.03936533257365227, 0.10546938329935074, 0.24139119684696198, 0.019311295822262764, 0.07501695305109024, 0.13295084238052368, 0.044250890612602234, 0.11761420220136642, 0.023289941251277924, 0.16128285229206085, 0.10946272313594818, 0.1676875799894333, 0.19796450436115265, 0.02270769327878952, 0.06288284063339233, 0.0931597650051117, 0.998639702796936, 0.9974706768989563, 0.001337522640824318, 0.9977918863296509, 0.061785414814949036, 0.9340500831604004, 0.9673571586608887, 0.02763877622783184, 0.9971907734870911, 0.982144832611084, 0.9899947643280029, 0.030463596805930138, 0.09139078855514526, 0.7326495051383972, 0.04874175414443016, 0.01675497740507126, 0.007615899201482534, 0.01218543853610754, 0.05940401181578636, 0.99476557970047, 0.9897249341011047, 0.10202129930257797, 0.3764234185218811, 0.3714982569217682, 0.004925166256725788, 0.0014071903424337506, 0.023922234773635864, 0.0731738954782486, 0.046437282115221024, 0.9913920760154724, 0.05558506026864052, 0.9393875598907471, 0.9452286958694458, 0.05472376570105553, 0.9884551167488098, 0.18599408864974976, 0.01752118207514286, 0.20149360597133636, 0.2715783417224884, 0.20014581084251404, 0.01347783301025629, 0.06671527028083801, 0.035716257989406586, 0.0006738916272297502, 0.0074128080159425735, 0.01812359318137169, 0.4086046516895294, 0.023066390305757523, 0.5272318124771118, 0.023066390305757523, 0.04739178344607353, 0.8909655213356018, 0.05687014013528824, 0.996481716632843, 0.9901353716850281, 0.9917146563529968, 0.9955679178237915, 0.0054613146930933, 0.13243688642978668, 0.045055847615003586, 0.046421173959970474, 0.20479929447174072, 0.13789819180965424, 0.028671901673078537, 0.0109226293861866, 0.38775333762168884, 0.06210208684206009, 0.9315313100814819, 0.9911101460456848, 0.985682487487793, 0.037090227007865906, 0.9602247476577759, 0.8974165320396423, 0.03992743045091629, 0.04689888656139374, 0.005703918635845184, 0.008872762322425842, 0.9924948215484619, 0.09890257567167282, 0.14101898670196533, 0.05016111582517624, 0.13344749808311462, 0.028866302222013474, 0.2067962884902954, 0.028866302222013474, 0.12918853759765625, 0.16278702020645142, 0.019875159487128258, 0.99397212266922, 0.9958775043487549, 0.9967539310455322, 0.12163206189870834, 0.17699562013149261, 0.04529745876789093, 0.08556186407804489, 0.02432641200721264, 0.09478912502527237, 0.04110324755311012, 0.009227260015904903, 0.4009663760662079, 0.9872007369995117, 0.9970030188560486, 0.989752471446991, 0.9943544268608093, 0.6778270602226257, 0.13264478743076324, 0.02312156930565834, 0.007301548030227423, 0.03772466629743576, 0.12047554552555084, 0.3486368954181671, 0.0047387536615133286, 0.6465014219284058, 0.9887388944625854, 0.0016635035863146186, 0.9981021881103516, 0.013510559685528278, 0.9862708449363708, 0.0026857545599341393, 0.9856719374656677, 0.009400141425430775, 0.9924080967903137, 0.9946733713150024, 0.9897469878196716, 0.049537550657987595, 0.9288290739059448, 0.021672679111361504, 0.23152561485767365, 0.4994880259037018, 0.006072802934795618, 0.04630511999130249, 0.00910920463502407, 0.024291211739182472, 0.019736608490347862, 0.05237792432308197, 0.08198283612728119, 0.029604913666844368, 0.9905489087104797, 0.016076363623142242, 0.032152727246284485, 0.008038181811571121, 0.9404672980308533, 0.9969877600669861, 0.8351331353187561, 0.03579141944646835, 0.12725839018821716, 0.9407901763916016, 0.05612668767571449, 0.007186023984104395, 0.9844852685928345, 0.12219513952732086, 0.32132795453071594, 0.027154475450515747, 0.5280036926269531, 0.006376359611749649, 0.9934368133544922, 0.049451667815446854, 0.9494720101356506, 0.04700107127428055, 0.6893490552902222, 0.03916756063699722, 0.0019583781249821186, 0.007833512499928474, 0.2134632021188736, 0.019393572583794594, 0.003062143223360181, 0.16433501243591309, 0.7624736428260803, 0.04695286229252815, 0.003062143223360181, 0.024980686604976654, 0.01405163574963808, 0.026541979983448982, 0.01405163574963808, 0.27010366320610046, 0.5214717984199524, 0.11709696799516678, 0.012490343302488327, 0.0858292356133461, 0.15020115673542023, 0.007152436301112175, 0.04470272734761238, 0.7116674184799194, 0.2507072985172272, 0.2215621918439865, 0.014572546817362309, 0.11628297716379166, 0.07137574255466461, 0.06988874822854996, 0.13055811822414398, 0.032119084149599075, 0.041041050106287, 0.051450010389089584, 0.01048524770885706, 0.19528773427009583, 0.12320166081190109, 0.07863935828208923, 0.01179590355604887, 0.14679346978664398, 0.4298951327800751, 0.0013106559636071324, 0.8896311521530151, 0.08087556064128876, 0.008366437628865242, 0.01952168717980385, 0.9776101112365723, 0.99211585521698, 0.9851323962211609, 0.007976780645549297, 0.003988390322774649, 0.9936339855194092, 0.14129090309143066, 0.029137810692191124, 0.45191097259521484, 0.049479302018880844, 0.1335941106081009, 0.01099540013819933, 0.11490193754434586, 0.062124013900756836, 0.007696780376136303, 0.011458919383585453, 0.05500281602144241, 0.5695083141326904, 0.21771948039531708, 0.06989941000938416, 0.010313027538359165, 0.065315842628479, 0.9911519289016724, 0.00985698401927948, 0.062098998576402664, 0.14194056391716003, 0.5105918049812317, 0.18235421180725098, 0.031542349606752396, 0.030556650832295418, 0.031542349606752396, 0.9842240810394287, 0.7061229944229126, 0.005525218788534403, 0.07514297962188721, 0.11934472620487213, 0.07514297962188721, 0.0011050438042730093, 0.018785744905471802, 0.29332059621810913, 0.04784662276506424, 0.10401439666748047, 0.5554368495941162, 0.997512698173523, 0.32539698481559753, 0.5732461214065552, 0.1003560796380043, 0.9919000864028931, 0.9959332346916199, 0.9922512769699097, 0.9963847994804382, 0.9902955293655396, 0.9944120645523071, 0.996181070804596, 0.9942311644554138, 0.11343295127153397, 0.8847770094871521, 0.003028275677934289, 0.47543928027153015, 0.2640656530857086, 0.016352688893675804, 0.004239586181938648, 0.21016234159469604, 0.02604317106306553, 0.10129164159297943, 0.11214431375265121, 0.1175706535577774, 0.0771745815873146, 0.0012058528373017907, 0.19173060357570648, 0.207406684756279, 0.08802726119756699, 0.06813068687915802, 0.035572659224271774, 0.9973658323287964, 0.114595428109169, 0.7639694809913635, 0.12005235254764557, 0.5815345048904419, 0.2825379967689514, 0.013715436682105064, 0.09326496720314026, 0.024687785655260086, 0.004114631097763777, 0.9915576577186584, 0.9918363094329834, 0.9877095818519592, 0.006995587144047022, 0.0029981087427586317, 0.24484555423259735, 0.12192308902740479, 0.2958134114742279, 0.11292876303195953, 0.044971633702516556, 0.12991805374622345, 0.038975413888692856, 0.9953435063362122, 0.9973883628845215, 0.009578458033502102, 0.47481784224510193, 0.06157580018043518, 0.45429256558418274, 0.9948939085006714, 0.9922352433204651, 0.0447232723236084, 0.2554982900619507, 0.08590410649776459, 0.18686357140541077, 0.07749082148075104, 0.13461261987686157, 0.03143913298845291, 0.04250925034284592, 0.11690043658018112, 0.023025844246149063, 0.9796628952026367, 0.767768919467926, 0.20836207270622253, 0.022648051381111145, 0.99672931432724, 0.012705815024673939, 0.9490266442298889, 0.037140075117349625, 0.011915273033082485, 0.013106800615787506, 0.6052958965301514, 0.3467344641685486, 0.010723746381700039, 0.0011915273498743773, 0.010723746381700039, 0.05133536830544472, 0.01480827946215868, 0.20534147322177887, 0.17967379093170166, 0.05429702252149582, 0.14512114226818085, 0.17572490870952606, 0.10299980640411377, 0.04936093091964722, 0.021389735862612724, 0.9927855730056763, 0.005768877454102039, 0.0879753828048706, 0.012979974038898945, 0.015864413231611252, 0.1543174684047699, 0.186046302318573, 0.09518647938966751, 0.015864413231611252, 0.425454705953598, 0.9893773794174194, 0.13153523206710815, 0.002684392500668764, 0.8643743395805359, 0.994407057762146, 0.9892554879188538, 0.03373618796467781, 0.00606493279337883, 0.7467448115348816, 0.015162331983447075, 0.18535950779914856, 0.010992689989507198, 0.0007581165991723537, 0.0011371748987585306, 0.7884163856506348, 0.004198170267045498, 0.19731400907039642, 0.004198170267045498, 0.0058774384669959545, 0.004380349535495043, 0.9943393468856812, 0.99397212266922, 0.03518839552998543, 0.9632822871208191, 0.996552050113678, 0.0027513126842677593, 0.2998930811882019, 0.09079331904649734, 0.6052888035774231, 0.0013756563421338797, 0.0013756563421338797, 0.996784508228302, 0.042793214321136475, 0.06828704476356506, 0.05462963879108429, 0.022762348875403404, 0.07192902266979218, 0.07830248028039932, 0.06464507430791855, 0.18118830025196075, 0.4079012870788574, 0.008194445632398129, 0.9926568269729614, 0.9913457632064819, 0.002587467897683382, 0.007762403693050146, 0.584767758846283, 0.26133424043655396, 0.0008624892798252404, 0.055199313908815384, 0.07331158965826035, 0.013799828477203846, 0.999565839767456, 0.03261076658964157, 0.011646702885627747, 0.016305383294820786, 0.9131014943122864, 0.025622745975852013, 0.006280622910708189, 0.027913879603147507, 0.10188566148281097, 0.2023756206035614, 0.2979806661605835, 0.24494428932666779, 0.03768373653292656, 0.039777278900146484, 0.016748327761888504, 0.025122491642832756, 0.9944507479667664, 0.15898659825325012, 0.8375879526138306, 0.002585147973150015, 0.9929267168045044, 0.9990204572677612, 0.9821109175682068, 0.9942479133605957, 0.014141467399895191, 0.9085893034934998, 0.07424270361661911, 0.989834189414978, 0.9895696043968201, 0.9942163825035095, 0.09427458047866821, 0.6226266026496887, 0.01035984419286251, 0.038331422954797745, 0.228952556848526, 0.004143937490880489, 0.15293754637241364, 0.5817509293556213, 0.06882189959287643, 0.07235122472047806, 0.029411068186163902, 0.0011764427181333303, 0.042940158396959305, 0.04411660134792328, 0.007058656308799982, 0.993468165397644, 0.977222204208374, 0.021785208955407143, 0.9887476563453674, 0.21482254564762115, 0.08933214843273163, 0.10422083735466003, 0.5912937521934509, 0.007280969060957432, 0.5405252575874329, 0.38901177048683167, 0.06275501847267151, 0.12769539654254913, 0.08756255358457565, 0.0583750382065773, 0.11310163140296936, 0.13134382665157318, 0.012161466293036938, 0.08999484777450562, 0.025539077818393707, 0.030403664335608482, 0.3247111439704895, 0.9984502792358398, 0.9873169660568237, 0.03167828917503357, 0.09503486752510071, 0.809556245803833, 0.05983676761388779, 0.01888403482735157, 0.9788225293159485, 0.006505103781819344, 0.9887757897377014, 0.9961590766906738, 0.1199457049369812, 0.306469202041626, 0.2245679497718811, 0.1421383023262024, 0.028533339500427246, 0.031175315380096436, 0.030646920204162598, 0.0544247031211853, 0.028533339500427246, 0.033817291259765625, 0.9652637839317322, 0.03120945394039154, 0.09274733066558838, 0.022713633254170418, 0.054891277104616165, 0.827154815196991, 0.4964466094970703, 0.04393332824110985, 0.03514666110277176, 0.005491666030138731, 0.14717665314674377, 0.03953999653458595, 0.04722832888364792, 0.1021449863910675, 0.04722832888364792, 0.03514666110277176, 0.005432654172182083, 0.6655001640319824, 0.2974378168582916, 0.008148981258273125, 0.021730616688728333, 0.11880787461996078, 0.6471237540245056, 0.23256009817123413, 0.9826817512512207, 0.012131873518228531, 0.03757386654615402, 0.03757386654615402, 0.6821101903915405, 0.12139248847961426, 0.06069624423980713, 0.06069624423980713, 0.7772735953330994, 0.011330518871545792, 0.18582050502300262, 0.022661037743091583, 0.002266103634610772, 0.010306724347174168, 0.020098112523555756, 0.3040483593940735, 0.6652990579605103, 0.9968202114105225, 0.9952912330627441, 0.052468378096818924, 0.9444308280944824, 0.9979932308197021, 0.2475365847349167, 0.07662525027990341, 0.0008545566815882921, 0.08631022274494171, 0.1860084980726242, 0.13103201985359192, 0.15211108326911926, 0.027060961350798607, 0.023357881233096123, 0.06893423944711685, 0.005418404936790466, 0.16616442799568176, 0.012642945162951946, 0.12462332099676132, 0.06140859052538872, 0.6267288327217102, 0.9934369921684265, 0.028500467538833618, 0.17739543318748474, 0.0495428666472435, 0.08203873038291931, 0.06525807827711105, 0.19683967530727386, 0.2426535040140152, 0.04927650839090347, 0.054870057851076126, 0.05380462110042572, 0.0676751434803009, 0.930533230304718, 0.9940144419670105, 0.47860440611839294, 0.06758534908294678, 0.014017703011631966, 0.4390544593334198, 0.9757325649261475, 0.7745398879051208, 0.22468292713165283, 0.0706712082028389, 0.13032031059265137, 0.06418761610984802, 0.1335621029138565, 0.09530888497829437, 0.14523258805274963, 0.18089236319065094, 0.02204423025250435, 0.056407298892736435, 0.10114412009716034, 0.9620084166526794, 0.03390337899327278, 0.9282425045967102, 0.06953127682209015, 0.9822536110877991, 0.07761429250240326, 0.054539769887924194, 0.19927993416786194, 0.018879150971770287, 0.6376957893371582, 0.004195366986095905, 0.006293050479143858, 0.15075059235095978, 0.19674231112003326, 0.261130690574646, 0.06489940732717514, 0.07409775257110596, 0.09811564534902573, 0.012264455668628216, 0.0884062796831131, 0.032194193452596664, 0.020951777696609497, 0.9877375960350037, 0.09006665647029877, 0.9075947999954224, 0.9926806092262268, 0.9876639246940613, 0.9913367033004761, 0.9899704456329346, 0.8912872076034546, 0.10728456825017929, 0.04388415813446045, 0.05119818449020386, 0.8996252417564392, 0.38986071944236755, 0.08291813731193542, 0.0029094084165990353, 0.09746517986059189, 0.06109757721424103, 0.1280139684677124, 0.09019166231155396, 0.050914645195007324, 0.06255228072404861, 0.032730843871831894, 0.06610316783189774, 0.1192731112241745, 0.439729779958725, 0.06538465619087219, 0.14873214066028595, 0.01796281896531582, 0.021555382758378983, 0.05748101696372032, 0.06466614454984665, 0.9845778346061707, 0.016519933938980103, 0.20191030204296112, 0.11013288795948029, 0.6699751019477844, 0.024320492520928383, 0.945024847984314, 0.0034743561409413815, 0.024320492520928383, 0.8505869507789612, 0.1069309338927269, 0.03888397663831711, 0.1204938143491745, 0.0472608245909214, 0.20181649923324585, 0.31720104813575745, 0.05407319590449333, 0.055776290595531464, 0.06727216392755508, 0.032784536480903625, 0.09281855821609497, 0.010644330643117428, 0.9710562825202942, 0.02562905102968216, 0.9893935322761536, 0.02042248845100403, 0.04413892701268196, 0.05138561874628067, 0.18709635734558105, 0.24177591502666473, 0.10870034247636795, 0.09552454948425293, 0.11067671328783035, 0.11001792550086975, 0.030963128432631493, 0.03080737218260765, 0.01760421320796013, 0.04401053115725517, 0.8890127539634705, 0.013203159905970097, 0.9939618110656738, 0.9913746118545532, 0.9991692900657654, 0.0565398707985878, 0.9399753212928772, 0.27267149090766907, 0.003909268882125616, 0.06548024713993073, 0.07329878956079483, 0.01954634301364422, 0.10555025190114975, 0.35867539048194885, 0.023455612361431122, 0.0029319515451788902, 0.07427610456943512, 0.9918331503868103, 0.99335777759552, 0.9937839508056641, 0.9942802786827087, 0.9872105121612549, 0.9916340708732605, 0.1997508704662323, 0.7990034818649292, 0.9793252348899841, 0.011330229230225086, 0.022660458460450172, 0.022660458460450172, 0.07931160181760788, 0.008497672155499458, 0.7307997941970825, 0.12179996073246002, 0.0028325573075562716, 0.009340658783912659, 0.01939982920885086, 0.894547700881958, 0.07041420042514801, 0.005748097784817219, 0.9890444874763489, 0.08462037891149521, 0.058473631739616394, 0.4787231683731079, 0.13738927245140076, 0.04040860757231712, 0.029474513605237007, 0.03422846645116806, 0.062276795506477356, 0.03708083927631378, 0.03708083927631378, 0.005477291997522116, 0.021909167990088463, 0.13419364392757416, 0.6517977118492126, 0.16979604959487915, 0.013693229295313358, 0.9946314096450806, 0.05208856984972954, 0.02996245212852955, 0.4881574809551239, 0.07928525656461716, 0.00046096081496216357, 0.02673572674393654, 0.01428978517651558, 0.23831672966480255, 0.06591739505529404, 0.00507056899368763, 0.041800208389759064, 0.8824488520622253, 0.07431147992610931, 0.989013671875, 0.012954325415194035, 0.818713366985321, 0.05699903145432472, 0.023317785933613777, 0.08679398149251938, 0.03643111512064934, 0.7521953582763672, 0.2014426290988922, 0.010715033859014511, 0.9896851778030396, 0.9900700449943542, 0.01565428450703621, 0.538691520690918, 0.17772217094898224, 0.0570920929312706, 0.1289176344871521, 0.03959612920880318, 0.0018416804959997535, 0.04143780842423439, 0.9562947154045105, 0.034648358821868896, 0.9939988255500793, 0.2003951221704483, 0.7981254458427429, 0.9991390109062195, 0.029498854652047157, 0.030482148751616478, 0.9390468597412109, 0.9947072267532349, 0.9927675127983093, 0.05053260177373886, 0.05053260177373886, 0.862663745880127, 0.03609471768140793, 0.9871604442596436, 0.024649545550346375, 0.10916227102279663, 0.08099136501550674, 0.017606819048523903, 0.7465291023254395, 0.007042727433145046, 0.014085454866290092, 0.999288022518158, 0.029907118529081345, 0.9630091786384583, 0.8654993772506714, 0.109810970723629, 0.023615263402462006, 0.0038585870061069727, 0.949212372303009, 0.04244445636868477, 0.011400483548641205, 0.22331535816192627, 0.06974413245916367, 0.07645030319690704, 0.004023700021207333, 0.14887690544128418, 0.197831928730011, 0.06303796917200089, 0.09522756934165955, 0.10998113453388214, 0.9821317195892334, 0.017413683235645294, 0.9934825897216797, 0.9919980764389038, 0.03944997489452362, 0.9589378833770752, 0.7953603863716125, 0.004642181098461151, 0.010058059357106686, 0.1493234932422638, 0.0007736968691460788, 0.010058059357106686, 0.029400480911135674, 0.997399091720581, 0.9823879599571228, 0.08994246274232864, 0.89942467212677, 0.9825891256332397, 0.0062472145073115826, 0.9912247061729431, 0.9937719106674194, 0.9973540306091309, 0.2906239628791809, 0.7079301476478577, 0.3073142468929291, 0.058261655271053314, 0.00768285570666194, 0.0877126008272171, 0.09987712651491165, 0.12804760038852692, 0.15557783842086792, 0.016646187752485275, 0.05313975363969803, 0.08579189330339432, 0.9963269233703613, 0.9896251559257507, 0.03023815155029297, 0.00403175363317132, 0.9293192028999329, 0.00201587681658566, 0.006047630216926336, 0.028222274035215378, 0.14302490651607513, 0.5369426608085632, 0.00799021776765585, 0.0031960872001945972, 0.1318386048078537, 0.09348555654287338, 0.018377501517534256, 0.005593152716755867, 0.057529572397470474, 0.0015980436000972986, 0.03587299957871437, 0.05188773199915886, 0.5912638902664185, 0.04163830354809761, 0.001281178556382656, 0.1114625334739685, 0.053809501230716705, 0.03202946484088898, 0.005124714225530624, 0.07558953762054443, 0.38828960061073303, 0.2538585662841797, 0.09002076834440231, 0.1578364223241806, 0.02760636992752552, 0.002400553785264492, 0.04260983318090439, 0.03660844638943672, 0.9921504855155945, 0.10637208819389343, 0.12473393231630325, 0.0348241962492466, 0.08104539662599564, 0.24060353636741638, 0.09624141454696655, 0.12283443659543991, 0.09307557344436646, 0.07344739139080048, 0.026593022048473358, 0.08147933334112167, 0.08059046417474747, 0.18221740424633026, 0.13392238318920135, 0.11673765629529953, 0.15347743034362793, 0.17629164457321167, 0.01807359606027603, 0.02844369411468506, 0.029036270454525948, 0.9883785843849182, 0.05343436449766159, 0.9449445605278015, 0.11606968194246292, 0.09041216969490051, 0.040318939834833145, 0.05498037487268448, 0.045206084847450256, 0.03909715637564659, 0.37508833408355713, 0.023213936015963554, 0.053758587688207626, 0.16127575933933258, 0.05763829126954079, 0.6063104867935181, 0.031036002561450005, 0.02438542991876602, 0.19619187712669373, 0.05652986094355583, 0.011084286496043205, 0.016626430675387383, 0.007939115166664124, 0.9884198904037476, 0.9813743829727173, 0.04756461828947067, 0.2102356106042862, 0.602168083190918, 0.0038051693700253963, 0.04756461828947067, 0.03234393894672394, 0.004756461828947067, 0.05327237397432327, 0.9908403158187866, 0.9954898357391357, 0.016417836770415306, 0.5438934564590454, 0.14986537396907806, 0.06061970070004463, 0.11366193741559982, 0.054726120084524155, 0.009261343628168106, 0.05220029875636101, 0.8966226577758789, 0.10018130391836166, 0.030344881117343903, 0.9659786820411682, 0.005181530024856329, 0.9896721839904785, 0.9962543249130249, 0.9940459132194519, 0.9952369332313538, 0.9923298954963684, 0.12975378334522247, 0.027523528784513474, 0.8375016450881958, 0.10295805335044861, 0.37246590852737427, 0.030281780287623405, 0.07684002071619034, 0.06737696379423141, 0.10901441425085068, 0.061320606619119644, 0.10712180286645889, 0.049964938312768936, 0.022711336612701416, 0.05779507756233215, 0.03638949245214462, 0.002140558324754238, 0.006421675439924002, 0.8947533965110779, 0.004667229950428009, 0.03267060965299606, 0.06534121930599213, 0.8961081504821777, 0.9892314672470093, 0.031490132212638855, 0.024223176762461662, 0.030278971418738365, 0.7981536984443665, 0.027856653556227684, 0.029067812487483025, 0.05934678390622139, 0.07341299206018448, 0.09762366116046906, 0.31395769119262695, 0.13511115312576294, 0.0328015498816967, 0.0656030997633934, 0.0015619785990566015, 0.26475536823272705, 0.01640077494084835, 0.9914216995239258, 0.034174300730228424, 0.09113147109746933, 0.8543575406074524, 0.017087150365114212, 0.9908544421195984, 0.08194844424724579, 0.027316147461533546, 0.885043203830719, 0.9932873845100403, 0.9978309273719788, 0.9882381558418274, 0.008702544495463371, 0.0406118743121624, 0.205960214138031, 0.742617130279541, 0.9882000684738159, 0.00920791458338499, 0.05371283367276192, 0.8885637521743774, 0.010742567479610443, 0.029158396646380424, 0.007673262152820826, 0.02076912485063076, 0.9553797245025635, 0.023365264758467674, 0.023188669234514236, 0.04289903864264488, 0.03246413916349411, 0.4672516882419586, 0.2944961190223694, 0.060290541499853134, 0.027826404199004173, 0.05101507529616356, 0.8877236247062683, 0.03228085860610008, 0.07923483103513718, 0.00905559305101633, 0.9870597124099731, 0.01923224702477455, 0.004808061756193638, 0.9736324548721313, 0.0532064363360405, 0.9458922147750854, 0.995581865310669, 0.9951834678649902, 0.9988921284675598, 0.997951328754425, 0.9936944842338562, 0.0076955161057412624, 0.9907976984977722, 0.9962940216064453, 0.002000590320676565, 0.002000590320676565, 0.7685399651527405, 0.22875602543354034, 0.20653143525123596, 0.7855704426765442, 0.006759210489690304, 0.3475077152252197, 0.03489319235086441, 0.11749748140573502, 0.01709054224193096, 0.17589017748832703, 0.010681589134037495, 0.04486267641186714, 0.18585965037345886, 0.012817907147109509, 0.0534079484641552, 0.9960513710975647, 0.990628182888031, 0.04634471610188484, 0.0932580754160881, 0.14557358622550964, 0.2888725697994232, 0.09695428609848022, 0.09581699222326279, 0.07705164700746536, 0.09581699222326279, 0.038667984306812286, 0.021892903372645378, 0.06009669229388237, 0.06688179820775986, 0.13085569441318512, 0.44103217124938965, 0.25686487555503845, 0.043618567287921906, 0.006430213805288076, 0.9902529120445251, 0.9888448715209961, 0.995150625705719, 0.9919627904891968, 0.0993473008275032, 0.038047902286052704, 0.16318322718143463, 0.17163830995559692, 0.03382035717368126, 0.052421554923057556, 0.09258323162794113, 0.2443520873785019, 0.02536526881158352, 0.07905508577823639, 0.04936597868800163, 0.9424414038658142, 0.007479693740606308, 0.9953469634056091, 0.05895381048321724, 0.21876835823059082, 0.016336597502231598, 0.11222532391548157, 0.061794959008693695, 0.24717983603477478, 0.026280615478754044, 0.014205737970769405, 0.1129356175661087, 0.13069278001785278, 0.9944037795066833, 0.9967643618583679, 0.11974797397851944, 0.8787139654159546, 0.004850804340094328, 0.989564061164856, 0.08816681057214737, 0.9062727689743042, 0.004100781865417957, 0.012024378404021263, 0.012024378404021263, 0.07455115020275116, 0.009619503282010555, 0.7070334553718567, 0.007214627228677273, 0.17555592954158783, 0.08572408556938171, 0.08572408556938171, 0.027652930468320847, 0.033183515071868896, 0.7659861445426941, 0.9979050755500793, 0.033542755991220474, 0.8609307408332825, 0.10062827169895172, 0.009946880862116814, 0.9880568385124207, 0.9938191771507263, 0.9970912337303162, 0.38660070300102234, 0.25971636176109314, 0.015530113130807877, 0.02296474203467369, 0.06509430706501007, 0.10193701833486557, 0.014208401553332806, 0.05749446153640747, 0.06030309945344925, 0.016025755554437637, 0.07527867704629898, 0.056459005922079086, 0.1351594477891922, 0.0958092212677002, 0.06843516230583191, 0.03763933852314949, 0.05132636800408363, 0.049615491181612015, 0.42771974205970764, 0.1785009503364563, 0.322469025850296, 0.04134218022227287, 0.0369647741317749, 0.046692345291376114, 0.1381315290927887, 0.027723580598831177, 0.1177036240696907, 0.07538868486881256, 0.015077737160027027, 0.002935288939625025, 0.012719585560262203, 0.22797410190105438, 0.15263502299785614, 0.04305090382695198, 0.13306643068790436, 0.41485416889190674, 0.0117411557585001, 0.9925194382667542, 0.9940184950828552, 0.9845526218414307, 0.0067686294205486774, 0.9916041493415833, 0.9902545213699341, 0.021419459953904152, 0.8906925320625305, 0.08746279031038284, 0.013840502128005028, 0.2886733412742615, 0.6959795355796814, 0.9894405603408813, 0.0154515216127038, 0.035819437354803085, 0.02177259884774685, 0.016856204718351364, 0.013344496488571167, 0.23739156126976013, 0.013344496488571167, 0.6468569040298462, 0.37053295969963074, 0.6289973855018616, 0.997157096862793, 0.9916903972625732, 0.06309398263692856, 0.23159648478031158, 0.09142960608005524, 0.03778082877397537, 0.05516001209616661, 0.10049700736999512, 0.044959187507629395, 0.051759738475084305, 0.19872716069221497, 0.12505455315113068, 0.5734108686447144, 0.11946059763431549, 0.0902591198682785, 0.11680591851472855, 0.09291379898786545, 0.006636700127273798, 0.9915407299995422, 0.7820499539375305, 0.031643640249967575, 0.12431430071592331, 0.06102702021598816, 0.11312844604253769, 0.8551743626594543, 0.028761468827724457, 0.11257651448249817, 0.05992879346013069, 0.0016802465543150902, 0.18146662414073944, 0.20835056900978088, 0.053767889738082886, 0.1893077790737152, 0.044806573539972305, 0.05208764225244522, 0.09633413702249527, 0.98520827293396, 0.1578998863697052, 0.6178691387176514, 0.17963972687721252, 0.044623881578445435, 0.052307017147541046, 0.0018681077053770423, 0.08406484872102737, 0.32598480582237244, 0.04390053078532219, 0.4763674736022949, 0.014944861643016338, 0.021586883813142776, 0.05396721139550209, 0.11872786283493042, 0.8041114211082458, 0.08918504416942596, 0.9111337065696716, 0.992642879486084, 0.9945716857910156, 0.9977501630783081, 0.014667825773358345, 0.1222318783402443, 0.017927341163158417, 0.02770589292049408, 0.23631496727466583, 0.016297584399580956, 0.5655261278152466, 0.09712512791156769, 0.8602511286735535, 0.03700004890561104, 0.05592203140258789, 0.08879926800727844, 0.05991646274924278, 0.43631476163864136, 0.06944164633750916, 0.10846415907144547, 0.016899514943361282, 0.006145277991890907, 0.1428777128458023, 0.015363195911049843, 0.007691915612667799, 0.5176659226417542, 0.26498648524284363, 0.13422392308712006, 0.0703810304403305, 0.004999745171517134, 0.38162606954574585, 0.48754677176475525, 0.11059367656707764, 0.0077882870100438595, 0.01246125902980566, 0.9941399097442627, 0.9962308406829834, 0.05935389921069145, 0.02518044225871563, 0.235616996884346, 0.5917403697967529, 0.05215948820114136, 0.03417345881462097, 0.18873514235019684, 0.0022074286825954914, 0.04635600000619888, 0.04304485768079758, 0.18100914359092712, 0.020970571786165237, 0.5165383219718933, 0.05881161615252495, 0.10455398261547089, 0.2867973744869232, 0.06098982319235802, 0.0762372836470604, 0.007986762560904026, 0.014521386474370956, 0.29115381836891174, 0.07986762374639511, 0.019603872671723366, 0.14539267122745514, 0.03940030187368393, 0.20477059483528137, 0.01609308086335659, 0.001664801500737667, 0.07658086717128754, 0.000554933852981776, 0.4916713833808899, 0.02497202344238758, 0.9953871369361877, 0.9897565841674805, 0.997833251953125, 0.9885253310203552, 0.990960955619812, 0.04804592579603195, 0.3053353428840637, 0.12394455820322037, 0.12046296894550323, 0.09365473687648773, 0.06649834662675858, 0.07102441042661667, 0.0633649155497551, 0.0849507674574852, 0.022978484630584717, 0.9855167269706726, 0.9920024871826172, 0.9905186891555786, 0.9939175248146057, 0.07082290202379227, 0.9248637557029724, 0.05752488970756531, 0.2647901475429535, 0.1321755051612854, 0.1901395171880722, 0.040399160236120224, 0.1036326214671135, 0.04215564206242561, 0.0724550113081932, 0.07552886009216309, 0.02063870057463646, 0.08443162590265274, 0.36705005168914795, 0.031851451843976974, 0.05965827405452728, 0.059152692556381226, 0.11881096661090851, 0.05814153701066971, 0.08948741108179092, 0.10768824070692062, 0.022751037031412125, 0.022309089079499245, 0.9704453945159912, 0.9777593612670898, 0.988647997379303, 0.21923422813415527, 0.7778599262237549, 0.09414855390787125, 0.9040675163269043, 0.06514804810285568, 0.08344806730747223, 0.1372501105070114, 0.21703816950321198, 0.038064029067754745, 0.14420410990715027, 0.09625807404518127, 0.0366000272333622, 0.10870208591222763, 0.0732000544667244, 0.04354304447770119, 0.03197692334651947, 0.2496921420097351, 0.04966628551483154, 0.20206694304943085, 0.000680360069964081, 0.03197692334651947, 0.09865221381187439, 0.23336350917816162, 0.05851096659898758, 0.025808844715356827, 0.011731293052434921, 0.8540381193161011, 0.0023462586104869843, 0.08211904764175415, 0.02111632749438286, 0.9889754056930542, 0.06689330190420151, 0.09980905801057816, 0.13484841585159302, 0.13591021299362183, 0.0658315047621727, 0.006370791234076023, 0.024421365931630135, 0.06052251532673836, 0.3302193284034729, 0.07432589679956436, 0.9910752177238464, 0.9975854754447937, 0.9883419275283813, 0.04155004024505615, 0.9556509256362915, 0.14121027290821075, 0.8573481440544128, 0.9959388971328735, 0.3781931698322296, 0.09959732741117477, 0.006086503155529499, 0.07110141962766647, 0.044542137533426285, 0.15022596716880798, 0.05948173627257347, 0.11647354066371918, 0.014662939123809338, 0.059758394956588745, 0.9975150227546692, 0.18402892351150513, 0.0029210939537733793, 0.09347500652074814, 0.04965859651565552, 0.020447658374905586, 0.0788695365190506, 0.5696133375167847, 0.9938865900039673, 0.2841353714466095, 0.05682707577943802, 0.07019815593957901, 0.46798768639564514, 0.0969403088092804, 0.00501415366306901, 0.018385231494903564, 0.9947482943534851, 0.10640288889408112, 0.03546762838959694, 0.038195908069610596, 0.6002213954925537, 0.2209906131029129, 0.995053231716156, 0.9794116616249084, 0.009374712593853474, 0.007031034678220749, 0.20858736336231232, 0.35780155658721924, 0.003124904353171587, 0.019530652090907097, 0.3788946568965912, 0.015624521300196648, 0.9000885486602783, 0.09724575281143188, 0.9930782318115234, 0.9914439916610718, 0.09694426506757736, 0.31304919719696045, 0.07068853080272675, 0.23933115601539612, 0.27871477603912354, 0.9975038170814514, 0.992777407169342, 0.1509067863225937, 0.8492205142974854, 0.3419284224510193, 0.25229448080062866, 0.0018199783517047763, 0.046181950718164444, 0.0946388766169548, 0.0657467171549797, 0.055964332073926926, 0.040494516491889954, 0.06074177846312523, 0.04026702046394348, 0.009788775816559792, 0.09788775444030762, 0.029366327449679375, 0.8222571611404419, 0.039155103266239166, 0.9927554130554199, 0.01437199953943491, 0.12559878826141357, 0.22620278596878052, 0.058112870901823044, 0.07061026245355606, 0.017496347427368164, 0.07560921460390091, 0.015621739439666271, 0.3499269485473633, 0.047490086406469345, 0.11002861708402634, 0.20538675785064697, 0.07579749077558517, 0.03178604692220688, 0.5745939016342163, 0.32183465361595154, 0.6758527755737305, 0.04023195430636406, 0.04446689784526825, 0.029644599184393883, 0.09105126559734344, 0.5357202291488647, 0.1588103473186493, 0.09952115267515182, 0.21029803156852722, 0.7733006477355957, 0.001655890024267137, 0.013247120194137096, 0.9960846304893494, 0.9994639158248901, 0.9940467476844788, 0.9879651665687561, 0.3193744719028473, 0.6790438294410706, 0.17297442257404327, 0.014766109175980091, 0.8100265264511108, 0.07929543405771255, 0.004719966556876898, 0.9128414988517761, 0.001887986552901566, 0.9900220036506653, 0.009148814715445042, 0.04269447177648544, 0.2155054211616516, 0.07522358745336533, 0.4340604543685913, 0.14231489598751068, 0.0548928901553154, 0.0274464450776577, 0.12139325588941574, 0.029258888214826584, 0.5005137324333191, 0.1269960254430771, 0.03672924265265465, 0.023656122386455536, 0.06785571575164795, 0.041709478944540024, 0.00622529536485672, 0.045444656163454056, 0.9914926290512085, 0.9966533184051514, 0.9305997490882874, 0.06876352429389954, 0.9908766746520996, 0.035966336727142334, 0.9531079530715942, 0.9877041578292847, 0.9908069968223572, 0.11258410662412643, 0.8851439952850342, 0.9980053305625916, 0.995263397693634, 0.014253037050366402, 0.9834595918655396, 0.991935670375824, 0.9887183308601379, 0.02808547578752041, 0.954906165599823, 0.009361824952065945, 0.012288461439311504, 0.038913462311029434, 0.04300961643457413, 0.13312500715255737, 0.06553845852613449, 0.08806730806827545, 0.5345481038093567, 0.08192307502031326, 0.9892112612724304, 0.0012262746458873153, 0.5174878835678101, 0.32312336564064026, 0.04230647534132004, 0.052116669714450836, 0.005518235731869936, 0.03556196391582489, 0.004291960969567299, 0.017780981957912445, 0.05752670019865036, 0.857670783996582, 0.08367519825696945, 0.9361377358436584, 0.06112239509820938, 0.9920046329498291, 0.11347293853759766, 0.09019643813371658, 0.6204642057418823, 0.04364343732595444, 0.0065465159714221954, 0.01454781275242567, 0.038551703095436096, 0.06546515971422195, 0.007273906376212835, 0.0005374159081839025, 0.21496635675430298, 0.028483042493462563, 0.7529196739196777, 0.003224495565518737, 0.051434118300676346, 0.9429588317871094, 0.9488336443901062, 0.044476576149463654, 0.004941842053085566, 0.5825805068016052, 0.09321288019418716, 0.28962573409080505, 0.015535479411482811, 0.01886451058089733, 0.9942586421966553, 0.07540912181138992, 0.0951591283082962, 0.0071818213909864426, 0.025136373937129974, 0.515295684337616, 0.15800006687641144, 0.014363642781972885, 0.021545464172959328, 0.07361366599798203, 0.014363642781972885, 0.9839997291564941, 0.04444682598114014, 0.9259755611419678, 0.029631217941641808, 0.9803986549377441, 0.03679770976305008, 0.08715246617794037, 0.213039368391037, 0.02324065938591957, 0.07553213834762573, 0.5054843425750732, 0.013557050377130508, 0.04454459622502327, 0.016165364533662796, 0.010776909999549389, 0.9645334482192993, 0.25457146763801575, 0.056047629565000534, 0.09533335268497467, 0.08485715836286545, 0.07542858272790909, 0.0790952518582344, 0.19380955398082733, 0.029857147485017776, 0.056571438908576965, 0.07490477710962296, 0.9938823580741882, 0.27106085419654846, 0.05702020227909088, 0.04785112291574478, 0.04240698367357254, 0.06332394480705261, 0.31919851899147034, 0.004011471290141344, 0.12406907975673676, 0.01432668324559927, 0.056733667850494385, 0.08566708862781525, 0.05930798500776291, 0.02416251227259636, 0.7292685508728027, 0.026359103620052338, 0.013179551810026169, 0.008786368183791637, 0.0505216158926487, 0.991389274597168, 0.0069252182729542255, 0.14658378064632416, 0.027700873091816902, 0.14196696877479553, 0.19736872613430023, 0.0819484144449234, 0.29201337695121765, 0.10618668049573898, 0.9818829298019409, 0.9773091077804565, 0.9974721074104309, 0.991992175579071, 0.1665264517068863, 0.16190071403980255, 0.025441542267799377, 0.11217407137155533, 0.016190072521567345, 0.011564336717128754, 0.49957937002182007, 0.005782168358564377, 0.9955350160598755, 0.9916284680366516, 0.989132285118103, 0.9933214783668518, 0.9947446584701538, 0.9944844245910645, 0.23300251364707947, 0.11411284655332565, 0.01326893549412489, 0.058914076536893845, 0.11835891008377075, 0.13640466332435608, 0.058914076536893845, 0.05148347094655037, 0.14808131754398346, 0.06793694943189621, 0.9847082495689392, 0.053800374269485474, 0.8495976328849792, 0.01793345808982849, 0.056042056530714035, 0.022416822612285614, 0.0005919176619499922, 0.029595881700515747, 0.14857132732868195, 0.0017757529858499765, 0.8192140460014343, 0.0007286479230970144, 0.0888950452208519, 0.13552851974964142, 0.1741468608379364, 0.16175983846187592, 0.0029145916923880577, 0.11658366769552231, 0.3133186101913452, 0.0065578315407037735, 0.27614715695381165, 0.19480778276920319, 0.008133936673402786, 0.15861175954341888, 0.06629158556461334, 0.11224832385778427, 0.06303800642490387, 0.04026298597455025, 0.05571746826171875, 0.025215202942490578, 0.9920874834060669, 0.016400950029492378, 0.21936270594596863, 0.21833765506744385, 0.1189068928360939, 0.06970404088497162, 0.0061503564938902855, 0.09225534647703171, 0.25831496715545654, 0.9893152713775635, 0.010923835448920727, 0.024906344711780548, 0.25692862272262573, 0.41729050874710083, 0.03189760074019432, 0.09263412654399872, 0.11972523480653763, 0.02752806432545185, 0.017915090546011925, 0.9877343773841858, 0.9829915761947632, 0.9950519800186157, 0.011209438554942608, 0.25333330035209656, 0.13227137923240662, 0.017935100942850113, 0.05156341567635536, 0.5313273668289185, 0.9887501001358032, 0.11263987421989441, 0.2589215338230133, 0.01922387257218361, 0.10693278908729553, 0.12255217880010605, 0.14748314023017883, 0.10513054579496384, 0.0423525907099247, 0.07779660820960999, 0.006908578798174858, 0.9897759556770325, 0.9859561324119568, 0.9881446361541748, 0.13968577980995178, 0.12965309619903564, 0.05653029680252075, 0.1337047666311264, 0.14470212161540985, 0.09781863540410995, 0.11248178035020828, 0.04726935923099518, 0.06926408410072327, 0.06907114386558533, 0.010668043047189713, 0.06756427139043808, 0.8498874306678772, 0.021336086094379425, 0.04978420212864876, 0.9941994547843933, 0.018543830141425133, 0.0028528969269245863, 0.46074286103248596, 0.04136700555682182, 0.4750073254108429, 0.16668911278247833, 0.8296571969985962, 0.9947404861450195, 0.0642903670668602, 0.4736796021461487, 0.013301455415785313, 0.13375352323055267, 0.05172788351774216, 0.08128667622804642, 0.008128667250275612, 0.04951097443699837, 0.06133449077606201, 0.0635513961315155, 0.9842153787612915, 0.10245499759912491, 0.8282981514930725, 0.049062956124544144, 0.002886056201532483, 0.01587330922484398, 0.998214602470398, 0.9969621896743774, 0.9986305832862854, 0.9919179081916809, 0.038597408682107925, 0.9544086456298828, 0.0035088553559035063, 0.9932376742362976, 0.9932900071144104, 0.03596395254135132, 0.014651980251073837, 0.042623940855264664, 0.06393591314554214, 0.03329995647072792, 0.6793190836906433, 0.08391588926315308, 0.04528793692588806, 0.014020249247550964, 0.972070574760437, 0.009346832521259785, 0.9925262928009033, 0.00552379060536623, 0.9942823648452759, 0.9951925873756409, 0.04679282754659653, 0.8838645219802856, 0.0675896406173706, 0.712087094783783, 0.12702594697475433, 0.05285021290183067, 0.10662762075662613, 0.9875603914260864, 0.9902965426445007, 0.9930481314659119, 0.9881598949432373, 0.020773133262991905, 0.6825457811355591, 0.29379144310951233, 0.0029675904661417007, 0.9970453381538391, 0.003083824645727873, 0.05119149014353752, 0.5261004567146301, 0.3065321743488312, 0.0018502947641536593, 0.03638913109898567, 0.028371186926960945, 0.043173544108867645, 0.003083824645727873, 0.9957663416862488, 0.9857692122459412, 0.021711334586143494, 0.005427833646535873, 0.9458000063896179, 0.025782210752367973, 0.9875295758247375, 0.006672497373074293, 0.007349291816353798, 0.07349291443824768, 0.012861260212957859, 0.22231607139110565, 0.09554079174995422, 0.014698583632707596, 0.5750820636749268, 0.9970065355300903, 0.003268874017521739, 0.9880400896072388, 0.993407666683197, 0.9575022459030151, 0.039282143115997314, 0.9776107668876648, 0.013391928747296333, 0.17330676317214966, 0.11415580660104752, 0.09121408313512802, 0.1843630075454712, 0.10005908459424973, 0.14179643988609314, 0.06937798857688904, 0.04201376065611839, 0.052793607115745544, 0.030404694378376007, 0.08410553634166718, 0.021627137437462807, 0.07689648866653442, 0.06728442758321762, 0.7473377585411072, 0.33522024750709534, 0.6621634364128113, 0.0027590144891291857, 0.04096704348921776, 0.9597993493080139, 0.998680591583252, 0.01381960790604353, 0.31515446305274963, 0.6707565784454346, 0.05501968786120415, 0.14755280315876007, 0.010003579780459404, 0.005001789890229702, 0.782780110836029, 0.04238605871796608, 0.9506587982177734, 0.01251604687422514, 0.007822529412806034, 0.9778161644935608, 0.9944337606430054, 0.1177646666765213, 0.5513187050819397, 0.10501307994127274, 0.06225775554776192, 0.027003364637494087, 0.04050504416227341, 0.01575196161866188, 0.028503550216555595, 0.01575196161866188, 0.036004483699798584, 0.10179449617862701, 0.06227722391486168, 0.09354089200496674, 0.3176388442516327, 0.2118425965309143, 0.047520771622657776, 0.05627460032701492, 0.05527416244149208, 0.05027197673916817, 0.004001749213784933, 0.22780553996562958, 0.1664034128189087, 0.0973714292049408, 0.1500537246465683, 0.10609126091003418, 0.051228996366262436, 0.08029509335756302, 0.011989765800535679, 0.05340895429253578, 0.054862260818481445, 0.009545913897454739, 0.9880020618438721, 0.9944477081298828, 0.9948763847351074, 0.9953917860984802, 0.9885062575340271, 0.9815220236778259, 0.9882037043571472, 0.13010364770889282, 0.032213762402534485, 0.015482583083212376, 0.0389561764895916, 0.21625672280788422, 0.06367836892604828, 0.24472470581531525, 0.04095393046736717, 0.06792359054088593, 0.14983144402503967, 0.9868294596672058, 0.9907128214836121, 0.9910128712654114], \"Term\": [\"accept\", \"accept\", \"accept\", \"accept\", \"accept\", \"accept\", \"accept\", \"accept\", \"accept\", \"access\", \"access\", \"access\", \"access\", \"access\", \"access\", \"adaptec\", \"address\", \"address\", \"address\", \"address\", \"address\", \"address\", \"address\", \"address\", \"address\", \"address\", \"administr\", \"administr\", \"administr\", \"administr\", \"agenc\", \"agenc\", \"agenc\", \"agenc\", \"agenc\", \"aid\", \"aid\", \"aid\", \"aid\", \"alaska\", \"algorithm\", \"algorithm\", \"alomar\", \"amanda\", \"american\", \"american\", \"american\", \"american\", \"american\", \"american\", \"american\", \"american\", \"andrew\", \"andrew\", \"andrew\", \"andrew\", \"andrew\", \"andrew\", \"andrew\", \"andrew\", \"anonym\", \"anonym\", \"anti\", \"anti\", \"anti\", \"appl\", \"appl\", \"appl\", \"applic\", \"applic\", \"applic\", \"applic\", \"applic\", \"arab\", \"arab\", \"archiv\", \"archiv\", \"archiv\", \"archiv\", \"argic\", \"argument\", \"argument\", \"argument\", \"argument\", \"argument\", \"argument\", \"argument\", \"argument\", \"arm\", \"arm\", \"arm\", \"arm\", \"arm\", \"armenia\", \"armenian\", \"armi\", \"armi\", \"armi\", \"armi\", \"armori\", \"atheism\", \"atheist\", \"atho\", \"attack\", \"attack\", \"attack\", \"attack\", \"attack\", \"attack\", \"aurora\", \"author\", \"author\", \"author\", \"author\", \"author\", \"auto\", \"auto\", \"auto\", \"auto\", \"auto\", \"auto\", \"autom\", \"automot\", \"avail\", \"avail\", \"avail\", \"avail\", \"avail\", \"avail\", \"avail\", \"avail\", \"avail\", \"avail\", \"azerbaijan\", \"azerbaijani\", \"azeri\", \"baalk\", \"baerga\", \"ball\", \"ball\", \"ball\", \"bank\", \"bank\", \"bank\", \"bank\", \"bank\", \"bank\", \"bank\", \"bank\", \"bank\", \"basebal\", \"basebal\", \"bat\", \"batf\", \"batf\", \"batteri\", \"batteri\", \"belief\", \"belief\", \"believ\", \"believ\", \"believ\", \"believ\", \"believ\", \"believ\", \"believ\", \"believ\", \"believ\", \"believ\", \"berkeley\", \"berkeley\", \"berkeley\", \"berkeley\", \"best\", \"best\", \"best\", \"best\", \"best\", \"best\", \"best\", \"best\", \"best\", \"best\", \"better\", \"better\", \"better\", \"better\", \"better\", \"better\", \"better\", \"better\", \"better\", \"better\", \"bibl\", \"biblic\", \"bike\", \"bike\", \"billion\", \"billion\", \"binari\", \"binari\", \"bio\", \"blah\", \"blast\", \"board\", \"board\", \"board\", \"board\", \"board\", \"board\", \"board\", \"board\", \"boni\", \"bontchev\", \"book\", \"book\", \"book\", \"book\", \"book\", \"book\", \"book\", \"book\", \"boyl\", \"brake\", \"brake\", \"brave\", \"brave\", \"bruin\", \"build\", \"build\", \"build\", \"build\", \"build\", \"build\", \"build\", \"build\", \"build\", \"build\", \"buy\", \"buy\", \"buy\", \"buy\", \"buy\", \"byte\", \"byte\", \"byte\", \"cach\", \"cactus\", \"cadr\", \"callison\", \"canada\", \"canada\", \"canada\", \"canada\", \"canada\", \"canada\", \"canada\", \"canada\", \"canada\", \"cancer\", \"cancer\", \"candida\", \"canuck\", \"car\", \"car\", \"card\", \"card\", \"card\", \"card\", \"card\", \"carlo\", \"case\", \"case\", \"case\", \"case\", \"case\", \"case\", \"case\", \"case\", \"case\", \"case\", \"catbyt\", \"catcher\", \"cathol\", \"caus\", \"caus\", \"caus\", \"caus\", \"caus\", \"caus\", \"caus\", \"caus\", \"caus\", \"centerlin\", \"centri\", \"char\", \"chastiti\", \"children\", \"children\", \"children\", \"children\", \"children\", \"children\", \"chip\", \"chip\", \"chip\", \"chopin\", \"christ\", \"christ\", \"christian\", \"christian\", \"church\", \"church\", \"church\", \"cica\", \"cipher\", \"ciphertext\", \"circuit\", \"circuit\", \"circuit\", \"claim\", \"claim\", \"claim\", \"claim\", \"claim\", \"claim\", \"claim\", \"claim\", \"claim\", \"claim\", \"clarkson\", \"classifi\", \"classifi\", \"classifi\", \"classifi\", \"clayton\", \"cleveland\", \"cleveland\", \"cleveland\", \"client\", \"client\", \"clinic\", \"clinic\", \"clinton\", \"clinton\", \"clinton\", \"clinton\", \"clipper\", \"clipper\", \"coach\", \"coach\", \"code\", \"code\", \"code\", \"code\", \"code\", \"code\", \"color\", \"color\", \"color\", \"color\", \"color\", \"color\", \"colorado\", \"colorado\", \"colorado\", \"colorado\", \"colorado\", \"colorado\", \"colorado\", \"colorado\", \"columbia\", \"columbia\", \"columbia\", \"columbia\", \"columbia\", \"come\", \"come\", \"come\", \"come\", \"come\", \"come\", \"come\", \"come\", \"come\", \"come\", \"communic\", \"communic\", \"communic\", \"communic\", \"communic\", \"communic\", \"communic\", \"communic\", \"compil\", \"compil\", \"compil\", \"compil\", \"concordia\", \"config\", \"contradict\", \"contradict\", \"contradict\", \"contrib\", \"control\", \"control\", \"control\", \"control\", \"control\", \"control\", \"control\", \"control\", \"control\", \"copi\", \"copi\", \"copi\", \"copi\", \"copi\", \"copi\", \"copi\", \"copper\", \"cost\", \"cost\", \"cost\", \"cost\", \"cost\", \"cost\", \"cost\", \"cost\", \"counterst\", \"countri\", \"countri\", \"countri\", \"countri\", \"countri\", \"countri\", \"countri\", \"court\", \"court\", \"court\", \"court\", \"cramer\", \"crime\", \"crime\", \"crime\", \"crypt\", \"crypto\", \"cryptograph\", \"cryptographi\", \"ctrl\", \"cub\", \"cunixb\", \"cure\", \"cwru\", \"cwru\", \"data\", \"data\", \"data\", \"data\", \"data\", \"data\", \"data\", \"david\", \"david\", \"david\", \"david\", \"david\", \"david\", \"david\", \"david\", \"david\", \"david\", \"davidian\", \"dealer\", \"dealer\", \"dealer\", \"death\", \"death\", \"death\", \"death\", \"death\", \"death\", \"decrypt\", \"den\", \"desi\", \"design\", \"design\", \"design\", \"design\", \"design\", \"design\", \"design\", \"design\", \"design\", \"deskjet\", \"detroit\", \"devic\", \"devic\", \"devic\", \"devic\", \"diamond\", \"diet\", \"differ\", \"differ\", \"differ\", \"differ\", \"differ\", \"differ\", \"differ\", \"differ\", \"differ\", \"differ\", \"dillon\", \"directori\", \"directori\", \"directori\", \"diseas\", \"disk\", \"disk\", \"disk\", \"display\", \"display\", \"display\", \"display\", \"display\", \"display\", \"display\", \"distribut\", \"distribut\", \"distribut\", \"distribut\", \"distribut\", \"distribut\", \"distribut\", \"distribut\", \"distribut\", \"distribut\", \"divin\", \"divis\", \"divis\", \"divis\", \"divis\", \"divis\", \"divis\", \"divis\", \"divis\", \"divis\", \"dock\", \"doctor\", \"doctor\", \"doctor\", \"doctrin\", \"dodger\", \"drive\", \"drive\", \"drive\", \"drive\", \"drive\", \"drive\", \"drive\", \"drive\", \"driver\", \"driver\", \"driver\", \"driver\", \"driver\", \"dseg\", \"dseg\", \"dtmedin\", \"duke\", \"duke\", \"dyer\", \"earth\", \"earth\", \"earth\", \"earth\", \"earth\", \"earth\", \"edmonton\", \"effect\", \"effect\", \"effect\", \"effect\", \"effect\", \"effect\", \"effect\", \"effect\", \"effect\", \"effect\", \"einstein\", \"eisa\", \"email\", \"email\", \"email\", \"email\", \"email\", \"email\", \"email\", \"email\", \"encrypt\", \"enforc\", \"enforc\", \"enforc\", \"enforc\", \"enforc\", \"engin\", \"engin\", \"engin\", \"engin\", \"engin\", \"engin\", \"engin\", \"engin\", \"engin\", \"engin\", \"engr\", \"entri\", \"entri\", \"entri\", \"ericsson\", \"escrow\", \"esdi\", \"espn\", \"etern\", \"etern\", \"etern\", \"ether\", \"ethernet\", \"ethnic\", \"evid\", \"evid\", \"evid\", \"evid\", \"evid\", \"evid\", \"exist\", \"exist\", \"exist\", \"exist\", \"exist\", \"exist\", \"exist\", \"exist\", \"exist\", \"extermin\", \"faith\", \"faith\", \"fbihh\", \"feder\", \"feder\", \"feder\", \"feder\", \"file\", \"file\", \"file\", \"file\", \"final\", \"final\", \"final\", \"final\", \"final\", \"final\", \"final\", \"final\", \"final\", \"final\", \"firearm\", \"fischer\", \"flight\", \"flight\", \"flight\", \"flight\", \"floppi\", \"floppi\", \"flyer\", \"flyer\", \"fnal\", \"follow\", \"follow\", \"follow\", \"follow\", \"follow\", \"follow\", \"follow\", \"follow\", \"follow\", \"follow\", \"font\", \"font\", \"food\", \"food\", \"food\", \"food\", \"forc\", \"forc\", \"forc\", \"forc\", \"forc\", \"forc\", \"forc\", \"forc\", \"forc\", \"forc\", \"format\", \"format\", \"format\", \"format\", \"format\", \"freenet\", \"freenet\", \"freenet\", \"frost\", \"frost\", \"function\", \"function\", \"function\", \"function\", \"function\", \"function\", \"fund\", \"fund\", \"fund\", \"fund\", \"fund\", \"game\", \"game\", \"game\", \"game\", \"gatech\", \"gaza\", \"genet\", \"genet\", \"genocid\", \"go\", \"go\", \"go\", \"go\", \"go\", \"go\", \"go\", \"go\", \"go\", \"go\", \"goal\", \"goal\", \"goal\", \"goal\", \"goal\", \"goal\", \"god\", \"good\", \"good\", \"good\", \"good\", \"good\", \"good\", \"good\", \"good\", \"good\", \"good\", \"gordon\", \"gordon\", \"gospel\", \"govern\", \"govern\", \"govern\", \"govern\", \"gradi\", \"graphic\", \"graphic\", \"great\", \"great\", \"great\", \"great\", \"great\", \"great\", \"great\", \"great\", \"great\", \"great\", \"greec\", \"greec\", \"greek\", \"greek\", \"greenbelt\", \"grind\", \"grind\", \"grind\", \"grind\", \"grind\", \"grind\", \"grind\", \"group\", \"group\", \"group\", \"group\", \"group\", \"group\", \"group\", \"group\", \"group\", \"group\", \"gtoal\", \"gun\", \"gun\", \"halat\", \"hallam\", \"hamburg\", \"handbook\", \"handgun\", \"handgun\", \"handheld\", \"handheld\", \"handheld\", \"happen\", \"happen\", \"happen\", \"happen\", \"happen\", \"happen\", \"happen\", \"happen\", \"happen\", \"happen\", \"hard\", \"hard\", \"hard\", \"hard\", \"hard\", \"hard\", \"hard\", \"hard\", \"hard\", \"harley\", \"health\", \"health\", \"health\", \"health\", \"heaven\", \"heaven\", \"heaven\", \"heaven\", \"helmet\", \"helmet\", \"helmet\", \"help\", \"help\", \"help\", \"help\", \"help\", \"help\", \"help\", \"help\", \"help\", \"help\", \"henri\", \"henri\", \"higgin\", \"high\", \"high\", \"high\", \"high\", \"high\", \"high\", \"high\", \"high\", \"high\", \"high\", \"hit\", \"hit\", \"hit\", \"hit\", \"hit\", \"hitler\", \"hitter\", \"hockey\", \"holi\", \"holi\", \"home\", \"home\", \"home\", \"home\", \"home\", \"home\", \"home\", \"home\", \"home\", \"home\", \"homeopathi\", \"homicid\", \"honda\", \"hulman\", \"husc\", \"hydro\", \"iastat\", \"iastat\", \"ifa\", \"illinoi\", \"illinoi\", \"illinoi\", \"illinoi\", \"illinoi\", \"illinoi\", \"illinoi\", \"illinoi\", \"imag\", \"imag\", \"imag\", \"imag\", \"imag\", \"imak\", \"includ\", \"includ\", \"includ\", \"includ\", \"includ\", \"includ\", \"includ\", \"includ\", \"includ\", \"includ\", \"indiana\", \"indiana\", \"indiana\", \"indiana\", \"indiana\", \"indiana\", \"infect\", \"inform\", \"inform\", \"inform\", \"inform\", \"inform\", \"inform\", \"inform\", \"inform\", \"inform\", \"inform\", \"ingr\", \"ingr\", \"ingr\", \"inning\", \"instal\", \"instal\", \"instal\", \"instal\", \"instal\", \"insur\", \"insur\", \"insur\", \"insur\", \"intellect\", \"intercon\", \"internet\", \"internet\", \"internet\", \"internet\", \"internet\", \"internet\", \"internet\", \"internet\", \"invest\", \"invest\", \"iran\", \"islam\", \"islam\", \"isra\", \"israel\", \"israel\", \"israel\", \"jaeger\", \"jake\", \"jason\", \"jason\", \"jason\", \"jason\", \"jay\", \"jeff\", \"jeff\", \"jeff\", \"jeff\", \"jeff\", \"jeff\", \"jeff\", \"jesus\", \"jet\", \"jet\", \"jew\", \"jew\", \"jew\", \"job\", \"job\", \"job\", \"john\", \"john\", \"john\", \"john\", \"john\", \"john\", \"john\", \"john\", \"john\", \"john\", \"jumper\", \"jumper\", \"kaldi\", \"kelvin\", \"key\", \"key\", \"kill\", \"kill\", \"kill\", \"kill\", \"kill\", \"kill\", \"kill\", \"koresh\", \"lamp\", \"larc\", \"larc\", \"laughter\", \"launch\", \"launch\", \"laurentian\", \"leaf\", \"leagu\", \"leagu\", \"leav\", \"leav\", \"leav\", \"leav\", \"leav\", \"leav\", \"leav\", \"leav\", \"leav\", \"leav\", \"lebanes\", \"lemieux\", \"librari\", \"librari\", \"librari\", \"librari\", \"librari\", \"librari\", \"life\", \"life\", \"life\", \"life\", \"life\", \"life\", \"life\", \"life\", \"life\", \"life\", \"list\", \"list\", \"list\", \"list\", \"list\", \"list\", \"list\", \"list\", \"list\", \"list\", \"live\", \"live\", \"live\", \"live\", \"live\", \"live\", \"live\", \"live\", \"livesey\", \"long\", \"long\", \"long\", \"long\", \"long\", \"long\", \"long\", \"long\", \"long\", \"long\", \"look\", \"look\", \"look\", \"look\", \"look\", \"look\", \"look\", \"look\", \"look\", \"look\", \"lopez\", \"lord\", \"lord\", \"lose\", \"lose\", \"lose\", \"lose\", \"lose\", \"lose\", \"lose\", \"lose\", \"lose\", \"lose\", \"love\", \"love\", \"love\", \"love\", \"love\", \"love\", \"love\", \"love\", \"lunar\", \"lunar\", \"lyme\", \"machin\", \"machin\", \"machin\", \"machin\", \"machin\", \"machin\", \"machin\", \"machin\", \"magellan\", \"magnus\", \"mail\", \"mail\", \"mail\", \"mail\", \"mail\", \"mail\", \"mail\", \"mail\", \"map\", \"map\", \"mar\", \"mar\", \"marriag\", \"marriag\", \"massacr\", \"maxtor\", \"maynard\", \"mccall\", \"mcgill\", \"mcgill\", \"mcgill\", \"mean\", \"mean\", \"mean\", \"mean\", \"mean\", \"mean\", \"mean\", \"mean\", \"mean\", \"mean\", \"medic\", \"medic\", \"medic\", \"medic\", \"medic\", \"medicin\", \"medicin\", \"medicin\", \"medicin\", \"meg\", \"memori\", \"memori\", \"memori\", \"memori\", \"memori\", \"memori\", \"memori\", \"messag\", \"messag\", \"messag\", \"messag\", \"messag\", \"messag\", \"messag\", \"messag\", \"messag\", \"met\", \"metal\", \"metal\", \"metal\", \"metal\", \"methodolog\", \"midway\", \"midway\", \"midway\", \"migrain\", \"militia\", \"mime\", \"mission\", \"mission\", \"mission\", \"mission\", \"mksol\", \"mode\", \"mode\", \"mode\", \"mode\", \"mode\", \"mode\", \"modem\", \"modem\", \"modem\", \"money\", \"money\", \"money\", \"money\", \"money\", \"money\", \"money\", \"money\", \"monitor\", \"monitor\", \"monitor\", \"montreal\", \"montreal\", \"moon\", \"moon\", \"moon\", \"moral\", \"moral\", \"mormon\", \"motherboard\", \"motif\", \"motorcycl\", \"motto\", \"mous\", \"mous\", \"murder\", \"murder\", \"murder\", \"muslim\", \"muslim\", \"nasa\", \"nasa\", \"nasa\", \"nation\", \"nation\", \"nation\", \"nation\", \"nation\", \"nation\", \"nation\", \"nation\", \"nation\", \"nation\", \"nazi\", \"ncsl\", \"need\", \"need\", \"need\", \"need\", \"need\", \"need\", \"need\", \"need\", \"need\", \"need\", \"netcom\", \"netcom\", \"netcom\", \"netcom\", \"netcom\", \"netcom\", \"nist\", \"nist\", \"nore\", \"nsmca\", \"nubus\", \"number\", \"number\", \"number\", \"number\", \"number\", \"number\", \"number\", \"number\", \"number\", \"number\", \"ohio\", \"ohio\", \"ohio\", \"openwindow\", \"opinion\", \"opinion\", \"opinion\", \"opinion\", \"opinion\", \"opinion\", \"opinion\", \"opinion\", \"opinion\", \"opinion\", \"optilink\", \"oracl\", \"orbit\", \"orbit\", \"outlet\", \"outlet\", \"output\", \"output\", \"output\", \"owner\", \"owner\", \"owner\", \"owner\", \"owner\", \"owner\", \"owner\", \"pain\", \"pain\", \"pain\", \"pain\", \"pain\", \"palestinian\", \"patent\", \"patent\", \"patent\", \"patient\", \"patient\", \"pen\", \"penguin\", \"peopl\", \"peopl\", \"peopl\", \"peopl\", \"peopl\", \"peopl\", \"peopl\", \"peopl\", \"peopl\", \"peopl\", \"period\", \"period\", \"period\", \"period\", \"period\", \"period\", \"period\", \"period\", \"period\", \"person\", \"person\", \"person\", \"person\", \"person\", \"person\", \"person\", \"person\", \"person\", \"person\", \"phone\", \"phone\", \"phone\", \"phone\", \"phone\", \"phone\", \"phone\", \"phone\", \"photographi\", \"physician\", \"pistol\", \"pitch\", \"pitch\", \"pitcher\", \"pitt\", \"pitt\", \"pitt\", \"pittsburgh\", \"pittsburgh\", \"pittsburgh\", \"plaintext\", \"play\", \"play\", \"play\", \"play\", \"play\", \"play\", \"play\", \"play\", \"player\", \"player\", \"playoff\", \"plymouth\", \"point\", \"point\", \"point\", \"point\", \"point\", \"point\", \"point\", \"point\", \"point\", \"point\", \"polit\", \"polit\", \"polit\", \"polit\", \"polit\", \"polit\", \"polygon\", \"popul\", \"popul\", \"popul\", \"popul\", \"port\", \"port\", \"port\", \"power\", \"power\", \"power\", \"power\", \"power\", \"power\", \"power\", \"power\", \"power\", \"power\", \"powerbook\", \"presid\", \"presid\", \"presid\", \"presid\", \"price\", \"price\", \"price\", \"price\", \"price\", \"price\", \"price\", \"princeton\", \"princeton\", \"princeton\", \"princeton\", \"printer\", \"printer\", \"prism\", \"prison\", \"privaci\", \"privat\", \"privat\", \"privat\", \"privat\", \"privat\", \"privat\", \"privat\", \"probe\", \"probe\", \"probe\", \"problem\", \"problem\", \"problem\", \"problem\", \"problem\", \"problem\", \"problem\", \"problem\", \"problem\", \"problem\", \"program\", \"program\", \"program\", \"program\", \"program\", \"program\", \"project\", \"project\", \"project\", \"project\", \"project\", \"propheci\", \"prophet\", \"propos\", \"propos\", \"propos\", \"propos\", \"propos\", \"propos\", \"protect\", \"protect\", \"protect\", \"protect\", \"protect\", \"protect\", \"protect\", \"provid\", \"provid\", \"provid\", \"provid\", \"provid\", \"provid\", \"provid\", \"provid\", \"provid\", \"provid\", \"public\", \"public\", \"public\", \"public\", \"public\", \"public\", \"public\", \"public\", \"public\", \"puck\", \"pyron\", \"quadra\", \"qualcomm\", \"quebec\", \"question\", \"question\", \"question\", \"question\", \"question\", \"question\", \"question\", \"question\", \"question\", \"question\", \"quicktim\", \"raider\", \"ramsey\", \"ranck\", \"ranger\", \"ranger\", \"read\", \"read\", \"read\", \"read\", \"read\", \"read\", \"read\", \"read\", \"read\", \"read\", \"reason\", \"reason\", \"reason\", \"reason\", \"reason\", \"reason\", \"reason\", \"reason\", \"reason\", \"reason\", \"recipi\", \"recipi\", \"redesign\", \"reilli\", \"religi\", \"religi\", \"religion\", \"religion\", \"repli\", \"repli\", \"repli\", \"repli\", \"repli\", \"repli\", \"repli\", \"repli\", \"repli\", \"repli\", \"research\", \"research\", \"research\", \"research\", \"research\", \"research\", \"research\", \"research\", \"research\", \"research\", \"resourc\", \"resourc\", \"resourc\", \"resourc\", \"resourc\", \"resourc\", \"restaur\", \"result\", \"result\", \"result\", \"result\", \"result\", \"result\", \"result\", \"result\", \"result\", \"result\", \"resurrect\", \"revel\", \"revolv\", \"rid\", \"rid\", \"ride\", \"ride\", \"rider\", \"right\", \"right\", \"right\", \"right\", \"right\", \"right\", \"right\", \"right\", \"right\", \"right\", \"ripem\", \"risk\", \"risk\", \"risk\", \"risk\", \"risk\", \"risk\", \"risk\", \"rkba\", \"road\", \"road\", \"road\", \"road\", \"road\", \"road\", \"road\", \"robi\", \"rochest\", \"rochest\", \"rochest\", \"rochest\", \"rochest\", \"rocki\", \"rockwel\", \"run\", \"run\", \"run\", \"run\", \"run\", \"run\", \"run\", \"run\", \"rutger\", \"rutger\", \"rwing\", \"sabbath\", \"sale\", \"sale\", \"sale\", \"sale\", \"sale\", \"sandvik\", \"satan\", \"satellit\", \"satellit\", \"say\", \"say\", \"say\", \"say\", \"say\", \"say\", \"say\", \"say\", \"say\", \"say\", \"scheme\", \"scheme\", \"scheme\", \"scheme\", \"scheme\", \"schneider\", \"scienc\", \"scienc\", \"scienc\", \"scienc\", \"scienc\", \"scienc\", \"scienc\", \"scienc\", \"scienc\", \"scienc\", \"scientif\", \"scientif\", \"scientif\", \"scientif\", \"scientif\", \"score\", \"score\", \"scott\", \"scott\", \"scott\", \"scott\", \"scott\", \"scott\", \"scott\", \"screen\", \"screen\", \"screen\", \"screen\", \"scriptur\", \"scsi\", \"sdpa\", \"sdsu\", \"season\", \"season\", \"secret\", \"secret\", \"secret\", \"secur\", \"secur\", \"secur\", \"secur\", \"selann\", \"sell\", \"sell\", \"sell\", \"sell\", \"sell\", \"sell\", \"sell\", \"sell\", \"send\", \"send\", \"send\", \"send\", \"send\", \"send\", \"send\", \"send\", \"send\", \"send\", \"sera\", \"serdar\", \"server\", \"server\", \"shafer\", \"shaft\", \"shaft\", \"shark\", \"shotgun\", \"shuttl\", \"shuttl\", \"simm\", \"sin\", \"skeptic\", \"skeptic\", \"skndiv\", \"slaughter\", \"sleev\", \"sleev\", \"sleev\", \"smith\", \"smith\", \"smith\", \"smith\", \"smith\", \"smith\", \"smith\", \"smith\", \"smuggl\", \"softwar\", \"softwar\", \"softwar\", \"softwar\", \"softwar\", \"softwar\", \"softwar\", \"softwar\", \"softwar\", \"solar\", \"solar\", \"solar\", \"soldier\", \"soldier\", \"solntz\", \"sourc\", \"sourc\", \"sourc\", \"sourc\", \"sourc\", \"sourc\", \"sourc\", \"sourc\", \"sourc\", \"space\", \"space\", \"space\", \"space\", \"space\", \"spacecraft\", \"spacecraft\", \"spec\", \"spec\", \"spec\", \"speed\", \"speed\", \"speed\", \"speed\", \"speed\", \"spencer\", \"spend\", \"spend\", \"spend\", \"spend\", \"spend\", \"spend\", \"spend\", \"spend\", \"spend\", \"spend\", \"sphere\", \"spirit\", \"spirit\", \"spirit\", \"ssto\", \"stanford\", \"stanford\", \"stanford\", \"stanford\", \"stanford\", \"stanford\", \"stanford\", \"stanford\", \"stanley\", \"stanley\", \"stanley\", \"start\", \"start\", \"start\", \"start\", \"start\", \"start\", \"start\", \"start\", \"start\", \"start\", \"starter\", \"state\", \"state\", \"state\", \"state\", \"state\", \"state\", \"state\", \"state\", \"state\", \"state\", \"station\", \"station\", \"station\", \"station\", \"station\", \"station\", \"station\", \"station\", \"sternlight\", \"steve\", \"steve\", \"steve\", \"steve\", \"steve\", \"steve\", \"steve\", \"steve\", \"steveh\", \"stimulus\", \"stratus\", \"strnlght\", \"studi\", \"studi\", \"studi\", \"studi\", \"studi\", \"studi\", \"studi\", \"studi\", \"suno\", \"superstit\", \"surveil\", \"svga\", \"swap\", \"syndrom\", \"take\", \"take\", \"take\", \"take\", \"take\", \"take\", \"take\", \"take\", \"take\", \"take\", \"tampa\", \"teach\", \"teach\", \"teach\", \"teach\", \"teach\", \"team\", \"team\", \"team\", \"team\", \"team\", \"technolog\", \"technolog\", \"technolog\", \"technolog\", \"technolog\", \"technolog\", \"technolog\", \"technolog\", \"technolog\", \"tell\", \"tell\", \"tell\", \"tell\", \"tell\", \"tell\", \"tell\", \"tell\", \"tell\", \"tell\", \"tennesse\", \"test\", \"test\", \"test\", \"test\", \"test\", \"test\", \"test\", \"test\", \"testament\", \"thank\", \"thank\", \"thank\", \"thank\", \"thank\", \"thank\", \"thank\", \"thank\", \"thank\", \"theist\", \"theodor\", \"theolog\", \"theori\", \"theori\", \"theori\", \"theori\", \"theori\", \"theori\", \"therapi\", \"thing\", \"thing\", \"thing\", \"thing\", \"thing\", \"thing\", \"thing\", \"thing\", \"thing\", \"thing\", \"thomasp\", \"tiff\", \"tiger\", \"time\", \"time\", \"time\", \"time\", \"time\", \"time\", \"time\", \"time\", \"time\", \"time\", \"tire\", \"tire\", \"tire\", \"tire\", \"tire\", \"toolkit\", \"toronto\", \"toronto\", \"toronto\", \"toronto\", \"toronto\", \"treatment\", \"treatment\", \"troop\", \"true\", \"true\", \"true\", \"true\", \"true\", \"true\", \"true\", \"true\", \"true\", \"true\", \"trunk\", \"truth\", \"truth\", \"truth\", \"truth\", \"truth\", \"turk\", \"turkey\", \"turkish\", \"ualberta\", \"uchicago\", \"uchicago\", \"uchicago\", \"ucsc\", \"uicvm\", \"uiuc\", \"uiuc\", \"uiuc\", \"uiuc\", \"uiuc\", \"uiuc\", \"uiuc\", \"uiuc\", \"umich\", \"umich\", \"umich\", \"uoknor\", \"upgrad\", \"upgrad\", \"urartu\", \"urbana\", \"urbana\", \"urbana\", \"user\", \"user\", \"user\", \"user\", \"utah\", \"utkvm\", \"uvic\", \"veal\", \"vehicl\", \"vehicl\", \"vehicl\", \"vehicl\", \"vers\", \"version\", \"version\", \"version\", \"version\", \"version\", \"version\", \"version\", \"version\", \"version\", \"vesa\", \"vesselin\", \"video\", \"video\", \"video\", \"video\", \"villag\", \"villag\", \"virginia\", \"virginia\", \"virginia\", \"virginia\", \"virginia\", \"virginia\", \"virginia\", \"visual\", \"visual\", \"volt\", \"vram\", \"waco\", \"waco\", \"wagon\", \"wagon\", \"want\", \"want\", \"want\", \"want\", \"want\", \"want\", \"want\", \"want\", \"want\", \"want\", \"water\", \"water\", \"water\", \"water\", \"water\", \"weapon\", \"weapon\", \"weapon\", \"wheel\", \"wheel\", \"widget\", \"window\", \"window\", \"window\", \"wing\", \"wing\", \"wing\", \"wing\", \"wing\", \"winnipeg\", \"winnipeg\", \"wire\", \"wire\", \"wire\", \"wiretap\", \"word\", \"word\", \"word\", \"word\", \"word\", \"word\", \"word\", \"word\", \"word\", \"word\", \"work\", \"work\", \"work\", \"work\", \"work\", \"work\", \"work\", \"work\", \"work\", \"work\", \"world\", \"world\", \"world\", \"world\", \"world\", \"world\", \"world\", \"world\", \"world\", \"world\", \"worship\", \"worship\", \"xlib\", \"xpert\", \"xterm\", \"xview\", \"yamaha\", \"yanke\", \"year\", \"year\", \"year\", \"year\", \"year\", \"year\", \"year\", \"year\", \"year\", \"year\", \"yeast\", \"zoolog\", \"zuma\"]}, \"R\": 30, \"lambda.step\": 0.01, \"plot.opts\": {\"xlab\": \"PC1\", \"ylab\": \"PC2\"}, \"topic.order\": [3, 1, 8, 9, 2, 4, 7, 10, 5, 6]};\n", "\n", "function LDAvis_load_lib(url, callback){\n", " var s = document.createElement('script');\n", @@ -462,7 +521,7 @@ "if(typeof(LDAvis) !== \"undefined\"){\n", " // already loaded: just create the visualization\n", " !function(LDAvis){\n", - " new LDAvis(\"#\" + \"ldavis_el591011124095238088809029897\", ldavis_el591011124095238088809029897_data);\n", + " new LDAvis(\"#\" + \"ldavis_el155871124265505206097197808\", ldavis_el155871124265505206097197808_data);\n", " }(LDAvis);\n", "}else if(typeof define === \"function\" && define.amd){\n", " // require.js is available: use it to load d3/LDAvis\n", @@ -470,168 +529,118 @@ " require([\"d3\"], function(d3){\n", " window.d3 = d3;\n", " LDAvis_load_lib(\"https://cdn.rawgit.com/bmabey/pyLDAvis/files/ldavis.v1.0.0.js\", function(){\n", - " new LDAvis(\"#\" + \"ldavis_el591011124095238088809029897\", ldavis_el591011124095238088809029897_data);\n", + " new LDAvis(\"#\" + \"ldavis_el155871124265505206097197808\", ldavis_el155871124265505206097197808_data);\n", " });\n", " });\n", "}else{\n", " // require.js not available: dynamically load d3 & LDAvis\n", " LDAvis_load_lib(\"https://cdnjs.cloudflare.com/ajax/libs/d3/3.5.5/d3.min.js\", function(){\n", " LDAvis_load_lib(\"https://cdn.rawgit.com/bmabey/pyLDAvis/files/ldavis.v1.0.0.js\", function(){\n", - " new LDAvis(\"#\" + \"ldavis_el591011124095238088809029897\", ldavis_el591011124095238088809029897_data);\n", + " new LDAvis(\"#\" + \"ldavis_el155871124265505206097197808\", ldavis_el155871124265505206097197808_data);\n", " })\n", " });\n", "}\n", "</script>" ], "text/plain": [ - "PreparedData(topic_coordinates= x y topics cluster Freq\n", - "topic \n", - "2 -0.078669 -0.151706 1 1 13.182505\n", - "0 -0.016999 -0.150447 2 1 12.926197\n", - "7 0.208967 0.080137 3 1 12.463007\n", - "8 0.147446 0.136478 4 1 11.995771\n", - "1 -0.008849 -0.009046 5 1 9.559109\n", - "3 -0.045054 0.003907 6 1 9.468682\n", - "6 -0.089499 0.144727 7 1 8.927140\n", - "9 0.107803 -0.077376 8 1 7.882134\n", - "4 0.004524 -0.105100 9 1 7.024930\n", - "5 -0.229669 0.128426 10 1 6.570525, topic_info= Category Freq Term Total loglift logprob\n", - "1037 Default 2966.000000 window 2966.000000 30.0000 30.0000\n", - "1193 Default 1940.000000 game 1940.000000 29.0000 29.0000\n", - "482 Default 1924.000000 christian 1924.000000 28.0000 28.0000\n", - "702 Default 1689.000000 team 1689.000000 27.0000 27.0000\n", - "352 Default 2638.000000 drive 2638.000000 26.0000 26.0000\n", - "320 Default 2883.000000 file 2883.000000 25.0000 25.0000\n", - "696 Default 1860.000000 space 1860.000000 24.0000 24.0000\n", - "1467 Default 1161.000000 encrypt 1161.000000 23.0000 23.0000\n", - "256 Default 1997.000000 govern 1997.000000 22.0000 22.0000\n", - "153 Default 1477.000000 chip 1477.000000 21.0000 21.0000\n", - "522 Default 1274.000000 jesus 1274.000000 20.0000 20.0000\n", - "1347 Default 1017.000000 israel 1017.000000 19.0000 19.0000\n", - "36 Default 1577.000000 card 1577.000000 18.0000 18.0000\n", - "120 Default 1423.000000 play 1423.000000 17.0000 17.0000\n", - "964 Default 1059.000000 secur 1059.000000 16.0000 16.0000\n", - "657 Default 1331.000000 nasa 1331.000000 15.0000 15.0000\n", - "1821 Default 1142.000000 armenian 1142.000000 14.0000 14.0000\n", - "822 Default 2599.000000 program 2599.000000 13.0000 13.0000\n", - "1346 Default 837.000000 isra 837.000000 12.0000 12.0000\n", - "513 Default 1391.000000 imag 1391.000000 11.0000 11.0000\n", - "117 Default 6052.000000 peopl 6052.000000 10.0000 10.0000\n", - "3565 Default 742.000000 hockey 742.000000 9.0000 9.0000\n", - "739 Default 990.000000 player 990.000000 8.0000 8.0000\n", - "1457 Default 784.000000 clipper 784.000000 7.0000 7.0000\n", - "326 Default 1802.000000 public 1802.000000 6.0000 6.0000\n", - "41 Default 1023.000000 disk 1023.000000 5.0000 5.0000\n", - "28 Default 4004.000000 year 4004.000000 4.0000 4.0000\n", - "380 Default 867.000000 scsi 867.000000 3.0000 3.0000\n", - "879 Default 1191.000000 driver 1191.000000 2.0000 2.0000\n", - "444 Default 747.000000 bike 747.000000 1.0000 1.0000\n", - "... ... ... ... ... ... ...\n", - "5004 Topic10 178.948181 stanley 185.594589 2.6861 -6.0394\n", - "702 Topic10 1384.116455 team 1689.568604 2.5232 -3.9937\n", - "4840 Topic10 160.981583 jet 167.196503 2.6847 -6.1452\n", - "3815 Topic10 191.566772 coach 202.233215 2.6684 -5.9713\n", - "3537 Topic10 221.759384 ranger 240.052933 2.6433 -5.8249\n", - "4877 Topic10 157.258331 winnipeg 165.160721 2.6735 -6.1686\n", - "1193 Topic10 1290.715576 game 1940.664795 2.3147 -4.0636\n", - "120 Topic10 920.770020 play 1423.930298 2.2866 -4.4013\n", - "711 Topic10 312.806488 wing 399.885132 2.4770 -5.4809\n", - "739 Topic10 623.101746 player 990.567200 2.2590 -4.7918\n", - "1311 Topic10 397.739624 columbia 559.283691 2.3817 -5.2407\n", - "1080 Topic10 455.438751 season 670.126038 2.3364 -5.1053\n", - "3252 Topic10 379.943481 leagu 536.827942 2.3769 -5.2865\n", - "1073 Topic10 351.761322 pittsburgh 505.782318 2.3594 -5.3636\n", - "1679 Topic10 356.976562 score 528.273926 2.3306 -5.3488\n", - "1321 Topic10 374.845306 arab 572.500732 2.2991 -5.3000\n", - "3488 Topic10 212.819550 mcgill 254.334839 2.5444 -5.8661\n", - "1475 Topic10 346.644043 goal 553.699341 2.2543 -5.3782\n", - "1150 Topic10 312.806427 virginia 544.289856 2.1687 -5.4809\n", - "1082 Topic10 333.144867 toronto 701.091187 1.9785 -5.4179\n", - "1155 Topic10 336.057953 andrew 868.338135 1.7733 -5.4092\n", - "28 Topic10 600.308960 year 4004.757812 0.8248 -4.8291\n", - "157 Topic10 295.451538 divis 693.417114 1.8694 -5.5380\n", - "2117 Topic10 283.661255 canada 732.439819 1.7740 -5.5787\n", - "2549 Topic10 250.147522 period 584.503235 1.8739 -5.7045\n", - "45 Topic10 267.235901 final 822.295105 1.5986 -5.6384\n", - "171 Topic10 330.680511 point 2646.791748 0.6426 -5.4254\n", - "146 Topic10 358.020264 time 5183.146484 0.0500 -5.3459\n", - "1545 Topic10 262.164948 american 1242.273315 1.1669 -5.6575\n", - "99 Topic10 242.101822 go 3510.730713 0.0484 -5.7372\n", + "<IPython.core.display.HTML object>" + ] + }, + "execution_count": 30, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# Gensim\n", + "p = visualize_topics(model, bow_corpus, dictionary, model_type='gensim')\n", + "p" + ] + }, + { + "cell_type": "code", + "execution_count": 31, + "metadata": { + "collapsed": true + }, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/Users/williamjaubert/anaconda2/envs/nautilus/lib/python3.7/site-packages/pyLDAvis/_prepare.py:223: RuntimeWarning: divide by zero encountered in log\n", + " kernel = (topic_given_term * np.log((topic_given_term.T / topic_proportion).T))\n", + "/Users/williamjaubert/anaconda2/envs/nautilus/lib/python3.7/site-packages/pyLDAvis/_prepare.py:240: RuntimeWarning: divide by zero encountered in log\n", + " log_lift = np.log(topic_term_dists / term_proportion)\n", + "/Users/williamjaubert/anaconda2/envs/nautilus/lib/python3.7/site-packages/pyLDAvis/_prepare.py:241: RuntimeWarning: divide by zero encountered in log\n", + " log_ttd = np.log(topic_term_dists)\n", + "/Users/williamjaubert/anaconda2/envs/nautilus/lib/python3.7/site-packages/pyLDAvis/_prepare.py:257: FutureWarning: Sorting because non-concatenation axis is not aligned. A future version\n", + "of pandas will change to not sort by default.\n", + "\n", + "To accept the future behavior, pass 'sort=False'.\n", + "\n", + "To retain the current behavior and silence the warning, pass 'sort=True'.\n", + "\n", + " return pd.concat([default_term_info] + list(topic_dfs))\n" + ] + }, + { + "data": { + "text/html": [ + "\n", + "<link rel=\"stylesheet\" type=\"text/css\" href=\"https://cdn.rawgit.com/bmabey/pyLDAvis/files/ldavis.v1.0.0.css\">\n", "\n", - "[734 rows x 6 columns], token_table= Topic Freq Term\n", - "term \n", - "338 1 0.145983 accept\n", - "338 2 0.524347 accept\n", - "338 3 0.129101 accept\n", - "338 4 0.049654 accept\n", - "338 5 0.007945 accept\n", - "338 6 0.022841 accept\n", - "338 8 0.066536 accept\n", - "338 9 0.034758 accept\n", - "338 10 0.018869 accept\n", - "73 3 0.403915 access\n", - "73 4 0.196068 access\n", - "73 5 0.171820 access\n", - "73 6 0.033255 access\n", - "73 7 0.000693 access\n", - "73 8 0.193297 access\n", - "2940 4 0.984634 adaptec\n", - "152 1 0.052461 address\n", - "152 2 0.074007 address\n", - "152 3 0.536784 address\n", - "152 4 0.182675 address\n", - "152 5 0.030914 address\n", - "152 6 0.026230 address\n", - "152 7 0.032788 address\n", - "152 8 0.049650 address\n", - "152 9 0.005621 address\n", - "152 10 0.008431 address\n", - "1444 1 0.124112 administr\n", - "1444 3 0.063074 administr\n", - "1444 5 0.197359 administr\n", - "1444 8 0.614458 administr\n", - "... ... ... ...\n", - "182 2 0.166406 world\n", - "182 3 0.097373 world\n", - "182 4 0.150056 world\n", - "182 5 0.106093 world\n", - "182 6 0.051230 world\n", - "182 7 0.080296 world\n", - "182 8 0.011990 world\n", - "182 9 0.053410 world\n", - "182 10 0.054863 world\n", - "4238 1 0.009547 worship\n", - "4238 2 0.988079 worship\n", - "4809 3 0.994707 xlib\n", - "3868 3 0.995135 xpert\n", - "3581 3 0.995652 xterm\n", - "2827 3 0.988763 xview\n", - "6047 6 0.981546 yamaha\n", - "1701 7 0.988053 yanke\n", - "28 1 0.130095 year\n", - "28 2 0.031962 year\n", - "28 3 0.015482 year\n", - "28 4 0.038954 year\n", - "28 5 0.216243 year\n", - "28 6 0.063674 year\n", - "28 7 0.244959 year\n", - "28 8 0.040951 year\n", - "28 9 0.067919 year\n", - "28 10 0.149822 year\n", - "3309 9 0.986879 yeast\n", - "3190 5 0.990640 zoolog\n", - "1894 1 0.991014 zuma\n", "\n", - "[2168 rows x 3 columns], R=30, lambda_step=0.01, plot_opts={'xlab': 'PC1', 'ylab': 'PC2'}, topic_order=[3, 1, 8, 9, 2, 4, 7, 10, 5, 6])" + "<div id=\"ldavis_el15587112430946968420164328\"></div>\n", + "<script type=\"text/javascript\">\n", + "\n", + "var ldavis_el15587112430946968420164328_data = {\"mdsDat\": {\"x\": [-0.11865444229892427, -0.15913644671148153, -0.1021552834840701, -0.1302147807267131, 0.025996119058630945, -0.02613484912760001, -0.04773338510733379, 0.20792709345760607, -0.03261899864327976, 0.38272497358316565], \"y\": [-0.14612969845944368, -0.07809283008476131, -0.21207201799419742, 0.20626190412239923, -0.16846330671503923, 0.13616430604087143, 0.058577567883906, -0.12443061559914777, 0.27343632979353877, 0.05474836101187306], \"topics\": [1, 2, 3, 4, 5, 6, 7, 8, 9, 10], \"cluster\": [1, 1, 1, 1, 1, 1, 1, 1, 1, 1], \"Freq\": [12.365908144728973, 12.10898411608011, 10.931706618523949, 10.925960423580584, 10.198631258133638, 10.029655051537938, 9.063929680129815, 8.785865295646344, 8.485634665680474, 7.103724745958186]}, \"tinfo\": {\"Category\": [\"Default\", \"Default\", \"Default\", \"Default\", \"Default\", \"Default\", \"Default\", \"Default\", \"Default\", \"Default\", \"Default\", \"Default\", \"Default\", \"Default\", \"Default\", \"Default\", \"Default\", \"Default\", \"Default\", \"Default\", \"Default\", \"Default\", \"Default\", \"Default\", \"Default\", \"Default\", \"Default\", \"Default\", \"Default\", \"Default\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\"], \"Freq\": [3333.0, 3298.0, 2707.0, 2823.0, 2140.0, 6405.0, 2581.0, 2822.0, 2058.0, 3159.0, 2052.0, 2604.0, 1636.0, 1640.0, 3593.0, 4267.0, 2355.0, 1604.0, 3488.0, 4034.0, 3489.0, 1446.0, 2179.0, 1501.0, 1476.0, 1456.0, 1929.0, 1778.0, 1780.0, 1776.0, 30.73757280319964, 76.8439320079991, 24.590058242559714, 113.72901937183867, 44.057187684586154, 106.5569190510921, 19.46712944202644, 22.540886722346404, 22.540886722346404, 37.90967312394623, 154.71244977610488, 53.27845952554605, 52.253873765439394, 643.4398573469792, 24.590058242559714, 33.81133008351961, 49.18011648511943, 18.442543681919783, 48.155530725012774, 29.712987043092987, 57.37680256597266, 233.60555330431728, 209.01549506175758, 16.393372161706477, 117.82736241226529, 23.565472482453057, 36.88508736383957, 21.51630096223975, 65.57348864682591, 25.614644002666367, 2052.245277493629, 1269.4617567721452, 918.0288410555626, 810.4473362443639, 806.3489932039372, 751.0213621581779, 653.6857149480458, 585.0384690208999, 570.6942683794067, 406.7605467623419, 343.23622963572933, 324.79368595380953, 303.2773849915698, 290.98235587028995, 286.88401282986337, 284.83484130964996, 282.78566978943667, 276.6381552287968, 261.26936882719696, 249.99892546602376, 241.8022393851705, 207.99090930165093, 196.7204659404777, 196.7204659404777, 194.6712944202644, 190.57295137983778, 187.4991940995178, 343.23622963572933, 472.3340354091678, 704.9150029533785, 510.24370853311405, 339.13788659530275, 831.9636372066037, 2147.5317531835485, 726.4313039156182, 1261.265070691292, 993.8481873034551, 1034.8316177077213, 978.4794009018553, 860.6520384895899, 578.8909544602599, 681.3495304709253, 1115.773892756147, 457.98983476767467, 454.9160774873547, 473.3586211692745, 1823.7626529898455, 595.2843266219664, 705.9395887134851, 674.1774301501788, 1108.6017924354005, 679.300358950712, 920.0780125757759, 944.6680708183357, 728.4804754358315, 741.8000903172181, 753.0705336783913, 757.1688767188178, 683.3987019911388, 21.298748448648094, 100.10411770864603, 92.6495557516192, 44.72737174216099, 41.532559474863774, 288.59804147918163, 38.33774720756657, 42.59749689729619, 42.59749689729619, 26.623435560810115, 27.68837298324252, 506.9102130778246, 48.987121431890614, 96.90930544134882, 25.558498138377708, 69.22093245810629, 85.19499379459238, 281.14347952215485, 48.987121431890614, 63.89624534594427, 97.97424286378123, 280.0785420997224, 25.558498138377708, 96.90930544134882, 57.50662081134985, 35.142934940269356, 129.92236553675335, 25.558498138377708, 21.298748448648094, 88.38980606188957, 1230.0027229094273, 956.3138053442993, 859.4044999029505, 700.7288239605223, 676.2352632445769, 668.7807012875501, 610.2091430537679, 597.4298939845789, 497.325776275933, 436.6243431972859, 420.6502818607998, 405.74115794674617, 453.6633419562044, 310.96172735026215, 291.79285374647884, 290.7279163240465, 282.2084169445872, 256.64991880620954, 460.0529664907988, 201.27317283972448, 201.27317283972448, 190.62379861540043, 185.2991115032384, 169.32505016675233, 157.6107385199959, 156.54580109756347, 669.8456387099825, 197.01342314999485, 481.3517149394469, 448.33865484404237, 604.8844559416058, 486.67640205160893, 569.7415210013365, 832.7810643421404, 925.4306200937597, 1674.08162806374, 593.1701442948493, 635.7676411921456, 521.8193369918782, 715.6379478745758, 439.8191554645831, 1838.0819911183303, 857.2746250580857, 889.2227477310578, 839.1706888767349, 1430.2109583267195, 806.1576287813302, 671.9755135548473, 701.7937613829547, 574.001270691066, 637.8975160370104, 546.3128977078236, 540.9882105956616, 540.9882105956616, 63.83413114755033, 59.43177727530548, 83.64472357265215, 31.917065573775165, 22.01176936122425, 33.01765404183637, 17.6094154889794, 39.62118485020365, 133.17120463540672, 23.112357829285465, 331.277128886425, 147.4788547202025, 241.02887450540555, 569.0042379876469, 45.12412719050971, 20.91118089316304, 19.810592425101824, 27.514711701530313, 30.816477105713954, 45.12412719050971, 97.95237365744792, 25.313534765407887, 34.11824250989759, 414.9218524590771, 23.112357829285465, 57.23060033918305, 227.821812888671, 177.1947433578552, 49.52648106275456, 20.91118089316304, 1476.9897241381473, 1127.0025912946817, 1495.6997280951878, 953.1096133410101, 923.3937247033573, 823.240174109787, 628.4360152629523, 576.7083572640754, 541.4895262861166, 425.9277371396892, 421.5253832674444, 418.22361786326076, 333.4783058225474, 330.17654041836374, 320.2712442058128, 301.5612402487722, 301.5612402487722, 292.7565325042825, 291.65594403622134, 258.63828999438493, 243.23005144152796, 216.81592820805886, 212.41357433581402, 204.70945505938553, 200.3071011871407, 282.85123629173165, 227.821812888671, 364.2947829282613, 569.0042379876469, 721.9860350481554, 468.8506873940765, 464.44833352183167, 321.37183267387405, 521.6789338610147, 392.91008309785286, 591.0160073488711, 516.1759915207086, 2094.4198547204874, 570.1048264557081, 766.009573770604, 942.1037286603978, 545.8918801583615, 507.37128377621895, 802.328993216624, 471.0518643301989, 505.1701068400966, 562.4007071792796, 468.8506873940765, 505.1701068400966, 464.44833352183167, 36.119975512464435, 169.97635535277382, 194.41045643473504, 22.309396640051563, 36.119975512464435, 26.55880552387091, 149.79166315463195, 371.82327733419277, 54.17996326869666, 80.73876879256757, 37.18232773341928, 268.7751119015736, 80.73876879256757, 591.730187071844, 86.05052989734175, 121.10815318885135, 315.51860962358637, 83.92582545543208, 27.621157744825744, 78.61406435065788, 99.86110876975462, 67.99054214110953, 39.30703217532894, 19.122339977187057, 224.1563186214705, 506.742009395457, 80.73876879256757, 49.93055438487731, 27.621157744825744, 32.93291884959993, 3333.6612693562765, 3298.603646064767, 1455.422542708126, 1117.594536444488, 939.1193633240754, 922.121727788798, 1068.7263342805654, 682.030125853005, 678.8430691901405, 659.7207292129534, 648.0348547824502, 571.5454948737021, 542.8619849079214, 538.612576024102, 500.3678960697279, 483.37026053445055, 353.76328957796056, 320.83037072836055, 293.2092129835349, 280.4609863320768, 275.1492252273026, 253.90218080820588, 234.77984083101884, 231.59278416815434, 229.46807972624467, 480.18320387158604, 370.7609251132379, 733.0230324588372, 335.7033018217283, 2319.1148983444077, 904.0617400325657, 1489.4178137786805, 705.4018747140115, 879.6276389506046, 1094.2227875834815, 791.4524046113531, 1100.5969009092105, 653.3466158872244, 499.3055438487731, 619.3513448166697, 846.6947201010047, 985.862861046088, 705.4018747140115, 797.8265179370821, 735.1477369007467, 721.3371580283339, 719.2124535864242, 646.9725025614954, 47.470209668913725, 21.097870963961658, 42.195741927923315, 47.470209668913725, 84.39148385584663, 780.6212256665813, 47.470209668913725, 94.94041933782745, 84.39148385584663, 21.097870963961658, 47.470209668913725, 70.67786772927154, 21.097870963961658, 41.140848379725234, 37.976167735130986, 29.53701934954632, 122.36765159097762, 65.40339998828114, 27.427232253150155, 55.90935805449839, 37.976167735130986, 22.15276451215974, 29.53701934954632, 23.207658060357822, 16.878296771169325, 69.62297418107347, 27.427232253150155, 23.207658060357822, 26.37233870495207, 60.12893224729073, 567.5327289305685, 350.2246580017635, 346.00508380897116, 344.9501902607731, 329.1267870378019, 301.6995547846517, 255.28423866393607, 236.29615479637056, 235.24126124817246, 232.0765806035782, 219.41785802520124, 177.22211609727793, 164.56339351890094, 159.28892577791052, 151.90467094052394, 128.6970128801661, 128.6970128801661, 128.6970128801661, 127.64211933196803, 333.3463612305942, 125.53233223557186, 123.4225451391757, 121.31275804277952, 200.42977415763573, 120.25786449458145, 109.70892901260062, 109.70892901260062, 106.54424836800638, 166.6731806152971, 996.8744030471884, 152.959564488722, 223.63743221799356, 373.43231606212134, 130.80679997656227, 357.6089128391501, 835.4756901728816, 728.9314418048752, 1091.8148223850158, 263.72338704952074, 529.5565611954376, 1969.4862544858206, 622.3871934368689, 1057.003335294479, 2073.920715757431, 608.6735773102938, 950.4590869264728, 486.3059257193162, 789.0603740521659, 1069.6620578728562, 2158.3121996132777, 626.6067676296612, 861.8480288778337, 340.7306160679808, 374.48720961031944, 662.473148268396, 646.6497450454248, 692.0101676179423, 1055.948441746281, 587.5757063463321, 597.0697482801149, 741.5901643832523, 546.434857966607, 418.7927386346389, 486.3059257193162, 585.4659192499361, 475.7569902373354, 21.71707338985634, 47.777561457683944, 42.348293110219856, 66.23707383906184, 82.52487888145409, 65.15122016956902, 28.23219540681324, 41.26243944072704, 55.37853714413366, 31.48975641529169, 24.97463439833479, 82.52487888145409, 60.807805491597755, 48.86341512717676, 32.57561008478451, 55.37853714413366, 62.97951283058338, 45.60585411869831, 32.57561008478451, 80.35317154246846, 55.37853714413366, 221.51414857653464, 115.1004889662386, 30.403902745798877, 18.459512381377888, 80.35317154246846, 27.146341737320423, 17.37365871188507, 39.09073210174141, 32.57561008478451, 859.996106238311, 527.7248833735091, 509.2653709921311, 609.1639085854703, 408.2809797292992, 336.61463754277327, 273.63512471218985, 234.54439261044845, 219.34244123754902, 300.7814664495103, 297.52390544103184, 193.28195316972142, 193.28195316972142, 163.96390409341538, 162.87805042392253, 160.70634308493692, 158.53463574595128, 157.44878207645846, 138.98926969508057, 129.2165866696452, 125.95902566116676, 124.87317199167396, 118.35804997471706, 116.18634263573142, 116.18634263573142, 112.92878162725296, 111.84292795776014, 103.15609860181762, 161.7921967544297, 158.53463574595128, 2288.979535290858, 272.54927104269706, 588.5326888651067, 1488.705380874652, 678.6585434330105, 1814.4614817224972, 533.1541517209731, 260.60488067827606, 639.5678113312691, 560.3004934582935, 921.8897653994015, 1044.5912300520897, 1266.1053786286245, 460.4019558649544, 992.4702539164346, 850.2234232128757, 643.9112260092405, 1258.504402942175, 606.9922012464847, 988.1268392384634, 790.5014713907707, 845.8800085349044, 920.8039117299088, 550.5278104328581, 412.6243944072705, 461.48780953444725, 901.2585456790381, 845.8800085349044, 538.5834200684372, 622.1941526193841, 679.7443971025034, 624.3658599583697, 575.502444831193, 576.5882985006857, 600.4770792295277, 28.132337894656857, 31.37837688250188, 119.02142955431746, 27.050324898708514, 97.38116963535066, 58.42870178121039, 140.66168947328427, 31.37837688250188, 40.034480850088606, 73.57688372448716, 58.42870178121039, 226.14071615320316, 42.19850684198528, 228.30474214509985, 119.02142955431746, 19.47623392707013, 91.97110465560894, 98.46318263129899, 34.624415870346894, 117.93941655836912, 126.59552052595585, 49.77259781362367, 27.050324898708514, 43.280519837933625, 51.93662380552035, 75.74090971638384, 59.51071477715873, 21.640259918966812, 51.93662380552035, 16.230194939225107, 1446.6513755829315, 611.3373427108124, 575.6309138445172, 393.85273052519597, 383.0326005657125, 378.7045485819192, 368.96643161838415, 310.53772983717374, 288.8974699182069, 287.8154569222586, 374.37649659812587, 281.32337894656854, 264.0111710113951, 262.9291580154467, 355.98227566700405, 352.736236679159, 255.3550670438084, 244.53493708432495, 234.7968201207899, 218.5666251815648, 218.5666251815648, 307.2916908493287, 203.41844323828803, 183.94220931121788, 181.77818331932122, 180.69617032337288, 178.5321443314762, 176.3681183395795, 1971.4276786178766, 205.5824692301847, 202.33643024233967, 378.7045485819192, 512.8741600795134, 401.42682149683435, 782.2953960706502, 537.7604589863253, 944.5973454629013, 518.2842250592552, 648.125784573056, 370.0484446143325, 710.8825383380597, 470.67565323752814, 346.244158703469, 824.4939029126356, 505.30006910787506, 556.1546799174471, 498.807991132185, 385.19662655760925, 473.9216922253732, 457.69149728614804, 599.4351997553807, 453.36344530235465, 464.1835752618381, 407.9188994725244, 378.7045485819192, 99.60646984815321, 81.59253381178507, 74.17503073798643, 49.803234924076605, 25.431439110166778, 72.05574414547253, 148.35006147597286, 50.862878220333556, 25.431439110166778, 25.431439110166778, 36.027872072736265, 37.087515368993216, 81.59253381178507, 145.171131587202, 50.862878220333556, 50.862878220333556, 50.862878220333556, 18.013936036368133, 103.84504303318101, 49.803234924076605, 265.9704673604942, 49.803234924076605, 25.431439110166778, 49.803234924076605, 344.38407128350843, 158.94649443854235, 18.013936036368133, 77.35396062675729, 37.087515368993216, 50.862878220333556, 2140.479458439037, 1640.3278226057573, 1604.2999505330208, 1075.5379457008032, 719.4977981584684, 703.6031487146142, 559.4916604236691, 552.0741573498705, 430.2151782803213, 484.2569863894258, 484.2569863894258, 385.7101598375295, 353.92086094982096, 285.0440466931193, 263.8511807679803, 259.61260758295253, 258.5529642866956, 241.5986715465844, 236.30045506529964, 234.18116847278574, 231.0022385840149, 227.82330869524404, 222.5250922139593, 222.5250922139593, 216.1672324364176, 211.9286592513898, 210.86901595513285, 203.45151288133422, 236.30045506529964, 338.0262115059667, 471.54126683434237, 322.1315620621125, 520.284858462162, 406.90302576266845, 565.8495202012108, 351.8015743573071, 334.8472816171959, 292.4615497669179, 340.14549809848063, 1896.761500299939, 452.4676875017172, 540.418081091044, 418.5591020214948, 539.358437794787, 477.89912661188407, 490.61484616696737, 404.78373917015455, 414.32052883646713, 432.3344648728352, 724.7960146397531, 619.8913283103152, 432.3344648728352, 570.0880933862386, 401.6048092813837, 43.839592660341296, 36.53299388361775, 34.445394233125306, 20.875996504924426, 156.5699737869332, 35.489194058371524, 17.744597029185762, 204.58476574825937, 69.93458829149682, 117.949380252823, 108.55518182560702, 22.96359615541687, 56.36519056329595, 75.15358741772793, 31.313994757386638, 39.66439335935641, 124.21217920430034, 73.0659877672355, 66.80318881575816, 79.32878671871282, 61.584189689527065, 27.138795456401756, 32.35779458263286, 25.051195805909312, 136.737777107255, 51.14619143706484, 40.708193184602635, 66.80318881575816, 45.92719231083374, 25.051195805909312, 2707.616746688698, 1636.678125986075, 1022.923828741297, 1186.8004013049535, 737.9664764490785, 591.8345009146075, 434.2207273024281, 427.95792835095074, 370.54893796240856, 367.4175384866699, 358.0233400594539, 330.8845446030522, 265.1251556125402, 257.81855683581665, 252.59955770958555, 246.33675875810826, 243.20535928236959, 242.16155945712336, 230.67976137941488, 216.0665638259678, 192.0591678453047, 186.84016871907363, 184.75256906858118, 177.44597029185763, 171.18317134038028, 169.09557168988783, 154.48237413644074, 236.94256033089226, 1090.7708173823014, 978.0404362557094, 233.8111608551536, 717.0904799441541, 887.2298514592882, 990.566034158664, 502.0677159434325, 904.9744484884739, 515.6371136716333, 678.4698864100438, 397.68773341881035, 596.0097002155924, 374.72413726339346, 1017.7048296150658, 678.4698864100438, 1194.1070000816771, 740.0540760995709, 443.6149257296441, 1695.1309161998636, 494.7611171667089, 1513.509746607021, 638.8054930506875, 516.6809134968795, 631.498894273964, 493.7173173414627, 661.7690892061044, 627.323694972979, 479.10411978801557, 485.3669187394929, 37.704209244169135, 45.03558326386869, 37.704209244169135, 30.37283522446958, 32.467513515812314, 23.041461204770027, 16.757426330741836, 39.79888753551187, 18.852104622084568, 20.9467829134273, 41.8935658268546, 33.51485266148367, 33.51485266148367, 60.74567044893916, 111.01794944116467, 30.37283522446958, 41.8935658268546, 50.272278992225516, 268.1188212918694, 45.03558326386869, 95.30786225609421, 60.74567044893916, 95.30786225609421, 19.899443767755933, 50.272278992225516, 18.852104622084568, 41.8935658268546, 46.08292240954005, 81.69245336236646, 45.03558326386869, 903.8536827143879, 782.3623418165096, 595.9359738870066, 574.9891909735793, 441.977119473316, 433.5984063079451, 423.1250148512314, 413.69896254018914, 384.37346646139093, 352.95329209125, 343.5272397802077, 1052.5758413997216, 298.491656516339, 294.30229993365356, 590.6992781586498, 278.59221274858305, 274.4028561658976, 259.7401081264985, 422.07767570556007, 342.47990063453636, 323.62779601245177, 214.7045248626298, 210.51516827994433, 208.4204899886016, 203.18379426024478, 201.08911596890206, 179.0949939098034, 177.0003156184607, 174.90563732711794, 2571.217602623201, 633.6401831311757, 501.6754507765838, 812.7351770409791, 788.6463766905377, 595.9359738870066, 447.2138152016728, 498.5334333395697, 1280.8957751560793, 488.06004188285607, 479.68132871748514, 1824.4647917595175, 516.3381988159829, 528.9062685640392, 808.5458204582937, 609.5513827807343, 658.7763226272886, 672.3917315210163, 861.9601168875333, 626.3088091114762, 807.4984813126224, 580.2258867019361, 527.8589294183679, 591.7466173043211, 460.82922409540055], \"Term\": [\"file\", \"window\", \"drive\", \"repli\", \"game\", \"peopl\", \"mail\", \"program\", \"space\", \"distribut\", \"christian\", \"believ\", \"card\", \"team\", \"state\", \"year\", \"inform\", \"play\", \"problem\", \"good\", \"thing\", \"nasa\", \"govern\", \"kill\", \"armenian\", \"imag\", \"control\", \"david\", \"version\", \"list\", \"lutheran\", \"okcforum\", \"goddess\", \"luke\", \"virtu\", \"geneva\", \"disobey\", \"communion\", \"crucifi\", \"denomin\", \"divin\", \"meaning\", \"passion\", \"atheist\", \"kinsey\", \"savior\", \"alink\", \"rapist\", \"ksand\", \"conscienc\", \"slaveri\", \"contradict\", \"worship\", \"attest\", \"notion\", \"clearer\", \"heresi\", \"hypothet\", \"infal\", \"kilroy\", \"christian\", \"jesus\", \"moral\", \"bibl\", \"religion\", \"church\", \"faith\", \"christ\", \"belief\", \"homosexu\", \"atheism\", \"evil\", \"koresh\", \"etern\", \"scriptur\", \"sandvik\", \"heaven\", \"cathol\", \"holi\", \"spirit\", \"assert\", \"arrog\", \"assumpt\", \"livesey\", \"biblic\", \"doctrin\", \"marriag\", \"lord\", \"teach\", \"truth\", \"absolut\", \"conclus\", \"evid\", \"believ\", \"argument\", \"exist\", \"claim\", \"word\", \"true\", \"life\", \"natur\", \"accept\", \"reason\", \"islam\", \"keith\", \"definit\", \"peopl\", \"love\", \"human\", \"understand\", \"question\", \"exampl\", \"point\", \"thing\", \"fact\", \"person\", \"differ\", \"read\", \"follow\", \"fiscal\", \"ban\", \"hallam\", \"federalist\", \"dscomsa\", \"regul\", \"secreci\", \"statut\", \"safeguard\", \"passer\", \"partnership\", \"firearm\", \"dorothi\", \"den\", \"bureaucrat\", \"pistol\", \"rwing\", \"agent\", \"myrto\", \"lethal\", \"deficit\", \"crypto\", \"stake\", \"utkvm\", \"tennesse\", \"tenn\", \"republican\", \"halv\", \"evas\", \"tobacco\", \"encrypt\", \"presid\", \"clipper\", \"clinton\", \"legal\", \"drug\", \"gun\", \"health\", \"feder\", \"enforc\", \"congress\", \"amend\", \"escrow\", \"illeg\", \"handgun\", \"job\", \"militia\", \"wiretap\", \"constitut\", \"liberti\", \"libertarian\", \"prohibit\", \"myer\", \"legisl\", \"hamburg\", \"homicid\", \"privat\", \"warrant\", \"insur\", \"agenc\", \"key\", \"court\", \"propos\", \"protect\", \"secur\", \"govern\", \"crime\", \"weapon\", \"administr\", \"hous\", \"secret\", \"state\", \"american\", \"chip\", \"public\", \"peopl\", \"case\", \"control\", \"work\", \"nation\", \"year\", \"consid\", \"issu\", \"provid\", \"disarm\", \"gover\", \"revolut\", \"revok\", \"mein\", \"regret\", \"neccessari\", \"perpetr\", \"gaza\", \"musicb\", \"soldier\", \"ottoman\", \"occupi\", \"muslim\", \"bosnian\", \"thrower\", \"memoir\", \"asham\", \"savag\", \"spanish\", \"baku\", \"mosqu\", \"turkiy\", \"turkey\", \"benevol\", \"depriv\", \"troop\", \"greec\", \"hussein\", \"tranquil\", \"armenian\", \"israel\", \"kill\", \"jew\", \"isra\", \"turkish\", \"arab\", \"murder\", \"greek\", \"armenia\", \"turk\", \"nazi\", \"german\", \"villag\", \"genocid\", \"palestinian\", \"civilian\", \"argic\", \"serdar\", \"bomb\", \"davidian\", \"massacr\", \"azerbaijani\", \"movement\", \"azerbaijan\", \"innoc\", \"territori\", \"armi\", \"jewish\", \"attack\", \"peac\", \"anti\", \"soviet\", \"land\", \"popul\", \"children\", \"histori\", \"peopl\", \"countri\", \"live\", \"world\", \"today\", \"forc\", \"state\", \"human\", \"govern\", \"year\", \"happen\", \"time\", \"fact\", \"photoshop\", \"polygon\", \"xlib\", \"spreadsheet\", \"debug\", \"workgroup\", \"pixmap\", \"bit\", \"callback\", \"dialog\", \"renam\", \"routin\", \"cview\", \"widget\", \"static\", \"viewer\", \"jpeg\", \"gray\", \"xcopyarea\", \"handler\", \"guidelin\", \"reilli\", \"resiz\", \"dutch\", \"patch\", \"librari\", \"melbourn\", \"preview\", \"jade\", \"nearest\", \"file\", \"window\", \"imag\", \"graphic\", \"server\", \"display\", \"applic\", \"screen\", \"output\", \"entri\", \"convert\", \"comp\", \"mous\", \"motif\", \"directori\", \"font\", \"client\", \"compress\", \"default\", \"microsoft\", \"xterm\", \"string\", \"postscript\", \"stream\", \"null\", \"resourc\", \"compil\", \"function\", \"visual\", \"program\", \"code\", \"version\", \"format\", \"color\", \"softwar\", \"manag\", \"avail\", \"packag\", \"section\", \"unix\", \"sourc\", \"includ\", \"user\", \"data\", \"chang\", \"support\", \"work\", \"problem\", \"grip\", \"unsaf\", \"impair\", \"cruiser\", \"coat\", \"bike\", \"fist\", \"muscl\", \"biker\", \"sweat\", \"moto\", \"leather\", \"sysop\", \"bacteria\", \"milk\", \"irrit\", \"hors\", \"piss\", \"dude\", \"carb\", \"dri\", \"grin\", \"cager\", \"windshield\", \"sunni\", \"hadn\", \"tender\", \"niel\", \"liner\", \"stroke\", \"food\", \"pull\", \"motorcycl\", \"pain\", \"ride\", \"drink\", \"rid\", \"wear\", \"rock\", \"rider\", \"accid\", \"truck\", \"weren\", \"eat\", \"gear\", \"candida\", \"tast\", \"steer\", \"flash\", \"wors\", \"revolv\", \"cloth\", \"dog\", \"helmet\", \"gonna\", \"infant\", \"engr\", \"inject\", \"complain\", \"turn\", \"glad\", \"hurt\", \"auto\", \"behanna\", \"couldn\", \"mayb\", \"rememb\", \"littl\", \"lock\", \"wouldn\", \"thing\", \"stop\", \"leav\", \"good\", \"friend\", \"happen\", \"face\", \"hand\", \"start\", \"time\", \"feel\", \"hear\", \"stupid\", \"wasn\", \"caus\", \"cours\", \"long\", \"peopl\", \"probabl\", \"live\", \"problem\", \"tri\", \"coupl\", \"make\", \"work\", \"talk\", \"mauric\", \"roth\", \"marvel\", \"dragon\", \"nore\", \"cryptolog\", \"calendar\", \"diagnosi\", \"bloom\", \"practition\", \"sage\", \"diagnos\", \"dose\", \"artist\", \"reproduct\", \"meyer\", \"protein\", \"frontier\", \"strain\", \"vitamin\", \"subscript\", \"aid\", \"subscrib\", \"bogus\", \"elementari\", \"telnet\", \"launchpad\", \"thai\", \"ieee\", \"bibliographi\", \"network\", \"technic\", \"medic\", \"newsgroup\", \"diseas\", \"patient\", \"medicin\", \"journal\", \"academ\", \"onlin\", \"random\", \"cancer\", \"ripem\", \"clinic\", \"infect\", \"signatur\", \"crypt\", \"santa\", \"symptom\", \"newslett\", \"physician\", \"literatur\", \"introduct\", \"cure\", \"yeast\", \"avenu\", \"syndrom\", \"abstract\", \"patent\", \"annual\", \"mail\", \"treatment\", \"anonym\", \"list\", \"contact\", \"inform\", \"berkeley\", \"topic\", \"request\", \"electron\", \"address\", \"messag\", \"send\", \"associ\", \"servic\", \"internet\", \"receiv\", \"group\", \"comput\", \"research\", \"email\", \"book\", \"public\", \"copi\", \"paper\", \"summari\", \"number\", \"includ\", \"institut\", \"general\", \"news\", \"avail\", \"interest\", \"access\", \"distribut\", \"vulcan\", \"aero\", \"temperatur\", \"talon\", \"toyota\", \"uokmax\", \"uoknor\", \"sunlight\", \"infin\", \"atlas\", \"altitud\", \"detector\", \"axi\", \"ford\", \"venus\", \"dens\", \"fluid\", \"pump\", \"krillean\", \"titan\", \"telescop\", \"porsch\", \"coventri\", \"ukan\", \"diagram\", \"greenbelt\", \"coloni\", \"keen\", \"torqu\", \"madam\", \"nasa\", \"orbit\", \"launch\", \"satellit\", \"moon\", \"rocket\", \"mission\", \"nuclear\", \"surfac\", \"cool\", \"digex\", \"shuttl\", \"lunar\", \"radar\", \"henri\", \"vehicl\", \"cramer\", \"alaska\", \"optilink\", \"probe\", \"brake\", \"flight\", \"solar\", \"honda\", \"spacecraft\", \"dseg\", \"spencer\", \"clayton\", \"space\", \"planet\", \"cycl\", \"mile\", \"water\", \"station\", \"cost\", \"project\", \"engin\", \"earth\", \"design\", \"car\", \"high\", \"model\", \"laboratori\", \"year\", \"center\", \"power\", \"technolog\", \"light\", \"research\", \"access\", \"time\", \"base\", \"work\", \"long\", \"small\", \"hulman\", \"kansa\", \"gibson\", \"hull\", \"richer\", \"gretzki\", \"finland\", \"wong\", \"trivia\", \"dalhousi\", \"kean\", \"koufax\", \"rooki\", \"penguin\", \"crux\", \"panther\", \"roster\", \"slump\", \"lindro\", \"daryl\", \"detroit\", \"bure\", \"burk\", \"marlin\", \"pitch\", \"career\", \"ouch\", \"jagr\", \"mogilni\", \"footbal\", \"game\", \"team\", \"play\", \"player\", \"season\", \"hockey\", \"leagu\", \"score\", \"roger\", \"chicago\", \"basebal\", \"boston\", \"playoff\", \"penalti\", \"leaf\", \"fan\", \"ranger\", \"montreal\", \"upenn\", \"brave\", \"clark\", \"loui\", \"jose\", \"devil\", \"flyer\", \"patrick\", \"minnesota\", \"philadelphia\", \"duke\", \"win\", \"trade\", \"buffalo\", \"goal\", \"blue\", \"divis\", \"gari\", \"wing\", \"offens\", \"sport\", \"year\", \"pick\", \"canada\", \"smith\", \"lose\", \"period\", \"toronto\", \"king\", \"columbia\", \"defens\", \"good\", \"point\", \"final\", \"time\", \"run\", \"apana\", \"init\", \"nctu\", \"intermitt\", \"centri\", \"pinout\", \"bottleneck\", \"jumper\", \"maxtor\", \"watt\", \"scanner\", \"clamp\", \"pentium\", \"powerpc\", \"bernoulli\", \"lemon\", \"svga\", \"mono\", \"uart\", \"esdi\", \"dock\", \"reinstal\", \"ribbon\", \"unplug\", \"vram\", \"seagat\", \"megabyt\", \"baud\", \"laptop\", \"appletalk\", \"drive\", \"card\", \"scsi\", \"driver\", \"video\", \"wire\", \"modem\", \"cabl\", \"simm\", \"upgrad\", \"floppi\", \"circuit\", \"motherboard\", \"boot\", \"batteri\", \"motorola\", \"audio\", \"bio\", \"quadra\", \"brand\", \"connector\", \"backup\", \"outlet\", \"turbo\", \"hook\", \"diamond\", \"voltag\", \"channel\", \"disk\", \"sale\", \"spec\", \"monitor\", \"appl\", \"price\", \"switch\", \"speed\", \"port\", \"instal\", \"printer\", \"board\", \"tape\", \"hard\", \"memori\", \"control\", \"sell\", \"ship\", \"problem\", \"buy\", \"work\", \"sound\", \"connect\", \"machin\", \"mode\", \"chip\", \"power\", \"devic\", \"softwar\", \"brandt\", \"franklin\", \"calstat\", \"bois\", \"hypocrisi\", \"mickey\", \"bmerh\", \"guitar\", \"bigboot\", \"chan\", \"worcest\", \"alexia\", \"robertson\", \"salmon\", \"tamu\", \"pwiseman\", \"teal\", \"rethink\", \"toni\", \"nodak\", \"covington\", \"bailey\", \"freeman\", \"decvax\", \"lynx\", \"wallac\", \"jacob\", \"bcstec\", \"amherst\", \"broward\", \"michael\", \"uiuc\", \"virginia\", \"cwru\", \"austin\", \"utexa\", \"univ\", \"freenet\", \"gordon\", \"andi\", \"illinoi\", \"netcom\", \"gatech\", \"magnus\", \"pitt\", \"uchicago\", \"udel\", \"craig\", \"chris\", \"purdu\", \"william\", \"portal\", \"umich\", \"ingr\", \"prism\", \"urbana\", \"mellon\", \"midway\", \"oracl\", \"repli\", \"ohio\", \"cleveland\", \"andrew\", \"robert\", \"anybodi\", \"texa\", \"bank\", \"david\", \"brian\", \"disclaim\", \"distribut\", \"newsread\", \"mike\", \"news\", \"mark\", \"opinion\", \"john\", \"world\", \"engin\", \"state\", \"hear\", \"scienc\", \"good\", \"phone\"], \"Total\": [3333.0, 3298.0, 2707.0, 2823.0, 2140.0, 6405.0, 2581.0, 2822.0, 2058.0, 3159.0, 2052.0, 2604.0, 1636.0, 1640.0, 3593.0, 4267.0, 2355.0, 1604.0, 3488.0, 4034.0, 3489.0, 1446.0, 2179.0, 1501.0, 1476.0, 1456.0, 1929.0, 1778.0, 1780.0, 1776.0, 30.73757280319964, 76.8439320079991, 24.590058242559714, 113.72901937183867, 44.057187684586154, 106.5569190510921, 19.46712944202644, 22.540886722346404, 22.540886722346404, 37.90967312394623, 154.71244977610488, 53.27845952554605, 52.253873765439394, 643.4398573469792, 24.590058242559714, 33.81133008351961, 49.18011648511943, 18.442543681919783, 48.155530725012774, 29.712987043092987, 57.37680256597266, 233.60555330431728, 209.01549506175758, 16.393372161706477, 117.82736241226529, 23.565472482453057, 36.88508736383957, 21.51630096223975, 65.57348864682591, 25.614644002666367, 2052.245277493629, 1269.4617567721452, 919.0837346037606, 810.4473362443639, 806.3489932039372, 751.0213621581779, 653.6857149480458, 585.0384690208999, 570.6942683794067, 406.7605467623419, 343.23622963572933, 324.79368595380953, 303.2773849915698, 290.98235587028995, 286.88401282986337, 284.83484130964996, 282.78566978943667, 276.6381552287968, 261.26936882719696, 249.99892546602376, 241.8022393851705, 207.99090930165093, 196.7204659404777, 196.7204659404777, 194.6712944202644, 190.57295137983778, 187.4991940995178, 345.3460167321255, 478.81819730483, 742.3350108674597, 531.4579065930175, 348.7223233971944, 917.8095377153783, 2604.38990740705, 857.3151988157011, 1698.5779777396451, 1336.5452315787422, 1446.0498292255654, 1436.3338076857774, 1282.6806697461197, 756.8970964091862, 1010.2050593413377, 2100.1148287454594, 568.0486815737959, 562.9046328794991, 603.1103634085084, 6405.389246929005, 901.1959011968837, 1243.2285268827459, 1144.1851549750884, 3032.568935890614, 1286.188060836125, 2775.479596718089, 3489.8450924448657, 1713.0002250791752, 2074.7512377785656, 2319.905422401006, 2438.9593472862075, 1928.4787576975737, 21.298748448648094, 100.10411770864603, 92.6495557516192, 44.72737174216099, 41.532559474863774, 288.59804147918163, 38.33774720756657, 42.59749689729619, 42.59749689729619, 26.623435560810115, 27.68837298324252, 506.9102130778246, 48.987121431890614, 96.90930544134882, 25.558498138377708, 69.22093245810629, 85.19499379459238, 281.14347952215485, 48.987121431890614, 63.89624534594427, 97.97424286378123, 280.0785420997224, 25.558498138377708, 96.90930544134882, 57.50662081134985, 35.142934940269356, 129.92236553675335, 25.558498138377708, 21.298748448648094, 88.38980606188957, 1230.0027229094273, 956.3138053442993, 859.4044999029505, 700.7288239605223, 676.2352632445769, 668.7807012875501, 610.2091430537679, 598.5157476540718, 497.325776275933, 436.6243431972859, 420.6502818607998, 405.74115794674617, 454.72569417715926, 310.96172735026215, 291.79285374647884, 290.7279163240465, 282.2084169445872, 256.64991880620954, 463.3547318949824, 201.27317283972448, 201.27317283972448, 190.62379861540043, 185.2991115032384, 169.32505016675233, 157.6107385199959, 156.54580109756347, 681.7900290744035, 198.11401161805605, 508.77894719259706, 475.3889797427509, 666.5008847569862, 526.2975869018126, 633.8774953160946, 970.1354923994461, 1102.4209275475444, 2179.2517349038367, 665.8089831868892, 724.9005723065354, 588.2844862609454, 908.240929785288, 494.8485788676437, 3593.617459713399, 1357.8539414854508, 1553.1635442761476, 1842.5187357112345, 6405.389246929005, 2241.690402455026, 1929.840172289862, 4324.247292719088, 1518.7620408754965, 4267.234766619799, 1461.202634943317, 1313.43385799009, 1458.6112633946598, 63.83413114755033, 59.43177727530548, 83.64472357265215, 31.917065573775165, 22.01176936122425, 33.01765404183637, 17.6094154889794, 39.62118485020365, 133.17120463540672, 23.112357829285465, 331.277128886425, 147.4788547202025, 241.02887450540555, 569.0042379876469, 45.12412719050971, 20.91118089316304, 19.810592425101824, 27.514711701530313, 30.816477105713954, 45.12412719050971, 97.95237365744792, 25.313534765407887, 34.11824250989759, 414.9218524590771, 23.112357829285465, 57.23060033918305, 227.821812888671, 177.1947433578552, 49.52648106275456, 20.91118089316304, 1476.9897241381473, 1127.0025912946817, 1501.128996442652, 953.1096133410101, 924.4533679996142, 823.240174109787, 628.4360152629523, 576.7083572640754, 541.4895262861166, 425.9277371396892, 421.5253832674444, 418.22361786326076, 333.4783058225474, 330.17654041836374, 320.2712442058128, 301.5612402487722, 301.5612402487722, 292.7565325042825, 291.65594403622134, 258.63828999438493, 243.23005144152796, 216.81592820805886, 212.41357433581402, 204.70945505938553, 200.3071011871407, 283.93708996122444, 228.87670643686909, 383.41712290544837, 653.0202703163926, 877.2631097856282, 536.4733475611157, 549.141133604708, 352.7502095563759, 680.7348442654207, 465.32582782325636, 844.7676374111895, 696.0003455451144, 6405.389246929005, 949.2225488416441, 1718.6105808077282, 2932.839803794655, 1039.0456410127792, 971.3865951661048, 3593.617459713399, 1243.2285268827459, 2179.2517349038367, 4267.234766619799, 1523.673641718925, 5506.151083820371, 1713.0002250791752, 36.119975512464435, 169.97635535277382, 194.41045643473504, 22.309396640051563, 36.119975512464435, 26.55880552387091, 149.79166315463195, 371.82327733419277, 54.17996326869666, 80.73876879256757, 37.18232773341928, 268.7751119015736, 80.73876879256757, 591.730187071844, 86.05052989734175, 121.10815318885135, 315.51860962358637, 83.92582545543208, 27.621157744825744, 78.61406435065788, 99.86110876975462, 67.99054214110953, 39.30703217532894, 19.122339977187057, 224.1563186214705, 506.742009395457, 80.73876879256757, 49.93055438487731, 27.621157744825744, 32.93291884959993, 3333.6612693562765, 3298.603646064767, 1456.482186004383, 1117.594536444488, 939.1193633240754, 922.121727788798, 1070.8903602724622, 682.030125853005, 678.8430691901405, 659.7207292129534, 648.0348547824502, 571.5454948737021, 542.8619849079214, 538.612576024102, 500.3678960697279, 483.37026053445055, 353.76328957796056, 320.83037072836055, 293.2092129835349, 280.4609863320768, 275.1492252273026, 253.90218080820588, 234.77984083101884, 231.59278416815434, 229.46807972624467, 485.59326885132776, 374.0184861217163, 752.5683985097079, 338.83470129746695, 2822.8348709995626, 1019.0749816552654, 1780.6379650223762, 792.0372602094478, 1036.1976127375378, 1725.094098035012, 1109.5931194572736, 1831.4565031108204, 863.1392881064081, 588.5866260513828, 826.7688106912883, 1385.2945072293742, 2326.9662064128906, 1191.8643186467934, 1728.463843595695, 1627.2683042354015, 1928.2834887179179, 4324.247292719088, 3488.441597101946, 47.470209668913725, 21.097870963961658, 42.195741927923315, 47.470209668913725, 84.39148385584663, 780.6212256665813, 47.470209668913725, 94.94041933782745, 84.39148385584663, 21.097870963961658, 47.470209668913725, 70.67786772927154, 21.097870963961658, 41.140848379725234, 37.976167735130986, 29.53701934954632, 122.36765159097762, 65.40339998828114, 27.427232253150155, 55.90935805449839, 37.976167735130986, 22.15276451215974, 29.53701934954632, 23.207658060357822, 16.878296771169325, 69.62297418107347, 27.427232253150155, 23.207658060357822, 26.37233870495207, 60.12893224729073, 567.5327289305685, 350.2246580017635, 346.00508380897116, 344.9501902607731, 329.1267870378019, 301.6995547846517, 255.28423866393607, 236.29615479637056, 235.24126124817246, 232.0765806035782, 219.41785802520124, 177.22211609727793, 164.56339351890094, 159.28892577791052, 151.90467094052394, 128.6970128801661, 128.6970128801661, 128.6970128801661, 127.64211933196803, 336.64812663477784, 125.53233223557186, 123.4225451391757, 121.31275804277952, 201.45435991774238, 120.25786449458145, 109.70892901260062, 109.70892901260062, 106.54424836800638, 167.69776637540375, 1089.2534655878528, 155.0847387168899, 232.11457858804914, 405.3804387350935, 131.8505998018085, 411.5377477741495, 1081.60047444983, 959.4833310511415, 1555.8412809897586, 301.9680670038949, 701.1989293280624, 3489.8450924448657, 876.1881390534364, 1697.7377027681318, 4034.6354575432615, 862.6662341871505, 1523.673641718925, 653.8797151810995, 1224.2482962279903, 2023.7971917834916, 5506.151083820371, 1036.3234895475994, 1696.1610900280411, 419.5359853279788, 488.92868560606996, 1254.6115846185987, 1456.222590646128, 1734.447294251175, 6405.389246929005, 1562.2626428604092, 1718.6105808077282, 3488.441597101946, 1737.5846886580687, 676.0173373577165, 1509.9466570910924, 4324.247292719088, 1508.9227073731317, 21.71707338985634, 47.777561457683944, 42.348293110219856, 66.23707383906184, 82.52487888145409, 65.15122016956902, 28.23219540681324, 41.26243944072704, 55.37853714413366, 31.48975641529169, 24.97463439833479, 82.52487888145409, 60.807805491597755, 48.86341512717676, 32.57561008478451, 55.37853714413366, 62.97951283058338, 45.60585411869831, 32.57561008478451, 80.35317154246846, 55.37853714413366, 221.51414857653464, 115.1004889662386, 30.403902745798877, 18.459512381377888, 80.35317154246846, 27.146341737320423, 17.37365871188507, 39.09073210174141, 32.57561008478451, 859.996106238311, 527.7248833735091, 509.2653709921311, 611.2886130273799, 408.2809797292992, 336.61463754277327, 273.63512471218985, 234.54439261044845, 219.34244123754902, 301.83635999770837, 298.5862576619867, 193.28195316972142, 193.28195316972142, 163.96390409341538, 162.87805042392253, 160.70634308493692, 158.53463574595128, 157.44878207645846, 138.98926969508057, 129.2165866696452, 125.95902566116676, 124.87317199167396, 118.35804997471706, 116.18634263573142, 116.18634263573142, 112.92878162725296, 111.84292795776014, 103.15609860181762, 162.8571341768621, 159.5784355711975, 2581.187156933169, 285.68032995147706, 654.4011117657841, 1776.3353173096586, 793.100019428761, 2355.472793545131, 613.6747380859157, 281.09659588040915, 776.611247834443, 669.8994751091468, 1182.913021027245, 1367.1037737907961, 1788.147677360813, 550.3960589801403, 1360.0213944348313, 1212.1859776314022, 868.3217502074203, 2014.6830812459746, 815.3342822590118, 1566.3004250978336, 1235.2517250887604, 1442.0485218793074, 1842.5187357112345, 871.3326168026074, 540.7423384562501, 675.7538254495776, 2500.5639745050385, 2326.9662064128906, 995.6046999341991, 1464.7040701507697, 1904.569687666642, 1831.4565031108204, 1500.0196733260323, 1574.4627903106643, 3159.1899532713824, 28.132337894656857, 31.37837688250188, 119.02142955431746, 27.050324898708514, 97.38116963535066, 58.42870178121039, 140.66168947328427, 31.37837688250188, 40.034480850088606, 73.57688372448716, 58.42870178121039, 226.14071615320316, 42.19850684198528, 228.30474214509985, 119.02142955431746, 19.47623392707013, 91.97110465560894, 98.46318263129899, 34.624415870346894, 117.93941655836912, 126.59552052595585, 49.77259781362367, 27.050324898708514, 43.280519837933625, 51.93662380552035, 75.74090971638384, 59.51071477715873, 21.640259918966812, 51.93662380552035, 16.230194939225107, 1446.6513755829315, 611.3373427108124, 575.6309138445172, 393.85273052519597, 383.0326005657125, 378.7045485819192, 368.96643161838415, 310.53772983717374, 288.8974699182069, 287.8154569222586, 375.4238357437972, 281.32337894656854, 264.0111710113951, 262.9291580154467, 357.0828641350653, 353.8011741015914, 255.3550670438084, 244.53493708432495, 234.7968201207899, 218.5666251815648, 218.5666251815648, 308.3775445188215, 203.41844323828803, 183.94220931121788, 181.77818331932122, 180.69617032337288, 178.5321443314762, 176.3681183395795, 2058.540560736173, 206.6474066526171, 203.3987824632945, 400.71631794314345, 561.2240499662522, 472.96507192081316, 1088.4085561021532, 716.9454395220519, 1570.9061545743775, 700.6604903582397, 1084.308126178449, 511.40418007287553, 1598.585672241449, 809.9194175071311, 466.7739160171717, 4267.234766619799, 1389.9895912997056, 1953.8735197924184, 1470.9937055319926, 761.7936232643249, 1566.3004250978336, 1574.4627903106643, 5506.151083820371, 1628.7443907994555, 4324.247292719088, 1734.447294251175, 871.6729157537652, 99.60646984815321, 81.59253381178507, 74.17503073798643, 49.803234924076605, 25.431439110166778, 72.05574414547253, 148.35006147597286, 50.862878220333556, 25.431439110166778, 25.431439110166778, 36.027872072736265, 37.087515368993216, 81.59253381178507, 145.171131587202, 50.862878220333556, 50.862878220333556, 50.862878220333556, 18.013936036368133, 103.84504303318101, 49.803234924076605, 265.9704673604942, 49.803234924076605, 25.431439110166778, 49.803234924076605, 344.38407128350843, 158.94649443854235, 18.013936036368133, 77.35396062675729, 37.087515368993216, 50.862878220333556, 2140.479458439037, 1640.3278226057573, 1604.2999505330208, 1075.5379457008032, 719.4977981584684, 703.6031487146142, 559.4916604236691, 552.0741573498705, 430.2151782803213, 485.3219238118582, 485.3389993853741, 385.7101598375295, 353.92086094982096, 285.0440466931193, 263.8511807679803, 259.61260758295253, 258.5529642866956, 241.5986715465844, 236.30045506529964, 234.18116847278574, 231.0022385840149, 227.82330869524404, 222.5250922139593, 222.5250922139593, 216.1672324364176, 211.9286592513898, 210.86901595513285, 203.45151288133422, 239.60222046948329, 356.08619926219893, 524.7881379559626, 345.69703454456555, 615.378339098852, 460.844311503149, 690.3653248152091, 387.5080032236024, 372.977793084968, 313.760298215566, 384.4510271228001, 4267.234766619799, 578.000019737289, 772.3095195353021, 537.3491720297644, 845.5142246102212, 695.6077443447949, 755.7080301743108, 563.7657261503513, 607.1235050511148, 704.9584450155307, 4034.6354575432615, 2775.479596718089, 868.1125594647388, 5506.151083820371, 1351.0734876601898, 43.839592660341296, 36.53299388361775, 34.445394233125306, 20.875996504924426, 156.5699737869332, 35.489194058371524, 17.744597029185762, 204.58476574825937, 69.93458829149682, 117.949380252823, 108.55518182560702, 22.96359615541687, 56.36519056329595, 75.15358741772793, 31.313994757386638, 39.66439335935641, 124.21217920430034, 73.0659877672355, 66.80318881575816, 79.32878671871282, 61.584189689527065, 27.138795456401756, 32.35779458263286, 25.051195805909312, 136.737777107255, 51.14619143706484, 40.708193184602635, 66.80318881575816, 45.92719231083374, 25.051195805909312, 2707.616746688698, 1636.678125986075, 1022.923828741297, 1189.987457967818, 737.9664764490785, 591.8345009146075, 434.2207273024281, 427.95792835095074, 370.54893796240856, 367.4175384866699, 358.0233400594539, 330.8845446030522, 265.1251556125402, 257.81855683581665, 252.59955770958555, 246.33675875810826, 243.20535928236959, 242.16155945712336, 230.67976137941488, 216.0665638259678, 192.0591678453047, 186.84016871907363, 184.75256906858118, 177.44597029185763, 171.18317134038028, 169.09557168988783, 154.48237413644074, 238.00749775332466, 1113.080214022353, 1003.0150706540443, 234.87351307610842, 740.9792606729961, 934.8468690980148, 1076.121658732719, 526.5018170253937, 1016.3871132208759, 556.006498067917, 766.6686221978332, 425.3088911636361, 736.1222623202239, 419.3429305434966, 1473.4562177179278, 903.6641769301882, 1929.840172289862, 1037.3664188451737, 530.6288336016676, 3488.441597101946, 630.8423848842616, 4324.247292719088, 1019.6588406886142, 722.5935860753691, 1165.1944467816918, 690.2524782181074, 1553.1635442761476, 1953.8735197924184, 781.5463477588185, 1725.094098035012, 37.704209244169135, 45.03558326386869, 37.704209244169135, 30.37283522446958, 32.467513515812314, 23.041461204770027, 16.757426330741836, 39.79888753551187, 18.852104622084568, 20.9467829134273, 41.8935658268546, 33.51485266148367, 33.51485266148367, 60.74567044893916, 111.01794944116467, 30.37283522446958, 41.8935658268546, 50.272278992225516, 268.1188212918694, 45.03558326386869, 95.30786225609421, 60.74567044893916, 95.30786225609421, 19.899443767755933, 50.272278992225516, 18.852104622084568, 41.8935658268546, 46.08292240954005, 81.69245336236646, 45.03558326386869, 903.8536827143879, 782.3623418165096, 595.9359738870066, 574.9891909735793, 441.977119473316, 433.5984063079451, 423.1250148512314, 413.69896254018914, 384.37346646139093, 352.95329209125, 343.5272397802077, 1065.6208202322039, 298.491656516339, 294.30229993365356, 594.9378513436776, 278.59221274858305, 274.4028561658976, 259.7401081264985, 424.20238014746974, 343.53479418273446, 324.71364968194456, 214.7045248626298, 210.51516827994433, 208.4204899886016, 203.18379426024478, 201.08911596890206, 179.0949939098034, 177.0003156184607, 174.90563732711794, 2823.5896720591827, 665.5107497598208, 521.8086734054658, 876.3137748163961, 867.0861909867879, 666.2218437675454, 495.866186848646, 568.3247825277369, 1778.093904298847, 560.1157860283286, 549.5393556014075, 3159.1899532713824, 629.0685799425747, 807.5924554796169, 1904.569687666642, 1239.3680671911266, 1493.5003965369874, 1568.2191563616898, 2932.839803794655, 1570.9061545743775, 3593.617459713399, 1696.1610900280411, 1696.1466678949637, 4034.6354575432615, 1128.3302673231115], \"loglift\": [30.0, 29.0, 28.0, 27.0, 26.0, 25.0, 24.0, 23.0, 22.0, 21.0, 20.0, 19.0, 18.0, 17.0, 16.0, 15.0, 14.0, 13.0, 12.0, 11.0, 10.0, 9.0, 8.0, 7.0, 6.0, 5.0, 4.0, 3.0, 2.0, 1.0, 2.0902, 2.0902, 2.0902, 2.0902, 2.0902, 2.0902, 2.0902, 2.0902, 2.0902, 2.0902, 2.0902, 2.0902, 2.0902, 2.0902, 2.0902, 2.0902, 2.0902, 2.0902, 2.0902, 2.0902, 2.0902, 2.0902, 2.0902, 2.0902, 2.0902, 2.0902, 2.0902, 2.0902, 2.0902, 2.0902, 2.0902, 2.0902, 2.0891, 2.0902, 2.0902, 2.0902, 2.0902, 2.0902, 2.0902, 2.0902, 2.0902, 2.0902, 2.0902, 2.0902, 2.0902, 2.0902, 2.0902, 2.0902, 2.0902, 2.0902, 2.0902, 2.0902, 2.0902, 2.0902, 2.0902, 2.0902, 2.0902, 2.0841, 2.0766, 2.0385, 2.0495, 2.0624, 1.992, 1.8973, 1.9246, 1.7926, 1.794, 1.7556, 1.7064, 1.6912, 1.8221, 1.6964, 1.4578, 1.8749, 1.8772, 1.848, 0.834, 1.6755, 1.5243, 1.5613, 1.0839, 1.4519, 0.9861, 0.7834, 1.2352, 1.0617, 0.9651, 0.9205, 1.0528, 2.1112, 2.1112, 2.1112, 2.1112, 2.1112, 2.1112, 2.1112, 2.1112, 2.1112, 2.1112, 2.1112, 2.1112, 2.1112, 2.1112, 2.1112, 2.1112, 2.1112, 2.1112, 2.1112, 2.1112, 2.1112, 2.1112, 2.1112, 2.1112, 2.1112, 2.1112, 2.1112, 2.1112, 2.1112, 2.1112, 2.1112, 2.1112, 2.1112, 2.1112, 2.1112, 2.1112, 2.1112, 2.1094, 2.1112, 2.1112, 2.1112, 2.1112, 2.1089, 2.1112, 2.1112, 2.1112, 2.1112, 2.1112, 2.1041, 2.1112, 2.1112, 2.1112, 2.1112, 2.1112, 2.1112, 2.1112, 2.0935, 2.1057, 2.0558, 2.0526, 2.0142, 2.033, 2.0045, 1.9586, 1.9362, 1.8475, 1.9957, 1.98, 1.9913, 1.8729, 1.9933, 1.4408, 1.6513, 1.5535, 1.3247, 0.6119, 1.0885, 1.0563, 0.2929, 1.1382, 0.2107, 1.1274, 1.2242, 1.1194, 2.2135, 2.2135, 2.2135, 2.2135, 2.2135, 2.2135, 2.2135, 2.2135, 2.2135, 2.2135, 2.2135, 2.2135, 2.2135, 2.2135, 2.2135, 2.2135, 2.2135, 2.2135, 2.2135, 2.2135, 2.2135, 2.2135, 2.2135, 2.2135, 2.2135, 2.2135, 2.2135, 2.2135, 2.2135, 2.2135, 2.2135, 2.2135, 2.2099, 2.2135, 2.2124, 2.2135, 2.2135, 2.2135, 2.2135, 2.2135, 2.2135, 2.2135, 2.2135, 2.2135, 2.2135, 2.2135, 2.2135, 2.2135, 2.2135, 2.2135, 2.2135, 2.2135, 2.2135, 2.2135, 2.2135, 2.2097, 2.2089, 2.1623, 2.0758, 2.0187, 2.0788, 2.046, 2.1203, 1.9474, 2.0443, 1.8563, 1.9146, 1.0956, 1.7037, 1.4054, 1.0779, 1.5699, 1.564, 0.7141, 1.243, 0.7517, 0.187, 1.0349, -0.1752, 0.9084, 2.214, 2.214, 2.214, 2.214, 2.214, 2.214, 2.214, 2.214, 2.214, 2.214, 2.214, 2.214, 2.214, 2.214, 2.214, 2.214, 2.214, 2.214, 2.214, 2.214, 2.214, 2.214, 2.214, 2.214, 2.214, 2.214, 2.214, 2.214, 2.214, 2.214, 2.214, 2.214, 2.2133, 2.214, 2.214, 2.214, 2.212, 2.214, 2.214, 2.214, 2.214, 2.214, 2.214, 2.214, 2.214, 2.214, 2.214, 2.214, 2.214, 2.214, 2.214, 2.214, 2.214, 2.214, 2.214, 2.2028, 2.2053, 2.1877, 2.2047, 2.0175, 2.0943, 2.0354, 2.0982, 2.0502, 1.7588, 1.8761, 1.7048, 1.9356, 2.0495, 1.9252, 1.7217, 1.3552, 1.6895, 1.4409, 1.4194, 1.2307, 0.4202, 0.5291, 2.2829, 2.2829, 2.2829, 2.2829, 2.2829, 2.2829, 2.2829, 2.2829, 2.2829, 2.2829, 2.2829, 2.2829, 2.2829, 2.2829, 2.2829, 2.2829, 2.2829, 2.2829, 2.2829, 2.2829, 2.2829, 2.2829, 2.2829, 2.2829, 2.2829, 2.2829, 2.2829, 2.2829, 2.2829, 2.2829, 2.2829, 2.2829, 2.2829, 2.2829, 2.2829, 2.2829, 2.2829, 2.2829, 2.2829, 2.2829, 2.2829, 2.2829, 2.2829, 2.2829, 2.2829, 2.2829, 2.2829, 2.2829, 2.2829, 2.2731, 2.2829, 2.2829, 2.2829, 2.2778, 2.2829, 2.2829, 2.2829, 2.2829, 2.2768, 2.1943, 2.2691, 2.2457, 2.2008, 2.275, 2.1425, 2.0247, 2.0081, 1.9287, 2.1475, 2.0022, 1.7108, 1.9409, 1.8091, 1.6174, 1.9342, 1.811, 1.9868, 1.8437, 1.6453, 1.3464, 1.7798, 1.6059, 2.0749, 2.0163, 1.6443, 1.4711, 1.3641, 0.4802, 1.305, 1.2257, 0.7345, 1.1261, 1.8041, 1.1499, 0.2833, 1.1287, 2.2996, 2.2996, 2.2996, 2.2996, 2.2996, 2.2996, 2.2996, 2.2996, 2.2996, 2.2996, 2.2996, 2.2996, 2.2996, 2.2996, 2.2996, 2.2996, 2.2996, 2.2996, 2.2996, 2.2996, 2.2996, 2.2996, 2.2996, 2.2996, 2.2996, 2.2996, 2.2996, 2.2996, 2.2996, 2.2996, 2.2996, 2.2996, 2.2996, 2.2961, 2.2996, 2.2996, 2.2996, 2.2996, 2.2996, 2.2961, 2.2961, 2.2996, 2.2996, 2.2996, 2.2996, 2.2996, 2.2996, 2.2996, 2.2996, 2.2996, 2.2996, 2.2996, 2.2996, 2.2996, 2.2996, 2.2996, 2.2996, 2.2996, 2.2931, 2.2931, 2.1795, 2.2526, 2.1935, 2.123, 2.1438, 2.0387, 2.159, 2.2239, 2.1055, 2.121, 2.0503, 2.0306, 1.9544, 2.1211, 1.9846, 1.9449, 2.0006, 1.8291, 2.0045, 1.839, 1.8533, 1.7662, 1.606, 1.8405, 2.0292, 1.9183, 1.2791, 1.2877, 1.6852, 1.4435, 1.2693, 1.2235, 1.3416, 1.2951, 0.6393, 2.4009, 2.4009, 2.4009, 2.4009, 2.4009, 2.4009, 2.4009, 2.4009, 2.4009, 2.4009, 2.4009, 2.4009, 2.4009, 2.4009, 2.4009, 2.4009, 2.4009, 2.4009, 2.4009, 2.4009, 2.4009, 2.4009, 2.4009, 2.4009, 2.4009, 2.4009, 2.4009, 2.4009, 2.4009, 2.4009, 2.4009, 2.4009, 2.4009, 2.4009, 2.4009, 2.4009, 2.4009, 2.4009, 2.4009, 2.4009, 2.3981, 2.4009, 2.4009, 2.4009, 2.3978, 2.3979, 2.4009, 2.4009, 2.4009, 2.4009, 2.4009, 2.3973, 2.4009, 2.4009, 2.4009, 2.4009, 2.4009, 2.4009, 2.3576, 2.3957, 2.3956, 2.3444, 2.3108, 2.2369, 2.0706, 2.1133, 1.8922, 2.0994, 1.8863, 2.0773, 1.5905, 1.8581, 2.1022, 0.7569, 1.389, 1.1443, 1.3194, 1.7189, 1.2054, 1.1654, 0.1832, 1.122, 0.1692, 0.9535, 1.5672, 2.432, 2.432, 2.432, 2.432, 2.432, 2.432, 2.432, 2.432, 2.432, 2.432, 2.432, 2.432, 2.432, 2.432, 2.432, 2.432, 2.432, 2.432, 2.432, 2.432, 2.432, 2.432, 2.432, 2.432, 2.432, 2.432, 2.432, 2.432, 2.432, 2.432, 2.432, 2.432, 2.432, 2.432, 2.432, 2.432, 2.432, 2.432, 2.432, 2.4298, 2.4298, 2.432, 2.432, 2.432, 2.432, 2.432, 2.432, 2.432, 2.432, 2.432, 2.432, 2.432, 2.432, 2.432, 2.432, 2.432, 2.432, 2.432, 2.4181, 2.38, 2.325, 2.3614, 2.2642, 2.3075, 2.2331, 2.3354, 2.3242, 2.3617, 2.3096, 1.6212, 2.1872, 2.075, 2.1822, 1.9825, 2.0566, 2.0, 2.1007, 2.0499, 1.9431, 0.7152, 0.933, 1.7349, 0.1642, 1.2188, 2.4668, 2.4668, 2.4668, 2.4668, 2.4668, 2.4668, 2.4668, 2.4668, 2.4668, 2.4668, 2.4668, 2.4668, 2.4668, 2.4668, 2.4668, 2.4668, 2.4668, 2.4668, 2.4668, 2.4668, 2.4668, 2.4668, 2.4668, 2.4668, 2.4668, 2.4668, 2.4668, 2.4668, 2.4668, 2.4668, 2.4668, 2.4668, 2.4668, 2.4641, 2.4668, 2.4668, 2.4668, 2.4668, 2.4668, 2.4668, 2.4668, 2.4668, 2.4668, 2.4668, 2.4668, 2.4668, 2.4668, 2.4668, 2.4668, 2.4668, 2.4668, 2.4668, 2.4668, 2.4668, 2.4668, 2.4668, 2.4668, 2.4623, 2.4465, 2.4416, 2.4623, 2.434, 2.4145, 2.384, 2.4193, 2.3507, 2.3914, 2.3446, 2.3996, 2.2557, 2.3543, 2.0967, 2.1802, 1.9868, 2.1291, 2.2877, 1.7451, 2.2238, 1.417, 1.9992, 2.1314, 1.8542, 2.1317, 1.6137, 1.3307, 1.9774, 1.1987, 2.6446, 2.6446, 2.6446, 2.6446, 2.6446, 2.6446, 2.6446, 2.6446, 2.6446, 2.6446, 2.6446, 2.6446, 2.6446, 2.6446, 2.6446, 2.6446, 2.6446, 2.6446, 2.6446, 2.6446, 2.6446, 2.6446, 2.6446, 2.6446, 2.6446, 2.6446, 2.6446, 2.6446, 2.6446, 2.6446, 2.6446, 2.6446, 2.6446, 2.6446, 2.6446, 2.6446, 2.6446, 2.6446, 2.6446, 2.6446, 2.6446, 2.6322, 2.6446, 2.6446, 2.6374, 2.6446, 2.6446, 2.6446, 2.6395, 2.6415, 2.6412, 2.6446, 2.6446, 2.6446, 2.6446, 2.6446, 2.6446, 2.6446, 2.6446, 2.5509, 2.5955, 2.6052, 2.5692, 2.5497, 2.5331, 2.5413, 2.5135, 2.3166, 2.5068, 2.5086, 2.0955, 2.4471, 2.2213, 1.7878, 1.9349, 1.8261, 1.7977, 1.42, 1.725, 1.1516, 1.5718, 1.4773, 0.725, 1.7491], \"logprob\": [30.0, 29.0, 28.0, 27.0, 26.0, 25.0, 24.0, 23.0, 22.0, 21.0, 20.0, 19.0, 18.0, 17.0, 16.0, 15.0, 14.0, 13.0, 12.0, 11.0, 10.0, 9.0, 8.0, 7.0, 6.0, 5.0, 4.0, 3.0, 2.0, 1.0, -8.4334, -7.5171, -8.6565, -7.125, -8.0734, -7.1902, -8.8901, -8.7435, -8.7435, -8.2236, -6.8173, -7.8833, -7.9027, -5.392, -8.6565, -8.3381, -7.9634, -8.9442, -7.9844, -8.4673, -7.8092, -6.4052, -6.5164, -9.062, -7.0896, -8.6991, -8.251, -8.79, -7.6757, -8.6157, -4.2322, -4.7125, -5.0366, -5.1613, -5.1663, -5.2374, -5.3762, -5.4872, -5.512, -5.8506, -6.0204, -6.0757, -6.1442, -6.1856, -6.1998, -6.2069, -6.2142, -6.2361, -6.2933, -6.3374, -6.3707, -6.5214, -6.5771, -6.5771, -6.5875, -6.6088, -6.6251, -6.0204, -5.7012, -5.3008, -5.624, -6.0324, -5.1351, -4.1868, -5.2707, -4.719, -4.9573, -4.9169, -4.9729, -5.1012, -5.4977, -5.3348, -4.8416, -5.732, -5.7387, -5.699, -4.3502, -5.4698, -5.2993, -5.3454, -4.848, -5.3378, -5.0344, -5.008, -5.2679, -5.2498, -5.2347, -5.2293, -5.3318, -8.7792, -7.2316, -7.309, -8.0373, -8.1114, -6.1728, -8.1914, -8.0861, -8.0861, -8.5561, -8.5168, -5.6095, -7.9463, -7.2641, -8.5969, -7.6006, -7.3929, -6.199, -7.9463, -7.6806, -7.2532, -6.2028, -8.5969, -7.2641, -7.786, -8.2784, -6.9709, -8.5969, -8.7792, -7.3561, -4.7231, -4.9748, -5.0816, -5.2857, -5.3213, -5.3324, -5.4241, -5.4452, -5.6286, -5.7588, -5.7961, -5.8321, -5.7205, -6.0982, -6.1618, -6.1655, -6.1952, -6.2901, -5.7065, -6.5332, -6.5332, -6.5876, -6.6159, -6.706, -6.7777, -6.7845, -5.3308, -6.5546, -5.6613, -5.7323, -5.4328, -5.6503, -5.4927, -5.1131, -5.0076, -4.4148, -5.4524, -5.383, -5.5805, -5.2647, -5.7515, -4.3214, -5.0841, -5.0475, -5.1054, -4.5723, -5.1456, -5.3276, -5.2842, -5.4852, -5.3797, -5.5347, -5.5445, -5.5445, -7.5793, -7.6508, -7.309, -8.2724, -8.644, -8.2385, -8.8671, -8.0562, -6.8439, -8.5952, -5.9326, -6.7419, -6.2507, -5.3917, -7.9262, -8.6953, -8.7494, -8.4209, -8.3075, -7.9262, -7.1511, -8.5042, -8.2057, -5.7075, -8.5952, -7.6885, -6.307, -6.5583, -7.8331, -8.6953, -4.4378, -4.7083, -4.4252, -4.8758, -4.9075, -5.0223, -5.2923, -5.3782, -5.4413, -5.6813, -5.6917, -5.6996, -5.926, -5.936, -5.9664, -6.0266, -6.0266, -6.0562, -6.06, -6.1801, -6.2416, -6.3565, -6.377, -6.414, -6.4357, -6.0907, -6.307, -5.8376, -5.3917, -5.1536, -5.5853, -5.5947, -5.963, -5.4785, -5.762, -5.3537, -5.4891, -4.0885, -5.3898, -5.0944, -4.8875, -5.4332, -5.5063, -5.0481, -5.5806, -5.5107, -5.4034, -5.5853, -5.5107, -5.5947, -8.1482, -6.5994, -6.4651, -8.63, -8.1482, -8.4557, -6.7258, -5.8166, -7.7427, -7.3438, -8.1192, -6.1412, -7.3438, -5.352, -7.2801, -6.9384, -5.9808, -7.3051, -8.4165, -7.3705, -7.1313, -7.5157, -8.0637, -8.7842, -6.3227, -5.5071, -7.3438, -7.8244, -8.4165, -8.2406, -3.6232, -3.6338, -4.452, -4.7161, -4.8901, -4.9084, -4.7608, -5.21, -5.2147, -5.2432, -5.2611, -5.3867, -5.4382, -5.4461, -5.5197, -5.5543, -5.8664, -5.9641, -6.0542, -6.0986, -6.1177, -6.1981, -6.2764, -6.2901, -6.2993, -5.5609, -5.8195, -5.1379, -5.9188, -3.9861, -4.9282, -4.4289, -5.1763, -4.9556, -4.7373, -5.0612, -4.7314, -5.2529, -5.5218, -5.3064, -4.9937, -4.8415, -5.1763, -5.0532, -5.135, -5.1539, -5.1569, -5.2627, -7.8061, -8.617, -7.9238, -7.8061, -7.2307, -5.0061, -7.8061, -7.1129, -7.2307, -8.617, -7.8061, -7.408, -8.617, -7.9492, -8.0292, -8.2805, -6.8591, -7.4856, -8.3546, -7.6424, -8.0292, -8.5682, -8.2805, -8.5217, -8.8401, -7.4231, -8.3546, -8.5217, -8.3938, -7.5697, -5.3249, -5.8076, -5.8197, -5.8228, -5.8697, -5.9567, -6.1238, -6.2011, -6.2056, -6.2191, -6.2752, -6.4888, -6.5629, -6.5954, -6.6429, -6.8087, -6.8087, -6.8087, -6.8169, -5.857, -6.8336, -6.8506, -6.8678, -6.3657, -6.8765, -6.9683, -6.9683, -6.9976, -6.5501, -4.7615, -6.636, -6.2561, -5.7434, -6.7924, -5.7867, -4.9382, -5.0746, -4.6706, -6.0913, -5.3941, -4.0806, -5.2326, -4.703, -4.029, -5.2549, -4.8092, -5.4793, -4.9953, -4.6911, -3.9891, -5.2258, -4.9071, -5.8351, -5.7406, -5.1702, -5.1944, -5.1266, -4.704, -5.2902, -5.2741, -5.0574, -5.3628, -5.6288, -5.4793, -5.2938, -5.5013, -8.5714, -7.7829, -7.9035, -7.4562, -7.2364, -7.4727, -8.309, -7.9295, -7.6353, -8.1998, -8.4316, -7.2364, -7.5417, -7.7604, -8.1659, -7.6353, -7.5066, -7.8294, -8.1659, -7.263, -7.6353, -6.249, -6.9037, -8.2349, -8.7339, -7.263, -8.3482, -8.7945, -7.9836, -8.1659, -4.8925, -5.3809, -5.4165, -5.2374, -5.6375, -5.8305, -6.0377, -6.1918, -6.2588, -5.9431, -5.954, -6.3853, -6.3853, -6.5498, -6.5565, -6.5699, -6.5835, -6.5904, -6.7151, -6.788, -6.8135, -6.8222, -6.8757, -6.8943, -6.8943, -6.9227, -6.9324, -7.0132, -6.5631, -6.5835, -3.9136, -6.0416, -5.2718, -4.3438, -5.1293, -4.1459, -5.3706, -6.0865, -5.1887, -5.321, -4.823, -4.6981, -4.5058, -5.5174, -4.7493, -4.904, -5.1819, -4.5118, -5.2409, -4.7536, -4.9768, -4.9091, -4.8242, -5.3386, -5.6269, -5.515, -4.8457, -4.9091, -5.3605, -5.2162, -5.1277, -5.2127, -5.2942, -5.2923, -5.2517, -8.2113, -8.1021, -6.7689, -8.2505, -6.9696, -7.4804, -6.6019, -8.1021, -7.8585, -7.2499, -7.4804, -6.1271, -7.8058, -6.1175, -6.7689, -8.579, -7.0267, -6.9585, -8.0037, -6.778, -6.7072, -7.6408, -8.2505, -7.7805, -7.5982, -7.2209, -7.4621, -8.4737, -7.5982, -8.7613, -4.2712, -5.1326, -5.1927, -5.5722, -5.6001, -5.6115, -5.6375, -5.8099, -5.8821, -5.8859, -5.623, -5.9087, -5.9722, -5.9763, -5.6733, -5.6825, -6.0056, -6.0489, -6.0895, -6.1611, -6.1611, -5.8204, -6.2329, -6.3336, -6.3454, -6.3514, -6.3634, -6.3756, -3.9617, -6.2224, -6.2383, -5.6115, -5.3082, -5.5532, -4.886, -5.2608, -4.6975, -5.2977, -5.0741, -5.6346, -4.9817, -5.394, -5.7011, -4.8334, -5.3231, -5.2272, -5.336, -5.5945, -5.3872, -5.422, -5.1522, -5.4315, -5.4079, -5.5371, -5.6115, -6.9158, -7.1153, -7.2106, -7.609, -8.2811, -7.2396, -6.5175, -7.5879, -8.2811, -8.2811, -7.9328, -7.9038, -7.1153, -6.5391, -7.5879, -7.5879, -7.5879, -8.6259, -6.8742, -7.609, -5.9337, -7.609, -8.2811, -7.609, -5.6753, -6.4485, -8.6259, -7.1687, -7.9038, -7.5879, -3.8483, -4.1144, -4.1366, -4.5365, -4.9385, -4.9608, -5.19, -5.2034, -5.4528, -5.3344, -5.3344, -5.562, -5.648, -5.8644, -5.9417, -5.9579, -5.962, -6.0298, -6.052, -6.061, -6.0746, -6.0885, -6.112, -6.112, -6.141, -6.1608, -6.1658, -6.2016, -6.052, -5.6939, -5.361, -5.7421, -5.2627, -5.5085, -5.1787, -5.654, -5.7034, -5.8387, -5.6877, -3.9692, -5.4023, -5.2247, -5.4802, -5.2267, -5.3477, -5.3214, -5.5137, -5.4904, -5.4479, -4.9312, -5.0875, -5.4479, -5.1713, -5.5216, -7.7017, -7.8841, -7.9429, -8.4437, -6.4288, -7.9131, -8.6062, -6.1613, -7.2347, -6.712, -6.795, -8.3484, -7.4504, -7.1628, -8.0382, -7.8018, -6.6603, -7.1909, -7.2805, -7.1087, -7.3619, -8.1813, -8.0054, -8.2614, -6.5642, -7.5476, -7.7759, -7.2805, -7.6552, -8.2614, -3.5785, -4.0819, -4.5519, -4.4033, -4.8784, -5.0991, -5.4087, -5.4233, -5.5673, -5.5758, -5.6017, -5.6805, -5.9021, -5.93, -5.9505, -5.9756, -5.9884, -5.9927, -6.0413, -6.1067, -6.2245, -6.252, -6.2633, -6.3036, -6.3396, -6.3518, -6.4422, -6.0145, -4.4876, -4.5967, -6.0278, -4.9071, -4.6942, -4.584, -5.2636, -4.6744, -5.2369, -4.9624, -5.4966, -5.092, -5.5561, -4.557, -4.9624, -4.3971, -4.8756, -5.3873, -4.0468, -5.2782, -4.1601, -5.0227, -5.2349, -5.0342, -5.2803, -4.9874, -5.0408, -5.3104, -5.2974, -7.6748, -7.4971, -7.6748, -7.891, -7.8243, -8.1672, -8.4857, -7.6207, -8.3679, -8.2625, -7.5694, -7.7925, -7.7925, -7.1978, -6.5948, -7.891, -7.5694, -7.3871, -5.7131, -7.4971, -6.7474, -7.1978, -6.7474, -8.3138, -7.3871, -8.3679, -7.5694, -7.4741, -6.9016, -7.4971, -4.4979, -4.6422, -4.9144, -4.9502, -5.2133, -5.2324, -5.2569, -5.2794, -5.3529, -5.4382, -5.4653, -4.3455, -5.6058, -5.6199, -4.9232, -5.6748, -5.6899, -5.7448, -5.2593, -5.4683, -5.5249, -5.9353, -5.955, -5.965, -5.9904, -6.0008, -6.1166, -6.1284, -6.1403, -3.4524, -4.853, -5.0866, -4.6041, -4.6342, -4.9144, -5.2015, -5.0929, -4.1492, -5.1141, -5.1314, -3.7955, -5.0578, -5.0337, -4.6093, -4.8918, -4.8141, -4.7937, -4.5453, -4.8647, -4.6106, -4.9411, -5.0357, -4.9215, -5.1715]}, \"token.table\": {\"Topic\": [1, 2, 9, 6, 6, 1, 3, 4, 6, 2, 6, 7, 9, 5, 4, 6, 9, 2, 3, 6, 7, 7, 2, 7, 2, 6, 7, 10, 1, 7, 2, 2, 3, 8, 10, 10, 8, 10, 6, 9, 2, 4, 6, 2, 3, 5, 2, 10, 9, 1, 4, 9, 9, 4, 7, 3, 3, 1, 2, 4, 3, 3, 3, 4, 1, 6, 3, 1, 2, 3, 6, 1, 1, 1, 7, 3, 6, 1, 9, 10, 2, 5, 2, 4, 6, 6, 7, 3, 3, 9, 5, 10, 3, 2, 2, 3, 10, 1, 2, 3, 4, 6, 7, 8, 7, 8, 9, 9, 10, 5, 9, 1, 1, 2, 3, 6, 8, 10, 9, 1, 1, 6, 10, 5, 5, 9, 4, 6, 4, 5, 8, 10, 6, 8, 9, 6, 10, 3, 1, 3, 6, 9, 3, 8, 9, 7, 9, 10, 8, 8, 10, 10, 1, 8, 8, 2, 8, 5, 9, 9, 5, 6, 4, 10, 2, 6, 8, 9, 6, 5, 5, 7, 5, 9, 8, 1, 2, 3, 4, 5, 9, 10, 1, 1, 2, 3, 4, 5, 9, 3, 6, 7, 8, 10, 9, 10, 1, 2, 4, 5, 7, 9, 2, 9, 2, 8, 1, 2, 3, 2, 6, 9, 4, 10, 1, 1, 1, 9, 3, 1, 2, 3, 9, 8, 7, 1, 8, 10, 4, 6, 2, 2, 5, 5, 2, 4, 7, 4, 9, 3, 8, 9, 1, 4, 4, 6, 1, 5, 4, 4, 6, 9, 1, 2, 2, 4, 6, 9, 9, 1, 1, 2, 3, 5, 6, 7, 8, 9, 2, 3, 6, 8, 1, 2, 3, 4, 9, 4, 7, 1, 4, 5, 6, 7, 2, 7, 9, 3, 5, 2, 3, 2, 4, 5, 7, 8, 1, 2, 3, 4, 5, 6, 7, 2, 3, 7, 10, 10, 7, 2, 3, 1, 5, 8, 6, 2, 6, 6, 4, 10, 4, 7, 8, 8, 2, 4, 6, 7, 9, 1, 2, 3, 4, 6, 10, 3, 4, 10, 4, 2, 8, 2, 1, 2, 4, 2, 1, 7, 3, 2, 4, 6, 7, 9, 7, 8, 2, 9, 8, 6, 6, 7, 4, 9, 1, 2, 3, 4, 5, 7, 9, 7, 10, 4, 3, 6, 9, 10, 6, 4, 9, 1, 4, 4, 5, 6, 7, 9, 10, 1, 2, 6, 8, 9, 1, 5, 2, 6, 6, 5, 5, 9, 4, 9, 2, 2, 7, 5, 3, 8, 4, 1, 7, 5, 6, 9, 6, 4, 6, 10, 2, 2, 7, 10, 5, 4, 2, 4, 9, 1, 2, 1, 3, 1, 1, 2, 4, 6, 1, 3, 4, 3, 5, 7, 8, 1, 2, 3, 5, 1, 8, 2, 2, 1, 2, 3, 5, 4, 1, 3, 4, 7, 8, 8, 2, 2, 5, 5, 6, 7, 9, 7, 8, 1, 2, 3, 4, 6, 9, 4, 5, 8, 1, 2, 3, 7, 9, 7, 4, 9, 10, 10, 10, 3, 5, 9, 10, 6, 4, 6, 8, 7, 8, 10, 3, 5, 1, 2, 3, 4, 6, 7, 1, 3, 3, 8, 1, 3, 5, 1, 2, 8, 1, 5, 1, 4, 5, 6, 7, 8, 10, 10, 3, 2, 3, 4, 4, 3, 3, 7, 8, 5, 5, 1, 2, 3, 6, 10, 4, 10, 2, 5, 2, 2, 2, 1, 3, 4, 5, 8, 2, 4, 2, 3, 5, 1, 3, 5, 8, 9, 2, 6, 3, 5, 9, 10, 1, 1, 5, 3, 7, 1, 2, 6, 7, 8, 9, 1, 3, 6, 7, 8, 1, 2, 1, 7, 9, 5, 2, 3, 8, 8, 1, 3, 6, 5, 8, 3, 10, 1, 6, 2, 10, 4, 8, 5, 2, 3, 4, 6, 7, 9, 1, 5, 6, 7, 2, 4, 6, 10, 9, 5, 3, 6, 4, 6, 9, 6, 7, 10, 2, 5, 1, 2, 3, 6, 7, 9, 10, 9, 4, 6, 10, 6, 5, 1, 3, 3, 8, 3, 1, 2, 3, 6, 10, 4, 8, 1, 3, 1, 3, 2, 1, 6, 8, 9, 10, 8, 6, 4, 9, 8, 8, 7, 1, 8, 9, 2, 4, 3, 6, 1, 1, 7, 8, 10, 1, 1, 8, 7, 1, 6, 7, 3, 7, 9, 7, 6, 8, 8, 5, 3, 4, 5, 8, 2, 2, 9, 2, 2, 2, 4, 1, 2, 3, 5, 7, 5, 7, 8, 5, 4, 5, 6, 8, 6, 2, 3, 5, 7, 8, 9, 1, 3, 5, 1, 4, 5, 2, 3, 4, 5, 7, 8, 1, 5, 1, 3, 4, 5, 8, 8, 1, 5, 10, 1, 7, 1, 10, 4, 6, 9, 7, 10, 6, 10, 1, 2, 4, 5, 8, 9, 4, 5, 6, 8, 1, 6, 7, 8, 9, 10, 8, 1, 6, 3, 6, 9, 3, 5, 7, 8, 9, 1, 6, 6, 9, 3, 4, 10, 3, 4, 8, 9, 4, 6, 10, 6, 10, 10, 4, 10, 8, 10, 3, 7, 2, 5, 8, 7, 4, 9, 4, 7, 9, 9, 8, 6, 9, 9, 8, 7, 1, 5, 3, 9, 4, 5, 5, 9, 4, 3, 3, 5, 3, 3, 2, 2, 7, 2, 3, 6, 7, 8, 1, 5, 6, 7, 3, 9, 4, 3, 3, 6, 10, 6, 3, 6, 8, 10, 4, 6, 6, 9, 10, 5, 10, 6, 1, 7, 4, 2, 3, 4, 6, 8, 9, 3, 2, 8, 4, 10, 1, 5, 6, 1, 3, 5, 7, 10, 7, 10, 7, 3, 8, 9, 4, 2, 4, 5, 3, 8, 2, 3, 6, 2, 2, 1, 4, 2, 6, 6, 8, 1, 3, 8, 8, 9, 1, 2, 3, 5, 10, 1, 2, 3, 4, 7, 8, 3, 1, 2, 3, 4, 5, 6, 8, 2, 4, 6, 10, 4, 6, 5, 8, 9, 5, 2, 8, 8, 10, 4, 2, 7, 8, 8, 8, 1, 2, 4, 5, 7, 8, 4, 2, 3, 7, 4, 9, 10, 4, 1, 2, 3, 7, 8, 9, 9, 6, 2, 4, 6, 7, 9, 10, 4, 9, 10, 2, 6, 1, 2, 4, 5, 6, 7, 8, 9, 7, 1, 2, 3, 4, 5, 9, 2, 4, 7, 2, 2, 6, 7, 2, 3, 7, 2, 3, 9, 6, 1, 2, 4, 6, 7, 2, 3, 6, 5, 7, 5, 10, 10, 9, 1, 2, 3, 4, 6, 7, 9, 10, 7, 4, 6, 8, 1, 1, 4, 5, 6, 9, 10, 1, 2, 4, 5, 7, 3, 4, 6, 3, 2, 4, 9, 1, 3, 5, 8, 10, 4, 3, 4, 6, 10, 6, 2, 4, 6, 1, 3, 6, 7, 4, 4, 7, 10, 3, 3, 5, 9, 8, 5, 5, 5, 6, 6, 8, 10, 10, 5, 7, 8, 8, 8, 6, 4, 4, 5, 8, 9, 2, 2, 6, 6, 9, 10, 1, 6, 7, 3, 1, 9, 1, 6, 7, 10, 8, 4, 1, 9, 9, 8, 2, 2, 3, 2, 3, 4, 2, 6, 7, 2, 7, 9, 10, 3, 4, 6, 8, 3, 4, 2, 6, 7, 9, 4, 7, 9, 7, 6, 9, 1, 8, 3, 4, 5, 7, 7, 8, 9, 4, 6, 9, 7, 3, 1, 5, 9, 10, 1, 3, 4, 6, 3, 7, 4, 7, 7, 3, 4, 9, 7, 9, 10, 7, 1, 5, 8, 4, 2, 3, 4, 5, 7, 8, 1, 2, 3, 4, 10, 4, 3, 7, 2, 5, 3, 5, 6, 7, 6, 4, 4, 5, 2, 5, 6, 6, 6, 8, 9, 7, 5, 1, 2, 3, 4, 7, 9, 7, 9, 5, 4, 9, 6, 6, 5, 1, 2, 3, 5, 10, 7, 10, 4, 9, 5, 1, 5, 6, 10, 8, 6, 2, 6, 7, 9, 10, 7, 6, 7, 5, 2, 2, 3, 5, 7, 9, 10, 6, 1, 2, 4, 5, 7, 9, 3, 1, 2, 3, 4, 5, 7, 8, 9, 7, 2, 1, 2, 3, 10, 1, 6, 7, 8, 7, 7, 2, 8, 3, 1, 3, 6, 1, 2, 3, 4, 5, 7, 9, 10, 8, 3, 5, 1, 2, 3, 4, 1, 3, 9, 3, 3, 3, 3, 3, 5, 9, 9, 10, 10, 10, 7, 10, 1, 2, 3, 5, 7, 10, 4, 6, 9, 9, 5, 7, 7, 8, 9, 10, 4, 6, 10, 2, 2, 7, 7, 4, 9, 9, 4, 3, 10, 1, 4, 9, 6, 9, 9, 7, 10, 2, 3, 5, 8, 1, 3, 7, 9, 2, 3, 6, 5, 5, 4, 6, 10, 4, 8, 4, 5, 3, 7, 8, 9, 2, 8, 10, 1, 2, 3, 4, 6, 7, 2, 3, 4, 5, 7, 9, 4, 1, 3, 6, 7, 8, 9, 10, 3, 5, 1, 2, 3, 5, 4, 4, 4, 2, 3, 4, 5, 7, 8, 6], \"Freq\": [0.9596244475304239, 0.031987481584347464, 0.0075264662551405796, 0.9984867729205216, 0.9984387825921106, 0.6741205596851968, 0.12373725398039588, 0.03365653308266768, 0.16729276738149523, 0.15052753323769338, 0.3664742053930341, 0.2908928701386649, 0.19244659312667128, 0.9980956061235761, 0.2054250783282258, 0.7794317786774658, 0.015216672468757467, 0.887325795921901, 0.03059744123868624, 0.07989331878990295, 0.00339971569318736, 0.9879414768992439, 0.9423861702524698, 0.0567955950821801, 0.9994896573009671, 1.0021933200501525, 1.0019018260589678, 1.0144755921625719, 0.996337615727813, 0.9926628220696108, 1.0006379487221944, 0.63114299249481, 0.25996905058420994, 0.10825906639059167, 1.0037646884745808, 1.0001323345320658, 0.07303320093696938, 0.9277498806524392, 0.9963752272095723, 0.006266510862953285, 0.0015281147632858986, 0.0993274596135834, 0.9000595955753943, 0.0582728155691844, 0.8449558257531739, 0.09651435078646167, 0.10507010638399908, 0.8945969057837635, 1.0036589605405666, 0.005348469535790648, 0.04492714410064144, 0.9488184956492609, 0.9979563528102225, 0.9982347770205148, 0.0018676048213667254, 0.9993061898866985, 1.0008316381316407, 0.8468297319386143, 0.10264602811377142, 0.04899014978157273, 1.0001696599070915, 1.000006957300843, 0.9493577053671735, 0.0495543857197151, 1.0000437071907593, 1.0027952379600924, 1.0176374117139195, 1.0008178609732166, 0.07267493897779399, 0.09084367372224249, 0.8357617982446309, 1.0014209709100976, 0.9993117578643139, 0.9993163971085147, 1.005750668608054, 0.8230142040013868, 0.1766858748202423, 0.9760041949986739, 0.999155613663385, 1.000051768577322, 0.0789381946989091, 0.9201233319591592, 0.057877432426024694, 0.6011608783118225, 0.34071243239471144, 1.0006306485531926, 0.9952958799530847, 0.9984668482279428, 0.9980529759592474, 1.000855443891012, 0.9965764347291718, 1.004186793053418, 1.0004862193816624, 0.9989599058357512, 0.09149697778217537, 0.031672030770753014, 0.8780190752558753, 0.13384543408496194, 0.05341537965776004, 0.05648522906337843, 0.35180474188386784, 0.033154373580678645, 0.2781283561490264, 0.09209548216855179, 0.0020604155059996926, 0.9972411049038511, 1.0015852850022597, 1.0029461345742736, 0.9982005826626376, 0.9935487604676272, 0.007584341682958986, 1.0005357187508848, 0.8247612977960603, 0.17547295767821208, 0.9951386254005163, 0.8685382775612623, 0.1287326902951965, 0.0016295277252556517, 0.9899727019877408, 0.999448037862106, 1.0016885159196918, 1.0130278424290728, 1.0078450327366728, 1.0004852216682878, 0.9953610976136485, 0.9993328443313401, 1.0004752867197402, 0.993164551401052, 0.04339860447613084, 0.07377762760942244, 0.8831616010892627, 1.0144755921625719, 0.13313005870941663, 0.05705573944689284, 0.8096481121511461, 0.9867154309374087, 0.9877247144787719, 1.0013985168461441, 0.3328598120779279, 0.08113457919399493, 0.586665418787348, 1.0007037630122912, 0.997249205730104, 1.0007514454962572, 1.0143932809741556, 1.0019828041819066, 0.9996919290759796, 1.0078450327366728, 0.9992263747167749, 0.12854485053981055, 0.8712484314364937, 0.9992098855773622, 0.06942495191380081, 0.9314514381768275, 1.0039508493017242, 1.0172741707760735, 0.9830352066079383, 0.21558475343243055, 0.7846650952136259, 1.0000983079089372, 1.015674589401682, 0.9917755100704211, 0.9966784165614111, 1.0078450327366728, 0.04920307083986814, 0.15408330078800814, 0.6992015329875999, 0.09581650637237481, 0.9985412338550106, 1.0023542669177257, 0.2757114734179673, 0.7234981926570774, 1.0016212303030425, 1.0001966629900005, 1.0003366262442381, 0.14944079683488806, 0.3595500962654322, 0.06379114611160894, 0.13070493573917077, 0.06646769769671142, 0.11464562622855592, 0.11553781009025675, 1.0013080074616025, 0.15462953026930315, 0.0916618349534529, 0.07332946796276232, 0.04862062549704893, 0.5276533455581376, 0.10361772646912067, 0.2424478586813655, 0.34964290599152414, 0.36331207309818864, 0.04316579086315113, 0.0007194298477191855, 1.0027465433037117, 1.0025405851959532, 0.10016787002840825, 0.18005635532713876, 0.4516772053428225, 0.14011211267777351, 0.1044695576983399, 0.023966545589619154, 0.004201548310198271, 0.9957669495169902, 0.0020604879996883553, 0.9972761918491639, 0.18348240762986753, 0.11719198938939926, 0.6996006639306561, 0.5723801613012484, 0.001287694401127668, 0.42622684677325806, 0.0047147307360810185, 0.9948081853130949, 0.9999342453138778, 0.9998804833436241, 0.9999715558581229, 1.0003489295551302, 1.0014549606934426, 0.7437084630692791, 0.06434499781082294, 0.1915385981345427, 1.0015852850022597, 0.9999903092540202, 0.997912784107212, 1.0184391599986165, 0.03832822453769222, 0.9620384358960747, 1.0006691209320273, 1.0002201454447197, 1.0003869914155166, 0.9995293253607629, 0.9965764347291719, 0.9953610976136485, 0.11284743720546209, 0.8870789846411976, 1.0082218004719556, 0.8492588567880617, 0.1515155005860519, 0.19106491353885857, 0.6819040879748918, 0.12682757191803543, 1.0203680220440683, 1.0007952212560058, 0.99192958039851, 0.008020993911578247, 0.005963108642493345, 0.9958391432963887, 1.0005287194951473, 0.1177431172573989, 0.744479918492095, 0.1385934609383966, 0.9721201576587323, 0.028676110845390332, 1.000831375026431, 0.02491026816023044, 0.26017391189574013, 0.7154782577132854, 0.9996919290759796, 1.0096595120675937, 0.26690343329084465, 0.3736648066071825, 0.07733355887657806, 0.09033654665228587, 0.05885562887951958, 0.03421838888344162, 0.03421838888344162, 0.06433057110087025, 0.9927599058257967, 0.006474521124950848, 0.8561341361321075, 0.14373975186901364, 1.0016885159196915, 0.3482153650074736, 0.032127012842951434, 0.0010363552529984333, 0.6187040860400647, 0.9999462146484976, 1.0006411854308133, 0.0011476673554004476, 0.3649582190173423, 0.0011476673554004476, 0.6323647128256467, 0.0011476673554004476, 0.10933394388791555, 0.7184802026920165, 0.17181048325243872, 0.13121518084808836, 0.8699080508076968, 0.3992741222408818, 0.6004914239506666, 0.007396260012417752, 0.03254354405463811, 0.6198065890406076, 0.1257364202111018, 0.21301228835763125, 0.22730041555881564, 0.059056905553045755, 0.07691131885978052, 0.028841744572417696, 0.4443002080560535, 0.12772772596356408, 0.035708826613469524, 0.9253320025023333, 0.07600262854228611, 0.9981395824672362, 0.9967698125967092, 1.0010005842970349, 0.9986095163572867, 0.8906458383328059, 0.10964105598363377, 1.0203680220440683, 0.990094636779714, 1.002695910740097, 1.0029354106240511, 0.999719571163383, 0.9976789357256022, 0.9983961743566053, 1.0032355114072098, 1.0000187986602016, 0.004916450275116375, 0.9931229555735077, 0.9830352066079383, 1.0039508493017242, 0.09835322886844529, 0.46168162727658435, 0.09488193843779427, 0.15852226299972946, 0.18687113485004606, 0.05286559937736633, 0.07311199913891088, 0.044991999470099006, 0.01574719981453465, 0.0927959989070792, 0.7204343915149604, 0.999054181668077, 0.9966784165614112, 1.0050532182415572, 0.999286471999273, 0.38725686872789444, 0.6128020779869978, 1.000262897017276, 0.7842677372128325, 0.09948427956188151, 0.11606499282219508, 1.0009358704846572, 1.0023826867553949, 0.9755479458270313, 0.9959706811073731, 0.11251414340126598, 0.0903802135518366, 0.12173661417186155, 0.597616105934593, 0.0774687544730028, 0.9993777495906229, 1.0001110372884587, 0.3864134236773323, 0.6128875163623912, 1.002134176336321, 1.0057573076747972, 0.9936397497510046, 1.0012202601909006, 1.0032355114072098, 0.9994348066662377, 0.3245821975021189, 0.14009191791260114, 0.005172624661388349, 0.12198773159774191, 0.18190396725882363, 0.08060673430663512, 0.14569559462910517, 0.9962073911983338, 0.0026636561261987536, 0.999264748852559, 1.0025984351861275, 0.045492647151067794, 0.08188676487192202, 0.8734588253005017, 0.9993117981408649, 0.019764972661312795, 0.9801629624314663, 0.976004194998674, 0.9998679916272118, 0.10857213560229863, 0.00031653683849066657, 0.18992210309439994, 0.043682083711711985, 0.07976728329964797, 0.5773631934069758, 1.001858610760228, 0.10574111615403048, 0.07387393046377472, 0.8198557773038527, 1.006751900326516, 1.0022408669072405, 0.997421886635623, 1.000262897017276, 1.0031606881196988, 0.9964208286187602, 1.000627558447583, 1.0009958424219842, 1.000141546366106, 0.002521034973867037, 0.9974895046600577, 1.0003279082545709, 1.0112547969844992, 1.0016814394908502, 0.984423063573938, 0.012520752078681559, 0.9849658301896159, 0.993602248609061, 0.25975490626986186, 0.7393024255372991, 0.9981861527629776, 0.8359463185260134, 0.16420374113903835, 0.9751070141028509, 0.3392021168558921, 0.6403553089093332, 0.021048341380079223, 0.9999977862573988, 1.0008603661444144, 0.6015636244394491, 0.3984961152371377, 1.0026531203067888, 1.0004233166773155, 0.998404105625761, 0.002199127985959826, 0.9958553920674642, 1.0000606364246976, 0.9859734270598863, 0.9065061603859812, 0.09370135792451248, 1.0006352156926468, 0.5279165782013213, 0.12595358714081598, 0.2355798574300447, 0.11040376156787574, 0.7423856994060732, 0.17367468780713055, 0.08359934124953403, 0.17740265878697958, 0.7432559669868283, 0.006117333061619986, 0.07340799673943983, 0.42498534988012143, 0.2615294460800747, 0.2708697834400774, 0.04203151812001201, 1.0004807892306156, 1.001492194160577, 0.9993449439150883, 1.0060953337345782, 0.26246630781160807, 0.07719597288576707, 0.05596708034218113, 0.6050234374921994, 1.0001016091967223, 0.04838082290376766, 0.1877636698408126, 0.10943281371090305, 0.1566617122598191, 0.497631321295896, 0.9976403011061133, 1.0001771258890806, 0.9859734270598863, 0.990094636779714, 1.00280378193268, 0.0032427782689571486, 0.9955329285698447, 0.9999348085534031, 1.0003141785074698, 0.9992263747167749, 0.3541651663383833, 0.06948482033578823, 0.09281927492616489, 0.2556419136234597, 0.17008224679207867, 0.05755832132292906, 0.999234002244902, 1.0008233376607407, 1.002695910740097, 0.015441843725911243, 0.3006012245310722, 0.5219343179358, 0.16059517474947693, 0.0010294562483940829, 0.9986651957281458, 0.8901096393035455, 0.1098433171906503, 0.9992098855773622, 0.9967698125967092, 1.0007276727453278, 0.1472180027072302, 0.7059508948716786, 0.11939727778617881, 0.027820724921051376, 1.0086424405137955, 0.9739978471744778, 0.026575657494528726, 0.9997760041858161, 0.0929013070711395, 0.9083683358066974, 0.9983528634532802, 0.9987144019919664, 1.000627558447583, 0.15907650203772294, 0.1706829421005611, 0.08943786166069402, 0.025261075430883042, 0.424659159946196, 0.13108449953323092, 1.0041581621620972, 0.9991530797387526, 0.9985657063317279, 0.9976403011061133, 0.006448087724644002, 0.006448087724644002, 0.9865574218705322, 0.07475076238036181, 0.07962581210082019, 0.8450086182127856, 1.016671036456952, 0.9978557369560386, 0.0929452001168755, 0.020324017092223444, 0.5140489201130661, 0.012888401082873403, 0.03346027204207518, 0.17969405355929263, 0.14672948925117413, 0.9990283760613626, 0.9927349089140417, 0.7681535699563723, 0.2317309156678423, 1.0003628002305753, 1.0008838107241176, 0.9989009642489117, 0.999095963518493, 1.0034207442792322, 0.999226374716775, 0.9931040429705336, 0.990094636779714, 0.08090602512986467, 0.13153433533382905, 0.11019102809098133, 0.624912181831286, 0.052613734133531626, 1.0013908440628836, 1.0050532182415572, 0.9996572600457587, 1.0054152501147964, 1.0037824708984067, 1.0172741707760735, 1.0024697649643632, 0.09148470971540758, 0.16581603635917624, 0.06452939345997499, 0.6444771068344337, 0.03430676614327784, 1.0007099085905, 1.0049092443258072, 0.06825608657420425, 0.30780869810867106, 0.6234930985143656, 0.08890661183193574, 0.005429411409583862, 0.1493088137635562, 0.06515293691500634, 0.6908926018695465, 0.9974674891011425, 0.0016707998142397697, 0.13618989455546412, 0.5082064463498271, 0.013560032791236687, 0.3419486529964034, 1.0007579245819738, 0.004963903488652809, 0.9927806977305618, 0.002800470424203144, 0.9969674710163193, 1.003115422637526, 0.11885506250884412, 0.1294894628385828, 0.44476815496730615, 0.050669789806401966, 0.25647671383487414, 0.16666658392123015, 0.7413789422702997, 0.08477007285648774, 0.007183904479363369, 1.0005640271595013, 0.998968999586878, 1.0029013802941509, 1.0005886835376834, 1.0003141785074698, 0.9989299687641838, 0.9969955164931454, 0.7883370772216414, 0.21249868142985587, 1.0039508493017242, 1.0039508493017242, 0.567876287210216, 0.3788523105892518, 0.053087584923334645, 0.9650406336499411, 0.03446573691606933, 1.0095609243193646, 0.9856005753078496, 1.022480585236706, 0.9976789357256022, 1.0001230783288477, 1.0013761942723807, 0.9989823521230636, 0.0006865858090192877, 0.9953610976136485, 0.041685177778979995, 0.06489135922294824, 0.42372768340282757, 0.3635635092888358, 0.001718976403256907, 0.1044278164978571, 1.0065043260923825, 1.0026531203067888, 1.0007487170662963, 0.9991387211884245, 0.04797338364920279, 0.18170449736158223, 0.7701213976960518, 0.9979824920830741, 1.0127831329091173, 1.0042775808077358, 0.9966996563874329, 0.003521906913029798, 0.11347797142211762, 0.0013043444991048, 0.8843455703930545, 0.5413795254638948, 0.012052976448175764, 0.4469645432865179, 0.9454007534197727, 0.05306823355994566, 0.08399889830819149, 0.03266623823096336, 0.07799897700046353, 0.3839949636945897, 0.12266505784688281, 0.07999895076970617, 0.21933045669361112, 1.0059400036327044, 0.037123016459841826, 0.7012125331303456, 0.26151102706155244, 0.996974857436452, 1.015674589401682, 0.8062689252813637, 0.19364537506757645, 0.9984278622914652, 0.0010817203275097131, 0.9999977007198548, 0.18577258269661645, 0.4118974067166783, 0.04948859784950849, 0.3532724523411067, 1.0025405851959532, 1.01371565445135, 0.9954241434583396, 0.9996362578315716, 0.9998849939823544, 0.12863306671828342, 0.871335892413134, 1.0009358704846572, 0.173445145658753, 0.15431516635815523, 0.2282844196537999, 0.015303983440478204, 0.42851153633338973, 1.002134176336321, 1.0019425209210107, 1.0015257115166294, 1.0020296440461827, 1.0049939151191807, 0.999226374716775, 1.016623648809222, 0.8083074350844822, 0.1812029854475103, 0.010658999143971193, 0.9077257267566716, 0.09302313232878288, 0.9965832407109539, 0.0033308263392745783, 1.015044362798621, 0.2713893252162624, 0.0017737864393219764, 0.7183835079254004, 0.008868932196609882, 1.016671036456952, 0.9990853752858047, 0.9976403011061133, 1.0108473780773517, 0.9967702417007733, 0.25922613892492796, 0.7412582154382237, 0.7668183939714278, 0.23357112000279123, 1.0015852850022597, 1.0006411854308133, 0.994609154384908, 1.0005640271595015, 0.9991212372615227, 1.0045577530997734, 0.26270253601177895, 0.004712153112318904, 0.6225932299651353, 0.10955755986141454, 0.9996520985264091, 0.9980803184972795, 1.0084611565240142, 1.00162379891798, 0.9986427757069144, 0.9986427757069144, 1.0005091162756583, 0.6712504681078707, 0.021049666247285145, 0.08263943045230464, 0.17073618178353506, 0.05457320878925778, 0.49488468856504153, 0.5053862204178806, 1.001492194160577, 0.9858814681125662, 0.10414700321344227, 0.000562956774126715, 0.8382426366746786, 0.057421590960924924, 1.0010156545741826, 0.08034238551665143, 0.02506682428119525, 0.701871079873467, 0.0674876038339872, 0.07777142918011859, 0.04820543130999086, 0.20714407555473321, 0.4457088816711395, 0.3473736323207184, 1.0014209709100976, 0.12584112080801532, 0.8742646287714748, 0.1723892106673033, 0.04900696624321331, 0.10147324775065344, 0.39897436047416013, 0.2352334379674239, 0.042664888258797475, 0.9932067647563306, 0.005791293088958196, 0.05795289845370587, 0.07451086944047897, 0.02365424426681872, 0.20579192512132288, 0.6374818829907645, 1.0007755628946304, 0.6602338062232384, 0.33843917797997936, 0.0011096366491146863, 1.0023826867553949, 0.9999576873533331, 1.0085376681652964, 0.9945839138848743, 0.3999332482978343, 0.05750113226599763, 0.5415405143260374, 0.985816871572579, 0.9989728251062879, 0.8868012510645178, 0.11312624085226702, 0.28080462181149807, 0.180801089043724, 0.07285025565864336, 0.3218656750009153, 0.05894247957835691, 0.08410893153316099, 0.7128739229988156, 0.05587633783302979, 0.09913543809085931, 0.13157976328423143, 0.10408530235280504, 0.12425687257621687, 0.024205884268094197, 0.22350099807540308, 0.03227451235745893, 0.49218631345124864, 1.0039508493017242, 0.9973376200259674, 0.9917755100704212, 1.0008489772567102, 1.0130278424290728, 1.0009353269977157, 0.05454879263991735, 0.7720040992259489, 0.02958578583859924, 0.11372036431711582, 0.028661230031143015, 0.9947735064409561, 0.9994789141236637, 1.0013334373216667, 1.0071682576053937, 0.9994653150761709, 1.0032355114072098, 0.9994695892513263, 1.0095609243193646, 0.23902684815255976, 0.01106605778484073, 0.7502787178122015, 0.10460069143359915, 0.7643896681686092, 0.13093373263366606, 0.993164551401052, 1.0001618816058508, 0.9982005826626376, 0.998356326353602, 0.9999982168480345, 0.3454712808508174, 0.6550333604662453, 0.05490168234956062, 0.9458062550219761, 0.999261478637513, 1.000627558447583, 1.0006211630678592, 1.0000909795004076, 0.2854028145013795, 0.7156801541303628, 0.14816288806774217, 0.581539335665888, 0.27039727072362946, 0.9994916702760843, 0.9976403011061133, 0.03238957049648319, 0.9676384185824352, 0.9990968743562912, 1.0016611368384045, 0.9999148882740937, 0.9988208532444242, 0.0010880401451464315, 0.9876139477037262, 0.9995279376177978, 1.0007192999071017, 0.990094636779714, 0.9999853071263717, 0.9986329333883989, 1.0002542360598377, 1.0014193039619503, 1.0005057022882557, 1.0006275584475832, 0.9951386254005163, 0.9999925519225272, 0.9983857909473398, 1.000262897017276, 1.0002409871672973, 0.37793939047167346, 0.25942181157811733, 0.20082145312519237, 0.1283940438013525, 0.033579980686507575, 0.7649652809435362, 0.044920241022591074, 0.12815480527033335, 0.0634168108554227, 0.9994653150761709, 0.987069556234111, 1.0020369026719562, 1.0221804358733566, 0.0009384201031114381, 0.011261041237337257, 0.9881563685763444, 1.0000045276503704, 0.13231335226632449, 0.35703602992500255, 0.08610868957014768, 0.4247678650137163, 0.0032717769599781813, 0.9962560843133562, 0.9983238477719665, 0.1796306533229101, 0.8202603284479789, 0.9910521751131566, 0.9992098855773622, 1.0057573076747972, 1.0014651739986393, 1.0014886119089899, 0.9979601532082236, 0.18435841062264777, 0.09237916020353934, 0.19595579437114405, 0.3603187157722465, 0.07838231774845762, 0.08838006235923028, 0.999880203127261, 0.06693007407065935, 0.9306467442205967, 0.04808337057147255, 0.9526517794473, 1.002030973531972, 0.00331305347045529, 0.9972290946070423, 0.177435506956986, 0.16538328384292658, 0.21560088015150752, 0.0006695679507810793, 0.44124527956473125, 1.00086534340246, 1.0005395061835862, 0.9994481889339254, 0.996753061846656, 0.999226374716775, 1.0013392557011045, 1.0002311739148295, 0.24329792756938104, 0.7565406985847897, 1.0001443969031854, 1.0014549606934426, 1.002695910740097, 0.15719131637197872, 0.07952031298817747, 0.763764866607379, 1.011254796984499, 1.0141440964044546, 0.9951415321555106, 0.9993026356676813, 0.006140351204473515, 0.9947368951247094, 1.0011448178844504, 1.0003366262442381, 0.12675373400959747, 0.8742279595661944, 0.9998454740815312, 0.9988211734293797, 0.9935209912421772, 0.2847602120159204, 0.22324950832388493, 0.3269122170840665, 0.16486117537763811, 0.00015611853728943003, 0.0014375918154015343, 0.11213216160131967, 0.06612922350847057, 0.025876652677227614, 0.10781938615511506, 0.6871688877619333, 1.0095609243193646, 0.357633236452221, 0.22942509508255687, 0.11905041698611671, 0.016869492285482124, 0.1455596191490172, 0.1320640253206315, 0.9977807347070573, 0.25081308921314205, 0.006203857330360405, 0.3341220305065532, 0.4085683184708781, 0.9966784165614112, 1.0003252989503384, 0.21799307214084385, 0.7820068937115985, 0.9862156898359846, 0.993832125113474, 0.9968082998847205, 0.9988847588621709, 0.00672339134409742, 0.9933810710903939, 1.0013908440628834, 0.004839160656301106, 0.9968670951980277, 0.9998130333838624, 1.000429602973139, 1.00022360662767, 0.3314742436182449, 0.16717831417268006, 0.07097872390521114, 0.11961896617527969, 0.087192137995234, 0.22338481635142593, 1.0001391055078048, 0.15473028939057212, 0.8445694962568729, 1.004568822934014, 0.07194160524921409, 0.9280467077148616, 1.001376194272381, 1.0009377260338959, 0.019448546497542563, 0.1479113141523632, 0.05681022792703223, 0.2845629434903596, 0.1704306837810967, 0.3209010172094523, 0.9979563528102225, 0.9844471196019204, 0.9996718594434738, 1.0013908440628836, 0.038099781439473235, 0.03902904440141161, 0.9208995952809264, 0.0018585259238767433, 0.06583450424323976, 0.9357904531717652, 0.9990954285457955, 0.9827072433276715, 0.01760072674616725, 0.11265711358094985, 0.08385273794945698, 0.07745176558690302, 0.37637717491817335, 0.029444472867748255, 0.10945662739967287, 0.13250012790486715, 0.07873196005941381, 1.0019828041819066, 0.06249208820956195, 0.042712482308370325, 0.010606455338320149, 0.18546963794305774, 0.21270242867658243, 0.48589031887709866, 0.13036540103023866, 0.8215145787747921, 0.047824263964897334, 1.001973527898049, 0.07531953900982874, 0.17435078474497395, 0.7504057775423678, 0.8992273810190391, 0.028396654137443342, 0.07414681913665762, 0.8586429488727729, 0.0752472212097388, 0.06700095039223318, 1.0003252989503384, 0.03702151584536962, 0.3709007420804623, 0.22487142957928216, 0.3139973010588757, 0.052789939260990015, 0.45535493546888456, 0.04504703175675497, 0.49985923190326903, 0.9993585317406111, 0.9952958799530846, 0.0029109132959268045, 0.9955323472069671, 0.9877247144787719, 1.0013882389103845, 0.36569655082690006, 0.14377249428361444, 0.033634849580111634, 0.05078202779742345, 0.1470700285561744, 0.044846466106815516, 0.09760701446777494, 0.11640295982136674, 1.0002694337329796, 0.003349115956743213, 0.9980365551094774, 1.0017289908647449, 0.9760041949986741, 0.3103782770476688, 0.24600656040766353, 0.11603309432561462, 0.12464332393988285, 0.0701118697161841, 0.1328435426201383, 0.5313995143144922, 0.22046413541900525, 0.06047288379743773, 0.18475180246776252, 0.0023808221967495167, 0.114013037190824, 0.1439558550389192, 0.7416605651605117, 0.999465315076171, 1.0013927971193366, 1.0001391055078048, 0.9948857178784988, 0.9995671933531528, 0.13653181432186606, 0.759783913287331, 0.10109607625359548, 0.002084455180486505, 0.9950963873287738, 0.0538321844367527, 0.007791500379003681, 0.027624410434649412, 0.910543067019021, 1.0130278424290728, 1.0005975450256461, 0.17640743728863104, 0.8240931376987143, 0.002553788491598062, 0.06384471228995156, 0.6307857574247213, 0.3026239362543704, 0.992188874144468, 0.9884815766401404, 0.010296683090001462, 0.9945839138848743, 1.0025984351861275, 1.0042474457703152, 1.0037254765851917, 0.9889425534945172, 0.9830352066079383, 0.9988865796595056, 0.9996147775179803, 0.9996700201141406, 0.9985412338550106, 0.001153287885789012, 0.08880316720575392, 0.9099441418875304, 1.0144755921625719, 0.9989744093068863, 1.0007801633732343, 0.9994998356841304, 1.0049939151191807, 1.002695910740097, 1.004655711499907, 1.0008367147420583, 0.44927237899635797, 0.034787152904166105, 0.29754118015903774, 0.21834489588785108, 0.9977112059534564, 1.0094489848470265, 1.0010156545741828, 0.024924849816761022, 0.9750601248316912, 1.004186793053418, 1.0005798401964825, 0.9971496630806549, 1.0003739201569268, 1.0059553495896525, 1.0055800796956034, 1.00409762267367, 0.25646367040880097, 0.23288080416431353, 0.19927521976591894, 0.3112938344272343, 0.9998656750204965, 0.9999558291461579, 1.0004042998736407, 1.0000744642529216, 0.9971416945630306, 0.9993081310884585, 0.9911902176792508, 0.8891608843393002, 0.11114511054241252, 0.10533708592044612, 0.04757158718987889, 0.847793643133913, 0.8390624460094054, 0.15964863837584362, 0.0009070945362263842, 0.16676845987803288, 0.06747856758070694, 0.7133448572817591, 0.052054894990831074, 0.06039769610047019, 0.20244412952194638, 0.707995215399956, 0.029080372196522684, 1.001179663815581, 0.9998728986657747, 0.06691071211994855, 0.7294002903625161, 0.13896840209527778, 0.06470486446764255, 0.06407491988180032, 0.09988149275692403, 0.8367430713976276, 0.9988505080957741, 1.0018272888887023, 1.0012172806109545, 0.9934328413379361, 0.999226374716775, 0.211088352838047, 0.18699674735109598, 0.1686412384086571, 0.4347961180740207, 0.04466369587831171, 0.779753690542192, 0.17679379618498386, 0.6341683049325444, 0.08463306446083316, 0.2811440839966033, 0.997942943463598, 0.9991634530057764, 0.08826481604300081, 0.22262348046401315, 0.6266801939053057, 0.06276609140835614, 0.062080661946752595, 0.16097660016425383, 0.611422333359296, 0.16530780913728307, 0.9099923722332994, 0.08788088329978903, 0.04226295155869416, 0.9574744542780022, 1.0012202601909006, 0.997249205730104, 0.004257610774851228, 0.9962809213151873, 0.10822648041199179, 0.8904087706622961, 0.0009838770946544706, 1.0026205682471117, 1.000004298154379, 0.11444890739216483, 0.8843779207576373, 0.9861315550104968, 1.0172741707760735, 0.1200713198864822, 0.1255066471241419, 0.528709104026897, 0.05781211698238032, 0.16800102370948128, 0.02281823285846895, 0.5114623413886089, 0.22317344820112314, 0.017809352474902593, 0.22456480386322492, 0.9994127880746112, 0.1522311144617772, 0.8478427347107315, 1.0094489848470265, 1.0023542669177257, 0.2533702410532868, 0.709893197906056, 0.03309791437182576, 0.0022826147842638454, 1.0130278424290728, 1.0017583269414387, 1.0003852632989712, 0.9978557369560386, 0.1883032749580242, 0.8128027438061551, 0.9991269457919673, 0.993164551401052, 0.6822010954851757, 0.13170476680733326, 0.1849786050664793, 0.9879414768992439, 1.0072106344900016, 0.043562059464529325, 0.19862224732041348, 0.09594025001116578, 0.3739076770705434, 0.03630171622044111, 0.2510004378670499, 1.0003549012797588, 0.9982918003237722, 0.9953610976136485, 0.045583888267649524, 0.9534629962650024, 1.0000772023980196, 1.0014043985177068, 0.9953610976136485, 0.2511725737495178, 0.2538234716255022, 0.1789356066289441, 0.31545684724213846, 0.0006627244689960892, 0.9981395824672362, 0.9998383194676624, 0.10731073954597727, 0.8942561628831439, 1.0023542669177257, 0.98576036302879, 0.002088475345399979, 0.010442376726999894, 1.0025405851959532, 0.9998001481159805, 1.0005213258558743, 0.33378796806096955, 0.19102732999008645, 0.3392264685589079, 0.005438500497938404, 0.13052401195052168, 1.003195053603506, 0.995604759144052, 0.9998199521346894, 0.984423063573938, 0.9959327546059459, 1.0085795197437992, 0.9961695252849555, 0.004369164584583138, 0.09680030877897128, 0.0020166730995619018, 0.90145287550417, 0.9784928023462637, 0.27078565809291133, 0.07049023480513883, 0.025789110294562986, 0.5642084241110502, 0.04527421585045502, 0.023210199265106687, 1.0042474457703152, 0.08790169260378938, 0.07936578443771893, 0.0917156090184166, 0.07954739950508212, 0.3919253153697882, 0.10878742535055752, 0.10352058839702469, 0.05720874621940838, 1.0005136827313446, 0.9955899206112452, 0.07603130881045521, 0.39844255503200576, 0.5254822102596018, 0.9995568334542988, 0.0711499189001523, 0.9285064416469877, 0.35066452838786877, 0.6497218242960134, 1.0012202601909006, 0.9960857973181266, 0.10099313640440453, 0.8994105732618669, 1.0042474457703152, 0.003500416007534892, 0.042004992090418705, 0.9556135700570255, 0.139849298619032, 0.04488989832215842, 0.16286975929706196, 0.0892042851273661, 0.31422928825510893, 0.000575511516950749, 0.1703514090174217, 0.07769405478835112, 0.9830352066079383, 1.000782133673109, 0.9987466795783208, 0.680900216068683, 0.11417958633462578, 0.09816659556818436, 0.10652119944632771, 0.9497059813683963, 0.04984272526330591, 0.997486726291253, 1.0011259505391505, 1.0001883427938532, 0.99970825754459, 0.9965343317475016, 0.046821058285525956, 0.9153057864837133, 0.0385585185880802, 1.0029461345742736, 1.001463742462123, 0.998531880565944, 0.9995368618897629, 0.9935185658817397, 1.0023030726195032, 0.5890654996434337, 0.097012270712791, 0.06642281598353257, 0.15294727364629213, 0.09439031745028313, 0.9997045439365588, 0.7486978124905728, 0.15361005199725805, 0.09676223747858775, 0.9979563528102225, 0.9953610976136485, 0.9926628220696108, 1.0024051362384638, 0.9987285040766569, 0.9988635858582318, 0.9995568334542987, 0.591510282647303, 0.4077645352717578, 1.000926188118343, 1.0009358704846572, 0.00282644624495468, 0.997735524469002, 0.9998199521346894, 0.8362171475891724, 0.16342457350466702, 1.0000454269292594, 0.9991069702080033, 0.9994653150761709, 1.0001074379057464, 0.9987019669753873, 0.9916339699369271, 0.008853874731579706, 0.995604759144052, 0.9968774810774548, 1.0019177062717592, 0.9952958799530844, 1.0078450327366728, 0.9943769165595225, 0.00504759856121585, 0.7649377322510628, 0.23316283817278385, 0.0017818195782239418, 0.08374552017652527, 0.9140734436288822, 1.0004291650118762, 0.8773617021384521, 0.1213959587864525, 0.0013794995316642328, 0.9987466795783209, 1.0026531203067888, 1.0004559728978695, 0.003079636476567878, 0.9978022184079924, 0.05054955804885311, 0.9492083678062417, 1.0001201580965042, 0.9910521751131566, 0.040216871562063355, 0.06166586972849714, 0.8981767982194149, 1.0002796374411036, 1.0013640417087168, 1.002695910740097, 1.0025405851959532, 0.7157429703195609, 0.038034650596691644, 0.08990008322854388, 0.05947236275119057, 0.0670792928705289, 0.029736181375595284, 0.16234039186010155, 0.0786264006160036, 0.16627171189090173, 0.13528365988341795, 0.10730191142889903, 0.35011873686067485, 1.0166119848926394, 0.14900234217859, 0.3211904035062513, 0.0688752245310645, 0.1186563274099527, 0.047394337672366164, 0.0006819329161491534, 0.2939130868602851, 0.00891138183357436, 0.989163383526754, 0.9999258664447198, 0.14261288176213696, 0.10268127486873863, 0.7558482733393259, 1.01371565445135, 0.997888712149221, 0.9994576571052332, 0.14951134279995998, 0.13170121419056036, 0.02437175493917843, 0.05671119899308826, 0.19309928913349061, 0.4445501838425142, 0.9983961743566053], \"Term\": [\"absolut\", \"absolut\", \"absolut\", \"abstract\", \"academ\", \"accept\", \"accept\", \"accept\", \"accept\", \"access\", \"access\", \"access\", \"access\", \"accid\", \"address\", \"address\", \"address\", \"administr\", \"administr\", \"administr\", \"administr\", \"aero\", \"agenc\", \"agenc\", \"agent\", \"aid\", \"alaska\", \"alexia\", \"alink\", \"altitud\", \"amend\", \"american\", \"american\", \"american\", \"amherst\", \"andi\", \"andrew\", \"andrew\", \"annual\", \"annual\", \"anonym\", \"anonym\", \"anonym\", \"anti\", \"anti\", \"anti\", \"anybodi\", \"anybodi\", \"apana\", \"appl\", \"appl\", \"appl\", \"appletalk\", \"applic\", \"applic\", \"arab\", \"argic\", \"argument\", \"argument\", \"argument\", \"armenia\", \"armenian\", \"armi\", \"armi\", \"arrog\", \"artist\", \"asham\", \"assert\", \"associ\", \"associ\", \"associ\", \"assumpt\", \"atheism\", \"atheist\", \"atlas\", \"attack\", \"attack\", \"attest\", \"audio\", \"austin\", \"auto\", \"auto\", \"avail\", \"avail\", \"avail\", \"avenu\", \"axi\", \"azerbaijan\", \"azerbaijani\", \"backup\", \"bacteria\", \"bailey\", \"baku\", \"ban\", \"bank\", \"bank\", \"bank\", \"base\", \"base\", \"base\", \"base\", \"base\", \"base\", \"base\", \"basebal\", \"basebal\", \"batteri\", \"baud\", \"bcstec\", \"behanna\", \"behanna\", \"belief\", \"believ\", \"believ\", \"benevol\", \"berkeley\", \"berkeley\", \"berkeley\", \"bernoulli\", \"bibl\", \"biblic\", \"bibliographi\", \"bigboot\", \"bike\", \"biker\", \"bio\", \"bit\", \"bloom\", \"blue\", \"blue\", \"blue\", \"bmerh\", \"board\", \"board\", \"board\", \"bogus\", \"bois\", \"bomb\", \"book\", \"book\", \"book\", \"boot\", \"bosnian\", \"boston\", \"bottleneck\", \"brake\", \"brand\", \"brandt\", \"brave\", \"brian\", \"brian\", \"broward\", \"buffalo\", \"buffalo\", \"bure\", \"bureaucrat\", \"burk\", \"buy\", \"buy\", \"cabl\", \"cager\", \"calendar\", \"callback\", \"calstat\", \"canada\", \"canada\", \"canada\", \"canada\", \"cancer\", \"candida\", \"car\", \"car\", \"carb\", \"card\", \"career\", \"case\", \"case\", \"case\", \"case\", \"case\", \"case\", \"case\", \"cathol\", \"caus\", \"caus\", \"caus\", \"caus\", \"caus\", \"caus\", \"center\", \"center\", \"center\", \"center\", \"center\", \"centri\", \"chan\", \"chang\", \"chang\", \"chang\", \"chang\", \"chang\", \"chang\", \"channel\", \"channel\", \"chicago\", \"chicago\", \"children\", \"children\", \"children\", \"chip\", \"chip\", \"chip\", \"chris\", \"chris\", \"christ\", \"christian\", \"church\", \"circuit\", \"civilian\", \"claim\", \"claim\", \"claim\", \"clamp\", \"clark\", \"clayton\", \"clearer\", \"cleveland\", \"cleveland\", \"client\", \"clinic\", \"clinton\", \"clipper\", \"cloth\", \"coat\", \"code\", \"code\", \"coloni\", \"color\", \"color\", \"columbia\", \"columbia\", \"columbia\", \"communion\", \"comp\", \"compil\", \"compil\", \"complain\", \"complain\", \"compress\", \"comput\", \"comput\", \"comput\", \"conclus\", \"conclus\", \"congress\", \"connect\", \"connect\", \"connect\", \"connector\", \"conscienc\", \"consid\", \"consid\", \"consid\", \"consid\", \"consid\", \"consid\", \"consid\", \"consid\", \"constitut\", \"constitut\", \"contact\", \"contact\", \"contradict\", \"control\", \"control\", \"control\", \"control\", \"convert\", \"cool\", \"copi\", \"copi\", \"copi\", \"copi\", \"copi\", \"cost\", \"cost\", \"cost\", \"couldn\", \"couldn\", \"countri\", \"countri\", \"coupl\", \"coupl\", \"coupl\", \"coupl\", \"coupl\", \"cours\", \"cours\", \"cours\", \"cours\", \"cours\", \"cours\", \"cours\", \"court\", \"court\", \"coventri\", \"covington\", \"craig\", \"cramer\", \"crime\", \"crime\", \"crucifi\", \"cruiser\", \"crux\", \"crypt\", \"crypto\", \"cryptolog\", \"cure\", \"cview\", \"cwru\", \"cycl\", \"cycl\", \"dalhousi\", \"daryl\", \"data\", \"data\", \"data\", \"data\", \"data\", \"david\", \"david\", \"david\", \"david\", \"david\", \"david\", \"davidian\", \"debug\", \"decvax\", \"default\", \"defens\", \"defens\", \"deficit\", \"definit\", \"definit\", \"definit\", \"den\", \"denomin\", \"dens\", \"depriv\", \"design\", \"design\", \"design\", \"design\", \"design\", \"detector\", \"detroit\", \"devic\", \"devic\", \"devil\", \"diagnos\", \"diagnosi\", \"diagram\", \"dialog\", \"diamond\", \"differ\", \"differ\", \"differ\", \"differ\", \"differ\", \"differ\", \"differ\", \"digex\", \"digex\", \"directori\", \"disarm\", \"disclaim\", \"disclaim\", \"disclaim\", \"diseas\", \"disk\", \"disk\", \"disobey\", \"display\", \"distribut\", \"distribut\", \"distribut\", \"distribut\", \"distribut\", \"distribut\", \"divin\", \"divis\", \"divis\", \"divis\", \"dock\", \"doctrin\", \"dog\", \"dorothi\", \"dose\", \"dragon\", \"dri\", \"drink\", \"drive\", \"driver\", \"driver\", \"drug\", \"dscomsa\", \"dseg\", \"dude\", \"duke\", \"duke\", \"dutch\", \"earth\", \"earth\", \"eat\", \"electron\", \"electron\", \"elementari\", \"email\", \"email\", \"email\", \"encrypt\", \"enforc\", \"engin\", \"engin\", \"engr\", \"entri\", \"escrow\", \"escrow\", \"esdi\", \"etern\", \"evas\", \"evid\", \"evid\", \"evil\", \"exampl\", \"exampl\", \"exampl\", \"exampl\", \"exist\", \"exist\", \"exist\", \"face\", \"face\", \"face\", \"face\", \"fact\", \"fact\", \"fact\", \"fact\", \"faith\", \"fan\", \"feder\", \"federalist\", \"feel\", \"feel\", \"feel\", \"feel\", \"file\", \"final\", \"final\", \"final\", \"final\", \"final\", \"finland\", \"firearm\", \"fiscal\", \"fist\", \"flash\", \"flight\", \"flight\", \"floppi\", \"fluid\", \"flyer\", \"follow\", \"follow\", \"follow\", \"follow\", \"follow\", \"follow\", \"font\", \"food\", \"footbal\", \"forc\", \"forc\", \"forc\", \"forc\", \"forc\", \"ford\", \"format\", \"format\", \"franklin\", \"freeman\", \"freenet\", \"friend\", \"friend\", \"friend\", \"friend\", \"frontier\", \"function\", \"function\", \"game\", \"gari\", \"gari\", \"gatech\", \"gaza\", \"gear\", \"general\", \"general\", \"general\", \"general\", \"general\", \"general\", \"geneva\", \"genocid\", \"german\", \"gibson\", \"glad\", \"glad\", \"glad\", \"goal\", \"goal\", \"goal\", \"goddess\", \"gonna\", \"good\", \"good\", \"good\", \"good\", \"good\", \"good\", \"good\", \"gordon\", \"gover\", \"govern\", \"govern\", \"graphic\", \"gray\", \"greec\", \"greek\", \"greenbelt\", \"gretzki\", \"grin\", \"grip\", \"group\", \"group\", \"group\", \"group\", \"group\", \"guidelin\", \"guitar\", \"gun\", \"hadn\", \"hallam\", \"halv\", \"hamburg\", \"hand\", \"hand\", \"hand\", \"hand\", \"hand\", \"handgun\", \"handler\", \"happen\", \"happen\", \"happen\", \"hard\", \"hard\", \"hard\", \"hard\", \"hard\", \"health\", \"health\", \"hear\", \"hear\", \"hear\", \"hear\", \"heaven\", \"helmet\", \"helmet\", \"henri\", \"henri\", \"heresi\", \"high\", \"high\", \"high\", \"high\", \"high\", \"histori\", \"histori\", \"histori\", \"histori\", \"hockey\", \"holi\", \"homicid\", \"homosexu\", \"honda\", \"hook\", \"hors\", \"hous\", \"hous\", \"hull\", \"hulman\", \"human\", \"human\", \"human\", \"hurt\", \"hurt\", \"hussein\", \"hypocrisi\", \"hypothet\", \"ieee\", \"illeg\", \"illinoi\", \"imag\", \"imag\", \"impair\", \"includ\", \"includ\", \"includ\", \"includ\", \"includ\", \"includ\", \"infal\", \"infant\", \"infect\", \"infin\", \"inform\", \"inform\", \"inform\", \"ingr\", \"init\", \"inject\", \"innoc\", \"innoc\", \"instal\", \"instal\", \"instal\", \"institut\", \"institut\", \"institut\", \"insur\", \"insur\", \"interest\", \"interest\", \"interest\", \"interest\", \"interest\", \"interest\", \"interest\", \"intermitt\", \"internet\", \"internet\", \"internet\", \"introduct\", \"irrit\", \"islam\", \"islam\", \"isra\", \"isra\", \"israel\", \"issu\", \"issu\", \"issu\", \"issu\", \"jacob\", \"jade\", \"jagr\", \"jesus\", \"jew\", \"jewish\", \"jewish\", \"job\", \"john\", \"john\", \"john\", \"john\", \"john\", \"jose\", \"journal\", \"jpeg\", \"jumper\", \"kansa\", \"kean\", \"keen\", \"keith\", \"keith\", \"keith\", \"key\", \"key\", \"kill\", \"kill\", \"kilroy\", \"king\", \"king\", \"king\", \"king\", \"kinsey\", \"koresh\", \"koufax\", \"krillean\", \"ksand\", \"laboratori\", \"laboratori\", \"land\", \"land\", \"laptop\", \"launch\", \"launchpad\", \"leaf\", \"leagu\", \"leather\", \"leav\", \"leav\", \"leav\", \"leav\", \"legal\", \"legisl\", \"lemon\", \"lethal\", \"libertarian\", \"liberti\", \"librari\", \"life\", \"life\", \"life\", \"life\", \"life\", \"light\", \"light\", \"lindro\", \"liner\", \"list\", \"list\", \"list\", \"list\", \"literatur\", \"littl\", \"littl\", \"littl\", \"littl\", \"littl\", \"littl\", \"live\", \"live\", \"live\", \"livesey\", \"lock\", \"lock\", \"long\", \"long\", \"long\", \"long\", \"long\", \"long\", \"lord\", \"lord\", \"lose\", \"lose\", \"lose\", \"lose\", \"lose\", \"loui\", \"love\", \"love\", \"love\", \"luke\", \"lunar\", \"lutheran\", \"lynx\", \"machin\", \"machin\", \"machin\", \"madam\", \"magnus\", \"mail\", \"mail\", \"make\", \"make\", \"make\", \"make\", \"make\", \"make\", \"manag\", \"manag\", \"manag\", \"manag\", \"mark\", \"mark\", \"mark\", \"mark\", \"mark\", \"mark\", \"marlin\", \"marriag\", \"marvel\", \"massacr\", \"mauric\", \"maxtor\", \"mayb\", \"mayb\", \"mayb\", \"mayb\", \"mayb\", \"meaning\", \"medic\", \"medicin\", \"megabyt\", \"mein\", \"melbourn\", \"mellon\", \"memoir\", \"memori\", \"memori\", \"memori\", \"messag\", \"messag\", \"messag\", \"meyer\", \"michael\", \"mickey\", \"microsoft\", \"midway\", \"mike\", \"mike\", \"mile\", \"mile\", \"militia\", \"milk\", \"minnesota\", \"mission\", \"mode\", \"mode\", \"model\", \"model\", \"model\", \"modem\", \"mogilni\", \"monitor\", \"monitor\", \"mono\", \"montreal\", \"moon\", \"moral\", \"moral\", \"mosqu\", \"motherboard\", \"motif\", \"moto\", \"motorcycl\", \"motorola\", \"mous\", \"movement\", \"murder\", \"muscl\", \"musicb\", \"muslim\", \"myer\", \"myrto\", \"nasa\", \"nation\", \"nation\", \"nation\", \"nation\", \"nation\", \"natur\", \"natur\", \"natur\", \"natur\", \"nazi\", \"nctu\", \"nearest\", \"neccessari\", \"netcom\", \"netcom\", \"netcom\", \"network\", \"news\", \"news\", \"news\", \"news\", \"newsgroup\", \"newsgroup\", \"newslett\", \"newsread\", \"newsread\", \"niel\", \"nodak\", \"nore\", \"notion\", \"nuclear\", \"null\", \"number\", \"number\", \"number\", \"number\", \"number\", \"number\", \"occupi\", \"offens\", \"offens\", \"ohio\", \"ohio\", \"okcforum\", \"onlin\", \"onlin\", \"opinion\", \"opinion\", \"opinion\", \"opinion\", \"opinion\", \"optilink\", \"oracl\", \"orbit\", \"ottoman\", \"ouch\", \"outlet\", \"output\", \"packag\", \"packag\", \"pain\", \"palestinian\", \"panther\", \"paper\", \"paper\", \"paper\", \"partnership\", \"passer\", \"passion\", \"patch\", \"patent\", \"patent\", \"patient\", \"patrick\", \"peac\", \"peac\", \"penalti\", \"penguin\", \"pentium\", \"peopl\", \"peopl\", \"peopl\", \"peopl\", \"peopl\", \"period\", \"period\", \"period\", \"period\", \"period\", \"period\", \"perpetr\", \"person\", \"person\", \"person\", \"person\", \"person\", \"person\", \"philadelphia\", \"phone\", \"phone\", \"phone\", \"phone\", \"photoshop\", \"physician\", \"pick\", \"pick\", \"pinout\", \"piss\", \"pistol\", \"pitch\", \"pitt\", \"pitt\", \"pixmap\", \"planet\", \"planet\", \"play\", \"player\", \"playoff\", \"point\", \"point\", \"point\", \"point\", \"point\", \"point\", \"polygon\", \"popul\", \"popul\", \"porsch\", \"port\", \"port\", \"portal\", \"postscript\", \"power\", \"power\", \"power\", \"power\", \"power\", \"power\", \"powerpc\", \"practition\", \"presid\", \"preview\", \"price\", \"price\", \"price\", \"price\", \"printer\", \"printer\", \"prism\", \"privat\", \"privat\", \"probabl\", \"probabl\", \"probabl\", \"probabl\", \"probabl\", \"probabl\", \"probabl\", \"probabl\", \"probe\", \"problem\", \"problem\", \"problem\", \"problem\", \"problem\", \"problem\", \"program\", \"program\", \"program\", \"prohibit\", \"project\", \"project\", \"project\", \"propos\", \"propos\", \"propos\", \"protect\", \"protect\", \"protect\", \"protein\", \"provid\", \"provid\", \"provid\", \"provid\", \"provid\", \"public\", \"public\", \"public\", \"pull\", \"pump\", \"purdu\", \"purdu\", \"pwiseman\", \"quadra\", \"question\", \"question\", \"question\", \"question\", \"question\", \"question\", \"question\", \"question\", \"radar\", \"random\", \"random\", \"ranger\", \"rapist\", \"read\", \"read\", \"read\", \"read\", \"read\", \"read\", \"reason\", \"reason\", \"reason\", \"reason\", \"reason\", \"receiv\", \"receiv\", \"receiv\", \"regret\", \"regul\", \"reilli\", \"reinstal\", \"religion\", \"rememb\", \"rememb\", \"rememb\", \"rememb\", \"renam\", \"repli\", \"repli\", \"repli\", \"repli\", \"reproduct\", \"republican\", \"request\", \"request\", \"research\", \"research\", \"research\", \"research\", \"resiz\", \"resourc\", \"resourc\", \"rethink\", \"revok\", \"revolut\", \"revolv\", \"ribbon\", \"richer\", \"rid\", \"ride\", \"rider\", \"ripem\", \"robert\", \"robert\", \"robert\", \"robertson\", \"rock\", \"rocket\", \"roger\", \"rooki\", \"roster\", \"roth\", \"routin\", \"run\", \"run\", \"run\", \"run\", \"rwing\", \"safeguard\", \"sage\", \"sale\", \"sale\", \"salmon\", \"sandvik\", \"santa\", \"satellit\", \"savag\", \"savior\", \"scanner\", \"scienc\", \"scienc\", \"scienc\", \"scienc\", \"score\", \"screen\", \"scriptur\", \"scsi\", \"seagat\", \"season\", \"secreci\", \"secret\", \"secret\", \"section\", \"section\", \"section\", \"secur\", \"secur\", \"secur\", \"sell\", \"sell\", \"sell\", \"sell\", \"send\", \"send\", \"send\", \"send\", \"serdar\", \"server\", \"servic\", \"servic\", \"servic\", \"servic\", \"ship\", \"ship\", \"ship\", \"shuttl\", \"signatur\", \"simm\", \"slaveri\", \"slump\", \"small\", \"small\", \"small\", \"small\", \"smith\", \"smith\", \"smith\", \"softwar\", \"softwar\", \"softwar\", \"solar\", \"soldier\", \"sound\", \"sound\", \"sound\", \"sound\", \"sourc\", \"sourc\", \"sourc\", \"sourc\", \"soviet\", \"soviet\", \"space\", \"space\", \"spacecraft\", \"spanish\", \"spec\", \"spec\", \"speed\", \"speed\", \"speed\", \"spencer\", \"spirit\", \"sport\", \"sport\", \"spreadsheet\", \"stake\", \"start\", \"start\", \"start\", \"start\", \"start\", \"state\", \"state\", \"state\", \"state\", \"state\", \"static\", \"station\", \"station\", \"statut\", \"steer\", \"stop\", \"stop\", \"stop\", \"stop\", \"strain\", \"stream\", \"string\", \"stroke\", \"stupid\", \"stupid\", \"subscrib\", \"subscript\", \"summari\", \"summari\", \"summari\", \"sunlight\", \"sunni\", \"support\", \"support\", \"support\", \"support\", \"support\", \"support\", \"surfac\", \"svga\", \"sweat\", \"switch\", \"switch\", \"symptom\", \"syndrom\", \"sysop\", \"talk\", \"talk\", \"talk\", \"talk\", \"talk\", \"talon\", \"tamu\", \"tape\", \"tape\", \"tast\", \"teach\", \"teach\", \"teach\", \"teal\", \"team\", \"technic\", \"technolog\", \"technolog\", \"technolog\", \"technolog\", \"technolog\", \"telescop\", \"telnet\", \"temperatur\", \"tender\", \"tenn\", \"tennesse\", \"territori\", \"territori\", \"texa\", \"texa\", \"texa\", \"thai\", \"thing\", \"thing\", \"thing\", \"thing\", \"thing\", \"thing\", \"thrower\", \"time\", \"time\", \"time\", \"time\", \"time\", \"time\", \"time\", \"time\", \"titan\", \"tobacco\", \"today\", \"today\", \"today\", \"toni\", \"topic\", \"topic\", \"toronto\", \"toronto\", \"torqu\", \"toyota\", \"trade\", \"trade\", \"tranquil\", \"treatment\", \"treatment\", \"treatment\", \"tri\", \"tri\", \"tri\", \"tri\", \"tri\", \"tri\", \"tri\", \"tri\", \"trivia\", \"troop\", \"truck\", \"true\", \"true\", \"true\", \"true\", \"truth\", \"truth\", \"turbo\", \"turk\", \"turkey\", \"turkish\", \"turkiy\", \"turn\", \"turn\", \"turn\", \"uart\", \"uchicago\", \"udel\", \"uiuc\", \"ukan\", \"umich\", \"understand\", \"understand\", \"understand\", \"understand\", \"understand\", \"univ\", \"unix\", \"unix\", \"unix\", \"unplug\", \"unsaf\", \"uokmax\", \"uoknor\", \"upenn\", \"upgrad\", \"urbana\", \"user\", \"user\", \"utexa\", \"utkvm\", \"vehicl\", \"vehicl\", \"venus\", \"version\", \"version\", \"video\", \"viewer\", \"villag\", \"virginia\", \"virtu\", \"visual\", \"visual\", \"vitamin\", \"voltag\", \"vram\", \"vulcan\", \"wallac\", \"warrant\", \"warrant\", \"wasn\", \"wasn\", \"water\", \"water\", \"water\", \"watt\", \"weapon\", \"weapon\", \"weapon\", \"wear\", \"weren\", \"widget\", \"william\", \"william\", \"win\", \"win\", \"window\", \"windshield\", \"wing\", \"wing\", \"wing\", \"wire\", \"wiretap\", \"wong\", \"worcest\", \"word\", \"word\", \"word\", \"word\", \"word\", \"word\", \"work\", \"work\", \"work\", \"work\", \"work\", \"work\", \"workgroup\", \"world\", \"world\", \"world\", \"world\", \"world\", \"world\", \"world\", \"wors\", \"wors\", \"worship\", \"wouldn\", \"wouldn\", \"wouldn\", \"xcopyarea\", \"xlib\", \"xterm\", \"year\", \"year\", \"year\", \"year\", \"year\", \"year\", \"yeast\"]}, \"R\": 30, \"lambda.step\": 0.01, \"plot.opts\": {\"xlab\": \"PC1\", \"ylab\": \"PC2\"}, \"topic.order\": [4, 9, 5, 6, 10, 2, 7, 1, 8, 3]};\n", + "\n", + "function LDAvis_load_lib(url, callback){\n", + " var s = document.createElement('script');\n", + " s.src = url;\n", + " s.async = true;\n", + " s.onreadystatechange = s.onload = callback;\n", + " s.onerror = function(){console.warn(\"failed to load library \" + url);};\n", + " document.getElementsByTagName(\"head\")[0].appendChild(s);\n", + "}\n", + "\n", + "if(typeof(LDAvis) !== \"undefined\"){\n", + " // already loaded: just create the visualization\n", + " !function(LDAvis){\n", + " new LDAvis(\"#\" + \"ldavis_el15587112430946968420164328\", ldavis_el15587112430946968420164328_data);\n", + " }(LDAvis);\n", + "}else if(typeof define === \"function\" && define.amd){\n", + " // require.js is available: use it to load d3/LDAvis\n", + " require.config({paths: {d3: \"https://cdnjs.cloudflare.com/ajax/libs/d3/3.5.5/d3.min\"}});\n", + " require([\"d3\"], function(d3){\n", + " window.d3 = d3;\n", + " LDAvis_load_lib(\"https://cdn.rawgit.com/bmabey/pyLDAvis/files/ldavis.v1.0.0.js\", function(){\n", + " new LDAvis(\"#\" + \"ldavis_el15587112430946968420164328\", ldavis_el15587112430946968420164328_data);\n", + " });\n", + " });\n", + "}else{\n", + " // require.js not available: dynamically load d3 & LDAvis\n", + " LDAvis_load_lib(\"https://cdnjs.cloudflare.com/ajax/libs/d3/3.5.5/d3.min.js\", function(){\n", + " LDAvis_load_lib(\"https://cdn.rawgit.com/bmabey/pyLDAvis/files/ldavis.v1.0.0.js\", function(){\n", + " new LDAvis(\"#\" + \"ldavis_el15587112430946968420164328\", ldavis_el15587112430946968420164328_data);\n", + " })\n", + " });\n", + "}\n", + "</script>" + ], + "text/plain": [ + "<IPython.core.display.HTML object>" ] }, - "execution_count": 155, + "execution_count": 31, "metadata": {}, "output_type": "execute_result" } ], "source": [ - "p = visualize_topics(model, bow_corpus, dictionary)\n", + "# Mallet\n", + "p = visualize_topics(model_mallet, bow_corpus, dictionary, model_type='mallet')\n", "p" ] }, From f18c4d872f4e14a7f70a418c5a0d730465c29b3d Mon Sep 17 00:00:00 2001 From: hugovasselin <waaaouu@gmail.com> Date: Wed, 22 May 2019 15:30:50 +0200 Subject: [PATCH 162/496] fix emoji --- nautilus_nlp/utils/preprocess.py | 15 ++++++--------- requirements.txt | 2 +- tests/test_preprocessor.py | 11 +++++++---- 3 files changed, 14 insertions(+), 14 deletions(-) diff --git a/nautilus_nlp/utils/preprocess.py b/nautilus_nlp/utils/preprocess.py index 70d8148..c1a3b6e 100644 --- a/nautilus_nlp/utils/preprocess.py +++ b/nautilus_nlp/utils/preprocess.py @@ -12,6 +12,7 @@ import re import unicodedata +import emoji as _emoji from ftfy import fix_text from stop_words import get_stop_words as _get_stop_words from stop_words import LANGUAGE_MAPPING as _LANGUAGE_MAPPING @@ -40,7 +41,8 @@ def remove_multiple_spaces_and_strip_text(text): def remove_EOL_characters(text): - """Remove end of line (\n) char. + """ + Remove end of line char. Parameters ---------- text : str, @@ -157,11 +159,6 @@ def normalize_whitespace(text) -> str: ).strip() -def unpack_french_contractions(text) -> str: - - return text - - def unpack_english_contractions(text) -> str: """ Replace *English* contractions in ``text`` str with their unshortened forms. @@ -309,7 +306,7 @@ def remove_accents(text, method="unicode") -> str: def remove_emoji(word): """ - Remove emoji from any str by stripping any unicode in the range of Emoji unicode, + Remove emoji from any str by stripping any unicode in the range of Emoji unicode, Args: word (str): raw word @@ -318,8 +315,8 @@ def remove_emoji(word): str """ - RE_EMOJI = re.compile("[\U00010000-\U0010ffff]", flags=re.UNICODE) - word = RE_EMOJI.sub(r"", word) + emoji_pattern = _emoji.get_emoji_regexp() + word = emoji_pattern.sub(r"", word) return word diff --git a/requirements.txt b/requirements.txt index 2038b34..35282d3 100644 --- a/requirements.txt +++ b/requirements.txt @@ -37,5 +37,5 @@ vaderSentiment==3.2.1 google-compute-engine==2.8.13 flashtext==2.7 phonenumbers==8.10.12 - +emoji>=0.5.2 diff --git a/tests/test_preprocessor.py b/tests/test_preprocessor.py index 46c2fb4..3394193 100644 --- a/tests/test_preprocessor.py +++ b/tests/test_preprocessor.py @@ -219,7 +219,7 @@ def test_replace_numbers(input_str, expected_str): ("Give me 23£",None,"Give me 23GBP"), ("Give me 23 £",None,"Give me 23 GBP"), ("Give me 23 €",None,"Give me 23 EUR"), - ('¥ is both japanese yen and Chinese Renminbi',"*CUR*","*CUR* is both japanese yen and Chinese Renminbi") + ("¥ is both japanese yen and Chinese Renminbi","*CUR*","*CUR* is both japanese yen and Chinese Renminbi") ] ) def test_replace_currency_symbols(input_str, param, expected_str): @@ -256,12 +256,15 @@ def test_remove_punct(input_str, param, expected_str): "input_str, expected_str", [ ("👉👌",""), - ("🎅🏿",""), + ("🎅🏿⌚",""), ("🥖✊💦",""), + ("✊",""), ("J'espère que les 🚓 vont pas lire ce test", - "J'espère que les vont pas lire ce test") + "J'espère que les vont pas lire ce test"), + ("J'espère que les vont pas lire ce test🚓", + "J'espère que les vont pas lire ce test") ] ) def test_remove_emoji(input_str, expected_str): result = remove_emoji(input_str) - np.testing.assert_equal(result, expected_str) \ No newline at end of file + np.testing.assert_equal(result, expected_str) \ No newline at end of file From af8ca5df34044e0838bf145541bfe1157eff7ee0 Mon Sep 17 00:00:00 2001 From: hugovasselin <waaaouu@gmail.com> Date: Wed, 22 May 2019 16:42:17 +0200 Subject: [PATCH 163/496] fix number #84 --- nautilus_nlp/utils/constants.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/nautilus_nlp/utils/constants.py b/nautilus_nlp/utils/constants.py index 341e93a..b73c1c6 100644 --- a/nautilus_nlp/utils/constants.py +++ b/nautilus_nlp/utils/constants.py @@ -135,7 +135,7 @@ r"(?:^|(?<=[^\w)]))(\+?1[ .-]?)?(\(?\d{3}\)?[ .-]?)?(\d{3}[ .-]?\d{4})(\s?(?:ext\.?|[#x-])\s?\d{2,6})?(?:$|(?=\W))" ) NUMBERS_REGEX = re.compile( - r"(?:^|(?<=[^\w,.]))[+–-]?(([1-9]\d{0,2}(,\d{3})+(\.\d*)?)|([1-9]\d{0,2}([ .]\d{3})+(,\d*)?)|(\d*?[.,]\d+)|\d+)(?:$|(?=\b))" + r"(?:^|(?<=[^\w,.]))[+–-]?(([1-9]\d{0,2}(,\d{3})+(\.\d*)?)|([1-9]\d{0,2}([ .]\d{3})+(,\d*)?)|(\d*?[.,]\d+)|\d+)(?:|(?=\b))" ) CURRENCY_REGEX = re.compile( "({})+".format("|".join(re.escape(c) for c in CURRENCIES.keys())) From 7dc64737b912b1c367d2f638667ae9f39da2bac7 Mon Sep 17 00:00:00 2001 From: hugovasselin <waaaouu@gmail.com> Date: Wed, 22 May 2019 18:10:57 +0200 Subject: [PATCH 164/496] remove duplicate preprocess --- nautilus_nlp/utils/preprocess.py | 394 ------------------------------- 1 file changed, 394 deletions(-) delete mode 100644 nautilus_nlp/utils/preprocess.py diff --git a/nautilus_nlp/utils/preprocess.py b/nautilus_nlp/utils/preprocess.py deleted file mode 100644 index c1a3b6e..0000000 --- a/nautilus_nlp/utils/preprocess.py +++ /dev/null @@ -1,394 +0,0 @@ -# -*- coding: utf-8 -*- -""" -Functions that modify raw text *in-place*, replacing contractions, URLs, emails, -phone numbers, and currency symbols with standardized forms. These should be -applied before processing by `Spacy <http://spacy.io>`_, but be warned: preprocessing -may affect the interpretation of the text -- and spacy's processing of it. -""" -from __future__ import absolute_import, division, print_function, unicode_literals - -import os -import json -import re -import unicodedata - -import emoji as _emoji -from ftfy import fix_text -from stop_words import get_stop_words as _get_stop_words -from stop_words import LANGUAGE_MAPPING as _LANGUAGE_MAPPING - -from . import constants -from nautilus_nlp.config.config import ROOT_FOLDER -from nautilus_nlp.utils.file_loader import documents_loader - -STOPWORDS_JSON_FILEPATH = os.path.join(ROOT_FOLDER, "data", "stopwords.json") - - -def remove_multiple_spaces_and_strip_text(text): - """Remove multiple spaces, strip text, and remove '-', '*' characters. - Parameters - ---------- - text : str, - Returns - ------- - str - """ - regex_remove_multiple_spaces_list = ["\\t", "[\\s\\-\\*]{2,}"] - for regex_remove_multiple_spaces in regex_remove_multiple_spaces_list: - text = re.sub(regex_remove_multiple_spaces, " ", text) - text = text.strip() - return text - - -def remove_EOL_characters(text): - """ - Remove end of line char. - Parameters - ---------- - text : str, - Returns - ------- - str - """ - return text.replace("\n", "") - - -def remove_tokens_with_nonletters(tokens): - """ - Inputs a list of tokens, outputs a list of tokens without tokens that - includes numbers of special caracters - """ - return [word for word in tokens if re.search("[a-zA-Z]", word)] - - -def remove_special_caracters(tokens): - """ Checks for letters in the token - using a regex search. - Strings that are just punctuation will - be removed! No more custom '--'. But ''s' and '9' will remain. - """ - return [word for word in tokens if re.search("[a-zA-Z0-9]", word)] - - -def _load_stopwords_from_json(filepath=STOPWORDS_JSON_FILEPATH): - stopwords = documents_loader(filepath) - stopwords = json.loads(stopwords) - return stopwords - - -def get_stopwords(lang: str = "en"): - """ - Inputs a language code, returns a list of stopwords for the specified language - - Args: - lang: Supported languages: ['ar', 'bg', 'ca', 'cz', 'da', 'nl', 'en', - 'fi', 'fr', 'de', 'hi', 'hu', 'id', 'it', 'nb', 'pl', 'pt', 'ro', 'ru', - 'sk', 'es', 'sv', 'tr', 'uk', 'vi', 'af', 'ha', 'so', 'st', 'sw', 'yo', - 'zu', 'da', 'de', 'es', 'et', 'fi', 'fr', 'hr', 'hu', 'it', 'ko', 'nl', - 'no', 'pl', 'pt', 'ru', 'sv', 'tr', 'zh', 'eo', 'he', 'la', 'sk', 'sl', - 'br', 'ca', 'cs', 'el', 'eu', 'ga', 'gl', 'hy', 'id', 'ja', 'lv', 'th', - 'ar', 'bg', 'bn', 'fa', 'hi', 'mr', 'ro', 'en'] - """ - if type(lang) == str and len(lang) == 2: - lang = lang.lower() - - custom_stopwords = _load_stopwords_from_json(STOPWORDS_JSON_FILEPATH) - stopwords = [] - - supported_lang_lib = list(_LANGUAGE_MAPPING.keys()) - supported_lang_custom = list(custom_stopwords.keys()) - supported_lang = supported_lang_lib + supported_lang_custom - if lang in supported_lang: - if lang in supported_lang_lib: - stopwords += _get_stop_words(lang) - if lang in supported_lang_custom: - stopwords += custom_stopwords[lang] - else: - raise ValueError( - "Language not available yet or incorrect country code. Supported languages: {}".format( - supported_lang - ) - ) - else: - raise ValueError( - 'Please input a valid country code, in 2 letters. Eg. "us" for USA. ' - ) - return list(set(stopwords)) - - -def remove_stopwords(text_or_tokens, stopwords): - """ - Remove stopwords from tokens. - """ - if type(text_or_tokens) is str: - return [word for word in text_or_tokens.split() if word not in stopwords] - elif type(text_or_tokens) is list: - return [word for word in text_or_tokens if word not in stopwords] - else: - raise ValueError("must input string or list of tokens") - - -def fix_bad_unicode(text, normalization="NFC") -> str: - """ - Fix unicode text that's "broken" using `ftfy <http://ftfy.readthedocs.org/>`_; - this includes mojibake, HTML entities and other code cruft, - and non-standard forms for display purposes. - - Args: - text (str): raw text - normalization ({'NFC', 'NFKC', 'NFD', 'NFKD'}): if 'NFC', - combines characters and diacritics written using separate code points, - e.g. converting "e" plus an acute accent modifier into "é"; unicode - can be converted to NFC form without any change in its meaning! - if 'NFKC', additional normalizations are applied that can change - the meanings of characters, e.g. ellipsis characters will be replaced - with three periods - - Returns: - str - """ - return fix_text(text, normalization=normalization) - - -def normalize_whitespace(text) -> str: - """ - Given ``text`` str, replace one or more spacings with a single space, and one - or more linebreaks with a single newline. Also strip leading/trailing whitespace. - """ - return constants.NONBREAKING_SPACE_REGEX.sub( - " ", constants.LINEBREAK_REGEX.sub(r"\n", text) - ).strip() - - -def unpack_english_contractions(text) -> str: - """ - Replace *English* contractions in ``text`` str with their unshortened forms. - N.B. The "'d" and "'s" forms are ambiguous (had/would, is/has/possessive), - so are left as-is. - """ - # standard - text = re.sub( - r"(\b)([Aa]re|[Cc]ould|[Dd]id|[Dd]oes|[Dd]o|[Hh]ad|[Hh]as|[Hh]ave|[Ii]s|[Mm]ight|[Mm]ust|[Ss]hould|[Ww]ere|[Ww]ould)n't", - r"\1\2 not", - text, - ) - text = re.sub( - r"(\b)([Hh]e|[Ii]|[Ss]he|[Tt]hey|[Ww]e|[Ww]hat|[Ww]ho|[Yy]ou)'ll", - r"\1\2 will", - text, - ) - text = re.sub(r"(\b)([Tt]hey|[Ww]e|[Ww]hat|[Ww]ho|[Yy]ou)'re", r"\1\2 are", text) - text = re.sub( - r"(\b)([Ii]|[Ss]hould|[Tt]hey|[Ww]e|[Ww]hat|[Ww]ho|[Ww]ould|[Yy]ou)'ve", - r"\1\2 have", - text, - ) - # non-standard - text = re.sub(r"(\b)([Cc]a)n't", r"\1\2n not", text) - text = re.sub(r"(\b)([Ii])'m", r"\1\2 am", text) - text = re.sub(r"(\b)([Ll]et)'s", r"\1\2 us", text) - text = re.sub(r"(\b)([Ww])on't", r"\1\2ill not", text) - text = re.sub(r"(\b)([Ss])han't", r"\1\2hall not", text) - text = re.sub(r"(\b)([Yy])(?:'all|a'll)", r"\1\2ou all", text) - return text - - -def unpack_contractions_from_lang(text, lang: str = "fr") -> str: - if lang == "fr": - return unpack_english_contractions(text) - else: - return unpack_english_contractions(text) - - -def replace_urls(text, replace_with="*URL*") -> str: - """Replace all URLs in ``text`` str with ``replace_with`` str.""" - return constants.URL_REGEX.sub( - replace_with, constants.SHORT_URL_REGEX.sub(replace_with, text) - ) - - -def replace_emails(text, replace_with="*EMAIL*") -> str: - """Replace all emails in ``text`` str with ``replace_with`` str.""" - return constants.EMAIL_REGEX.sub(replace_with, text) - - -def replace_phone_numbers(text, replace_with="*PHONE*") -> str: - """Replace all phone numbers in ``text`` str with ``replace_with`` str.""" - return constants.PHONE_REGEX.sub(replace_with, text) - - -def replace_numbers(text, replace_with="*NUMBER*") -> str: - """Replace all numbers in ``text`` str with ``replace_with`` str.""" - return constants.NUMBERS_REGEX.sub(replace_with, text) - - -def replace_currency_symbols(text, replace_with=None) -> str: - """ - Replace all currency symbols in ``text`` str with string specified by ``replace_with`` str. - - Args: - text (str): raw text - replace_with (str): if None (default), replace symbols with - their standard 3-letter abbreviations (e.g. '$' with 'USD', '£' with 'GBP'); - otherwise, pass in a string with which to replace all symbols - (e.g. "*CURRENCY*") - - Returns: - str - """ - if replace_with is None: - for k, v in constants.CURRENCIES.items(): - text = text.replace(k, v) - return text - else: - return constants.CURRENCY_REGEX.sub(replace_with, text) - - -def remove_punct(text, marks=None) -> str: - """ - Remove punctuation from ``text`` by replacing all instances of ``marks`` - with whitespace. - - Args: - text (str): raw text - marks (str): If specified, remove only the characters in this string, - e.g. ``marks=',;:'`` removes commas, semi-colons, and colons. - Otherwise, all punctuation marks are removed. - - Returns: - str - - Note: - When ``marks=None``, Python's built-in :meth:`str.translate()` is - used to remove punctuation; otherwise, a regular expression is used - instead. The former's performance is about 5-10x faster. - """ - if marks: - return re.sub("[{}]+".format(re.escape(marks)), " ", text, flags=re.UNICODE) - else: - return text.translate(constants.PUNCT_TRANSLATE_UNICODE) - - -def remove_accents(text, method="unicode") -> str: - """ - Remove accents from any accented unicode characters in ``text`` str, either by - transforming them into ascii equivalents or removing them entirely. - - Args: - text (str): raw text - method ({'unicode', 'ascii'}): if 'unicode', remove accented - char for any unicode symbol with a direct ASCII equivalent; if 'ascii', - remove accented char for any unicode symbol - - NB: the 'ascii' method is notably faster than 'unicode', but less good - - Returns: - str - - Raises: - ValueError: if ``method`` is not in {'unicode', 'ascii'} - """ - if method == "unicode": - return "".join( - c - for c in unicodedata.normalize("NFKD", text) - if not unicodedata.combining(c) - ) - elif method == "ascii": - return ( - unicodedata.normalize("NFKD", text) - .encode("ascii", errors="ignore") - .decode("ascii") - ) - else: - msg = '`method` must be either "unicode" and "ascii", not {}'.format(method) - raise ValueError(msg) - - -def remove_emoji(word): - """ - Remove emoji from any str by stripping any unicode in the range of Emoji unicode, - - Args: - word (str): raw word - - Returns: - str - - """ - emoji_pattern = _emoji.get_emoji_regexp() - word = emoji_pattern.sub(r"", word) - return word - - -def preprocess_text( - text, - no_emoji=False, - fix_unicode=False, - lowercase=False, - no_urls=False, - no_emails=False, - no_phone_numbers=False, - no_numbers=False, - no_currency_symbols=False, - no_punct=False, - no_contractions=False, - no_accents=False, -) -> str: - """ - Normalize various aspects of a raw text doc before parsing it with Spacy. - A convenience function for applying all other preprocessing functions in one go. - - Args: - text (str): raw text to preprocess - fix_unicode (bool): if True, fix "broken" unicode such as - mojibake and garbled HTML entities - lowercase (bool): if True, all text is lower-cased - no_urls (bool): if True, replace all URL strings with '*URL*' - no_emails (bool): if True, replace all email strings with '*EMAIL*' - no_phone_numbers (bool): if True, replace all phone number strings - with '*PHONE*' - no_numbers (bool): if True, replace all number-like strings - with '*NUMBER*' - no_currency_symbols (bool): if True, replace all currency symbols - with their standard 3-letter abbreviations - no_punct (bool): if True, remove all punctuation (replace with - empty string) - no_contractions (bool): if True, replace *English* contractions - with their unshortened forms - no_accents (bool): if True, replace all accented characters - with unaccented versions - - Returns: - str: input ``text`` processed according to function args - - Warning: - These changes may negatively affect subsequent NLP analysis performed - on the text, so choose carefully, and preprocess at your own risk! - """ - - assert isinstance(text, str), "The text to preprocess must be a string" - - if fix_unicode is True: - text = fix_bad_unicode(text, normalization="NFC") - if no_urls is True: - text = replace_urls(text) - if no_emails is True: - text = replace_emails(text) - if no_phone_numbers is True: - text = replace_phone_numbers(text) - if no_numbers is True: - text = replace_numbers(text) - if no_currency_symbols is True: - text = replace_currency_symbols(text) - if no_contractions is True: - text = unpack_contractions_from_lang(text) - if no_accents is True: - text = remove_accents(text, method="unicode") - if no_punct is True: - text = remove_punct(text) - if lowercase is True: - text = text.lower() - # always normalize whitespace; treat linebreaks separately from spacing - text = normalize_whitespace(text) - - return text From f8eecc02403cd91252c31420fd3fd62473731cdd Mon Sep 17 00:00:00 2001 From: hugovasselin <waaaouu@gmail.com> Date: Wed, 22 May 2019 18:11:08 +0200 Subject: [PATCH 165/496] fix emoji --- nautilus_nlp/preprocessing/preprocess.py | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/nautilus_nlp/preprocessing/preprocess.py b/nautilus_nlp/preprocessing/preprocess.py index 2722b53..435bac2 100644 --- a/nautilus_nlp/preprocessing/preprocess.py +++ b/nautilus_nlp/preprocessing/preprocess.py @@ -7,6 +7,7 @@ import re import unicodedata +import emoji as _emoji from ftfy import fix_text as _fix_text from stop_words import get_stop_words as _get_stop_words from stop_words import LANGUAGE_MAPPING as _LANGUAGE_MAPPING @@ -459,19 +460,20 @@ def remove_accents(text:str, method:str="unicode") -> str: def remove_emoji(text:str) -> str: """ - Remove emoji from any str by stripping any unicode in the range of Emoji unicode, + Remove emoji from any str by stripping any unicode in the range of Emoji unicode + http://www.unicode.org/emoji/charts/full-emoji-list.html Parameters ---------- - text : str - raw text + word : str + raw word Returns ------- - string + str """ - RE_EMOJI = re.compile("[\U00010000-\U0010ffff]", flags=re.UNICODE) - word = RE_EMOJI.sub(r"", text) + emoji_pattern = _emoji.get_emoji_regexp() + word = emoji_pattern.sub("", text) return word From d654c9d92a90c7eacef2674c05f49e4a4abbed1b Mon Sep 17 00:00:00 2001 From: hugovasselin <waaaouu@gmail.com> Date: Wed, 22 May 2019 18:12:54 +0200 Subject: [PATCH 166/496] fix unit tests #84 --- tests/test_preprocessor.py | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/tests/test_preprocessor.py b/tests/test_preprocessor.py index 3394193..e4ab431 100644 --- a/tests/test_preprocessor.py +++ b/tests/test_preprocessor.py @@ -202,9 +202,9 @@ def test_replace_phone_numbers(input_str, expected_str): "input_str, expected_str", [ ("123, 3 petits chats","*NUMBER*, *NUMBER* petits chats"), - ("l0ve 2 twa <3","l*NUMBER*ve *NUMBER* twa <*NUMBER*"), + ("l0ve 2 twa <3","l0ve *NUMBER* twa <*NUMBER*"), ("Give me 45bucks!","Give me *NUMBER*bucks!"), - ("call me at +33625093267","call me at +*NUMBER*") + ("call me at +33625093267","call me at *NUMBER*") ] ) def test_replace_numbers(input_str, expected_str): @@ -229,7 +229,7 @@ def test_replace_currency_symbols(input_str, param, expected_str): @pytest.mark.parametrize( "input_str, param, expected_str", [ - ("Seriously...",None,"Seriously "), + ("Seriously...",None,"Seriously "), ("Seriously?",None,"Seriously "), ("Seriously ?",None,"Seriously "), ("Seriously???",None,"Seriously "), @@ -238,13 +238,13 @@ def test_replace_currency_symbols(input_str, param, expected_str): ('Seriously:',None,"Seriously "), ('Seriously;',None,"Seriously "), ("'Seriously'",None," Seriously "), - ("'Seriously'",'.,;','Seriously'), - ("Seriously...",'.,;','Seriously '), - ("Seriously.,.",'.,;','Seriously '), - ("Seriously.!.",'.,;','Seriously ! '), - ("hugo.vasselin@artefact.com",'.,;','hugo vasselin@artefact com'), - ("hugo.vasselin@artefact.com",None,'hugo vasselin@artefact com'), - ("hugo-vasselin@artefact.com",None,'hugo vasselin@artefact com') + ("'Seriously'",'.,;',"'Seriously'"), + ("Seriously.,.",'.,;',"Seriously "), + ("Seriously...",'.,;',"Seriously "), + ("Seriously.!.",'.,;',"Seriously ! "), + ("hugo.vasselin@artefact.com",'.,;',"hugo vasselin@artefact com"), + ("hugo.vasselin@artefact.com",None,"hugo vasselin@artefact com"), + ("hugo-vasselin@artefact.com",None,"hugo vasselin@artefact com") ] ) def test_remove_punct(input_str, param, expected_str): From 5ef6fae6da8db655f8b5cd0abb63ea0285b3aa96 Mon Sep 17 00:00:00 2001 From: hugovasselin <waaaouu@gmail.com> Date: Wed, 22 May 2019 18:20:18 +0200 Subject: [PATCH 167/496] fix unit tests --- tests/test_document_loader.py | 39 +++++++++++++++++++++++------------ 1 file changed, 26 insertions(+), 13 deletions(-) diff --git a/tests/test_document_loader.py b/tests/test_document_loader.py index 5629511..f445f26 100644 --- a/tests/test_document_loader.py +++ b/tests/test_document_loader.py @@ -8,56 +8,66 @@ testdoc_latin1 = "J'aime les frites bien grasse étalon châpeau!" testdoc_utf8 = "Un deuxième exemple de texte en utf-8 cette fois!" +def create_files(): + encoded_s = testdoc_latin1.encode('latin-1') + with open('testdoc_latin1.txt', 'wb') as f: + f.write(encoded_s) -encoded_s = testdoc_latin1.encode('latin-1') -with open('testdoc_latin1.txt', 'wb') as f: - f.write(encoded_s) - -encoded_s = testdoc_utf8.encode('utf-8') -with open('testdoc_utf8.txt', 'wb') as f: - f.write(encoded_s) + encoded_s = testdoc_utf8.encode('utf-8') + with open('testdoc_utf8.txt', 'wb') as f: + f.write(encoded_s) + return True def test_openfile_with_encoding(): + create_files() input_str = "testdoc_latin1.txt" expected_str = testdoc_latin1 result = documents_loader(input_str, encoding='latin-1') np.testing.assert_string_equal(result, expected_str) + remove_files() def test_openfile_utf8(): + create_files() input_str = "testdoc_utf8.txt" expected_str = testdoc_utf8 result = documents_loader(input_str) np.testing.assert_string_equal(result, expected_str) - + remove_files() def test_encoding_detection(): + create_files() input_str = "testdoc_latin1.txt" expected_str = testdoc_latin1 result = documents_loader(input_str) np.testing.assert_string_equal(result, expected_str) - + remove_files() def test_load_several_docs_wildcard(): + create_files() expected = {'testdoc_latin1.txt': "J'aime les frites bien grasse étalon châpeau!", 'testdoc_utf8.txt': 'Un deuxième exemple de texte en utf-8 cette fois!'} - result = documents_loader('*.txt', output_as='dict') + result = documents_loader('test*.txt', output_as='dict') np.testing.assert_equal(result, expected) - + remove_files() def test_load_several_docs_list(): + create_files() expected = {'testdoc_latin1.txt': "J'aime les frites bien grasse étalon châpeau!", 'testdoc_utf8.txt': 'Un deuxième exemple de texte en utf-8 cette fois!'} result = documents_loader(['testdoc_latin1.txt','testdoc_utf8.txt'], output_as='dict') np.testing.assert_equal(result, expected) + remove_files() def test_load_several_docs_output_list(): + create_files() expected = ["J'aime les frites bien grasse étalon châpeau!", 'Un deuxième exemple de texte en utf-8 cette fois!'] result = documents_loader(['testdoc_latin1.txt','testdoc_utf8.txt'], output_as='list') + remove_files() return len(expected) == len(result) and sorted(expected) == sorted(result) @@ -69,9 +79,12 @@ def test_load_several_docs_output_list(): def test_detect_encoding(): + create_files() expected = {'encoding': 'ISO-8859-1', 'confidence': 0.73, 'language': ''} result = detect_encoding('testdoc_latin1.txt') np.testing.assert_equal(result, expected) + remove_files() -os.remove('testdoc_latin1.txt') -os.remove('testdoc_utf8.txt') \ No newline at end of file +def remove_files(): + os.remove('testdoc_latin1.txt') + os.remove('testdoc_utf8.txt') \ No newline at end of file From 7dddc1cd504a3580b78c6014347f78c275c43e3d Mon Sep 17 00:00:00 2001 From: Robin <rdoume@gmail.com> Date: Wed, 22 May 2019 18:21:40 +0200 Subject: [PATCH 168/496] forgot what i changed --- README.md | 3 --- tests/test_preprocessor.py | 24 ++++++++++++------------ 2 files changed, 12 insertions(+), 15 deletions(-) diff --git a/README.md b/README.md index 411feb6..6859d06 100644 --- a/README.md +++ b/README.md @@ -97,9 +97,7 @@ run: `bash nautilus_nlp/scripts/download_ft_langdetect.sh` -<<<<<<< HEAD # Quick start -======= ### Install Mallet 1) Install Mallet file @@ -113,7 +111,6 @@ run: `bash nautilus_nlp/scripts/install_java.sh` # Notebooks ->>>>>>> master The [notebook](notebooks/) folder contains various notebook on how to use this library. diff --git a/tests/test_preprocessor.py b/tests/test_preprocessor.py index 24f4658..3c0ebb8 100644 --- a/tests/test_preprocessor.py +++ b/tests/test_preprocessor.py @@ -136,7 +136,7 @@ def test_normalize_whitespace(input_str, expected_str): ("Let's go!",'Let us go!'), ("You've been missing",'You have been missing'), ("I'm sure you're leaving",'I am sure you are leaving'), - ("We'll survive.","We will survive") + ("We'll survive.","We will survive.") ] ) def test_unpack_english_contractions(input_str, expected_str): @@ -177,18 +177,18 @@ def test_replace_emails(input_str, expected_str): @pytest.mark.parametrize( "input_str, expected_str", [ - ("mon 06 bb: 0625093267","mon 06 bb: *NUMBER*"), - ("mon 06 bb: 06.25.09.32.67","mon 06 bb: *NUMBER*"), - ("call me at +33625093267","call me at *NUMBER*"), - ("call me at +33 6 25 09 32 67","call me at *NUMBER*"), - ("call me at +33 625 093 267","call me at *NUMBER*"), + ("mon 06 bb: 0625093267","mon 06 bb: *PHONE*"), + ("mon 06 bb: 06.25.09.32.67","mon 06 bb: *PHONE*"), + ("call me at +33625093267","call me at *PHONE*"), + ("call me at +33 6 25 09 32 67","call me at *PHONE*"), + ("call me at +33 625 093 267","call me at *PHONE*"), ("if this unit test doesn't work, call 3615 and says 'ROBIN'", - "if this unit test doesn't work, call *NUMBER* and says 'ROBIN'"), - ('(541) 754-3010 is a US. Phone','*NUMBER* is a US. Phone'), - ('+1-541-754-3010 is an international Phone','*NUMBER* is an international Phone'), - ('+1-541-754-3010 Dialed in the US','*NUMBER* Dialed in the US'), - ('+1-541-754-3010 Dialed from Germany','*NUMBER* Dialed from Germany'), - ('191 541 754 3010 Dialed from France','*NUMBER* Dialed from France') + "if this unit test doesn't work, call *PHONE* and says 'ROBIN'"), + ('(541) 754-3010 is a US. Phone','*PHONE* is a US. Phone'), + ('+1-541-754-3010 is an international Phone','*PHONE* is an international Phone'), + ('+1-541-754-3010 Dialed in the US','*PHONE* Dialed in the US'), + ('+1-541-754-3010 Dialed from Germany','*PHONE* Dialed from Germany'), + ('191 541 754 3010 Dialed from France','*PHONE* Dialed from France') ] ) def test_replace_phone_numbers(input_str, expected_str): From bef3b0a798a955b3c9f7df8e1fff98db8b267eb3 Mon Sep 17 00:00:00 2001 From: hugovasselin <waaaouu@gmail.com> Date: Wed, 22 May 2019 18:32:50 +0200 Subject: [PATCH 169/496] add tf-idf tranformer --- nautilus_nlp/preprocessing/text_vectorizers.py | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/nautilus_nlp/preprocessing/text_vectorizers.py b/nautilus_nlp/preprocessing/text_vectorizers.py index 55d3046..60c05d4 100644 --- a/nautilus_nlp/preprocessing/text_vectorizers.py +++ b/nautilus_nlp/preprocessing/text_vectorizers.py @@ -58,6 +58,17 @@ def compute_tfidf(self, documents): self._compute_idf() return self.word_count_vector + + def transform_doc(self, document): + ''' + Transform documents to document-term matrix. + + Returns + ------- + Tf-idf-weighted document-term matrix. + ''' + return self.tfidf_transformer.transform(document) + def _apply_tfidf_to_doc(self, text): '''generate tf-idf for the given document''' return self.tfidf_transformer.transform(self.tfidf_vectorizer.transform([text])) @@ -105,7 +116,10 @@ def get_top_tfidf(self, n=10): return self._extract_topn_from_vector(self.feature_names, self._sort_coo(self.word_count_vector.tocoo()), topn=n) -class Text_Vectorizer: +class Text_Vectorizer(object): + ''' + TODO: DOCSTRING + ''' def __init__(self, doc_list): # Initialize self.doc_list = doc_list From 28e36f6fdf26b2105e225660942c2894f65737c6 Mon Sep 17 00:00:00 2001 From: Robin <rdoume@gmail.com> Date: Wed, 22 May 2019 18:42:16 +0200 Subject: [PATCH 170/496] Keep @ as punct --- nautilus_nlp/utils/constants.py | 1 + 1 file changed, 1 insertion(+) diff --git a/nautilus_nlp/utils/constants.py b/nautilus_nlp/utils/constants.py index b73c1c6..b6021d3 100644 --- a/nautilus_nlp/utils/constants.py +++ b/nautilus_nlp/utils/constants.py @@ -122,6 +122,7 @@ ), " ", ) +PUNCT_TRANSLATE_UNICODE.pop(64) # To keep @ ACRONYM_REGEX = re.compile( r"(?:^|(?<=\W))(?:(?:(?:(?:[A-Z]\.?)+[a-z0-9&/-]?)+(?:[A-Z][s.]?|[0-9]s?))|(?:[0-9](?:\-?[A-Z])+))(?:$|(?=\W))", From 957576bcda9f43e51325f85480371b9c6b9d0ec8 Mon Sep 17 00:00:00 2001 From: hugovasselin <waaaouu@gmail.com> Date: Wed, 22 May 2019 18:47:50 +0200 Subject: [PATCH 171/496] fix punct unit test #84 --- tests/test_preprocessor.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/test_preprocessor.py b/tests/test_preprocessor.py index e4ab431..5b8645b 100644 --- a/tests/test_preprocessor.py +++ b/tests/test_preprocessor.py @@ -243,8 +243,8 @@ def test_replace_currency_symbols(input_str, param, expected_str): ("Seriously...",'.,;',"Seriously "), ("Seriously.!.",'.,;',"Seriously ! "), ("hugo.vasselin@artefact.com",'.,;',"hugo vasselin@artefact com"), - ("hugo.vasselin@artefact.com",None,"hugo vasselin@artefact com"), - ("hugo-vasselin@artefact.com",None,"hugo vasselin@artefact com") + ("hugo.vasselin@artefact.com",None,"hugo vasselin artefact com"), + ("hugo-vasselin@artefact.com",None,"hugo vasselin artefact com") ] ) def test_remove_punct(input_str, param, expected_str): From 5491904d263072d53f27c63257fdf6f9304b5927 Mon Sep 17 00:00:00 2001 From: hugovasselin <waaaouu@gmail.com> Date: Wed, 22 May 2019 19:15:31 +0200 Subject: [PATCH 172/496] add emoji converter --- nautilus_nlp/preprocessing/preprocess.py | 24 ++++++++++++++++-- tests/test_preprocessor.py | 31 ++++++++++++++++++------ 2 files changed, 45 insertions(+), 10 deletions(-) diff --git a/nautilus_nlp/preprocessing/preprocess.py b/nautilus_nlp/preprocessing/preprocess.py index 435bac2..add1ac0 100644 --- a/nautilus_nlp/preprocessing/preprocess.py +++ b/nautilus_nlp/preprocessing/preprocess.py @@ -461,12 +461,12 @@ def remove_accents(text:str, method:str="unicode") -> str: def remove_emoji(text:str) -> str: """ Remove emoji from any str by stripping any unicode in the range of Emoji unicode + as defined in the unicode convention: http://www.unicode.org/emoji/charts/full-emoji-list.html Parameters ---------- - word : str - raw word + text : str Returns ------- @@ -477,6 +477,26 @@ def remove_emoji(text:str) -> str: return word +def convert_emoji_to_text(text:str, code_delimiters=(':', ':')) -> str: + """ + Convert emoji to their CLDR Short Name, according to the unicode convention + http://www.unicode.org/emoji/charts/full-emoji-list.html + eg. 😀 --> :grinning_face: + + Parameters + ---------- + text : str + code_delimiters : tuple of symbols around the emoji code. + eg: (':',':') --> :grinning_face: + + Returns + ------- + str + string + """ + return _emoji.demojize(text, delimiters=code_delimiters) + + def preprocess_text( text, fix_unicode=False, diff --git a/tests/test_preprocessor.py b/tests/test_preprocessor.py index 597f5b4..d06ca80 100644 --- a/tests/test_preprocessor.py +++ b/tests/test_preprocessor.py @@ -17,7 +17,8 @@ replace_numbers, replace_currency_symbols, remove_punct, - remove_emoji + remove_emoji, + convert_emoji_to_text ) import nautilus_nlp.utils.phone_number as phone @@ -183,15 +184,15 @@ def test_replace_emails(input_str, expected_str): ("call me at +33 6 25 09 32 67","call me at *PHONE*"), ("call me at +33 625 093 267","call me at *PHONE*"), ("if this unit test doesn't work, call 3615 and says 'ROBIN'", - "if this unit test doesn't work, call *NUMBER* and says 'ROBIN'"), - ('(541) 754-3010 is a US. Phone','*NUMBER* is a US. Phone'), - ('+1-541-754-3010 is an international Phone','*NUMBER* is an international Phone'), - ('+1-541-754-3010 Dialed in the US','*NUMBER* Dialed in the US'), - ('+1-541-754-3010 Dialed from Germany','*NUMBER* Dialed from Germany') + "if this unit test doesn't work, call *PHONE* and says 'ROBIN'"), + ('(541) 754-3010 is a US. Phone','*PHONE* is a US. Phone'), + ('+1-541-754-3010 is an international Phone','*PHONE* is an international Phone'), + ('+1-541-754-3010 Dialed in the US','*PHONE* Dialed in the US'), + ('+1-541-754-3010 Dialed from Germany','*PHONE* Dialed from Germany') ] ) def test_replace_phone_numbers(input_str, expected_str): - result = replace_phone_numbers(input_str, replace_with="*NUMBER*", + result = replace_phone_numbers(input_str, replace_with="*PHONE*", method="detection", country_format_to_detect=phone.SUPPORTED_COUNTRY ) @@ -267,4 +268,18 @@ def test_remove_punct(input_str, param, expected_str): ) def test_remove_emoji(input_str, expected_str): result = remove_emoji(input_str) - np.testing.assert_equal(result, expected_str) \ No newline at end of file + np.testing.assert_equal(result, expected_str) + + +@pytest.mark.parametrize( + "input_str, expected_str", + [ + ("👉👌",":backhand_index_pointing_right::OK_hand:"), + ("🎅🏿⌚",":Santa_Claus_dark_skin_tone::watch:"), + ("🥖✊💦",":baguette_bread::raised_fist::sweat_droplets:"), + ("✊",":raised_fist:") + ] + ) +def test_convert_emoji_to_text(input_str, expected_str): + result = convert_emoji_to_text(input_str) + np.testing.assert_equal(result, expected_str) \ No newline at end of file From 2817289d3b31e03f4e0af2b2d40ef094092f7727 Mon Sep 17 00:00:00 2001 From: hugovasselin <waaaouu@gmail.com> Date: Wed, 22 May 2019 19:16:44 +0200 Subject: [PATCH 173/496] remove @ from punct constant --- nautilus_nlp/utils/constants.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/nautilus_nlp/utils/constants.py b/nautilus_nlp/utils/constants.py index b6021d3..5f5418a 100644 --- a/nautilus_nlp/utils/constants.py +++ b/nautilus_nlp/utils/constants.py @@ -122,7 +122,7 @@ ), " ", ) -PUNCT_TRANSLATE_UNICODE.pop(64) # To keep @ + ACRONYM_REGEX = re.compile( r"(?:^|(?<=\W))(?:(?:(?:(?:[A-Z]\.?)+[a-z0-9&/-]?)+(?:[A-Z][s.]?|[0-9]s?))|(?:[0-9](?:\-?[A-Z])+))(?:$|(?=\W))", From 197fc54546dcc5ef25620a1cf53976762ecac593 Mon Sep 17 00:00:00 2001 From: Robin <rdoume@gmail.com> Date: Thu, 23 May 2019 10:00:14 +0200 Subject: [PATCH 174/496] Readme for sphinx doc --- README.md | 10 ++++++++++ requirements.txt | 4 +--- 2 files changed, 11 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index e381240..f4eb138 100644 --- a/README.md +++ b/README.md @@ -144,6 +144,16 @@ Here is a quick example: ['tropical', 'storm', 'nicole', 'short', 'live', 'unusually', 'asymmetric', 'tropical', 'cyclone', 'cause', 'extensive', 'flooding', 'jamaica', 'atlantic', 'hurricane', 'season', 'source'] ``` + +# Make HTML documentation + +In order to make the html Sphinx documentation, you need to run at the nautilus_nlp root path: +`sphinx-apidoc -f nautilus_nlp -o docs/` +This will generate the .rst files. +You can generate the doc with +`cd docs && make html` + +You can now open the file index.html located in the build folder. # Project Organization ------------ diff --git a/requirements.txt b/requirements.txt index 35282d3..7c1c6c4 100644 --- a/requirements.txt +++ b/requirements.txt @@ -2,11 +2,9 @@ #-e . # external requirements -click Sphinx +sphinx_rtd_theme coverage -awscli -flake8 python-dotenv>=0.5.1 pillow pytest From 15adc75308eaf7d9f2488288068e0e6b4eafd9a3 Mon Sep 17 00:00:00 2001 From: Robin <rdoume@gmail.com> Date: Thu, 23 May 2019 10:14:37 +0200 Subject: [PATCH 175/496] Update Tree in readme --- README.md | 59 ++++++++++++++++++++++--------------------------------- 1 file changed, 24 insertions(+), 35 deletions(-) diff --git a/README.md b/README.md index f4eb138..9ae74d3 100644 --- a/README.md +++ b/README.md @@ -160,39 +160,28 @@ You can now open the file index.html located in the build folder. ├── LICENSE ├── Makefile <- Makefile with commands like `make data` or `make train` ├── README.md <- The top-level README for developers using this project. - ├── data - │ ├── external <- Data from third party sources. - │ ├── interim <- Intermediate data that has been transformed. - │ ├── processed <- The final, canonical data sets for modeling. - │ └── raw <- The original, immutable data dump. - │ - ├── docs <- A default Sphinx project; see sphinx-doc.org for details - │ - ├── models <- Trained and serialized models, model predictions, or model summaries - │ - ├── notebooks <- Jupyter notebooks. Naming convention is a number (for ordering), - │ the creator's initials, and a short `-` delimited description, e.g. - │ `1.0-jqp-initial-data-exploration`. - ├── tests <- Where the tests lives - ├── references <- Data dictionaries, manuals, and all other explanatory materials. - │ - ├── reports <- Generated analysis as HTML, PDF, LaTeX, etc. - │ └── figures <- Generated graphics and figures to be used in reporting - │ - ├── requirements.txt <- The requirements file for reproducing the analysis environment, e.g. - │ generated with `pip freeze > requirements.txt` - │ + ├── data <- Scripts & bits to download datasets to try nautilus + │ ├── external + │ ├── interim + │ ├── processed + │ └── raw + ├── docker <- Where to build a docker image using this lib + ├── docs <- Sphinx HTML documentation + │ ├── _build + │ │ └── html + │ ├── source + ├── models + ├── nautilus_nlp <- Main Nautilus Package. This is where the code lives + │ ├── config + │ ├── data + │ ├── models + │ ├── preprocessing + │ ├── scripts + │ └── utils + ├──notebooks <- Various notebooks explaining how to use Nautilus_NLP library + ├── tests <- Where the tests lives + │ └── testfolder_fileloader + ├── wiki <- Where the Markdown for the Wiki lives ├── setup.py <- makes project pip installable (pip install -e .) so nautilus_nlp can be imported - ├── nautilus_nlp <- Source code for use in this project. - │ ├── __init__.py <- Makes nautilus_nlp a Python module - │ │ - │ ├── data <- Scripts to download or generate data - │ │ - │ ├── utils <- Scripts to turn raw data into features for modeling - │ │ - │ ├── models <- Scripts to train models and then use trained models to make - │ │ │ predictions - │ │ - │ └── visualization <- Scripts to create exploratory and results oriented visualizations - │ - └── tox.ini <- tox file with settings for running tox; see tox.testrun.org + ├── requirements.txt <- The requirements file for reproducing the analysis environment, e.g. + generated with `pip freeze > requirements.txt` \ No newline at end of file From abb54a33fea15ab5af270d00faa9457d1eb2a8b1 Mon Sep 17 00:00:00 2001 From: Robin <rdoume@gmail.com> Date: Thu, 23 May 2019 10:41:16 +0200 Subject: [PATCH 176/496] Update nautilus_nlp/models/topic_modeling.py --- nautilus_nlp/models/topic_modeling.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/nautilus_nlp/models/topic_modeling.py b/nautilus_nlp/models/topic_modeling.py index 3885dd6..dd44ee0 100644 --- a/nautilus_nlp/models/topic_modeling.py +++ b/nautilus_nlp/models/topic_modeling.py @@ -204,7 +204,7 @@ def fit_data(model, bow): def visualize_topics(model, bow_corpus, dictionary, model_type=None): - """ Visualize the topics-keywords with the pyLDAvis interactive chart. + """ Visualize the topics-keywords generated by Gensim with the pyLDAvis interactive chart. (Work well in notebook) Parameters @@ -270,4 +270,4 @@ def show_dominant_topic(model, bow_corpus, topic_number=1, topn=5): print("Score: {}\t Topic: {}".format(score, keywords)) i +=1 if i == topic_number: - break \ No newline at end of file + break From ebeedc63d5c7da49dada5cc2bef401d3ab81c53e Mon Sep 17 00:00:00 2001 From: Robin <rdoume@gmail.com> Date: Thu, 23 May 2019 10:57:08 +0200 Subject: [PATCH 177/496] Update nautilus_nlp/models/topic_modeling.py --- nautilus_nlp/models/topic_modeling.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/nautilus_nlp/models/topic_modeling.py b/nautilus_nlp/models/topic_modeling.py index dd44ee0..a1751f6 100644 --- a/nautilus_nlp/models/topic_modeling.py +++ b/nautilus_nlp/models/topic_modeling.py @@ -200,7 +200,7 @@ def fit_data(model, bow): return model[bow] -# Visualization (only for gensim implementation for now) +# Visualization def visualize_topics(model, bow_corpus, dictionary, model_type=None): From ebdaf3420edab327c220076cdfdba619d5037ca9 Mon Sep 17 00:00:00 2001 From: hugovasselin <waaaouu@gmail.com> Date: Thu, 23 May 2019 11:31:21 +0200 Subject: [PATCH 178/496] replace replace_with defaut param from None to string --- nautilus_nlp/preprocessing/preprocess.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/nautilus_nlp/preprocessing/preprocess.py b/nautilus_nlp/preprocessing/preprocess.py index add1ac0..d95b88f 100644 --- a/nautilus_nlp/preprocessing/preprocess.py +++ b/nautilus_nlp/preprocessing/preprocess.py @@ -499,6 +499,7 @@ def convert_emoji_to_text(text:str, code_delimiters=(':', ':')) -> str: def preprocess_text( text, + remove_eol_char=True, fix_unicode=False, lowercase=False, no_urls=False, @@ -510,7 +511,7 @@ def preprocess_text( no_contractions=False, no_accents=False, no_emoji=False, - replace_with=None, + replace_with=' ', no_stopwords=None, phone_countries_format=[None,'US','FR'], phone_method='regex' @@ -581,6 +582,8 @@ def preprocess_text( if fix_unicode is True: text = fix_bad_unicode(text, normalization="NFC") + if remove_eol_char is True: + text = remove_EOL_characters(text) if no_urls is True: text = replace_urls(text, replace_with=replace_with) if no_emails is True: From 925c73e4547181fc8c377b9e5a04f28b1ee12ca6 Mon Sep 17 00:00:00 2001 From: hugovasselin <waaaouu@gmail.com> Date: Thu, 23 May 2019 11:34:35 +0200 Subject: [PATCH 179/496] add remove_eol to preprocess fct --- nautilus_nlp/preprocessing/preprocess.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/nautilus_nlp/preprocessing/preprocess.py b/nautilus_nlp/preprocessing/preprocess.py index d95b88f..4467cf0 100644 --- a/nautilus_nlp/preprocessing/preprocess.py +++ b/nautilus_nlp/preprocessing/preprocess.py @@ -526,6 +526,8 @@ def preprocess_text( raw text to preprocess fix_unicode : bool if True, fix "broken" unicode such as mojibake and garbled HTML entities + remove_eol_char : bool + if True, will remove the end-of-line characters \\n lowercase : bool if True, all text is lower-cased no_urls : bool From e27f64a3a7c4c76cb662413231cf17beb6e40627 Mon Sep 17 00:00:00 2001 From: hugovasselin <waaaouu@gmail.com> Date: Thu, 23 May 2019 11:59:58 +0200 Subject: [PATCH 180/496] fix bug in format_number --- nautilus_nlp/utils/phone_number.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/nautilus_nlp/utils/phone_number.py b/nautilus_nlp/utils/phone_number.py index 83f84d3..869b7f6 100644 --- a/nautilus_nlp/utils/phone_number.py +++ b/nautilus_nlp/utils/phone_number.py @@ -106,6 +106,6 @@ def format_number(self, num_format): ''' ['E164','INTERNATIONAL','NATIONAL','RFC3966'] ''' - standard_format = exec('phonenumbers.PhoneNumberFormat.'+num_format) + standard_format = exec('_phonenumbers.PhoneNumberFormat.'+num_format) return _phonenumbers.format_number(self.parsed_num, standard_format) \ No newline at end of file From 241e89b43ee44c8e048c343c050f09c592cb4602 Mon Sep 17 00:00:00 2001 From: hugovasselin <waaaouu@gmail.com> Date: Thu, 23 May 2019 12:25:55 +0200 Subject: [PATCH 181/496] clean notebooks --- notebooks/0. Text file loader.ipynb | 495 ++++++++++++++++++++++++ notebooks/1. Text Preprocessing.ipynb | 522 ++++++++++++++++++++++++++ 2 files changed, 1017 insertions(+) create mode 100644 notebooks/0. Text file loader.ipynb create mode 100644 notebooks/1. Text Preprocessing.ipynb diff --git a/notebooks/0. Text file loader.ipynb b/notebooks/0. Text file loader.ipynb new file mode 100644 index 0000000..5aa985f --- /dev/null +++ b/notebooks/0. Text file loader.ipynb @@ -0,0 +1,495 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Open Text File with encoding handling\n", + "\n", + "Nautilus includes a document loader that handles encoding detection and multiple file loading" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Create example files " + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "# Example of a latin1 file\n", + "s = \"J'aime les frites bien grasse étalon châpeau!\"\n", + "encoded_s = s.encode('latin-1')\n", + "with open('somefile.txt', 'wb') as f:\n", + " f.write(encoded_s)" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "# Let's add another document \n", + "s = \"Un deuxième exemple de texte en utf-8 cette fois!\"\n", + "encoded_s = s.encode('utf-8')\n", + "with open('someadditionalfile.txt', 'wb') as f:\n", + " f.write(encoded_s)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Document loader" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "from nautilus_nlp.utils.file_loader import documents_loader" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Open a file when you know the encoding" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": { + "scrolled": true + }, + "outputs": [ + { + "data": { + "text/plain": [ + "'Un deuxième exemple de texte en utf-8 cette fois!'" + ] + }, + "execution_count": 4, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# default encoding is UTF-8\n", + "documents_loader('someadditionalfile.txt')" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "\"J'aime les frites bien grasse étalon châpeau!\"" + ] + }, + "execution_count": 5, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# If you know the encoding, you can specify it\n", + "documents_loader('somefile.txt', encoding='latin-1')" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Open a file with encoding detection" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "If you don't specify encoding, `document_loader()` will try to open it as UTF-8, and if it doesn't work it will try to detect encoding." + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": { + "scrolled": false + }, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "WARNING:root:Encoding for somefile.txt is not UTF-8.\n", + "WARNING:root:Trying to detect encoding for somefile.txt\n", + "INFO:root:somefile.txt: detected encoding is ISO-8859-1, with a confidence rate of 0.73\n" + ] + }, + { + "data": { + "text/plain": [ + "\"J'aime les frites bien grasse étalon châpeau!\"" + ] + }, + "execution_count": 6, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "documents_loader('somefile.txt')" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": { + "scrolled": true + }, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "WARNING:root:Encoding for somefile.txt is not UTF-8.\n" + ] + }, + { + "ename": "TypeError", + "evalue": "function takes exactly 5 arguments (1 given)", + "output_type": "error", + "traceback": [ + "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", + "\u001b[0;31mUnicodeDecodeError\u001b[0m Traceback (most recent call last)", + "\u001b[0;32m~/Documents/NAUTILUS/nautilus-nlp/nautilus_nlp/utils/file_loader.py\u001b[0m in \u001b[0;36mtext_loader\u001b[0;34m(filepath, encoding, detectencoding)\u001b[0m\n\u001b[1;32m 38\u001b[0m \u001b[0;32mtry\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m---> 39\u001b[0;31m \u001b[0;32mreturn\u001b[0m \u001b[0mopen_textfile\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mfilepath\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mencoding\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;34m'utf-8'\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 40\u001b[0m \u001b[0;32mexcept\u001b[0m \u001b[0mUnicodeDecodeError\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;32m~/Documents/NAUTILUS/nautilus-nlp/nautilus_nlp/utils/file_loader.py\u001b[0m in \u001b[0;36mopen_textfile\u001b[0;34m(filepath, encoding)\u001b[0m\n\u001b[1;32m 13\u001b[0m \u001b[0;32mwith\u001b[0m \u001b[0mio\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mopen\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mfilepath\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m'r'\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mencoding\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mencoding\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;32mas\u001b[0m \u001b[0mf\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m---> 14\u001b[0;31m \u001b[0mstring\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mf\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mread\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 15\u001b[0m \u001b[0;32mreturn\u001b[0m \u001b[0mstring\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;32m/usr/local/Cellar/python/3.7.0/Frameworks/Python.framework/Versions/3.7/lib/python3.7/codecs.py\u001b[0m in \u001b[0;36mdecode\u001b[0;34m(self, input, final)\u001b[0m\n\u001b[1;32m 321\u001b[0m \u001b[0mdata\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mbuffer\u001b[0m \u001b[0;34m+\u001b[0m \u001b[0minput\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 322\u001b[0;31m \u001b[0;34m(\u001b[0m\u001b[0mresult\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mconsumed\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_buffer_decode\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mdata\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0merrors\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mfinal\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 323\u001b[0m \u001b[0;31m# keep undecoded input until the next call\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;31mUnicodeDecodeError\u001b[0m: 'utf-8' codec can't decode byte 0xe9 in position 30: invalid continuation byte", + "\nDuring handling of the above exception, another exception occurred:\n", + "\u001b[0;31mTypeError\u001b[0m Traceback (most recent call last)", + "\u001b[0;32m<ipython-input-7-c6d5e5969a55>\u001b[0m in \u001b[0;36m<module>\u001b[0;34m\u001b[0m\n\u001b[1;32m 1\u001b[0m \u001b[0;31m# You can prevent document loader from detecting the encoding if UTF-8 fails\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 2\u001b[0;31m \u001b[0mdocuments_loader\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m'somefile.txt'\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mdetectencoding\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;32mFalse\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", + "\u001b[0;32m~/Documents/NAUTILUS/nautilus-nlp/nautilus_nlp/utils/file_loader.py\u001b[0m in \u001b[0;36mdocuments_loader\u001b[0;34m(filepath, encoding, detectencoding, output_as)\u001b[0m\n\u001b[1;32m 90\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 91\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mnb_of_documents\u001b[0m \u001b[0;34m==\u001b[0m \u001b[0;36m1\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m---> 92\u001b[0;31m \u001b[0;32mreturn\u001b[0m \u001b[0mtext_loader\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mdocuments\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;36m0\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0mencoding\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mencoding\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mdetectencoding\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mdetectencoding\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 93\u001b[0m \u001b[0;32melif\u001b[0m \u001b[0mnb_of_documents\u001b[0m \u001b[0;34m>\u001b[0m \u001b[0;36m1\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 94\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0moutput_as\u001b[0m \u001b[0;34m==\u001b[0m \u001b[0;34m'list'\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;32m~/Documents/NAUTILUS/nautilus-nlp/nautilus_nlp/utils/file_loader.py\u001b[0m in \u001b[0;36mtext_loader\u001b[0;34m(filepath, encoding, detectencoding)\u001b[0m\n\u001b[1;32m 47\u001b[0m \u001b[0;32mreturn\u001b[0m \u001b[0mopen_textfile\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mfilepath\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mencoding\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mdetected_encoding\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;34m'encoding'\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 48\u001b[0m \u001b[0;32melse\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m---> 49\u001b[0;31m \u001b[0;32mraise\u001b[0m \u001b[0mUnicodeDecodeError\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m'Cannot load document using utf-8. Try to detect encoding using detectencoding=True'\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 50\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 51\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;31mTypeError\u001b[0m: function takes exactly 5 arguments (1 given)" + ] + } + ], + "source": [ + "# You can prevent document loader from detecting the encoding if UTF-8 fails \n", + "# In this case, it will raise an UnicodeDecodeError\n", + "documents_loader('somefile.txt', detectencoding=False)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Open several files" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "WARNING:root:Encoding for somefile.txt is not UTF-8.\n", + "WARNING:root:Trying to detect encoding for somefile.txt\n", + "INFO:root:somefile.txt: detected encoding is ISO-8859-1, with a confidence rate of 0.73\n" + ] + }, + { + "data": { + "text/plain": [ + "{'somefile.txt': \"J'aime les frites bien grasse étalon châpeau!\",\n", + " 'someadditionalfile.txt': 'Un deuxième exemple de texte en utf-8 cette fois!'}" + ] + }, + "execution_count": 8, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# you can use wildcards to open several documents\n", + "documents_loader('*.txt')" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "WARNING:root:Encoding for somefile.txt is not UTF-8.\n", + "WARNING:root:Trying to detect encoding for somefile.txt\n", + "INFO:root:somefile.txt: detected encoding is ISO-8859-1, with a confidence rate of 0.73\n" + ] + }, + { + "data": { + "text/plain": [ + "{'somefile.txt': \"J'aime les frites bien grasse étalon châpeau!\",\n", + " 'someadditionalfile.txt': 'Un deuxième exemple de texte en utf-8 cette fois!'}" + ] + }, + "execution_count": 9, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# you can also pass a list of filepaths\n", + "documents_loader(['somefile.txt','someadditionalfile.txt'])" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "WARNING:root:Encoding for somefile.txt is not UTF-8.\n", + "WARNING:root:Trying to detect encoding for somefile.txt\n", + "INFO:root:somefile.txt: detected encoding is ISO-8859-1, with a confidence rate of 0.73\n" + ] + }, + { + "data": { + "text/plain": [ + "[\"J'aime les frites bien grasse étalon châpeau!\",\n", + " 'Un deuxième exemple de texte en utf-8 cette fois!']" + ] + }, + "execution_count": 10, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# you can specify the output format when you load multiple texts\n", + "documents_loader('*.txt', output_as='list')" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## List files in a folder" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "from nautilus_nlp.utils.file_loader import list_files" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "['./somefile.txt',\n", + " './2. Text processing.ipynb',\n", + " './TF-IDF.ipynb',\n", + " './Visualization tools.ipynb',\n", + " './Language_identification.ipynb',\n", + " './someadditionalfile.txt',\n", + " './somefile',\n", + " './Sentiment_analysis_FT.ipynb',\n", + " './TopicModeling.ipynb',\n", + " './Spacy_model.ipynb',\n", + " './Sentiment analysis using pre-trained models.ipynb',\n", + " './0. Text file loader.ipynb',\n", + " './1. Text Preprocessing.ipynb']" + ] + }, + "execution_count": 12, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "list_files('.') # list files from current folders" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "[]" + ] + }, + "execution_count": 13, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "list_files('../tests/testfolder_fileloader/.')" + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "['./2. Text processing.ipynb',\n", + " './TF-IDF.ipynb',\n", + " './Visualization tools.ipynb',\n", + " './Language_identification.ipynb',\n", + " './Sentiment_analysis_FT.ipynb',\n", + " './TopicModeling.ipynb',\n", + " './Spacy_model.ipynb',\n", + " './Sentiment analysis using pre-trained models.ipynb',\n", + " './0. Text file loader.ipynb',\n", + " './1. Text Preprocessing.ipynb']" + ] + }, + "execution_count": 14, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "list_files('./*.ipynb') # List files matching specific pattern" + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "metadata": { + "scrolled": true + }, + "outputs": [ + { + "data": { + "text/plain": [ + "['/Users/hugo/Documents/NAUTILUS/nautilus-nlp/LICENSE',\n", + " '/Users/hugo/Documents/NAUTILUS/nautilus-nlp/requirements.txt',\n", + " '/Users/hugo/Documents/NAUTILUS/nautilus-nlp/Makefile',\n", + " '/Users/hugo/Documents/NAUTILUS/nautilus-nlp/README.md',\n", + " '/Users/hugo/Documents/NAUTILUS/nautilus-nlp/setup.py',\n", + " '/Users/hugo/Documents/NAUTILUS/nautilus-nlp/VERSION',\n", + " '/Users/hugo/Documents/NAUTILUS/nautilus-nlp/CONTRIBUTING.md',\n", + " '/Users/hugo/Documents/NAUTILUS/nautilus-nlp/tox.ini',\n", + " '/Users/hugo/Documents/NAUTILUS/nautilus-nlp/test_environment.py']" + ] + }, + "execution_count": 15, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# only files will be printed, not folders\n", + "list_files('/Users/hugo/Documents/NAUTILUS/nautilus-nlp/')" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Detect encoding \n", + "\n", + "If you just interested in detecting encoding, you can use this function, based on the Chardet library. " + ] + }, + { + "cell_type": "code", + "execution_count": 18, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "from nautilus_nlp.utils.file_loader import detect_encoding" + ] + }, + { + "cell_type": "code", + "execution_count": 19, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "{'encoding': 'ISO-8859-1', 'confidence': 0.73, 'language': ''}" + ] + }, + "execution_count": 19, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "detect_encoding('somefile.txt')" + ] + } + ], + "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.7.0" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/notebooks/1. Text Preprocessing.ipynb b/notebooks/1. Text Preprocessing.ipynb new file mode 100644 index 0000000..3803299 --- /dev/null +++ b/notebooks/1. Text Preprocessing.ipynb @@ -0,0 +1,522 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Text Preprocessing \n", + "\n", + "This notebook will guide you through the common text preprocessing operations. \n", + "All the preprocessing functions are located in ** nautilus_nlp.preprocessing.preprocess ** " + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Load an example" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "english_text = \"\"\"\n", + "The nautilus 🐚🐚 (from the Latin form of the original Ancient Greek: ναυτίλος, 'sailor') is a pelagic marine mollusc of the cephalopod family Nautilidae, the sole extant family of the superfamily Nautilaceae and of its smaller but near equal suborder, Nautilina.\n", + "\n", + "It comprises six living species in two genera, the type of which is the genus Nautilus. Though it more specifically refers to species Nautilus pompilius, the name chambered nautilus is also used for any of the Nautilidae. All are protected under CITES Appendix II.\n", + "\n", + "Nautilidae, both extant and extinct, are characterized by involute or more or less convolute shells that are generally smooth, with compressed or depressed whorl sections, straight to sinuous sutures, and a tubular, generally central siphuncle.[3] Having survived relatively unchanged for millions of years, nautiluses represent the only living members of the subclass nautiloidea, and are often considered \"living fossils\".\n", + "\n", + "The word nautilus is derived from the Greek ναυτίλος nautílos and originally referred to the paper nautiluses of the genus Argonauta, which are actually octopuses. The word nautílos literally means \"sailor\", as paper nautiluses were thought to use two of their arms as sails.[4]\n", + "\n", + "Here's how you can contact us:\n", + "\n", + "Source : https://en.wikipedia.org/wiki/Nautilus\n", + "Contact:\n", + "Email : Jules.vernes@nautilus.net\n", + "Phone : +33 6 24 24 24 24 \n", + "Cost : €45\n", + "\"\"\"" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Preprocess_text: Wrap-up function " + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "from nautilus_nlp.preprocessing.preprocess import preprocess_text" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "nautilus latin form original ancient greek ναυτιλος sailor pelagic marine mollusc cephalopod family nautilidae sole extant family superfamily nautilaceae smaller equal suborder nautilina comprises living species genera type genus nautilus specifically refers species nautilus pompilius chambered nautilus nautilidae protected cites appendix ii nautilidae extant extinct characterized involute convolute shells generally smooth compressed depressed whorl sections straight sinuous sutures tubular generally central siphuncle survived unchanged millions years nautiluses represent living members subclass nautiloidea considered living fossils word nautilus derived greek ναυτιλος nautilos originally referred paper nautiluses genus argonauta octopuses word nautilos literally means sailor paper nautiluses thought arms sails contact source https en wikipedia org wiki nautilus contact email phone cost\n" + ] + } + ], + "source": [ + "clean_txt = preprocess_text(english_text,\n", + " fix_unicode=False,\n", + " lowercase=True,\n", + " no_urls=False,\n", + " no_emails=True,\n", + " no_phone_numbers=True,\n", + " phone_method='detection', # if detection is specified, will use a phone lib \n", + " phone_countries_format=[None, 'US', 'FR'], # these phone format will be tested. None stands for international.\n", + " no_numbers=True,\n", + " no_currency_symbols=True,\n", + " no_punct=True,\n", + " no_contractions=True, #will unpack english contractions\n", + " no_accents=True,\n", + " no_emoji=True,\n", + " replace_with=' ',\n", + " no_stopwords='en' #will remove english stopwords\n", + " )\n", + "print(clean_txt)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "collapsed": true + }, + "source": [ + "# Overview of the pre-processing functions\n", + "\n", + "If you prefer, you can use all the preprocessing functions one-by-one and create your own pre-processing pipeline. It is recommended, as there are many parameters that are not necessary included in the wrap-up function. \n", + "\n", + "For the sake of simplicity, we won't go through all the pre-processing function. Please report to the documentation if you want more details!" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Remove end-of-line characters" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "from nautilus_nlp.preprocessing.preprocess import remove_EOL_characters" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Before:\n", + "-------\n", + "hello words!\n", + "this is the second line.\n", + "\n", + "After:\n", + "-------\n", + "hello words! this is the second line.\n" + ] + } + ], + "source": [ + "text_with_eol = \"hello words!\\nthis is the second line.\"\n", + "\n", + "text_without_eol = remove_EOL_characters(text_with_eol)\n", + "\n", + "print('Before:\\n-------\\n{}\\n\\nAfter:\\n-------\\n{}'.format(text_with_eol,text_without_eol))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Stop words" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "from nautilus_nlp.preprocessing.preprocess import get_stopwords" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "['basee', 'y', 'façon', 'étant', 't', 'chère', 'uns', 'mêmes', 'particulier', 'tend']\n" + ] + } + ], + "source": [ + "french_sw = get_stopwords('fr')\n", + "\n", + "print(french_sw[:10])" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "from nautilus_nlp.preprocessing.preprocess import remove_stopwords" + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Before:\n", + "-------\n", + "['je', 'suis', 'malade', 'et', 'toi', '?']\n", + "\n", + "After:\n", + "-------\n", + "['malade', '?']\n" + ] + } + ], + "source": [ + "tokens_with_sw = ['je','suis','malade','et','toi','?']\n", + "\n", + "tokens_without_sw = remove_stopwords(tokens_with_sw, stopwords=french_sw)\n", + "\n", + "print('Before:\\n-------\\n{}\\n\\nAfter:\\n-------\\n{}'.format(tokens_with_sw,tokens_without_sw))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Fix bad unicode" + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "from nautilus_nlp.preprocessing.preprocess import fix_bad_unicode" + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Before:\n", + "-------\n", + "Les augmentations de rémunérations\n", + "\n", + "After:\n", + "-------\n", + "Les augmentations de rémunérations\n" + ] + } + ], + "source": [ + "before = \"Les augmentations de rémunérations\"\n", + "\n", + "after = fix_bad_unicode(before)\n", + "\n", + "print('Before:\\n-------\\n{}\\n\\nAfter:\\n-------\\n{}'.format(before,after))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Phone Numbers" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "from nautilus_nlp.preprocessing.preprocess import replace_phone_numbers" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Before:\n", + "-------\n", + "(541) 754-3010 is a US. Phone\n", + "\n", + "After:\n", + "-------\n", + " is a US. Phone\n" + ] + } + ], + "source": [ + "before = '(541) 754-3010 is a US. Phone'\n", + "\n", + "after = replace_phone_numbers(before, replace_with=' ')\n", + "\n", + "print('Before:\\n-------\\n{}\\n\\nAfter:\\n-------\\n{}'.format(before,after))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "There is also an util to detect phone numbers. Here we will provide a country list. It takes time because it will loop over the text with all the supported country codes." + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "import nautilus_nlp.utils.phone_number as phone" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "CPU times: user 452 ms, sys: 22.5 ms, total: 474 ms\n", + "Wall time: 477 ms\n" + ] + }, + { + "data": { + "text/plain": [ + "['(541) 754-3010', '754-3010']" + ] + }, + "execution_count": 6, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "%%time\n", + "phone.extract_phone_numbers(before, countrylist=phone.SUPPORTED_COUNTRY)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "There is also a **phone parser** class, that helps you to extract information from phone numbers. " + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "p = phone.phoneParser()" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "PhoneNumber(country_code=1, national_number=5417543010, extension=None, italian_leading_zero=None, number_of_leading_zeros=None, country_code_source=0, preferred_domestic_carrier_code=None)" + ] + }, + "execution_count": 8, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "p.parse_number('(541) 754-3010',region_code='US')" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "'541-754-3010'" + ] + }, + "execution_count": 9, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "p.format_number('INTERNATIONAL')" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Emojis" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "from nautilus_nlp.preprocessing.preprocess import remove_emoji, convert_emoji_to_text" + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Before:\n", + "-------\n", + "My favorite emojies are: 🎅🏿⌚\n", + "\n", + "After:\n", + "-------\n", + "My favorite emojies are: \n" + ] + } + ], + "source": [ + "before = 'My favorite emojies are: 🎅🏿⌚'\n", + "\n", + "after = remove_emoji(before)\n", + "\n", + "print('Before:\\n-------\\n{}\\n\\nAfter:\\n-------\\n{}'.format(before,after))" + ] + }, + { + "cell_type": "code", + "execution_count": 18, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Before:\n", + "-------\n", + "My favorite emojies are: 🎅🏿⌚\n", + "\n", + "After:\n", + "-------\n", + "My favorite emojies are: Santa_Claus_dark_skin_tonewatch\n" + ] + } + ], + "source": [ + "before = 'My favorite emojies are: 🎅🏿⌚'\n", + "\n", + "after = convert_emoji_to_text(before, code_delimiters=('', ''))\n", + "\n", + "print('Before:\\n-------\\n{}\\n\\nAfter:\\n-------\\n{}'.format(before,after))" + ] + } + ], + "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.7.0" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} From 6c20cdf4226dc00e2d9ab197d5c56bd7a3e4963d Mon Sep 17 00:00:00 2001 From: hugovasselin <waaaouu@gmail.com> Date: Thu, 23 May 2019 12:26:18 +0200 Subject: [PATCH 182/496] rename class phoneParser for pep8 compliance --- nautilus_nlp/utils/phone_number.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/nautilus_nlp/utils/phone_number.py b/nautilus_nlp/utils/phone_number.py index 869b7f6..b922484 100644 --- a/nautilus_nlp/utils/phone_number.py +++ b/nautilus_nlp/utils/phone_number.py @@ -66,7 +66,7 @@ def extract_phone_numbers(string:str, countrylist:list=[None,'FR','US','GB'])->l return list(set(res)) -class PhoneParser(object): +class phoneParser(object): """ Python port of Google's libphonenumber. https://github.com/daviddrysdale/python-phonenumbers From 91c4196e6b6479e6e7ccabc2f94ccbafb69a8743 Mon Sep 17 00:00:00 2001 From: hugovasselin <waaaouu@gmail.com> Date: Thu, 23 May 2019 12:26:33 +0200 Subject: [PATCH 183/496] add tests for phone numbers utils --- tests/test_phone_number.py | 42 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 42 insertions(+) create mode 100644 tests/test_phone_number.py diff --git a/tests/test_phone_number.py b/tests/test_phone_number.py new file mode 100644 index 0000000..d6edc69 --- /dev/null +++ b/tests/test_phone_number.py @@ -0,0 +1,42 @@ +import pytest +import nautilus_nlp.utils.phone_number as phone + +def test_extract_phone_number(): + input_str = '(541) 754-3010 is a US. Phone' + expected = ['(541) 754-3010', '754-3010'] + res = phone.extract_phone_numbers(input_str, countrylist=phone.SUPPORTED_COUNTRY) + assert res == expected + +def test_extract_phone_number_us(): + input_str = '(541) 754-3010 is a US. Phone' + expected = ['(541) 754-3010'] + res = phone.extract_phone_numbers(input_str, countrylist=['US']) + assert res == expected + +def test_extract_phone_number_fr(): + input_str = '06.25.09.32.56 is a FR Phone' + expected = ['06.25.09.32.56'] + res = phone.extract_phone_numbers(input_str) + assert res == expected + +def test_extract_phone_number_international(): + input_str = '+33625093423 is an international Phone number' + expected = ['+33625093423'] + res = phone.extract_phone_numbers(input_str) + assert res == expected + +def test_phoneParser_us(): + input_str = '(541) 754-3010' + expected = '541-754-3010' + p = phone.phoneParser() + p.parse_number(input_str,region_code='US') + res = p.format_number('INTERNATIONAL') + assert res == expected + +def test_phoneParser_fr(): + input_str = '0625093267' + expected = '6 25 09 32 67' + p = phone.phoneParser() + p.parse_number(input_str,region_code='FR') + res = p.format_number('E164') + assert res == expected \ No newline at end of file From 7f9ddb5f99a532afa0fc08f4156358792d51d514 Mon Sep 17 00:00:00 2001 From: hugovasselin <waaaouu@gmail.com> Date: Thu, 23 May 2019 12:29:10 +0200 Subject: [PATCH 184/496] rename notebooks --- .../Common Text Processing operations.ipynb | 812 ------------------ ...t files loader with encoding handler.ipynb | 477 ---------- 2 files changed, 1289 deletions(-) delete mode 100644 notebooks/Common Text Processing operations.ipynb delete mode 100644 notebooks/Text files loader with encoding handler.ipynb diff --git a/notebooks/Common Text Processing operations.ipynb b/notebooks/Common Text Processing operations.ipynb deleted file mode 100644 index 761a667..0000000 --- a/notebooks/Common Text Processing operations.ipynb +++ /dev/null @@ -1,812 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Tokenization" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Tokenizing French and English texts" - ] - }, - { - "cell_type": "code", - "execution_count": 5, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "from nautilus_nlp.utils.tokenizer import tokenize, untokenize" - ] - }, - { - "cell_type": "code", - "execution_count": 6, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "fr_txt = \"Ceci est un texte français, j'adore 1 !\"\n", - "eng_txt = \"Let's play together!\"" - ] - }, - { - "cell_type": "code", - "execution_count": 11, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "str_ = \"\"\"Les moteurs de recherche tels Google, Exalead ou Yahoo! sont des applications très connues de fouille de textes sur de grandes masses de données. Cependant, les moteurs de recherche ne se basent pas uniquement sur le texte pour l'indexer, mais également sur la façon dont les pages sont mises en valeur les unes par rapport aux autres. L'algorithme utilisé par Google est PageRank, et il est courant de voir HITS dans le milieu académique\"\"\"" - ] - }, - { - "cell_type": "code", - "execution_count": 15, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "CPU times: user 4.76 ms, sys: 31 µs, total: 4.79 ms\n", - "Wall time: 4.42 ms\n" - ] - }, - { - "data": { - "text/plain": [ - "['Les',\n", - " 'moteurs',\n", - " 'de',\n", - " 'recherche',\n", - " 'tels',\n", - " 'Google',\n", - " ',',\n", - " 'Exalead',\n", - " 'ou',\n", - " 'Yahoo',\n", - " '!',\n", - " 'sont',\n", - " 'des',\n", - " 'applications',\n", - " 'très',\n", - " 'connues',\n", - " 'de',\n", - " 'fouille',\n", - " 'de',\n", - " 'textes',\n", - " 'sur',\n", - " 'de',\n", - " 'grandes',\n", - " 'masses',\n", - " 'de',\n", - " 'données',\n", - " '.',\n", - " 'Cependant',\n", - " ',',\n", - " 'les',\n", - " 'moteurs',\n", - " 'de',\n", - " 'recherche',\n", - " 'ne',\n", - " 'se',\n", - " 'basent',\n", - " 'pas',\n", - " 'uniquement',\n", - " 'sur',\n", - " 'le',\n", - " 'texte',\n", - " 'pour',\n", - " \"l'\",\n", - " 'indexer',\n", - " ',',\n", - " 'mais',\n", - " 'également',\n", - " 'sur',\n", - " 'la',\n", - " 'façon',\n", - " 'dont',\n", - " 'les',\n", - " 'pages',\n", - " 'sont',\n", - " 'mises',\n", - " 'en',\n", - " 'valeur',\n", - " 'les',\n", - " 'unes',\n", - " 'par',\n", - " 'rapport',\n", - " 'aux',\n", - " 'autres',\n", - " '.',\n", - " \"L'\",\n", - " 'algorithme',\n", - " 'utilisé',\n", - " 'par',\n", - " 'Google',\n", - " 'est',\n", - " 'PageRank',\n", - " ',',\n", - " 'et',\n", - " 'il',\n", - " 'est',\n", - " 'courant',\n", - " 'de',\n", - " 'voir',\n", - " 'HITS',\n", - " 'dans',\n", - " 'le',\n", - " 'milieu',\n", - " 'académique']" - ] - }, - "execution_count": 15, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "%%time\n", - "tokenize(str_, lang_module=\"fr_spacy\")" - ] - }, - { - "cell_type": "code", - "execution_count": 14, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "CPU times: user 6.22 ms, sys: 94 µs, total: 6.31 ms\n", - "Wall time: 4.27 ms\n" - ] - } - ], - "source": [ - "%%time\n", - "tokenized_fr_txt = tokenize(str_, lang_module=\"fr_moses\")" - ] - }, - { - "cell_type": "code", - "execution_count": 13, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "['Les',\n", - " 'moteurs',\n", - " 'de',\n", - " 'recherche',\n", - " 'tels',\n", - " 'Google',\n", - " ',',\n", - " 'Exalead',\n", - " 'ou',\n", - " 'Yahoo',\n", - " '!',\n", - " 'sont',\n", - " 'des',\n", - " 'applications',\n", - " 'très',\n", - " 'connues',\n", - " 'de',\n", - " 'fouille',\n", - " 'de',\n", - " 'textes',\n", - " 'sur',\n", - " 'de',\n", - " 'grandes',\n", - " 'masses',\n", - " 'de',\n", - " 'données',\n", - " '.',\n", - " 'Cependant',\n", - " ',',\n", - " 'les',\n", - " 'moteurs',\n", - " 'de',\n", - " 'recherche',\n", - " 'ne',\n", - " 'se',\n", - " 'basent',\n", - " 'pas',\n", - " 'uniquement',\n", - " 'sur',\n", - " 'le',\n", - " 'texte',\n", - " 'pour',\n", - " \"l'\",\n", - " 'indexer',\n", - " ',',\n", - " 'mais',\n", - " 'également',\n", - " 'sur',\n", - " 'la',\n", - " 'façon',\n", - " 'dont',\n", - " 'les',\n", - " 'pages',\n", - " 'sont',\n", - " 'mises',\n", - " 'en',\n", - " 'valeur',\n", - " 'les',\n", - " 'unes',\n", - " 'par',\n", - " 'rapport',\n", - " 'aux',\n", - " 'autres',\n", - " '.',\n", - " \"L'\",\n", - " 'algorithme',\n", - " 'utilisé',\n", - " 'par',\n", - " 'Google',\n", - " 'est',\n", - " 'PageRank',\n", - " ',',\n", - " 'et',\n", - " 'il',\n", - " 'est',\n", - " 'courant',\n", - " 'de',\n", - " 'voir',\n", - " 'HITS',\n", - " 'dans',\n", - " 'le',\n", - " 'milieu',\n", - " 'académique']" - ] - }, - "execution_count": 13, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "tokenize(str_, lang_module=\"fr_moses\")" - ] - }, - { - "cell_type": "code", - "execution_count": 5, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "CPU times: user 24.3 ms, sys: 3.99 ms, total: 28.3 ms\n", - "Wall time: 26.2 ms\n" - ] - } - ], - "source": [ - "%%time\n", - "tokenized_eng_txt = tokenize(eng_txt, lang_module=\"en_spacy\")\n", - "tokenized_eng_txt" - ] - }, - { - "cell_type": "code", - "execution_count": 6, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "CPU times: user 17.3 ms, sys: 3.71 ms, total: 21 ms\n", - "Wall time: 26.9 ms\n" - ] - } - ], - "source": [ - "%%time\n", - "tokenized_eng_txt = tokenize(eng_txt, lang_module=\"en_nltk\")\n", - "tokenized_eng_txt" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## You can also untokenize your text" - ] - }, - { - "cell_type": "code", - "execution_count": 13, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "\"Let's play together!\"" - ] - }, - "execution_count": 13, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "untokenize(tokenized_eng_txt,lang='en')" - ] - }, - { - "cell_type": "code", - "execution_count": 15, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "\"Ceci est un texte français, j' adore !\"" - ] - }, - "execution_count": 15, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "# Here the \"J'adore\" is not handled in the right way\n", - "untokenize(tokenized_fr_txt,lang='fr')" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Stemming " - ] - }, - { - "cell_type": "code", - "execution_count": 124, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "from nautilus_nlp.utils.stemmer import stem_tokens" - ] - }, - { - "cell_type": "code", - "execution_count": 125, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "['i', 'surviv', 'these', 'dog']" - ] - }, - "execution_count": 125, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "stem_tokens(['I','survived','these', 'dogs'], lang='english')" - ] - }, - { - "cell_type": "code", - "execution_count": 128, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "['je', 'mang', 'dan', 'le', 'cuisin', 'du', 'château']" - ] - }, - "execution_count": 128, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "stem_tokens(tokenize(\"je mangerai dans les cuisines du château\"),lang='french')" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Lemmatization" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## French " - ] - }, - { - "cell_type": "code", - "execution_count": 28, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "from nautilus_nlp.utils.lemmatizer import lemmatize_french_tokens" - ] - }, - { - "cell_type": "code", - "execution_count": 29, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "['Ceci', 'est', 'un', 'texte', 'français', ',', \"j'\", 'adore', 'tes', 'frites', 'bien', 'grasses', 'YOLO', '!']\n" - ] - } - ], - "source": [ - "txt_to_tokenize=['Ceci', 'est', 'un', 'texte', 'français', ',', \"j'\", 'adore', 'tes', 'frites', 'bien', 'grasses', 'YOLO', '!']\n", - "print(txt_to_tokenize)" - ] - }, - { - "cell_type": "code", - "execution_count": 32, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "CPU times: user 37.9 ms, sys: 51.9 ms, total: 89.8 ms\n", - "Wall time: 65.3 ms\n" - ] - }, - { - "data": { - "text/plain": [ - "['ceci',\n", - " 'être',\n", - " 'un',\n", - " 'texte',\n", - " 'français',\n", - " ',',\n", - " 'j',\n", - " \"'\",\n", - " 'adorer',\n", - " 't',\n", - " 'frite',\n", - " 'bien',\n", - " 'gras',\n", - " 'yolo',\n", - " '!']" - ] - }, - "execution_count": 32, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "%%time\n", - "lemmatize_french_tokens(txt_to_tokenize, module='spacy')" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## English" - ] - }, - { - "cell_type": "code", - "execution_count": 1, - "metadata": { - "scrolled": true - }, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "[nltk_data] Downloading package wordnet to /Users/hugo/nltk_data...\n", - "[nltk_data] Package wordnet is already up-to-date!\n" - ] - } - ], - "source": [ - "from nautilus_nlp.utils.lemmatizer import lemmatize_english_tokens" - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "to_lemmatize = ['The', 'striped', 'bats', 'are', 'hanging', 'on', 'their', 'feet', 'for', 'best']" - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "CPU times: user 27.2 ms, sys: 4.4 ms, total: 31.6 ms\n", - "Wall time: 31.3 ms\n" - ] - }, - { - "data": { - "text/plain": [ - "['the', 'strip', 'bat', 'be', 'hang', 'on', '-PRON-', 'foot', 'for', 'good']" - ] - }, - "execution_count": 3, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "%%time\n", - "lemmatize_english_tokens(to_lemmatize, module='spacy')" - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "CPU times: user 3.07 s, sys: 217 ms, total: 3.28 s\n", - "Wall time: 3.45 s\n" - ] - }, - { - "data": { - "text/plain": [ - "['The', 'strip', 'bat', 'be', 'hang', 'on', 'their', 'foot', 'for', 'best']" - ] - }, - "execution_count": 4, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "%%time\n", - "lemmatize_english_tokens(to_lemmatize, module='nltk')" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Remove stop words" - ] - }, - { - "cell_type": "code", - "execution_count": 1, - "metadata": {}, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "[nltk_data] Downloading package punkt to /Users/hugo/nltk_data...\n", - "[nltk_data] Package punkt is already up-to-date!\n" - ] - } - ], - "source": [ - "from nautilus_nlp.utils.preprocess import remove_stopwords\n", - "from nautilus_nlp.utils.tokenizer import tokenize\n", - "from nautilus_nlp.utils.constants import get_stopwords" - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "FRENCH_SW = get_stopwords('fr')" - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "text = \"J'ai un beau cheval\"" - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "[\"J'ai\", 'beau', 'cheval']" - ] - }, - "execution_count": 4, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "remove_stopwords(text, FRENCH_SW)" - ] - }, - { - "cell_type": "code", - "execution_count": 6, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "[\"J'\", 'beau', 'cheval']" - ] - }, - "execution_count": 6, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "remove_stopwords(tokenize(text, lang_module=\"fr_spacy\"),FRENCH_SW)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Fix bad encoding\n", - "\n", - "Sometimes you messed up you encoding saving files, and you don't know how to fix this." - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "from nautilus_nlp.utils.preprocess import fix_bad_unicode\n", - "from nautilus_nlp.utils import file_loader" - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "bad_unicode=file_loader.open_textfile('./bad_encoding.txt')" - ] - }, - { - "cell_type": "code", - "execution_count": 8, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "\"Les augmentations de rémunérations\\nrénover l'enquête publique pour en faire un vrai outil d'aménagement du territoire et de dialogue social\\nLimitations de vitesse et sécurité routière\\nPour un nouveau contrat citoyen\\nDévelopper les démarches de budget participatif dans les collectivités et associer les citoyens dans la réalisation des projets\\nproportienelle\\nPour plus de démocratie participative\\nTransparence de la vie public\\n18 mois de trop....ca suffit macron\\nEgalité devant les infractions routières\\nMesures d'urgence pour une démocratie régénérée\\nSORTIR DU GRAND EST ! REOUR A LA REGION ALSACE\\nPour plus de transparence\\nEcoutez enfin le peuple.\\nVote obligatoire\\nAvis d'un citoyen ordinaire et socialiste - vive le RIC\\nsuppression du 80 km/h\\nproportionelle et immigration\\nRevoir les plafonds des aides sociales\\nProposition de Refondation du Capitalisme et d'Instauration d'un Dividende Universel Financées par l'Épargne.\\nSuppression du sénat\\nLimitation de vitesse Ã\\xa0 80km\"" - ] - }, - "execution_count": 8, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "bad_unicode[0:1000]" - ] - }, - { - "cell_type": "code", - "execution_count": 9, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "\"Les augmentations de rémunérations\\nrénover l'enquête publique pour en faire un vrai outil d'aménagement du territoire et de dialogue social\\nLimitations de vitesse et sécurité routière\\nPour un nouveau contrat citoyen\\nDévelopper les démarches de budget participatif dans les collectivités et associer les citoyens dans la réalisation des projets\\nproportienelle\\nPour plus de démocratie participative\\nTransparence de la vie public\\n18 mois de trop....ca suffit macron\\nEgalité devant les infractions routières\\nMesures d'urgence pour une démocratie régénérée\\nSORTIR DU GRAND EST ! REOUR A LA REGION ALSACE\\nPour plus de transparence\\nEcoutez enfin le peuple.\\nVote obligatoire\\nAvis d'un citoyen ordinaire et socialiste - vive le RIC\\nsuppression du 80 km/h\\nproportionelle et immigration\\nRevoir les plafonds des aides sociales\\nProposition de Refondation du Capitalisme et d'Instauration d'un Dividende Universel Financées par l'Épargne.\\nSuppression du sénat\\nLimitation de vitesse à 80km/h sur les routes départ\"" - ] - }, - "execution_count": 9, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "fix_bad_unicode(bad_unicode)[0:1000]" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "collapsed": true - }, - "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.7.0" - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} diff --git a/notebooks/Text files loader with encoding handler.ipynb b/notebooks/Text files loader with encoding handler.ipynb deleted file mode 100644 index 24cc875..0000000 --- a/notebooks/Text files loader with encoding handler.ipynb +++ /dev/null @@ -1,477 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Open Text File with encoding handling" - ] - }, - { - "cell_type": "code", - "execution_count": 1, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "# Example of a latin1 file\n", - "s = \"J'aime les frites bien grasse étalon châpeau!\"\n", - "encoded_s = s.encode('latin-1')\n", - "with open('somefile.txt', 'wb') as f:\n", - " f.write(encoded_s)" - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "# Let's add another document \n", - "s = \"Un deuxième exemple de texte en utf-8 cette fois!\"\n", - "encoded_s = s.encode('utf-8')\n", - "with open('someadditionalfile.txt', 'wb') as f:\n", - " f.write(encoded_s)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Document loader" - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "from nautilus_nlp.utils.file_loader import documents_loader" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Open a file when you know the encoding" - ] - }, - { - "cell_type": "code", - "execution_count": 19, - "metadata": { - "scrolled": true - }, - "outputs": [ - { - "data": { - "text/plain": [ - "'Un deuxième exemple de texte en utf-8 cette fois!'" - ] - }, - "execution_count": 19, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "# default encoding is UTF-8\n", - "documents_loader('someadditionalfile.txt')" - ] - }, - { - "cell_type": "code", - "execution_count": 18, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "\"J'aime les frites bien grasse étalon châpeau!\"" - ] - }, - "execution_count": 18, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "# If you know the encoding, you can specify it\n", - "documents_loader('somefile.txt', encoding='latin-1')" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Open a file with encoding detection" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "If you don't specify encoding, `document_loader()` will try to open it as UTF-8, and if it doesn't work it will try to detect encoding." - ] - }, - { - "cell_type": "code", - "execution_count": 15, - "metadata": { - "scrolled": false - }, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "WARNING:root:Encoding for somefile.txt is not UTF-8.\n", - "WARNING:root:Trying to detect encoding for somefile.txt\n", - "INFO:root:somefile.txt: detected encoding is ISO-8859-1, with a confidence rate of 0.73\n" - ] - }, - { - "data": { - "text/plain": [ - "\"J'aime les frites bien grasse étalon châpeau!\"" - ] - }, - "execution_count": 15, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "documents_loader('somefile.txt')" - ] - }, - { - "cell_type": "code", - "execution_count": 17, - "metadata": { - "scrolled": true - }, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "WARNING:root:Encoding for somefile.txt is not UTF-8.\n" - ] - }, - { - "ename": "TypeError", - "evalue": "function takes exactly 5 arguments (1 given)", - "output_type": "error", - "traceback": [ - "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", - "\u001b[0;31mUnicodeDecodeError\u001b[0m Traceback (most recent call last)", - "\u001b[0;32m~/Documents/NAUTILUS/nautilus-nlp/nautilus_nlp/utils/file_loader.py\u001b[0m in \u001b[0;36mtext_loader\u001b[0;34m(filepath, encoding, detectencoding)\u001b[0m\n\u001b[1;32m 38\u001b[0m \u001b[0;32mtry\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m---> 39\u001b[0;31m \u001b[0;32mreturn\u001b[0m \u001b[0mopen_textfile\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mfilepath\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mencoding\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;34m'utf-8'\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 40\u001b[0m \u001b[0;32mexcept\u001b[0m \u001b[0mUnicodeDecodeError\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", - "\u001b[0;32m~/Documents/NAUTILUS/nautilus-nlp/nautilus_nlp/utils/file_loader.py\u001b[0m in \u001b[0;36mopen_textfile\u001b[0;34m(filepath, encoding)\u001b[0m\n\u001b[1;32m 13\u001b[0m \u001b[0;32mwith\u001b[0m \u001b[0mio\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mopen\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mfilepath\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m'r'\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mencoding\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mencoding\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;32mas\u001b[0m \u001b[0mf\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m---> 14\u001b[0;31m \u001b[0mstring\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mf\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mread\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 15\u001b[0m \u001b[0;32mreturn\u001b[0m \u001b[0mstring\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", - "\u001b[0;32m/usr/local/Cellar/python/3.7.0/Frameworks/Python.framework/Versions/3.7/lib/python3.7/codecs.py\u001b[0m in \u001b[0;36mdecode\u001b[0;34m(self, input, final)\u001b[0m\n\u001b[1;32m 321\u001b[0m \u001b[0mdata\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mbuffer\u001b[0m \u001b[0;34m+\u001b[0m \u001b[0minput\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 322\u001b[0;31m \u001b[0;34m(\u001b[0m\u001b[0mresult\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mconsumed\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_buffer_decode\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mdata\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0merrors\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mfinal\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 323\u001b[0m \u001b[0;31m# keep undecoded input until the next call\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", - "\u001b[0;31mUnicodeDecodeError\u001b[0m: 'utf-8' codec can't decode byte 0xe9 in position 30: invalid continuation byte", - "\nDuring handling of the above exception, another exception occurred:\n", - "\u001b[0;31mTypeError\u001b[0m Traceback (most recent call last)", - "\u001b[0;32m<ipython-input-17-dc5ecd5accf3>\u001b[0m in \u001b[0;36m<module>\u001b[0;34m\u001b[0m\n\u001b[0;32m----> 1\u001b[0;31m \u001b[0mdocuments_loader\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m'somefile.txt'\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mdetectencoding\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;32mFalse\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", - "\u001b[0;32m~/Documents/NAUTILUS/nautilus-nlp/nautilus_nlp/utils/file_loader.py\u001b[0m in \u001b[0;36mdocuments_loader\u001b[0;34m(filepath, encoding, detectencoding, output_as)\u001b[0m\n\u001b[1;32m 89\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 90\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mnb_of_documents\u001b[0m \u001b[0;34m==\u001b[0m \u001b[0;36m1\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m---> 91\u001b[0;31m \u001b[0;32mreturn\u001b[0m \u001b[0mtext_loader\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mdocuments\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;36m0\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0mencoding\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mencoding\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mdetectencoding\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mdetectencoding\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 92\u001b[0m \u001b[0;32melif\u001b[0m \u001b[0mnb_of_documents\u001b[0m \u001b[0;34m>\u001b[0m \u001b[0;36m1\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 93\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0moutput_as\u001b[0m \u001b[0;34m==\u001b[0m \u001b[0;34m'list'\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", - "\u001b[0;32m~/Documents/NAUTILUS/nautilus-nlp/nautilus_nlp/utils/file_loader.py\u001b[0m in \u001b[0;36mtext_loader\u001b[0;34m(filepath, encoding, detectencoding)\u001b[0m\n\u001b[1;32m 47\u001b[0m \u001b[0;32mreturn\u001b[0m \u001b[0mopen_textfile\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mfilepath\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mencoding\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mdetected_encoding\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;34m'encoding'\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 48\u001b[0m \u001b[0;32melse\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m---> 49\u001b[0;31m \u001b[0;32mraise\u001b[0m \u001b[0mUnicodeDecodeError\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m'Cannot load document using utf-8. Try to detect encoding using detectencoding=True'\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 50\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 51\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n", - "\u001b[0;31mTypeError\u001b[0m: function takes exactly 5 arguments (1 given)" - ] - } - ], - "source": [ - "# You can prevent document loader from detecting the encoding if UTF-8 fails \n", - "documents_loader('somefile.txt', detectencoding=False)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Open several files" - ] - }, - { - "cell_type": "code", - "execution_count": 22, - "metadata": {}, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "WARNING:root:Encoding for somefile.txt is not UTF-8.\n", - "WARNING:root:Trying to detect encoding for somefile.txt\n", - "INFO:root:somefile.txt: detected encoding is ISO-8859-1, with a confidence rate of 0.73\n" - ] - }, - { - "data": { - "text/plain": [ - "{'somefile.txt': \"J'aime les frites bien grasse étalon châpeau!\",\n", - " 'someadditionalfile.txt': 'Un deuxième exemple de texte en utf-8 cette fois!'}" - ] - }, - "execution_count": 22, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "# you can use wildcards to open several documents\n", - "documents_loader('*.txt')" - ] - }, - { - "cell_type": "code", - "execution_count": 13, - "metadata": {}, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "WARNING:root:Encoding for somefile.txt is not UTF-8.\n", - "WARNING:root:Trying to detect encoding for somefile.txt\n", - "INFO:root:somefile.txt: detected encoding is ISO-8859-1, with a confidence rate of 0.73\n" - ] - }, - { - "data": { - "text/plain": [ - "{'somefile.txt': \"J'aime les frites bien grasse étalon châpeau!\",\n", - " 'someadditionalfile.txt': 'Un deuxième exemple de texte en utf-8 cette fois!'}" - ] - }, - "execution_count": 13, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "# you can also pass a list of filepaths\n", - "documents_loader(['somefile.txt','someadditionalfile.txt'])" - ] - }, - { - "cell_type": "code", - "execution_count": 21, - "metadata": {}, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "WARNING:root:Encoding for somefile.txt is not UTF-8.\n", - "WARNING:root:Trying to detect encoding for somefile.txt\n", - "INFO:root:somefile.txt: detected encoding is ISO-8859-1, with a confidence rate of 0.73\n" - ] - }, - { - "data": { - "text/plain": [ - "[\"J'aime les frites bien grasse étalon châpeau!\",\n", - " 'Un deuxième exemple de texte en utf-8 cette fois!']" - ] - }, - "execution_count": 21, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "# you can specify the output format when you load multiple texts\n", - "documents_loader('*.txt', output_as='list')" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## List files in a folder" - ] - }, - { - "cell_type": "code", - "execution_count": 24, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "from nautilus_nlp.utils.file_loader import list_files" - ] - }, - { - "cell_type": "code", - "execution_count": 8, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "['./somefile.txt',\n", - " './Open a file, a list of files and detect encoding.ipynb',\n", - " './Visualization tools.ipynb',\n", - " './Language_identification.ipynb',\n", - " './someadditionalfile.txt',\n", - " './somefile',\n", - " './Common Text Processing operations.ipynb',\n", - " './Sentiment_analysis_FT.ipynb',\n", - " './Spacy_model.ipynb',\n", - " './Sentiment analysis using pre-trained models.ipynb']" - ] - }, - "execution_count": 8, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "list_files('.') # list files from current folders" - ] - }, - { - "cell_type": "code", - "execution_count": 28, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "['../tests/testfolder_fileloader/./testdoc_utf8.txt',\n", - " '../tests/testfolder_fileloader/./testdoc_latin1.txt']" - ] - }, - "execution_count": 28, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "list_files('../tests/testfolder_fileloader/.')" - ] - }, - { - "cell_type": "code", - "execution_count": 26, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "['./TF-IDF.ipynb',\n", - " './Visualization tools.ipynb',\n", - " './Language_identification.ipynb',\n", - " './Common Text Processing operations.ipynb',\n", - " './Sentiment_analysis_FT.ipynb',\n", - " './Text files loader with encoding handler.ipynb',\n", - " './Spacy_model.ipynb',\n", - " './Sentiment analysis using pre-trained models.ipynb']" - ] - }, - "execution_count": 26, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "list_files('./*.ipynb') # List files matching specific pattern" - ] - }, - { - "cell_type": "code", - "execution_count": 10, - "metadata": { - "scrolled": true - }, - "outputs": [ - { - "data": { - "text/plain": [ - "['/Users/hugo/Documents/NAUTILUS/nautilus-nlp/LICENSE',\n", - " '/Users/hugo/Documents/NAUTILUS/nautilus-nlp/requirements.txt',\n", - " '/Users/hugo/Documents/NAUTILUS/nautilus-nlp/Makefile',\n", - " '/Users/hugo/Documents/NAUTILUS/nautilus-nlp/README.md',\n", - " '/Users/hugo/Documents/NAUTILUS/nautilus-nlp/setup.py',\n", - " '/Users/hugo/Documents/NAUTILUS/nautilus-nlp/tox.ini',\n", - " '/Users/hugo/Documents/NAUTILUS/nautilus-nlp/test_environment.py']" - ] - }, - "execution_count": 10, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "# only files will be printed, not folders\n", - "list_files('/Users/hugo/Documents/NAUTILUS/nautilus-nlp/')" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Detect encoding " - ] - }, - { - "cell_type": "code", - "execution_count": 5, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "from nautilus_nlp.utils.file_loader import detect_encoding" - ] - }, - { - "cell_type": "code", - "execution_count": 6, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "{'encoding': 'ISO-8859-1', 'confidence': 0.73, 'language': ''}" - ] - }, - "execution_count": 6, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "detect_encoding('somefile.txt')" - ] - } - ], - "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.7.0" - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} From 3a3e8d3e30980e27f2fecf9d5cecdb4e8d6d61e4 Mon Sep 17 00:00:00 2001 From: hugovasselin <waaaouu@gmail.com> Date: Thu, 23 May 2019 12:30:44 +0200 Subject: [PATCH 185/496] for conflict --- notebooks/TopicModeling.ipynb | 114 +++++++++++++++++++++++++--------- 1 file changed, 84 insertions(+), 30 deletions(-) diff --git a/notebooks/TopicModeling.ipynb b/notebooks/TopicModeling.ipynb index 24fe053..d8adfa3 100644 --- a/notebooks/TopicModeling.ipynb +++ b/notebooks/TopicModeling.ipynb @@ -10,7 +10,9 @@ { "cell_type": "code", "execution_count": 8, - "metadata": {}, + "metadata": { + "collapsed": true + }, "outputs": [], "source": [ "from sklearn.datasets import fetch_20newsgroups\n", @@ -74,7 +76,9 @@ { "cell_type": "code", "execution_count": 11, - "metadata": {}, + "metadata": { + "collapsed": true + }, "outputs": [], "source": [ "def lemmatize_stemming(text):\n", @@ -93,7 +97,9 @@ { "cell_type": "code", "execution_count": 12, - "metadata": {}, + "metadata": { + "collapsed": true + }, "outputs": [], "source": [ "processed_docs = []\n", @@ -112,7 +118,9 @@ { "cell_type": "code", "execution_count": 13, - "metadata": {}, + "metadata": { + "collapsed": true + }, "outputs": [], "source": [ "# Create the dictionnary\n", @@ -122,7 +130,9 @@ { "cell_type": "code", "execution_count": 14, - "metadata": {}, + "metadata": { + "collapsed": true + }, "outputs": [], "source": [ "dictionary = create_dictionary(processed_docs)" @@ -131,7 +141,9 @@ { "cell_type": "code", "execution_count": 15, - "metadata": {}, + "metadata": { + "collapsed": true + }, "outputs": [], "source": [ "# Filter out tokens that appear in too few or too many documents\n", @@ -141,7 +153,9 @@ { "cell_type": "code", "execution_count": 16, - "metadata": {}, + "metadata": { + "collapsed": true + }, "outputs": [], "source": [ "filter_extremes(dictionary)" @@ -150,7 +164,9 @@ { "cell_type": "code", "execution_count": 17, - "metadata": {}, + "metadata": { + "collapsed": true + }, "outputs": [], "source": [ "# Create the bow \n", @@ -160,7 +176,9 @@ { "cell_type": "code", "execution_count": 18, - "metadata": {}, + "metadata": { + "collapsed": true + }, "outputs": [], "source": [ "bow_corpus = create_bow_corpus(processed_docs, dictionary)" @@ -193,7 +211,9 @@ { "cell_type": "code", "execution_count": 13, - "metadata": {}, + "metadata": { + "collapsed": true + }, "outputs": [], "source": [ "# Compute coherence values for various number of topics in order to pick the optimal one\n", @@ -203,7 +223,9 @@ { "cell_type": "code", "execution_count": 14, - "metadata": {}, + "metadata": { + "collapsed": true + }, "outputs": [], "source": [ "# Take a long time to run\n", @@ -238,7 +260,9 @@ { "cell_type": "code", "execution_count": 2, - "metadata": {}, + "metadata": { + "collapsed": true + }, "outputs": [], "source": [ "from nautilus_nlp.models.topic_modeling import plot_optimal_topic_number" @@ -269,7 +293,9 @@ { "cell_type": "code", "execution_count": 4, - "metadata": {}, + "metadata": { + "collapsed": true + }, "outputs": [], "source": [ "# Print the coherences scores for the number we tested\n", @@ -308,7 +334,9 @@ { "cell_type": "code", "execution_count": 12, - "metadata": {}, + "metadata": { + "collapsed": true + }, "outputs": [], "source": [ "# Train the LDA model with gensim\n", @@ -318,7 +346,9 @@ { "cell_type": "code", "execution_count": 13, - "metadata": {}, + "metadata": { + "collapsed": true + }, "outputs": [], "source": [ "model = train_lda_model(bow_corpus, dictionary, 10)" @@ -347,7 +377,9 @@ { "cell_type": "code", "execution_count": 15, - "metadata": {}, + "metadata": { + "collapsed": true + }, "outputs": [], "source": [ "# Save model\n", @@ -357,7 +389,9 @@ { "cell_type": "code", "execution_count": 16, - "metadata": {}, + "metadata": { + "collapsed": true + }, "outputs": [], "source": [ "save_model(model,'/Users/williamjaubert/Documents/Allianz_William/notebook', 'ldamodel_nautilus')" @@ -366,7 +400,9 @@ { "cell_type": "code", "execution_count": 152, - "metadata": {}, + "metadata": { + "collapsed": true + }, "outputs": [], "source": [ "# Load model" @@ -375,7 +411,9 @@ { "cell_type": "code", "execution_count": 17, - "metadata": {}, + "metadata": { + "collapsed": true + }, "outputs": [], "source": [ "from nautilus_nlp.models.topic_modeling import load_model" @@ -412,7 +450,9 @@ { "cell_type": "code", "execution_count": 19, - "metadata": {}, + "metadata": { + "collapsed": true + }, "outputs": [], "source": [ "# Display the top keywords per topic in a interactive chart\n", @@ -638,7 +678,9 @@ { "cell_type": "code", "execution_count": 23, - "metadata": {}, + "metadata": { + "collapsed": true + }, "outputs": [], "source": [ "# Save the pyldavis as HTML\n", @@ -648,7 +690,9 @@ { "cell_type": "code", "execution_count": 24, - "metadata": {}, + "metadata": { + "collapsed": true + }, "outputs": [], "source": [ "save_pyldavis(p, '/Users/williamjaubert/Documents/Allianz_William/', 'pyldavis_test_func')" @@ -657,7 +701,9 @@ { "cell_type": "code", "execution_count": 27, - "metadata": {}, + "metadata": { + "collapsed": true + }, "outputs": [], "source": [ "# Load the pyldavis HTML\n", @@ -774,7 +820,9 @@ { "cell_type": "code", "execution_count": 75, - "metadata": {}, + "metadata": { + "collapsed": true + }, "outputs": [], "source": [ "# Data preprocessing step for the unseen document\n", @@ -784,7 +832,9 @@ { "cell_type": "code", "execution_count": 48, - "metadata": {}, + "metadata": { + "collapsed": true + }, "outputs": [], "source": [ "from nautilus_nlp.models.topic_modeling import fit_data" @@ -822,7 +872,9 @@ { "cell_type": "code", "execution_count": 1, - "metadata": {}, + "metadata": { + "collapsed": true + }, "outputs": [], "source": [ "# Show the dominant topics of the new document and their keywords \n", @@ -851,16 +903,18 @@ { "cell_type": "code", "execution_count": null, - "metadata": {}, + "metadata": { + "collapsed": true + }, "outputs": [], "source": [] } ], "metadata": { "kernelspec": { - "display_name": "nautilus", + "display_name": "Python 3", "language": "python", - "name": "nautilus" + "name": "python3" }, "language_info": { "codemirror_mode": { @@ -872,7 +926,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.7.3" + "version": "3.7.0" } }, "nbformat": 4, From 467ceda13c362f20a7b068bb607c60076c0832a9 Mon Sep 17 00:00:00 2001 From: hugovasselin <waaaouu@gmail.com> Date: Thu, 23 May 2019 12:30:59 +0200 Subject: [PATCH 186/496] rename notebook --- notebooks/2. Text processing.ipynb | 821 +++++++++++++++++++++++++++++ 1 file changed, 821 insertions(+) create mode 100644 notebooks/2. Text processing.ipynb diff --git a/notebooks/2. Text processing.ipynb b/notebooks/2. Text processing.ipynb new file mode 100644 index 0000000..34e9338 --- /dev/null +++ b/notebooks/2. Text processing.ipynb @@ -0,0 +1,821 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Common text processing operations" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Tokenization" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Tokenizing French and English texts" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "from nautilus_nlp.utils.tokenizer import tokenize, untokenize" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "fr_txt = \"Ceci est un texte français, j'adore 1 !\"\n", + "eng_txt = \"Let's play together!\"" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "str_ = \"\"\"Les moteurs de recherche tels Google, Exalead ou Yahoo! sont des applications très connues de fouille de textes sur de grandes masses de données. Cependant, les moteurs de recherche ne se basent pas uniquement sur le texte pour l'indexer, mais également sur la façon dont les pages sont mises en valeur les unes par rapport aux autres. L'algorithme utilisé par Google est PageRank, et il est courant de voir HITS dans le milieu académique\"\"\"" + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "metadata": { + "scrolled": true + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "CPU times: user 4.76 ms, sys: 31 µs, total: 4.79 ms\n", + "Wall time: 4.42 ms\n" + ] + }, + { + "data": { + "text/plain": [ + "['Les',\n", + " 'moteurs',\n", + " 'de',\n", + " 'recherche',\n", + " 'tels',\n", + " 'Google',\n", + " ',',\n", + " 'Exalead',\n", + " 'ou',\n", + " 'Yahoo',\n", + " '!',\n", + " 'sont',\n", + " 'des',\n", + " 'applications',\n", + " 'très',\n", + " 'connues',\n", + " 'de',\n", + " 'fouille',\n", + " 'de',\n", + " 'textes',\n", + " 'sur',\n", + " 'de',\n", + " 'grandes',\n", + " 'masses',\n", + " 'de',\n", + " 'données',\n", + " '.',\n", + " 'Cependant',\n", + " ',',\n", + " 'les',\n", + " 'moteurs',\n", + " 'de',\n", + " 'recherche',\n", + " 'ne',\n", + " 'se',\n", + " 'basent',\n", + " 'pas',\n", + " 'uniquement',\n", + " 'sur',\n", + " 'le',\n", + " 'texte',\n", + " 'pour',\n", + " \"l'\",\n", + " 'indexer',\n", + " ',',\n", + " 'mais',\n", + " 'également',\n", + " 'sur',\n", + " 'la',\n", + " 'façon',\n", + " 'dont',\n", + " 'les',\n", + " 'pages',\n", + " 'sont',\n", + " 'mises',\n", + " 'en',\n", + " 'valeur',\n", + " 'les',\n", + " 'unes',\n", + " 'par',\n", + " 'rapport',\n", + " 'aux',\n", + " 'autres',\n", + " '.',\n", + " \"L'\",\n", + " 'algorithme',\n", + " 'utilisé',\n", + " 'par',\n", + " 'Google',\n", + " 'est',\n", + " 'PageRank',\n", + " ',',\n", + " 'et',\n", + " 'il',\n", + " 'est',\n", + " 'courant',\n", + " 'de',\n", + " 'voir',\n", + " 'HITS',\n", + " 'dans',\n", + " 'le',\n", + " 'milieu',\n", + " 'académique']" + ] + }, + "execution_count": 15, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "%%time\n", + "tokenize(str_, lang_module=\"fr_spacy\")" + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "CPU times: user 6.22 ms, sys: 94 µs, total: 6.31 ms\n", + "Wall time: 4.27 ms\n" + ] + } + ], + "source": [ + "%%time\n", + "tokenized_fr_txt = tokenize(str_, lang_module=\"fr_moses\")" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "['Les',\n", + " 'moteurs',\n", + " 'de',\n", + " 'recherche',\n", + " 'tels',\n", + " 'Google',\n", + " ',',\n", + " 'Exalead',\n", + " 'ou',\n", + " 'Yahoo',\n", + " '!',\n", + " 'sont',\n", + " 'des',\n", + " 'applications',\n", + " 'très',\n", + " 'connues',\n", + " 'de',\n", + " 'fouille',\n", + " 'de',\n", + " 'textes',\n", + " 'sur',\n", + " 'de',\n", + " 'grandes',\n", + " 'masses',\n", + " 'de',\n", + " 'données',\n", + " '.',\n", + " 'Cependant',\n", + " ',',\n", + " 'les',\n", + " 'moteurs',\n", + " 'de',\n", + " 'recherche',\n", + " 'ne',\n", + " 'se',\n", + " 'basent',\n", + " 'pas',\n", + " 'uniquement',\n", + " 'sur',\n", + " 'le',\n", + " 'texte',\n", + " 'pour',\n", + " \"l'\",\n", + " 'indexer',\n", + " ',',\n", + " 'mais',\n", + " 'également',\n", + " 'sur',\n", + " 'la',\n", + " 'façon',\n", + " 'dont',\n", + " 'les',\n", + " 'pages',\n", + " 'sont',\n", + " 'mises',\n", + " 'en',\n", + " 'valeur',\n", + " 'les',\n", + " 'unes',\n", + " 'par',\n", + " 'rapport',\n", + " 'aux',\n", + " 'autres',\n", + " '.',\n", + " \"L'\",\n", + " 'algorithme',\n", + " 'utilisé',\n", + " 'par',\n", + " 'Google',\n", + " 'est',\n", + " 'PageRank',\n", + " ',',\n", + " 'et',\n", + " 'il',\n", + " 'est',\n", + " 'courant',\n", + " 'de',\n", + " 'voir',\n", + " 'HITS',\n", + " 'dans',\n", + " 'le',\n", + " 'milieu',\n", + " 'académique']" + ] + }, + "execution_count": 13, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "tokenize(str_, lang_module=\"fr_moses\")" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "CPU times: user 24.3 ms, sys: 3.99 ms, total: 28.3 ms\n", + "Wall time: 26.2 ms\n" + ] + } + ], + "source": [ + "%%time\n", + "tokenized_eng_txt = tokenize(eng_txt, lang_module=\"en_spacy\")\n", + "tokenized_eng_txt" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "CPU times: user 17.3 ms, sys: 3.71 ms, total: 21 ms\n", + "Wall time: 26.9 ms\n" + ] + } + ], + "source": [ + "%%time\n", + "tokenized_eng_txt = tokenize(eng_txt, lang_module=\"en_nltk\")\n", + "tokenized_eng_txt" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## You can also untokenize your text" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "\"Let's play together!\"" + ] + }, + "execution_count": 13, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "untokenize(tokenized_eng_txt,lang='en')" + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "\"Ceci est un texte français, j' adore !\"" + ] + }, + "execution_count": 15, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# Here the \"J'adore\" is not handled in the right way\n", + "untokenize(tokenized_fr_txt,lang='fr')" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Stemming " + ] + }, + { + "cell_type": "code", + "execution_count": 124, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "from nautilus_nlp.utils.stemmer import stem_tokens" + ] + }, + { + "cell_type": "code", + "execution_count": 125, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "['i', 'surviv', 'these', 'dog']" + ] + }, + "execution_count": 125, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "stem_tokens(['I','survived','these', 'dogs'], lang='english')" + ] + }, + { + "cell_type": "code", + "execution_count": 128, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "['je', 'mang', 'dan', 'le', 'cuisin', 'du', 'château']" + ] + }, + "execution_count": 128, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "stem_tokens(tokenize(\"je mangerai dans les cuisines du château\"),lang='french')" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Lemmatization" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## French " + ] + }, + { + "cell_type": "code", + "execution_count": 28, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "from nautilus_nlp.utils.lemmatizer import lemmatize_french_tokens" + ] + }, + { + "cell_type": "code", + "execution_count": 29, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "['Ceci', 'est', 'un', 'texte', 'français', ',', \"j'\", 'adore', 'tes', 'frites', 'bien', 'grasses', 'YOLO', '!']\n" + ] + } + ], + "source": [ + "txt_to_tokenize=['Ceci', 'est', 'un', 'texte', 'français', ',', \"j'\", 'adore', 'tes', 'frites', 'bien', 'grasses', 'YOLO', '!']\n", + "print(txt_to_tokenize)" + ] + }, + { + "cell_type": "code", + "execution_count": 32, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "CPU times: user 37.9 ms, sys: 51.9 ms, total: 89.8 ms\n", + "Wall time: 65.3 ms\n" + ] + }, + { + "data": { + "text/plain": [ + "['ceci',\n", + " 'être',\n", + " 'un',\n", + " 'texte',\n", + " 'français',\n", + " ',',\n", + " 'j',\n", + " \"'\",\n", + " 'adorer',\n", + " 't',\n", + " 'frite',\n", + " 'bien',\n", + " 'gras',\n", + " 'yolo',\n", + " '!']" + ] + }, + "execution_count": 32, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "%%time\n", + "lemmatize_french_tokens(txt_to_tokenize, module='spacy')" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## English" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": { + "scrolled": true + }, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "[nltk_data] Downloading package wordnet to /Users/hugo/nltk_data...\n", + "[nltk_data] Package wordnet is already up-to-date!\n" + ] + } + ], + "source": [ + "from nautilus_nlp.utils.lemmatizer import lemmatize_english_tokens" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "to_lemmatize = ['The', 'striped', 'bats', 'are', 'hanging', 'on', 'their', 'feet', 'for', 'best']" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "CPU times: user 27.2 ms, sys: 4.4 ms, total: 31.6 ms\n", + "Wall time: 31.3 ms\n" + ] + }, + { + "data": { + "text/plain": [ + "['the', 'strip', 'bat', 'be', 'hang', 'on', '-PRON-', 'foot', 'for', 'good']" + ] + }, + "execution_count": 3, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "%%time\n", + "lemmatize_english_tokens(to_lemmatize, module='spacy')" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "CPU times: user 3.07 s, sys: 217 ms, total: 3.28 s\n", + "Wall time: 3.45 s\n" + ] + }, + { + "data": { + "text/plain": [ + "['The', 'strip', 'bat', 'be', 'hang', 'on', 'their', 'foot', 'for', 'best']" + ] + }, + "execution_count": 4, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "%%time\n", + "lemmatize_english_tokens(to_lemmatize, module='nltk')" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Remove stop words" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "[nltk_data] Downloading package punkt to /Users/hugo/nltk_data...\n", + "[nltk_data] Package punkt is already up-to-date!\n" + ] + } + ], + "source": [ + "from nautilus_nlp.utils.preprocess import remove_stopwords\n", + "from nautilus_nlp.utils.tokenizer import tokenize\n", + "from nautilus_nlp.utils.constants import get_stopwords" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "FRENCH_SW = get_stopwords('fr')" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "text = \"J'ai un beau cheval\"" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "[\"J'ai\", 'beau', 'cheval']" + ] + }, + "execution_count": 4, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "remove_stopwords(text, FRENCH_SW)" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "[\"J'\", 'beau', 'cheval']" + ] + }, + "execution_count": 6, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "remove_stopwords(tokenize(text, lang_module=\"fr_spacy\"),FRENCH_SW)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Fix bad encoding\n", + "\n", + "Sometimes you messed up you encoding saving files, and you don't know how to fix this." + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "from nautilus_nlp.utils.preprocess import fix_bad_unicode\n", + "from nautilus_nlp.utils import file_loader" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "bad_unicode=file_loader.open_textfile('./bad_encoding.txt')" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "\"Les augmentations de rémunérations\\nrénover l'enquête publique pour en faire un vrai outil d'aménagement du territoire et de dialogue social\\nLimitations de vitesse et sécurité routière\\nPour un nouveau contrat citoyen\\nDévelopper les démarches de budget participatif dans les collectivités et associer les citoyens dans la réalisation des projets\\nproportienelle\\nPour plus de démocratie participative\\nTransparence de la vie public\\n18 mois de trop....ca suffit macron\\nEgalité devant les infractions routières\\nMesures d'urgence pour une démocratie régénérée\\nSORTIR DU GRAND EST ! REOUR A LA REGION ALSACE\\nPour plus de transparence\\nEcoutez enfin le peuple.\\nVote obligatoire\\nAvis d'un citoyen ordinaire et socialiste - vive le RIC\\nsuppression du 80 km/h\\nproportionelle et immigration\\nRevoir les plafonds des aides sociales\\nProposition de Refondation du Capitalisme et d'Instauration d'un Dividende Universel Financées par l'Épargne.\\nSuppression du sénat\\nLimitation de vitesse Ã\\xa0 80km\"" + ] + }, + "execution_count": 8, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "bad_unicode[0:1000]" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "\"Les augmentations de rémunérations\\nrénover l'enquête publique pour en faire un vrai outil d'aménagement du territoire et de dialogue social\\nLimitations de vitesse et sécurité routière\\nPour un nouveau contrat citoyen\\nDévelopper les démarches de budget participatif dans les collectivités et associer les citoyens dans la réalisation des projets\\nproportienelle\\nPour plus de démocratie participative\\nTransparence de la vie public\\n18 mois de trop....ca suffit macron\\nEgalité devant les infractions routières\\nMesures d'urgence pour une démocratie régénérée\\nSORTIR DU GRAND EST ! REOUR A LA REGION ALSACE\\nPour plus de transparence\\nEcoutez enfin le peuple.\\nVote obligatoire\\nAvis d'un citoyen ordinaire et socialiste - vive le RIC\\nsuppression du 80 km/h\\nproportionelle et immigration\\nRevoir les plafonds des aides sociales\\nProposition de Refondation du Capitalisme et d'Instauration d'un Dividende Universel Financées par l'Épargne.\\nSuppression du sénat\\nLimitation de vitesse à 80km/h sur les routes départ\"" + ] + }, + "execution_count": 9, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "fix_bad_unicode(bad_unicode)[0:1000]" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": true + }, + "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.7.0" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} From bf3df9a4882305abdd7de94669e678cb05fc3a8c Mon Sep 17 00:00:00 2001 From: hugovasselin <waaaouu@gmail.com> Date: Thu, 23 May 2019 12:37:27 +0200 Subject: [PATCH 187/496] resolve conflics --- notebooks/TopicModeling.ipynb | 431 ++++++++++++++++++++-------------- 1 file changed, 260 insertions(+), 171 deletions(-) diff --git a/notebooks/TopicModeling.ipynb b/notebooks/TopicModeling.ipynb index d8adfa3..c58cf2c 100644 --- a/notebooks/TopicModeling.ipynb +++ b/notebooks/TopicModeling.ipynb @@ -9,10 +9,15 @@ }, { "cell_type": "code", +<<<<<<< HEAD "execution_count": 8, "metadata": { "collapsed": true }, +======= + "execution_count": 1, + "metadata": {}, +>>>>>>> 6197a072a0845f714fca92bb469a7e224b1c15d3 "outputs": [], "source": [ "from sklearn.datasets import fetch_20newsgroups\n", @@ -22,7 +27,7 @@ }, { "cell_type": "code", - "execution_count": 9, + "execution_count": 2, "metadata": {}, "outputs": [ { @@ -46,18 +51,9 @@ }, { "cell_type": "code", - "execution_count": 10, + "execution_count": 3, "metadata": {}, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "/Users/williamjaubert/anaconda2/envs/nautilus/lib/python3.7/site-packages/nltk/decorators.py:68: DeprecationWarning: `formatargspec` is deprecated since Python 3.5. Use `signature` and the `Signature` object directly\n", - " regargs, varargs, varkwargs, defaults, formatvalue=lambda value: \"\"\n" - ] - } - ], + "outputs": [], "source": [ "import gensim\n", "from gensim.utils import simple_preprocess\n", @@ -75,10 +71,15 @@ }, { "cell_type": "code", +<<<<<<< HEAD "execution_count": 11, "metadata": { "collapsed": true }, +======= + "execution_count": 4, + "metadata": {}, +>>>>>>> 6197a072a0845f714fca92bb469a7e224b1c15d3 "outputs": [], "source": [ "def lemmatize_stemming(text):\n", @@ -96,10 +97,15 @@ }, { "cell_type": "code", +<<<<<<< HEAD "execution_count": 12, "metadata": { "collapsed": true }, +======= + "execution_count": 5, + "metadata": {}, +>>>>>>> 6197a072a0845f714fca92bb469a7e224b1c15d3 "outputs": [], "source": [ "processed_docs = []\n", @@ -117,10 +123,15 @@ }, { "cell_type": "code", +<<<<<<< HEAD "execution_count": 13, "metadata": { "collapsed": true }, +======= + "execution_count": 6, + "metadata": {}, +>>>>>>> 6197a072a0845f714fca92bb469a7e224b1c15d3 "outputs": [], "source": [ "# Create the dictionnary\n", @@ -129,10 +140,15 @@ }, { "cell_type": "code", +<<<<<<< HEAD "execution_count": 14, "metadata": { "collapsed": true }, +======= + "execution_count": 7, + "metadata": {}, +>>>>>>> 6197a072a0845f714fca92bb469a7e224b1c15d3 "outputs": [], "source": [ "dictionary = create_dictionary(processed_docs)" @@ -140,10 +156,15 @@ }, { "cell_type": "code", +<<<<<<< HEAD "execution_count": 15, "metadata": { "collapsed": true }, +======= + "execution_count": 8, + "metadata": {}, +>>>>>>> 6197a072a0845f714fca92bb469a7e224b1c15d3 "outputs": [], "source": [ "# Filter out tokens that appear in too few or too many documents\n", @@ -152,10 +173,15 @@ }, { "cell_type": "code", +<<<<<<< HEAD "execution_count": 16, "metadata": { "collapsed": true }, +======= + "execution_count": 9, + "metadata": {}, +>>>>>>> 6197a072a0845f714fca92bb469a7e224b1c15d3 "outputs": [], "source": [ "filter_extremes(dictionary)" @@ -163,10 +189,15 @@ }, { "cell_type": "code", +<<<<<<< HEAD "execution_count": 17, "metadata": { "collapsed": true }, +======= + "execution_count": 10, + "metadata": {}, +>>>>>>> 6197a072a0845f714fca92bb469a7e224b1c15d3 "outputs": [], "source": [ "# Create the bow \n", @@ -175,10 +206,15 @@ }, { "cell_type": "code", +<<<<<<< HEAD "execution_count": 18, "metadata": { "collapsed": true }, +======= + "execution_count": 11, + "metadata": {}, +>>>>>>> 6197a072a0845f714fca92bb469a7e224b1c15d3 "outputs": [], "source": [ "bow_corpus = create_bow_corpus(processed_docs, dictionary)" @@ -186,7 +222,7 @@ }, { "cell_type": "code", - "execution_count": 20, + "execution_count": 12, "metadata": {}, "outputs": [ { @@ -328,15 +364,27 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "### Step 5: Running LDA using Bag of Words" + "### Step 5: Running LDA using Bag of Words with Gensim or Mallet" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "#### Gensim" ] }, { "cell_type": "code", +<<<<<<< HEAD "execution_count": 12, "metadata": { "collapsed": true }, +======= + "execution_count": 13, + "metadata": {}, +>>>>>>> 6197a072a0845f714fca92bb469a7e224b1c15d3 "outputs": [], "source": [ "# Train the LDA model with gensim\n", @@ -345,27 +393,33 @@ }, { "cell_type": "code", +<<<<<<< HEAD "execution_count": 13, "metadata": { "collapsed": true }, +======= + "execution_count": 14, + "metadata": {}, +>>>>>>> 6197a072a0845f714fca92bb469a7e224b1c15d3 "outputs": [], "source": [ + "# By default the model used will be gensim implementation of LDA\n", "model = train_lda_model(bow_corpus, dictionary, 10)" ] }, { "cell_type": "code", - "execution_count": 14, + "execution_count": 15, "metadata": {}, "outputs": [ { "data": { "text/plain": [ - "<gensim.models.ldamodel.LdaModel at 0x1a2af3e208>" + "<gensim.models.ldamodel.LdaModel at 0x10a171ef0>" ] }, - "execution_count": 14, + "execution_count": 15, "metadata": {}, "output_type": "execute_result" } @@ -376,33 +430,48 @@ }, { "cell_type": "code", +<<<<<<< HEAD "execution_count": 15, "metadata": { "collapsed": true }, +======= + "execution_count": 53, + "metadata": {}, +>>>>>>> 6197a072a0845f714fca92bb469a7e224b1c15d3 "outputs": [], "source": [ - "# Save model\n", + "# Save model: The model will be saved on your current emplacement.\n", "from nautilus_nlp.models.topic_modeling import save_model" ] }, { "cell_type": "code", +<<<<<<< HEAD "execution_count": 16, "metadata": { "collapsed": true }, +======= + "execution_count": 54, + "metadata": {}, +>>>>>>> 6197a072a0845f714fca92bb469a7e224b1c15d3 "outputs": [], "source": [ - "save_model(model,'/Users/williamjaubert/Documents/Allianz_William/notebook', 'ldamodel_nautilus')" + "save_model(model, 'ldamodel_nautilus')" ] }, { "cell_type": "code", +<<<<<<< HEAD "execution_count": 152, "metadata": { "collapsed": true }, +======= + "execution_count": 24, + "metadata": {}, +>>>>>>> 6197a072a0845f714fca92bb469a7e224b1c15d3 "outputs": [], "source": [ "# Load model" @@ -410,34 +479,97 @@ }, { "cell_type": "code", +<<<<<<< HEAD "execution_count": 17, "metadata": { "collapsed": true }, +======= + "execution_count": 55, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "<gensim.models.ldamodel.LdaModel at 0x1a3142fc88>" + ] + }, + "execution_count": 55, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "model_loaded = load_model('/Users/williamjaubert/nautilus_nlp/notebooks', 'ldamodel_nautilus')\n", + "model_loaded" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "#### Mallet " + ] + }, + { + "cell_type": "code", + "execution_count": 22, + "metadata": {}, +>>>>>>> 6197a072a0845f714fca92bb469a7e224b1c15d3 "outputs": [], "source": [ - "from nautilus_nlp.models.topic_modeling import load_model" + "# You can train Mallet model by precising 'mallet' in the model parameter and give the path where the mallet-2.0.8 file that has been downloaded \n", + "model_mallet = train_lda_model(bow_corpus, dictionary, 10, model='mallet', mallet_path='/Users/williamjaubert/nautilus_nlp')" ] }, { "cell_type": "code", - "execution_count": 18, + "execution_count": 23, "metadata": {}, "outputs": [ { "data": { "text/plain": [ - "<gensim.models.ldamodel.LdaModel at 0x1a29985b38>" + "<gensim.models.wrappers.ldamallet.LdaMallet at 0x1a2eb0e320>" ] }, - "execution_count": 18, + "execution_count": 23, "metadata": {}, "output_type": "execute_result" } ], "source": [ - "model_loaded = load_model('/Users/williamjaubert/Documents/Allianz_William/notebook', 'ldamodel_nautilus')\n", - "model_loaded" + "model_mallet" + ] + }, + { + "cell_type": "code", + "execution_count": 47, + "metadata": {}, + "outputs": [], + "source": [ + "save_model(model_mallet, 'ldamodel_mallet_nautilus')" + ] + }, + { + "cell_type": "code", + "execution_count": 52, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "<gensim.models.wrappers.ldamallet.LdaMallet at 0x1a30d1e550>" + ] + }, + "execution_count": 52, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "model_mallet_loaded = load_model('/Users/williamjaubert/nautilus_nlp/notebooks', 'ldamodel_mallet_nautilus', model='mallet')\n", + "model_mallet_loaded" ] }, { @@ -449,10 +581,15 @@ }, { "cell_type": "code", +<<<<<<< HEAD "execution_count": 19, "metadata": { "collapsed": true }, +======= + "execution_count": 56, + "metadata": {}, +>>>>>>> 6197a072a0845f714fca92bb469a7e224b1c15d3 "outputs": [], "source": [ "# Display the top keywords per topic in a interactive chart\n", @@ -461,8 +598,10 @@ }, { "cell_type": "code", - "execution_count": 155, - "metadata": {}, + "execution_count": 30, + "metadata": { + "collapsed": true + }, "outputs": [ { "name": "stderr", @@ -485,10 +624,10 @@ "<link rel=\"stylesheet\" type=\"text/css\" href=\"https://cdn.rawgit.com/bmabey/pyLDAvis/files/ldavis.v1.0.0.css\">\n", "\n", "\n", - "<div id=\"ldavis_el591011124095238088809029897\"></div>\n", + "<div id=\"ldavis_el155871124265505206097197808\"></div>\n", "<script type=\"text/javascript\">\n", "\n", - "var ldavis_el591011124095238088809029897_data = {\"mdsDat\": {\"x\": [-0.07866945427665124, -0.01699948489792914, 0.20896689238873523, 0.14744605031212607, -0.008849073212760983, -0.04505413872814077, -0.08949897686453376, 0.10780299734830809, 0.004524270451044093, -0.22966908252019716], \"y\": [-0.15170611822961017, -0.1504468301902949, 0.08013685816591506, 0.13647834612774523, -0.009046128981188077, 0.003906923765221535, 0.14472746444813225, -0.07737607739594787, -0.1051004751701791, 0.1284260374602061], \"topics\": [1, 2, 3, 4, 5, 6, 7, 8, 9, 10], \"cluster\": [1, 1, 1, 1, 1, 1, 1, 1, 1, 1], \"Freq\": [13.182504653930664, 12.926197052001953, 12.463006973266602, 11.995771408081055, 9.55910873413086, 9.468682289123535, 8.927140235900879, 7.882134437561035, 7.024929523468018, 6.5705246925354]}, \"tinfo\": {\"Category\": [\"Default\", \"Default\", \"Default\", \"Default\", \"Default\", \"Default\", \"Default\", \"Default\", \"Default\", \"Default\", \"Default\", \"Default\", \"Default\", \"Default\", \"Default\", \"Default\", \"Default\", \"Default\", \"Default\", \"Default\", \"Default\", \"Default\", \"Default\", \"Default\", \"Default\", \"Default\", \"Default\", \"Default\", \"Default\", \"Default\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\"], \"Freq\": [2966.0, 1940.0, 1924.0, 1689.0, 2638.0, 2883.0, 1860.0, 1161.0, 1997.0, 1477.0, 1274.0, 1017.0, 1577.0, 1423.0, 1059.0, 1331.0, 1142.0, 2599.0, 837.0, 1391.0, 6052.0, 742.0, 990.0, 784.0, 1802.0, 1023.0, 4004.0, 867.0, 1191.0, 747.0, 1142.053466796875, 698.051025390625, 406.8222961425781, 375.23699951171875, 365.2066650390625, 324.94189453125, 317.34423828125, 293.73358154296875, 242.91064453125, 242.6265411376953, 238.57518005371094, 222.68365478515625, 219.24806213378906, 497.52392578125, 182.9066925048828, 189.0950927734375, 180.77523803710938, 167.61569213867188, 170.06529235839844, 162.4676055908203, 156.04241943359375, 152.99142456054688, 147.4279327392578, 144.96324157714844, 144.00845336914062, 142.54815673828125, 140.01528930664062, 137.27037048339844, 111.63591766357422, 111.36140441894531, 296.46563720703125, 234.76368713378906, 534.498779296875, 227.3394775390625, 733.4286499023438, 290.5852355957031, 1027.818603515625, 194.50514221191406, 462.2489929199219, 638.7830200195312, 383.04254150390625, 557.0740966796875, 270.9013671875, 346.3726501464844, 2339.714599609375, 353.4006042480469, 956.244140625, 1366.7689208984375, 489.0564880371094, 1502.89306640625, 432.21966552734375, 423.68536376953125, 946.1923828125, 647.3731689453125, 868.969970703125, 843.2189331054688, 679.2139892578125, 536.1270751953125, 452.23504638671875, 627.3469848632812, 723.7830200195312, 487.529541015625, 627.237060546875, 480.2855529785156, 485.9232482910156, 520.519287109375, 439.0638122558594, 1273.8934326171875, 843.1687622070312, 687.6259155273438, 378.13519287109375, 599.566650390625, 284.1808166503906, 264.9247131347656, 257.7122802734375, 233.3790283203125, 198.55160522460938, 196.56007385253906, 186.4253692626953, 185.77682495117188, 190.4823760986328, 160.68319702148438, 157.2107391357422, 147.51388549804688, 143.9427032470703, 141.29263305664062, 132.9550323486328, 132.7094268798828, 136.2650604248047, 134.08621215820312, 122.39493560791016, 117.66445922851562, 110.7325210571289, 103.35787200927734, 103.81564331054688, 102.61417388916016, 191.171142578125, 1897.55224609375, 734.2091674804688, 595.35400390625, 628.1231079101562, 206.7904815673828, 246.95516967773438, 800.1998901367188, 749.1170043945312, 336.15264892578125, 271.74371337890625, 265.7127990722656, 398.02044677734375, 574.3276977539062, 250.16622924804688, 378.8575744628906, 461.7618408203125, 1507.1781005859375, 256.8684997558594, 577.097900390625, 989.1630249023438, 369.29083251953125, 600.9321899414062, 735.2871704101562, 547.2880249023438, 671.5233154296875, 658.334716796875, 983.666259765625, 1571.5150146484375, 640.5947875976562, 527.5059204101562, 1109.0411376953125, 876.4497680664062, 725.8155517578125, 862.159912109375, 662.5055541992188, 745.251953125, 665.8281860351562, 603.2254028320312, 672.0674438476562, 613.41943359375, 579.7627563476562, 513.5291137695312, 478.60107421875, 261.23309326171875, 304.4447937011719, 182.0543975830078, 164.44281005859375, 158.4560546875, 152.0279083251953, 137.8629150390625, 135.1473846435547, 117.27381896972656, 101.5247573852539, 100.54000091552734, 94.55840301513672, 94.07215118408203, 92.82543182373047, 88.48568725585938, 85.05994415283203, 77.8740005493164, 76.19078063964844, 74.76761627197266, 76.91588592529297, 66.26870727539062, 65.83450317382812, 62.59058380126953, 61.630924224853516, 56.66929244995117, 56.645973205566406, 56.47174072265625, 56.24151611328125, 433.3631896972656, 57.639102935791016, 175.34927368164062, 811.6905517578125, 352.3057861328125, 460.812255859375, 1244.349853515625, 397.7268981933594, 319.0634765625, 364.1428527832031, 817.1531372070312, 179.1089630126953, 759.2709350585938, 353.8210754394531, 767.8507690429688, 704.0316772460938, 1031.0333251953125, 338.7200927734375, 853.117919921875, 1558.565673828125, 1291.274169921875, 922.3545532226562, 1345.4871826171875, 471.7730407714844, 490.044677734375, 677.4464111328125, 1059.08154296875, 853.1986083984375, 843.7091064453125, 1006.580078125, 803.4461669921875, 784.5733642578125, 584.6500854492188, 572.8038330078125, 507.68548583984375, 934.7852172851562, 496.4774169921875, 583.20458984375, 623.8618774414062, 588.018798828125, 614.8836059570312, 528.0966796875, 511.22735595703125, 511.70477294921875, 866.5625, 316.72491455078125, 249.29571533203125, 229.9024200439453, 228.7355194091797, 211.55052185058594, 183.0289764404297, 166.1912841796875, 164.7910919189453, 155.55848693847656, 157.89810180664062, 359.6870422363281, 133.46632385253906, 124.17170715332031, 122.31271362304688, 117.03710174560547, 111.25904083251953, 110.83535766601562, 109.16374969482422, 103.2101821899414, 98.91426849365234, 514.7677612304688, 89.62791442871094, 82.74832153320312, 81.71601104736328, 103.25068664550781, 75.25823974609375, 75.21469116210938, 70.78433990478516, 69.34544372558594, 281.78009033203125, 311.1195983886719, 971.2630004882812, 208.0179901123047, 697.1331787109375, 367.6048889160156, 1416.3004150390625, 441.63726806640625, 604.5337524414062, 578.8893432617188, 377.5198974609375, 192.00442504882812, 648.3333129882812, 1969.8912353515625, 938.5662841796875, 446.4165954589844, 632.349853515625, 658.6181030273438, 1989.853515625, 746.8209838867188, 677.7993774414062, 282.14984130859375, 467.3210144042969, 480.8096008300781, 1419.96630859375, 633.1287841796875, 1121.6055908203125, 955.2998046875, 821.8631591796875, 1269.9896240234375, 524.8942260742188, 1015.9119262695312, 611.8196411132812, 745.4178466796875, 688.518310546875, 667.1979370117188, 692.5172729492188, 593.0750732421875, 527.0308837890625, 546.2483520507812, 266.1346740722656, 171.08937072753906, 155.6071014404297, 226.88490295410156, 131.5532684326172, 110.63844299316406, 109.71115112304688, 476.2266540527344, 123.79460144042969, 96.52826690673828, 90.6929702758789, 86.91134643554688, 84.75259399414062, 84.67416381835938, 83.132080078125, 249.04006958007812, 73.44264221191406, 70.66631317138672, 70.3055419921875, 68.83519744873047, 66.711181640625, 65.8822250366211, 60.60839080810547, 60.293426513671875, 59.59612274169922, 59.43571472167969, 59.13909149169922, 58.31281661987305, 57.815277099609375, 57.416988372802734, 405.0425720214844, 341.4366455078125, 190.89840698242188, 246.23365783691406, 163.5123748779297, 257.450927734375, 138.4132537841797, 165.08370971679688, 521.0137939453125, 1046.2774658203125, 1400.850341796875, 228.16041564941406, 286.63897705078125, 343.24639892578125, 185.74090576171875, 229.64581298828125, 175.05548095703125, 332.4627990722656, 163.81402587890625, 539.6653442382812, 256.2196960449219, 439.739990234375, 517.5452270507812, 403.49468994140625, 229.62326049804688, 866.29833984375, 846.667236328125, 313.1244812011719, 322.8232727050781, 286.90380859375, 653.3579711914062, 749.8698120117188, 426.6073913574219, 380.0177307128906, 366.8009338378906, 372.0513000488281, 408.4660949707031, 415.6255187988281, 394.1338806152344, 394.38397216796875, 349.50030517578125, 362.36224365234375, 340.7713928222656, 296.1283264160156, 297.5120544433594, 494.6736145019531, 745.9381103515625, 324.6826171875, 301.4449157714844, 243.7447509765625, 158.0723114013672, 107.36814880371094, 95.01725769042969, 99.29867553710938, 90.99311828613281, 88.6338119506836, 79.3241195678711, 77.81040954589844, 76.27904510498047, 74.54589080810547, 68.68617248535156, 66.95494079589844, 65.45933532714844, 64.79324340820312, 62.89622497558594, 62.08100891113281, 61.05073547363281, 61.06211853027344, 58.696773529052734, 57.729122161865234, 57.52412796020508, 57.392601013183594, 53.51804733276367, 53.08519744873047, 81.03302001953125, 466.35260009765625, 629.77294921875, 272.4296569824219, 229.77696228027344, 524.4228515625, 169.0817413330078, 106.43704223632812, 468.2314453125, 321.1058044433594, 72.86363220214844, 215.64427185058594, 420.0905456542969, 254.936279296875, 238.94183349609375, 170.37852478027344, 161.82167053222656, 350.8217468261719, 510.25213623046875, 280.4100646972656, 479.9981384277344, 199.64524841308594, 294.40740966796875, 258.040771484375, 376.53106689453125, 509.9411315917969, 1114.2279052734375, 256.09857177734375, 426.6061096191406, 319.6000671386719, 739.0277099609375, 280.2876281738281, 489.2537536621094, 542.6870727539062, 517.612060546875, 617.3828125, 513.236083984375, 436.5743408203125, 490.99383544921875, 506.68548583984375, 460.2646179199219, 441.2579650878906, 394.2334899902344, 351.31146240234375, 347.7322082519531, 353.1181640625, 336.91925048828125, 275.0069580078125, 206.27684020996094, 205.90945434570312, 185.4871826171875, 142.34490966796875, 138.4669952392578, 125.22058868408203, 124.95114135742188, 113.3163070678711, 111.33777618408203, 109.3900375366211, 105.71350860595703, 106.33345794677734, 292.8968505859375, 101.52547454833984, 98.16709899902344, 98.09191131591797, 96.69923400878906, 95.24166107177734, 93.9153823852539, 90.94029998779297, 90.11663055419922, 204.05540466308594, 83.51455688476562, 83.17984008789062, 82.09905242919922, 80.06827545166016, 80.04055786132812, 78.980224609375, 77.4798812866211, 624.8594970703125, 218.5560302734375, 299.7873840332031, 218.3317108154297, 189.689208984375, 356.6500244140625, 202.47463989257812, 417.00213623046875, 238.63824462890625, 212.27218627929688, 149.84323120117188, 211.9496612548828, 303.9140319824219, 120.32109832763672, 237.6540069580078, 454.90960693359375, 334.02545166015625, 980.60107421875, 485.4506530761719, 911.4451293945312, 590.2950439453125, 261.2230529785156, 253.1405487060547, 366.6529846191406, 366.9601745605469, 261.4512939453125, 595.4712524414062, 534.0038452148438, 534.01806640625, 583.53955078125, 307.2271728515625, 439.3746337890625, 370.1558837890625, 337.7717590332031, 344.1768798828125, 325.05975341796875, 340.1703796386719, 337.7772521972656, 350.0632019042969, 294.64581298828125, 276.3277282714844, 278.6572570800781, 1160.9132080078125, 424.62060546875, 361.99005126953125, 388.82080078125, 255.19793701171875, 223.3960723876953, 186.81495666503906, 150.93563842773438, 148.38706970214844, 142.3661346435547, 778.7778930664062, 125.96311950683594, 122.38629150390625, 113.5186538696289, 111.00336456298828, 117.1114730834961, 97.79452514648438, 95.15584564208984, 154.03953552246094, 85.85616302490234, 85.81739044189453, 83.90367126464844, 83.07220458984375, 81.03001403808594, 86.70967102050781, 72.22313690185547, 70.94837188720703, 66.05683135986328, 65.33727264404297, 61.60311508178711, 632.0007934570312, 967.30859375, 392.4784851074219, 86.92008972167969, 116.71688079833984, 384.4781188964844, 955.042724609375, 325.5193786621094, 154.01246643066406, 168.04747009277344, 886.2265014648438, 877.4567260742188, 327.182373046875, 468.3438720703125, 329.43048095703125, 302.31689453125, 346.5965576171875, 350.2645568847656, 277.72235107421875, 424.45953369140625, 266.9029541015625, 332.0311279296875, 578.3032836914062, 328.37042236328125, 429.90313720703125, 517.5341796875, 400.9313049316406, 346.2950439453125, 433.3561706542969, 421.4360656738281, 338.9404296875, 347.58477783203125, 348.44537353515625, 336.6087646484375, 398.3597717285156, 299.83258056640625, 164.6500701904297, 151.26080322265625, 134.79344177246094, 134.80828857421875, 128.793701171875, 120.1890640258789, 119.80301666259766, 103.68548583984375, 93.05211639404297, 105.72232055664062, 91.11929321289062, 88.88138580322266, 86.48152923583984, 83.19112396240234, 82.55461120605469, 76.6363754272461, 73.92579650878906, 137.45323181152344, 73.58349609375, 73.43082427978516, 297.8049011230469, 71.5206298828125, 71.5206298828125, 71.3747329711914, 68.60582733154297, 70.64566802978516, 67.04659271240234, 64.61957550048828, 137.57745361328125, 329.9684753417969, 498.6695861816406, 418.2132568359375, 321.6349182128906, 192.26394653320312, 436.7302551269531, 120.439208984375, 101.71742248535156, 189.6542205810547, 107.88106536865234, 180.2874298095703, 406.497802734375, 219.2530975341797, 311.04937744140625, 276.8253479003906, 364.5852966308594, 122.61643981933594, 431.5494079589844, 148.8873748779297, 478.0677490234375, 448.4655456542969, 560.1489868164062, 235.38340759277344, 220.0799560546875, 236.9700927734375, 525.8984985351562, 310.49981689453125, 195.21343994140625, 465.0462341308594, 342.694091796875, 343.89752197265625, 252.4918212890625, 252.31494140625, 359.3658447265625, 365.0567932128906, 297.0661926269531, 278.8648681640625, 264.2499084472656, 271.7898864746094, 266.98651123046875, 258.7191467285156, 836.8704223632812, 741.7591552734375, 348.10552978515625, 262.6591491699219, 234.72032165527344, 225.7039337158203, 214.6396026611328, 197.21083068847656, 176.1952667236328, 163.72848510742188, 159.68936157226562, 156.55722045898438, 155.55181884765625, 147.1693572998047, 143.7874298095703, 151.92002868652344, 140.55010986328125, 133.0448760986328, 131.79173278808594, 122.37577819824219, 118.65946197509766, 115.63384246826172, 112.4041748046875, 112.22483825683594, 111.79792022705078, 119.11126708984375, 102.07164001464844, 93.44534301757812, 92.23983764648438, 89.7243881225586, 218.44508361816406, 151.80226135253906, 955.4397583007812, 178.94818115234375, 1384.116455078125, 160.98158264160156, 191.5667724609375, 221.75938415527344, 157.25833129882812, 1290.715576171875, 920.77001953125, 312.8064880371094, 623.1017456054688, 397.7396240234375, 455.4387512207031, 379.9434814453125, 351.7613220214844, 356.9765625, 374.8453063964844, 212.81954956054688, 346.64404296875, 312.8064270019531, 333.1448669433594, 336.0579528808594, 600.3089599609375, 295.4515380859375, 283.6612548828125, 250.14752197265625, 267.23590087890625, 330.6805114746094, 358.020263671875, 262.1649475097656, 242.10182189941406], \"Term\": [\"window\", \"game\", \"christian\", \"team\", \"drive\", \"file\", \"space\", \"encrypt\", \"govern\", \"chip\", \"jesus\", \"israel\", \"card\", \"play\", \"secur\", \"nasa\", \"armenian\", \"program\", \"isra\", \"imag\", \"peopl\", \"hockey\", \"player\", \"clipper\", \"public\", \"disk\", \"year\", \"scsi\", \"driver\", \"bike\", \"armenian\", \"turkish\", \"turk\", \"turkey\", \"armenia\", \"koresh\", \"nazi\", \"militia\", \"serdar\", \"argic\", \"genocid\", \"davidian\", \"troop\", \"murder\", \"mormon\", \"prison\", \"massacr\", \"azeri\", \"ethnic\", \"azerbaijani\", \"hitler\", \"iran\", \"zuma\", \"sdpa\", \"motto\", \"azerbaijan\", \"extermin\", \"sera\", \"urartu\", \"slaughter\", \"villag\", \"batf\", \"greek\", \"greec\", \"jew\", \"soldier\", \"kill\", \"waco\", \"arm\", \"countri\", \"muslim\", \"children\", \"armi\", \"popul\", \"peopl\", \"anti\", \"govern\", \"right\", \"attack\", \"say\", \"polit\", \"death\", \"state\", \"live\", \"go\", \"come\", \"tell\", \"happen\", \"forc\", \"world\", \"time\", \"nation\", \"want\", \"leav\", \"start\", \"year\", \"take\", \"jesus\", \"bibl\", \"atheist\", \"atheism\", \"christ\", \"scriptur\", \"cathol\", \"sandvik\", \"doctrin\", \"revel\", \"biblic\", \"satan\", \"atho\", \"livesey\", \"prophet\", \"divin\", \"vers\", \"gospel\", \"sabbath\", \"god\", \"sin\", \"resurrect\", \"solntz\", \"testament\", \"theolog\", \"propheci\", \"theist\", \"schneider\", \"jaeger\", \"marriag\", \"christian\", \"church\", \"belief\", \"faith\", \"worship\", \"contradict\", \"moral\", \"religion\", \"lord\", \"heaven\", \"holi\", \"rutger\", \"truth\", \"spirit\", \"teach\", \"islam\", \"believ\", \"etern\", \"argument\", \"exist\", \"religi\", \"evid\", \"word\", \"love\", \"life\", \"claim\", \"mean\", \"peopl\", \"true\", \"accept\", \"say\", \"question\", \"reason\", \"thing\", \"person\", \"come\", \"good\", \"read\", \"time\", \"point\", \"follow\", \"motif\", \"widget\", \"xterm\", \"visual\", \"xlib\", \"polygon\", \"baalk\", \"contrib\", \"toolkit\", \"kelvin\", \"pyron\", \"suno\", \"deskjet\", \"xpert\", \"plaintext\", \"skndiv\", \"openwindow\", \"xview\", \"ether\", \"quicktim\", \"magellan\", \"utah\", \"greenbelt\", \"reilli\", \"ualberta\", \"copper\", \"ciphertext\", \"autom\", \"gradi\", \"dillon\", \"font\", \"handbook\", \"binari\", \"server\", \"client\", \"librari\", \"imag\", \"anonym\", \"compil\", \"resourc\", \"graphic\", \"map\", \"applic\", \"archiv\", \"user\", \"code\", \"avail\", \"directori\", \"sourc\", \"file\", \"mail\", \"list\", \"program\", \"function\", \"format\", \"email\", \"inform\", \"version\", \"softwar\", \"includ\", \"send\", \"data\", \"internet\", \"address\", \"display\", \"window\", \"copi\", \"access\", \"distribut\", \"thank\", \"look\", \"book\", \"group\", \"need\", \"scsi\", \"simm\", \"motherboard\", \"cach\", \"bio\", \"quadra\", \"diamond\", \"vram\", \"vesa\", \"centri\", \"swap\", \"upgrad\", \"char\", \"eisa\", \"intercon\", \"nubus\", \"ethernet\", \"svga\", \"amanda\", \"meg\", \"cadr\", \"mous\", \"maxtor\", \"config\", \"cica\", \"tiff\", \"adaptec\", \"powerbook\", \"ctrl\", \"esdi\", \"jumper\", \"floppi\", \"disk\", \"umich\", \"video\", \"modem\", \"card\", \"output\", \"monitor\", \"mode\", \"printer\", \"spec\", \"entri\", \"drive\", \"driver\", \"port\", \"instal\", \"memori\", \"window\", \"color\", \"appl\", \"byte\", \"screen\", \"board\", \"problem\", \"machin\", \"file\", \"thank\", \"control\", \"work\", \"speed\", \"need\", \"hard\", \"help\", \"program\", \"want\", \"time\", \"repli\", \"softwar\", \"distribut\", \"alaska\", \"spencer\", \"oracl\", \"dseg\", \"aurora\", \"nsmca\", \"engr\", \"launch\", \"uoknor\", \"callison\", \"kaldi\", \"zoolog\", \"mccall\", \"ucsc\", \"hallam\", \"lunar\", \"automot\", \"raider\", \"theodor\", \"dock\", \"shafer\", \"mksol\", \"hydro\", \"ssto\", \"plymouth\", \"redesign\", \"laughter\", \"rockwel\", \"desi\", \"stimulus\", \"moon\", \"henri\", \"mar\", \"job\", \"wheel\", \"billion\", \"invest\", \"spacecraft\", \"orbit\", \"nasa\", \"space\", \"shuttl\", \"satellit\", \"fund\", \"probe\", \"flight\", \"helmet\", \"station\", \"solar\", \"presid\", \"mission\", \"earth\", \"cost\", \"money\", \"vehicl\", \"year\", \"work\", \"project\", \"toronto\", \"spend\", \"go\", \"time\", \"engin\", \"long\", \"high\", \"power\", \"thing\", \"say\", \"look\", \"peopl\", \"program\", \"want\", \"need\", \"design\", \"build\", \"firearm\", \"bike\", \"motorcycl\", \"magnus\", \"rider\", \"honda\", \"veal\", \"utkvm\", \"centerlin\", \"cactus\", \"rkba\", \"harley\", \"shotgun\", \"pistol\", \"ranck\", \"boyl\", \"husc\", \"ifa\", \"smuggl\", \"fischer\", \"counterst\", \"armori\", \"trunk\", \"thomasp\", \"imak\", \"photographi\", \"concordia\", \"tennesse\", \"yamaha\", \"frost\", \"car\", \"ohio\", \"uchicago\", \"rid\", \"gun\", \"brake\", \"shaft\", \"cwru\", \"auto\", \"wagon\", \"handgun\", \"cleveland\", \"ride\", \"tire\", \"urbana\", \"midway\", \"insur\", \"uiuc\", \"dealer\", \"weapon\", \"iastat\", \"owner\", \"illinoi\", \"crime\", \"price\", \"state\", \"freenet\", \"sell\", \"buy\", \"good\", \"road\", \"drive\", \"right\", \"look\", \"peopl\", \"want\", \"case\", \"thing\", \"time\", \"go\", \"distribut\", \"repli\", \"engin\", \"opinion\", \"problem\", \"need\", \"gatech\", \"cub\", \"fnal\", \"prism\", \"hitter\", \"pitcher\", \"alomar\", \"uicvm\", \"higgin\", \"inning\", \"revolv\", \"hulman\", \"yanke\", \"pitch\", \"catcher\", \"dodger\", \"blast\", \"starter\", \"tiger\", \"met\", \"bat\", \"nore\", \"outlet\", \"rocki\", \"jay\", \"sdsu\", \"volt\", \"lopez\", \"restaur\", \"lamp\", \"wire\", \"duke\", \"circuit\", \"batteri\", \"brave\", \"basebal\", \"hit\", \"berkeley\", \"jason\", \"ball\", \"metal\", \"jeff\", \"grind\", \"larc\", \"indiana\", \"netcom\", \"colorado\", \"year\", \"run\", \"good\", \"game\", \"smith\", \"scott\", \"player\", \"home\", \"stanford\", \"look\", \"distribut\", \"go\", \"time\", \"lose\", \"come\", \"start\", \"play\", \"david\", \"best\", \"better\", \"power\", \"thing\", \"john\", \"sale\", \"great\", \"encrypt\", \"escrow\", \"privaci\", \"ripem\", \"crypto\", \"wiretap\", \"cryptographi\", \"cipher\", \"decrypt\", \"hamburg\", \"clipper\", \"homicid\", \"bontchev\", \"gtoal\", \"crypt\", \"clarkson\", \"rwing\", \"surveil\", \"nist\", \"sternlight\", \"den\", \"ncsl\", \"qualcomm\", \"fbihh\", \"cryptograph\", \"tampa\", \"mime\", \"vesselin\", \"lyme\", \"strnlght\", \"key\", \"secur\", \"enforc\", \"recipi\", \"classifi\", \"secret\", \"chip\", \"agenc\", \"patent\", \"scheme\", \"public\", \"govern\", \"algorithm\", \"protect\", \"propos\", \"administr\", \"privat\", \"clinton\", \"feder\", \"phone\", \"court\", \"devic\", \"number\", \"communic\", \"technolog\", \"inform\", \"provid\", \"author\", \"state\", \"right\", \"messag\", \"data\", \"peopl\", \"need\", \"diseas\", \"stratus\", \"dyer\", \"diet\", \"robi\", \"infect\", \"syndrom\", \"methodolog\", \"physician\", \"cure\", \"intellect\", \"einstein\", \"chopin\", \"candida\", \"sphere\", \"yeast\", \"chastiti\", \"halat\", \"therapi\", \"clinic\", \"migrain\", \"steveh\", \"patient\", \"catbyt\", \"dtmedin\", \"blah\", \"carlo\", \"superstit\", \"baerga\", \"homeopathi\", \"skeptic\", \"gordon\", \"pitt\", \"medic\", \"doctor\", \"medicin\", \"food\", \"cancer\", \"sleev\", \"ingr\", \"genet\", \"aid\", \"bank\", \"treatment\", \"water\", \"pain\", \"health\", \"handheld\", \"studi\", \"princeton\", \"caus\", \"effect\", \"scienc\", \"scientif\", \"rochest\", \"theori\", \"point\", \"result\", \"risk\", \"problem\", \"research\", \"case\", \"steve\", \"test\", \"time\", \"peopl\", \"repli\", \"take\", \"differ\", \"year\", \"say\", \"thing\", \"isra\", \"hockey\", \"playoff\", \"palestinian\", \"detroit\", \"leaf\", \"cramer\", \"optilink\", \"pen\", \"cunixb\", \"lebanes\", \"penguin\", \"clayton\", \"jake\", \"maynard\", \"espn\", \"edmonton\", \"ericsson\", \"boni\", \"lemieux\", \"gaza\", \"puck\", \"bruin\", \"selann\", \"laurentian\", \"quebec\", \"ramsey\", \"canuck\", \"shark\", \"uvic\", \"montreal\", \"flyer\", \"israel\", \"stanley\", \"team\", \"jet\", \"coach\", \"ranger\", \"winnipeg\", \"game\", \"play\", \"wing\", \"player\", \"columbia\", \"season\", \"leagu\", \"pittsburgh\", \"score\", \"arab\", \"mcgill\", \"goal\", \"virginia\", \"toronto\", \"andrew\", \"year\", \"divis\", \"canada\", \"period\", \"final\", \"point\", \"time\", \"american\", \"go\"], \"Total\": [2966.0, 1940.0, 1924.0, 1689.0, 2638.0, 2883.0, 1860.0, 1161.0, 1997.0, 1477.0, 1274.0, 1017.0, 1577.0, 1423.0, 1059.0, 1331.0, 1142.0, 2599.0, 837.0, 1391.0, 6052.0, 742.0, 990.0, 784.0, 1802.0, 1023.0, 4004.0, 867.0, 1191.0, 747.0, 1142.9583740234375, 698.9558715820312, 407.7272644042969, 376.1419677734375, 366.1116027832031, 325.846923828125, 318.256103515625, 294.6385803222656, 243.81558227539062, 243.53146362304688, 239.4801788330078, 223.58860778808594, 220.15757751464844, 499.85150146484375, 183.81178283691406, 190.03121948242188, 181.68017578125, 168.52059936523438, 170.9886474609375, 163.3725128173828, 156.9473876953125, 153.92347717285156, 148.33285522460938, 145.86817932128906, 144.91348266601562, 143.45306396484375, 140.92027282714844, 138.17529296875, 112.54084014892578, 112.26637268066406, 299.7375183105469, 239.29400634765625, 575.2765502929688, 235.9622802734375, 846.9027709960938, 310.8525390625, 1292.4876708984375, 203.65432739257812, 568.353271484375, 904.962890625, 498.3378601074219, 821.7328491210938, 317.7273254394531, 442.4293212890625, 6052.71826171875, 470.1575927734375, 1997.7261962890625, 3614.68310546875, 771.352294921875, 4395.67724609375, 753.4012451171875, 729.086181640625, 3490.054931640625, 1666.260986328125, 3510.730712890625, 3362.533203125, 2458.84814453125, 1374.8798828125, 910.499755859375, 2752.30859375, 5183.146484375, 1404.34228515625, 3617.8427734375, 1561.9661865234375, 1909.119873046875, 4004.7578125, 1884.1258544921875, 1274.8072509765625, 844.0818481445312, 688.539794921875, 379.0483093261719, 601.0935668945312, 285.09393310546875, 265.8420715332031, 258.6253356933594, 234.29208374023438, 199.46600341796875, 197.48406982421875, 187.33848571777344, 186.6898651123047, 191.4882049560547, 161.5964813232422, 158.12852478027344, 148.4269561767578, 144.8557891845703, 142.2056884765625, 133.86817932128906, 133.62254333496094, 137.21395874023438, 135.0694580078125, 123.30796813964844, 118.57750701904297, 111.64559173583984, 104.27090454101562, 104.75077056884766, 103.53997039794922, 192.9781494140625, 1924.27099609375, 744.6122436523438, 604.4033203125, 642.59033203125, 209.4973907470703, 250.70823669433594, 845.6991577148438, 828.4187622070312, 355.5498962402344, 287.80279541015625, 282.96514892578125, 442.15399169921875, 692.941650390625, 269.9664001464844, 446.063232421875, 578.8197021484375, 2561.731689453125, 282.8346862792969, 815.131103515625, 1699.9537353515625, 474.3492126464844, 965.217041015625, 1333.0904541015625, 902.1407470703125, 1251.4853515625, 1317.3157958984375, 2641.86328125, 6052.71826171875, 1353.2069091796875, 1006.9673461914062, 4395.67724609375, 2872.182373046875, 1977.921142578125, 3329.212646484375, 2056.0078125, 3362.533203125, 3754.421630859375, 2277.20947265625, 5183.146484375, 2646.791748046875, 1892.4102783203125, 514.4351806640625, 479.50714111328125, 262.1397399902344, 305.83587646484375, 182.9683837890625, 165.35598754882812, 159.36215209960938, 152.93394470214844, 138.76898193359375, 136.0535125732422, 118.18011474609375, 102.43084716796875, 101.44613647460938, 95.46444702148438, 94.97850036621094, 93.73173522949219, 89.39283752441406, 85.96602630615234, 78.7806625366211, 77.0969467163086, 75.67371368408203, 77.94976806640625, 67.175048828125, 66.74057006835938, 63.496917724609375, 62.537330627441406, 57.57563018798828, 57.55217742919922, 57.37797546386719, 57.14778137207031, 448.4683532714844, 58.572509765625, 180.8592987060547, 872.3430786132812, 374.06121826171875, 495.9429626464844, 1391.43896484375, 440.9508361816406, 358.4921875, 426.1166076660156, 1054.60791015625, 199.59127807617188, 1032.4814453125, 440.00604248046875, 1078.350341796875, 1021.1267700195312, 1669.3359375, 441.453857421875, 1374.5584716796875, 2883.885009765625, 2375.208984375, 1560.8458251953125, 2599.861083984375, 691.8548583984375, 736.162841796875, 1159.2723388671875, 2169.24072265625, 1621.163818359375, 1630.7625732421875, 2103.295166015625, 1606.180419921875, 1650.9979248046875, 1085.847412109375, 1067.4688720703125, 839.1293334960938, 2966.575439453125, 872.5662231445312, 1443.37353515625, 3038.84619140625, 2288.467041015625, 3375.03759765625, 1421.1026611328125, 1956.768310546875, 3517.123046875, 867.474609375, 317.6370849609375, 250.2078857421875, 230.81463623046875, 229.64767456054688, 212.46270751953125, 183.9412384033203, 167.1034393310547, 165.70335388183594, 156.47067260742188, 158.83648681640625, 362.0737609863281, 134.3785400390625, 125.08387756347656, 123.22496032714844, 117.94927215576172, 112.17121124267578, 111.74752807617188, 110.07601928710938, 104.12238311767578, 99.82821655273438, 519.7879028320312, 90.54007720947266, 83.6605224609375, 82.62821197509766, 104.4683609008789, 76.17040252685547, 76.12688446044922, 71.69654846191406, 70.25760650634766, 287.13433837890625, 317.7306213378906, 1023.171630859375, 213.97854614257812, 736.9544067382812, 385.19146728515625, 1577.8919677734375, 487.7062683105469, 681.5418701171875, 651.6162719726562, 414.86236572265625, 202.35662841796875, 773.6254272460938, 2638.13232421875, 1191.0015869140625, 521.5247192382812, 771.9718017578125, 825.6636962890625, 2966.575439453125, 979.6791381835938, 877.6451416015625, 316.51470947265625, 603.8773803710938, 656.5188598632812, 3254.474609375, 1051.1627197265625, 2883.885009765625, 2288.467041015625, 1818.994384765625, 3998.2919921875, 901.1752319335938, 3517.123046875, 1391.7735595703125, 2348.58544921875, 2599.861083984375, 3617.8427734375, 5183.146484375, 2732.19384765625, 1630.7625732421875, 3038.84619140625, 267.0453796386719, 172.00009155273438, 156.51791381835938, 228.30894470214844, 132.46392822265625, 111.54907989501953, 110.62195587158203, 480.2484436035156, 124.94286346435547, 97.43895721435547, 91.60369873046875, 87.82199096679688, 85.66326904296875, 85.5849838256836, 84.04283142089844, 251.9351348876953, 74.35344696044922, 71.57764434814453, 71.21640014648438, 69.74593353271484, 67.621826171875, 66.79296875, 61.51911544799805, 61.20405960083008, 60.507171630859375, 60.3464469909668, 60.049827575683594, 59.223548889160156, 58.72600173950195, 58.32766342163086, 415.9969177246094, 351.1897888183594, 197.73948669433594, 259.179931640625, 170.87942504882812, 275.1635437011719, 144.31858825683594, 174.99098205566406, 592.9318237304688, 1331.52294921875, 1860.757080078125, 257.59454345703125, 337.9649353027344, 441.3335266113281, 216.22386169433594, 284.1152038574219, 205.7539520263672, 455.2716064453125, 191.22592163085938, 874.0577392578125, 344.72601318359375, 726.9236450195312, 1014.5396728515625, 862.5274658203125, 336.988525390625, 4004.7578125, 3998.2919921875, 641.9602661132812, 701.0911865234375, 556.97900390625, 3510.730712890625, 5183.146484375, 1432.9891357421875, 1579.425048828125, 1517.998779296875, 1785.55322265625, 3329.212646484375, 4395.67724609375, 3375.03759765625, 6052.71826171875, 2599.861083984375, 3617.8427734375, 3517.123046875, 1000.6277465820312, 1483.8935546875, 495.75604248046875, 747.6323852539062, 325.6590576171875, 302.3562316894531, 244.9889373779297, 158.984375, 108.27942657470703, 95.92851257324219, 100.2811050415039, 91.90436553955078, 89.54524993896484, 80.2354736328125, 78.72178649902344, 77.19053649902344, 75.45713806152344, 69.597412109375, 67.86634826660156, 66.37062072753906, 65.70732879638672, 63.8077507019043, 62.99225997924805, 61.962032318115234, 61.97679901123047, 59.60800552368164, 58.64104080200195, 58.435726165771484, 58.304039001464844, 54.42936325073242, 53.9964599609375, 82.42547607421875, 485.2928161621094, 668.453857421875, 284.9857482910156, 240.66868591308594, 577.3370971679688, 179.90098571777344, 111.21246337890625, 528.9305419921875, 357.5130920410156, 74.67018127441406, 242.34796142578125, 502.91082763671875, 297.4255065917969, 281.2111511230469, 192.33499145507812, 183.03675842285156, 466.62225341796875, 750.7398681640625, 366.5124206542969, 724.8843994140625, 250.30677795410156, 415.81964111328125, 353.0357971191406, 657.6669921875, 1070.5751953125, 3490.054931640625, 395.5933837890625, 983.7587890625, 606.9414672851562, 3754.421630859375, 598.3028564453125, 2638.13232421875, 3614.68310546875, 3375.03759765625, 6052.71826171875, 3617.8427734375, 2113.20703125, 3329.212646484375, 5183.146484375, 3510.730712890625, 3038.84619140625, 2732.19384765625, 1432.9891357421875, 1407.867431640625, 3254.474609375, 3517.123046875, 275.9194030761719, 207.18922424316406, 206.8258819580078, 186.39959716796875, 143.2572784423828, 139.37933349609375, 126.13304901123047, 125.86357116699219, 114.22874450683594, 112.2500991821289, 110.30248260498047, 106.6259765625, 107.28164672851562, 295.5258483886719, 102.43778991699219, 99.07945251464844, 99.00546264648438, 97.61188507080078, 96.15435791015625, 94.82772827148438, 91.85266876220703, 91.02910614013672, 206.18264770507812, 84.4303970336914, 84.09229278564453, 83.01145935058594, 80.98065185546875, 80.95291900634766, 79.89276885986328, 78.3923110961914, 639.2734985351562, 227.38116455078125, 323.03533935546875, 231.72528076171875, 201.03939819335938, 428.90643310546875, 227.24929809570312, 525.6275634765625, 277.0840148925781, 257.5661926269531, 175.59457397460938, 284.0149841308594, 476.76812744140625, 133.43386840820312, 365.1957092285156, 1031.8046875, 640.5604858398438, 4004.7578125, 1280.048828125, 3754.421630859375, 1940.664794921875, 488.3008117675781, 472.29498291015625, 990.5671997070312, 1023.2589111328125, 516.36962890625, 3375.03759765625, 3038.84619140625, 3510.730712890625, 5183.146484375, 818.5213623046875, 3362.533203125, 1909.119873046875, 1423.9302978515625, 1658.5966796875, 1346.392578125, 1717.5321044921875, 1785.55322265625, 3329.212646484375, 1491.183349609375, 990.2796630859375, 1542.3779296875, 1161.82763671875, 425.534912109375, 362.9170837402344, 390.07720947265625, 256.1122741699219, 224.3104248046875, 187.7305145263672, 151.85064697265625, 149.30140686035156, 143.2805633544922, 784.3641357421875, 126.87757873535156, 123.3006362915039, 114.4344482421875, 111.93732452392578, 118.14889526367188, 98.71028137207031, 96.07027435302734, 155.55857849121094, 86.7708511352539, 86.73173522949219, 84.81802368164062, 83.986572265625, 81.9443588256836, 87.70350646972656, 73.1382064819336, 71.86477661132812, 66.9711685180664, 66.25181579589844, 62.517635345458984, 659.2316284179688, 1059.598876953125, 429.4156188964844, 89.67327117919922, 124.43817138671875, 474.16644287109375, 1477.454345703125, 430.59686279296875, 178.9176788330078, 204.3567657470703, 1802.1553955078125, 1997.7261962890625, 534.6806030273438, 906.1632690429688, 556.0820922851562, 491.48968505859375, 613.686279296875, 662.98681640625, 470.2344665527344, 1022.1227416992188, 480.7737121582031, 730.9078369140625, 2365.543212890625, 763.0506591796875, 1372.5093994140625, 2169.24072265625, 1377.2835693359375, 1170.3818359375, 3490.054931640625, 3614.68310546875, 1280.4110107421875, 1650.9979248046875, 6052.71826171875, 3517.123046875, 399.2857971191406, 300.7450866699219, 165.56256103515625, 152.17401123046875, 135.70590209960938, 135.72186279296875, 129.70895385742188, 121.10151672363281, 120.7160415649414, 104.59820556640625, 93.9645767211914, 106.77874755859375, 92.03182983398438, 89.7938003540039, 87.39402770996094, 84.10354614257812, 83.46707916259766, 77.56388092041016, 74.8382339477539, 139.152099609375, 74.49637603759766, 74.3432388305664, 301.5867919921875, 72.43302154541016, 72.43302154541016, 72.28717041015625, 69.51831817626953, 71.5958480834961, 67.95915222167969, 65.53195190429688, 140.31385803222656, 354.61895751953125, 560.2183227539062, 467.14312744140625, 372.5074157714844, 214.2539520263672, 528.296142578125, 128.81614685058594, 106.81172180175781, 215.3028564453125, 114.34998321533203, 206.83787536621094, 542.55908203125, 263.95330810546875, 416.1339111328125, 361.6107177734375, 544.802734375, 136.71836853027344, 864.6985473632812, 185.2837677001953, 1192.0758056640625, 1098.331298828125, 1600.234375, 408.9527587890625, 366.5252685546875, 446.0223693847656, 2646.791748046875, 941.7721557617188, 342.3376159667969, 3254.474609375, 1469.76904296875, 2113.20703125, 866.40185546875, 975.51806640625, 5183.146484375, 6052.71826171875, 2732.19384765625, 1884.1258544921875, 2258.273681640625, 4004.7578125, 4395.67724609375, 3329.212646484375, 837.78271484375, 742.67138671875, 349.01776123046875, 263.5714416503906, 235.63259887695312, 226.6161651611328, 215.55186462402344, 198.12313842773438, 177.10752868652344, 164.64073181152344, 160.60159301757812, 157.46951293945312, 156.48275756835938, 148.0817413330078, 144.69972229003906, 152.8905792236328, 141.4651641845703, 133.9572296142578, 132.7042694091797, 123.28799438476562, 119.57171630859375, 116.54607391357422, 113.31639099121094, 113.13705444335938, 112.71014404296875, 120.09423065185547, 102.98385620117188, 94.35774230957031, 93.15208435058594, 90.63665008544922, 220.87405395507812, 153.73667907714844, 1017.056396484375, 185.59458923339844, 1689.568603515625, 167.19650268554688, 202.23321533203125, 240.0529327392578, 165.1607208251953, 1940.664794921875, 1423.9302978515625, 399.8851318359375, 990.5671997070312, 559.28369140625, 670.1260375976562, 536.8279418945312, 505.7823181152344, 528.27392578125, 572.500732421875, 254.3348388671875, 553.6993408203125, 544.2898559570312, 701.0911865234375, 868.338134765625, 4004.7578125, 693.4171142578125, 732.4398193359375, 584.5032348632812, 822.2951049804688, 2646.791748046875, 5183.146484375, 1242.2733154296875, 3510.730712890625], \"loglift\": [30.0, 29.0, 28.0, 27.0, 26.0, 25.0, 24.0, 23.0, 22.0, 21.0, 20.0, 19.0, 18.0, 17.0, 16.0, 15.0, 14.0, 13.0, 12.0, 11.0, 10.0, 9.0, 8.0, 7.0, 6.0, 5.0, 4.0, 3.0, 2.0, 1.0, 2.0255000591278076, 2.0250000953674316, 2.0241000652313232, 2.023900032043457, 2.0237998962402344, 2.0234999656677246, 2.023400068283081, 2.023200035095215, 2.022599935531616, 2.022599935531616, 2.0225000381469727, 2.022200107574463, 2.0220999717712402, 2.0216000080108643, 2.0213000774383545, 2.0213000774383545, 2.0213000774383545, 2.020900011062622, 2.020900011062622, 2.020699977874756, 2.0204999446868896, 2.02020001411438, 2.02020001411438, 2.0201001167297363, 2.0199999809265137, 2.0199999809265137, 2.0197999477386475, 2.019700050354004, 2.018199920654297, 2.018199920654297, 2.0153000354766846, 2.007200002670288, 1.9528000354766846, 1.9890999794006348, 1.8824000358581543, 1.958899974822998, 1.7970999479293823, 1.980299949645996, 1.819599986076355, 1.6779999732971191, 1.763100028038025, 1.6375999450683594, 1.8667999505996704, 1.781499981880188, 1.0757999420166016, 1.7408000230789185, 1.2894999980926514, 1.0536999702453613, 1.5706000328063965, 0.953000009059906, 1.4706000089645386, 1.4835000038146973, 0.7210999727249146, 1.080899953842163, 0.6299999952316284, 0.6431000232696533, 0.739799976348877, 1.0844999551773071, 1.3265000581741333, 0.5475999712944031, 0.0575999990105629, 0.9682999849319458, 0.27399998903274536, 0.847000002861023, 0.6578999757766724, -0.014100000262260437, 0.5697000026702881, 2.0452001094818115, 2.044800043106079, 2.044600009918213, 2.0434999465942383, 2.0434000492095947, 2.0427000522613525, 2.0425000190734863, 2.0423998832702637, 2.0420000553131104, 2.041300058364868, 2.0411999225616455, 2.0409998893737793, 2.0409998893737793, 2.040600061416626, 2.0401999950408936, 2.04010009765625, 2.0397000312805176, 2.039599895477295, 2.0394999980926514, 2.039099931716919, 2.039099931716919, 2.0390000343322754, 2.038599967956543, 2.0385000705718994, 2.0381999015808105, 2.0376999378204346, 2.037100076675415, 2.036900043487549, 2.036900043487549, 2.0364999771118164, 2.031899929046631, 2.0318000316619873, 2.0308001041412354, 2.023099899291992, 2.032900094985962, 2.0308001041412354, 1.9905999898910522, 1.9452999830245972, 1.989799976348877, 1.9884999990463257, 1.9830000400543213, 1.9407999515533447, 1.858199954032898, 1.9696999788284302, 1.882599949836731, 1.8200000524520874, 1.5154999494552612, 1.9495999813079834, 1.700600028038025, 1.5044000148773193, 1.7956000566482544, 1.5720000267028809, 1.4508999586105347, 1.5461000204086304, 1.4234000444412231, 1.3523000478744507, 1.0579999685287476, 0.6973999738693237, 1.2980999946594238, 1.399399995803833, 0.6687999963760376, 0.859000027179718, 1.0434000492095947, 0.6948999762535095, 0.9133999943733215, 0.5392000079154968, 0.31630000472068787, 0.7174999713897705, 0.003100000089034438, 0.583899974822998, 0.8629000186920166, 2.0806000232696533, 2.0804998874664307, 2.078900098800659, 2.0778000354766846, 2.077399969100952, 2.076900005340576, 2.07669997215271, 2.0764999389648438, 2.075900077819824, 2.075700044631958, 2.074700117111206, 2.073499917984009, 2.0734000205993652, 2.0729000568389893, 2.0727999210357666, 2.072700023651123, 2.072200059890747, 2.0717999935150146, 2.0708000659942627, 2.0706000328063965, 2.0703999996185303, 2.0690999031066895, 2.0687999725341797, 2.068700075149536, 2.068000078201294, 2.0678000450134277, 2.066499948501587, 2.066499948501587, 2.066499948501587, 2.0664000511169434, 2.048099994659424, 2.0662999153137207, 2.051500082015991, 2.0102999210357666, 2.0225000381469727, 2.0088999271392822, 1.9707000255584717, 1.979200005531311, 1.96589994430542, 1.9251999855041504, 1.827299952507019, 1.9740999937057495, 1.774999976158142, 1.864400029182434, 1.742799997329712, 1.7106000185012817, 1.6004999876022339, 1.8174999952316284, 1.6053999662399292, 1.4670000076293945, 1.4729000329971313, 1.556399941444397, 1.423699975013733, 1.6994999647140503, 1.6755000352859497, 1.545199990272522, 1.365399956703186, 1.440500020980835, 1.4234000444412231, 1.3454999923706055, 1.3897000551223755, 1.3384000062942505, 1.4632999897003174, 1.4599000215530396, 1.5799000263214111, 0.9276000261306763, 1.5184999704360962, 1.176200032234192, 0.499099999666214, 0.7235000133514404, 0.3797000050544739, 1.0924999713897705, 0.7401999831199646, 0.15479999780654907, 2.1196000576019287, 2.1177000999450684, 2.117000102996826, 2.1166999340057373, 2.1166000366210938, 2.116300106048584, 2.115600109100342, 2.1150999069213867, 2.1150999069213867, 2.114799976348877, 2.1147000789642334, 2.114000082015991, 2.113800048828125, 2.113300085067749, 2.1131999492645264, 2.1129000186920166, 2.112499952316284, 2.1124000549316406, 2.112299919128418, 2.111799955368042, 2.1113998889923096, 2.1108999252319336, 2.1105000972747803, 2.1096999645233154, 2.109499931335449, 2.1089000701904297, 2.108599901199341, 2.108599901199341, 2.107800006866455, 2.1075000762939453, 2.101799964904785, 2.099600076675415, 2.0685999393463135, 2.092400074005127, 2.0650999546051025, 2.073899984359741, 2.0125999450683594, 2.021399974822998, 2.000699996948242, 2.0023000240325928, 2.0262999534606934, 2.0680999755859375, 1.9438999891281128, 1.8285000324249268, 1.8824000358581543, 1.9651000499725342, 1.9211000204086304, 1.8946000337600708, 1.7213000059127808, 1.8492000102996826, 1.8622000217437744, 2.00570011138916, 1.864300012588501, 1.8091000318527222, 1.291200041770935, 1.6136000156402588, 1.176200032234192, 1.246999979019165, 1.326200008392334, 0.973800003528595, 1.5801000595092773, 0.8787999749183655, 1.298699975013733, 0.9729999899864197, 0.7918999791145325, 0.4300999939441681, 0.10779999941587448, 0.5931000113487244, 0.991100013256073, 0.40450000762939453, 2.3443000316619873, 2.342400074005127, 2.3417999744415283, 2.341399908065796, 2.3408000469207764, 2.3394999504089355, 2.339400053024292, 2.3392999172210693, 2.338399887084961, 2.3382999897003174, 2.3376998901367188, 2.3373000621795654, 2.3369998931884766, 2.3369998931884766, 2.3368000984191895, 2.3361001014709473, 2.335400104522705, 2.33489990234375, 2.3348000049591064, 2.3345000743865967, 2.3341000080108643, 2.333899974822998, 2.3327999114990234, 2.33270001411438, 2.3324999809265137, 2.3324999809265137, 2.33240008354187, 2.332200050354004, 2.3320000171661377, 2.331899881362915, 2.321000099182129, 2.319499969482422, 2.3125, 2.2964000701904297, 2.3036000728607178, 2.281100034713745, 2.3059000968933105, 2.289400100708008, 2.218400001525879, 2.106600046157837, 2.063800096511841, 2.226300001144409, 2.183000087738037, 2.096299886703491, 2.19569993019104, 2.1347999572753906, 2.1861000061035156, 2.0332999229431152, 2.193000078201294, 1.8654999732971191, 2.0510001182556152, 1.8450000286102295, 1.6746000051498413, 1.5880000591278076, 1.9641000032424927, 0.8166999816894531, 0.7954000234603882, 1.6297999620437622, 1.572100043296814, 1.6842999458312988, 0.6661999821662903, 0.41440001130104065, 1.1360000371932983, 0.9230999946594238, 0.927299976348877, 0.77920001745224, 0.24959999322891235, -0.010900000110268593, 0.20020000636577606, -0.3833000063896179, 0.3409999907016754, 0.04670000076293945, 0.013500000350177288, 1.1301000118255615, 0.7407000064849854, 2.3550000190734863, 2.3548998832702637, 2.3541998863220215, 2.3541998863220215, 2.352099895477295, 2.3513998985290527, 2.3487000465393066, 2.347599983215332, 2.3473000526428223, 2.3471999168395996, 2.34689998626709, 2.3457999229431152, 2.3454999923706055, 2.3452999591827393, 2.3450000286102295, 2.3440001010894775, 2.3436999320983887, 2.343400001525879, 2.3431999683380127, 2.3427999019622803, 2.342600107192993, 2.342400074005127, 2.3422999382019043, 2.3417999744415283, 2.3415000438690186, 2.3415000438690186, 2.341399908065796, 2.3403000831604004, 2.3401999473571777, 2.340100049972534, 2.3173999786376953, 2.297600030899048, 2.3120999336242676, 2.3108999729156494, 2.2611000537872314, 2.2952001094818115, 2.3132998943328857, 2.235300064086914, 2.249799966812134, 2.33270001411438, 2.2404000759124756, 2.1772000789642334, 2.203000068664551, 2.1942999362945557, 2.2360000610351562, 2.2339999675750732, 2.071899890899658, 1.9709999561309814, 2.089400053024292, 1.9450000524520874, 2.13100004196167, 2.011899948120117, 2.0436999797821045, 1.7994999885559082, 1.6154999732971191, 1.215399980545044, 1.9223999977111816, 1.5217000246047974, 1.7158000469207764, 0.7318000197410583, 1.5988999605178833, 0.6722000241279602, 0.460999995470047, 0.4821999967098236, 0.07440000027418137, 0.4043000042438507, 0.7802000045776367, 0.4431000053882599, 0.03189999982714653, 0.3253999948501587, 0.4275999963283539, 0.4212999939918518, 0.9513000249862671, 0.9588000178337097, 0.13619999587535858, 0.011599999852478504, 2.4128000736236572, 2.4117000102996826, 2.411600112915039, 2.4112000465393066, 2.4096999168395996, 2.4094998836517334, 2.408799886703491, 2.408799886703491, 2.408099889755249, 2.407900094985962, 2.4077999591827393, 2.4075000286102295, 2.4072000980377197, 2.407099962234497, 2.407099962234497, 2.4068000316619873, 2.4068000316619873, 2.4066998958587646, 2.4065001010894775, 2.406399965286255, 2.406100034713745, 2.4059998989105225, 2.4056999683380127, 2.4052000045776367, 2.4052000045776367, 2.4049999713897705, 2.4047000408172607, 2.4047000408172607, 2.404599905014038, 2.404400110244751, 2.3933000564575195, 2.376499891281128, 2.341399908065796, 2.3564999103546143, 2.3580000400543213, 2.231600046157837, 2.300600051879883, 2.1846001148223877, 2.266700029373169, 2.2227001190185547, 2.257499933242798, 2.1233999729156494, 1.9658000469207764, 2.3125998973846436, 1.9865000247955322, 1.597100019454956, 1.7648999691009521, 1.0089999437332153, 1.4464999437332153, 1.0003999471664429, 1.2259000539779663, 1.7905000448226929, 1.7924000024795532, 1.4221999645233154, 1.3905999660491943, 1.7354999780654907, 0.6812999844551086, 0.6772000193595886, 0.5328999757766724, 0.23199999332427979, 1.4362000226974487, 0.38100001215934753, 0.775600016117096, 0.9772999882698059, 0.843500018119812, 0.9948999881744385, 0.7968999743461609, 0.7509999871253967, 0.16369999945163727, 0.7944999933242798, 1.1397000551223755, 0.7049999833106995, 2.539799928665161, 2.5383999347686768, 2.5380001068115234, 2.5373001098632812, 2.5369999408721924, 2.5364999771118164, 2.5357000827789307, 2.5344998836517334, 2.53439998626709, 2.5341999530792236, 2.533400058746338, 2.5332999229431152, 2.533099889755249, 2.5325000286102295, 2.5322000980377197, 2.5318000316619873, 2.5313000679016113, 2.5309998989105225, 2.5308001041412354, 2.5299999713897705, 2.5299999713897705, 2.5297000408172607, 2.529599905014038, 2.529400110244751, 2.5292000770568848, 2.5280001163482666, 2.5276999473571777, 2.5267999172210693, 2.526700019836426, 2.5257999897003174, 2.4983999729156494, 2.449399948120117, 2.4505999088287354, 2.509399890899658, 2.4765000343322754, 2.330899953842163, 2.104300022125244, 2.2607998847961426, 2.390700101852417, 2.3450000286102295, 1.8308000564575195, 1.7178000211715698, 2.0494000911712646, 1.8805999755859375, 2.0169999599456787, 2.0546000003814697, 1.9692000150680542, 1.902500033378601, 2.0139999389648438, 1.6618000268936157, 1.9521000385284424, 1.7515000104904175, 1.1318999528884888, 1.6973999738693237, 1.379699945449829, 1.1074999570846558, 1.30649995803833, 1.3228000402450562, 0.4544999897480011, 0.39149999618530273, 1.2115000486373901, 0.9824000000953674, -0.3142000138759613, 0.1941000074148178, 2.65339994430542, 2.6526999473571777, 2.6501998901367188, 2.6496999263763428, 2.6489999294281006, 2.6489999294281006, 2.6486001014709473, 2.648099899291992, 2.648099899291992, 2.646899938583374, 2.645900011062622, 2.6458001136779785, 2.645699977874756, 2.6454999446868896, 2.64520001411438, 2.6447999477386475, 2.644700050354004, 2.643699884414673, 2.643399953842163, 2.643399953842163, 2.643399953842163, 2.643399953842163, 2.6431000232696533, 2.6429998874664307, 2.6429998874664307, 2.6429998874664307, 2.6424999237060547, 2.6422998905181885, 2.642199993133545, 2.641700029373169, 2.635999917984009, 2.583699941635132, 2.539299964904785, 2.545099973678589, 2.5088999271392822, 2.5473999977111816, 2.465399980545044, 2.5885000228881836, 2.606800079345703, 2.528899908065796, 2.5975000858306885, 2.5183000564575195, 2.367000102996826, 2.4702000617980957, 2.3645999431610107, 2.3884999752044678, 2.253999948501587, 2.546799898147583, 1.9607000350952148, 2.437000036239624, 1.7419999837875366, 1.7599999904632568, 1.6059999465942383, 2.103300094604492, 2.1456000804901123, 2.0232999324798584, 1.0397000312805176, 1.5461000204086304, 2.0940001010894775, 0.710099995136261, 1.1996999979019165, 0.8400999903678894, 1.422700047492981, 1.3034000396728516, -0.013100000098347664, -0.1525000035762787, 0.4368000030517578, 0.745199978351593, 0.510200023651123, -0.03449999913573265, -0.14550000429153442, 0.10100000351667404, 2.7214999198913574, 2.721299886703491, 2.7200000286102295, 2.719099998474121, 2.7186999320983887, 2.7184998989105225, 2.7183001041412354, 2.7179999351501465, 2.717400074005127, 2.7170000076293945, 2.716900110244751, 2.7167999744415283, 2.716599941253662, 2.716399908065796, 2.7163000106811523, 2.716200113296509, 2.716099977493286, 2.7156999111175537, 2.7156999111175537, 2.715100049972534, 2.714900016784668, 2.7146999835968018, 2.7144999504089355, 2.7144999504089355, 2.7144999504089355, 2.714400053024292, 2.71370005607605, 2.712899923324585, 2.7126998901367188, 2.7125000953674316, 2.7114999294281006, 2.70989990234375, 2.660099983215332, 2.6861000061035156, 2.523200035095215, 2.6847000122070312, 2.6684000492095947, 2.6433000564575195, 2.6735000610351562, 2.31469988822937, 2.286600112915039, 2.4769999980926514, 2.259000062942505, 2.381700038909912, 2.336400032043457, 2.3768999576568604, 2.3594000339508057, 2.3306000232696533, 2.299099922180176, 2.5443999767303467, 2.254300117492676, 2.1686999797821045, 1.9785000085830688, 1.773300051689148, 0.8248000144958496, 1.8694000244140625, 1.7740000486373901, 1.873900055885315, 1.5986000299453735, 0.6425999999046326, 0.05000000074505806, 1.1669000387191772, 0.04839999973773956], \"logprob\": [30.0, 29.0, 28.0, 27.0, 26.0, 25.0, 24.0, 23.0, 22.0, 21.0, 20.0, 19.0, 18.0, 17.0, 16.0, 15.0, 14.0, 13.0, 12.0, 11.0, 10.0, 9.0, 8.0, 7.0, 6.0, 5.0, 4.0, 3.0, 2.0, 1.0, -4.882199764251709, -5.374499797821045, -5.914400100708008, -5.995299816131592, -6.022299766540527, -6.139200210571289, -6.162799835205078, -6.240099906921387, -6.430099964141846, -6.431300163269043, -6.4481000900268555, -6.517099857330322, -6.532599925994873, -5.713200092315674, -6.713799953460693, -6.680600166320801, -6.725599765777588, -6.80109977722168, -6.786600112915039, -6.832300186157227, -6.872700214385986, -6.892399787902832, -6.929500102996826, -6.946300029754639, -6.952899932861328, -6.963099956512451, -6.981100082397461, -7.000899791717529, -7.207600116729736, -7.210000038146973, -6.230899810791016, -6.464200019836426, -5.641499996185303, -6.496399879455566, -5.325099945068359, -6.250899791717529, -4.987599849700928, -6.652400016784668, -5.7866997718811035, -5.463200092315674, -5.974699974060059, -5.600100040435791, -6.321100234985352, -6.075300216674805, -4.164999961853027, -6.055200099945068, -5.059800148010254, -4.702600002288818, -5.730299949645996, -4.607699871063232, -5.853899955749512, -5.873799800872803, -5.070400238037109, -5.449900150299072, -5.1554999351501465, -5.1855998039245605, -5.401899814605713, -5.638400077819824, -5.808599948883057, -5.481299877166748, -5.3383002281188965, -5.733500003814697, -5.481500148773193, -5.7484002113342285, -5.736800193786621, -5.668000221252441, -5.838200092315674, -4.753300189971924, -5.165999889373779, -5.369900226593018, -5.967899799346924, -5.506999969482422, -6.253600120544434, -6.323699951171875, -6.35129976272583, -6.450500011444092, -6.612100124359131, -6.622200012207031, -6.675099849700928, -6.678599834442139, -6.653600215911865, -6.823699951171875, -6.845600128173828, -6.909299850463867, -6.933800220489502, -6.952300071716309, -7.013199806213379, -7.014999866485596, -6.98859977722168, -7.004700183868408, -7.095900058746338, -7.135300159454346, -7.196100234985352, -7.264999866485596, -7.2606000900268555, -7.272200107574463, -6.650000095367432, -4.354899883270264, -5.3043999671936035, -5.513999938964844, -5.460400104522705, -6.571499824523926, -6.394000053405762, -5.218299865722656, -5.284299850463867, -6.085599899291992, -6.298299789428711, -6.320799827575684, -5.9166998863220215, -5.550000190734863, -6.38100004196167, -5.966000080108643, -5.768099784851074, -4.58519983291626, -6.354599952697754, -5.545199871063232, -5.00629997253418, -5.991600036621094, -5.504700183868408, -5.3028998374938965, -5.598199844360352, -5.393599987030029, -5.41349983215332, -5.011899948120117, -4.543399810791016, -5.440800189971924, -5.635000228881836, -4.891900062561035, -5.127299785614014, -5.315899848937988, -5.143700122833252, -5.407100200653076, -5.2895002365112305, -5.402100086212158, -5.500899791717529, -5.3927998542785645, -5.484099864959717, -5.540599822998047, -5.625400066375732, -5.695799827575684, -6.301300048828125, -6.148200035095215, -6.662399768829346, -6.764100074768066, -6.801199913024902, -6.842599868774414, -6.940400123596191, -6.960299968719482, -7.102200031280518, -7.246399879455566, -7.256100177764893, -7.317500114440918, -7.3225998878479, -7.335999965667725, -7.383800029754639, -7.423299789428711, -7.511600017547607, -7.533400058746338, -7.552299976348877, -7.52400016784668, -7.672999858856201, -7.679500102996826, -7.730100154876709, -7.745500087738037, -7.829500198364258, -7.829899787902832, -7.832900047302246, -7.836999893188477, -5.795100212097168, -7.8125, -6.699900150299072, -5.167600154876709, -6.002200126647949, -5.733699798583984, -4.740300178527832, -5.880899906158447, -6.10129976272583, -5.969099998474121, -5.160900115966797, -6.678699970245361, -5.234300136566162, -5.997900009155273, -5.223100185394287, -5.309899806976318, -4.928400039672852, -6.041500091552734, -5.117800235748291, -4.515200138092041, -4.7032999992370605, -5.03980016708374, -4.662199974060059, -5.71019983291626, -5.6722002029418945, -5.348400115966797, -4.901500225067139, -5.117700099945068, -5.128900051116943, -4.952400207519531, -5.177800178527832, -5.201499938964844, -5.495699882507324, -5.51609992980957, -5.6367998123168945, -5.026400089263916, -5.65910005569458, -5.4980998039245605, -5.430799961090088, -5.4899001121521, -5.445300102233887, -5.597400188446045, -5.629899978637695, -5.628900051116943, -5.063899993896484, -6.070400238037109, -6.309800148010254, -6.3907999992370605, -6.395899772644043, -6.473999977111816, -6.618800163269043, -6.7153000831604, -6.723800182342529, -6.781499862670898, -6.766499996185303, -5.94320011138916, -6.934599876403809, -7.006800174713135, -7.021900177001953, -7.065999984741211, -7.116600036621094, -7.1203999519348145, -7.1356000900268555, -7.191699981689453, -7.2342000007629395, -5.584799766540527, -7.332799911499023, -7.412700176239014, -7.42519998550415, -7.191299915313721, -7.507500171661377, -7.5081000328063965, -7.56879997253418, -7.589399814605713, -6.187300205230713, -6.0883002281188965, -4.949900150299072, -6.490799903869629, -5.281499862670898, -5.921500205993652, -4.572700023651123, -5.73799991607666, -5.423999786376953, -5.467400074005127, -5.894899845123291, -6.571000099182129, -5.354100227355957, -4.242700099945068, -4.984099864959717, -5.727200031280518, -5.379000186920166, -5.3383002281188965, -4.232699871063232, -5.212600231170654, -5.309599876403809, -6.185999870300293, -5.68149995803833, -5.6529998779296875, -4.570099830627441, -5.377799987792969, -4.806000232696533, -4.966400146484375, -5.1168999671936035, -4.681700229644775, -5.565299987792969, -4.904900074005127, -5.4120001792907715, -5.2144999504089355, -5.293900012969971, -5.325399875640869, -5.288099765777588, -5.44320011138916, -5.561200141906738, -5.525400161743164, -6.017399787902832, -6.459199905395508, -6.554100036621094, -6.177000045776367, -6.7220001220703125, -6.895100116729736, -6.903600215911865, -5.435500144958496, -6.782800197601318, -7.031599998474121, -7.093900203704834, -7.136499881744385, -7.1616997718811035, -7.162600040435791, -7.181000232696533, -6.083799839019775, -7.304900169372559, -7.343400001525879, -7.348599910736084, -7.369699954986572, -7.401000022888184, -7.41349983215332, -7.497000217437744, -7.502200126647949, -7.513800144195557, -7.516499996185303, -7.521500110626221, -7.535600185394287, -7.5441999435424805, -7.55109977722168, -5.597400188446045, -5.7683000564575195, -6.349699974060059, -6.095099925994873, -6.504499912261963, -6.050600051879883, -6.671199798583984, -6.494999885559082, -5.345600128173828, -4.648399829864502, -4.356599807739258, -6.17140007019043, -5.94320011138916, -5.763000011444092, -6.377099990844727, -6.164899826049805, -6.436299800872803, -5.794899940490723, -6.502699851989746, -5.310500144958496, -6.0553998947143555, -5.515200138092041, -5.35230016708374, -5.60129976272583, -6.164999961853027, -4.837200164794922, -4.860099792480469, -5.854800224304199, -5.8242998123168945, -5.942299842834473, -5.11929988861084, -4.981500148773193, -5.545599937438965, -5.661200046539307, -5.696599960327148, -5.682400226593018, -5.589000225067139, -5.571599960327148, -5.62470006942749, -5.624100208282471, -5.744900226593018, -5.708799839019775, -5.770199775695801, -5.910600185394287, -5.906000137329102, -5.388000011444092, -4.97730016708374, -5.809100151062012, -5.883299827575684, -6.095799922943115, -6.528900146484375, -6.915599822998047, -7.037899971008301, -6.993800163269043, -7.081099987030029, -7.107399940490723, -7.218400001525879, -7.237599849700928, -7.257500171661377, -7.2804999351501465, -7.362400054931641, -7.387899875640869, -7.4105000495910645, -7.4207000732421875, -7.450399875640869, -7.463500022888184, -7.480199813842773, -7.480000019073486, -7.519499778747559, -7.536099910736084, -7.539700031280518, -7.541999816894531, -7.6118998527526855, -7.619999885559082, -7.1971001625061035, -5.447000026702881, -5.146599769592285, -5.984499931335449, -6.154799938201904, -5.329599857330322, -6.46150016784668, -6.9243998527526855, -5.44290018081665, -5.820099830627441, -7.303299903869629, -6.218299865722656, -5.551400184631348, -6.050899982452393, -6.115699768066406, -6.45389986038208, -6.50540018081665, -5.731599807739258, -5.35699987411499, -5.955699920654297, -5.418099880218506, -6.295400142669678, -5.906899929046631, -6.03879976272583, -5.660900115966797, -5.357600212097168, -4.576000213623047, -6.046299934387207, -5.535999774932861, -5.82480001449585, -4.986599922180176, -5.956099987030029, -5.39900016784668, -5.295400142669678, -5.342700004577637, -5.166399955749512, -5.351200103759766, -5.513000011444092, -5.395500183105469, -5.363999843597412, -5.460100173950195, -5.502299785614014, -5.614999771118164, -5.730199813842773, -5.740499973297119, -5.725100040435791, -5.77209997177124, -5.916200160980225, -6.203800201416016, -6.205599784851074, -6.309999942779541, -6.57480001449585, -6.602399826049805, -6.702899932861328, -6.705100059509277, -6.802800178527832, -6.820400238037109, -6.838099956512451, -6.872300148010254, -6.866399765014648, -5.8531999588012695, -6.912700176239014, -6.946300029754639, -6.9471001625061035, -6.961400032043457, -6.976600170135498, -6.990600109100342, -7.022799968719482, -7.031899929046631, -6.214600086212158, -7.107999801635742, -7.111999988555908, -7.125100135803223, -7.150100231170654, -7.1504998207092285, -7.16379976272583, -7.183000087738037, -5.0954999923706055, -6.145999908447266, -5.829899787902832, -6.146999835968018, -6.287600040435791, -5.656300067901611, -6.222400188446045, -5.499899864196777, -6.05810022354126, -6.175099849700928, -6.523399829864502, -6.176700115203857, -5.816299915313721, -6.7428998947143555, -6.06220006942749, -5.412899971008301, -5.721799850463867, -4.644899845123291, -5.347899913787842, -4.7179999351501465, -5.152400016784668, -5.967599868774414, -5.999100208282471, -5.628600120544434, -5.627799987792969, -5.966800212860107, -5.143700122833252, -5.252600193023682, -5.252600193023682, -5.163899898529053, -5.8053998947143555, -5.447700023651123, -5.619100093841553, -5.710599899291992, -5.69189977645874, -5.749000072479248, -5.70359992980957, -5.710599899291992, -5.674900054931641, -5.8471999168396, -5.911399841308594, -5.9029998779296875, -4.351600170135498, -5.3572998046875, -5.516900062561035, -5.445400238037109, -5.866499900817871, -5.999599933624268, -6.178400039672852, -6.39169979095459, -6.408699989318848, -6.450099945068359, -4.750800132751465, -6.572500228881836, -6.60129976272583, -6.676599979400635, -6.698999881744385, -6.645400047302246, -6.8256001472473145, -6.853000164031982, -6.371300220489502, -6.9558000564575195, -6.956299781799316, -6.978799819946289, -6.988800048828125, -7.013700008392334, -6.946000099182129, -7.128799915313721, -7.146599769592285, -7.2179999351501465, -7.229000091552734, -7.287799835205078, -4.95959997177124, -4.533999919891357, -5.435999870300293, -6.94350004196167, -6.648799896240234, -5.456600189208984, -4.546800136566162, -5.6230998039245605, -6.371500015258789, -6.284299850463867, -4.621500015258789, -4.631499767303467, -5.618000030517578, -5.259300231933594, -5.611199855804443, -5.697000026702881, -5.560400009155273, -5.549799919128418, -5.781899929046631, -5.357699871063232, -5.821599960327148, -5.603300094604492, -5.048399925231934, -5.6143999099731445, -5.34499979019165, -5.15939998626709, -5.414700031280518, -5.561200141906738, -5.336999893188477, -5.3649001121521, -5.582699775695801, -5.557499885559082, -5.554999828338623, -5.589600086212158, -5.306000232696533, -5.590199947357178, -6.189599990844727, -6.274400234222412, -6.389599800109863, -6.389500141143799, -6.435200214385986, -6.504300117492676, -6.507500171661377, -6.6519999504089355, -6.760200023651123, -6.632599830627441, -6.781199932098389, -6.806099891662598, -6.833499908447266, -6.872200012207031, -6.879899978637695, -6.9542999267578125, -6.990300178527832, -6.370100021362305, -6.994999885559082, -6.997000217437744, -5.59689998626709, -7.023399829864502, -7.023399829864502, -7.025400161743164, -7.065000057220459, -7.035699844360352, -7.0879998207092285, -7.124899864196777, -6.369200229644775, -5.4944000244140625, -5.081399917602539, -5.257400035858154, -5.519999980926514, -6.0345001220703125, -5.214099884033203, -6.502200126647949, -6.671199798583984, -6.0482001304626465, -6.612400054931641, -6.098800182342529, -5.285799980163574, -5.903200149536133, -5.553400039672852, -5.670000076293945, -5.394599914550781, -6.484300136566162, -5.22599983215332, -6.290200233459473, -5.123600006103516, -5.187600135803223, -4.965199947357178, -5.832200050354004, -5.899400234222412, -5.825500011444092, -5.028299808502197, -5.555200099945068, -6.0192999839782715, -5.151199817657471, -5.456500053405762, -5.453000068664551, -5.76200008392334, -5.762700080871582, -5.408999919891357, -5.3933000564575195, -5.599400043487549, -5.662700176239014, -5.7164998054504395, -5.688399791717529, -5.706200122833252, -5.737599849700928, -4.496799945831299, -4.617499828338623, -5.374000072479248, -5.655700206756592, -5.768099784851074, -5.807300090789795, -5.857600212097168, -5.942200183868408, -6.054900169372559, -6.128300189971924, -6.153299808502197, -6.173099994659424, -6.179500102996826, -6.234899997711182, -6.258200168609619, -6.203199863433838, -6.280900001525879, -6.3358001708984375, -6.345300197601318, -6.419400215148926, -6.450300216674805, -6.476099967956543, -6.50439977645874, -6.50600004196167, -6.509799957275391, -6.446499824523926, -6.600800037384033, -6.6890997886657715, -6.702099800109863, -6.729800224304199, -5.840000152587891, -6.20389986038208, -4.364299774169922, -6.039400100708008, -3.9937000274658203, -6.145199775695801, -5.97130012512207, -5.824900150299072, -6.168600082397461, -4.063600063323975, -4.401299953460693, -5.480899810791016, -4.791800022125244, -5.240699768066406, -5.105299949645996, -5.286499977111816, -5.36359977722168, -5.348800182342529, -5.300000190734863, -5.866099834442139, -5.378200054168701, -5.480899810791016, -5.417900085449219, -5.409200191497803, -4.829100131988525, -5.538000106811523, -5.578700065612793, -5.704500198364258, -5.638400077819824, -5.4253997802734375, -5.345900058746338, -5.65749979019165, -5.737199783325195]}, \"token.table\": {\"Topic\": [1, 2, 3, 4, 5, 6, 8, 9, 10, 3, 4, 5, 6, 7, 8, 4, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 1, 3, 5, 8, 1, 2, 3, 5, 8, 1, 5, 8, 9, 5, 3, 8, 7, 4, 1, 2, 5, 6, 7, 8, 9, 10, 2, 3, 4, 5, 6, 7, 8, 10, 3, 8, 1, 6, 9, 2, 4, 5, 2, 3, 4, 5, 8, 1, 10, 1, 3, 4, 8, 1, 1, 2, 3, 5, 6, 7, 8, 9, 1, 6, 8, 9, 10, 1, 1, 1, 3, 5, 6, 6, 2, 2, 2, 1, 2, 6, 8, 9, 10, 5, 1, 2, 3, 4, 8, 2, 3, 4, 5, 6, 7, 3, 5, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 1, 1, 1, 3, 9, 4, 5, 7, 1, 3, 4, 5, 6, 7, 8, 9, 10, 7, 10, 7, 1, 8, 6, 7, 1, 2, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 1, 3, 7, 8, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 2, 2, 5, 6, 2, 5, 3, 4, 4, 9, 7, 1, 3, 4, 5, 7, 8, 9, 10, 10, 8, 1, 2, 3, 4, 5, 6, 7, 9, 6, 5, 6, 7, 10, 10, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 1, 4, 5, 6, 7, 3, 4, 8, 4, 6, 4, 5, 1, 3, 4, 5, 6, 7, 8, 9, 10, 8, 9, 9, 10, 5, 6, 4, 6, 7, 8, 10, 9, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 9, 7, 2, 1, 2, 3, 4, 5, 6, 7, 8, 9, 6, 4, 4, 9, 1, 2, 3, 5, 8, 9, 4, 7, 8, 9, 1, 2, 1, 2, 1, 2, 5, 4, 8, 3, 4, 7, 8, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 8, 1, 2, 3, 8, 10, 6, 7, 10, 3, 4, 4, 9, 1, 5, 6, 8, 7, 8, 7, 10, 2, 3, 4, 6, 7, 8, 1, 2, 3, 4, 7, 10, 2, 3, 4, 5, 6, 7, 8, 10, 1, 4, 6, 7, 10, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 2, 3, 4, 5, 6, 7, 8, 9, 3, 4, 7, 9, 6, 4, 2, 9, 10, 3, 1, 3, 4, 5, 6, 7, 8, 9, 10, 1, 2, 3, 4, 6, 7, 8, 3, 1, 3, 4, 5, 6, 7, 8, 9, 6, 1, 4, 5, 6, 8, 9, 10, 1, 2, 6, 8, 10, 1, 6, 8, 8, 8, 8, 8, 4, 7, 10, 9, 2, 6, 2, 3, 4, 6, 7, 8, 9, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 1, 4, 6, 8, 1, 2, 4, 6, 9, 10, 8, 8, 5, 1, 2, 3, 4, 5, 6, 7, 8, 9, 3, 10, 3, 4, 7, 8, 4, 9, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 3, 3, 4, 8, 9, 3, 4, 8, 1, 2, 3, 4, 5, 9, 10, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 2, 1, 3, 4, 5, 6, 7, 8, 9, 10, 5, 1, 6, 9, 2, 7, 1, 2, 4, 5, 6, 7, 9, 10, 4, 5, 6, 8, 10, 3, 5, 9, 1, 7, 9, 1, 2, 3, 5, 7, 9, 10, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 9, 4, 1, 2, 3, 4, 5, 6, 7, 10, 8, 1, 2, 6, 8, 10, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 5, 3, 4, 8, 10, 8, 4, 10, 1, 2, 9, 3, 4, 1, 1, 2, 6, 8, 9, 10, 1, 2, 3, 4, 5, 7, 8, 9, 10, 1, 2, 7, 8, 1, 5, 6, 8, 1, 3, 4, 8, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 6, 6, 1, 3, 5, 9, 3, 4, 5, 10, 7, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 3, 4, 1, 2, 5, 9, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 2, 3, 4, 8, 9, 2, 6, 10, 6, 9, 1, 2, 3, 4, 8, 9, 5, 6, 8, 9, 10, 2, 4, 7, 10, 7, 10, 7, 9, 1, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 1, 2, 3, 5, 8, 10, 2, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 4, 9, 2, 1, 5, 6, 8, 3, 3, 4, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 1, 3, 1, 2, 3, 1, 2, 5, 6, 7, 8, 9, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 8, 1, 6, 9, 5, 8, 3, 6, 8, 6, 7, 9, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 1, 2, 4, 5, 6, 7, 8, 9, 10, 6, 1, 5, 8, 9, 1, 2, 5, 7, 5, 6, 7, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 5, 10, 7, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 1, 5, 6, 7, 9, 1, 7, 10, 1, 2, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 9, 8, 6, 7, 6, 5, 1, 6, 6, 1, 2, 3, 4, 5, 6, 7, 9, 1, 2, 3, 4, 8, 6, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 2, 3, 4, 7, 8, 9, 9, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 7, 9, 10, 7, 3, 4, 5, 7, 8, 5, 6, 9, 10, 9, 4, 2, 3, 4, 6, 7, 8, 9, 10, 5, 8, 1, 1, 2, 10, 1, 2, 10, 2, 10, 2, 4, 7, 9, 7, 2, 4, 5, 6, 7, 9, 10, 2, 5, 10, 1, 2, 10, 3, 5, 6, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 4, 7, 5, 3, 3, 8, 1, 2, 3, 6, 7, 9, 10, 1, 7, 3, 7, 5, 3, 5, 10, 10, 7, 10, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 10, 10, 1, 2, 3, 4, 6, 7, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 1, 2, 5, 6, 7, 8, 9, 10, 2, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 7, 1, 2, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 1, 2, 4, 5, 6, 7, 9, 10, 3, 5, 8, 1, 3, 4, 5, 6, 8, 9, 10, 3, 6, 2, 3, 4, 6, 7, 8, 9, 10, 3, 4, 3, 5, 1, 2, 1, 4, 10, 5, 3, 4, 10, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 1, 3, 7, 8, 9, 1, 4, 8, 9, 4, 1, 2, 3, 4, 5, 7, 10, 1, 2, 3, 4, 5, 6, 7, 8, 10, 7, 1, 5, 7, 9, 9, 2, 4, 6, 9, 1, 8, 1, 2, 3, 5, 5, 2, 3, 4, 7, 8, 9, 3, 4, 8, 1, 2, 4, 5, 6, 8, 9, 10, 4, 5, 8, 4, 10, 2, 3, 5, 1, 2, 1, 4, 3, 6, 1, 3, 4, 1, 2, 6, 1, 2, 3, 5, 7, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 1, 8, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 2, 4, 6, 7, 8, 9, 3, 8, 7, 5, 4, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 3, 6, 8, 3, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 10, 5, 3, 5, 6, 7, 3, 4, 8, 1, 3, 4, 5, 6, 7, 10, 1, 2, 4, 7, 9, 10, 2, 8, 9, 2, 9, 10, 10, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 1, 2, 3, 5, 6, 7, 8, 9, 10, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 1, 2, 3, 4, 6, 7, 8, 9, 6, 9, 6, 5, 7, 7, 7, 9, 10, 8, 9, 10, 3, 1, 2, 4, 5, 6, 7, 8, 10, 7, 10, 10, 5, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 1, 2, 5, 6, 8, 10, 3, 1, 8, 9, 10, 3, 4, 8, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 4, 1, 5, 8, 10, 1, 2, 3, 4, 5, 6, 7, 1, 2, 3, 9, 3, 4, 7, 1, 8, 1, 2, 3, 4, 5, 6, 8, 3, 5, 6, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 2, 3, 4, 5, 8, 9, 3, 5, 7, 8, 9, 2, 2, 2, 3, 5, 8, 9, 10, 1, 3, 4, 5, 6, 7, 8, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 3, 4, 8, 10, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 3, 5, 10, 6, 5, 10, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 3, 8, 5, 3, 1, 2, 1, 2, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 1, 2, 3, 4, 5, 9, 7, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 2, 2, 7, 5, 6, 5, 6, 6, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 8, 1, 3, 5, 6, 7, 8, 9, 6, 1, 3, 5, 6, 7, 9, 10, 9, 1, 2, 4, 9, 10, 7, 5, 1, 2, 3, 4, 5, 6, 7, 10, 2, 7, 8, 2, 3, 4, 5, 6, 7, 2, 2, 3, 5, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 2, 3, 4, 8, 9, 2, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 2, 3, 5, 8, 9, 7, 10, 1, 2, 3, 4, 7, 9, 10, 3, 4, 8, 10, 2, 4, 1, 7, 7, 10, 1, 7, 8, 1, 6, 8, 10, 10, 1, 3, 4, 5, 6, 7, 8, 10, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 1, 1, 3, 4, 5, 1, 6, 10, 6, 3, 5, 4, 2, 2, 9, 3, 1, 1, 9, 10, 1, 2, 3, 4, 5, 6, 7, 10, 6, 2, 3, 4, 5, 6, 7, 8, 9, 10, 3, 5, 10, 1, 10, 2, 1, 2, 3, 4, 5, 7, 8, 9, 10, 1, 3, 4, 5, 8, 3, 5, 4, 5, 7, 4, 5, 6, 7, 8, 5, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 9, 1, 2, 5, 5, 1, 3, 4, 5, 6, 7, 8, 10, 3, 7, 10, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 7, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 1, 3, 4, 5, 6, 7, 8, 10, 8, 2, 3, 4, 6, 7, 8, 9, 10, 9, 5, 9, 8, 1, 2, 3, 5, 6, 8, 9, 10, 3, 9, 8, 4, 4, 9, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 8, 1, 2, 3, 5, 6, 3, 5, 7, 8, 10, 1, 2, 3, 4, 5, 6, 7, 8, 9, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 6, 2, 3, 4, 5, 6, 7, 8, 9, 2, 1, 2, 3, 4, 5, 6, 7, 9, 10, 2, 5, 2, 1, 2, 3, 6, 8, 9, 9, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 6, 4, 7, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 4, 5, 6, 7, 10, 3, 3, 4, 5, 7, 10, 1, 9, 1, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 6, 1, 2, 6, 9, 10, 1, 1, 1, 3, 2, 6, 7, 5, 7, 1, 2, 3, 4, 5, 6, 7, 9, 2, 4, 7, 5, 3, 4, 1, 4, 6, 7, 3, 4, 6, 8, 3, 6, 10, 6, 1, 5, 6, 8, 2, 1, 2, 3, 4, 5, 6, 7, 8, 10, 4, 8, 1, 3, 4, 8, 1, 10, 2, 3, 5, 6, 7, 8, 10, 3, 7, 7, 4, 1, 6, 6, 7, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 1, 2, 5, 7, 9, 1, 6, 7, 3, 5, 3, 1, 3, 4, 1, 5, 8, 9, 10, 5, 10, 3, 5, 7, 8, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 1, 2, 3, 3, 3, 3, 6, 7, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 9, 5, 1], \"Freq\": [0.14598289132118225, 0.5243467092514038, 0.1291005164384842, 0.0496540442109108, 0.00794464722275734, 0.02284085936844349, 0.06653641909360886, 0.0347578302025795, 0.01886853575706482, 0.40391483902931213, 0.1960684359073639, 0.17181970179080963, 0.03325542435050011, 0.0006928213406354189, 0.19329716265201569, 0.9846343994140625, 0.05246054753661156, 0.07400684058666229, 0.5367838144302368, 0.18267512321472168, 0.030914250761270523, 0.02623027376830578, 0.03278784081339836, 0.0496501587331295, 0.005620772950351238, 0.00843115895986557, 0.12411247193813324, 0.0630735531449318, 0.19735917448997498, 0.614458441734314, 0.07896016538143158, 0.02786829322576523, 0.006967073306441307, 0.12772968411445618, 0.7570886611938477, 0.0386776365339756, 0.08218997716903687, 0.00483470456674695, 0.8702468276023865, 0.9960854053497314, 0.3871470093727112, 0.6115800738334656, 0.9910170435905457, 0.9902247786521912, 0.33969980478286743, 0.014489565044641495, 0.09418217092752457, 0.09981700032949448, 0.004024879075586796, 0.20285390317440033, 0.03300400823354721, 0.21090367436408997, 0.12552714347839355, 0.12667876482009888, 0.06333938241004944, 0.012667876668274403, 0.17389538884162903, 0.03685200214385986, 0.07370400428771973, 0.38694602251052856, 0.9025949835777283, 0.09524871408939362, 0.7508120536804199, 0.05317366123199463, 0.19355212152004242, 0.2244642972946167, 0.7725217938423157, 0.002278825268149376, 0.025182049721479416, 0.7351221442222595, 0.18789683282375336, 0.011622484773397446, 0.0397101566195488, 0.3441043496131897, 0.6550210118293762, 0.04772661626338959, 0.8045344352722168, 0.03409044072031975, 0.11363480240106583, 0.9978176951408386, 0.06133982539176941, 0.707861602306366, 0.060113027691841125, 0.011041169054806232, 0.05643263831734657, 0.013494761660695076, 0.012267964892089367, 0.0772881805896759, 0.8128747344017029, 0.14955486357212067, 0.015835221856832504, 0.012316283769905567, 0.007037876173853874, 0.9969637393951416, 0.9991614818572998, 0.8529326319694519, 0.08812587708234787, 0.006294705905020237, 0.050357647240161896, 0.9844738245010376, 0.9972343444824219, 0.9992160201072693, 0.9963047504425049, 0.6339515447616577, 0.02203921601176262, 0.0427820086479187, 0.24113495647907257, 0.03241061046719551, 0.027224913239479065, 0.9964976906776428, 0.1443973183631897, 0.31100961565971375, 0.18626399338245392, 0.061518386006355286, 0.29563000798225403, 0.030768103897571564, 0.016782602295279503, 0.019579702988266945, 0.008391301147639751, 0.8978692293167114, 0.02517390251159668, 0.9904056191444397, 0.9817970991134644, 0.0017971218330785632, 0.02096642181277275, 0.6176108717918396, 0.11861003935337067, 0.02515970543026924, 0.02755586802959442, 0.004193284083157778, 0.14077454805374146, 0.03174915164709091, 0.01257985271513462, 0.9968417286872864, 0.991598904132843, 0.9969107508659363, 0.9914524555206299, 0.9858863353729248, 0.023294983431696892, 0.15141738951206207, 0.8230893611907959, 0.003686234587803483, 0.012901821173727512, 0.027646759524941444, 0.020274288952350616, 0.007372469175606966, 0.005529351532459259, 0.1032145693898201, 0.74830561876297, 0.06819533556699753, 0.8323493599891663, 0.1655372679233551, 0.9907169938087463, 0.9820555448532104, 0.016715839505195618, 0.056100912392139435, 0.9407691955566406, 0.013236194849014282, 0.9844419956207275, 0.09290590137243271, 0.5882739424705505, 0.0011710828403010964, 0.030838513746857643, 0.05074692144989967, 0.05933486297726631, 0.04801439493894577, 0.04333006590604782, 0.07065533101558685, 0.01405299361795187, 0.00951243843883276, 0.1598089635372162, 0.7933374047279358, 0.034244779497385025, 0.0074272542260587215, 0.13071967661380768, 0.06758801639080048, 0.18196773529052734, 0.039364445954561234, 0.10546701401472092, 0.24138575792312622, 0.019310861825942993, 0.07501526921987534, 0.13294784724712372, 0.04424953833222389, 0.11761061102151871, 0.023289229720830917, 0.1612779200077057, 0.10945937782526016, 0.1676824539899826, 0.19795845448970795, 0.022706998512148857, 0.06288091838359833, 0.09315691888332367, 0.9987183213233948, 0.9975488185882568, 0.0013375557027757168, 0.9978166222572327, 0.06178143993020058, 0.9339900016784668, 0.9676030278205872, 0.02764580026268959, 0.9971796870231628, 0.982193648815155, 0.9898443818092346, 0.03046371042728424, 0.08986794203519821, 0.7326522469520569, 0.048741936683654785, 0.016755040735006332, 0.00761592760682106, 0.012185484170913696, 0.05940423533320427, 0.9946929216384888, 0.98945152759552, 0.10203344374895096, 0.3764682412147522, 0.37154248356819153, 0.0049257525242865086, 0.0014073578640818596, 0.02392508275806904, 0.0731826052069664, 0.04644281044602394, 0.9914161562919617, 0.055586133152246475, 0.939405620098114, 0.9450883865356445, 0.05471564456820488, 0.9883830547332764, 0.18599717319011688, 0.01752147264778614, 0.2014969289302826, 0.27158281207084656, 0.20082302391529083, 0.013478055596351624, 0.06671637296676636, 0.03571684658527374, 0.0006739028031006455, 0.0074129304848611355, 0.018123658373951912, 0.4086061120033264, 0.023066474124789238, 0.5272337198257446, 0.023066474124789238, 0.04739116132259369, 0.8909538388252258, 0.056869395077228546, 0.9964706301689148, 0.9901596903800964, 0.9917035698890686, 0.995495080947876, 0.005461199674755335, 0.13243408501148224, 0.04505489766597748, 0.04642019420862198, 0.2047949880361557, 0.13789528608322144, 0.028671298176050186, 0.01092239934951067, 0.3877451717853546, 0.06210401654243469, 0.931560218334198, 0.9911597371101379, 0.9856107234954834, 0.03709100931882858, 0.9602450132369995, 0.8973998427391052, 0.039926689118146896, 0.0468980148434639, 0.005703812465071678, 0.008872597478330135, 0.9925441741943359, 0.09890180826187134, 0.14101789891719818, 0.0501607246696949, 0.13344645500183105, 0.028866078704595566, 0.20679469406604767, 0.028866078704595566, 0.12918752431869507, 0.16278575360774994, 0.01987500488758087, 0.9940217733383179, 0.9957262873649597, 0.9968324303627014, 0.12163656204938889, 0.1770021617412567, 0.04529913142323494, 0.08556503057479858, 0.024327311664819717, 0.09479262679815292, 0.041104767471551895, 0.009227600879967213, 0.40098121762275696, 0.9872248768806458, 0.9969919323921204, 0.9897413849830627, 0.9944040179252625, 0.6778358817100525, 0.13264651596546173, 0.023121869191527367, 0.0073016430251300335, 0.03772515431046486, 0.1204771101474762, 0.3485725224018097, 0.004737879149615765, 0.6463820934295654, 0.988788366317749, 0.0016636345535516739, 0.9981806874275208, 0.013511610217392445, 0.9863475561141968, 0.002685961779206991, 0.9857479333877563, 0.009400865994393826, 0.992397129535675, 0.9943981170654297, 0.9900022149085999, 0.049530185759067535, 0.9286909699440002, 0.021669454872608185, 0.23153142631053925, 0.499500572681427, 0.006072955206036568, 0.04630628600716591, 0.009109432809054852, 0.02429182082414627, 0.019737103953957558, 0.05237923935055733, 0.08198489993810654, 0.02960565686225891, 0.9902758598327637, 0.016072237864136696, 0.03214447572827339, 0.008036118932068348, 0.9402259588241577, 0.9969149231910706, 0.8351381421089172, 0.035791631788015366, 0.12725913524627686, 0.9410224556922913, 0.05614054203033447, 0.00718638114631176, 0.9845342040061951, 0.12217437475919724, 0.3212733566761017, 0.027149861678481102, 0.5279139876365662, 0.00637459009885788, 0.993161141872406, 0.049447860568761826, 0.949398934841156, 0.04700689762830734, 0.6894344687461853, 0.03917241469025612, 0.001958620734512806, 0.007834482938051224, 0.21348965167999268, 0.019394105300307274, 0.0030622270423918962, 0.16433952748775482, 0.7624945640563965, 0.04797489196062088, 0.0030622270423918962, 0.02497812546789646, 0.01405019499361515, 0.026539258658885956, 0.01405019499361515, 0.2700759768486023, 0.5214183926582336, 0.11708496510982513, 0.01248906273394823, 0.08582406491041183, 0.15019211173057556, 0.007152005564421415, 0.04470003396272659, 0.7116245627403259, 0.2507038414478302, 0.22155915200710297, 0.014572346583008766, 0.11628138273954391, 0.07137475907802582, 0.06988778710365295, 0.13055633008480072, 0.03211864084005356, 0.041040487587451935, 0.051449306309223175, 0.010484231635928154, 0.19526882469654083, 0.12318972498178482, 0.07863173633813858, 0.011794760823249817, 0.14677923917770386, 0.42985349893569946, 0.0013105289544910192, 0.8898380994796753, 0.08089437335729599, 0.008368383161723614, 0.019526228308677673, 0.9776338338851929, 0.992104709148407, 0.9852089285850525, 0.007977400906383991, 0.003988700453191996, 0.9938931465148926, 0.14128684997558594, 0.029136978089809418, 0.4518980383872986, 0.04947788640856743, 0.13359029591083527, 0.010995086282491684, 0.11489865183830261, 0.06212223693728447, 0.007696560118347406, 0.011460448615252972, 0.055010151118040085, 0.5684382319450378, 0.2177485227584839, 0.06990873068571091, 0.010314403101801872, 0.06532455235719681, 0.9914078712463379, 0.009856686927378178, 0.062097128480672836, 0.1419362872838974, 0.5105763673782349, 0.18234871327877045, 0.03154139965772629, 0.03055572882294655, 0.03154139965772629, 0.9842479228973389, 0.7061063051223755, 0.005525088403373957, 0.07514120638370514, 0.1193419098854065, 0.07514120638370514, 0.00110501772724092, 0.018785301595926285, 0.2932772636413574, 0.04783955588936806, 0.10399903357028961, 0.5553548336029053, 0.9974397420883179, 0.32539263367652893, 0.5732384324073792, 0.10035473853349686, 0.9916263222694397, 0.9956570863723755, 0.9919785857200623, 0.9961087107658386, 0.9902847409248352, 0.9942601919174194, 0.9961082935333252, 0.9942809343338013, 0.11343644559383392, 0.8848042488098145, 0.003028471488505602, 0.47547000646591187, 0.2640827000141144, 0.016353745013475418, 0.004239859990775585, 0.21078160405158997, 0.026044854894280434, 0.10129044950008392, 0.11214299499988556, 0.11756926774978638, 0.07717367261648178, 0.0012058386346325278, 0.1917283535003662, 0.2074042558670044, 0.08802622556686401, 0.06812988221645355, 0.03557224199175835, 0.9973674416542053, 0.11459366232156754, 0.7639577388763428, 0.12005050480365753, 0.581549882888794, 0.2825454771518707, 0.013715799897909164, 0.09326744079589844, 0.024688439443707466, 0.004114740062505007, 0.9912833571434021, 0.9915632605552673, 0.987637460231781, 0.006995608564466238, 0.002998118055984378, 0.24484629929065704, 0.12192346155643463, 0.29581430554389954, 0.11292910575866699, 0.0449717678129673, 0.1299184411764145, 0.03897553309798241, 0.9956022500991821, 0.9973152875900269, 0.009577130898833275, 0.4747520685195923, 0.0615672692656517, 0.4542296230792999, 0.9948829412460327, 0.9922850728034973, 0.04472442716360092, 0.25550490617752075, 0.08590632677078247, 0.18686839938163757, 0.07749281823635101, 0.13461610674858093, 0.031439945101737976, 0.04251034930348396, 0.11690345406532288, 0.023026438429951668, 0.9799155592918396, 0.7679171562194824, 0.20840230584144592, 0.02265242487192154, 0.99677973985672, 0.012705590575933456, 0.949009895324707, 0.037139419466257095, 0.0119171142578125, 0.01310882531106472, 0.605389416217804, 0.3467880189418793, 0.010725402273237705, 0.0011917114024981856, 0.010725402273237705, 0.051335275173187256, 0.014808251522481441, 0.20534110069274902, 0.1796734631061554, 0.05429692193865776, 0.14512087404727936, 0.175724595785141, 0.10299962013959885, 0.049360841512680054, 0.02138969674706459, 0.9928632378578186, 0.005768533796072006, 0.08797013759613037, 0.012979201041162014, 0.015863467007875443, 0.1543082743883133, 0.18603521585464478, 0.09518080949783325, 0.015863467007875443, 0.4254293739795685, 0.9893049597740173, 0.13154099881649017, 0.002684510312974453, 0.8644123077392578, 0.9944851398468018, 0.9891051650047302, 0.033735986799001694, 0.00606489647179842, 0.7467404007911682, 0.015162241645157337, 0.18535840511322021, 0.010992624796926975, 0.0007581120589748025, 0.0011371681466698647, 0.7884120345115662, 0.00419814744964242, 0.19731292128562927, 0.00419814744964242, 0.00587740633636713, 0.00438003009185195, 0.9942668080329895, 0.9940217733383179, 0.03518321365118027, 0.9631404876708984, 0.9966021180152893, 0.0027513206005096436, 0.29989394545555115, 0.09079357981681824, 0.6052905321121216, 0.0013756603002548218, 0.0013756603002548218, 0.996711790561676, 0.0427921898663044, 0.06828540563583374, 0.05462832748889923, 0.02276180312037468, 0.07192729413509369, 0.0783006027340889, 0.06464351713657379, 0.18118394911289215, 0.40789151191711426, 0.008194249123334885, 0.9927068948745728, 0.9913347959518433, 0.0025878301821649075, 0.007763490546494722, 0.5839869976043701, 0.26137086749076843, 0.0008626100607216358, 0.05520704388618469, 0.0733218565583229, 0.013801760971546173, 0.9992876648902893, 0.032602448016405106, 0.011643731035292149, 0.016301224008202553, 0.9128684997558594, 0.025616208091378212, 0.00628057774156332, 0.02791368030011654, 0.10188493132591248, 0.2023741751909256, 0.2979785203933716, 0.2449425458908081, 0.03768346831202507, 0.0397769920527935, 0.016748208552598953, 0.02512231096625328, 0.9943776726722717, 0.15899166464805603, 0.8376146554946899, 0.0025852303951978683, 0.9928542375564575, 0.998742938041687, 0.9821000695228577, 0.9941750764846802, 0.01414253655821085, 0.9086580276489258, 0.07424832135438919, 0.9900906682014465, 0.9895586967468262, 0.9942180514335632, 0.09427931159734726, 0.6226578950881958, 0.010360363870859146, 0.03833334892988205, 0.22896404564380646, 0.004144145641475916, 0.15294533967971802, 0.5817805528640747, 0.06882540136575699, 0.07235491275787354, 0.029412565752863884, 0.0011765025556087494, 0.0429423451423645, 0.04411884769797325, 0.007059015799313784, 0.9934695363044739, 0.9772945046424866, 0.021786820143461227, 0.9884756207466125, 0.21478646993637085, 0.08931714296340942, 0.10420333594083786, 0.5911944508552551, 0.007281843572854996, 0.540590226650238, 0.38905850052833557, 0.0627625584602356, 0.127691388130188, 0.08755980432033539, 0.05837320536375046, 0.11309808492660522, 0.13133971393108368, 0.012161084450781345, 0.08999202400445938, 0.025538276880979538, 0.030402710661292076, 0.3247009515762329, 0.9984749555587769, 0.9873408675193787, 0.03167729079723358, 0.09503187239170074, 0.8095307946205139, 0.059834882616996765, 0.018883921205997467, 0.978816568851471, 0.00650462880730629, 0.9887035489082336, 0.9960068464279175, 0.11995285004377365, 0.30648744106292725, 0.22458131611347198, 0.1421467661857605, 0.02906346507370472, 0.03117717243731022, 0.030648745596408844, 0.054427944123744965, 0.028535038232803345, 0.03381930664181709, 0.9655084609985352, 0.031217364594340324, 0.09275101125240326, 0.022714532911777496, 0.05489345267415047, 0.8271875381469727, 0.4964306652545929, 0.04393191635608673, 0.035145532339811325, 0.005491489544510841, 0.14717192947864532, 0.03953872621059418, 0.047226812690496445, 0.10214170813560486, 0.047226812690496445, 0.035145532339811325, 0.005433580372482538, 0.66561359167099, 0.2974885404109955, 0.008150370791554451, 0.021734321489930153, 0.11880886554718018, 0.6471291184425354, 0.23256203532218933, 0.9827058911323547, 0.012132171541452408, 0.037580136209726334, 0.037580136209726334, 0.6822240352630615, 0.1214127466082573, 0.06070637330412865, 0.06070637330412865, 0.7771899700164795, 0.01132929977029562, 0.18580052256584167, 0.02265859954059124, 0.00226586009375751, 0.010305746458470821, 0.020096207037568092, 0.3040195405483246, 0.6652359366416931, 0.9966678619384766, 0.9952186346054077, 0.05247049406170845, 0.9444688558578491, 0.9979948997497559, 0.24752682447433472, 0.07662222534418106, 0.0008545229793526232, 0.08630681782960892, 0.18600116670131683, 0.13102684915065765, 0.15210509300231934, 0.027059894055128098, 0.023356961086392403, 0.06893151998519897, 0.005418102722615004, 0.1661551594734192, 0.012642240151762962, 0.12461636960506439, 0.06140516698360443, 0.6266939043998718, 0.9935146570205688, 0.028499729931354523, 0.17739084362983704, 0.04954158514738083, 0.08203660696744919, 0.06525638699531555, 0.19683457911014557, 0.2426472306251526, 0.0492752343416214, 0.05486863851547241, 0.053803227841854095, 0.06767828017473221, 0.9305763244628906, 0.9940921068191528, 0.47854405641555786, 0.0675768256187439, 0.01401593443006277, 0.43899908661842346, 0.9759842157363892, 0.7746955156326294, 0.224728062748909, 0.07067009806632996, 0.13031825423240662, 0.06418660283088684, 0.13356000185012817, 0.0953073799610138, 0.14523029327392578, 0.18088951706886292, 0.022043883800506592, 0.0564064085483551, 0.1011425256729126, 0.9620181918144226, 0.03390372544527054, 0.928249180316925, 0.06953177601099014, 0.9825076460838318, 0.07760585844516754, 0.05453384667634964, 0.19925828278064728, 0.018877100199460983, 0.6376265287399292, 0.004194911103695631, 0.00629236688837409, 0.1507587730884552, 0.19675298035144806, 0.26114487648010254, 0.06490293145179749, 0.0741017758846283, 0.09812096506357193, 0.012265120632946491, 0.08841107785701752, 0.03219594433903694, 0.020952915772795677, 0.9962035417556763, 0.09006869792938232, 0.9076153039932251, 0.9927300810813904, 0.9875916838645935, 0.9910625219345093, 0.990225613117218, 0.891280472278595, 0.10728375613689423, 0.043885838240385056, 0.05120014399290085, 0.8996596336364746, 0.38985222578048706, 0.08291633427143097, 0.0029093450866639614, 0.09746305644512177, 0.06109624728560448, 0.12801118195056915, 0.09018969535827637, 0.05091353878378868, 0.06255091726779938, 0.03273013234138489, 0.06610270589590073, 0.11927227675914764, 0.43972671031951904, 0.06538420170545578, 0.14873109757900238, 0.01796269230544567, 0.021555230021476746, 0.05748061463236809, 0.06466569006443024, 0.9846019148826599, 0.016519740223884583, 0.2019079476594925, 0.11013160645961761, 0.6699672937393188, 0.024322209879755974, 0.9450916051864624, 0.003474601311609149, 0.024322209879755974, 0.8505304455757141, 0.10692382603883743, 0.038881391286849976, 0.12049806118011475, 0.047262489795684814, 0.20182360708713531, 0.31721222400665283, 0.054075103253126144, 0.05577825754880905, 0.0672745406627655, 0.03278569132089615, 0.09282182902097702, 0.010644705034792423, 0.970984935760498, 0.025627167895436287, 0.9892431497573853, 0.020421624183654785, 0.04413705691695213, 0.05138343945145607, 0.18708842992782593, 0.24176567792892456, 0.10869573801755905, 0.0955204963684082, 0.11067202687263489, 0.11001326143741608, 0.030961817130446434, 0.030803175643086433, 0.01760181412100792, 0.04400453716516495, 0.8888916373252869, 0.01320136059075594, 0.9939636588096619, 0.9912236332893372, 0.9990959763526917, 0.05654406547546387, 0.9400451183319092, 0.27265825867652893, 0.0039090788923203945, 0.06547707319259644, 0.0732952356338501, 0.01954539492726326, 0.10554513335227966, 0.3586580157279968, 0.02345447428524494, 0.0029318092856556177, 0.0742725059390068, 0.9918825626373291, 0.9930832386016846, 0.9938083291053772, 0.9941292405128479, 0.9872344732284546, 0.9915617108345032, 0.19975487887859344, 0.7990195155143738, 0.9793489575386047, 0.011330295354127884, 0.022660590708255768, 0.022660590708255768, 0.07931207120418549, 0.008497721515595913, 0.7308040857315063, 0.12180067598819733, 0.002832573838531971, 0.00934284646064043, 0.019404372200369835, 0.8940384984016418, 0.070430688560009, 0.005749443545937538, 0.9890683889389038, 0.0846291109919548, 0.0584796667098999, 0.4787725508213043, 0.1374034434556961, 0.0404127761721611, 0.0294775553047657, 0.0342320017516613, 0.0622832216322422, 0.0370846651494503, 0.0370846651494503, 0.005476515740156174, 0.021906062960624695, 0.1341746300458908, 0.6517053842544556, 0.1697719842195511, 0.013691289350390434, 0.9946812987327576, 0.05209195986390114, 0.029964402318000793, 0.4881892502307892, 0.07929041981697083, 0.000460990791907534, 0.02673746645450592, 0.014290714636445045, 0.23879322409629822, 0.06592168658971786, 0.005070898681879044, 0.041801583021879196, 0.8824778199195862, 0.0743139237165451, 0.9888632893562317, 0.012953841127455235, 0.8186827301979065, 0.056996900588274, 0.023316914215683937, 0.08679073303937912, 0.036432038992643356, 0.7522144317626953, 0.2014477401971817, 0.010715305805206299, 0.9897346496582031, 0.9900591373443604, 0.01565597578883171, 0.5387497544288635, 0.17774136364459991, 0.05709826201200485, 0.12893155217170715, 0.03960040584206581, 0.0018418794497847557, 0.04144228622317314, 0.9562177658081055, 0.03464557230472565, 0.9940004348754883, 0.20040783286094666, 0.7981759905815125, 0.9990657567977905, 0.02949688956141472, 0.030480118468403816, 0.9389843344688416, 0.9947848916053772, 0.9926949739456177, 0.05052619054913521, 0.05052619054913521, 0.8625542521476746, 0.03609013557434082, 0.9870107769966125, 0.024646587669849396, 0.10914917290210724, 0.08098164200782776, 0.017604704946279526, 0.746439516544342, 0.007041881792247295, 0.01408376358449459, 0.9993667602539062, 0.029904931783676147, 0.9629387855529785, 0.865506649017334, 0.10981189459562302, 0.023615460842847824, 0.0038583234418183565, 0.9491475820541382, 0.042441558092832565, 0.011400341987609863, 0.2233125865459442, 0.06974326819181442, 0.07644934952259064, 0.004023650195449591, 0.14887505769729614, 0.1978294551372528, 0.06303718686103821, 0.09522638469934464, 0.1099797710776329, 0.9821186661720276, 0.01741345226764679, 0.9934096932411194, 0.9922566413879395, 0.039439857006073, 0.9586918950080872, 0.7953653931617737, 0.0046422104351222515, 0.01005812268704176, 0.1493244469165802, 0.0007737017585895956, 0.01005812268704176, 0.029400667175650597, 0.9974008798599243, 0.9822391867637634, 0.08993218839168549, 0.8993219137191772, 0.982517421245575, 0.0062467665411531925, 0.9911536574363708, 0.9936993718147278, 0.997281014919281, 0.2905958890914917, 0.7078618407249451, 0.3073049783706665, 0.05825990438461304, 0.007682624738663435, 0.08770996332168579, 0.09987412393093109, 0.1280437409877777, 0.15557314455509186, 0.016645686700940132, 0.05313815549015999, 0.08578930795192719, 0.9962541460990906, 0.9895529747009277, 0.03024541400372982, 0.004032721742987633, 0.9295423626899719, 0.0020163608714938164, 0.006049082614481449, 0.02822905220091343, 0.143030047416687, 0.5369619131088257, 0.007990504615008831, 0.0031962019857019186, 0.13184332847595215, 0.093488909304142, 0.018378160893917084, 0.005593353416770697, 0.05753163620829582, 0.0015981009928509593, 0.03587798401713371, 0.05189494043588638, 0.5907053351402283, 0.04164408892393112, 0.0012813565554097295, 0.11147801578044891, 0.05381697416305542, 0.03203391283750534, 0.005125426221638918, 0.0756000354886055, 0.388294517993927, 0.25386178493499756, 0.09002191573381424, 0.15783841907978058, 0.027606720104813576, 0.0024005842860788107, 0.042610373347997665, 0.03660891205072403, 0.9922282099723816, 0.1063678190112114, 0.12472893297672272, 0.034822799265384674, 0.08104214817285538, 0.24059388041496277, 0.09623755514621735, 0.12282950431108475, 0.0930718407034874, 0.07344444841146469, 0.02659195475280285, 0.08148057013750076, 0.08059169352054596, 0.1822201907634735, 0.1339244395494461, 0.1167394369840622, 0.15347976982593536, 0.17629432678222656, 0.018073873594403267, 0.02844412811100483, 0.029036713764071465, 0.9882287383079529, 0.053438350558280945, 0.945015013217926, 0.1160629466176033, 0.09040692448616028, 0.04031660035252571, 0.054977186024188995, 0.04520346224308014, 0.03909488767385483, 0.3750665783882141, 0.02321258932352066, 0.053755469620227814, 0.16126640141010284, 0.057640671730041504, 0.6063355207443237, 0.031037285923957825, 0.024386439472436905, 0.19619998335838318, 0.056532200425863266, 0.011084744706749916, 0.01662711799144745, 0.007938551716506481, 0.9883496165275574, 0.9811052083969116, 0.04756637662649155, 0.2102433741092682, 0.6021903157234192, 0.0038053099997341633, 0.04756637662649155, 0.032345134764909744, 0.004756637383252382, 0.05327434092760086, 0.9910971522331238, 0.995514452457428, 0.016419608145952225, 0.5435311198234558, 0.1498815417289734, 0.06062624603509903, 0.11367420852184296, 0.05473202466964722, 0.009262342937290668, 0.05220593139529228, 0.8968327641487122, 0.10020478069782257, 0.03034295327961445, 0.9659173488616943, 0.005181933753192425, 0.9897493720054626, 0.9962561726570129, 0.9940349459648132, 0.9951643347740173, 0.9922572374343872, 0.12975022196769714, 0.027522772550582886, 0.8374786376953125, 0.10295763611793518, 0.3724643886089325, 0.030281657353043556, 0.07683970779180527, 0.06737668812274933, 0.10901396721601486, 0.06132035702466965, 0.10712136328220367, 0.04996473714709282, 0.022711243480443954, 0.05779813230037689, 0.03639141470193863, 0.002140671480447054, 0.006422014441341162, 0.8948007225990295, 0.004667358472943306, 0.03267151117324829, 0.06534302234649658, 0.8961328268051147, 0.9892205595970154, 0.031489819288253784, 0.02422293648123741, 0.03027867153286934, 0.7981457710266113, 0.027856377884745598, 0.029067525640130043, 0.05934619531035423, 0.0734139233827591, 0.09762490540742874, 0.3139616847038269, 0.13511286675930023, 0.03280196711421013, 0.06560393422842026, 0.001561998389661312, 0.26475873589515686, 0.016400983557105064, 0.9912712574005127, 0.034169621765613556, 0.09111899137496948, 0.8542405366897583, 0.017084810882806778, 0.9909042119979858, 0.08195075392723083, 0.02731691673398018, 0.8850681185722351, 0.9933369159698486, 0.9978326559066772, 0.9879665970802307, 0.008702563121914864, 0.04061196371912956, 0.20596066117286682, 0.74261873960495, 0.9881279468536377, 0.009207873605191708, 0.053712595254182816, 0.8885597586631775, 0.010742519050836563, 0.02915826439857483, 0.007673227693885565, 0.020768892019987106, 0.9553690552711487, 0.023365003988146782, 0.02318766713142395, 0.04289718344807625, 0.03246273472905159, 0.46723151206970215, 0.29448336362838745, 0.06028793379664421, 0.02782520093023777, 0.05101286992430687, 0.8876930475234985, 0.03227974846959114, 0.0792321115732193, 0.009054933674633503, 0.986987829208374, 0.019230911508202553, 0.004807727877050638, 0.9735649228096008, 0.053210411220788956, 0.9459628462791443, 0.9955835938453674, 0.9951725006103516, 0.9991540908813477, 0.9979762434959412, 0.9936963319778442, 0.007695446722209454, 0.9907887578010559, 0.9962958693504333, 0.0020005942787975073, 0.0020005942787975073, 0.7685548663139343, 0.2287604659795761, 0.20653042197227478, 0.7855666279792786, 0.006759177427738905, 0.34749361872673035, 0.034891776740550995, 0.11749272048473358, 0.017089851200580597, 0.17588303983211517, 0.010681157000362873, 0.04486085847020149, 0.18585212528705597, 0.012817388400435448, 0.05340578407049179, 0.996053159236908, 0.9903555512428284, 0.04634469747543335, 0.09325803816318512, 0.14557352662086487, 0.28887245059013367, 0.09695424139499664, 0.0958169475197792, 0.07705160975456238, 0.0958169475197792, 0.03866796940565109, 0.021892894059419632, 0.06008889153599739, 0.06687311828136444, 0.13083872199058533, 0.4409749209880829, 0.256831556558609, 0.04361290484666824, 0.0064284466207027435, 0.9899807572364807, 0.9886947870254517, 0.9950776696205139, 0.9919518828392029, 0.09934293478727341, 0.038046229630708694, 0.1631760448217392, 0.17163076996803284, 0.03381887078285217, 0.05241924896836281, 0.09257915616035461, 0.24434134364128113, 0.02536415308713913, 0.07905161380767822, 0.04936765506863594, 0.9424734115600586, 0.007479947991669178, 0.9844189286231995, 0.05895441398024559, 0.2187705934047699, 0.01633676514029503, 0.11222647875547409, 0.061795592308044434, 0.24718236923217773, 0.026280883699655533, 0.014205883257091045, 0.11293677240610123, 0.13069412112236023, 0.9943311214447021, 0.9966910481452942, 0.1197439506649971, 0.8786845207214355, 0.004850068595260382, 0.9894140362739563, 0.08816782385110855, 0.9062831997871399, 0.004100828897207975, 0.012024443596601486, 0.012024443596601486, 0.0745515525341034, 0.009619555436074734, 0.7070373296737671, 0.007214666344225407, 0.17555688321590424, 0.08572755008935928, 0.08572755008935928, 0.027654048055410385, 0.03318485617637634, 0.7660171389579773, 0.9978319406509399, 0.03353497385978699, 0.8607310652732849, 0.10060492902994156, 0.009947385638952255, 0.988106906414032, 0.9937465786933899, 0.9970183968544006, 0.38660314679145813, 0.25971803069114685, 0.01553021278232336, 0.02296488918364048, 0.0650947168469429, 0.1019376739859581, 0.014208491891622543, 0.05749483034014702, 0.06030348315834999, 0.016025857999920845, 0.07527759671211243, 0.05645819753408432, 0.135157510638237, 0.09580785036087036, 0.06843417882919312, 0.03763879835605621, 0.051325634121894836, 0.04961477965116501, 0.42771363258361816, 0.17850126326084137, 0.3224695920944214, 0.04134225472807884, 0.036964841187000275, 0.04669243097305298, 0.1381317675113678, 0.027723630890250206, 0.11770383268594742, 0.0753888189792633, 0.015077764168381691, 0.002935068216174841, 0.012718629091978073, 0.22795696556568146, 0.15262354910373688, 0.04304766654968262, 0.1330564320087433, 0.4148229658603668, 0.011740272864699364, 0.9925435185432434, 0.9940683841705322, 0.9845766425132751, 0.0067675975151360035, 0.9914530515670776, 0.9901037216186523, 0.021420219913125038, 0.8907241821289062, 0.08746589720249176, 0.013839946128427982, 0.2886617183685303, 0.6959515810012817, 0.9896976351737976, 0.015450194478034973, 0.035816360265016556, 0.02177072875201702, 0.01685475744307041, 0.013343350030481815, 0.23737117648124695, 0.013343350030481815, 0.6468012928962708, 0.3704948127269745, 0.6289325952529907, 0.9970839023590088, 0.9916179776191711, 0.06309525668621063, 0.23160114884376526, 0.09143144637346268, 0.03778158873319626, 0.05516112223267555, 0.10049902647733688, 0.04496009275317192, 0.051760777831077576, 0.1987311691045761, 0.12505705654621124, 0.5733996629714966, 0.11945825815200806, 0.09025734663009644, 0.11680363118648529, 0.0929119810461998, 0.006636569742113352, 0.9917995929718018, 0.782045841217041, 0.031643472611904144, 0.12431364506483078, 0.06102669611573219, 0.11312982439994812, 0.85518479347229, 0.028761819005012512, 0.1125701516866684, 0.05992540344595909, 0.0016801515594124794, 0.18145637214183807, 0.20833879709243774, 0.05376484990119934, 0.18929708003997803, 0.04480404034256935, 0.052084699273109436, 0.09632869064807892, 0.9851973056793213, 0.15788429975509644, 0.6178081631660461, 0.17962199449539185, 0.04461947828531265, 0.052308328449726105, 0.0018681546207517385, 0.0840669572353363, 0.32599297165870667, 0.043901633471250534, 0.4763794243335724, 0.014945236966013908, 0.021588508039712906, 0.053971268236637115, 0.11873678863048553, 0.8041719198226929, 0.08918620645999908, 0.9111455678939819, 0.9924914240837097, 0.9945734143257141, 0.9974730014801025, 0.014665473252534866, 0.12221228331327438, 0.017924467101693153, 0.027701450511813164, 0.23627707362174988, 0.016294971108436584, 0.5654354691505432, 0.09712156653404236, 0.8602195978164673, 0.0369986928999424, 0.05592300370335579, 0.0888008177280426, 0.05991750583052635, 0.4363223612308502, 0.06944285333156586, 0.10846605151891708, 0.01689980924129486, 0.006145385093986988, 0.14288020133972168, 0.015363463200628757, 0.007692718878388405, 0.5173353552818298, 0.2650141716003418, 0.13462257385253906, 0.07038837671279907, 0.005000267177820206, 0.3816435635089874, 0.487569123506546, 0.11059874296188354, 0.0077886441722512245, 0.012461830861866474, 0.9942175149917603, 0.9963088035583496, 0.05934375524520874, 0.025176139548420906, 0.23557673394680023, 0.5916392803192139, 0.05215057358145714, 0.03416761755943298, 0.18870770931243896, 0.0022071078419685364, 0.046349264681339264, 0.04303860291838646, 0.18098284304141998, 0.020967524498701096, 0.5164632201194763, 0.05881141871213913, 0.10455363243818283, 0.2860703468322754, 0.0609896183013916, 0.0762370228767395, 0.007986735552549362, 0.014521338045597076, 0.29115283489227295, 0.07986735552549362, 0.019603805616497993, 0.14538146555423737, 0.03939726948738098, 0.2041999250650406, 0.01609184220433235, 0.0016646733274683356, 0.07657497376203537, 0.0005548911285586655, 0.4916335344314575, 0.024970099329948425, 0.9953145384788513, 0.9900142550468445, 0.9978221654891968, 0.9882532358169556, 0.9908885955810547, 0.04804708808660507, 0.3049945533275604, 0.12394756078720093, 0.12046588957309723, 0.0936570018529892, 0.06649995595216751, 0.07102613151073456, 0.06336645036935806, 0.08495282381772995, 0.022979041561484337, 0.9857718348503113, 0.991929829120636, 0.9904465079307556, 0.9939417243003845, 0.07081771641969681, 0.9247960448265076, 0.05752654746174812, 0.26479777693748474, 0.13217931985855103, 0.19014500081539154, 0.040400322526693344, 0.10363561660051346, 0.04215686023235321, 0.07245710492134094, 0.07553104311227798, 0.020639296621084213, 0.08443208038806915, 0.3670520484447479, 0.031851623207330704, 0.05965859815478325, 0.05915301665663719, 0.11881161481142044, 0.05814185366034508, 0.08999347686767578, 0.10768882185220718, 0.022751159965991974, 0.02230319008231163, 0.9701887369155884, 0.9776880741119385, 0.9889037609100342, 0.2192477583885193, 0.7779079079627991, 0.09415528178215027, 0.9041321277618408, 0.06514911353588104, 0.08344942331314087, 0.1372523456811905, 0.21704170107841492, 0.03806464746594429, 0.1442064642906189, 0.09625963866710663, 0.03660062327980995, 0.1087038516998291, 0.0732012465596199, 0.04354425519704819, 0.0319778136909008, 0.24969910085201263, 0.04966766759753227, 0.20207256078720093, 0.0006803789874538779, 0.0319778136909008, 0.09865495562553406, 0.23337000608444214, 0.05851259455084801, 0.02581452950835228, 0.01173387747257948, 0.854226291179657, 0.002346775494515896, 0.08213713765144348, 0.021120978519320488, 0.9888254404067993, 0.06689516454935074, 0.09981182962656021, 0.13485215604305267, 0.13591398298740387, 0.06583333015441895, 0.006370967719703913, 0.024422042071819305, 0.060524191707372665, 0.3291666507720947, 0.07432795315980911, 0.991152822971344, 0.9976637363433838, 0.9881917238235474, 0.0415508970618248, 0.9556706547737122, 0.14121182262897491, 0.8573575615882874, 0.9959633350372314, 0.37817975878715515, 0.09959379583597183, 0.006086287554353476, 0.07109890133142471, 0.04454055801033974, 0.15022063255310059, 0.05947962775826454, 0.11646940559148788, 0.014662419445812702, 0.05975627526640892, 0.9972384572029114, 0.18402886390686035, 0.0029210930224508047, 0.09347497671842575, 0.049658581614494324, 0.02044765092432499, 0.07886950671672821, 0.5696130990982056, 0.9939109086990356, 0.2841370403766632, 0.05682740733027458, 0.07019855827093124, 0.4679903984069824, 0.09694086760282516, 0.00501418299973011, 0.01838533766567707, 0.9947983026504517, 0.10640466958284378, 0.03546822443604469, 0.03819654881954193, 0.6002314686775208, 0.22099430859088898, 0.9949023723602295, 0.979340136051178, 0.009374642744660378, 0.007030981592833996, 0.20858579874038696, 0.35779884457588196, 0.003124880837276578, 0.019530504941940308, 0.37889179587364197, 0.015624403953552246, 0.9001388549804688, 0.09725118428468704, 0.9928044080734253, 0.9915215373039246, 0.09694231301546097, 0.31304287910461426, 0.07068710029125214, 0.2393263280391693, 0.27870914340019226, 0.9975820779800415, 0.9928552508354187, 0.15090322494506836, 0.8492005467414856, 0.34192684292793274, 0.25229331851005554, 0.001819969853386283, 0.04618173465132713, 0.09463842958211899, 0.06574641168117523, 0.05596407130360603, 0.04049433022737503, 0.06074149161577225, 0.04026683419942856, 0.00978680606931448, 0.09786806255578995, 0.029360417276620865, 0.8220916986465454, 0.03914722427725792, 0.9928327798843384, 0.014372894540429115, 0.12560659646987915, 0.2262168675661087, 0.05811648815870285, 0.07061465829610825, 0.017497437074780464, 0.07561392337083817, 0.01562271174043417, 0.3499487340450287, 0.047493044286966324, 0.11003716289997101, 0.2054027020931244, 0.07580337673425674, 0.03178851306438446, 0.5746384859085083, 0.3218027353286743, 0.6757857799530029, 0.04022909700870514, 0.044463738799095154, 0.029642490670084953, 0.09104479849338531, 0.5356821417808533, 0.15879906713962555, 0.09951408207416534, 0.21030759811401367, 0.7733358144760132, 0.001655965344980359, 0.013247722759842873, 0.9961628913879395, 0.9994528889656067, 0.9940481781959534, 0.9878154397010803, 0.3193429112434387, 0.6789767742156982, 0.17293505370616913, 0.014762748964130878, 0.8098422288894653, 0.07927528023719788, 0.004718767013400793, 0.9126095175743103, 0.0018875066889449954, 0.9899497628211975, 0.009148583747446537, 0.04269339144229889, 0.21549998223781586, 0.07522169500589371, 0.43404948711395264, 0.14231130480766296, 0.05489150434732437, 0.027445752173662186, 0.12140603363513947, 0.029261967167258263, 0.4999438226222992, 0.12700939178466797, 0.03673310950398445, 0.023658612743020058, 0.0678628608584404, 0.04171387106180191, 0.006225950550287962, 0.04544943943619728, 0.9914941787719727, 0.9966549277305603, 0.9308264255523682, 0.06878028064966202, 0.9908043742179871, 0.03596719354391098, 0.9531306028366089, 0.9876322150230408, 0.990831196308136, 0.11258002370595932, 0.885111927986145, 0.9979943037033081, 0.9953410029411316, 0.014253759756684303, 0.9835094213485718, 0.9921932816505432, 0.9887199401855469, 0.02808680571615696, 0.9549513459205627, 0.009362268261611462, 0.012287507764995098, 0.03891044110059738, 0.043006278574466705, 0.13311466574668884, 0.06553337723016739, 0.08806046843528748, 0.5345065593719482, 0.08191671967506409, 0.9892351627349854, 0.0012264200486242771, 0.5175492763519287, 0.32316169142723083, 0.042311493307352066, 0.05212285369634628, 0.005518890451639891, 0.03556618466973305, 0.0042924704030156136, 0.017783092334866524, 0.05752358213067055, 0.8576242923736572, 0.08367066830396652, 0.9361351728439331, 0.06112222746014595, 0.9920821785926819, 0.113490991294384, 0.09021078795194626, 0.6205629110336304, 0.04365038126707077, 0.0065475571900606155, 0.01455012708902359, 0.038557834923267365, 0.06547556817531586, 0.007275063544511795, 0.0005374156753532588, 0.21496626734733582, 0.028483029454946518, 0.7529193162918091, 0.0032244939357042313, 0.05143122002482414, 0.9429057240486145, 0.9488199353218079, 0.04447593539953232, 0.00494177034124732, 0.5825725793838501, 0.09321161359548569, 0.2896218001842499, 0.015535268932580948, 0.018864255398511887, 0.9941855072975159, 0.07540678977966309, 0.09515619277954102, 0.007181599270552397, 0.025135597214102745, 0.5152797698974609, 0.15799517929553986, 0.014363198541104794, 0.021544797345995903, 0.07361139357089996, 0.014363198541104794, 0.9840489625930786, 0.044449977576732635, 0.9260411858558655, 0.02963331714272499, 0.9803271293640137, 0.036795347929000854, 0.08714687824249268, 0.21302570402622223, 0.023239167407155037, 0.07552729547023773, 0.5054518580436707, 0.013556180521845818, 0.04454173520207405, 0.0161642637103796, 0.010776176117360592, 0.9644677639007568, 0.25456756353378296, 0.05604676902294159, 0.09533188492059708, 0.08485585451126099, 0.07542742788791656, 0.0790940374135971, 0.19380658864974976, 0.029856689274311066, 0.056570570915937424, 0.07490362226963043, 0.9937314391136169, 0.2710559070110321, 0.05701915919780731, 0.04785025119781494, 0.04240620881319046, 0.06332278251647949, 0.31919267773628235, 0.004011398181319237, 0.12406681478023529, 0.014326422475278378, 0.05673263221979141, 0.08566314727067947, 0.059305258095264435, 0.024161402136087418, 0.7292349934577942, 0.026357892900705338, 0.013178946450352669, 0.008785963989794254, 0.050519295036792755, 0.9911162257194519, 0.006925193127244711, 0.14658324420452118, 0.027700772508978844, 0.14196646213531494, 0.19736799597740173, 0.08194811642169952, 0.29085808992385864, 0.10618629306554794, 0.9819319248199463, 0.9772378206253052, 0.9975225329399109, 0.9917201995849609, 0.1665320247411728, 0.1619061380624771, 0.025442393496632576, 0.11217781901359558, 0.01619061268866062, 0.011564724147319794, 0.49959608912467957, 0.005782362073659897, 0.9957937598228455, 0.9916776418685913, 0.9888594746589661, 0.9933105707168579, 0.9947336316108704, 0.9945342540740967, 0.2329992949962616, 0.1141112744808197, 0.013268752954900265, 0.05891326069831848, 0.11835727095603943, 0.13640277087688446, 0.05891326069831848, 0.05148275941610336, 0.1480792760848999, 0.067936010658741, 0.9844375848770142, 0.05380403250455856, 0.8496553301811218, 0.017934676259756088, 0.05604586750268936, 0.022418346256017685, 0.0005918670794926584, 0.02959335222840309, 0.1485586315393448, 0.0017756011802703142, 0.8191440105438232, 0.0007285924511961639, 0.08888828009366989, 0.1347896009683609, 0.17486219108104706, 0.1617475301027298, 0.0029143698047846556, 0.11657479405403137, 0.31329476833343506, 0.00655733235180378, 0.2761455476284027, 0.19480666518211365, 0.008133890107274055, 0.15861085057258606, 0.0662912055850029, 0.11224768310785294, 0.06303764879703522, 0.04026275500655174, 0.055717144161462784, 0.025215057656168938, 0.9921115636825562, 0.016401542350649834, 0.21937061846256256, 0.2183455228805542, 0.11891117691993713, 0.06970655173063278, 0.006150578148663044, 0.09225866943597794, 0.2583242654800415, 0.9893926978111267, 0.010924343019723892, 0.02490750327706337, 0.2569405734539032, 0.4173099100589752, 0.03189908340573311, 0.09263843297958374, 0.11973080784082413, 0.027529345825314522, 0.01791592314839363, 0.9878115057945251, 0.9829196333885193, 0.9951297044754028, 0.011210200376808643, 0.25335052609443665, 0.1322803646326065, 0.01793632097542286, 0.051566921174526215, 0.5313634872436523, 0.9887993931770325, 0.11263924837112427, 0.2589200735092163, 0.019223764538764954, 0.10693219304084778, 0.12255150079727173, 0.14748232066631317, 0.10512996464967728, 0.042352356016635895, 0.07779616862535477, 0.0069085401482880116, 0.9897999167442322, 0.9859444499015808, 0.9879947304725647, 0.13968348503112793, 0.12965098023414612, 0.05633643642067909, 0.1337025761604309, 0.14469975233078003, 0.09781703352928162, 0.11267287284135818, 0.0472685843706131, 0.06926294416189194, 0.0690700113773346, 0.010668139904737473, 0.06756488978862762, 0.849895179271698, 0.021336279809474945, 0.04978465288877487, 0.9944585561752319, 0.018542524427175522, 0.002852695994079113, 0.46071040630340576, 0.041364092379808426, 0.4749738872051239, 0.16669614613056183, 0.8296921849250793, 0.9947420358657837, 0.06429172307252884, 0.47368955612182617, 0.013301734812557697, 0.1337563395500183, 0.05172897130250931, 0.08128838241100311, 0.008128838613629341, 0.04951201379299164, 0.06133577972650528, 0.06355273723602295, 0.9842392802238464, 0.10246173292398453, 0.8283525705337524, 0.04906618222594261, 0.002886245958507061, 0.015874352306127548, 0.9982162714004517, 0.9969639778137207, 0.9986324310302734, 0.9921741485595703, 0.03859842196106911, 0.9544336795806885, 0.0035089473240077496, 0.9931648969650269, 0.99313884973526, 0.03596452251076698, 0.014652212150394917, 0.042624618858098984, 0.06393692642450333, 0.033300481736660004, 0.6793298721313477, 0.08391721546649933, 0.045288655906915665, 0.014020097441971302, 0.9720600843429565, 0.009346731007099152, 0.9924536347389221, 0.005523736588656902, 0.9942725300788879, 0.9951942563056946, 0.04679335653781891, 0.8838745355606079, 0.06759040802717209, 0.7121989727020264, 0.1270459145307541, 0.052858516573905945, 0.10664437711238861, 0.9878156185150146, 0.9903208017349243, 0.9929757714271545, 0.9881840348243713, 0.020772220566868782, 0.6825157999992371, 0.29377853870391846, 0.0029674600809812546, 0.9971234798431396, 0.003084203926846385, 0.05119778588414192, 0.5261651873588562, 0.3065698742866516, 0.0018505224725231528, 0.03639360889792442, 0.028374677523970604, 0.04317885637283325, 0.003084203926846385, 0.9957553148269653, 0.9854987263679504, 0.02171097695827484, 0.00542774423956871, 0.9457844495773315, 0.0257817842066288, 0.9875307083129883, 0.00667250482365489, 0.007349025458097458, 0.07349025458097458, 0.012860794551670551, 0.22230802476406097, 0.09553732722997665, 0.014698050916194916, 0.5750612616539001, 0.9939971566200256, 0.003269727574661374, 0.9878903031349182, 0.9933966398239136, 0.9575048089027405, 0.03928224742412567, 0.9776325821876526, 0.01339222677052021, 0.17330770194530487, 0.11415642499923706, 0.09121457487344742, 0.18436400592327118, 0.1000596284866333, 0.14179719984531403, 0.06937836110591888, 0.0420139878988266, 0.05279389023780823, 0.03040485829114914, 0.08410754054784775, 0.021627653390169144, 0.07689832150936127, 0.06728602945804596, 0.747355580329895, 0.3352258801460266, 0.6621745228767395, 0.002759060589596629, 0.040964558720588684, 0.9597410559654236, 0.9989423751831055, 0.013820650056004524, 0.315178245306015, 0.6708071231842041, 0.05501579865813255, 0.14754237234592438, 0.01000287290662527, 0.005001436453312635, 0.7827247977256775, 0.04238295927643776, 0.9505892395973206, 0.012514205649495125, 0.00782137829810381, 0.9776723384857178, 0.9941579699516296, 0.1177714541554451, 0.5513504147529602, 0.10501912981271744, 0.062261343002319336, 0.027004919946193695, 0.04050737991929054, 0.015752868726849556, 0.028505193069577217, 0.015752868726849556, 0.03600655868649483, 0.10179346799850464, 0.06227659061551094, 0.09353993833065033, 0.3176356256008148, 0.2118404507637024, 0.047520291060209274, 0.05627403035759926, 0.05527360364794731, 0.05027146637439728, 0.004001708701252937, 0.22780875861644745, 0.16640575230121613, 0.09737280011177063, 0.15005584061145782, 0.10609275102615356, 0.05122971907258034, 0.08029622584581375, 0.011989934369921684, 0.05340970680117607, 0.054863035678863525, 0.009546658024191856, 0.9880791306495667, 0.9947073459625244, 0.9951348900794983, 0.9956521391868591, 0.9887626767158508, 0.9815458059310913, 0.9880534410476685, 0.13009525835514069, 0.03196198120713234, 0.015481585636734962, 0.038953665643930435, 0.21624279022216797, 0.06367426365613937, 0.24495863914489746, 0.04095128923654556, 0.06791920959949493, 0.14982178807258606, 0.9868786931037903, 0.9906402826309204, 0.9910144209861755], \"Term\": [\"accept\", \"accept\", \"accept\", \"accept\", \"accept\", \"accept\", \"accept\", \"accept\", \"accept\", \"access\", \"access\", \"access\", \"access\", \"access\", \"access\", \"adaptec\", \"address\", \"address\", \"address\", \"address\", \"address\", \"address\", \"address\", \"address\", \"address\", \"address\", \"administr\", \"administr\", \"administr\", \"administr\", \"agenc\", \"agenc\", \"agenc\", \"agenc\", \"agenc\", \"aid\", \"aid\", \"aid\", \"aid\", \"alaska\", \"algorithm\", \"algorithm\", \"alomar\", \"amanda\", \"american\", \"american\", \"american\", \"american\", \"american\", \"american\", \"american\", \"american\", \"andrew\", \"andrew\", \"andrew\", \"andrew\", \"andrew\", \"andrew\", \"andrew\", \"andrew\", \"anonym\", \"anonym\", \"anti\", \"anti\", \"anti\", \"appl\", \"appl\", \"appl\", \"applic\", \"applic\", \"applic\", \"applic\", \"applic\", \"arab\", \"arab\", \"archiv\", \"archiv\", \"archiv\", \"archiv\", \"argic\", \"argument\", \"argument\", \"argument\", \"argument\", \"argument\", \"argument\", \"argument\", \"argument\", \"arm\", \"arm\", \"arm\", \"arm\", \"arm\", \"armenia\", \"armenian\", \"armi\", \"armi\", \"armi\", \"armi\", \"armori\", \"atheism\", \"atheist\", \"atho\", \"attack\", \"attack\", \"attack\", \"attack\", \"attack\", \"attack\", \"aurora\", \"author\", \"author\", \"author\", \"author\", \"author\", \"auto\", \"auto\", \"auto\", \"auto\", \"auto\", \"auto\", \"autom\", \"automot\", \"avail\", \"avail\", \"avail\", \"avail\", \"avail\", \"avail\", \"avail\", \"avail\", \"avail\", \"avail\", \"azerbaijan\", \"azerbaijani\", \"azeri\", \"baalk\", \"baerga\", \"ball\", \"ball\", \"ball\", \"bank\", \"bank\", \"bank\", \"bank\", \"bank\", \"bank\", \"bank\", \"bank\", \"bank\", \"basebal\", \"basebal\", \"bat\", \"batf\", \"batf\", \"batteri\", \"batteri\", \"belief\", \"belief\", \"believ\", \"believ\", \"believ\", \"believ\", \"believ\", \"believ\", \"believ\", \"believ\", \"believ\", \"believ\", \"berkeley\", \"berkeley\", \"berkeley\", \"berkeley\", \"best\", \"best\", \"best\", \"best\", \"best\", \"best\", \"best\", \"best\", \"best\", \"best\", \"better\", \"better\", \"better\", \"better\", \"better\", \"better\", \"better\", \"better\", \"better\", \"better\", \"bibl\", \"biblic\", \"bike\", \"bike\", \"billion\", \"billion\", \"binari\", \"binari\", \"bio\", \"blah\", \"blast\", \"board\", \"board\", \"board\", \"board\", \"board\", \"board\", \"board\", \"board\", \"boni\", \"bontchev\", \"book\", \"book\", \"book\", \"book\", \"book\", \"book\", \"book\", \"book\", \"boyl\", \"brake\", \"brake\", \"brave\", \"brave\", \"bruin\", \"build\", \"build\", \"build\", \"build\", \"build\", \"build\", \"build\", \"build\", \"build\", \"build\", \"buy\", \"buy\", \"buy\", \"buy\", \"buy\", \"byte\", \"byte\", \"byte\", \"cach\", \"cactus\", \"cadr\", \"callison\", \"canada\", \"canada\", \"canada\", \"canada\", \"canada\", \"canada\", \"canada\", \"canada\", \"canada\", \"cancer\", \"cancer\", \"candida\", \"canuck\", \"car\", \"car\", \"card\", \"card\", \"card\", \"card\", \"card\", \"carlo\", \"case\", \"case\", \"case\", \"case\", \"case\", \"case\", \"case\", \"case\", \"case\", \"case\", \"catbyt\", \"catcher\", \"cathol\", \"caus\", \"caus\", \"caus\", \"caus\", \"caus\", \"caus\", \"caus\", \"caus\", \"caus\", \"centerlin\", \"centri\", \"char\", \"chastiti\", \"children\", \"children\", \"children\", \"children\", \"children\", \"children\", \"chip\", \"chip\", \"chip\", \"chopin\", \"christ\", \"christ\", \"christian\", \"christian\", \"church\", \"church\", \"church\", \"cica\", \"cipher\", \"ciphertext\", \"circuit\", \"circuit\", \"circuit\", \"claim\", \"claim\", \"claim\", \"claim\", \"claim\", \"claim\", \"claim\", \"claim\", \"claim\", \"claim\", \"clarkson\", \"classifi\", \"classifi\", \"classifi\", \"classifi\", \"clayton\", \"cleveland\", \"cleveland\", \"cleveland\", \"client\", \"client\", \"clinic\", \"clinic\", \"clinton\", \"clinton\", \"clinton\", \"clinton\", \"clipper\", \"clipper\", \"coach\", \"coach\", \"code\", \"code\", \"code\", \"code\", \"code\", \"code\", \"color\", \"color\", \"color\", \"color\", \"color\", \"color\", \"colorado\", \"colorado\", \"colorado\", \"colorado\", \"colorado\", \"colorado\", \"colorado\", \"colorado\", \"columbia\", \"columbia\", \"columbia\", \"columbia\", \"columbia\", \"come\", \"come\", \"come\", \"come\", \"come\", \"come\", \"come\", \"come\", \"come\", \"come\", \"communic\", \"communic\", \"communic\", \"communic\", \"communic\", \"communic\", \"communic\", \"communic\", \"compil\", \"compil\", \"compil\", \"compil\", \"concordia\", \"config\", \"contradict\", \"contradict\", \"contradict\", \"contrib\", \"control\", \"control\", \"control\", \"control\", \"control\", \"control\", \"control\", \"control\", \"control\", \"copi\", \"copi\", \"copi\", \"copi\", \"copi\", \"copi\", \"copi\", \"copper\", \"cost\", \"cost\", \"cost\", \"cost\", \"cost\", \"cost\", \"cost\", \"cost\", \"counterst\", \"countri\", \"countri\", \"countri\", \"countri\", \"countri\", \"countri\", \"countri\", \"court\", \"court\", \"court\", \"court\", \"cramer\", \"crime\", \"crime\", \"crime\", \"crypt\", \"crypto\", \"cryptograph\", \"cryptographi\", \"ctrl\", \"cub\", \"cunixb\", \"cure\", \"cwru\", \"cwru\", \"data\", \"data\", \"data\", \"data\", \"data\", \"data\", \"data\", \"david\", \"david\", \"david\", \"david\", \"david\", \"david\", \"david\", \"david\", \"david\", \"david\", \"davidian\", \"dealer\", \"dealer\", \"dealer\", \"death\", \"death\", \"death\", \"death\", \"death\", \"death\", \"decrypt\", \"den\", \"desi\", \"design\", \"design\", \"design\", \"design\", \"design\", \"design\", \"design\", \"design\", \"design\", \"deskjet\", \"detroit\", \"devic\", \"devic\", \"devic\", \"devic\", \"diamond\", \"diet\", \"differ\", \"differ\", \"differ\", \"differ\", \"differ\", \"differ\", \"differ\", \"differ\", \"differ\", \"differ\", \"dillon\", \"directori\", \"directori\", \"directori\", \"diseas\", \"disk\", \"disk\", \"disk\", \"display\", \"display\", \"display\", \"display\", \"display\", \"display\", \"display\", \"distribut\", \"distribut\", \"distribut\", \"distribut\", \"distribut\", \"distribut\", \"distribut\", \"distribut\", \"distribut\", \"distribut\", \"divin\", \"divis\", \"divis\", \"divis\", \"divis\", \"divis\", \"divis\", \"divis\", \"divis\", \"divis\", \"dock\", \"doctor\", \"doctor\", \"doctor\", \"doctrin\", \"dodger\", \"drive\", \"drive\", \"drive\", \"drive\", \"drive\", \"drive\", \"drive\", \"drive\", \"driver\", \"driver\", \"driver\", \"driver\", \"driver\", \"dseg\", \"dseg\", \"dtmedin\", \"duke\", \"duke\", \"dyer\", \"earth\", \"earth\", \"earth\", \"earth\", \"earth\", \"earth\", \"edmonton\", \"effect\", \"effect\", \"effect\", \"effect\", \"effect\", \"effect\", \"effect\", \"effect\", \"effect\", \"effect\", \"einstein\", \"eisa\", \"email\", \"email\", \"email\", \"email\", \"email\", \"email\", \"email\", \"email\", \"encrypt\", \"enforc\", \"enforc\", \"enforc\", \"enforc\", \"enforc\", \"engin\", \"engin\", \"engin\", \"engin\", \"engin\", \"engin\", \"engin\", \"engin\", \"engin\", \"engin\", \"engr\", \"entri\", \"entri\", \"entri\", \"ericsson\", \"escrow\", \"esdi\", \"espn\", \"etern\", \"etern\", \"etern\", \"ether\", \"ethernet\", \"ethnic\", \"evid\", \"evid\", \"evid\", \"evid\", \"evid\", \"evid\", \"exist\", \"exist\", \"exist\", \"exist\", \"exist\", \"exist\", \"exist\", \"exist\", \"exist\", \"extermin\", \"faith\", \"faith\", \"fbihh\", \"feder\", \"feder\", \"feder\", \"feder\", \"file\", \"file\", \"file\", \"file\", \"final\", \"final\", \"final\", \"final\", \"final\", \"final\", \"final\", \"final\", \"final\", \"final\", \"firearm\", \"fischer\", \"flight\", \"flight\", \"flight\", \"flight\", \"floppi\", \"floppi\", \"flyer\", \"flyer\", \"fnal\", \"follow\", \"follow\", \"follow\", \"follow\", \"follow\", \"follow\", \"follow\", \"follow\", \"follow\", \"follow\", \"font\", \"font\", \"food\", \"food\", \"food\", \"food\", \"forc\", \"forc\", \"forc\", \"forc\", \"forc\", \"forc\", \"forc\", \"forc\", \"forc\", \"forc\", \"format\", \"format\", \"format\", \"format\", \"format\", \"freenet\", \"freenet\", \"freenet\", \"frost\", \"frost\", \"function\", \"function\", \"function\", \"function\", \"function\", \"function\", \"fund\", \"fund\", \"fund\", \"fund\", \"fund\", \"game\", \"game\", \"game\", \"game\", \"gatech\", \"gaza\", \"genet\", \"genet\", \"genocid\", \"go\", \"go\", \"go\", \"go\", \"go\", \"go\", \"go\", \"go\", \"go\", \"go\", \"goal\", \"goal\", \"goal\", \"goal\", \"goal\", \"goal\", \"god\", \"good\", \"good\", \"good\", \"good\", \"good\", \"good\", \"good\", \"good\", \"good\", \"good\", \"gordon\", \"gordon\", \"gospel\", \"govern\", \"govern\", \"govern\", \"govern\", \"gradi\", \"graphic\", \"graphic\", \"great\", \"great\", \"great\", \"great\", \"great\", \"great\", \"great\", \"great\", \"great\", \"great\", \"greec\", \"greec\", \"greek\", \"greek\", \"greenbelt\", \"grind\", \"grind\", \"grind\", \"grind\", \"grind\", \"grind\", \"grind\", \"group\", \"group\", \"group\", \"group\", \"group\", \"group\", \"group\", \"group\", \"group\", \"group\", \"gtoal\", \"gun\", \"gun\", \"halat\", \"hallam\", \"hamburg\", \"handbook\", \"handgun\", \"handgun\", \"handheld\", \"handheld\", \"handheld\", \"happen\", \"happen\", \"happen\", \"happen\", \"happen\", \"happen\", \"happen\", \"happen\", \"happen\", \"happen\", \"hard\", \"hard\", \"hard\", \"hard\", \"hard\", \"hard\", \"hard\", \"hard\", \"hard\", \"harley\", \"health\", \"health\", \"health\", \"health\", \"heaven\", \"heaven\", \"heaven\", \"heaven\", \"helmet\", \"helmet\", \"helmet\", \"help\", \"help\", \"help\", \"help\", \"help\", \"help\", \"help\", \"help\", \"help\", \"help\", \"henri\", \"henri\", \"higgin\", \"high\", \"high\", \"high\", \"high\", \"high\", \"high\", \"high\", \"high\", \"high\", \"high\", \"hit\", \"hit\", \"hit\", \"hit\", \"hit\", \"hitler\", \"hitter\", \"hockey\", \"holi\", \"holi\", \"home\", \"home\", \"home\", \"home\", \"home\", \"home\", \"home\", \"home\", \"home\", \"home\", \"homeopathi\", \"homicid\", \"honda\", \"hulman\", \"husc\", \"hydro\", \"iastat\", \"iastat\", \"ifa\", \"illinoi\", \"illinoi\", \"illinoi\", \"illinoi\", \"illinoi\", \"illinoi\", \"illinoi\", \"illinoi\", \"imag\", \"imag\", \"imag\", \"imag\", \"imag\", \"imak\", \"includ\", \"includ\", \"includ\", \"includ\", \"includ\", \"includ\", \"includ\", \"includ\", \"includ\", \"includ\", \"indiana\", \"indiana\", \"indiana\", \"indiana\", \"indiana\", \"indiana\", \"infect\", \"inform\", \"inform\", \"inform\", \"inform\", \"inform\", \"inform\", \"inform\", \"inform\", \"inform\", \"inform\", \"ingr\", \"ingr\", \"ingr\", \"inning\", \"instal\", \"instal\", \"instal\", \"instal\", \"instal\", \"insur\", \"insur\", \"insur\", \"insur\", \"intellect\", \"intercon\", \"internet\", \"internet\", \"internet\", \"internet\", \"internet\", \"internet\", \"internet\", \"internet\", \"invest\", \"invest\", \"iran\", \"islam\", \"islam\", \"isra\", \"israel\", \"israel\", \"israel\", \"jaeger\", \"jake\", \"jason\", \"jason\", \"jason\", \"jason\", \"jay\", \"jeff\", \"jeff\", \"jeff\", \"jeff\", \"jeff\", \"jeff\", \"jeff\", \"jesus\", \"jet\", \"jet\", \"jew\", \"jew\", \"jew\", \"job\", \"job\", \"job\", \"john\", \"john\", \"john\", \"john\", \"john\", \"john\", \"john\", \"john\", \"john\", \"john\", \"jumper\", \"jumper\", \"kaldi\", \"kelvin\", \"key\", \"key\", \"kill\", \"kill\", \"kill\", \"kill\", \"kill\", \"kill\", \"kill\", \"koresh\", \"lamp\", \"larc\", \"larc\", \"laughter\", \"launch\", \"launch\", \"laurentian\", \"leaf\", \"leagu\", \"leagu\", \"leav\", \"leav\", \"leav\", \"leav\", \"leav\", \"leav\", \"leav\", \"leav\", \"leav\", \"leav\", \"lebanes\", \"lemieux\", \"librari\", \"librari\", \"librari\", \"librari\", \"librari\", \"librari\", \"life\", \"life\", \"life\", \"life\", \"life\", \"life\", \"life\", \"life\", \"life\", \"life\", \"list\", \"list\", \"list\", \"list\", \"list\", \"list\", \"list\", \"list\", \"list\", \"list\", \"live\", \"live\", \"live\", \"live\", \"live\", \"live\", \"live\", \"live\", \"livesey\", \"long\", \"long\", \"long\", \"long\", \"long\", \"long\", \"long\", \"long\", \"long\", \"long\", \"look\", \"look\", \"look\", \"look\", \"look\", \"look\", \"look\", \"look\", \"look\", \"look\", \"lopez\", \"lord\", \"lord\", \"lose\", \"lose\", \"lose\", \"lose\", \"lose\", \"lose\", \"lose\", \"lose\", \"lose\", \"lose\", \"love\", \"love\", \"love\", \"love\", \"love\", \"love\", \"love\", \"love\", \"lunar\", \"lunar\", \"lyme\", \"machin\", \"machin\", \"machin\", \"machin\", \"machin\", \"machin\", \"machin\", \"machin\", \"magellan\", \"magnus\", \"mail\", \"mail\", \"mail\", \"mail\", \"mail\", \"mail\", \"mail\", \"mail\", \"map\", \"map\", \"mar\", \"mar\", \"marriag\", \"marriag\", \"massacr\", \"maxtor\", \"maynard\", \"mccall\", \"mcgill\", \"mcgill\", \"mcgill\", \"mean\", \"mean\", \"mean\", \"mean\", \"mean\", \"mean\", \"mean\", \"mean\", \"mean\", \"mean\", \"medic\", \"medic\", \"medic\", \"medic\", \"medic\", \"medicin\", \"medicin\", \"medicin\", \"medicin\", \"meg\", \"memori\", \"memori\", \"memori\", \"memori\", \"memori\", \"memori\", \"memori\", \"messag\", \"messag\", \"messag\", \"messag\", \"messag\", \"messag\", \"messag\", \"messag\", \"messag\", \"met\", \"metal\", \"metal\", \"metal\", \"metal\", \"methodolog\", \"midway\", \"midway\", \"midway\", \"migrain\", \"militia\", \"mime\", \"mission\", \"mission\", \"mission\", \"mission\", \"mksol\", \"mode\", \"mode\", \"mode\", \"mode\", \"mode\", \"mode\", \"modem\", \"modem\", \"modem\", \"money\", \"money\", \"money\", \"money\", \"money\", \"money\", \"money\", \"money\", \"monitor\", \"monitor\", \"monitor\", \"montreal\", \"montreal\", \"moon\", \"moon\", \"moon\", \"moral\", \"moral\", \"mormon\", \"motherboard\", \"motif\", \"motorcycl\", \"motto\", \"mous\", \"mous\", \"murder\", \"murder\", \"murder\", \"muslim\", \"muslim\", \"nasa\", \"nasa\", \"nasa\", \"nation\", \"nation\", \"nation\", \"nation\", \"nation\", \"nation\", \"nation\", \"nation\", \"nation\", \"nation\", \"nazi\", \"ncsl\", \"need\", \"need\", \"need\", \"need\", \"need\", \"need\", \"need\", \"need\", \"need\", \"need\", \"netcom\", \"netcom\", \"netcom\", \"netcom\", \"netcom\", \"netcom\", \"nist\", \"nist\", \"nore\", \"nsmca\", \"nubus\", \"number\", \"number\", \"number\", \"number\", \"number\", \"number\", \"number\", \"number\", \"number\", \"number\", \"ohio\", \"ohio\", \"ohio\", \"openwindow\", \"opinion\", \"opinion\", \"opinion\", \"opinion\", \"opinion\", \"opinion\", \"opinion\", \"opinion\", \"opinion\", \"opinion\", \"optilink\", \"oracl\", \"orbit\", \"orbit\", \"outlet\", \"outlet\", \"output\", \"output\", \"output\", \"owner\", \"owner\", \"owner\", \"owner\", \"owner\", \"owner\", \"owner\", \"pain\", \"pain\", \"pain\", \"pain\", \"pain\", \"palestinian\", \"patent\", \"patent\", \"patent\", \"patient\", \"patient\", \"pen\", \"penguin\", \"peopl\", \"peopl\", \"peopl\", \"peopl\", \"peopl\", \"peopl\", \"peopl\", \"peopl\", \"peopl\", \"peopl\", \"period\", \"period\", \"period\", \"period\", \"period\", \"period\", \"period\", \"period\", \"period\", \"person\", \"person\", \"person\", \"person\", \"person\", \"person\", \"person\", \"person\", \"person\", \"person\", \"phone\", \"phone\", \"phone\", \"phone\", \"phone\", \"phone\", \"phone\", \"phone\", \"photographi\", \"physician\", \"pistol\", \"pitch\", \"pitch\", \"pitcher\", \"pitt\", \"pitt\", \"pitt\", \"pittsburgh\", \"pittsburgh\", \"pittsburgh\", \"plaintext\", \"play\", \"play\", \"play\", \"play\", \"play\", \"play\", \"play\", \"play\", \"player\", \"player\", \"playoff\", \"plymouth\", \"point\", \"point\", \"point\", \"point\", \"point\", \"point\", \"point\", \"point\", \"point\", \"point\", \"polit\", \"polit\", \"polit\", \"polit\", \"polit\", \"polit\", \"polygon\", \"popul\", \"popul\", \"popul\", \"popul\", \"port\", \"port\", \"port\", \"power\", \"power\", \"power\", \"power\", \"power\", \"power\", \"power\", \"power\", \"power\", \"power\", \"powerbook\", \"presid\", \"presid\", \"presid\", \"presid\", \"price\", \"price\", \"price\", \"price\", \"price\", \"price\", \"price\", \"princeton\", \"princeton\", \"princeton\", \"princeton\", \"printer\", \"printer\", \"prism\", \"prison\", \"privaci\", \"privat\", \"privat\", \"privat\", \"privat\", \"privat\", \"privat\", \"privat\", \"probe\", \"probe\", \"probe\", \"problem\", \"problem\", \"problem\", \"problem\", \"problem\", \"problem\", \"problem\", \"problem\", \"problem\", \"problem\", \"program\", \"program\", \"program\", \"program\", \"program\", \"program\", \"project\", \"project\", \"project\", \"project\", \"project\", \"propheci\", \"prophet\", \"propos\", \"propos\", \"propos\", \"propos\", \"propos\", \"propos\", \"protect\", \"protect\", \"protect\", \"protect\", \"protect\", \"protect\", \"protect\", \"provid\", \"provid\", \"provid\", \"provid\", \"provid\", \"provid\", \"provid\", \"provid\", \"provid\", \"provid\", \"public\", \"public\", \"public\", \"public\", \"public\", \"public\", \"public\", \"public\", \"public\", \"puck\", \"pyron\", \"quadra\", \"qualcomm\", \"quebec\", \"question\", \"question\", \"question\", \"question\", \"question\", \"question\", \"question\", \"question\", \"question\", \"question\", \"quicktim\", \"raider\", \"ramsey\", \"ranck\", \"ranger\", \"ranger\", \"read\", \"read\", \"read\", \"read\", \"read\", \"read\", \"read\", \"read\", \"read\", \"read\", \"reason\", \"reason\", \"reason\", \"reason\", \"reason\", \"reason\", \"reason\", \"reason\", \"reason\", \"reason\", \"recipi\", \"recipi\", \"redesign\", \"reilli\", \"religi\", \"religi\", \"religion\", \"religion\", \"repli\", \"repli\", \"repli\", \"repli\", \"repli\", \"repli\", \"repli\", \"repli\", \"repli\", \"repli\", \"research\", \"research\", \"research\", \"research\", \"research\", \"research\", \"research\", \"research\", \"research\", \"research\", \"resourc\", \"resourc\", \"resourc\", \"resourc\", \"resourc\", \"resourc\", \"restaur\", \"result\", \"result\", \"result\", \"result\", \"result\", \"result\", \"result\", \"result\", \"result\", \"result\", \"resurrect\", \"revel\", \"revolv\", \"rid\", \"rid\", \"ride\", \"ride\", \"rider\", \"right\", \"right\", \"right\", \"right\", \"right\", \"right\", \"right\", \"right\", \"right\", \"right\", \"ripem\", \"risk\", \"risk\", \"risk\", \"risk\", \"risk\", \"risk\", \"risk\", \"rkba\", \"road\", \"road\", \"road\", \"road\", \"road\", \"road\", \"road\", \"robi\", \"rochest\", \"rochest\", \"rochest\", \"rochest\", \"rochest\", \"rocki\", \"rockwel\", \"run\", \"run\", \"run\", \"run\", \"run\", \"run\", \"run\", \"run\", \"rutger\", \"rutger\", \"rwing\", \"sabbath\", \"sale\", \"sale\", \"sale\", \"sale\", \"sale\", \"sandvik\", \"satan\", \"satellit\", \"satellit\", \"say\", \"say\", \"say\", \"say\", \"say\", \"say\", \"say\", \"say\", \"say\", \"say\", \"scheme\", \"scheme\", \"scheme\", \"scheme\", \"scheme\", \"schneider\", \"scienc\", \"scienc\", \"scienc\", \"scienc\", \"scienc\", \"scienc\", \"scienc\", \"scienc\", \"scienc\", \"scienc\", \"scientif\", \"scientif\", \"scientif\", \"scientif\", \"scientif\", \"score\", \"score\", \"scott\", \"scott\", \"scott\", \"scott\", \"scott\", \"scott\", \"scott\", \"screen\", \"screen\", \"screen\", \"screen\", \"scriptur\", \"scsi\", \"sdpa\", \"sdsu\", \"season\", \"season\", \"secret\", \"secret\", \"secret\", \"secur\", \"secur\", \"secur\", \"secur\", \"selann\", \"sell\", \"sell\", \"sell\", \"sell\", \"sell\", \"sell\", \"sell\", \"sell\", \"send\", \"send\", \"send\", \"send\", \"send\", \"send\", \"send\", \"send\", \"send\", \"send\", \"sera\", \"serdar\", \"server\", \"server\", \"shafer\", \"shaft\", \"shaft\", \"shark\", \"shotgun\", \"shuttl\", \"shuttl\", \"simm\", \"sin\", \"skeptic\", \"skeptic\", \"skndiv\", \"slaughter\", \"sleev\", \"sleev\", \"sleev\", \"smith\", \"smith\", \"smith\", \"smith\", \"smith\", \"smith\", \"smith\", \"smith\", \"smuggl\", \"softwar\", \"softwar\", \"softwar\", \"softwar\", \"softwar\", \"softwar\", \"softwar\", \"softwar\", \"softwar\", \"solar\", \"solar\", \"solar\", \"soldier\", \"soldier\", \"solntz\", \"sourc\", \"sourc\", \"sourc\", \"sourc\", \"sourc\", \"sourc\", \"sourc\", \"sourc\", \"sourc\", \"space\", \"space\", \"space\", \"space\", \"space\", \"spacecraft\", \"spacecraft\", \"spec\", \"spec\", \"spec\", \"speed\", \"speed\", \"speed\", \"speed\", \"speed\", \"spencer\", \"spend\", \"spend\", \"spend\", \"spend\", \"spend\", \"spend\", \"spend\", \"spend\", \"spend\", \"spend\", \"sphere\", \"spirit\", \"spirit\", \"spirit\", \"ssto\", \"stanford\", \"stanford\", \"stanford\", \"stanford\", \"stanford\", \"stanford\", \"stanford\", \"stanford\", \"stanley\", \"stanley\", \"stanley\", \"start\", \"start\", \"start\", \"start\", \"start\", \"start\", \"start\", \"start\", \"start\", \"start\", \"starter\", \"state\", \"state\", \"state\", \"state\", \"state\", \"state\", \"state\", \"state\", \"state\", \"state\", \"station\", \"station\", \"station\", \"station\", \"station\", \"station\", \"station\", \"station\", \"sternlight\", \"steve\", \"steve\", \"steve\", \"steve\", \"steve\", \"steve\", \"steve\", \"steve\", \"steveh\", \"stimulus\", \"stratus\", \"strnlght\", \"studi\", \"studi\", \"studi\", \"studi\", \"studi\", \"studi\", \"studi\", \"studi\", \"suno\", \"superstit\", \"surveil\", \"svga\", \"swap\", \"syndrom\", \"take\", \"take\", \"take\", \"take\", \"take\", \"take\", \"take\", \"take\", \"take\", \"take\", \"tampa\", \"teach\", \"teach\", \"teach\", \"teach\", \"teach\", \"team\", \"team\", \"team\", \"team\", \"team\", \"technolog\", \"technolog\", \"technolog\", \"technolog\", \"technolog\", \"technolog\", \"technolog\", \"technolog\", \"technolog\", \"tell\", \"tell\", \"tell\", \"tell\", \"tell\", \"tell\", \"tell\", \"tell\", \"tell\", \"tell\", \"tennesse\", \"test\", \"test\", \"test\", \"test\", \"test\", \"test\", \"test\", \"test\", \"testament\", \"thank\", \"thank\", \"thank\", \"thank\", \"thank\", \"thank\", \"thank\", \"thank\", \"thank\", \"theist\", \"theodor\", \"theolog\", \"theori\", \"theori\", \"theori\", \"theori\", \"theori\", \"theori\", \"therapi\", \"thing\", \"thing\", \"thing\", \"thing\", \"thing\", \"thing\", \"thing\", \"thing\", \"thing\", \"thing\", \"thomasp\", \"tiff\", \"tiger\", \"time\", \"time\", \"time\", \"time\", \"time\", \"time\", \"time\", \"time\", \"time\", \"time\", \"tire\", \"tire\", \"tire\", \"tire\", \"tire\", \"toolkit\", \"toronto\", \"toronto\", \"toronto\", \"toronto\", \"toronto\", \"treatment\", \"treatment\", \"troop\", \"true\", \"true\", \"true\", \"true\", \"true\", \"true\", \"true\", \"true\", \"true\", \"true\", \"trunk\", \"truth\", \"truth\", \"truth\", \"truth\", \"truth\", \"turk\", \"turkey\", \"turkish\", \"ualberta\", \"uchicago\", \"uchicago\", \"uchicago\", \"ucsc\", \"uicvm\", \"uiuc\", \"uiuc\", \"uiuc\", \"uiuc\", \"uiuc\", \"uiuc\", \"uiuc\", \"uiuc\", \"umich\", \"umich\", \"umich\", \"uoknor\", \"upgrad\", \"upgrad\", \"urartu\", \"urbana\", \"urbana\", \"urbana\", \"user\", \"user\", \"user\", \"user\", \"utah\", \"utkvm\", \"uvic\", \"veal\", \"vehicl\", \"vehicl\", \"vehicl\", \"vehicl\", \"vers\", \"version\", \"version\", \"version\", \"version\", \"version\", \"version\", \"version\", \"version\", \"version\", \"vesa\", \"vesselin\", \"video\", \"video\", \"video\", \"video\", \"villag\", \"villag\", \"virginia\", \"virginia\", \"virginia\", \"virginia\", \"virginia\", \"virginia\", \"virginia\", \"visual\", \"visual\", \"volt\", \"vram\", \"waco\", \"waco\", \"wagon\", \"wagon\", \"want\", \"want\", \"want\", \"want\", \"want\", \"want\", \"want\", \"want\", \"want\", \"want\", \"water\", \"water\", \"water\", \"water\", \"water\", \"weapon\", \"weapon\", \"weapon\", \"wheel\", \"wheel\", \"widget\", \"window\", \"window\", \"window\", \"wing\", \"wing\", \"wing\", \"wing\", \"wing\", \"winnipeg\", \"winnipeg\", \"wire\", \"wire\", \"wire\", \"wiretap\", \"word\", \"word\", \"word\", \"word\", \"word\", \"word\", \"word\", \"word\", \"word\", \"word\", \"work\", \"work\", \"work\", \"work\", \"work\", \"work\", \"work\", \"work\", \"work\", \"work\", \"world\", \"world\", \"world\", \"world\", \"world\", \"world\", \"world\", \"world\", \"world\", \"world\", \"worship\", \"worship\", \"xlib\", \"xpert\", \"xterm\", \"xview\", \"yamaha\", \"yanke\", \"year\", \"year\", \"year\", \"year\", \"year\", \"year\", \"year\", \"year\", \"year\", \"year\", \"yeast\", \"zoolog\", \"zuma\"]}, \"R\": 30, \"lambda.step\": 0.01, \"plot.opts\": {\"xlab\": \"PC1\", \"ylab\": \"PC2\"}, \"topic.order\": [3, 1, 8, 9, 2, 4, 7, 10, 5, 6]};\n", + "var ldavis_el155871124265505206097197808_data = {\"mdsDat\": {\"x\": [-0.07866945427665124, -0.01699948489792914, 0.20896689238873523, 0.14744605031212607, -0.008849073212760983, -0.04505413872814077, -0.08949897686453376, 0.10780299734830809, 0.004524270451044093, -0.22966908252019716], \"y\": [-0.15170611822961017, -0.1504468301902949, 0.08013685816591506, 0.13647834612774523, -0.009046128981188077, 0.003906923765221535, 0.14472746444813225, -0.07737607739594787, -0.1051004751701791, 0.1284260374602061], \"topics\": [1, 2, 3, 4, 5, 6, 7, 8, 9, 10], \"cluster\": [1, 1, 1, 1, 1, 1, 1, 1, 1, 1], \"Freq\": [13.182523727416992, 12.927214622497559, 12.466279029846191, 11.995635986328125, 9.558399200439453, 9.468915939331055, 8.925769805908203, 7.879937648773193, 7.025284290313721, 6.570040225982666]}, \"tinfo\": {\"Category\": [\"Default\", \"Default\", \"Default\", \"Default\", \"Default\", \"Default\", \"Default\", \"Default\", \"Default\", \"Default\", \"Default\", \"Default\", \"Default\", \"Default\", \"Default\", \"Default\", \"Default\", \"Default\", \"Default\", \"Default\", \"Default\", \"Default\", \"Default\", \"Default\", \"Default\", \"Default\", \"Default\", \"Default\", \"Default\", \"Default\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\"], \"Freq\": [2966.0, 1940.0, 1924.0, 1689.0, 2638.0, 2884.0, 1860.0, 1161.0, 1997.0, 1477.0, 1274.0, 1016.0, 1577.0, 1423.0, 1059.0, 1331.0, 1142.0, 2600.0, 837.0, 1391.0, 6052.0, 742.0, 990.0, 784.0, 1802.0, 1023.0, 4004.0, 867.0, 1190.0, 747.0, 1142.055419921875, 698.05224609375, 406.822998046875, 375.2376708984375, 365.2073059082031, 324.9424743652344, 317.34478759765625, 293.7341003417969, 242.91107177734375, 242.62696838378906, 238.57559204101562, 222.68405151367188, 219.24844360351562, 497.5247802734375, 182.90701293945312, 189.09542846679688, 180.7755584716797, 167.61598205566406, 170.0655975341797, 162.4678955078125, 156.04269409179688, 152.99169921875, 147.42819213867188, 144.9635009765625, 144.00869750976562, 142.5484161376953, 140.01553344726562, 137.27061462402344, 111.63611602783203, 111.36160278320312, 296.4661560058594, 234.76409912109375, 534.499755859375, 227.33987426757812, 733.429931640625, 290.58575439453125, 1027.8203125, 194.5054931640625, 462.2497863769531, 638.7841186523438, 383.043212890625, 557.0750732421875, 270.9018249511719, 346.3732604980469, 2339.71875, 353.4012145996094, 956.245849609375, 1366.771240234375, 489.0573425292969, 1502.895751953125, 432.2204284667969, 423.6861267089844, 946.194091796875, 647.374267578125, 868.9714965820312, 843.220458984375, 679.2152099609375, 536.1279907226562, 452.23583984375, 627.34814453125, 723.7843017578125, 487.5303955078125, 627.2381591796875, 480.2864074707031, 485.9241027832031, 520.5202026367188, 439.0645751953125, 1273.9940185546875, 843.2352905273438, 687.68017578125, 378.1650390625, 599.6139526367188, 284.2032165527344, 264.94561767578125, 257.7326354980469, 233.39744567871094, 198.56727600097656, 196.57557678222656, 186.44007873535156, 185.79148864746094, 190.49740600585938, 160.6958770751953, 157.22314453125, 147.5255126953125, 143.9540557861328, 141.30377197265625, 132.96551513671875, 132.7198944091797, 136.27581787109375, 134.09678649902344, 122.40459442138672, 117.67374420166016, 110.74125671386719, 103.36602783203125, 103.82383728027344, 102.62226867675781, 191.18621826171875, 1897.701904296875, 734.26708984375, 595.4009399414062, 628.1726684570312, 206.8068084716797, 246.9746551513672, 800.2630004882812, 749.1760864257812, 336.1791687011719, 271.76513671875, 265.7337646484375, 398.0518493652344, 574.373046875, 250.1859588623047, 378.887451171875, 461.79827880859375, 1507.2969970703125, 256.8887939453125, 577.1434936523438, 989.2410888671875, 369.3199768066406, 600.9796142578125, 735.3451538085938, 547.3312377929688, 671.5762939453125, 658.3866577148438, 983.743896484375, 1571.6390380859375, 640.6453247070312, 527.5475463867188, 1109.1285400390625, 876.5189208984375, 725.872802734375, 862.2279052734375, 662.5578002929688, 745.310791015625, 665.8807373046875, 603.2730102539062, 672.1204833984375, 613.4678344726562, 579.8084716796875, 513.6640625, 478.726806640625, 261.3017272949219, 304.5247802734375, 182.1022186279297, 164.4860076904297, 158.4976806640625, 152.06784057617188, 137.89913940429688, 135.18289184570312, 117.30463409423828, 101.55142974853516, 100.56641387939453, 94.58324432373047, 94.09687042236328, 92.84982299804688, 88.5089340209961, 85.08229064941406, 77.89446258544922, 76.2107925415039, 74.78726196289062, 76.93608856201172, 66.28611755371094, 65.85179901123047, 62.60702896118164, 61.64711380004883, 56.684181213378906, 56.66085433959961, 56.48657989501953, 56.25629425048828, 433.47705078125, 57.65424346923828, 175.3953399658203, 811.90380859375, 352.3983459472656, 460.9333190917969, 1244.6767578125, 397.8313903808594, 319.14727783203125, 364.238525390625, 817.3678588867188, 179.156005859375, 759.4703979492188, 353.9140319824219, 768.052490234375, 704.2166748046875, 1031.30419921875, 338.80908203125, 853.342041015625, 1558.97509765625, 1291.6134033203125, 922.5968627929688, 1345.8406982421875, 471.89697265625, 490.1734313964844, 677.6243896484375, 1059.35986328125, 853.4227294921875, 843.9307861328125, 1006.844482421875, 803.6572265625, 784.7794799804688, 584.8036499023438, 572.954345703125, 507.81884765625, 935.0308227539062, 496.60784912109375, 583.3577880859375, 624.0257568359375, 588.1732788085938, 615.0451049804688, 528.2354736328125, 511.3616638183594, 511.8392028808594, 866.5529174804688, 316.7214050292969, 249.29296875, 229.89987182617188, 228.7329864501953, 211.54818725585938, 183.02696228027344, 166.189453125, 164.78927612304688, 155.5567626953125, 157.8963623046875, 359.6830749511719, 133.46484375, 124.17033386230469, 122.31136322021484, 117.03580474853516, 111.2578125, 110.83413696289062, 109.16254425048828, 103.20903778076172, 98.91317749023438, 514.7620239257812, 89.62692260742188, 82.74740600585938, 81.7151107788086, 103.24954986572266, 75.25740814208984, 75.21385955810547, 70.78356170654297, 69.34468078613281, 281.7769775390625, 311.1161804199219, 971.2522583007812, 208.0157012939453, 697.12548828125, 367.600830078125, 1416.2847900390625, 441.63238525390625, 604.5270385742188, 578.8829345703125, 377.5157165527344, 192.00230407714844, 648.326171875, 1969.8695068359375, 938.555908203125, 446.4116516113281, 632.3428955078125, 658.61083984375, 1989.8314208984375, 746.812744140625, 677.7919311523438, 282.146728515625, 467.3158264160156, 480.80426025390625, 1419.9505615234375, 633.121826171875, 1121.5931396484375, 955.2892456054688, 821.8540649414062, 1269.9755859375, 524.888427734375, 1015.9006958007812, 611.8128662109375, 745.4096069335938, 688.5107421875, 667.1905517578125, 692.5095825195312, 593.0684814453125, 527.0250244140625, 546.2423095703125, 266.114990234375, 171.07672119140625, 155.59559631347656, 226.86813354492188, 131.54354858398438, 110.63026428222656, 109.70304107666016, 476.1914367675781, 123.78545379638672, 96.52113342285156, 90.68626403808594, 86.90491485595703, 84.74632263183594, 84.66790008544922, 83.12593078613281, 249.02166748046875, 73.43721008300781, 70.66108703613281, 70.30034637451172, 68.83010864257812, 66.70625305175781, 65.87735748291016, 60.60390853881836, 60.28896713256836, 59.591712951660156, 59.43132019042969, 59.13471603393555, 58.30850601196289, 57.81100082397461, 57.412742614746094, 405.0126037597656, 341.4114074707031, 190.88427734375, 246.2154541015625, 163.5002899169922, 257.431884765625, 138.4030303955078, 165.07150268554688, 520.9752197265625, 1046.2001953125, 1400.7467041015625, 228.14353942871094, 286.6177673339844, 343.2210388183594, 185.7271728515625, 229.62884521484375, 175.0425262451172, 332.4382019042969, 163.80191040039062, 539.6254272460938, 256.20074462890625, 439.7074890136719, 517.5069580078125, 403.4648742675781, 229.6062774658203, 866.2342529296875, 846.6046142578125, 313.1013488769531, 322.7994079589844, 286.8825988769531, 653.3096923828125, 749.8143310546875, 426.5758361816406, 379.9896240234375, 366.7738037109375, 372.0238037109375, 408.4358825683594, 415.59478759765625, 394.1047668457031, 394.35479736328125, 349.4744567871094, 362.33544921875, 340.7461853027344, 296.1064453125, 297.4900817871094, 494.6859130859375, 745.9567260742188, 324.6907043457031, 301.4524230957031, 243.7508087158203, 158.0762481689453, 107.37081909179688, 95.01962280273438, 99.3011474609375, 90.9953842163086, 88.63602447509766, 79.32609558105469, 77.81234741210938, 76.28094482421875, 74.5477523803711, 68.68788146972656, 66.95661163330078, 65.4609603881836, 64.79485321044922, 62.89779281616211, 62.08255386352539, 61.0522575378418, 61.06364059448242, 58.69823455810547, 57.730560302734375, 57.52555847167969, 57.3940315246582, 53.519378662109375, 53.08652114868164, 81.0350341796875, 466.36419677734375, 629.7886352539062, 272.4364318847656, 229.78268432617188, 524.4359130859375, 169.08595275878906, 106.43968963623047, 468.24310302734375, 321.1138000488281, 72.86544799804688, 215.64964294433594, 420.10101318359375, 254.942626953125, 238.94778442382812, 170.3827667236328, 161.82569885253906, 350.83050537109375, 510.26483154296875, 280.41705322265625, 480.01007080078125, 199.6502227783203, 294.41473388671875, 258.04718017578125, 376.5404357910156, 509.953857421875, 1114.255615234375, 256.1049499511719, 426.6167297363281, 319.6080017089844, 739.0460815429688, 280.2945861816406, 489.26593017578125, 542.7006225585938, 517.6249389648438, 617.398193359375, 513.2488403320312, 436.5852355957031, 491.0060729980469, 506.6981201171875, 460.2760925292969, 441.2689514160156, 394.2432861328125, 351.3202209472656, 347.7408447265625, 353.126953125, 336.9276428222656, 274.96478271484375, 206.24520874023438, 205.8778839111328, 185.45875549316406, 142.32308959960938, 138.44577026367188, 125.2013931274414, 124.9319839477539, 113.29893493652344, 111.32070922851562, 109.3732681274414, 105.69730377197266, 106.31715393066406, 292.8519592285156, 101.5099105834961, 98.15204620361328, 98.07687377929688, 96.68441009521484, 95.22706604003906, 93.90098571777344, 90.92635345458984, 90.10281372070312, 204.0241241455078, 83.50175476074219, 83.1670913696289, 82.08647155761719, 80.05599975585938, 80.02828979492188, 78.9681167602539, 77.46800231933594, 624.7637329101562, 218.5225372314453, 299.7414245605469, 218.29824829101562, 189.66014099121094, 356.5953674316406, 202.443603515625, 416.9382019042969, 238.60166931152344, 212.23965454101562, 149.82025146484375, 211.91717529296875, 303.8674621582031, 120.30265808105469, 237.61758422851562, 454.83984375, 333.9742431640625, 980.4507446289062, 485.376220703125, 911.305419921875, 590.20458984375, 261.1830139160156, 253.10174560546875, 366.5967712402344, 366.9039306640625, 261.41119384765625, 595.3799438476562, 533.9219970703125, 533.9361572265625, 583.4500732421875, 307.1800842285156, 439.3072814941406, 370.0991516113281, 337.719970703125, 344.1241149902344, 325.0099182128906, 340.11822509765625, 337.7254638671875, 350.0095520019531, 294.60064697265625, 276.2853698730469, 278.6145324707031, 1160.58984375, 424.50238037109375, 361.8892517089844, 388.7125244140625, 255.1268768310547, 223.3338623046875, 186.762939453125, 150.89361572265625, 148.3457489013672, 142.3264923095703, 778.56103515625, 125.92803955078125, 122.35221099853516, 113.48704528808594, 110.97245025634766, 117.078857421875, 97.76728820800781, 95.12934875488281, 153.9966278076172, 85.8322525024414, 85.79349517822266, 83.88031005859375, 83.049072265625, 81.00745391845703, 86.68553161621094, 72.2030258178711, 70.9286117553711, 66.03843688964844, 65.31908416748047, 61.585960388183594, 631.8247680664062, 967.0392456054688, 392.36920166015625, 86.89588165283203, 116.68437957763672, 384.3710632324219, 954.7767944335938, 325.4287414550781, 153.96957397460938, 168.00067138671875, 885.979736328125, 877.2123413085938, 327.0912780761719, 468.21343994140625, 329.3387451171875, 302.2326965332031, 346.50006103515625, 350.1670227050781, 277.64501953125, 424.3413391113281, 266.8286437988281, 331.93865966796875, 578.1422729492188, 328.27899169921875, 429.783447265625, 517.3900756835938, 400.8196716308594, 346.1986083984375, 433.2355041503906, 421.3186950683594, 338.8460693359375, 347.48797607421875, 348.34832763671875, 336.5150451660156, 398.3799743652344, 299.8478088378906, 164.65841674804688, 151.2684783935547, 134.80027770996094, 134.81512451171875, 128.8002166748047, 120.19515991210938, 119.80908966064453, 103.69074249267578, 93.05683135986328, 105.7276840209961, 91.12390899658203, 88.88589477539062, 86.48591613769531, 83.19534301757812, 82.55879974365234, 76.6402587890625, 73.9295425415039, 137.460205078125, 73.58722686767578, 73.4345474243164, 297.82000732421875, 71.52425384521484, 71.52425384521484, 71.37834930419922, 68.60929870605469, 70.64924621582031, 67.04999542236328, 64.62285614013672, 137.5844268798828, 329.9851989746094, 498.69488525390625, 418.2344665527344, 321.6512145996094, 192.27369689941406, 436.75238037109375, 120.4453125, 101.72257995605469, 189.66383361816406, 107.88653564453125, 180.29656982421875, 406.5184020996094, 219.2642059326172, 311.06512451171875, 276.8393859863281, 364.6037902832031, 122.6226577758789, 431.5712890625, 148.89491271972656, 478.09197998046875, 448.48828125, 560.1773681640625, 235.3953399658203, 220.0911102294922, 236.9821014404297, 525.9251708984375, 310.51556396484375, 195.2233428955078, 465.06982421875, 342.7114562988281, 343.9149475097656, 252.50462341308594, 252.32774353027344, 359.384033203125, 365.0752868652344, 297.08123779296875, 278.8789978027344, 264.2633056640625, 271.80364990234375, 267.00006103515625, 258.7322692871094, 836.8089599609375, 741.7046508789062, 348.0799560546875, 262.6398620605469, 234.7030792236328, 225.68736267089844, 214.62384033203125, 197.19635009765625, 176.1823272705078, 163.71646118164062, 159.67762756347656, 156.5457305908203, 155.54039001464844, 147.15855407714844, 143.77687072753906, 151.9088592529297, 140.539794921875, 133.0351104736328, 131.78204345703125, 122.36679077148438, 118.65074920654297, 115.62535095214844, 112.39591979980469, 112.21659088134766, 111.78970336914062, 119.10252380371094, 102.06414031982422, 93.4384765625, 92.23306274414062, 89.7177963256836, 218.4290313720703, 151.79112243652344, 955.3695678710938, 178.93502807617188, 1384.0147705078125, 160.96975708007812, 191.55270385742188, 221.74310302734375, 157.2467803955078, 1290.6207275390625, 920.702392578125, 312.78350830078125, 623.0559692382812, 397.7104187011719, 455.4053039550781, 379.91558837890625, 351.7355041503906, 356.9503479003906, 374.8177490234375, 212.80392456054688, 346.6185607910156, 312.7834777832031, 333.1203918457031, 336.03326416015625, 600.264892578125, 295.4298400878906, 283.64044189453125, 250.129150390625, 267.2162780761719, 330.6562194824219, 357.99395751953125, 262.14569091796875, 242.08404541015625], \"Term\": [\"window\", \"game\", \"christian\", \"team\", \"drive\", \"file\", \"space\", \"encrypt\", \"govern\", \"chip\", \"jesus\", \"israel\", \"card\", \"play\", \"secur\", \"nasa\", \"armenian\", \"program\", \"isra\", \"imag\", \"peopl\", \"hockey\", \"player\", \"clipper\", \"public\", \"disk\", \"year\", \"scsi\", \"driver\", \"bike\", \"armenian\", \"turkish\", \"turk\", \"turkey\", \"armenia\", \"koresh\", \"nazi\", \"militia\", \"serdar\", \"argic\", \"genocid\", \"davidian\", \"troop\", \"murder\", \"mormon\", \"prison\", \"massacr\", \"azeri\", \"ethnic\", \"azerbaijani\", \"hitler\", \"iran\", \"zuma\", \"sdpa\", \"motto\", \"azerbaijan\", \"extermin\", \"sera\", \"urartu\", \"slaughter\", \"villag\", \"batf\", \"greek\", \"greec\", \"jew\", \"soldier\", \"kill\", \"waco\", \"arm\", \"countri\", \"muslim\", \"children\", \"armi\", \"popul\", \"peopl\", \"anti\", \"govern\", \"right\", \"attack\", \"say\", \"polit\", \"death\", \"state\", \"live\", \"go\", \"come\", \"tell\", \"happen\", \"forc\", \"world\", \"time\", \"nation\", \"want\", \"leav\", \"start\", \"year\", \"take\", \"jesus\", \"bibl\", \"atheist\", \"atheism\", \"christ\", \"scriptur\", \"cathol\", \"sandvik\", \"doctrin\", \"revel\", \"biblic\", \"satan\", \"atho\", \"livesey\", \"prophet\", \"divin\", \"vers\", \"gospel\", \"sabbath\", \"god\", \"sin\", \"resurrect\", \"solntz\", \"testament\", \"theolog\", \"propheci\", \"theist\", \"schneider\", \"jaeger\", \"marriag\", \"christian\", \"church\", \"belief\", \"faith\", \"worship\", \"contradict\", \"moral\", \"religion\", \"lord\", \"heaven\", \"holi\", \"rutger\", \"truth\", \"spirit\", \"teach\", \"islam\", \"believ\", \"etern\", \"argument\", \"exist\", \"religi\", \"evid\", \"word\", \"love\", \"life\", \"claim\", \"mean\", \"peopl\", \"true\", \"accept\", \"say\", \"question\", \"reason\", \"thing\", \"person\", \"come\", \"good\", \"read\", \"time\", \"point\", \"follow\", \"motif\", \"widget\", \"xterm\", \"visual\", \"xlib\", \"polygon\", \"baalk\", \"contrib\", \"toolkit\", \"kelvin\", \"pyron\", \"suno\", \"deskjet\", \"xpert\", \"plaintext\", \"skndiv\", \"openwindow\", \"xview\", \"ether\", \"quicktim\", \"magellan\", \"utah\", \"greenbelt\", \"reilli\", \"ualberta\", \"copper\", \"ciphertext\", \"autom\", \"gradi\", \"dillon\", \"font\", \"handbook\", \"binari\", \"server\", \"client\", \"librari\", \"imag\", \"anonym\", \"compil\", \"resourc\", \"graphic\", \"map\", \"applic\", \"archiv\", \"user\", \"code\", \"avail\", \"directori\", \"sourc\", \"file\", \"mail\", \"list\", \"program\", \"function\", \"format\", \"email\", \"inform\", \"version\", \"softwar\", \"includ\", \"send\", \"data\", \"internet\", \"address\", \"display\", \"window\", \"copi\", \"access\", \"distribut\", \"thank\", \"look\", \"book\", \"group\", \"need\", \"scsi\", \"simm\", \"motherboard\", \"cach\", \"bio\", \"quadra\", \"diamond\", \"vram\", \"vesa\", \"centri\", \"swap\", \"upgrad\", \"char\", \"eisa\", \"intercon\", \"nubus\", \"ethernet\", \"svga\", \"amanda\", \"meg\", \"cadr\", \"mous\", \"maxtor\", \"config\", \"cica\", \"tiff\", \"adaptec\", \"powerbook\", \"ctrl\", \"esdi\", \"jumper\", \"floppi\", \"disk\", \"umich\", \"video\", \"modem\", \"card\", \"output\", \"monitor\", \"mode\", \"printer\", \"spec\", \"entri\", \"drive\", \"driver\", \"port\", \"instal\", \"memori\", \"window\", \"color\", \"appl\", \"byte\", \"screen\", \"board\", \"problem\", \"machin\", \"file\", \"thank\", \"control\", \"work\", \"speed\", \"need\", \"hard\", \"help\", \"program\", \"want\", \"time\", \"repli\", \"softwar\", \"distribut\", \"alaska\", \"spencer\", \"oracl\", \"dseg\", \"aurora\", \"nsmca\", \"engr\", \"launch\", \"uoknor\", \"callison\", \"kaldi\", \"zoolog\", \"mccall\", \"ucsc\", \"hallam\", \"lunar\", \"automot\", \"raider\", \"theodor\", \"dock\", \"shafer\", \"mksol\", \"hydro\", \"ssto\", \"plymouth\", \"redesign\", \"laughter\", \"rockwel\", \"desi\", \"stimulus\", \"moon\", \"henri\", \"mar\", \"job\", \"wheel\", \"billion\", \"invest\", \"spacecraft\", \"orbit\", \"nasa\", \"space\", \"shuttl\", \"satellit\", \"fund\", \"probe\", \"flight\", \"helmet\", \"station\", \"solar\", \"presid\", \"mission\", \"earth\", \"cost\", \"money\", \"vehicl\", \"year\", \"work\", \"project\", \"toronto\", \"spend\", \"go\", \"time\", \"engin\", \"long\", \"high\", \"power\", \"thing\", \"say\", \"look\", \"peopl\", \"program\", \"want\", \"need\", \"design\", \"build\", \"firearm\", \"bike\", \"motorcycl\", \"magnus\", \"rider\", \"honda\", \"veal\", \"utkvm\", \"centerlin\", \"cactus\", \"rkba\", \"harley\", \"shotgun\", \"pistol\", \"ranck\", \"boyl\", \"husc\", \"ifa\", \"smuggl\", \"fischer\", \"counterst\", \"armori\", \"trunk\", \"thomasp\", \"imak\", \"photographi\", \"concordia\", \"tennesse\", \"yamaha\", \"frost\", \"car\", \"ohio\", \"uchicago\", \"rid\", \"gun\", \"brake\", \"shaft\", \"cwru\", \"auto\", \"wagon\", \"handgun\", \"cleveland\", \"ride\", \"tire\", \"urbana\", \"midway\", \"insur\", \"uiuc\", \"dealer\", \"weapon\", \"iastat\", \"owner\", \"illinoi\", \"crime\", \"price\", \"state\", \"freenet\", \"sell\", \"buy\", \"good\", \"road\", \"drive\", \"right\", \"look\", \"peopl\", \"want\", \"case\", \"thing\", \"time\", \"go\", \"distribut\", \"repli\", \"engin\", \"opinion\", \"problem\", \"need\", \"gatech\", \"cub\", \"fnal\", \"prism\", \"hitter\", \"pitcher\", \"alomar\", \"uicvm\", \"higgin\", \"inning\", \"revolv\", \"hulman\", \"yanke\", \"pitch\", \"catcher\", \"dodger\", \"blast\", \"starter\", \"tiger\", \"met\", \"bat\", \"nore\", \"outlet\", \"rocki\", \"jay\", \"sdsu\", \"volt\", \"lopez\", \"restaur\", \"lamp\", \"wire\", \"duke\", \"circuit\", \"batteri\", \"brave\", \"basebal\", \"hit\", \"berkeley\", \"jason\", \"ball\", \"metal\", \"jeff\", \"grind\", \"larc\", \"indiana\", \"netcom\", \"colorado\", \"year\", \"run\", \"good\", \"game\", \"smith\", \"scott\", \"player\", \"home\", \"stanford\", \"look\", \"distribut\", \"go\", \"time\", \"lose\", \"come\", \"start\", \"play\", \"david\", \"best\", \"better\", \"power\", \"thing\", \"john\", \"sale\", \"great\", \"encrypt\", \"escrow\", \"privaci\", \"ripem\", \"crypto\", \"wiretap\", \"cryptographi\", \"cipher\", \"decrypt\", \"hamburg\", \"clipper\", \"homicid\", \"bontchev\", \"gtoal\", \"crypt\", \"clarkson\", \"rwing\", \"surveil\", \"nist\", \"sternlight\", \"den\", \"ncsl\", \"qualcomm\", \"fbihh\", \"cryptograph\", \"tampa\", \"mime\", \"vesselin\", \"lyme\", \"strnlght\", \"key\", \"secur\", \"enforc\", \"recipi\", \"classifi\", \"secret\", \"chip\", \"agenc\", \"patent\", \"scheme\", \"public\", \"govern\", \"algorithm\", \"protect\", \"propos\", \"administr\", \"privat\", \"clinton\", \"feder\", \"phone\", \"court\", \"devic\", \"number\", \"communic\", \"technolog\", \"inform\", \"provid\", \"author\", \"state\", \"right\", \"messag\", \"data\", \"peopl\", \"need\", \"diseas\", \"stratus\", \"dyer\", \"diet\", \"robi\", \"infect\", \"syndrom\", \"methodolog\", \"physician\", \"cure\", \"intellect\", \"einstein\", \"chopin\", \"candida\", \"sphere\", \"yeast\", \"chastiti\", \"halat\", \"therapi\", \"clinic\", \"migrain\", \"steveh\", \"patient\", \"catbyt\", \"dtmedin\", \"blah\", \"carlo\", \"superstit\", \"baerga\", \"homeopathi\", \"skeptic\", \"gordon\", \"pitt\", \"medic\", \"doctor\", \"medicin\", \"food\", \"cancer\", \"sleev\", \"ingr\", \"genet\", \"aid\", \"bank\", \"treatment\", \"water\", \"pain\", \"health\", \"handheld\", \"studi\", \"princeton\", \"caus\", \"effect\", \"scienc\", \"scientif\", \"rochest\", \"theori\", \"point\", \"result\", \"risk\", \"problem\", \"research\", \"case\", \"steve\", \"test\", \"time\", \"peopl\", \"repli\", \"take\", \"differ\", \"year\", \"say\", \"thing\", \"isra\", \"hockey\", \"playoff\", \"palestinian\", \"detroit\", \"leaf\", \"cramer\", \"optilink\", \"pen\", \"cunixb\", \"lebanes\", \"penguin\", \"clayton\", \"jake\", \"maynard\", \"espn\", \"edmonton\", \"ericsson\", \"boni\", \"lemieux\", \"gaza\", \"puck\", \"bruin\", \"selann\", \"laurentian\", \"quebec\", \"ramsey\", \"canuck\", \"shark\", \"uvic\", \"montreal\", \"flyer\", \"israel\", \"stanley\", \"team\", \"jet\", \"coach\", \"ranger\", \"winnipeg\", \"game\", \"play\", \"wing\", \"player\", \"columbia\", \"season\", \"leagu\", \"pittsburgh\", \"score\", \"arab\", \"mcgill\", \"goal\", \"virginia\", \"toronto\", \"andrew\", \"year\", \"divis\", \"canada\", \"period\", \"final\", \"point\", \"time\", \"american\", \"go\"], \"Total\": [2966.0, 1940.0, 1924.0, 1689.0, 2638.0, 2884.0, 1860.0, 1161.0, 1997.0, 1477.0, 1274.0, 1016.0, 1577.0, 1423.0, 1059.0, 1331.0, 1142.0, 2600.0, 837.0, 1391.0, 6052.0, 742.0, 990.0, 784.0, 1802.0, 1023.0, 4004.0, 867.0, 1190.0, 747.0, 1142.9603271484375, 698.9571533203125, 407.72796630859375, 376.14263916015625, 366.1121826171875, 325.8475036621094, 318.2566833496094, 294.63909912109375, 243.81597900390625, 243.5318603515625, 239.48057556152344, 223.58897399902344, 220.15792846679688, 499.8524475097656, 183.81210327148438, 190.03155517578125, 181.68051147460938, 168.5208740234375, 170.9889373779297, 163.37278747558594, 156.9476776123047, 153.92372131347656, 148.3330841064453, 145.86839294433594, 144.91375732421875, 143.45330810546875, 140.92047119140625, 138.17550659179688, 112.54103088378906, 112.26655578613281, 299.73785400390625, 239.29342651367188, 575.2807006835938, 235.9646759033203, 846.909912109375, 310.8516845703125, 1292.495849609375, 203.65487670898438, 568.3539428710938, 904.9415283203125, 498.3475341796875, 821.7435302734375, 317.73541259765625, 442.4269714355469, 6052.7568359375, 470.1634521484375, 1997.4742431640625, 3614.554931640625, 771.30322265625, 4395.65673828125, 753.386474609375, 729.10546875, 3489.9912109375, 1666.2821044921875, 3510.59228515625, 3362.487060546875, 2458.833984375, 1374.8499755859375, 910.4705200195312, 2752.347412109375, 5183.0615234375, 1404.285400390625, 3617.8623046875, 1561.919189453125, 1909.090576171875, 4004.499755859375, 1884.099853515625, 1274.90771484375, 844.1483154296875, 688.5940551757812, 379.07818603515625, 601.140869140625, 285.1163330078125, 265.8630065917969, 258.6456298828125, 234.31048583984375, 199.48165893554688, 197.49954223632812, 187.35317993164062, 186.70449829101562, 191.50320434570312, 161.609130859375, 158.14089965820312, 148.43858337402344, 144.8671112060547, 142.21681213378906, 133.87864685058594, 133.63296508789062, 137.22470092773438, 135.08001708984375, 123.31761169433594, 118.5867691040039, 111.65430450439453, 104.27904510498047, 104.7589340209961, 103.54805755615234, 192.99319458007812, 1924.420654296875, 744.669677734375, 604.4502563476562, 642.6378784179688, 209.51373291015625, 250.72772216796875, 845.7623291015625, 828.4779663085938, 355.576416015625, 287.8231201171875, 282.98614501953125, 442.1787109375, 692.9871826171875, 269.98553466796875, 446.0935363769531, 578.8563842773438, 2561.801513671875, 282.8560791015625, 815.1890258789062, 1700.040283203125, 474.37847900390625, 965.2655029296875, 1333.167236328125, 902.1780395507812, 1251.5302734375, 1317.348876953125, 2641.8525390625, 6052.7568359375, 1353.2353515625, 1007.024658203125, 4395.65673828125, 2872.251953125, 1977.931884765625, 3329.194091796875, 2056.011474609375, 3362.487060546875, 3754.324462890625, 2277.275146484375, 5183.0615234375, 2646.844970703125, 1892.52294921875, 514.570068359375, 479.6328430175781, 262.20831298828125, 305.9157409667969, 183.0161590576172, 165.39915466308594, 159.4037322998047, 152.9738311767578, 138.80514526367188, 136.08897399902344, 118.21088409423828, 102.45747375488281, 101.47250366210938, 95.48925018310547, 95.00318145751953, 93.7560806274414, 89.41605377197266, 85.98832702636719, 78.80107879638672, 77.11690521240234, 75.69332885742188, 77.96991729736328, 67.19242095947266, 66.7578353881836, 63.51332092285156, 62.5534782409668, 57.590476989746094, 57.5670166015625, 57.39277648925781, 57.16252136230469, 448.58203125, 58.587608337402344, 180.90525817871094, 872.5556030273438, 374.153564453125, 496.06207275390625, 1391.7647705078125, 441.0435791015625, 358.5755615234375, 426.2104797363281, 1054.81982421875, 199.63804626464844, 1032.6685791015625, 440.0850830078125, 1078.519775390625, 1021.2532958984375, 1669.5401611328125, 441.5390930175781, 1374.777099609375, 2884.2314453125, 2375.46533203125, 1561.0626220703125, 2600.132568359375, 691.9703369140625, 736.288330078125, 1159.4346923828125, 2169.3818359375, 1621.36328125, 1630.9560546875, 2103.51220703125, 1606.3494873046875, 1651.1046142578125, 1085.9647216796875, 1067.6014404296875, 839.2589721679688, 2966.799072265625, 872.6826171875, 1443.4285888671875, 3038.840576171875, 2288.573486328125, 3375.089111328125, 1421.2718505859375, 1956.87451171875, 3517.12158203125, 867.4650268554688, 317.6335754394531, 250.2051239013672, 230.8120574951172, 229.64512634277344, 212.46034240722656, 183.939208984375, 167.10159301757812, 165.70152282714844, 156.46893310546875, 158.83473205566406, 362.0701904296875, 134.3770294189453, 125.0824966430664, 123.22360229492188, 117.9479751586914, 112.16997528076172, 111.74629974365234, 110.07479858398438, 104.12123107910156, 99.82710266113281, 519.783203125, 90.53907775878906, 83.65958404541016, 82.6272964477539, 104.46712493896484, 76.1695556640625, 76.12603759765625, 71.69577026367188, 70.25682830810547, 287.1305236816406, 317.72869873046875, 1023.153564453125, 213.97622680664062, 736.9422607421875, 385.1871643066406, 1577.8626708984375, 487.7118835449219, 681.5184326171875, 651.6133422851562, 414.8677673339844, 202.35369873046875, 773.6500854492188, 2638.11669921875, 1190.9949951171875, 521.5310668945312, 771.9429321289062, 825.655517578125, 2966.799072265625, 979.7059936523438, 877.653076171875, 316.51055908203125, 603.9048461914062, 656.5213012695312, 3254.53125, 1051.2015380859375, 2884.2314453125, 2288.573486328125, 1818.9423828125, 3998.25146484375, 901.1630249023438, 3517.12158203125, 1391.7637939453125, 2348.668212890625, 2600.132568359375, 3617.8623046875, 5183.0615234375, 2732.23828125, 1630.9560546875, 3038.840576171875, 267.0257263183594, 171.98744201660156, 156.5063934326172, 228.2922821044922, 132.4541778564453, 111.54090118408203, 110.61382293701172, 480.2140197753906, 124.9337158203125, 97.43182373046875, 91.59697723388672, 87.81555938720703, 85.65699768066406, 85.5787124633789, 84.03668212890625, 251.917236328125, 74.3480224609375, 71.57240295410156, 71.21118927001953, 69.74082946777344, 67.61688995361328, 66.78809356689453, 61.514625549316406, 61.19959259033203, 60.50275421142578, 60.342044830322266, 60.04544448852539, 59.2192268371582, 58.72171401977539, 58.32341003417969, 415.9680480957031, 351.16400146484375, 197.7269287109375, 259.1622314453125, 170.86904907226562, 275.1458435058594, 144.30697631835938, 174.9811248779297, 592.9119262695312, 1331.5164794921875, 1860.7562255859375, 257.585205078125, 337.95697021484375, 441.28607177734375, 216.21592712402344, 284.10626220703125, 205.7402801513672, 455.25067138671875, 191.21556091308594, 873.9714965820312, 344.7267761230469, 726.9257202148438, 1014.5090942382812, 862.4901733398438, 336.9737243652344, 4004.499755859375, 3998.25146484375, 641.9896850585938, 701.0418090820312, 556.9617919921875, 3510.59228515625, 5183.0615234375, 1432.9788818359375, 1579.3616943359375, 1517.9344482421875, 1785.4522705078125, 3329.194091796875, 4395.65673828125, 3375.089111328125, 6052.7568359375, 2600.132568359375, 3617.8623046875, 3517.12158203125, 1000.6307983398438, 1483.9180908203125, 495.768310546875, 747.65087890625, 325.66717529296875, 302.36370849609375, 244.9949493408203, 158.98828125, 108.28207397460938, 95.93086242675781, 100.28355407714844, 91.90662384033203, 89.54743957519531, 80.23743438720703, 78.72370910644531, 77.19242095947266, 75.45897674560547, 69.59910583496094, 67.86799621582031, 66.37223052978516, 65.70891571044922, 63.809295654296875, 62.9937858581543, 61.963539123535156, 61.97830581665039, 59.60945129394531, 58.642459869384766, 58.43714141845703, 58.30545425415039, 54.43068313598633, 53.99776840209961, 82.42749786376953, 485.30303955078125, 668.4765625, 284.99322509765625, 240.6736602783203, 577.3501586914062, 179.90444946289062, 111.21510314941406, 528.9468383789062, 357.52178955078125, 74.67184448242188, 242.34613037109375, 502.913818359375, 297.42877197265625, 281.2137145996094, 192.33717346191406, 183.0419158935547, 466.63409423828125, 750.7517700195312, 366.50677490234375, 724.8965454101562, 250.31179809570312, 415.8218994140625, 353.0378723144531, 657.658203125, 1070.60205078125, 3489.9912109375, 395.5966796875, 983.7339477539062, 606.9436645507812, 3754.324462890625, 598.3063354492188, 2638.11669921875, 3614.554931640625, 3375.089111328125, 6052.7568359375, 3617.8623046875, 2113.190673828125, 3329.194091796875, 5183.0615234375, 3510.59228515625, 3038.840576171875, 2732.23828125, 1432.9788818359375, 1407.8818359375, 3254.53125, 3517.12158203125, 275.8772277832031, 207.15757751464844, 206.79428100585938, 186.37115478515625, 143.23545837402344, 139.3581085205078, 126.11384582519531, 125.84441375732422, 114.21138000488281, 112.2330322265625, 110.28572082519531, 106.60977935791016, 107.26533508300781, 295.4808044433594, 102.42223358154297, 99.06439971923828, 98.99042510986328, 97.59706115722656, 96.1397705078125, 94.81333923339844, 91.83870697021484, 91.01528930664062, 206.15138244628906, 84.41759490966797, 84.07954406738281, 82.9988784790039, 80.96837615966797, 80.94064331054688, 79.88065338134766, 78.38043975830078, 639.179443359375, 227.34768676757812, 322.9873046875, 231.69212341308594, 201.00955200195312, 428.8465270996094, 227.2183380126953, 525.5809326171875, 277.0488586425781, 257.5307312011719, 175.57052612304688, 283.98089599609375, 476.7163391113281, 133.4186248779297, 365.1439514160156, 1031.6707763671875, 640.4948120117188, 4004.499755859375, 1280.0391845703125, 3754.324462890625, 1940.480712890625, 488.2629089355469, 472.26141357421875, 990.4652099609375, 1023.2092895507812, 516.3364868164062, 3375.089111328125, 3038.840576171875, 3510.59228515625, 5183.0615234375, 818.473876953125, 3362.487060546875, 1909.090576171875, 1423.8079833984375, 1658.5771484375, 1346.3623046875, 1717.4796142578125, 1785.4522705078125, 3329.194091796875, 1491.164794921875, 990.2597045898438, 1542.3536376953125, 1161.5042724609375, 425.4167175292969, 362.8162841796875, 389.96905517578125, 256.041259765625, 224.2482147216797, 187.67849731445312, 151.80862426757812, 149.26010131835938, 143.24093627929688, 784.146484375, 126.84251403808594, 123.26657104492188, 114.4028549194336, 111.90643310546875, 118.11632537841797, 98.68305969238281, 96.04377746582031, 155.5158233642578, 86.74695587158203, 86.70785522460938, 84.794677734375, 83.96345520019531, 81.92181396484375, 87.67940521240234, 73.11810302734375, 71.84503173828125, 66.95278930664062, 66.233642578125, 62.500492095947266, 659.0625, 1059.32958984375, 429.3060607910156, 89.6495590209961, 124.40624237060547, 474.05853271484375, 1477.181640625, 430.5038757324219, 178.8761749267578, 204.31564331054688, 1802.0166015625, 1997.4742431640625, 534.6437377929688, 906.0315551757812, 555.987060546875, 491.40655517578125, 613.587890625, 662.8741455078125, 470.1554870605469, 1022.0458984375, 480.70269775390625, 730.8065795898438, 2365.439208984375, 762.9767456054688, 1372.4049072265625, 2169.3818359375, 1377.2789306640625, 1170.3707275390625, 3489.9912109375, 3614.554931640625, 1280.42724609375, 1651.1046142578125, 6052.7568359375, 3517.12158203125, 399.3059997558594, 300.7602844238281, 165.5708770751953, 152.18165588378906, 135.7127227783203, 135.72866821289062, 129.7154541015625, 121.10759735107422, 120.72209930419922, 104.60343933105469, 93.96927642822266, 106.78413391113281, 92.03643035888672, 89.79829406738281, 87.39839935302734, 84.10774230957031, 83.47124481201172, 77.5677490234375, 74.84196472167969, 139.1590118408203, 74.50009155273438, 74.3469467163086, 301.6020812988281, 72.43663787841797, 72.43663787841797, 72.29076385498047, 69.52177429199219, 71.59939575195312, 67.96253204345703, 65.53521728515625, 140.3209686279297, 354.6353759765625, 560.2382202148438, 467.1678161621094, 372.5237731933594, 214.25985717773438, 528.3170776367188, 128.8201446533203, 106.81678009033203, 215.3099365234375, 114.3545913696289, 206.84561157226562, 542.5616455078125, 263.9644470214844, 416.1438293457031, 361.6253356933594, 544.79638671875, 136.72360229492188, 864.7274780273438, 185.29769897460938, 1192.119873046875, 1098.304931640625, 1600.333984375, 408.9844970703125, 366.5314025878906, 446.05267333984375, 2646.844970703125, 941.7982788085938, 342.3374938964844, 3254.53125, 1469.8099365234375, 2113.190673828125, 866.398681640625, 975.55322265625, 5183.0615234375, 6052.7568359375, 2732.23828125, 1884.099853515625, 2258.33203125, 4004.499755859375, 4395.65673828125, 3329.194091796875, 837.7212524414062, 742.6168823242188, 348.9921569824219, 263.5521240234375, 235.61534118652344, 226.59957885742188, 215.53610229492188, 198.10865783691406, 177.09458923339844, 164.6287078857422, 160.58985900878906, 157.4580078125, 156.47132873535156, 148.0709228515625, 144.6891632080078, 152.87937927246094, 141.45484924316406, 133.94744873046875, 132.694580078125, 123.27899932861328, 119.56299591064453, 116.5375747680664, 113.3081283569336, 113.12879943847656, 112.70191955566406, 120.08545684814453, 102.97634887695312, 94.35086822509766, 93.14530181884766, 90.63005065917969, 220.85797119140625, 153.72544860839844, 1016.9886474609375, 185.5819549560547, 1689.4241943359375, 167.1842803955078, 202.2176513671875, 240.0353546142578, 165.1486358642578, 1940.480712890625, 1423.8079833984375, 399.85687255859375, 990.4652099609375, 559.25, 670.059814453125, 536.776123046875, 505.7619934082031, 528.2215576171875, 572.4735717773438, 254.32785034179688, 553.66845703125, 544.2701416015625, 701.0418090820312, 868.3306274414062, 4004.499755859375, 693.3757934570312, 732.4243774414062, 584.494873046875, 822.269287109375, 2646.844970703125, 5183.0615234375, 1242.181884765625, 3510.59228515625], \"loglift\": [30.0, 29.0, 28.0, 27.0, 26.0, 25.0, 24.0, 23.0, 22.0, 21.0, 20.0, 19.0, 18.0, 17.0, 16.0, 15.0, 14.0, 13.0, 12.0, 11.0, 10.0, 9.0, 8.0, 7.0, 6.0, 5.0, 4.0, 3.0, 2.0, 1.0, 2.0255000591278076, 2.0250000953674316, 2.0241000652313232, 2.023900032043457, 2.0237998962402344, 2.0234999656677246, 2.023400068283081, 2.023200035095215, 2.022599935531616, 2.022599935531616, 2.0225000381469727, 2.022200107574463, 2.0220999717712402, 2.0216000080108643, 2.0213000774383545, 2.0213000774383545, 2.0213000774383545, 2.020900011062622, 2.020900011062622, 2.020699977874756, 2.0204999446868896, 2.02020001411438, 2.02020001411438, 2.0201001167297363, 2.0199999809265137, 2.0199999809265137, 2.0197999477386475, 2.019700050354004, 2.018199920654297, 2.018199920654297, 2.0153000354766846, 2.007200002670288, 1.9528000354766846, 1.9889999628067017, 1.8824000358581543, 1.958899974822998, 1.7970999479293823, 1.980299949645996, 1.819599986076355, 1.6779999732971191, 1.763100028038025, 1.6375000476837158, 1.8667999505996704, 1.781499981880188, 1.0757999420166016, 1.7408000230789185, 1.2897000312805176, 1.0537999868392944, 1.5707000494003296, 0.9531000256538391, 1.4706000089645386, 1.4835000038146973, 0.7210999727249146, 1.080899953842163, 0.6299999952316284, 0.6431000232696533, 0.739799976348877, 1.0845999717712402, 1.3265000581741333, 0.5475999712944031, 0.0575999990105629, 0.9682999849319458, 0.27399998903274536, 0.847000002861023, 0.6578999757766724, -0.014100000262260437, 0.5697000026702881, 2.045099973678589, 2.044800043106079, 2.0445001125335693, 2.0434000492095947, 2.043299913406372, 2.04259991645813, 2.0423998832702637, 2.04229998588562, 2.0418999195098877, 2.0411999225616455, 2.041100025177002, 2.0408999919891357, 2.0408999919891357, 2.040600061416626, 2.0401999950408936, 2.0399999618530273, 2.0397000312805176, 2.0394999980926514, 2.039400100708008, 2.0390000343322754, 2.0390000343322754, 2.0388998985290527, 2.0385000705718994, 2.0383999347686768, 2.038100004196167, 2.037600040435791, 2.0369999408721924, 2.036900043487549, 2.036900043487549, 2.036400079727173, 2.031899929046631, 2.0318000316619873, 2.0308001041412354, 2.023099899291992, 2.0327999591827393, 2.0308001041412354, 1.9904999732971191, 1.945199966430664, 1.9896999597549438, 1.9883999824523926, 1.9829000234603882, 1.9407000541687012, 1.8581000566482544, 1.9696999788284302, 1.8825000524520874, 1.8199000358581543, 1.5154000520706177, 1.9494999647140503, 1.7005000114440918, 1.5044000148773193, 1.7955000400543213, 1.5720000267028809, 1.4508999586105347, 1.5461000204086304, 1.42330002784729, 1.3523000478744507, 1.0579999685287476, 0.6973999738693237, 1.2980999946594238, 1.3992999792099, 0.6687999963760376, 0.8589000105857849, 1.0434000492095947, 0.6948999762535095, 0.9133999943733215, 0.5392000079154968, 0.31630000472068787, 0.7174999713897705, 0.003100000089034438, 0.5838000178337097, 0.8629000186920166, 2.080399990081787, 2.0803000926971436, 2.078700065612793, 2.0776000022888184, 2.0771000385284424, 2.0766000747680664, 2.0764000415802, 2.076200008392334, 2.0755999088287354, 2.075500011444092, 2.074399948120117, 2.0732998847961426, 2.073199987411499, 2.0725998878479004, 2.0725998878479004, 2.0724000930786133, 2.071899890899658, 2.0715999603271484, 2.0706000328063965, 2.0703001022338867, 2.0701000690460205, 2.0687999725341797, 2.0685999393463135, 2.06850004196167, 2.0678000450134277, 2.067500114440918, 2.0662999153137207, 2.0662999153137207, 2.066200017929077, 2.066200017929077, 2.0478999614715576, 2.0660998821258545, 2.0511999130249023, 2.0100998878479004, 2.022200107574463, 2.008699893951416, 1.9703999757766724, 1.9789999723434448, 1.9657000303268433, 1.9249999523162842, 1.8271000385284424, 1.9738999605178833, 1.774899959564209, 1.8641999959945679, 1.7426999807357788, 1.7103999853134155, 1.6003999710083008, 1.8172999620437622, 1.605299949645996, 1.4668999910354614, 1.4728000164031982, 1.5562000274658203, 1.4235999584197998, 1.6993999481201172, 1.6753000020980835, 1.5449999570846558, 1.365399956703186, 1.4404000043869019, 1.42330002784729, 1.3453999757766724, 1.3896000385284424, 1.3382999897003174, 1.4631999731063843, 1.4598000049591064, 1.579699993133545, 0.9275000095367432, 1.518399953842163, 1.176200032234192, 0.499099999666214, 0.7235000133514404, 0.3797000050544739, 1.0923999547958374, 0.7401000261306763, 0.15479999780654907, 2.1196000576019287, 2.117799997329712, 2.117000102996826, 2.1166999340057373, 2.1166000366210938, 2.116300106048584, 2.1157000064849854, 2.1152000427246094, 2.1150999069213867, 2.114799976348877, 2.1147000789642334, 2.114000082015991, 2.113800048828125, 2.113300085067749, 2.1131999492645264, 2.1129000186920166, 2.112499952316284, 2.1124000549316406, 2.112299919128418, 2.111799955368042, 2.1113998889923096, 2.1108999252319336, 2.1105000972747803, 2.1096999645233154, 2.109499931335449, 2.1089000701904297, 2.108599901199341, 2.108599901199341, 2.107800006866455, 2.107599973678589, 2.101799964904785, 2.099600076675415, 2.0685999393463135, 2.092400074005127, 2.0650999546051025, 2.073899984359741, 2.0125999450683594, 2.021399974822998, 2.0007998943328857, 2.0023000240325928, 2.0262999534606934, 2.0680999755859375, 1.9438999891281128, 1.8285000324249268, 1.8824000358581543, 1.9651000499725342, 1.9211000204086304, 1.8946000337600708, 1.7211999893188477, 1.8492000102996826, 1.8622000217437744, 2.00570011138916, 1.8641999959945679, 1.8091000318527222, 1.291200041770935, 1.6136000156402588, 1.1761000156402588, 1.246999979019165, 1.326200008392334, 0.973800003528595, 1.5801000595092773, 0.8787999749183655, 1.298699975013733, 0.9729999899864197, 0.7918000221252441, 0.4300999939441681, 0.10779999941587448, 0.5931000113487244, 0.9909999966621399, 0.40450000762939453, 2.3443000316619873, 2.342400074005127, 2.341900110244751, 2.3415000438690186, 2.34089994430542, 2.339600086212158, 2.3394999504089355, 2.3392999172210693, 2.3385000228881836, 2.338399887084961, 2.3378000259399414, 2.3373000621795654, 2.337100028991699, 2.3369998931884766, 2.336899995803833, 2.336199998855591, 2.335400104522705, 2.33489990234375, 2.33489990234375, 2.3345999717712402, 2.334199905395508, 2.3340001106262207, 2.3327999114990234, 2.3327999114990234, 2.3326001167297363, 2.3324999809265137, 2.3324999809265137, 2.3322999477386475, 2.3320999145507812, 2.3320000171661377, 2.3210999965667725, 2.3196001052856445, 2.3125, 2.2964999675750732, 2.3036999702453613, 2.2811999320983887, 2.305999994277954, 2.2894999980926514, 2.218400001525879, 2.106600046157837, 2.063800096511841, 2.2263998985290527, 2.183000087738037, 2.096400022506714, 2.1958000659942627, 2.1349000930786133, 2.186199903488159, 2.033400058746338, 2.193000078201294, 1.8655999898910522, 2.0510001182556152, 1.8450000286102295, 1.6746000051498413, 1.5880000591278076, 1.9641000032424927, 0.8166999816894531, 0.7954000234603882, 1.629699945449829, 1.5721999406814575, 1.6842999458312988, 0.6662999987602234, 0.41440001130104065, 1.1360000371932983, 0.9230999946594238, 0.9273999929428101, 0.7792999744415283, 0.24959999322891235, -0.010900000110268593, 0.20020000636577606, -0.3833000063896179, 0.3409000039100647, 0.04670000076293945, 0.013500000350177288, 1.1301000118255615, 0.7407000064849854, 2.3550000190734863, 2.3548998832702637, 2.3541998863220215, 2.354099988937378, 2.352099895477295, 2.3513998985290527, 2.3487000465393066, 2.347599983215332, 2.3473000526428223, 2.3471999168395996, 2.34689998626709, 2.3457000255584717, 2.3454999923706055, 2.3452999591827393, 2.3450000286102295, 2.3440001010894775, 2.343600034713745, 2.3433001041412354, 2.343100070953369, 2.3427999019622803, 2.342600107192993, 2.3422999382019043, 2.3422999382019043, 2.3417999744415283, 2.3415000438690186, 2.341399908065796, 2.341399908065796, 2.3403000831604004, 2.340100049972534, 2.340100049972534, 2.3173000812530518, 2.297499895095825, 2.3120999336242676, 2.310800075531006, 2.260999917984009, 2.295099973678589, 2.3132998943328857, 2.235300064086914, 2.249799966812134, 2.33270001411438, 2.2404000759124756, 2.1772000789642334, 2.203000068664551, 2.1942999362945557, 2.2360000610351562, 2.2339999675750732, 2.071899890899658, 1.9709999561309814, 2.089400053024292, 1.9449000358581543, 2.13100004196167, 2.011899948120117, 2.0436999797821045, 1.7994999885559082, 1.6154999732971191, 1.215399980545044, 1.9222999811172485, 1.5217000246047974, 1.7158000469207764, 0.7318999767303467, 1.5988999605178833, 0.6722000241279602, 0.460999995470047, 0.4821999967098236, 0.07440000027418137, 0.4043000042438507, 0.7802000045776367, 0.4431000053882599, 0.03189999982714653, 0.3253999948501587, 0.4275999963283539, 0.4212000072002411, 0.9513000249862671, 0.9588000178337097, 0.13619999587535858, 0.011599999852478504, 2.412899971008301, 2.411799907684326, 2.411799907684326, 2.41129994392395, 2.4098000526428223, 2.4096999168395996, 2.4089999198913574, 2.4089999198913574, 2.4082000255584717, 2.408099889755249, 2.407900094985962, 2.407599925994873, 2.4072999954223633, 2.4072999954223633, 2.4072999954223633, 2.4070000648498535, 2.4070000648498535, 2.4068000316619873, 2.4066998958587646, 2.406599998474121, 2.4061999320983887, 2.4061999320983887, 2.405900001525879, 2.4052999019622803, 2.4052999019622803, 2.4052000045776367, 2.404900074005127, 2.404900074005127, 2.4047000408172607, 2.4045000076293945, 2.393399953842163, 2.3766000270843506, 2.3415000438690186, 2.3566999435424805, 2.358099937438965, 2.2316999435424805, 2.300800085067749, 2.1847000122070312, 2.2667999267578125, 2.2228000164031982, 2.2576000690460205, 2.123500108718872, 1.96589994430542, 2.312700033187866, 1.9866000413894653, 1.5972000360488892, 1.7651000022888184, 1.0090999603271484, 1.4464999437332153, 1.0003999471664429, 1.2259999513626099, 1.7905999422073364, 1.7925000190734863, 1.4222999811172485, 1.3905999660491943, 1.7355999946594238, 0.6812999844551086, 0.6772000193595886, 0.5329999923706055, 0.23199999332427979, 1.4362000226974487, 0.38100001215934753, 0.775600016117096, 0.977400004863739, 0.843500018119812, 0.9948999881744385, 0.7968999743461609, 0.7509999871253967, 0.16369999945163727, 0.7944999933242798, 1.1397000551223755, 0.7049999833106995, 2.54010009765625, 2.5387001037597656, 2.538300037384033, 2.537600040435791, 2.5373001098632812, 2.536799907684326, 2.5360000133514404, 2.5348000526428223, 2.5346999168395996, 2.53439998626709, 2.5336999893188477, 2.533600091934204, 2.533400058746338, 2.5327999591827393, 2.5325000286102295, 2.5320000648498535, 2.5315001010894775, 2.5313000679016113, 2.5309998989105225, 2.5302000045776367, 2.5302000045776367, 2.5299999713897705, 2.529900074005127, 2.529599905014038, 2.529400110244751, 2.5283000469207764, 2.5280001163482666, 2.527100086212158, 2.526900053024292, 2.526099920272827, 2.4986000061035156, 2.449700117111206, 2.450900077819824, 2.509700059890747, 2.476799964904785, 2.3310999870300293, 2.1043999195098877, 2.260999917984009, 2.390899896621704, 2.3452000617980957, 1.830899953842163, 1.718000054359436, 2.049499988555908, 1.8806999921798706, 2.017199993133545, 2.054800033569336, 1.9694000482559204, 1.9026999473571777, 2.0141000747680664, 1.6618000268936157, 1.9522000551223755, 1.7517000436782837, 1.1319999694824219, 1.6974999904632568, 1.3797999620437622, 1.1073999404907227, 1.30649995803833, 1.3228000402450562, 0.4544999897480011, 0.39149999618530273, 1.211400032043457, 0.9824000000953674, -0.3142000138759613, 0.1941000074148178, 2.6533000469207764, 2.652600049972534, 2.650099992752075, 2.649600028991699, 2.648900032043457, 2.648900032043457, 2.6486001014709473, 2.648099899291992, 2.648099899291992, 2.646899938583374, 2.645900011062622, 2.645699977874756, 2.645699977874756, 2.645400047302246, 2.64520001411438, 2.644700050354004, 2.644700050354004, 2.6435999870300293, 2.643399953842163, 2.643399953842163, 2.6433000564575195, 2.6433000564575195, 2.6429998874664307, 2.6429998874664307, 2.6429998874664307, 2.6429998874664307, 2.642400026321411, 2.6422998905181885, 2.6421000957489014, 2.6415998935699463, 2.635999917984009, 2.5836000442504883, 2.539299964904785, 2.5450000762939453, 2.5088000297546387, 2.5473999977111816, 2.4653000831604004, 2.588399887084961, 2.606800079345703, 2.5288000106811523, 2.597399950027466, 2.5183000564575195, 2.367000102996826, 2.470099925994873, 2.3645999431610107, 2.3884999752044678, 2.2541000843048096, 2.546799898147583, 1.9607000350952148, 2.4368999004364014, 1.7419999837875366, 1.7599999904632568, 1.6059000492095947, 2.1031999588012695, 2.1456000804901123, 2.023200035095215, 1.0397000312805176, 1.5461000204086304, 2.0940001010894775, 0.7099999785423279, 1.1996999979019165, 0.8400999903678894, 1.422700047492981, 1.3034000396728516, -0.013100000098347664, -0.1525000035762787, 0.4368000030517578, 0.745199978351593, 0.510200023651123, -0.03440000116825104, -0.14550000429153442, 0.10100000351667404, 2.72160005569458, 2.721400022506714, 2.7200000286102295, 2.7191998958587646, 2.7188000679016113, 2.718600034713745, 2.718400001525879, 2.7179999351501465, 2.7174999713897705, 2.717099905014038, 2.7170000076293945, 2.7167999744415283, 2.7167000770568848, 2.7165000438690186, 2.7163000106811523, 2.7163000106811523, 2.716200113296509, 2.7158000469207764, 2.7156999111175537, 2.7151999473571777, 2.7149999141693115, 2.7147998809814453, 2.714600086212158, 2.714600086212158, 2.7144999504089355, 2.714400053024292, 2.7137999534606934, 2.712899923324585, 2.7128000259399414, 2.7125000953674316, 2.7116000652313232, 2.7100000381469727, 2.660099983215332, 2.686199903488159, 2.5232999324798584, 2.684799909591675, 2.6684999465942383, 2.643399953842163, 2.6735999584198, 2.3148000240325928, 2.2867000102996826, 2.477099895477295, 2.2590999603271484, 2.3817999362945557, 2.3364999294281006, 2.377000093460083, 2.359499931335449, 2.330699920654297, 2.299099922180176, 2.5443999767303467, 2.254300117492676, 2.1686999797821045, 1.978600025177002, 1.773300051689148, 0.8248000144958496, 1.8695000410079956, 1.7740000486373901, 1.873900055885315, 1.5986000299453735, 0.6425999999046326, 0.05000000074505806, 1.1669000387191772, 0.04839999973773956], \"logprob\": [30.0, 29.0, 28.0, 27.0, 26.0, 25.0, 24.0, 23.0, 22.0, 21.0, 20.0, 19.0, 18.0, 17.0, 16.0, 15.0, 14.0, 13.0, 12.0, 11.0, 10.0, 9.0, 8.0, 7.0, 6.0, 5.0, 4.0, 3.0, 2.0, 1.0, -4.882199764251709, -5.374499797821045, -5.914400100708008, -5.995299816131592, -6.022299766540527, -6.139200210571289, -6.162799835205078, -6.240099906921387, -6.430099964141846, -6.431300163269043, -6.4481000900268555, -6.517099857330322, -6.532599925994873, -5.713200092315674, -6.713799953460693, -6.680600166320801, -6.725599765777588, -6.80109977722168, -6.786600112915039, -6.832300186157227, -6.872700214385986, -6.892399787902832, -6.929500102996826, -6.946300029754639, -6.952899932861328, -6.963099956512451, -6.981100082397461, -7.000899791717529, -7.207600116729736, -7.210000038146973, -6.230899810791016, -6.464200019836426, -5.641499996185303, -6.496399879455566, -5.325099945068359, -6.250899791717529, -4.987599849700928, -6.652400016784668, -5.7866997718811035, -5.463200092315674, -5.974699974060059, -5.600100040435791, -6.321100234985352, -6.075300216674805, -4.164999961853027, -6.055200099945068, -5.059800148010254, -4.702600002288818, -5.730299949645996, -4.607699871063232, -5.853899955749512, -5.873799800872803, -5.070400238037109, -5.449900150299072, -5.1554999351501465, -5.1855998039245605, -5.401899814605713, -5.638400077819824, -5.808599948883057, -5.481299877166748, -5.3383002281188965, -5.733500003814697, -5.481500148773193, -5.7484002113342285, -5.736800193786621, -5.668000221252441, -5.838200092315674, -4.753300189971924, -5.165999889373779, -5.369900226593018, -5.967899799346924, -5.506999969482422, -6.253600120544434, -6.323699951171875, -6.35129976272583, -6.450500011444092, -6.612100124359131, -6.622200012207031, -6.675099849700928, -6.678599834442139, -6.653600215911865, -6.823699951171875, -6.845600128173828, -6.909299850463867, -6.933800220489502, -6.952300071716309, -7.013199806213379, -7.014999866485596, -6.98859977722168, -7.004700183868408, -7.095900058746338, -7.135300159454346, -7.196100234985352, -7.264999866485596, -7.2606000900268555, -7.272200107574463, -6.650000095367432, -4.354899883270264, -5.3043999671936035, -5.513999938964844, -5.460400104522705, -6.571499824523926, -6.394000053405762, -5.218299865722656, -5.284299850463867, -6.085599899291992, -6.298299789428711, -6.320799827575684, -5.9166998863220215, -5.550000190734863, -6.38100004196167, -5.966000080108643, -5.768099784851074, -4.58519983291626, -6.354599952697754, -5.545199871063232, -5.00629997253418, -5.991600036621094, -5.504700183868408, -5.3028998374938965, -5.598199844360352, -5.393599987030029, -5.41349983215332, -5.011899948120117, -4.543399810791016, -5.440800189971924, -5.635000228881836, -4.891900062561035, -5.127299785614014, -5.315899848937988, -5.143700122833252, -5.407100200653076, -5.2895002365112305, -5.402100086212158, -5.500899791717529, -5.3927998542785645, -5.484099864959717, -5.540599822998047, -5.625400066375732, -5.695799827575684, -6.301300048828125, -6.148200035095215, -6.662399768829346, -6.764100074768066, -6.801199913024902, -6.842599868774414, -6.940400123596191, -6.960299968719482, -7.102200031280518, -7.246399879455566, -7.256100177764893, -7.317500114440918, -7.3225998878479, -7.335999965667725, -7.383800029754639, -7.423299789428711, -7.511600017547607, -7.533400058746338, -7.552299976348877, -7.52400016784668, -7.672999858856201, -7.679500102996826, -7.730100154876709, -7.745500087738037, -7.829500198364258, -7.829899787902832, -7.832900047302246, -7.836999893188477, -5.795100212097168, -7.8125, -6.699900150299072, -5.167600154876709, -6.002200126647949, -5.733699798583984, -4.740300178527832, -5.880899906158447, -6.10129976272583, -5.969099998474121, -5.160900115966797, -6.678699970245361, -5.234300136566162, -5.997900009155273, -5.223100185394287, -5.309899806976318, -4.928400039672852, -6.041500091552734, -5.117800235748291, -4.515200138092041, -4.7032999992370605, -5.03980016708374, -4.662199974060059, -5.71019983291626, -5.6722002029418945, -5.348400115966797, -4.901500225067139, -5.117700099945068, -5.128900051116943, -4.952400207519531, -5.177800178527832, -5.201499938964844, -5.495699882507324, -5.51609992980957, -5.6367998123168945, -5.026400089263916, -5.65910005569458, -5.4980998039245605, -5.430799961090088, -5.4899001121521, -5.445300102233887, -5.597400188446045, -5.629899978637695, -5.628900051116943, -5.063899993896484, -6.070400238037109, -6.309800148010254, -6.3907999992370605, -6.395899772644043, -6.473999977111816, -6.618800163269043, -6.7153000831604, -6.723800182342529, -6.781499862670898, -6.766499996185303, -5.94320011138916, -6.934599876403809, -7.006800174713135, -7.021900177001953, -7.065999984741211, -7.116600036621094, -7.1203999519348145, -7.1356000900268555, -7.191699981689453, -7.2342000007629395, -5.584799766540527, -7.332799911499023, -7.412700176239014, -7.42519998550415, -7.191299915313721, -7.507500171661377, -7.5081000328063965, -7.56879997253418, -7.589399814605713, -6.187300205230713, -6.0883002281188965, -4.949900150299072, -6.490799903869629, -5.281499862670898, -5.921500205993652, -4.572700023651123, -5.73799991607666, -5.423999786376953, -5.467400074005127, -5.894899845123291, -6.571000099182129, -5.354100227355957, -4.242700099945068, -4.984099864959717, -5.727200031280518, -5.379000186920166, -5.3383002281188965, -4.232699871063232, -5.212600231170654, -5.309599876403809, -6.185999870300293, -5.68149995803833, -5.6529998779296875, -4.570099830627441, -5.377799987792969, -4.806000232696533, -4.966400146484375, -5.1168999671936035, -4.681700229644775, -5.565299987792969, -4.904900074005127, -5.4120001792907715, -5.2144999504089355, -5.293900012969971, -5.325399875640869, -5.288099765777588, -5.44320011138916, -5.561200141906738, -5.525400161743164, -6.017399787902832, -6.459199905395508, -6.554100036621094, -6.177000045776367, -6.7220001220703125, -6.895100116729736, -6.903600215911865, -5.435500144958496, -6.782800197601318, -7.031599998474121, -7.093900203704834, -7.136499881744385, -7.1616997718811035, -7.162600040435791, -7.181000232696533, -6.083799839019775, -7.304900169372559, -7.343400001525879, -7.348599910736084, -7.369699954986572, -7.401000022888184, -7.41349983215332, -7.497000217437744, -7.502200126647949, -7.513800144195557, -7.516499996185303, -7.521500110626221, -7.535600185394287, -7.5441999435424805, -7.55109977722168, -5.597400188446045, -5.7683000564575195, -6.349699974060059, -6.095099925994873, -6.504499912261963, -6.050600051879883, -6.671199798583984, -6.494999885559082, -5.345600128173828, -4.648399829864502, -4.356599807739258, -6.17140007019043, -5.94320011138916, -5.763000011444092, -6.377099990844727, -6.164899826049805, -6.436299800872803, -5.794899940490723, -6.502699851989746, -5.310500144958496, -6.0553998947143555, -5.515200138092041, -5.35230016708374, -5.60129976272583, -6.164999961853027, -4.837200164794922, -4.860099792480469, -5.854800224304199, -5.8242998123168945, -5.942299842834473, -5.11929988861084, -4.981500148773193, -5.545599937438965, -5.661200046539307, -5.696599960327148, -5.682400226593018, -5.589000225067139, -5.571599960327148, -5.62470006942749, -5.624100208282471, -5.744900226593018, -5.708799839019775, -5.770199775695801, -5.910600185394287, -5.906000137329102, -5.388000011444092, -4.97730016708374, -5.809100151062012, -5.883299827575684, -6.095799922943115, -6.528900146484375, -6.915599822998047, -7.037899971008301, -6.993800163269043, -7.081099987030029, -7.107399940490723, -7.218400001525879, -7.237599849700928, -7.257500171661377, -7.2804999351501465, -7.362400054931641, -7.387899875640869, -7.4105000495910645, -7.4207000732421875, -7.450399875640869, -7.463500022888184, -7.480199813842773, -7.480000019073486, -7.519499778747559, -7.536099910736084, -7.539700031280518, -7.541999816894531, -7.6118998527526855, -7.619999885559082, -7.1971001625061035, -5.447000026702881, -5.146599769592285, -5.984499931335449, -6.154799938201904, -5.329599857330322, -6.46150016784668, -6.9243998527526855, -5.44290018081665, -5.820099830627441, -7.303299903869629, -6.218299865722656, -5.551400184631348, -6.050899982452393, -6.115699768066406, -6.45389986038208, -6.50540018081665, -5.731599807739258, -5.35699987411499, -5.955699920654297, -5.418099880218506, -6.295400142669678, -5.906899929046631, -6.03879976272583, -5.660900115966797, -5.357600212097168, -4.576000213623047, -6.046299934387207, -5.535999774932861, -5.82480001449585, -4.986599922180176, -5.956099987030029, -5.39900016784668, -5.295400142669678, -5.342700004577637, -5.166399955749512, -5.351200103759766, -5.513000011444092, -5.395500183105469, -5.363999843597412, -5.460100173950195, -5.502299785614014, -5.614999771118164, -5.730199813842773, -5.740499973297119, -5.725100040435791, -5.77209997177124, -5.916200160980225, -6.203800201416016, -6.205599784851074, -6.309999942779541, -6.57480001449585, -6.602399826049805, -6.702899932861328, -6.705100059509277, -6.802800178527832, -6.820400238037109, -6.838099956512451, -6.872300148010254, -6.866399765014648, -5.8531999588012695, -6.912700176239014, -6.946300029754639, -6.9471001625061035, -6.961400032043457, -6.976600170135498, -6.990600109100342, -7.022799968719482, -7.031899929046631, -6.214600086212158, -7.107999801635742, -7.111999988555908, -7.125100135803223, -7.150100231170654, -7.1504998207092285, -7.16379976272583, -7.183000087738037, -5.0954999923706055, -6.145999908447266, -5.829899787902832, -6.146999835968018, -6.287600040435791, -5.656300067901611, -6.222400188446045, -5.499899864196777, -6.05810022354126, -6.175099849700928, -6.523399829864502, -6.176700115203857, -5.816299915313721, -6.7428998947143555, -6.06220006942749, -5.412899971008301, -5.721799850463867, -4.644899845123291, -5.347899913787842, -4.7179999351501465, -5.152400016784668, -5.967599868774414, -5.999100208282471, -5.628600120544434, -5.627799987792969, -5.966800212860107, -5.143700122833252, -5.252600193023682, -5.252600193023682, -5.163899898529053, -5.8053998947143555, -5.447700023651123, -5.619100093841553, -5.710599899291992, -5.69189977645874, -5.749000072479248, -5.70359992980957, -5.710599899291992, -5.674900054931641, -5.8471999168396, -5.911399841308594, -5.9029998779296875, -4.351600170135498, -5.3572998046875, -5.516900062561035, -5.445400238037109, -5.866499900817871, -5.999599933624268, -6.178400039672852, -6.39169979095459, -6.408699989318848, -6.450099945068359, -4.750800132751465, -6.572500228881836, -6.60129976272583, -6.676599979400635, -6.698999881744385, -6.645400047302246, -6.8256001472473145, -6.853000164031982, -6.371300220489502, -6.9558000564575195, -6.956299781799316, -6.978799819946289, -6.988800048828125, -7.013700008392334, -6.946000099182129, -7.128799915313721, -7.146599769592285, -7.2179999351501465, -7.229000091552734, -7.287799835205078, -4.95959997177124, -4.533999919891357, -5.435999870300293, -6.94350004196167, -6.648799896240234, -5.456600189208984, -4.546800136566162, -5.6230998039245605, -6.371500015258789, -6.284299850463867, -4.621500015258789, -4.631499767303467, -5.618000030517578, -5.259300231933594, -5.611199855804443, -5.697000026702881, -5.560400009155273, -5.549799919128418, -5.781899929046631, -5.357699871063232, -5.821599960327148, -5.603300094604492, -5.048399925231934, -5.6143999099731445, -5.34499979019165, -5.15939998626709, -5.414700031280518, -5.561200141906738, -5.336999893188477, -5.3649001121521, -5.582699775695801, -5.557499885559082, -5.554999828338623, -5.589600086212158, -5.306000232696533, -5.590199947357178, -6.189599990844727, -6.274400234222412, -6.389599800109863, -6.389500141143799, -6.435200214385986, -6.504300117492676, -6.507500171661377, -6.6519999504089355, -6.760200023651123, -6.632599830627441, -6.781199932098389, -6.806099891662598, -6.833499908447266, -6.872200012207031, -6.879899978637695, -6.9542999267578125, -6.990300178527832, -6.370100021362305, -6.994999885559082, -6.997000217437744, -5.59689998626709, -7.023399829864502, -7.023399829864502, -7.025400161743164, -7.065000057220459, -7.035699844360352, -7.0879998207092285, -7.124899864196777, -6.369200229644775, -5.4944000244140625, -5.081399917602539, -5.257400035858154, -5.519999980926514, -6.0345001220703125, -5.214099884033203, -6.502200126647949, -6.671199798583984, -6.0482001304626465, -6.612400054931641, -6.098800182342529, -5.285799980163574, -5.903200149536133, -5.553400039672852, -5.670000076293945, -5.394599914550781, -6.484300136566162, -5.22599983215332, -6.290200233459473, -5.123600006103516, -5.187600135803223, -4.965199947357178, -5.832200050354004, -5.899400234222412, -5.825500011444092, -5.028299808502197, -5.555200099945068, -6.0192999839782715, -5.151199817657471, -5.456500053405762, -5.453000068664551, -5.76200008392334, -5.762700080871582, -5.408999919891357, -5.3933000564575195, -5.599400043487549, -5.662700176239014, -5.7164998054504395, -5.688399791717529, -5.706200122833252, -5.737599849700928, -4.496799945831299, -4.617499828338623, -5.374000072479248, -5.655700206756592, -5.768099784851074, -5.807300090789795, -5.857600212097168, -5.942200183868408, -6.054900169372559, -6.128300189971924, -6.153299808502197, -6.173099994659424, -6.179500102996826, -6.234899997711182, -6.258200168609619, -6.203199863433838, -6.280900001525879, -6.3358001708984375, -6.345300197601318, -6.419400215148926, -6.450300216674805, -6.476099967956543, -6.50439977645874, -6.50600004196167, -6.509799957275391, -6.446499824523926, -6.600800037384033, -6.6890997886657715, -6.702099800109863, -6.729800224304199, -5.840000152587891, -6.20389986038208, -4.364299774169922, -6.039400100708008, -3.9937000274658203, -6.145199775695801, -5.97130012512207, -5.824900150299072, -6.168600082397461, -4.063600063323975, -4.401299953460693, -5.480899810791016, -4.791800022125244, -5.240699768066406, -5.105299949645996, -5.286499977111816, -5.36359977722168, -5.348800182342529, -5.300000190734863, -5.866099834442139, -5.378200054168701, -5.480899810791016, -5.417900085449219, -5.409200191497803, -4.829100131988525, -5.538000106811523, -5.578700065612793, -5.704500198364258, -5.638400077819824, -5.4253997802734375, -5.345900058746338, -5.65749979019165, -5.737199783325195]}, \"token.table\": {\"Topic\": [1, 2, 3, 4, 5, 6, 8, 9, 10, 3, 4, 5, 6, 7, 8, 4, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 1, 3, 5, 8, 1, 2, 3, 5, 8, 1, 5, 8, 9, 5, 3, 8, 7, 4, 1, 2, 5, 6, 7, 8, 9, 10, 2, 3, 4, 5, 6, 7, 8, 10, 3, 8, 1, 6, 9, 2, 4, 5, 2, 3, 4, 5, 8, 1, 10, 1, 3, 4, 8, 1, 1, 2, 3, 5, 6, 7, 8, 9, 1, 6, 8, 9, 10, 1, 1, 1, 3, 5, 6, 6, 2, 2, 2, 1, 2, 6, 8, 9, 10, 5, 1, 2, 3, 4, 8, 2, 3, 4, 5, 6, 7, 3, 5, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 1, 1, 1, 3, 9, 4, 5, 7, 1, 3, 4, 5, 6, 7, 8, 9, 10, 7, 10, 7, 1, 8, 6, 7, 1, 2, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 1, 3, 7, 8, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 2, 2, 5, 6, 2, 5, 3, 4, 4, 9, 7, 1, 3, 4, 5, 7, 8, 9, 10, 10, 8, 1, 2, 3, 4, 5, 6, 7, 9, 6, 5, 6, 7, 10, 10, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 1, 4, 5, 6, 7, 3, 4, 8, 4, 6, 4, 5, 1, 3, 4, 5, 6, 7, 8, 9, 10, 8, 9, 9, 10, 5, 6, 4, 6, 7, 8, 10, 9, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 9, 7, 2, 1, 2, 3, 4, 5, 6, 7, 8, 9, 6, 4, 4, 9, 1, 2, 3, 5, 8, 9, 4, 7, 8, 9, 1, 2, 1, 2, 1, 2, 5, 4, 8, 3, 4, 7, 8, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 8, 1, 2, 3, 8, 10, 6, 7, 10, 3, 4, 4, 9, 1, 5, 6, 8, 7, 8, 7, 10, 2, 3, 4, 6, 7, 8, 1, 2, 3, 4, 7, 10, 2, 3, 4, 5, 6, 7, 8, 10, 1, 4, 6, 7, 10, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 2, 3, 4, 5, 6, 7, 8, 9, 3, 4, 7, 9, 6, 4, 2, 9, 10, 3, 1, 3, 4, 5, 6, 7, 8, 9, 10, 1, 2, 3, 4, 6, 7, 8, 3, 1, 3, 4, 5, 6, 7, 8, 9, 6, 1, 4, 5, 6, 8, 9, 10, 1, 2, 6, 8, 10, 1, 6, 8, 8, 8, 8, 8, 4, 7, 10, 9, 2, 6, 2, 3, 4, 6, 7, 8, 9, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 1, 4, 6, 8, 1, 2, 4, 6, 9, 10, 8, 8, 5, 1, 2, 3, 4, 5, 6, 7, 8, 9, 3, 10, 3, 4, 7, 8, 4, 9, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 3, 3, 4, 8, 9, 3, 4, 8, 1, 2, 3, 4, 5, 9, 10, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 2, 1, 3, 4, 5, 6, 7, 8, 9, 10, 5, 1, 6, 9, 2, 7, 1, 2, 4, 5, 6, 7, 9, 10, 4, 5, 6, 8, 10, 3, 5, 9, 1, 7, 9, 1, 2, 3, 5, 7, 9, 10, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 9, 4, 1, 2, 3, 4, 5, 6, 7, 10, 8, 1, 2, 6, 8, 10, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 5, 3, 4, 8, 10, 8, 4, 10, 1, 2, 9, 3, 4, 1, 1, 2, 6, 8, 9, 10, 1, 2, 3, 4, 5, 7, 8, 9, 10, 1, 2, 7, 8, 1, 5, 6, 8, 1, 3, 4, 8, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 6, 6, 1, 3, 5, 9, 3, 4, 5, 10, 7, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 3, 4, 1, 2, 5, 9, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 2, 3, 4, 8, 9, 2, 6, 10, 6, 9, 1, 2, 3, 4, 8, 9, 5, 6, 8, 9, 10, 2, 4, 7, 10, 7, 10, 7, 9, 1, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 1, 2, 3, 5, 8, 10, 2, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 4, 9, 2, 1, 5, 6, 8, 3, 3, 4, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 1, 3, 1, 2, 3, 1, 2, 5, 6, 7, 8, 9, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 8, 1, 6, 9, 5, 8, 3, 6, 8, 6, 7, 9, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 1, 2, 4, 5, 6, 7, 8, 9, 10, 6, 1, 5, 8, 9, 1, 2, 5, 7, 5, 6, 7, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 5, 10, 7, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 1, 5, 6, 7, 9, 1, 7, 10, 1, 2, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 9, 8, 6, 7, 6, 5, 1, 6, 6, 1, 2, 3, 4, 5, 6, 7, 9, 1, 2, 3, 4, 8, 6, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 2, 3, 4, 7, 8, 9, 9, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 7, 9, 10, 7, 3, 4, 5, 7, 8, 5, 6, 9, 10, 9, 4, 2, 3, 4, 6, 7, 8, 9, 10, 5, 8, 1, 1, 2, 10, 1, 2, 10, 2, 10, 2, 4, 7, 9, 7, 2, 4, 5, 6, 7, 9, 10, 2, 5, 10, 1, 2, 10, 3, 5, 6, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 4, 7, 5, 3, 3, 8, 1, 2, 3, 6, 7, 9, 10, 1, 7, 3, 7, 5, 3, 5, 10, 10, 7, 10, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 10, 10, 1, 2, 3, 4, 6, 7, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 1, 2, 5, 6, 7, 8, 9, 10, 2, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 7, 1, 2, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 1, 2, 4, 5, 6, 7, 9, 10, 3, 5, 8, 1, 3, 4, 5, 6, 8, 9, 10, 3, 6, 2, 3, 4, 6, 7, 8, 9, 10, 3, 4, 3, 5, 1, 2, 1, 4, 10, 5, 3, 4, 10, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 1, 3, 7, 8, 9, 1, 4, 8, 9, 4, 1, 2, 3, 4, 5, 7, 10, 1, 2, 3, 4, 5, 6, 7, 8, 10, 7, 1, 5, 7, 9, 9, 2, 4, 6, 9, 1, 8, 1, 2, 3, 5, 5, 2, 3, 4, 7, 8, 9, 3, 4, 8, 1, 2, 4, 5, 6, 8, 9, 10, 4, 5, 8, 4, 10, 2, 3, 5, 1, 2, 1, 4, 3, 6, 1, 3, 4, 1, 2, 6, 1, 2, 3, 5, 7, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 1, 8, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 2, 4, 6, 7, 8, 9, 3, 8, 7, 5, 4, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 3, 6, 8, 3, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 10, 5, 3, 5, 6, 7, 3, 4, 8, 1, 3, 4, 5, 6, 7, 10, 1, 2, 4, 7, 9, 10, 2, 8, 9, 2, 9, 10, 10, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 1, 2, 3, 5, 6, 7, 8, 9, 10, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 1, 2, 3, 4, 6, 7, 8, 9, 6, 9, 6, 5, 7, 7, 7, 9, 10, 8, 9, 10, 3, 1, 2, 4, 5, 6, 7, 8, 10, 7, 10, 10, 5, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 1, 2, 5, 6, 8, 10, 3, 1, 8, 9, 10, 3, 4, 8, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 4, 1, 5, 8, 10, 1, 2, 3, 4, 5, 6, 7, 1, 2, 3, 9, 3, 4, 7, 1, 8, 1, 2, 3, 4, 5, 6, 8, 3, 5, 6, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 2, 3, 4, 5, 8, 9, 3, 5, 7, 8, 9, 2, 2, 2, 3, 5, 8, 9, 10, 1, 3, 4, 5, 6, 7, 8, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 3, 4, 8, 10, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 3, 5, 10, 6, 5, 10, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 3, 8, 5, 3, 1, 2, 1, 2, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 1, 2, 3, 4, 5, 9, 7, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 2, 2, 7, 5, 6, 5, 6, 6, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 8, 1, 3, 5, 6, 7, 8, 9, 6, 1, 3, 5, 6, 7, 9, 10, 9, 1, 2, 4, 9, 10, 7, 5, 1, 2, 3, 4, 5, 6, 7, 10, 2, 7, 8, 2, 3, 4, 5, 6, 7, 2, 2, 3, 5, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 2, 3, 4, 8, 9, 2, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 2, 3, 5, 8, 9, 7, 10, 1, 2, 3, 4, 7, 9, 10, 3, 4, 8, 10, 2, 4, 1, 7, 7, 10, 1, 7, 8, 1, 6, 8, 10, 10, 1, 3, 4, 5, 6, 7, 8, 10, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 1, 1, 3, 4, 5, 1, 6, 10, 6, 3, 5, 4, 2, 2, 9, 3, 1, 1, 9, 10, 1, 2, 3, 4, 5, 6, 7, 10, 6, 2, 3, 4, 5, 6, 7, 8, 9, 10, 3, 5, 10, 1, 10, 2, 1, 2, 3, 4, 5, 7, 8, 9, 10, 1, 3, 4, 5, 8, 3, 5, 4, 5, 7, 4, 5, 6, 7, 8, 5, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 9, 1, 2, 5, 5, 1, 3, 4, 5, 6, 7, 8, 10, 3, 7, 10, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 7, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 1, 3, 4, 5, 6, 7, 8, 10, 8, 2, 3, 4, 6, 7, 8, 9, 10, 9, 5, 9, 8, 1, 2, 3, 5, 6, 8, 9, 10, 3, 9, 8, 4, 4, 9, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 8, 1, 2, 3, 5, 6, 3, 5, 7, 8, 10, 1, 2, 3, 4, 5, 6, 7, 8, 9, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 6, 2, 3, 4, 5, 6, 7, 8, 9, 2, 1, 2, 3, 4, 5, 6, 7, 9, 10, 2, 5, 2, 1, 2, 3, 6, 8, 9, 9, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 6, 4, 7, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 4, 5, 6, 7, 10, 3, 3, 4, 5, 7, 10, 1, 9, 1, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 6, 1, 2, 6, 9, 10, 1, 1, 1, 3, 2, 6, 7, 5, 7, 1, 2, 3, 4, 5, 6, 7, 9, 2, 4, 7, 5, 3, 4, 1, 4, 6, 7, 3, 4, 6, 8, 3, 6, 10, 6, 1, 5, 6, 8, 2, 1, 2, 3, 4, 5, 6, 7, 8, 10, 4, 8, 1, 3, 4, 8, 1, 10, 2, 3, 5, 6, 7, 8, 10, 3, 7, 7, 4, 1, 6, 6, 7, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 1, 2, 5, 7, 9, 1, 6, 7, 3, 5, 3, 1, 3, 4, 1, 5, 8, 9, 10, 5, 10, 3, 5, 7, 8, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 1, 2, 3, 3, 3, 3, 6, 7, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 9, 5, 1], \"Freq\": [0.14597457647323608, 0.5243168473243713, 0.12909317016601562, 0.049651216715574265, 0.007944194599986076, 0.022839559242129326, 0.06553960591554642, 0.034755852073431015, 0.018867462873458862, 0.4038994312286377, 0.19606097042560577, 0.17181314527988434, 0.03325415775179863, 0.0006927949143573642, 0.19328978657722473, 0.9846453666687012, 0.05245403200387955, 0.07399765402078629, 0.5367171764373779, 0.18265242874622345, 0.030910411849617958, 0.026227016001939774, 0.03278376907110214, 0.04964399337768555, 0.005620074924081564, 0.008430112153291702, 0.12413346767425537, 0.06308422237634659, 0.1973925679922104, 0.6145623922348022, 0.07897721976041794, 0.027874313294887543, 0.006968578323721886, 0.127757266163826, 0.7549293041229248, 0.0386761873960495, 0.08218690007925034, 0.0048345234245061874, 0.8702142834663391, 0.9961587190628052, 0.38717371225357056, 0.6116222143173218, 0.9911679625511169, 0.9902357459068298, 0.3397248089313507, 0.01449063140898943, 0.0941891074180603, 0.10062938928604126, 0.0040251752361655235, 0.20286883413791656, 0.03300643712282181, 0.21091918647289276, 0.1255282163619995, 0.12667985260486603, 0.06333992630243301, 0.012667985633015633, 0.1738968938589096, 0.03685232251882553, 0.07370464503765106, 0.3869493901729584, 0.9024051427841187, 0.09522868692874908, 0.7508026957511902, 0.0531729981303215, 0.19354970753192902, 0.22446227073669434, 0.772514820098877, 0.0022788047790527344, 0.02517748810350895, 0.7349889278411865, 0.18786278367042542, 0.01162037905305624, 0.03970295935869217, 0.34412068128585815, 0.6550520658493042, 0.04771804437041283, 0.8043898940086365, 0.03408431634306908, 0.11361439526081085, 0.9978160262107849, 0.06133546680212021, 0.7078112959861755, 0.06010875850915909, 0.011040383949875832, 0.05642862990498543, 0.013493802398443222, 0.012267093174159527, 0.07728268951177597, 0.8128737211227417, 0.14955469965934753, 0.015835203230381012, 0.012316268868744373, 0.007037867791950703, 0.9969621896743774, 0.9991598129272461, 0.8529109358787537, 0.0881236344575882, 0.006294545251876116, 0.050356362015008926, 0.9844499230384827, 0.9971557855606079, 0.999137282371521, 0.9962266683578491, 0.6339918971061707, 0.02204061858355999, 0.04278472810983658, 0.24115028977394104, 0.03241267427802086, 0.02722664549946785, 0.9965710639953613, 0.14439868927001953, 0.3110125660896301, 0.1871201992034912, 0.061518967151641846, 0.29563280940055847, 0.030767355114221573, 0.01678219437599182, 0.019579226151108742, 0.00839109718799591, 0.8978473544120789, 0.025173291563987732, 0.9901503324508667, 0.9818687438964844, 0.0017969019245356321, 0.02096385695040226, 0.6175352931022644, 0.11859553307294846, 0.024557659402489662, 0.027552496641874313, 0.004192771390080452, 0.14075732231140137, 0.031745269894599915, 0.012578314170241356, 0.9968400597572327, 0.9915972352027893, 0.9969091415405273, 0.9911938309669495, 0.9858373403549194, 0.023298190906643867, 0.15143823623657227, 0.8232027292251587, 0.003686217125505209, 0.012901759706437588, 0.02764662727713585, 0.020274193957448006, 0.007372434251010418, 0.00552932545542717, 0.1032140776515007, 0.7501451969146729, 0.06819501519203186, 0.832465648651123, 0.16556039452552795, 0.9908676147460938, 0.9820579290390015, 0.01671587862074375, 0.05610894411802292, 0.9409037828445435, 0.013235166668891907, 0.9843655228614807, 0.09290337562561035, 0.588257908821106, 0.0011710509425029159, 0.03083767369389534, 0.050745539367198944, 0.05933324620127678, 0.04801308736205101, 0.04332888498902321, 0.07065340876579285, 0.014052610844373703, 0.009513283148407936, 0.16172580420970917, 0.7934077978134155, 0.03424781933426857, 0.007427421398460865, 0.13072261214256287, 0.06758953630924225, 0.18197181820869446, 0.03936533257365227, 0.10546938329935074, 0.24139119684696198, 0.019311295822262764, 0.07501695305109024, 0.13295084238052368, 0.044250890612602234, 0.11761420220136642, 0.023289941251277924, 0.16128285229206085, 0.10946272313594818, 0.1676875799894333, 0.19796450436115265, 0.02270769327878952, 0.06288284063339233, 0.0931597650051117, 0.998639702796936, 0.9974706768989563, 0.001337522640824318, 0.9977918863296509, 0.061785414814949036, 0.9340500831604004, 0.9673571586608887, 0.02763877622783184, 0.9971907734870911, 0.982144832611084, 0.9899947643280029, 0.030463596805930138, 0.09139078855514526, 0.7326495051383972, 0.04874175414443016, 0.01675497740507126, 0.007615899201482534, 0.01218543853610754, 0.05940401181578636, 0.99476557970047, 0.9897249341011047, 0.10202129930257797, 0.3764234185218811, 0.3714982569217682, 0.004925166256725788, 0.0014071903424337506, 0.023922234773635864, 0.0731738954782486, 0.046437282115221024, 0.9913920760154724, 0.05558506026864052, 0.9393875598907471, 0.9452286958694458, 0.05472376570105553, 0.9884551167488098, 0.18599408864974976, 0.01752118207514286, 0.20149360597133636, 0.2715783417224884, 0.20014581084251404, 0.01347783301025629, 0.06671527028083801, 0.035716257989406586, 0.0006738916272297502, 0.0074128080159425735, 0.01812359318137169, 0.4086046516895294, 0.023066390305757523, 0.5272318124771118, 0.023066390305757523, 0.04739178344607353, 0.8909655213356018, 0.05687014013528824, 0.996481716632843, 0.9901353716850281, 0.9917146563529968, 0.9955679178237915, 0.0054613146930933, 0.13243688642978668, 0.045055847615003586, 0.046421173959970474, 0.20479929447174072, 0.13789819180965424, 0.028671901673078537, 0.0109226293861866, 0.38775333762168884, 0.06210208684206009, 0.9315313100814819, 0.9911101460456848, 0.985682487487793, 0.037090227007865906, 0.9602247476577759, 0.8974165320396423, 0.03992743045091629, 0.04689888656139374, 0.005703918635845184, 0.008872762322425842, 0.9924948215484619, 0.09890257567167282, 0.14101898670196533, 0.05016111582517624, 0.13344749808311462, 0.028866302222013474, 0.2067962884902954, 0.028866302222013474, 0.12918853759765625, 0.16278702020645142, 0.019875159487128258, 0.99397212266922, 0.9958775043487549, 0.9967539310455322, 0.12163206189870834, 0.17699562013149261, 0.04529745876789093, 0.08556186407804489, 0.02432641200721264, 0.09478912502527237, 0.04110324755311012, 0.009227260015904903, 0.4009663760662079, 0.9872007369995117, 0.9970030188560486, 0.989752471446991, 0.9943544268608093, 0.6778270602226257, 0.13264478743076324, 0.02312156930565834, 0.007301548030227423, 0.03772466629743576, 0.12047554552555084, 0.3486368954181671, 0.0047387536615133286, 0.6465014219284058, 0.9887388944625854, 0.0016635035863146186, 0.9981021881103516, 0.013510559685528278, 0.9862708449363708, 0.0026857545599341393, 0.9856719374656677, 0.009400141425430775, 0.9924080967903137, 0.9946733713150024, 0.9897469878196716, 0.049537550657987595, 0.9288290739059448, 0.021672679111361504, 0.23152561485767365, 0.4994880259037018, 0.006072802934795618, 0.04630511999130249, 0.00910920463502407, 0.024291211739182472, 0.019736608490347862, 0.05237792432308197, 0.08198283612728119, 0.029604913666844368, 0.9905489087104797, 0.016076363623142242, 0.032152727246284485, 0.008038181811571121, 0.9404672980308533, 0.9969877600669861, 0.8351331353187561, 0.03579141944646835, 0.12725839018821716, 0.9407901763916016, 0.05612668767571449, 0.007186023984104395, 0.9844852685928345, 0.12219513952732086, 0.32132795453071594, 0.027154475450515747, 0.5280036926269531, 0.006376359611749649, 0.9934368133544922, 0.049451667815446854, 0.9494720101356506, 0.04700107127428055, 0.6893490552902222, 0.03916756063699722, 0.0019583781249821186, 0.007833512499928474, 0.2134632021188736, 0.019393572583794594, 0.003062143223360181, 0.16433501243591309, 0.7624736428260803, 0.04695286229252815, 0.003062143223360181, 0.024980686604976654, 0.01405163574963808, 0.026541979983448982, 0.01405163574963808, 0.27010366320610046, 0.5214717984199524, 0.11709696799516678, 0.012490343302488327, 0.0858292356133461, 0.15020115673542023, 0.007152436301112175, 0.04470272734761238, 0.7116674184799194, 0.2507072985172272, 0.2215621918439865, 0.014572546817362309, 0.11628297716379166, 0.07137574255466461, 0.06988874822854996, 0.13055811822414398, 0.032119084149599075, 0.041041050106287, 0.051450010389089584, 0.01048524770885706, 0.19528773427009583, 0.12320166081190109, 0.07863935828208923, 0.01179590355604887, 0.14679346978664398, 0.4298951327800751, 0.0013106559636071324, 0.8896311521530151, 0.08087556064128876, 0.008366437628865242, 0.01952168717980385, 0.9776101112365723, 0.99211585521698, 0.9851323962211609, 0.007976780645549297, 0.003988390322774649, 0.9936339855194092, 0.14129090309143066, 0.029137810692191124, 0.45191097259521484, 0.049479302018880844, 0.1335941106081009, 0.01099540013819933, 0.11490193754434586, 0.062124013900756836, 0.007696780376136303, 0.011458919383585453, 0.05500281602144241, 0.5695083141326904, 0.21771948039531708, 0.06989941000938416, 0.010313027538359165, 0.065315842628479, 0.9911519289016724, 0.00985698401927948, 0.062098998576402664, 0.14194056391716003, 0.5105918049812317, 0.18235421180725098, 0.031542349606752396, 0.030556650832295418, 0.031542349606752396, 0.9842240810394287, 0.7061229944229126, 0.005525218788534403, 0.07514297962188721, 0.11934472620487213, 0.07514297962188721, 0.0011050438042730093, 0.018785744905471802, 0.29332059621810913, 0.04784662276506424, 0.10401439666748047, 0.5554368495941162, 0.997512698173523, 0.32539698481559753, 0.5732461214065552, 0.1003560796380043, 0.9919000864028931, 0.9959332346916199, 0.9922512769699097, 0.9963847994804382, 0.9902955293655396, 0.9944120645523071, 0.996181070804596, 0.9942311644554138, 0.11343295127153397, 0.8847770094871521, 0.003028275677934289, 0.47543928027153015, 0.2640656530857086, 0.016352688893675804, 0.004239586181938648, 0.21016234159469604, 0.02604317106306553, 0.10129164159297943, 0.11214431375265121, 0.1175706535577774, 0.0771745815873146, 0.0012058528373017907, 0.19173060357570648, 0.207406684756279, 0.08802726119756699, 0.06813068687915802, 0.035572659224271774, 0.9973658323287964, 0.114595428109169, 0.7639694809913635, 0.12005235254764557, 0.5815345048904419, 0.2825379967689514, 0.013715436682105064, 0.09326496720314026, 0.024687785655260086, 0.004114631097763777, 0.9915576577186584, 0.9918363094329834, 0.9877095818519592, 0.006995587144047022, 0.0029981087427586317, 0.24484555423259735, 0.12192308902740479, 0.2958134114742279, 0.11292876303195953, 0.044971633702516556, 0.12991805374622345, 0.038975413888692856, 0.9953435063362122, 0.9973883628845215, 0.009578458033502102, 0.47481784224510193, 0.06157580018043518, 0.45429256558418274, 0.9948939085006714, 0.9922352433204651, 0.0447232723236084, 0.2554982900619507, 0.08590410649776459, 0.18686357140541077, 0.07749082148075104, 0.13461261987686157, 0.03143913298845291, 0.04250925034284592, 0.11690043658018112, 0.023025844246149063, 0.9796628952026367, 0.767768919467926, 0.20836207270622253, 0.022648051381111145, 0.99672931432724, 0.012705815024673939, 0.9490266442298889, 0.037140075117349625, 0.011915273033082485, 0.013106800615787506, 0.6052958965301514, 0.3467344641685486, 0.010723746381700039, 0.0011915273498743773, 0.010723746381700039, 0.05133536830544472, 0.01480827946215868, 0.20534147322177887, 0.17967379093170166, 0.05429702252149582, 0.14512114226818085, 0.17572490870952606, 0.10299980640411377, 0.04936093091964722, 0.021389735862612724, 0.9927855730056763, 0.005768877454102039, 0.0879753828048706, 0.012979974038898945, 0.015864413231611252, 0.1543174684047699, 0.186046302318573, 0.09518647938966751, 0.015864413231611252, 0.425454705953598, 0.9893773794174194, 0.13153523206710815, 0.002684392500668764, 0.8643743395805359, 0.994407057762146, 0.9892554879188538, 0.03373618796467781, 0.00606493279337883, 0.7467448115348816, 0.015162331983447075, 0.18535950779914856, 0.010992689989507198, 0.0007581165991723537, 0.0011371748987585306, 0.7884163856506348, 0.004198170267045498, 0.19731400907039642, 0.004198170267045498, 0.0058774384669959545, 0.004380349535495043, 0.9943393468856812, 0.99397212266922, 0.03518839552998543, 0.9632822871208191, 0.996552050113678, 0.0027513126842677593, 0.2998930811882019, 0.09079331904649734, 0.6052888035774231, 0.0013756563421338797, 0.0013756563421338797, 0.996784508228302, 0.042793214321136475, 0.06828704476356506, 0.05462963879108429, 0.022762348875403404, 0.07192902266979218, 0.07830248028039932, 0.06464507430791855, 0.18118830025196075, 0.4079012870788574, 0.008194445632398129, 0.9926568269729614, 0.9913457632064819, 0.002587467897683382, 0.007762403693050146, 0.584767758846283, 0.26133424043655396, 0.0008624892798252404, 0.055199313908815384, 0.07331158965826035, 0.013799828477203846, 0.999565839767456, 0.03261076658964157, 0.011646702885627747, 0.016305383294820786, 0.9131014943122864, 0.025622745975852013, 0.006280622910708189, 0.027913879603147507, 0.10188566148281097, 0.2023756206035614, 0.2979806661605835, 0.24494428932666779, 0.03768373653292656, 0.039777278900146484, 0.016748327761888504, 0.025122491642832756, 0.9944507479667664, 0.15898659825325012, 0.8375879526138306, 0.002585147973150015, 0.9929267168045044, 0.9990204572677612, 0.9821109175682068, 0.9942479133605957, 0.014141467399895191, 0.9085893034934998, 0.07424270361661911, 0.989834189414978, 0.9895696043968201, 0.9942163825035095, 0.09427458047866821, 0.6226266026496887, 0.01035984419286251, 0.038331422954797745, 0.228952556848526, 0.004143937490880489, 0.15293754637241364, 0.5817509293556213, 0.06882189959287643, 0.07235122472047806, 0.029411068186163902, 0.0011764427181333303, 0.042940158396959305, 0.04411660134792328, 0.007058656308799982, 0.993468165397644, 0.977222204208374, 0.021785208955407143, 0.9887476563453674, 0.21482254564762115, 0.08933214843273163, 0.10422083735466003, 0.5912937521934509, 0.007280969060957432, 0.5405252575874329, 0.38901177048683167, 0.06275501847267151, 0.12769539654254913, 0.08756255358457565, 0.0583750382065773, 0.11310163140296936, 0.13134382665157318, 0.012161466293036938, 0.08999484777450562, 0.025539077818393707, 0.030403664335608482, 0.3247111439704895, 0.9984502792358398, 0.9873169660568237, 0.03167828917503357, 0.09503486752510071, 0.809556245803833, 0.05983676761388779, 0.01888403482735157, 0.9788225293159485, 0.006505103781819344, 0.9887757897377014, 0.9961590766906738, 0.1199457049369812, 0.306469202041626, 0.2245679497718811, 0.1421383023262024, 0.028533339500427246, 0.031175315380096436, 0.030646920204162598, 0.0544247031211853, 0.028533339500427246, 0.033817291259765625, 0.9652637839317322, 0.03120945394039154, 0.09274733066558838, 0.022713633254170418, 0.054891277104616165, 0.827154815196991, 0.4964466094970703, 0.04393332824110985, 0.03514666110277176, 0.005491666030138731, 0.14717665314674377, 0.03953999653458595, 0.04722832888364792, 0.1021449863910675, 0.04722832888364792, 0.03514666110277176, 0.005432654172182083, 0.6655001640319824, 0.2974378168582916, 0.008148981258273125, 0.021730616688728333, 0.11880787461996078, 0.6471237540245056, 0.23256009817123413, 0.9826817512512207, 0.012131873518228531, 0.03757386654615402, 0.03757386654615402, 0.6821101903915405, 0.12139248847961426, 0.06069624423980713, 0.06069624423980713, 0.7772735953330994, 0.011330518871545792, 0.18582050502300262, 0.022661037743091583, 0.002266103634610772, 0.010306724347174168, 0.020098112523555756, 0.3040483593940735, 0.6652990579605103, 0.9968202114105225, 0.9952912330627441, 0.052468378096818924, 0.9444308280944824, 0.9979932308197021, 0.2475365847349167, 0.07662525027990341, 0.0008545566815882921, 0.08631022274494171, 0.1860084980726242, 0.13103201985359192, 0.15211108326911926, 0.027060961350798607, 0.023357881233096123, 0.06893423944711685, 0.005418404936790466, 0.16616442799568176, 0.012642945162951946, 0.12462332099676132, 0.06140859052538872, 0.6267288327217102, 0.9934369921684265, 0.028500467538833618, 0.17739543318748474, 0.0495428666472435, 0.08203873038291931, 0.06525807827711105, 0.19683967530727386, 0.2426535040140152, 0.04927650839090347, 0.054870057851076126, 0.05380462110042572, 0.0676751434803009, 0.930533230304718, 0.9940144419670105, 0.47860440611839294, 0.06758534908294678, 0.014017703011631966, 0.4390544593334198, 0.9757325649261475, 0.7745398879051208, 0.22468292713165283, 0.0706712082028389, 0.13032031059265137, 0.06418761610984802, 0.1335621029138565, 0.09530888497829437, 0.14523258805274963, 0.18089236319065094, 0.02204423025250435, 0.056407298892736435, 0.10114412009716034, 0.9620084166526794, 0.03390337899327278, 0.9282425045967102, 0.06953127682209015, 0.9822536110877991, 0.07761429250240326, 0.054539769887924194, 0.19927993416786194, 0.018879150971770287, 0.6376957893371582, 0.004195366986095905, 0.006293050479143858, 0.15075059235095978, 0.19674231112003326, 0.261130690574646, 0.06489940732717514, 0.07409775257110596, 0.09811564534902573, 0.012264455668628216, 0.0884062796831131, 0.032194193452596664, 0.020951777696609497, 0.9877375960350037, 0.09006665647029877, 0.9075947999954224, 0.9926806092262268, 0.9876639246940613, 0.9913367033004761, 0.9899704456329346, 0.8912872076034546, 0.10728456825017929, 0.04388415813446045, 0.05119818449020386, 0.8996252417564392, 0.38986071944236755, 0.08291813731193542, 0.0029094084165990353, 0.09746517986059189, 0.06109757721424103, 0.1280139684677124, 0.09019166231155396, 0.050914645195007324, 0.06255228072404861, 0.032730843871831894, 0.06610316783189774, 0.1192731112241745, 0.439729779958725, 0.06538465619087219, 0.14873214066028595, 0.01796281896531582, 0.021555382758378983, 0.05748101696372032, 0.06466614454984665, 0.9845778346061707, 0.016519933938980103, 0.20191030204296112, 0.11013288795948029, 0.6699751019477844, 0.024320492520928383, 0.945024847984314, 0.0034743561409413815, 0.024320492520928383, 0.8505869507789612, 0.1069309338927269, 0.03888397663831711, 0.1204938143491745, 0.0472608245909214, 0.20181649923324585, 0.31720104813575745, 0.05407319590449333, 0.055776290595531464, 0.06727216392755508, 0.032784536480903625, 0.09281855821609497, 0.010644330643117428, 0.9710562825202942, 0.02562905102968216, 0.9893935322761536, 0.02042248845100403, 0.04413892701268196, 0.05138561874628067, 0.18709635734558105, 0.24177591502666473, 0.10870034247636795, 0.09552454948425293, 0.11067671328783035, 0.11001792550086975, 0.030963128432631493, 0.03080737218260765, 0.01760421320796013, 0.04401053115725517, 0.8890127539634705, 0.013203159905970097, 0.9939618110656738, 0.9913746118545532, 0.9991692900657654, 0.0565398707985878, 0.9399753212928772, 0.27267149090766907, 0.003909268882125616, 0.06548024713993073, 0.07329878956079483, 0.01954634301364422, 0.10555025190114975, 0.35867539048194885, 0.023455612361431122, 0.0029319515451788902, 0.07427610456943512, 0.9918331503868103, 0.99335777759552, 0.9937839508056641, 0.9942802786827087, 0.9872105121612549, 0.9916340708732605, 0.1997508704662323, 0.7990034818649292, 0.9793252348899841, 0.011330229230225086, 0.022660458460450172, 0.022660458460450172, 0.07931160181760788, 0.008497672155499458, 0.7307997941970825, 0.12179996073246002, 0.0028325573075562716, 0.009340658783912659, 0.01939982920885086, 0.894547700881958, 0.07041420042514801, 0.005748097784817219, 0.9890444874763489, 0.08462037891149521, 0.058473631739616394, 0.4787231683731079, 0.13738927245140076, 0.04040860757231712, 0.029474513605237007, 0.03422846645116806, 0.062276795506477356, 0.03708083927631378, 0.03708083927631378, 0.005477291997522116, 0.021909167990088463, 0.13419364392757416, 0.6517977118492126, 0.16979604959487915, 0.013693229295313358, 0.9946314096450806, 0.05208856984972954, 0.02996245212852955, 0.4881574809551239, 0.07928525656461716, 0.00046096081496216357, 0.02673572674393654, 0.01428978517651558, 0.23831672966480255, 0.06591739505529404, 0.00507056899368763, 0.041800208389759064, 0.8824488520622253, 0.07431147992610931, 0.989013671875, 0.012954325415194035, 0.818713366985321, 0.05699903145432472, 0.023317785933613777, 0.08679398149251938, 0.03643111512064934, 0.7521953582763672, 0.2014426290988922, 0.010715033859014511, 0.9896851778030396, 0.9900700449943542, 0.01565428450703621, 0.538691520690918, 0.17772217094898224, 0.0570920929312706, 0.1289176344871521, 0.03959612920880318, 0.0018416804959997535, 0.04143780842423439, 0.9562947154045105, 0.034648358821868896, 0.9939988255500793, 0.2003951221704483, 0.7981254458427429, 0.9991390109062195, 0.029498854652047157, 0.030482148751616478, 0.9390468597412109, 0.9947072267532349, 0.9927675127983093, 0.05053260177373886, 0.05053260177373886, 0.862663745880127, 0.03609471768140793, 0.9871604442596436, 0.024649545550346375, 0.10916227102279663, 0.08099136501550674, 0.017606819048523903, 0.7465291023254395, 0.007042727433145046, 0.014085454866290092, 0.999288022518158, 0.029907118529081345, 0.9630091786384583, 0.8654993772506714, 0.109810970723629, 0.023615263402462006, 0.0038585870061069727, 0.949212372303009, 0.04244445636868477, 0.011400483548641205, 0.22331535816192627, 0.06974413245916367, 0.07645030319690704, 0.004023700021207333, 0.14887690544128418, 0.197831928730011, 0.06303796917200089, 0.09522756934165955, 0.10998113453388214, 0.9821317195892334, 0.017413683235645294, 0.9934825897216797, 0.9919980764389038, 0.03944997489452362, 0.9589378833770752, 0.7953603863716125, 0.004642181098461151, 0.010058059357106686, 0.1493234932422638, 0.0007736968691460788, 0.010058059357106686, 0.029400480911135674, 0.997399091720581, 0.9823879599571228, 0.08994246274232864, 0.89942467212677, 0.9825891256332397, 0.0062472145073115826, 0.9912247061729431, 0.9937719106674194, 0.9973540306091309, 0.2906239628791809, 0.7079301476478577, 0.3073142468929291, 0.058261655271053314, 0.00768285570666194, 0.0877126008272171, 0.09987712651491165, 0.12804760038852692, 0.15557783842086792, 0.016646187752485275, 0.05313975363969803, 0.08579189330339432, 0.9963269233703613, 0.9896251559257507, 0.03023815155029297, 0.00403175363317132, 0.9293192028999329, 0.00201587681658566, 0.006047630216926336, 0.028222274035215378, 0.14302490651607513, 0.5369426608085632, 0.00799021776765585, 0.0031960872001945972, 0.1318386048078537, 0.09348555654287338, 0.018377501517534256, 0.005593152716755867, 0.057529572397470474, 0.0015980436000972986, 0.03587299957871437, 0.05188773199915886, 0.5912638902664185, 0.04163830354809761, 0.001281178556382656, 0.1114625334739685, 0.053809501230716705, 0.03202946484088898, 0.005124714225530624, 0.07558953762054443, 0.38828960061073303, 0.2538585662841797, 0.09002076834440231, 0.1578364223241806, 0.02760636992752552, 0.002400553785264492, 0.04260983318090439, 0.03660844638943672, 0.9921504855155945, 0.10637208819389343, 0.12473393231630325, 0.0348241962492466, 0.08104539662599564, 0.24060353636741638, 0.09624141454696655, 0.12283443659543991, 0.09307557344436646, 0.07344739139080048, 0.026593022048473358, 0.08147933334112167, 0.08059046417474747, 0.18221740424633026, 0.13392238318920135, 0.11673765629529953, 0.15347743034362793, 0.17629164457321167, 0.01807359606027603, 0.02844369411468506, 0.029036270454525948, 0.9883785843849182, 0.05343436449766159, 0.9449445605278015, 0.11606968194246292, 0.09041216969490051, 0.040318939834833145, 0.05498037487268448, 0.045206084847450256, 0.03909715637564659, 0.37508833408355713, 0.023213936015963554, 0.053758587688207626, 0.16127575933933258, 0.05763829126954079, 0.6063104867935181, 0.031036002561450005, 0.02438542991876602, 0.19619187712669373, 0.05652986094355583, 0.011084286496043205, 0.016626430675387383, 0.007939115166664124, 0.9884198904037476, 0.9813743829727173, 0.04756461828947067, 0.2102356106042862, 0.602168083190918, 0.0038051693700253963, 0.04756461828947067, 0.03234393894672394, 0.004756461828947067, 0.05327237397432327, 0.9908403158187866, 0.9954898357391357, 0.016417836770415306, 0.5438934564590454, 0.14986537396907806, 0.06061970070004463, 0.11366193741559982, 0.054726120084524155, 0.009261343628168106, 0.05220029875636101, 0.8966226577758789, 0.10018130391836166, 0.030344881117343903, 0.9659786820411682, 0.005181530024856329, 0.9896721839904785, 0.9962543249130249, 0.9940459132194519, 0.9952369332313538, 0.9923298954963684, 0.12975378334522247, 0.027523528784513474, 0.8375016450881958, 0.10295805335044861, 0.37246590852737427, 0.030281780287623405, 0.07684002071619034, 0.06737696379423141, 0.10901441425085068, 0.061320606619119644, 0.10712180286645889, 0.049964938312768936, 0.022711336612701416, 0.05779507756233215, 0.03638949245214462, 0.002140558324754238, 0.006421675439924002, 0.8947533965110779, 0.004667229950428009, 0.03267060965299606, 0.06534121930599213, 0.8961081504821777, 0.9892314672470093, 0.031490132212638855, 0.024223176762461662, 0.030278971418738365, 0.7981536984443665, 0.027856653556227684, 0.029067812487483025, 0.05934678390622139, 0.07341299206018448, 0.09762366116046906, 0.31395769119262695, 0.13511115312576294, 0.0328015498816967, 0.0656030997633934, 0.0015619785990566015, 0.26475536823272705, 0.01640077494084835, 0.9914216995239258, 0.034174300730228424, 0.09113147109746933, 0.8543575406074524, 0.017087150365114212, 0.9908544421195984, 0.08194844424724579, 0.027316147461533546, 0.885043203830719, 0.9932873845100403, 0.9978309273719788, 0.9882381558418274, 0.008702544495463371, 0.0406118743121624, 0.205960214138031, 0.742617130279541, 0.9882000684738159, 0.00920791458338499, 0.05371283367276192, 0.8885637521743774, 0.010742567479610443, 0.029158396646380424, 0.007673262152820826, 0.02076912485063076, 0.9553797245025635, 0.023365264758467674, 0.023188669234514236, 0.04289903864264488, 0.03246413916349411, 0.4672516882419586, 0.2944961190223694, 0.060290541499853134, 0.027826404199004173, 0.05101507529616356, 0.8877236247062683, 0.03228085860610008, 0.07923483103513718, 0.00905559305101633, 0.9870597124099731, 0.01923224702477455, 0.004808061756193638, 0.9736324548721313, 0.0532064363360405, 0.9458922147750854, 0.995581865310669, 0.9951834678649902, 0.9988921284675598, 0.997951328754425, 0.9936944842338562, 0.0076955161057412624, 0.9907976984977722, 0.9962940216064453, 0.002000590320676565, 0.002000590320676565, 0.7685399651527405, 0.22875602543354034, 0.20653143525123596, 0.7855704426765442, 0.006759210489690304, 0.3475077152252197, 0.03489319235086441, 0.11749748140573502, 0.01709054224193096, 0.17589017748832703, 0.010681589134037495, 0.04486267641186714, 0.18585965037345886, 0.012817907147109509, 0.0534079484641552, 0.9960513710975647, 0.990628182888031, 0.04634471610188484, 0.0932580754160881, 0.14557358622550964, 0.2888725697994232, 0.09695428609848022, 0.09581699222326279, 0.07705164700746536, 0.09581699222326279, 0.038667984306812286, 0.021892903372645378, 0.06009669229388237, 0.06688179820775986, 0.13085569441318512, 0.44103217124938965, 0.25686487555503845, 0.043618567287921906, 0.006430213805288076, 0.9902529120445251, 0.9888448715209961, 0.995150625705719, 0.9919627904891968, 0.0993473008275032, 0.038047902286052704, 0.16318322718143463, 0.17163830995559692, 0.03382035717368126, 0.052421554923057556, 0.09258323162794113, 0.2443520873785019, 0.02536526881158352, 0.07905508577823639, 0.04936597868800163, 0.9424414038658142, 0.007479693740606308, 0.9953469634056091, 0.05895381048321724, 0.21876835823059082, 0.016336597502231598, 0.11222532391548157, 0.061794959008693695, 0.24717983603477478, 0.026280615478754044, 0.014205737970769405, 0.1129356175661087, 0.13069278001785278, 0.9944037795066833, 0.9967643618583679, 0.11974797397851944, 0.8787139654159546, 0.004850804340094328, 0.989564061164856, 0.08816681057214737, 0.9062727689743042, 0.004100781865417957, 0.012024378404021263, 0.012024378404021263, 0.07455115020275116, 0.009619503282010555, 0.7070334553718567, 0.007214627228677273, 0.17555592954158783, 0.08572408556938171, 0.08572408556938171, 0.027652930468320847, 0.033183515071868896, 0.7659861445426941, 0.9979050755500793, 0.033542755991220474, 0.8609307408332825, 0.10062827169895172, 0.009946880862116814, 0.9880568385124207, 0.9938191771507263, 0.9970912337303162, 0.38660070300102234, 0.25971636176109314, 0.015530113130807877, 0.02296474203467369, 0.06509430706501007, 0.10193701833486557, 0.014208401553332806, 0.05749446153640747, 0.06030309945344925, 0.016025755554437637, 0.07527867704629898, 0.056459005922079086, 0.1351594477891922, 0.0958092212677002, 0.06843516230583191, 0.03763933852314949, 0.05132636800408363, 0.049615491181612015, 0.42771974205970764, 0.1785009503364563, 0.322469025850296, 0.04134218022227287, 0.0369647741317749, 0.046692345291376114, 0.1381315290927887, 0.027723580598831177, 0.1177036240696907, 0.07538868486881256, 0.015077737160027027, 0.002935288939625025, 0.012719585560262203, 0.22797410190105438, 0.15263502299785614, 0.04305090382695198, 0.13306643068790436, 0.41485416889190674, 0.0117411557585001, 0.9925194382667542, 0.9940184950828552, 0.9845526218414307, 0.0067686294205486774, 0.9916041493415833, 0.9902545213699341, 0.021419459953904152, 0.8906925320625305, 0.08746279031038284, 0.013840502128005028, 0.2886733412742615, 0.6959795355796814, 0.9894405603408813, 0.0154515216127038, 0.035819437354803085, 0.02177259884774685, 0.016856204718351364, 0.013344496488571167, 0.23739156126976013, 0.013344496488571167, 0.6468569040298462, 0.37053295969963074, 0.6289973855018616, 0.997157096862793, 0.9916903972625732, 0.06309398263692856, 0.23159648478031158, 0.09142960608005524, 0.03778082877397537, 0.05516001209616661, 0.10049700736999512, 0.044959187507629395, 0.051759738475084305, 0.19872716069221497, 0.12505455315113068, 0.5734108686447144, 0.11946059763431549, 0.0902591198682785, 0.11680591851472855, 0.09291379898786545, 0.006636700127273798, 0.9915407299995422, 0.7820499539375305, 0.031643640249967575, 0.12431430071592331, 0.06102702021598816, 0.11312844604253769, 0.8551743626594543, 0.028761468827724457, 0.11257651448249817, 0.05992879346013069, 0.0016802465543150902, 0.18146662414073944, 0.20835056900978088, 0.053767889738082886, 0.1893077790737152, 0.044806573539972305, 0.05208764225244522, 0.09633413702249527, 0.98520827293396, 0.1578998863697052, 0.6178691387176514, 0.17963972687721252, 0.044623881578445435, 0.052307017147541046, 0.0018681077053770423, 0.08406484872102737, 0.32598480582237244, 0.04390053078532219, 0.4763674736022949, 0.014944861643016338, 0.021586883813142776, 0.05396721139550209, 0.11872786283493042, 0.8041114211082458, 0.08918504416942596, 0.9111337065696716, 0.992642879486084, 0.9945716857910156, 0.9977501630783081, 0.014667825773358345, 0.1222318783402443, 0.017927341163158417, 0.02770589292049408, 0.23631496727466583, 0.016297584399580956, 0.5655261278152466, 0.09712512791156769, 0.8602511286735535, 0.03700004890561104, 0.05592203140258789, 0.08879926800727844, 0.05991646274924278, 0.43631476163864136, 0.06944164633750916, 0.10846415907144547, 0.016899514943361282, 0.006145277991890907, 0.1428777128458023, 0.015363195911049843, 0.007691915612667799, 0.5176659226417542, 0.26498648524284363, 0.13422392308712006, 0.0703810304403305, 0.004999745171517134, 0.38162606954574585, 0.48754677176475525, 0.11059367656707764, 0.0077882870100438595, 0.01246125902980566, 0.9941399097442627, 0.9962308406829834, 0.05935389921069145, 0.02518044225871563, 0.235616996884346, 0.5917403697967529, 0.05215948820114136, 0.03417345881462097, 0.18873514235019684, 0.0022074286825954914, 0.04635600000619888, 0.04304485768079758, 0.18100914359092712, 0.020970571786165237, 0.5165383219718933, 0.05881161615252495, 0.10455398261547089, 0.2867973744869232, 0.06098982319235802, 0.0762372836470604, 0.007986762560904026, 0.014521386474370956, 0.29115381836891174, 0.07986762374639511, 0.019603872671723366, 0.14539267122745514, 0.03940030187368393, 0.20477059483528137, 0.01609308086335659, 0.001664801500737667, 0.07658086717128754, 0.000554933852981776, 0.4916713833808899, 0.02497202344238758, 0.9953871369361877, 0.9897565841674805, 0.997833251953125, 0.9885253310203552, 0.990960955619812, 0.04804592579603195, 0.3053353428840637, 0.12394455820322037, 0.12046296894550323, 0.09365473687648773, 0.06649834662675858, 0.07102441042661667, 0.0633649155497551, 0.0849507674574852, 0.022978484630584717, 0.9855167269706726, 0.9920024871826172, 0.9905186891555786, 0.9939175248146057, 0.07082290202379227, 0.9248637557029724, 0.05752488970756531, 0.2647901475429535, 0.1321755051612854, 0.1901395171880722, 0.040399160236120224, 0.1036326214671135, 0.04215564206242561, 0.0724550113081932, 0.07552886009216309, 0.02063870057463646, 0.08443162590265274, 0.36705005168914795, 0.031851451843976974, 0.05965827405452728, 0.059152692556381226, 0.11881096661090851, 0.05814153701066971, 0.08948741108179092, 0.10768824070692062, 0.022751037031412125, 0.022309089079499245, 0.9704453945159912, 0.9777593612670898, 0.988647997379303, 0.21923422813415527, 0.7778599262237549, 0.09414855390787125, 0.9040675163269043, 0.06514804810285568, 0.08344806730747223, 0.1372501105070114, 0.21703816950321198, 0.038064029067754745, 0.14420410990715027, 0.09625807404518127, 0.0366000272333622, 0.10870208591222763, 0.0732000544667244, 0.04354304447770119, 0.03197692334651947, 0.2496921420097351, 0.04966628551483154, 0.20206694304943085, 0.000680360069964081, 0.03197692334651947, 0.09865221381187439, 0.23336350917816162, 0.05851096659898758, 0.025808844715356827, 0.011731293052434921, 0.8540381193161011, 0.0023462586104869843, 0.08211904764175415, 0.02111632749438286, 0.9889754056930542, 0.06689330190420151, 0.09980905801057816, 0.13484841585159302, 0.13591021299362183, 0.0658315047621727, 0.006370791234076023, 0.024421365931630135, 0.06052251532673836, 0.3302193284034729, 0.07432589679956436, 0.9910752177238464, 0.9975854754447937, 0.9883419275283813, 0.04155004024505615, 0.9556509256362915, 0.14121027290821075, 0.8573481440544128, 0.9959388971328735, 0.3781931698322296, 0.09959732741117477, 0.006086503155529499, 0.07110141962766647, 0.044542137533426285, 0.15022596716880798, 0.05948173627257347, 0.11647354066371918, 0.014662939123809338, 0.059758394956588745, 0.9975150227546692, 0.18402892351150513, 0.0029210939537733793, 0.09347500652074814, 0.04965859651565552, 0.020447658374905586, 0.0788695365190506, 0.5696133375167847, 0.9938865900039673, 0.2841353714466095, 0.05682707577943802, 0.07019815593957901, 0.46798768639564514, 0.0969403088092804, 0.00501415366306901, 0.018385231494903564, 0.9947482943534851, 0.10640288889408112, 0.03546762838959694, 0.038195908069610596, 0.6002213954925537, 0.2209906131029129, 0.995053231716156, 0.9794116616249084, 0.009374712593853474, 0.007031034678220749, 0.20858736336231232, 0.35780155658721924, 0.003124904353171587, 0.019530652090907097, 0.3788946568965912, 0.015624521300196648, 0.9000885486602783, 0.09724575281143188, 0.9930782318115234, 0.9914439916610718, 0.09694426506757736, 0.31304919719696045, 0.07068853080272675, 0.23933115601539612, 0.27871477603912354, 0.9975038170814514, 0.992777407169342, 0.1509067863225937, 0.8492205142974854, 0.3419284224510193, 0.25229448080062866, 0.0018199783517047763, 0.046181950718164444, 0.0946388766169548, 0.0657467171549797, 0.055964332073926926, 0.040494516491889954, 0.06074177846312523, 0.04026702046394348, 0.009788775816559792, 0.09788775444030762, 0.029366327449679375, 0.8222571611404419, 0.039155103266239166, 0.9927554130554199, 0.01437199953943491, 0.12559878826141357, 0.22620278596878052, 0.058112870901823044, 0.07061026245355606, 0.017496347427368164, 0.07560921460390091, 0.015621739439666271, 0.3499269485473633, 0.047490086406469345, 0.11002861708402634, 0.20538675785064697, 0.07579749077558517, 0.03178604692220688, 0.5745939016342163, 0.32183465361595154, 0.6758527755737305, 0.04023195430636406, 0.04446689784526825, 0.029644599184393883, 0.09105126559734344, 0.5357202291488647, 0.1588103473186493, 0.09952115267515182, 0.21029803156852722, 0.7733006477355957, 0.001655890024267137, 0.013247120194137096, 0.9960846304893494, 0.9994639158248901, 0.9940467476844788, 0.9879651665687561, 0.3193744719028473, 0.6790438294410706, 0.17297442257404327, 0.014766109175980091, 0.8100265264511108, 0.07929543405771255, 0.004719966556876898, 0.9128414988517761, 0.001887986552901566, 0.9900220036506653, 0.009148814715445042, 0.04269447177648544, 0.2155054211616516, 0.07522358745336533, 0.4340604543685913, 0.14231489598751068, 0.0548928901553154, 0.0274464450776577, 0.12139325588941574, 0.029258888214826584, 0.5005137324333191, 0.1269960254430771, 0.03672924265265465, 0.023656122386455536, 0.06785571575164795, 0.041709478944540024, 0.00622529536485672, 0.045444656163454056, 0.9914926290512085, 0.9966533184051514, 0.9305997490882874, 0.06876352429389954, 0.9908766746520996, 0.035966336727142334, 0.9531079530715942, 0.9877041578292847, 0.9908069968223572, 0.11258410662412643, 0.8851439952850342, 0.9980053305625916, 0.995263397693634, 0.014253037050366402, 0.9834595918655396, 0.991935670375824, 0.9887183308601379, 0.02808547578752041, 0.954906165599823, 0.009361824952065945, 0.012288461439311504, 0.038913462311029434, 0.04300961643457413, 0.13312500715255737, 0.06553845852613449, 0.08806730806827545, 0.5345481038093567, 0.08192307502031326, 0.9892112612724304, 0.0012262746458873153, 0.5174878835678101, 0.32312336564064026, 0.04230647534132004, 0.052116669714450836, 0.005518235731869936, 0.03556196391582489, 0.004291960969567299, 0.017780981957912445, 0.05752670019865036, 0.857670783996582, 0.08367519825696945, 0.9361377358436584, 0.06112239509820938, 0.9920046329498291, 0.11347293853759766, 0.09019643813371658, 0.6204642057418823, 0.04364343732595444, 0.0065465159714221954, 0.01454781275242567, 0.038551703095436096, 0.06546515971422195, 0.007273906376212835, 0.0005374159081839025, 0.21496635675430298, 0.028483042493462563, 0.7529196739196777, 0.003224495565518737, 0.051434118300676346, 0.9429588317871094, 0.9488336443901062, 0.044476576149463654, 0.004941842053085566, 0.5825805068016052, 0.09321288019418716, 0.28962573409080505, 0.015535479411482811, 0.01886451058089733, 0.9942586421966553, 0.07540912181138992, 0.0951591283082962, 0.0071818213909864426, 0.025136373937129974, 0.515295684337616, 0.15800006687641144, 0.014363642781972885, 0.021545464172959328, 0.07361366599798203, 0.014363642781972885, 0.9839997291564941, 0.04444682598114014, 0.9259755611419678, 0.029631217941641808, 0.9803986549377441, 0.03679770976305008, 0.08715246617794037, 0.213039368391037, 0.02324065938591957, 0.07553213834762573, 0.5054843425750732, 0.013557050377130508, 0.04454459622502327, 0.016165364533662796, 0.010776909999549389, 0.9645334482192993, 0.25457146763801575, 0.056047629565000534, 0.09533335268497467, 0.08485715836286545, 0.07542858272790909, 0.0790952518582344, 0.19380955398082733, 0.029857147485017776, 0.056571438908576965, 0.07490477710962296, 0.9938823580741882, 0.27106085419654846, 0.05702020227909088, 0.04785112291574478, 0.04240698367357254, 0.06332394480705261, 0.31919851899147034, 0.004011471290141344, 0.12406907975673676, 0.01432668324559927, 0.056733667850494385, 0.08566708862781525, 0.05930798500776291, 0.02416251227259636, 0.7292685508728027, 0.026359103620052338, 0.013179551810026169, 0.008786368183791637, 0.0505216158926487, 0.991389274597168, 0.0069252182729542255, 0.14658378064632416, 0.027700873091816902, 0.14196696877479553, 0.19736872613430023, 0.0819484144449234, 0.29201337695121765, 0.10618668049573898, 0.9818829298019409, 0.9773091077804565, 0.9974721074104309, 0.991992175579071, 0.1665264517068863, 0.16190071403980255, 0.025441542267799377, 0.11217407137155533, 0.016190072521567345, 0.011564336717128754, 0.49957937002182007, 0.005782168358564377, 0.9955350160598755, 0.9916284680366516, 0.989132285118103, 0.9933214783668518, 0.9947446584701538, 0.9944844245910645, 0.23300251364707947, 0.11411284655332565, 0.01326893549412489, 0.058914076536893845, 0.11835891008377075, 0.13640466332435608, 0.058914076536893845, 0.05148347094655037, 0.14808131754398346, 0.06793694943189621, 0.9847082495689392, 0.053800374269485474, 0.8495976328849792, 0.01793345808982849, 0.056042056530714035, 0.022416822612285614, 0.0005919176619499922, 0.029595881700515747, 0.14857132732868195, 0.0017757529858499765, 0.8192140460014343, 0.0007286479230970144, 0.0888950452208519, 0.13552851974964142, 0.1741468608379364, 0.16175983846187592, 0.0029145916923880577, 0.11658366769552231, 0.3133186101913452, 0.0065578315407037735, 0.27614715695381165, 0.19480778276920319, 0.008133936673402786, 0.15861175954341888, 0.06629158556461334, 0.11224832385778427, 0.06303800642490387, 0.04026298597455025, 0.05571746826171875, 0.025215202942490578, 0.9920874834060669, 0.016400950029492378, 0.21936270594596863, 0.21833765506744385, 0.1189068928360939, 0.06970404088497162, 0.0061503564938902855, 0.09225534647703171, 0.25831496715545654, 0.9893152713775635, 0.010923835448920727, 0.024906344711780548, 0.25692862272262573, 0.41729050874710083, 0.03189760074019432, 0.09263412654399872, 0.11972523480653763, 0.02752806432545185, 0.017915090546011925, 0.9877343773841858, 0.9829915761947632, 0.9950519800186157, 0.011209438554942608, 0.25333330035209656, 0.13227137923240662, 0.017935100942850113, 0.05156341567635536, 0.5313273668289185, 0.9887501001358032, 0.11263987421989441, 0.2589215338230133, 0.01922387257218361, 0.10693278908729553, 0.12255217880010605, 0.14748314023017883, 0.10513054579496384, 0.0423525907099247, 0.07779660820960999, 0.006908578798174858, 0.9897759556770325, 0.9859561324119568, 0.9881446361541748, 0.13968577980995178, 0.12965309619903564, 0.05653029680252075, 0.1337047666311264, 0.14470212161540985, 0.09781863540410995, 0.11248178035020828, 0.04726935923099518, 0.06926408410072327, 0.06907114386558533, 0.010668043047189713, 0.06756427139043808, 0.8498874306678772, 0.021336086094379425, 0.04978420212864876, 0.9941994547843933, 0.018543830141425133, 0.0028528969269245863, 0.46074286103248596, 0.04136700555682182, 0.4750073254108429, 0.16668911278247833, 0.8296571969985962, 0.9947404861450195, 0.0642903670668602, 0.4736796021461487, 0.013301455415785313, 0.13375352323055267, 0.05172788351774216, 0.08128667622804642, 0.008128667250275612, 0.04951097443699837, 0.06133449077606201, 0.0635513961315155, 0.9842153787612915, 0.10245499759912491, 0.8282981514930725, 0.049062956124544144, 0.002886056201532483, 0.01587330922484398, 0.998214602470398, 0.9969621896743774, 0.9986305832862854, 0.9919179081916809, 0.038597408682107925, 0.9544086456298828, 0.0035088553559035063, 0.9932376742362976, 0.9932900071144104, 0.03596395254135132, 0.014651980251073837, 0.042623940855264664, 0.06393591314554214, 0.03329995647072792, 0.6793190836906433, 0.08391588926315308, 0.04528793692588806, 0.014020249247550964, 0.972070574760437, 0.009346832521259785, 0.9925262928009033, 0.00552379060536623, 0.9942823648452759, 0.9951925873756409, 0.04679282754659653, 0.8838645219802856, 0.0675896406173706, 0.712087094783783, 0.12702594697475433, 0.05285021290183067, 0.10662762075662613, 0.9875603914260864, 0.9902965426445007, 0.9930481314659119, 0.9881598949432373, 0.020773133262991905, 0.6825457811355591, 0.29379144310951233, 0.0029675904661417007, 0.9970453381538391, 0.003083824645727873, 0.05119149014353752, 0.5261004567146301, 0.3065321743488312, 0.0018502947641536593, 0.03638913109898567, 0.028371186926960945, 0.043173544108867645, 0.003083824645727873, 0.9957663416862488, 0.9857692122459412, 0.021711334586143494, 0.005427833646535873, 0.9458000063896179, 0.025782210752367973, 0.9875295758247375, 0.006672497373074293, 0.007349291816353798, 0.07349291443824768, 0.012861260212957859, 0.22231607139110565, 0.09554079174995422, 0.014698583632707596, 0.5750820636749268, 0.9970065355300903, 0.003268874017521739, 0.9880400896072388, 0.993407666683197, 0.9575022459030151, 0.039282143115997314, 0.9776107668876648, 0.013391928747296333, 0.17330676317214966, 0.11415580660104752, 0.09121408313512802, 0.1843630075454712, 0.10005908459424973, 0.14179643988609314, 0.06937798857688904, 0.04201376065611839, 0.052793607115745544, 0.030404694378376007, 0.08410553634166718, 0.021627137437462807, 0.07689648866653442, 0.06728442758321762, 0.7473377585411072, 0.33522024750709534, 0.6621634364128113, 0.0027590144891291857, 0.04096704348921776, 0.9597993493080139, 0.998680591583252, 0.01381960790604353, 0.31515446305274963, 0.6707565784454346, 0.05501968786120415, 0.14755280315876007, 0.010003579780459404, 0.005001789890229702, 0.782780110836029, 0.04238605871796608, 0.9506587982177734, 0.01251604687422514, 0.007822529412806034, 0.9778161644935608, 0.9944337606430054, 0.1177646666765213, 0.5513187050819397, 0.10501307994127274, 0.06225775554776192, 0.027003364637494087, 0.04050504416227341, 0.01575196161866188, 0.028503550216555595, 0.01575196161866188, 0.036004483699798584, 0.10179449617862701, 0.06227722391486168, 0.09354089200496674, 0.3176388442516327, 0.2118425965309143, 0.047520771622657776, 0.05627460032701492, 0.05527416244149208, 0.05027197673916817, 0.004001749213784933, 0.22780553996562958, 0.1664034128189087, 0.0973714292049408, 0.1500537246465683, 0.10609126091003418, 0.051228996366262436, 0.08029509335756302, 0.011989765800535679, 0.05340895429253578, 0.054862260818481445, 0.009545913897454739, 0.9880020618438721, 0.9944477081298828, 0.9948763847351074, 0.9953917860984802, 0.9885062575340271, 0.9815220236778259, 0.9882037043571472, 0.13010364770889282, 0.032213762402534485, 0.015482583083212376, 0.0389561764895916, 0.21625672280788422, 0.06367836892604828, 0.24472470581531525, 0.04095393046736717, 0.06792359054088593, 0.14983144402503967, 0.9868294596672058, 0.9907128214836121, 0.9910128712654114], \"Term\": [\"accept\", \"accept\", \"accept\", \"accept\", \"accept\", \"accept\", \"accept\", \"accept\", \"accept\", \"access\", \"access\", \"access\", \"access\", \"access\", \"access\", \"adaptec\", \"address\", \"address\", \"address\", \"address\", \"address\", \"address\", \"address\", \"address\", \"address\", \"address\", \"administr\", \"administr\", \"administr\", \"administr\", \"agenc\", \"agenc\", \"agenc\", \"agenc\", \"agenc\", \"aid\", \"aid\", \"aid\", \"aid\", \"alaska\", \"algorithm\", \"algorithm\", \"alomar\", \"amanda\", \"american\", \"american\", \"american\", \"american\", \"american\", \"american\", \"american\", \"american\", \"andrew\", \"andrew\", \"andrew\", \"andrew\", \"andrew\", \"andrew\", \"andrew\", \"andrew\", \"anonym\", \"anonym\", \"anti\", \"anti\", \"anti\", \"appl\", \"appl\", \"appl\", \"applic\", \"applic\", \"applic\", \"applic\", \"applic\", \"arab\", \"arab\", \"archiv\", \"archiv\", \"archiv\", \"archiv\", \"argic\", \"argument\", \"argument\", \"argument\", \"argument\", \"argument\", \"argument\", \"argument\", \"argument\", \"arm\", \"arm\", \"arm\", \"arm\", \"arm\", \"armenia\", \"armenian\", \"armi\", \"armi\", \"armi\", \"armi\", \"armori\", \"atheism\", \"atheist\", \"atho\", \"attack\", \"attack\", \"attack\", \"attack\", \"attack\", \"attack\", \"aurora\", \"author\", \"author\", \"author\", \"author\", \"author\", \"auto\", \"auto\", \"auto\", \"auto\", \"auto\", \"auto\", \"autom\", \"automot\", \"avail\", \"avail\", \"avail\", \"avail\", \"avail\", \"avail\", \"avail\", \"avail\", \"avail\", \"avail\", \"azerbaijan\", \"azerbaijani\", \"azeri\", \"baalk\", \"baerga\", \"ball\", \"ball\", \"ball\", \"bank\", \"bank\", \"bank\", \"bank\", \"bank\", \"bank\", \"bank\", \"bank\", \"bank\", \"basebal\", \"basebal\", \"bat\", \"batf\", \"batf\", \"batteri\", \"batteri\", \"belief\", \"belief\", \"believ\", \"believ\", \"believ\", \"believ\", \"believ\", \"believ\", \"believ\", \"believ\", \"believ\", \"believ\", \"berkeley\", \"berkeley\", \"berkeley\", \"berkeley\", \"best\", \"best\", \"best\", \"best\", \"best\", \"best\", \"best\", \"best\", \"best\", \"best\", \"better\", \"better\", \"better\", \"better\", \"better\", \"better\", \"better\", \"better\", \"better\", \"better\", \"bibl\", \"biblic\", \"bike\", \"bike\", \"billion\", \"billion\", \"binari\", \"binari\", \"bio\", \"blah\", \"blast\", \"board\", \"board\", \"board\", \"board\", \"board\", \"board\", \"board\", \"board\", \"boni\", \"bontchev\", \"book\", \"book\", \"book\", \"book\", \"book\", \"book\", \"book\", \"book\", \"boyl\", \"brake\", \"brake\", \"brave\", \"brave\", \"bruin\", \"build\", \"build\", \"build\", \"build\", \"build\", \"build\", \"build\", \"build\", \"build\", \"build\", \"buy\", \"buy\", \"buy\", \"buy\", \"buy\", \"byte\", \"byte\", \"byte\", \"cach\", \"cactus\", \"cadr\", \"callison\", \"canada\", \"canada\", \"canada\", \"canada\", \"canada\", \"canada\", \"canada\", \"canada\", \"canada\", \"cancer\", \"cancer\", \"candida\", \"canuck\", \"car\", \"car\", \"card\", \"card\", \"card\", \"card\", \"card\", \"carlo\", \"case\", \"case\", \"case\", \"case\", \"case\", \"case\", \"case\", \"case\", \"case\", \"case\", \"catbyt\", \"catcher\", \"cathol\", \"caus\", \"caus\", \"caus\", \"caus\", \"caus\", \"caus\", \"caus\", \"caus\", \"caus\", \"centerlin\", \"centri\", \"char\", \"chastiti\", \"children\", \"children\", \"children\", \"children\", \"children\", \"children\", \"chip\", \"chip\", \"chip\", \"chopin\", \"christ\", \"christ\", \"christian\", \"christian\", \"church\", \"church\", \"church\", \"cica\", \"cipher\", \"ciphertext\", \"circuit\", \"circuit\", \"circuit\", \"claim\", \"claim\", \"claim\", \"claim\", \"claim\", \"claim\", \"claim\", \"claim\", \"claim\", \"claim\", \"clarkson\", \"classifi\", \"classifi\", \"classifi\", \"classifi\", \"clayton\", \"cleveland\", \"cleveland\", \"cleveland\", \"client\", \"client\", \"clinic\", \"clinic\", \"clinton\", \"clinton\", \"clinton\", \"clinton\", \"clipper\", \"clipper\", \"coach\", \"coach\", \"code\", \"code\", \"code\", \"code\", \"code\", \"code\", \"color\", \"color\", \"color\", \"color\", \"color\", \"color\", \"colorado\", \"colorado\", \"colorado\", \"colorado\", \"colorado\", \"colorado\", \"colorado\", \"colorado\", \"columbia\", \"columbia\", \"columbia\", \"columbia\", \"columbia\", \"come\", \"come\", \"come\", \"come\", \"come\", \"come\", \"come\", \"come\", \"come\", \"come\", \"communic\", \"communic\", \"communic\", \"communic\", \"communic\", \"communic\", \"communic\", \"communic\", \"compil\", \"compil\", \"compil\", \"compil\", \"concordia\", \"config\", \"contradict\", \"contradict\", \"contradict\", \"contrib\", \"control\", \"control\", \"control\", \"control\", \"control\", \"control\", \"control\", \"control\", \"control\", \"copi\", \"copi\", \"copi\", \"copi\", \"copi\", \"copi\", \"copi\", \"copper\", \"cost\", \"cost\", \"cost\", \"cost\", \"cost\", \"cost\", \"cost\", \"cost\", \"counterst\", \"countri\", \"countri\", \"countri\", \"countri\", \"countri\", \"countri\", \"countri\", \"court\", \"court\", \"court\", \"court\", \"cramer\", \"crime\", \"crime\", \"crime\", \"crypt\", \"crypto\", \"cryptograph\", \"cryptographi\", \"ctrl\", \"cub\", \"cunixb\", \"cure\", \"cwru\", \"cwru\", \"data\", \"data\", \"data\", \"data\", \"data\", \"data\", \"data\", \"david\", \"david\", \"david\", \"david\", \"david\", \"david\", \"david\", \"david\", \"david\", \"david\", \"davidian\", \"dealer\", \"dealer\", \"dealer\", \"death\", \"death\", \"death\", \"death\", \"death\", \"death\", \"decrypt\", \"den\", \"desi\", \"design\", \"design\", \"design\", \"design\", \"design\", \"design\", \"design\", \"design\", \"design\", \"deskjet\", \"detroit\", \"devic\", \"devic\", \"devic\", \"devic\", \"diamond\", \"diet\", \"differ\", \"differ\", \"differ\", \"differ\", \"differ\", \"differ\", \"differ\", \"differ\", \"differ\", \"differ\", \"dillon\", \"directori\", \"directori\", \"directori\", \"diseas\", \"disk\", \"disk\", \"disk\", \"display\", \"display\", \"display\", \"display\", \"display\", \"display\", \"display\", \"distribut\", \"distribut\", \"distribut\", \"distribut\", \"distribut\", \"distribut\", \"distribut\", \"distribut\", \"distribut\", \"distribut\", \"divin\", \"divis\", \"divis\", \"divis\", \"divis\", \"divis\", \"divis\", \"divis\", \"divis\", \"divis\", \"dock\", \"doctor\", \"doctor\", \"doctor\", \"doctrin\", \"dodger\", \"drive\", \"drive\", \"drive\", \"drive\", \"drive\", \"drive\", \"drive\", \"drive\", \"driver\", \"driver\", \"driver\", \"driver\", \"driver\", \"dseg\", \"dseg\", \"dtmedin\", \"duke\", \"duke\", \"dyer\", \"earth\", \"earth\", \"earth\", \"earth\", \"earth\", \"earth\", \"edmonton\", \"effect\", \"effect\", \"effect\", \"effect\", \"effect\", \"effect\", \"effect\", \"effect\", \"effect\", \"effect\", \"einstein\", \"eisa\", \"email\", \"email\", \"email\", \"email\", \"email\", \"email\", \"email\", \"email\", \"encrypt\", \"enforc\", \"enforc\", \"enforc\", \"enforc\", \"enforc\", \"engin\", \"engin\", \"engin\", \"engin\", \"engin\", \"engin\", \"engin\", \"engin\", \"engin\", \"engin\", \"engr\", \"entri\", \"entri\", \"entri\", \"ericsson\", \"escrow\", \"esdi\", \"espn\", \"etern\", \"etern\", \"etern\", \"ether\", \"ethernet\", \"ethnic\", \"evid\", \"evid\", \"evid\", \"evid\", \"evid\", \"evid\", \"exist\", \"exist\", \"exist\", \"exist\", \"exist\", \"exist\", \"exist\", \"exist\", \"exist\", \"extermin\", \"faith\", \"faith\", \"fbihh\", \"feder\", \"feder\", \"feder\", \"feder\", \"file\", \"file\", \"file\", \"file\", \"final\", \"final\", \"final\", \"final\", \"final\", \"final\", \"final\", \"final\", \"final\", \"final\", \"firearm\", \"fischer\", \"flight\", \"flight\", \"flight\", \"flight\", \"floppi\", \"floppi\", \"flyer\", \"flyer\", \"fnal\", \"follow\", \"follow\", \"follow\", \"follow\", \"follow\", \"follow\", \"follow\", \"follow\", \"follow\", \"follow\", \"font\", \"font\", \"food\", \"food\", \"food\", \"food\", \"forc\", \"forc\", \"forc\", \"forc\", \"forc\", \"forc\", \"forc\", \"forc\", \"forc\", \"forc\", \"format\", \"format\", \"format\", \"format\", \"format\", \"freenet\", \"freenet\", \"freenet\", \"frost\", \"frost\", \"function\", \"function\", \"function\", \"function\", \"function\", \"function\", \"fund\", \"fund\", \"fund\", \"fund\", \"fund\", \"game\", \"game\", \"game\", \"game\", \"gatech\", \"gaza\", \"genet\", \"genet\", \"genocid\", \"go\", \"go\", \"go\", \"go\", \"go\", \"go\", \"go\", \"go\", \"go\", \"go\", \"goal\", \"goal\", \"goal\", \"goal\", \"goal\", \"goal\", \"god\", \"good\", \"good\", \"good\", \"good\", \"good\", \"good\", \"good\", \"good\", \"good\", \"good\", \"gordon\", \"gordon\", \"gospel\", \"govern\", \"govern\", \"govern\", \"govern\", \"gradi\", \"graphic\", \"graphic\", \"great\", \"great\", \"great\", \"great\", \"great\", \"great\", \"great\", \"great\", \"great\", \"great\", \"greec\", \"greec\", \"greek\", \"greek\", \"greenbelt\", \"grind\", \"grind\", \"grind\", \"grind\", \"grind\", \"grind\", \"grind\", \"group\", \"group\", \"group\", \"group\", \"group\", \"group\", \"group\", \"group\", \"group\", \"group\", \"gtoal\", \"gun\", \"gun\", \"halat\", \"hallam\", \"hamburg\", \"handbook\", \"handgun\", \"handgun\", \"handheld\", \"handheld\", \"handheld\", \"happen\", \"happen\", \"happen\", \"happen\", \"happen\", \"happen\", \"happen\", \"happen\", \"happen\", \"happen\", \"hard\", \"hard\", \"hard\", \"hard\", \"hard\", \"hard\", \"hard\", \"hard\", \"hard\", \"harley\", \"health\", \"health\", \"health\", \"health\", \"heaven\", \"heaven\", \"heaven\", \"heaven\", \"helmet\", \"helmet\", \"helmet\", \"help\", \"help\", \"help\", \"help\", \"help\", \"help\", \"help\", \"help\", \"help\", \"help\", \"henri\", \"henri\", \"higgin\", \"high\", \"high\", \"high\", \"high\", \"high\", \"high\", \"high\", \"high\", \"high\", \"high\", \"hit\", \"hit\", \"hit\", \"hit\", \"hit\", \"hitler\", \"hitter\", \"hockey\", \"holi\", \"holi\", \"home\", \"home\", \"home\", \"home\", \"home\", \"home\", \"home\", \"home\", \"home\", \"home\", \"homeopathi\", \"homicid\", \"honda\", \"hulman\", \"husc\", \"hydro\", \"iastat\", \"iastat\", \"ifa\", \"illinoi\", \"illinoi\", \"illinoi\", \"illinoi\", \"illinoi\", \"illinoi\", \"illinoi\", \"illinoi\", \"imag\", \"imag\", \"imag\", \"imag\", \"imag\", \"imak\", \"includ\", \"includ\", \"includ\", \"includ\", \"includ\", \"includ\", \"includ\", \"includ\", \"includ\", \"includ\", \"indiana\", \"indiana\", \"indiana\", \"indiana\", \"indiana\", \"indiana\", \"infect\", \"inform\", \"inform\", \"inform\", \"inform\", \"inform\", \"inform\", \"inform\", \"inform\", \"inform\", \"inform\", \"ingr\", \"ingr\", \"ingr\", \"inning\", \"instal\", \"instal\", \"instal\", \"instal\", \"instal\", \"insur\", \"insur\", \"insur\", \"insur\", \"intellect\", \"intercon\", \"internet\", \"internet\", \"internet\", \"internet\", \"internet\", \"internet\", \"internet\", \"internet\", \"invest\", \"invest\", \"iran\", \"islam\", \"islam\", \"isra\", \"israel\", \"israel\", \"israel\", \"jaeger\", \"jake\", \"jason\", \"jason\", \"jason\", \"jason\", \"jay\", \"jeff\", \"jeff\", \"jeff\", \"jeff\", \"jeff\", \"jeff\", \"jeff\", \"jesus\", \"jet\", \"jet\", \"jew\", \"jew\", \"jew\", \"job\", \"job\", \"job\", \"john\", \"john\", \"john\", \"john\", \"john\", \"john\", \"john\", \"john\", \"john\", \"john\", \"jumper\", \"jumper\", \"kaldi\", \"kelvin\", \"key\", \"key\", \"kill\", \"kill\", \"kill\", \"kill\", \"kill\", \"kill\", \"kill\", \"koresh\", \"lamp\", \"larc\", \"larc\", \"laughter\", \"launch\", \"launch\", \"laurentian\", \"leaf\", \"leagu\", \"leagu\", \"leav\", \"leav\", \"leav\", \"leav\", \"leav\", \"leav\", \"leav\", \"leav\", \"leav\", \"leav\", \"lebanes\", \"lemieux\", \"librari\", \"librari\", \"librari\", \"librari\", \"librari\", \"librari\", \"life\", \"life\", \"life\", \"life\", \"life\", \"life\", \"life\", \"life\", \"life\", \"life\", \"list\", \"list\", \"list\", \"list\", \"list\", \"list\", \"list\", \"list\", \"list\", \"list\", \"live\", \"live\", \"live\", \"live\", \"live\", \"live\", \"live\", \"live\", \"livesey\", \"long\", \"long\", \"long\", \"long\", \"long\", \"long\", \"long\", \"long\", \"long\", \"long\", \"look\", \"look\", \"look\", \"look\", \"look\", \"look\", \"look\", \"look\", \"look\", \"look\", \"lopez\", \"lord\", \"lord\", \"lose\", \"lose\", \"lose\", \"lose\", \"lose\", \"lose\", \"lose\", \"lose\", \"lose\", \"lose\", \"love\", \"love\", \"love\", \"love\", \"love\", \"love\", \"love\", \"love\", \"lunar\", \"lunar\", \"lyme\", \"machin\", \"machin\", \"machin\", \"machin\", \"machin\", \"machin\", \"machin\", \"machin\", \"magellan\", \"magnus\", \"mail\", \"mail\", \"mail\", \"mail\", \"mail\", \"mail\", \"mail\", \"mail\", \"map\", \"map\", \"mar\", \"mar\", \"marriag\", \"marriag\", \"massacr\", \"maxtor\", \"maynard\", \"mccall\", \"mcgill\", \"mcgill\", \"mcgill\", \"mean\", \"mean\", \"mean\", \"mean\", \"mean\", \"mean\", \"mean\", \"mean\", \"mean\", \"mean\", \"medic\", \"medic\", \"medic\", \"medic\", \"medic\", \"medicin\", \"medicin\", \"medicin\", \"medicin\", \"meg\", \"memori\", \"memori\", \"memori\", \"memori\", \"memori\", \"memori\", \"memori\", \"messag\", \"messag\", \"messag\", \"messag\", \"messag\", \"messag\", \"messag\", \"messag\", \"messag\", \"met\", \"metal\", \"metal\", \"metal\", \"metal\", \"methodolog\", \"midway\", \"midway\", \"midway\", \"migrain\", \"militia\", \"mime\", \"mission\", \"mission\", \"mission\", \"mission\", \"mksol\", \"mode\", \"mode\", \"mode\", \"mode\", \"mode\", \"mode\", \"modem\", \"modem\", \"modem\", \"money\", \"money\", \"money\", \"money\", \"money\", \"money\", \"money\", \"money\", \"monitor\", \"monitor\", \"monitor\", \"montreal\", \"montreal\", \"moon\", \"moon\", \"moon\", \"moral\", \"moral\", \"mormon\", \"motherboard\", \"motif\", \"motorcycl\", \"motto\", \"mous\", \"mous\", \"murder\", \"murder\", \"murder\", \"muslim\", \"muslim\", \"nasa\", \"nasa\", \"nasa\", \"nation\", \"nation\", \"nation\", \"nation\", \"nation\", \"nation\", \"nation\", \"nation\", \"nation\", \"nation\", \"nazi\", \"ncsl\", \"need\", \"need\", \"need\", \"need\", \"need\", \"need\", \"need\", \"need\", \"need\", \"need\", \"netcom\", \"netcom\", \"netcom\", \"netcom\", \"netcom\", \"netcom\", \"nist\", \"nist\", \"nore\", \"nsmca\", \"nubus\", \"number\", \"number\", \"number\", \"number\", \"number\", \"number\", \"number\", \"number\", \"number\", \"number\", \"ohio\", \"ohio\", \"ohio\", \"openwindow\", \"opinion\", \"opinion\", \"opinion\", \"opinion\", \"opinion\", \"opinion\", \"opinion\", \"opinion\", \"opinion\", \"opinion\", \"optilink\", \"oracl\", \"orbit\", \"orbit\", \"outlet\", \"outlet\", \"output\", \"output\", \"output\", \"owner\", \"owner\", \"owner\", \"owner\", \"owner\", \"owner\", \"owner\", \"pain\", \"pain\", \"pain\", \"pain\", \"pain\", \"palestinian\", \"patent\", \"patent\", \"patent\", \"patient\", \"patient\", \"pen\", \"penguin\", \"peopl\", \"peopl\", \"peopl\", \"peopl\", \"peopl\", \"peopl\", \"peopl\", \"peopl\", \"peopl\", \"peopl\", \"period\", \"period\", \"period\", \"period\", \"period\", \"period\", \"period\", \"period\", \"period\", \"person\", \"person\", \"person\", \"person\", \"person\", \"person\", \"person\", \"person\", \"person\", \"person\", \"phone\", \"phone\", \"phone\", \"phone\", \"phone\", \"phone\", \"phone\", \"phone\", \"photographi\", \"physician\", \"pistol\", \"pitch\", \"pitch\", \"pitcher\", \"pitt\", \"pitt\", \"pitt\", \"pittsburgh\", \"pittsburgh\", \"pittsburgh\", \"plaintext\", \"play\", \"play\", \"play\", \"play\", \"play\", \"play\", \"play\", \"play\", \"player\", \"player\", \"playoff\", \"plymouth\", \"point\", \"point\", \"point\", \"point\", \"point\", \"point\", \"point\", \"point\", \"point\", \"point\", \"polit\", \"polit\", \"polit\", \"polit\", \"polit\", \"polit\", \"polygon\", \"popul\", \"popul\", \"popul\", \"popul\", \"port\", \"port\", \"port\", \"power\", \"power\", \"power\", \"power\", \"power\", \"power\", \"power\", \"power\", \"power\", \"power\", \"powerbook\", \"presid\", \"presid\", \"presid\", \"presid\", \"price\", \"price\", \"price\", \"price\", \"price\", \"price\", \"price\", \"princeton\", \"princeton\", \"princeton\", \"princeton\", \"printer\", \"printer\", \"prism\", \"prison\", \"privaci\", \"privat\", \"privat\", \"privat\", \"privat\", \"privat\", \"privat\", \"privat\", \"probe\", \"probe\", \"probe\", \"problem\", \"problem\", \"problem\", \"problem\", \"problem\", \"problem\", \"problem\", \"problem\", \"problem\", \"problem\", \"program\", \"program\", \"program\", \"program\", \"program\", \"program\", \"project\", \"project\", \"project\", \"project\", \"project\", \"propheci\", \"prophet\", \"propos\", \"propos\", \"propos\", \"propos\", \"propos\", \"propos\", \"protect\", \"protect\", \"protect\", \"protect\", \"protect\", \"protect\", \"protect\", \"provid\", \"provid\", \"provid\", \"provid\", \"provid\", \"provid\", \"provid\", \"provid\", \"provid\", \"provid\", \"public\", \"public\", \"public\", \"public\", \"public\", \"public\", \"public\", \"public\", \"public\", \"puck\", \"pyron\", \"quadra\", \"qualcomm\", \"quebec\", \"question\", \"question\", \"question\", \"question\", \"question\", \"question\", \"question\", \"question\", \"question\", \"question\", \"quicktim\", \"raider\", \"ramsey\", \"ranck\", \"ranger\", \"ranger\", \"read\", \"read\", \"read\", \"read\", \"read\", \"read\", \"read\", \"read\", \"read\", \"read\", \"reason\", \"reason\", \"reason\", \"reason\", \"reason\", \"reason\", \"reason\", \"reason\", \"reason\", \"reason\", \"recipi\", \"recipi\", \"redesign\", \"reilli\", \"religi\", \"religi\", \"religion\", \"religion\", \"repli\", \"repli\", \"repli\", \"repli\", \"repli\", \"repli\", \"repli\", \"repli\", \"repli\", \"repli\", \"research\", \"research\", \"research\", \"research\", \"research\", \"research\", \"research\", \"research\", \"research\", \"research\", \"resourc\", \"resourc\", \"resourc\", \"resourc\", \"resourc\", \"resourc\", \"restaur\", \"result\", \"result\", \"result\", \"result\", \"result\", \"result\", \"result\", \"result\", \"result\", \"result\", \"resurrect\", \"revel\", \"revolv\", \"rid\", \"rid\", \"ride\", \"ride\", \"rider\", \"right\", \"right\", \"right\", \"right\", \"right\", \"right\", \"right\", \"right\", \"right\", \"right\", \"ripem\", \"risk\", \"risk\", \"risk\", \"risk\", \"risk\", \"risk\", \"risk\", \"rkba\", \"road\", \"road\", \"road\", \"road\", \"road\", \"road\", \"road\", \"robi\", \"rochest\", \"rochest\", \"rochest\", \"rochest\", \"rochest\", \"rocki\", \"rockwel\", \"run\", \"run\", \"run\", \"run\", \"run\", \"run\", \"run\", \"run\", \"rutger\", \"rutger\", \"rwing\", \"sabbath\", \"sale\", \"sale\", \"sale\", \"sale\", \"sale\", \"sandvik\", \"satan\", \"satellit\", \"satellit\", \"say\", \"say\", \"say\", \"say\", \"say\", \"say\", \"say\", \"say\", \"say\", \"say\", \"scheme\", \"scheme\", \"scheme\", \"scheme\", \"scheme\", \"schneider\", \"scienc\", \"scienc\", \"scienc\", \"scienc\", \"scienc\", \"scienc\", \"scienc\", \"scienc\", \"scienc\", \"scienc\", \"scientif\", \"scientif\", \"scientif\", \"scientif\", \"scientif\", \"score\", \"score\", \"scott\", \"scott\", \"scott\", \"scott\", \"scott\", \"scott\", \"scott\", \"screen\", \"screen\", \"screen\", \"screen\", \"scriptur\", \"scsi\", \"sdpa\", \"sdsu\", \"season\", \"season\", \"secret\", \"secret\", \"secret\", \"secur\", \"secur\", \"secur\", \"secur\", \"selann\", \"sell\", \"sell\", \"sell\", \"sell\", \"sell\", \"sell\", \"sell\", \"sell\", \"send\", \"send\", \"send\", \"send\", \"send\", \"send\", \"send\", \"send\", \"send\", \"send\", \"sera\", \"serdar\", \"server\", \"server\", \"shafer\", \"shaft\", \"shaft\", \"shark\", \"shotgun\", \"shuttl\", \"shuttl\", \"simm\", \"sin\", \"skeptic\", \"skeptic\", \"skndiv\", \"slaughter\", \"sleev\", \"sleev\", \"sleev\", \"smith\", \"smith\", \"smith\", \"smith\", \"smith\", \"smith\", \"smith\", \"smith\", \"smuggl\", \"softwar\", \"softwar\", \"softwar\", \"softwar\", \"softwar\", \"softwar\", \"softwar\", \"softwar\", \"softwar\", \"solar\", \"solar\", \"solar\", \"soldier\", \"soldier\", \"solntz\", \"sourc\", \"sourc\", \"sourc\", \"sourc\", \"sourc\", \"sourc\", \"sourc\", \"sourc\", \"sourc\", \"space\", \"space\", \"space\", \"space\", \"space\", \"spacecraft\", \"spacecraft\", \"spec\", \"spec\", \"spec\", \"speed\", \"speed\", \"speed\", \"speed\", \"speed\", \"spencer\", \"spend\", \"spend\", \"spend\", \"spend\", \"spend\", \"spend\", \"spend\", \"spend\", \"spend\", \"spend\", \"sphere\", \"spirit\", \"spirit\", \"spirit\", \"ssto\", \"stanford\", \"stanford\", \"stanford\", \"stanford\", \"stanford\", \"stanford\", \"stanford\", \"stanford\", \"stanley\", \"stanley\", \"stanley\", \"start\", \"start\", \"start\", \"start\", \"start\", \"start\", \"start\", \"start\", \"start\", \"start\", \"starter\", \"state\", \"state\", \"state\", \"state\", \"state\", \"state\", \"state\", \"state\", \"state\", \"state\", \"station\", \"station\", \"station\", \"station\", \"station\", \"station\", \"station\", \"station\", \"sternlight\", \"steve\", \"steve\", \"steve\", \"steve\", \"steve\", \"steve\", \"steve\", \"steve\", \"steveh\", \"stimulus\", \"stratus\", \"strnlght\", \"studi\", \"studi\", \"studi\", \"studi\", \"studi\", \"studi\", \"studi\", \"studi\", \"suno\", \"superstit\", \"surveil\", \"svga\", \"swap\", \"syndrom\", \"take\", \"take\", \"take\", \"take\", \"take\", \"take\", \"take\", \"take\", \"take\", \"take\", \"tampa\", \"teach\", \"teach\", \"teach\", \"teach\", \"teach\", \"team\", \"team\", \"team\", \"team\", \"team\", \"technolog\", \"technolog\", \"technolog\", \"technolog\", \"technolog\", \"technolog\", \"technolog\", \"technolog\", \"technolog\", \"tell\", \"tell\", \"tell\", \"tell\", \"tell\", \"tell\", \"tell\", \"tell\", \"tell\", \"tell\", \"tennesse\", \"test\", \"test\", \"test\", \"test\", \"test\", \"test\", \"test\", \"test\", \"testament\", \"thank\", \"thank\", \"thank\", \"thank\", \"thank\", \"thank\", \"thank\", \"thank\", \"thank\", \"theist\", \"theodor\", \"theolog\", \"theori\", \"theori\", \"theori\", \"theori\", \"theori\", \"theori\", \"therapi\", \"thing\", \"thing\", \"thing\", \"thing\", \"thing\", \"thing\", \"thing\", \"thing\", \"thing\", \"thing\", \"thomasp\", \"tiff\", \"tiger\", \"time\", \"time\", \"time\", \"time\", \"time\", \"time\", \"time\", \"time\", \"time\", \"time\", \"tire\", \"tire\", \"tire\", \"tire\", \"tire\", \"toolkit\", \"toronto\", \"toronto\", \"toronto\", \"toronto\", \"toronto\", \"treatment\", \"treatment\", \"troop\", \"true\", \"true\", \"true\", \"true\", \"true\", \"true\", \"true\", \"true\", \"true\", \"true\", \"trunk\", \"truth\", \"truth\", \"truth\", \"truth\", \"truth\", \"turk\", \"turkey\", \"turkish\", \"ualberta\", \"uchicago\", \"uchicago\", \"uchicago\", \"ucsc\", \"uicvm\", \"uiuc\", \"uiuc\", \"uiuc\", \"uiuc\", \"uiuc\", \"uiuc\", \"uiuc\", \"uiuc\", \"umich\", \"umich\", \"umich\", \"uoknor\", \"upgrad\", \"upgrad\", \"urartu\", \"urbana\", \"urbana\", \"urbana\", \"user\", \"user\", \"user\", \"user\", \"utah\", \"utkvm\", \"uvic\", \"veal\", \"vehicl\", \"vehicl\", \"vehicl\", \"vehicl\", \"vers\", \"version\", \"version\", \"version\", \"version\", \"version\", \"version\", \"version\", \"version\", \"version\", \"vesa\", \"vesselin\", \"video\", \"video\", \"video\", \"video\", \"villag\", \"villag\", \"virginia\", \"virginia\", \"virginia\", \"virginia\", \"virginia\", \"virginia\", \"virginia\", \"visual\", \"visual\", \"volt\", \"vram\", \"waco\", \"waco\", \"wagon\", \"wagon\", \"want\", \"want\", \"want\", \"want\", \"want\", \"want\", \"want\", \"want\", \"want\", \"want\", \"water\", \"water\", \"water\", \"water\", \"water\", \"weapon\", \"weapon\", \"weapon\", \"wheel\", \"wheel\", \"widget\", \"window\", \"window\", \"window\", \"wing\", \"wing\", \"wing\", \"wing\", \"wing\", \"winnipeg\", \"winnipeg\", \"wire\", \"wire\", \"wire\", \"wiretap\", \"word\", \"word\", \"word\", \"word\", \"word\", \"word\", \"word\", \"word\", \"word\", \"word\", \"work\", \"work\", \"work\", \"work\", \"work\", \"work\", \"work\", \"work\", \"work\", \"work\", \"world\", \"world\", \"world\", \"world\", \"world\", \"world\", \"world\", \"world\", \"world\", \"world\", \"worship\", \"worship\", \"xlib\", \"xpert\", \"xterm\", \"xview\", \"yamaha\", \"yanke\", \"year\", \"year\", \"year\", \"year\", \"year\", \"year\", \"year\", \"year\", \"year\", \"year\", \"yeast\", \"zoolog\", \"zuma\"]}, \"R\": 30, \"lambda.step\": 0.01, \"plot.opts\": {\"xlab\": \"PC1\", \"ylab\": \"PC2\"}, \"topic.order\": [3, 1, 8, 9, 2, 4, 7, 10, 5, 6]};\n", "\n", "function LDAvis_load_lib(url, callback){\n", " var s = document.createElement('script');\n", @@ -502,7 +641,7 @@ "if(typeof(LDAvis) !== \"undefined\"){\n", " // already loaded: just create the visualization\n", " !function(LDAvis){\n", - " new LDAvis(\"#\" + \"ldavis_el591011124095238088809029897\", ldavis_el591011124095238088809029897_data);\n", + " new LDAvis(\"#\" + \"ldavis_el155871124265505206097197808\", ldavis_el155871124265505206097197808_data);\n", " }(LDAvis);\n", "}else if(typeof define === \"function\" && define.amd){\n", " // require.js is available: use it to load d3/LDAvis\n", @@ -510,168 +649,118 @@ " require([\"d3\"], function(d3){\n", " window.d3 = d3;\n", " LDAvis_load_lib(\"https://cdn.rawgit.com/bmabey/pyLDAvis/files/ldavis.v1.0.0.js\", function(){\n", - " new LDAvis(\"#\" + \"ldavis_el591011124095238088809029897\", ldavis_el591011124095238088809029897_data);\n", + " new LDAvis(\"#\" + \"ldavis_el155871124265505206097197808\", ldavis_el155871124265505206097197808_data);\n", " });\n", " });\n", "}else{\n", " // require.js not available: dynamically load d3 & LDAvis\n", " LDAvis_load_lib(\"https://cdnjs.cloudflare.com/ajax/libs/d3/3.5.5/d3.min.js\", function(){\n", " LDAvis_load_lib(\"https://cdn.rawgit.com/bmabey/pyLDAvis/files/ldavis.v1.0.0.js\", function(){\n", - " new LDAvis(\"#\" + \"ldavis_el591011124095238088809029897\", ldavis_el591011124095238088809029897_data);\n", + " new LDAvis(\"#\" + \"ldavis_el155871124265505206097197808\", ldavis_el155871124265505206097197808_data);\n", " })\n", " });\n", "}\n", "</script>" ], "text/plain": [ - "PreparedData(topic_coordinates= x y topics cluster Freq\n", - "topic \n", - "2 -0.078669 -0.151706 1 1 13.182505\n", - "0 -0.016999 -0.150447 2 1 12.926197\n", - "7 0.208967 0.080137 3 1 12.463007\n", - "8 0.147446 0.136478 4 1 11.995771\n", - "1 -0.008849 -0.009046 5 1 9.559109\n", - "3 -0.045054 0.003907 6 1 9.468682\n", - "6 -0.089499 0.144727 7 1 8.927140\n", - "9 0.107803 -0.077376 8 1 7.882134\n", - "4 0.004524 -0.105100 9 1 7.024930\n", - "5 -0.229669 0.128426 10 1 6.570525, topic_info= Category Freq Term Total loglift logprob\n", - "1037 Default 2966.000000 window 2966.000000 30.0000 30.0000\n", - "1193 Default 1940.000000 game 1940.000000 29.0000 29.0000\n", - "482 Default 1924.000000 christian 1924.000000 28.0000 28.0000\n", - "702 Default 1689.000000 team 1689.000000 27.0000 27.0000\n", - "352 Default 2638.000000 drive 2638.000000 26.0000 26.0000\n", - "320 Default 2883.000000 file 2883.000000 25.0000 25.0000\n", - "696 Default 1860.000000 space 1860.000000 24.0000 24.0000\n", - "1467 Default 1161.000000 encrypt 1161.000000 23.0000 23.0000\n", - "256 Default 1997.000000 govern 1997.000000 22.0000 22.0000\n", - "153 Default 1477.000000 chip 1477.000000 21.0000 21.0000\n", - "522 Default 1274.000000 jesus 1274.000000 20.0000 20.0000\n", - "1347 Default 1017.000000 israel 1017.000000 19.0000 19.0000\n", - "36 Default 1577.000000 card 1577.000000 18.0000 18.0000\n", - "120 Default 1423.000000 play 1423.000000 17.0000 17.0000\n", - "964 Default 1059.000000 secur 1059.000000 16.0000 16.0000\n", - "657 Default 1331.000000 nasa 1331.000000 15.0000 15.0000\n", - "1821 Default 1142.000000 armenian 1142.000000 14.0000 14.0000\n", - "822 Default 2599.000000 program 2599.000000 13.0000 13.0000\n", - "1346 Default 837.000000 isra 837.000000 12.0000 12.0000\n", - "513 Default 1391.000000 imag 1391.000000 11.0000 11.0000\n", - "117 Default 6052.000000 peopl 6052.000000 10.0000 10.0000\n", - "3565 Default 742.000000 hockey 742.000000 9.0000 9.0000\n", - "739 Default 990.000000 player 990.000000 8.0000 8.0000\n", - "1457 Default 784.000000 clipper 784.000000 7.0000 7.0000\n", - "326 Default 1802.000000 public 1802.000000 6.0000 6.0000\n", - "41 Default 1023.000000 disk 1023.000000 5.0000 5.0000\n", - "28 Default 4004.000000 year 4004.000000 4.0000 4.0000\n", - "380 Default 867.000000 scsi 867.000000 3.0000 3.0000\n", - "879 Default 1191.000000 driver 1191.000000 2.0000 2.0000\n", - "444 Default 747.000000 bike 747.000000 1.0000 1.0000\n", - "... ... ... ... ... ... ...\n", - "5004 Topic10 178.948181 stanley 185.594589 2.6861 -6.0394\n", - "702 Topic10 1384.116455 team 1689.568604 2.5232 -3.9937\n", - "4840 Topic10 160.981583 jet 167.196503 2.6847 -6.1452\n", - "3815 Topic10 191.566772 coach 202.233215 2.6684 -5.9713\n", - "3537 Topic10 221.759384 ranger 240.052933 2.6433 -5.8249\n", - "4877 Topic10 157.258331 winnipeg 165.160721 2.6735 -6.1686\n", - "1193 Topic10 1290.715576 game 1940.664795 2.3147 -4.0636\n", - "120 Topic10 920.770020 play 1423.930298 2.2866 -4.4013\n", - "711 Topic10 312.806488 wing 399.885132 2.4770 -5.4809\n", - "739 Topic10 623.101746 player 990.567200 2.2590 -4.7918\n", - "1311 Topic10 397.739624 columbia 559.283691 2.3817 -5.2407\n", - "1080 Topic10 455.438751 season 670.126038 2.3364 -5.1053\n", - "3252 Topic10 379.943481 leagu 536.827942 2.3769 -5.2865\n", - "1073 Topic10 351.761322 pittsburgh 505.782318 2.3594 -5.3636\n", - "1679 Topic10 356.976562 score 528.273926 2.3306 -5.3488\n", - "1321 Topic10 374.845306 arab 572.500732 2.2991 -5.3000\n", - "3488 Topic10 212.819550 mcgill 254.334839 2.5444 -5.8661\n", - "1475 Topic10 346.644043 goal 553.699341 2.2543 -5.3782\n", - "1150 Topic10 312.806427 virginia 544.289856 2.1687 -5.4809\n", - "1082 Topic10 333.144867 toronto 701.091187 1.9785 -5.4179\n", - "1155 Topic10 336.057953 andrew 868.338135 1.7733 -5.4092\n", - "28 Topic10 600.308960 year 4004.757812 0.8248 -4.8291\n", - "157 Topic10 295.451538 divis 693.417114 1.8694 -5.5380\n", - "2117 Topic10 283.661255 canada 732.439819 1.7740 -5.5787\n", - "2549 Topic10 250.147522 period 584.503235 1.8739 -5.7045\n", - "45 Topic10 267.235901 final 822.295105 1.5986 -5.6384\n", - "171 Topic10 330.680511 point 2646.791748 0.6426 -5.4254\n", - "146 Topic10 358.020264 time 5183.146484 0.0500 -5.3459\n", - "1545 Topic10 262.164948 american 1242.273315 1.1669 -5.6575\n", - "99 Topic10 242.101822 go 3510.730713 0.0484 -5.7372\n", + "<IPython.core.display.HTML object>" + ] + }, + "execution_count": 30, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# Gensim\n", + "p = visualize_topics(model, bow_corpus, dictionary, model_type='gensim')\n", + "p" + ] + }, + { + "cell_type": "code", + "execution_count": 31, + "metadata": { + "collapsed": true + }, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/Users/williamjaubert/anaconda2/envs/nautilus/lib/python3.7/site-packages/pyLDAvis/_prepare.py:223: RuntimeWarning: divide by zero encountered in log\n", + " kernel = (topic_given_term * np.log((topic_given_term.T / topic_proportion).T))\n", + "/Users/williamjaubert/anaconda2/envs/nautilus/lib/python3.7/site-packages/pyLDAvis/_prepare.py:240: RuntimeWarning: divide by zero encountered in log\n", + " log_lift = np.log(topic_term_dists / term_proportion)\n", + "/Users/williamjaubert/anaconda2/envs/nautilus/lib/python3.7/site-packages/pyLDAvis/_prepare.py:241: RuntimeWarning: divide by zero encountered in log\n", + " log_ttd = np.log(topic_term_dists)\n", + "/Users/williamjaubert/anaconda2/envs/nautilus/lib/python3.7/site-packages/pyLDAvis/_prepare.py:257: FutureWarning: Sorting because non-concatenation axis is not aligned. A future version\n", + "of pandas will change to not sort by default.\n", + "\n", + "To accept the future behavior, pass 'sort=False'.\n", + "\n", + "To retain the current behavior and silence the warning, pass 'sort=True'.\n", + "\n", + " return pd.concat([default_term_info] + list(topic_dfs))\n" + ] + }, + { + "data": { + "text/html": [ + "\n", + "<link rel=\"stylesheet\" type=\"text/css\" href=\"https://cdn.rawgit.com/bmabey/pyLDAvis/files/ldavis.v1.0.0.css\">\n", + "\n", + "\n", + "<div id=\"ldavis_el15587112430946968420164328\"></div>\n", + "<script type=\"text/javascript\">\n", + "\n", + "var ldavis_el15587112430946968420164328_data = {\"mdsDat\": {\"x\": [-0.11865444229892427, -0.15913644671148153, -0.1021552834840701, -0.1302147807267131, 0.025996119058630945, -0.02613484912760001, -0.04773338510733379, 0.20792709345760607, -0.03261899864327976, 0.38272497358316565], \"y\": [-0.14612969845944368, -0.07809283008476131, -0.21207201799419742, 0.20626190412239923, -0.16846330671503923, 0.13616430604087143, 0.058577567883906, -0.12443061559914777, 0.27343632979353877, 0.05474836101187306], \"topics\": [1, 2, 3, 4, 5, 6, 7, 8, 9, 10], \"cluster\": [1, 1, 1, 1, 1, 1, 1, 1, 1, 1], \"Freq\": [12.365908144728973, 12.10898411608011, 10.931706618523949, 10.925960423580584, 10.198631258133638, 10.029655051537938, 9.063929680129815, 8.785865295646344, 8.485634665680474, 7.103724745958186]}, \"tinfo\": {\"Category\": [\"Default\", \"Default\", \"Default\", \"Default\", \"Default\", \"Default\", \"Default\", \"Default\", \"Default\", \"Default\", \"Default\", \"Default\", \"Default\", \"Default\", \"Default\", \"Default\", \"Default\", \"Default\", \"Default\", \"Default\", \"Default\", \"Default\", \"Default\", \"Default\", \"Default\", \"Default\", \"Default\", \"Default\", \"Default\", \"Default\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\"], \"Freq\": [3333.0, 3298.0, 2707.0, 2823.0, 2140.0, 6405.0, 2581.0, 2822.0, 2058.0, 3159.0, 2052.0, 2604.0, 1636.0, 1640.0, 3593.0, 4267.0, 2355.0, 1604.0, 3488.0, 4034.0, 3489.0, 1446.0, 2179.0, 1501.0, 1476.0, 1456.0, 1929.0, 1778.0, 1780.0, 1776.0, 30.73757280319964, 76.8439320079991, 24.590058242559714, 113.72901937183867, 44.057187684586154, 106.5569190510921, 19.46712944202644, 22.540886722346404, 22.540886722346404, 37.90967312394623, 154.71244977610488, 53.27845952554605, 52.253873765439394, 643.4398573469792, 24.590058242559714, 33.81133008351961, 49.18011648511943, 18.442543681919783, 48.155530725012774, 29.712987043092987, 57.37680256597266, 233.60555330431728, 209.01549506175758, 16.393372161706477, 117.82736241226529, 23.565472482453057, 36.88508736383957, 21.51630096223975, 65.57348864682591, 25.614644002666367, 2052.245277493629, 1269.4617567721452, 918.0288410555626, 810.4473362443639, 806.3489932039372, 751.0213621581779, 653.6857149480458, 585.0384690208999, 570.6942683794067, 406.7605467623419, 343.23622963572933, 324.79368595380953, 303.2773849915698, 290.98235587028995, 286.88401282986337, 284.83484130964996, 282.78566978943667, 276.6381552287968, 261.26936882719696, 249.99892546602376, 241.8022393851705, 207.99090930165093, 196.7204659404777, 196.7204659404777, 194.6712944202644, 190.57295137983778, 187.4991940995178, 343.23622963572933, 472.3340354091678, 704.9150029533785, 510.24370853311405, 339.13788659530275, 831.9636372066037, 2147.5317531835485, 726.4313039156182, 1261.265070691292, 993.8481873034551, 1034.8316177077213, 978.4794009018553, 860.6520384895899, 578.8909544602599, 681.3495304709253, 1115.773892756147, 457.98983476767467, 454.9160774873547, 473.3586211692745, 1823.7626529898455, 595.2843266219664, 705.9395887134851, 674.1774301501788, 1108.6017924354005, 679.300358950712, 920.0780125757759, 944.6680708183357, 728.4804754358315, 741.8000903172181, 753.0705336783913, 757.1688767188178, 683.3987019911388, 21.298748448648094, 100.10411770864603, 92.6495557516192, 44.72737174216099, 41.532559474863774, 288.59804147918163, 38.33774720756657, 42.59749689729619, 42.59749689729619, 26.623435560810115, 27.68837298324252, 506.9102130778246, 48.987121431890614, 96.90930544134882, 25.558498138377708, 69.22093245810629, 85.19499379459238, 281.14347952215485, 48.987121431890614, 63.89624534594427, 97.97424286378123, 280.0785420997224, 25.558498138377708, 96.90930544134882, 57.50662081134985, 35.142934940269356, 129.92236553675335, 25.558498138377708, 21.298748448648094, 88.38980606188957, 1230.0027229094273, 956.3138053442993, 859.4044999029505, 700.7288239605223, 676.2352632445769, 668.7807012875501, 610.2091430537679, 597.4298939845789, 497.325776275933, 436.6243431972859, 420.6502818607998, 405.74115794674617, 453.6633419562044, 310.96172735026215, 291.79285374647884, 290.7279163240465, 282.2084169445872, 256.64991880620954, 460.0529664907988, 201.27317283972448, 201.27317283972448, 190.62379861540043, 185.2991115032384, 169.32505016675233, 157.6107385199959, 156.54580109756347, 669.8456387099825, 197.01342314999485, 481.3517149394469, 448.33865484404237, 604.8844559416058, 486.67640205160893, 569.7415210013365, 832.7810643421404, 925.4306200937597, 1674.08162806374, 593.1701442948493, 635.7676411921456, 521.8193369918782, 715.6379478745758, 439.8191554645831, 1838.0819911183303, 857.2746250580857, 889.2227477310578, 839.1706888767349, 1430.2109583267195, 806.1576287813302, 671.9755135548473, 701.7937613829547, 574.001270691066, 637.8975160370104, 546.3128977078236, 540.9882105956616, 540.9882105956616, 63.83413114755033, 59.43177727530548, 83.64472357265215, 31.917065573775165, 22.01176936122425, 33.01765404183637, 17.6094154889794, 39.62118485020365, 133.17120463540672, 23.112357829285465, 331.277128886425, 147.4788547202025, 241.02887450540555, 569.0042379876469, 45.12412719050971, 20.91118089316304, 19.810592425101824, 27.514711701530313, 30.816477105713954, 45.12412719050971, 97.95237365744792, 25.313534765407887, 34.11824250989759, 414.9218524590771, 23.112357829285465, 57.23060033918305, 227.821812888671, 177.1947433578552, 49.52648106275456, 20.91118089316304, 1476.9897241381473, 1127.0025912946817, 1495.6997280951878, 953.1096133410101, 923.3937247033573, 823.240174109787, 628.4360152629523, 576.7083572640754, 541.4895262861166, 425.9277371396892, 421.5253832674444, 418.22361786326076, 333.4783058225474, 330.17654041836374, 320.2712442058128, 301.5612402487722, 301.5612402487722, 292.7565325042825, 291.65594403622134, 258.63828999438493, 243.23005144152796, 216.81592820805886, 212.41357433581402, 204.70945505938553, 200.3071011871407, 282.85123629173165, 227.821812888671, 364.2947829282613, 569.0042379876469, 721.9860350481554, 468.8506873940765, 464.44833352183167, 321.37183267387405, 521.6789338610147, 392.91008309785286, 591.0160073488711, 516.1759915207086, 2094.4198547204874, 570.1048264557081, 766.009573770604, 942.1037286603978, 545.8918801583615, 507.37128377621895, 802.328993216624, 471.0518643301989, 505.1701068400966, 562.4007071792796, 468.8506873940765, 505.1701068400966, 464.44833352183167, 36.119975512464435, 169.97635535277382, 194.41045643473504, 22.309396640051563, 36.119975512464435, 26.55880552387091, 149.79166315463195, 371.82327733419277, 54.17996326869666, 80.73876879256757, 37.18232773341928, 268.7751119015736, 80.73876879256757, 591.730187071844, 86.05052989734175, 121.10815318885135, 315.51860962358637, 83.92582545543208, 27.621157744825744, 78.61406435065788, 99.86110876975462, 67.99054214110953, 39.30703217532894, 19.122339977187057, 224.1563186214705, 506.742009395457, 80.73876879256757, 49.93055438487731, 27.621157744825744, 32.93291884959993, 3333.6612693562765, 3298.603646064767, 1455.422542708126, 1117.594536444488, 939.1193633240754, 922.121727788798, 1068.7263342805654, 682.030125853005, 678.8430691901405, 659.7207292129534, 648.0348547824502, 571.5454948737021, 542.8619849079214, 538.612576024102, 500.3678960697279, 483.37026053445055, 353.76328957796056, 320.83037072836055, 293.2092129835349, 280.4609863320768, 275.1492252273026, 253.90218080820588, 234.77984083101884, 231.59278416815434, 229.46807972624467, 480.18320387158604, 370.7609251132379, 733.0230324588372, 335.7033018217283, 2319.1148983444077, 904.0617400325657, 1489.4178137786805, 705.4018747140115, 879.6276389506046, 1094.2227875834815, 791.4524046113531, 1100.5969009092105, 653.3466158872244, 499.3055438487731, 619.3513448166697, 846.6947201010047, 985.862861046088, 705.4018747140115, 797.8265179370821, 735.1477369007467, 721.3371580283339, 719.2124535864242, 646.9725025614954, 47.470209668913725, 21.097870963961658, 42.195741927923315, 47.470209668913725, 84.39148385584663, 780.6212256665813, 47.470209668913725, 94.94041933782745, 84.39148385584663, 21.097870963961658, 47.470209668913725, 70.67786772927154, 21.097870963961658, 41.140848379725234, 37.976167735130986, 29.53701934954632, 122.36765159097762, 65.40339998828114, 27.427232253150155, 55.90935805449839, 37.976167735130986, 22.15276451215974, 29.53701934954632, 23.207658060357822, 16.878296771169325, 69.62297418107347, 27.427232253150155, 23.207658060357822, 26.37233870495207, 60.12893224729073, 567.5327289305685, 350.2246580017635, 346.00508380897116, 344.9501902607731, 329.1267870378019, 301.6995547846517, 255.28423866393607, 236.29615479637056, 235.24126124817246, 232.0765806035782, 219.41785802520124, 177.22211609727793, 164.56339351890094, 159.28892577791052, 151.90467094052394, 128.6970128801661, 128.6970128801661, 128.6970128801661, 127.64211933196803, 333.3463612305942, 125.53233223557186, 123.4225451391757, 121.31275804277952, 200.42977415763573, 120.25786449458145, 109.70892901260062, 109.70892901260062, 106.54424836800638, 166.6731806152971, 996.8744030471884, 152.959564488722, 223.63743221799356, 373.43231606212134, 130.80679997656227, 357.6089128391501, 835.4756901728816, 728.9314418048752, 1091.8148223850158, 263.72338704952074, 529.5565611954376, 1969.4862544858206, 622.3871934368689, 1057.003335294479, 2073.920715757431, 608.6735773102938, 950.4590869264728, 486.3059257193162, 789.0603740521659, 1069.6620578728562, 2158.3121996132777, 626.6067676296612, 861.8480288778337, 340.7306160679808, 374.48720961031944, 662.473148268396, 646.6497450454248, 692.0101676179423, 1055.948441746281, 587.5757063463321, 597.0697482801149, 741.5901643832523, 546.434857966607, 418.7927386346389, 486.3059257193162, 585.4659192499361, 475.7569902373354, 21.71707338985634, 47.777561457683944, 42.348293110219856, 66.23707383906184, 82.52487888145409, 65.15122016956902, 28.23219540681324, 41.26243944072704, 55.37853714413366, 31.48975641529169, 24.97463439833479, 82.52487888145409, 60.807805491597755, 48.86341512717676, 32.57561008478451, 55.37853714413366, 62.97951283058338, 45.60585411869831, 32.57561008478451, 80.35317154246846, 55.37853714413366, 221.51414857653464, 115.1004889662386, 30.403902745798877, 18.459512381377888, 80.35317154246846, 27.146341737320423, 17.37365871188507, 39.09073210174141, 32.57561008478451, 859.996106238311, 527.7248833735091, 509.2653709921311, 609.1639085854703, 408.2809797292992, 336.61463754277327, 273.63512471218985, 234.54439261044845, 219.34244123754902, 300.7814664495103, 297.52390544103184, 193.28195316972142, 193.28195316972142, 163.96390409341538, 162.87805042392253, 160.70634308493692, 158.53463574595128, 157.44878207645846, 138.98926969508057, 129.2165866696452, 125.95902566116676, 124.87317199167396, 118.35804997471706, 116.18634263573142, 116.18634263573142, 112.92878162725296, 111.84292795776014, 103.15609860181762, 161.7921967544297, 158.53463574595128, 2288.979535290858, 272.54927104269706, 588.5326888651067, 1488.705380874652, 678.6585434330105, 1814.4614817224972, 533.1541517209731, 260.60488067827606, 639.5678113312691, 560.3004934582935, 921.8897653994015, 1044.5912300520897, 1266.1053786286245, 460.4019558649544, 992.4702539164346, 850.2234232128757, 643.9112260092405, 1258.504402942175, 606.9922012464847, 988.1268392384634, 790.5014713907707, 845.8800085349044, 920.8039117299088, 550.5278104328581, 412.6243944072705, 461.48780953444725, 901.2585456790381, 845.8800085349044, 538.5834200684372, 622.1941526193841, 679.7443971025034, 624.3658599583697, 575.502444831193, 576.5882985006857, 600.4770792295277, 28.132337894656857, 31.37837688250188, 119.02142955431746, 27.050324898708514, 97.38116963535066, 58.42870178121039, 140.66168947328427, 31.37837688250188, 40.034480850088606, 73.57688372448716, 58.42870178121039, 226.14071615320316, 42.19850684198528, 228.30474214509985, 119.02142955431746, 19.47623392707013, 91.97110465560894, 98.46318263129899, 34.624415870346894, 117.93941655836912, 126.59552052595585, 49.77259781362367, 27.050324898708514, 43.280519837933625, 51.93662380552035, 75.74090971638384, 59.51071477715873, 21.640259918966812, 51.93662380552035, 16.230194939225107, 1446.6513755829315, 611.3373427108124, 575.6309138445172, 393.85273052519597, 383.0326005657125, 378.7045485819192, 368.96643161838415, 310.53772983717374, 288.8974699182069, 287.8154569222586, 374.37649659812587, 281.32337894656854, 264.0111710113951, 262.9291580154467, 355.98227566700405, 352.736236679159, 255.3550670438084, 244.53493708432495, 234.7968201207899, 218.5666251815648, 218.5666251815648, 307.2916908493287, 203.41844323828803, 183.94220931121788, 181.77818331932122, 180.69617032337288, 178.5321443314762, 176.3681183395795, 1971.4276786178766, 205.5824692301847, 202.33643024233967, 378.7045485819192, 512.8741600795134, 401.42682149683435, 782.2953960706502, 537.7604589863253, 944.5973454629013, 518.2842250592552, 648.125784573056, 370.0484446143325, 710.8825383380597, 470.67565323752814, 346.244158703469, 824.4939029126356, 505.30006910787506, 556.1546799174471, 498.807991132185, 385.19662655760925, 473.9216922253732, 457.69149728614804, 599.4351997553807, 453.36344530235465, 464.1835752618381, 407.9188994725244, 378.7045485819192, 99.60646984815321, 81.59253381178507, 74.17503073798643, 49.803234924076605, 25.431439110166778, 72.05574414547253, 148.35006147597286, 50.862878220333556, 25.431439110166778, 25.431439110166778, 36.027872072736265, 37.087515368993216, 81.59253381178507, 145.171131587202, 50.862878220333556, 50.862878220333556, 50.862878220333556, 18.013936036368133, 103.84504303318101, 49.803234924076605, 265.9704673604942, 49.803234924076605, 25.431439110166778, 49.803234924076605, 344.38407128350843, 158.94649443854235, 18.013936036368133, 77.35396062675729, 37.087515368993216, 50.862878220333556, 2140.479458439037, 1640.3278226057573, 1604.2999505330208, 1075.5379457008032, 719.4977981584684, 703.6031487146142, 559.4916604236691, 552.0741573498705, 430.2151782803213, 484.2569863894258, 484.2569863894258, 385.7101598375295, 353.92086094982096, 285.0440466931193, 263.8511807679803, 259.61260758295253, 258.5529642866956, 241.5986715465844, 236.30045506529964, 234.18116847278574, 231.0022385840149, 227.82330869524404, 222.5250922139593, 222.5250922139593, 216.1672324364176, 211.9286592513898, 210.86901595513285, 203.45151288133422, 236.30045506529964, 338.0262115059667, 471.54126683434237, 322.1315620621125, 520.284858462162, 406.90302576266845, 565.8495202012108, 351.8015743573071, 334.8472816171959, 292.4615497669179, 340.14549809848063, 1896.761500299939, 452.4676875017172, 540.418081091044, 418.5591020214948, 539.358437794787, 477.89912661188407, 490.61484616696737, 404.78373917015455, 414.32052883646713, 432.3344648728352, 724.7960146397531, 619.8913283103152, 432.3344648728352, 570.0880933862386, 401.6048092813837, 43.839592660341296, 36.53299388361775, 34.445394233125306, 20.875996504924426, 156.5699737869332, 35.489194058371524, 17.744597029185762, 204.58476574825937, 69.93458829149682, 117.949380252823, 108.55518182560702, 22.96359615541687, 56.36519056329595, 75.15358741772793, 31.313994757386638, 39.66439335935641, 124.21217920430034, 73.0659877672355, 66.80318881575816, 79.32878671871282, 61.584189689527065, 27.138795456401756, 32.35779458263286, 25.051195805909312, 136.737777107255, 51.14619143706484, 40.708193184602635, 66.80318881575816, 45.92719231083374, 25.051195805909312, 2707.616746688698, 1636.678125986075, 1022.923828741297, 1186.8004013049535, 737.9664764490785, 591.8345009146075, 434.2207273024281, 427.95792835095074, 370.54893796240856, 367.4175384866699, 358.0233400594539, 330.8845446030522, 265.1251556125402, 257.81855683581665, 252.59955770958555, 246.33675875810826, 243.20535928236959, 242.16155945712336, 230.67976137941488, 216.0665638259678, 192.0591678453047, 186.84016871907363, 184.75256906858118, 177.44597029185763, 171.18317134038028, 169.09557168988783, 154.48237413644074, 236.94256033089226, 1090.7708173823014, 978.0404362557094, 233.8111608551536, 717.0904799441541, 887.2298514592882, 990.566034158664, 502.0677159434325, 904.9744484884739, 515.6371136716333, 678.4698864100438, 397.68773341881035, 596.0097002155924, 374.72413726339346, 1017.7048296150658, 678.4698864100438, 1194.1070000816771, 740.0540760995709, 443.6149257296441, 1695.1309161998636, 494.7611171667089, 1513.509746607021, 638.8054930506875, 516.6809134968795, 631.498894273964, 493.7173173414627, 661.7690892061044, 627.323694972979, 479.10411978801557, 485.3669187394929, 37.704209244169135, 45.03558326386869, 37.704209244169135, 30.37283522446958, 32.467513515812314, 23.041461204770027, 16.757426330741836, 39.79888753551187, 18.852104622084568, 20.9467829134273, 41.8935658268546, 33.51485266148367, 33.51485266148367, 60.74567044893916, 111.01794944116467, 30.37283522446958, 41.8935658268546, 50.272278992225516, 268.1188212918694, 45.03558326386869, 95.30786225609421, 60.74567044893916, 95.30786225609421, 19.899443767755933, 50.272278992225516, 18.852104622084568, 41.8935658268546, 46.08292240954005, 81.69245336236646, 45.03558326386869, 903.8536827143879, 782.3623418165096, 595.9359738870066, 574.9891909735793, 441.977119473316, 433.5984063079451, 423.1250148512314, 413.69896254018914, 384.37346646139093, 352.95329209125, 343.5272397802077, 1052.5758413997216, 298.491656516339, 294.30229993365356, 590.6992781586498, 278.59221274858305, 274.4028561658976, 259.7401081264985, 422.07767570556007, 342.47990063453636, 323.62779601245177, 214.7045248626298, 210.51516827994433, 208.4204899886016, 203.18379426024478, 201.08911596890206, 179.0949939098034, 177.0003156184607, 174.90563732711794, 2571.217602623201, 633.6401831311757, 501.6754507765838, 812.7351770409791, 788.6463766905377, 595.9359738870066, 447.2138152016728, 498.5334333395697, 1280.8957751560793, 488.06004188285607, 479.68132871748514, 1824.4647917595175, 516.3381988159829, 528.9062685640392, 808.5458204582937, 609.5513827807343, 658.7763226272886, 672.3917315210163, 861.9601168875333, 626.3088091114762, 807.4984813126224, 580.2258867019361, 527.8589294183679, 591.7466173043211, 460.82922409540055], \"Term\": [\"file\", \"window\", \"drive\", \"repli\", \"game\", \"peopl\", \"mail\", \"program\", \"space\", \"distribut\", \"christian\", \"believ\", \"card\", \"team\", \"state\", \"year\", \"inform\", \"play\", \"problem\", \"good\", \"thing\", \"nasa\", \"govern\", \"kill\", \"armenian\", \"imag\", \"control\", \"david\", \"version\", \"list\", \"lutheran\", \"okcforum\", \"goddess\", \"luke\", \"virtu\", \"geneva\", \"disobey\", \"communion\", \"crucifi\", \"denomin\", \"divin\", \"meaning\", \"passion\", \"atheist\", \"kinsey\", \"savior\", \"alink\", \"rapist\", \"ksand\", \"conscienc\", \"slaveri\", \"contradict\", \"worship\", \"attest\", \"notion\", \"clearer\", \"heresi\", \"hypothet\", \"infal\", \"kilroy\", \"christian\", \"jesus\", \"moral\", \"bibl\", \"religion\", \"church\", \"faith\", \"christ\", \"belief\", \"homosexu\", \"atheism\", \"evil\", \"koresh\", \"etern\", \"scriptur\", \"sandvik\", \"heaven\", \"cathol\", \"holi\", \"spirit\", \"assert\", \"arrog\", \"assumpt\", \"livesey\", \"biblic\", \"doctrin\", \"marriag\", \"lord\", \"teach\", \"truth\", \"absolut\", \"conclus\", \"evid\", \"believ\", \"argument\", \"exist\", \"claim\", \"word\", \"true\", \"life\", \"natur\", \"accept\", \"reason\", \"islam\", \"keith\", \"definit\", \"peopl\", \"love\", \"human\", \"understand\", \"question\", \"exampl\", \"point\", \"thing\", \"fact\", \"person\", \"differ\", \"read\", \"follow\", \"fiscal\", \"ban\", \"hallam\", \"federalist\", \"dscomsa\", \"regul\", \"secreci\", \"statut\", \"safeguard\", \"passer\", \"partnership\", \"firearm\", \"dorothi\", \"den\", \"bureaucrat\", \"pistol\", \"rwing\", \"agent\", \"myrto\", \"lethal\", \"deficit\", \"crypto\", \"stake\", \"utkvm\", \"tennesse\", \"tenn\", \"republican\", \"halv\", \"evas\", \"tobacco\", \"encrypt\", \"presid\", \"clipper\", \"clinton\", \"legal\", \"drug\", \"gun\", \"health\", \"feder\", \"enforc\", \"congress\", \"amend\", \"escrow\", \"illeg\", \"handgun\", \"job\", \"militia\", \"wiretap\", \"constitut\", \"liberti\", \"libertarian\", \"prohibit\", \"myer\", \"legisl\", \"hamburg\", \"homicid\", \"privat\", \"warrant\", \"insur\", \"agenc\", \"key\", \"court\", \"propos\", \"protect\", \"secur\", \"govern\", \"crime\", \"weapon\", \"administr\", \"hous\", \"secret\", \"state\", \"american\", \"chip\", \"public\", \"peopl\", \"case\", \"control\", \"work\", \"nation\", \"year\", \"consid\", \"issu\", \"provid\", \"disarm\", \"gover\", \"revolut\", \"revok\", \"mein\", \"regret\", \"neccessari\", \"perpetr\", \"gaza\", \"musicb\", \"soldier\", \"ottoman\", \"occupi\", \"muslim\", \"bosnian\", \"thrower\", \"memoir\", \"asham\", \"savag\", \"spanish\", \"baku\", \"mosqu\", \"turkiy\", \"turkey\", \"benevol\", \"depriv\", \"troop\", \"greec\", \"hussein\", \"tranquil\", \"armenian\", \"israel\", \"kill\", \"jew\", \"isra\", \"turkish\", \"arab\", \"murder\", \"greek\", \"armenia\", \"turk\", \"nazi\", \"german\", \"villag\", \"genocid\", \"palestinian\", \"civilian\", \"argic\", \"serdar\", \"bomb\", \"davidian\", \"massacr\", \"azerbaijani\", \"movement\", \"azerbaijan\", \"innoc\", \"territori\", \"armi\", \"jewish\", \"attack\", \"peac\", \"anti\", \"soviet\", \"land\", \"popul\", \"children\", \"histori\", \"peopl\", \"countri\", \"live\", \"world\", \"today\", \"forc\", \"state\", \"human\", \"govern\", \"year\", \"happen\", \"time\", \"fact\", \"photoshop\", \"polygon\", \"xlib\", \"spreadsheet\", \"debug\", \"workgroup\", \"pixmap\", \"bit\", \"callback\", \"dialog\", \"renam\", \"routin\", \"cview\", \"widget\", \"static\", \"viewer\", \"jpeg\", \"gray\", \"xcopyarea\", \"handler\", \"guidelin\", \"reilli\", \"resiz\", \"dutch\", \"patch\", \"librari\", \"melbourn\", \"preview\", \"jade\", \"nearest\", \"file\", \"window\", \"imag\", \"graphic\", \"server\", \"display\", \"applic\", \"screen\", \"output\", \"entri\", \"convert\", \"comp\", \"mous\", \"motif\", \"directori\", \"font\", \"client\", \"compress\", \"default\", \"microsoft\", \"xterm\", \"string\", \"postscript\", \"stream\", \"null\", \"resourc\", \"compil\", \"function\", \"visual\", \"program\", \"code\", \"version\", \"format\", \"color\", \"softwar\", \"manag\", \"avail\", \"packag\", \"section\", \"unix\", \"sourc\", \"includ\", \"user\", \"data\", \"chang\", \"support\", \"work\", \"problem\", \"grip\", \"unsaf\", \"impair\", \"cruiser\", \"coat\", \"bike\", \"fist\", \"muscl\", \"biker\", \"sweat\", \"moto\", \"leather\", \"sysop\", \"bacteria\", \"milk\", \"irrit\", \"hors\", \"piss\", \"dude\", \"carb\", \"dri\", \"grin\", \"cager\", \"windshield\", \"sunni\", \"hadn\", \"tender\", \"niel\", \"liner\", \"stroke\", \"food\", \"pull\", \"motorcycl\", \"pain\", \"ride\", \"drink\", \"rid\", \"wear\", \"rock\", \"rider\", \"accid\", \"truck\", \"weren\", \"eat\", \"gear\", \"candida\", \"tast\", \"steer\", \"flash\", \"wors\", \"revolv\", \"cloth\", \"dog\", \"helmet\", \"gonna\", \"infant\", \"engr\", \"inject\", \"complain\", \"turn\", \"glad\", \"hurt\", \"auto\", \"behanna\", \"couldn\", \"mayb\", \"rememb\", \"littl\", \"lock\", \"wouldn\", \"thing\", \"stop\", \"leav\", \"good\", \"friend\", \"happen\", \"face\", \"hand\", \"start\", \"time\", \"feel\", \"hear\", \"stupid\", \"wasn\", \"caus\", \"cours\", \"long\", \"peopl\", \"probabl\", \"live\", \"problem\", \"tri\", \"coupl\", \"make\", \"work\", \"talk\", \"mauric\", \"roth\", \"marvel\", \"dragon\", \"nore\", \"cryptolog\", \"calendar\", \"diagnosi\", \"bloom\", \"practition\", \"sage\", \"diagnos\", \"dose\", \"artist\", \"reproduct\", \"meyer\", \"protein\", \"frontier\", \"strain\", \"vitamin\", \"subscript\", \"aid\", \"subscrib\", \"bogus\", \"elementari\", \"telnet\", \"launchpad\", \"thai\", \"ieee\", \"bibliographi\", \"network\", \"technic\", \"medic\", \"newsgroup\", \"diseas\", \"patient\", \"medicin\", \"journal\", \"academ\", \"onlin\", \"random\", \"cancer\", \"ripem\", \"clinic\", \"infect\", \"signatur\", \"crypt\", \"santa\", \"symptom\", \"newslett\", \"physician\", \"literatur\", \"introduct\", \"cure\", \"yeast\", \"avenu\", \"syndrom\", \"abstract\", \"patent\", \"annual\", \"mail\", \"treatment\", \"anonym\", \"list\", \"contact\", \"inform\", \"berkeley\", \"topic\", \"request\", \"electron\", \"address\", \"messag\", \"send\", \"associ\", \"servic\", \"internet\", \"receiv\", \"group\", \"comput\", \"research\", \"email\", \"book\", \"public\", \"copi\", \"paper\", \"summari\", \"number\", \"includ\", \"institut\", \"general\", \"news\", \"avail\", \"interest\", \"access\", \"distribut\", \"vulcan\", \"aero\", \"temperatur\", \"talon\", \"toyota\", \"uokmax\", \"uoknor\", \"sunlight\", \"infin\", \"atlas\", \"altitud\", \"detector\", \"axi\", \"ford\", \"venus\", \"dens\", \"fluid\", \"pump\", \"krillean\", \"titan\", \"telescop\", \"porsch\", \"coventri\", \"ukan\", \"diagram\", \"greenbelt\", \"coloni\", \"keen\", \"torqu\", \"madam\", \"nasa\", \"orbit\", \"launch\", \"satellit\", \"moon\", \"rocket\", \"mission\", \"nuclear\", \"surfac\", \"cool\", \"digex\", \"shuttl\", \"lunar\", \"radar\", \"henri\", \"vehicl\", \"cramer\", \"alaska\", \"optilink\", \"probe\", \"brake\", \"flight\", \"solar\", \"honda\", \"spacecraft\", \"dseg\", \"spencer\", \"clayton\", \"space\", \"planet\", \"cycl\", \"mile\", \"water\", \"station\", \"cost\", \"project\", \"engin\", \"earth\", \"design\", \"car\", \"high\", \"model\", \"laboratori\", \"year\", \"center\", \"power\", \"technolog\", \"light\", \"research\", \"access\", \"time\", \"base\", \"work\", \"long\", \"small\", \"hulman\", \"kansa\", \"gibson\", \"hull\", \"richer\", \"gretzki\", \"finland\", \"wong\", \"trivia\", \"dalhousi\", \"kean\", \"koufax\", \"rooki\", \"penguin\", \"crux\", \"panther\", \"roster\", \"slump\", \"lindro\", \"daryl\", \"detroit\", \"bure\", \"burk\", \"marlin\", \"pitch\", \"career\", \"ouch\", \"jagr\", \"mogilni\", \"footbal\", \"game\", \"team\", \"play\", \"player\", \"season\", \"hockey\", \"leagu\", \"score\", \"roger\", \"chicago\", \"basebal\", \"boston\", \"playoff\", \"penalti\", \"leaf\", \"fan\", \"ranger\", \"montreal\", \"upenn\", \"brave\", \"clark\", \"loui\", \"jose\", \"devil\", \"flyer\", \"patrick\", \"minnesota\", \"philadelphia\", \"duke\", \"win\", \"trade\", \"buffalo\", \"goal\", \"blue\", \"divis\", \"gari\", \"wing\", \"offens\", \"sport\", \"year\", \"pick\", \"canada\", \"smith\", \"lose\", \"period\", \"toronto\", \"king\", \"columbia\", \"defens\", \"good\", \"point\", \"final\", \"time\", \"run\", \"apana\", \"init\", \"nctu\", \"intermitt\", \"centri\", \"pinout\", \"bottleneck\", \"jumper\", \"maxtor\", \"watt\", \"scanner\", \"clamp\", \"pentium\", \"powerpc\", \"bernoulli\", \"lemon\", \"svga\", \"mono\", \"uart\", \"esdi\", \"dock\", \"reinstal\", \"ribbon\", \"unplug\", \"vram\", \"seagat\", \"megabyt\", \"baud\", \"laptop\", \"appletalk\", \"drive\", \"card\", \"scsi\", \"driver\", \"video\", \"wire\", \"modem\", \"cabl\", \"simm\", \"upgrad\", \"floppi\", \"circuit\", \"motherboard\", \"boot\", \"batteri\", \"motorola\", \"audio\", \"bio\", \"quadra\", \"brand\", \"connector\", \"backup\", \"outlet\", \"turbo\", \"hook\", \"diamond\", \"voltag\", \"channel\", \"disk\", \"sale\", \"spec\", \"monitor\", \"appl\", \"price\", \"switch\", \"speed\", \"port\", \"instal\", \"printer\", \"board\", \"tape\", \"hard\", \"memori\", \"control\", \"sell\", \"ship\", \"problem\", \"buy\", \"work\", \"sound\", \"connect\", \"machin\", \"mode\", \"chip\", \"power\", \"devic\", \"softwar\", \"brandt\", \"franklin\", \"calstat\", \"bois\", \"hypocrisi\", \"mickey\", \"bmerh\", \"guitar\", \"bigboot\", \"chan\", \"worcest\", \"alexia\", \"robertson\", \"salmon\", \"tamu\", \"pwiseman\", \"teal\", \"rethink\", \"toni\", \"nodak\", \"covington\", \"bailey\", \"freeman\", \"decvax\", \"lynx\", \"wallac\", \"jacob\", \"bcstec\", \"amherst\", \"broward\", \"michael\", \"uiuc\", \"virginia\", \"cwru\", \"austin\", \"utexa\", \"univ\", \"freenet\", \"gordon\", \"andi\", \"illinoi\", \"netcom\", \"gatech\", \"magnus\", \"pitt\", \"uchicago\", \"udel\", \"craig\", \"chris\", \"purdu\", \"william\", \"portal\", \"umich\", \"ingr\", \"prism\", \"urbana\", \"mellon\", \"midway\", \"oracl\", \"repli\", \"ohio\", \"cleveland\", \"andrew\", \"robert\", \"anybodi\", \"texa\", \"bank\", \"david\", \"brian\", \"disclaim\", \"distribut\", \"newsread\", \"mike\", \"news\", \"mark\", \"opinion\", \"john\", \"world\", \"engin\", \"state\", \"hear\", \"scienc\", \"good\", \"phone\"], \"Total\": [3333.0, 3298.0, 2707.0, 2823.0, 2140.0, 6405.0, 2581.0, 2822.0, 2058.0, 3159.0, 2052.0, 2604.0, 1636.0, 1640.0, 3593.0, 4267.0, 2355.0, 1604.0, 3488.0, 4034.0, 3489.0, 1446.0, 2179.0, 1501.0, 1476.0, 1456.0, 1929.0, 1778.0, 1780.0, 1776.0, 30.73757280319964, 76.8439320079991, 24.590058242559714, 113.72901937183867, 44.057187684586154, 106.5569190510921, 19.46712944202644, 22.540886722346404, 22.540886722346404, 37.90967312394623, 154.71244977610488, 53.27845952554605, 52.253873765439394, 643.4398573469792, 24.590058242559714, 33.81133008351961, 49.18011648511943, 18.442543681919783, 48.155530725012774, 29.712987043092987, 57.37680256597266, 233.60555330431728, 209.01549506175758, 16.393372161706477, 117.82736241226529, 23.565472482453057, 36.88508736383957, 21.51630096223975, 65.57348864682591, 25.614644002666367, 2052.245277493629, 1269.4617567721452, 919.0837346037606, 810.4473362443639, 806.3489932039372, 751.0213621581779, 653.6857149480458, 585.0384690208999, 570.6942683794067, 406.7605467623419, 343.23622963572933, 324.79368595380953, 303.2773849915698, 290.98235587028995, 286.88401282986337, 284.83484130964996, 282.78566978943667, 276.6381552287968, 261.26936882719696, 249.99892546602376, 241.8022393851705, 207.99090930165093, 196.7204659404777, 196.7204659404777, 194.6712944202644, 190.57295137983778, 187.4991940995178, 345.3460167321255, 478.81819730483, 742.3350108674597, 531.4579065930175, 348.7223233971944, 917.8095377153783, 2604.38990740705, 857.3151988157011, 1698.5779777396451, 1336.5452315787422, 1446.0498292255654, 1436.3338076857774, 1282.6806697461197, 756.8970964091862, 1010.2050593413377, 2100.1148287454594, 568.0486815737959, 562.9046328794991, 603.1103634085084, 6405.389246929005, 901.1959011968837, 1243.2285268827459, 1144.1851549750884, 3032.568935890614, 1286.188060836125, 2775.479596718089, 3489.8450924448657, 1713.0002250791752, 2074.7512377785656, 2319.905422401006, 2438.9593472862075, 1928.4787576975737, 21.298748448648094, 100.10411770864603, 92.6495557516192, 44.72737174216099, 41.532559474863774, 288.59804147918163, 38.33774720756657, 42.59749689729619, 42.59749689729619, 26.623435560810115, 27.68837298324252, 506.9102130778246, 48.987121431890614, 96.90930544134882, 25.558498138377708, 69.22093245810629, 85.19499379459238, 281.14347952215485, 48.987121431890614, 63.89624534594427, 97.97424286378123, 280.0785420997224, 25.558498138377708, 96.90930544134882, 57.50662081134985, 35.142934940269356, 129.92236553675335, 25.558498138377708, 21.298748448648094, 88.38980606188957, 1230.0027229094273, 956.3138053442993, 859.4044999029505, 700.7288239605223, 676.2352632445769, 668.7807012875501, 610.2091430537679, 598.5157476540718, 497.325776275933, 436.6243431972859, 420.6502818607998, 405.74115794674617, 454.72569417715926, 310.96172735026215, 291.79285374647884, 290.7279163240465, 282.2084169445872, 256.64991880620954, 463.3547318949824, 201.27317283972448, 201.27317283972448, 190.62379861540043, 185.2991115032384, 169.32505016675233, 157.6107385199959, 156.54580109756347, 681.7900290744035, 198.11401161805605, 508.77894719259706, 475.3889797427509, 666.5008847569862, 526.2975869018126, 633.8774953160946, 970.1354923994461, 1102.4209275475444, 2179.2517349038367, 665.8089831868892, 724.9005723065354, 588.2844862609454, 908.240929785288, 494.8485788676437, 3593.617459713399, 1357.8539414854508, 1553.1635442761476, 1842.5187357112345, 6405.389246929005, 2241.690402455026, 1929.840172289862, 4324.247292719088, 1518.7620408754965, 4267.234766619799, 1461.202634943317, 1313.43385799009, 1458.6112633946598, 63.83413114755033, 59.43177727530548, 83.64472357265215, 31.917065573775165, 22.01176936122425, 33.01765404183637, 17.6094154889794, 39.62118485020365, 133.17120463540672, 23.112357829285465, 331.277128886425, 147.4788547202025, 241.02887450540555, 569.0042379876469, 45.12412719050971, 20.91118089316304, 19.810592425101824, 27.514711701530313, 30.816477105713954, 45.12412719050971, 97.95237365744792, 25.313534765407887, 34.11824250989759, 414.9218524590771, 23.112357829285465, 57.23060033918305, 227.821812888671, 177.1947433578552, 49.52648106275456, 20.91118089316304, 1476.9897241381473, 1127.0025912946817, 1501.128996442652, 953.1096133410101, 924.4533679996142, 823.240174109787, 628.4360152629523, 576.7083572640754, 541.4895262861166, 425.9277371396892, 421.5253832674444, 418.22361786326076, 333.4783058225474, 330.17654041836374, 320.2712442058128, 301.5612402487722, 301.5612402487722, 292.7565325042825, 291.65594403622134, 258.63828999438493, 243.23005144152796, 216.81592820805886, 212.41357433581402, 204.70945505938553, 200.3071011871407, 283.93708996122444, 228.87670643686909, 383.41712290544837, 653.0202703163926, 877.2631097856282, 536.4733475611157, 549.141133604708, 352.7502095563759, 680.7348442654207, 465.32582782325636, 844.7676374111895, 696.0003455451144, 6405.389246929005, 949.2225488416441, 1718.6105808077282, 2932.839803794655, 1039.0456410127792, 971.3865951661048, 3593.617459713399, 1243.2285268827459, 2179.2517349038367, 4267.234766619799, 1523.673641718925, 5506.151083820371, 1713.0002250791752, 36.119975512464435, 169.97635535277382, 194.41045643473504, 22.309396640051563, 36.119975512464435, 26.55880552387091, 149.79166315463195, 371.82327733419277, 54.17996326869666, 80.73876879256757, 37.18232773341928, 268.7751119015736, 80.73876879256757, 591.730187071844, 86.05052989734175, 121.10815318885135, 315.51860962358637, 83.92582545543208, 27.621157744825744, 78.61406435065788, 99.86110876975462, 67.99054214110953, 39.30703217532894, 19.122339977187057, 224.1563186214705, 506.742009395457, 80.73876879256757, 49.93055438487731, 27.621157744825744, 32.93291884959993, 3333.6612693562765, 3298.603646064767, 1456.482186004383, 1117.594536444488, 939.1193633240754, 922.121727788798, 1070.8903602724622, 682.030125853005, 678.8430691901405, 659.7207292129534, 648.0348547824502, 571.5454948737021, 542.8619849079214, 538.612576024102, 500.3678960697279, 483.37026053445055, 353.76328957796056, 320.83037072836055, 293.2092129835349, 280.4609863320768, 275.1492252273026, 253.90218080820588, 234.77984083101884, 231.59278416815434, 229.46807972624467, 485.59326885132776, 374.0184861217163, 752.5683985097079, 338.83470129746695, 2822.8348709995626, 1019.0749816552654, 1780.6379650223762, 792.0372602094478, 1036.1976127375378, 1725.094098035012, 1109.5931194572736, 1831.4565031108204, 863.1392881064081, 588.5866260513828, 826.7688106912883, 1385.2945072293742, 2326.9662064128906, 1191.8643186467934, 1728.463843595695, 1627.2683042354015, 1928.2834887179179, 4324.247292719088, 3488.441597101946, 47.470209668913725, 21.097870963961658, 42.195741927923315, 47.470209668913725, 84.39148385584663, 780.6212256665813, 47.470209668913725, 94.94041933782745, 84.39148385584663, 21.097870963961658, 47.470209668913725, 70.67786772927154, 21.097870963961658, 41.140848379725234, 37.976167735130986, 29.53701934954632, 122.36765159097762, 65.40339998828114, 27.427232253150155, 55.90935805449839, 37.976167735130986, 22.15276451215974, 29.53701934954632, 23.207658060357822, 16.878296771169325, 69.62297418107347, 27.427232253150155, 23.207658060357822, 26.37233870495207, 60.12893224729073, 567.5327289305685, 350.2246580017635, 346.00508380897116, 344.9501902607731, 329.1267870378019, 301.6995547846517, 255.28423866393607, 236.29615479637056, 235.24126124817246, 232.0765806035782, 219.41785802520124, 177.22211609727793, 164.56339351890094, 159.28892577791052, 151.90467094052394, 128.6970128801661, 128.6970128801661, 128.6970128801661, 127.64211933196803, 336.64812663477784, 125.53233223557186, 123.4225451391757, 121.31275804277952, 201.45435991774238, 120.25786449458145, 109.70892901260062, 109.70892901260062, 106.54424836800638, 167.69776637540375, 1089.2534655878528, 155.0847387168899, 232.11457858804914, 405.3804387350935, 131.8505998018085, 411.5377477741495, 1081.60047444983, 959.4833310511415, 1555.8412809897586, 301.9680670038949, 701.1989293280624, 3489.8450924448657, 876.1881390534364, 1697.7377027681318, 4034.6354575432615, 862.6662341871505, 1523.673641718925, 653.8797151810995, 1224.2482962279903, 2023.7971917834916, 5506.151083820371, 1036.3234895475994, 1696.1610900280411, 419.5359853279788, 488.92868560606996, 1254.6115846185987, 1456.222590646128, 1734.447294251175, 6405.389246929005, 1562.2626428604092, 1718.6105808077282, 3488.441597101946, 1737.5846886580687, 676.0173373577165, 1509.9466570910924, 4324.247292719088, 1508.9227073731317, 21.71707338985634, 47.777561457683944, 42.348293110219856, 66.23707383906184, 82.52487888145409, 65.15122016956902, 28.23219540681324, 41.26243944072704, 55.37853714413366, 31.48975641529169, 24.97463439833479, 82.52487888145409, 60.807805491597755, 48.86341512717676, 32.57561008478451, 55.37853714413366, 62.97951283058338, 45.60585411869831, 32.57561008478451, 80.35317154246846, 55.37853714413366, 221.51414857653464, 115.1004889662386, 30.403902745798877, 18.459512381377888, 80.35317154246846, 27.146341737320423, 17.37365871188507, 39.09073210174141, 32.57561008478451, 859.996106238311, 527.7248833735091, 509.2653709921311, 611.2886130273799, 408.2809797292992, 336.61463754277327, 273.63512471218985, 234.54439261044845, 219.34244123754902, 301.83635999770837, 298.5862576619867, 193.28195316972142, 193.28195316972142, 163.96390409341538, 162.87805042392253, 160.70634308493692, 158.53463574595128, 157.44878207645846, 138.98926969508057, 129.2165866696452, 125.95902566116676, 124.87317199167396, 118.35804997471706, 116.18634263573142, 116.18634263573142, 112.92878162725296, 111.84292795776014, 103.15609860181762, 162.8571341768621, 159.5784355711975, 2581.187156933169, 285.68032995147706, 654.4011117657841, 1776.3353173096586, 793.100019428761, 2355.472793545131, 613.6747380859157, 281.09659588040915, 776.611247834443, 669.8994751091468, 1182.913021027245, 1367.1037737907961, 1788.147677360813, 550.3960589801403, 1360.0213944348313, 1212.1859776314022, 868.3217502074203, 2014.6830812459746, 815.3342822590118, 1566.3004250978336, 1235.2517250887604, 1442.0485218793074, 1842.5187357112345, 871.3326168026074, 540.7423384562501, 675.7538254495776, 2500.5639745050385, 2326.9662064128906, 995.6046999341991, 1464.7040701507697, 1904.569687666642, 1831.4565031108204, 1500.0196733260323, 1574.4627903106643, 3159.1899532713824, 28.132337894656857, 31.37837688250188, 119.02142955431746, 27.050324898708514, 97.38116963535066, 58.42870178121039, 140.66168947328427, 31.37837688250188, 40.034480850088606, 73.57688372448716, 58.42870178121039, 226.14071615320316, 42.19850684198528, 228.30474214509985, 119.02142955431746, 19.47623392707013, 91.97110465560894, 98.46318263129899, 34.624415870346894, 117.93941655836912, 126.59552052595585, 49.77259781362367, 27.050324898708514, 43.280519837933625, 51.93662380552035, 75.74090971638384, 59.51071477715873, 21.640259918966812, 51.93662380552035, 16.230194939225107, 1446.6513755829315, 611.3373427108124, 575.6309138445172, 393.85273052519597, 383.0326005657125, 378.7045485819192, 368.96643161838415, 310.53772983717374, 288.8974699182069, 287.8154569222586, 375.4238357437972, 281.32337894656854, 264.0111710113951, 262.9291580154467, 357.0828641350653, 353.8011741015914, 255.3550670438084, 244.53493708432495, 234.7968201207899, 218.5666251815648, 218.5666251815648, 308.3775445188215, 203.41844323828803, 183.94220931121788, 181.77818331932122, 180.69617032337288, 178.5321443314762, 176.3681183395795, 2058.540560736173, 206.6474066526171, 203.3987824632945, 400.71631794314345, 561.2240499662522, 472.96507192081316, 1088.4085561021532, 716.9454395220519, 1570.9061545743775, 700.6604903582397, 1084.308126178449, 511.40418007287553, 1598.585672241449, 809.9194175071311, 466.7739160171717, 4267.234766619799, 1389.9895912997056, 1953.8735197924184, 1470.9937055319926, 761.7936232643249, 1566.3004250978336, 1574.4627903106643, 5506.151083820371, 1628.7443907994555, 4324.247292719088, 1734.447294251175, 871.6729157537652, 99.60646984815321, 81.59253381178507, 74.17503073798643, 49.803234924076605, 25.431439110166778, 72.05574414547253, 148.35006147597286, 50.862878220333556, 25.431439110166778, 25.431439110166778, 36.027872072736265, 37.087515368993216, 81.59253381178507, 145.171131587202, 50.862878220333556, 50.862878220333556, 50.862878220333556, 18.013936036368133, 103.84504303318101, 49.803234924076605, 265.9704673604942, 49.803234924076605, 25.431439110166778, 49.803234924076605, 344.38407128350843, 158.94649443854235, 18.013936036368133, 77.35396062675729, 37.087515368993216, 50.862878220333556, 2140.479458439037, 1640.3278226057573, 1604.2999505330208, 1075.5379457008032, 719.4977981584684, 703.6031487146142, 559.4916604236691, 552.0741573498705, 430.2151782803213, 485.3219238118582, 485.3389993853741, 385.7101598375295, 353.92086094982096, 285.0440466931193, 263.8511807679803, 259.61260758295253, 258.5529642866956, 241.5986715465844, 236.30045506529964, 234.18116847278574, 231.0022385840149, 227.82330869524404, 222.5250922139593, 222.5250922139593, 216.1672324364176, 211.9286592513898, 210.86901595513285, 203.45151288133422, 239.60222046948329, 356.08619926219893, 524.7881379559626, 345.69703454456555, 615.378339098852, 460.844311503149, 690.3653248152091, 387.5080032236024, 372.977793084968, 313.760298215566, 384.4510271228001, 4267.234766619799, 578.000019737289, 772.3095195353021, 537.3491720297644, 845.5142246102212, 695.6077443447949, 755.7080301743108, 563.7657261503513, 607.1235050511148, 704.9584450155307, 4034.6354575432615, 2775.479596718089, 868.1125594647388, 5506.151083820371, 1351.0734876601898, 43.839592660341296, 36.53299388361775, 34.445394233125306, 20.875996504924426, 156.5699737869332, 35.489194058371524, 17.744597029185762, 204.58476574825937, 69.93458829149682, 117.949380252823, 108.55518182560702, 22.96359615541687, 56.36519056329595, 75.15358741772793, 31.313994757386638, 39.66439335935641, 124.21217920430034, 73.0659877672355, 66.80318881575816, 79.32878671871282, 61.584189689527065, 27.138795456401756, 32.35779458263286, 25.051195805909312, 136.737777107255, 51.14619143706484, 40.708193184602635, 66.80318881575816, 45.92719231083374, 25.051195805909312, 2707.616746688698, 1636.678125986075, 1022.923828741297, 1189.987457967818, 737.9664764490785, 591.8345009146075, 434.2207273024281, 427.95792835095074, 370.54893796240856, 367.4175384866699, 358.0233400594539, 330.8845446030522, 265.1251556125402, 257.81855683581665, 252.59955770958555, 246.33675875810826, 243.20535928236959, 242.16155945712336, 230.67976137941488, 216.0665638259678, 192.0591678453047, 186.84016871907363, 184.75256906858118, 177.44597029185763, 171.18317134038028, 169.09557168988783, 154.48237413644074, 238.00749775332466, 1113.080214022353, 1003.0150706540443, 234.87351307610842, 740.9792606729961, 934.8468690980148, 1076.121658732719, 526.5018170253937, 1016.3871132208759, 556.006498067917, 766.6686221978332, 425.3088911636361, 736.1222623202239, 419.3429305434966, 1473.4562177179278, 903.6641769301882, 1929.840172289862, 1037.3664188451737, 530.6288336016676, 3488.441597101946, 630.8423848842616, 4324.247292719088, 1019.6588406886142, 722.5935860753691, 1165.1944467816918, 690.2524782181074, 1553.1635442761476, 1953.8735197924184, 781.5463477588185, 1725.094098035012, 37.704209244169135, 45.03558326386869, 37.704209244169135, 30.37283522446958, 32.467513515812314, 23.041461204770027, 16.757426330741836, 39.79888753551187, 18.852104622084568, 20.9467829134273, 41.8935658268546, 33.51485266148367, 33.51485266148367, 60.74567044893916, 111.01794944116467, 30.37283522446958, 41.8935658268546, 50.272278992225516, 268.1188212918694, 45.03558326386869, 95.30786225609421, 60.74567044893916, 95.30786225609421, 19.899443767755933, 50.272278992225516, 18.852104622084568, 41.8935658268546, 46.08292240954005, 81.69245336236646, 45.03558326386869, 903.8536827143879, 782.3623418165096, 595.9359738870066, 574.9891909735793, 441.977119473316, 433.5984063079451, 423.1250148512314, 413.69896254018914, 384.37346646139093, 352.95329209125, 343.5272397802077, 1065.6208202322039, 298.491656516339, 294.30229993365356, 594.9378513436776, 278.59221274858305, 274.4028561658976, 259.7401081264985, 424.20238014746974, 343.53479418273446, 324.71364968194456, 214.7045248626298, 210.51516827994433, 208.4204899886016, 203.18379426024478, 201.08911596890206, 179.0949939098034, 177.0003156184607, 174.90563732711794, 2823.5896720591827, 665.5107497598208, 521.8086734054658, 876.3137748163961, 867.0861909867879, 666.2218437675454, 495.866186848646, 568.3247825277369, 1778.093904298847, 560.1157860283286, 549.5393556014075, 3159.1899532713824, 629.0685799425747, 807.5924554796169, 1904.569687666642, 1239.3680671911266, 1493.5003965369874, 1568.2191563616898, 2932.839803794655, 1570.9061545743775, 3593.617459713399, 1696.1610900280411, 1696.1466678949637, 4034.6354575432615, 1128.3302673231115], \"loglift\": [30.0, 29.0, 28.0, 27.0, 26.0, 25.0, 24.0, 23.0, 22.0, 21.0, 20.0, 19.0, 18.0, 17.0, 16.0, 15.0, 14.0, 13.0, 12.0, 11.0, 10.0, 9.0, 8.0, 7.0, 6.0, 5.0, 4.0, 3.0, 2.0, 1.0, 2.0902, 2.0902, 2.0902, 2.0902, 2.0902, 2.0902, 2.0902, 2.0902, 2.0902, 2.0902, 2.0902, 2.0902, 2.0902, 2.0902, 2.0902, 2.0902, 2.0902, 2.0902, 2.0902, 2.0902, 2.0902, 2.0902, 2.0902, 2.0902, 2.0902, 2.0902, 2.0902, 2.0902, 2.0902, 2.0902, 2.0902, 2.0902, 2.0891, 2.0902, 2.0902, 2.0902, 2.0902, 2.0902, 2.0902, 2.0902, 2.0902, 2.0902, 2.0902, 2.0902, 2.0902, 2.0902, 2.0902, 2.0902, 2.0902, 2.0902, 2.0902, 2.0902, 2.0902, 2.0902, 2.0902, 2.0902, 2.0902, 2.0841, 2.0766, 2.0385, 2.0495, 2.0624, 1.992, 1.8973, 1.9246, 1.7926, 1.794, 1.7556, 1.7064, 1.6912, 1.8221, 1.6964, 1.4578, 1.8749, 1.8772, 1.848, 0.834, 1.6755, 1.5243, 1.5613, 1.0839, 1.4519, 0.9861, 0.7834, 1.2352, 1.0617, 0.9651, 0.9205, 1.0528, 2.1112, 2.1112, 2.1112, 2.1112, 2.1112, 2.1112, 2.1112, 2.1112, 2.1112, 2.1112, 2.1112, 2.1112, 2.1112, 2.1112, 2.1112, 2.1112, 2.1112, 2.1112, 2.1112, 2.1112, 2.1112, 2.1112, 2.1112, 2.1112, 2.1112, 2.1112, 2.1112, 2.1112, 2.1112, 2.1112, 2.1112, 2.1112, 2.1112, 2.1112, 2.1112, 2.1112, 2.1112, 2.1094, 2.1112, 2.1112, 2.1112, 2.1112, 2.1089, 2.1112, 2.1112, 2.1112, 2.1112, 2.1112, 2.1041, 2.1112, 2.1112, 2.1112, 2.1112, 2.1112, 2.1112, 2.1112, 2.0935, 2.1057, 2.0558, 2.0526, 2.0142, 2.033, 2.0045, 1.9586, 1.9362, 1.8475, 1.9957, 1.98, 1.9913, 1.8729, 1.9933, 1.4408, 1.6513, 1.5535, 1.3247, 0.6119, 1.0885, 1.0563, 0.2929, 1.1382, 0.2107, 1.1274, 1.2242, 1.1194, 2.2135, 2.2135, 2.2135, 2.2135, 2.2135, 2.2135, 2.2135, 2.2135, 2.2135, 2.2135, 2.2135, 2.2135, 2.2135, 2.2135, 2.2135, 2.2135, 2.2135, 2.2135, 2.2135, 2.2135, 2.2135, 2.2135, 2.2135, 2.2135, 2.2135, 2.2135, 2.2135, 2.2135, 2.2135, 2.2135, 2.2135, 2.2135, 2.2099, 2.2135, 2.2124, 2.2135, 2.2135, 2.2135, 2.2135, 2.2135, 2.2135, 2.2135, 2.2135, 2.2135, 2.2135, 2.2135, 2.2135, 2.2135, 2.2135, 2.2135, 2.2135, 2.2135, 2.2135, 2.2135, 2.2135, 2.2097, 2.2089, 2.1623, 2.0758, 2.0187, 2.0788, 2.046, 2.1203, 1.9474, 2.0443, 1.8563, 1.9146, 1.0956, 1.7037, 1.4054, 1.0779, 1.5699, 1.564, 0.7141, 1.243, 0.7517, 0.187, 1.0349, -0.1752, 0.9084, 2.214, 2.214, 2.214, 2.214, 2.214, 2.214, 2.214, 2.214, 2.214, 2.214, 2.214, 2.214, 2.214, 2.214, 2.214, 2.214, 2.214, 2.214, 2.214, 2.214, 2.214, 2.214, 2.214, 2.214, 2.214, 2.214, 2.214, 2.214, 2.214, 2.214, 2.214, 2.214, 2.2133, 2.214, 2.214, 2.214, 2.212, 2.214, 2.214, 2.214, 2.214, 2.214, 2.214, 2.214, 2.214, 2.214, 2.214, 2.214, 2.214, 2.214, 2.214, 2.214, 2.214, 2.214, 2.214, 2.2028, 2.2053, 2.1877, 2.2047, 2.0175, 2.0943, 2.0354, 2.0982, 2.0502, 1.7588, 1.8761, 1.7048, 1.9356, 2.0495, 1.9252, 1.7217, 1.3552, 1.6895, 1.4409, 1.4194, 1.2307, 0.4202, 0.5291, 2.2829, 2.2829, 2.2829, 2.2829, 2.2829, 2.2829, 2.2829, 2.2829, 2.2829, 2.2829, 2.2829, 2.2829, 2.2829, 2.2829, 2.2829, 2.2829, 2.2829, 2.2829, 2.2829, 2.2829, 2.2829, 2.2829, 2.2829, 2.2829, 2.2829, 2.2829, 2.2829, 2.2829, 2.2829, 2.2829, 2.2829, 2.2829, 2.2829, 2.2829, 2.2829, 2.2829, 2.2829, 2.2829, 2.2829, 2.2829, 2.2829, 2.2829, 2.2829, 2.2829, 2.2829, 2.2829, 2.2829, 2.2829, 2.2829, 2.2731, 2.2829, 2.2829, 2.2829, 2.2778, 2.2829, 2.2829, 2.2829, 2.2829, 2.2768, 2.1943, 2.2691, 2.2457, 2.2008, 2.275, 2.1425, 2.0247, 2.0081, 1.9287, 2.1475, 2.0022, 1.7108, 1.9409, 1.8091, 1.6174, 1.9342, 1.811, 1.9868, 1.8437, 1.6453, 1.3464, 1.7798, 1.6059, 2.0749, 2.0163, 1.6443, 1.4711, 1.3641, 0.4802, 1.305, 1.2257, 0.7345, 1.1261, 1.8041, 1.1499, 0.2833, 1.1287, 2.2996, 2.2996, 2.2996, 2.2996, 2.2996, 2.2996, 2.2996, 2.2996, 2.2996, 2.2996, 2.2996, 2.2996, 2.2996, 2.2996, 2.2996, 2.2996, 2.2996, 2.2996, 2.2996, 2.2996, 2.2996, 2.2996, 2.2996, 2.2996, 2.2996, 2.2996, 2.2996, 2.2996, 2.2996, 2.2996, 2.2996, 2.2996, 2.2996, 2.2961, 2.2996, 2.2996, 2.2996, 2.2996, 2.2996, 2.2961, 2.2961, 2.2996, 2.2996, 2.2996, 2.2996, 2.2996, 2.2996, 2.2996, 2.2996, 2.2996, 2.2996, 2.2996, 2.2996, 2.2996, 2.2996, 2.2996, 2.2996, 2.2996, 2.2931, 2.2931, 2.1795, 2.2526, 2.1935, 2.123, 2.1438, 2.0387, 2.159, 2.2239, 2.1055, 2.121, 2.0503, 2.0306, 1.9544, 2.1211, 1.9846, 1.9449, 2.0006, 1.8291, 2.0045, 1.839, 1.8533, 1.7662, 1.606, 1.8405, 2.0292, 1.9183, 1.2791, 1.2877, 1.6852, 1.4435, 1.2693, 1.2235, 1.3416, 1.2951, 0.6393, 2.4009, 2.4009, 2.4009, 2.4009, 2.4009, 2.4009, 2.4009, 2.4009, 2.4009, 2.4009, 2.4009, 2.4009, 2.4009, 2.4009, 2.4009, 2.4009, 2.4009, 2.4009, 2.4009, 2.4009, 2.4009, 2.4009, 2.4009, 2.4009, 2.4009, 2.4009, 2.4009, 2.4009, 2.4009, 2.4009, 2.4009, 2.4009, 2.4009, 2.4009, 2.4009, 2.4009, 2.4009, 2.4009, 2.4009, 2.4009, 2.3981, 2.4009, 2.4009, 2.4009, 2.3978, 2.3979, 2.4009, 2.4009, 2.4009, 2.4009, 2.4009, 2.3973, 2.4009, 2.4009, 2.4009, 2.4009, 2.4009, 2.4009, 2.3576, 2.3957, 2.3956, 2.3444, 2.3108, 2.2369, 2.0706, 2.1133, 1.8922, 2.0994, 1.8863, 2.0773, 1.5905, 1.8581, 2.1022, 0.7569, 1.389, 1.1443, 1.3194, 1.7189, 1.2054, 1.1654, 0.1832, 1.122, 0.1692, 0.9535, 1.5672, 2.432, 2.432, 2.432, 2.432, 2.432, 2.432, 2.432, 2.432, 2.432, 2.432, 2.432, 2.432, 2.432, 2.432, 2.432, 2.432, 2.432, 2.432, 2.432, 2.432, 2.432, 2.432, 2.432, 2.432, 2.432, 2.432, 2.432, 2.432, 2.432, 2.432, 2.432, 2.432, 2.432, 2.432, 2.432, 2.432, 2.432, 2.432, 2.432, 2.4298, 2.4298, 2.432, 2.432, 2.432, 2.432, 2.432, 2.432, 2.432, 2.432, 2.432, 2.432, 2.432, 2.432, 2.432, 2.432, 2.432, 2.432, 2.432, 2.4181, 2.38, 2.325, 2.3614, 2.2642, 2.3075, 2.2331, 2.3354, 2.3242, 2.3617, 2.3096, 1.6212, 2.1872, 2.075, 2.1822, 1.9825, 2.0566, 2.0, 2.1007, 2.0499, 1.9431, 0.7152, 0.933, 1.7349, 0.1642, 1.2188, 2.4668, 2.4668, 2.4668, 2.4668, 2.4668, 2.4668, 2.4668, 2.4668, 2.4668, 2.4668, 2.4668, 2.4668, 2.4668, 2.4668, 2.4668, 2.4668, 2.4668, 2.4668, 2.4668, 2.4668, 2.4668, 2.4668, 2.4668, 2.4668, 2.4668, 2.4668, 2.4668, 2.4668, 2.4668, 2.4668, 2.4668, 2.4668, 2.4668, 2.4641, 2.4668, 2.4668, 2.4668, 2.4668, 2.4668, 2.4668, 2.4668, 2.4668, 2.4668, 2.4668, 2.4668, 2.4668, 2.4668, 2.4668, 2.4668, 2.4668, 2.4668, 2.4668, 2.4668, 2.4668, 2.4668, 2.4668, 2.4668, 2.4623, 2.4465, 2.4416, 2.4623, 2.434, 2.4145, 2.384, 2.4193, 2.3507, 2.3914, 2.3446, 2.3996, 2.2557, 2.3543, 2.0967, 2.1802, 1.9868, 2.1291, 2.2877, 1.7451, 2.2238, 1.417, 1.9992, 2.1314, 1.8542, 2.1317, 1.6137, 1.3307, 1.9774, 1.1987, 2.6446, 2.6446, 2.6446, 2.6446, 2.6446, 2.6446, 2.6446, 2.6446, 2.6446, 2.6446, 2.6446, 2.6446, 2.6446, 2.6446, 2.6446, 2.6446, 2.6446, 2.6446, 2.6446, 2.6446, 2.6446, 2.6446, 2.6446, 2.6446, 2.6446, 2.6446, 2.6446, 2.6446, 2.6446, 2.6446, 2.6446, 2.6446, 2.6446, 2.6446, 2.6446, 2.6446, 2.6446, 2.6446, 2.6446, 2.6446, 2.6446, 2.6322, 2.6446, 2.6446, 2.6374, 2.6446, 2.6446, 2.6446, 2.6395, 2.6415, 2.6412, 2.6446, 2.6446, 2.6446, 2.6446, 2.6446, 2.6446, 2.6446, 2.6446, 2.5509, 2.5955, 2.6052, 2.5692, 2.5497, 2.5331, 2.5413, 2.5135, 2.3166, 2.5068, 2.5086, 2.0955, 2.4471, 2.2213, 1.7878, 1.9349, 1.8261, 1.7977, 1.42, 1.725, 1.1516, 1.5718, 1.4773, 0.725, 1.7491], \"logprob\": [30.0, 29.0, 28.0, 27.0, 26.0, 25.0, 24.0, 23.0, 22.0, 21.0, 20.0, 19.0, 18.0, 17.0, 16.0, 15.0, 14.0, 13.0, 12.0, 11.0, 10.0, 9.0, 8.0, 7.0, 6.0, 5.0, 4.0, 3.0, 2.0, 1.0, -8.4334, -7.5171, -8.6565, -7.125, -8.0734, -7.1902, -8.8901, -8.7435, -8.7435, -8.2236, -6.8173, -7.8833, -7.9027, -5.392, -8.6565, -8.3381, -7.9634, -8.9442, -7.9844, -8.4673, -7.8092, -6.4052, -6.5164, -9.062, -7.0896, -8.6991, -8.251, -8.79, -7.6757, -8.6157, -4.2322, -4.7125, -5.0366, -5.1613, -5.1663, -5.2374, -5.3762, -5.4872, -5.512, -5.8506, -6.0204, -6.0757, -6.1442, -6.1856, -6.1998, -6.2069, -6.2142, -6.2361, -6.2933, -6.3374, -6.3707, -6.5214, -6.5771, -6.5771, -6.5875, -6.6088, -6.6251, -6.0204, -5.7012, -5.3008, -5.624, -6.0324, -5.1351, -4.1868, -5.2707, -4.719, -4.9573, -4.9169, -4.9729, -5.1012, -5.4977, -5.3348, -4.8416, -5.732, -5.7387, -5.699, -4.3502, -5.4698, -5.2993, -5.3454, -4.848, -5.3378, -5.0344, -5.008, -5.2679, -5.2498, -5.2347, -5.2293, -5.3318, -8.7792, -7.2316, -7.309, -8.0373, -8.1114, -6.1728, -8.1914, -8.0861, -8.0861, -8.5561, -8.5168, -5.6095, -7.9463, -7.2641, -8.5969, -7.6006, -7.3929, -6.199, -7.9463, -7.6806, -7.2532, -6.2028, -8.5969, -7.2641, -7.786, -8.2784, -6.9709, -8.5969, -8.7792, -7.3561, -4.7231, -4.9748, -5.0816, -5.2857, -5.3213, -5.3324, -5.4241, -5.4452, -5.6286, -5.7588, -5.7961, -5.8321, -5.7205, -6.0982, -6.1618, -6.1655, -6.1952, -6.2901, -5.7065, -6.5332, -6.5332, -6.5876, -6.6159, -6.706, -6.7777, -6.7845, -5.3308, -6.5546, -5.6613, -5.7323, -5.4328, -5.6503, -5.4927, -5.1131, -5.0076, -4.4148, -5.4524, -5.383, -5.5805, -5.2647, -5.7515, -4.3214, -5.0841, -5.0475, -5.1054, -4.5723, -5.1456, -5.3276, -5.2842, -5.4852, -5.3797, -5.5347, -5.5445, -5.5445, -7.5793, -7.6508, -7.309, -8.2724, -8.644, -8.2385, -8.8671, -8.0562, -6.8439, -8.5952, -5.9326, -6.7419, -6.2507, -5.3917, -7.9262, -8.6953, -8.7494, -8.4209, -8.3075, -7.9262, -7.1511, -8.5042, -8.2057, -5.7075, -8.5952, -7.6885, -6.307, -6.5583, -7.8331, -8.6953, -4.4378, -4.7083, -4.4252, -4.8758, -4.9075, -5.0223, -5.2923, -5.3782, -5.4413, -5.6813, -5.6917, -5.6996, -5.926, -5.936, -5.9664, -6.0266, -6.0266, -6.0562, -6.06, -6.1801, -6.2416, -6.3565, -6.377, -6.414, -6.4357, -6.0907, -6.307, -5.8376, -5.3917, -5.1536, -5.5853, -5.5947, -5.963, -5.4785, -5.762, -5.3537, -5.4891, -4.0885, -5.3898, -5.0944, -4.8875, -5.4332, -5.5063, -5.0481, -5.5806, -5.5107, -5.4034, -5.5853, -5.5107, -5.5947, -8.1482, -6.5994, -6.4651, -8.63, -8.1482, -8.4557, -6.7258, -5.8166, -7.7427, -7.3438, -8.1192, -6.1412, -7.3438, -5.352, -7.2801, -6.9384, -5.9808, -7.3051, -8.4165, -7.3705, -7.1313, -7.5157, -8.0637, -8.7842, -6.3227, -5.5071, -7.3438, -7.8244, -8.4165, -8.2406, -3.6232, -3.6338, -4.452, -4.7161, -4.8901, -4.9084, -4.7608, -5.21, -5.2147, -5.2432, -5.2611, -5.3867, -5.4382, -5.4461, -5.5197, -5.5543, -5.8664, -5.9641, -6.0542, -6.0986, -6.1177, -6.1981, -6.2764, -6.2901, -6.2993, -5.5609, -5.8195, -5.1379, -5.9188, -3.9861, -4.9282, -4.4289, -5.1763, -4.9556, -4.7373, -5.0612, -4.7314, -5.2529, -5.5218, -5.3064, -4.9937, -4.8415, -5.1763, -5.0532, -5.135, -5.1539, -5.1569, -5.2627, -7.8061, -8.617, -7.9238, -7.8061, -7.2307, -5.0061, -7.8061, -7.1129, -7.2307, -8.617, -7.8061, -7.408, -8.617, -7.9492, -8.0292, -8.2805, -6.8591, -7.4856, -8.3546, -7.6424, -8.0292, -8.5682, -8.2805, -8.5217, -8.8401, -7.4231, -8.3546, -8.5217, -8.3938, -7.5697, -5.3249, -5.8076, -5.8197, -5.8228, -5.8697, -5.9567, -6.1238, -6.2011, -6.2056, -6.2191, -6.2752, -6.4888, -6.5629, -6.5954, -6.6429, -6.8087, -6.8087, -6.8087, -6.8169, -5.857, -6.8336, -6.8506, -6.8678, -6.3657, -6.8765, -6.9683, -6.9683, -6.9976, -6.5501, -4.7615, -6.636, -6.2561, -5.7434, -6.7924, -5.7867, -4.9382, -5.0746, -4.6706, -6.0913, -5.3941, -4.0806, -5.2326, -4.703, -4.029, -5.2549, -4.8092, -5.4793, -4.9953, -4.6911, -3.9891, -5.2258, -4.9071, -5.8351, -5.7406, -5.1702, -5.1944, -5.1266, -4.704, -5.2902, -5.2741, -5.0574, -5.3628, -5.6288, -5.4793, -5.2938, -5.5013, -8.5714, -7.7829, -7.9035, -7.4562, -7.2364, -7.4727, -8.309, -7.9295, -7.6353, -8.1998, -8.4316, -7.2364, -7.5417, -7.7604, -8.1659, -7.6353, -7.5066, -7.8294, -8.1659, -7.263, -7.6353, -6.249, -6.9037, -8.2349, -8.7339, -7.263, -8.3482, -8.7945, -7.9836, -8.1659, -4.8925, -5.3809, -5.4165, -5.2374, -5.6375, -5.8305, -6.0377, -6.1918, -6.2588, -5.9431, -5.954, -6.3853, -6.3853, -6.5498, -6.5565, -6.5699, -6.5835, -6.5904, -6.7151, -6.788, -6.8135, -6.8222, -6.8757, -6.8943, -6.8943, -6.9227, -6.9324, -7.0132, -6.5631, -6.5835, -3.9136, -6.0416, -5.2718, -4.3438, -5.1293, -4.1459, -5.3706, -6.0865, -5.1887, -5.321, -4.823, -4.6981, -4.5058, -5.5174, -4.7493, -4.904, -5.1819, -4.5118, -5.2409, -4.7536, -4.9768, -4.9091, -4.8242, -5.3386, -5.6269, -5.515, -4.8457, -4.9091, -5.3605, -5.2162, -5.1277, -5.2127, -5.2942, -5.2923, -5.2517, -8.2113, -8.1021, -6.7689, -8.2505, -6.9696, -7.4804, -6.6019, -8.1021, -7.8585, -7.2499, -7.4804, -6.1271, -7.8058, -6.1175, -6.7689, -8.579, -7.0267, -6.9585, -8.0037, -6.778, -6.7072, -7.6408, -8.2505, -7.7805, -7.5982, -7.2209, -7.4621, -8.4737, -7.5982, -8.7613, -4.2712, -5.1326, -5.1927, -5.5722, -5.6001, -5.6115, -5.6375, -5.8099, -5.8821, -5.8859, -5.623, -5.9087, -5.9722, -5.9763, -5.6733, -5.6825, -6.0056, -6.0489, -6.0895, -6.1611, -6.1611, -5.8204, -6.2329, -6.3336, -6.3454, -6.3514, -6.3634, -6.3756, -3.9617, -6.2224, -6.2383, -5.6115, -5.3082, -5.5532, -4.886, -5.2608, -4.6975, -5.2977, -5.0741, -5.6346, -4.9817, -5.394, -5.7011, -4.8334, -5.3231, -5.2272, -5.336, -5.5945, -5.3872, -5.422, -5.1522, -5.4315, -5.4079, -5.5371, -5.6115, -6.9158, -7.1153, -7.2106, -7.609, -8.2811, -7.2396, -6.5175, -7.5879, -8.2811, -8.2811, -7.9328, -7.9038, -7.1153, -6.5391, -7.5879, -7.5879, -7.5879, -8.6259, -6.8742, -7.609, -5.9337, -7.609, -8.2811, -7.609, -5.6753, -6.4485, -8.6259, -7.1687, -7.9038, -7.5879, -3.8483, -4.1144, -4.1366, -4.5365, -4.9385, -4.9608, -5.19, -5.2034, -5.4528, -5.3344, -5.3344, -5.562, -5.648, -5.8644, -5.9417, -5.9579, -5.962, -6.0298, -6.052, -6.061, -6.0746, -6.0885, -6.112, -6.112, -6.141, -6.1608, -6.1658, -6.2016, -6.052, -5.6939, -5.361, -5.7421, -5.2627, -5.5085, -5.1787, -5.654, -5.7034, -5.8387, -5.6877, -3.9692, -5.4023, -5.2247, -5.4802, -5.2267, -5.3477, -5.3214, -5.5137, -5.4904, -5.4479, -4.9312, -5.0875, -5.4479, -5.1713, -5.5216, -7.7017, -7.8841, -7.9429, -8.4437, -6.4288, -7.9131, -8.6062, -6.1613, -7.2347, -6.712, -6.795, -8.3484, -7.4504, -7.1628, -8.0382, -7.8018, -6.6603, -7.1909, -7.2805, -7.1087, -7.3619, -8.1813, -8.0054, -8.2614, -6.5642, -7.5476, -7.7759, -7.2805, -7.6552, -8.2614, -3.5785, -4.0819, -4.5519, -4.4033, -4.8784, -5.0991, -5.4087, -5.4233, -5.5673, -5.5758, -5.6017, -5.6805, -5.9021, -5.93, -5.9505, -5.9756, -5.9884, -5.9927, -6.0413, -6.1067, -6.2245, -6.252, -6.2633, -6.3036, -6.3396, -6.3518, -6.4422, -6.0145, -4.4876, -4.5967, -6.0278, -4.9071, -4.6942, -4.584, -5.2636, -4.6744, -5.2369, -4.9624, -5.4966, -5.092, -5.5561, -4.557, -4.9624, -4.3971, -4.8756, -5.3873, -4.0468, -5.2782, -4.1601, -5.0227, -5.2349, -5.0342, -5.2803, -4.9874, -5.0408, -5.3104, -5.2974, -7.6748, -7.4971, -7.6748, -7.891, -7.8243, -8.1672, -8.4857, -7.6207, -8.3679, -8.2625, -7.5694, -7.7925, -7.7925, -7.1978, -6.5948, -7.891, -7.5694, -7.3871, -5.7131, -7.4971, -6.7474, -7.1978, -6.7474, -8.3138, -7.3871, -8.3679, -7.5694, -7.4741, -6.9016, -7.4971, -4.4979, -4.6422, -4.9144, -4.9502, -5.2133, -5.2324, -5.2569, -5.2794, -5.3529, -5.4382, -5.4653, -4.3455, -5.6058, -5.6199, -4.9232, -5.6748, -5.6899, -5.7448, -5.2593, -5.4683, -5.5249, -5.9353, -5.955, -5.965, -5.9904, -6.0008, -6.1166, -6.1284, -6.1403, -3.4524, -4.853, -5.0866, -4.6041, -4.6342, -4.9144, -5.2015, -5.0929, -4.1492, -5.1141, -5.1314, -3.7955, -5.0578, -5.0337, -4.6093, -4.8918, -4.8141, -4.7937, -4.5453, -4.8647, -4.6106, -4.9411, -5.0357, -4.9215, -5.1715]}, \"token.table\": {\"Topic\": [1, 2, 9, 6, 6, 1, 3, 4, 6, 2, 6, 7, 9, 5, 4, 6, 9, 2, 3, 6, 7, 7, 2, 7, 2, 6, 7, 10, 1, 7, 2, 2, 3, 8, 10, 10, 8, 10, 6, 9, 2, 4, 6, 2, 3, 5, 2, 10, 9, 1, 4, 9, 9, 4, 7, 3, 3, 1, 2, 4, 3, 3, 3, 4, 1, 6, 3, 1, 2, 3, 6, 1, 1, 1, 7, 3, 6, 1, 9, 10, 2, 5, 2, 4, 6, 6, 7, 3, 3, 9, 5, 10, 3, 2, 2, 3, 10, 1, 2, 3, 4, 6, 7, 8, 7, 8, 9, 9, 10, 5, 9, 1, 1, 2, 3, 6, 8, 10, 9, 1, 1, 6, 10, 5, 5, 9, 4, 6, 4, 5, 8, 10, 6, 8, 9, 6, 10, 3, 1, 3, 6, 9, 3, 8, 9, 7, 9, 10, 8, 8, 10, 10, 1, 8, 8, 2, 8, 5, 9, 9, 5, 6, 4, 10, 2, 6, 8, 9, 6, 5, 5, 7, 5, 9, 8, 1, 2, 3, 4, 5, 9, 10, 1, 1, 2, 3, 4, 5, 9, 3, 6, 7, 8, 10, 9, 10, 1, 2, 4, 5, 7, 9, 2, 9, 2, 8, 1, 2, 3, 2, 6, 9, 4, 10, 1, 1, 1, 9, 3, 1, 2, 3, 9, 8, 7, 1, 8, 10, 4, 6, 2, 2, 5, 5, 2, 4, 7, 4, 9, 3, 8, 9, 1, 4, 4, 6, 1, 5, 4, 4, 6, 9, 1, 2, 2, 4, 6, 9, 9, 1, 1, 2, 3, 5, 6, 7, 8, 9, 2, 3, 6, 8, 1, 2, 3, 4, 9, 4, 7, 1, 4, 5, 6, 7, 2, 7, 9, 3, 5, 2, 3, 2, 4, 5, 7, 8, 1, 2, 3, 4, 5, 6, 7, 2, 3, 7, 10, 10, 7, 2, 3, 1, 5, 8, 6, 2, 6, 6, 4, 10, 4, 7, 8, 8, 2, 4, 6, 7, 9, 1, 2, 3, 4, 6, 10, 3, 4, 10, 4, 2, 8, 2, 1, 2, 4, 2, 1, 7, 3, 2, 4, 6, 7, 9, 7, 8, 2, 9, 8, 6, 6, 7, 4, 9, 1, 2, 3, 4, 5, 7, 9, 7, 10, 4, 3, 6, 9, 10, 6, 4, 9, 1, 4, 4, 5, 6, 7, 9, 10, 1, 2, 6, 8, 9, 1, 5, 2, 6, 6, 5, 5, 9, 4, 9, 2, 2, 7, 5, 3, 8, 4, 1, 7, 5, 6, 9, 6, 4, 6, 10, 2, 2, 7, 10, 5, 4, 2, 4, 9, 1, 2, 1, 3, 1, 1, 2, 4, 6, 1, 3, 4, 3, 5, 7, 8, 1, 2, 3, 5, 1, 8, 2, 2, 1, 2, 3, 5, 4, 1, 3, 4, 7, 8, 8, 2, 2, 5, 5, 6, 7, 9, 7, 8, 1, 2, 3, 4, 6, 9, 4, 5, 8, 1, 2, 3, 7, 9, 7, 4, 9, 10, 10, 10, 3, 5, 9, 10, 6, 4, 6, 8, 7, 8, 10, 3, 5, 1, 2, 3, 4, 6, 7, 1, 3, 3, 8, 1, 3, 5, 1, 2, 8, 1, 5, 1, 4, 5, 6, 7, 8, 10, 10, 3, 2, 3, 4, 4, 3, 3, 7, 8, 5, 5, 1, 2, 3, 6, 10, 4, 10, 2, 5, 2, 2, 2, 1, 3, 4, 5, 8, 2, 4, 2, 3, 5, 1, 3, 5, 8, 9, 2, 6, 3, 5, 9, 10, 1, 1, 5, 3, 7, 1, 2, 6, 7, 8, 9, 1, 3, 6, 7, 8, 1, 2, 1, 7, 9, 5, 2, 3, 8, 8, 1, 3, 6, 5, 8, 3, 10, 1, 6, 2, 10, 4, 8, 5, 2, 3, 4, 6, 7, 9, 1, 5, 6, 7, 2, 4, 6, 10, 9, 5, 3, 6, 4, 6, 9, 6, 7, 10, 2, 5, 1, 2, 3, 6, 7, 9, 10, 9, 4, 6, 10, 6, 5, 1, 3, 3, 8, 3, 1, 2, 3, 6, 10, 4, 8, 1, 3, 1, 3, 2, 1, 6, 8, 9, 10, 8, 6, 4, 9, 8, 8, 7, 1, 8, 9, 2, 4, 3, 6, 1, 1, 7, 8, 10, 1, 1, 8, 7, 1, 6, 7, 3, 7, 9, 7, 6, 8, 8, 5, 3, 4, 5, 8, 2, 2, 9, 2, 2, 2, 4, 1, 2, 3, 5, 7, 5, 7, 8, 5, 4, 5, 6, 8, 6, 2, 3, 5, 7, 8, 9, 1, 3, 5, 1, 4, 5, 2, 3, 4, 5, 7, 8, 1, 5, 1, 3, 4, 5, 8, 8, 1, 5, 10, 1, 7, 1, 10, 4, 6, 9, 7, 10, 6, 10, 1, 2, 4, 5, 8, 9, 4, 5, 6, 8, 1, 6, 7, 8, 9, 10, 8, 1, 6, 3, 6, 9, 3, 5, 7, 8, 9, 1, 6, 6, 9, 3, 4, 10, 3, 4, 8, 9, 4, 6, 10, 6, 10, 10, 4, 10, 8, 10, 3, 7, 2, 5, 8, 7, 4, 9, 4, 7, 9, 9, 8, 6, 9, 9, 8, 7, 1, 5, 3, 9, 4, 5, 5, 9, 4, 3, 3, 5, 3, 3, 2, 2, 7, 2, 3, 6, 7, 8, 1, 5, 6, 7, 3, 9, 4, 3, 3, 6, 10, 6, 3, 6, 8, 10, 4, 6, 6, 9, 10, 5, 10, 6, 1, 7, 4, 2, 3, 4, 6, 8, 9, 3, 2, 8, 4, 10, 1, 5, 6, 1, 3, 5, 7, 10, 7, 10, 7, 3, 8, 9, 4, 2, 4, 5, 3, 8, 2, 3, 6, 2, 2, 1, 4, 2, 6, 6, 8, 1, 3, 8, 8, 9, 1, 2, 3, 5, 10, 1, 2, 3, 4, 7, 8, 3, 1, 2, 3, 4, 5, 6, 8, 2, 4, 6, 10, 4, 6, 5, 8, 9, 5, 2, 8, 8, 10, 4, 2, 7, 8, 8, 8, 1, 2, 4, 5, 7, 8, 4, 2, 3, 7, 4, 9, 10, 4, 1, 2, 3, 7, 8, 9, 9, 6, 2, 4, 6, 7, 9, 10, 4, 9, 10, 2, 6, 1, 2, 4, 5, 6, 7, 8, 9, 7, 1, 2, 3, 4, 5, 9, 2, 4, 7, 2, 2, 6, 7, 2, 3, 7, 2, 3, 9, 6, 1, 2, 4, 6, 7, 2, 3, 6, 5, 7, 5, 10, 10, 9, 1, 2, 3, 4, 6, 7, 9, 10, 7, 4, 6, 8, 1, 1, 4, 5, 6, 9, 10, 1, 2, 4, 5, 7, 3, 4, 6, 3, 2, 4, 9, 1, 3, 5, 8, 10, 4, 3, 4, 6, 10, 6, 2, 4, 6, 1, 3, 6, 7, 4, 4, 7, 10, 3, 3, 5, 9, 8, 5, 5, 5, 6, 6, 8, 10, 10, 5, 7, 8, 8, 8, 6, 4, 4, 5, 8, 9, 2, 2, 6, 6, 9, 10, 1, 6, 7, 3, 1, 9, 1, 6, 7, 10, 8, 4, 1, 9, 9, 8, 2, 2, 3, 2, 3, 4, 2, 6, 7, 2, 7, 9, 10, 3, 4, 6, 8, 3, 4, 2, 6, 7, 9, 4, 7, 9, 7, 6, 9, 1, 8, 3, 4, 5, 7, 7, 8, 9, 4, 6, 9, 7, 3, 1, 5, 9, 10, 1, 3, 4, 6, 3, 7, 4, 7, 7, 3, 4, 9, 7, 9, 10, 7, 1, 5, 8, 4, 2, 3, 4, 5, 7, 8, 1, 2, 3, 4, 10, 4, 3, 7, 2, 5, 3, 5, 6, 7, 6, 4, 4, 5, 2, 5, 6, 6, 6, 8, 9, 7, 5, 1, 2, 3, 4, 7, 9, 7, 9, 5, 4, 9, 6, 6, 5, 1, 2, 3, 5, 10, 7, 10, 4, 9, 5, 1, 5, 6, 10, 8, 6, 2, 6, 7, 9, 10, 7, 6, 7, 5, 2, 2, 3, 5, 7, 9, 10, 6, 1, 2, 4, 5, 7, 9, 3, 1, 2, 3, 4, 5, 7, 8, 9, 7, 2, 1, 2, 3, 10, 1, 6, 7, 8, 7, 7, 2, 8, 3, 1, 3, 6, 1, 2, 3, 4, 5, 7, 9, 10, 8, 3, 5, 1, 2, 3, 4, 1, 3, 9, 3, 3, 3, 3, 3, 5, 9, 9, 10, 10, 10, 7, 10, 1, 2, 3, 5, 7, 10, 4, 6, 9, 9, 5, 7, 7, 8, 9, 10, 4, 6, 10, 2, 2, 7, 7, 4, 9, 9, 4, 3, 10, 1, 4, 9, 6, 9, 9, 7, 10, 2, 3, 5, 8, 1, 3, 7, 9, 2, 3, 6, 5, 5, 4, 6, 10, 4, 8, 4, 5, 3, 7, 8, 9, 2, 8, 10, 1, 2, 3, 4, 6, 7, 2, 3, 4, 5, 7, 9, 4, 1, 3, 6, 7, 8, 9, 10, 3, 5, 1, 2, 3, 5, 4, 4, 4, 2, 3, 4, 5, 7, 8, 6], \"Freq\": [0.9596244475304239, 0.031987481584347464, 0.0075264662551405796, 0.9984867729205216, 0.9984387825921106, 0.6741205596851968, 0.12373725398039588, 0.03365653308266768, 0.16729276738149523, 0.15052753323769338, 0.3664742053930341, 0.2908928701386649, 0.19244659312667128, 0.9980956061235761, 0.2054250783282258, 0.7794317786774658, 0.015216672468757467, 0.887325795921901, 0.03059744123868624, 0.07989331878990295, 0.00339971569318736, 0.9879414768992439, 0.9423861702524698, 0.0567955950821801, 0.9994896573009671, 1.0021933200501525, 1.0019018260589678, 1.0144755921625719, 0.996337615727813, 0.9926628220696108, 1.0006379487221944, 0.63114299249481, 0.25996905058420994, 0.10825906639059167, 1.0037646884745808, 1.0001323345320658, 0.07303320093696938, 0.9277498806524392, 0.9963752272095723, 0.006266510862953285, 0.0015281147632858986, 0.0993274596135834, 0.9000595955753943, 0.0582728155691844, 0.8449558257531739, 0.09651435078646167, 0.10507010638399908, 0.8945969057837635, 1.0036589605405666, 0.005348469535790648, 0.04492714410064144, 0.9488184956492609, 0.9979563528102225, 0.9982347770205148, 0.0018676048213667254, 0.9993061898866985, 1.0008316381316407, 0.8468297319386143, 0.10264602811377142, 0.04899014978157273, 1.0001696599070915, 1.000006957300843, 0.9493577053671735, 0.0495543857197151, 1.0000437071907593, 1.0027952379600924, 1.0176374117139195, 1.0008178609732166, 0.07267493897779399, 0.09084367372224249, 0.8357617982446309, 1.0014209709100976, 0.9993117578643139, 0.9993163971085147, 1.005750668608054, 0.8230142040013868, 0.1766858748202423, 0.9760041949986739, 0.999155613663385, 1.000051768577322, 0.0789381946989091, 0.9201233319591592, 0.057877432426024694, 0.6011608783118225, 0.34071243239471144, 1.0006306485531926, 0.9952958799530847, 0.9984668482279428, 0.9980529759592474, 1.000855443891012, 0.9965764347291718, 1.004186793053418, 1.0004862193816624, 0.9989599058357512, 0.09149697778217537, 0.031672030770753014, 0.8780190752558753, 0.13384543408496194, 0.05341537965776004, 0.05648522906337843, 0.35180474188386784, 0.033154373580678645, 0.2781283561490264, 0.09209548216855179, 0.0020604155059996926, 0.9972411049038511, 1.0015852850022597, 1.0029461345742736, 0.9982005826626376, 0.9935487604676272, 0.007584341682958986, 1.0005357187508848, 0.8247612977960603, 0.17547295767821208, 0.9951386254005163, 0.8685382775612623, 0.1287326902951965, 0.0016295277252556517, 0.9899727019877408, 0.999448037862106, 1.0016885159196918, 1.0130278424290728, 1.0078450327366728, 1.0004852216682878, 0.9953610976136485, 0.9993328443313401, 1.0004752867197402, 0.993164551401052, 0.04339860447613084, 0.07377762760942244, 0.8831616010892627, 1.0144755921625719, 0.13313005870941663, 0.05705573944689284, 0.8096481121511461, 0.9867154309374087, 0.9877247144787719, 1.0013985168461441, 0.3328598120779279, 0.08113457919399493, 0.586665418787348, 1.0007037630122912, 0.997249205730104, 1.0007514454962572, 1.0143932809741556, 1.0019828041819066, 0.9996919290759796, 1.0078450327366728, 0.9992263747167749, 0.12854485053981055, 0.8712484314364937, 0.9992098855773622, 0.06942495191380081, 0.9314514381768275, 1.0039508493017242, 1.0172741707760735, 0.9830352066079383, 0.21558475343243055, 0.7846650952136259, 1.0000983079089372, 1.015674589401682, 0.9917755100704211, 0.9966784165614111, 1.0078450327366728, 0.04920307083986814, 0.15408330078800814, 0.6992015329875999, 0.09581650637237481, 0.9985412338550106, 1.0023542669177257, 0.2757114734179673, 0.7234981926570774, 1.0016212303030425, 1.0001966629900005, 1.0003366262442381, 0.14944079683488806, 0.3595500962654322, 0.06379114611160894, 0.13070493573917077, 0.06646769769671142, 0.11464562622855592, 0.11553781009025675, 1.0013080074616025, 0.15462953026930315, 0.0916618349534529, 0.07332946796276232, 0.04862062549704893, 0.5276533455581376, 0.10361772646912067, 0.2424478586813655, 0.34964290599152414, 0.36331207309818864, 0.04316579086315113, 0.0007194298477191855, 1.0027465433037117, 1.0025405851959532, 0.10016787002840825, 0.18005635532713876, 0.4516772053428225, 0.14011211267777351, 0.1044695576983399, 0.023966545589619154, 0.004201548310198271, 0.9957669495169902, 0.0020604879996883553, 0.9972761918491639, 0.18348240762986753, 0.11719198938939926, 0.6996006639306561, 0.5723801613012484, 0.001287694401127668, 0.42622684677325806, 0.0047147307360810185, 0.9948081853130949, 0.9999342453138778, 0.9998804833436241, 0.9999715558581229, 1.0003489295551302, 1.0014549606934426, 0.7437084630692791, 0.06434499781082294, 0.1915385981345427, 1.0015852850022597, 0.9999903092540202, 0.997912784107212, 1.0184391599986165, 0.03832822453769222, 0.9620384358960747, 1.0006691209320273, 1.0002201454447197, 1.0003869914155166, 0.9995293253607629, 0.9965764347291719, 0.9953610976136485, 0.11284743720546209, 0.8870789846411976, 1.0082218004719556, 0.8492588567880617, 0.1515155005860519, 0.19106491353885857, 0.6819040879748918, 0.12682757191803543, 1.0203680220440683, 1.0007952212560058, 0.99192958039851, 0.008020993911578247, 0.005963108642493345, 0.9958391432963887, 1.0005287194951473, 0.1177431172573989, 0.744479918492095, 0.1385934609383966, 0.9721201576587323, 0.028676110845390332, 1.000831375026431, 0.02491026816023044, 0.26017391189574013, 0.7154782577132854, 0.9996919290759796, 1.0096595120675937, 0.26690343329084465, 0.3736648066071825, 0.07733355887657806, 0.09033654665228587, 0.05885562887951958, 0.03421838888344162, 0.03421838888344162, 0.06433057110087025, 0.9927599058257967, 0.006474521124950848, 0.8561341361321075, 0.14373975186901364, 1.0016885159196915, 0.3482153650074736, 0.032127012842951434, 0.0010363552529984333, 0.6187040860400647, 0.9999462146484976, 1.0006411854308133, 0.0011476673554004476, 0.3649582190173423, 0.0011476673554004476, 0.6323647128256467, 0.0011476673554004476, 0.10933394388791555, 0.7184802026920165, 0.17181048325243872, 0.13121518084808836, 0.8699080508076968, 0.3992741222408818, 0.6004914239506666, 0.007396260012417752, 0.03254354405463811, 0.6198065890406076, 0.1257364202111018, 0.21301228835763125, 0.22730041555881564, 0.059056905553045755, 0.07691131885978052, 0.028841744572417696, 0.4443002080560535, 0.12772772596356408, 0.035708826613469524, 0.9253320025023333, 0.07600262854228611, 0.9981395824672362, 0.9967698125967092, 1.0010005842970349, 0.9986095163572867, 0.8906458383328059, 0.10964105598363377, 1.0203680220440683, 0.990094636779714, 1.002695910740097, 1.0029354106240511, 0.999719571163383, 0.9976789357256022, 0.9983961743566053, 1.0032355114072098, 1.0000187986602016, 0.004916450275116375, 0.9931229555735077, 0.9830352066079383, 1.0039508493017242, 0.09835322886844529, 0.46168162727658435, 0.09488193843779427, 0.15852226299972946, 0.18687113485004606, 0.05286559937736633, 0.07311199913891088, 0.044991999470099006, 0.01574719981453465, 0.0927959989070792, 0.7204343915149604, 0.999054181668077, 0.9966784165614112, 1.0050532182415572, 0.999286471999273, 0.38725686872789444, 0.6128020779869978, 1.000262897017276, 0.7842677372128325, 0.09948427956188151, 0.11606499282219508, 1.0009358704846572, 1.0023826867553949, 0.9755479458270313, 0.9959706811073731, 0.11251414340126598, 0.0903802135518366, 0.12173661417186155, 0.597616105934593, 0.0774687544730028, 0.9993777495906229, 1.0001110372884587, 0.3864134236773323, 0.6128875163623912, 1.002134176336321, 1.0057573076747972, 0.9936397497510046, 1.0012202601909006, 1.0032355114072098, 0.9994348066662377, 0.3245821975021189, 0.14009191791260114, 0.005172624661388349, 0.12198773159774191, 0.18190396725882363, 0.08060673430663512, 0.14569559462910517, 0.9962073911983338, 0.0026636561261987536, 0.999264748852559, 1.0025984351861275, 0.045492647151067794, 0.08188676487192202, 0.8734588253005017, 0.9993117981408649, 0.019764972661312795, 0.9801629624314663, 0.976004194998674, 0.9998679916272118, 0.10857213560229863, 0.00031653683849066657, 0.18992210309439994, 0.043682083711711985, 0.07976728329964797, 0.5773631934069758, 1.001858610760228, 0.10574111615403048, 0.07387393046377472, 0.8198557773038527, 1.006751900326516, 1.0022408669072405, 0.997421886635623, 1.000262897017276, 1.0031606881196988, 0.9964208286187602, 1.000627558447583, 1.0009958424219842, 1.000141546366106, 0.002521034973867037, 0.9974895046600577, 1.0003279082545709, 1.0112547969844992, 1.0016814394908502, 0.984423063573938, 0.012520752078681559, 0.9849658301896159, 0.993602248609061, 0.25975490626986186, 0.7393024255372991, 0.9981861527629776, 0.8359463185260134, 0.16420374113903835, 0.9751070141028509, 0.3392021168558921, 0.6403553089093332, 0.021048341380079223, 0.9999977862573988, 1.0008603661444144, 0.6015636244394491, 0.3984961152371377, 1.0026531203067888, 1.0004233166773155, 0.998404105625761, 0.002199127985959826, 0.9958553920674642, 1.0000606364246976, 0.9859734270598863, 0.9065061603859812, 0.09370135792451248, 1.0006352156926468, 0.5279165782013213, 0.12595358714081598, 0.2355798574300447, 0.11040376156787574, 0.7423856994060732, 0.17367468780713055, 0.08359934124953403, 0.17740265878697958, 0.7432559669868283, 0.006117333061619986, 0.07340799673943983, 0.42498534988012143, 0.2615294460800747, 0.2708697834400774, 0.04203151812001201, 1.0004807892306156, 1.001492194160577, 0.9993449439150883, 1.0060953337345782, 0.26246630781160807, 0.07719597288576707, 0.05596708034218113, 0.6050234374921994, 1.0001016091967223, 0.04838082290376766, 0.1877636698408126, 0.10943281371090305, 0.1566617122598191, 0.497631321295896, 0.9976403011061133, 1.0001771258890806, 0.9859734270598863, 0.990094636779714, 1.00280378193268, 0.0032427782689571486, 0.9955329285698447, 0.9999348085534031, 1.0003141785074698, 0.9992263747167749, 0.3541651663383833, 0.06948482033578823, 0.09281927492616489, 0.2556419136234597, 0.17008224679207867, 0.05755832132292906, 0.999234002244902, 1.0008233376607407, 1.002695910740097, 0.015441843725911243, 0.3006012245310722, 0.5219343179358, 0.16059517474947693, 0.0010294562483940829, 0.9986651957281458, 0.8901096393035455, 0.1098433171906503, 0.9992098855773622, 0.9967698125967092, 1.0007276727453278, 0.1472180027072302, 0.7059508948716786, 0.11939727778617881, 0.027820724921051376, 1.0086424405137955, 0.9739978471744778, 0.026575657494528726, 0.9997760041858161, 0.0929013070711395, 0.9083683358066974, 0.9983528634532802, 0.9987144019919664, 1.000627558447583, 0.15907650203772294, 0.1706829421005611, 0.08943786166069402, 0.025261075430883042, 0.424659159946196, 0.13108449953323092, 1.0041581621620972, 0.9991530797387526, 0.9985657063317279, 0.9976403011061133, 0.006448087724644002, 0.006448087724644002, 0.9865574218705322, 0.07475076238036181, 0.07962581210082019, 0.8450086182127856, 1.016671036456952, 0.9978557369560386, 0.0929452001168755, 0.020324017092223444, 0.5140489201130661, 0.012888401082873403, 0.03346027204207518, 0.17969405355929263, 0.14672948925117413, 0.9990283760613626, 0.9927349089140417, 0.7681535699563723, 0.2317309156678423, 1.0003628002305753, 1.0008838107241176, 0.9989009642489117, 0.999095963518493, 1.0034207442792322, 0.999226374716775, 0.9931040429705336, 0.990094636779714, 0.08090602512986467, 0.13153433533382905, 0.11019102809098133, 0.624912181831286, 0.052613734133531626, 1.0013908440628836, 1.0050532182415572, 0.9996572600457587, 1.0054152501147964, 1.0037824708984067, 1.0172741707760735, 1.0024697649643632, 0.09148470971540758, 0.16581603635917624, 0.06452939345997499, 0.6444771068344337, 0.03430676614327784, 1.0007099085905, 1.0049092443258072, 0.06825608657420425, 0.30780869810867106, 0.6234930985143656, 0.08890661183193574, 0.005429411409583862, 0.1493088137635562, 0.06515293691500634, 0.6908926018695465, 0.9974674891011425, 0.0016707998142397697, 0.13618989455546412, 0.5082064463498271, 0.013560032791236687, 0.3419486529964034, 1.0007579245819738, 0.004963903488652809, 0.9927806977305618, 0.002800470424203144, 0.9969674710163193, 1.003115422637526, 0.11885506250884412, 0.1294894628385828, 0.44476815496730615, 0.050669789806401966, 0.25647671383487414, 0.16666658392123015, 0.7413789422702997, 0.08477007285648774, 0.007183904479363369, 1.0005640271595013, 0.998968999586878, 1.0029013802941509, 1.0005886835376834, 1.0003141785074698, 0.9989299687641838, 0.9969955164931454, 0.7883370772216414, 0.21249868142985587, 1.0039508493017242, 1.0039508493017242, 0.567876287210216, 0.3788523105892518, 0.053087584923334645, 0.9650406336499411, 0.03446573691606933, 1.0095609243193646, 0.9856005753078496, 1.022480585236706, 0.9976789357256022, 1.0001230783288477, 1.0013761942723807, 0.9989823521230636, 0.0006865858090192877, 0.9953610976136485, 0.041685177778979995, 0.06489135922294824, 0.42372768340282757, 0.3635635092888358, 0.001718976403256907, 0.1044278164978571, 1.0065043260923825, 1.0026531203067888, 1.0007487170662963, 0.9991387211884245, 0.04797338364920279, 0.18170449736158223, 0.7701213976960518, 0.9979824920830741, 1.0127831329091173, 1.0042775808077358, 0.9966996563874329, 0.003521906913029798, 0.11347797142211762, 0.0013043444991048, 0.8843455703930545, 0.5413795254638948, 0.012052976448175764, 0.4469645432865179, 0.9454007534197727, 0.05306823355994566, 0.08399889830819149, 0.03266623823096336, 0.07799897700046353, 0.3839949636945897, 0.12266505784688281, 0.07999895076970617, 0.21933045669361112, 1.0059400036327044, 0.037123016459841826, 0.7012125331303456, 0.26151102706155244, 0.996974857436452, 1.015674589401682, 0.8062689252813637, 0.19364537506757645, 0.9984278622914652, 0.0010817203275097131, 0.9999977007198548, 0.18577258269661645, 0.4118974067166783, 0.04948859784950849, 0.3532724523411067, 1.0025405851959532, 1.01371565445135, 0.9954241434583396, 0.9996362578315716, 0.9998849939823544, 0.12863306671828342, 0.871335892413134, 1.0009358704846572, 0.173445145658753, 0.15431516635815523, 0.2282844196537999, 0.015303983440478204, 0.42851153633338973, 1.002134176336321, 1.0019425209210107, 1.0015257115166294, 1.0020296440461827, 1.0049939151191807, 0.999226374716775, 1.016623648809222, 0.8083074350844822, 0.1812029854475103, 0.010658999143971193, 0.9077257267566716, 0.09302313232878288, 0.9965832407109539, 0.0033308263392745783, 1.015044362798621, 0.2713893252162624, 0.0017737864393219764, 0.7183835079254004, 0.008868932196609882, 1.016671036456952, 0.9990853752858047, 0.9976403011061133, 1.0108473780773517, 0.9967702417007733, 0.25922613892492796, 0.7412582154382237, 0.7668183939714278, 0.23357112000279123, 1.0015852850022597, 1.0006411854308133, 0.994609154384908, 1.0005640271595015, 0.9991212372615227, 1.0045577530997734, 0.26270253601177895, 0.004712153112318904, 0.6225932299651353, 0.10955755986141454, 0.9996520985264091, 0.9980803184972795, 1.0084611565240142, 1.00162379891798, 0.9986427757069144, 0.9986427757069144, 1.0005091162756583, 0.6712504681078707, 0.021049666247285145, 0.08263943045230464, 0.17073618178353506, 0.05457320878925778, 0.49488468856504153, 0.5053862204178806, 1.001492194160577, 0.9858814681125662, 0.10414700321344227, 0.000562956774126715, 0.8382426366746786, 0.057421590960924924, 1.0010156545741826, 0.08034238551665143, 0.02506682428119525, 0.701871079873467, 0.0674876038339872, 0.07777142918011859, 0.04820543130999086, 0.20714407555473321, 0.4457088816711395, 0.3473736323207184, 1.0014209709100976, 0.12584112080801532, 0.8742646287714748, 0.1723892106673033, 0.04900696624321331, 0.10147324775065344, 0.39897436047416013, 0.2352334379674239, 0.042664888258797475, 0.9932067647563306, 0.005791293088958196, 0.05795289845370587, 0.07451086944047897, 0.02365424426681872, 0.20579192512132288, 0.6374818829907645, 1.0007755628946304, 0.6602338062232384, 0.33843917797997936, 0.0011096366491146863, 1.0023826867553949, 0.9999576873533331, 1.0085376681652964, 0.9945839138848743, 0.3999332482978343, 0.05750113226599763, 0.5415405143260374, 0.985816871572579, 0.9989728251062879, 0.8868012510645178, 0.11312624085226702, 0.28080462181149807, 0.180801089043724, 0.07285025565864336, 0.3218656750009153, 0.05894247957835691, 0.08410893153316099, 0.7128739229988156, 0.05587633783302979, 0.09913543809085931, 0.13157976328423143, 0.10408530235280504, 0.12425687257621687, 0.024205884268094197, 0.22350099807540308, 0.03227451235745893, 0.49218631345124864, 1.0039508493017242, 0.9973376200259674, 0.9917755100704212, 1.0008489772567102, 1.0130278424290728, 1.0009353269977157, 0.05454879263991735, 0.7720040992259489, 0.02958578583859924, 0.11372036431711582, 0.028661230031143015, 0.9947735064409561, 0.9994789141236637, 1.0013334373216667, 1.0071682576053937, 0.9994653150761709, 1.0032355114072098, 0.9994695892513263, 1.0095609243193646, 0.23902684815255976, 0.01106605778484073, 0.7502787178122015, 0.10460069143359915, 0.7643896681686092, 0.13093373263366606, 0.993164551401052, 1.0001618816058508, 0.9982005826626376, 0.998356326353602, 0.9999982168480345, 0.3454712808508174, 0.6550333604662453, 0.05490168234956062, 0.9458062550219761, 0.999261478637513, 1.000627558447583, 1.0006211630678592, 1.0000909795004076, 0.2854028145013795, 0.7156801541303628, 0.14816288806774217, 0.581539335665888, 0.27039727072362946, 0.9994916702760843, 0.9976403011061133, 0.03238957049648319, 0.9676384185824352, 0.9990968743562912, 1.0016611368384045, 0.9999148882740937, 0.9988208532444242, 0.0010880401451464315, 0.9876139477037262, 0.9995279376177978, 1.0007192999071017, 0.990094636779714, 0.9999853071263717, 0.9986329333883989, 1.0002542360598377, 1.0014193039619503, 1.0005057022882557, 1.0006275584475832, 0.9951386254005163, 0.9999925519225272, 0.9983857909473398, 1.000262897017276, 1.0002409871672973, 0.37793939047167346, 0.25942181157811733, 0.20082145312519237, 0.1283940438013525, 0.033579980686507575, 0.7649652809435362, 0.044920241022591074, 0.12815480527033335, 0.0634168108554227, 0.9994653150761709, 0.987069556234111, 1.0020369026719562, 1.0221804358733566, 0.0009384201031114381, 0.011261041237337257, 0.9881563685763444, 1.0000045276503704, 0.13231335226632449, 0.35703602992500255, 0.08610868957014768, 0.4247678650137163, 0.0032717769599781813, 0.9962560843133562, 0.9983238477719665, 0.1796306533229101, 0.8202603284479789, 0.9910521751131566, 0.9992098855773622, 1.0057573076747972, 1.0014651739986393, 1.0014886119089899, 0.9979601532082236, 0.18435841062264777, 0.09237916020353934, 0.19595579437114405, 0.3603187157722465, 0.07838231774845762, 0.08838006235923028, 0.999880203127261, 0.06693007407065935, 0.9306467442205967, 0.04808337057147255, 0.9526517794473, 1.002030973531972, 0.00331305347045529, 0.9972290946070423, 0.177435506956986, 0.16538328384292658, 0.21560088015150752, 0.0006695679507810793, 0.44124527956473125, 1.00086534340246, 1.0005395061835862, 0.9994481889339254, 0.996753061846656, 0.999226374716775, 1.0013392557011045, 1.0002311739148295, 0.24329792756938104, 0.7565406985847897, 1.0001443969031854, 1.0014549606934426, 1.002695910740097, 0.15719131637197872, 0.07952031298817747, 0.763764866607379, 1.011254796984499, 1.0141440964044546, 0.9951415321555106, 0.9993026356676813, 0.006140351204473515, 0.9947368951247094, 1.0011448178844504, 1.0003366262442381, 0.12675373400959747, 0.8742279595661944, 0.9998454740815312, 0.9988211734293797, 0.9935209912421772, 0.2847602120159204, 0.22324950832388493, 0.3269122170840665, 0.16486117537763811, 0.00015611853728943003, 0.0014375918154015343, 0.11213216160131967, 0.06612922350847057, 0.025876652677227614, 0.10781938615511506, 0.6871688877619333, 1.0095609243193646, 0.357633236452221, 0.22942509508255687, 0.11905041698611671, 0.016869492285482124, 0.1455596191490172, 0.1320640253206315, 0.9977807347070573, 0.25081308921314205, 0.006203857330360405, 0.3341220305065532, 0.4085683184708781, 0.9966784165614112, 1.0003252989503384, 0.21799307214084385, 0.7820068937115985, 0.9862156898359846, 0.993832125113474, 0.9968082998847205, 0.9988847588621709, 0.00672339134409742, 0.9933810710903939, 1.0013908440628834, 0.004839160656301106, 0.9968670951980277, 0.9998130333838624, 1.000429602973139, 1.00022360662767, 0.3314742436182449, 0.16717831417268006, 0.07097872390521114, 0.11961896617527969, 0.087192137995234, 0.22338481635142593, 1.0001391055078048, 0.15473028939057212, 0.8445694962568729, 1.004568822934014, 0.07194160524921409, 0.9280467077148616, 1.001376194272381, 1.0009377260338959, 0.019448546497542563, 0.1479113141523632, 0.05681022792703223, 0.2845629434903596, 0.1704306837810967, 0.3209010172094523, 0.9979563528102225, 0.9844471196019204, 0.9996718594434738, 1.0013908440628836, 0.038099781439473235, 0.03902904440141161, 0.9208995952809264, 0.0018585259238767433, 0.06583450424323976, 0.9357904531717652, 0.9990954285457955, 0.9827072433276715, 0.01760072674616725, 0.11265711358094985, 0.08385273794945698, 0.07745176558690302, 0.37637717491817335, 0.029444472867748255, 0.10945662739967287, 0.13250012790486715, 0.07873196005941381, 1.0019828041819066, 0.06249208820956195, 0.042712482308370325, 0.010606455338320149, 0.18546963794305774, 0.21270242867658243, 0.48589031887709866, 0.13036540103023866, 0.8215145787747921, 0.047824263964897334, 1.001973527898049, 0.07531953900982874, 0.17435078474497395, 0.7504057775423678, 0.8992273810190391, 0.028396654137443342, 0.07414681913665762, 0.8586429488727729, 0.0752472212097388, 0.06700095039223318, 1.0003252989503384, 0.03702151584536962, 0.3709007420804623, 0.22487142957928216, 0.3139973010588757, 0.052789939260990015, 0.45535493546888456, 0.04504703175675497, 0.49985923190326903, 0.9993585317406111, 0.9952958799530846, 0.0029109132959268045, 0.9955323472069671, 0.9877247144787719, 1.0013882389103845, 0.36569655082690006, 0.14377249428361444, 0.033634849580111634, 0.05078202779742345, 0.1470700285561744, 0.044846466106815516, 0.09760701446777494, 0.11640295982136674, 1.0002694337329796, 0.003349115956743213, 0.9980365551094774, 1.0017289908647449, 0.9760041949986741, 0.3103782770476688, 0.24600656040766353, 0.11603309432561462, 0.12464332393988285, 0.0701118697161841, 0.1328435426201383, 0.5313995143144922, 0.22046413541900525, 0.06047288379743773, 0.18475180246776252, 0.0023808221967495167, 0.114013037190824, 0.1439558550389192, 0.7416605651605117, 0.999465315076171, 1.0013927971193366, 1.0001391055078048, 0.9948857178784988, 0.9995671933531528, 0.13653181432186606, 0.759783913287331, 0.10109607625359548, 0.002084455180486505, 0.9950963873287738, 0.0538321844367527, 0.007791500379003681, 0.027624410434649412, 0.910543067019021, 1.0130278424290728, 1.0005975450256461, 0.17640743728863104, 0.8240931376987143, 0.002553788491598062, 0.06384471228995156, 0.6307857574247213, 0.3026239362543704, 0.992188874144468, 0.9884815766401404, 0.010296683090001462, 0.9945839138848743, 1.0025984351861275, 1.0042474457703152, 1.0037254765851917, 0.9889425534945172, 0.9830352066079383, 0.9988865796595056, 0.9996147775179803, 0.9996700201141406, 0.9985412338550106, 0.001153287885789012, 0.08880316720575392, 0.9099441418875304, 1.0144755921625719, 0.9989744093068863, 1.0007801633732343, 0.9994998356841304, 1.0049939151191807, 1.002695910740097, 1.004655711499907, 1.0008367147420583, 0.44927237899635797, 0.034787152904166105, 0.29754118015903774, 0.21834489588785108, 0.9977112059534564, 1.0094489848470265, 1.0010156545741828, 0.024924849816761022, 0.9750601248316912, 1.004186793053418, 1.0005798401964825, 0.9971496630806549, 1.0003739201569268, 1.0059553495896525, 1.0055800796956034, 1.00409762267367, 0.25646367040880097, 0.23288080416431353, 0.19927521976591894, 0.3112938344272343, 0.9998656750204965, 0.9999558291461579, 1.0004042998736407, 1.0000744642529216, 0.9971416945630306, 0.9993081310884585, 0.9911902176792508, 0.8891608843393002, 0.11114511054241252, 0.10533708592044612, 0.04757158718987889, 0.847793643133913, 0.8390624460094054, 0.15964863837584362, 0.0009070945362263842, 0.16676845987803288, 0.06747856758070694, 0.7133448572817591, 0.052054894990831074, 0.06039769610047019, 0.20244412952194638, 0.707995215399956, 0.029080372196522684, 1.001179663815581, 0.9998728986657747, 0.06691071211994855, 0.7294002903625161, 0.13896840209527778, 0.06470486446764255, 0.06407491988180032, 0.09988149275692403, 0.8367430713976276, 0.9988505080957741, 1.0018272888887023, 1.0012172806109545, 0.9934328413379361, 0.999226374716775, 0.211088352838047, 0.18699674735109598, 0.1686412384086571, 0.4347961180740207, 0.04466369587831171, 0.779753690542192, 0.17679379618498386, 0.6341683049325444, 0.08463306446083316, 0.2811440839966033, 0.997942943463598, 0.9991634530057764, 0.08826481604300081, 0.22262348046401315, 0.6266801939053057, 0.06276609140835614, 0.062080661946752595, 0.16097660016425383, 0.611422333359296, 0.16530780913728307, 0.9099923722332994, 0.08788088329978903, 0.04226295155869416, 0.9574744542780022, 1.0012202601909006, 0.997249205730104, 0.004257610774851228, 0.9962809213151873, 0.10822648041199179, 0.8904087706622961, 0.0009838770946544706, 1.0026205682471117, 1.000004298154379, 0.11444890739216483, 0.8843779207576373, 0.9861315550104968, 1.0172741707760735, 0.1200713198864822, 0.1255066471241419, 0.528709104026897, 0.05781211698238032, 0.16800102370948128, 0.02281823285846895, 0.5114623413886089, 0.22317344820112314, 0.017809352474902593, 0.22456480386322492, 0.9994127880746112, 0.1522311144617772, 0.8478427347107315, 1.0094489848470265, 1.0023542669177257, 0.2533702410532868, 0.709893197906056, 0.03309791437182576, 0.0022826147842638454, 1.0130278424290728, 1.0017583269414387, 1.0003852632989712, 0.9978557369560386, 0.1883032749580242, 0.8128027438061551, 0.9991269457919673, 0.993164551401052, 0.6822010954851757, 0.13170476680733326, 0.1849786050664793, 0.9879414768992439, 1.0072106344900016, 0.043562059464529325, 0.19862224732041348, 0.09594025001116578, 0.3739076770705434, 0.03630171622044111, 0.2510004378670499, 1.0003549012797588, 0.9982918003237722, 0.9953610976136485, 0.045583888267649524, 0.9534629962650024, 1.0000772023980196, 1.0014043985177068, 0.9953610976136485, 0.2511725737495178, 0.2538234716255022, 0.1789356066289441, 0.31545684724213846, 0.0006627244689960892, 0.9981395824672362, 0.9998383194676624, 0.10731073954597727, 0.8942561628831439, 1.0023542669177257, 0.98576036302879, 0.002088475345399979, 0.010442376726999894, 1.0025405851959532, 0.9998001481159805, 1.0005213258558743, 0.33378796806096955, 0.19102732999008645, 0.3392264685589079, 0.005438500497938404, 0.13052401195052168, 1.003195053603506, 0.995604759144052, 0.9998199521346894, 0.984423063573938, 0.9959327546059459, 1.0085795197437992, 0.9961695252849555, 0.004369164584583138, 0.09680030877897128, 0.0020166730995619018, 0.90145287550417, 0.9784928023462637, 0.27078565809291133, 0.07049023480513883, 0.025789110294562986, 0.5642084241110502, 0.04527421585045502, 0.023210199265106687, 1.0042474457703152, 0.08790169260378938, 0.07936578443771893, 0.0917156090184166, 0.07954739950508212, 0.3919253153697882, 0.10878742535055752, 0.10352058839702469, 0.05720874621940838, 1.0005136827313446, 0.9955899206112452, 0.07603130881045521, 0.39844255503200576, 0.5254822102596018, 0.9995568334542988, 0.0711499189001523, 0.9285064416469877, 0.35066452838786877, 0.6497218242960134, 1.0012202601909006, 0.9960857973181266, 0.10099313640440453, 0.8994105732618669, 1.0042474457703152, 0.003500416007534892, 0.042004992090418705, 0.9556135700570255, 0.139849298619032, 0.04488989832215842, 0.16286975929706196, 0.0892042851273661, 0.31422928825510893, 0.000575511516950749, 0.1703514090174217, 0.07769405478835112, 0.9830352066079383, 1.000782133673109, 0.9987466795783208, 0.680900216068683, 0.11417958633462578, 0.09816659556818436, 0.10652119944632771, 0.9497059813683963, 0.04984272526330591, 0.997486726291253, 1.0011259505391505, 1.0001883427938532, 0.99970825754459, 0.9965343317475016, 0.046821058285525956, 0.9153057864837133, 0.0385585185880802, 1.0029461345742736, 1.001463742462123, 0.998531880565944, 0.9995368618897629, 0.9935185658817397, 1.0023030726195032, 0.5890654996434337, 0.097012270712791, 0.06642281598353257, 0.15294727364629213, 0.09439031745028313, 0.9997045439365588, 0.7486978124905728, 0.15361005199725805, 0.09676223747858775, 0.9979563528102225, 0.9953610976136485, 0.9926628220696108, 1.0024051362384638, 0.9987285040766569, 0.9988635858582318, 0.9995568334542987, 0.591510282647303, 0.4077645352717578, 1.000926188118343, 1.0009358704846572, 0.00282644624495468, 0.997735524469002, 0.9998199521346894, 0.8362171475891724, 0.16342457350466702, 1.0000454269292594, 0.9991069702080033, 0.9994653150761709, 1.0001074379057464, 0.9987019669753873, 0.9916339699369271, 0.008853874731579706, 0.995604759144052, 0.9968774810774548, 1.0019177062717592, 0.9952958799530844, 1.0078450327366728, 0.9943769165595225, 0.00504759856121585, 0.7649377322510628, 0.23316283817278385, 0.0017818195782239418, 0.08374552017652527, 0.9140734436288822, 1.0004291650118762, 0.8773617021384521, 0.1213959587864525, 0.0013794995316642328, 0.9987466795783209, 1.0026531203067888, 1.0004559728978695, 0.003079636476567878, 0.9978022184079924, 0.05054955804885311, 0.9492083678062417, 1.0001201580965042, 0.9910521751131566, 0.040216871562063355, 0.06166586972849714, 0.8981767982194149, 1.0002796374411036, 1.0013640417087168, 1.002695910740097, 1.0025405851959532, 0.7157429703195609, 0.038034650596691644, 0.08990008322854388, 0.05947236275119057, 0.0670792928705289, 0.029736181375595284, 0.16234039186010155, 0.0786264006160036, 0.16627171189090173, 0.13528365988341795, 0.10730191142889903, 0.35011873686067485, 1.0166119848926394, 0.14900234217859, 0.3211904035062513, 0.0688752245310645, 0.1186563274099527, 0.047394337672366164, 0.0006819329161491534, 0.2939130868602851, 0.00891138183357436, 0.989163383526754, 0.9999258664447198, 0.14261288176213696, 0.10268127486873863, 0.7558482733393259, 1.01371565445135, 0.997888712149221, 0.9994576571052332, 0.14951134279995998, 0.13170121419056036, 0.02437175493917843, 0.05671119899308826, 0.19309928913349061, 0.4445501838425142, 0.9983961743566053], \"Term\": [\"absolut\", \"absolut\", \"absolut\", \"abstract\", \"academ\", \"accept\", \"accept\", \"accept\", \"accept\", \"access\", \"access\", \"access\", \"access\", \"accid\", \"address\", \"address\", \"address\", \"administr\", \"administr\", \"administr\", \"administr\", \"aero\", \"agenc\", \"agenc\", \"agent\", \"aid\", \"alaska\", \"alexia\", \"alink\", \"altitud\", \"amend\", \"american\", \"american\", \"american\", \"amherst\", \"andi\", \"andrew\", \"andrew\", \"annual\", \"annual\", \"anonym\", \"anonym\", \"anonym\", \"anti\", \"anti\", \"anti\", \"anybodi\", \"anybodi\", \"apana\", \"appl\", \"appl\", \"appl\", \"appletalk\", \"applic\", \"applic\", \"arab\", \"argic\", \"argument\", \"argument\", \"argument\", \"armenia\", \"armenian\", \"armi\", \"armi\", \"arrog\", \"artist\", \"asham\", \"assert\", \"associ\", \"associ\", \"associ\", \"assumpt\", \"atheism\", \"atheist\", \"atlas\", \"attack\", \"attack\", \"attest\", \"audio\", \"austin\", \"auto\", \"auto\", \"avail\", \"avail\", \"avail\", \"avenu\", \"axi\", \"azerbaijan\", \"azerbaijani\", \"backup\", \"bacteria\", \"bailey\", \"baku\", \"ban\", \"bank\", \"bank\", \"bank\", \"base\", \"base\", \"base\", \"base\", \"base\", \"base\", \"base\", \"basebal\", \"basebal\", \"batteri\", \"baud\", \"bcstec\", \"behanna\", \"behanna\", \"belief\", \"believ\", \"believ\", \"benevol\", \"berkeley\", \"berkeley\", \"berkeley\", \"bernoulli\", \"bibl\", \"biblic\", \"bibliographi\", \"bigboot\", \"bike\", \"biker\", \"bio\", \"bit\", \"bloom\", \"blue\", \"blue\", \"blue\", \"bmerh\", \"board\", \"board\", \"board\", \"bogus\", \"bois\", \"bomb\", \"book\", \"book\", \"book\", \"boot\", \"bosnian\", \"boston\", \"bottleneck\", \"brake\", \"brand\", \"brandt\", \"brave\", \"brian\", \"brian\", \"broward\", \"buffalo\", \"buffalo\", \"bure\", \"bureaucrat\", \"burk\", \"buy\", \"buy\", \"cabl\", \"cager\", \"calendar\", \"callback\", \"calstat\", \"canada\", \"canada\", \"canada\", \"canada\", \"cancer\", \"candida\", \"car\", \"car\", \"carb\", \"card\", \"career\", \"case\", \"case\", \"case\", \"case\", \"case\", \"case\", \"case\", \"cathol\", \"caus\", \"caus\", \"caus\", \"caus\", \"caus\", \"caus\", \"center\", \"center\", \"center\", \"center\", \"center\", \"centri\", \"chan\", \"chang\", \"chang\", \"chang\", \"chang\", \"chang\", \"chang\", \"channel\", \"channel\", \"chicago\", \"chicago\", \"children\", \"children\", \"children\", \"chip\", \"chip\", \"chip\", \"chris\", \"chris\", \"christ\", \"christian\", \"church\", \"circuit\", \"civilian\", \"claim\", \"claim\", \"claim\", \"clamp\", \"clark\", \"clayton\", \"clearer\", \"cleveland\", \"cleveland\", \"client\", \"clinic\", \"clinton\", \"clipper\", \"cloth\", \"coat\", \"code\", \"code\", \"coloni\", \"color\", \"color\", \"columbia\", \"columbia\", \"columbia\", \"communion\", \"comp\", \"compil\", \"compil\", \"complain\", \"complain\", \"compress\", \"comput\", \"comput\", \"comput\", \"conclus\", \"conclus\", \"congress\", \"connect\", \"connect\", \"connect\", \"connector\", \"conscienc\", \"consid\", \"consid\", \"consid\", \"consid\", \"consid\", \"consid\", \"consid\", \"consid\", \"constitut\", \"constitut\", \"contact\", \"contact\", \"contradict\", \"control\", \"control\", \"control\", \"control\", \"convert\", \"cool\", \"copi\", \"copi\", \"copi\", \"copi\", \"copi\", \"cost\", \"cost\", \"cost\", \"couldn\", \"couldn\", \"countri\", \"countri\", \"coupl\", \"coupl\", \"coupl\", \"coupl\", \"coupl\", \"cours\", \"cours\", \"cours\", \"cours\", \"cours\", \"cours\", \"cours\", \"court\", \"court\", \"coventri\", \"covington\", \"craig\", \"cramer\", \"crime\", \"crime\", \"crucifi\", \"cruiser\", \"crux\", \"crypt\", \"crypto\", \"cryptolog\", \"cure\", \"cview\", \"cwru\", \"cycl\", \"cycl\", \"dalhousi\", \"daryl\", \"data\", \"data\", \"data\", \"data\", \"data\", \"david\", \"david\", \"david\", \"david\", \"david\", \"david\", \"davidian\", \"debug\", \"decvax\", \"default\", \"defens\", \"defens\", \"deficit\", \"definit\", \"definit\", \"definit\", \"den\", \"denomin\", \"dens\", \"depriv\", \"design\", \"design\", \"design\", \"design\", \"design\", \"detector\", \"detroit\", \"devic\", \"devic\", \"devil\", \"diagnos\", \"diagnosi\", \"diagram\", \"dialog\", \"diamond\", \"differ\", \"differ\", \"differ\", \"differ\", \"differ\", \"differ\", \"differ\", \"digex\", \"digex\", \"directori\", \"disarm\", \"disclaim\", \"disclaim\", \"disclaim\", \"diseas\", \"disk\", \"disk\", \"disobey\", \"display\", \"distribut\", \"distribut\", \"distribut\", \"distribut\", \"distribut\", \"distribut\", \"divin\", \"divis\", \"divis\", \"divis\", \"dock\", \"doctrin\", \"dog\", \"dorothi\", \"dose\", \"dragon\", \"dri\", \"drink\", \"drive\", \"driver\", \"driver\", \"drug\", \"dscomsa\", \"dseg\", \"dude\", \"duke\", \"duke\", \"dutch\", \"earth\", \"earth\", \"eat\", \"electron\", \"electron\", \"elementari\", \"email\", \"email\", \"email\", \"encrypt\", \"enforc\", \"engin\", \"engin\", \"engr\", \"entri\", \"escrow\", \"escrow\", \"esdi\", \"etern\", \"evas\", \"evid\", \"evid\", \"evil\", \"exampl\", \"exampl\", \"exampl\", \"exampl\", \"exist\", \"exist\", \"exist\", \"face\", \"face\", \"face\", \"face\", \"fact\", \"fact\", \"fact\", \"fact\", \"faith\", \"fan\", \"feder\", \"federalist\", \"feel\", \"feel\", \"feel\", \"feel\", \"file\", \"final\", \"final\", \"final\", \"final\", \"final\", \"finland\", \"firearm\", \"fiscal\", \"fist\", \"flash\", \"flight\", \"flight\", \"floppi\", \"fluid\", \"flyer\", \"follow\", \"follow\", \"follow\", \"follow\", \"follow\", \"follow\", \"font\", \"food\", \"footbal\", \"forc\", \"forc\", \"forc\", \"forc\", \"forc\", \"ford\", \"format\", \"format\", \"franklin\", \"freeman\", \"freenet\", \"friend\", \"friend\", \"friend\", \"friend\", \"frontier\", \"function\", \"function\", \"game\", \"gari\", \"gari\", \"gatech\", \"gaza\", \"gear\", \"general\", \"general\", \"general\", \"general\", \"general\", \"general\", \"geneva\", \"genocid\", \"german\", \"gibson\", \"glad\", \"glad\", \"glad\", \"goal\", \"goal\", \"goal\", \"goddess\", \"gonna\", \"good\", \"good\", \"good\", \"good\", \"good\", \"good\", \"good\", \"gordon\", \"gover\", \"govern\", \"govern\", \"graphic\", \"gray\", \"greec\", \"greek\", \"greenbelt\", \"gretzki\", \"grin\", \"grip\", \"group\", \"group\", \"group\", \"group\", \"group\", \"guidelin\", \"guitar\", \"gun\", \"hadn\", \"hallam\", \"halv\", \"hamburg\", \"hand\", \"hand\", \"hand\", \"hand\", \"hand\", \"handgun\", \"handler\", \"happen\", \"happen\", \"happen\", \"hard\", \"hard\", \"hard\", \"hard\", \"hard\", \"health\", \"health\", \"hear\", \"hear\", \"hear\", \"hear\", \"heaven\", \"helmet\", \"helmet\", \"henri\", \"henri\", \"heresi\", \"high\", \"high\", \"high\", \"high\", \"high\", \"histori\", \"histori\", \"histori\", \"histori\", \"hockey\", \"holi\", \"homicid\", \"homosexu\", \"honda\", \"hook\", \"hors\", \"hous\", \"hous\", \"hull\", \"hulman\", \"human\", \"human\", \"human\", \"hurt\", \"hurt\", \"hussein\", \"hypocrisi\", \"hypothet\", \"ieee\", \"illeg\", \"illinoi\", \"imag\", \"imag\", \"impair\", \"includ\", \"includ\", \"includ\", \"includ\", \"includ\", \"includ\", \"infal\", \"infant\", \"infect\", \"infin\", \"inform\", \"inform\", \"inform\", \"ingr\", \"init\", \"inject\", \"innoc\", \"innoc\", \"instal\", \"instal\", \"instal\", \"institut\", \"institut\", \"institut\", \"insur\", \"insur\", \"interest\", \"interest\", \"interest\", \"interest\", \"interest\", \"interest\", \"interest\", \"intermitt\", \"internet\", \"internet\", \"internet\", \"introduct\", \"irrit\", \"islam\", \"islam\", \"isra\", \"isra\", \"israel\", \"issu\", \"issu\", \"issu\", \"issu\", \"jacob\", \"jade\", \"jagr\", \"jesus\", \"jew\", \"jewish\", \"jewish\", \"job\", \"john\", \"john\", \"john\", \"john\", \"john\", \"jose\", \"journal\", \"jpeg\", \"jumper\", \"kansa\", \"kean\", \"keen\", \"keith\", \"keith\", \"keith\", \"key\", \"key\", \"kill\", \"kill\", \"kilroy\", \"king\", \"king\", \"king\", \"king\", \"kinsey\", \"koresh\", \"koufax\", \"krillean\", \"ksand\", \"laboratori\", \"laboratori\", \"land\", \"land\", \"laptop\", \"launch\", \"launchpad\", \"leaf\", \"leagu\", \"leather\", \"leav\", \"leav\", \"leav\", \"leav\", \"legal\", \"legisl\", \"lemon\", \"lethal\", \"libertarian\", \"liberti\", \"librari\", \"life\", \"life\", \"life\", \"life\", \"life\", \"light\", \"light\", \"lindro\", \"liner\", \"list\", \"list\", \"list\", \"list\", \"literatur\", \"littl\", \"littl\", \"littl\", \"littl\", \"littl\", \"littl\", \"live\", \"live\", \"live\", \"livesey\", \"lock\", \"lock\", \"long\", \"long\", \"long\", \"long\", \"long\", \"long\", \"lord\", \"lord\", \"lose\", \"lose\", \"lose\", \"lose\", \"lose\", \"loui\", \"love\", \"love\", \"love\", \"luke\", \"lunar\", \"lutheran\", \"lynx\", \"machin\", \"machin\", \"machin\", \"madam\", \"magnus\", \"mail\", \"mail\", \"make\", \"make\", \"make\", \"make\", \"make\", \"make\", \"manag\", \"manag\", \"manag\", \"manag\", \"mark\", \"mark\", \"mark\", \"mark\", \"mark\", \"mark\", \"marlin\", \"marriag\", \"marvel\", \"massacr\", \"mauric\", \"maxtor\", \"mayb\", \"mayb\", \"mayb\", \"mayb\", \"mayb\", \"meaning\", \"medic\", \"medicin\", \"megabyt\", \"mein\", \"melbourn\", \"mellon\", \"memoir\", \"memori\", \"memori\", \"memori\", \"messag\", \"messag\", \"messag\", \"meyer\", \"michael\", \"mickey\", \"microsoft\", \"midway\", \"mike\", \"mike\", \"mile\", \"mile\", \"militia\", \"milk\", \"minnesota\", \"mission\", \"mode\", \"mode\", \"model\", \"model\", \"model\", \"modem\", \"mogilni\", \"monitor\", \"monitor\", \"mono\", \"montreal\", \"moon\", \"moral\", \"moral\", \"mosqu\", \"motherboard\", \"motif\", \"moto\", \"motorcycl\", \"motorola\", \"mous\", \"movement\", \"murder\", \"muscl\", \"musicb\", \"muslim\", \"myer\", \"myrto\", \"nasa\", \"nation\", \"nation\", \"nation\", \"nation\", \"nation\", \"natur\", \"natur\", \"natur\", \"natur\", \"nazi\", \"nctu\", \"nearest\", \"neccessari\", \"netcom\", \"netcom\", \"netcom\", \"network\", \"news\", \"news\", \"news\", \"news\", \"newsgroup\", \"newsgroup\", \"newslett\", \"newsread\", \"newsread\", \"niel\", \"nodak\", \"nore\", \"notion\", \"nuclear\", \"null\", \"number\", \"number\", \"number\", \"number\", \"number\", \"number\", \"occupi\", \"offens\", \"offens\", \"ohio\", \"ohio\", \"okcforum\", \"onlin\", \"onlin\", \"opinion\", \"opinion\", \"opinion\", \"opinion\", \"opinion\", \"optilink\", \"oracl\", \"orbit\", \"ottoman\", \"ouch\", \"outlet\", \"output\", \"packag\", \"packag\", \"pain\", \"palestinian\", \"panther\", \"paper\", \"paper\", \"paper\", \"partnership\", \"passer\", \"passion\", \"patch\", \"patent\", \"patent\", \"patient\", \"patrick\", \"peac\", \"peac\", \"penalti\", \"penguin\", \"pentium\", \"peopl\", \"peopl\", \"peopl\", \"peopl\", \"peopl\", \"period\", \"period\", \"period\", \"period\", \"period\", \"period\", \"perpetr\", \"person\", \"person\", \"person\", \"person\", \"person\", \"person\", \"philadelphia\", \"phone\", \"phone\", \"phone\", \"phone\", \"photoshop\", \"physician\", \"pick\", \"pick\", \"pinout\", \"piss\", \"pistol\", \"pitch\", \"pitt\", \"pitt\", \"pixmap\", \"planet\", \"planet\", \"play\", \"player\", \"playoff\", \"point\", \"point\", \"point\", \"point\", \"point\", \"point\", \"polygon\", \"popul\", \"popul\", \"porsch\", \"port\", \"port\", \"portal\", \"postscript\", \"power\", \"power\", \"power\", \"power\", \"power\", \"power\", \"powerpc\", \"practition\", \"presid\", \"preview\", \"price\", \"price\", \"price\", \"price\", \"printer\", \"printer\", \"prism\", \"privat\", \"privat\", \"probabl\", \"probabl\", \"probabl\", \"probabl\", \"probabl\", \"probabl\", \"probabl\", \"probabl\", \"probe\", \"problem\", \"problem\", \"problem\", \"problem\", \"problem\", \"problem\", \"program\", \"program\", \"program\", \"prohibit\", \"project\", \"project\", \"project\", \"propos\", \"propos\", \"propos\", \"protect\", \"protect\", \"protect\", \"protein\", \"provid\", \"provid\", \"provid\", \"provid\", \"provid\", \"public\", \"public\", \"public\", \"pull\", \"pump\", \"purdu\", \"purdu\", \"pwiseman\", \"quadra\", \"question\", \"question\", \"question\", \"question\", \"question\", \"question\", \"question\", \"question\", \"radar\", \"random\", \"random\", \"ranger\", \"rapist\", \"read\", \"read\", \"read\", \"read\", \"read\", \"read\", \"reason\", \"reason\", \"reason\", \"reason\", \"reason\", \"receiv\", \"receiv\", \"receiv\", \"regret\", \"regul\", \"reilli\", \"reinstal\", \"religion\", \"rememb\", \"rememb\", \"rememb\", \"rememb\", \"renam\", \"repli\", \"repli\", \"repli\", \"repli\", \"reproduct\", \"republican\", \"request\", \"request\", \"research\", \"research\", \"research\", \"research\", \"resiz\", \"resourc\", \"resourc\", \"rethink\", \"revok\", \"revolut\", \"revolv\", \"ribbon\", \"richer\", \"rid\", \"ride\", \"rider\", \"ripem\", \"robert\", \"robert\", \"robert\", \"robertson\", \"rock\", \"rocket\", \"roger\", \"rooki\", \"roster\", \"roth\", \"routin\", \"run\", \"run\", \"run\", \"run\", \"rwing\", \"safeguard\", \"sage\", \"sale\", \"sale\", \"salmon\", \"sandvik\", \"santa\", \"satellit\", \"savag\", \"savior\", \"scanner\", \"scienc\", \"scienc\", \"scienc\", \"scienc\", \"score\", \"screen\", \"scriptur\", \"scsi\", \"seagat\", \"season\", \"secreci\", \"secret\", \"secret\", \"section\", \"section\", \"section\", \"secur\", \"secur\", \"secur\", \"sell\", \"sell\", \"sell\", \"sell\", \"send\", \"send\", \"send\", \"send\", \"serdar\", \"server\", \"servic\", \"servic\", \"servic\", \"servic\", \"ship\", \"ship\", \"ship\", \"shuttl\", \"signatur\", \"simm\", \"slaveri\", \"slump\", \"small\", \"small\", \"small\", \"small\", \"smith\", \"smith\", \"smith\", \"softwar\", \"softwar\", \"softwar\", \"solar\", \"soldier\", \"sound\", \"sound\", \"sound\", \"sound\", \"sourc\", \"sourc\", \"sourc\", \"sourc\", \"soviet\", \"soviet\", \"space\", \"space\", \"spacecraft\", \"spanish\", \"spec\", \"spec\", \"speed\", \"speed\", \"speed\", \"spencer\", \"spirit\", \"sport\", \"sport\", \"spreadsheet\", \"stake\", \"start\", \"start\", \"start\", \"start\", \"start\", \"state\", \"state\", \"state\", \"state\", \"state\", \"static\", \"station\", \"station\", \"statut\", \"steer\", \"stop\", \"stop\", \"stop\", \"stop\", \"strain\", \"stream\", \"string\", \"stroke\", \"stupid\", \"stupid\", \"subscrib\", \"subscript\", \"summari\", \"summari\", \"summari\", \"sunlight\", \"sunni\", \"support\", \"support\", \"support\", \"support\", \"support\", \"support\", \"surfac\", \"svga\", \"sweat\", \"switch\", \"switch\", \"symptom\", \"syndrom\", \"sysop\", \"talk\", \"talk\", \"talk\", \"talk\", \"talk\", \"talon\", \"tamu\", \"tape\", \"tape\", \"tast\", \"teach\", \"teach\", \"teach\", \"teal\", \"team\", \"technic\", \"technolog\", \"technolog\", \"technolog\", \"technolog\", \"technolog\", \"telescop\", \"telnet\", \"temperatur\", \"tender\", \"tenn\", \"tennesse\", \"territori\", \"territori\", \"texa\", \"texa\", \"texa\", \"thai\", \"thing\", \"thing\", \"thing\", \"thing\", \"thing\", \"thing\", \"thrower\", \"time\", \"time\", \"time\", \"time\", \"time\", \"time\", \"time\", \"time\", \"titan\", \"tobacco\", \"today\", \"today\", \"today\", \"toni\", \"topic\", \"topic\", \"toronto\", \"toronto\", \"torqu\", \"toyota\", \"trade\", \"trade\", \"tranquil\", \"treatment\", \"treatment\", \"treatment\", \"tri\", \"tri\", \"tri\", \"tri\", \"tri\", \"tri\", \"tri\", \"tri\", \"trivia\", \"troop\", \"truck\", \"true\", \"true\", \"true\", \"true\", \"truth\", \"truth\", \"turbo\", \"turk\", \"turkey\", \"turkish\", \"turkiy\", \"turn\", \"turn\", \"turn\", \"uart\", \"uchicago\", \"udel\", \"uiuc\", \"ukan\", \"umich\", \"understand\", \"understand\", \"understand\", \"understand\", \"understand\", \"univ\", \"unix\", \"unix\", \"unix\", \"unplug\", \"unsaf\", \"uokmax\", \"uoknor\", \"upenn\", \"upgrad\", \"urbana\", \"user\", \"user\", \"utexa\", \"utkvm\", \"vehicl\", \"vehicl\", \"venus\", \"version\", \"version\", \"video\", \"viewer\", \"villag\", \"virginia\", \"virtu\", \"visual\", \"visual\", \"vitamin\", \"voltag\", \"vram\", \"vulcan\", \"wallac\", \"warrant\", \"warrant\", \"wasn\", \"wasn\", \"water\", \"water\", \"water\", \"watt\", \"weapon\", \"weapon\", \"weapon\", \"wear\", \"weren\", \"widget\", \"william\", \"william\", \"win\", \"win\", \"window\", \"windshield\", \"wing\", \"wing\", \"wing\", \"wire\", \"wiretap\", \"wong\", \"worcest\", \"word\", \"word\", \"word\", \"word\", \"word\", \"word\", \"work\", \"work\", \"work\", \"work\", \"work\", \"work\", \"workgroup\", \"world\", \"world\", \"world\", \"world\", \"world\", \"world\", \"world\", \"wors\", \"wors\", \"worship\", \"wouldn\", \"wouldn\", \"wouldn\", \"xcopyarea\", \"xlib\", \"xterm\", \"year\", \"year\", \"year\", \"year\", \"year\", \"year\", \"yeast\"]}, \"R\": 30, \"lambda.step\": 0.01, \"plot.opts\": {\"xlab\": \"PC1\", \"ylab\": \"PC2\"}, \"topic.order\": [4, 9, 5, 6, 10, 2, 7, 1, 8, 3]};\n", "\n", - "[734 rows x 6 columns], token_table= Topic Freq Term\n", - "term \n", - "338 1 0.145983 accept\n", - "338 2 0.524347 accept\n", - "338 3 0.129101 accept\n", - "338 4 0.049654 accept\n", - "338 5 0.007945 accept\n", - "338 6 0.022841 accept\n", - "338 8 0.066536 accept\n", - "338 9 0.034758 accept\n", - "338 10 0.018869 accept\n", - "73 3 0.403915 access\n", - "73 4 0.196068 access\n", - "73 5 0.171820 access\n", - "73 6 0.033255 access\n", - "73 7 0.000693 access\n", - "73 8 0.193297 access\n", - "2940 4 0.984634 adaptec\n", - "152 1 0.052461 address\n", - "152 2 0.074007 address\n", - "152 3 0.536784 address\n", - "152 4 0.182675 address\n", - "152 5 0.030914 address\n", - "152 6 0.026230 address\n", - "152 7 0.032788 address\n", - "152 8 0.049650 address\n", - "152 9 0.005621 address\n", - "152 10 0.008431 address\n", - "1444 1 0.124112 administr\n", - "1444 3 0.063074 administr\n", - "1444 5 0.197359 administr\n", - "1444 8 0.614458 administr\n", - "... ... ... ...\n", - "182 2 0.166406 world\n", - "182 3 0.097373 world\n", - "182 4 0.150056 world\n", - "182 5 0.106093 world\n", - "182 6 0.051230 world\n", - "182 7 0.080296 world\n", - "182 8 0.011990 world\n", - "182 9 0.053410 world\n", - "182 10 0.054863 world\n", - "4238 1 0.009547 worship\n", - "4238 2 0.988079 worship\n", - "4809 3 0.994707 xlib\n", - "3868 3 0.995135 xpert\n", - "3581 3 0.995652 xterm\n", - "2827 3 0.988763 xview\n", - "6047 6 0.981546 yamaha\n", - "1701 7 0.988053 yanke\n", - "28 1 0.130095 year\n", - "28 2 0.031962 year\n", - "28 3 0.015482 year\n", - "28 4 0.038954 year\n", - "28 5 0.216243 year\n", - "28 6 0.063674 year\n", - "28 7 0.244959 year\n", - "28 8 0.040951 year\n", - "28 9 0.067919 year\n", - "28 10 0.149822 year\n", - "3309 9 0.986879 yeast\n", - "3190 5 0.990640 zoolog\n", - "1894 1 0.991014 zuma\n", + "function LDAvis_load_lib(url, callback){\n", + " var s = document.createElement('script');\n", + " s.src = url;\n", + " s.async = true;\n", + " s.onreadystatechange = s.onload = callback;\n", + " s.onerror = function(){console.warn(\"failed to load library \" + url);};\n", + " document.getElementsByTagName(\"head\")[0].appendChild(s);\n", + "}\n", "\n", - "[2168 rows x 3 columns], R=30, lambda_step=0.01, plot_opts={'xlab': 'PC1', 'ylab': 'PC2'}, topic_order=[3, 1, 8, 9, 2, 4, 7, 10, 5, 6])" + "if(typeof(LDAvis) !== \"undefined\"){\n", + " // already loaded: just create the visualization\n", + " !function(LDAvis){\n", + " new LDAvis(\"#\" + \"ldavis_el15587112430946968420164328\", ldavis_el15587112430946968420164328_data);\n", + " }(LDAvis);\n", + "}else if(typeof define === \"function\" && define.amd){\n", + " // require.js is available: use it to load d3/LDAvis\n", + " require.config({paths: {d3: \"https://cdnjs.cloudflare.com/ajax/libs/d3/3.5.5/d3.min\"}});\n", + " require([\"d3\"], function(d3){\n", + " window.d3 = d3;\n", + " LDAvis_load_lib(\"https://cdn.rawgit.com/bmabey/pyLDAvis/files/ldavis.v1.0.0.js\", function(){\n", + " new LDAvis(\"#\" + \"ldavis_el15587112430946968420164328\", ldavis_el15587112430946968420164328_data);\n", + " });\n", + " });\n", + "}else{\n", + " // require.js not available: dynamically load d3 & LDAvis\n", + " LDAvis_load_lib(\"https://cdnjs.cloudflare.com/ajax/libs/d3/3.5.5/d3.min.js\", function(){\n", + " LDAvis_load_lib(\"https://cdn.rawgit.com/bmabey/pyLDAvis/files/ldavis.v1.0.0.js\", function(){\n", + " new LDAvis(\"#\" + \"ldavis_el15587112430946968420164328\", ldavis_el15587112430946968420164328_data);\n", + " })\n", + " });\n", + "}\n", + "</script>" + ], + "text/plain": [ + "<IPython.core.display.HTML object>" ] }, - "execution_count": 155, + "execution_count": 31, "metadata": {}, "output_type": "execute_result" } ], "source": [ - "p = visualize_topics(model, bow_corpus, dictionary)\n", + "# Mallet\n", + "p = visualize_topics(model_mallet, bow_corpus, dictionary, model_type='mallet')\n", "p" ] }, From 5653422db83d4676bc7bc1cbc60439d0c2b6b0ab Mon Sep 17 00:00:00 2001 From: hugovasselin <waaaouu@gmail.com> Date: Thu, 23 May 2019 13:21:43 +0200 Subject: [PATCH 188/496] remove duplicated --- nautilus_nlp/utils/lemmatizer.py | 102 ------------------------------- nautilus_nlp/utils/stemmer.py | 31 ---------- nautilus_nlp/utils/tokenizer.py | 80 ------------------------ 3 files changed, 213 deletions(-) delete mode 100644 nautilus_nlp/utils/lemmatizer.py delete mode 100644 nautilus_nlp/utils/stemmer.py delete mode 100644 nautilus_nlp/utils/tokenizer.py diff --git a/nautilus_nlp/utils/lemmatizer.py b/nautilus_nlp/utils/lemmatizer.py deleted file mode 100644 index e4c812c..0000000 --- a/nautilus_nlp/utils/lemmatizer.py +++ /dev/null @@ -1,102 +0,0 @@ -import spacy -import nltk -nltk.download('wordnet') -from nltk.stem import WordNetLemmatizer -from nltk.corpus import wordnet - -try: - french_spacy = spacy.load('fr_core_news_sm') -except OSError: - raise OSError("""You must install French langage to use SpaCy. - python -m spacy download fr - See https://spacy.io/usage/ for details - """) -try: - english_spacy = spacy.load('en_core_web_sm') -except OSError: - raise OSError("""You must install english langage to use SpaCy. - python -m spacy download en - See https://spacy.io/usage/ for details - """) - - - - -def lemmatize_french_tokens(tokens, module='spacy', load_only_pos='all'): - ''' - Wrappers of french lemmatizers. SpaCy is much faster but sometimes - FrenchLefffLemmatizer returns more accurate results. Give a try to the - 2 modules and choose the one that better fit your needs. - - Args: - tokens (list): list of tokens - module ({'spacy'}): modules availables. - load_only_pos ({'a', v', 'r', 'n', 'all'}): If not "all", applies - lemmatization only to a certain POS tags, for french_leff_v module. - a = adjectives, v = verbs, n = noun, r = adverb. - - Returns: - list of lemmatized tokens - - ''' - - tokens = _make_sure_input_is_list_of_tokens(tokens) - - if module == 'spacy': - # Doc : https://spacy.io/api/token#attributes - text = ' '.join(tokens) - doc = french_spacy(text) - return [token.lemma_ for token in doc] - - else: - raise ValueError("must pass a valid module name!") - - -def lemmatize_english_tokens(tokens, module='spacy', pos_tag_prio='v'): - ''' - Args: - tokens (list): list of tokens - module ({'french_leff_v', 'spacy'}): modules availables. - pos_tag_prio ({'v', 'n', 'all'}): grammatical priority, applies - for french_leff_v module. - - Returns: - list of lemmatized tokens - - ''' - tokens = _make_sure_input_is_list_of_tokens(tokens) - - if module == 'nltk': - # Doc : https://github.com/ClaudeCoulombe/FrenchLefffLemmatizer - lemmatizer = WordNetLemmatizer() - return [lemmatizer.lemmatize(word, _get_wordnet_pos(word)) for word in tokens] - - elif module == 'spacy': - # Doc : https://spacy.io/api/token#attributes - text = ' '.join(tokens) - doc = english_spacy(text) - return [token.lemma_ for token in doc] - - else: - raise ValueError("must pass a valid module name!") - - -def _get_wordnet_pos(word): - """Map POS tag to first character lemmatize() accepts""" - tag = nltk.pos_tag([word])[0][1][0].upper() - tag_dict = {"J": wordnet.ADJ, - "N": wordnet.NOUN, - "V": wordnet.VERB, - "R": wordnet.ADV} - - return tag_dict.get(tag, wordnet.NOUN) - - -def _make_sure_input_is_list_of_tokens(tokens): - if type(tokens) is list: - return tokens - elif tokens is None: - return [] - elif type(tokens) is str: - raise ValueError("must pass a list of tokens, not text!") - diff --git a/nautilus_nlp/utils/stemmer.py b/nautilus_nlp/utils/stemmer.py deleted file mode 100644 index c480ca8..0000000 --- a/nautilus_nlp/utils/stemmer.py +++ /dev/null @@ -1,31 +0,0 @@ -from nltk.stem.snowball import * - - -def stem_tokens(tokens: list, lang: str ='english'): - ''' - Wrapper of NLTK's Snowball stemmers : http://www.nltk.org/howto/stem.html - - Args: - tokens (list): list of tokens - lang ({'arabic', 'danish', 'dutch', 'english', 'finnish', 'french', - 'german', 'hungarian', 'italian', 'norwegian', 'porter', 'portuguese', - 'romanian', 'russian', 'spanish', 'swedish'}): supported langages - - Returns: - list of stemmed tokens - - ''' - supported_lang = [lang for lang in SnowballStemmer.languages] - - if lang in supported_lang: - stemmer = eval(lang.capitalize()+'Stemmer()') - else: - raise ValueError("Langage not supported of mispelled") - - # Make sure tokens are actually a list, and handle NaN. - if type(tokens) is list: - return [stemmer.stem(token) for token in tokens] - elif tokens is None: - return [] - elif type(tokens) is str: - raise ValueError("must pass a list of tokens, not text!") \ No newline at end of file diff --git a/nautilus_nlp/utils/tokenizer.py b/nautilus_nlp/utils/tokenizer.py deleted file mode 100644 index a009533..0000000 --- a/nautilus_nlp/utils/tokenizer.py +++ /dev/null @@ -1,80 +0,0 @@ -import nltk -from sacremoses import MosesTokenizer, MosesDetokenizer -import spacy -from spacy.lang.fr import French -from spacy.lang.en import English -import spacy.lang as spacylang -#nltk.download('punkt') - -try: - french_spacy = spacylang.fr.French() -except OSError: - raise OSError("""You must install French langage to use SpaCy. - python -m spacy download fr - See https://spacy.io/usage/ for details - """) -try: - english_spacy = spacylang.en.English() -except OSError: - raise OSError("""You must install english langage to use SpaCy. - python -m spacy download en - See https://spacy.io/usage/ for details - """) - - -def tokenize(text: str, lang_module: str = 'en_spacy'): - """ - Convert text to a list of tokens. - - Args: - lang_module ({'en_spacy', 'en_nltk', 'fr_spacy', 'fr_moses'}): choose - the tokenization module according to the langage and the implementation. - Recommanded: Spacy (faster, better results). To process other langages - import models.Spacy_models - - Returns: - list - """ - if lang_module is 'en_nltk': - return nltk.word_tokenize(text) - elif lang_module is 'en_spacy': - spacydoc = english_spacy(text) - return [tokens.text for tokens in spacydoc] - elif lang_module is 'fr_spacy': - spacydoc = french_spacy(text) - return [tokens.text for tokens in spacydoc] - elif lang_module is 'fr_moses': - t = MosesTokenizer(lang='fr') - return t.tokenize(text, escape=False) - - -def untokenize(tokens, lang='fr'): - ''' - Inputs a list of tokens output string. - ["J'", 'ai'] >>> "J' ai" - ''' - d = MosesDetokenizer(lang=lang) - text = d.detokenize(tokens, unescape=False) - return text - - -def _convert_tokens_to_string(tokens_or_str): - if type(tokens_or_str) is str: - return tokens_or_str - elif type(tokens_or_str) is list: - return untokenize(tokens_or_str) - elif type(tokens_or_str) is None: - return '' - else: - raise ValueError('Please input string or tokens') - - -def _convert_string_to_tokens(tokens_or_str, lang_module='en_spacy'): - if type(tokens_or_str) is str: - return tokenize(tokens_or_str, lang_module=lang_module) - elif type(tokens_or_str) is list: - return tokens_or_str - elif type(tokens_or_str) is None: - return [] - else: - raise ValueError('Please input string or tokens') \ No newline at end of file From a430dd233344251c047f4d7772ac6b38811cbee4 Mon Sep 17 00:00:00 2001 From: hugovasselin <waaaouu@gmail.com> Date: Thu, 23 May 2019 13:22:00 +0200 Subject: [PATCH 189/496] add nltk download --- nautilus_nlp/preprocessing/lemmatization.py | 1 + 1 file changed, 1 insertion(+) diff --git a/nautilus_nlp/preprocessing/lemmatization.py b/nautilus_nlp/preprocessing/lemmatization.py index 462472e..2b54ae2 100644 --- a/nautilus_nlp/preprocessing/lemmatization.py +++ b/nautilus_nlp/preprocessing/lemmatization.py @@ -1,6 +1,7 @@ import spacy import nltk nltk.download('wordnet') +nltk.download('averaged_perceptron_tagger') from nltk.stem import WordNetLemmatizer from nltk.corpus import wordnet From b37043cc1bb8ca4898e08dc810216c1fb2d19e10 Mon Sep 17 00:00:00 2001 From: hugovasselin <waaaouu@gmail.com> Date: Thu, 23 May 2019 13:22:18 +0200 Subject: [PATCH 190/496] add tests --- tests/test_stemming.py | 16 ++++++++++++++ tests/test_tokenizer.py | 46 +++++++++++++++++++++++++++++++++++++++++ 2 files changed, 62 insertions(+) create mode 100644 tests/test_stemming.py create mode 100644 tests/test_tokenizer.py diff --git a/tests/test_stemming.py b/tests/test_stemming.py new file mode 100644 index 0000000..faf4b0d --- /dev/null +++ b/tests/test_stemming.py @@ -0,0 +1,16 @@ +import pytest +from nautilus_nlp.preprocessing.stemming import stem_tokens + +def test_stem_en(): + input_tokens = ['I','survived','these', 'dogs'] + expected = ['i', 'surviv', 'these', 'dog'] + res = stem_tokens(input_tokens, lang='english') + assert res == expected + +def test_stem_fr(): + input_tokens = ['je', 'mangerai', 'dans', 'les', 'cuisines', 'du', 'château'] + expected = ['je', 'mang', 'dan', 'le', 'cuisin', 'du', 'château'] + res = stem_tokens(input_tokens, lang='french') + assert res == expected + + \ No newline at end of file diff --git a/tests/test_tokenizer.py b/tests/test_tokenizer.py new file mode 100644 index 0000000..ea95f47 --- /dev/null +++ b/tests/test_tokenizer.py @@ -0,0 +1,46 @@ +import pytest +from nautilus_nlp.preprocessing.tokenizer import tokenize, untokenize + + +def test_tokenize_fr_spacy(): + input_str = """Les moteurs de recherche tels Google, Exalead ou Yahoo! sont des applications très connues de fouille de textes sur de grandes masses de données. Cependant, les moteurs de recherche ne se basent pas uniquement sur le texte pour l'indexer, mais également sur la façon dont les pages sont mises en valeur les unes par rapport aux autres. L'algorithme utilisé par Google est PageRank, et il est courant de voir HITS dans le milieu académique""" + expected = ['Les', 'moteurs', 'de', 'recherche', 'tels', 'Google', ',', 'Exalead', 'ou', 'Yahoo', '!', 'sont', 'des', 'applications', 'très', 'connues', 'de', 'fouille', 'de', 'textes', 'sur', 'de', 'grandes', 'masses', 'de', 'données', '.', 'Cependant', ',', 'les', 'moteurs', 'de', 'recherche', 'ne', 'se', 'basent', 'pas', 'uniquement', 'sur', 'le', 'texte', 'pour', "l'", 'indexer', ',', 'mais', 'également', 'sur', 'la', 'façon', 'dont', 'les', 'pages', 'sont', 'mises', 'en', 'valeur', 'les', 'unes', 'par', 'rapport', 'aux', 'autres', '.', "L'", 'algorithme', 'utilisé', 'par', 'Google', 'est', 'PageRank', ',', 'et', 'il', 'est', 'courant', 'de', 'voir', 'HITS', 'dans', 'le', 'milieu', 'académique'] + res = tokenize(input_str, lang_module="fr_spacy") + assert res == expected + + +def test_tokenize_fr_moses(): + input_str = """Les moteurs de recherche tels Google, Exalead ou Yahoo! sont des applications très connues de fouille de textes sur de grandes masses de données. Cependant, les moteurs de recherche ne se basent pas uniquement sur le texte pour l'indexer, mais également sur la façon dont les pages sont mises en valeur les unes par rapport aux autres. L'algorithme utilisé par Google est PageRank, et il est courant de voir HITS dans le milieu académique""" + expected = ['Les', 'moteurs', 'de', 'recherche', 'tels', 'Google', ',', 'Exalead', 'ou', 'Yahoo', '!', 'sont', 'des', 'applications', 'très', 'connues', 'de', 'fouille', 'de', 'textes', 'sur', 'de', 'grandes', 'masses', 'de', 'données', '.', 'Cependant', ',', 'les', 'moteurs', 'de', 'recherche', 'ne', 'se', 'basent', 'pas', 'uniquement', 'sur', 'le', 'texte', 'pour', "l'", 'indexer', ',', 'mais', 'également', 'sur', 'la', 'façon', 'dont', 'les', 'pages', 'sont', 'mises', 'en', 'valeur', 'les', 'unes', 'par', 'rapport', 'aux', 'autres', '.', "L'", 'algorithme', 'utilisé', 'par', 'Google', 'est', 'PageRank', ',', 'et', 'il', 'est', 'courant', 'de', 'voir', 'HITS', 'dans', 'le', 'milieu', 'académique'] + res = tokenize(input_str, lang_module="fr_moses") + assert res == expected + +def test_tokenize_null_input(): + input_str = '' + expected = [] + res = tokenize(input_str, lang_module="en_spacy") + assert res == expected + +def test_tokenize_en_spacy(): + input_str = "Let's play together!" + expected = ['Let', "'s", 'play', 'together', '!'] + res = tokenize(input_str, lang_module="en_spacy") + assert res == expected + +def test_tokenize_en_nltk(): + input_str = "Let's play together!" + expected = ['Let', "'s", 'play', 'together', '!'] + res = tokenize(input_str, lang_module="en_nltk") + assert res == expected + +def test_untokenize_en(): + input_str = ['Let', "'s", 'play', 'together', '!'] + expected = "Let's play together!" + res = untokenize(input_str,lang='en') + assert res == expected + +def test_untokenize_fr(): + input_str = ['Les', 'moteurs', 'de', 'recherche', 'tels', 'Google', ',', 'Exalead', 'ou', 'Yahoo', '!', 'sont', 'des', 'applications', 'très', 'connues', 'de', 'fouille', 'de', 'textes', 'sur', 'de', 'grandes', 'masses', 'de', 'données', '.', 'Cependant', ',', 'les', 'moteurs', 'de', 'recherche', 'ne', 'se', 'basent', 'pas', 'uniquement', 'sur', 'le', 'texte', 'pour', "l'", 'indexer', ',', 'mais', 'également', 'sur', 'la', 'façon', 'dont', 'les', 'pages', 'sont', 'mises', 'en', 'valeur', 'les', 'unes', 'par', 'rapport', 'aux', 'autres', '.', "L'", 'algorithme', 'utilisé', 'par', 'Google', 'est', 'PageRank', ',', 'et', 'il', 'est', 'courant', 'de', 'voir', 'HITS', 'dans', 'le', 'milieu', 'académique'] + expected = "Les moteurs de recherche tels Google, Exalead ou Yahoo ! sont des applications très connues de fouille de textes sur de grandes masses de données. Cependant, les moteurs de recherche ne se basent pas uniquement sur le texte pour l' indexer, mais également sur la façon dont les pages sont mises en valeur les unes par rapport aux autres. L' algorithme utilisé par Google est PageRank, et il est courant de voir HITS dans le milieu académique" + res = untokenize(input_str,lang='en') + assert res == expected \ No newline at end of file From da5f566ba13496349aa2e749ca825ad9f6397718 Mon Sep 17 00:00:00 2001 From: hugovasselin <waaaouu@gmail.com> Date: Thu, 23 May 2019 13:24:43 +0200 Subject: [PATCH 191/496] add tests --- tests/test_lemmatization.py | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) create mode 100644 tests/test_lemmatization.py diff --git a/tests/test_lemmatization.py b/tests/test_lemmatization.py new file mode 100644 index 0000000..3ddf675 --- /dev/null +++ b/tests/test_lemmatization.py @@ -0,0 +1,22 @@ +import pytest +from nautilus_nlp.preprocessing.lemmatization import lemmatize_french_tokens, lemmatize_english_tokens + +def test_lemmatize_french_tokens_spacy(): + input_tokens = ['Ceci', 'est', 'un', 'texte', 'français', ',', "j'", 'adore', 'tes', 'frites', 'bien', 'grasses', 'YOLO', '!'] + expected = ['ceci', 'être', 'un', 'texte', 'français', ',', 'j', "'", 'adorer', 'ton', 'frit', 'bien', 'gras', 'yolo', '!'] + res = lemmatize_french_tokens(input_tokens, module='spacy') + assert res == expected + + +def test_lemmatize_english_tokens_spacy(): + input_tokens = ['The', 'striped', 'bats', 'are', 'hanging', 'on', 'their', 'feet', 'for', 'best'] + expected = ['the', 'strip', 'bat', 'be', 'hang', 'on', '-PRON-', 'foot', 'for', 'good'] + res = lemmatize_french_tokens(input_tokens, module='spacy') + assert res == expected + + +def test_lemmatize_english_tokens_nltk(): + input_tokens = ['The', 'striped', 'bats', 'are', 'hanging', 'on', 'their', 'feet', 'for', 'best'] + expected = ['The', 'strip', 'bat', 'be', 'hang', 'on', 'their', 'foot', 'for', 'best'] + res = lemmatize_french_tokens(input_tokens, module='nltk') + assert res == expected \ No newline at end of file From 95abc0be2c1d1aaa487442024b789979cc5f1e85 Mon Sep 17 00:00:00 2001 From: hugovasselin <waaaouu@gmail.com> Date: Thu, 23 May 2019 13:24:50 +0200 Subject: [PATCH 192/496] clean notebook --- notebooks/2. Text processing.ipynb | 589 ++++++++++------------------- 1 file changed, 192 insertions(+), 397 deletions(-) diff --git a/notebooks/2. Text processing.ipynb b/notebooks/2. Text processing.ipynb index 34e9338..6a6c0b5 100644 --- a/notebooks/2. Text processing.ipynb +++ b/notebooks/2. Text processing.ipynb @@ -4,60 +4,69 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "# Common text processing operations" + "# Text processing" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ - "# Tokenization" + "## Tokenization\n", + "\n", + "Several tokenizers are available. As you will see bellow, spaCy is much faster than the other implementations (Moses, NLTK) and often return better results. " ] }, { - "cell_type": "markdown", + "cell_type": "code", + "execution_count": 1, "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "[nltk_data] Downloading package punkt to /Users/hugo/nltk_data...\n", + "[nltk_data] Package punkt is already up-to-date!\n" + ] + } + ], "source": [ - "## Tokenizing French and English texts" + "from nautilus_nlp.preprocessing.tokenizer import tokenize, untokenize" ] }, { "cell_type": "code", - "execution_count": 5, + "execution_count": 2, "metadata": { "collapsed": true }, "outputs": [], "source": [ - "from nautilus_nlp.utils.tokenizer import tokenize, untokenize" + "fr_txt = \"Ceci est un texte français, j'adore 1 !\"\n", + "eng_txt = \"Let's play together!\"" ] }, { "cell_type": "code", - "execution_count": 6, + "execution_count": 3, "metadata": { "collapsed": true }, "outputs": [], "source": [ - "fr_txt = \"Ceci est un texte français, j'adore 1 !\"\n", - "eng_txt = \"Let's play together!\"" + "str_ = \"\"\"Les moteurs de recherche tels Google, Exalead ou Yahoo! sont des applications très connues de fouille de textes sur de grandes masses de données. Cependant, les moteurs de recherche ne se basent pas uniquement sur le texte pour l'indexer, mais également sur la façon dont les pages sont mises en valeur les unes par rapport aux autres. L'algorithme utilisé par Google est PageRank, et il est courant de voir HITS dans le milieu académique\"\"\"" ] }, { - "cell_type": "code", - "execution_count": 11, - "metadata": { - "collapsed": true - }, - "outputs": [], + "cell_type": "markdown", + "metadata": {}, "source": [ - "str_ = \"\"\"Les moteurs de recherche tels Google, Exalead ou Yahoo! sont des applications très connues de fouille de textes sur de grandes masses de données. Cependant, les moteurs de recherche ne se basent pas uniquement sur le texte pour l'indexer, mais également sur la façon dont les pages sont mises en valeur les unes par rapport aux autres. L'algorithme utilisé par Google est PageRank, et il est courant de voir HITS dans le milieu académique\"\"\"" + "### French spaCy" ] }, { "cell_type": "code", - "execution_count": 15, + "execution_count": 4, "metadata": { "scrolled": true }, @@ -66,119 +75,51 @@ "name": "stdout", "output_type": "stream", "text": [ - "CPU times: user 4.76 ms, sys: 31 µs, total: 4.79 ms\n", - "Wall time: 4.42 ms\n" + "CPU times: user 8.94 ms, sys: 1.24 ms, total: 10.2 ms\n", + "Wall time: 9.3 ms\n" ] - }, - { - "data": { - "text/plain": [ - "['Les',\n", - " 'moteurs',\n", - " 'de',\n", - " 'recherche',\n", - " 'tels',\n", - " 'Google',\n", - " ',',\n", - " 'Exalead',\n", - " 'ou',\n", - " 'Yahoo',\n", - " '!',\n", - " 'sont',\n", - " 'des',\n", - " 'applications',\n", - " 'très',\n", - " 'connues',\n", - " 'de',\n", - " 'fouille',\n", - " 'de',\n", - " 'textes',\n", - " 'sur',\n", - " 'de',\n", - " 'grandes',\n", - " 'masses',\n", - " 'de',\n", - " 'données',\n", - " '.',\n", - " 'Cependant',\n", - " ',',\n", - " 'les',\n", - " 'moteurs',\n", - " 'de',\n", - " 'recherche',\n", - " 'ne',\n", - " 'se',\n", - " 'basent',\n", - " 'pas',\n", - " 'uniquement',\n", - " 'sur',\n", - " 'le',\n", - " 'texte',\n", - " 'pour',\n", - " \"l'\",\n", - " 'indexer',\n", - " ',',\n", - " 'mais',\n", - " 'également',\n", - " 'sur',\n", - " 'la',\n", - " 'façon',\n", - " 'dont',\n", - " 'les',\n", - " 'pages',\n", - " 'sont',\n", - " 'mises',\n", - " 'en',\n", - " 'valeur',\n", - " 'les',\n", - " 'unes',\n", - " 'par',\n", - " 'rapport',\n", - " 'aux',\n", - " 'autres',\n", - " '.',\n", - " \"L'\",\n", - " 'algorithme',\n", - " 'utilisé',\n", - " 'par',\n", - " 'Google',\n", - " 'est',\n", - " 'PageRank',\n", - " ',',\n", - " 'et',\n", - " 'il',\n", - " 'est',\n", - " 'courant',\n", - " 'de',\n", - " 'voir',\n", - " 'HITS',\n", - " 'dans',\n", - " 'le',\n", - " 'milieu',\n", - " 'académique']" - ] - }, - "execution_count": 15, - "metadata": {}, - "output_type": "execute_result" } ], "source": [ "%%time\n", - "tokenize(str_, lang_module=\"fr_spacy\")" + "tokenized_fr_txt = tokenize(str_, lang_module=\"fr_spacy\")" ] }, { "cell_type": "code", - "execution_count": 14, + "execution_count": 5, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "CPU times: user 6.22 ms, sys: 94 µs, total: 6.31 ms\n", - "Wall time: 4.27 ms\n" + "['Les', 'moteurs', 'de', 'recherche', 'tels', 'Google', ',', 'Exalead', 'ou', 'Yahoo']\n" + ] + } + ], + "source": [ + "print(tokenized_fr_txt[:10])" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### French Moses" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "CPU times: user 18.2 s, sys: 82.5 ms, total: 18.3 s\n", + "Wall time: 18.5 s\n" ] } ], @@ -189,137 +130,85 @@ }, { "cell_type": "code", - "execution_count": 13, + "execution_count": 8, "metadata": {}, "outputs": [ { - "data": { - "text/plain": [ - "['Les',\n", - " 'moteurs',\n", - " 'de',\n", - " 'recherche',\n", - " 'tels',\n", - " 'Google',\n", - " ',',\n", - " 'Exalead',\n", - " 'ou',\n", - " 'Yahoo',\n", - " '!',\n", - " 'sont',\n", - " 'des',\n", - " 'applications',\n", - " 'très',\n", - " 'connues',\n", - " 'de',\n", - " 'fouille',\n", - " 'de',\n", - " 'textes',\n", - " 'sur',\n", - " 'de',\n", - " 'grandes',\n", - " 'masses',\n", - " 'de',\n", - " 'données',\n", - " '.',\n", - " 'Cependant',\n", - " ',',\n", - " 'les',\n", - " 'moteurs',\n", - " 'de',\n", - " 'recherche',\n", - " 'ne',\n", - " 'se',\n", - " 'basent',\n", - " 'pas',\n", - " 'uniquement',\n", - " 'sur',\n", - " 'le',\n", - " 'texte',\n", - " 'pour',\n", - " \"l'\",\n", - " 'indexer',\n", - " ',',\n", - " 'mais',\n", - " 'également',\n", - " 'sur',\n", - " 'la',\n", - " 'façon',\n", - " 'dont',\n", - " 'les',\n", - " 'pages',\n", - " 'sont',\n", - " 'mises',\n", - " 'en',\n", - " 'valeur',\n", - " 'les',\n", - " 'unes',\n", - " 'par',\n", - " 'rapport',\n", - " 'aux',\n", - " 'autres',\n", - " '.',\n", - " \"L'\",\n", - " 'algorithme',\n", - " 'utilisé',\n", - " 'par',\n", - " 'Google',\n", - " 'est',\n", - " 'PageRank',\n", - " ',',\n", - " 'et',\n", - " 'il',\n", - " 'est',\n", - " 'courant',\n", - " 'de',\n", - " 'voir',\n", - " 'HITS',\n", - " 'dans',\n", - " 'le',\n", - " 'milieu',\n", - " 'académique']" - ] - }, - "execution_count": 13, - "metadata": {}, - "output_type": "execute_result" + "name": "stdout", + "output_type": "stream", + "text": [ + "['Les', 'moteurs', 'de', 'recherche', 'tels', 'Google', ',', 'Exalead', 'ou', 'Yahoo']\n" + ] } ], "source": [ - "tokenize(str_, lang_module=\"fr_moses\")" + "print(tokenized_fr_txt[:10])" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### English spaCy" ] }, { "cell_type": "code", - "execution_count": 5, + "execution_count": 9, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "CPU times: user 24.3 ms, sys: 3.99 ms, total: 28.3 ms\n", - "Wall time: 26.2 ms\n" + "CPU times: user 1.24 ms, sys: 2 µs, total: 1.24 ms\n", + "Wall time: 1.25 ms\n" ] } ], "source": [ "%%time\n", - "tokenized_eng_txt = tokenize(eng_txt, lang_module=\"en_spacy\")\n", + "tokenized_eng_txt = tokenize(eng_txt, lang_module=\"en_spacy\")" + ] + }, + { + "cell_type": "code", + "execution_count": 22, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "['Let', \"'s\", 'play', 'together', '!']" + ] + }, + "execution_count": 22, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ "tokenized_eng_txt" ] }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### English NLTK " + ] + }, { "cell_type": "code", - "execution_count": 6, + "execution_count": 10, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "CPU times: user 17.3 ms, sys: 3.71 ms, total: 21 ms\n", - "Wall time: 26.9 ms\n" + "CPU times: user 11.2 ms, sys: 3.35 ms, total: 14.5 ms\n", + "Wall time: 16 ms\n" ] } ], @@ -333,7 +222,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "## You can also untokenize your text" + "## Un-tokenization" ] }, { @@ -341,6 +230,14 @@ "execution_count": 13, "metadata": {}, "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "CPU times: user 235 µs, sys: 1e+03 ns, total: 236 µs\n", + "Wall time: 243 µs\n" + ] + }, { "data": { "text/plain": [ @@ -353,27 +250,36 @@ } ], "source": [ + "%%time\n", "untokenize(tokenized_eng_txt,lang='en')" ] }, { "cell_type": "code", - "execution_count": 15, + "execution_count": 14, "metadata": {}, "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "CPU times: user 4.07 ms, sys: 181 µs, total: 4.25 ms\n", + "Wall time: 4.19 ms\n" + ] + }, { "data": { "text/plain": [ - "\"Ceci est un texte français, j' adore !\"" + "\"Les moteurs de recherche tels Google, Exalead ou Yahoo ! sont des applications très connues de fouille de textes sur de grandes masses de données. Cependant, les moteurs de recherche ne se basent pas uniquement sur le texte pour l' indexer, mais également sur la façon dont les pages sont mises en valeur les unes par rapport aux autres. L' algorithme utilisé par Google est PageRank, et il est courant de voir HITS dans le milieu académique\"" ] }, - "execution_count": 15, + "execution_count": 14, "metadata": {}, "output_type": "execute_result" } ], "source": [ - "# Here the \"J'adore\" is not handled in the right way\n", + "%%time\n", "untokenize(tokenized_fr_txt,lang='fr')" ] }, @@ -386,18 +292,16 @@ }, { "cell_type": "code", - "execution_count": 124, - "metadata": { - "collapsed": true - }, + "execution_count": 17, + "metadata": {}, "outputs": [], "source": [ - "from nautilus_nlp.utils.stemmer import stem_tokens" + "from nautilus_nlp.preprocessing.stemming import stem_tokens" ] }, { "cell_type": "code", - "execution_count": 125, + "execution_count": 23, "metadata": {}, "outputs": [ { @@ -406,7 +310,7 @@ "['i', 'surviv', 'these', 'dog']" ] }, - "execution_count": 125, + "execution_count": 23, "metadata": {}, "output_type": "execute_result" } @@ -417,7 +321,7 @@ }, { "cell_type": "code", - "execution_count": 128, + "execution_count": 26, "metadata": {}, "outputs": [ { @@ -426,13 +330,13 @@ "['je', 'mang', 'dan', 'le', 'cuisin', 'du', 'château']" ] }, - "execution_count": 128, + "execution_count": 26, "metadata": {}, "output_type": "execute_result" } ], "source": [ - "stem_tokens(tokenize(\"je mangerai dans les cuisines du château\"),lang='french')" + "stem_tokens(['je', 'mangerai', 'dans', 'les', 'cuisines', 'du', 'château'],lang='french')" ] }, { @@ -451,18 +355,25 @@ }, { "cell_type": "code", - "execution_count": 28, - "metadata": { - "collapsed": true - }, - "outputs": [], + "execution_count": 27, + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "[nltk_data] Downloading package wordnet to /Users/hugo/nltk_data...\n", + "[nltk_data] Package wordnet is already up-to-date!\n" + ] + } + ], "source": [ - "from nautilus_nlp.utils.lemmatizer import lemmatize_french_tokens" + "from nautilus_nlp.preprocessing.lemmatization import lemmatize_french_tokens" ] }, { "cell_type": "code", - "execution_count": 29, + "execution_count": 28, "metadata": {}, "outputs": [ { @@ -480,45 +391,38 @@ }, { "cell_type": "code", - "execution_count": 32, + "execution_count": 30, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "CPU times: user 37.9 ms, sys: 51.9 ms, total: 89.8 ms\n", - "Wall time: 65.3 ms\n" + "CPU times: user 20.3 ms, sys: 2.47 ms, total: 22.7 ms\n", + "Wall time: 20.6 ms\n" ] - }, - { - "data": { - "text/plain": [ - "['ceci',\n", - " 'être',\n", - " 'un',\n", - " 'texte',\n", - " 'français',\n", - " ',',\n", - " 'j',\n", - " \"'\",\n", - " 'adorer',\n", - " 't',\n", - " 'frite',\n", - " 'bien',\n", - " 'gras',\n", - " 'yolo',\n", - " '!']" - ] - }, - "execution_count": 32, - "metadata": {}, - "output_type": "execute_result" } ], "source": [ "%%time\n", - "lemmatize_french_tokens(txt_to_tokenize, module='spacy')" + "lemmatized_tokens = lemmatize_french_tokens(txt_to_tokenize, module='spacy')" + ] + }, + { + "cell_type": "code", + "execution_count": 31, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "['ceci', 'être', 'un', 'texte', 'français', ',', 'j', \"'\", 'adorer', 'ton', 'frit', 'bien', 'gras', 'yolo', '!']\n" + ] + } + ], + "source": [ + "print(lemmatized_tokens)" ] }, { @@ -530,27 +434,18 @@ }, { "cell_type": "code", - "execution_count": 1, + "execution_count": 34, "metadata": { "scrolled": true }, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "[nltk_data] Downloading package wordnet to /Users/hugo/nltk_data...\n", - "[nltk_data] Package wordnet is already up-to-date!\n" - ] - } - ], + "outputs": [], "source": [ - "from nautilus_nlp.utils.lemmatizer import lemmatize_english_tokens" + "from nautilus_nlp.preprocessing.lemmatization import lemmatize_english_tokens" ] }, { "cell_type": "code", - "execution_count": 2, + "execution_count": 35, "metadata": { "collapsed": true }, @@ -561,15 +456,15 @@ }, { "cell_type": "code", - "execution_count": 3, + "execution_count": 37, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "CPU times: user 27.2 ms, sys: 4.4 ms, total: 31.6 ms\n", - "Wall time: 31.3 ms\n" + "CPU times: user 16.9 ms, sys: 3.03 ms, total: 19.9 ms\n", + "Wall time: 16.8 ms\n" ] }, { @@ -578,7 +473,7 @@ "['the', 'strip', 'bat', 'be', 'hang', 'on', '-PRON-', 'foot', 'for', 'good']" ] }, - "execution_count": 3, + "execution_count": 37, "metadata": {}, "output_type": "execute_result" } @@ -590,15 +485,15 @@ }, { "cell_type": "code", - "execution_count": 4, + "execution_count": 41, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "CPU times: user 3.07 s, sys: 217 ms, total: 3.28 s\n", - "Wall time: 3.45 s\n" + "CPU times: user 2.58 s, sys: 141 ms, total: 2.72 s\n", + "Wall time: 2.73 s\n" ] }, { @@ -607,7 +502,7 @@ "['The', 'strip', 'bat', 'be', 'hang', 'on', 'their', 'foot', 'for', 'best']" ] }, - "execution_count": 4, + "execution_count": 41, "metadata": {}, "output_type": "execute_result" } @@ -626,27 +521,17 @@ }, { "cell_type": "code", - "execution_count": 1, + "execution_count": 42, "metadata": {}, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "[nltk_data] Downloading package punkt to /Users/hugo/nltk_data...\n", - "[nltk_data] Package punkt is already up-to-date!\n" - ] - } - ], + "outputs": [], "source": [ - "from nautilus_nlp.utils.preprocess import remove_stopwords\n", - "from nautilus_nlp.utils.tokenizer import tokenize\n", - "from nautilus_nlp.utils.constants import get_stopwords" + "from nautilus_nlp.preprocessing.preprocess import remove_stopwords\n", + "from nautilus_nlp.preprocessing.preprocess import get_stopwords" ] }, { "cell_type": "code", - "execution_count": 2, + "execution_count": 43, "metadata": { "collapsed": true }, @@ -657,7 +542,7 @@ }, { "cell_type": "code", - "execution_count": 3, + "execution_count": 44, "metadata": { "collapsed": true }, @@ -668,16 +553,16 @@ }, { "cell_type": "code", - "execution_count": 4, + "execution_count": 45, "metadata": {}, "outputs": [ { "data": { "text/plain": [ - "[\"J'ai\", 'beau', 'cheval']" + "[\"J'ai\", 'cheval']" ] }, - "execution_count": 4, + "execution_count": 45, "metadata": {}, "output_type": "execute_result" } @@ -688,16 +573,16 @@ }, { "cell_type": "code", - "execution_count": 6, + "execution_count": 46, "metadata": {}, "outputs": [ { "data": { "text/plain": [ - "[\"J'\", 'beau', 'cheval']" + "[\"J'\", 'cheval']" ] }, - "execution_count": 6, + "execution_count": 46, "metadata": {}, "output_type": "execute_result" } @@ -705,96 +590,6 @@ "source": [ "remove_stopwords(tokenize(text, lang_module=\"fr_spacy\"),FRENCH_SW)" ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Fix bad encoding\n", - "\n", - "Sometimes you messed up you encoding saving files, and you don't know how to fix this." - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "from nautilus_nlp.utils.preprocess import fix_bad_unicode\n", - "from nautilus_nlp.utils import file_loader" - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "bad_unicode=file_loader.open_textfile('./bad_encoding.txt')" - ] - }, - { - "cell_type": "code", - "execution_count": 8, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "\"Les augmentations de rémunérations\\nrénover l'enquête publique pour en faire un vrai outil d'aménagement du territoire et de dialogue social\\nLimitations de vitesse et sécurité routière\\nPour un nouveau contrat citoyen\\nDévelopper les démarches de budget participatif dans les collectivités et associer les citoyens dans la réalisation des projets\\nproportienelle\\nPour plus de démocratie participative\\nTransparence de la vie public\\n18 mois de trop....ca suffit macron\\nEgalité devant les infractions routières\\nMesures d'urgence pour une démocratie régénérée\\nSORTIR DU GRAND EST ! REOUR A LA REGION ALSACE\\nPour plus de transparence\\nEcoutez enfin le peuple.\\nVote obligatoire\\nAvis d'un citoyen ordinaire et socialiste - vive le RIC\\nsuppression du 80 km/h\\nproportionelle et immigration\\nRevoir les plafonds des aides sociales\\nProposition de Refondation du Capitalisme et d'Instauration d'un Dividende Universel Financées par l'Épargne.\\nSuppression du sénat\\nLimitation de vitesse Ã\\xa0 80km\"" - ] - }, - "execution_count": 8, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "bad_unicode[0:1000]" - ] - }, - { - "cell_type": "code", - "execution_count": 9, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "\"Les augmentations de rémunérations\\nrénover l'enquête publique pour en faire un vrai outil d'aménagement du territoire et de dialogue social\\nLimitations de vitesse et sécurité routière\\nPour un nouveau contrat citoyen\\nDévelopper les démarches de budget participatif dans les collectivités et associer les citoyens dans la réalisation des projets\\nproportienelle\\nPour plus de démocratie participative\\nTransparence de la vie public\\n18 mois de trop....ca suffit macron\\nEgalité devant les infractions routières\\nMesures d'urgence pour une démocratie régénérée\\nSORTIR DU GRAND EST ! REOUR A LA REGION ALSACE\\nPour plus de transparence\\nEcoutez enfin le peuple.\\nVote obligatoire\\nAvis d'un citoyen ordinaire et socialiste - vive le RIC\\nsuppression du 80 km/h\\nproportionelle et immigration\\nRevoir les plafonds des aides sociales\\nProposition de Refondation du Capitalisme et d'Instauration d'un Dividende Universel Financées par l'Épargne.\\nSuppression du sénat\\nLimitation de vitesse à 80km/h sur les routes départ\"" - ] - }, - "execution_count": 9, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "fix_bad_unicode(bad_unicode)[0:1000]" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [] } ], "metadata": { From c579ec8c7b88e2c2f78b93b257f4f4d4b2cc6052 Mon Sep 17 00:00:00 2001 From: hugovasselin <waaaouu@gmail.com> Date: Thu, 23 May 2019 13:38:47 +0200 Subject: [PATCH 193/496] fix unit tests --- tests/test_lemmatization.py | 6 +++--- tests/test_phone_number.py | 2 +- tests/test_tokenizer.py | 6 +++--- 3 files changed, 7 insertions(+), 7 deletions(-) diff --git a/tests/test_lemmatization.py b/tests/test_lemmatization.py index 3ddf675..3d766ee 100644 --- a/tests/test_lemmatization.py +++ b/tests/test_lemmatization.py @@ -9,14 +9,14 @@ def test_lemmatize_french_tokens_spacy(): def test_lemmatize_english_tokens_spacy(): - input_tokens = ['The', 'striped', 'bats', 'are', 'hanging', 'on', 'their', 'feet', 'for', 'best'] + input_tokens = ['The', 'strip', 'bats', 'are', 'hanging', 'on', 'their', 'feet', 'for', 'best'] expected = ['the', 'strip', 'bat', 'be', 'hang', 'on', '-PRON-', 'foot', 'for', 'good'] - res = lemmatize_french_tokens(input_tokens, module='spacy') + res = lemmatize_english_tokens(input_tokens, module='spacy') assert res == expected def test_lemmatize_english_tokens_nltk(): input_tokens = ['The', 'striped', 'bats', 'are', 'hanging', 'on', 'their', 'feet', 'for', 'best'] expected = ['The', 'strip', 'bat', 'be', 'hang', 'on', 'their', 'foot', 'for', 'best'] - res = lemmatize_french_tokens(input_tokens, module='nltk') + res = lemmatize_english_tokens(input_tokens, module='nltk') assert res == expected \ No newline at end of file diff --git a/tests/test_phone_number.py b/tests/test_phone_number.py index d6edc69..61fe9a6 100644 --- a/tests/test_phone_number.py +++ b/tests/test_phone_number.py @@ -5,7 +5,7 @@ def test_extract_phone_number(): input_str = '(541) 754-3010 is a US. Phone' expected = ['(541) 754-3010', '754-3010'] res = phone.extract_phone_numbers(input_str, countrylist=phone.SUPPORTED_COUNTRY) - assert res == expected + assert sorted(res) == sorted(expected) def test_extract_phone_number_us(): input_str = '(541) 754-3010 is a US. Phone' diff --git a/tests/test_tokenizer.py b/tests/test_tokenizer.py index ea95f47..744de9d 100644 --- a/tests/test_tokenizer.py +++ b/tests/test_tokenizer.py @@ -40,7 +40,7 @@ def test_untokenize_en(): assert res == expected def test_untokenize_fr(): - input_str = ['Les', 'moteurs', 'de', 'recherche', 'tels', 'Google', ',', 'Exalead', 'ou', 'Yahoo', '!', 'sont', 'des', 'applications', 'très', 'connues', 'de', 'fouille', 'de', 'textes', 'sur', 'de', 'grandes', 'masses', 'de', 'données', '.', 'Cependant', ',', 'les', 'moteurs', 'de', 'recherche', 'ne', 'se', 'basent', 'pas', 'uniquement', 'sur', 'le', 'texte', 'pour', "l'", 'indexer', ',', 'mais', 'également', 'sur', 'la', 'façon', 'dont', 'les', 'pages', 'sont', 'mises', 'en', 'valeur', 'les', 'unes', 'par', 'rapport', 'aux', 'autres', '.', "L'", 'algorithme', 'utilisé', 'par', 'Google', 'est', 'PageRank', ',', 'et', 'il', 'est', 'courant', 'de', 'voir', 'HITS', 'dans', 'le', 'milieu', 'académique'] - expected = "Les moteurs de recherche tels Google, Exalead ou Yahoo ! sont des applications très connues de fouille de textes sur de grandes masses de données. Cependant, les moteurs de recherche ne se basent pas uniquement sur le texte pour l' indexer, mais également sur la façon dont les pages sont mises en valeur les unes par rapport aux autres. L' algorithme utilisé par Google est PageRank, et il est courant de voir HITS dans le milieu académique" - res = untokenize(input_str,lang='en') + input_str = ['Les', 'moteurs', 'de', 'recherche', 'tels', 'Google', ',', 'Exalead', 'ou', 'Yahoo', '!'] + expected = "Les moteurs de recherche tels Google, Exalead ou Yahoo !" + res = untokenize(input_str,lang='fr') assert res == expected \ No newline at end of file From a597e27f37dc7042e7a3fbb530aa269bc965596d Mon Sep 17 00:00:00 2001 From: hugovasselin <waaaouu@gmail.com> Date: Thu, 23 May 2019 15:25:41 +0200 Subject: [PATCH 194/496] add test lemma --- tests/test_lemmatization.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/test_lemmatization.py b/tests/test_lemmatization.py index 3d766ee..ce205f4 100644 --- a/tests/test_lemmatization.py +++ b/tests/test_lemmatization.py @@ -19,4 +19,4 @@ def test_lemmatize_english_tokens_nltk(): input_tokens = ['The', 'striped', 'bats', 'are', 'hanging', 'on', 'their', 'feet', 'for', 'best'] expected = ['The', 'strip', 'bat', 'be', 'hang', 'on', 'their', 'foot', 'for', 'best'] res = lemmatize_english_tokens(input_tokens, module='nltk') - assert res == expected \ No newline at end of file + assert res == expected \ No newline at end of file From ceedef412f9d35256a2444ded72d68a78cdc38b9 Mon Sep 17 00:00:00 2001 From: hugovasselin <waaaouu@gmail.com> Date: Thu, 23 May 2019 15:26:20 +0200 Subject: [PATCH 195/496] add benchmark #87 --- .../Benchmark text processing tools.ipynb | 823 ++++++++++++++++++ 1 file changed, 823 insertions(+) create mode 100644 notebooks/Benchmark text processing tools.ipynb diff --git a/notebooks/Benchmark text processing tools.ipynb b/notebooks/Benchmark text processing tools.ipynb new file mode 100644 index 0000000..08ff2af --- /dev/null +++ b/notebooks/Benchmark text processing tools.ipynb @@ -0,0 +1,823 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Text processing tools benchmark" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "from urllib import request" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Load french text" + ] + }, + { + "cell_type": "code", + "execution_count": 157, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "url = \"https://www.gutenberg.org/cache/epub/5711/pg5711.txt\"" + ] + }, + { + "cell_type": "code", + "execution_count": 158, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "response = request.urlopen(url)\n", + "rawfr = response.read().decode('utf8')" + ] + }, + { + "cell_type": "code", + "execution_count": 159, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "The Project Gutenberg EBook of Germinal, by Emile Zola\r\n", + "(#8 in our series by Emile Zola)\r\n", + "\r\n", + "Copyright laws are changing all over the world. Be sure to check the\r\n", + "copyright laws for your country before downloading or redistributing\r\n", + "this or any other Project Gutenberg eBook.\r\n", + "\r\n", + "This header should be the first thing seen when viewing this Project\r\n", + "Gutenberg file. Please do not remove it. Do not change or edit the\r\n", + "header without written permission.\r\n", + "\r\n", + "Please read the \"legal small print,\" and ot\n" + ] + } + ], + "source": [ + "print(rawfr[:500])" + ] + }, + { + "cell_type": "code", + "execution_count": 160, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "str" + ] + }, + "execution_count": 160, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "type(rawfr)" + ] + }, + { + "cell_type": "code", + "execution_count": 161, + "metadata": { + "scrolled": true + }, + "outputs": [ + { + "data": { + "text/plain": [ + "1046377" + ] + }, + "execution_count": 161, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "len(rawfr)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Load english text" + ] + }, + { + "cell_type": "code", + "execution_count": 163, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "url = \"http://www.gutenberg.org/files/2554/2554-0.txt\"" + ] + }, + { + "cell_type": "code", + "execution_count": 164, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "response = request.urlopen(url)\n", + "raw = response.read().decode('utf8')" + ] + }, + { + "cell_type": "code", + "execution_count": 169, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "The Project Gutenberg EBook of Crime and Punishment, by Fyodor Dostoevsky\r\n", + "\r\n", + "This eBook is for the use of anyone anywhere at no cost and with\r\n", + "almost no restrictions whatsoever. You may copy it, give it away or\r\n", + "re-use it under the terms of the Project Gutenberg License included\r\n", + "with this eBook or online at www.gutenberg.org\r\n", + "\r\n", + "\r\n", + "Title: Crime and Punishment\r\n", + "\r\n", + "Author: Fyodor Dostoevsky\r\n", + "\r\n", + "Release Date: March 28, 2006 [EBook #2554]\r\n", + "Last Updated: October 27, 2016\r\n", + "\r\n", + "Language: English\r\n", + "\r\n", + "Charac\n" + ] + } + ], + "source": [ + "print(raw[:500])" + ] + }, + { + "cell_type": "code", + "execution_count": 166, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "str" + ] + }, + "execution_count": 166, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "type(raw)" + ] + }, + { + "cell_type": "code", + "execution_count": 167, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "1176967" + ] + }, + "execution_count": 167, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "len(raw)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Tokenization\n", + "\n", + "Several tokenizers are available. As you will see bellow, spaCy is much faster than the other implementations (Moses, NLTK) and often return better results. " + ] + }, + { + "cell_type": "code", + "execution_count": 106, + "metadata": {}, + "outputs": [], + "source": [ + "from nautilus_nlp.preprocessing.tokenizer import tokenize, untokenize" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### French spaCy" + ] + }, + { + "cell_type": "code", + "execution_count": 112, + "metadata": { + "scrolled": true + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "CPU times: user 1.18 s, sys: 44 ms, total: 1.22 s\n", + "Wall time: 1.24 s\n" + ] + } + ], + "source": [ + "%%time\n", + "tokenized = tokenize(rawfr[:1000000], lang_module=\"fr_spacy\")" + ] + }, + { + "cell_type": "code", + "execution_count": 125, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "920 ms ± 18.4 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)\n" + ] + } + ], + "source": [ + "%%timeit\n", + "tokenized = tokenize(rawfr[:1000000], lang_module=\"fr_spacy\")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### French Moses" + ] + }, + { + "cell_type": "code", + "execution_count": 115, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "CPU times: user 21.7 s, sys: 289 ms, total: 22 s\n", + "Wall time: 22.4 s\n" + ] + } + ], + "source": [ + "%%time\n", + "tokenized_moses = tokenize(rawfr[:1000000], lang_module=\"fr_moses\")" + ] + }, + { + "cell_type": "code", + "execution_count": 126, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "2.54 s ± 27 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)\n" + ] + } + ], + "source": [ + "%%timeit\n", + "tokenized_moses = tokenize(rawfr[:1000000], lang_module=\"fr_moses\")" + ] + }, + { + "cell_type": "code", + "execution_count": 119, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "spacy: 227009 tokens\n", + "moses: 202475 tokens\n" + ] + } + ], + "source": [ + "print('spacy: {} tokens\\nmoses: {} tokens'.format(len(tokenized),len(tokenized_moses)))" + ] + }, + { + "cell_type": "code", + "execution_count": 123, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "['se', 'diriger', 'vers', 'les', '\\r\\n', 'bâtiments', ',', 'il', 'se', 'risqua', 'enfin', 'à', 'gravir', 'le', 'terri', 'sur', 'lequel', 'brûlaient', '\\r\\n', 'les', 'trois', 'feux', 'de', 'houille', ',', 'dans', 'des', 'corbeilles', 'de', 'fonte', ',', 'pour', 'éclairer', '\\r\\n', 'et', 'réchauffer', 'la', 'besogne', '.', ' ', 'Les', 'ouvriers', 'de', 'la', 'coupe', 'à', 'terre', 'avaient', 'dû', '\\r\\n', 'travailler', 'tard', ',', 'on', 'sortait', 'encore', 'les', 'débris', 'inutiles', '.', ' ', 'Maintenant', ',', '\\r\\n', 'il', 'entendait', 'les', 'moulineurs', 'pousser', 'les', 'trains', 'sur', 'les', 'tréteaux', ',', 'il', '\\r\\n', 'distinguait', 'des', 'ombres', 'vivantes', 'culbutant', 'les', 'berlines', ',', 'près', 'de', 'chaque', '\\r\\n', 'feu', '.', '\\r\\n\\r\\n', '--Bonjour', ',', 'dit', '-', 'il', 'en', \"s'\", 'approchant', \"d'\", 'une', 'des', 'corbeilles', '.', '\\r\\n\\r\\n', 'Tournant', 'le', 'dos', 'au', 'brasier', ',', 'le', 'charretier', 'était', 'debout', ',', 'un', 'vieillard', '\\r\\n', 'vêtu', \"d'\", 'un', 'tricot', 'de', 'laine', 'violette', ',', 'coiffé', \"d'\", 'une', 'casquette', 'en', 'poil', 'de', '\\r\\n', 'lapin', ';', 'pendant', 'que', 'son', 'cheval', ',', 'un', 'gros', 'cheval', 'jaune', ',', 'attendait', ',', 'dans', '\\r\\n', 'une', 'immobilité', 'de', 'pierre', ',', \"qu'\", 'on', 'eût', 'vidé', 'les', 'six', 'berlines', 'montées', 'par', '\\r\\n', 'lui', '.', ' ', 'Le', 'manoeuvre', 'employé', 'au', 'culbuteur', ',', 'un', 'gaillard', 'roux', 'et', '\\r\\n', 'efflanqué', ',', 'ne', 'se', 'pressait', 'guère', ',', 'pesait', 'sur', 'le', 'levier', \"d'\", 'une', 'main', '\\r\\n', 'endormie', '.', ' ', 'Et']\n" + ] + } + ], + "source": [ + "print(tokenized[1000:1200])" + ] + }, + { + "cell_type": "code", + "execution_count": 124, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "['le', 'dos', 'au', 'brasier', ',', 'le', 'charretier', 'était', 'debout', ',', 'un', 'vieillard', 'vêtu', \"d'\", 'un', 'tricot', 'de', 'laine', 'violette', ',', 'coiffé', \"d'\", 'une', 'casquette', 'en', 'poil', 'de', 'lapin', ';', 'pendant', 'que', 'son', 'cheval', ',', 'un', 'gros', 'cheval', 'jaune', ',', 'attendait', ',', 'dans', 'une', 'immobilité', 'de', 'pierre', ',', \"qu'\", 'on', 'eût', 'vidé', 'les', 'six', 'berlines', 'montées', 'par', 'lui', '.', 'Le', 'manoeuvre', 'employé', 'au', 'culbuteur', ',', 'un', 'gaillard', 'roux', 'et', 'efflanqué', ',', 'ne', 'se', 'pressait', 'guère', ',', 'pesait', 'sur', 'le', 'levier', \"d'\", 'une', 'main', 'endormie', '.', 'Et', ',', 'là-haut', ',', 'le', 'vent', 'redoublait', ',', 'une', 'bise', 'glaciale', ',', 'dont', 'les', 'grandes', 'haleines', 'régulières', 'passaient', 'comme', 'des', 'coups', 'de', 'faux', '.', '--Bonjour', ',', 'répondit', 'le', 'vieux', '.', 'Un', 'silence', 'se', 'fit', '.', \"L'\", 'homme', ',', 'qui', 'se', 'sentait', 'regardé', \"d'\", 'un', 'oeil', 'méfiant', ',', 'dit', 'son', 'nom', 'tout', 'de', 'suite', '.', '--Je', 'me', 'nomme', 'Étienne', 'Lantier', ',', 'je', 'suis', 'machineur', '...', 'Il', \"n'\", 'y', 'a', 'pas', 'de', 'travail', 'ici', '?', 'Les', 'flammes', \"l'\", 'éclairaient', ',', 'il', 'devait', 'avoir', 'vingt', 'et', 'un', 'ans', ',', 'très', 'brun', ',', 'joli', 'homme', ',', \"l'\", 'air', 'fort', 'malgré', 'ses', 'membres', 'menus', '.', 'Rassuré', ',', 'le', 'charretier', 'hochait', 'la', 'tête', '.', '--Du', 'travail', 'pour', 'un', 'machineur', ',', 'non', ',']\n" + ] + } + ], + "source": [ + "print(tokenized_moses[1000:1200])" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### English spaCy" + ] + }, + { + "cell_type": "code", + "execution_count": 170, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "CPU times: user 5 s, sys: 102 ms, total: 5.1 s\n", + "Wall time: 5.17 s\n" + ] + } + ], + "source": [ + "%%time\n", + "tokenized_eng = tokenize(raw[:1000000], lang_module=\"en_spacy\")" + ] + }, + { + "cell_type": "code", + "execution_count": 171, + "metadata": { + "scrolled": true + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "5.26 s ± 740 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)\n" + ] + } + ], + "source": [ + "%%timeit\n", + "tokenize(raw[:1000000], lang_module=\"en_spacy\")" + ] + }, + { + "cell_type": "code", + "execution_count": 172, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "['\\ufeffThe',\n", + " 'Project',\n", + " 'Gutenberg',\n", + " 'EBook',\n", + " 'of',\n", + " 'Crime',\n", + " 'and',\n", + " 'Punishment',\n", + " ',',\n", + " 'by']" + ] + }, + "execution_count": 172, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "tokenized_eng[:10]" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### English NLTK " + ] + }, + { + "cell_type": "code", + "execution_count": 173, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "CPU times: user 2.17 s, sys: 29.3 ms, total: 2.2 s\n", + "Wall time: 2.22 s\n" + ] + } + ], + "source": [ + "%%time\n", + "tokenized_eng_nltk = tokenize(raw[:1000000], lang_module=\"en_nltk\")" + ] + }, + { + "cell_type": "code", + "execution_count": 174, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "2.47 s ± 565 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)\n" + ] + } + ], + "source": [ + "%%timeit\n", + "tokenize(raw[:1000000], lang_module=\"en_nltk\")" + ] + }, + { + "cell_type": "code", + "execution_count": 175, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "['\\ufeffThe',\n", + " 'Project',\n", + " 'Gutenberg',\n", + " 'EBook',\n", + " 'of',\n", + " 'Crime',\n", + " 'and',\n", + " 'Punishment',\n", + " ',',\n", + " 'by']" + ] + }, + "execution_count": 175, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "tokenized_eng_nltk[:10]" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Stemming " + ] + }, + { + "cell_type": "code", + "execution_count": 135, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "from nautilus_nlp.preprocessing.stemming import stem_tokens" + ] + }, + { + "cell_type": "code", + "execution_count": 136, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "CPU times: user 7.91 s, sys: 37.3 ms, total: 7.95 s\n", + "Wall time: 7.98 s\n" + ] + } + ], + "source": [ + "%%time\n", + "stem = stem_tokens(tokenized,lang='french')" + ] + }, + { + "cell_type": "code", + "execution_count": 137, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "8.48 s ± 682 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)\n" + ] + } + ], + "source": [ + "%%timeit\n", + "stem_tokens(tokenized,lang='french')" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Lemmatization" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## French " + ] + }, + { + "cell_type": "code", + "execution_count": 138, + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "[nltk_data] Downloading package wordnet to /Users/hugo/nltk_data...\n", + "[nltk_data] Package wordnet is already up-to-date!\n", + "[nltk_data] Downloading package averaged_perceptron_tagger to\n", + "[nltk_data] /Users/hugo/nltk_data...\n", + "[nltk_data] Package averaged_perceptron_tagger is already up-to-\n", + "[nltk_data] date!\n" + ] + } + ], + "source": [ + "from nautilus_nlp.preprocessing.lemmatization import lemmatize_french_tokens" + ] + }, + { + "cell_type": "code", + "execution_count": 141, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "from nautilus_nlp.preprocessing.preprocess import remove_tokens_with_nonletters" + ] + }, + { + "cell_type": "code", + "execution_count": 143, + "metadata": { + "scrolled": true + }, + "outputs": [], + "source": [ + "tokenized = remove_tokens_with_nonletters(tokenized)" + ] + }, + { + "cell_type": "code", + "execution_count": 144, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "CPU times: user 26.7 s, sys: 6.91 s, total: 33.6 s\n", + "Wall time: 36.5 s\n" + ] + } + ], + "source": [ + "%%time\n", + "lemmatized_tokens = lemmatize_french_tokens(tokenized, module='spacy')" + ] + }, + { + "cell_type": "code", + "execution_count": 155, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "['de', 'puits', 'le', 'vaste', 'chambre', 'de', 'le', 'machine', 'extraction', 'le', 'tourelle', 'de', 'le', 'pompe', 'ce', 'fosse', 'au', 'fondre', 'un', 'creux', 'avec', 'son', 'construction', 'trapu', 'de', 'brique', 'dresser', 'son', 'comme', 'un', 'corne', 'luire', 'sembler', 'avoir', 'un', 'air', 'mauver', 'de', 'goulu', 'accroupie', 'pour', 'manger', 'le', 'monde', 'tout', 'en', 'examiner', 'il', 'songer', 'luire', 'son', 'existence', 'de', 'vagabond', 'depuis', 'huit', 'jour', 'il', 'chercher', 'un', 'place', 'il', 'se', 'revoir', 'dans', 'son', 'atelier', 'de', 'chemin', 'de', 'fer', 'gifler', 'son', 'chef', 'de', 'Lille', 'de', 'partout', 'le', 'samedi', 'il', 'Marchiennes', 'on', 'dire', 'il', 'y', 'avoir', 'de', 'travail', 'aux', 'Forges', 'et', 'rien', 'ni', 'aux', 'Forges', 'ni', 'chez', 'Sonneville', 'il', 'avoir', 'passer', 'le', 'dimanche', 'sou', 'le', 'bois', 'un', 'chantier', 'de', 'charronnage', 'dont', 'le', 'surveillant', 'venir', 'de', 'expulser', 'deux', 'heure', 'de', 'le', 'nuit', 'Rien', 'plus', 'un', 'sou', 'pas', 'un', 'aller', 'il', 'faire', 'ainsi', 'par', 'le', 'chemin', 'sans', 'but', 'ne', 'savoir', 'seulement', 'abriter', 'contre', 'le', 'bise', 'oui', 'bien', 'un', 'fosse', 'le', 'rare', 'lanterne', 'le', 'carreau', 'un', 'porte', 'brusquement', 'ouvrir', 'luire', 'avoir', 'permettre', 'entrevoir', 'le', 'foyer', 'un', 'dans', 'un', 'vive', 'il', 'expliquer', 'de', 'le', 'pompe', 'ce', 'respiration', 'gros', 'et', 'long', 'souffler', 'sans', 'qui', 'comme', 'halein', 'de', 'monstre', 'le', 'manoeuvre', 'de', 'culbuteur', 'gonfler', 'le', 'dos', 'avoir', 'pas', 'le', 'oeil', 'sur', 'et', 'celui', 'ci', 'aller']\n" + ] + } + ], + "source": [ + "print(lemmatized_tokens[1000:1200])" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## English" + ] + }, + { + "cell_type": "code", + "execution_count": 147, + "metadata": { + "collapsed": true, + "scrolled": true + }, + "outputs": [], + "source": [ + "from nautilus_nlp.preprocessing.lemmatization import lemmatize_english_tokens" + ] + }, + { + "cell_type": "code", + "execution_count": 180, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "tokenized_eng = remove_tokens_with_nonletters(tokenized_eng)" + ] + }, + { + "cell_type": "code", + "execution_count": 181, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "CPU times: user 29.3 s, sys: 6.85 s, total: 36.2 s\n", + "Wall time: 38.3 s\n" + ] + } + ], + "source": [ + "%%time\n", + "lemmatized_eng = lemmatize_english_tokens(tokenized_eng, module='spacy')" + ] + }, + { + "cell_type": "code", + "execution_count": 182, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "CPU times: user 34.4 s, sys: 3.82 s, total: 38.2 s\n", + "Wall time: 39.4 s\n" + ] + } + ], + "source": [ + "%%time\n", + "lemmatized_eng_nltk = lemmatize_english_tokens(tokenized_eng, module='nltk')" + ] + }, + { + "cell_type": "code", + "execution_count": 186, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "['feel', 'ashamed', 'He', 'was', 'hopelessly', 'in', 'debt', 'to', 'his', 'landlady', 'and', 'was', 'afraid', 'of', 'meeting', 'her', 'This', 'was', 'not', 'because', 'he', 'was', 'cowardly', 'and', 'abject', 'quite', 'the', 'contrary', 'but', 'for', 'some', 'time', 'past', 'he', 'had', 'been', 'in', 'an', 'overstrained', 'irritable', 'condition', 'verging', 'on', 'hypochondria', 'He', 'had', 'become', 'so', 'completely', 'absorbed', 'in', 'himself', 'and', 'isolated', 'from', 'his', 'fellows', 'that', 'he', 'dreaded', 'meeting', 'not', 'only', 'his', 'landlady', 'but', 'anyone', 'at', 'all', 'He', 'was', 'crushed', 'by', 'poverty', 'but', 'the', 'anxieties', 'of', 'his', 'position', 'had', 'of', 'late', 'ceased', 'to', 'weigh', 'upon', 'him', 'He', 'had', 'given', 'up', 'attending', 'to', 'matters', 'of', 'practical', 'importance', 'he', 'had', 'lost', 'all', 'desire', 'to', 'do', 'so', 'Nothing', 'that', 'any', 'landlady', 'could', 'do', 'had', 'a', 'real', 'terror', 'for', 'him', 'But', 'to', 'be', 'stopped', 'on', 'the', 'stairs', 'to', 'be', 'forced', 'to', 'listen', 'to', 'her', 'trivial', 'irrelevant', 'gossip', 'to', 'pestering', 'demands', 'for', 'payment', 'threats', 'and', 'complaints', 'and', 'to', 'rack', 'his', 'brains', 'for', 'excuses', 'to', 'prevaricate', 'to', 'lie', 'no', 'rather', 'than', 'that', 'he', 'would', 'creep', 'down', 'the', 'stairs', 'like', 'a', 'cat', 'and', 'slip', 'out', 'unseen', 'This', 'evening', 'however', 'on', 'coming', 'out', 'into', 'the', 'street', 'he', 'became', 'acutely', 'aware', 'of', 'his', 'fears', 'I', 'want', 'to', 'attempt', 'a', 'thing', 'like', 'that', 'and', 'am', 'frightened', 'by', 'these']\n" + ] + } + ], + "source": [ + "print(tokenized_eng[1000:1200])" + ] + }, + { + "cell_type": "code", + "execution_count": 184, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "['feel', 'ashamed', '-PRON-', 'be', 'hopelessly', 'in', 'debt', 'to', '-PRON-', 'landlady', 'and', 'be', 'afraid', 'of', 'meet', '-PRON-', 'This', 'be', 'not', 'because', '-PRON-', 'be', 'cowardly', 'and', 'abject', 'quite', 'the', 'contrary', 'but', 'for', 'some', 'time', 'past', '-PRON-', 'have', 'be', 'in', 'an', 'overstrained', 'irritable', 'condition', 'verge', 'on', 'hypochondria', '-PRON-', 'have', 'become', 'so', 'completely', 'absorb', 'in', '-PRON-', 'and', 'isolate', 'from', '-PRON-', 'fellow', 'that', '-PRON-', 'dread', 'meeting', 'not', 'only', '-PRON-', 'landlady', 'but', 'anyone', 'at', 'all', '-PRON-', 'be', 'crush', 'by', 'poverty', 'but', 'the', 'anxiety', 'of', '-PRON-', 'position', 'have', 'of', 'late', 'cease', 'to', 'weigh', 'upon', '-PRON-', '-PRON-', 'have', 'give', 'up', 'attend', 'to', 'matter', 'of', 'practical', 'importance', '-PRON-', 'have', 'lose', 'all', 'desire', 'to', 'do', 'so', 'Nothing', 'that', 'any', 'landlady', 'could', 'do', 'have', 'a', 'real', 'terror', 'for', '-PRON-', 'but', 'to', 'be', 'stop', 'on', 'the', 'stair', 'to', 'be', 'force', 'to', 'listen', 'to', '-PRON-', 'trivial', 'irrelevant', 'gossip', 'to', 'pester', 'demand', 'for', 'payment', 'threat', 'and', 'complaint', 'and', 'to', 'rack', '-PRON-', 'brain', 'for', 'excuse', 'to', 'prevaricate', 'to', 'lie', 'no', 'rather', 'than', 'that', '-PRON-', 'would', 'creep', 'down', 'the', 'stair', 'like', 'a', 'cat', 'and', 'slip', 'out', 'unseen', 'This', 'evening', 'however', 'on', 'come', 'out', 'into', 'the', 'street', '-PRON-', 'become', 'acutely', 'aware', 'of', '-PRON-', 'fear', '-PRON-', 'want', 'to', 'attempt', 'a', 'thing', 'like', 'that', 'and', 'be', 'frighten', 'by', 'these']\n" + ] + } + ], + "source": [ + "print(lemmatized_eng[1000:1200])" + ] + }, + { + "cell_type": "code", + "execution_count": 185, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "['feel', 'ashamed', 'He', 'be', 'hopelessly', 'in', 'debt', 'to', 'his', 'landlady', 'and', 'be', 'afraid', 'of', 'meeting', 'her', 'This', 'be', 'not', 'because', 'he', 'be', 'cowardly', 'and', 'abject', 'quite', 'the', 'contrary', 'but', 'for', 'some', 'time', 'past', 'he', 'have', 'be', 'in', 'an', 'overstrain', 'irritable', 'condition', 'verge', 'on', 'hypochondria', 'He', 'have', 'become', 'so', 'completely', 'absorbed', 'in', 'himself', 'and', 'isolated', 'from', 'his', 'fellow', 'that', 'he', 'dread', 'meeting', 'not', 'only', 'his', 'landlady', 'but', 'anyone', 'at', 'all', 'He', 'be', 'crush', 'by', 'poverty', 'but', 'the', 'anxiety', 'of', 'his', 'position', 'have', 'of', 'late', 'cease', 'to', 'weigh', 'upon', 'him', 'He', 'have', 'give', 'up', 'attend', 'to', 'matter', 'of', 'practical', 'importance', 'he', 'have', 'lose', 'all', 'desire', 'to', 'do', 'so', 'Nothing', 'that', 'any', 'landlady', 'could', 'do', 'have', 'a', 'real', 'terror', 'for', 'him', 'But', 'to', 'be', 'stop', 'on', 'the', 'stair', 'to', 'be', 'force', 'to', 'listen', 'to', 'her', 'trivial', 'irrelevant', 'gossip', 'to', 'pester', 'demand', 'for', 'payment', 'threat', 'and', 'complaint', 'and', 'to', 'rack', 'his', 'brain', 'for', 'excuse', 'to', 'prevaricate', 'to', 'lie', 'no', 'rather', 'than', 'that', 'he', 'would', 'creep', 'down', 'the', 'stair', 'like', 'a', 'cat', 'and', 'slip', 'out', 'unseen', 'This', 'even', 'however', 'on', 'come', 'out', 'into', 'the', 'street', 'he', 'become', 'acutely', 'aware', 'of', 'his', 'fear', 'I', 'want', 'to', 'attempt', 'a', 'thing', 'like', 'that', 'and', 'be', 'frighten', 'by', 'these']\n" + ] + } + ], + "source": [ + "print(lemmatized_eng_nltk[1000:1200])" + ] + } + ], + "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.7.0" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} From 2f6de6f0dafe4d125855a1d75c539c897a60249b Mon Sep 17 00:00:00 2001 From: Robin <rdoume@gmail.com> Date: Thu, 23 May 2019 16:39:57 +0200 Subject: [PATCH 196/496] Remove list comprehension in the spacy tokenizer --- nautilus_nlp/utils/tokenizer.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/nautilus_nlp/utils/tokenizer.py b/nautilus_nlp/utils/tokenizer.py index a009533..526185b 100644 --- a/nautilus_nlp/utils/tokenizer.py +++ b/nautilus_nlp/utils/tokenizer.py @@ -39,10 +39,10 @@ def tokenize(text: str, lang_module: str = 'en_spacy'): return nltk.word_tokenize(text) elif lang_module is 'en_spacy': spacydoc = english_spacy(text) - return [tokens.text for tokens in spacydoc] + return list(spacydoc) elif lang_module is 'fr_spacy': spacydoc = french_spacy(text) - return [tokens.text for tokens in spacydoc] + return list(spacydoc) elif lang_module is 'fr_moses': t = MosesTokenizer(lang='fr') return t.tokenize(text, escape=False) From 5424bedcfb7b8d0cbd283c9872e9a0535e85b755 Mon Sep 17 00:00:00 2001 From: hugovasselin <waaaouu@gmail.com> Date: Thu, 23 May 2019 16:53:21 +0200 Subject: [PATCH 197/496] add data folder --- .gitignore | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/.gitignore b/.gitignore index 83457f9..ca31cb0 100644 --- a/.gitignore +++ b/.gitignore @@ -95,4 +95,6 @@ target/ !/nautilus_nlp/data/lang_identification.ftz # PyTest cache -.pytest_cache/ \ No newline at end of file +.pytest_cache/ + +data/ \ No newline at end of file From 040cfbb91dc7ee53b527c44ef624c1cc407f8c65 Mon Sep 17 00:00:00 2001 From: hugovasselin <waaaouu@gmail.com> Date: Thu, 23 May 2019 18:30:56 +0200 Subject: [PATCH 198/496] improve TfidfTextVectorizer --- .../preprocessing/text_vectorizers.py | 173 +++-- .../3. Text Vectorization - TF-IDF.ipynb | 717 ++++++++++++++++++ notebooks/TF-IDF.ipynb | 353 --------- 3 files changed, 835 insertions(+), 408 deletions(-) create mode 100644 notebooks/3. Text Vectorization - TF-IDF.ipynb delete mode 100644 notebooks/TF-IDF.ipynb diff --git a/nautilus_nlp/preprocessing/text_vectorizers.py b/nautilus_nlp/preprocessing/text_vectorizers.py index 60c05d4..68fa172 100644 --- a/nautilus_nlp/preprocessing/text_vectorizers.py +++ b/nautilus_nlp/preprocessing/text_vectorizers.py @@ -6,11 +6,13 @@ import numpy as np import math -from sklearn.feature_extraction.text import TfidfVectorizer, TfidfTransformer +from sklearn.feature_extraction.text import TfidfVectorizer as _TfidfVectorizer -class Tfidf(object): +class TfidfTextVectorizer(object): """ + Convert a collection of raw documents to a matrix of TF-IDF features. + Inputs a list of string. and the list of feature name. Wrapper of https://scikit-learn.org/stable/modules/generated/sklearn.feature_extraction.text.TfidfVectorizer.html @@ -22,56 +24,64 @@ class Tfidf(object): stop_words=None, token_pattern=’(?u)\b\w\w+\b’, ngram_range=(1, 1), max_df=1.0, min_df=1, max_features=None, vocabulary=None, binary=False, dtype=<class ‘numpy.float64’>, norm=’l2’, use_idf=True, smooth_idf=True, sublinear_tf=False - - Returns - ------- - list - Outputs a tuple with the wordcount vector matrix """ def __init__(self, **kwargs): - self.tfidf_vectorizer = TfidfVectorizer(**kwargs) - - def _compute_wordcount_vector(self, documents): - ''' - Input a list of documents (string) - Output the wordcount vector matrix - ''' - self.word_count_vector = self.tfidf_vectorizer.fit_transform(documents) - return self.word_count_vector - + self.tfidf_vectorizer = _TfidfVectorizer(**kwargs) + def _get_features_name(self): + ''' + Array mapping from feature integer indices to feature name + ''' self.feature_names = self.tfidf_vectorizer.get_feature_names() return self.feature_names - - def _compute_idf(self): - self.tfidf_transformer=TfidfTransformer(smooth_idf=True, use_idf=True) - self.tfidf_transformer.fit(self.word_count_vector) - return self.word_count_vector - - def compute_tfidf(self, documents): - self._compute_wordcount_vector(documents) + def compute_tfidf(self, raw_documents): + ''' + Learn vocabulary and idf, return term-document matrix. + + Input a list of documents (string) + Output the wordcount vector matrix. + + params + ------ + raw_documents : iterable + an iterable which yields either str, unicode or file objects + + returns + ------- + X : sparse matrix, [n_samples, n_features] + Tf-idf-weighted document-term matrix. + ''' + self.word_count_vector = self.tfidf_vectorizer.fit_transform(raw_documents) self._get_features_name() - self._compute_idf() - return self.word_count_vector + return self.word_count_vector - def transform_doc(self, document): + def apply_tfidf_to_documents(self, raw_document): ''' - Transform documents to document-term matrix. + Apply the tf-idf weights to a document or a list of documents. + Equivalent to .transform() method in sci-kit learn. + + Uses the vocabulary and document frequencies (df) learned by fit + (or fit_transform), and convert documents to document-term matrix. + + parameters + --------- + raw_documents : iterable or document + an iterable which yields either str, unicode or file objects, or + a string. Returns ------- - Tf-idf-weighted document-term matrix. + X : sparse matrix, [n_samples, n_features] + Tf-idf-weighted document-term matrix. ''' - return self.tfidf_transformer.transform(document) - - def _apply_tfidf_to_doc(self, text): - '''generate tf-idf for the given document''' - return self.tfidf_transformer.transform(self.tfidf_vectorizer.transform([text])) + if type(raw_document) == str: + raw_document = [raw_document] + return self.tfidf_vectorizer.transform(raw_document) def _sort_coo(self, coo_matrix): @@ -104,21 +114,55 @@ def _extract_topn_from_vector(self, feature_names, sorted_items, topn=10): return results - - def get_top_tfidf_per_doc(self, text, n=10): - '''compute TF-IDF for a given doc, and returns a list of the top N weighted words''' - tf_idf_vector= self._apply_tfidf_to_doc(text) + + def get_top_tfidf_per_doc(self, text:str, n:int=10)->list: + ''' + compute TF-IDF for a given doc, and returns a list of the top N weighted words + + parameters + --------- + text : sparse matrix, [n_samples, n_features] + If specified, will return the top weighted words for the given matrix, + otherwise will give the result of the tf-idf matrix + a string. + + n : number of terms to display + + Returns + ------- + top-n weighted terms : dict + List of top terms for the given document + ''' + tf_idf_vector= self.apply_tfidf_to_documents([text]) sorted_items=self._sort_coo(tf_idf_vector.tocoo()) return list(self._extract_topn_from_vector(self.feature_names, sorted_items, n).keys()) - def get_top_tfidf(self, n=10): - '''returns a dict of the top N weighted words, with their weight''' - return self._extract_topn_from_vector(self.feature_names, self._sort_coo(self.word_count_vector.tocoo()), topn=n) + + def get_top_tfidf(self, tfidf_matrix=None, n:int=10)->list: + ''' + Input a tf-idf matrix, and returns a dict of the top N weighted words, + with their weight. + + parameters + --------- + tfidf_matrix : sparse matrix, [n_samples, n_features] + If specified, will return the top weighted words for the given matrix, + otherwise will give the result of the tf-idf matrix + a string. + + Returns + ------- + top-n weighted terms : dict + Dict of top terms and their associated weighted. + ''' + if tfidf_matrix is None: + tfidf_matrix = self.word_count_vector + return self._extract_topn_from_vector(self.feature_names, self._sort_coo(tfidf_matrix.tocoo()), topn=n) -class Text_Vectorizer(object): +class GensimTextVectorizer(object): ''' - TODO: DOCSTRING + Gensim's implementation of TF-IDF, BOW models etc. ''' def __init__(self, doc_list): # Initialize @@ -150,64 +194,83 @@ def _preprocess(self, doc_list): docs_dict = self._get_docs_dict(docs) return nlp, docs, docs_dict - # Gensim can again be used to create a bag-of-words representation of each document, - # build the TF-IDF model, - # and compute the TF-IDF vector for each document. + def _get_tfidf(self, docs, docs_dict): + ''' + Gensim can again be used to create a bag-of-words representation of each document, + Build the TF-IDF model, and compute the TF-IDF vector for each document. + ''' docs_corpus = [docs_dict.doc2bow(doc) for doc in docs] model_tfidf = TfidfModel(docs_corpus, id2word=docs_dict) docs_tfidf = model_tfidf[docs_corpus] docs_vecs = np.vstack([sparse2full(c, len(docs_dict)) for c in docs_tfidf]) return docs_vecs - # Get avg w2v for one document def _document_vector(self, doc, docs_dict, nlp): - # remove out-of-vocabulary words + """ + Get avg w2v for one document. Remove out-of-vocabulary words. + """ + doc_vector = [nlp(word).vector for word in doc if word in docs_dict.token2id] return np.mean(doc_vector, axis=0) - # Get average vector for document list def avg_wv(self): + ''' + Get average vector for document list + ''' docs_vecs = np.vstack( [self._document_vector(doc, self.docs_dict, self.nlp) for doc in self.docs] ) return docs_vecs - # Get TF-IDF vector for document list + def get_tfidf(self): + ''' + Get TF-IDF vector for document list + ''' docs_corpus = [self.docs_dict.doc2bow(doc) for doc in self.docs] model_tfidf = TfidfModel(docs_corpus, id2word=self.docs_dict) docs_tfidf = model_tfidf[docs_corpus] docs_vecs = np.vstack([sparse2full(c, len(self.docs_dict)) for c in docs_tfidf]) return docs_vecs - # Get Latent Semantic Indexing(LSI) vector for document list + def get_lsi(self, num_topics=300): + ''' + Get Latent Semantic Indexing(LSI) vector for document list + ''' docs_corpus = [self.docs_dict.doc2bow(doc) for doc in self.docs] model_lsi = models.LsiModel(docs_corpus, num_topics, id2word=self.docs_dict) docs_lsi = model_lsi[docs_corpus] docs_vecs = np.vstack([sparse2full(c, len(self.docs_dict)) for c in docs_lsi]) return docs_vecs - # Get Random Projections(RP) vector for document list + def get_rp(self): + ''' + Get Random Projections(RP) vector for document list + ''' docs_corpus = [self.docs_dict.doc2bow(doc) for doc in self.docs] model_rp = models.RpModel(docs_corpus, id2word=self.docs_dict) docs_rp = model_rp[docs_corpus] docs_vecs = np.vstack([sparse2full(c, len(self.docs_dict)) for c in docs_rp]) return docs_vecs - # Get Latent Dirichlet Allocation(LDA) vector for document list def get_lda(self, num_topics=100): + ''' + Get Latent Dirichlet Allocation(LDA) vector for document list + ''' docs_corpus = [self.docs_dict.doc2bow(doc) for doc in self.docs] model_lda = models.LdaModel(docs_corpus, num_topics, id2word=self.docs_dict) docs_lda = model_lda[docs_corpus] docs_vecs = np.vstack([sparse2full(c, len(self.docs_dict)) for c in docs_lda]) return docs_vecs - # Get Hierarchical Dirichlet Process(HDP) vector for document list def get_hdp(self): + ''' + Get Hierarchical Dirichlet Process(HDP) vector for document list + ''' docs_corpus = [self.docs_dict.doc2bow(doc) for doc in self.docs] model_hdp = models.HdpModel(docs_corpus, id2word=self.docs_dict) docs_hdp = model_hdp[docs_corpus] diff --git a/notebooks/3. Text Vectorization - TF-IDF.ipynb b/notebooks/3. Text Vectorization - TF-IDF.ipynb new file mode 100644 index 0000000..6e54f01 --- /dev/null +++ b/notebooks/3. Text Vectorization - TF-IDF.ipynb @@ -0,0 +1,717 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Text vectorization - TF-IDF" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Open files" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": { + "scrolled": false + }, + "outputs": [], + "source": [ + "import pandas as pd" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [], + "source": [ + "df = pd.read_csv('https://storage.googleapis.com/dataset-uploader/bbc/bbc-text.csv')" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "<div>\n", + "<style scoped>\n", + " .dataframe tbody tr th:only-of-type {\n", + " vertical-align: middle;\n", + " }\n", + "\n", + " .dataframe tbody tr th {\n", + " vertical-align: top;\n", + " }\n", + "\n", + " .dataframe thead th {\n", + " text-align: right;\n", + " }\n", + "</style>\n", + "<table border=\"1\" class=\"dataframe\">\n", + " <thead>\n", + " <tr style=\"text-align: right;\">\n", + " <th></th>\n", + " <th>category</th>\n", + " <th>text</th>\n", + " </tr>\n", + " </thead>\n", + " <tbody>\n", + " <tr>\n", + " <th>0</th>\n", + " <td>tech</td>\n", + " <td>tv future in the hands of viewers with home th...</td>\n", + " </tr>\n", + " <tr>\n", + " <th>1</th>\n", + " <td>business</td>\n", + " <td>worldcom boss left books alone former worldc...</td>\n", + " </tr>\n", + " <tr>\n", + " <th>2</th>\n", + " <td>sport</td>\n", + " <td>tigers wary of farrell gamble leicester say ...</td>\n", + " </tr>\n", + " <tr>\n", + " <th>3</th>\n", + " <td>sport</td>\n", + " <td>yeading face newcastle in fa cup premiership s...</td>\n", + " </tr>\n", + " <tr>\n", + " <th>4</th>\n", + " <td>entertainment</td>\n", + " <td>ocean s twelve raids box office ocean s twelve...</td>\n", + " </tr>\n", + " </tbody>\n", + "</table>\n", + "</div>" + ], + "text/plain": [ + " category text\n", + "0 tech tv future in the hands of viewers with home th...\n", + "1 business worldcom boss left books alone former worldc...\n", + "2 sport tigers wary of farrell gamble leicester say ...\n", + "3 sport yeading face newcastle in fa cup premiership s...\n", + "4 entertainment ocean s twelve raids box office ocean s twelve..." + ] + }, + "execution_count": 3, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "df.head()" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "sport 511\n", + "business 510\n", + "politics 417\n", + "tech 401\n", + "entertainment 386\n", + "Name: category, dtype: int64" + ] + }, + "execution_count": 4, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "df.category.value_counts()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Preprocess" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "[nltk_data] Downloading package punkt to /Users/hugo/nltk_data...\n", + "[nltk_data] Package punkt is already up-to-date!\n", + "[nltk_data] Downloading package wordnet to /Users/hugo/nltk_data...\n", + "[nltk_data] Package wordnet is already up-to-date!\n", + "[nltk_data] Downloading package averaged_perceptron_tagger to\n", + "[nltk_data] /Users/hugo/nltk_data...\n", + "[nltk_data] Package averaged_perceptron_tagger is already up-to-\n", + "[nltk_data] date!\n" + ] + } + ], + "source": [ + "from nautilus_nlp.preprocessing.tokenizer import tokenize\n", + "from nautilus_nlp.preprocessing.lemmatization import lemmatize_english_tokens" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "CPU times: user 3min 16s, sys: 15.2 s, total: 3min 31s\n", + "Wall time: 3min 50s\n" + ] + } + ], + "source": [ + "%%time\n", + "df['tokens'] = df.text.apply(lambda row: tokenize(row))\n", + "df['tokens'] = df.tokens.apply(lambda row: lemmatize_english_tokens(row))\n", + "df['tokens'] = df.tokens.apply(lambda row: ' '.join(row))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Split dataframe" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": {}, + "outputs": [], + "source": [ + "from sklearn.model_selection import train_test_split" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "train, test = train_test_split(df, test_size=0.2)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Compute TF-IDF" + ] + }, + { + "cell_type": "code", + "execution_count": 63, + "metadata": {}, + "outputs": [], + "source": [ + "from nautilus_nlp.preprocessing.text_vectorizers import TfidfTextVectorizer" + ] + }, + { + "cell_type": "code", + "execution_count": 64, + "metadata": {}, + "outputs": [], + "source": [ + "tfidf = Tfidf(max_df=0.95, #ignore terms that have a document frequency strictly higher \n", + " min_df=0.01,\n", + " max_features=10000,\n", + " encoding='utf-8',\n", + " #stop_words=SW,\n", + " norm=None,\n", + " #ngram_range=(1, 2))\n", + " )" + ] + }, + { + "cell_type": "code", + "execution_count": 65, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "TfidfVectorizer(analyzer='word', binary=False, decode_error='strict',\n", + " dtype=<class 'numpy.float64'>, encoding='utf-8', input='content',\n", + " lowercase=True, max_df=0.95, max_features=10000, min_df=0.01,\n", + " ngram_range=(1, 1), norm=None, preprocessor=None, smooth_idf=True,\n", + " stop_words=None, strip_accents=None, sublinear_tf=False,\n", + " token_pattern='(?u)\\\\b\\\\w\\\\w+\\\\b', tokenizer=None, use_idf=True,\n", + " vocabulary=None)" + ] + }, + "execution_count": 65, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# uses Sci-kit learn TfidfVectorizer()\n", + "# You can pass all the arguments supported by sci-kit \n", + "# Doc : https://scikit-learn.org/stable/modules/generated/sklearn.feature_extraction.text.TfidfVectorizer.html\n", + "tfidf.tfidf_vectorizer" + ] + }, + { + "cell_type": "code", + "execution_count": 66, + "metadata": {}, + "outputs": [], + "source": [ + "list_of_docs = list(train.tokens)" + ] + }, + { + "cell_type": "code", + "execution_count": 67, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "['coach ranieri sack by valencia claudio ranieri have be sack as valencia coach just eight month after take charge at the primera liga club for the second time in -PRON- career . the decision be take at a board meeting follow the side s surprise elimination from the uefa cup . -PRON- understand and -PRON- understand that the result in the last few week have not be the most appropriate say club president juan bautista . former assistant antonio lopez will take over as the new coach . italian ranieri take over the valencia job in june 2004 have be replace at chelsea by jose mourinho . thing begin well but the spanish champion extend -PRON- winless streak to six after lose to race santander last weekend . that defeat be then follow by a uefa cup exit at the hand of steaua bucharest . ranieri first take charge of valencia in 1997 guide -PRON- to the king s cup and help -PRON- to qualify for the champion league . the 54-year - old then move to atletico madrid in 1999 before join chelsea the following year .',\n", + " 'fox too reliant on reality tv the head of -PRON- tv network fox have admit the broadcaster have rely too heavily on reality tv show such as the poor - rating who s -PRON- daddy . chief executive gail berman say in the case of this fall -PRON- drift to too much on the unscripted side . the series who s -PRON- daddy where a young woman try to pick -PRON- natural father for a cash prize cause outrage from adoption group and rate badly . last season fox s prime - time audience fall by 600 000 to 5.9 million . ms berman say : i think the audience expect loud thing from fox . sometimes -PRON- work and sometimes -PRON- don t. who s -PRON- daddy the first episode of which be show on 3 january pull in a disappointing audience of 6.3 million accord to the nielsen rating system . five other episode of the show have also be film will be drop from fox s schedule ms berman say . -PRON- be predict a drop in rating even for some of the network s establish reality show such as american idol which be due to start -PRON- fourth series this week . fox have unveil a new strategy last year promise to launch new show every season include the traditionally quiet summer season . though that have meet with a poor reception ms berman say there s no question that the audience in -PRON- mind be ready willing and able to accept new programming in the summer . fox have change this plan launch new show in may instead of june . one of the new show will be the animate series american dad make by seth macfarlane the creator of family guy . that series after become a hit on dvd be also set to return with new episode .']" + ] + }, + "execution_count": 67, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "list_of_docs[:2]" + ] + }, + { + "cell_type": "code", + "execution_count": 68, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "<1780x2631 sparse matrix of type '<class 'numpy.float64'>'\n", + "\twith 253961 stored elements in Compressed Sparse Row format>" + ] + }, + "execution_count": 68, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# Compute the word count vector matrix.\n", + "# will apply \n", + "tfidf.compute_tfidf(list_of_docs)" + ] + }, + { + "cell_type": "code", + "execution_count": 69, + "metadata": { + "scrolled": true + }, + "outputs": [ + { + "data": { + "text/plain": [ + "{'song': 324.615,\n", + " 'wage': 316.535,\n", + " 'roddick': 293.646,\n", + " 'minimum': 249.423,\n", + " 'music': 73.292,\n", + " 'zealand': 158.674,\n", + " 'robbie': 157.772,\n", + " 'terrorist': 153.899,\n", + " 'good': 150.616,\n", + " 'gadget': 110.235,\n", + " 'game': 72.458,\n", + " 'party': 129.043,\n", + " 'increase': 126.747,\n", + " '25': 124.598,\n", + " 'hunt': 91.696,\n", + " 'pay': 119.675,\n", + " 'muslim': 112.338,\n", + " 'student': 111.842,\n", + " 'threat': 104.862,\n", + " 'black': 74.54,\n", + " 'liverpool': 102.93,\n", + " 'child': 100.285,\n", + " 'airline': 97.48,\n", + " 'stone': 96.591,\n", + " 'mini': 84.296,\n", + " 'jamie': 94.213,\n", + " 'play': 93.087,\n", + " 'virus': 86.885,\n", + " 'film': 91.146,\n", + " 'hour': 91.019,\n", + " 'spam': 90.217,\n", + " 'halo': 88.648,\n", + " 'mobile': 88.555,\n", + " 'edward': 88.215,\n", + " 'lord': 87.918,\n", + " 'search': 69.985,\n", + " 'wale': 86.423,\n", + " 'yuko': 75.514,\n", + " 'government': 85.639,\n", + " 'serve': 82.564,\n", + " 'machine': 82.494,\n", + " 'pension': 80.303,\n", + " 'asylum': 80.242,\n", + " 'actress': 79.333,\n", + " 'that': 78.981,\n", + " 'online': 78.916,\n", + " 'council': 77.999,\n", + " 'cash': 77.595,\n", + " 'fraud': 77.403,\n", + " 'musician': 77.291,\n", + " 'actor': 76.803,\n", + " 'gaming': 76.749,\n", + " 'lee': 76.256,\n", + " 'site': 75.507,\n", + " 'argentina': 74.892,\n", + " 'attack': 74.878,\n", + " 'award': 74.606,\n", + " 'business': 74.087,\n", + " 'broadband': 74.083,\n", + " 'hip': 73.725,\n", + " 'mail': 72.974,\n", + " 'not': 72.792,\n", + " 'aviator': 72.647,\n", + " 'japan': 72.55,\n", + " 'what': 72.332,\n", + " 'chart': 72.264,\n", + " 'document': 72.234,\n", + " 'jackson': 72.138,\n", + " 'card': 71.933,\n", + " 'deutsche': 71.647,\n", + " 'point': 71.343,\n", + " 'vote': 71.299,\n", + " 'radio': 71.215,\n", + " 'china': 70.847,\n", + " 'police': 70.759,\n", + " 'poster': 70.121,\n", + " 'phone': 69.937,\n", + " 'file': 69.836,\n", + " 'dvd': 69.522,\n", + " 'apple': 69.522,\n", + " 'spanish': 69.42}" + ] + }, + "execution_count": 69, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# Get highest-weighted words\n", + "tfidf.get_top_tfidf(n=100)" + ] + }, + { + "cell_type": "code", + "execution_count": 70, + "metadata": { + "scrolled": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "['cup', 'coach', 'sack', 'chelsea', 'take', 'understand', 'champion', 'club', 'charge', 'qualify']\n", + "['fox', 'audience', 'show', 'rating', 'episode', 'reality', 'series', 'ms', 'new', 'season']\n", + "['member', 'share', 'qualify', 'profit', '42', 'payment', 'society', 'than', 'building', 'worth']\n", + "['inflation', 'rate', 'rise', 'move', 'growth', 'flexibility', 'percentage', 'borrowing', 'economic', 'interest']\n", + "['profit', 'drug', 'treatment', 'disappointing', '2005', 'sale', '5bn', 'development', 'fall', 'year']\n", + "['woman', 'ministry', 'employ', 'prince', 'foreign', 'say', 'minister', 'news', 'difficulty', 'acquire']\n", + "['brown', 'labour', 'mr', 'blair', 'election', 'outline', 'manifesto', 'role', 'article', 'writing']\n", + "['iraq', 'bank', 'alexander', 'foreign', 'economy', 'many', 'work', 'mr', 'private', 'people']\n", + "['win', 'liverpool', 'trophy', 'steven', 'think', 'league', 'draw', 'champion', 'only', 'side']\n", + "['rating', 'bbc', 'prove', 'network', 'series', 'lose', 'slot', 'comeback', 'desperate', 'reportedly']\n" + ] + } + ], + "source": [ + "# Get highest-weighted words per document\n", + "for doc in list_of_docs[:10]:\n", + " print(tfidf.get_top_tfidf_per_doc(doc,n=10))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Apply Tf-idf to new documents" + ] + }, + { + "cell_type": "code", + "execution_count": 71, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "<div>\n", + "<style scoped>\n", + " .dataframe tbody tr th:only-of-type {\n", + " vertical-align: middle;\n", + " }\n", + "\n", + " .dataframe tbody tr th {\n", + " vertical-align: top;\n", + " }\n", + "\n", + " .dataframe thead th {\n", + " text-align: right;\n", + " }\n", + "</style>\n", + "<table border=\"1\" class=\"dataframe\">\n", + " <thead>\n", + " <tr style=\"text-align: right;\">\n", + " <th></th>\n", + " <th>category</th>\n", + " <th>text</th>\n", + " <th>tokens</th>\n", + " </tr>\n", + " </thead>\n", + " <tbody>\n", + " <tr>\n", + " <th>1992</th>\n", + " <td>tech</td>\n", + " <td>us peer-to-peer pirates convicted the first co...</td>\n", + " <td>-PRON- peer - to - peer pirate convict the fir...</td>\n", + " </tr>\n", + " <tr>\n", + " <th>1281</th>\n", + " <td>sport</td>\n", + " <td>hewitt falls to dent lleyton hewitt suffered a...</td>\n", + " <td>hewitt fall to dent lleyton hewitt suffer a sh...</td>\n", + " </tr>\n", + " <tr>\n", + " <th>844</th>\n", + " <td>tech</td>\n", + " <td>why cell will get the hard sell the world is c...</td>\n", + " <td>why cell will get the hard sell the world be c...</td>\n", + " </tr>\n", + " <tr>\n", + " <th>1188</th>\n", + " <td>entertainment</td>\n", + " <td>belle named best scottish band belle & sebas...</td>\n", + " <td>belle name good scottish band belle & se...</td>\n", + " </tr>\n", + " <tr>\n", + " <th>1573</th>\n", + " <td>business</td>\n", + " <td>karachi stocks hit historic high the karachi s...</td>\n", + " <td>karachi stock hit historic high the karachi st...</td>\n", + " </tr>\n", + " </tbody>\n", + "</table>\n", + "</div>" + ], + "text/plain": [ + " category text \\\n", + "1992 tech us peer-to-peer pirates convicted the first co... \n", + "1281 sport hewitt falls to dent lleyton hewitt suffered a... \n", + "844 tech why cell will get the hard sell the world is c... \n", + "1188 entertainment belle named best scottish band belle & sebas... \n", + "1573 business karachi stocks hit historic high the karachi s... \n", + "\n", + " tokens \n", + "1992 -PRON- peer - to - peer pirate convict the fir... \n", + "1281 hewitt fall to dent lleyton hewitt suffer a sh... \n", + "844 why cell will get the hard sell the world be c... \n", + "1188 belle name good scottish band belle & se... \n", + "1573 karachi stock hit historic high the karachi st... " + ] + }, + "execution_count": 71, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "test.head()" + ] + }, + { + "cell_type": "code", + "execution_count": 72, + "metadata": { + "scrolled": true + }, + "outputs": [ + { + "data": { + "text/plain": [ + "1992 [peer, copyright, piracy, network, plead, guil...\n", + "1281 [seed, hewitt, break, feel, beat, strong, four...\n", + "844 [cell, processor, technology, sony, computer, ...\n", + "1188 [scottish, band, brit, musical, list, act, awa...\n", + "1573 [market, stock, analyst, political, index, mon...\n", + "687 [film, institute, news, trend, broadcast, cite...\n", + "1830 [rule, consumer, mobile, firm, service, phone,...\n", + "1134 [net, standard, dr, address, work, challenge, ...\n", + "1015 [rugby, glasgow, edinburgh, murray, border, ro...\n", + "1665 [olympic, football, game, career, woman, final...\n", + "1648 [referee, apologise, arsenal, match, assistant...\n", + "487 [club, manager, return, at, unveil, jone, as, ...\n", + "1124 [lewis, council, labour, football, wage, gover...\n", + "1094 [gold, debt, relief, reserve, meeting, price, ...\n", + "744 [advert, drug, article, medical, employee, let...\n", + "939 [musical, theatre, stage, kelly, absolute, per...\n", + "1742 [creative, art, technology, graphic, bt, engin...\n", + "1368 [debt, relief, brown, uk, chancellor, poverty,...\n", + "880 [child, film, original, screen, show, that, mo...\n", + "136 [sing, tune, theme, die, perform, singer, show...\n", + "376 [olympic, test, athlete, decision, appeal, mot...\n", + "1558 [newcastle, henry, season, game, play, arsenal...\n", + "521 [bt, broadband, customer, call, offer, free, i...\n", + "1760 [goal, score, didn, win, that, good, spirit, p...\n", + "34 [guilty, plead, insurance, investigation, exec...\n", + "881 [election, young, electoral, vote, commission,...\n", + "302 [euro, company, sport, possible, family, analy...\n", + "515 [actress, notice, immigration, india, work, ye...\n", + "932 [period, quarter, athletic, growth, earning, s...\n", + "1084 [drug, cheap, europe, sell, africa, aid, afric...\n", + " ... \n", + "1853 [sequel, star, box, office, weekend, robert, d...\n", + "1390 [labour, blair, cabinet, minister, serve, stan...\n", + "743 [liverpool, league, champion, season, competit...\n", + "715 [lee, film, man, create, book, series, release...\n", + "1842 [alliance, japanese, shareholder, car, talk, s...\n", + "499 [argentina, debt, accept, offer, 6bn, investor...\n", + "461 [musical, sir, film, actress, richard, child, ...\n", + "902 [mobile, tv, service, music, handset, download...\n", + "1014 [tory, tax, howard, cut, election, taxis, plan...\n", + "446 [broadband, tv, analyst, number, research, net...\n", + "222 [jump, title, championship, mark, european, se...\n", + "884 [union, merger, super, executive, hold, meetin...\n", + "1483 [fight, german, band, liam, officer, fine, kic...\n", + "1325 [ask, search, site, entry, web, acquisition, i...\n", + "1257 [prime, mr, blair, chancellor, minister, brown...\n", + "725 [plant, india, factory, indian, official, cons...\n", + "1679 [mail, virus, warn, infect, internet, computer...\n", + "714 [express, financial, american, spin, off, sell...\n", + "1864 [opera, voice, feature, available, page, appea...\n", + "2068 [game, political, campaign, video, learn, tool...\n", + "1651 [deutsche, exchange, bid, stock, talk, cash, o...\n", + "1610 [film, voice, robert, will, girl, actress, web...\n", + "516 [campaign, labour, brown, mr, election, role, ...\n", + "2059 [brown, mr, blair, labour, mps, party, electio...\n", + "841 [france, wale, injury, slam, grand, ireland, n...\n", + "221 [tour, tournament, prize, king, each, gamer, s...\n", + "421 [talent, decide, agree, star, midfielder, play...\n", + "1075 [game, video, company, news, tag, art, as, eye...\n", + "1601 [france, against, wale, ireland, play, england...\n", + "986 [relay, service, phone, language, video, peopl...\n", + "Name: tokens, Length: 445, dtype: object" + ] + }, + "execution_count": 72, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "test.tokens.apply(lambda row: tfidf.get_top_tfidf_per_doc(row))" + ] + }, + { + "cell_type": "code", + "execution_count": 73, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "test_tfidf_matrix = tfidf.apply_tfidf_to_documents(list(test.tokens))" + ] + }, + { + "cell_type": "code", + "execution_count": 74, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "{'cell': 94.188,\n", + " 'mobile': 92.405,\n", + " 'camera': 90.674,\n", + " 'mini': 89.254,\n", + " 'china': 87.516,\n", + " 'rugby': 85.906,\n", + " 'film': 82.031,\n", + " 'bt': 76.256}" + ] + }, + "execution_count": 74, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "tfidf.get_top_tfidf(test_tfidf_matrix)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": true + }, + "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.7.0" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/notebooks/TF-IDF.ipynb b/notebooks/TF-IDF.ipynb deleted file mode 100644 index 9e36e8b..0000000 --- a/notebooks/TF-IDF.ipynb +++ /dev/null @@ -1,353 +0,0 @@ -{ - "cells": [ - { - "cell_type": "code", - "execution_count": 1, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "import re" - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "import pandas as pd\n", - "import json" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Open a dataset" - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "df = pd.read_csv('../data/df_mess_analysed.csv',\n", - " encoding='utf8',\n", - " delimiter=';',\n", - " usecols=['chrn_gaz','stm_clean','offre']\n", - " )" - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "df = df[(df.offre == 'DUAL') | (df.offre == 'GAZ')]" - ] - }, - { - "cell_type": "code", - "execution_count": 5, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "df.stm_clean = df.stm_clean.apply(lambda row: re.findall(\"\\w+\",row))" - ] - }, - { - "cell_type": "code", - "execution_count": 6, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "<div>\n", - "<style scoped>\n", - " .dataframe tbody tr th:only-of-type {\n", - " vertical-align: middle;\n", - " }\n", - "\n", - " .dataframe tbody tr th {\n", - " vertical-align: top;\n", - " }\n", - "\n", - " .dataframe thead th {\n", - " text-align: right;\n", - " }\n", - "</style>\n", - "<table border=\"1\" class=\"dataframe\">\n", - " <thead>\n", - " <tr style=\"text-align: right;\">\n", - " <th></th>\n", - " <th>offre</th>\n", - " <th>chrn_gaz</th>\n", - " <th>stm_clean</th>\n", - " </tr>\n", - " </thead>\n", - " <tbody>\n", - " <tr>\n", - " <th>0</th>\n", - " <td>DUAL</td>\n", - " <td>0</td>\n", - " <td>[mettr, jour, adress, palenci, bourg]</td>\n", - " </tr>\n", - " <tr>\n", - " <th>1</th>\n", - " <td>DUAL</td>\n", - " <td>0</td>\n", - " <td>[souhait, modifi, adress, mail, etre, contacte...</td>\n", - " </tr>\n", - " <tr>\n", - " <th>2</th>\n", - " <td>DUAL</td>\n", - " <td>0</td>\n", - " <td>[prochain, factur, disponibl, compt]</td>\n", - " </tr>\n", - " <tr>\n", - " <th>3</th>\n", - " <td>DUAL</td>\n", - " <td>0</td>\n", - " <td>[index, factur, aout, net, superieur, realit, ...</td>\n", - " </tr>\n", - " <tr>\n", - " <th>4</th>\n", - " <td>DUAL</td>\n", - " <td>0</td>\n", - " <td>[savoir, factur, annuel, pai]</td>\n", - " </tr>\n", - " </tbody>\n", - "</table>\n", - "</div>" - ], - "text/plain": [ - " offre chrn_gaz stm_clean\n", - "0 DUAL 0 [mettr, jour, adress, palenci, bourg]\n", - "1 DUAL 0 [souhait, modifi, adress, mail, etre, contacte...\n", - "2 DUAL 0 [prochain, factur, disponibl, compt]\n", - "3 DUAL 0 [index, factur, aout, net, superieur, realit, ...\n", - "4 DUAL 0 [savoir, factur, annuel, pai]" - ] - }, - "execution_count": 6, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "df.head()" - ] - }, - { - "cell_type": "code", - "execution_count": 7, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "list_of_docs = [' '.join(doc) for doc in df.stm_clean.tolist()]" - ] - }, - { - "cell_type": "code", - "execution_count": 8, - "metadata": { - "scrolled": true - }, - "outputs": [ - { - "data": { - "text/plain": [ - "['mettr jour adress palenci bourg',\n", - " 'souhait modifi adress mail etre contacte servic cel nadiyaa545 gmail prendr cel compt dorenavent',\n", - " 'prochain factur disponibl compt']" - ] - }, - "execution_count": 8, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "list_of_docs[:3]" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Compute TF-IDF" - ] - }, - { - "cell_type": "code", - "execution_count": 9, - "metadata": {}, - "outputs": [], - "source": [ - "from nautilus_nlp.utils.text_vectorizer import Tfidf" - ] - }, - { - "cell_type": "code", - "execution_count": 10, - "metadata": {}, - "outputs": [], - "source": [ - "tfidf = Tfidf(max_df=0.95, #ignore terms that have a document frequency strictly higher \n", - " min_df=0.01,\n", - " max_features=10000,\n", - " encoding='utf-8',\n", - " #stop_words=SW,\n", - " norm=None,\n", - " #ngram_range=(1, 2))\n", - " )\n" - ] - }, - { - "cell_type": "code", - "execution_count": 11, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "TfidfVectorizer(analyzer='word', binary=False, decode_error='strict',\n", - " dtype=<class 'numpy.float64'>, encoding='utf-8', input='content',\n", - " lowercase=True, max_df=0.95, max_features=10000, min_df=0.01,\n", - " ngram_range=(1, 1), norm=None, preprocessor=None, smooth_idf=True,\n", - " stop_words=None, strip_accents=None, sublinear_tf=False,\n", - " token_pattern='(?u)\\\\b\\\\w\\\\w+\\\\b', tokenizer=None, use_idf=True,\n", - " vocabulary=None)" - ] - }, - "execution_count": 11, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "# uses Sci-kit learn TfidfVectorizer()\n", - "# You can pass all the arguments supported by sci-kit \n", - "# Doc : https://scikit-learn.org/stable/modules/generated/sklearn.feature_extraction.text.TfidfVectorizer.html\n", - "tfidf.tfidf_vectorizer" - ] - }, - { - "cell_type": "code", - "execution_count": 12, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "<17744x434 sparse matrix of type '<class 'numpy.float64'>'\n", - "\twith 300349 stored elements in Compressed Sparse Row format>" - ] - }, - "execution_count": 12, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "# Compute the word count vector matrix.\n", - "tfidf.compute_tfidf(list_of_docs)" - ] - }, - { - "cell_type": "code", - "execution_count": 13, - "metadata": { - "scrolled": true - }, - "outputs": [ - { - "data": { - "text/plain": [ - "{'euro': 96.099,\n", - " 'rembours': 116.797,\n", - " 'adress': 115.531,\n", - " 'compt': 89.231,\n", - " 'coupur': 87.871,\n", - " 'chequ': 82.334,\n", - " 'mois': 81.935}" - ] - }, - "execution_count": 13, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "# Get highest-weighted words\n", - "tfidf.get_top_tfidf()" - ] - }, - { - "cell_type": "code", - "execution_count": 14, - "metadata": { - "scrolled": true - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "['mettr', 'adress', 'jour']\n", - "['cel', 'prendr', 'modifi', 'adress', 'mail', 'servic', 'etre', 'compt', 'souhait']\n", - "['disponibl', 'prochain', 'compt', 'factur']\n", - "['index', 'modif', 'modifi', 'lign', 'prochain', 'aout', 'electricit', 'pouv', 'prelev', 'factur']\n", - "['annuel', 'savoir', 'pai', 'factur']\n", - "['disponibl', 'ete', 'concern', 'relev', 'compteur', 'demand']\n", - "['acce', 'juin', 'plait', 'avanc', 'envoi', 'compt', 'mois', 'factur']\n", - "['conso', 'reel', 'communiqu', 'vient', 'met', 'relev', 'argent', 'conseiller', 'repondu', 'connaitr']\n", - "['nest', 'point', 'lappliqu', 'effect', 'sup', 'appliqu', 'vrai', 'toujour', 'arriv', 'souc']\n", - "['mensuel', 'pai', 'prelev']\n" - ] - } - ], - "source": [ - "# Get highest-weighted words per document\n", - "for doc in list_of_docs[:10]:\n", - " print(tfidf.get_top_tfidf_per_doc(doc))" - ] - } - ], - "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.7.0" - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} From b4c1ae40e0699f77fc511e5af06d14d7926ba54d Mon Sep 17 00:00:00 2001 From: hugovasselin <waaaouu@gmail.com> Date: Thu, 23 May 2019 18:31:18 +0200 Subject: [PATCH 199/496] add utils functions --- nautilus_nlp/utils/file_loader.py | 22 +++++++++++++++++++++- 1 file changed, 21 insertions(+), 1 deletion(-) diff --git a/nautilus_nlp/utils/file_loader.py b/nautilus_nlp/utils/file_loader.py index 006e9f6..6d710f6 100644 --- a/nautilus_nlp/utils/file_loader.py +++ b/nautilus_nlp/utils/file_loader.py @@ -2,10 +2,13 @@ import chardet import glob import re -from os.path import isfile, isdir +import os +from os import listdir +from os.path import isfile, isdir, join import json import logging + logging.basicConfig(level=logging.INFO) @@ -49,6 +52,23 @@ def text_loader(filepath, encoding=None, detectencoding=True): raise UnicodeDecodeError('Cannot load document using utf-8. Try to detect encoding using detectencoding=True') +def get_subfolders_path(folder): + if not folder.endswith("/"): + folder = folder + "/" + return [folder + f+'/' for f in listdir(folder)if isdir(join(folder, f)) and f != ".DS_Store"] + + +def list_files_in_subdir(filepath): + ''' + Get a list of all the filepath of files in directory and subdirectory. + ''' + res = [] + for path, subdirs, files in os.walk(filepath): + for name in files: + res.append(os.path.join(path, name)) + return res + + def list_files(filepath:str): """ inputs a filepath. From ad3bc721a5b5d4b1d71735d31980b7cb612e7754 Mon Sep 17 00:00:00 2001 From: Robin <rdoume@gmail.com> Date: Fri, 24 May 2019 11:13:13 +0200 Subject: [PATCH 200/496] Bump Version to 0.9.1 - Prerelease --- VERSION | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/VERSION b/VERSION index 6da28dd..f514a2f 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -0.1.1 \ No newline at end of file +0.9.1 \ No newline at end of file From b6d65e1f26b5e975c3dd2b978aa30ddc6363ab4d Mon Sep 17 00:00:00 2001 From: Robin <rdoume@gmail.com> Date: Fri, 24 May 2019 11:18:08 +0200 Subject: [PATCH 201/496] Guidelines if Fasttext install fails on MACOS --- README.md | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/README.md b/README.md index 9ae74d3..5bae6f7 100644 --- a/README.md +++ b/README.md @@ -46,6 +46,19 @@ pip install -e . ## Handling installation errors + +### Problem when building FastText on MACOS: + +If you see this errorwhen building Fasttext: + + clang: warning: libstdc++ is deprecated; move to libc++ with a minimum deployment target of OS X 10.9 [-Wdeprecated] + ld: library not found for -lstdc++ + clang: error: linker command failed with exit code 1 (use -v to see invocation) + error: command 'g++' failed with exit status 1 +Then you should type this command in your terminal: + + export MACOSX_DEPLOYMENT_TARGET=10.9 + ### command 'gcc' failed with exit status 1 While runing `pip install -r requirements.txt` you might get the following error message: From d9ad94ecab61b4ade976ff3bfde77d414cb2745e Mon Sep 17 00:00:00 2001 From: root <root@nautilus-nlp.c.nautilus-sandbox.internal> Date: Fri, 24 May 2019 12:08:01 +0000 Subject: [PATCH 202/496] update notebooks --- notebooks/0. Text file loader.ipynb | 124 +++-- notebooks/1. Text Preprocessing.ipynb | 88 ++-- notebooks/2. Text processing.ipynb | 146 +++--- .../3. Text Vectorization - TF-IDF.ipynb | 446 +++++++++--------- .../Benchmark text processing tools.ipynb | 261 ++++++---- notebooks/Language_identification.ipynb | 61 ++- ...nt analysis using pre-trained models.ipynb | 50 +- notebooks/Sentiment_analysis_FT.ipynb | 18 +- notebooks/Spacy_model.ipynb | 31 +- notebooks/Visualization tools.ipynb | 75 +-- notebooks/someadditionalfile.txt | 1 + notebooks/somefile.txt | 1 + 12 files changed, 651 insertions(+), 651 deletions(-) create mode 100644 notebooks/someadditionalfile.txt create mode 100644 notebooks/somefile.txt diff --git a/notebooks/0. Text file loader.ipynb b/notebooks/0. Text file loader.ipynb index 5aa985f..d83208d 100644 --- a/notebooks/0. Text file loader.ipynb +++ b/notebooks/0. Text file loader.ipynb @@ -19,9 +19,7 @@ { "cell_type": "code", "execution_count": 1, - "metadata": { - "collapsed": true - }, + "metadata": {}, "outputs": [], "source": [ "# Example of a latin1 file\n", @@ -34,9 +32,7 @@ { "cell_type": "code", "execution_count": 2, - "metadata": { - "collapsed": true - }, + "metadata": {}, "outputs": [], "source": [ "# Let's add another document \n", @@ -56,9 +52,7 @@ { "cell_type": "code", "execution_count": 3, - "metadata": { - "collapsed": true - }, + "metadata": {}, "outputs": [], "source": [ "from nautilus_nlp.utils.file_loader import documents_loader" @@ -162,7 +156,7 @@ }, { "cell_type": "code", - "execution_count": 7, + "execution_count": 19, "metadata": { "scrolled": true }, @@ -181,15 +175,15 @@ "traceback": [ "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", "\u001b[0;31mUnicodeDecodeError\u001b[0m Traceback (most recent call last)", - "\u001b[0;32m~/Documents/NAUTILUS/nautilus-nlp/nautilus_nlp/utils/file_loader.py\u001b[0m in \u001b[0;36mtext_loader\u001b[0;34m(filepath, encoding, detectencoding)\u001b[0m\n\u001b[1;32m 38\u001b[0m \u001b[0;32mtry\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m---> 39\u001b[0;31m \u001b[0;32mreturn\u001b[0m \u001b[0mopen_textfile\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mfilepath\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mencoding\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;34m'utf-8'\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 40\u001b[0m \u001b[0;32mexcept\u001b[0m \u001b[0mUnicodeDecodeError\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", - "\u001b[0;32m~/Documents/NAUTILUS/nautilus-nlp/nautilus_nlp/utils/file_loader.py\u001b[0m in \u001b[0;36mopen_textfile\u001b[0;34m(filepath, encoding)\u001b[0m\n\u001b[1;32m 13\u001b[0m \u001b[0;32mwith\u001b[0m \u001b[0mio\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mopen\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mfilepath\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m'r'\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mencoding\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mencoding\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;32mas\u001b[0m \u001b[0mf\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m---> 14\u001b[0;31m \u001b[0mstring\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mf\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mread\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 15\u001b[0m \u001b[0;32mreturn\u001b[0m \u001b[0mstring\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", - "\u001b[0;32m/usr/local/Cellar/python/3.7.0/Frameworks/Python.framework/Versions/3.7/lib/python3.7/codecs.py\u001b[0m in \u001b[0;36mdecode\u001b[0;34m(self, input, final)\u001b[0m\n\u001b[1;32m 321\u001b[0m \u001b[0mdata\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mbuffer\u001b[0m \u001b[0;34m+\u001b[0m \u001b[0minput\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 322\u001b[0;31m \u001b[0;34m(\u001b[0m\u001b[0mresult\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mconsumed\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_buffer_decode\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mdata\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0merrors\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mfinal\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 323\u001b[0m \u001b[0;31m# keep undecoded input until the next call\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;32m/home/shared/nautilus_nlp/nautilus_nlp/utils/file_loader.py\u001b[0m in \u001b[0;36mtext_loader\u001b[0;34m(filepath, encoding, detectencoding)\u001b[0m\n\u001b[1;32m 38\u001b[0m \u001b[0;32mtry\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m---> 39\u001b[0;31m \u001b[0;32mreturn\u001b[0m \u001b[0mopen_textfile\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mfilepath\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mencoding\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;34m'utf-8'\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 40\u001b[0m \u001b[0;32mexcept\u001b[0m \u001b[0mUnicodeDecodeError\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;32m/home/shared/nautilus_nlp/nautilus_nlp/utils/file_loader.py\u001b[0m in \u001b[0;36mopen_textfile\u001b[0;34m(filepath, encoding)\u001b[0m\n\u001b[1;32m 13\u001b[0m \u001b[0;32mwith\u001b[0m \u001b[0mio\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mopen\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mfilepath\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m'r'\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mencoding\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mencoding\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;32mas\u001b[0m \u001b[0mf\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m---> 14\u001b[0;31m \u001b[0mstring\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mf\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mread\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 15\u001b[0m \u001b[0;32mreturn\u001b[0m \u001b[0mstring\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;32m/home/hugo/anaconda3/lib/python3.7/codecs.py\u001b[0m in \u001b[0;36mdecode\u001b[0;34m(self, input, final)\u001b[0m\n\u001b[1;32m 321\u001b[0m \u001b[0mdata\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mbuffer\u001b[0m \u001b[0;34m+\u001b[0m \u001b[0minput\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 322\u001b[0;31m \u001b[0;34m(\u001b[0m\u001b[0mresult\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mconsumed\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_buffer_decode\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mdata\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0merrors\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mfinal\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 323\u001b[0m \u001b[0;31m# keep undecoded input until the next call\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", "\u001b[0;31mUnicodeDecodeError\u001b[0m: 'utf-8' codec can't decode byte 0xe9 in position 30: invalid continuation byte", "\nDuring handling of the above exception, another exception occurred:\n", "\u001b[0;31mTypeError\u001b[0m Traceback (most recent call last)", - "\u001b[0;32m<ipython-input-7-c6d5e5969a55>\u001b[0m in \u001b[0;36m<module>\u001b[0;34m\u001b[0m\n\u001b[1;32m 1\u001b[0m \u001b[0;31m# You can prevent document loader from detecting the encoding if UTF-8 fails\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 2\u001b[0;31m \u001b[0mdocuments_loader\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m'somefile.txt'\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mdetectencoding\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;32mFalse\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", - "\u001b[0;32m~/Documents/NAUTILUS/nautilus-nlp/nautilus_nlp/utils/file_loader.py\u001b[0m in \u001b[0;36mdocuments_loader\u001b[0;34m(filepath, encoding, detectencoding, output_as)\u001b[0m\n\u001b[1;32m 90\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 91\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mnb_of_documents\u001b[0m \u001b[0;34m==\u001b[0m \u001b[0;36m1\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m---> 92\u001b[0;31m \u001b[0;32mreturn\u001b[0m \u001b[0mtext_loader\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mdocuments\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;36m0\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0mencoding\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mencoding\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mdetectencoding\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mdetectencoding\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 93\u001b[0m \u001b[0;32melif\u001b[0m \u001b[0mnb_of_documents\u001b[0m \u001b[0;34m>\u001b[0m \u001b[0;36m1\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 94\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0moutput_as\u001b[0m \u001b[0;34m==\u001b[0m \u001b[0;34m'list'\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", - "\u001b[0;32m~/Documents/NAUTILUS/nautilus-nlp/nautilus_nlp/utils/file_loader.py\u001b[0m in \u001b[0;36mtext_loader\u001b[0;34m(filepath, encoding, detectencoding)\u001b[0m\n\u001b[1;32m 47\u001b[0m \u001b[0;32mreturn\u001b[0m \u001b[0mopen_textfile\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mfilepath\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mencoding\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mdetected_encoding\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;34m'encoding'\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 48\u001b[0m \u001b[0;32melse\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m---> 49\u001b[0;31m \u001b[0;32mraise\u001b[0m \u001b[0mUnicodeDecodeError\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m'Cannot load document using utf-8. Try to detect encoding using detectencoding=True'\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 50\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 51\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;32m<ipython-input-19-482c18687c00>\u001b[0m in \u001b[0;36m<module>\u001b[0;34m\u001b[0m\n\u001b[1;32m 1\u001b[0m \u001b[0;31m# You can prevent document loader from detecting the encoding if UTF-8 fails\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 2\u001b[0m \u001b[0;31m# In this case, it will raise an UnicodeDecodeError\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 3\u001b[0;31m \u001b[0mdocuments_loader\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m'somefile.txt'\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mdetectencoding\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;32mFalse\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", + "\u001b[0;32m/home/shared/nautilus_nlp/nautilus_nlp/utils/file_loader.py\u001b[0m in \u001b[0;36mdocuments_loader\u001b[0;34m(filepath, encoding, detectencoding, output_as)\u001b[0m\n\u001b[1;32m 90\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 91\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mnb_of_documents\u001b[0m \u001b[0;34m==\u001b[0m \u001b[0;36m1\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m---> 92\u001b[0;31m \u001b[0;32mreturn\u001b[0m \u001b[0mtext_loader\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mdocuments\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;36m0\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0mencoding\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mencoding\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mdetectencoding\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mdetectencoding\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 93\u001b[0m \u001b[0;32melif\u001b[0m \u001b[0mnb_of_documents\u001b[0m \u001b[0;34m>\u001b[0m \u001b[0;36m1\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 94\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0moutput_as\u001b[0m \u001b[0;34m==\u001b[0m \u001b[0;34m'list'\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;32m/home/shared/nautilus_nlp/nautilus_nlp/utils/file_loader.py\u001b[0m in \u001b[0;36mtext_loader\u001b[0;34m(filepath, encoding, detectencoding)\u001b[0m\n\u001b[1;32m 47\u001b[0m \u001b[0;32mreturn\u001b[0m \u001b[0mopen_textfile\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mfilepath\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mencoding\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mdetected_encoding\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;34m'encoding'\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 48\u001b[0m \u001b[0;32melse\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m---> 49\u001b[0;31m \u001b[0;32mraise\u001b[0m \u001b[0mUnicodeDecodeError\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m'Cannot load document using utf-8. Try to detect encoding using detectencoding=True'\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 50\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 51\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n", "\u001b[0;31mTypeError\u001b[0m: function takes exactly 5 arguments (1 given)" ] } @@ -209,7 +203,7 @@ }, { "cell_type": "code", - "execution_count": 8, + "execution_count": 9, "metadata": {}, "outputs": [ { @@ -228,7 +222,7 @@ " 'someadditionalfile.txt': 'Un deuxième exemple de texte en utf-8 cette fois!'}" ] }, - "execution_count": 8, + "execution_count": 9, "metadata": {}, "output_type": "execute_result" } @@ -240,7 +234,7 @@ }, { "cell_type": "code", - "execution_count": 9, + "execution_count": 10, "metadata": {}, "outputs": [ { @@ -259,7 +253,7 @@ " 'someadditionalfile.txt': 'Un deuxième exemple de texte en utf-8 cette fois!'}" ] }, - "execution_count": 9, + "execution_count": 10, "metadata": {}, "output_type": "execute_result" } @@ -271,7 +265,7 @@ }, { "cell_type": "code", - "execution_count": 10, + "execution_count": 11, "metadata": {}, "outputs": [ { @@ -290,7 +284,7 @@ " 'Un deuxième exemple de texte en utf-8 cette fois!']" ] }, - "execution_count": 10, + "execution_count": 11, "metadata": {}, "output_type": "execute_result" } @@ -309,10 +303,8 @@ }, { "cell_type": "code", - "execution_count": 11, - "metadata": { - "collapsed": true - }, + "execution_count": 12, + "metadata": {}, "outputs": [], "source": [ "from nautilus_nlp.utils.file_loader import list_files" @@ -320,28 +312,28 @@ }, { "cell_type": "code", - "execution_count": 12, + "execution_count": 13, "metadata": {}, "outputs": [ { "data": { "text/plain": [ - "['./somefile.txt',\n", - " './2. Text processing.ipynb',\n", - " './TF-IDF.ipynb',\n", - " './Visualization tools.ipynb',\n", + "['./Visualization tools.ipynb',\n", + " './Sentiment analysis using pre-trained models.ipynb',\n", + " './somefile.txt',\n", " './Language_identification.ipynb',\n", - " './someadditionalfile.txt',\n", - " './somefile',\n", - " './Sentiment_analysis_FT.ipynb',\n", + " './1. Text Preprocessing.ipynb',\n", + " './3. Text Vectorization - TF-IDF.ipynb',\n", " './TopicModeling.ipynb',\n", - " './Spacy_model.ipynb',\n", - " './Sentiment analysis using pre-trained models.ipynb',\n", + " './Sentiment_analysis_FT.ipynb',\n", + " './Benchmark text processing tools.ipynb',\n", " './0. Text file loader.ipynb',\n", - " './1. Text Preprocessing.ipynb']" + " './someadditionalfile.txt',\n", + " './2. Text processing.ipynb',\n", + " './Spacy_model.ipynb']" ] }, - "execution_count": 12, + "execution_count": 13, "metadata": {}, "output_type": "execute_result" } @@ -352,7 +344,7 @@ }, { "cell_type": "code", - "execution_count": 13, + "execution_count": 14, "metadata": {}, "outputs": [ { @@ -361,7 +353,7 @@ "[]" ] }, - "execution_count": 13, + "execution_count": 14, "metadata": {}, "output_type": "execute_result" } @@ -372,25 +364,26 @@ }, { "cell_type": "code", - "execution_count": 14, + "execution_count": 15, "metadata": {}, "outputs": [ { "data": { "text/plain": [ - "['./2. Text processing.ipynb',\n", - " './TF-IDF.ipynb',\n", - " './Visualization tools.ipynb',\n", + "['./Visualization tools.ipynb',\n", + " './Sentiment analysis using pre-trained models.ipynb',\n", " './Language_identification.ipynb',\n", - " './Sentiment_analysis_FT.ipynb',\n", + " './1. Text Preprocessing.ipynb',\n", + " './3. Text Vectorization - TF-IDF.ipynb',\n", " './TopicModeling.ipynb',\n", - " './Spacy_model.ipynb',\n", - " './Sentiment analysis using pre-trained models.ipynb',\n", + " './Sentiment_analysis_FT.ipynb',\n", + " './Benchmark text processing tools.ipynb',\n", " './0. Text file loader.ipynb',\n", - " './1. Text Preprocessing.ipynb']" + " './2. Text processing.ipynb',\n", + " './Spacy_model.ipynb']" ] }, - "execution_count": 14, + "execution_count": 15, "metadata": {}, "output_type": "execute_result" } @@ -401,7 +394,7 @@ }, { "cell_type": "code", - "execution_count": 15, + "execution_count": 16, "metadata": { "scrolled": true }, @@ -409,18 +402,10 @@ { "data": { "text/plain": [ - "['/Users/hugo/Documents/NAUTILUS/nautilus-nlp/LICENSE',\n", - " '/Users/hugo/Documents/NAUTILUS/nautilus-nlp/requirements.txt',\n", - " '/Users/hugo/Documents/NAUTILUS/nautilus-nlp/Makefile',\n", - " '/Users/hugo/Documents/NAUTILUS/nautilus-nlp/README.md',\n", - " '/Users/hugo/Documents/NAUTILUS/nautilus-nlp/setup.py',\n", - " '/Users/hugo/Documents/NAUTILUS/nautilus-nlp/VERSION',\n", - " '/Users/hugo/Documents/NAUTILUS/nautilus-nlp/CONTRIBUTING.md',\n", - " '/Users/hugo/Documents/NAUTILUS/nautilus-nlp/tox.ini',\n", - " '/Users/hugo/Documents/NAUTILUS/nautilus-nlp/test_environment.py']" + "[]" ] }, - "execution_count": 15, + "execution_count": 16, "metadata": {}, "output_type": "execute_result" } @@ -441,10 +426,8 @@ }, { "cell_type": "code", - "execution_count": 18, - "metadata": { - "collapsed": true - }, + "execution_count": 17, + "metadata": {}, "outputs": [], "source": [ "from nautilus_nlp.utils.file_loader import detect_encoding" @@ -452,7 +435,7 @@ }, { "cell_type": "code", - "execution_count": 19, + "execution_count": 18, "metadata": {}, "outputs": [ { @@ -461,7 +444,7 @@ "{'encoding': 'ISO-8859-1', 'confidence': 0.73, 'language': ''}" ] }, - "execution_count": 19, + "execution_count": 18, "metadata": {}, "output_type": "execute_result" } @@ -469,6 +452,13 @@ "source": [ "detect_encoding('somefile.txt')" ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] } ], "metadata": { @@ -487,7 +477,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.7.0" + "version": "3.7.3" } }, "nbformat": 4, diff --git a/notebooks/1. Text Preprocessing.ipynb b/notebooks/1. Text Preprocessing.ipynb index 3803299..b081db0 100644 --- a/notebooks/1. Text Preprocessing.ipynb +++ b/notebooks/1. Text Preprocessing.ipynb @@ -20,9 +20,7 @@ { "cell_type": "code", "execution_count": 1, - "metadata": { - "collapsed": true - }, + "metadata": {}, "outputs": [], "source": [ "english_text = \"\"\"\n", @@ -54,9 +52,7 @@ { "cell_type": "code", "execution_count": 2, - "metadata": { - "collapsed": true - }, + "metadata": {}, "outputs": [], "source": [ "from nautilus_nlp.preprocessing.preprocess import preprocess_text" @@ -119,9 +115,7 @@ { "cell_type": "code", "execution_count": 4, - "metadata": { - "collapsed": true - }, + "metadata": {}, "outputs": [], "source": [ "from nautilus_nlp.preprocessing.preprocess import remove_EOL_characters" @@ -129,7 +123,7 @@ }, { "cell_type": "code", - "execution_count": 10, + "execution_count": 5, "metadata": {}, "outputs": [ { @@ -164,10 +158,8 @@ }, { "cell_type": "code", - "execution_count": 11, - "metadata": { - "collapsed": true - }, + "execution_count": 6, + "metadata": {}, "outputs": [], "source": [ "from nautilus_nlp.preprocessing.preprocess import get_stopwords" @@ -175,14 +167,14 @@ }, { "cell_type": "code", - "execution_count": 12, + "execution_count": 7, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "['basee', 'y', 'façon', 'étant', 't', 'chère', 'uns', 'mêmes', 'particulier', 'tend']\n" + "['soi-même', 'prealable', 'ayez', 'fi', 'concernant', 'dedans', 'celles', 'tiennes', 'plutôt', 'bravo']\n" ] } ], @@ -194,10 +186,8 @@ }, { "cell_type": "code", - "execution_count": 13, - "metadata": { - "collapsed": true - }, + "execution_count": 8, + "metadata": {}, "outputs": [], "source": [ "from nautilus_nlp.preprocessing.preprocess import remove_stopwords" @@ -205,7 +195,7 @@ }, { "cell_type": "code", - "execution_count": 15, + "execution_count": 9, "metadata": {}, "outputs": [ { @@ -239,10 +229,8 @@ }, { "cell_type": "code", - "execution_count": 16, - "metadata": { - "collapsed": true - }, + "execution_count": 10, + "metadata": {}, "outputs": [], "source": [ "from nautilus_nlp.preprocessing.preprocess import fix_bad_unicode" @@ -250,7 +238,7 @@ }, { "cell_type": "code", - "execution_count": 17, + "execution_count": 11, "metadata": {}, "outputs": [ { @@ -284,10 +272,8 @@ }, { "cell_type": "code", - "execution_count": 3, - "metadata": { - "collapsed": true - }, + "execution_count": 12, + "metadata": {}, "outputs": [], "source": [ "from nautilus_nlp.preprocessing.preprocess import replace_phone_numbers" @@ -295,7 +281,7 @@ }, { "cell_type": "code", - "execution_count": 4, + "execution_count": 13, "metadata": {}, "outputs": [ { @@ -329,10 +315,8 @@ }, { "cell_type": "code", - "execution_count": 5, - "metadata": { - "collapsed": true - }, + "execution_count": 14, + "metadata": {}, "outputs": [], "source": [ "import nautilus_nlp.utils.phone_number as phone" @@ -340,15 +324,15 @@ }, { "cell_type": "code", - "execution_count": 6, + "execution_count": 15, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "CPU times: user 452 ms, sys: 22.5 ms, total: 474 ms\n", - "Wall time: 477 ms\n" + "CPU times: user 296 ms, sys: 0 ns, total: 296 ms\n", + "Wall time: 294 ms\n" ] }, { @@ -357,7 +341,7 @@ "['(541) 754-3010', '754-3010']" ] }, - "execution_count": 6, + "execution_count": 15, "metadata": {}, "output_type": "execute_result" } @@ -376,10 +360,8 @@ }, { "cell_type": "code", - "execution_count": 7, - "metadata": { - "collapsed": true - }, + "execution_count": 16, + "metadata": {}, "outputs": [], "source": [ "p = phone.phoneParser()" @@ -387,7 +369,7 @@ }, { "cell_type": "code", - "execution_count": 8, + "execution_count": 17, "metadata": {}, "outputs": [ { @@ -396,7 +378,7 @@ "PhoneNumber(country_code=1, national_number=5417543010, extension=None, italian_leading_zero=None, number_of_leading_zeros=None, country_code_source=0, preferred_domestic_carrier_code=None)" ] }, - "execution_count": 8, + "execution_count": 17, "metadata": {}, "output_type": "execute_result" } @@ -407,7 +389,7 @@ }, { "cell_type": "code", - "execution_count": 9, + "execution_count": 18, "metadata": {}, "outputs": [ { @@ -416,7 +398,7 @@ "'541-754-3010'" ] }, - "execution_count": 9, + "execution_count": 18, "metadata": {}, "output_type": "execute_result" } @@ -434,10 +416,8 @@ }, { "cell_type": "code", - "execution_count": 13, - "metadata": { - "collapsed": true - }, + "execution_count": 19, + "metadata": {}, "outputs": [], "source": [ "from nautilus_nlp.preprocessing.preprocess import remove_emoji, convert_emoji_to_text" @@ -445,7 +425,7 @@ }, { "cell_type": "code", - "execution_count": 15, + "execution_count": 20, "metadata": {}, "outputs": [ { @@ -472,7 +452,7 @@ }, { "cell_type": "code", - "execution_count": 18, + "execution_count": 21, "metadata": {}, "outputs": [ { @@ -514,7 +494,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.7.0" + "version": "3.7.3" } }, "nbformat": 4, diff --git a/notebooks/2. Text processing.ipynb b/notebooks/2. Text processing.ipynb index 6a6c0b5..d1c68ee 100644 --- a/notebooks/2. Text processing.ipynb +++ b/notebooks/2. Text processing.ipynb @@ -25,7 +25,7 @@ "name": "stderr", "output_type": "stream", "text": [ - "[nltk_data] Downloading package punkt to /Users/hugo/nltk_data...\n", + "[nltk_data] Downloading package punkt to /root/nltk_data...\n", "[nltk_data] Package punkt is already up-to-date!\n" ] } @@ -37,9 +37,7 @@ { "cell_type": "code", "execution_count": 2, - "metadata": { - "collapsed": true - }, + "metadata": {}, "outputs": [], "source": [ "fr_txt = \"Ceci est un texte français, j'adore 1 !\"\n", @@ -49,9 +47,7 @@ { "cell_type": "code", "execution_count": 3, - "metadata": { - "collapsed": true - }, + "metadata": {}, "outputs": [], "source": [ "str_ = \"\"\"Les moteurs de recherche tels Google, Exalead ou Yahoo! sont des applications très connues de fouille de textes sur de grandes masses de données. Cependant, les moteurs de recherche ne se basent pas uniquement sur le texte pour l'indexer, mais également sur la façon dont les pages sont mises en valeur les unes par rapport aux autres. L'algorithme utilisé par Google est PageRank, et il est courant de voir HITS dans le milieu académique\"\"\"" @@ -75,13 +71,14 @@ "name": "stdout", "output_type": "stream", "text": [ - "CPU times: user 8.94 ms, sys: 1.24 ms, total: 10.2 ms\n", - "Wall time: 9.3 ms\n" + "CPU times: user 5.07 ms, sys: 130 µs, total: 5.2 ms\n", + "Wall time: 5.03 ms\n" ] } ], "source": [ "%%time\n", + "\n", "tokenized_fr_txt = tokenize(str_, lang_module=\"fr_spacy\")" ] }, @@ -89,6 +86,15 @@ "cell_type": "code", "execution_count": 5, "metadata": {}, + "outputs": [], + "source": [ + "tokenized_fr_txt = tokenize(str_, lang_module=\"fr_spacy\")" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -118,8 +124,8 @@ "name": "stdout", "output_type": "stream", "text": [ - "CPU times: user 18.2 s, sys: 82.5 ms, total: 18.3 s\n", - "Wall time: 18.5 s\n" + "CPU times: user 13.2 s, sys: 6.59 ms, total: 13.2 s\n", + "Wall time: 13.2 s\n" ] } ], @@ -161,8 +167,8 @@ "name": "stdout", "output_type": "stream", "text": [ - "CPU times: user 1.24 ms, sys: 2 µs, total: 1.24 ms\n", - "Wall time: 1.25 ms\n" + "CPU times: user 990 µs, sys: 0 ns, total: 990 µs\n", + "Wall time: 998 µs\n" ] } ], @@ -173,7 +179,16 @@ }, { "cell_type": "code", - "execution_count": 22, + "execution_count": 10, + "metadata": {}, + "outputs": [], + "source": [ + "tokenized_eng_txt = tokenize(eng_txt, lang_module=\"en_spacy\")" + ] + }, + { + "cell_type": "code", + "execution_count": 11, "metadata": {}, "outputs": [ { @@ -182,7 +197,7 @@ "['Let', \"'s\", 'play', 'together', '!']" ] }, - "execution_count": 22, + "execution_count": 11, "metadata": {}, "output_type": "execute_result" } @@ -200,15 +215,15 @@ }, { "cell_type": "code", - "execution_count": 10, + "execution_count": 12, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "CPU times: user 11.2 ms, sys: 3.35 ms, total: 14.5 ms\n", - "Wall time: 16 ms\n" + "CPU times: user 7.94 ms, sys: 122 µs, total: 8.06 ms\n", + "Wall time: 6.95 ms\n" ] } ], @@ -234,8 +249,8 @@ "name": "stdout", "output_type": "stream", "text": [ - "CPU times: user 235 µs, sys: 1e+03 ns, total: 236 µs\n", - "Wall time: 243 µs\n" + "CPU times: user 1.46 s, sys: 35 µs, total: 1.46 s\n", + "Wall time: 1.46 s\n" ] }, { @@ -263,8 +278,8 @@ "name": "stdout", "output_type": "stream", "text": [ - "CPU times: user 4.07 ms, sys: 181 µs, total: 4.25 ms\n", - "Wall time: 4.19 ms\n" + "CPU times: user 3 s, sys: 351 µs, total: 3 s\n", + "Wall time: 3 s\n" ] }, { @@ -292,7 +307,7 @@ }, { "cell_type": "code", - "execution_count": 17, + "execution_count": 15, "metadata": {}, "outputs": [], "source": [ @@ -301,7 +316,7 @@ }, { "cell_type": "code", - "execution_count": 23, + "execution_count": 16, "metadata": {}, "outputs": [ { @@ -310,7 +325,7 @@ "['i', 'surviv', 'these', 'dog']" ] }, - "execution_count": 23, + "execution_count": 16, "metadata": {}, "output_type": "execute_result" } @@ -321,7 +336,7 @@ }, { "cell_type": "code", - "execution_count": 26, + "execution_count": 17, "metadata": {}, "outputs": [ { @@ -330,7 +345,7 @@ "['je', 'mang', 'dan', 'le', 'cuisin', 'du', 'château']" ] }, - "execution_count": 26, + "execution_count": 17, "metadata": {}, "output_type": "execute_result" } @@ -355,15 +370,19 @@ }, { "cell_type": "code", - "execution_count": 27, + "execution_count": 18, "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ - "[nltk_data] Downloading package wordnet to /Users/hugo/nltk_data...\n", - "[nltk_data] Package wordnet is already up-to-date!\n" + "[nltk_data] Downloading package wordnet to /root/nltk_data...\n", + "[nltk_data] Package wordnet is already up-to-date!\n", + "[nltk_data] Downloading package averaged_perceptron_tagger to\n", + "[nltk_data] /root/nltk_data...\n", + "[nltk_data] Package averaged_perceptron_tagger is already up-to-\n", + "[nltk_data] date!\n" ] } ], @@ -373,7 +392,7 @@ }, { "cell_type": "code", - "execution_count": 28, + "execution_count": 19, "metadata": {}, "outputs": [ { @@ -391,15 +410,15 @@ }, { "cell_type": "code", - "execution_count": 30, + "execution_count": 20, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "CPU times: user 20.3 ms, sys: 2.47 ms, total: 22.7 ms\n", - "Wall time: 20.6 ms\n" + "CPU times: user 17.3 ms, sys: 0 ns, total: 17.3 ms\n", + "Wall time: 15.8 ms\n" ] } ], @@ -410,7 +429,16 @@ }, { "cell_type": "code", - "execution_count": 31, + "execution_count": 21, + "metadata": {}, + "outputs": [], + "source": [ + "lemmatized_tokens = lemmatize_french_tokens(txt_to_tokenize, module='spacy')" + ] + }, + { + "cell_type": "code", + "execution_count": 22, "metadata": {}, "outputs": [ { @@ -434,7 +462,7 @@ }, { "cell_type": "code", - "execution_count": 34, + "execution_count": 23, "metadata": { "scrolled": true }, @@ -445,10 +473,8 @@ }, { "cell_type": "code", - "execution_count": 35, - "metadata": { - "collapsed": true - }, + "execution_count": 24, + "metadata": {}, "outputs": [], "source": [ "to_lemmatize = ['The', 'striped', 'bats', 'are', 'hanging', 'on', 'their', 'feet', 'for', 'best']" @@ -456,15 +482,15 @@ }, { "cell_type": "code", - "execution_count": 37, + "execution_count": 25, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "CPU times: user 16.9 ms, sys: 3.03 ms, total: 19.9 ms\n", - "Wall time: 16.8 ms\n" + "CPU times: user 13.7 ms, sys: 0 ns, total: 13.7 ms\n", + "Wall time: 12.5 ms\n" ] }, { @@ -473,7 +499,7 @@ "['the', 'strip', 'bat', 'be', 'hang', 'on', '-PRON-', 'foot', 'for', 'good']" ] }, - "execution_count": 37, + "execution_count": 25, "metadata": {}, "output_type": "execute_result" } @@ -485,15 +511,15 @@ }, { "cell_type": "code", - "execution_count": 41, + "execution_count": 26, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "CPU times: user 2.58 s, sys: 141 ms, total: 2.72 s\n", - "Wall time: 2.73 s\n" + "CPU times: user 1.72 s, sys: 125 ms, total: 1.85 s\n", + "Wall time: 1.82 s\n" ] }, { @@ -502,7 +528,7 @@ "['The', 'strip', 'bat', 'be', 'hang', 'on', 'their', 'foot', 'for', 'best']" ] }, - "execution_count": 41, + "execution_count": 26, "metadata": {}, "output_type": "execute_result" } @@ -521,7 +547,7 @@ }, { "cell_type": "code", - "execution_count": 42, + "execution_count": 27, "metadata": {}, "outputs": [], "source": [ @@ -531,10 +557,8 @@ }, { "cell_type": "code", - "execution_count": 43, - "metadata": { - "collapsed": true - }, + "execution_count": 28, + "metadata": {}, "outputs": [], "source": [ "FRENCH_SW = get_stopwords('fr')" @@ -542,10 +566,8 @@ }, { "cell_type": "code", - "execution_count": 44, - "metadata": { - "collapsed": true - }, + "execution_count": 29, + "metadata": {}, "outputs": [], "source": [ "text = \"J'ai un beau cheval\"" @@ -553,7 +575,7 @@ }, { "cell_type": "code", - "execution_count": 45, + "execution_count": 30, "metadata": {}, "outputs": [ { @@ -562,7 +584,7 @@ "[\"J'ai\", 'cheval']" ] }, - "execution_count": 45, + "execution_count": 30, "metadata": {}, "output_type": "execute_result" } @@ -573,7 +595,7 @@ }, { "cell_type": "code", - "execution_count": 46, + "execution_count": 31, "metadata": {}, "outputs": [ { @@ -582,7 +604,7 @@ "[\"J'\", 'cheval']" ] }, - "execution_count": 46, + "execution_count": 31, "metadata": {}, "output_type": "execute_result" } @@ -608,7 +630,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.7.0" + "version": "3.7.3" } }, "nbformat": 4, diff --git a/notebooks/3. Text Vectorization - TF-IDF.ipynb b/notebooks/3. Text Vectorization - TF-IDF.ipynb index 6e54f01..1e0c112 100644 --- a/notebooks/3. Text Vectorization - TF-IDF.ipynb +++ b/notebooks/3. Text Vectorization - TF-IDF.ipynb @@ -153,12 +153,12 @@ "name": "stderr", "output_type": "stream", "text": [ - "[nltk_data] Downloading package punkt to /Users/hugo/nltk_data...\n", + "[nltk_data] Downloading package punkt to /root/nltk_data...\n", "[nltk_data] Package punkt is already up-to-date!\n", - "[nltk_data] Downloading package wordnet to /Users/hugo/nltk_data...\n", + "[nltk_data] Downloading package wordnet to /root/nltk_data...\n", "[nltk_data] Package wordnet is already up-to-date!\n", "[nltk_data] Downloading package averaged_perceptron_tagger to\n", - "[nltk_data] /Users/hugo/nltk_data...\n", + "[nltk_data] /root/nltk_data...\n", "[nltk_data] Package averaged_perceptron_tagger is already up-to-\n", "[nltk_data] date!\n" ] @@ -178,8 +178,8 @@ "name": "stdout", "output_type": "stream", "text": [ - "CPU times: user 3min 16s, sys: 15.2 s, total: 3min 31s\n", - "Wall time: 3min 50s\n" + "CPU times: user 2min 47s, sys: 1.15 s, total: 2min 48s\n", + "Wall time: 2min 48s\n" ] } ], @@ -209,9 +209,7 @@ { "cell_type": "code", "execution_count": 8, - "metadata": { - "collapsed": true - }, + "metadata": {}, "outputs": [], "source": [ "train, test = train_test_split(df, test_size=0.2)" @@ -226,20 +224,28 @@ }, { "cell_type": "code", - "execution_count": 63, + "execution_count": 9, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "paramiko missing, opening SSH/SCP/SFTP paths will be disabled. `pip install paramiko` to suppress\n" + ] + } + ], "source": [ "from nautilus_nlp.preprocessing.text_vectorizers import TfidfTextVectorizer" ] }, { "cell_type": "code", - "execution_count": 64, + "execution_count": 15, "metadata": {}, "outputs": [], "source": [ - "tfidf = Tfidf(max_df=0.95, #ignore terms that have a document frequency strictly higher \n", + "tfidf = TfidfTextVectorizer(max_df=0.95, #ignore terms that have a document frequency strictly higher \n", " min_df=0.01,\n", " max_features=10000,\n", " encoding='utf-8',\n", @@ -251,7 +257,7 @@ }, { "cell_type": "code", - "execution_count": 65, + "execution_count": 16, "metadata": {}, "outputs": [ { @@ -266,7 +272,7 @@ " vocabulary=None)" ] }, - "execution_count": 65, + "execution_count": 16, "metadata": {}, "output_type": "execute_result" } @@ -280,7 +286,7 @@ }, { "cell_type": "code", - "execution_count": 66, + "execution_count": 17, "metadata": {}, "outputs": [], "source": [ @@ -289,17 +295,19 @@ }, { "cell_type": "code", - "execution_count": 67, - "metadata": {}, + "execution_count": 18, + "metadata": { + "scrolled": true + }, "outputs": [ { "data": { "text/plain": [ - "['coach ranieri sack by valencia claudio ranieri have be sack as valencia coach just eight month after take charge at the primera liga club for the second time in -PRON- career . the decision be take at a board meeting follow the side s surprise elimination from the uefa cup . -PRON- understand and -PRON- understand that the result in the last few week have not be the most appropriate say club president juan bautista . former assistant antonio lopez will take over as the new coach . italian ranieri take over the valencia job in june 2004 have be replace at chelsea by jose mourinho . thing begin well but the spanish champion extend -PRON- winless streak to six after lose to race santander last weekend . that defeat be then follow by a uefa cup exit at the hand of steaua bucharest . ranieri first take charge of valencia in 1997 guide -PRON- to the king s cup and help -PRON- to qualify for the champion league . the 54-year - old then move to atletico madrid in 1999 before join chelsea the following year .',\n", - " 'fox too reliant on reality tv the head of -PRON- tv network fox have admit the broadcaster have rely too heavily on reality tv show such as the poor - rating who s -PRON- daddy . chief executive gail berman say in the case of this fall -PRON- drift to too much on the unscripted side . the series who s -PRON- daddy where a young woman try to pick -PRON- natural father for a cash prize cause outrage from adoption group and rate badly . last season fox s prime - time audience fall by 600 000 to 5.9 million . ms berman say : i think the audience expect loud thing from fox . sometimes -PRON- work and sometimes -PRON- don t. who s -PRON- daddy the first episode of which be show on 3 january pull in a disappointing audience of 6.3 million accord to the nielsen rating system . five other episode of the show have also be film will be drop from fox s schedule ms berman say . -PRON- be predict a drop in rating even for some of the network s establish reality show such as american idol which be due to start -PRON- fourth series this week . fox have unveil a new strategy last year promise to launch new show every season include the traditionally quiet summer season . though that have meet with a poor reception ms berman say there s no question that the audience in -PRON- mind be ready willing and able to accept new programming in the summer . fox have change this plan launch new show in may instead of june . one of the new show will be the animate series american dad make by seth macfarlane the creator of family guy . that series after become a hit on dvd be also set to return with new episode .']" + "['bid to cut court witness stress new target to reduce the stress to victim and witness give evidence in court in england and wale have be announce by the lord chancellor . lord falconer want all crown court and 90 % of magistrate court to have facility to keep witness separate from defendant within four year . more video link will also be make available so that witness do not have to enter courtroom . -PRON- be part of a five - year plan to help build confidence in the justice system . minister say the strategy be aim at re - balance the court system towards victim and increase the number of offender bring to justice . launch the department for constitutional affair plan lord falconer say : one of the top priority will be a well deal for victim . the need and safety of victim will be at the heart of the way trial be manage . court judge magistrate prosecutor police and victim support - all work together to ensure the right of victim be put first without compromise the right of the defendant . -PRON- go on : give evidence be a nerve - wracking experience especially when -PRON- re a victim . yet with a will and with support -PRON- can be do . lord falconer tell bbc radio 4 s today programme -PRON- be impossible for some elderly people to go to court to give evidence . other witness could be intimidate by sit alongside defendant outside court . -PRON- be never go to get rid of some element of the trauma of give evidence -PRON- say . but -PRON- can make people believe that the court understand the problem -PRON- s not some kind of alien place where -PRON- go where -PRON- be not think about -PRON- . the plan come as the lord chancellor also consider allow camera into court for the first time since 1925 as long as -PRON- be use for case that do not involve witness . another feature of the strategy be constitutional reform with a government bill to set up a supreme court and a judicial appointment commission return to the house of lord on tuesday . minister have propose get rid of the title of lord chancellor but the lord have over - rule this . lord falconer say -PRON- be right for the high court to be completely distinct from parliament . the person in charge of the court system should not also be speaker of the house of lord -PRON- say and should be the good person choose from either house of parliament . what -PRON- do not what -PRON- be call be the critical issue -PRON- add .',\n", + " 'market unfaze by aurora setback as the aurora limp back to -PRON- dock on 20 january a blizzard of photo and interview seem to add up to an unambiguous tale of woe . the ship have another slice of bad luck to add to -PRON- history of health scare and technical trouble . and -PRON- owner p&o cruise - now part of the huge -PRON- carnival corporation - be look at a significant slice chop off this year s profit and a potential pr fiasco . no - one however seem to have tell the stock market . the warning of a five - cent hit to 2005 earning come just 24 hour after one of the world s big investment bank have up -PRON- target for carnival s share price from £ 35 to £ 36.20 . other investor barely blink and by 1300 gmt carnival s share in london be down a single penny or 0.03 % at £ 32.26 . why the mismatch between the public perception and the market s response the aurora issue have be an ongoing one for some time say deutsche bank s simon champion . -PRON- be clearly a source of uncertainty for the company - -PRON- be a long cruise after all . but the stock market be very good at treat these issue as one - off event . despite -PRON- string of bad luck -PRON- point out aurora be just one vessel in a large carnival fleet the uk s p&o princess group have be merge into the much large -PRON- firm in 2003 . and generally speak carnival have a reputation for keep -PRON- ship pretty much on schedule . carnival have an incredibly strong track record mr champion . similarly analyst expect the impact on the rest of the cruise business to be limit . the hundred of disappointed passenger who have now have to give up the opportunity to spend the next three month on the aurora have get both a refund and a credit for another cruise . that should mitigate some of the pr risk both for carnival and -PRON- main competitor royal caribbean . while not common cancellation for technical reason be not entirely unusual in the industry write analyst from citigroup smith barney in a note to client on friday . moreover such event typically have a limited impact on booking and pricing for future cruise . after all the aurora incident may be big news in the uk - but for carnival customer elsewhere -PRON- s unlikely to make too much of a splash . assume that citigroup be right and demand stay solid the structure of the industry also work in carnival s favour . in the wake of p&o princess s takeover by carnival the business be now to a great extent a duopoly . give the expense of build outfitting and run a cruise ship slow supply growth be a certainty say david ander at merrill lynch on thursday . in other word if -PRON- do want a cruise -PRON- option be limited . and with carnival remain the market leader -PRON- look set to keep sell the ticket - no matter what happen to the ill - fat aurora in the future .']" ] }, - "execution_count": 67, + "execution_count": 18, "metadata": {}, "output_type": "execute_result" } @@ -310,17 +318,17 @@ }, { "cell_type": "code", - "execution_count": 68, + "execution_count": 19, "metadata": {}, "outputs": [ { "data": { "text/plain": [ - "<1780x2631 sparse matrix of type '<class 'numpy.float64'>'\n", - "\twith 253961 stored elements in Compressed Sparse Row format>" + "<1780x2638 sparse matrix of type '<class 'numpy.float64'>'\n", + "\twith 251758 stored elements in Compressed Sparse Row format>" ] }, - "execution_count": 68, + "execution_count": 19, "metadata": {}, "output_type": "execute_result" } @@ -333,7 +341,7 @@ }, { "cell_type": "code", - "execution_count": 69, + "execution_count": 20, "metadata": { "scrolled": true }, @@ -341,90 +349,87 @@ { "data": { "text/plain": [ - "{'song': 324.615,\n", - " 'wage': 316.535,\n", + "{'song': 328.383,\n", + " 'wage': 314.316,\n", " 'roddick': 293.646,\n", - " 'minimum': 249.423,\n", - " 'music': 73.292,\n", - " 'zealand': 158.674,\n", + " 'minimum': 260.403,\n", + " 'music': 75.21,\n", " 'robbie': 157.772,\n", " 'terrorist': 153.899,\n", - " 'good': 150.616,\n", - " 'gadget': 110.235,\n", - " 'game': 72.458,\n", - " 'party': 129.043,\n", - " 'increase': 126.747,\n", - " '25': 124.598,\n", - " 'hunt': 91.696,\n", - " 'pay': 119.675,\n", - " 'muslim': 112.338,\n", - " 'student': 111.842,\n", - " 'threat': 104.862,\n", - " 'black': 74.54,\n", - " 'liverpool': 102.93,\n", - " 'child': 100.285,\n", - " 'airline': 97.48,\n", + " 'good': 151.491,\n", + " 'game': 73.159,\n", + " 'increase': 129.725,\n", + " 'hunt': 93.316,\n", + " 'party': 126.188,\n", + " '25': 125.075,\n", + " 'pay': 121.356,\n", + " 'muslim': 114.249,\n", + " 'gadget': 113.934,\n", + " 'student': 108.451,\n", + " 'threat': 104.522,\n", + " 'black': 103.206,\n", + " 'liverpool': 101.794,\n", + " 'airline': 99.171,\n", " 'stone': 96.591,\n", - " 'mini': 84.296,\n", - " 'jamie': 94.213,\n", - " 'play': 93.087,\n", - " 'virus': 86.885,\n", - " 'film': 91.146,\n", - " 'hour': 91.019,\n", - " 'spam': 90.217,\n", - " 'halo': 88.648,\n", - " 'mobile': 88.555,\n", - " 'edward': 88.215,\n", - " 'lord': 87.918,\n", - " 'search': 69.985,\n", - " 'wale': 86.423,\n", + " 'mini': 90.917,\n", + " 'mobile': 89.006,\n", + " 'play': 92.565,\n", + " 'cell': 92.487,\n", + " 'virus': 87.661,\n", + " 'jamie': 92.1,\n", + " 'spam': 91.696,\n", + " 'film': 82.501,\n", + " 'hour': 91.616,\n", + " 'camera': 91.062,\n", + " 'edward': 88.856,\n", + " 'search': 71.07,\n", + " 'passenger': 88.648,\n", + " 'lord': 87.43,\n", + " 'rugby': 86.836,\n", + " 'china': 86.425,\n", " 'yuko': 75.514,\n", - " 'government': 85.639,\n", - " 'serve': 82.564,\n", - " 'machine': 82.494,\n", - " 'pension': 80.303,\n", + " 'government': 86.077,\n", + " 'machine': 84.396,\n", + " 'ibm': 82.338,\n", + " 'online': 80.27,\n", " 'asylum': 80.242,\n", - " 'actress': 79.333,\n", - " 'that': 78.981,\n", - " 'online': 78.916,\n", - " 'council': 77.999,\n", - " 'cash': 77.595,\n", - " 'fraud': 77.403,\n", - " 'musician': 77.291,\n", - " 'actor': 76.803,\n", - " 'gaming': 76.749,\n", - " 'lee': 76.256,\n", - " 'site': 75.507,\n", - " 'argentina': 74.892,\n", - " 'attack': 74.878,\n", - " 'award': 74.606,\n", - " 'business': 74.087,\n", - " 'broadband': 74.083,\n", - " 'hip': 73.725,\n", - " 'mail': 72.974,\n", - " 'not': 72.792,\n", - " 'aviator': 72.647,\n", - " 'japan': 72.55,\n", - " 'what': 72.332,\n", - " 'chart': 72.264,\n", - " 'document': 72.234,\n", - " 'jackson': 72.138,\n", - " 'card': 71.933,\n", - " 'deutsche': 71.647,\n", - " 'point': 71.343,\n", - " 'vote': 71.299,\n", - " 'radio': 71.215,\n", - " 'china': 70.847,\n", - " 'police': 70.759,\n", + " 'musician': 79.603,\n", + " 'fraud': 79.531,\n", + " 'pension': 79.157,\n", + " 'that': 78.174,\n", + " 'gaming': 78.083,\n", + " 'bt': 77.836,\n", + " 'cash': 77.796,\n", + " 'argentina': 77.567,\n", + " 'site': 77.486,\n", + " 'lee': 77.291,\n", + " 'actress': 77.044,\n", + " 'hip': 76.849,\n", + " 'attack': 75.856,\n", + " 'broadband': 75.512,\n", + " 'actor': 74.891,\n", + " 'award': 74.741,\n", + " 'bank': 74.26,\n", + " 'document': 74.157,\n", + " 'mail': 73.852,\n", + " 'business': 73.69,\n", + " 'not': 73.596,\n", + " 'japan': 72.974,\n", + " 'chart': 72.764,\n", + " 'what': 72.65,\n", + " 'deutsche': 72.138,\n", + " 'police': 72.137,\n", + " 'soul': 72.026,\n", + " 'point': 71.795,\n", + " 'vote': 71.593,\n", + " 'card': 71.142,\n", + " 'file': 70.759,\n", + " 'dvd': 70.511,\n", " 'poster': 70.121,\n", - " 'phone': 69.937,\n", - " 'file': 69.836,\n", - " 'dvd': 69.522,\n", - " 'apple': 69.522,\n", - " 'spanish': 69.42}" + " 'murder': 70.121}" ] }, - "execution_count": 69, + "execution_count": 20, "metadata": {}, "output_type": "execute_result" } @@ -436,7 +441,7 @@ }, { "cell_type": "code", - "execution_count": 70, + "execution_count": 21, "metadata": { "scrolled": false }, @@ -445,16 +450,16 @@ "name": "stdout", "output_type": "stream", "text": [ - "['cup', 'coach', 'sack', 'chelsea', 'take', 'understand', 'champion', 'club', 'charge', 'qualify']\n", - "['fox', 'audience', 'show', 'rating', 'episode', 'reality', 'series', 'ms', 'new', 'season']\n", + "['court', 'lord', 'witness', 'victim', 'evidence', 'chancellor', 'rid', 'constitutional', 'house', 'justice']\n", + "['ship', 'market', 'limited', 'for', 'technical', 'one', 'stock', 'impact', 'much', 'on']\n", + "['trust', 'politician', 'voter', 'election', 'poll', 'public', 'issue', 'lib', 'dem', 'lack']\n", "['member', 'share', 'qualify', 'profit', '42', 'payment', 'society', 'than', 'building', 'worth']\n", - "['inflation', 'rate', 'rise', 'move', 'growth', 'flexibility', 'percentage', 'borrowing', 'economic', 'interest']\n", - "['profit', 'drug', 'treatment', 'disappointing', '2005', 'sale', '5bn', 'development', 'fall', 'year']\n", - "['woman', 'ministry', 'employ', 'prince', 'foreign', 'say', 'minister', 'news', 'difficulty', 'acquire']\n", - "['brown', 'labour', 'mr', 'blair', 'election', 'outline', 'manifesto', 'role', 'article', 'writing']\n", - "['iraq', 'bank', 'alexander', 'foreign', 'economy', 'many', 'work', 'mr', 'private', 'people']\n", - "['win', 'liverpool', 'trophy', 'steven', 'think', 'league', 'draw', 'champion', 'only', 'side']\n", - "['rating', 'bbc', 'prove', 'network', 'series', 'lose', 'slot', 'comeback', 'desperate', 'reportedly']\n" + "['ireland', 'cardiff', 'slam', 'england', 'grand', 'year', 'wale', 'last', 'team', 'tournament']\n", + "['good', 'theatre', 'musical', 'mary', 'royal', 'producer', 'at', 'design', 'outstanding', 'award']\n", + "['virus', 'writer', 'phone', '2004', 'that', 'attack', 'number', 'spam', 'use', 'message']\n", + "['academy', 'award', 'oscar', 'war', 'ceremony', 'frank', 'winner', 'film', 'first', 'as']\n", + "['broadcaster', 'debate', 'lord', 'prime', 'campaign', 'election', 'say', 'minister', 'blair', 'ahead']\n", + "['parliament', 'record', 'prior', 'document', 'blow', 'page', 'act', 'room', 'by', 'history']\n" ] } ], @@ -473,7 +478,7 @@ }, { "cell_type": "code", - "execution_count": 71, + "execution_count": 22, "metadata": {}, "outputs": [ { @@ -504,34 +509,34 @@ " </thead>\n", " <tbody>\n", " <tr>\n", - " <th>1992</th>\n", - " <td>tech</td>\n", - " <td>us peer-to-peer pirates convicted the first co...</td>\n", - " <td>-PRON- peer - to - peer pirate convict the fir...</td>\n", + " <th>1515</th>\n", + " <td>business</td>\n", + " <td>booming markets shed few tears the market for...</td>\n", + " <td>boom market shed few tear the market former...</td>\n", " </tr>\n", " <tr>\n", - " <th>1281</th>\n", + " <th>980</th>\n", " <td>sport</td>\n", - " <td>hewitt falls to dent lleyton hewitt suffered a...</td>\n", - " <td>hewitt fall to dent lleyton hewitt suffer a sh...</td>\n", + " <td>claxton hunting first major medal british hurd...</td>\n", + " <td>claxton hunt first major medal british hurdler...</td>\n", " </tr>\n", " <tr>\n", - " <th>844</th>\n", + " <th>1634</th>\n", " <td>tech</td>\n", - " <td>why cell will get the hard sell the world is c...</td>\n", - " <td>why cell will get the hard sell the world be c...</td>\n", + " <td>sony psp handheld console hits us the latest h...</td>\n", + " <td>sony psp handheld console hit -PRON- the late ...</td>\n", " </tr>\n", " <tr>\n", - " <th>1188</th>\n", + " <th>1053</th>\n", " <td>entertainment</td>\n", - " <td>belle named best scottish band belle & sebas...</td>\n", - " <td>belle name good scottish band belle & se...</td>\n", + " <td>black sabbath top rock album poll black sabbat...</td>\n", + " <td>black sabbath top rock album poll black sabbat...</td>\n", " </tr>\n", " <tr>\n", - " <th>1573</th>\n", - " <td>business</td>\n", - " <td>karachi stocks hit historic high the karachi s...</td>\n", - " <td>karachi stock hit historic high the karachi st...</td>\n", + " <th>1870</th>\n", + " <td>sport</td>\n", + " <td>jones doping probe begins an investigation int...</td>\n", + " <td>jone dope probe begin an investigation into do...</td>\n", " </tr>\n", " </tbody>\n", "</table>\n", @@ -539,21 +544,21 @@ ], "text/plain": [ " category text \\\n", - "1992 tech us peer-to-peer pirates convicted the first co... \n", - "1281 sport hewitt falls to dent lleyton hewitt suffered a... \n", - "844 tech why cell will get the hard sell the world is c... \n", - "1188 entertainment belle named best scottish band belle & sebas... \n", - "1573 business karachi stocks hit historic high the karachi s... \n", + "1515 business booming markets shed few tears the market for... \n", + "980 sport claxton hunting first major medal british hurd... \n", + "1634 tech sony psp handheld console hits us the latest h... \n", + "1053 entertainment black sabbath top rock album poll black sabbat... \n", + "1870 sport jones doping probe begins an investigation int... \n", "\n", " tokens \n", - "1992 -PRON- peer - to - peer pirate convict the fir... \n", - "1281 hewitt fall to dent lleyton hewitt suffer a sh... \n", - "844 why cell will get the hard sell the world be c... \n", - "1188 belle name good scottish band belle & se... \n", - "1573 karachi stock hit historic high the karachi st... " + "1515 boom market shed few tear the market former... \n", + "980 claxton hunt first major medal british hurdler... \n", + "1634 sony psp handheld console hit -PRON- the late ... \n", + "1053 black sabbath top rock album poll black sabbat... \n", + "1870 jone dope probe begin an investigation into do... " ] }, - "execution_count": 71, + "execution_count": 22, "metadata": {}, "output_type": "execute_result" } @@ -564,7 +569,7 @@ }, { "cell_type": "code", - "execution_count": 72, + "execution_count": 23, "metadata": { "scrolled": true }, @@ -572,71 +577,71 @@ { "data": { "text/plain": [ - "1992 [peer, copyright, piracy, network, plead, guil...\n", - "1281 [seed, hewitt, break, feel, beat, strong, four...\n", - "844 [cell, processor, technology, sony, computer, ...\n", - "1188 [scottish, band, brit, musical, list, act, awa...\n", - "1573 [market, stock, analyst, political, index, mon...\n", - "687 [film, institute, news, trend, broadcast, cite...\n", - "1830 [rule, consumer, mobile, firm, service, phone,...\n", - "1134 [net, standard, dr, address, work, challenge, ...\n", - "1015 [rugby, glasgow, edinburgh, murray, border, ro...\n", - "1665 [olympic, football, game, career, woman, final...\n", - "1648 [referee, apologise, arsenal, match, assistant...\n", - "487 [club, manager, return, at, unveil, jone, as, ...\n", - "1124 [lewis, council, labour, football, wage, gover...\n", - "1094 [gold, debt, relief, reserve, meeting, price, ...\n", - "744 [advert, drug, article, medical, employee, let...\n", - "939 [musical, theatre, stage, kelly, absolute, per...\n", - "1742 [creative, art, technology, graphic, bt, engin...\n", - "1368 [debt, relief, brown, uk, chancellor, poverty,...\n", - "880 [child, film, original, screen, show, that, mo...\n", - "136 [sing, tune, theme, die, perform, singer, show...\n", - "376 [olympic, test, athlete, decision, appeal, mot...\n", - "1558 [newcastle, henry, season, game, play, arsenal...\n", - "521 [bt, broadband, customer, call, offer, free, i...\n", - "1760 [goal, score, didn, win, that, good, spirit, p...\n", - "34 [guilty, plead, insurance, investigation, exec...\n", - "881 [election, young, electoral, vote, commission,...\n", - "302 [euro, company, sport, possible, family, analy...\n", - "515 [actress, notice, immigration, india, work, ye...\n", - "932 [period, quarter, athletic, growth, earning, s...\n", - "1084 [drug, cheap, europe, sell, africa, aid, afric...\n", + "1515 [disaster, market, stock, insurance, global, b...\n", + "980 [medal, hurdle, indoor, european, training, co...\n", + "1634 [sony, device, gaming, handheld, gadget, ninte...\n", + "1053 [band, rock, black, album, list, top, live, po...\n", + "1870 [olympic, jone, truth, medal, sydney, pound, a...\n", + "1135 [store, sale, retailer, december, same, rise, ...\n", + "1034 [jackson, ms, boy, prosecution, court, film, d...\n", + "1061 [festival, sell, event, day, organiser, act, j...\n", + "205 [engine, union, buy, six, motor, plant, italia...\n", + "1500 [program, phone, malicious, file, instal, work...\n", + "2100 [uk, trick, ban, will, super, industry, respon...\n", + "1046 [round, victory, title, really, first, capture...\n", + "1728 [cardiff, thomas, jone, morgan, france, italy,...\n", + "575 [file, server, operator, peer, network, site, ...\n", + "24 [sound, audio, mobile, technology, phone, hand...\n", + "1556 [eu, law, draft, computer, software, legal, im...\n", + "2058 [interactive, award, nomination, category, tv,...\n", + "750 [card, bank, economy, central, debt, consumer,...\n", + "876 [bill, committee, welfare, draft, government, ...\n", + "2149 [project, information, computer, community, lo...\n", + "1056 [ferguson, arsenal, game, football, saturday, ...\n", + "227 [zealand, wale, black, new, cardiff, game, rug...\n", + "1353 [bill, limit, small, government, culture, brit...\n", + "1397 [pension, election, age, vote, party, basic, o...\n", + "2028 [host, american, television, suffer, award, gl...\n", + "1181 [ipod, apple, job, computer, mini, new, mass, ...\n", + "2123 [ticket, green, band, fan, dublin, concert, se...\n", + "77 [break, hodgson, winter, league, premiership, ...\n", + "1075 [game, video, company, news, tag, as, art, eye...\n", + "1201 [bank, italian, institution, sue, company, fin...\n", " ... \n", - "1853 [sequel, star, box, office, weekend, robert, d...\n", - "1390 [labour, blair, cabinet, minister, serve, stan...\n", - "743 [liverpool, league, champion, season, competit...\n", - "715 [lee, film, man, create, book, series, release...\n", - "1842 [alliance, japanese, shareholder, car, talk, s...\n", - "499 [argentina, debt, accept, offer, 6bn, investor...\n", - "461 [musical, sir, film, actress, richard, child, ...\n", - "902 [mobile, tv, service, music, handset, download...\n", - "1014 [tory, tax, howard, cut, election, taxis, plan...\n", - "446 [broadband, tv, analyst, number, research, net...\n", - "222 [jump, title, championship, mark, european, se...\n", - "884 [union, merger, super, executive, hold, meetin...\n", - "1483 [fight, german, band, liam, officer, fine, kic...\n", - "1325 [ask, search, site, entry, web, acquisition, i...\n", - "1257 [prime, mr, blair, chancellor, minister, brown...\n", - "725 [plant, india, factory, indian, official, cons...\n", - "1679 [mail, virus, warn, infect, internet, computer...\n", - "714 [express, financial, american, spin, off, sell...\n", - "1864 [opera, voice, feature, available, page, appea...\n", - "2068 [game, political, campaign, video, learn, tool...\n", - "1651 [deutsche, exchange, bid, stock, talk, cash, o...\n", - "1610 [film, voice, robert, will, girl, actress, web...\n", - "516 [campaign, labour, brown, mr, election, role, ...\n", - "2059 [brown, mr, blair, labour, mps, party, electio...\n", - "841 [france, wale, injury, slam, grand, ireland, n...\n", - "221 [tour, tournament, prize, king, each, gamer, s...\n", - "421 [talent, decide, agree, star, midfielder, play...\n", - "1075 [game, video, company, news, tag, art, as, eye...\n", - "1601 [france, against, wale, ireland, play, england...\n", - "986 [relay, service, phone, language, video, peopl...\n", + "1301 [un, short, ms, authority, tsunami, only, indi...\n", + "2150 [spain, federation, player, henry, comment, in...\n", + "562 [video, offer, demand, sky, cable, tv, program...\n", + "1268 [shoot, texas, control, hunt, let, session, wi...\n", + "364 [festival, disaster, film, ticket, continue, e...\n", + "467 [million, show, audience, figure, 14, episode,...\n", + "2086 [sun, russian, voting, employ, buy, stake, aug...\n", + "235 [growth, rate, consumer, quarter, spending, bu...\n", + "1755 [offer, fresh, as, game, tough, title, level, ...\n", + "672 [microsoft, window, user, system, online, inte...\n", + "732 [jone, gb, championship, indoor, green, olympi...\n", + "455 [download, programme, episode, tv, net, uk, pe...\n", + "635 [digital, design, technology, people, ms, came...\n", + "795 [chelsea, 2000, play, milan, barcelona, leg, b...\n", + "535 [pc, 2010, pcs, china, million, market, local,...\n", + "1199 [film, india, hurt, community, refuse, anger, ...\n", + "264 [consumer, rule, mobile, firm, service, phone,...\n", + "701 [network, file, content, download, music, tech...\n", + "59 [drug, heart, risk, regulator, that, on, disea...\n", + "456 [lord, reform, chancellor, manifesto, house, c...\n", + "2091 [collin, athletic, sport, olympic, competitor,...\n", + "667 [dvd, copy, pirate, piracy, technology, progra...\n", + "164 [suspend, candidate, mr, view, say, party, new...\n", + "393 [policy, economic, inflation, rise, market, re...\n", + "117 [labour, chancellor, cut, conservative, party,...\n", + "207 [blair, question, answer, trust, thing, say, p...\n", + "343 [blair, peace, mr, conference, leader, iraq, v...\n", + "675 [party, election, mr, leadership, assembly, ro...\n", + "2141 [medium, traditional, information, web, mainst...\n", + "132 [wale, william, flanker, cardiff, fit, injury,...\n", "Name: tokens, Length: 445, dtype: object" ] }, - "execution_count": 72, + "execution_count": 23, "metadata": {}, "output_type": "execute_result" } @@ -647,10 +652,8 @@ }, { "cell_type": "code", - "execution_count": 73, - "metadata": { - "collapsed": true - }, + "execution_count": 24, + "metadata": {}, "outputs": [], "source": [ "test_tfidf_matrix = tfidf.apply_tfidf_to_documents(list(test.tokens))" @@ -658,23 +661,25 @@ }, { "cell_type": "code", - "execution_count": 74, + "execution_count": 25, "metadata": {}, "outputs": [ { "data": { "text/plain": [ - "{'cell': 94.188,\n", - " 'mobile': 92.405,\n", - " 'camera': 90.674,\n", - " 'mini': 89.254,\n", - " 'china': 87.516,\n", - " 'rugby': 85.906,\n", - " 'film': 82.031,\n", - " 'bt': 76.256}" + "{'zealand': 157.747,\n", + " 'gadget': 137.671,\n", + " 'child': 100.98,\n", + " 'camera': 91.062,\n", + " 'wale': 86.221,\n", + " 'mini': 85.866,\n", + " 'bt': 77.836,\n", + " 'soul': 77.567,\n", + " 'council': 76.619,\n", + " 'jackson': 74.892}" ] }, - "execution_count": 74, + "execution_count": 25, "metadata": {}, "output_type": "execute_result" } @@ -682,15 +687,6 @@ "source": [ "tfidf.get_top_tfidf(test_tfidf_matrix)" ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [] } ], "metadata": { @@ -709,7 +705,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.7.0" + "version": "3.7.3" } }, "nbformat": 4, diff --git a/notebooks/Benchmark text processing tools.ipynb b/notebooks/Benchmark text processing tools.ipynb index 08ff2af..14b08ff 100644 --- a/notebooks/Benchmark text processing tools.ipynb +++ b/notebooks/Benchmark text processing tools.ipynb @@ -9,10 +9,8 @@ }, { "cell_type": "code", - "execution_count": 2, - "metadata": { - "collapsed": true - }, + "execution_count": 1, + "metadata": {}, "outputs": [], "source": [ "from urllib import request" @@ -27,10 +25,8 @@ }, { "cell_type": "code", - "execution_count": 157, - "metadata": { - "collapsed": true - }, + "execution_count": 2, + "metadata": {}, "outputs": [], "source": [ "url = \"https://www.gutenberg.org/cache/epub/5711/pg5711.txt\"" @@ -38,10 +34,8 @@ }, { "cell_type": "code", - "execution_count": 158, - "metadata": { - "collapsed": true - }, + "execution_count": 3, + "metadata": {}, "outputs": [], "source": [ "response = request.urlopen(url)\n", @@ -50,7 +44,7 @@ }, { "cell_type": "code", - "execution_count": 159, + "execution_count": 4, "metadata": {}, "outputs": [ { @@ -78,7 +72,7 @@ }, { "cell_type": "code", - "execution_count": 160, + "execution_count": 5, "metadata": {}, "outputs": [ { @@ -87,7 +81,7 @@ "str" ] }, - "execution_count": 160, + "execution_count": 5, "metadata": {}, "output_type": "execute_result" } @@ -98,7 +92,7 @@ }, { "cell_type": "code", - "execution_count": 161, + "execution_count": 6, "metadata": { "scrolled": true }, @@ -109,7 +103,7 @@ "1046377" ] }, - "execution_count": 161, + "execution_count": 6, "metadata": {}, "output_type": "execute_result" } @@ -127,10 +121,8 @@ }, { "cell_type": "code", - "execution_count": 163, - "metadata": { - "collapsed": true - }, + "execution_count": 7, + "metadata": {}, "outputs": [], "source": [ "url = \"http://www.gutenberg.org/files/2554/2554-0.txt\"" @@ -138,10 +130,8 @@ }, { "cell_type": "code", - "execution_count": 164, - "metadata": { - "collapsed": true - }, + "execution_count": 8, + "metadata": {}, "outputs": [], "source": [ "response = request.urlopen(url)\n", @@ -150,7 +140,7 @@ }, { "cell_type": "code", - "execution_count": 169, + "execution_count": 9, "metadata": {}, "outputs": [ { @@ -184,7 +174,7 @@ }, { "cell_type": "code", - "execution_count": 166, + "execution_count": 10, "metadata": {}, "outputs": [ { @@ -193,7 +183,7 @@ "str" ] }, - "execution_count": 166, + "execution_count": 10, "metadata": {}, "output_type": "execute_result" } @@ -204,7 +194,7 @@ }, { "cell_type": "code", - "execution_count": 167, + "execution_count": 11, "metadata": {}, "outputs": [ { @@ -213,7 +203,7 @@ "1176967" ] }, - "execution_count": 167, + "execution_count": 11, "metadata": {}, "output_type": "execute_result" } @@ -233,9 +223,18 @@ }, { "cell_type": "code", - "execution_count": 106, + "execution_count": 12, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "[nltk_data] Downloading package punkt to /root/nltk_data...\n", + "[nltk_data] Package punkt is already up-to-date!\n" + ] + } + ], "source": [ "from nautilus_nlp.preprocessing.tokenizer import tokenize, untokenize" ] @@ -249,7 +248,7 @@ }, { "cell_type": "code", - "execution_count": 112, + "execution_count": 13, "metadata": { "scrolled": true }, @@ -258,8 +257,8 @@ "name": "stdout", "output_type": "stream", "text": [ - "CPU times: user 1.18 s, sys: 44 ms, total: 1.22 s\n", - "Wall time: 1.24 s\n" + "CPU times: user 1.84 s, sys: 84.1 ms, total: 1.93 s\n", + "Wall time: 1.93 s\n" ] } ], @@ -270,14 +269,14 @@ }, { "cell_type": "code", - "execution_count": 125, + "execution_count": 14, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "920 ms ± 18.4 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)\n" + "768 ms ± 12.7 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)\n" ] } ], @@ -286,6 +285,15 @@ "tokenized = tokenize(rawfr[:1000000], lang_module=\"fr_spacy\")" ] }, + { + "cell_type": "code", + "execution_count": 18, + "metadata": {}, + "outputs": [], + "source": [ + "tokenized = tokenize(rawfr[:1000000], lang_module=\"fr_spacy\")" + ] + }, { "cell_type": "markdown", "metadata": {}, @@ -295,15 +303,15 @@ }, { "cell_type": "code", - "execution_count": 115, + "execution_count": 15, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "CPU times: user 21.7 s, sys: 289 ms, total: 22 s\n", - "Wall time: 22.4 s\n" + "CPU times: user 15.6 s, sys: 18.9 ms, total: 15.6 s\n", + "Wall time: 15.6 s\n" ] } ], @@ -314,14 +322,14 @@ }, { "cell_type": "code", - "execution_count": 126, + "execution_count": 19, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "2.54 s ± 27 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)\n" + "1.78 s ± 45.2 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)\n" ] } ], @@ -332,7 +340,16 @@ }, { "cell_type": "code", - "execution_count": 119, + "execution_count": 22, + "metadata": {}, + "outputs": [], + "source": [ + "tokenized_moses = tokenize(rawfr[:1000000], lang_module=\"fr_moses\")" + ] + }, + { + "cell_type": "code", + "execution_count": 23, "metadata": {}, "outputs": [ { @@ -350,7 +367,7 @@ }, { "cell_type": "code", - "execution_count": 123, + "execution_count": 24, "metadata": {}, "outputs": [ { @@ -367,7 +384,7 @@ }, { "cell_type": "code", - "execution_count": 124, + "execution_count": 25, "metadata": {}, "outputs": [ { @@ -391,18 +408,9 @@ }, { "cell_type": "code", - "execution_count": 170, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "CPU times: user 5 s, sys: 102 ms, total: 5.1 s\n", - "Wall time: 5.17 s\n" - ] - } - ], + "outputs": [], "source": [ "%%time\n", "tokenized_eng = tokenize(raw[:1000000], lang_module=\"en_spacy\")" @@ -410,7 +418,16 @@ }, { "cell_type": "code", - "execution_count": 171, + "execution_count": 33, + "metadata": {}, + "outputs": [], + "source": [ + "tokenized_eng = tokenize(raw[:1000000], lang_module=\"en_spacy\")" + ] + }, + { + "cell_type": "code", + "execution_count": 34, "metadata": { "scrolled": true }, @@ -419,7 +436,7 @@ "name": "stdout", "output_type": "stream", "text": [ - "5.26 s ± 740 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)\n" + "260 ms ± 1.28 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)\n" ] } ], @@ -430,7 +447,7 @@ }, { "cell_type": "code", - "execution_count": 172, + "execution_count": 35, "metadata": {}, "outputs": [ { @@ -448,7 +465,7 @@ " 'by']" ] }, - "execution_count": 172, + "execution_count": 35, "metadata": {}, "output_type": "execute_result" } @@ -466,15 +483,15 @@ }, { "cell_type": "code", - "execution_count": 173, + "execution_count": 30, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "CPU times: user 2.17 s, sys: 29.3 ms, total: 2.2 s\n", - "Wall time: 2.22 s\n" + "CPU times: user 1.56 s, sys: 28 ms, total: 1.58 s\n", + "Wall time: 1.58 s\n" ] } ], @@ -485,14 +502,23 @@ }, { "cell_type": "code", - "execution_count": 174, + "execution_count": 36, + "metadata": {}, + "outputs": [], + "source": [ + "tokenized_eng_nltk = tokenize(raw[:1000000], lang_module=\"en_nltk\")" + ] + }, + { + "cell_type": "code", + "execution_count": 31, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "2.47 s ± 565 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)\n" + "1.54 s ± 27.9 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)\n" ] } ], @@ -503,7 +529,7 @@ }, { "cell_type": "code", - "execution_count": 175, + "execution_count": 37, "metadata": {}, "outputs": [ { @@ -521,7 +547,7 @@ " 'by']" ] }, - "execution_count": 175, + "execution_count": 37, "metadata": {}, "output_type": "execute_result" } @@ -539,10 +565,8 @@ }, { "cell_type": "code", - "execution_count": 135, - "metadata": { - "collapsed": true - }, + "execution_count": 38, + "metadata": {}, "outputs": [], "source": [ "from nautilus_nlp.preprocessing.stemming import stem_tokens" @@ -550,15 +574,15 @@ }, { "cell_type": "code", - "execution_count": 136, + "execution_count": 39, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "CPU times: user 7.91 s, sys: 37.3 ms, total: 7.95 s\n", - "Wall time: 7.98 s\n" + "CPU times: user 4.19 s, sys: 20 ms, total: 4.21 s\n", + "Wall time: 4.21 s\n" ] } ], @@ -569,14 +593,14 @@ }, { "cell_type": "code", - "execution_count": 137, + "execution_count": 40, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "8.48 s ± 682 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)\n" + "4.25 s ± 61.5 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)\n" ] } ], @@ -601,17 +625,17 @@ }, { "cell_type": "code", - "execution_count": 138, + "execution_count": 41, "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ - "[nltk_data] Downloading package wordnet to /Users/hugo/nltk_data...\n", + "[nltk_data] Downloading package wordnet to /root/nltk_data...\n", "[nltk_data] Package wordnet is already up-to-date!\n", "[nltk_data] Downloading package averaged_perceptron_tagger to\n", - "[nltk_data] /Users/hugo/nltk_data...\n", + "[nltk_data] /root/nltk_data...\n", "[nltk_data] Package averaged_perceptron_tagger is already up-to-\n", "[nltk_data] date!\n" ] @@ -623,10 +647,8 @@ }, { "cell_type": "code", - "execution_count": 141, - "metadata": { - "collapsed": true - }, + "execution_count": 42, + "metadata": {}, "outputs": [], "source": [ "from nautilus_nlp.preprocessing.preprocess import remove_tokens_with_nonletters" @@ -634,7 +656,7 @@ }, { "cell_type": "code", - "execution_count": 143, + "execution_count": 43, "metadata": { "scrolled": true }, @@ -645,15 +667,15 @@ }, { "cell_type": "code", - "execution_count": 144, + "execution_count": 46, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "CPU times: user 26.7 s, sys: 6.91 s, total: 33.6 s\n", - "Wall time: 36.5 s\n" + "CPU times: user 21.9 s, sys: 8.62 s, total: 30.6 s\n", + "Wall time: 30.6 s\n" ] } ], @@ -664,7 +686,16 @@ }, { "cell_type": "code", - "execution_count": 155, + "execution_count": 47, + "metadata": {}, + "outputs": [], + "source": [ + "lemmatized_tokens = lemmatize_french_tokens(tokenized, module='spacy')" + ] + }, + { + "cell_type": "code", + "execution_count": 48, "metadata": {}, "outputs": [ { @@ -688,9 +719,8 @@ }, { "cell_type": "code", - "execution_count": 147, + "execution_count": 49, "metadata": { - "collapsed": true, "scrolled": true }, "outputs": [], @@ -700,10 +730,8 @@ }, { "cell_type": "code", - "execution_count": 180, - "metadata": { - "collapsed": true - }, + "execution_count": 50, + "metadata": {}, "outputs": [], "source": [ "tokenized_eng = remove_tokens_with_nonletters(tokenized_eng)" @@ -711,15 +739,15 @@ }, { "cell_type": "code", - "execution_count": 181, + "execution_count": 51, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "CPU times: user 29.3 s, sys: 6.85 s, total: 36.2 s\n", - "Wall time: 38.3 s\n" + "CPU times: user 24.3 s, sys: 11.3 s, total: 35.6 s\n", + "Wall time: 35.6 s\n" ] } ], @@ -730,15 +758,24 @@ }, { "cell_type": "code", - "execution_count": 182, + "execution_count": 52, + "metadata": {}, + "outputs": [], + "source": [ + "lemmatized_eng = lemmatize_english_tokens(tokenized_eng, module='spacy')" + ] + }, + { + "cell_type": "code", + "execution_count": 53, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "CPU times: user 34.4 s, sys: 3.82 s, total: 38.2 s\n", - "Wall time: 39.4 s\n" + "CPU times: user 20.5 s, sys: 706 ms, total: 21.2 s\n", + "Wall time: 21.1 s\n" ] } ], @@ -749,7 +786,16 @@ }, { "cell_type": "code", - "execution_count": 186, + "execution_count": 54, + "metadata": {}, + "outputs": [], + "source": [ + "lemmatized_eng_nltk = lemmatize_english_tokens(tokenized_eng, module='nltk')" + ] + }, + { + "cell_type": "code", + "execution_count": 55, "metadata": {}, "outputs": [ { @@ -766,7 +812,7 @@ }, { "cell_type": "code", - "execution_count": 184, + "execution_count": 56, "metadata": {}, "outputs": [ { @@ -783,7 +829,7 @@ }, { "cell_type": "code", - "execution_count": 185, + "execution_count": 57, "metadata": {}, "outputs": [ { @@ -797,6 +843,13 @@ "source": [ "print(lemmatized_eng_nltk[1000:1200])" ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] } ], "metadata": { @@ -815,7 +868,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.7.0" + "version": "3.7.3" } }, "nbformat": 4, diff --git a/notebooks/Language_identification.ipynb b/notebooks/Language_identification.ipynb index 4f00ebf..bd7b852 100644 --- a/notebooks/Language_identification.ipynb +++ b/notebooks/Language_identification.ipynb @@ -10,7 +10,7 @@ }, { "cell_type": "code", - "execution_count": 27, + "execution_count": 1, "metadata": {}, "outputs": [], "source": [ @@ -42,11 +42,23 @@ }, { "cell_type": "code", - "execution_count": 28, + "execution_count": 6, "metadata": {}, - "outputs": [], + "outputs": [ + { + "ename": "TypeError", + "evalue": "__init__() got an unexpected keyword argument 'typemodel'", + "output_type": "error", + "traceback": [ + "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", + "\u001b[0;31mTypeError\u001b[0m Traceback (most recent call last)", + "\u001b[0;32m<ipython-input-6-1929b26ba9a1>\u001b[0m in \u001b[0;36m<module>\u001b[0;34m\u001b[0m\n\u001b[1;32m 1\u001b[0m \u001b[0;32mfrom\u001b[0m \u001b[0mnautilus_nlp\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mmodels\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mlanguage_detector\u001b[0m \u001b[0;32mimport\u001b[0m \u001b[0mLangDetector\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 2\u001b[0;31m \u001b[0mdetector\u001b[0m\u001b[0;34m=\u001b[0m \u001b[0mLangDetector\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mtypemodel\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;34m'fasttext'\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 3\u001b[0m \u001b[0mdetector2\u001b[0m\u001b[0;34m=\u001b[0m \u001b[0mLangDetector\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mtypemodel\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;34m'cld2'\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;31mTypeError\u001b[0m: __init__() got an unexpected keyword argument 'typemodel'" + ] + } + ], "source": [ - "from nautilus_nlp.models.Language_detector import LangDetector\n", + "from nautilus_nlp.models.language_detector import LangDetector\n", "detector= LangDetector(typemodel='fasttext')\n", "detector2= LangDetector(typemodel='cld2')" ] @@ -60,38 +72,25 @@ }, { "cell_type": "code", - "execution_count": 29, + "execution_count": 3, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "Ne l fin de l seclo XIX l Japon era inda çconhecido i sótico pa l mundo oucidental. Cula antroduçon de la stética japonesa, particularmente na Sposiçon Ounibersal de 1900, an Paris, l Oucidente adquiriu un apetite ansaciable pul Japon i Heiarn se tornou mundialmente coincido pula perfundidade, ouriginalidade i sinceridade de ls sous cuntos. An sous radadeiros anhos, alguns críticos, cumo George Orwell, acusórun Heiarn de trasferir sou nacionalismo i fazer l Japon parecer mais sótico, mas, cumo l'home qu'oufereciu al Oucidente alguns de sous purmeiros lampeijos de l Japon pré-andustrial i de l Período Meiji, sou trabalho inda ye balioso até hoije.\n", - "('pt', 0.41855213046073914)\n", - "('pt', 0.54)\n", - "\n", - "\n", - "Schiedam is gelegen tussen Rotterdam en Vlaardingen, oorspronkelijk aan de Schie en later ook aan de Nieuwe Maas. Per 30 april 2017 had de gemeente 77.833 inwoners (bron: CBS). De stad is vooral bekend om haar jenever, de historische binnenstad met grachten, en de hoogste windmolens ter wereld.\n", - "('nl', 0.9266586899757385)\n", - "('nl', 0.99)\n", - "\n", - "\n", - "ГIурусаз батальонал, гьоркьор гIарадабиги лъун, ункъбокIон (каре) гьабун чIезарун руго. ТIаде гIарададул сачмаги гуллаги байдал, АхIмадханил бо тIурун буго. ГIумаханас цойгидал боязе тIаде кIанцIизе буюрухъ кьун буго. Гьезулги жо ккун гьечIо. Цинги живго ГIумахан кIанцIун вуго тушманасде тIаде («угъузилал рачун, дайтилал рачун, маххулъан бер баккун хунз цадахъ рачун»). Нахъе къалел ругел магIарулазда гьес гьарулеб букIун буго: «Нужеца яхI бахъе, гIолохъаби! Нилъеда данде гьал чIоларо», – ян.\n", - "('ru', 0.38813528418540955)\n", - "('uz', 0.99)\n", - "\n", - "\n", - "ರಾಜ್ಯಶಾಸ್ತ್ರದ ಪಿತಾಮಹೆ ಅರಿಸ್ಟಾಟಲ್. ರಾಜ್ಯಶಾಸ್ತ್ರದ ವೈಜ್ನಾನಿಕವಾದ್ ಅದ್ಯಾಯನ ಮಲ್ದಿನಾರ್ ಅರಿಸ್ಟಾಟಲ್. ಮೇರ್ 158 ರಾಷ್ಟ್ರದ ಸಂವಿಧಾನಲೆನ್ ಅರ್ಥ ಮಲ್ತೊನ್ದ್ the politics ಕೃತಿ ರಚನೆ ಮಲ್ದೆರ್. ಮೇರ್ ಕ್ರಿ.ಪೂ 387 ಗ್ರೀಕ್ ಸ್ಟಾಗಿರಡ್ ಜನಿಸಿಯೆರ್. ಮೆರೆನ ಅಮ್ಮೆರ್ ಮೆಸೆದೊನಿಯ ಅರಸೆರ್ನ ರಾಜವೈದ್ಯರ್ ಅದುದ್ ಇತ್ತೆರ್. ಎಲ್ಳಡೆ ಮೆರ್ ತತ್ವಶಾಸ್ತ್ರ,ಅರ್ಥಶಾಸ್ತ್ರ,ಸಂಗೀತ,ವಿಜ್ನಾನ,ಪೌರನೀತಿ,ಗಣಿತ ನೆಟ್ಟ್ ಪರಂಗತೆರ್ ಅದುದ್ ಇತ್ತೆರ್. ವಿದ್ಯಾಭ್ಯಾಸ ಮುಗಿ ಬೊಕ್ಕ ಪ್ಲೇಟೋ ಗ್ರೀಕ್ ತತ್ವಜ್ನಾನಿನೊಟ್ ಸೆರೊಂಡೆರ್. ಪ್ಲೇಟೋನ ಅಕಾಡೆಮಿಡ್ ಮಸ್ತ್ ವರ್ಷ ಬೇಲೆ ಮಲ್ತೆರ್. ಅಕಾಡೆಮಿಡ್ ನಿರ್ದೆಶೆಕೆರ್ನ ಹುದ್ದೆ ತಿಕ್ಕಂದೆ ಬೆಜರ್ ಅದುದ್ ಲೈಸಿಯಮ್ ಪನ್ಪಿನ ವಿಶ್ವವಿದ್ಯಾನಿಲಯ ಸ್ಥಾಪನೆ ಮಲ್ತೆರ್. ಬಿಕ್ಕ ಒಂತೆ ಸಮಯ ಅಲೆಗ್ಸಾಂಡರ್ ಚಕ್ರವರ್ತಿಗ್ ಗುರುವಾದ್ ಬೇಲೆ ಮಲ್ತೆರ್. ಮೇರ್ ಬರೆತಿನ ಪುಸ್ತಕ the politics,history of animals,metaphysics ಇತ್ಯಾದಿ.\n", - "('kn', 0.9979031085968018)\n", - "('kn', 0.96)\n", - "\n", - "\n", - "Halukum adalah kelenjar tiroid nang menonjol di gulu lalakian. Awan bibinian penonjolan nangini ada ai jua, tagal kada pati rancak. Lamun penampilan halukum dirasa pina talalu ganal, hal ini kawa diperbaiki awan operasi pelastik.\n", - "('id', 0.4194313585758209)\n", - "('ms', 0.99)\n", - "\n", - "\n" + "Ne l fin de l seclo XIX l Japon era inda çconhecido i sótico pa l mundo oucidental. Cula antroduçon de la stética japonesa, particularmente na Sposiçon Ounibersal de 1900, an Paris, l Oucidente adquiriu un apetite ansaciable pul Japon i Heiarn se tornou mundialmente coincido pula perfundidade, ouriginalidade i sinceridade de ls sous cuntos. An sous radadeiros anhos, alguns críticos, cumo George Orwell, acusórun Heiarn de trasferir sou nacionalismo i fazer l Japon parecer mais sótico, mas, cumo l'home qu'oufereciu al Oucidente alguns de sous purmeiros lampeijos de l Japon pré-andustrial i de l Período Meiji, sou trabalho inda ye balioso até hoije.\n" + ] + }, + { + "ename": "NameError", + "evalue": "name 'detector' is not defined", + "output_type": "error", + "traceback": [ + "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", + "\u001b[0;31mNameError\u001b[0m Traceback (most recent call last)", + "\u001b[0;32m<ipython-input-3-f1145461d744>\u001b[0m in \u001b[0;36m<module>\u001b[0;34m\u001b[0m\n\u001b[1;32m 1\u001b[0m \u001b[0;32mfor\u001b[0m \u001b[0mi\u001b[0m \u001b[0;32min\u001b[0m \u001b[0mrange\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;36m0\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;36m5\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 2\u001b[0m \u001b[0mprint\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mtest\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mi\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 3\u001b[0;31m \u001b[0mprint\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mdetector\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mdetect_language\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mtest\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mi\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 4\u001b[0m \u001b[0mprint\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mdetector2\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mdetect_language\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mtest\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mi\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 5\u001b[0m \u001b[0mprint\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m'\\n'\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;31mNameError\u001b[0m: name 'detector' is not defined" ] } ], @@ -194,7 +193,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.7.2" + "version": "3.7.3" } }, "nbformat": 4, diff --git a/notebooks/Sentiment analysis using pre-trained models.ipynb b/notebooks/Sentiment analysis using pre-trained models.ipynb index e94675a..35c57d4 100644 --- a/notebooks/Sentiment analysis using pre-trained models.ipynb +++ b/notebooks/Sentiment analysis using pre-trained models.ipynb @@ -9,25 +9,16 @@ }, { "cell_type": "code", - "execution_count": 1, + "execution_count": 2, "metadata": {}, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "[nltk_data] Downloading package punkt to /Users/hugo/nltk_data...\n", - "[nltk_data] Package punkt is already up-to-date!\n" - ] - } - ], + "outputs": [], "source": [ - "from nautilus_nlp.models.sentiment import compute_sentiment_score" + "from nautilus_nlp.models.sentiment_detector import compute_sentiment_score" ] }, { "cell_type": "code", - "execution_count": 2, + "execution_count": 3, "metadata": {}, "outputs": [ { @@ -36,7 +27,7 @@ "-0.4234" ] }, - "execution_count": 2, + "execution_count": 3, "metadata": {}, "output_type": "execute_result" } @@ -47,7 +38,7 @@ }, { "cell_type": "code", - "execution_count": 7, + "execution_count": 4, "metadata": {}, "outputs": [ { @@ -56,7 +47,7 @@ "0.6369" ] }, - "execution_count": 7, + "execution_count": 4, "metadata": {}, "output_type": "execute_result" } @@ -67,7 +58,7 @@ }, { "cell_type": "code", - "execution_count": 8, + "execution_count": 5, "metadata": {}, "outputs": [ { @@ -76,7 +67,7 @@ "0.5" ] }, - "execution_count": 8, + "execution_count": 5, "metadata": {}, "output_type": "execute_result" } @@ -87,7 +78,7 @@ }, { "cell_type": "code", - "execution_count": 21, + "execution_count": 6, "metadata": {}, "outputs": [ { @@ -96,7 +87,7 @@ "-1.0" ] }, - "execution_count": 21, + "execution_count": 6, "metadata": {}, "output_type": "execute_result" } @@ -107,7 +98,7 @@ }, { "cell_type": "code", - "execution_count": 17, + "execution_count": 7, "metadata": {}, "outputs": [ { @@ -116,7 +107,7 @@ "-0.5" ] }, - "execution_count": 17, + "execution_count": 7, "metadata": {}, "output_type": "execute_result" } @@ -127,7 +118,7 @@ }, { "cell_type": "code", - "execution_count": 18, + "execution_count": 8, "metadata": {}, "outputs": [ { @@ -136,7 +127,7 @@ "-1.0" ] }, - "execution_count": 18, + "execution_count": 8, "metadata": {}, "output_type": "execute_result" } @@ -144,15 +135,6 @@ "source": [ "compute_sentiment_score(\"C'est horrible\",lang_module=\"fr_textblob\")" ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [] } ], "metadata": { @@ -171,7 +153,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.7.0" + "version": "3.7.3" } }, "nbformat": 4, diff --git a/notebooks/Sentiment_analysis_FT.ipynb b/notebooks/Sentiment_analysis_FT.ipynb index 2171909..3690d34 100644 --- a/notebooks/Sentiment_analysis_FT.ipynb +++ b/notebooks/Sentiment_analysis_FT.ipynb @@ -2,7 +2,7 @@ "cells": [ { "cell_type": "code", - "execution_count": null, + "execution_count": 1, "metadata": {}, "outputs": [], "source": [ @@ -22,7 +22,19 @@ "cell_type": "code", "execution_count": 3, "metadata": {}, - "outputs": [], + "outputs": [ + { + "ename": "NameError", + "evalue": "name 'train' is not defined", + "output_type": "error", + "traceback": [ + "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", + "\u001b[0;31mNameError\u001b[0m Traceback (most recent call last)", + "\u001b[0;32m<ipython-input-3-56711baad5fa>\u001b[0m in \u001b[0;36m<module>\u001b[0;34m\u001b[0m\n\u001b[1;32m 23\u001b[0m \u001b[0mprint\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34mf'__label__{row[\"target\"]} {text}'\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mfile\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mtest\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 24\u001b[0m \u001b[0;32melse\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m---> 25\u001b[0;31m \u001b[0mprint\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34mf'__label__{row[\"target\"]} {text}'\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mfile\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mtrain\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", + "\u001b[0;31mNameError\u001b[0m: name 'train' is not defined" + ] + } + ], "source": [ "\n", "train = open('../data/processed/tweets.train','w',encoding='utf-8') \n", @@ -232,7 +244,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.7.1" + "version": "3.7.3" } }, "nbformat": 4, diff --git a/notebooks/Spacy_model.ipynb b/notebooks/Spacy_model.ipynb index a798b81..0c4f587 100644 --- a/notebooks/Spacy_model.ipynb +++ b/notebooks/Spacy_model.ipynb @@ -2,18 +2,9 @@ "cells": [ { "cell_type": "code", - "execution_count": 8, + "execution_count": 1, "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "The autoreload extension is already loaded. To reload it, use:\n", - " %reload_ext autoreload\n" - ] - } - ], + "outputs": [], "source": [ "%load_ext autoreload\n", "\n", @@ -22,7 +13,7 @@ }, { "cell_type": "code", - "execution_count": 12, + "execution_count": 2, "metadata": {}, "outputs": [], "source": [ @@ -31,7 +22,7 @@ }, { "cell_type": "code", - "execution_count": 9, + "execution_count": 3, "metadata": {}, "outputs": [], "source": [ @@ -40,7 +31,7 @@ }, { "cell_type": "code", - "execution_count": 11, + "execution_count": 4, "metadata": {}, "outputs": [], "source": [ @@ -49,7 +40,7 @@ }, { "cell_type": "code", - "execution_count": 13, + "execution_count": 5, "metadata": {}, "outputs": [ { @@ -67,13 +58,13 @@ " 'lemmatizer',\n", " '.',\n", " 'a',\n", - " 'lui',\n", + " 'toi',\n", " 'de',\n", " 'jouer',\n", " 'spacy']" ] }, - "execution_count": 13, + "execution_count": 5, "metadata": {}, "output_type": "execute_result" } @@ -84,7 +75,7 @@ }, { "cell_type": "code", - "execution_count": 14, + "execution_count": 6, "metadata": {}, "outputs": [ { @@ -94,7 +85,7 @@ " [A, toi, de, jouer, spacy]]" ] }, - "execution_count": 14, + "execution_count": 6, "metadata": {}, "output_type": "execute_result" } @@ -127,7 +118,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.7.1" + "version": "3.7.3" } }, "nbformat": 4, diff --git a/notebooks/Visualization tools.ipynb b/notebooks/Visualization tools.ipynb index a2c3baa..50c582b 100644 --- a/notebooks/Visualization tools.ipynb +++ b/notebooks/Visualization tools.ipynb @@ -2,9 +2,21 @@ "cells": [ { "cell_type": "code", - "execution_count": 16, + "execution_count": 3, "metadata": {}, - "outputs": [], + "outputs": [ + { + "ename": "ModuleNotFoundError", + "evalue": "No module named 'nautilus_nlp.visualization'", + "output_type": "error", + "traceback": [ + "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", + "\u001b[0;31mModuleNotFoundError\u001b[0m Traceback (most recent call last)", + "\u001b[0;32m<ipython-input-3-6aa84683348e>\u001b[0m in \u001b[0;36m<module>\u001b[0;34m\u001b[0m\n\u001b[0;32m----> 1\u001b[0;31m \u001b[0;32mfrom\u001b[0m \u001b[0mnautilus_nlp\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mvisualization\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mvisualize\u001b[0m \u001b[0;32mimport\u001b[0m \u001b[0mprint_concordance\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 2\u001b[0m \u001b[0;32mfrom\u001b[0m \u001b[0mnautilus_nlp\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mvisualization\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mvisualize\u001b[0m \u001b[0;32mimport\u001b[0m \u001b[0mmake_word_cloud\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 3\u001b[0m \u001b[0;32mfrom\u001b[0m \u001b[0mcollections\u001b[0m \u001b[0;32mimport\u001b[0m \u001b[0mCounter\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;31mModuleNotFoundError\u001b[0m: No module named 'nautilus_nlp.visualization'" + ] + } + ], "source": [ "from nautilus_nlp.visualization.visualize import print_concordance\n", "from nautilus_nlp.visualization.visualize import make_word_cloud\n", @@ -13,10 +25,8 @@ }, { "cell_type": "code", - "execution_count": 12, - "metadata": { - "collapsed": true - }, + "execution_count": null, + "metadata": {}, "outputs": [], "source": [ "import sys" @@ -24,7 +34,7 @@ }, { "cell_type": "code", - "execution_count": 13, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ @@ -33,38 +43,16 @@ }, { "cell_type": "code", - "execution_count": 14, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "14 matches for \"recouvrement\":\n", - "le client est en relation avec un prestataire de recouvrement il demande les coordonnées téléphoniques du pres\n", - " les coordonnées téléphoniques du prestataire de recouvrement souhaite des renseignements sur son plan d apure\n", - "le client est en relation avec un prestataire de recouvrement ok maj ok fel kole bp appel popur régler sa fact\n", - "e sol desur cette facture de euros somme payé au recouvrement solde a se jour a zéro appel d un tiers oui nom \n", - "epouse signale qu elle n arrive pas a joindre le recouvrement pour leurs signaléun paiement qu elle a faite ce\n", - "a cliente et se renseigne sur les sommes dues au recouvrement ainsi que les prelevement s avenirs conversation\n", - "ur son rétablissement savoir siil avait réglé au recouvrement cliente appel pour nous dire que elle payera sa \n", - "dire que elle payera sa facture de le octobre la recouvrement n arrete pas de l appeler facture en recouvremen\n", - "ecouvrement n arrete pas de l appeler facture en recouvrement donné n retrouve pour délai de paiement en juill\n", - "ransféré actions réalisées numéros du service de recouvrement réponse apportée ras miseau contentieux chez XXX\n", - "le client est en relation avec unpre stataire de recouvrement il demande les coordonnées téléphoniques du pres\n", - " les coordonnées téléphoniques du prestataire de recouvrement souhaite des ren mise au contentieux chez XXX le\n", - "le client est en relation avec un prestataire de recouvrement il demande les coordonnées téléphoniqu esdu pres\n", - " les coordonnées téléphoniqu esdu prestataire de recouvrement num contentia donner\n" - ] - } - ], + "outputs": [], "source": [ "print_concordance(some_tokenized_texts, query_word='recouvrement')" ] }, { "cell_type": "code", - "execution_count": 17, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ @@ -73,22 +61,9 @@ }, { "cell_type": "code", - "execution_count": 18, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "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\n", - "text/plain": [ - "<Figure size 1152x648 with 1 Axes>" - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - } - ], + "outputs": [], "source": [ "make_word_cloud(c)" ] @@ -96,9 +71,7 @@ { "cell_type": "code", "execution_count": null, - "metadata": { - "collapsed": true - }, + "metadata": {}, "outputs": [], "source": [] } @@ -119,7 +92,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.7.0" + "version": "3.7.3" } }, "nbformat": 4, diff --git a/notebooks/someadditionalfile.txt b/notebooks/someadditionalfile.txt new file mode 100644 index 0000000..c7de724 --- /dev/null +++ b/notebooks/someadditionalfile.txt @@ -0,0 +1 @@ +Un deuxième exemple de texte en utf-8 cette fois! \ No newline at end of file diff --git a/notebooks/somefile.txt b/notebooks/somefile.txt new file mode 100644 index 0000000..b9855bf --- /dev/null +++ b/notebooks/somefile.txt @@ -0,0 +1 @@ +J'aime les frites bien grasse �talon ch�peau! \ No newline at end of file From 66731df7310da44299a8a200013f2a62b87ea09d Mon Sep 17 00:00:00 2001 From: hugovasselin <waaaouu@gmail.com> Date: Wed, 5 Jun 2019 11:48:14 +0200 Subject: [PATCH 203/496] fix notebook topic modeling #96 --- notebooks/4. Topic Modeling.ipynb | 941 ++++++++++++++++++++++++++++++ 1 file changed, 941 insertions(+) create mode 100644 notebooks/4. Topic Modeling.ipynb diff --git a/notebooks/4. Topic Modeling.ipynb b/notebooks/4. Topic Modeling.ipynb new file mode 100644 index 0000000..56d3efe --- /dev/null +++ b/notebooks/4. Topic Modeling.ipynb @@ -0,0 +1,941 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Topic Modeling" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Step 1: Load the dataset" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "from sklearn.datasets import fetch_20newsgroups\n", + "newsgroups_train = fetch_20newsgroups(subset='train', shuffle = True)\n", + "newsgroups_test = fetch_20newsgroups(subset='test', shuffle = True)" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "['alt.atheism', 'comp.graphics', 'comp.os.ms-windows.misc', 'comp.sys.ibm.pc.hardware', 'comp.sys.mac.hardware', 'comp.windows.x', 'misc.forsale', 'rec.autos', 'rec.motorcycles', 'rec.sport.baseball', 'rec.sport.hockey', 'sci.crypt', 'sci.electronics', 'sci.med', 'sci.space', 'soc.religion.christian', 'talk.politics.guns', 'talk.politics.mideast', 'talk.politics.misc', 'talk.religion.misc']\n" + ] + } + ], + "source": [ + "print(list(newsgroups_train.target_names))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Step 2: Data Preprocessing¶\n" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/Users/williamjaubert/anaconda2/envs/nautilus/lib/python3.7/site-packages/nltk/decorators.py:68: DeprecationWarning: `formatargspec` is deprecated since Python 3.5. Use `signature` and the `Signature` object directly\n", + " regargs, varargs, varkwargs, defaults, formatvalue=lambda value: \"\"\n" + ] + } + ], + "source": [ + "import gensim\n", + "from gensim.utils import simple_preprocess\n", + "from gensim.parsing.preprocessing import STOPWORDS\n", + "from nltk.stem import WordNetLemmatizer, SnowballStemmer\n", + "from nltk.stem.porter import *\n", + "import numpy as np\n", + "np.random.seed(400)\n", + "\n", + "import nltk\n", + "\n", + "import pandas as pd\n", + "stemmer = SnowballStemmer(\"english\")" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "def lemmatize_stemming(text):\n", + " return stemmer.stem(WordNetLemmatizer().lemmatize(text, pos='v'))\n", + "\n", + "# Tokenize and lemmatize\n", + "def preprocess(text):\n", + " result=[]\n", + " for token in gensim.utils.simple_preprocess(text) :\n", + " if token not in gensim.parsing.preprocessing.STOPWORDS and len(token) > 3:\n", + " result.append(lemmatize_stemming(token))\n", + " \n", + " return result" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "processed_docs = []\n", + "\n", + "for doc in newsgroups_train.data:\n", + " processed_docs.append(preprocess(doc))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Step 3: Bag of words" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "# Create the dictionnary\n", + "from nautilus_nlp.models.topic_modeling import create_dictionary" + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "dictionary = create_dictionary(processed_docs)" + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "# Filter out tokens that appear in too few or too many documents\n", + "from nautilus_nlp.models.topic_modeling import filter_extremes" + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "filter_extremes(dictionary)" + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "# Create the bow \n", + "from nautilus_nlp.models.topic_modeling import create_bow_corpus" + ] + }, + { + "cell_type": "code", + "execution_count": 18, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "bow_corpus = create_bow_corpus(processed_docs, dictionary)" + ] + }, + { + "cell_type": "code", + "execution_count": 20, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[(13, 1), (26, 1), (55, 1), (88, 1), (99, 1), (152, 1), (153, 2), (154, 1), (155, 1), (156, 1), (157, 2), (158, 1), (159, 2), (160, 4), (161, 1), (162, 2), (163, 1), (164, 2), (165, 1), (166, 1), (167, 1), (168, 1), (169, 1), (170, 1), (171, 1), (172, 1), (173, 1), (174, 1), (175, 1), (176, 1), (177, 1), (178, 2), (179, 1), (180, 1), (181, 1), (182, 1)]\n" + ] + } + ], + "source": [ + "print(bow_corpus[3])" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Step 4: Find optimal number of topics" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "# Compute coherence values for various number of topics in order to pick the optimal one\n", + "from nautilus_nlp.models.topic_modeling import compute_coherence_values" + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "# Take a long time to run\n", + "model_list, coherence_values = compute_coherence_values(dictionary=dictionary, bow_corpus=bow_corpus, texts=processed_docs, start=2, limit=25, step=4)\n" + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "[0.37900998646286865,\n", + " 0.42680154447577845,\n", + " 0.47716566398237525,\n", + " 0.5261650723885645,\n", + " 0.49607461078243215,\n", + " 0.4978727171365794]" + ] + }, + "execution_count": 17, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "coherence_values" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "from nautilus_nlp.models.topic_modeling import plot_optimal_topic_number" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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\n", + "text/plain": [ + "<Figure size 432x288 with 1 Axes>" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "plot_optimal_topic_number(coherence_values, start=2, limit=25, step=4)" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "# Print the coherences scores for the number we tested\n", + "from nautilus_nlp.models.topic_modeling import print_coherence_scores" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Num Topics = 2 has Coherence Value of 0.379\n", + "Num Topics = 6 has Coherence Value of 0.4268\n", + "Num Topics = 10 has Coherence Value of 0.4772\n", + "Num Topics = 14 has Coherence Value of 0.5262\n", + "Num Topics = 18 has Coherence Value of 0.4961\n", + "Num Topics = 22 has Coherence Value of 0.4979\n" + ] + } + ], + "source": [ + "print_coherence_scores(coherence_values)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Step 5: Running LDA using Bag of Words" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "# Train the LDA model with gensim\n", + "from nautilus_nlp.models.topic_modeling import train_lda_model" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "model = train_lda_model(bow_corpus, dictionary, 10)" + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "<gensim.models.ldamodel.LdaModel at 0x1a2af3e208>" + ] + }, + "execution_count": 14, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "model" + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "# Save model\n", + "from nautilus_nlp.models.topic_modeling import save_model" + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "save_model(model,'/Users/williamjaubert/Documents/Allianz_William/notebook', 'ldamodel_nautilus')" + ] + }, + { + "cell_type": "code", + "execution_count": 152, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "# Load model" + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "from nautilus_nlp.models.topic_modeling import load_model" + ] + }, + { + "cell_type": "code", + "execution_count": 18, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "<gensim.models.ldamodel.LdaModel at 0x1a29985b38>" + ] + }, + "execution_count": 18, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "model_loaded = load_model('/Users/williamjaubert/Documents/Allianz_William/notebook', 'ldamodel_nautilus')\n", + "model_loaded" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Step 6: Visualize the top keywords per topic with Pyldavis interactive chart" + ] + }, + { + "cell_type": "code", + "execution_count": 19, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "# Display the top keywords per topic in a interactive chart\n", + "from nautilus_nlp.models.topic_modeling import visualize_topics" + ] + }, + { + "cell_type": "code", + "execution_count": 155, + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/Users/williamjaubert/anaconda2/envs/nautilus/lib/python3.7/site-packages/pyLDAvis/_prepare.py:257: FutureWarning: Sorting because non-concatenation axis is not aligned. A future version\n", + "of pandas will change to not sort by default.\n", + "\n", + "To accept the future behavior, pass 'sort=False'.\n", + "\n", + "To retain the current behavior and silence the warning, pass 'sort=True'.\n", + "\n", + " return pd.concat([default_term_info] + list(topic_dfs))\n" + ] + }, + { + "data": { + "text/html": [ + "\n", + "<link rel=\"stylesheet\" type=\"text/css\" href=\"https://cdn.rawgit.com/bmabey/pyLDAvis/files/ldavis.v1.0.0.css\">\n", + "\n", + "\n", + "<div id=\"ldavis_el591011124095238088809029897\"></div>\n", + "<script type=\"text/javascript\">\n", + "\n", + "var ldavis_el591011124095238088809029897_data = {\"mdsDat\": {\"x\": [-0.07866945427665124, -0.01699948489792914, 0.20896689238873523, 0.14744605031212607, -0.008849073212760983, -0.04505413872814077, -0.08949897686453376, 0.10780299734830809, 0.004524270451044093, -0.22966908252019716], \"y\": [-0.15170611822961017, -0.1504468301902949, 0.08013685816591506, 0.13647834612774523, -0.009046128981188077, 0.003906923765221535, 0.14472746444813225, -0.07737607739594787, -0.1051004751701791, 0.1284260374602061], \"topics\": [1, 2, 3, 4, 5, 6, 7, 8, 9, 10], \"cluster\": [1, 1, 1, 1, 1, 1, 1, 1, 1, 1], \"Freq\": [13.182504653930664, 12.926197052001953, 12.463006973266602, 11.995771408081055, 9.55910873413086, 9.468682289123535, 8.927140235900879, 7.882134437561035, 7.024929523468018, 6.5705246925354]}, \"tinfo\": {\"Category\": [\"Default\", \"Default\", \"Default\", \"Default\", \"Default\", \"Default\", \"Default\", \"Default\", \"Default\", \"Default\", \"Default\", \"Default\", \"Default\", \"Default\", \"Default\", \"Default\", \"Default\", \"Default\", \"Default\", \"Default\", \"Default\", \"Default\", \"Default\", \"Default\", \"Default\", \"Default\", \"Default\", \"Default\", \"Default\", \"Default\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\"], \"Freq\": [2966.0, 1940.0, 1924.0, 1689.0, 2638.0, 2883.0, 1860.0, 1161.0, 1997.0, 1477.0, 1274.0, 1017.0, 1577.0, 1423.0, 1059.0, 1331.0, 1142.0, 2599.0, 837.0, 1391.0, 6052.0, 742.0, 990.0, 784.0, 1802.0, 1023.0, 4004.0, 867.0, 1191.0, 747.0, 1142.053466796875, 698.051025390625, 406.8222961425781, 375.23699951171875, 365.2066650390625, 324.94189453125, 317.34423828125, 293.73358154296875, 242.91064453125, 242.6265411376953, 238.57518005371094, 222.68365478515625, 219.24806213378906, 497.52392578125, 182.9066925048828, 189.0950927734375, 180.77523803710938, 167.61569213867188, 170.06529235839844, 162.4676055908203, 156.04241943359375, 152.99142456054688, 147.4279327392578, 144.96324157714844, 144.00845336914062, 142.54815673828125, 140.01528930664062, 137.27037048339844, 111.63591766357422, 111.36140441894531, 296.46563720703125, 234.76368713378906, 534.498779296875, 227.3394775390625, 733.4286499023438, 290.5852355957031, 1027.818603515625, 194.50514221191406, 462.2489929199219, 638.7830200195312, 383.04254150390625, 557.0740966796875, 270.9013671875, 346.3726501464844, 2339.714599609375, 353.4006042480469, 956.244140625, 1366.7689208984375, 489.0564880371094, 1502.89306640625, 432.21966552734375, 423.68536376953125, 946.1923828125, 647.3731689453125, 868.969970703125, 843.2189331054688, 679.2139892578125, 536.1270751953125, 452.23504638671875, 627.3469848632812, 723.7830200195312, 487.529541015625, 627.237060546875, 480.2855529785156, 485.9232482910156, 520.519287109375, 439.0638122558594, 1273.8934326171875, 843.1687622070312, 687.6259155273438, 378.13519287109375, 599.566650390625, 284.1808166503906, 264.9247131347656, 257.7122802734375, 233.3790283203125, 198.55160522460938, 196.56007385253906, 186.4253692626953, 185.77682495117188, 190.4823760986328, 160.68319702148438, 157.2107391357422, 147.51388549804688, 143.9427032470703, 141.29263305664062, 132.9550323486328, 132.7094268798828, 136.2650604248047, 134.08621215820312, 122.39493560791016, 117.66445922851562, 110.7325210571289, 103.35787200927734, 103.81564331054688, 102.61417388916016, 191.171142578125, 1897.55224609375, 734.2091674804688, 595.35400390625, 628.1231079101562, 206.7904815673828, 246.95516967773438, 800.1998901367188, 749.1170043945312, 336.15264892578125, 271.74371337890625, 265.7127990722656, 398.02044677734375, 574.3276977539062, 250.16622924804688, 378.8575744628906, 461.7618408203125, 1507.1781005859375, 256.8684997558594, 577.097900390625, 989.1630249023438, 369.29083251953125, 600.9321899414062, 735.2871704101562, 547.2880249023438, 671.5233154296875, 658.334716796875, 983.666259765625, 1571.5150146484375, 640.5947875976562, 527.5059204101562, 1109.0411376953125, 876.4497680664062, 725.8155517578125, 862.159912109375, 662.5055541992188, 745.251953125, 665.8281860351562, 603.2254028320312, 672.0674438476562, 613.41943359375, 579.7627563476562, 513.5291137695312, 478.60107421875, 261.23309326171875, 304.4447937011719, 182.0543975830078, 164.44281005859375, 158.4560546875, 152.0279083251953, 137.8629150390625, 135.1473846435547, 117.27381896972656, 101.5247573852539, 100.54000091552734, 94.55840301513672, 94.07215118408203, 92.82543182373047, 88.48568725585938, 85.05994415283203, 77.8740005493164, 76.19078063964844, 74.76761627197266, 76.91588592529297, 66.26870727539062, 65.83450317382812, 62.59058380126953, 61.630924224853516, 56.66929244995117, 56.645973205566406, 56.47174072265625, 56.24151611328125, 433.3631896972656, 57.639102935791016, 175.34927368164062, 811.6905517578125, 352.3057861328125, 460.812255859375, 1244.349853515625, 397.7268981933594, 319.0634765625, 364.1428527832031, 817.1531372070312, 179.1089630126953, 759.2709350585938, 353.8210754394531, 767.8507690429688, 704.0316772460938, 1031.0333251953125, 338.7200927734375, 853.117919921875, 1558.565673828125, 1291.274169921875, 922.3545532226562, 1345.4871826171875, 471.7730407714844, 490.044677734375, 677.4464111328125, 1059.08154296875, 853.1986083984375, 843.7091064453125, 1006.580078125, 803.4461669921875, 784.5733642578125, 584.6500854492188, 572.8038330078125, 507.68548583984375, 934.7852172851562, 496.4774169921875, 583.20458984375, 623.8618774414062, 588.018798828125, 614.8836059570312, 528.0966796875, 511.22735595703125, 511.70477294921875, 866.5625, 316.72491455078125, 249.29571533203125, 229.9024200439453, 228.7355194091797, 211.55052185058594, 183.0289764404297, 166.1912841796875, 164.7910919189453, 155.55848693847656, 157.89810180664062, 359.6870422363281, 133.46632385253906, 124.17170715332031, 122.31271362304688, 117.03710174560547, 111.25904083251953, 110.83535766601562, 109.16374969482422, 103.2101821899414, 98.91426849365234, 514.7677612304688, 89.62791442871094, 82.74832153320312, 81.71601104736328, 103.25068664550781, 75.25823974609375, 75.21469116210938, 70.78433990478516, 69.34544372558594, 281.78009033203125, 311.1195983886719, 971.2630004882812, 208.0179901123047, 697.1331787109375, 367.6048889160156, 1416.3004150390625, 441.63726806640625, 604.5337524414062, 578.8893432617188, 377.5198974609375, 192.00442504882812, 648.3333129882812, 1969.8912353515625, 938.5662841796875, 446.4165954589844, 632.349853515625, 658.6181030273438, 1989.853515625, 746.8209838867188, 677.7993774414062, 282.14984130859375, 467.3210144042969, 480.8096008300781, 1419.96630859375, 633.1287841796875, 1121.6055908203125, 955.2998046875, 821.8631591796875, 1269.9896240234375, 524.8942260742188, 1015.9119262695312, 611.8196411132812, 745.4178466796875, 688.518310546875, 667.1979370117188, 692.5172729492188, 593.0750732421875, 527.0308837890625, 546.2483520507812, 266.1346740722656, 171.08937072753906, 155.6071014404297, 226.88490295410156, 131.5532684326172, 110.63844299316406, 109.71115112304688, 476.2266540527344, 123.79460144042969, 96.52826690673828, 90.6929702758789, 86.91134643554688, 84.75259399414062, 84.67416381835938, 83.132080078125, 249.04006958007812, 73.44264221191406, 70.66631317138672, 70.3055419921875, 68.83519744873047, 66.711181640625, 65.8822250366211, 60.60839080810547, 60.293426513671875, 59.59612274169922, 59.43571472167969, 59.13909149169922, 58.31281661987305, 57.815277099609375, 57.416988372802734, 405.0425720214844, 341.4366455078125, 190.89840698242188, 246.23365783691406, 163.5123748779297, 257.450927734375, 138.4132537841797, 165.08370971679688, 521.0137939453125, 1046.2774658203125, 1400.850341796875, 228.16041564941406, 286.63897705078125, 343.24639892578125, 185.74090576171875, 229.64581298828125, 175.05548095703125, 332.4627990722656, 163.81402587890625, 539.6653442382812, 256.2196960449219, 439.739990234375, 517.5452270507812, 403.49468994140625, 229.62326049804688, 866.29833984375, 846.667236328125, 313.1244812011719, 322.8232727050781, 286.90380859375, 653.3579711914062, 749.8698120117188, 426.6073913574219, 380.0177307128906, 366.8009338378906, 372.0513000488281, 408.4660949707031, 415.6255187988281, 394.1338806152344, 394.38397216796875, 349.50030517578125, 362.36224365234375, 340.7713928222656, 296.1283264160156, 297.5120544433594, 494.6736145019531, 745.9381103515625, 324.6826171875, 301.4449157714844, 243.7447509765625, 158.0723114013672, 107.36814880371094, 95.01725769042969, 99.29867553710938, 90.99311828613281, 88.6338119506836, 79.3241195678711, 77.81040954589844, 76.27904510498047, 74.54589080810547, 68.68617248535156, 66.95494079589844, 65.45933532714844, 64.79324340820312, 62.89622497558594, 62.08100891113281, 61.05073547363281, 61.06211853027344, 58.696773529052734, 57.729122161865234, 57.52412796020508, 57.392601013183594, 53.51804733276367, 53.08519744873047, 81.03302001953125, 466.35260009765625, 629.77294921875, 272.4296569824219, 229.77696228027344, 524.4228515625, 169.0817413330078, 106.43704223632812, 468.2314453125, 321.1058044433594, 72.86363220214844, 215.64427185058594, 420.0905456542969, 254.936279296875, 238.94183349609375, 170.37852478027344, 161.82167053222656, 350.8217468261719, 510.25213623046875, 280.4100646972656, 479.9981384277344, 199.64524841308594, 294.40740966796875, 258.040771484375, 376.53106689453125, 509.9411315917969, 1114.2279052734375, 256.09857177734375, 426.6061096191406, 319.6000671386719, 739.0277099609375, 280.2876281738281, 489.2537536621094, 542.6870727539062, 517.612060546875, 617.3828125, 513.236083984375, 436.5743408203125, 490.99383544921875, 506.68548583984375, 460.2646179199219, 441.2579650878906, 394.2334899902344, 351.31146240234375, 347.7322082519531, 353.1181640625, 336.91925048828125, 275.0069580078125, 206.27684020996094, 205.90945434570312, 185.4871826171875, 142.34490966796875, 138.4669952392578, 125.22058868408203, 124.95114135742188, 113.3163070678711, 111.33777618408203, 109.3900375366211, 105.71350860595703, 106.33345794677734, 292.8968505859375, 101.52547454833984, 98.16709899902344, 98.09191131591797, 96.69923400878906, 95.24166107177734, 93.9153823852539, 90.94029998779297, 90.11663055419922, 204.05540466308594, 83.51455688476562, 83.17984008789062, 82.09905242919922, 80.06827545166016, 80.04055786132812, 78.980224609375, 77.4798812866211, 624.8594970703125, 218.5560302734375, 299.7873840332031, 218.3317108154297, 189.689208984375, 356.6500244140625, 202.47463989257812, 417.00213623046875, 238.63824462890625, 212.27218627929688, 149.84323120117188, 211.9496612548828, 303.9140319824219, 120.32109832763672, 237.6540069580078, 454.90960693359375, 334.02545166015625, 980.60107421875, 485.4506530761719, 911.4451293945312, 590.2950439453125, 261.2230529785156, 253.1405487060547, 366.6529846191406, 366.9601745605469, 261.4512939453125, 595.4712524414062, 534.0038452148438, 534.01806640625, 583.53955078125, 307.2271728515625, 439.3746337890625, 370.1558837890625, 337.7717590332031, 344.1768798828125, 325.05975341796875, 340.1703796386719, 337.7772521972656, 350.0632019042969, 294.64581298828125, 276.3277282714844, 278.6572570800781, 1160.9132080078125, 424.62060546875, 361.99005126953125, 388.82080078125, 255.19793701171875, 223.3960723876953, 186.81495666503906, 150.93563842773438, 148.38706970214844, 142.3661346435547, 778.7778930664062, 125.96311950683594, 122.38629150390625, 113.5186538696289, 111.00336456298828, 117.1114730834961, 97.79452514648438, 95.15584564208984, 154.03953552246094, 85.85616302490234, 85.81739044189453, 83.90367126464844, 83.07220458984375, 81.03001403808594, 86.70967102050781, 72.22313690185547, 70.94837188720703, 66.05683135986328, 65.33727264404297, 61.60311508178711, 632.0007934570312, 967.30859375, 392.4784851074219, 86.92008972167969, 116.71688079833984, 384.4781188964844, 955.042724609375, 325.5193786621094, 154.01246643066406, 168.04747009277344, 886.2265014648438, 877.4567260742188, 327.182373046875, 468.3438720703125, 329.43048095703125, 302.31689453125, 346.5965576171875, 350.2645568847656, 277.72235107421875, 424.45953369140625, 266.9029541015625, 332.0311279296875, 578.3032836914062, 328.37042236328125, 429.90313720703125, 517.5341796875, 400.9313049316406, 346.2950439453125, 433.3561706542969, 421.4360656738281, 338.9404296875, 347.58477783203125, 348.44537353515625, 336.6087646484375, 398.3597717285156, 299.83258056640625, 164.6500701904297, 151.26080322265625, 134.79344177246094, 134.80828857421875, 128.793701171875, 120.1890640258789, 119.80301666259766, 103.68548583984375, 93.05211639404297, 105.72232055664062, 91.11929321289062, 88.88138580322266, 86.48152923583984, 83.19112396240234, 82.55461120605469, 76.6363754272461, 73.92579650878906, 137.45323181152344, 73.58349609375, 73.43082427978516, 297.8049011230469, 71.5206298828125, 71.5206298828125, 71.3747329711914, 68.60582733154297, 70.64566802978516, 67.04659271240234, 64.61957550048828, 137.57745361328125, 329.9684753417969, 498.6695861816406, 418.2132568359375, 321.6349182128906, 192.26394653320312, 436.7302551269531, 120.439208984375, 101.71742248535156, 189.6542205810547, 107.88106536865234, 180.2874298095703, 406.497802734375, 219.2530975341797, 311.04937744140625, 276.8253479003906, 364.5852966308594, 122.61643981933594, 431.5494079589844, 148.8873748779297, 478.0677490234375, 448.4655456542969, 560.1489868164062, 235.38340759277344, 220.0799560546875, 236.9700927734375, 525.8984985351562, 310.49981689453125, 195.21343994140625, 465.0462341308594, 342.694091796875, 343.89752197265625, 252.4918212890625, 252.31494140625, 359.3658447265625, 365.0567932128906, 297.0661926269531, 278.8648681640625, 264.2499084472656, 271.7898864746094, 266.98651123046875, 258.7191467285156, 836.8704223632812, 741.7591552734375, 348.10552978515625, 262.6591491699219, 234.72032165527344, 225.7039337158203, 214.6396026611328, 197.21083068847656, 176.1952667236328, 163.72848510742188, 159.68936157226562, 156.55722045898438, 155.55181884765625, 147.1693572998047, 143.7874298095703, 151.92002868652344, 140.55010986328125, 133.0448760986328, 131.79173278808594, 122.37577819824219, 118.65946197509766, 115.63384246826172, 112.4041748046875, 112.22483825683594, 111.79792022705078, 119.11126708984375, 102.07164001464844, 93.44534301757812, 92.23983764648438, 89.7243881225586, 218.44508361816406, 151.80226135253906, 955.4397583007812, 178.94818115234375, 1384.116455078125, 160.98158264160156, 191.5667724609375, 221.75938415527344, 157.25833129882812, 1290.715576171875, 920.77001953125, 312.8064880371094, 623.1017456054688, 397.7396240234375, 455.4387512207031, 379.9434814453125, 351.7613220214844, 356.9765625, 374.8453063964844, 212.81954956054688, 346.64404296875, 312.8064270019531, 333.1448669433594, 336.0579528808594, 600.3089599609375, 295.4515380859375, 283.6612548828125, 250.14752197265625, 267.23590087890625, 330.6805114746094, 358.020263671875, 262.1649475097656, 242.10182189941406], \"Term\": [\"window\", \"game\", \"christian\", \"team\", \"drive\", \"file\", \"space\", \"encrypt\", \"govern\", \"chip\", \"jesus\", \"israel\", \"card\", \"play\", \"secur\", \"nasa\", \"armenian\", \"program\", \"isra\", \"imag\", \"peopl\", \"hockey\", \"player\", \"clipper\", \"public\", \"disk\", \"year\", \"scsi\", \"driver\", \"bike\", \"armenian\", \"turkish\", \"turk\", \"turkey\", \"armenia\", \"koresh\", \"nazi\", \"militia\", \"serdar\", \"argic\", \"genocid\", \"davidian\", \"troop\", \"murder\", \"mormon\", \"prison\", \"massacr\", \"azeri\", \"ethnic\", \"azerbaijani\", \"hitler\", \"iran\", \"zuma\", \"sdpa\", \"motto\", \"azerbaijan\", \"extermin\", \"sera\", \"urartu\", \"slaughter\", \"villag\", \"batf\", \"greek\", \"greec\", \"jew\", \"soldier\", \"kill\", \"waco\", \"arm\", \"countri\", \"muslim\", \"children\", \"armi\", \"popul\", \"peopl\", \"anti\", \"govern\", \"right\", \"attack\", \"say\", \"polit\", \"death\", \"state\", \"live\", \"go\", \"come\", \"tell\", \"happen\", \"forc\", \"world\", \"time\", \"nation\", \"want\", \"leav\", \"start\", \"year\", \"take\", \"jesus\", \"bibl\", \"atheist\", \"atheism\", \"christ\", \"scriptur\", \"cathol\", \"sandvik\", \"doctrin\", \"revel\", \"biblic\", \"satan\", \"atho\", \"livesey\", \"prophet\", \"divin\", \"vers\", \"gospel\", \"sabbath\", \"god\", \"sin\", \"resurrect\", \"solntz\", \"testament\", \"theolog\", \"propheci\", \"theist\", \"schneider\", \"jaeger\", \"marriag\", \"christian\", \"church\", \"belief\", \"faith\", \"worship\", \"contradict\", \"moral\", \"religion\", \"lord\", \"heaven\", \"holi\", \"rutger\", \"truth\", \"spirit\", \"teach\", \"islam\", \"believ\", \"etern\", \"argument\", \"exist\", \"religi\", \"evid\", \"word\", \"love\", \"life\", \"claim\", \"mean\", \"peopl\", \"true\", \"accept\", \"say\", \"question\", \"reason\", \"thing\", \"person\", \"come\", \"good\", \"read\", \"time\", \"point\", \"follow\", \"motif\", \"widget\", \"xterm\", \"visual\", \"xlib\", \"polygon\", \"baalk\", \"contrib\", \"toolkit\", \"kelvin\", \"pyron\", \"suno\", \"deskjet\", \"xpert\", \"plaintext\", \"skndiv\", \"openwindow\", \"xview\", \"ether\", \"quicktim\", \"magellan\", \"utah\", \"greenbelt\", \"reilli\", \"ualberta\", \"copper\", \"ciphertext\", \"autom\", \"gradi\", \"dillon\", \"font\", \"handbook\", \"binari\", \"server\", \"client\", \"librari\", \"imag\", \"anonym\", \"compil\", \"resourc\", \"graphic\", \"map\", \"applic\", \"archiv\", \"user\", \"code\", \"avail\", \"directori\", \"sourc\", \"file\", \"mail\", \"list\", \"program\", \"function\", \"format\", \"email\", \"inform\", \"version\", \"softwar\", \"includ\", \"send\", \"data\", \"internet\", \"address\", \"display\", \"window\", \"copi\", \"access\", \"distribut\", \"thank\", \"look\", \"book\", \"group\", \"need\", \"scsi\", \"simm\", \"motherboard\", \"cach\", \"bio\", \"quadra\", \"diamond\", \"vram\", \"vesa\", \"centri\", \"swap\", \"upgrad\", \"char\", \"eisa\", \"intercon\", \"nubus\", \"ethernet\", \"svga\", \"amanda\", \"meg\", \"cadr\", \"mous\", \"maxtor\", \"config\", \"cica\", \"tiff\", \"adaptec\", \"powerbook\", \"ctrl\", \"esdi\", \"jumper\", \"floppi\", \"disk\", \"umich\", \"video\", \"modem\", \"card\", \"output\", \"monitor\", \"mode\", \"printer\", \"spec\", \"entri\", \"drive\", \"driver\", \"port\", \"instal\", \"memori\", \"window\", \"color\", \"appl\", \"byte\", \"screen\", \"board\", \"problem\", \"machin\", \"file\", \"thank\", \"control\", \"work\", \"speed\", \"need\", \"hard\", \"help\", \"program\", \"want\", \"time\", \"repli\", \"softwar\", \"distribut\", \"alaska\", \"spencer\", \"oracl\", \"dseg\", \"aurora\", \"nsmca\", \"engr\", \"launch\", \"uoknor\", \"callison\", \"kaldi\", \"zoolog\", \"mccall\", \"ucsc\", \"hallam\", \"lunar\", \"automot\", \"raider\", \"theodor\", \"dock\", \"shafer\", \"mksol\", \"hydro\", \"ssto\", \"plymouth\", \"redesign\", \"laughter\", \"rockwel\", \"desi\", \"stimulus\", \"moon\", \"henri\", \"mar\", \"job\", \"wheel\", \"billion\", \"invest\", \"spacecraft\", \"orbit\", \"nasa\", \"space\", \"shuttl\", \"satellit\", \"fund\", \"probe\", \"flight\", \"helmet\", \"station\", \"solar\", \"presid\", \"mission\", \"earth\", \"cost\", \"money\", \"vehicl\", \"year\", \"work\", \"project\", \"toronto\", \"spend\", \"go\", \"time\", \"engin\", \"long\", \"high\", \"power\", \"thing\", \"say\", \"look\", \"peopl\", \"program\", \"want\", \"need\", \"design\", \"build\", \"firearm\", \"bike\", \"motorcycl\", \"magnus\", \"rider\", \"honda\", \"veal\", \"utkvm\", \"centerlin\", \"cactus\", \"rkba\", \"harley\", \"shotgun\", \"pistol\", \"ranck\", \"boyl\", \"husc\", \"ifa\", \"smuggl\", \"fischer\", \"counterst\", \"armori\", \"trunk\", \"thomasp\", \"imak\", \"photographi\", \"concordia\", \"tennesse\", \"yamaha\", \"frost\", \"car\", \"ohio\", \"uchicago\", \"rid\", \"gun\", \"brake\", \"shaft\", \"cwru\", \"auto\", \"wagon\", \"handgun\", \"cleveland\", \"ride\", \"tire\", \"urbana\", \"midway\", \"insur\", \"uiuc\", \"dealer\", \"weapon\", \"iastat\", \"owner\", \"illinoi\", \"crime\", \"price\", \"state\", \"freenet\", \"sell\", \"buy\", \"good\", \"road\", \"drive\", \"right\", \"look\", \"peopl\", \"want\", \"case\", \"thing\", \"time\", \"go\", \"distribut\", \"repli\", \"engin\", \"opinion\", \"problem\", \"need\", \"gatech\", \"cub\", \"fnal\", \"prism\", \"hitter\", \"pitcher\", \"alomar\", \"uicvm\", \"higgin\", \"inning\", \"revolv\", \"hulman\", \"yanke\", \"pitch\", \"catcher\", \"dodger\", \"blast\", \"starter\", \"tiger\", \"met\", \"bat\", \"nore\", \"outlet\", \"rocki\", \"jay\", \"sdsu\", \"volt\", \"lopez\", \"restaur\", \"lamp\", \"wire\", \"duke\", \"circuit\", \"batteri\", \"brave\", \"basebal\", \"hit\", \"berkeley\", \"jason\", \"ball\", \"metal\", \"jeff\", \"grind\", \"larc\", \"indiana\", \"netcom\", \"colorado\", \"year\", \"run\", \"good\", \"game\", \"smith\", \"scott\", \"player\", \"home\", \"stanford\", \"look\", \"distribut\", \"go\", \"time\", \"lose\", \"come\", \"start\", \"play\", \"david\", \"best\", \"better\", \"power\", \"thing\", \"john\", \"sale\", \"great\", \"encrypt\", \"escrow\", \"privaci\", \"ripem\", \"crypto\", \"wiretap\", \"cryptographi\", \"cipher\", \"decrypt\", \"hamburg\", \"clipper\", \"homicid\", \"bontchev\", \"gtoal\", \"crypt\", \"clarkson\", \"rwing\", \"surveil\", \"nist\", \"sternlight\", \"den\", \"ncsl\", \"qualcomm\", \"fbihh\", \"cryptograph\", \"tampa\", \"mime\", \"vesselin\", \"lyme\", \"strnlght\", \"key\", \"secur\", \"enforc\", \"recipi\", \"classifi\", \"secret\", \"chip\", \"agenc\", \"patent\", \"scheme\", \"public\", \"govern\", \"algorithm\", \"protect\", \"propos\", \"administr\", \"privat\", \"clinton\", \"feder\", \"phone\", \"court\", \"devic\", \"number\", \"communic\", \"technolog\", \"inform\", \"provid\", \"author\", \"state\", \"right\", \"messag\", \"data\", \"peopl\", \"need\", \"diseas\", \"stratus\", \"dyer\", \"diet\", \"robi\", \"infect\", \"syndrom\", \"methodolog\", \"physician\", \"cure\", \"intellect\", \"einstein\", \"chopin\", \"candida\", \"sphere\", \"yeast\", \"chastiti\", \"halat\", \"therapi\", \"clinic\", \"migrain\", \"steveh\", \"patient\", \"catbyt\", \"dtmedin\", \"blah\", \"carlo\", \"superstit\", \"baerga\", \"homeopathi\", \"skeptic\", \"gordon\", \"pitt\", \"medic\", \"doctor\", \"medicin\", \"food\", \"cancer\", \"sleev\", \"ingr\", \"genet\", \"aid\", \"bank\", \"treatment\", \"water\", \"pain\", \"health\", \"handheld\", \"studi\", \"princeton\", \"caus\", \"effect\", \"scienc\", \"scientif\", \"rochest\", \"theori\", \"point\", \"result\", \"risk\", \"problem\", \"research\", \"case\", \"steve\", \"test\", \"time\", \"peopl\", \"repli\", \"take\", \"differ\", \"year\", \"say\", \"thing\", \"isra\", \"hockey\", \"playoff\", \"palestinian\", \"detroit\", \"leaf\", \"cramer\", \"optilink\", \"pen\", \"cunixb\", \"lebanes\", \"penguin\", \"clayton\", \"jake\", \"maynard\", \"espn\", \"edmonton\", \"ericsson\", \"boni\", \"lemieux\", \"gaza\", \"puck\", \"bruin\", \"selann\", \"laurentian\", \"quebec\", \"ramsey\", \"canuck\", \"shark\", \"uvic\", \"montreal\", \"flyer\", \"israel\", \"stanley\", \"team\", \"jet\", \"coach\", \"ranger\", \"winnipeg\", \"game\", \"play\", \"wing\", \"player\", \"columbia\", \"season\", \"leagu\", \"pittsburgh\", \"score\", \"arab\", \"mcgill\", \"goal\", \"virginia\", \"toronto\", \"andrew\", \"year\", \"divis\", \"canada\", \"period\", \"final\", \"point\", \"time\", \"american\", \"go\"], \"Total\": [2966.0, 1940.0, 1924.0, 1689.0, 2638.0, 2883.0, 1860.0, 1161.0, 1997.0, 1477.0, 1274.0, 1017.0, 1577.0, 1423.0, 1059.0, 1331.0, 1142.0, 2599.0, 837.0, 1391.0, 6052.0, 742.0, 990.0, 784.0, 1802.0, 1023.0, 4004.0, 867.0, 1191.0, 747.0, 1142.9583740234375, 698.9558715820312, 407.7272644042969, 376.1419677734375, 366.1116027832031, 325.846923828125, 318.256103515625, 294.6385803222656, 243.81558227539062, 243.53146362304688, 239.4801788330078, 223.58860778808594, 220.15757751464844, 499.85150146484375, 183.81178283691406, 190.03121948242188, 181.68017578125, 168.52059936523438, 170.9886474609375, 163.3725128173828, 156.9473876953125, 153.92347717285156, 148.33285522460938, 145.86817932128906, 144.91348266601562, 143.45306396484375, 140.92027282714844, 138.17529296875, 112.54084014892578, 112.26637268066406, 299.7375183105469, 239.29400634765625, 575.2765502929688, 235.9622802734375, 846.9027709960938, 310.8525390625, 1292.4876708984375, 203.65432739257812, 568.353271484375, 904.962890625, 498.3378601074219, 821.7328491210938, 317.7273254394531, 442.4293212890625, 6052.71826171875, 470.1575927734375, 1997.7261962890625, 3614.68310546875, 771.352294921875, 4395.67724609375, 753.4012451171875, 729.086181640625, 3490.054931640625, 1666.260986328125, 3510.730712890625, 3362.533203125, 2458.84814453125, 1374.8798828125, 910.499755859375, 2752.30859375, 5183.146484375, 1404.34228515625, 3617.8427734375, 1561.9661865234375, 1909.119873046875, 4004.7578125, 1884.1258544921875, 1274.8072509765625, 844.0818481445312, 688.539794921875, 379.0483093261719, 601.0935668945312, 285.09393310546875, 265.8420715332031, 258.6253356933594, 234.29208374023438, 199.46600341796875, 197.48406982421875, 187.33848571777344, 186.6898651123047, 191.4882049560547, 161.5964813232422, 158.12852478027344, 148.4269561767578, 144.8557891845703, 142.2056884765625, 133.86817932128906, 133.62254333496094, 137.21395874023438, 135.0694580078125, 123.30796813964844, 118.57750701904297, 111.64559173583984, 104.27090454101562, 104.75077056884766, 103.53997039794922, 192.9781494140625, 1924.27099609375, 744.6122436523438, 604.4033203125, 642.59033203125, 209.4973907470703, 250.70823669433594, 845.6991577148438, 828.4187622070312, 355.5498962402344, 287.80279541015625, 282.96514892578125, 442.15399169921875, 692.941650390625, 269.9664001464844, 446.063232421875, 578.8197021484375, 2561.731689453125, 282.8346862792969, 815.131103515625, 1699.9537353515625, 474.3492126464844, 965.217041015625, 1333.0904541015625, 902.1407470703125, 1251.4853515625, 1317.3157958984375, 2641.86328125, 6052.71826171875, 1353.2069091796875, 1006.9673461914062, 4395.67724609375, 2872.182373046875, 1977.921142578125, 3329.212646484375, 2056.0078125, 3362.533203125, 3754.421630859375, 2277.20947265625, 5183.146484375, 2646.791748046875, 1892.4102783203125, 514.4351806640625, 479.50714111328125, 262.1397399902344, 305.83587646484375, 182.9683837890625, 165.35598754882812, 159.36215209960938, 152.93394470214844, 138.76898193359375, 136.0535125732422, 118.18011474609375, 102.43084716796875, 101.44613647460938, 95.46444702148438, 94.97850036621094, 93.73173522949219, 89.39283752441406, 85.96602630615234, 78.7806625366211, 77.0969467163086, 75.67371368408203, 77.94976806640625, 67.175048828125, 66.74057006835938, 63.496917724609375, 62.537330627441406, 57.57563018798828, 57.55217742919922, 57.37797546386719, 57.14778137207031, 448.4683532714844, 58.572509765625, 180.8592987060547, 872.3430786132812, 374.06121826171875, 495.9429626464844, 1391.43896484375, 440.9508361816406, 358.4921875, 426.1166076660156, 1054.60791015625, 199.59127807617188, 1032.4814453125, 440.00604248046875, 1078.350341796875, 1021.1267700195312, 1669.3359375, 441.453857421875, 1374.5584716796875, 2883.885009765625, 2375.208984375, 1560.8458251953125, 2599.861083984375, 691.8548583984375, 736.162841796875, 1159.2723388671875, 2169.24072265625, 1621.163818359375, 1630.7625732421875, 2103.295166015625, 1606.180419921875, 1650.9979248046875, 1085.847412109375, 1067.4688720703125, 839.1293334960938, 2966.575439453125, 872.5662231445312, 1443.37353515625, 3038.84619140625, 2288.467041015625, 3375.03759765625, 1421.1026611328125, 1956.768310546875, 3517.123046875, 867.474609375, 317.6370849609375, 250.2078857421875, 230.81463623046875, 229.64767456054688, 212.46270751953125, 183.9412384033203, 167.1034393310547, 165.70335388183594, 156.47067260742188, 158.83648681640625, 362.0737609863281, 134.3785400390625, 125.08387756347656, 123.22496032714844, 117.94927215576172, 112.17121124267578, 111.74752807617188, 110.07601928710938, 104.12238311767578, 99.82821655273438, 519.7879028320312, 90.54007720947266, 83.6605224609375, 82.62821197509766, 104.4683609008789, 76.17040252685547, 76.12688446044922, 71.69654846191406, 70.25760650634766, 287.13433837890625, 317.7306213378906, 1023.171630859375, 213.97854614257812, 736.9544067382812, 385.19146728515625, 1577.8919677734375, 487.7062683105469, 681.5418701171875, 651.6162719726562, 414.86236572265625, 202.35662841796875, 773.6254272460938, 2638.13232421875, 1191.0015869140625, 521.5247192382812, 771.9718017578125, 825.6636962890625, 2966.575439453125, 979.6791381835938, 877.6451416015625, 316.51470947265625, 603.8773803710938, 656.5188598632812, 3254.474609375, 1051.1627197265625, 2883.885009765625, 2288.467041015625, 1818.994384765625, 3998.2919921875, 901.1752319335938, 3517.123046875, 1391.7735595703125, 2348.58544921875, 2599.861083984375, 3617.8427734375, 5183.146484375, 2732.19384765625, 1630.7625732421875, 3038.84619140625, 267.0453796386719, 172.00009155273438, 156.51791381835938, 228.30894470214844, 132.46392822265625, 111.54907989501953, 110.62195587158203, 480.2484436035156, 124.94286346435547, 97.43895721435547, 91.60369873046875, 87.82199096679688, 85.66326904296875, 85.5849838256836, 84.04283142089844, 251.9351348876953, 74.35344696044922, 71.57764434814453, 71.21640014648438, 69.74593353271484, 67.621826171875, 66.79296875, 61.51911544799805, 61.20405960083008, 60.507171630859375, 60.3464469909668, 60.049827575683594, 59.223548889160156, 58.72600173950195, 58.32766342163086, 415.9969177246094, 351.1897888183594, 197.73948669433594, 259.179931640625, 170.87942504882812, 275.1635437011719, 144.31858825683594, 174.99098205566406, 592.9318237304688, 1331.52294921875, 1860.757080078125, 257.59454345703125, 337.9649353027344, 441.3335266113281, 216.22386169433594, 284.1152038574219, 205.7539520263672, 455.2716064453125, 191.22592163085938, 874.0577392578125, 344.72601318359375, 726.9236450195312, 1014.5396728515625, 862.5274658203125, 336.988525390625, 4004.7578125, 3998.2919921875, 641.9602661132812, 701.0911865234375, 556.97900390625, 3510.730712890625, 5183.146484375, 1432.9891357421875, 1579.425048828125, 1517.998779296875, 1785.55322265625, 3329.212646484375, 4395.67724609375, 3375.03759765625, 6052.71826171875, 2599.861083984375, 3617.8427734375, 3517.123046875, 1000.6277465820312, 1483.8935546875, 495.75604248046875, 747.6323852539062, 325.6590576171875, 302.3562316894531, 244.9889373779297, 158.984375, 108.27942657470703, 95.92851257324219, 100.2811050415039, 91.90436553955078, 89.54524993896484, 80.2354736328125, 78.72178649902344, 77.19053649902344, 75.45713806152344, 69.597412109375, 67.86634826660156, 66.37062072753906, 65.70732879638672, 63.8077507019043, 62.99225997924805, 61.962032318115234, 61.97679901123047, 59.60800552368164, 58.64104080200195, 58.435726165771484, 58.304039001464844, 54.42936325073242, 53.9964599609375, 82.42547607421875, 485.2928161621094, 668.453857421875, 284.9857482910156, 240.66868591308594, 577.3370971679688, 179.90098571777344, 111.21246337890625, 528.9305419921875, 357.5130920410156, 74.67018127441406, 242.34796142578125, 502.91082763671875, 297.4255065917969, 281.2111511230469, 192.33499145507812, 183.03675842285156, 466.62225341796875, 750.7398681640625, 366.5124206542969, 724.8843994140625, 250.30677795410156, 415.81964111328125, 353.0357971191406, 657.6669921875, 1070.5751953125, 3490.054931640625, 395.5933837890625, 983.7587890625, 606.9414672851562, 3754.421630859375, 598.3028564453125, 2638.13232421875, 3614.68310546875, 3375.03759765625, 6052.71826171875, 3617.8427734375, 2113.20703125, 3329.212646484375, 5183.146484375, 3510.730712890625, 3038.84619140625, 2732.19384765625, 1432.9891357421875, 1407.867431640625, 3254.474609375, 3517.123046875, 275.9194030761719, 207.18922424316406, 206.8258819580078, 186.39959716796875, 143.2572784423828, 139.37933349609375, 126.13304901123047, 125.86357116699219, 114.22874450683594, 112.2500991821289, 110.30248260498047, 106.6259765625, 107.28164672851562, 295.5258483886719, 102.43778991699219, 99.07945251464844, 99.00546264648438, 97.61188507080078, 96.15435791015625, 94.82772827148438, 91.85266876220703, 91.02910614013672, 206.18264770507812, 84.4303970336914, 84.09229278564453, 83.01145935058594, 80.98065185546875, 80.95291900634766, 79.89276885986328, 78.3923110961914, 639.2734985351562, 227.38116455078125, 323.03533935546875, 231.72528076171875, 201.03939819335938, 428.90643310546875, 227.24929809570312, 525.6275634765625, 277.0840148925781, 257.5661926269531, 175.59457397460938, 284.0149841308594, 476.76812744140625, 133.43386840820312, 365.1957092285156, 1031.8046875, 640.5604858398438, 4004.7578125, 1280.048828125, 3754.421630859375, 1940.664794921875, 488.3008117675781, 472.29498291015625, 990.5671997070312, 1023.2589111328125, 516.36962890625, 3375.03759765625, 3038.84619140625, 3510.730712890625, 5183.146484375, 818.5213623046875, 3362.533203125, 1909.119873046875, 1423.9302978515625, 1658.5966796875, 1346.392578125, 1717.5321044921875, 1785.55322265625, 3329.212646484375, 1491.183349609375, 990.2796630859375, 1542.3779296875, 1161.82763671875, 425.534912109375, 362.9170837402344, 390.07720947265625, 256.1122741699219, 224.3104248046875, 187.7305145263672, 151.85064697265625, 149.30140686035156, 143.2805633544922, 784.3641357421875, 126.87757873535156, 123.3006362915039, 114.4344482421875, 111.93732452392578, 118.14889526367188, 98.71028137207031, 96.07027435302734, 155.55857849121094, 86.7708511352539, 86.73173522949219, 84.81802368164062, 83.986572265625, 81.9443588256836, 87.70350646972656, 73.1382064819336, 71.86477661132812, 66.9711685180664, 66.25181579589844, 62.517635345458984, 659.2316284179688, 1059.598876953125, 429.4156188964844, 89.67327117919922, 124.43817138671875, 474.16644287109375, 1477.454345703125, 430.59686279296875, 178.9176788330078, 204.3567657470703, 1802.1553955078125, 1997.7261962890625, 534.6806030273438, 906.1632690429688, 556.0820922851562, 491.48968505859375, 613.686279296875, 662.98681640625, 470.2344665527344, 1022.1227416992188, 480.7737121582031, 730.9078369140625, 2365.543212890625, 763.0506591796875, 1372.5093994140625, 2169.24072265625, 1377.2835693359375, 1170.3818359375, 3490.054931640625, 3614.68310546875, 1280.4110107421875, 1650.9979248046875, 6052.71826171875, 3517.123046875, 399.2857971191406, 300.7450866699219, 165.56256103515625, 152.17401123046875, 135.70590209960938, 135.72186279296875, 129.70895385742188, 121.10151672363281, 120.7160415649414, 104.59820556640625, 93.9645767211914, 106.77874755859375, 92.03182983398438, 89.7938003540039, 87.39402770996094, 84.10354614257812, 83.46707916259766, 77.56388092041016, 74.8382339477539, 139.152099609375, 74.49637603759766, 74.3432388305664, 301.5867919921875, 72.43302154541016, 72.43302154541016, 72.28717041015625, 69.51831817626953, 71.5958480834961, 67.95915222167969, 65.53195190429688, 140.31385803222656, 354.61895751953125, 560.2183227539062, 467.14312744140625, 372.5074157714844, 214.2539520263672, 528.296142578125, 128.81614685058594, 106.81172180175781, 215.3028564453125, 114.34998321533203, 206.83787536621094, 542.55908203125, 263.95330810546875, 416.1339111328125, 361.6107177734375, 544.802734375, 136.71836853027344, 864.6985473632812, 185.2837677001953, 1192.0758056640625, 1098.331298828125, 1600.234375, 408.9527587890625, 366.5252685546875, 446.0223693847656, 2646.791748046875, 941.7721557617188, 342.3376159667969, 3254.474609375, 1469.76904296875, 2113.20703125, 866.40185546875, 975.51806640625, 5183.146484375, 6052.71826171875, 2732.19384765625, 1884.1258544921875, 2258.273681640625, 4004.7578125, 4395.67724609375, 3329.212646484375, 837.78271484375, 742.67138671875, 349.01776123046875, 263.5714416503906, 235.63259887695312, 226.6161651611328, 215.55186462402344, 198.12313842773438, 177.10752868652344, 164.64073181152344, 160.60159301757812, 157.46951293945312, 156.48275756835938, 148.0817413330078, 144.69972229003906, 152.8905792236328, 141.4651641845703, 133.9572296142578, 132.7042694091797, 123.28799438476562, 119.57171630859375, 116.54607391357422, 113.31639099121094, 113.13705444335938, 112.71014404296875, 120.09423065185547, 102.98385620117188, 94.35774230957031, 93.15208435058594, 90.63665008544922, 220.87405395507812, 153.73667907714844, 1017.056396484375, 185.59458923339844, 1689.568603515625, 167.19650268554688, 202.23321533203125, 240.0529327392578, 165.1607208251953, 1940.664794921875, 1423.9302978515625, 399.8851318359375, 990.5671997070312, 559.28369140625, 670.1260375976562, 536.8279418945312, 505.7823181152344, 528.27392578125, 572.500732421875, 254.3348388671875, 553.6993408203125, 544.2898559570312, 701.0911865234375, 868.338134765625, 4004.7578125, 693.4171142578125, 732.4398193359375, 584.5032348632812, 822.2951049804688, 2646.791748046875, 5183.146484375, 1242.2733154296875, 3510.730712890625], \"loglift\": [30.0, 29.0, 28.0, 27.0, 26.0, 25.0, 24.0, 23.0, 22.0, 21.0, 20.0, 19.0, 18.0, 17.0, 16.0, 15.0, 14.0, 13.0, 12.0, 11.0, 10.0, 9.0, 8.0, 7.0, 6.0, 5.0, 4.0, 3.0, 2.0, 1.0, 2.0255000591278076, 2.0250000953674316, 2.0241000652313232, 2.023900032043457, 2.0237998962402344, 2.0234999656677246, 2.023400068283081, 2.023200035095215, 2.022599935531616, 2.022599935531616, 2.0225000381469727, 2.022200107574463, 2.0220999717712402, 2.0216000080108643, 2.0213000774383545, 2.0213000774383545, 2.0213000774383545, 2.020900011062622, 2.020900011062622, 2.020699977874756, 2.0204999446868896, 2.02020001411438, 2.02020001411438, 2.0201001167297363, 2.0199999809265137, 2.0199999809265137, 2.0197999477386475, 2.019700050354004, 2.018199920654297, 2.018199920654297, 2.0153000354766846, 2.007200002670288, 1.9528000354766846, 1.9890999794006348, 1.8824000358581543, 1.958899974822998, 1.7970999479293823, 1.980299949645996, 1.819599986076355, 1.6779999732971191, 1.763100028038025, 1.6375999450683594, 1.8667999505996704, 1.781499981880188, 1.0757999420166016, 1.7408000230789185, 1.2894999980926514, 1.0536999702453613, 1.5706000328063965, 0.953000009059906, 1.4706000089645386, 1.4835000038146973, 0.7210999727249146, 1.080899953842163, 0.6299999952316284, 0.6431000232696533, 0.739799976348877, 1.0844999551773071, 1.3265000581741333, 0.5475999712944031, 0.0575999990105629, 0.9682999849319458, 0.27399998903274536, 0.847000002861023, 0.6578999757766724, -0.014100000262260437, 0.5697000026702881, 2.0452001094818115, 2.044800043106079, 2.044600009918213, 2.0434999465942383, 2.0434000492095947, 2.0427000522613525, 2.0425000190734863, 2.0423998832702637, 2.0420000553131104, 2.041300058364868, 2.0411999225616455, 2.0409998893737793, 2.0409998893737793, 2.040600061416626, 2.0401999950408936, 2.04010009765625, 2.0397000312805176, 2.039599895477295, 2.0394999980926514, 2.039099931716919, 2.039099931716919, 2.0390000343322754, 2.038599967956543, 2.0385000705718994, 2.0381999015808105, 2.0376999378204346, 2.037100076675415, 2.036900043487549, 2.036900043487549, 2.0364999771118164, 2.031899929046631, 2.0318000316619873, 2.0308001041412354, 2.023099899291992, 2.032900094985962, 2.0308001041412354, 1.9905999898910522, 1.9452999830245972, 1.989799976348877, 1.9884999990463257, 1.9830000400543213, 1.9407999515533447, 1.858199954032898, 1.9696999788284302, 1.882599949836731, 1.8200000524520874, 1.5154999494552612, 1.9495999813079834, 1.700600028038025, 1.5044000148773193, 1.7956000566482544, 1.5720000267028809, 1.4508999586105347, 1.5461000204086304, 1.4234000444412231, 1.3523000478744507, 1.0579999685287476, 0.6973999738693237, 1.2980999946594238, 1.399399995803833, 0.6687999963760376, 0.859000027179718, 1.0434000492095947, 0.6948999762535095, 0.9133999943733215, 0.5392000079154968, 0.31630000472068787, 0.7174999713897705, 0.003100000089034438, 0.583899974822998, 0.8629000186920166, 2.0806000232696533, 2.0804998874664307, 2.078900098800659, 2.0778000354766846, 2.077399969100952, 2.076900005340576, 2.07669997215271, 2.0764999389648438, 2.075900077819824, 2.075700044631958, 2.074700117111206, 2.073499917984009, 2.0734000205993652, 2.0729000568389893, 2.0727999210357666, 2.072700023651123, 2.072200059890747, 2.0717999935150146, 2.0708000659942627, 2.0706000328063965, 2.0703999996185303, 2.0690999031066895, 2.0687999725341797, 2.068700075149536, 2.068000078201294, 2.0678000450134277, 2.066499948501587, 2.066499948501587, 2.066499948501587, 2.0664000511169434, 2.048099994659424, 2.0662999153137207, 2.051500082015991, 2.0102999210357666, 2.0225000381469727, 2.0088999271392822, 1.9707000255584717, 1.979200005531311, 1.96589994430542, 1.9251999855041504, 1.827299952507019, 1.9740999937057495, 1.774999976158142, 1.864400029182434, 1.742799997329712, 1.7106000185012817, 1.6004999876022339, 1.8174999952316284, 1.6053999662399292, 1.4670000076293945, 1.4729000329971313, 1.556399941444397, 1.423699975013733, 1.6994999647140503, 1.6755000352859497, 1.545199990272522, 1.365399956703186, 1.440500020980835, 1.4234000444412231, 1.3454999923706055, 1.3897000551223755, 1.3384000062942505, 1.4632999897003174, 1.4599000215530396, 1.5799000263214111, 0.9276000261306763, 1.5184999704360962, 1.176200032234192, 0.499099999666214, 0.7235000133514404, 0.3797000050544739, 1.0924999713897705, 0.7401999831199646, 0.15479999780654907, 2.1196000576019287, 2.1177000999450684, 2.117000102996826, 2.1166999340057373, 2.1166000366210938, 2.116300106048584, 2.115600109100342, 2.1150999069213867, 2.1150999069213867, 2.114799976348877, 2.1147000789642334, 2.114000082015991, 2.113800048828125, 2.113300085067749, 2.1131999492645264, 2.1129000186920166, 2.112499952316284, 2.1124000549316406, 2.112299919128418, 2.111799955368042, 2.1113998889923096, 2.1108999252319336, 2.1105000972747803, 2.1096999645233154, 2.109499931335449, 2.1089000701904297, 2.108599901199341, 2.108599901199341, 2.107800006866455, 2.1075000762939453, 2.101799964904785, 2.099600076675415, 2.0685999393463135, 2.092400074005127, 2.0650999546051025, 2.073899984359741, 2.0125999450683594, 2.021399974822998, 2.000699996948242, 2.0023000240325928, 2.0262999534606934, 2.0680999755859375, 1.9438999891281128, 1.8285000324249268, 1.8824000358581543, 1.9651000499725342, 1.9211000204086304, 1.8946000337600708, 1.7213000059127808, 1.8492000102996826, 1.8622000217437744, 2.00570011138916, 1.864300012588501, 1.8091000318527222, 1.291200041770935, 1.6136000156402588, 1.176200032234192, 1.246999979019165, 1.326200008392334, 0.973800003528595, 1.5801000595092773, 0.8787999749183655, 1.298699975013733, 0.9729999899864197, 0.7918999791145325, 0.4300999939441681, 0.10779999941587448, 0.5931000113487244, 0.991100013256073, 0.40450000762939453, 2.3443000316619873, 2.342400074005127, 2.3417999744415283, 2.341399908065796, 2.3408000469207764, 2.3394999504089355, 2.339400053024292, 2.3392999172210693, 2.338399887084961, 2.3382999897003174, 2.3376998901367188, 2.3373000621795654, 2.3369998931884766, 2.3369998931884766, 2.3368000984191895, 2.3361001014709473, 2.335400104522705, 2.33489990234375, 2.3348000049591064, 2.3345000743865967, 2.3341000080108643, 2.333899974822998, 2.3327999114990234, 2.33270001411438, 2.3324999809265137, 2.3324999809265137, 2.33240008354187, 2.332200050354004, 2.3320000171661377, 2.331899881362915, 2.321000099182129, 2.319499969482422, 2.3125, 2.2964000701904297, 2.3036000728607178, 2.281100034713745, 2.3059000968933105, 2.289400100708008, 2.218400001525879, 2.106600046157837, 2.063800096511841, 2.226300001144409, 2.183000087738037, 2.096299886703491, 2.19569993019104, 2.1347999572753906, 2.1861000061035156, 2.0332999229431152, 2.193000078201294, 1.8654999732971191, 2.0510001182556152, 1.8450000286102295, 1.6746000051498413, 1.5880000591278076, 1.9641000032424927, 0.8166999816894531, 0.7954000234603882, 1.6297999620437622, 1.572100043296814, 1.6842999458312988, 0.6661999821662903, 0.41440001130104065, 1.1360000371932983, 0.9230999946594238, 0.927299976348877, 0.77920001745224, 0.24959999322891235, -0.010900000110268593, 0.20020000636577606, -0.3833000063896179, 0.3409999907016754, 0.04670000076293945, 0.013500000350177288, 1.1301000118255615, 0.7407000064849854, 2.3550000190734863, 2.3548998832702637, 2.3541998863220215, 2.3541998863220215, 2.352099895477295, 2.3513998985290527, 2.3487000465393066, 2.347599983215332, 2.3473000526428223, 2.3471999168395996, 2.34689998626709, 2.3457999229431152, 2.3454999923706055, 2.3452999591827393, 2.3450000286102295, 2.3440001010894775, 2.3436999320983887, 2.343400001525879, 2.3431999683380127, 2.3427999019622803, 2.342600107192993, 2.342400074005127, 2.3422999382019043, 2.3417999744415283, 2.3415000438690186, 2.3415000438690186, 2.341399908065796, 2.3403000831604004, 2.3401999473571777, 2.340100049972534, 2.3173999786376953, 2.297600030899048, 2.3120999336242676, 2.3108999729156494, 2.2611000537872314, 2.2952001094818115, 2.3132998943328857, 2.235300064086914, 2.249799966812134, 2.33270001411438, 2.2404000759124756, 2.1772000789642334, 2.203000068664551, 2.1942999362945557, 2.2360000610351562, 2.2339999675750732, 2.071899890899658, 1.9709999561309814, 2.089400053024292, 1.9450000524520874, 2.13100004196167, 2.011899948120117, 2.0436999797821045, 1.7994999885559082, 1.6154999732971191, 1.215399980545044, 1.9223999977111816, 1.5217000246047974, 1.7158000469207764, 0.7318000197410583, 1.5988999605178833, 0.6722000241279602, 0.460999995470047, 0.4821999967098236, 0.07440000027418137, 0.4043000042438507, 0.7802000045776367, 0.4431000053882599, 0.03189999982714653, 0.3253999948501587, 0.4275999963283539, 0.4212999939918518, 0.9513000249862671, 0.9588000178337097, 0.13619999587535858, 0.011599999852478504, 2.4128000736236572, 2.4117000102996826, 2.411600112915039, 2.4112000465393066, 2.4096999168395996, 2.4094998836517334, 2.408799886703491, 2.408799886703491, 2.408099889755249, 2.407900094985962, 2.4077999591827393, 2.4075000286102295, 2.4072000980377197, 2.407099962234497, 2.407099962234497, 2.4068000316619873, 2.4068000316619873, 2.4066998958587646, 2.4065001010894775, 2.406399965286255, 2.406100034713745, 2.4059998989105225, 2.4056999683380127, 2.4052000045776367, 2.4052000045776367, 2.4049999713897705, 2.4047000408172607, 2.4047000408172607, 2.404599905014038, 2.404400110244751, 2.3933000564575195, 2.376499891281128, 2.341399908065796, 2.3564999103546143, 2.3580000400543213, 2.231600046157837, 2.300600051879883, 2.1846001148223877, 2.266700029373169, 2.2227001190185547, 2.257499933242798, 2.1233999729156494, 1.9658000469207764, 2.3125998973846436, 1.9865000247955322, 1.597100019454956, 1.7648999691009521, 1.0089999437332153, 1.4464999437332153, 1.0003999471664429, 1.2259000539779663, 1.7905000448226929, 1.7924000024795532, 1.4221999645233154, 1.3905999660491943, 1.7354999780654907, 0.6812999844551086, 0.6772000193595886, 0.5328999757766724, 0.23199999332427979, 1.4362000226974487, 0.38100001215934753, 0.775600016117096, 0.9772999882698059, 0.843500018119812, 0.9948999881744385, 0.7968999743461609, 0.7509999871253967, 0.16369999945163727, 0.7944999933242798, 1.1397000551223755, 0.7049999833106995, 2.539799928665161, 2.5383999347686768, 2.5380001068115234, 2.5373001098632812, 2.5369999408721924, 2.5364999771118164, 2.5357000827789307, 2.5344998836517334, 2.53439998626709, 2.5341999530792236, 2.533400058746338, 2.5332999229431152, 2.533099889755249, 2.5325000286102295, 2.5322000980377197, 2.5318000316619873, 2.5313000679016113, 2.5309998989105225, 2.5308001041412354, 2.5299999713897705, 2.5299999713897705, 2.5297000408172607, 2.529599905014038, 2.529400110244751, 2.5292000770568848, 2.5280001163482666, 2.5276999473571777, 2.5267999172210693, 2.526700019836426, 2.5257999897003174, 2.4983999729156494, 2.449399948120117, 2.4505999088287354, 2.509399890899658, 2.4765000343322754, 2.330899953842163, 2.104300022125244, 2.2607998847961426, 2.390700101852417, 2.3450000286102295, 1.8308000564575195, 1.7178000211715698, 2.0494000911712646, 1.8805999755859375, 2.0169999599456787, 2.0546000003814697, 1.9692000150680542, 1.902500033378601, 2.0139999389648438, 1.6618000268936157, 1.9521000385284424, 1.7515000104904175, 1.1318999528884888, 1.6973999738693237, 1.379699945449829, 1.1074999570846558, 1.30649995803833, 1.3228000402450562, 0.4544999897480011, 0.39149999618530273, 1.2115000486373901, 0.9824000000953674, -0.3142000138759613, 0.1941000074148178, 2.65339994430542, 2.6526999473571777, 2.6501998901367188, 2.6496999263763428, 2.6489999294281006, 2.6489999294281006, 2.6486001014709473, 2.648099899291992, 2.648099899291992, 2.646899938583374, 2.645900011062622, 2.6458001136779785, 2.645699977874756, 2.6454999446868896, 2.64520001411438, 2.6447999477386475, 2.644700050354004, 2.643699884414673, 2.643399953842163, 2.643399953842163, 2.643399953842163, 2.643399953842163, 2.6431000232696533, 2.6429998874664307, 2.6429998874664307, 2.6429998874664307, 2.6424999237060547, 2.6422998905181885, 2.642199993133545, 2.641700029373169, 2.635999917984009, 2.583699941635132, 2.539299964904785, 2.545099973678589, 2.5088999271392822, 2.5473999977111816, 2.465399980545044, 2.5885000228881836, 2.606800079345703, 2.528899908065796, 2.5975000858306885, 2.5183000564575195, 2.367000102996826, 2.4702000617980957, 2.3645999431610107, 2.3884999752044678, 2.253999948501587, 2.546799898147583, 1.9607000350952148, 2.437000036239624, 1.7419999837875366, 1.7599999904632568, 1.6059999465942383, 2.103300094604492, 2.1456000804901123, 2.0232999324798584, 1.0397000312805176, 1.5461000204086304, 2.0940001010894775, 0.710099995136261, 1.1996999979019165, 0.8400999903678894, 1.422700047492981, 1.3034000396728516, -0.013100000098347664, -0.1525000035762787, 0.4368000030517578, 0.745199978351593, 0.510200023651123, -0.03449999913573265, -0.14550000429153442, 0.10100000351667404, 2.7214999198913574, 2.721299886703491, 2.7200000286102295, 2.719099998474121, 2.7186999320983887, 2.7184998989105225, 2.7183001041412354, 2.7179999351501465, 2.717400074005127, 2.7170000076293945, 2.716900110244751, 2.7167999744415283, 2.716599941253662, 2.716399908065796, 2.7163000106811523, 2.716200113296509, 2.716099977493286, 2.7156999111175537, 2.7156999111175537, 2.715100049972534, 2.714900016784668, 2.7146999835968018, 2.7144999504089355, 2.7144999504089355, 2.7144999504089355, 2.714400053024292, 2.71370005607605, 2.712899923324585, 2.7126998901367188, 2.7125000953674316, 2.7114999294281006, 2.70989990234375, 2.660099983215332, 2.6861000061035156, 2.523200035095215, 2.6847000122070312, 2.6684000492095947, 2.6433000564575195, 2.6735000610351562, 2.31469988822937, 2.286600112915039, 2.4769999980926514, 2.259000062942505, 2.381700038909912, 2.336400032043457, 2.3768999576568604, 2.3594000339508057, 2.3306000232696533, 2.299099922180176, 2.5443999767303467, 2.254300117492676, 2.1686999797821045, 1.9785000085830688, 1.773300051689148, 0.8248000144958496, 1.8694000244140625, 1.7740000486373901, 1.873900055885315, 1.5986000299453735, 0.6425999999046326, 0.05000000074505806, 1.1669000387191772, 0.04839999973773956], \"logprob\": [30.0, 29.0, 28.0, 27.0, 26.0, 25.0, 24.0, 23.0, 22.0, 21.0, 20.0, 19.0, 18.0, 17.0, 16.0, 15.0, 14.0, 13.0, 12.0, 11.0, 10.0, 9.0, 8.0, 7.0, 6.0, 5.0, 4.0, 3.0, 2.0, 1.0, -4.882199764251709, -5.374499797821045, -5.914400100708008, -5.995299816131592, -6.022299766540527, -6.139200210571289, -6.162799835205078, -6.240099906921387, -6.430099964141846, -6.431300163269043, -6.4481000900268555, -6.517099857330322, -6.532599925994873, -5.713200092315674, -6.713799953460693, -6.680600166320801, -6.725599765777588, -6.80109977722168, -6.786600112915039, -6.832300186157227, -6.872700214385986, -6.892399787902832, -6.929500102996826, -6.946300029754639, -6.952899932861328, -6.963099956512451, -6.981100082397461, -7.000899791717529, -7.207600116729736, -7.210000038146973, -6.230899810791016, -6.464200019836426, -5.641499996185303, -6.496399879455566, -5.325099945068359, -6.250899791717529, -4.987599849700928, -6.652400016784668, -5.7866997718811035, -5.463200092315674, -5.974699974060059, -5.600100040435791, -6.321100234985352, -6.075300216674805, -4.164999961853027, -6.055200099945068, -5.059800148010254, -4.702600002288818, -5.730299949645996, -4.607699871063232, -5.853899955749512, -5.873799800872803, -5.070400238037109, -5.449900150299072, -5.1554999351501465, -5.1855998039245605, -5.401899814605713, -5.638400077819824, -5.808599948883057, -5.481299877166748, -5.3383002281188965, -5.733500003814697, -5.481500148773193, -5.7484002113342285, -5.736800193786621, -5.668000221252441, -5.838200092315674, -4.753300189971924, -5.165999889373779, -5.369900226593018, -5.967899799346924, -5.506999969482422, -6.253600120544434, -6.323699951171875, -6.35129976272583, -6.450500011444092, -6.612100124359131, -6.622200012207031, -6.675099849700928, -6.678599834442139, -6.653600215911865, -6.823699951171875, -6.845600128173828, -6.909299850463867, -6.933800220489502, -6.952300071716309, -7.013199806213379, -7.014999866485596, -6.98859977722168, -7.004700183868408, -7.095900058746338, -7.135300159454346, -7.196100234985352, -7.264999866485596, -7.2606000900268555, -7.272200107574463, -6.650000095367432, -4.354899883270264, -5.3043999671936035, -5.513999938964844, -5.460400104522705, -6.571499824523926, -6.394000053405762, -5.218299865722656, -5.284299850463867, -6.085599899291992, -6.298299789428711, -6.320799827575684, -5.9166998863220215, -5.550000190734863, -6.38100004196167, -5.966000080108643, -5.768099784851074, -4.58519983291626, -6.354599952697754, -5.545199871063232, -5.00629997253418, -5.991600036621094, -5.504700183868408, -5.3028998374938965, -5.598199844360352, -5.393599987030029, -5.41349983215332, -5.011899948120117, -4.543399810791016, -5.440800189971924, -5.635000228881836, -4.891900062561035, -5.127299785614014, -5.315899848937988, -5.143700122833252, -5.407100200653076, -5.2895002365112305, -5.402100086212158, -5.500899791717529, -5.3927998542785645, -5.484099864959717, -5.540599822998047, -5.625400066375732, -5.695799827575684, -6.301300048828125, -6.148200035095215, -6.662399768829346, -6.764100074768066, -6.801199913024902, -6.842599868774414, -6.940400123596191, -6.960299968719482, -7.102200031280518, -7.246399879455566, -7.256100177764893, -7.317500114440918, -7.3225998878479, -7.335999965667725, -7.383800029754639, -7.423299789428711, -7.511600017547607, -7.533400058746338, -7.552299976348877, -7.52400016784668, -7.672999858856201, -7.679500102996826, -7.730100154876709, -7.745500087738037, -7.829500198364258, -7.829899787902832, -7.832900047302246, -7.836999893188477, -5.795100212097168, -7.8125, -6.699900150299072, -5.167600154876709, -6.002200126647949, -5.733699798583984, -4.740300178527832, -5.880899906158447, -6.10129976272583, -5.969099998474121, -5.160900115966797, -6.678699970245361, -5.234300136566162, -5.997900009155273, -5.223100185394287, -5.309899806976318, -4.928400039672852, -6.041500091552734, -5.117800235748291, -4.515200138092041, -4.7032999992370605, -5.03980016708374, -4.662199974060059, -5.71019983291626, -5.6722002029418945, -5.348400115966797, -4.901500225067139, -5.117700099945068, -5.128900051116943, -4.952400207519531, -5.177800178527832, -5.201499938964844, -5.495699882507324, -5.51609992980957, -5.6367998123168945, -5.026400089263916, -5.65910005569458, -5.4980998039245605, -5.430799961090088, -5.4899001121521, -5.445300102233887, -5.597400188446045, -5.629899978637695, -5.628900051116943, -5.063899993896484, -6.070400238037109, -6.309800148010254, -6.3907999992370605, -6.395899772644043, -6.473999977111816, -6.618800163269043, -6.7153000831604, -6.723800182342529, -6.781499862670898, -6.766499996185303, -5.94320011138916, -6.934599876403809, -7.006800174713135, -7.021900177001953, -7.065999984741211, -7.116600036621094, -7.1203999519348145, -7.1356000900268555, -7.191699981689453, -7.2342000007629395, -5.584799766540527, -7.332799911499023, -7.412700176239014, -7.42519998550415, -7.191299915313721, -7.507500171661377, -7.5081000328063965, -7.56879997253418, -7.589399814605713, -6.187300205230713, -6.0883002281188965, -4.949900150299072, -6.490799903869629, -5.281499862670898, -5.921500205993652, -4.572700023651123, -5.73799991607666, -5.423999786376953, -5.467400074005127, -5.894899845123291, -6.571000099182129, -5.354100227355957, -4.242700099945068, -4.984099864959717, -5.727200031280518, -5.379000186920166, -5.3383002281188965, -4.232699871063232, -5.212600231170654, -5.309599876403809, -6.185999870300293, -5.68149995803833, -5.6529998779296875, -4.570099830627441, -5.377799987792969, -4.806000232696533, -4.966400146484375, -5.1168999671936035, -4.681700229644775, -5.565299987792969, -4.904900074005127, -5.4120001792907715, -5.2144999504089355, -5.293900012969971, -5.325399875640869, -5.288099765777588, -5.44320011138916, -5.561200141906738, -5.525400161743164, -6.017399787902832, -6.459199905395508, -6.554100036621094, -6.177000045776367, -6.7220001220703125, -6.895100116729736, -6.903600215911865, -5.435500144958496, -6.782800197601318, -7.031599998474121, -7.093900203704834, -7.136499881744385, -7.1616997718811035, -7.162600040435791, -7.181000232696533, -6.083799839019775, -7.304900169372559, -7.343400001525879, -7.348599910736084, -7.369699954986572, -7.401000022888184, -7.41349983215332, -7.497000217437744, -7.502200126647949, -7.513800144195557, -7.516499996185303, -7.521500110626221, -7.535600185394287, -7.5441999435424805, -7.55109977722168, -5.597400188446045, -5.7683000564575195, -6.349699974060059, -6.095099925994873, -6.504499912261963, -6.050600051879883, -6.671199798583984, -6.494999885559082, -5.345600128173828, -4.648399829864502, -4.356599807739258, -6.17140007019043, -5.94320011138916, -5.763000011444092, -6.377099990844727, -6.164899826049805, -6.436299800872803, -5.794899940490723, -6.502699851989746, -5.310500144958496, -6.0553998947143555, -5.515200138092041, -5.35230016708374, -5.60129976272583, -6.164999961853027, -4.837200164794922, -4.860099792480469, -5.854800224304199, -5.8242998123168945, -5.942299842834473, -5.11929988861084, -4.981500148773193, -5.545599937438965, -5.661200046539307, -5.696599960327148, -5.682400226593018, -5.589000225067139, -5.571599960327148, -5.62470006942749, -5.624100208282471, -5.744900226593018, -5.708799839019775, -5.770199775695801, -5.910600185394287, -5.906000137329102, -5.388000011444092, -4.97730016708374, -5.809100151062012, -5.883299827575684, -6.095799922943115, -6.528900146484375, -6.915599822998047, -7.037899971008301, -6.993800163269043, -7.081099987030029, -7.107399940490723, -7.218400001525879, -7.237599849700928, -7.257500171661377, -7.2804999351501465, -7.362400054931641, -7.387899875640869, -7.4105000495910645, -7.4207000732421875, -7.450399875640869, -7.463500022888184, -7.480199813842773, -7.480000019073486, -7.519499778747559, -7.536099910736084, -7.539700031280518, -7.541999816894531, -7.6118998527526855, -7.619999885559082, -7.1971001625061035, -5.447000026702881, -5.146599769592285, -5.984499931335449, -6.154799938201904, -5.329599857330322, -6.46150016784668, -6.9243998527526855, -5.44290018081665, -5.820099830627441, -7.303299903869629, -6.218299865722656, -5.551400184631348, -6.050899982452393, -6.115699768066406, -6.45389986038208, -6.50540018081665, -5.731599807739258, -5.35699987411499, -5.955699920654297, -5.418099880218506, -6.295400142669678, -5.906899929046631, -6.03879976272583, -5.660900115966797, -5.357600212097168, -4.576000213623047, -6.046299934387207, -5.535999774932861, -5.82480001449585, -4.986599922180176, -5.956099987030029, -5.39900016784668, -5.295400142669678, -5.342700004577637, -5.166399955749512, -5.351200103759766, -5.513000011444092, -5.395500183105469, -5.363999843597412, -5.460100173950195, -5.502299785614014, -5.614999771118164, -5.730199813842773, -5.740499973297119, -5.725100040435791, -5.77209997177124, -5.916200160980225, -6.203800201416016, -6.205599784851074, -6.309999942779541, -6.57480001449585, -6.602399826049805, -6.702899932861328, -6.705100059509277, -6.802800178527832, -6.820400238037109, -6.838099956512451, -6.872300148010254, -6.866399765014648, -5.8531999588012695, -6.912700176239014, -6.946300029754639, -6.9471001625061035, -6.961400032043457, -6.976600170135498, -6.990600109100342, -7.022799968719482, -7.031899929046631, -6.214600086212158, -7.107999801635742, -7.111999988555908, -7.125100135803223, -7.150100231170654, -7.1504998207092285, -7.16379976272583, -7.183000087738037, -5.0954999923706055, -6.145999908447266, -5.829899787902832, -6.146999835968018, -6.287600040435791, -5.656300067901611, -6.222400188446045, -5.499899864196777, -6.05810022354126, -6.175099849700928, -6.523399829864502, -6.176700115203857, -5.816299915313721, -6.7428998947143555, -6.06220006942749, -5.412899971008301, -5.721799850463867, -4.644899845123291, -5.347899913787842, -4.7179999351501465, -5.152400016784668, -5.967599868774414, -5.999100208282471, -5.628600120544434, -5.627799987792969, -5.966800212860107, -5.143700122833252, -5.252600193023682, -5.252600193023682, -5.163899898529053, -5.8053998947143555, -5.447700023651123, -5.619100093841553, -5.710599899291992, -5.69189977645874, -5.749000072479248, -5.70359992980957, -5.710599899291992, -5.674900054931641, -5.8471999168396, -5.911399841308594, -5.9029998779296875, -4.351600170135498, -5.3572998046875, -5.516900062561035, -5.445400238037109, -5.866499900817871, -5.999599933624268, -6.178400039672852, -6.39169979095459, -6.408699989318848, -6.450099945068359, -4.750800132751465, -6.572500228881836, -6.60129976272583, -6.676599979400635, -6.698999881744385, -6.645400047302246, -6.8256001472473145, -6.853000164031982, -6.371300220489502, -6.9558000564575195, -6.956299781799316, -6.978799819946289, -6.988800048828125, -7.013700008392334, -6.946000099182129, -7.128799915313721, -7.146599769592285, -7.2179999351501465, -7.229000091552734, -7.287799835205078, -4.95959997177124, -4.533999919891357, -5.435999870300293, -6.94350004196167, -6.648799896240234, -5.456600189208984, -4.546800136566162, -5.6230998039245605, -6.371500015258789, -6.284299850463867, -4.621500015258789, -4.631499767303467, -5.618000030517578, -5.259300231933594, -5.611199855804443, -5.697000026702881, -5.560400009155273, -5.549799919128418, -5.781899929046631, -5.357699871063232, -5.821599960327148, -5.603300094604492, -5.048399925231934, -5.6143999099731445, -5.34499979019165, -5.15939998626709, -5.414700031280518, -5.561200141906738, -5.336999893188477, -5.3649001121521, -5.582699775695801, -5.557499885559082, -5.554999828338623, -5.589600086212158, -5.306000232696533, -5.590199947357178, -6.189599990844727, -6.274400234222412, -6.389599800109863, -6.389500141143799, -6.435200214385986, -6.504300117492676, -6.507500171661377, -6.6519999504089355, -6.760200023651123, -6.632599830627441, -6.781199932098389, -6.806099891662598, -6.833499908447266, -6.872200012207031, -6.879899978637695, -6.9542999267578125, -6.990300178527832, -6.370100021362305, -6.994999885559082, -6.997000217437744, -5.59689998626709, -7.023399829864502, -7.023399829864502, -7.025400161743164, -7.065000057220459, -7.035699844360352, -7.0879998207092285, -7.124899864196777, -6.369200229644775, -5.4944000244140625, -5.081399917602539, -5.257400035858154, -5.519999980926514, -6.0345001220703125, -5.214099884033203, -6.502200126647949, -6.671199798583984, -6.0482001304626465, -6.612400054931641, -6.098800182342529, -5.285799980163574, -5.903200149536133, -5.553400039672852, -5.670000076293945, -5.394599914550781, -6.484300136566162, -5.22599983215332, -6.290200233459473, -5.123600006103516, -5.187600135803223, -4.965199947357178, -5.832200050354004, -5.899400234222412, -5.825500011444092, -5.028299808502197, -5.555200099945068, -6.0192999839782715, -5.151199817657471, -5.456500053405762, -5.453000068664551, -5.76200008392334, -5.762700080871582, -5.408999919891357, -5.3933000564575195, -5.599400043487549, -5.662700176239014, -5.7164998054504395, -5.688399791717529, -5.706200122833252, -5.737599849700928, -4.496799945831299, -4.617499828338623, -5.374000072479248, -5.655700206756592, -5.768099784851074, -5.807300090789795, -5.857600212097168, -5.942200183868408, -6.054900169372559, -6.128300189971924, -6.153299808502197, -6.173099994659424, -6.179500102996826, -6.234899997711182, -6.258200168609619, -6.203199863433838, -6.280900001525879, -6.3358001708984375, -6.345300197601318, -6.419400215148926, -6.450300216674805, -6.476099967956543, -6.50439977645874, -6.50600004196167, -6.509799957275391, -6.446499824523926, -6.600800037384033, -6.6890997886657715, -6.702099800109863, -6.729800224304199, -5.840000152587891, -6.20389986038208, -4.364299774169922, -6.039400100708008, -3.9937000274658203, -6.145199775695801, -5.97130012512207, -5.824900150299072, -6.168600082397461, -4.063600063323975, -4.401299953460693, -5.480899810791016, -4.791800022125244, -5.240699768066406, -5.105299949645996, -5.286499977111816, -5.36359977722168, -5.348800182342529, -5.300000190734863, -5.866099834442139, -5.378200054168701, -5.480899810791016, -5.417900085449219, -5.409200191497803, -4.829100131988525, -5.538000106811523, -5.578700065612793, -5.704500198364258, -5.638400077819824, -5.4253997802734375, -5.345900058746338, -5.65749979019165, -5.737199783325195]}, \"token.table\": {\"Topic\": [1, 2, 3, 4, 5, 6, 8, 9, 10, 3, 4, 5, 6, 7, 8, 4, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 1, 3, 5, 8, 1, 2, 3, 5, 8, 1, 5, 8, 9, 5, 3, 8, 7, 4, 1, 2, 5, 6, 7, 8, 9, 10, 2, 3, 4, 5, 6, 7, 8, 10, 3, 8, 1, 6, 9, 2, 4, 5, 2, 3, 4, 5, 8, 1, 10, 1, 3, 4, 8, 1, 1, 2, 3, 5, 6, 7, 8, 9, 1, 6, 8, 9, 10, 1, 1, 1, 3, 5, 6, 6, 2, 2, 2, 1, 2, 6, 8, 9, 10, 5, 1, 2, 3, 4, 8, 2, 3, 4, 5, 6, 7, 3, 5, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 1, 1, 1, 3, 9, 4, 5, 7, 1, 3, 4, 5, 6, 7, 8, 9, 10, 7, 10, 7, 1, 8, 6, 7, 1, 2, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 1, 3, 7, 8, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 2, 2, 5, 6, 2, 5, 3, 4, 4, 9, 7, 1, 3, 4, 5, 7, 8, 9, 10, 10, 8, 1, 2, 3, 4, 5, 6, 7, 9, 6, 5, 6, 7, 10, 10, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 1, 4, 5, 6, 7, 3, 4, 8, 4, 6, 4, 5, 1, 3, 4, 5, 6, 7, 8, 9, 10, 8, 9, 9, 10, 5, 6, 4, 6, 7, 8, 10, 9, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 9, 7, 2, 1, 2, 3, 4, 5, 6, 7, 8, 9, 6, 4, 4, 9, 1, 2, 3, 5, 8, 9, 4, 7, 8, 9, 1, 2, 1, 2, 1, 2, 5, 4, 8, 3, 4, 7, 8, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 8, 1, 2, 3, 8, 10, 6, 7, 10, 3, 4, 4, 9, 1, 5, 6, 8, 7, 8, 7, 10, 2, 3, 4, 6, 7, 8, 1, 2, 3, 4, 7, 10, 2, 3, 4, 5, 6, 7, 8, 10, 1, 4, 6, 7, 10, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 2, 3, 4, 5, 6, 7, 8, 9, 3, 4, 7, 9, 6, 4, 2, 9, 10, 3, 1, 3, 4, 5, 6, 7, 8, 9, 10, 1, 2, 3, 4, 6, 7, 8, 3, 1, 3, 4, 5, 6, 7, 8, 9, 6, 1, 4, 5, 6, 8, 9, 10, 1, 2, 6, 8, 10, 1, 6, 8, 8, 8, 8, 8, 4, 7, 10, 9, 2, 6, 2, 3, 4, 6, 7, 8, 9, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 1, 4, 6, 8, 1, 2, 4, 6, 9, 10, 8, 8, 5, 1, 2, 3, 4, 5, 6, 7, 8, 9, 3, 10, 3, 4, 7, 8, 4, 9, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 3, 3, 4, 8, 9, 3, 4, 8, 1, 2, 3, 4, 5, 9, 10, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 2, 1, 3, 4, 5, 6, 7, 8, 9, 10, 5, 1, 6, 9, 2, 7, 1, 2, 4, 5, 6, 7, 9, 10, 4, 5, 6, 8, 10, 3, 5, 9, 1, 7, 9, 1, 2, 3, 5, 7, 9, 10, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 9, 4, 1, 2, 3, 4, 5, 6, 7, 10, 8, 1, 2, 6, 8, 10, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 5, 3, 4, 8, 10, 8, 4, 10, 1, 2, 9, 3, 4, 1, 1, 2, 6, 8, 9, 10, 1, 2, 3, 4, 5, 7, 8, 9, 10, 1, 2, 7, 8, 1, 5, 6, 8, 1, 3, 4, 8, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 6, 6, 1, 3, 5, 9, 3, 4, 5, 10, 7, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 3, 4, 1, 2, 5, 9, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 2, 3, 4, 8, 9, 2, 6, 10, 6, 9, 1, 2, 3, 4, 8, 9, 5, 6, 8, 9, 10, 2, 4, 7, 10, 7, 10, 7, 9, 1, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 1, 2, 3, 5, 8, 10, 2, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 4, 9, 2, 1, 5, 6, 8, 3, 3, 4, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 1, 3, 1, 2, 3, 1, 2, 5, 6, 7, 8, 9, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 8, 1, 6, 9, 5, 8, 3, 6, 8, 6, 7, 9, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 1, 2, 4, 5, 6, 7, 8, 9, 10, 6, 1, 5, 8, 9, 1, 2, 5, 7, 5, 6, 7, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 5, 10, 7, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 1, 5, 6, 7, 9, 1, 7, 10, 1, 2, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 9, 8, 6, 7, 6, 5, 1, 6, 6, 1, 2, 3, 4, 5, 6, 7, 9, 1, 2, 3, 4, 8, 6, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 2, 3, 4, 7, 8, 9, 9, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 7, 9, 10, 7, 3, 4, 5, 7, 8, 5, 6, 9, 10, 9, 4, 2, 3, 4, 6, 7, 8, 9, 10, 5, 8, 1, 1, 2, 10, 1, 2, 10, 2, 10, 2, 4, 7, 9, 7, 2, 4, 5, 6, 7, 9, 10, 2, 5, 10, 1, 2, 10, 3, 5, 6, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 4, 7, 5, 3, 3, 8, 1, 2, 3, 6, 7, 9, 10, 1, 7, 3, 7, 5, 3, 5, 10, 10, 7, 10, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 10, 10, 1, 2, 3, 4, 6, 7, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 1, 2, 5, 6, 7, 8, 9, 10, 2, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 7, 1, 2, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 1, 2, 4, 5, 6, 7, 9, 10, 3, 5, 8, 1, 3, 4, 5, 6, 8, 9, 10, 3, 6, 2, 3, 4, 6, 7, 8, 9, 10, 3, 4, 3, 5, 1, 2, 1, 4, 10, 5, 3, 4, 10, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 1, 3, 7, 8, 9, 1, 4, 8, 9, 4, 1, 2, 3, 4, 5, 7, 10, 1, 2, 3, 4, 5, 6, 7, 8, 10, 7, 1, 5, 7, 9, 9, 2, 4, 6, 9, 1, 8, 1, 2, 3, 5, 5, 2, 3, 4, 7, 8, 9, 3, 4, 8, 1, 2, 4, 5, 6, 8, 9, 10, 4, 5, 8, 4, 10, 2, 3, 5, 1, 2, 1, 4, 3, 6, 1, 3, 4, 1, 2, 6, 1, 2, 3, 5, 7, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 1, 8, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 2, 4, 6, 7, 8, 9, 3, 8, 7, 5, 4, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 3, 6, 8, 3, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 10, 5, 3, 5, 6, 7, 3, 4, 8, 1, 3, 4, 5, 6, 7, 10, 1, 2, 4, 7, 9, 10, 2, 8, 9, 2, 9, 10, 10, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 1, 2, 3, 5, 6, 7, 8, 9, 10, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 1, 2, 3, 4, 6, 7, 8, 9, 6, 9, 6, 5, 7, 7, 7, 9, 10, 8, 9, 10, 3, 1, 2, 4, 5, 6, 7, 8, 10, 7, 10, 10, 5, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 1, 2, 5, 6, 8, 10, 3, 1, 8, 9, 10, 3, 4, 8, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 4, 1, 5, 8, 10, 1, 2, 3, 4, 5, 6, 7, 1, 2, 3, 9, 3, 4, 7, 1, 8, 1, 2, 3, 4, 5, 6, 8, 3, 5, 6, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 2, 3, 4, 5, 8, 9, 3, 5, 7, 8, 9, 2, 2, 2, 3, 5, 8, 9, 10, 1, 3, 4, 5, 6, 7, 8, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 3, 4, 8, 10, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 3, 5, 10, 6, 5, 10, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 3, 8, 5, 3, 1, 2, 1, 2, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 1, 2, 3, 4, 5, 9, 7, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 2, 2, 7, 5, 6, 5, 6, 6, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 8, 1, 3, 5, 6, 7, 8, 9, 6, 1, 3, 5, 6, 7, 9, 10, 9, 1, 2, 4, 9, 10, 7, 5, 1, 2, 3, 4, 5, 6, 7, 10, 2, 7, 8, 2, 3, 4, 5, 6, 7, 2, 2, 3, 5, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 2, 3, 4, 8, 9, 2, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 2, 3, 5, 8, 9, 7, 10, 1, 2, 3, 4, 7, 9, 10, 3, 4, 8, 10, 2, 4, 1, 7, 7, 10, 1, 7, 8, 1, 6, 8, 10, 10, 1, 3, 4, 5, 6, 7, 8, 10, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 1, 1, 3, 4, 5, 1, 6, 10, 6, 3, 5, 4, 2, 2, 9, 3, 1, 1, 9, 10, 1, 2, 3, 4, 5, 6, 7, 10, 6, 2, 3, 4, 5, 6, 7, 8, 9, 10, 3, 5, 10, 1, 10, 2, 1, 2, 3, 4, 5, 7, 8, 9, 10, 1, 3, 4, 5, 8, 3, 5, 4, 5, 7, 4, 5, 6, 7, 8, 5, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 9, 1, 2, 5, 5, 1, 3, 4, 5, 6, 7, 8, 10, 3, 7, 10, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 7, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 1, 3, 4, 5, 6, 7, 8, 10, 8, 2, 3, 4, 6, 7, 8, 9, 10, 9, 5, 9, 8, 1, 2, 3, 5, 6, 8, 9, 10, 3, 9, 8, 4, 4, 9, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 8, 1, 2, 3, 5, 6, 3, 5, 7, 8, 10, 1, 2, 3, 4, 5, 6, 7, 8, 9, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 6, 2, 3, 4, 5, 6, 7, 8, 9, 2, 1, 2, 3, 4, 5, 6, 7, 9, 10, 2, 5, 2, 1, 2, 3, 6, 8, 9, 9, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 6, 4, 7, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 4, 5, 6, 7, 10, 3, 3, 4, 5, 7, 10, 1, 9, 1, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 6, 1, 2, 6, 9, 10, 1, 1, 1, 3, 2, 6, 7, 5, 7, 1, 2, 3, 4, 5, 6, 7, 9, 2, 4, 7, 5, 3, 4, 1, 4, 6, 7, 3, 4, 6, 8, 3, 6, 10, 6, 1, 5, 6, 8, 2, 1, 2, 3, 4, 5, 6, 7, 8, 10, 4, 8, 1, 3, 4, 8, 1, 10, 2, 3, 5, 6, 7, 8, 10, 3, 7, 7, 4, 1, 6, 6, 7, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 1, 2, 5, 7, 9, 1, 6, 7, 3, 5, 3, 1, 3, 4, 1, 5, 8, 9, 10, 5, 10, 3, 5, 7, 8, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 1, 2, 3, 3, 3, 3, 6, 7, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 9, 5, 1], \"Freq\": [0.14598289132118225, 0.5243467092514038, 0.1291005164384842, 0.0496540442109108, 0.00794464722275734, 0.02284085936844349, 0.06653641909360886, 0.0347578302025795, 0.01886853575706482, 0.40391483902931213, 0.1960684359073639, 0.17181970179080963, 0.03325542435050011, 0.0006928213406354189, 0.19329716265201569, 0.9846343994140625, 0.05246054753661156, 0.07400684058666229, 0.5367838144302368, 0.18267512321472168, 0.030914250761270523, 0.02623027376830578, 0.03278784081339836, 0.0496501587331295, 0.005620772950351238, 0.00843115895986557, 0.12411247193813324, 0.0630735531449318, 0.19735917448997498, 0.614458441734314, 0.07896016538143158, 0.02786829322576523, 0.006967073306441307, 0.12772968411445618, 0.7570886611938477, 0.0386776365339756, 0.08218997716903687, 0.00483470456674695, 0.8702468276023865, 0.9960854053497314, 0.3871470093727112, 0.6115800738334656, 0.9910170435905457, 0.9902247786521912, 0.33969980478286743, 0.014489565044641495, 0.09418217092752457, 0.09981700032949448, 0.004024879075586796, 0.20285390317440033, 0.03300400823354721, 0.21090367436408997, 0.12552714347839355, 0.12667876482009888, 0.06333938241004944, 0.012667876668274403, 0.17389538884162903, 0.03685200214385986, 0.07370400428771973, 0.38694602251052856, 0.9025949835777283, 0.09524871408939362, 0.7508120536804199, 0.05317366123199463, 0.19355212152004242, 0.2244642972946167, 0.7725217938423157, 0.002278825268149376, 0.025182049721479416, 0.7351221442222595, 0.18789683282375336, 0.011622484773397446, 0.0397101566195488, 0.3441043496131897, 0.6550210118293762, 0.04772661626338959, 0.8045344352722168, 0.03409044072031975, 0.11363480240106583, 0.9978176951408386, 0.06133982539176941, 0.707861602306366, 0.060113027691841125, 0.011041169054806232, 0.05643263831734657, 0.013494761660695076, 0.012267964892089367, 0.0772881805896759, 0.8128747344017029, 0.14955486357212067, 0.015835221856832504, 0.012316283769905567, 0.007037876173853874, 0.9969637393951416, 0.9991614818572998, 0.8529326319694519, 0.08812587708234787, 0.006294705905020237, 0.050357647240161896, 0.9844738245010376, 0.9972343444824219, 0.9992160201072693, 0.9963047504425049, 0.6339515447616577, 0.02203921601176262, 0.0427820086479187, 0.24113495647907257, 0.03241061046719551, 0.027224913239479065, 0.9964976906776428, 0.1443973183631897, 0.31100961565971375, 0.18626399338245392, 0.061518386006355286, 0.29563000798225403, 0.030768103897571564, 0.016782602295279503, 0.019579702988266945, 0.008391301147639751, 0.8978692293167114, 0.02517390251159668, 0.9904056191444397, 0.9817970991134644, 0.0017971218330785632, 0.02096642181277275, 0.6176108717918396, 0.11861003935337067, 0.02515970543026924, 0.02755586802959442, 0.004193284083157778, 0.14077454805374146, 0.03174915164709091, 0.01257985271513462, 0.9968417286872864, 0.991598904132843, 0.9969107508659363, 0.9914524555206299, 0.9858863353729248, 0.023294983431696892, 0.15141738951206207, 0.8230893611907959, 0.003686234587803483, 0.012901821173727512, 0.027646759524941444, 0.020274288952350616, 0.007372469175606966, 0.005529351532459259, 0.1032145693898201, 0.74830561876297, 0.06819533556699753, 0.8323493599891663, 0.1655372679233551, 0.9907169938087463, 0.9820555448532104, 0.016715839505195618, 0.056100912392139435, 0.9407691955566406, 0.013236194849014282, 0.9844419956207275, 0.09290590137243271, 0.5882739424705505, 0.0011710828403010964, 0.030838513746857643, 0.05074692144989967, 0.05933486297726631, 0.04801439493894577, 0.04333006590604782, 0.07065533101558685, 0.01405299361795187, 0.00951243843883276, 0.1598089635372162, 0.7933374047279358, 0.034244779497385025, 0.0074272542260587215, 0.13071967661380768, 0.06758801639080048, 0.18196773529052734, 0.039364445954561234, 0.10546701401472092, 0.24138575792312622, 0.019310861825942993, 0.07501526921987534, 0.13294784724712372, 0.04424953833222389, 0.11761061102151871, 0.023289229720830917, 0.1612779200077057, 0.10945937782526016, 0.1676824539899826, 0.19795845448970795, 0.022706998512148857, 0.06288091838359833, 0.09315691888332367, 0.9987183213233948, 0.9975488185882568, 0.0013375557027757168, 0.9978166222572327, 0.06178143993020058, 0.9339900016784668, 0.9676030278205872, 0.02764580026268959, 0.9971796870231628, 0.982193648815155, 0.9898443818092346, 0.03046371042728424, 0.08986794203519821, 0.7326522469520569, 0.048741936683654785, 0.016755040735006332, 0.00761592760682106, 0.012185484170913696, 0.05940423533320427, 0.9946929216384888, 0.98945152759552, 0.10203344374895096, 0.3764682412147522, 0.37154248356819153, 0.0049257525242865086, 0.0014073578640818596, 0.02392508275806904, 0.0731826052069664, 0.04644281044602394, 0.9914161562919617, 0.055586133152246475, 0.939405620098114, 0.9450883865356445, 0.05471564456820488, 0.9883830547332764, 0.18599717319011688, 0.01752147264778614, 0.2014969289302826, 0.27158281207084656, 0.20082302391529083, 0.013478055596351624, 0.06671637296676636, 0.03571684658527374, 0.0006739028031006455, 0.0074129304848611355, 0.018123658373951912, 0.4086061120033264, 0.023066474124789238, 0.5272337198257446, 0.023066474124789238, 0.04739116132259369, 0.8909538388252258, 0.056869395077228546, 0.9964706301689148, 0.9901596903800964, 0.9917035698890686, 0.995495080947876, 0.005461199674755335, 0.13243408501148224, 0.04505489766597748, 0.04642019420862198, 0.2047949880361557, 0.13789528608322144, 0.028671298176050186, 0.01092239934951067, 0.3877451717853546, 0.06210401654243469, 0.931560218334198, 0.9911597371101379, 0.9856107234954834, 0.03709100931882858, 0.9602450132369995, 0.8973998427391052, 0.039926689118146896, 0.0468980148434639, 0.005703812465071678, 0.008872597478330135, 0.9925441741943359, 0.09890180826187134, 0.14101789891719818, 0.0501607246696949, 0.13344645500183105, 0.028866078704595566, 0.20679469406604767, 0.028866078704595566, 0.12918752431869507, 0.16278575360774994, 0.01987500488758087, 0.9940217733383179, 0.9957262873649597, 0.9968324303627014, 0.12163656204938889, 0.1770021617412567, 0.04529913142323494, 0.08556503057479858, 0.024327311664819717, 0.09479262679815292, 0.041104767471551895, 0.009227600879967213, 0.40098121762275696, 0.9872248768806458, 0.9969919323921204, 0.9897413849830627, 0.9944040179252625, 0.6778358817100525, 0.13264651596546173, 0.023121869191527367, 0.0073016430251300335, 0.03772515431046486, 0.1204771101474762, 0.3485725224018097, 0.004737879149615765, 0.6463820934295654, 0.988788366317749, 0.0016636345535516739, 0.9981806874275208, 0.013511610217392445, 0.9863475561141968, 0.002685961779206991, 0.9857479333877563, 0.009400865994393826, 0.992397129535675, 0.9943981170654297, 0.9900022149085999, 0.049530185759067535, 0.9286909699440002, 0.021669454872608185, 0.23153142631053925, 0.499500572681427, 0.006072955206036568, 0.04630628600716591, 0.009109432809054852, 0.02429182082414627, 0.019737103953957558, 0.05237923935055733, 0.08198489993810654, 0.02960565686225891, 0.9902758598327637, 0.016072237864136696, 0.03214447572827339, 0.008036118932068348, 0.9402259588241577, 0.9969149231910706, 0.8351381421089172, 0.035791631788015366, 0.12725913524627686, 0.9410224556922913, 0.05614054203033447, 0.00718638114631176, 0.9845342040061951, 0.12217437475919724, 0.3212733566761017, 0.027149861678481102, 0.5279139876365662, 0.00637459009885788, 0.993161141872406, 0.049447860568761826, 0.949398934841156, 0.04700689762830734, 0.6894344687461853, 0.03917241469025612, 0.001958620734512806, 0.007834482938051224, 0.21348965167999268, 0.019394105300307274, 0.0030622270423918962, 0.16433952748775482, 0.7624945640563965, 0.04797489196062088, 0.0030622270423918962, 0.02497812546789646, 0.01405019499361515, 0.026539258658885956, 0.01405019499361515, 0.2700759768486023, 0.5214183926582336, 0.11708496510982513, 0.01248906273394823, 0.08582406491041183, 0.15019211173057556, 0.007152005564421415, 0.04470003396272659, 0.7116245627403259, 0.2507038414478302, 0.22155915200710297, 0.014572346583008766, 0.11628138273954391, 0.07137475907802582, 0.06988778710365295, 0.13055633008480072, 0.03211864084005356, 0.041040487587451935, 0.051449306309223175, 0.010484231635928154, 0.19526882469654083, 0.12318972498178482, 0.07863173633813858, 0.011794760823249817, 0.14677923917770386, 0.42985349893569946, 0.0013105289544910192, 0.8898380994796753, 0.08089437335729599, 0.008368383161723614, 0.019526228308677673, 0.9776338338851929, 0.992104709148407, 0.9852089285850525, 0.007977400906383991, 0.003988700453191996, 0.9938931465148926, 0.14128684997558594, 0.029136978089809418, 0.4518980383872986, 0.04947788640856743, 0.13359029591083527, 0.010995086282491684, 0.11489865183830261, 0.06212223693728447, 0.007696560118347406, 0.011460448615252972, 0.055010151118040085, 0.5684382319450378, 0.2177485227584839, 0.06990873068571091, 0.010314403101801872, 0.06532455235719681, 0.9914078712463379, 0.009856686927378178, 0.062097128480672836, 0.1419362872838974, 0.5105763673782349, 0.18234871327877045, 0.03154139965772629, 0.03055572882294655, 0.03154139965772629, 0.9842479228973389, 0.7061063051223755, 0.005525088403373957, 0.07514120638370514, 0.1193419098854065, 0.07514120638370514, 0.00110501772724092, 0.018785301595926285, 0.2932772636413574, 0.04783955588936806, 0.10399903357028961, 0.5553548336029053, 0.9974397420883179, 0.32539263367652893, 0.5732384324073792, 0.10035473853349686, 0.9916263222694397, 0.9956570863723755, 0.9919785857200623, 0.9961087107658386, 0.9902847409248352, 0.9942601919174194, 0.9961082935333252, 0.9942809343338013, 0.11343644559383392, 0.8848042488098145, 0.003028471488505602, 0.47547000646591187, 0.2640827000141144, 0.016353745013475418, 0.004239859990775585, 0.21078160405158997, 0.026044854894280434, 0.10129044950008392, 0.11214299499988556, 0.11756926774978638, 0.07717367261648178, 0.0012058386346325278, 0.1917283535003662, 0.2074042558670044, 0.08802622556686401, 0.06812988221645355, 0.03557224199175835, 0.9973674416542053, 0.11459366232156754, 0.7639577388763428, 0.12005050480365753, 0.581549882888794, 0.2825454771518707, 0.013715799897909164, 0.09326744079589844, 0.024688439443707466, 0.004114740062505007, 0.9912833571434021, 0.9915632605552673, 0.987637460231781, 0.006995608564466238, 0.002998118055984378, 0.24484629929065704, 0.12192346155643463, 0.29581430554389954, 0.11292910575866699, 0.0449717678129673, 0.1299184411764145, 0.03897553309798241, 0.9956022500991821, 0.9973152875900269, 0.009577130898833275, 0.4747520685195923, 0.0615672692656517, 0.4542296230792999, 0.9948829412460327, 0.9922850728034973, 0.04472442716360092, 0.25550490617752075, 0.08590632677078247, 0.18686839938163757, 0.07749281823635101, 0.13461610674858093, 0.031439945101737976, 0.04251034930348396, 0.11690345406532288, 0.023026438429951668, 0.9799155592918396, 0.7679171562194824, 0.20840230584144592, 0.02265242487192154, 0.99677973985672, 0.012705590575933456, 0.949009895324707, 0.037139419466257095, 0.0119171142578125, 0.01310882531106472, 0.605389416217804, 0.3467880189418793, 0.010725402273237705, 0.0011917114024981856, 0.010725402273237705, 0.051335275173187256, 0.014808251522481441, 0.20534110069274902, 0.1796734631061554, 0.05429692193865776, 0.14512087404727936, 0.175724595785141, 0.10299962013959885, 0.049360841512680054, 0.02138969674706459, 0.9928632378578186, 0.005768533796072006, 0.08797013759613037, 0.012979201041162014, 0.015863467007875443, 0.1543082743883133, 0.18603521585464478, 0.09518080949783325, 0.015863467007875443, 0.4254293739795685, 0.9893049597740173, 0.13154099881649017, 0.002684510312974453, 0.8644123077392578, 0.9944851398468018, 0.9891051650047302, 0.033735986799001694, 0.00606489647179842, 0.7467404007911682, 0.015162241645157337, 0.18535840511322021, 0.010992624796926975, 0.0007581120589748025, 0.0011371681466698647, 0.7884120345115662, 0.00419814744964242, 0.19731292128562927, 0.00419814744964242, 0.00587740633636713, 0.00438003009185195, 0.9942668080329895, 0.9940217733383179, 0.03518321365118027, 0.9631404876708984, 0.9966021180152893, 0.0027513206005096436, 0.29989394545555115, 0.09079357981681824, 0.6052905321121216, 0.0013756603002548218, 0.0013756603002548218, 0.996711790561676, 0.0427921898663044, 0.06828540563583374, 0.05462832748889923, 0.02276180312037468, 0.07192729413509369, 0.0783006027340889, 0.06464351713657379, 0.18118394911289215, 0.40789151191711426, 0.008194249123334885, 0.9927068948745728, 0.9913347959518433, 0.0025878301821649075, 0.007763490546494722, 0.5839869976043701, 0.26137086749076843, 0.0008626100607216358, 0.05520704388618469, 0.0733218565583229, 0.013801760971546173, 0.9992876648902893, 0.032602448016405106, 0.011643731035292149, 0.016301224008202553, 0.9128684997558594, 0.025616208091378212, 0.00628057774156332, 0.02791368030011654, 0.10188493132591248, 0.2023741751909256, 0.2979785203933716, 0.2449425458908081, 0.03768346831202507, 0.0397769920527935, 0.016748208552598953, 0.02512231096625328, 0.9943776726722717, 0.15899166464805603, 0.8376146554946899, 0.0025852303951978683, 0.9928542375564575, 0.998742938041687, 0.9821000695228577, 0.9941750764846802, 0.01414253655821085, 0.9086580276489258, 0.07424832135438919, 0.9900906682014465, 0.9895586967468262, 0.9942180514335632, 0.09427931159734726, 0.6226578950881958, 0.010360363870859146, 0.03833334892988205, 0.22896404564380646, 0.004144145641475916, 0.15294533967971802, 0.5817805528640747, 0.06882540136575699, 0.07235491275787354, 0.029412565752863884, 0.0011765025556087494, 0.0429423451423645, 0.04411884769797325, 0.007059015799313784, 0.9934695363044739, 0.9772945046424866, 0.021786820143461227, 0.9884756207466125, 0.21478646993637085, 0.08931714296340942, 0.10420333594083786, 0.5911944508552551, 0.007281843572854996, 0.540590226650238, 0.38905850052833557, 0.0627625584602356, 0.127691388130188, 0.08755980432033539, 0.05837320536375046, 0.11309808492660522, 0.13133971393108368, 0.012161084450781345, 0.08999202400445938, 0.025538276880979538, 0.030402710661292076, 0.3247009515762329, 0.9984749555587769, 0.9873408675193787, 0.03167729079723358, 0.09503187239170074, 0.8095307946205139, 0.059834882616996765, 0.018883921205997467, 0.978816568851471, 0.00650462880730629, 0.9887035489082336, 0.9960068464279175, 0.11995285004377365, 0.30648744106292725, 0.22458131611347198, 0.1421467661857605, 0.02906346507370472, 0.03117717243731022, 0.030648745596408844, 0.054427944123744965, 0.028535038232803345, 0.03381930664181709, 0.9655084609985352, 0.031217364594340324, 0.09275101125240326, 0.022714532911777496, 0.05489345267415047, 0.8271875381469727, 0.4964306652545929, 0.04393191635608673, 0.035145532339811325, 0.005491489544510841, 0.14717192947864532, 0.03953872621059418, 0.047226812690496445, 0.10214170813560486, 0.047226812690496445, 0.035145532339811325, 0.005433580372482538, 0.66561359167099, 0.2974885404109955, 0.008150370791554451, 0.021734321489930153, 0.11880886554718018, 0.6471291184425354, 0.23256203532218933, 0.9827058911323547, 0.012132171541452408, 0.037580136209726334, 0.037580136209726334, 0.6822240352630615, 0.1214127466082573, 0.06070637330412865, 0.06070637330412865, 0.7771899700164795, 0.01132929977029562, 0.18580052256584167, 0.02265859954059124, 0.00226586009375751, 0.010305746458470821, 0.020096207037568092, 0.3040195405483246, 0.6652359366416931, 0.9966678619384766, 0.9952186346054077, 0.05247049406170845, 0.9444688558578491, 0.9979948997497559, 0.24752682447433472, 0.07662222534418106, 0.0008545229793526232, 0.08630681782960892, 0.18600116670131683, 0.13102684915065765, 0.15210509300231934, 0.027059894055128098, 0.023356961086392403, 0.06893151998519897, 0.005418102722615004, 0.1661551594734192, 0.012642240151762962, 0.12461636960506439, 0.06140516698360443, 0.6266939043998718, 0.9935146570205688, 0.028499729931354523, 0.17739084362983704, 0.04954158514738083, 0.08203660696744919, 0.06525638699531555, 0.19683457911014557, 0.2426472306251526, 0.0492752343416214, 0.05486863851547241, 0.053803227841854095, 0.06767828017473221, 0.9305763244628906, 0.9940921068191528, 0.47854405641555786, 0.0675768256187439, 0.01401593443006277, 0.43899908661842346, 0.9759842157363892, 0.7746955156326294, 0.224728062748909, 0.07067009806632996, 0.13031825423240662, 0.06418660283088684, 0.13356000185012817, 0.0953073799610138, 0.14523029327392578, 0.18088951706886292, 0.022043883800506592, 0.0564064085483551, 0.1011425256729126, 0.9620181918144226, 0.03390372544527054, 0.928249180316925, 0.06953177601099014, 0.9825076460838318, 0.07760585844516754, 0.05453384667634964, 0.19925828278064728, 0.018877100199460983, 0.6376265287399292, 0.004194911103695631, 0.00629236688837409, 0.1507587730884552, 0.19675298035144806, 0.26114487648010254, 0.06490293145179749, 0.0741017758846283, 0.09812096506357193, 0.012265120632946491, 0.08841107785701752, 0.03219594433903694, 0.020952915772795677, 0.9962035417556763, 0.09006869792938232, 0.9076153039932251, 0.9927300810813904, 0.9875916838645935, 0.9910625219345093, 0.990225613117218, 0.891280472278595, 0.10728375613689423, 0.043885838240385056, 0.05120014399290085, 0.8996596336364746, 0.38985222578048706, 0.08291633427143097, 0.0029093450866639614, 0.09746305644512177, 0.06109624728560448, 0.12801118195056915, 0.09018969535827637, 0.05091353878378868, 0.06255091726779938, 0.03273013234138489, 0.06610270589590073, 0.11927227675914764, 0.43972671031951904, 0.06538420170545578, 0.14873109757900238, 0.01796269230544567, 0.021555230021476746, 0.05748061463236809, 0.06466569006443024, 0.9846019148826599, 0.016519740223884583, 0.2019079476594925, 0.11013160645961761, 0.6699672937393188, 0.024322209879755974, 0.9450916051864624, 0.003474601311609149, 0.024322209879755974, 0.8505304455757141, 0.10692382603883743, 0.038881391286849976, 0.12049806118011475, 0.047262489795684814, 0.20182360708713531, 0.31721222400665283, 0.054075103253126144, 0.05577825754880905, 0.0672745406627655, 0.03278569132089615, 0.09282182902097702, 0.010644705034792423, 0.970984935760498, 0.025627167895436287, 0.9892431497573853, 0.020421624183654785, 0.04413705691695213, 0.05138343945145607, 0.18708842992782593, 0.24176567792892456, 0.10869573801755905, 0.0955204963684082, 0.11067202687263489, 0.11001326143741608, 0.030961817130446434, 0.030803175643086433, 0.01760181412100792, 0.04400453716516495, 0.8888916373252869, 0.01320136059075594, 0.9939636588096619, 0.9912236332893372, 0.9990959763526917, 0.05654406547546387, 0.9400451183319092, 0.27265825867652893, 0.0039090788923203945, 0.06547707319259644, 0.0732952356338501, 0.01954539492726326, 0.10554513335227966, 0.3586580157279968, 0.02345447428524494, 0.0029318092856556177, 0.0742725059390068, 0.9918825626373291, 0.9930832386016846, 0.9938083291053772, 0.9941292405128479, 0.9872344732284546, 0.9915617108345032, 0.19975487887859344, 0.7990195155143738, 0.9793489575386047, 0.011330295354127884, 0.022660590708255768, 0.022660590708255768, 0.07931207120418549, 0.008497721515595913, 0.7308040857315063, 0.12180067598819733, 0.002832573838531971, 0.00934284646064043, 0.019404372200369835, 0.8940384984016418, 0.070430688560009, 0.005749443545937538, 0.9890683889389038, 0.0846291109919548, 0.0584796667098999, 0.4787725508213043, 0.1374034434556961, 0.0404127761721611, 0.0294775553047657, 0.0342320017516613, 0.0622832216322422, 0.0370846651494503, 0.0370846651494503, 0.005476515740156174, 0.021906062960624695, 0.1341746300458908, 0.6517053842544556, 0.1697719842195511, 0.013691289350390434, 0.9946812987327576, 0.05209195986390114, 0.029964402318000793, 0.4881892502307892, 0.07929041981697083, 0.000460990791907534, 0.02673746645450592, 0.014290714636445045, 0.23879322409629822, 0.06592168658971786, 0.005070898681879044, 0.041801583021879196, 0.8824778199195862, 0.0743139237165451, 0.9888632893562317, 0.012953841127455235, 0.8186827301979065, 0.056996900588274, 0.023316914215683937, 0.08679073303937912, 0.036432038992643356, 0.7522144317626953, 0.2014477401971817, 0.010715305805206299, 0.9897346496582031, 0.9900591373443604, 0.01565597578883171, 0.5387497544288635, 0.17774136364459991, 0.05709826201200485, 0.12893155217170715, 0.03960040584206581, 0.0018418794497847557, 0.04144228622317314, 0.9562177658081055, 0.03464557230472565, 0.9940004348754883, 0.20040783286094666, 0.7981759905815125, 0.9990657567977905, 0.02949688956141472, 0.030480118468403816, 0.9389843344688416, 0.9947848916053772, 0.9926949739456177, 0.05052619054913521, 0.05052619054913521, 0.8625542521476746, 0.03609013557434082, 0.9870107769966125, 0.024646587669849396, 0.10914917290210724, 0.08098164200782776, 0.017604704946279526, 0.746439516544342, 0.007041881792247295, 0.01408376358449459, 0.9993667602539062, 0.029904931783676147, 0.9629387855529785, 0.865506649017334, 0.10981189459562302, 0.023615460842847824, 0.0038583234418183565, 0.9491475820541382, 0.042441558092832565, 0.011400341987609863, 0.2233125865459442, 0.06974326819181442, 0.07644934952259064, 0.004023650195449591, 0.14887505769729614, 0.1978294551372528, 0.06303718686103821, 0.09522638469934464, 0.1099797710776329, 0.9821186661720276, 0.01741345226764679, 0.9934096932411194, 0.9922566413879395, 0.039439857006073, 0.9586918950080872, 0.7953653931617737, 0.0046422104351222515, 0.01005812268704176, 0.1493244469165802, 0.0007737017585895956, 0.01005812268704176, 0.029400667175650597, 0.9974008798599243, 0.9822391867637634, 0.08993218839168549, 0.8993219137191772, 0.982517421245575, 0.0062467665411531925, 0.9911536574363708, 0.9936993718147278, 0.997281014919281, 0.2905958890914917, 0.7078618407249451, 0.3073049783706665, 0.05825990438461304, 0.007682624738663435, 0.08770996332168579, 0.09987412393093109, 0.1280437409877777, 0.15557314455509186, 0.016645686700940132, 0.05313815549015999, 0.08578930795192719, 0.9962541460990906, 0.9895529747009277, 0.03024541400372982, 0.004032721742987633, 0.9295423626899719, 0.0020163608714938164, 0.006049082614481449, 0.02822905220091343, 0.143030047416687, 0.5369619131088257, 0.007990504615008831, 0.0031962019857019186, 0.13184332847595215, 0.093488909304142, 0.018378160893917084, 0.005593353416770697, 0.05753163620829582, 0.0015981009928509593, 0.03587798401713371, 0.05189494043588638, 0.5907053351402283, 0.04164408892393112, 0.0012813565554097295, 0.11147801578044891, 0.05381697416305542, 0.03203391283750534, 0.005125426221638918, 0.0756000354886055, 0.388294517993927, 0.25386178493499756, 0.09002191573381424, 0.15783841907978058, 0.027606720104813576, 0.0024005842860788107, 0.042610373347997665, 0.03660891205072403, 0.9922282099723816, 0.1063678190112114, 0.12472893297672272, 0.034822799265384674, 0.08104214817285538, 0.24059388041496277, 0.09623755514621735, 0.12282950431108475, 0.0930718407034874, 0.07344444841146469, 0.02659195475280285, 0.08148057013750076, 0.08059169352054596, 0.1822201907634735, 0.1339244395494461, 0.1167394369840622, 0.15347976982593536, 0.17629432678222656, 0.018073873594403267, 0.02844412811100483, 0.029036713764071465, 0.9882287383079529, 0.053438350558280945, 0.945015013217926, 0.1160629466176033, 0.09040692448616028, 0.04031660035252571, 0.054977186024188995, 0.04520346224308014, 0.03909488767385483, 0.3750665783882141, 0.02321258932352066, 0.053755469620227814, 0.16126640141010284, 0.057640671730041504, 0.6063355207443237, 0.031037285923957825, 0.024386439472436905, 0.19619998335838318, 0.056532200425863266, 0.011084744706749916, 0.01662711799144745, 0.007938551716506481, 0.9883496165275574, 0.9811052083969116, 0.04756637662649155, 0.2102433741092682, 0.6021903157234192, 0.0038053099997341633, 0.04756637662649155, 0.032345134764909744, 0.004756637383252382, 0.05327434092760086, 0.9910971522331238, 0.995514452457428, 0.016419608145952225, 0.5435311198234558, 0.1498815417289734, 0.06062624603509903, 0.11367420852184296, 0.05473202466964722, 0.009262342937290668, 0.05220593139529228, 0.8968327641487122, 0.10020478069782257, 0.03034295327961445, 0.9659173488616943, 0.005181933753192425, 0.9897493720054626, 0.9962561726570129, 0.9940349459648132, 0.9951643347740173, 0.9922572374343872, 0.12975022196769714, 0.027522772550582886, 0.8374786376953125, 0.10295763611793518, 0.3724643886089325, 0.030281657353043556, 0.07683970779180527, 0.06737668812274933, 0.10901396721601486, 0.06132035702466965, 0.10712136328220367, 0.04996473714709282, 0.022711243480443954, 0.05779813230037689, 0.03639141470193863, 0.002140671480447054, 0.006422014441341162, 0.8948007225990295, 0.004667358472943306, 0.03267151117324829, 0.06534302234649658, 0.8961328268051147, 0.9892205595970154, 0.031489819288253784, 0.02422293648123741, 0.03027867153286934, 0.7981457710266113, 0.027856377884745598, 0.029067525640130043, 0.05934619531035423, 0.0734139233827591, 0.09762490540742874, 0.3139616847038269, 0.13511286675930023, 0.03280196711421013, 0.06560393422842026, 0.001561998389661312, 0.26475873589515686, 0.016400983557105064, 0.9912712574005127, 0.034169621765613556, 0.09111899137496948, 0.8542405366897583, 0.017084810882806778, 0.9909042119979858, 0.08195075392723083, 0.02731691673398018, 0.8850681185722351, 0.9933369159698486, 0.9978326559066772, 0.9879665970802307, 0.008702563121914864, 0.04061196371912956, 0.20596066117286682, 0.74261873960495, 0.9881279468536377, 0.009207873605191708, 0.053712595254182816, 0.8885597586631775, 0.010742519050836563, 0.02915826439857483, 0.007673227693885565, 0.020768892019987106, 0.9553690552711487, 0.023365003988146782, 0.02318766713142395, 0.04289718344807625, 0.03246273472905159, 0.46723151206970215, 0.29448336362838745, 0.06028793379664421, 0.02782520093023777, 0.05101286992430687, 0.8876930475234985, 0.03227974846959114, 0.0792321115732193, 0.009054933674633503, 0.986987829208374, 0.019230911508202553, 0.004807727877050638, 0.9735649228096008, 0.053210411220788956, 0.9459628462791443, 0.9955835938453674, 0.9951725006103516, 0.9991540908813477, 0.9979762434959412, 0.9936963319778442, 0.007695446722209454, 0.9907887578010559, 0.9962958693504333, 0.0020005942787975073, 0.0020005942787975073, 0.7685548663139343, 0.2287604659795761, 0.20653042197227478, 0.7855666279792786, 0.006759177427738905, 0.34749361872673035, 0.034891776740550995, 0.11749272048473358, 0.017089851200580597, 0.17588303983211517, 0.010681157000362873, 0.04486085847020149, 0.18585212528705597, 0.012817388400435448, 0.05340578407049179, 0.996053159236908, 0.9903555512428284, 0.04634469747543335, 0.09325803816318512, 0.14557352662086487, 0.28887245059013367, 0.09695424139499664, 0.0958169475197792, 0.07705160975456238, 0.0958169475197792, 0.03866796940565109, 0.021892894059419632, 0.06008889153599739, 0.06687311828136444, 0.13083872199058533, 0.4409749209880829, 0.256831556558609, 0.04361290484666824, 0.0064284466207027435, 0.9899807572364807, 0.9886947870254517, 0.9950776696205139, 0.9919518828392029, 0.09934293478727341, 0.038046229630708694, 0.1631760448217392, 0.17163076996803284, 0.03381887078285217, 0.05241924896836281, 0.09257915616035461, 0.24434134364128113, 0.02536415308713913, 0.07905161380767822, 0.04936765506863594, 0.9424734115600586, 0.007479947991669178, 0.9844189286231995, 0.05895441398024559, 0.2187705934047699, 0.01633676514029503, 0.11222647875547409, 0.061795592308044434, 0.24718236923217773, 0.026280883699655533, 0.014205883257091045, 0.11293677240610123, 0.13069412112236023, 0.9943311214447021, 0.9966910481452942, 0.1197439506649971, 0.8786845207214355, 0.004850068595260382, 0.9894140362739563, 0.08816782385110855, 0.9062831997871399, 0.004100828897207975, 0.012024443596601486, 0.012024443596601486, 0.0745515525341034, 0.009619555436074734, 0.7070373296737671, 0.007214666344225407, 0.17555688321590424, 0.08572755008935928, 0.08572755008935928, 0.027654048055410385, 0.03318485617637634, 0.7660171389579773, 0.9978319406509399, 0.03353497385978699, 0.8607310652732849, 0.10060492902994156, 0.009947385638952255, 0.988106906414032, 0.9937465786933899, 0.9970183968544006, 0.38660314679145813, 0.25971803069114685, 0.01553021278232336, 0.02296488918364048, 0.0650947168469429, 0.1019376739859581, 0.014208491891622543, 0.05749483034014702, 0.06030348315834999, 0.016025857999920845, 0.07527759671211243, 0.05645819753408432, 0.135157510638237, 0.09580785036087036, 0.06843417882919312, 0.03763879835605621, 0.051325634121894836, 0.04961477965116501, 0.42771363258361816, 0.17850126326084137, 0.3224695920944214, 0.04134225472807884, 0.036964841187000275, 0.04669243097305298, 0.1381317675113678, 0.027723630890250206, 0.11770383268594742, 0.0753888189792633, 0.015077764168381691, 0.002935068216174841, 0.012718629091978073, 0.22795696556568146, 0.15262354910373688, 0.04304766654968262, 0.1330564320087433, 0.4148229658603668, 0.011740272864699364, 0.9925435185432434, 0.9940683841705322, 0.9845766425132751, 0.0067675975151360035, 0.9914530515670776, 0.9901037216186523, 0.021420219913125038, 0.8907241821289062, 0.08746589720249176, 0.013839946128427982, 0.2886617183685303, 0.6959515810012817, 0.9896976351737976, 0.015450194478034973, 0.035816360265016556, 0.02177072875201702, 0.01685475744307041, 0.013343350030481815, 0.23737117648124695, 0.013343350030481815, 0.6468012928962708, 0.3704948127269745, 0.6289325952529907, 0.9970839023590088, 0.9916179776191711, 0.06309525668621063, 0.23160114884376526, 0.09143144637346268, 0.03778158873319626, 0.05516112223267555, 0.10049902647733688, 0.04496009275317192, 0.051760777831077576, 0.1987311691045761, 0.12505705654621124, 0.5733996629714966, 0.11945825815200806, 0.09025734663009644, 0.11680363118648529, 0.0929119810461998, 0.006636569742113352, 0.9917995929718018, 0.782045841217041, 0.031643472611904144, 0.12431364506483078, 0.06102669611573219, 0.11312982439994812, 0.85518479347229, 0.028761819005012512, 0.1125701516866684, 0.05992540344595909, 0.0016801515594124794, 0.18145637214183807, 0.20833879709243774, 0.05376484990119934, 0.18929708003997803, 0.04480404034256935, 0.052084699273109436, 0.09632869064807892, 0.9851973056793213, 0.15788429975509644, 0.6178081631660461, 0.17962199449539185, 0.04461947828531265, 0.052308328449726105, 0.0018681546207517385, 0.0840669572353363, 0.32599297165870667, 0.043901633471250534, 0.4763794243335724, 0.014945236966013908, 0.021588508039712906, 0.053971268236637115, 0.11873678863048553, 0.8041719198226929, 0.08918620645999908, 0.9111455678939819, 0.9924914240837097, 0.9945734143257141, 0.9974730014801025, 0.014665473252534866, 0.12221228331327438, 0.017924467101693153, 0.027701450511813164, 0.23627707362174988, 0.016294971108436584, 0.5654354691505432, 0.09712156653404236, 0.8602195978164673, 0.0369986928999424, 0.05592300370335579, 0.0888008177280426, 0.05991750583052635, 0.4363223612308502, 0.06944285333156586, 0.10846605151891708, 0.01689980924129486, 0.006145385093986988, 0.14288020133972168, 0.015363463200628757, 0.007692718878388405, 0.5173353552818298, 0.2650141716003418, 0.13462257385253906, 0.07038837671279907, 0.005000267177820206, 0.3816435635089874, 0.487569123506546, 0.11059874296188354, 0.0077886441722512245, 0.012461830861866474, 0.9942175149917603, 0.9963088035583496, 0.05934375524520874, 0.025176139548420906, 0.23557673394680023, 0.5916392803192139, 0.05215057358145714, 0.03416761755943298, 0.18870770931243896, 0.0022071078419685364, 0.046349264681339264, 0.04303860291838646, 0.18098284304141998, 0.020967524498701096, 0.5164632201194763, 0.05881141871213913, 0.10455363243818283, 0.2860703468322754, 0.0609896183013916, 0.0762370228767395, 0.007986735552549362, 0.014521338045597076, 0.29115283489227295, 0.07986735552549362, 0.019603805616497993, 0.14538146555423737, 0.03939726948738098, 0.2041999250650406, 0.01609184220433235, 0.0016646733274683356, 0.07657497376203537, 0.0005548911285586655, 0.4916335344314575, 0.024970099329948425, 0.9953145384788513, 0.9900142550468445, 0.9978221654891968, 0.9882532358169556, 0.9908885955810547, 0.04804708808660507, 0.3049945533275604, 0.12394756078720093, 0.12046588957309723, 0.0936570018529892, 0.06649995595216751, 0.07102613151073456, 0.06336645036935806, 0.08495282381772995, 0.022979041561484337, 0.9857718348503113, 0.991929829120636, 0.9904465079307556, 0.9939417243003845, 0.07081771641969681, 0.9247960448265076, 0.05752654746174812, 0.26479777693748474, 0.13217931985855103, 0.19014500081539154, 0.040400322526693344, 0.10363561660051346, 0.04215686023235321, 0.07245710492134094, 0.07553104311227798, 0.020639296621084213, 0.08443208038806915, 0.3670520484447479, 0.031851623207330704, 0.05965859815478325, 0.05915301665663719, 0.11881161481142044, 0.05814185366034508, 0.08999347686767578, 0.10768882185220718, 0.022751159965991974, 0.02230319008231163, 0.9701887369155884, 0.9776880741119385, 0.9889037609100342, 0.2192477583885193, 0.7779079079627991, 0.09415528178215027, 0.9041321277618408, 0.06514911353588104, 0.08344942331314087, 0.1372523456811905, 0.21704170107841492, 0.03806464746594429, 0.1442064642906189, 0.09625963866710663, 0.03660062327980995, 0.1087038516998291, 0.0732012465596199, 0.04354425519704819, 0.0319778136909008, 0.24969910085201263, 0.04966766759753227, 0.20207256078720093, 0.0006803789874538779, 0.0319778136909008, 0.09865495562553406, 0.23337000608444214, 0.05851259455084801, 0.02581452950835228, 0.01173387747257948, 0.854226291179657, 0.002346775494515896, 0.08213713765144348, 0.021120978519320488, 0.9888254404067993, 0.06689516454935074, 0.09981182962656021, 0.13485215604305267, 0.13591398298740387, 0.06583333015441895, 0.006370967719703913, 0.024422042071819305, 0.060524191707372665, 0.3291666507720947, 0.07432795315980911, 0.991152822971344, 0.9976637363433838, 0.9881917238235474, 0.0415508970618248, 0.9556706547737122, 0.14121182262897491, 0.8573575615882874, 0.9959633350372314, 0.37817975878715515, 0.09959379583597183, 0.006086287554353476, 0.07109890133142471, 0.04454055801033974, 0.15022063255310059, 0.05947962775826454, 0.11646940559148788, 0.014662419445812702, 0.05975627526640892, 0.9972384572029114, 0.18402886390686035, 0.0029210930224508047, 0.09347497671842575, 0.049658581614494324, 0.02044765092432499, 0.07886950671672821, 0.5696130990982056, 0.9939109086990356, 0.2841370403766632, 0.05682740733027458, 0.07019855827093124, 0.4679903984069824, 0.09694086760282516, 0.00501418299973011, 0.01838533766567707, 0.9947983026504517, 0.10640466958284378, 0.03546822443604469, 0.03819654881954193, 0.6002314686775208, 0.22099430859088898, 0.9949023723602295, 0.979340136051178, 0.009374642744660378, 0.007030981592833996, 0.20858579874038696, 0.35779884457588196, 0.003124880837276578, 0.019530504941940308, 0.37889179587364197, 0.015624403953552246, 0.9001388549804688, 0.09725118428468704, 0.9928044080734253, 0.9915215373039246, 0.09694231301546097, 0.31304287910461426, 0.07068710029125214, 0.2393263280391693, 0.27870914340019226, 0.9975820779800415, 0.9928552508354187, 0.15090322494506836, 0.8492005467414856, 0.34192684292793274, 0.25229331851005554, 0.001819969853386283, 0.04618173465132713, 0.09463842958211899, 0.06574641168117523, 0.05596407130360603, 0.04049433022737503, 0.06074149161577225, 0.04026683419942856, 0.00978680606931448, 0.09786806255578995, 0.029360417276620865, 0.8220916986465454, 0.03914722427725792, 0.9928327798843384, 0.014372894540429115, 0.12560659646987915, 0.2262168675661087, 0.05811648815870285, 0.07061465829610825, 0.017497437074780464, 0.07561392337083817, 0.01562271174043417, 0.3499487340450287, 0.047493044286966324, 0.11003716289997101, 0.2054027020931244, 0.07580337673425674, 0.03178851306438446, 0.5746384859085083, 0.3218027353286743, 0.6757857799530029, 0.04022909700870514, 0.044463738799095154, 0.029642490670084953, 0.09104479849338531, 0.5356821417808533, 0.15879906713962555, 0.09951408207416534, 0.21030759811401367, 0.7733358144760132, 0.001655965344980359, 0.013247722759842873, 0.9961628913879395, 0.9994528889656067, 0.9940481781959534, 0.9878154397010803, 0.3193429112434387, 0.6789767742156982, 0.17293505370616913, 0.014762748964130878, 0.8098422288894653, 0.07927528023719788, 0.004718767013400793, 0.9126095175743103, 0.0018875066889449954, 0.9899497628211975, 0.009148583747446537, 0.04269339144229889, 0.21549998223781586, 0.07522169500589371, 0.43404948711395264, 0.14231130480766296, 0.05489150434732437, 0.027445752173662186, 0.12140603363513947, 0.029261967167258263, 0.4999438226222992, 0.12700939178466797, 0.03673310950398445, 0.023658612743020058, 0.0678628608584404, 0.04171387106180191, 0.006225950550287962, 0.04544943943619728, 0.9914941787719727, 0.9966549277305603, 0.9308264255523682, 0.06878028064966202, 0.9908043742179871, 0.03596719354391098, 0.9531306028366089, 0.9876322150230408, 0.990831196308136, 0.11258002370595932, 0.885111927986145, 0.9979943037033081, 0.9953410029411316, 0.014253759756684303, 0.9835094213485718, 0.9921932816505432, 0.9887199401855469, 0.02808680571615696, 0.9549513459205627, 0.009362268261611462, 0.012287507764995098, 0.03891044110059738, 0.043006278574466705, 0.13311466574668884, 0.06553337723016739, 0.08806046843528748, 0.5345065593719482, 0.08191671967506409, 0.9892351627349854, 0.0012264200486242771, 0.5175492763519287, 0.32316169142723083, 0.042311493307352066, 0.05212285369634628, 0.005518890451639891, 0.03556618466973305, 0.0042924704030156136, 0.017783092334866524, 0.05752358213067055, 0.8576242923736572, 0.08367066830396652, 0.9361351728439331, 0.06112222746014595, 0.9920821785926819, 0.113490991294384, 0.09021078795194626, 0.6205629110336304, 0.04365038126707077, 0.0065475571900606155, 0.01455012708902359, 0.038557834923267365, 0.06547556817531586, 0.007275063544511795, 0.0005374156753532588, 0.21496626734733582, 0.028483029454946518, 0.7529193162918091, 0.0032244939357042313, 0.05143122002482414, 0.9429057240486145, 0.9488199353218079, 0.04447593539953232, 0.00494177034124732, 0.5825725793838501, 0.09321161359548569, 0.2896218001842499, 0.015535268932580948, 0.018864255398511887, 0.9941855072975159, 0.07540678977966309, 0.09515619277954102, 0.007181599270552397, 0.025135597214102745, 0.5152797698974609, 0.15799517929553986, 0.014363198541104794, 0.021544797345995903, 0.07361139357089996, 0.014363198541104794, 0.9840489625930786, 0.044449977576732635, 0.9260411858558655, 0.02963331714272499, 0.9803271293640137, 0.036795347929000854, 0.08714687824249268, 0.21302570402622223, 0.023239167407155037, 0.07552729547023773, 0.5054518580436707, 0.013556180521845818, 0.04454173520207405, 0.0161642637103796, 0.010776176117360592, 0.9644677639007568, 0.25456756353378296, 0.05604676902294159, 0.09533188492059708, 0.08485585451126099, 0.07542742788791656, 0.0790940374135971, 0.19380658864974976, 0.029856689274311066, 0.056570570915937424, 0.07490362226963043, 0.9937314391136169, 0.2710559070110321, 0.05701915919780731, 0.04785025119781494, 0.04240620881319046, 0.06332278251647949, 0.31919267773628235, 0.004011398181319237, 0.12406681478023529, 0.014326422475278378, 0.05673263221979141, 0.08566314727067947, 0.059305258095264435, 0.024161402136087418, 0.7292349934577942, 0.026357892900705338, 0.013178946450352669, 0.008785963989794254, 0.050519295036792755, 0.9911162257194519, 0.006925193127244711, 0.14658324420452118, 0.027700772508978844, 0.14196646213531494, 0.19736799597740173, 0.08194811642169952, 0.29085808992385864, 0.10618629306554794, 0.9819319248199463, 0.9772378206253052, 0.9975225329399109, 0.9917201995849609, 0.1665320247411728, 0.1619061380624771, 0.025442393496632576, 0.11217781901359558, 0.01619061268866062, 0.011564724147319794, 0.49959608912467957, 0.005782362073659897, 0.9957937598228455, 0.9916776418685913, 0.9888594746589661, 0.9933105707168579, 0.9947336316108704, 0.9945342540740967, 0.2329992949962616, 0.1141112744808197, 0.013268752954900265, 0.05891326069831848, 0.11835727095603943, 0.13640277087688446, 0.05891326069831848, 0.05148275941610336, 0.1480792760848999, 0.067936010658741, 0.9844375848770142, 0.05380403250455856, 0.8496553301811218, 0.017934676259756088, 0.05604586750268936, 0.022418346256017685, 0.0005918670794926584, 0.02959335222840309, 0.1485586315393448, 0.0017756011802703142, 0.8191440105438232, 0.0007285924511961639, 0.08888828009366989, 0.1347896009683609, 0.17486219108104706, 0.1617475301027298, 0.0029143698047846556, 0.11657479405403137, 0.31329476833343506, 0.00655733235180378, 0.2761455476284027, 0.19480666518211365, 0.008133890107274055, 0.15861085057258606, 0.0662912055850029, 0.11224768310785294, 0.06303764879703522, 0.04026275500655174, 0.055717144161462784, 0.025215057656168938, 0.9921115636825562, 0.016401542350649834, 0.21937061846256256, 0.2183455228805542, 0.11891117691993713, 0.06970655173063278, 0.006150578148663044, 0.09225866943597794, 0.2583242654800415, 0.9893926978111267, 0.010924343019723892, 0.02490750327706337, 0.2569405734539032, 0.4173099100589752, 0.03189908340573311, 0.09263843297958374, 0.11973080784082413, 0.027529345825314522, 0.01791592314839363, 0.9878115057945251, 0.9829196333885193, 0.9951297044754028, 0.011210200376808643, 0.25335052609443665, 0.1322803646326065, 0.01793632097542286, 0.051566921174526215, 0.5313634872436523, 0.9887993931770325, 0.11263924837112427, 0.2589200735092163, 0.019223764538764954, 0.10693219304084778, 0.12255150079727173, 0.14748232066631317, 0.10512996464967728, 0.042352356016635895, 0.07779616862535477, 0.0069085401482880116, 0.9897999167442322, 0.9859444499015808, 0.9879947304725647, 0.13968348503112793, 0.12965098023414612, 0.05633643642067909, 0.1337025761604309, 0.14469975233078003, 0.09781703352928162, 0.11267287284135818, 0.0472685843706131, 0.06926294416189194, 0.0690700113773346, 0.010668139904737473, 0.06756488978862762, 0.849895179271698, 0.021336279809474945, 0.04978465288877487, 0.9944585561752319, 0.018542524427175522, 0.002852695994079113, 0.46071040630340576, 0.041364092379808426, 0.4749738872051239, 0.16669614613056183, 0.8296921849250793, 0.9947420358657837, 0.06429172307252884, 0.47368955612182617, 0.013301734812557697, 0.1337563395500183, 0.05172897130250931, 0.08128838241100311, 0.008128838613629341, 0.04951201379299164, 0.06133577972650528, 0.06355273723602295, 0.9842392802238464, 0.10246173292398453, 0.8283525705337524, 0.04906618222594261, 0.002886245958507061, 0.015874352306127548, 0.9982162714004517, 0.9969639778137207, 0.9986324310302734, 0.9921741485595703, 0.03859842196106911, 0.9544336795806885, 0.0035089473240077496, 0.9931648969650269, 0.99313884973526, 0.03596452251076698, 0.014652212150394917, 0.042624618858098984, 0.06393692642450333, 0.033300481736660004, 0.6793298721313477, 0.08391721546649933, 0.045288655906915665, 0.014020097441971302, 0.9720600843429565, 0.009346731007099152, 0.9924536347389221, 0.005523736588656902, 0.9942725300788879, 0.9951942563056946, 0.04679335653781891, 0.8838745355606079, 0.06759040802717209, 0.7121989727020264, 0.1270459145307541, 0.052858516573905945, 0.10664437711238861, 0.9878156185150146, 0.9903208017349243, 0.9929757714271545, 0.9881840348243713, 0.020772220566868782, 0.6825157999992371, 0.29377853870391846, 0.0029674600809812546, 0.9971234798431396, 0.003084203926846385, 0.05119778588414192, 0.5261651873588562, 0.3065698742866516, 0.0018505224725231528, 0.03639360889792442, 0.028374677523970604, 0.04317885637283325, 0.003084203926846385, 0.9957553148269653, 0.9854987263679504, 0.02171097695827484, 0.00542774423956871, 0.9457844495773315, 0.0257817842066288, 0.9875307083129883, 0.00667250482365489, 0.007349025458097458, 0.07349025458097458, 0.012860794551670551, 0.22230802476406097, 0.09553732722997665, 0.014698050916194916, 0.5750612616539001, 0.9939971566200256, 0.003269727574661374, 0.9878903031349182, 0.9933966398239136, 0.9575048089027405, 0.03928224742412567, 0.9776325821876526, 0.01339222677052021, 0.17330770194530487, 0.11415642499923706, 0.09121457487344742, 0.18436400592327118, 0.1000596284866333, 0.14179719984531403, 0.06937836110591888, 0.0420139878988266, 0.05279389023780823, 0.03040485829114914, 0.08410754054784775, 0.021627653390169144, 0.07689832150936127, 0.06728602945804596, 0.747355580329895, 0.3352258801460266, 0.6621745228767395, 0.002759060589596629, 0.040964558720588684, 0.9597410559654236, 0.9989423751831055, 0.013820650056004524, 0.315178245306015, 0.6708071231842041, 0.05501579865813255, 0.14754237234592438, 0.01000287290662527, 0.005001436453312635, 0.7827247977256775, 0.04238295927643776, 0.9505892395973206, 0.012514205649495125, 0.00782137829810381, 0.9776723384857178, 0.9941579699516296, 0.1177714541554451, 0.5513504147529602, 0.10501912981271744, 0.062261343002319336, 0.027004919946193695, 0.04050737991929054, 0.015752868726849556, 0.028505193069577217, 0.015752868726849556, 0.03600655868649483, 0.10179346799850464, 0.06227659061551094, 0.09353993833065033, 0.3176356256008148, 0.2118404507637024, 0.047520291060209274, 0.05627403035759926, 0.05527360364794731, 0.05027146637439728, 0.004001708701252937, 0.22780875861644745, 0.16640575230121613, 0.09737280011177063, 0.15005584061145782, 0.10609275102615356, 0.05122971907258034, 0.08029622584581375, 0.011989934369921684, 0.05340970680117607, 0.054863035678863525, 0.009546658024191856, 0.9880791306495667, 0.9947073459625244, 0.9951348900794983, 0.9956521391868591, 0.9887626767158508, 0.9815458059310913, 0.9880534410476685, 0.13009525835514069, 0.03196198120713234, 0.015481585636734962, 0.038953665643930435, 0.21624279022216797, 0.06367426365613937, 0.24495863914489746, 0.04095128923654556, 0.06791920959949493, 0.14982178807258606, 0.9868786931037903, 0.9906402826309204, 0.9910144209861755], \"Term\": [\"accept\", \"accept\", \"accept\", \"accept\", \"accept\", \"accept\", \"accept\", \"accept\", \"accept\", \"access\", \"access\", \"access\", \"access\", \"access\", \"access\", \"adaptec\", \"address\", \"address\", \"address\", \"address\", \"address\", \"address\", \"address\", \"address\", \"address\", \"address\", \"administr\", \"administr\", \"administr\", \"administr\", \"agenc\", \"agenc\", \"agenc\", \"agenc\", \"agenc\", \"aid\", \"aid\", \"aid\", \"aid\", \"alaska\", \"algorithm\", \"algorithm\", \"alomar\", \"amanda\", \"american\", \"american\", \"american\", \"american\", \"american\", \"american\", \"american\", \"american\", \"andrew\", \"andrew\", \"andrew\", \"andrew\", \"andrew\", \"andrew\", \"andrew\", \"andrew\", \"anonym\", \"anonym\", \"anti\", \"anti\", \"anti\", \"appl\", \"appl\", \"appl\", \"applic\", \"applic\", \"applic\", \"applic\", \"applic\", \"arab\", \"arab\", \"archiv\", \"archiv\", \"archiv\", \"archiv\", \"argic\", \"argument\", \"argument\", \"argument\", \"argument\", \"argument\", \"argument\", \"argument\", \"argument\", \"arm\", \"arm\", \"arm\", \"arm\", \"arm\", \"armenia\", \"armenian\", \"armi\", \"armi\", \"armi\", \"armi\", \"armori\", \"atheism\", \"atheist\", \"atho\", \"attack\", \"attack\", \"attack\", \"attack\", \"attack\", \"attack\", \"aurora\", \"author\", \"author\", \"author\", \"author\", \"author\", \"auto\", \"auto\", \"auto\", \"auto\", \"auto\", \"auto\", \"autom\", \"automot\", \"avail\", \"avail\", \"avail\", \"avail\", \"avail\", \"avail\", \"avail\", \"avail\", \"avail\", \"avail\", \"azerbaijan\", \"azerbaijani\", \"azeri\", \"baalk\", \"baerga\", \"ball\", \"ball\", \"ball\", \"bank\", \"bank\", \"bank\", \"bank\", \"bank\", \"bank\", \"bank\", \"bank\", \"bank\", \"basebal\", \"basebal\", \"bat\", \"batf\", \"batf\", \"batteri\", \"batteri\", \"belief\", \"belief\", \"believ\", \"believ\", \"believ\", \"believ\", \"believ\", \"believ\", \"believ\", \"believ\", \"believ\", \"believ\", \"berkeley\", \"berkeley\", \"berkeley\", \"berkeley\", \"best\", \"best\", \"best\", \"best\", \"best\", \"best\", \"best\", \"best\", \"best\", \"best\", \"better\", \"better\", \"better\", \"better\", \"better\", \"better\", \"better\", \"better\", \"better\", \"better\", \"bibl\", \"biblic\", \"bike\", \"bike\", \"billion\", \"billion\", \"binari\", \"binari\", \"bio\", \"blah\", \"blast\", \"board\", \"board\", \"board\", \"board\", \"board\", \"board\", \"board\", \"board\", \"boni\", \"bontchev\", \"book\", \"book\", \"book\", \"book\", \"book\", \"book\", \"book\", \"book\", \"boyl\", \"brake\", \"brake\", \"brave\", \"brave\", \"bruin\", \"build\", \"build\", \"build\", \"build\", \"build\", \"build\", \"build\", \"build\", \"build\", \"build\", \"buy\", \"buy\", \"buy\", \"buy\", \"buy\", \"byte\", \"byte\", \"byte\", \"cach\", \"cactus\", \"cadr\", \"callison\", \"canada\", \"canada\", \"canada\", \"canada\", \"canada\", \"canada\", \"canada\", \"canada\", \"canada\", \"cancer\", \"cancer\", \"candida\", \"canuck\", \"car\", \"car\", \"card\", \"card\", \"card\", \"card\", \"card\", \"carlo\", \"case\", \"case\", \"case\", \"case\", \"case\", \"case\", \"case\", \"case\", \"case\", \"case\", \"catbyt\", \"catcher\", \"cathol\", \"caus\", \"caus\", \"caus\", \"caus\", \"caus\", \"caus\", \"caus\", \"caus\", \"caus\", \"centerlin\", \"centri\", \"char\", \"chastiti\", \"children\", \"children\", \"children\", \"children\", \"children\", \"children\", \"chip\", \"chip\", \"chip\", \"chopin\", \"christ\", \"christ\", \"christian\", \"christian\", \"church\", \"church\", \"church\", \"cica\", \"cipher\", \"ciphertext\", \"circuit\", \"circuit\", \"circuit\", \"claim\", \"claim\", \"claim\", \"claim\", \"claim\", \"claim\", \"claim\", \"claim\", \"claim\", \"claim\", \"clarkson\", \"classifi\", \"classifi\", \"classifi\", \"classifi\", \"clayton\", \"cleveland\", \"cleveland\", \"cleveland\", \"client\", \"client\", \"clinic\", \"clinic\", \"clinton\", \"clinton\", \"clinton\", \"clinton\", \"clipper\", \"clipper\", \"coach\", \"coach\", \"code\", \"code\", \"code\", \"code\", \"code\", \"code\", \"color\", \"color\", \"color\", \"color\", \"color\", \"color\", \"colorado\", \"colorado\", \"colorado\", \"colorado\", \"colorado\", \"colorado\", \"colorado\", \"colorado\", \"columbia\", \"columbia\", \"columbia\", \"columbia\", \"columbia\", \"come\", \"come\", \"come\", \"come\", \"come\", \"come\", \"come\", \"come\", \"come\", \"come\", \"communic\", \"communic\", \"communic\", \"communic\", \"communic\", \"communic\", \"communic\", \"communic\", \"compil\", \"compil\", \"compil\", \"compil\", \"concordia\", \"config\", \"contradict\", \"contradict\", \"contradict\", \"contrib\", \"control\", \"control\", \"control\", \"control\", \"control\", \"control\", \"control\", \"control\", \"control\", \"copi\", \"copi\", \"copi\", \"copi\", \"copi\", \"copi\", \"copi\", \"copper\", \"cost\", \"cost\", \"cost\", \"cost\", \"cost\", \"cost\", \"cost\", \"cost\", \"counterst\", \"countri\", \"countri\", \"countri\", \"countri\", \"countri\", \"countri\", \"countri\", \"court\", \"court\", \"court\", \"court\", \"cramer\", \"crime\", \"crime\", \"crime\", \"crypt\", \"crypto\", \"cryptograph\", \"cryptographi\", \"ctrl\", \"cub\", \"cunixb\", \"cure\", \"cwru\", \"cwru\", \"data\", \"data\", \"data\", \"data\", \"data\", \"data\", \"data\", \"david\", \"david\", \"david\", \"david\", \"david\", \"david\", \"david\", \"david\", \"david\", \"david\", \"davidian\", \"dealer\", \"dealer\", \"dealer\", \"death\", \"death\", \"death\", \"death\", \"death\", \"death\", \"decrypt\", \"den\", \"desi\", \"design\", \"design\", \"design\", \"design\", \"design\", \"design\", \"design\", \"design\", \"design\", \"deskjet\", \"detroit\", \"devic\", \"devic\", \"devic\", \"devic\", \"diamond\", \"diet\", \"differ\", \"differ\", \"differ\", \"differ\", \"differ\", \"differ\", \"differ\", \"differ\", \"differ\", \"differ\", \"dillon\", \"directori\", \"directori\", \"directori\", \"diseas\", \"disk\", \"disk\", \"disk\", \"display\", \"display\", \"display\", \"display\", \"display\", \"display\", \"display\", \"distribut\", \"distribut\", \"distribut\", \"distribut\", \"distribut\", \"distribut\", \"distribut\", \"distribut\", \"distribut\", \"distribut\", \"divin\", \"divis\", \"divis\", \"divis\", \"divis\", \"divis\", \"divis\", \"divis\", \"divis\", \"divis\", \"dock\", \"doctor\", \"doctor\", \"doctor\", \"doctrin\", \"dodger\", \"drive\", \"drive\", \"drive\", \"drive\", \"drive\", \"drive\", \"drive\", \"drive\", \"driver\", \"driver\", \"driver\", \"driver\", \"driver\", \"dseg\", \"dseg\", \"dtmedin\", \"duke\", \"duke\", \"dyer\", \"earth\", \"earth\", \"earth\", \"earth\", \"earth\", \"earth\", \"edmonton\", \"effect\", \"effect\", \"effect\", \"effect\", \"effect\", \"effect\", \"effect\", \"effect\", \"effect\", \"effect\", \"einstein\", \"eisa\", \"email\", \"email\", \"email\", \"email\", \"email\", \"email\", \"email\", \"email\", \"encrypt\", \"enforc\", \"enforc\", \"enforc\", \"enforc\", \"enforc\", \"engin\", \"engin\", \"engin\", \"engin\", \"engin\", \"engin\", \"engin\", \"engin\", \"engin\", \"engin\", \"engr\", \"entri\", \"entri\", \"entri\", \"ericsson\", \"escrow\", \"esdi\", \"espn\", \"etern\", \"etern\", \"etern\", \"ether\", \"ethernet\", \"ethnic\", \"evid\", \"evid\", \"evid\", \"evid\", \"evid\", \"evid\", \"exist\", \"exist\", \"exist\", \"exist\", \"exist\", \"exist\", \"exist\", \"exist\", \"exist\", \"extermin\", \"faith\", \"faith\", \"fbihh\", \"feder\", \"feder\", \"feder\", \"feder\", \"file\", \"file\", \"file\", \"file\", \"final\", \"final\", \"final\", \"final\", \"final\", \"final\", \"final\", \"final\", \"final\", \"final\", \"firearm\", \"fischer\", \"flight\", \"flight\", \"flight\", \"flight\", \"floppi\", \"floppi\", \"flyer\", \"flyer\", \"fnal\", \"follow\", \"follow\", \"follow\", \"follow\", \"follow\", \"follow\", \"follow\", \"follow\", \"follow\", \"follow\", \"font\", \"font\", \"food\", \"food\", \"food\", \"food\", \"forc\", \"forc\", \"forc\", \"forc\", \"forc\", \"forc\", \"forc\", \"forc\", \"forc\", \"forc\", \"format\", \"format\", \"format\", \"format\", \"format\", \"freenet\", \"freenet\", \"freenet\", \"frost\", \"frost\", \"function\", \"function\", \"function\", \"function\", \"function\", \"function\", \"fund\", \"fund\", \"fund\", \"fund\", \"fund\", \"game\", \"game\", \"game\", \"game\", \"gatech\", \"gaza\", \"genet\", \"genet\", \"genocid\", \"go\", \"go\", \"go\", \"go\", \"go\", \"go\", \"go\", \"go\", \"go\", \"go\", \"goal\", \"goal\", \"goal\", \"goal\", \"goal\", \"goal\", \"god\", \"good\", \"good\", \"good\", \"good\", \"good\", \"good\", \"good\", \"good\", \"good\", \"good\", \"gordon\", \"gordon\", \"gospel\", \"govern\", \"govern\", \"govern\", \"govern\", \"gradi\", \"graphic\", \"graphic\", \"great\", \"great\", \"great\", \"great\", \"great\", \"great\", \"great\", \"great\", \"great\", \"great\", \"greec\", \"greec\", \"greek\", \"greek\", \"greenbelt\", \"grind\", \"grind\", \"grind\", \"grind\", \"grind\", \"grind\", \"grind\", \"group\", \"group\", \"group\", \"group\", \"group\", \"group\", \"group\", \"group\", \"group\", \"group\", \"gtoal\", \"gun\", \"gun\", \"halat\", \"hallam\", \"hamburg\", \"handbook\", \"handgun\", \"handgun\", \"handheld\", \"handheld\", \"handheld\", \"happen\", \"happen\", \"happen\", \"happen\", \"happen\", \"happen\", \"happen\", \"happen\", \"happen\", \"happen\", \"hard\", \"hard\", \"hard\", \"hard\", \"hard\", \"hard\", \"hard\", \"hard\", \"hard\", \"harley\", \"health\", \"health\", \"health\", \"health\", \"heaven\", \"heaven\", \"heaven\", \"heaven\", \"helmet\", \"helmet\", \"helmet\", \"help\", \"help\", \"help\", \"help\", \"help\", \"help\", \"help\", \"help\", \"help\", \"help\", \"henri\", \"henri\", \"higgin\", \"high\", \"high\", \"high\", \"high\", \"high\", \"high\", \"high\", \"high\", \"high\", \"high\", \"hit\", \"hit\", \"hit\", \"hit\", \"hit\", \"hitler\", \"hitter\", \"hockey\", \"holi\", \"holi\", \"home\", \"home\", \"home\", \"home\", \"home\", \"home\", \"home\", \"home\", \"home\", \"home\", \"homeopathi\", \"homicid\", \"honda\", \"hulman\", \"husc\", \"hydro\", \"iastat\", \"iastat\", \"ifa\", \"illinoi\", \"illinoi\", \"illinoi\", \"illinoi\", \"illinoi\", \"illinoi\", \"illinoi\", \"illinoi\", \"imag\", \"imag\", \"imag\", \"imag\", \"imag\", \"imak\", \"includ\", \"includ\", \"includ\", \"includ\", \"includ\", \"includ\", \"includ\", \"includ\", \"includ\", \"includ\", \"indiana\", \"indiana\", \"indiana\", \"indiana\", \"indiana\", \"indiana\", \"infect\", \"inform\", \"inform\", \"inform\", \"inform\", \"inform\", \"inform\", \"inform\", \"inform\", \"inform\", \"inform\", \"ingr\", \"ingr\", \"ingr\", \"inning\", \"instal\", \"instal\", \"instal\", \"instal\", \"instal\", \"insur\", \"insur\", \"insur\", \"insur\", \"intellect\", \"intercon\", \"internet\", \"internet\", \"internet\", \"internet\", \"internet\", \"internet\", \"internet\", \"internet\", \"invest\", \"invest\", \"iran\", \"islam\", \"islam\", \"isra\", \"israel\", \"israel\", \"israel\", \"jaeger\", \"jake\", \"jason\", \"jason\", \"jason\", \"jason\", \"jay\", \"jeff\", \"jeff\", \"jeff\", \"jeff\", \"jeff\", \"jeff\", \"jeff\", \"jesus\", \"jet\", \"jet\", \"jew\", \"jew\", \"jew\", \"job\", \"job\", \"job\", \"john\", \"john\", \"john\", \"john\", \"john\", \"john\", \"john\", \"john\", \"john\", \"john\", \"jumper\", \"jumper\", \"kaldi\", \"kelvin\", \"key\", \"key\", \"kill\", \"kill\", \"kill\", \"kill\", \"kill\", \"kill\", \"kill\", \"koresh\", \"lamp\", \"larc\", \"larc\", \"laughter\", \"launch\", \"launch\", \"laurentian\", \"leaf\", \"leagu\", \"leagu\", \"leav\", \"leav\", \"leav\", \"leav\", \"leav\", \"leav\", \"leav\", \"leav\", \"leav\", \"leav\", \"lebanes\", \"lemieux\", \"librari\", \"librari\", \"librari\", \"librari\", \"librari\", \"librari\", \"life\", \"life\", \"life\", \"life\", \"life\", \"life\", \"life\", \"life\", \"life\", \"life\", \"list\", \"list\", \"list\", \"list\", \"list\", \"list\", \"list\", \"list\", \"list\", \"list\", \"live\", \"live\", \"live\", \"live\", \"live\", \"live\", \"live\", \"live\", \"livesey\", \"long\", \"long\", \"long\", \"long\", \"long\", \"long\", \"long\", \"long\", \"long\", \"long\", \"look\", \"look\", \"look\", \"look\", \"look\", \"look\", \"look\", \"look\", \"look\", \"look\", \"lopez\", \"lord\", \"lord\", \"lose\", \"lose\", \"lose\", \"lose\", \"lose\", \"lose\", \"lose\", \"lose\", \"lose\", \"lose\", \"love\", \"love\", \"love\", \"love\", \"love\", \"love\", \"love\", \"love\", \"lunar\", \"lunar\", \"lyme\", \"machin\", \"machin\", \"machin\", \"machin\", \"machin\", \"machin\", \"machin\", \"machin\", \"magellan\", \"magnus\", \"mail\", \"mail\", \"mail\", \"mail\", \"mail\", \"mail\", \"mail\", \"mail\", \"map\", \"map\", \"mar\", \"mar\", \"marriag\", \"marriag\", \"massacr\", \"maxtor\", \"maynard\", \"mccall\", \"mcgill\", \"mcgill\", \"mcgill\", \"mean\", \"mean\", \"mean\", \"mean\", \"mean\", \"mean\", \"mean\", \"mean\", \"mean\", \"mean\", \"medic\", \"medic\", \"medic\", \"medic\", \"medic\", \"medicin\", \"medicin\", \"medicin\", \"medicin\", \"meg\", \"memori\", \"memori\", \"memori\", \"memori\", \"memori\", \"memori\", \"memori\", \"messag\", \"messag\", \"messag\", \"messag\", \"messag\", \"messag\", \"messag\", \"messag\", \"messag\", \"met\", \"metal\", \"metal\", \"metal\", \"metal\", \"methodolog\", \"midway\", \"midway\", \"midway\", \"migrain\", \"militia\", \"mime\", \"mission\", \"mission\", \"mission\", \"mission\", \"mksol\", \"mode\", \"mode\", \"mode\", \"mode\", \"mode\", \"mode\", \"modem\", \"modem\", \"modem\", \"money\", \"money\", \"money\", \"money\", \"money\", \"money\", \"money\", \"money\", \"monitor\", \"monitor\", \"monitor\", \"montreal\", \"montreal\", \"moon\", \"moon\", \"moon\", \"moral\", \"moral\", \"mormon\", \"motherboard\", \"motif\", \"motorcycl\", \"motto\", \"mous\", \"mous\", \"murder\", \"murder\", \"murder\", \"muslim\", \"muslim\", \"nasa\", \"nasa\", \"nasa\", \"nation\", \"nation\", \"nation\", \"nation\", \"nation\", \"nation\", \"nation\", \"nation\", \"nation\", \"nation\", \"nazi\", \"ncsl\", \"need\", \"need\", \"need\", \"need\", \"need\", \"need\", \"need\", \"need\", \"need\", \"need\", \"netcom\", \"netcom\", \"netcom\", \"netcom\", \"netcom\", \"netcom\", \"nist\", \"nist\", \"nore\", \"nsmca\", \"nubus\", \"number\", \"number\", \"number\", \"number\", \"number\", \"number\", \"number\", \"number\", \"number\", \"number\", \"ohio\", \"ohio\", \"ohio\", \"openwindow\", \"opinion\", \"opinion\", \"opinion\", \"opinion\", \"opinion\", \"opinion\", \"opinion\", \"opinion\", \"opinion\", \"opinion\", \"optilink\", \"oracl\", \"orbit\", \"orbit\", \"outlet\", \"outlet\", \"output\", \"output\", \"output\", \"owner\", \"owner\", \"owner\", \"owner\", \"owner\", \"owner\", \"owner\", \"pain\", \"pain\", \"pain\", \"pain\", \"pain\", \"palestinian\", \"patent\", \"patent\", \"patent\", \"patient\", \"patient\", \"pen\", \"penguin\", \"peopl\", \"peopl\", \"peopl\", \"peopl\", \"peopl\", \"peopl\", \"peopl\", \"peopl\", \"peopl\", \"peopl\", \"period\", \"period\", \"period\", \"period\", \"period\", \"period\", \"period\", \"period\", \"period\", \"person\", \"person\", \"person\", \"person\", \"person\", \"person\", \"person\", \"person\", \"person\", \"person\", \"phone\", \"phone\", \"phone\", \"phone\", \"phone\", \"phone\", \"phone\", \"phone\", \"photographi\", \"physician\", \"pistol\", \"pitch\", \"pitch\", \"pitcher\", \"pitt\", \"pitt\", \"pitt\", \"pittsburgh\", \"pittsburgh\", \"pittsburgh\", \"plaintext\", \"play\", \"play\", \"play\", \"play\", \"play\", \"play\", \"play\", \"play\", \"player\", \"player\", \"playoff\", \"plymouth\", \"point\", \"point\", \"point\", \"point\", \"point\", \"point\", \"point\", \"point\", \"point\", \"point\", \"polit\", \"polit\", \"polit\", \"polit\", \"polit\", \"polit\", \"polygon\", \"popul\", \"popul\", \"popul\", \"popul\", \"port\", \"port\", \"port\", \"power\", \"power\", \"power\", \"power\", \"power\", \"power\", \"power\", \"power\", \"power\", \"power\", \"powerbook\", \"presid\", \"presid\", \"presid\", \"presid\", \"price\", \"price\", \"price\", \"price\", \"price\", \"price\", \"price\", \"princeton\", \"princeton\", \"princeton\", \"princeton\", \"printer\", \"printer\", \"prism\", \"prison\", \"privaci\", \"privat\", \"privat\", \"privat\", \"privat\", \"privat\", \"privat\", \"privat\", \"probe\", \"probe\", \"probe\", \"problem\", \"problem\", \"problem\", \"problem\", \"problem\", \"problem\", \"problem\", \"problem\", \"problem\", \"problem\", \"program\", \"program\", \"program\", \"program\", \"program\", \"program\", \"project\", \"project\", \"project\", \"project\", \"project\", \"propheci\", \"prophet\", \"propos\", \"propos\", \"propos\", \"propos\", \"propos\", \"propos\", \"protect\", \"protect\", \"protect\", \"protect\", \"protect\", \"protect\", \"protect\", \"provid\", \"provid\", \"provid\", \"provid\", \"provid\", \"provid\", \"provid\", \"provid\", \"provid\", \"provid\", \"public\", \"public\", \"public\", \"public\", \"public\", \"public\", \"public\", \"public\", \"public\", \"puck\", \"pyron\", \"quadra\", \"qualcomm\", \"quebec\", \"question\", \"question\", \"question\", \"question\", \"question\", \"question\", \"question\", \"question\", \"question\", \"question\", \"quicktim\", \"raider\", \"ramsey\", \"ranck\", \"ranger\", \"ranger\", \"read\", \"read\", \"read\", \"read\", \"read\", \"read\", \"read\", \"read\", \"read\", \"read\", \"reason\", \"reason\", \"reason\", \"reason\", \"reason\", \"reason\", \"reason\", \"reason\", \"reason\", \"reason\", \"recipi\", \"recipi\", \"redesign\", \"reilli\", \"religi\", \"religi\", \"religion\", \"religion\", \"repli\", \"repli\", \"repli\", \"repli\", \"repli\", \"repli\", \"repli\", \"repli\", \"repli\", \"repli\", \"research\", \"research\", \"research\", \"research\", \"research\", \"research\", \"research\", \"research\", \"research\", \"research\", \"resourc\", \"resourc\", \"resourc\", \"resourc\", \"resourc\", \"resourc\", \"restaur\", \"result\", \"result\", \"result\", \"result\", \"result\", \"result\", \"result\", \"result\", \"result\", \"result\", \"resurrect\", \"revel\", \"revolv\", \"rid\", \"rid\", \"ride\", \"ride\", \"rider\", \"right\", \"right\", \"right\", \"right\", \"right\", \"right\", \"right\", \"right\", \"right\", \"right\", \"ripem\", \"risk\", \"risk\", \"risk\", \"risk\", \"risk\", \"risk\", \"risk\", \"rkba\", \"road\", \"road\", \"road\", \"road\", \"road\", \"road\", \"road\", \"robi\", \"rochest\", \"rochest\", \"rochest\", \"rochest\", \"rochest\", \"rocki\", \"rockwel\", \"run\", \"run\", \"run\", \"run\", \"run\", \"run\", \"run\", \"run\", \"rutger\", \"rutger\", \"rwing\", \"sabbath\", \"sale\", \"sale\", \"sale\", \"sale\", \"sale\", \"sandvik\", \"satan\", \"satellit\", \"satellit\", \"say\", \"say\", \"say\", \"say\", \"say\", \"say\", \"say\", \"say\", \"say\", \"say\", \"scheme\", \"scheme\", \"scheme\", \"scheme\", \"scheme\", \"schneider\", \"scienc\", \"scienc\", \"scienc\", \"scienc\", \"scienc\", \"scienc\", \"scienc\", \"scienc\", \"scienc\", \"scienc\", \"scientif\", \"scientif\", \"scientif\", \"scientif\", \"scientif\", \"score\", \"score\", \"scott\", \"scott\", \"scott\", \"scott\", \"scott\", \"scott\", \"scott\", \"screen\", \"screen\", \"screen\", \"screen\", \"scriptur\", \"scsi\", \"sdpa\", \"sdsu\", \"season\", \"season\", \"secret\", \"secret\", \"secret\", \"secur\", \"secur\", \"secur\", \"secur\", \"selann\", \"sell\", \"sell\", \"sell\", \"sell\", \"sell\", \"sell\", \"sell\", \"sell\", \"send\", \"send\", \"send\", \"send\", \"send\", \"send\", \"send\", \"send\", \"send\", \"send\", \"sera\", \"serdar\", \"server\", \"server\", \"shafer\", \"shaft\", \"shaft\", \"shark\", \"shotgun\", \"shuttl\", \"shuttl\", \"simm\", \"sin\", \"skeptic\", \"skeptic\", \"skndiv\", \"slaughter\", \"sleev\", \"sleev\", \"sleev\", \"smith\", \"smith\", \"smith\", \"smith\", \"smith\", \"smith\", \"smith\", \"smith\", \"smuggl\", \"softwar\", \"softwar\", \"softwar\", \"softwar\", \"softwar\", \"softwar\", \"softwar\", \"softwar\", \"softwar\", \"solar\", \"solar\", \"solar\", \"soldier\", \"soldier\", \"solntz\", \"sourc\", \"sourc\", \"sourc\", \"sourc\", \"sourc\", \"sourc\", \"sourc\", \"sourc\", \"sourc\", \"space\", \"space\", \"space\", \"space\", \"space\", \"spacecraft\", \"spacecraft\", \"spec\", \"spec\", \"spec\", \"speed\", \"speed\", \"speed\", \"speed\", \"speed\", \"spencer\", \"spend\", \"spend\", \"spend\", \"spend\", \"spend\", \"spend\", \"spend\", \"spend\", \"spend\", \"spend\", \"sphere\", \"spirit\", \"spirit\", \"spirit\", \"ssto\", \"stanford\", \"stanford\", \"stanford\", \"stanford\", \"stanford\", \"stanford\", \"stanford\", \"stanford\", \"stanley\", \"stanley\", \"stanley\", \"start\", \"start\", \"start\", \"start\", \"start\", \"start\", \"start\", \"start\", \"start\", \"start\", \"starter\", \"state\", \"state\", \"state\", \"state\", \"state\", \"state\", \"state\", \"state\", \"state\", \"state\", \"station\", \"station\", \"station\", \"station\", \"station\", \"station\", \"station\", \"station\", \"sternlight\", \"steve\", \"steve\", \"steve\", \"steve\", \"steve\", \"steve\", \"steve\", \"steve\", \"steveh\", \"stimulus\", \"stratus\", \"strnlght\", \"studi\", \"studi\", \"studi\", \"studi\", \"studi\", \"studi\", \"studi\", \"studi\", \"suno\", \"superstit\", \"surveil\", \"svga\", \"swap\", \"syndrom\", \"take\", \"take\", \"take\", \"take\", \"take\", \"take\", \"take\", \"take\", \"take\", \"take\", \"tampa\", \"teach\", \"teach\", \"teach\", \"teach\", \"teach\", \"team\", \"team\", \"team\", \"team\", \"team\", \"technolog\", \"technolog\", \"technolog\", \"technolog\", \"technolog\", \"technolog\", \"technolog\", \"technolog\", \"technolog\", \"tell\", \"tell\", \"tell\", \"tell\", \"tell\", \"tell\", \"tell\", \"tell\", \"tell\", \"tell\", \"tennesse\", \"test\", \"test\", \"test\", \"test\", \"test\", \"test\", \"test\", \"test\", \"testament\", \"thank\", \"thank\", \"thank\", \"thank\", \"thank\", \"thank\", \"thank\", \"thank\", \"thank\", \"theist\", \"theodor\", \"theolog\", \"theori\", \"theori\", \"theori\", \"theori\", \"theori\", \"theori\", \"therapi\", \"thing\", \"thing\", \"thing\", \"thing\", \"thing\", \"thing\", \"thing\", \"thing\", \"thing\", \"thing\", \"thomasp\", \"tiff\", \"tiger\", \"time\", \"time\", \"time\", \"time\", \"time\", \"time\", \"time\", \"time\", \"time\", \"time\", \"tire\", \"tire\", \"tire\", \"tire\", \"tire\", \"toolkit\", \"toronto\", \"toronto\", \"toronto\", \"toronto\", \"toronto\", \"treatment\", \"treatment\", \"troop\", \"true\", \"true\", \"true\", \"true\", \"true\", \"true\", \"true\", \"true\", \"true\", \"true\", \"trunk\", \"truth\", \"truth\", \"truth\", \"truth\", \"truth\", \"turk\", \"turkey\", \"turkish\", \"ualberta\", \"uchicago\", \"uchicago\", \"uchicago\", \"ucsc\", \"uicvm\", \"uiuc\", \"uiuc\", \"uiuc\", \"uiuc\", \"uiuc\", \"uiuc\", \"uiuc\", \"uiuc\", \"umich\", \"umich\", \"umich\", \"uoknor\", \"upgrad\", \"upgrad\", \"urartu\", \"urbana\", \"urbana\", \"urbana\", \"user\", \"user\", \"user\", \"user\", \"utah\", \"utkvm\", \"uvic\", \"veal\", \"vehicl\", \"vehicl\", \"vehicl\", \"vehicl\", \"vers\", \"version\", \"version\", \"version\", \"version\", \"version\", \"version\", \"version\", \"version\", \"version\", \"vesa\", \"vesselin\", \"video\", \"video\", \"video\", \"video\", \"villag\", \"villag\", \"virginia\", \"virginia\", \"virginia\", \"virginia\", \"virginia\", \"virginia\", \"virginia\", \"visual\", \"visual\", \"volt\", \"vram\", \"waco\", \"waco\", \"wagon\", \"wagon\", \"want\", \"want\", \"want\", \"want\", \"want\", \"want\", \"want\", \"want\", \"want\", \"want\", \"water\", \"water\", \"water\", \"water\", \"water\", \"weapon\", \"weapon\", \"weapon\", \"wheel\", \"wheel\", \"widget\", \"window\", \"window\", \"window\", \"wing\", \"wing\", \"wing\", \"wing\", \"wing\", \"winnipeg\", \"winnipeg\", \"wire\", \"wire\", \"wire\", \"wiretap\", \"word\", \"word\", \"word\", \"word\", \"word\", \"word\", \"word\", \"word\", \"word\", \"word\", \"work\", \"work\", \"work\", \"work\", \"work\", \"work\", \"work\", \"work\", \"work\", \"work\", \"world\", \"world\", \"world\", \"world\", \"world\", \"world\", \"world\", \"world\", \"world\", \"world\", \"worship\", \"worship\", \"xlib\", \"xpert\", \"xterm\", \"xview\", \"yamaha\", \"yanke\", \"year\", \"year\", \"year\", \"year\", \"year\", \"year\", \"year\", \"year\", \"year\", \"year\", \"yeast\", \"zoolog\", \"zuma\"]}, \"R\": 30, \"lambda.step\": 0.01, \"plot.opts\": {\"xlab\": \"PC1\", \"ylab\": \"PC2\"}, \"topic.order\": [3, 1, 8, 9, 2, 4, 7, 10, 5, 6]};\n", + "\n", + "function LDAvis_load_lib(url, callback){\n", + " var s = document.createElement('script');\n", + " s.src = url;\n", + " s.async = true;\n", + " s.onreadystatechange = s.onload = callback;\n", + " s.onerror = function(){console.warn(\"failed to load library \" + url);};\n", + " document.getElementsByTagName(\"head\")[0].appendChild(s);\n", + "}\n", + "\n", + "if(typeof(LDAvis) !== \"undefined\"){\n", + " // already loaded: just create the visualization\n", + " !function(LDAvis){\n", + " new LDAvis(\"#\" + \"ldavis_el591011124095238088809029897\", ldavis_el591011124095238088809029897_data);\n", + " }(LDAvis);\n", + "}else if(typeof define === \"function\" && define.amd){\n", + " // require.js is available: use it to load d3/LDAvis\n", + " require.config({paths: {d3: \"https://cdnjs.cloudflare.com/ajax/libs/d3/3.5.5/d3.min\"}});\n", + " require([\"d3\"], function(d3){\n", + " window.d3 = d3;\n", + " LDAvis_load_lib(\"https://cdn.rawgit.com/bmabey/pyLDAvis/files/ldavis.v1.0.0.js\", function(){\n", + " new LDAvis(\"#\" + \"ldavis_el591011124095238088809029897\", ldavis_el591011124095238088809029897_data);\n", + " });\n", + " });\n", + "}else{\n", + " // require.js not available: dynamically load d3 & LDAvis\n", + " LDAvis_load_lib(\"https://cdnjs.cloudflare.com/ajax/libs/d3/3.5.5/d3.min.js\", function(){\n", + " LDAvis_load_lib(\"https://cdn.rawgit.com/bmabey/pyLDAvis/files/ldavis.v1.0.0.js\", function(){\n", + " new LDAvis(\"#\" + \"ldavis_el591011124095238088809029897\", ldavis_el591011124095238088809029897_data);\n", + " })\n", + " });\n", + "}\n", + "</script>" + ], + "text/plain": [ + "PreparedData(topic_coordinates= x y topics cluster Freq\n", + "topic \n", + "2 -0.078669 -0.151706 1 1 13.182505\n", + "0 -0.016999 -0.150447 2 1 12.926197\n", + "7 0.208967 0.080137 3 1 12.463007\n", + "8 0.147446 0.136478 4 1 11.995771\n", + "1 -0.008849 -0.009046 5 1 9.559109\n", + "3 -0.045054 0.003907 6 1 9.468682\n", + "6 -0.089499 0.144727 7 1 8.927140\n", + "9 0.107803 -0.077376 8 1 7.882134\n", + "4 0.004524 -0.105100 9 1 7.024930\n", + "5 -0.229669 0.128426 10 1 6.570525, topic_info= Category Freq Term Total loglift logprob\n", + "1037 Default 2966.000000 window 2966.000000 30.0000 30.0000\n", + "1193 Default 1940.000000 game 1940.000000 29.0000 29.0000\n", + "482 Default 1924.000000 christian 1924.000000 28.0000 28.0000\n", + "702 Default 1689.000000 team 1689.000000 27.0000 27.0000\n", + "352 Default 2638.000000 drive 2638.000000 26.0000 26.0000\n", + "320 Default 2883.000000 file 2883.000000 25.0000 25.0000\n", + "696 Default 1860.000000 space 1860.000000 24.0000 24.0000\n", + "1467 Default 1161.000000 encrypt 1161.000000 23.0000 23.0000\n", + "256 Default 1997.000000 govern 1997.000000 22.0000 22.0000\n", + "153 Default 1477.000000 chip 1477.000000 21.0000 21.0000\n", + "522 Default 1274.000000 jesus 1274.000000 20.0000 20.0000\n", + "1347 Default 1017.000000 israel 1017.000000 19.0000 19.0000\n", + "36 Default 1577.000000 card 1577.000000 18.0000 18.0000\n", + "120 Default 1423.000000 play 1423.000000 17.0000 17.0000\n", + "964 Default 1059.000000 secur 1059.000000 16.0000 16.0000\n", + "657 Default 1331.000000 nasa 1331.000000 15.0000 15.0000\n", + "1821 Default 1142.000000 armenian 1142.000000 14.0000 14.0000\n", + "822 Default 2599.000000 program 2599.000000 13.0000 13.0000\n", + "1346 Default 837.000000 isra 837.000000 12.0000 12.0000\n", + "513 Default 1391.000000 imag 1391.000000 11.0000 11.0000\n", + "117 Default 6052.000000 peopl 6052.000000 10.0000 10.0000\n", + "3565 Default 742.000000 hockey 742.000000 9.0000 9.0000\n", + "739 Default 990.000000 player 990.000000 8.0000 8.0000\n", + "1457 Default 784.000000 clipper 784.000000 7.0000 7.0000\n", + "326 Default 1802.000000 public 1802.000000 6.0000 6.0000\n", + "41 Default 1023.000000 disk 1023.000000 5.0000 5.0000\n", + "28 Default 4004.000000 year 4004.000000 4.0000 4.0000\n", + "380 Default 867.000000 scsi 867.000000 3.0000 3.0000\n", + "879 Default 1191.000000 driver 1191.000000 2.0000 2.0000\n", + "444 Default 747.000000 bike 747.000000 1.0000 1.0000\n", + "... ... ... ... ... ... ...\n", + "5004 Topic10 178.948181 stanley 185.594589 2.6861 -6.0394\n", + "702 Topic10 1384.116455 team 1689.568604 2.5232 -3.9937\n", + "4840 Topic10 160.981583 jet 167.196503 2.6847 -6.1452\n", + "3815 Topic10 191.566772 coach 202.233215 2.6684 -5.9713\n", + "3537 Topic10 221.759384 ranger 240.052933 2.6433 -5.8249\n", + "4877 Topic10 157.258331 winnipeg 165.160721 2.6735 -6.1686\n", + "1193 Topic10 1290.715576 game 1940.664795 2.3147 -4.0636\n", + "120 Topic10 920.770020 play 1423.930298 2.2866 -4.4013\n", + "711 Topic10 312.806488 wing 399.885132 2.4770 -5.4809\n", + "739 Topic10 623.101746 player 990.567200 2.2590 -4.7918\n", + "1311 Topic10 397.739624 columbia 559.283691 2.3817 -5.2407\n", + "1080 Topic10 455.438751 season 670.126038 2.3364 -5.1053\n", + "3252 Topic10 379.943481 leagu 536.827942 2.3769 -5.2865\n", + "1073 Topic10 351.761322 pittsburgh 505.782318 2.3594 -5.3636\n", + "1679 Topic10 356.976562 score 528.273926 2.3306 -5.3488\n", + "1321 Topic10 374.845306 arab 572.500732 2.2991 -5.3000\n", + "3488 Topic10 212.819550 mcgill 254.334839 2.5444 -5.8661\n", + "1475 Topic10 346.644043 goal 553.699341 2.2543 -5.3782\n", + "1150 Topic10 312.806427 virginia 544.289856 2.1687 -5.4809\n", + "1082 Topic10 333.144867 toronto 701.091187 1.9785 -5.4179\n", + "1155 Topic10 336.057953 andrew 868.338135 1.7733 -5.4092\n", + "28 Topic10 600.308960 year 4004.757812 0.8248 -4.8291\n", + "157 Topic10 295.451538 divis 693.417114 1.8694 -5.5380\n", + "2117 Topic10 283.661255 canada 732.439819 1.7740 -5.5787\n", + "2549 Topic10 250.147522 period 584.503235 1.8739 -5.7045\n", + "45 Topic10 267.235901 final 822.295105 1.5986 -5.6384\n", + "171 Topic10 330.680511 point 2646.791748 0.6426 -5.4254\n", + "146 Topic10 358.020264 time 5183.146484 0.0500 -5.3459\n", + "1545 Topic10 262.164948 american 1242.273315 1.1669 -5.6575\n", + "99 Topic10 242.101822 go 3510.730713 0.0484 -5.7372\n", + "\n", + "[734 rows x 6 columns], token_table= Topic Freq Term\n", + "term \n", + "338 1 0.145983 accept\n", + "338 2 0.524347 accept\n", + "338 3 0.129101 accept\n", + "338 4 0.049654 accept\n", + "338 5 0.007945 accept\n", + "338 6 0.022841 accept\n", + "338 8 0.066536 accept\n", + "338 9 0.034758 accept\n", + "338 10 0.018869 accept\n", + "73 3 0.403915 access\n", + "73 4 0.196068 access\n", + "73 5 0.171820 access\n", + "73 6 0.033255 access\n", + "73 7 0.000693 access\n", + "73 8 0.193297 access\n", + "2940 4 0.984634 adaptec\n", + "152 1 0.052461 address\n", + "152 2 0.074007 address\n", + "152 3 0.536784 address\n", + "152 4 0.182675 address\n", + "152 5 0.030914 address\n", + "152 6 0.026230 address\n", + "152 7 0.032788 address\n", + "152 8 0.049650 address\n", + "152 9 0.005621 address\n", + "152 10 0.008431 address\n", + "1444 1 0.124112 administr\n", + "1444 3 0.063074 administr\n", + "1444 5 0.197359 administr\n", + "1444 8 0.614458 administr\n", + "... ... ... ...\n", + "182 2 0.166406 world\n", + "182 3 0.097373 world\n", + "182 4 0.150056 world\n", + "182 5 0.106093 world\n", + "182 6 0.051230 world\n", + "182 7 0.080296 world\n", + "182 8 0.011990 world\n", + "182 9 0.053410 world\n", + "182 10 0.054863 world\n", + "4238 1 0.009547 worship\n", + "4238 2 0.988079 worship\n", + "4809 3 0.994707 xlib\n", + "3868 3 0.995135 xpert\n", + "3581 3 0.995652 xterm\n", + "2827 3 0.988763 xview\n", + "6047 6 0.981546 yamaha\n", + "1701 7 0.988053 yanke\n", + "28 1 0.130095 year\n", + "28 2 0.031962 year\n", + "28 3 0.015482 year\n", + "28 4 0.038954 year\n", + "28 5 0.216243 year\n", + "28 6 0.063674 year\n", + "28 7 0.244959 year\n", + "28 8 0.040951 year\n", + "28 9 0.067919 year\n", + "28 10 0.149822 year\n", + "3309 9 0.986879 yeast\n", + "3190 5 0.990640 zoolog\n", + "1894 1 0.991014 zuma\n", + "\n", + "[2168 rows x 3 columns], R=30, lambda_step=0.01, plot_opts={'xlab': 'PC1', 'ylab': 'PC2'}, topic_order=[3, 1, 8, 9, 2, 4, 7, 10, 5, 6])" + ] + }, + "execution_count": 155, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "p = visualize_topics(model, bow_corpus, dictionary)\n", + "p" + ] + }, + { + "cell_type": "code", + "execution_count": 23, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "# Save the pyldavis as HTML\n", + "from nautilus_nlp.models.topic_modeling import save_pyldavis" + ] + }, + { + "cell_type": "code", + "execution_count": 24, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "save_pyldavis(p, '/Users/williamjaubert/Documents/Allianz_William/', 'pyldavis_test_func')" + ] + }, + { + "cell_type": "code", + "execution_count": 27, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "# Load the pyldavis HTML\n", + "from nautilus_nlp.models.topic_modeling import show_pyldavis" + ] + }, + { + "cell_type": "code", + "execution_count": 26, + "metadata": { + "collapsed": true + }, + "outputs": [ + { + "data": { + "text/html": [ + "\n", + "<link rel=\"stylesheet\" type=\"text/css\" href=\"https://cdn.rawgit.com/bmabey/pyLDAvis/files/ldavis.v1.0.0.css\">\n", + "\n", + "\n", + "<div id=\"ldavis_el591011124069819927707340541\"></div>\n", + "<script type=\"text/javascript\">\n", + "\n", + "var ldavis_el591011124069819927707340541_data = {\"mdsDat\": {\"x\": [-0.07866945427665124, -0.01699948489792914, 0.20896689238873523, 0.14744605031212607, -0.008849073212760983, -0.04505413872814077, -0.08949897686453376, 0.10780299734830809, 0.004524270451044093, -0.22966908252019716], \"y\": [-0.15170611822961017, -0.1504468301902949, 0.08013685816591506, 0.13647834612774523, -0.009046128981188077, 0.003906923765221535, 0.14472746444813225, -0.07737607739594787, -0.1051004751701791, 0.1284260374602061], \"topics\": [1, 2, 3, 4, 5, 6, 7, 8, 9, 10], \"cluster\": [1, 1, 1, 1, 1, 1, 1, 1, 1, 1], \"Freq\": [13.179347038269043, 12.924742698669434, 12.465522766113281, 11.996149063110352, 9.560138702392578, 9.471930503845215, 8.926163673400879, 7.8803582191467285, 7.02661657333374, 6.569023609161377]}, \"tinfo\": {\"Category\": [\"Default\", \"Default\", \"Default\", \"Default\", \"Default\", \"Default\", \"Default\", \"Default\", \"Default\", \"Default\", \"Default\", \"Default\", \"Default\", \"Default\", \"Default\", \"Default\", \"Default\", \"Default\", \"Default\", \"Default\", \"Default\", \"Default\", \"Default\", \"Default\", \"Default\", \"Default\", \"Default\", \"Default\", \"Default\", \"Default\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\"], \"Freq\": [2966.0, 1940.0, 1924.0, 1689.0, 2638.0, 2884.0, 1860.0, 1161.0, 1997.0, 1477.0, 1274.0, 1016.0, 1577.0, 1423.0, 1059.0, 1331.0, 1142.0, 2600.0, 837.0, 1391.0, 6052.0, 742.0, 990.0, 784.0, 1802.0, 1023.0, 4004.0, 867.0, 1191.0, 747.0, 1141.7806396484375, 697.88427734375, 406.7251281738281, 375.1473693847656, 365.11944580078125, 324.8642883300781, 317.2684326171875, 293.6634521484375, 242.85263061523438, 242.56858825683594, 238.5181884765625, 222.63047790527344, 219.19569396972656, 497.40509033203125, 182.86300659179688, 189.0499267578125, 180.7320556640625, 167.57565307617188, 170.02467346191406, 162.42880249023438, 156.00514221191406, 152.95489501953125, 147.39271545410156, 144.92861938476562, 143.97406005859375, 142.5141143798828, 139.98184204101562, 137.23757934570312, 111.6092529296875, 111.33480834960938, 296.39483642578125, 234.70761108398438, 534.3711547851562, 227.28517150878906, 733.2534790039062, 290.5158386230469, 1027.5731201171875, 194.4586944580078, 462.1385803222656, 638.6304321289062, 382.9510498046875, 556.9410400390625, 270.836669921875, 346.2899169921875, 2339.156005859375, 353.3161926269531, 956.0157470703125, 1366.4423828125, 488.9396667480469, 1502.5341796875, 432.1164245605469, 423.58416748046875, 945.9664306640625, 647.218505859375, 868.762451171875, 843.017578125, 679.0517578125, 535.9990234375, 452.12701416015625, 627.1972045898438, 723.6101684570312, 487.4131164550781, 627.0872802734375, 480.17083740234375, 485.80718994140625, 520.3949584960938, 438.9589538574219, 1273.7509765625, 843.0744018554688, 687.5490112304688, 378.0928649902344, 599.49951171875, 284.1490173339844, 264.89508056640625, 257.6834716796875, 233.3529052734375, 198.52938842773438, 196.5380859375, 186.40451049804688, 185.75604248046875, 190.4610595703125, 160.6652069091797, 157.19314575195312, 147.49737548828125, 143.9265899658203, 141.27682495117188, 132.94015502929688, 132.69456481933594, 136.24981689453125, 134.07119750976562, 122.38124084472656, 117.65129089355469, 110.72013092041016, 103.34630584716797, 103.80403137207031, 102.60269165039062, 191.14974975585938, 1897.33984375, 734.1270141601562, 595.287353515625, 628.0527954101562, 206.76734924316406, 246.9275360107422, 800.1103515625, 749.0331420898438, 336.11505126953125, 271.7132873535156, 265.6830749511719, 397.9759216308594, 574.263427734375, 250.1382293701172, 378.815185546875, 461.7101745605469, 1507.0093994140625, 256.83978271484375, 577.0333251953125, 989.0523071289062, 369.24951171875, 600.8649291992188, 735.2048950195312, 547.226806640625, 671.4481811523438, 658.2610473632812, 983.5562133789062, 1571.339111328125, 640.5230712890625, 527.4468994140625, 1108.9169921875, 876.3516845703125, 725.7343139648438, 862.0634155273438, 662.431396484375, 745.1685791015625, 665.753662109375, 603.1578979492188, 671.9922485351562, 613.3507690429688, 579.6978759765625, 513.6331176757812, 478.697998046875, 261.2860107421875, 304.5064392089844, 182.0912628173828, 164.47610473632812, 158.48814392089844, 152.05868530273438, 137.89083862304688, 135.1747589111328, 117.29756927490234, 101.5453109741211, 100.56036376953125, 94.57755279541016, 94.09120178222656, 92.84423065185547, 88.50360870361328, 85.07716369628906, 77.8897705078125, 76.20620727539062, 74.78276062011719, 76.93145751953125, 66.28211975097656, 65.84783172607422, 62.6032600402832, 61.643402099609375, 56.68076705932617, 56.65744400024414, 56.483177185058594, 56.252906799316406, 433.4509582519531, 57.65077209472656, 175.38478088378906, 811.8549194335938, 352.3771057128906, 460.9055480957031, 1244.601806640625, 397.80743408203125, 319.1280822753906, 364.2165832519531, 817.3186645507812, 179.1452178955078, 759.4246826171875, 353.8927307128906, 768.0062255859375, 704.1742553710938, 1031.2420654296875, 338.7886962890625, 853.2907104492188, 1558.8812255859375, 1291.53564453125, 922.5413208007812, 1345.7596435546875, 471.8685607910156, 490.1439208984375, 677.5836181640625, 1059.2960205078125, 853.371337890625, 843.8799438476562, 1006.7838745117188, 803.6088256835938, 784.7322387695312, 584.7684936523438, 572.9198608398438, 507.78826904296875, 934.9744873046875, 496.57794189453125, 583.3226318359375, 623.9882202148438, 588.1378784179688, 615.0081176757812, 528.20361328125, 511.33087158203125, 511.8083801269531, 866.59033203125, 316.7350769042969, 249.30372619628906, 229.90980529785156, 228.7428741455078, 211.5573272705078, 183.0348663330078, 166.19662475585938, 164.79638671875, 155.5634765625, 157.90318298339844, 359.6986083984375, 133.47061157226562, 124.17569732666016, 122.316650390625, 117.04086303710938, 111.26261901855469, 110.83892059326172, 109.1672592163086, 103.2135009765625, 98.91744995117188, 514.7843017578125, 89.63079833984375, 82.75098419189453, 81.71863555908203, 103.2540054321289, 75.26065826416016, 75.21710205078125, 70.78661346435547, 69.3476791381836, 281.7891540527344, 311.1296081542969, 971.294189453125, 208.02467346191406, 697.1555786132812, 367.6167297363281, 1416.345947265625, 441.6514587402344, 604.5531616210938, 578.907958984375, 377.5320129394531, 192.01060485839844, 648.3541870117188, 1969.95458984375, 938.596435546875, 446.4309387207031, 632.3701782226562, 658.6392822265625, 1989.91748046875, 746.844970703125, 677.8211669921875, 282.1589050292969, 467.3360290527344, 480.8250427246094, 1420.011962890625, 633.149169921875, 1121.6416015625, 955.3305053710938, 821.8895874023438, 1270.0303955078125, 524.9111328125, 1015.944580078125, 611.8392944335938, 745.4418334960938, 688.5404663085938, 667.2193603515625, 692.5394897460938, 593.0941162109375, 527.0477905273438, 546.2659301757812, 266.1635437011719, 171.10794067382812, 155.6239776611328, 226.90951538085938, 131.5675506591797, 110.65044403076172, 109.72305297851562, 476.2783203125, 123.80803680419922, 96.53874206542969, 90.70281219482422, 86.92076873779297, 84.76178741455078, 84.683349609375, 83.14109802246094, 249.0670928955078, 73.45060729980469, 70.67398071289062, 70.31317138671875, 68.84266662597656, 66.71842193603516, 65.88937377929688, 60.61496353149414, 60.299964904785156, 59.60258483886719, 59.442161560058594, 59.145503997802734, 58.31914138793945, 57.82154846191406, 57.423213958740234, 405.08648681640625, 341.47369384765625, 190.9191131591797, 246.2603759765625, 163.53012084960938, 257.4788513183594, 138.4282684326172, 165.1016082763672, 521.0703125, 1046.3909912109375, 1401.0023193359375, 228.18516540527344, 286.6700439453125, 343.28363037109375, 185.7610626220703, 229.6707305908203, 175.074462890625, 332.49884033203125, 163.83180236816406, 539.723876953125, 256.24749755859375, 439.7876892089844, 517.6013793945312, 403.5384826660156, 229.64816284179688, 866.3922729492188, 846.759033203125, 313.158447265625, 322.8583068847656, 286.9349365234375, 653.4288330078125, 749.9511108398438, 426.6536560058594, 380.0589294433594, 366.8407287597656, 372.0916748046875, 408.5104064941406, 415.6706237792969, 394.1766357421875, 394.4267578125, 349.5382080078125, 362.40155029296875, 340.808349609375, 296.16046142578125, 297.5443420410156, 494.8436584472656, 746.194580078125, 324.79425048828125, 301.5485534667969, 243.8285369873047, 158.12664794921875, 107.40505981445312, 95.04991912841797, 99.33280944824219, 91.02439880371094, 88.6642837524414, 79.35138702392578, 77.837158203125, 76.30526733398438, 74.57151794433594, 68.70978546142578, 66.97795867919922, 65.4818344116211, 64.81551361083984, 62.9178466796875, 62.10234832763672, 61.07172393798828, 61.08311080932617, 58.716949462890625, 57.748966217041016, 57.54390335083008, 57.412330627441406, 53.53644561767578, 53.10344696044922, 81.06087493896484, 466.5129089355469, 629.9894409179688, 272.5233154296875, 229.85595703125, 524.6031494140625, 169.13986206054688, 106.4736328125, 468.3924255371094, 321.2161865234375, 72.88867950439453, 215.71841430664062, 420.2349548339844, 255.02392578125, 239.02398681640625, 170.43710327148438, 161.87730407714844, 350.9423522949219, 510.4275207519531, 280.5064697265625, 480.16314697265625, 199.71388244628906, 294.50860595703125, 258.12945556640625, 376.6604919433594, 510.116455078125, 1114.61083984375, 256.1866149902344, 426.7527770996094, 319.7099304199219, 739.28173828125, 280.38397216796875, 489.42193603515625, 542.8736572265625, 517.7899780273438, 617.5950317382812, 513.4124755859375, 436.72442626953125, 491.1626281738281, 506.85968017578125, 460.4228515625, 441.4096374511719, 394.3690185546875, 351.4322509765625, 347.85174560546875, 353.2395324707031, 337.03509521484375, 274.97705078125, 206.25440979003906, 205.88706970214844, 185.46702575683594, 142.32943725585938, 138.4519500732422, 125.20697021484375, 124.93755340576172, 113.30398559570312, 111.32567596435547, 109.37814331054688, 105.70201110839844, 106.32189178466797, 292.8650207519531, 101.51443481445312, 98.15642547607422, 98.08124542236328, 96.688720703125, 95.23130798339844, 93.90516662597656, 90.93041229248047, 90.10682678222656, 204.03321838378906, 83.50547790527344, 83.1707992553711, 82.09012603759766, 80.0595703125, 80.03185272216797, 78.97164154052734, 77.4714584350586, 624.7915649414062, 218.5322723388672, 299.7547607421875, 218.30796813964844, 189.66859436035156, 356.61126708984375, 202.45262145996094, 416.956787109375, 238.6123046875, 212.24911499023438, 149.82693481445312, 211.92662048339844, 303.8810119628906, 120.30801391601562, 237.628173828125, 454.8601379394531, 333.9891357421875, 980.4944458007812, 485.3978576660156, 911.3460083007812, 590.2308959960938, 261.1946716308594, 253.11302185058594, 366.61309814453125, 366.9202880859375, 261.4228515625, 595.406494140625, 533.9457397460938, 533.9599609375, 583.47607421875, 307.19378662109375, 439.3268737792969, 370.1156311035156, 337.7350158691406, 344.1394348144531, 325.0244140625, 340.1333923339844, 337.7405090332031, 350.025146484375, 294.61376953125, 276.2976989746094, 278.626953125, 1160.65234375, 424.52520751953125, 361.9087219238281, 388.7334289550781, 255.14059448242188, 223.3458709716797, 186.77297973632812, 150.9017333984375, 148.35372924804688, 142.3341522216797, 778.6029052734375, 125.934814453125, 122.35879516601562, 113.49314880371094, 110.9784164428711, 117.08515930175781, 97.77255249023438, 95.13446807861328, 154.00491333007812, 85.83687591552734, 85.79811096191406, 83.88481903076172, 83.05354309082031, 81.01181030273438, 86.69019317626953, 72.2069091796875, 70.93242645263672, 66.0419921875, 65.32259368896484, 61.589271545410156, 631.8587646484375, 967.0912475585938, 392.3902893066406, 86.90055847167969, 116.69065856933594, 384.3917541503906, 954.828125, 325.44622802734375, 153.9778594970703, 168.00970458984375, 886.02734375, 877.259521484375, 327.1088562011719, 468.2386169433594, 329.3564758300781, 302.24896240234375, 346.5186767578125, 350.18585205078125, 277.6599426269531, 424.3641662597656, 266.8429870605469, 331.9565124511719, 578.17333984375, 328.296630859375, 429.8065490722656, 517.4179077148438, 400.8412170410156, 346.21722412109375, 433.2587890625, 421.34136962890625, 338.8642883300781, 347.50665283203125, 348.3670654296875, 336.53314208984375, 398.4556579589844, 299.90478515625, 164.68971252441406, 151.29721069335938, 134.82589721679688, 134.8407440185547, 128.82469177246094, 120.21800231933594, 119.83185577392578, 103.71044921875, 93.07451629638672, 105.74777221679688, 91.14122772216797, 88.90278625488281, 86.50234985351562, 83.21115112304688, 82.5744857788086, 76.65482330322266, 73.94358825683594, 137.486328125, 73.60121154785156, 73.44850158691406, 297.8765869140625, 71.537841796875, 71.537841796875, 71.39191436767578, 68.6223373413086, 70.66267395019531, 67.06273651123047, 64.6351318359375, 137.61058044433594, 330.04791259765625, 498.7896423339844, 418.3139343261719, 321.71234130859375, 192.31024169921875, 436.83538818359375, 120.46820068359375, 101.74191284179688, 189.6998748779297, 107.90703582763672, 180.33082580566406, 406.5956726074219, 219.30587768554688, 311.1242370605469, 276.8919677734375, 364.6730651855469, 122.64595794677734, 431.6532897949219, 148.9232177734375, 478.1828308105469, 448.573486328125, 560.2838134765625, 235.4400634765625, 220.1329345703125, 237.02713012695312, 526.0250854492188, 310.5745544433594, 195.26043701171875, 465.158203125, 342.7765808105469, 343.9803161621094, 252.5526123046875, 252.3756866455078, 359.45233154296875, 365.1446533203125, 297.1376953125, 278.9319763183594, 264.31353759765625, 271.8553161621094, 267.05078125, 258.78143310546875, 836.6797485351562, 741.5901489257812, 348.0262145996094, 262.59930419921875, 234.66685485839844, 225.6525115966797, 214.5906982421875, 197.1658935546875, 176.15512084960938, 163.69117736816406, 159.65298461914062, 156.5215606689453, 155.51637268066406, 147.13583374023438, 143.75466918945312, 151.88540649414062, 140.51809692382812, 133.0145721435547, 131.76170349121094, 122.347900390625, 118.6324234008789, 115.60749816894531, 112.3785629272461, 112.19926452636719, 111.77244567871094, 119.0841293334961, 102.04837799072266, 93.4240493774414, 92.21881866455078, 89.70394897460938, 218.3953094482422, 151.76768493652344, 955.2220458984375, 178.90740966796875, 1383.801025390625, 160.94491577148438, 191.5231170654297, 221.7088623046875, 157.22250366210938, 1290.4215087890625, 920.5602416992188, 312.7351989746094, 622.9597778320312, 397.6490173339844, 455.3349914550781, 379.85693359375, 351.6811828613281, 356.8952331542969, 374.7598876953125, 212.77105712890625, 346.5650634765625, 312.73516845703125, 333.0689392089844, 335.98138427734375, 600.1721801757812, 295.3842468261719, 283.5966491699219, 250.0905303955078, 267.1750183105469, 330.6051940917969, 357.9386901855469, 262.105224609375, 242.04666137695312], \"Term\": [\"window\", \"game\", \"christian\", \"team\", \"drive\", \"file\", \"space\", \"encrypt\", \"govern\", \"chip\", \"jesus\", \"israel\", \"card\", \"play\", \"secur\", \"nasa\", \"armenian\", \"program\", \"isra\", \"imag\", \"peopl\", \"hockey\", \"player\", \"clipper\", \"public\", \"disk\", \"year\", \"scsi\", \"driver\", \"bike\", \"armenian\", \"turkish\", \"turk\", \"turkey\", \"armenia\", \"koresh\", \"nazi\", \"militia\", \"serdar\", \"argic\", \"genocid\", \"davidian\", \"troop\", \"murder\", \"mormon\", \"prison\", \"massacr\", \"azeri\", \"ethnic\", \"azerbaijani\", \"hitler\", \"iran\", \"zuma\", \"sdpa\", \"motto\", \"azerbaijan\", \"extermin\", \"sera\", \"urartu\", \"slaughter\", \"villag\", \"batf\", \"greek\", \"greec\", \"jew\", \"soldier\", \"kill\", \"waco\", \"arm\", \"countri\", \"muslim\", \"children\", \"armi\", \"popul\", \"peopl\", \"anti\", \"govern\", \"right\", \"attack\", \"say\", \"polit\", \"death\", \"state\", \"live\", \"go\", \"come\", \"tell\", \"happen\", \"forc\", \"world\", \"time\", \"nation\", \"want\", \"leav\", \"start\", \"year\", \"take\", \"jesus\", \"bibl\", \"atheist\", \"atheism\", \"christ\", \"scriptur\", \"cathol\", \"sandvik\", \"doctrin\", \"revel\", \"biblic\", \"satan\", \"atho\", \"livesey\", \"prophet\", \"divin\", \"vers\", \"gospel\", \"sabbath\", \"god\", \"sin\", \"resurrect\", \"solntz\", \"testament\", \"theolog\", \"propheci\", \"theist\", \"schneider\", \"jaeger\", \"marriag\", \"christian\", \"church\", \"belief\", \"faith\", \"worship\", \"contradict\", \"moral\", \"religion\", \"lord\", \"heaven\", \"holi\", \"rutger\", \"truth\", \"spirit\", \"teach\", \"islam\", \"believ\", \"etern\", \"argument\", \"exist\", \"religi\", \"evid\", \"word\", \"love\", \"life\", \"claim\", \"mean\", \"peopl\", \"true\", \"accept\", \"say\", \"question\", \"reason\", \"thing\", \"person\", \"come\", \"good\", \"read\", \"time\", \"point\", \"follow\", \"motif\", \"widget\", \"xterm\", \"visual\", \"xlib\", \"polygon\", \"baalk\", \"contrib\", \"toolkit\", \"kelvin\", \"pyron\", \"suno\", \"deskjet\", \"xpert\", \"plaintext\", \"skndiv\", \"openwindow\", \"xview\", \"ether\", \"quicktim\", \"magellan\", \"utah\", \"greenbelt\", \"reilli\", \"ualberta\", \"copper\", \"ciphertext\", \"autom\", \"gradi\", \"dillon\", \"font\", \"handbook\", \"binari\", \"server\", \"client\", \"librari\", \"imag\", \"anonym\", \"compil\", \"resourc\", \"graphic\", \"map\", \"applic\", \"archiv\", \"user\", \"code\", \"avail\", \"directori\", \"sourc\", \"file\", \"mail\", \"list\", \"program\", \"function\", \"format\", \"email\", \"inform\", \"version\", \"softwar\", \"includ\", \"send\", \"data\", \"internet\", \"address\", \"display\", \"window\", \"copi\", \"access\", \"distribut\", \"thank\", \"look\", \"book\", \"group\", \"need\", \"scsi\", \"simm\", \"motherboard\", \"cach\", \"bio\", \"quadra\", \"diamond\", \"vram\", \"vesa\", \"centri\", \"swap\", \"upgrad\", \"char\", \"eisa\", \"intercon\", \"nubus\", \"ethernet\", \"svga\", \"amanda\", \"meg\", \"cadr\", \"mous\", \"maxtor\", \"config\", \"cica\", \"tiff\", \"adaptec\", \"powerbook\", \"ctrl\", \"esdi\", \"jumper\", \"floppi\", \"disk\", \"umich\", \"video\", \"modem\", \"card\", \"output\", \"monitor\", \"mode\", \"printer\", \"spec\", \"entri\", \"drive\", \"driver\", \"port\", \"instal\", \"memori\", \"window\", \"color\", \"appl\", \"byte\", \"screen\", \"board\", \"problem\", \"machin\", \"file\", \"thank\", \"control\", \"work\", \"speed\", \"need\", \"hard\", \"help\", \"program\", \"want\", \"time\", \"repli\", \"softwar\", \"distribut\", \"alaska\", \"spencer\", \"oracl\", \"dseg\", \"aurora\", \"nsmca\", \"engr\", \"launch\", \"uoknor\", \"callison\", \"kaldi\", \"zoolog\", \"mccall\", \"ucsc\", \"hallam\", \"lunar\", \"automot\", \"raider\", \"theodor\", \"dock\", \"shafer\", \"mksol\", \"hydro\", \"ssto\", \"plymouth\", \"redesign\", \"laughter\", \"rockwel\", \"desi\", \"stimulus\", \"moon\", \"henri\", \"mar\", \"job\", \"wheel\", \"billion\", \"invest\", \"spacecraft\", \"orbit\", \"nasa\", \"space\", \"shuttl\", \"satellit\", \"fund\", \"probe\", \"flight\", \"helmet\", \"station\", \"solar\", \"presid\", \"mission\", \"earth\", \"cost\", \"money\", \"vehicl\", \"year\", \"work\", \"project\", \"toronto\", \"spend\", \"go\", \"time\", \"engin\", \"long\", \"high\", \"power\", \"thing\", \"say\", \"look\", \"peopl\", \"program\", \"want\", \"need\", \"design\", \"build\", \"firearm\", \"bike\", \"motorcycl\", \"magnus\", \"rider\", \"honda\", \"veal\", \"utkvm\", \"centerlin\", \"cactus\", \"rkba\", \"harley\", \"shotgun\", \"pistol\", \"ranck\", \"boyl\", \"husc\", \"ifa\", \"smuggl\", \"fischer\", \"counterst\", \"armori\", \"trunk\", \"thomasp\", \"imak\", \"photographi\", \"concordia\", \"tennesse\", \"yamaha\", \"frost\", \"car\", \"ohio\", \"uchicago\", \"rid\", \"gun\", \"brake\", \"shaft\", \"cwru\", \"auto\", \"wagon\", \"handgun\", \"cleveland\", \"ride\", \"tire\", \"urbana\", \"midway\", \"insur\", \"uiuc\", \"dealer\", \"weapon\", \"iastat\", \"owner\", \"illinoi\", \"crime\", \"price\", \"state\", \"freenet\", \"sell\", \"buy\", \"good\", \"road\", \"drive\", \"right\", \"look\", \"peopl\", \"want\", \"case\", \"thing\", \"time\", \"go\", \"distribut\", \"repli\", \"engin\", \"opinion\", \"problem\", \"need\", \"gatech\", \"cub\", \"fnal\", \"prism\", \"hitter\", \"pitcher\", \"alomar\", \"uicvm\", \"higgin\", \"inning\", \"revolv\", \"hulman\", \"yanke\", \"pitch\", \"catcher\", \"dodger\", \"blast\", \"starter\", \"tiger\", \"met\", \"bat\", \"nore\", \"outlet\", \"rocki\", \"jay\", \"sdsu\", \"volt\", \"lopez\", \"restaur\", \"lamp\", \"wire\", \"duke\", \"circuit\", \"batteri\", \"brave\", \"basebal\", \"hit\", \"berkeley\", \"jason\", \"ball\", \"metal\", \"jeff\", \"grind\", \"larc\", \"indiana\", \"netcom\", \"colorado\", \"year\", \"run\", \"good\", \"game\", \"smith\", \"scott\", \"player\", \"home\", \"stanford\", \"look\", \"distribut\", \"go\", \"time\", \"lose\", \"come\", \"start\", \"play\", \"david\", \"best\", \"better\", \"power\", \"thing\", \"john\", \"sale\", \"great\", \"encrypt\", \"escrow\", \"privaci\", \"ripem\", \"crypto\", \"wiretap\", \"cryptographi\", \"cipher\", \"decrypt\", \"hamburg\", \"clipper\", \"homicid\", \"bontchev\", \"gtoal\", \"crypt\", \"clarkson\", \"rwing\", \"surveil\", \"nist\", \"sternlight\", \"den\", \"ncsl\", \"qualcomm\", \"fbihh\", \"cryptograph\", \"tampa\", \"mime\", \"vesselin\", \"lyme\", \"strnlght\", \"key\", \"secur\", \"enforc\", \"recipi\", \"classifi\", \"secret\", \"chip\", \"agenc\", \"patent\", \"scheme\", \"public\", \"govern\", \"algorithm\", \"protect\", \"propos\", \"administr\", \"privat\", \"clinton\", \"feder\", \"phone\", \"court\", \"devic\", \"number\", \"communic\", \"technolog\", \"inform\", \"provid\", \"author\", \"state\", \"right\", \"messag\", \"data\", \"peopl\", \"need\", \"diseas\", \"stratus\", \"dyer\", \"diet\", \"robi\", \"infect\", \"syndrom\", \"methodolog\", \"physician\", \"cure\", \"intellect\", \"einstein\", \"chopin\", \"candida\", \"sphere\", \"yeast\", \"chastiti\", \"halat\", \"therapi\", \"clinic\", \"migrain\", \"steveh\", \"patient\", \"catbyt\", \"dtmedin\", \"blah\", \"carlo\", \"superstit\", \"baerga\", \"homeopathi\", \"skeptic\", \"gordon\", \"pitt\", \"medic\", \"doctor\", \"medicin\", \"food\", \"cancer\", \"sleev\", \"ingr\", \"genet\", \"aid\", \"bank\", \"treatment\", \"water\", \"pain\", \"health\", \"handheld\", \"studi\", \"princeton\", \"caus\", \"effect\", \"scienc\", \"scientif\", \"rochest\", \"theori\", \"point\", \"result\", \"risk\", \"problem\", \"research\", \"case\", \"steve\", \"test\", \"time\", \"peopl\", \"repli\", \"take\", \"differ\", \"year\", \"say\", \"thing\", \"isra\", \"hockey\", \"playoff\", \"palestinian\", \"detroit\", \"leaf\", \"cramer\", \"optilink\", \"pen\", \"cunixb\", \"lebanes\", \"penguin\", \"clayton\", \"jake\", \"maynard\", \"espn\", \"edmonton\", \"ericsson\", \"boni\", \"lemieux\", \"gaza\", \"puck\", \"bruin\", \"selann\", \"laurentian\", \"quebec\", \"ramsey\", \"canuck\", \"shark\", \"uvic\", \"montreal\", \"flyer\", \"israel\", \"stanley\", \"team\", \"jet\", \"coach\", \"ranger\", \"winnipeg\", \"game\", \"play\", \"wing\", \"player\", \"columbia\", \"season\", \"leagu\", \"pittsburgh\", \"score\", \"arab\", \"mcgill\", \"goal\", \"virginia\", \"toronto\", \"andrew\", \"year\", \"divis\", \"canada\", \"period\", \"final\", \"point\", \"time\", \"american\", \"go\"], \"Total\": [2966.0, 1940.0, 1924.0, 1689.0, 2638.0, 2884.0, 1860.0, 1161.0, 1997.0, 1477.0, 1274.0, 1016.0, 1577.0, 1423.0, 1059.0, 1331.0, 1142.0, 2600.0, 837.0, 1391.0, 6052.0, 742.0, 990.0, 784.0, 1802.0, 1023.0, 4004.0, 867.0, 1191.0, 747.0, 1142.6856689453125, 698.7892456054688, 407.6301574707031, 376.0523376464844, 366.0244140625, 325.7693176269531, 318.1803283691406, 294.5684509277344, 243.75758361816406, 243.47354125976562, 239.42320251464844, 223.5354461669922, 220.10520935058594, 499.7329406738281, 183.76812744140625, 189.986083984375, 181.63705444335938, 168.4805908203125, 170.9480438232422, 163.333740234375, 156.91017150878906, 153.886962890625, 148.2976531982422, 145.83355712890625, 144.879150390625, 143.41905212402344, 140.88682556152344, 138.14251708984375, 112.51419830322266, 112.23980712890625, 299.66619873046875, 239.2371826171875, 575.1444702148438, 235.90956115722656, 846.7127075195312, 310.77874755859375, 1292.3048095703125, 203.61073303222656, 568.2711791992188, 904.836181640625, 498.23358154296875, 821.609130859375, 317.67413330078125, 442.3506164550781, 6052.24072265625, 470.10357666015625, 1997.324951171875, 3614.37890625, 771.2041015625, 4395.30419921875, 753.3086547851562, 728.9891967773438, 3490.1201171875, 1666.1630859375, 3510.617431640625, 3362.2998046875, 2458.740966796875, 1374.794921875, 910.3983154296875, 2752.224853515625, 5183.12158203125, 1404.2081298828125, 3617.91015625, 1561.89111328125, 1909.0416259765625, 4004.603515625, 1884.1224365234375, 1274.664794921875, 843.9874877929688, 688.462890625, 379.0060119628906, 601.0263671875, 285.0621643066406, 265.8124694824219, 258.5965270996094, 234.26597595214844, 199.44381713867188, 197.4620819091797, 187.31765747070312, 186.6690673828125, 191.4668731689453, 161.5784912109375, 158.11094665527344, 148.4104766845703, 144.83966064453125, 142.1898956298828, 133.85328674316406, 133.607666015625, 137.19871520996094, 135.05442810058594, 123.29427337646484, 118.56434631347656, 111.63320922851562, 104.25935363769531, 104.73915100097656, 103.52851104736328, 192.95652770996094, 1924.052490234375, 744.5303955078125, 604.3348999023438, 642.5186767578125, 209.473876953125, 250.68084716796875, 845.5989379882812, 828.3161010742188, 355.5079040527344, 287.7699890136719, 282.9315490722656, 442.10467529296875, 692.8697509765625, 269.93646240234375, 446.02288818359375, 578.7404174804688, 2561.57275390625, 282.8100891113281, 815.093017578125, 1699.812744140625, 474.28302001953125, 965.1755981445312, 1333.0074462890625, 902.1245727539062, 1251.440673828125, 1317.1837158203125, 2641.765625, 6052.24072265625, 1353.1533203125, 1006.899169921875, 4395.30419921875, 2872.2099609375, 1977.8988037109375, 3329.251220703125, 2055.943359375, 3362.2998046875, 3754.512451171875, 2277.26025390625, 5183.12158203125, 2646.850830078125, 1892.380859375, 514.5391235351562, 479.60406494140625, 262.1926574707031, 305.8974609375, 183.00523376464844, 165.38929748535156, 159.3942108154297, 152.96470642089844, 138.79685974121094, 136.08087158203125, 118.2038345336914, 102.45138549804688, 101.46646881103516, 95.48358917236328, 94.9975357055664, 93.75051879882812, 89.41075134277344, 85.98323059082031, 78.79640197753906, 77.11235046386719, 75.6888427734375, 77.9653091430664, 67.1884536743164, 66.7538833618164, 63.509578704833984, 62.54978561401367, 57.58708572387695, 57.563636779785156, 57.3893928527832, 57.15915298461914, 448.55657958984375, 58.58415985107422, 180.8949432373047, 872.5092163085938, 374.1332092285156, 496.03216552734375, 1391.68603515625, 441.02191162109375, 358.5589599609375, 426.19305419921875, 1054.7808837890625, 199.62811279296875, 1032.63037109375, 440.0619812011719, 1078.5040283203125, 1021.21630859375, 1669.5213623046875, 441.5232238769531, 1374.6883544921875, 2884.190673828125, 2375.445556640625, 1561.026611328125, 2600.153564453125, 691.944580078125, 736.2711791992188, 1159.4267578125, 2169.358642578125, 1621.3409423828125, 1630.9676513671875, 2103.4462890625, 1606.2760009765625, 1651.1109619140625, 1085.956787109375, 1067.5660400390625, 839.23681640625, 2966.81884765625, 872.6724853515625, 1443.4810791015625, 3039.01025390625, 2288.6611328125, 3375.223876953125, 1421.1317138671875, 1956.808349609375, 3517.246337890625, 867.5025024414062, 317.6472473144531, 250.21588134765625, 230.822021484375, 229.65501403808594, 212.469482421875, 183.94711303710938, 167.1087646484375, 165.7086639404297, 156.47564697265625, 158.841552734375, 362.0856628417969, 134.38279724121094, 125.08786010742188, 123.22889709472656, 117.95303344726562, 112.17479705810547, 111.7510986328125, 110.07952880859375, 104.12570190429688, 99.83139038085938, 519.8053588867188, 90.54296112060547, 83.66317749023438, 82.6308364868164, 104.47161102294922, 76.17282104492188, 76.12928771972656, 71.69883728027344, 70.25984191894531, 287.1429138183594, 317.7418212890625, 1023.19677734375, 213.9846954345703, 736.9693603515625, 385.20306396484375, 1577.9459228515625, 487.7285461425781, 681.551513671875, 651.6373901367188, 414.8818359375, 202.3636016845703, 773.6707763671875, 2638.341552734375, 1191.1107177734375, 521.547607421875, 771.9820556640625, 825.6704711914062, 2966.81884765625, 979.7251586914062, 877.64501953125, 316.5227966308594, 603.9163208007812, 656.5357666015625, 3254.719970703125, 1051.2142333984375, 2884.190673828125, 2288.6611328125, 1819.038330078125, 3998.41064453125, 901.28564453125, 3517.246337890625, 1391.8231201171875, 2348.69677734375, 2600.153564453125, 3617.91015625, 5183.12158203125, 2732.342529296875, 1630.9676513671875, 3039.01025390625, 267.0742492675781, 172.0186767578125, 156.53477478027344, 228.3336181640625, 132.47816467285156, 111.56108093261719, 110.63384246826172, 480.3006896972656, 124.95624542236328, 97.44942474365234, 91.61353302001953, 87.83140563964844, 85.67245483398438, 85.59416961669922, 84.05184936523438, 251.9625244140625, 74.36140441894531, 71.5853042602539, 71.22400665283203, 69.75337982177734, 67.62906646728516, 66.80011749267578, 61.52567672729492, 61.210594177246094, 60.51362609863281, 60.35288619995117, 60.056236267089844, 59.229862213134766, 58.732261657714844, 58.3338737487793, 416.04022216796875, 351.22491455078125, 197.7613983154297, 259.21063232421875, 170.8984832763672, 275.1896057128906, 144.3324737548828, 175.0106658935547, 593.0027465820312, 1331.6910400390625, 1860.989990234375, 257.6250915527344, 338.0062255859375, 441.3564453125, 216.25115966796875, 284.1476135253906, 205.7794952392578, 455.3014831542969, 191.24240112304688, 874.0391845703125, 344.76593017578125, 726.9601440429688, 1014.6715698242188, 862.6346435546875, 337.0456848144531, 4004.603515625, 3998.41064453125, 642.0369873046875, 701.0498657226562, 557.0301513671875, 3510.617431640625, 5183.12158203125, 1433.1673583984375, 1579.4356689453125, 1518.08154296875, 1785.505859375, 3329.251220703125, 4395.30419921875, 3375.223876953125, 6052.24072265625, 2600.153564453125, 3617.91015625, 3517.246337890625, 1000.7255249023438, 1483.91259765625, 495.9259948730469, 747.8888549804688, 325.7707214355469, 302.4598388671875, 245.07272338867188, 159.03866577148438, 108.3163070678711, 95.96115112304688, 100.31522369384766, 91.93561553955078, 89.57569122314453, 80.2626953125, 78.74849700927734, 77.21672058105469, 75.48271942138672, 69.6209945678711, 67.88932800292969, 66.39307403564453, 65.72957611083984, 63.82933807373047, 63.01356506347656, 61.98298645019531, 61.99775695800781, 59.62815475463867, 58.660850524902344, 58.45547103881836, 58.323734283447266, 54.44773483276367, 54.01467514038086, 82.45339965820312, 485.455078125, 668.6755981445312, 285.07806396484375, 240.7487335205078, 577.5048828125, 179.9601593017578, 111.24809265136719, 529.0847778320312, 357.6230773925781, 74.69509887695312, 242.41627502441406, 503.03863525390625, 297.51763916015625, 281.2916564941406, 192.39242553710938, 183.0908203125, 466.7659912109375, 750.9197387695312, 366.600341796875, 724.9913330078125, 250.3634796142578, 415.90521240234375, 353.12091064453125, 657.73046875, 1070.769775390625, 3490.1201171875, 395.6552429199219, 983.89306640625, 607.056640625, 3754.512451171875, 598.3618774414062, 2638.341552734375, 3614.37890625, 3375.223876953125, 6052.24072265625, 3617.91015625, 2113.316162109375, 3329.251220703125, 5183.12158203125, 3510.617431640625, 3039.01025390625, 2732.342529296875, 1433.1673583984375, 1407.93994140625, 3254.719970703125, 3517.246337890625, 275.8894958496094, 207.16677856445312, 206.80348205566406, 186.3794403076172, 143.24180603027344, 139.36428833007812, 126.11944580078125, 125.8499984741211, 114.2164306640625, 112.23802185058594, 110.29060363769531, 106.61448669433594, 107.27007293701172, 295.4941711425781, 102.42676544189453, 99.06878662109375, 98.99481201171875, 97.60137939453125, 96.14401245117188, 94.8175277709961, 91.84278869628906, 91.01932525634766, 206.16087341308594, 84.42133331298828, 84.08326721191406, 83.0025405883789, 80.97196197509766, 80.94422149658203, 79.88419342041016, 78.38389587402344, 639.207763671875, 227.35552978515625, 323.0017395019531, 231.70584106445312, 201.0164031982422, 428.85137939453125, 227.23008728027344, 525.593994140625, 277.059326171875, 257.5475158691406, 175.57948303222656, 283.9958801269531, 476.73712158203125, 133.42327880859375, 365.1600646972656, 1031.7481689453125, 640.5665283203125, 4004.603515625, 1280.0654296875, 3754.512451171875, 1940.3056640625, 488.2843322753906, 472.27227783203125, 990.3853759765625, 1023.18505859375, 516.35693359375, 3375.223876953125, 3039.01025390625, 3510.617431640625, 5183.12158203125, 818.4566650390625, 3362.2998046875, 1909.0416259765625, 1423.678955078125, 1658.632080078125, 1346.393798828125, 1717.5716552734375, 1785.505859375, 3329.251220703125, 1491.1873779296875, 990.3681030273438, 1542.396728515625, 1161.5667724609375, 425.4395751953125, 362.8358154296875, 389.9899597167969, 256.05499267578125, 224.26022338867188, 187.68853759765625, 151.81675720214844, 149.26809692382812, 143.24859619140625, 784.1885986328125, 126.84929656982422, 123.27316284179688, 114.40896606445312, 111.91240692138672, 118.12262725830078, 98.6883316040039, 96.04891967773438, 155.52407836914062, 86.7515869140625, 86.71247863769531, 84.7991943359375, 83.96793365478516, 81.92617797851562, 87.68406677246094, 73.12200164794922, 71.84886169433594, 66.95635223388672, 66.2371597290039, 62.503814697265625, 659.0949096679688, 1059.3629150390625, 429.3234558105469, 89.65412902832031, 124.41126251220703, 474.0597839355469, 1477.2554931640625, 430.520751953125, 178.88685607910156, 204.3247528076172, 1802.019287109375, 1997.324951171875, 534.64892578125, 906.0775756835938, 556.024169921875, 491.4239501953125, 613.6195678710938, 662.9179077148438, 470.1695251464844, 1022.0805053710938, 480.69464111328125, 730.8409423828125, 2365.4375, 763.007080078125, 1372.454345703125, 2169.358642578125, 1377.273681640625, 1170.2694091796875, 3490.1201171875, 3614.37890625, 1280.413818359375, 1651.1109619140625, 6052.24072265625, 3517.246337890625, 399.3816833496094, 300.8172912597656, 165.6021728515625, 152.21038818359375, 135.7383270263672, 135.75428771972656, 129.73992919921875, 121.13043975830078, 120.74485778808594, 104.6231460571289, 93.98695373535156, 106.80420684814453, 92.05374145507812, 89.81517791748047, 87.41483306884766, 84.12355041503906, 83.48693084716797, 77.58230590820312, 74.85601043701172, 139.18516540527344, 74.51407623291016, 74.36089324951172, 301.65814208984375, 72.4502182006836, 72.4502182006836, 72.30432891845703, 69.5348129272461, 71.61282348632812, 67.97527313232422, 65.5474853515625, 140.34677124023438, 354.6991271972656, 560.325927734375, 467.2398986816406, 372.57330322265625, 214.29714965820312, 528.391357421875, 128.8434295654297, 106.83519744873047, 215.34388732910156, 114.37532806396484, 206.88092041015625, 542.6390380859375, 263.99560546875, 416.1996765136719, 361.66558837890625, 544.8867797851562, 136.74913024902344, 864.7689819335938, 185.32183837890625, 1192.1806640625, 1098.416259765625, 1600.403076171875, 409.02203369140625, 366.54962158203125, 446.0751953125, 2646.850830078125, 941.828857421875, 342.37249755859375, 3254.719970703125, 1469.8829345703125, 2113.316162109375, 866.4751586914062, 975.6422729492188, 5183.12158203125, 6052.24072265625, 2732.342529296875, 1884.1224365234375, 2258.383544921875, 4004.603515625, 4395.30419921875, 3329.251220703125, 837.592041015625, 742.5023803710938, 348.9384460449219, 263.5115966796875, 235.57916259765625, 226.56475830078125, 215.50299072265625, 198.07823181152344, 177.06741333007812, 164.60345458984375, 160.56524658203125, 157.4338836669922, 156.4473419189453, 148.04823303222656, 144.6669921875, 152.85597229003906, 141.4331817626953, 133.9269561767578, 132.6742706298828, 123.26013946533203, 119.5447006225586, 116.5197525024414, 113.29080200195312, 113.11150360107422, 112.6846923828125, 120.06710052490234, 102.96061706542969, 94.33647918701172, 93.13108825683594, 90.6162338256836, 220.8243408203125, 153.70223999023438, 1016.828125, 185.55426025390625, 1689.23095703125, 167.16043090820312, 202.18853759765625, 240.0043182373047, 165.12567138671875, 1940.3056640625, 1423.678955078125, 399.81451416015625, 990.3853759765625, 559.1829833984375, 669.9990234375, 536.7244873046875, 505.73583984375, 528.174072265625, 572.368408203125, 254.2933349609375, 553.6107788085938, 544.26123046875, 701.0498657226562, 868.3087768554688, 4004.603515625, 693.3735961914062, 732.436279296875, 584.4656982421875, 822.2222900390625, 2646.850830078125, 5183.12158203125, 1242.119140625, 3510.617431640625], \"loglift\": [30.0, 29.0, 28.0, 27.0, 26.0, 25.0, 24.0, 23.0, 22.0, 21.0, 20.0, 19.0, 18.0, 17.0, 16.0, 15.0, 14.0, 13.0, 12.0, 11.0, 10.0, 9.0, 8.0, 7.0, 6.0, 5.0, 4.0, 3.0, 2.0, 1.0, 2.025700092315674, 2.0251998901367188, 2.0243000984191895, 2.0241000652313232, 2.0239999294281006, 2.023699998855591, 2.0236001014709473, 2.023400068283081, 2.0227999687194824, 2.0227999687194824, 2.022700071334839, 2.0225000381469727, 2.02239990234375, 2.021899938583374, 2.0216000080108643, 2.0216000080108643, 2.0215001106262207, 2.0211000442504883, 2.0211000442504883, 2.0209999084472656, 2.020699977874756, 2.020400047302246, 2.020400047302246, 2.0202999114990234, 2.0202999114990234, 2.02020001411438, 2.0201001167297363, 2.01990008354187, 2.018399953842163, 2.018399953842163, 2.015500068664551, 2.0074000358581543, 1.9529999494552612, 1.989300012588501, 1.882599949836731, 1.9591000080108643, 1.7972999811172485, 1.9804999828338623, 1.8198000192642212, 1.6780999898910522, 1.7633999586105347, 1.6376999616622925, 1.8669999837875366, 1.7817000150680542, 1.0758999586105347, 1.7409000396728516, 1.2897000312805176, 1.0537999868392944, 1.5707999467849731, 0.9531000256538391, 1.4707000255584717, 1.4836000204086304, 0.7210000157356262, 1.080899953842163, 0.6299999952316284, 0.6431000232696533, 0.739799976348877, 1.0845999717712402, 1.3265999555587769, 0.5475999712944031, 0.0575999990105629, 0.9684000015258789, 0.27399998903274536, 0.847000002861023, 0.6579999923706055, -0.014100000262260437, 0.5697000026702881, 2.045300006866455, 2.0448999404907227, 2.0446999073028564, 2.043600082397461, 2.0434999465942383, 2.042799949645996, 2.04259991645813, 2.0425000190734863, 2.042099952697754, 2.0413999557495117, 2.041300058364868, 2.041100025177002, 2.041100025177002, 2.040800094604492, 2.0404000282287598, 2.0401999950408936, 2.039900064468384, 2.0397000312805176, 2.039599895477295, 2.0392000675201416, 2.0392000675201416, 2.039099931716919, 2.0387001037597656, 2.038599967956543, 2.038300037384033, 2.0378000736236572, 2.0371999740600586, 2.037100076675415, 2.0369999408721924, 2.036600112915039, 2.0320000648498535, 2.0320000648498535, 2.030900001525879, 2.0232999324798584, 2.0329999923706055, 2.030900001525879, 1.9907000064849854, 1.9453999996185303, 1.98989999294281, 1.9886000156402588, 1.9831000566482544, 1.9408999681472778, 1.858299970626831, 1.9699000120162964, 1.882699966430664, 1.820099949836731, 1.5154999494552612, 1.9496999979019165, 1.700600028038025, 1.5045000314712524, 1.795699954032898, 1.572100043296814, 1.4509999752044678, 1.5461000204086304, 1.4234000444412231, 1.3523999452590942, 1.0579999685287476, 0.6974999904632568, 1.2980999946594238, 1.399399995803833, 0.6689000129699707, 0.859000027179718, 1.0434000492095947, 0.6948999762535095, 0.9135000109672546, 0.5393000245094299, 0.31619998812675476, 0.7174999713897705, 0.003100000089034438, 0.5838000178337097, 0.8629000186920166, 2.080399990081787, 2.0803000926971436, 2.078700065612793, 2.0776000022888184, 2.077199935913086, 2.07669997215271, 2.0764999389648438, 2.0762999057769775, 2.075700044631958, 2.075500011444092, 2.07450008392334, 2.0732998847961426, 2.073199987411499, 2.072700023651123, 2.0725998878479004, 2.072499990463257, 2.072000026702881, 2.0715999603271484, 2.0706000328063965, 2.0703999996185303, 2.070199966430664, 2.0689001083374023, 2.0685999393463135, 2.06850004196167, 2.0678000450134277, 2.0676000118255615, 2.0662999153137207, 2.0662999153137207, 2.0662999153137207, 2.066200017929077, 2.0478999614715576, 2.0660998821258545, 2.051300048828125, 2.010200023651123, 2.0223000049591064, 2.0088000297546387, 1.9704999923706055, 1.979099988937378, 1.9657000303268433, 1.9250999689102173, 1.8271000385284424, 1.9738999605178833, 1.774899959564209, 1.864300012588501, 1.7426999807357788, 1.7105000019073486, 1.6003999710083008, 1.8172999620437622, 1.605299949645996, 1.4668999910354614, 1.4729000329971313, 1.5562000274658203, 1.4235999584197998, 1.6993999481201172, 1.6753000020980835, 1.5450999736785889, 1.365399956703186, 1.4404000043869019, 1.42330002784729, 1.3453999757766724, 1.3896000385284424, 1.3382999897003174, 1.4631999731063843, 1.4598000049591064, 1.579800009727478, 0.9275000095367432, 1.518399953842163, 1.1761000156402588, 0.49900001287460327, 0.7233999967575073, 0.37959998846054077, 1.0924999713897705, 0.7401999831199646, 0.15469999611377716, 2.119499921798706, 2.1177000999450684, 2.1168999671936035, 2.1166000366210938, 2.1166000366210938, 2.116300106048584, 2.115600109100342, 2.1150999069213867, 2.1150999069213867, 2.1147000789642334, 2.1147000789642334, 2.114000082015991, 2.113800048828125, 2.113300085067749, 2.1131999492645264, 2.112799882888794, 2.1124000549316406, 2.1124000549316406, 2.112299919128418, 2.111799955368042, 2.1113998889923096, 2.1108999252319336, 2.1105000972747803, 2.109600067138672, 2.109499931335449, 2.1089000701904297, 2.1085000038146973, 2.1085000038146973, 2.107800006866455, 2.1075000762939453, 2.101799964904785, 2.099600076675415, 2.06850004196167, 2.0922999382019043, 2.065000057220459, 2.073899984359741, 2.012500047683716, 2.0213000774383545, 2.000699996948242, 2.00219988822937, 2.02620005607605, 2.0680999755859375, 1.9438999891281128, 1.8284000158309937, 1.8823000192642212, 1.9651000499725342, 1.9211000204086304, 1.8946000337600708, 1.7211999893188477, 1.8492000102996826, 1.8622000217437744, 2.00570011138916, 1.8641999959945679, 1.8091000318527222, 1.291100025177002, 1.6136000156402588, 1.1761000156402588, 1.246899962425232, 1.3260999917984009, 0.9736999869346619, 1.5800000429153442, 0.8787000179290771, 1.298699975013733, 0.9728999733924866, 0.7918000221252441, 0.4300999939441681, 0.10779999941587448, 0.5929999947547913, 0.9908999800682068, 0.4043999910354614, 2.3441998958587646, 2.3422999382019043, 2.3417000770568848, 2.3413000106811523, 2.3406999111175537, 2.339400053024292, 2.3392999172210693, 2.339200019836426, 2.3382999897003174, 2.338200092315674, 2.337599992752075, 2.337100028991699, 2.336899995803833, 2.336899995803833, 2.336699962615967, 2.3359999656677246, 2.335200071334839, 2.3348000049591064, 2.334700107574463, 2.334399938583374, 2.3340001106262207, 2.3338000774383545, 2.33270001411438, 2.3326001167297363, 2.33240008354187, 2.33240008354187, 2.3322999477386475, 2.3320999145507812, 2.331899881362915, 2.3317999839782715, 2.3208999633789062, 2.3194000720977783, 2.3124001026153564, 2.296299934387207, 2.303499937057495, 2.2809998989105225, 2.305799961090088, 2.289299964904785, 2.2183001041412354, 2.1064999103546143, 2.0636000633239746, 2.2262001037597656, 2.182800054550171, 2.096299886703491, 2.1956000328063965, 2.134700059890747, 2.186000108718872, 2.0332000255584717, 2.1928999423980713, 1.8654999732971191, 2.050800085067749, 1.8450000286102295, 1.6744999885559082, 1.5878000259399414, 1.9638999700546265, 0.8166999816894531, 0.7953000068664551, 1.6296000480651855, 1.5721999406814575, 1.6842000484466553, 0.6662999987602234, 0.41440001130104065, 1.1359000205993652, 0.9230999946594238, 0.927299976348877, 0.7792999744415283, 0.24959999322891235, -0.01080000028014183, 0.20020000636577606, -0.3831999897956848, 0.3409000039100647, 0.04670000076293945, 0.013500000350177288, 1.1299999952316284, 0.7407000064849854, 2.3547000885009766, 2.354599952697754, 2.353800058364868, 2.353800058364868, 2.3517000675201416, 2.351099967956543, 2.348400115966797, 2.3473000526428223, 2.3469998836517334, 2.34689998626709, 2.34660005569458, 2.345400094985962, 2.3452000617980957, 2.3450000286102295, 2.3447000980377197, 2.3436999320983887, 2.3433001041412354, 2.3429999351501465, 2.3427999019622803, 2.3424999713897705, 2.3422999382019043, 2.3420000076293945, 2.3420000076293945, 2.341399908065796, 2.341200113296509, 2.341099977493286, 2.341099977493286, 2.3399999141693115, 2.3397998809814453, 2.3397998809814453, 2.316999912261963, 2.2971999645233154, 2.311800003051758, 2.310499906539917, 2.2607998847961426, 2.294800043106079, 2.312999963760376, 2.234999895095825, 2.249500036239624, 2.33240008354187, 2.2402000427246094, 2.177000045776367, 2.202699899673462, 2.194000005722046, 2.2356998920440674, 2.2337000370025635, 2.0715999603271484, 1.9708000421524048, 2.089200019836426, 1.9448000192642212, 2.1308000087738037, 2.011699914932251, 2.0434999465942383, 1.799399971961975, 1.6153000593185425, 1.215399980545044, 1.9221999645233154, 1.5214999914169312, 1.7156000137329102, 0.7318000197410583, 1.5987999439239502, 0.6722000241279602, 0.460999995470047, 0.4821999967098236, 0.07450000196695328, 0.4043000042438507, 0.7800999879837036, 0.4431000053882599, 0.03189999982714653, 0.3253999948501587, 0.42750000953674316, 0.4212000072002411, 0.951200008392334, 0.9587000012397766, 0.13609999418258667, 0.011599999852478504, 2.412899971008301, 2.411799907684326, 2.4117000102996826, 2.41129994392395, 2.4098000526428223, 2.409600019454956, 2.408900022506714, 2.408900022506714, 2.4082000255584717, 2.4079999923706055, 2.407900094985962, 2.407599925994873, 2.4072999954223633, 2.4072000980377197, 2.4072000980377197, 2.406899929046631, 2.406899929046631, 2.4068000316619873, 2.406599998474121, 2.4065001010894775, 2.4061999320983887, 2.406100034713745, 2.4058001041412354, 2.4052999019622803, 2.4052999019622803, 2.405100107192993, 2.404900074005127, 2.4047999382019043, 2.4047000408172607, 2.4045000076293945, 2.393399953842163, 2.3766000270843506, 2.3415000438690186, 2.356600046157837, 2.358099937438965, 2.2316999435424805, 2.3006999492645264, 2.1846001148223877, 2.2667999267578125, 2.2227001190185547, 2.2576000690460205, 2.123500108718872, 1.96589994430542, 2.312700033187866, 1.9866000413894653, 1.5972000360488892, 1.7648999691009521, 1.0089999437332153, 1.4464999437332153, 1.0003999471664429, 1.226099967956543, 1.7905999422073364, 1.7925000190734863, 1.4223999977111816, 1.3906999826431274, 1.7354999780654907, 0.6812000274658203, 0.6772000193595886, 0.5329999923706055, 0.23199999332427979, 1.4362000226974487, 0.38100001215934753, 0.775600016117096, 0.977400004863739, 0.843500018119812, 0.9948999881744385, 0.7968999743461609, 0.7509999871253967, 0.16369999945163727, 0.7944999933242798, 1.1396000385284424, 0.7049999833106995, 2.5399999618530273, 2.538599967956543, 2.5381999015808105, 2.537600040435791, 2.5371999740600586, 2.5367000102996826, 2.535900115966797, 2.5348000526428223, 2.5346999168395996, 2.53439998626709, 2.533600091934204, 2.533600091934204, 2.533400058746338, 2.5327999591827393, 2.532399892807007, 2.5320000648498535, 2.5315001010894775, 2.5311999320983887, 2.5309998989105225, 2.5302000045776367, 2.5302000045776367, 2.5299999713897705, 2.5297999382019043, 2.529599905014038, 2.529400110244751, 2.5281999111175537, 2.5280001163482666, 2.5269999504089355, 2.526900053024292, 2.526099920272827, 2.4986000061035156, 2.449700117111206, 2.4507999420166016, 2.5095999240875244, 2.4767000675201416, 2.3310999870300293, 2.1043999195098877, 2.260999917984009, 2.390899896621704, 2.345099925994873, 1.830899953842163, 1.718000054359436, 2.049499988555908, 1.8805999755859375, 2.0171000957489014, 2.0546998977661133, 1.9694000482559204, 1.9026000499725342, 2.0141000747680664, 1.6618000268936157, 1.9522000551223755, 1.7516000270843506, 1.1319999694824219, 1.6973999738693237, 1.3797999620437622, 1.1074999570846558, 1.30649995803833, 1.3229000568389893, 0.4544000029563904, 0.39160001277923584, 1.2115000486373901, 0.9824000000953674, -0.3140999972820282, 0.1941000074148178, 2.65310001373291, 2.652400016784668, 2.649899959564209, 2.649399995803833, 2.648699998855591, 2.648699998855591, 2.648400068283081, 2.647900104522705, 2.647900104522705, 2.646699905395508, 2.645699977874756, 2.6454999446868896, 2.6454999446868896, 2.6452999114990234, 2.6449999809265137, 2.6445999145507812, 2.6445000171661377, 2.643399953842163, 2.643199920654297, 2.643199920654297, 2.6431000232696533, 2.6431000232696533, 2.6428000926971436, 2.6428000926971436, 2.6428000926971436, 2.6428000926971436, 2.6422998905181885, 2.6421000957489014, 2.641900062561035, 2.641400098800659, 2.6357998847961426, 2.583400011062622, 2.539099931716919, 2.5448999404907227, 2.508699893951416, 2.5471999645233154, 2.4651999473571777, 2.5882999897003174, 2.606600046157837, 2.528700113296509, 2.5971999168395996, 2.5181000232696533, 2.36680006980896, 2.4700000286102295, 2.364500045776367, 2.388400077819824, 2.2539000511169434, 2.546600103378296, 1.9606000185012817, 2.436800003051758, 1.7418999671936035, 1.7598999738693237, 1.6059000492095947, 2.1031999588012695, 2.1456000804901123, 2.023200035095215, 1.0397000312805176, 1.5461000204086304, 2.093899965286255, 0.7099999785423279, 1.1995999813079834, 0.8399999737739563, 1.422700047492981, 1.3033000230789185, -0.013100000098347664, -0.15240000188350677, 0.4366999864578247, 0.745199978351593, 0.510200023651123, -0.03449999913573265, -0.1454000025987625, 0.10090000182390213, 2.7216999530792236, 2.72160005569458, 2.7202000617980957, 2.7193000316619873, 2.718899965286255, 2.7188000679016113, 2.718600034713745, 2.7181999683380127, 2.717600107192993, 2.7172000408172607, 2.717099905014038, 2.7170000076293945, 2.7167999744415283, 2.716599941253662, 2.7165000438690186, 2.716399908065796, 2.7163000106811523, 2.7160000801086426, 2.71589994430542, 2.715399980545044, 2.715100049972534, 2.714900016784668, 2.7146999835968018, 2.7146999835968018, 2.7146999835968018, 2.714600086212158, 2.713900089263916, 2.713099956512451, 2.7130000591278076, 2.7126998901367188, 2.711699962615967, 2.710099935531616, 2.6603000164031982, 2.686300039291382, 2.523400068283081, 2.6849000453948975, 2.668600082397461, 2.6435000896453857, 2.673799991607666, 2.3148999214172363, 2.286799907684326, 2.4772000312805176, 2.259200096130371, 2.3819000720977783, 2.3366000652313232, 2.3770999908447266, 2.359499931335449, 2.3308000564575195, 2.299299955368042, 2.5445001125335693, 2.2544000148773193, 2.1686999797821045, 1.978600025177002, 1.773300051689148, 0.8248000144958496, 1.8695000410079956, 1.7740000486373901, 1.873900055885315, 1.5987000465393066, 0.6425999999046326, 0.05000000074505806, 1.1670000553131104, 0.04839999973773956], \"logprob\": [30.0, 29.0, 28.0, 27.0, 26.0, 25.0, 24.0, 23.0, 22.0, 21.0, 20.0, 19.0, 18.0, 17.0, 16.0, 15.0, 14.0, 13.0, 12.0, 11.0, 10.0, 9.0, 8.0, 7.0, 6.0, 5.0, 4.0, 3.0, 2.0, 1.0, -4.882199764251709, -5.374499797821045, -5.914400100708008, -5.995299816131592, -6.022299766540527, -6.139200210571289, -6.162799835205078, -6.240099906921387, -6.430099964141846, -6.431300163269043, -6.4481000900268555, -6.517099857330322, -6.532599925994873, -5.713200092315674, -6.713799953460693, -6.680600166320801, -6.725599765777588, -6.80109977722168, -6.786600112915039, -6.832300186157227, -6.872700214385986, -6.892399787902832, -6.929500102996826, -6.946300029754639, -6.952899932861328, -6.963099956512451, -6.981100082397461, -7.000899791717529, -7.207600116729736, -7.210000038146973, -6.230899810791016, -6.464200019836426, -5.641499996185303, -6.496399879455566, -5.325099945068359, -6.250899791717529, -4.987599849700928, -6.652400016784668, -5.7866997718811035, -5.463200092315674, -5.974699974060059, -5.600100040435791, -6.321100234985352, -6.075300216674805, -4.164999961853027, -6.055200099945068, -5.059800148010254, -4.702600002288818, -5.730299949645996, -4.607699871063232, -5.853899955749512, -5.873799800872803, -5.070400238037109, -5.449900150299072, -5.1554999351501465, -5.1855998039245605, -5.401899814605713, -5.638400077819824, -5.808599948883057, -5.481299877166748, -5.3383002281188965, -5.733500003814697, -5.481500148773193, -5.7484002113342285, -5.736800193786621, -5.668000221252441, -5.838200092315674, -4.753300189971924, -5.165999889373779, -5.369900226593018, -5.967899799346924, -5.506999969482422, -6.253600120544434, -6.323699951171875, -6.35129976272583, -6.450500011444092, -6.612100124359131, -6.622200012207031, -6.675099849700928, -6.678599834442139, -6.653600215911865, -6.823699951171875, -6.845600128173828, -6.909299850463867, -6.933800220489502, -6.952300071716309, -7.013199806213379, -7.014999866485596, -6.98859977722168, -7.004700183868408, -7.095900058746338, -7.135300159454346, -7.196100234985352, -7.264999866485596, -7.2606000900268555, -7.272200107574463, -6.650000095367432, -4.354899883270264, -5.3043999671936035, -5.513999938964844, -5.460400104522705, -6.571499824523926, -6.394000053405762, -5.218299865722656, -5.284299850463867, -6.085599899291992, -6.298299789428711, -6.320799827575684, -5.9166998863220215, -5.550000190734863, -6.38100004196167, -5.966000080108643, -5.768099784851074, -4.58519983291626, -6.354599952697754, -5.545199871063232, -5.00629997253418, -5.991600036621094, -5.504700183868408, -5.3028998374938965, -5.598199844360352, -5.393599987030029, -5.41349983215332, -5.011899948120117, -4.543399810791016, -5.440800189971924, -5.635000228881836, -4.891900062561035, -5.127299785614014, -5.315899848937988, -5.143700122833252, -5.407100200653076, -5.2895002365112305, -5.402100086212158, -5.500899791717529, -5.3927998542785645, -5.484099864959717, -5.540599822998047, -5.625400066375732, -5.695799827575684, -6.301300048828125, -6.148200035095215, -6.662399768829346, -6.764100074768066, -6.801199913024902, -6.842599868774414, -6.940400123596191, -6.960299968719482, -7.102200031280518, -7.246399879455566, -7.256100177764893, -7.317500114440918, -7.3225998878479, -7.335999965667725, -7.383800029754639, -7.423299789428711, -7.511600017547607, -7.533400058746338, -7.552299976348877, -7.52400016784668, -7.672999858856201, -7.679500102996826, -7.730100154876709, -7.745500087738037, -7.829500198364258, -7.829899787902832, -7.832900047302246, -7.836999893188477, -5.795100212097168, -7.8125, -6.699900150299072, -5.167600154876709, -6.002200126647949, -5.733699798583984, -4.740300178527832, -5.880899906158447, -6.10129976272583, -5.969099998474121, -5.160900115966797, -6.678699970245361, -5.234300136566162, -5.997900009155273, -5.223100185394287, -5.309899806976318, -4.928400039672852, -6.041500091552734, -5.117800235748291, -4.515200138092041, -4.7032999992370605, -5.03980016708374, -4.662199974060059, -5.71019983291626, -5.6722002029418945, -5.348400115966797, -4.901500225067139, -5.117700099945068, -5.128900051116943, -4.952400207519531, -5.177800178527832, -5.201499938964844, -5.495699882507324, -5.51609992980957, -5.6367998123168945, -5.026400089263916, -5.65910005569458, -5.4980998039245605, -5.430799961090088, -5.4899001121521, -5.445300102233887, -5.597400188446045, -5.629899978637695, -5.628900051116943, -5.063899993896484, -6.070400238037109, -6.309800148010254, -6.3907999992370605, -6.395899772644043, -6.473999977111816, -6.618800163269043, -6.7153000831604, -6.723800182342529, -6.781499862670898, -6.766499996185303, -5.94320011138916, -6.934599876403809, -7.006800174713135, -7.021900177001953, -7.065999984741211, -7.116600036621094, -7.1203999519348145, -7.1356000900268555, -7.191699981689453, -7.2342000007629395, -5.584799766540527, -7.332799911499023, -7.412700176239014, -7.42519998550415, -7.191299915313721, -7.507500171661377, -7.5081000328063965, -7.56879997253418, -7.589399814605713, -6.187300205230713, -6.0883002281188965, -4.949900150299072, -6.490799903869629, -5.281499862670898, -5.921500205993652, -4.572700023651123, -5.73799991607666, -5.423999786376953, -5.467400074005127, -5.894899845123291, -6.571000099182129, -5.354100227355957, -4.242700099945068, -4.984099864959717, -5.727200031280518, -5.379000186920166, -5.3383002281188965, -4.232699871063232, -5.212600231170654, -5.309599876403809, -6.185999870300293, -5.68149995803833, -5.6529998779296875, -4.570099830627441, -5.377799987792969, -4.806000232696533, -4.966400146484375, -5.1168999671936035, -4.681700229644775, -5.565299987792969, -4.904900074005127, -5.4120001792907715, -5.2144999504089355, -5.293900012969971, -5.325399875640869, -5.288099765777588, -5.44320011138916, -5.561200141906738, -5.525400161743164, -6.017399787902832, -6.459199905395508, -6.554100036621094, -6.177000045776367, -6.7220001220703125, -6.895100116729736, -6.903600215911865, -5.435500144958496, -6.782800197601318, -7.031599998474121, -7.093900203704834, -7.136499881744385, -7.1616997718811035, -7.162600040435791, -7.181000232696533, -6.083799839019775, -7.304900169372559, -7.343400001525879, -7.348599910736084, -7.369699954986572, -7.401000022888184, -7.41349983215332, -7.497000217437744, -7.502200126647949, -7.513800144195557, -7.516499996185303, -7.521500110626221, -7.535600185394287, -7.5441999435424805, -7.55109977722168, -5.597400188446045, -5.7683000564575195, -6.349699974060059, -6.095099925994873, -6.504499912261963, -6.050600051879883, -6.671199798583984, -6.494999885559082, -5.345600128173828, -4.648399829864502, -4.356599807739258, -6.17140007019043, -5.94320011138916, -5.763000011444092, -6.377099990844727, -6.164899826049805, -6.436299800872803, -5.794899940490723, -6.502699851989746, -5.310500144958496, -6.0553998947143555, -5.515200138092041, -5.35230016708374, -5.60129976272583, -6.164999961853027, -4.837200164794922, -4.860099792480469, -5.854800224304199, -5.8242998123168945, -5.942299842834473, -5.11929988861084, -4.981500148773193, -5.545599937438965, -5.661200046539307, -5.696599960327148, -5.682400226593018, -5.589000225067139, -5.571599960327148, -5.62470006942749, -5.624100208282471, -5.744900226593018, -5.708799839019775, -5.770199775695801, -5.910600185394287, -5.906000137329102, -5.388000011444092, -4.97730016708374, -5.809100151062012, -5.883299827575684, -6.095799922943115, -6.528900146484375, -6.915599822998047, -7.037899971008301, -6.993800163269043, -7.081099987030029, -7.107399940490723, -7.218400001525879, -7.237599849700928, -7.257500171661377, -7.2804999351501465, -7.362400054931641, -7.387899875640869, -7.4105000495910645, -7.4207000732421875, -7.450399875640869, -7.463500022888184, -7.480199813842773, -7.480000019073486, -7.519499778747559, -7.536099910736084, -7.539700031280518, -7.541999816894531, -7.6118998527526855, -7.619999885559082, -7.1971001625061035, -5.447000026702881, -5.146599769592285, -5.984499931335449, -6.154799938201904, -5.329599857330322, -6.46150016784668, -6.9243998527526855, -5.44290018081665, -5.820099830627441, -7.303299903869629, -6.218299865722656, -5.551400184631348, -6.050899982452393, -6.115699768066406, -6.45389986038208, -6.50540018081665, -5.731599807739258, -5.35699987411499, -5.955699920654297, -5.418099880218506, -6.295400142669678, -5.906899929046631, -6.03879976272583, -5.660900115966797, -5.357600212097168, -4.576000213623047, -6.046299934387207, -5.535999774932861, -5.82480001449585, -4.986599922180176, -5.956099987030029, -5.39900016784668, -5.295400142669678, -5.342700004577637, -5.166399955749512, -5.351200103759766, -5.513000011444092, -5.395500183105469, -5.363999843597412, -5.460100173950195, -5.502299785614014, -5.614999771118164, -5.730199813842773, -5.740499973297119, -5.725100040435791, -5.77209997177124, -5.916200160980225, -6.203800201416016, -6.205599784851074, -6.309999942779541, -6.57480001449585, -6.602399826049805, -6.702899932861328, -6.705100059509277, -6.802800178527832, -6.820400238037109, -6.838099956512451, -6.872300148010254, -6.866399765014648, -5.8531999588012695, -6.912700176239014, -6.946300029754639, -6.9471001625061035, -6.961400032043457, -6.976600170135498, -6.990600109100342, -7.022799968719482, -7.031899929046631, -6.214600086212158, -7.107999801635742, -7.111999988555908, -7.125100135803223, -7.150100231170654, -7.1504998207092285, -7.16379976272583, -7.183000087738037, -5.0954999923706055, -6.145999908447266, -5.829899787902832, -6.146999835968018, -6.287600040435791, -5.656300067901611, -6.222400188446045, -5.499899864196777, -6.05810022354126, -6.175099849700928, -6.523399829864502, -6.176700115203857, -5.816299915313721, -6.7428998947143555, -6.06220006942749, -5.412899971008301, -5.721799850463867, -4.644899845123291, -5.347899913787842, -4.7179999351501465, -5.152400016784668, -5.967599868774414, -5.999100208282471, -5.628600120544434, -5.627799987792969, -5.966800212860107, -5.143700122833252, -5.252600193023682, -5.252600193023682, -5.163899898529053, -5.8053998947143555, -5.447700023651123, -5.619100093841553, -5.710599899291992, -5.69189977645874, -5.749000072479248, -5.70359992980957, -5.710599899291992, -5.674900054931641, -5.8471999168396, -5.911399841308594, -5.9029998779296875, -4.351600170135498, -5.3572998046875, -5.516900062561035, -5.445400238037109, -5.866499900817871, -5.999599933624268, -6.178400039672852, -6.39169979095459, -6.408699989318848, -6.450099945068359, -4.750800132751465, -6.572500228881836, -6.60129976272583, -6.676599979400635, -6.698999881744385, -6.645400047302246, -6.8256001472473145, -6.853000164031982, -6.371300220489502, -6.9558000564575195, -6.956299781799316, -6.978799819946289, -6.988800048828125, -7.013700008392334, -6.946000099182129, -7.128799915313721, -7.146599769592285, -7.2179999351501465, -7.229000091552734, -7.287799835205078, -4.95959997177124, -4.533999919891357, -5.435999870300293, -6.94350004196167, -6.648799896240234, -5.456600189208984, -4.546800136566162, -5.6230998039245605, -6.371500015258789, -6.284299850463867, -4.621500015258789, -4.631499767303467, -5.618000030517578, -5.259300231933594, -5.611199855804443, -5.697000026702881, -5.560400009155273, -5.549799919128418, -5.781899929046631, -5.357699871063232, -5.821599960327148, -5.603300094604492, -5.048399925231934, -5.6143999099731445, -5.34499979019165, -5.15939998626709, -5.414700031280518, -5.561200141906738, -5.336999893188477, -5.3649001121521, -5.582699775695801, -5.557499885559082, -5.554999828338623, -5.589600086212158, -5.306000232696533, -5.590199947357178, -6.189599990844727, -6.274400234222412, -6.389599800109863, -6.389500141143799, -6.435200214385986, -6.504300117492676, -6.507500171661377, -6.6519999504089355, -6.760200023651123, -6.632599830627441, -6.781199932098389, -6.806099891662598, -6.833499908447266, -6.872200012207031, -6.879899978637695, -6.9542999267578125, -6.990300178527832, -6.370100021362305, -6.994999885559082, -6.997000217437744, -5.59689998626709, -7.023399829864502, -7.023399829864502, -7.025400161743164, -7.065000057220459, -7.035699844360352, -7.0879998207092285, -7.124899864196777, -6.369200229644775, -5.4944000244140625, -5.081399917602539, -5.257400035858154, -5.519999980926514, -6.0345001220703125, -5.214099884033203, -6.502200126647949, -6.671199798583984, -6.0482001304626465, -6.612400054931641, -6.098800182342529, -5.285799980163574, -5.903200149536133, -5.553400039672852, -5.670000076293945, -5.394599914550781, -6.484300136566162, -5.22599983215332, -6.290200233459473, -5.123600006103516, -5.187600135803223, -4.965199947357178, -5.832200050354004, -5.899400234222412, -5.825500011444092, -5.028299808502197, -5.555200099945068, -6.0192999839782715, -5.151199817657471, -5.456500053405762, -5.453000068664551, -5.76200008392334, -5.762700080871582, -5.408999919891357, -5.3933000564575195, -5.599400043487549, -5.662700176239014, -5.7164998054504395, -5.688399791717529, -5.706200122833252, -5.737599849700928, -4.496799945831299, -4.617499828338623, -5.374000072479248, -5.655700206756592, -5.768099784851074, -5.807300090789795, -5.857600212097168, -5.942200183868408, -6.054900169372559, -6.128300189971924, -6.153299808502197, -6.173099994659424, -6.179500102996826, -6.234899997711182, -6.258200168609619, -6.203199863433838, -6.280900001525879, -6.3358001708984375, -6.345300197601318, -6.419400215148926, -6.450300216674805, -6.476099967956543, -6.50439977645874, -6.50600004196167, -6.509799957275391, -6.446499824523926, -6.600800037384033, -6.6890997886657715, -6.702099800109863, -6.729800224304199, -5.840000152587891, -6.20389986038208, -4.364299774169922, -6.039400100708008, -3.9937000274658203, -6.145199775695801, -5.97130012512207, -5.824900150299072, -6.168600082397461, -4.063600063323975, -4.401299953460693, -5.480899810791016, -4.791800022125244, -5.240699768066406, -5.105299949645996, -5.286499977111816, -5.36359977722168, -5.348800182342529, -5.300000190734863, -5.866099834442139, -5.378200054168701, -5.480899810791016, -5.417900085449219, -5.409200191497803, -4.829100131988525, -5.538000106811523, -5.578700065612793, -5.704500198364258, -5.638400077819824, -5.4253997802734375, -5.345900058746338, -5.65749979019165, -5.737199783325195]}, \"token.table\": {\"Topic\": [1, 2, 3, 4, 5, 6, 8, 9, 10, 3, 4, 5, 6, 7, 8, 4, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 1, 3, 5, 8, 1, 2, 3, 5, 8, 1, 5, 8, 9, 5, 3, 8, 7, 4, 1, 2, 5, 6, 7, 8, 9, 10, 2, 3, 4, 5, 6, 7, 8, 10, 3, 8, 1, 6, 9, 2, 4, 5, 2, 3, 4, 5, 8, 1, 10, 1, 3, 4, 8, 1, 1, 2, 3, 5, 6, 7, 8, 9, 1, 6, 8, 9, 10, 1, 1, 1, 3, 5, 6, 6, 2, 2, 2, 1, 2, 6, 8, 9, 10, 5, 1, 2, 3, 4, 8, 2, 3, 4, 5, 6, 7, 3, 5, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 1, 1, 1, 3, 9, 4, 5, 7, 1, 3, 4, 5, 6, 7, 8, 9, 10, 7, 10, 7, 1, 8, 6, 7, 1, 2, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 1, 3, 7, 8, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 2, 2, 5, 6, 2, 5, 3, 4, 4, 9, 7, 1, 3, 4, 5, 7, 8, 9, 10, 10, 8, 1, 2, 3, 4, 5, 6, 7, 9, 6, 5, 6, 7, 10, 10, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 1, 4, 5, 6, 7, 3, 4, 8, 4, 6, 4, 5, 1, 3, 4, 5, 6, 7, 8, 9, 10, 8, 9, 9, 10, 5, 6, 4, 6, 7, 8, 10, 9, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 9, 7, 2, 1, 2, 3, 4, 5, 6, 7, 8, 9, 6, 4, 4, 9, 1, 2, 3, 5, 8, 9, 4, 7, 8, 9, 1, 2, 1, 2, 1, 2, 5, 4, 8, 3, 4, 7, 8, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 8, 1, 2, 3, 8, 10, 6, 7, 10, 3, 4, 4, 9, 1, 5, 6, 8, 7, 8, 7, 10, 2, 3, 4, 6, 7, 8, 1, 2, 3, 4, 7, 10, 2, 3, 4, 5, 6, 7, 8, 10, 1, 4, 6, 7, 10, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 2, 3, 4, 5, 6, 7, 8, 9, 3, 4, 7, 9, 6, 4, 2, 9, 10, 3, 1, 3, 4, 5, 6, 7, 8, 9, 10, 1, 2, 3, 4, 6, 7, 8, 3, 1, 3, 4, 5, 6, 7, 8, 9, 6, 1, 4, 5, 6, 8, 9, 10, 1, 2, 6, 8, 10, 1, 6, 8, 8, 8, 8, 8, 4, 7, 10, 9, 2, 6, 2, 3, 4, 6, 7, 8, 9, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 1, 4, 6, 8, 1, 2, 4, 6, 9, 10, 8, 8, 5, 1, 2, 3, 4, 5, 6, 7, 8, 9, 3, 10, 3, 4, 7, 8, 4, 9, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 3, 3, 4, 8, 9, 3, 4, 8, 1, 2, 3, 4, 5, 9, 10, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 2, 1, 3, 4, 5, 6, 7, 8, 9, 10, 5, 1, 6, 9, 2, 7, 1, 2, 4, 5, 6, 7, 9, 10, 4, 5, 6, 8, 10, 3, 5, 9, 1, 7, 9, 1, 2, 3, 5, 7, 9, 10, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 9, 4, 1, 2, 3, 4, 5, 6, 7, 10, 8, 1, 2, 6, 8, 10, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 5, 3, 4, 8, 10, 8, 4, 10, 1, 2, 9, 3, 4, 1, 1, 2, 6, 8, 9, 10, 1, 2, 3, 4, 5, 7, 8, 9, 10, 1, 2, 7, 8, 1, 5, 6, 8, 1, 3, 4, 8, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 6, 6, 1, 3, 5, 9, 3, 4, 5, 10, 7, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 3, 4, 1, 2, 5, 9, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 2, 3, 4, 8, 9, 2, 6, 10, 6, 9, 1, 2, 3, 4, 8, 9, 5, 6, 8, 9, 10, 2, 4, 7, 10, 7, 10, 7, 9, 1, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 1, 2, 3, 5, 8, 10, 2, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 4, 9, 2, 1, 5, 6, 8, 3, 3, 4, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 1, 3, 1, 2, 3, 1, 2, 5, 6, 7, 8, 9, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 8, 1, 6, 9, 5, 8, 3, 6, 8, 6, 7, 9, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 1, 2, 4, 5, 6, 7, 8, 9, 10, 6, 1, 5, 8, 9, 1, 2, 5, 7, 5, 6, 7, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 5, 10, 7, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 1, 5, 6, 7, 9, 1, 7, 10, 1, 2, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 9, 8, 6, 7, 6, 5, 1, 6, 6, 1, 2, 3, 4, 5, 6, 7, 9, 1, 2, 3, 4, 8, 6, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 2, 3, 4, 7, 8, 9, 9, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 7, 9, 10, 7, 3, 4, 5, 7, 8, 5, 6, 9, 10, 9, 4, 2, 3, 4, 6, 7, 8, 9, 10, 5, 8, 1, 1, 2, 10, 1, 2, 10, 2, 10, 2, 4, 7, 9, 7, 2, 4, 5, 6, 7, 9, 10, 2, 5, 10, 1, 2, 10, 3, 5, 6, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 4, 7, 5, 3, 3, 8, 1, 2, 3, 6, 7, 9, 10, 1, 7, 3, 7, 5, 3, 5, 10, 10, 7, 10, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 10, 10, 1, 2, 3, 4, 6, 7, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 1, 2, 5, 6, 7, 8, 9, 10, 2, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 7, 1, 2, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 1, 2, 4, 5, 6, 7, 9, 10, 3, 5, 8, 1, 3, 4, 5, 6, 8, 9, 10, 3, 6, 2, 3, 4, 6, 7, 8, 9, 10, 3, 4, 3, 5, 1, 2, 1, 4, 10, 5, 3, 4, 10, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 1, 3, 7, 8, 9, 1, 4, 8, 9, 4, 1, 2, 3, 4, 5, 7, 10, 1, 2, 3, 4, 5, 6, 7, 8, 10, 7, 1, 5, 7, 9, 9, 2, 4, 6, 9, 1, 8, 1, 2, 3, 5, 5, 2, 3, 4, 7, 8, 9, 3, 4, 8, 1, 2, 4, 5, 6, 8, 9, 10, 4, 5, 8, 4, 10, 2, 3, 5, 1, 2, 1, 4, 3, 6, 1, 3, 4, 1, 2, 6, 1, 2, 3, 5, 7, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 1, 8, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 2, 4, 6, 7, 8, 9, 3, 8, 7, 5, 4, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 3, 6, 8, 3, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 10, 5, 3, 5, 6, 7, 3, 4, 8, 1, 3, 4, 5, 6, 7, 10, 1, 2, 4, 7, 9, 10, 2, 8, 9, 2, 9, 10, 10, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 1, 2, 3, 5, 6, 7, 8, 9, 10, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 1, 2, 3, 4, 6, 7, 8, 9, 6, 9, 6, 5, 7, 7, 7, 9, 10, 8, 9, 10, 3, 1, 2, 4, 5, 6, 7, 8, 10, 7, 10, 10, 5, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 1, 2, 5, 6, 8, 10, 3, 1, 8, 9, 10, 3, 4, 8, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 4, 1, 5, 8, 10, 1, 2, 3, 4, 5, 6, 7, 1, 2, 3, 9, 3, 4, 7, 1, 8, 1, 2, 3, 4, 5, 6, 8, 3, 5, 6, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 2, 3, 4, 5, 8, 9, 3, 5, 7, 8, 9, 2, 2, 2, 3, 5, 8, 9, 10, 1, 3, 4, 5, 6, 7, 8, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 3, 4, 8, 10, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 3, 5, 10, 6, 5, 10, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 3, 8, 5, 3, 1, 2, 1, 2, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 1, 2, 3, 4, 5, 9, 7, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 2, 2, 7, 5, 6, 5, 6, 6, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 8, 1, 3, 5, 6, 7, 8, 9, 6, 1, 3, 5, 6, 7, 9, 10, 9, 1, 2, 4, 9, 10, 7, 5, 1, 2, 3, 4, 5, 6, 7, 10, 2, 7, 8, 2, 3, 4, 5, 6, 7, 2, 2, 3, 5, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 2, 3, 4, 8, 9, 2, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 2, 3, 5, 8, 9, 7, 10, 1, 2, 3, 4, 7, 9, 10, 3, 4, 8, 10, 2, 4, 1, 7, 7, 10, 1, 7, 8, 1, 6, 8, 10, 10, 1, 3, 4, 5, 6, 7, 8, 10, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 1, 1, 3, 4, 5, 1, 6, 10, 6, 3, 5, 4, 2, 2, 9, 3, 1, 1, 9, 10, 1, 2, 3, 4, 5, 6, 7, 10, 6, 2, 3, 4, 5, 6, 7, 8, 9, 10, 3, 5, 10, 1, 10, 2, 1, 2, 3, 4, 5, 7, 8, 9, 10, 1, 3, 4, 5, 8, 3, 5, 4, 5, 7, 4, 5, 6, 7, 8, 5, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 9, 1, 2, 5, 5, 1, 3, 4, 5, 6, 7, 8, 10, 3, 7, 10, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 7, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 1, 3, 4, 5, 6, 7, 8, 10, 8, 2, 3, 4, 6, 7, 8, 9, 10, 9, 5, 9, 8, 1, 2, 3, 5, 6, 8, 9, 10, 3, 9, 8, 4, 4, 9, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 8, 1, 2, 3, 5, 6, 3, 5, 7, 8, 10, 1, 2, 3, 4, 5, 6, 7, 8, 9, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 6, 2, 3, 4, 5, 6, 7, 8, 9, 2, 1, 2, 3, 4, 5, 6, 7, 9, 10, 2, 5, 2, 1, 2, 3, 6, 8, 9, 9, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 6, 4, 7, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 4, 5, 6, 7, 10, 3, 3, 4, 5, 7, 10, 1, 9, 1, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 6, 1, 2, 6, 9, 10, 1, 1, 1, 3, 2, 6, 7, 5, 7, 1, 2, 3, 4, 5, 6, 7, 9, 2, 4, 7, 5, 3, 4, 1, 4, 6, 7, 3, 4, 6, 8, 3, 6, 10, 6, 1, 5, 6, 8, 2, 1, 2, 3, 4, 5, 6, 7, 8, 10, 4, 8, 1, 3, 4, 8, 1, 10, 2, 3, 5, 6, 7, 8, 10, 3, 7, 7, 4, 1, 6, 6, 7, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 1, 2, 5, 7, 9, 1, 6, 7, 3, 5, 3, 1, 3, 4, 1, 5, 8, 9, 10, 5, 10, 3, 5, 7, 8, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 1, 2, 3, 3, 3, 3, 6, 7, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 9, 5, 1], \"Freq\": [0.14599277079105377, 0.5233890414237976, 0.1291092485189438, 0.04965740442276001, 0.007945184595882893, 0.0228424072265625, 0.06554777175188065, 0.034760184586048126, 0.018869813531637192, 0.40388476848602295, 0.19605383276939392, 0.17180688679218292, 0.03325294703245163, 0.0006927697104401886, 0.19328275322914124, 0.9846031665802002, 0.05245577171444893, 0.07400010526180267, 0.536734938621521, 0.18265849351882935, 0.030911436304450035, 0.026227885857224464, 0.03278485685586929, 0.04964563995599747, 0.005620261188596487, 0.008430391550064087, 0.12412907183170319, 0.06308198720216751, 0.19738557934761047, 0.6145406365394592, 0.07897412776947021, 0.027873219922184944, 0.006968304980546236, 0.12775225937366486, 0.7548997402191162, 0.03866958990693092, 0.08217287808656693, 0.004833698738366365, 0.8700657486915588, 0.9959776997566223, 0.3871699571609497, 0.611616313457489, 0.9911239147186279, 0.9901931881904602, 0.339741975069046, 0.014491363428533077, 0.09419386088848114, 0.10063447058200836, 0.004025378730148077, 0.20287908613681793, 0.03300810605287552, 0.21092984080314636, 0.1255313754081726, 0.1266830414533615, 0.06334152072668076, 0.012668304145336151, 0.1739012748003006, 0.03685325011610985, 0.0737065002322197, 0.38695910573005676, 0.9024494886398315, 0.09523336589336395, 0.7508983612060547, 0.053179770708084106, 0.19357436895370483, 0.2244643270969391, 0.7725219130516052, 0.0022788257338106632, 0.025178419426083565, 0.7350161671638489, 0.18786974251270294, 0.011620808392763138, 0.03970443084836006, 0.34418392181396484, 0.6551724076271057, 0.04772055149078369, 0.8044321537017822, 0.03408610820770264, 0.11362035572528839, 0.9980550408363342, 0.061342693865299225, 0.7078946828842163, 0.060115836560726166, 0.01104168500751257, 0.056435275822877884, 0.01349539216607809, 0.01226853858679533, 0.07729179412126541, 0.8129921555519104, 0.14957647025585175, 0.01583750918507576, 0.012318062596023083, 0.007038893178105354, 0.9972012639045715, 0.9993999600410461, 0.8530754446983337, 0.08814063668251038, 0.006295759696513414, 0.050366077572107315, 0.9841410517692566, 0.9973456859588623, 0.9993276596069336, 0.9964157342910767, 0.6340733766555786, 0.02204345166683197, 0.04279023036360741, 0.24118128418922424, 0.03241683915257454, 0.027230145409703255, 0.9963906407356262, 0.14441119134426117, 0.3110394775867462, 0.18713639676570892, 0.061524294316768646, 0.2956584095954895, 0.03075864166021347, 0.016777440905570984, 0.01957368105649948, 0.008388720452785492, 0.897593080997467, 0.025166161358356476, 0.9902084469795227, 0.9816920757293701, 0.00179692218080163, 0.020964091643691063, 0.6175422668457031, 0.1185968667268753, 0.025156911462545395, 0.027552807703614235, 0.00419281842187047, 0.14075890183448792, 0.03174562379717827, 0.012578455731272697, 0.9970781207084656, 0.991834282875061, 0.9971475005149841, 0.9912530779838562, 0.985652506351471, 0.023296672850847244, 0.15142837166786194, 0.8231490850448608, 0.0036856913939118385, 0.012899919413030148, 0.027642685920000076, 0.0202713031321764, 0.007371382787823677, 0.005528537090867758, 0.10319935530424118, 0.750038206577301, 0.06818529218435287, 0.8324562311172485, 0.16555851697921753, 0.9908235669136047, 0.9822887778282166, 0.01671980880200863, 0.05610562115907669, 0.9408481121063232, 0.013237693347036839, 0.9845534563064575, 0.09291166812181473, 0.5883104205131531, 0.0011711554834619164, 0.030840428546071053, 0.05075007304549217, 0.05933854356408119, 0.04801737517118454, 0.04333275184035301, 0.07065971195697784, 0.014053866267204285, 0.009513046592473984, 0.16172178089618683, 0.7933880686759949, 0.03424696624279022, 0.007427247706800699, 0.13071955740451813, 0.0675879493355751, 0.1819675713777542, 0.03936441242694855, 0.10546691715717316, 0.2413855493068695, 0.0193108431994915, 0.07501520216464996, 0.13294772803783417, 0.044248517602682114, 0.11702568829059601, 0.02328869327902794, 0.16127420961856842, 0.1094568595290184, 0.1676785945892334, 0.19795389473438263, 0.022706476971507072, 0.06287947297096252, 0.09315477311611176, 0.9988299608230591, 0.9976599216461182, 0.0013370970264077187, 0.9974744319915771, 0.06177558749914169, 0.9339015483856201, 0.9674123525619507, 0.02764035202562809, 0.9971478581428528, 0.9819605946540833, 0.9899508953094482, 0.030462924391031265, 0.0913887768983841, 0.7326333522796631, 0.048740681260824203, 0.01675460860133171, 0.007615731097757816, 0.012185170315206051, 0.0594027042388916, 0.9949178695678711, 0.9896720051765442, 0.10203135758638382, 0.3764605224132538, 0.37153488397598267, 0.00492565194144845, 0.0014073291094973683, 0.024628259241580963, 0.07318111509084702, 0.04644186049699783, 0.9910803437232971, 0.05556785315275192, 0.9390967488288879, 0.9451965093612671, 0.054721903055906296, 0.9886062741279602, 0.18599478900432587, 0.017521247267723083, 0.20149435102939606, 0.2715793251991272, 0.2008204460144043, 0.013477882370352745, 0.06671551614999771, 0.03571638837456703, 0.0006738941301591694, 0.007412835489958525, 0.01812021993100643, 0.408528596162796, 0.023062098771333694, 0.5271337032318115, 0.023062098771333694, 0.04738995060324669, 0.8909310698509216, 0.056867942214012146, 0.99643874168396, 0.9898231625556946, 0.9916720390319824, 0.9953881502151489, 0.005461225751787424, 0.13243472576141357, 0.04505511373281479, 0.046420421451330185, 0.2047959715127945, 0.13789595663547516, 0.02867143601179123, 0.010922451503574848, 0.38774704933166504, 0.06209086626768112, 0.9313629865646362, 0.9909238219261169, 0.9858328700065613, 0.0370786115527153, 0.9619839787483215, 0.8973691463470459, 0.03992532193660736, 0.04689640924334526, 0.005703617352992296, 0.00887229386717081, 0.9923086762428284, 0.09889670461416245, 0.1410106122493744, 0.05015813559293747, 0.1334395706653595, 0.02886458858847618, 0.20678400993347168, 0.02886458858847618, 0.12918086349964142, 0.1627773493528366, 0.019873978570103645, 0.9937857985496521, 0.9958334565162659, 0.996943473815918, 0.1216258630156517, 0.17698660492897034, 0.045295149087905884, 0.08555750548839569, 0.02432517148554325, 0.09478428959846497, 0.04110115393996239, 0.009226789698004723, 0.4009459316730499, 0.9868890643119812, 0.9969602227210999, 0.9897100329399109, 0.9941675662994385, 0.677937924861908, 0.1326664835214615, 0.02312535233795643, 0.007302742451429367, 0.03773083537817001, 0.1204952523112297, 0.3486194610595703, 0.004738516639918089, 0.6464690566062927, 0.988552987575531, 0.0016638204688206315, 0.99662846326828, 0.013513145036995411, 0.9859398603439331, 0.0026862570084631443, 0.9858563542366028, 0.009401899762451649, 0.9923655986785889, 0.9946200847625732, 0.989805281162262, 0.04953533783555031, 0.9287875890731812, 0.021671710535883904, 0.23079544305801392, 0.4995506703853607, 0.006073564291000366, 0.04631092771887779, 0.00911034643650055, 0.024294257164001465, 0.01973908394575119, 0.05238449200987816, 0.08199311792850494, 0.029608625918626785, 0.9904960989952087, 0.01607571542263031, 0.03215143084526062, 0.008037857711315155, 0.9404293298721313, 0.997140645980835, 0.8349259495735168, 0.03578253835439682, 0.1272268146276474, 0.9408413767814636, 0.05612974241375923, 0.0071846735663712025, 0.9843003153800964, 0.12218707799911499, 0.3213067650794983, 0.027152683585882187, 0.5279688239097595, 0.006376017350703478, 0.9933834671974182, 0.049458786845207214, 0.9496087431907654, 0.047002773731946945, 0.6893740296363831, 0.03916897997260094, 0.0019584489054977894, 0.007833795621991158, 0.2134709358215332, 0.0193931944668293, 0.003062083153054118, 0.16433179378509521, 0.7624587416648865, 0.04797263815999031, 0.003062083153054118, 0.02497788891196251, 0.014050062745809555, 0.02653900720179081, 0.014050062745809555, 0.27007344365119934, 0.5214134454727173, 0.11708385497331619, 0.012488944455981255, 0.08583952486515045, 0.1502191573381424, 0.0071532935835421085, 0.04470808431506157, 0.711752712726593, 0.2507212460041046, 0.22157453000545502, 0.014573357999324799, 0.11628945171833038, 0.07137971371412277, 0.06989263743162155, 0.13056538999080658, 0.03212087228894234, 0.04104333743453026, 0.0514528788626194, 0.010484830476343632, 0.19527997076511383, 0.12319675832986832, 0.07863622903823853, 0.011795434169471264, 0.146787628531456, 0.4298780560493469, 0.001310603809542954, 0.8896723985671997, 0.08087930828332901, 0.008366825059056282, 0.019522590562701225, 0.977303683757782, 0.9920732378959656, 0.9853165745735168, 0.007978271692991257, 0.003989135846495628, 0.9936932921409607, 0.14128343760967255, 0.02913627400994301, 0.4518871307373047, 0.04947669059038162, 0.1335870623588562, 0.010994820855557919, 0.11489587277173996, 0.06212073564529419, 0.007696374319493771, 0.011459052562713623, 0.05500345304608345, 0.5695149302482605, 0.21772199869155884, 0.06990022212266922, 0.01031314767897129, 0.06531660258769989, 0.9912104606628418, 0.009855405427515507, 0.06208905577659607, 0.14191783964633942, 0.5105100274085999, 0.18232500553131104, 0.03153729811310768, 0.030551757663488388, 0.03153729811310768, 0.9839151501655579, 0.7062051892280579, 0.005525862332433462, 0.075151726603508, 0.1193586215376854, 0.075151726603508, 0.001105172443203628, 0.018787931650877, 0.2933255136013031, 0.04784742370247841, 0.10401614010334015, 0.5554461479187012, 0.9976659417152405, 0.3253612518310547, 0.5731831192970276, 0.10034505277872086, 0.9918471574783325, 0.9958798289299011, 0.9921985268592834, 0.996331512928009, 0.9902531504631042, 0.9943678975105286, 0.9963338971138, 0.9940438866615295, 0.11340337246656418, 0.8845463395118713, 0.0030282640364021063, 0.4754374623298645, 0.26406463980674744, 0.01635262556374073, 0.0042395698837935925, 0.21076717972755432, 0.02604307048022747, 0.10128828883171082, 0.11214060336351395, 0.11756675690412521, 0.07717202603816986, 0.001205812906846404, 0.1917242556810379, 0.20739983022212982, 0.08802434056997299, 0.06812842935323715, 0.03557148203253746, 0.9976046681404114, 0.11456617712974548, 0.7665022611618042, 0.12002170830965042, 0.5816272497177124, 0.2825830578804016, 0.013717624358832836, 0.09327984601259232, 0.02469172328710556, 0.004115287214517593, 0.9915045499801636, 0.9917834401130676, 0.9875321984291077, 0.00699492497369647, 0.0029978249222040176, 0.24482236802577972, 0.12191154807806015, 0.29578539729118347, 0.11291807144880295, 0.044967375695705414, 0.12990574538707733, 0.03897172585129738, 0.9954027533531189, 0.9975415468215942, 0.009578007273375988, 0.47479552030563354, 0.061572905629873276, 0.45427119731903076, 0.9948511719703674, 0.992047905921936, 0.04472225159406662, 0.2554924786090851, 0.0859021469950676, 0.18685930967330933, 0.07793184369802475, 0.13460955023765564, 0.03143841400742531, 0.04250828176736832, 0.11689776927232742, 0.02302531898021698, 0.9797205924987793, 0.767796516418457, 0.20836955308914185, 0.02264886535704136, 0.9965404272079468, 0.01270527858287096, 0.9489865899085999, 0.03713850677013397, 0.011915587820112705, 0.013107147067785263, 0.6053118705749512, 0.3467436134815216, 0.010724029503762722, 0.0011915587820112705, 0.010724029503762722, 0.0513325035572052, 0.014807452447712421, 0.2053300142288208, 0.1796637624502182, 0.05429399386048317, 0.1451130360364914, 0.1757151037454605, 0.10299406200647354, 0.049358174204826355, 0.021388541907072067, 0.9929736256599426, 0.005768895614892244, 0.08797565847635269, 0.012980015017092228, 0.01586446352303028, 0.1543179601430893, 0.18604688346385956, 0.09518677741289139, 0.01586446352303028, 0.42545607686042786, 0.9891993999481201, 0.13151773810386658, 0.0026840355712920427, 0.8642594814300537, 0.994596004486084, 0.9892116785049438, 0.0337333120405674, 0.006064415909349918, 0.7466812133789062, 0.015161039307713509, 0.18534371256828308, 0.010991753078997135, 0.0007580519886687398, 0.0011370779247954488, 0.7883397936820984, 0.004197762347757816, 0.19729484617710114, 0.004197762347757816, 0.005876867566257715, 0.004379556514322758, 0.9941593408584595, 0.9937857985496521, 0.03518718108534813, 0.9632490873336792, 0.9963637590408325, 0.002751182531937957, 0.29987889528274536, 0.09078902006149292, 0.6052601337432861, 0.0013755912659689784, 0.0013755912659689784, 0.9969372153282166, 0.042788878083229065, 0.06828012317419052, 0.05462409928441048, 0.022760041058063507, 0.07192172855138779, 0.0782945454120636, 0.06463851779699326, 0.18116992712020874, 0.408770352602005, 0.008193614892661572, 0.9924702644348145, 0.9913032054901123, 0.0025874855928122997, 0.007762456778436899, 0.5847717523574829, 0.2613360285758972, 0.0008624952170066535, 0.05519969388842583, 0.07331208884716034, 0.013799923472106457, 0.9995120763778687, 0.03260944411158562, 0.011646230705082417, 0.01630472205579281, 0.9130644798278809, 0.025621706619858742, 0.006279796827584505, 0.027910208329558372, 0.10187225788831711, 0.2023490071296692, 0.2979414761066437, 0.24491208791732788, 0.037678781896829605, 0.039772048592567444, 0.016746126115322113, 0.02511918731033802, 0.9942708015441895, 0.15898235142230988, 0.837565541267395, 0.0025850788224488497, 0.9930786490440369, 0.9989667534828186, 0.9820688366889954, 0.994400143623352, 0.014143766835331917, 0.9087370038032532, 0.07425477355718613, 0.9898928999900818, 0.9895271062850952, 0.9944542050361633, 0.09428336471319199, 0.6226845979690552, 0.010360809043049812, 0.03833499178290367, 0.2289738804101944, 0.0041443235240876675, 0.15295802056789398, 0.581828773021698, 0.06883110851049423, 0.07236091047525406, 0.029415003955364227, 0.0011766002280637622, 0.04294590651988983, 0.04412250593304634, 0.0070596011355519295, 0.9937053918838501, 0.9774035215377808, 0.021789249032735825, 0.988694965839386, 0.2148161381483078, 0.08932948112487793, 0.10421773046255112, 0.5912761092185974, 0.007281071972101927, 0.5405329465866089, 0.3890172839164734, 0.06275590509176254, 0.12770269811153412, 0.08756756037473679, 0.058378372341394424, 0.11310809850692749, 0.13135133683681488, 0.0121621610596776, 0.08999999612569809, 0.025540538132190704, 0.030405402183532715, 0.32472971081733704, 0.9981328248977661, 0.9870069622993469, 0.031673677265644073, 0.09502103179693222, 0.8094384074211121, 0.05982805788516998, 0.01888325624167919, 0.978782057762146, 0.006506085861474276, 0.9889250993728638, 0.9961147308349609, 0.11995471268892288, 0.3064922094345093, 0.22458481788635254, 0.1421489715576172, 0.029063917696475983, 0.03117765672504902, 0.030649220570921898, 0.054428789764642715, 0.02853548154234886, 0.033819831907749176, 0.9653185606002808, 0.03121122345328331, 0.09273429214954376, 0.022710438817739487, 0.05488356202840805, 0.8270385265350342, 0.49648597836494446, 0.04393681138753891, 0.03514945134520531, 0.005492101423442364, 0.14718832075595856, 0.03954312950372696, 0.04723207280039787, 0.10215308517217636, 0.04723207280039787, 0.03514945134520531, 0.005432780832052231, 0.665515661239624, 0.29744476079940796, 0.008149171248078346, 0.021731123328208923, 0.11879028379917145, 0.6470279693603516, 0.23252566158771515, 0.982373058795929, 0.012128062546253204, 0.037575263530015945, 0.037575263530015945, 0.6821355819702148, 0.121397003531456, 0.060698501765728, 0.060698501765728, 0.7771496176719666, 0.011328712105751038, 0.18579088151454926, 0.022657424211502075, 0.0022657422814518213, 0.010307654738426208, 0.020099926739931107, 0.30407580733299255, 0.6648436784744263, 0.9967759251594543, 0.9954435229301453, 0.05245886743068695, 0.9442595839500427, 0.9982324242591858, 0.24753481149673462, 0.07662469893693924, 0.0008545505115762353, 0.08630960434675217, 0.18600717186927795, 0.1310310810804367, 0.1521099954843521, 0.027060767635703087, 0.02335771545767784, 0.06893374025821686, 0.005418969783931971, 0.16618172824382782, 0.012644262053072453, 0.12463629990816116, 0.061414990574121475, 0.626794159412384, 0.9936252236366272, 0.028499040752649307, 0.1773865520954132, 0.049540385603904724, 0.08203461766242981, 0.065254807472229, 0.19682981073856354, 0.2426413595676422, 0.04927404224872589, 0.05486730858683586, 0.053801923990249634, 0.06766297668218613, 0.9303659796714783, 0.9942028522491455, 0.47864019870758057, 0.06759040057659149, 0.014018750749528408, 0.43908730149269104, 0.9757900834083557, 0.7745684385299683, 0.2246912121772766, 0.07066923379898071, 0.13031665980815887, 0.06418582051992416, 0.13355837762355804, 0.09530621767044067, 0.1452285200357437, 0.18088731169700623, 0.022043615579605103, 0.056405723094940186, 0.1011412963271141, 0.9622331261634827, 0.03391129896044731, 0.9284623861312866, 0.06954774260520935, 0.9823116660118103, 0.07761090248823166, 0.054537393152713776, 0.19927124679088593, 0.018878327682614326, 0.6376680135726929, 0.004195183981209993, 0.006292776204645634, 0.15075568854808807, 0.19674895703792572, 0.26113951206207275, 0.06490160524845123, 0.07410025596618652, 0.09811896085739136, 0.01226487010717392, 0.08840927481651306, 0.032195284962654114, 0.020952485501766205, 0.9876848459243774, 0.09004253149032593, 0.9090832471847534, 0.9924943447113037, 0.9874857068061829, 0.9912837147712708, 0.9900286793708801, 0.8910292983055115, 0.10725352168083191, 0.04387596622109413, 0.051188625395298004, 0.8994572758674622, 0.3898763358592987, 0.08292146027088165, 0.002909524831920862, 0.09746908396482468, 0.06110002100467682, 0.12801909446716309, 0.09019526839256287, 0.05091668665409088, 0.06255478411912918, 0.03273215517401695, 0.0661003515124321, 0.1192680299282074, 0.4397110342979431, 0.06538186967372894, 0.14944428205490112, 0.017962053418159485, 0.021554462611675262, 0.05747856944799423, 0.06466338783502579, 0.9842679500579834, 0.016517192125320435, 0.20187680423259735, 0.11011461913585663, 0.6698639392852783, 0.02432498335838318, 0.9451993107795715, 0.003474997589364648, 0.02432498335838318, 0.8504248857498169, 0.10691055655479431, 0.03887656703591347, 0.1204923540353775, 0.04726025089621544, 0.20181404054164886, 0.31719717383384705, 0.0540725402534008, 0.055775612592697144, 0.06727135181427002, 0.03278413787484169, 0.09281743317842484, 0.010644201189279556, 0.9708878397941589, 0.025624606758356094, 0.9893497824668884, 0.020420510321855545, 0.04413465037941933, 0.05138063803315163, 0.18707822263240814, 0.241752490401268, 0.1086898148059845, 0.09551528841257095, 0.11066599190235138, 0.11000726372003555, 0.03096012957394123, 0.03080577962100506, 0.017603302374482155, 0.04400825500488281, 0.8889667987823486, 0.013202477246522903, 0.9941993951797485, 0.9913306832313538, 0.9993233680725098, 0.056550782173871994, 0.9401567578315735, 0.2726779580116272, 0.003909361083060503, 0.06548180431127548, 0.07330052554607391, 0.019546806812286377, 0.10555275529623032, 0.35868388414382935, 0.023456167429685593, 0.002932020928710699, 0.074277862906456, 0.991647481918335, 0.9933046698570251, 0.9934691190719604, 0.9942363500595093, 0.9869003295898438, 0.9914559721946716, 0.19970963895320892, 0.7988385558128357, 0.9790177941322327, 0.011327564716339111, 0.022655129432678223, 0.022655129432678223, 0.07929295301437378, 0.008495673537254333, 0.7306279540061951, 0.12177132070064545, 0.002831891179084778, 0.00934118777513504, 0.019400928169488907, 0.8945983052253723, 0.07041817903518677, 0.00574842281639576, 0.9887343645095825, 0.08462303131818771, 0.05847546458244324, 0.4787381589412689, 0.13739357888698578, 0.0404098741710186, 0.029475437477231026, 0.03422953933477402, 0.06227874755859375, 0.0370820015668869, 0.0370820015668869, 0.005477050319314003, 0.021908201277256012, 0.1341877281665802, 0.6517689824104309, 0.16978855431079865, 0.013692625798285007, 0.9944437146186829, 0.05208912864327431, 0.029962772503495216, 0.48816272616386414, 0.0792861059308052, 0.00046096573350951076, 0.02673601172864437, 0.014289937913417816, 0.2383192777633667, 0.06591810286045074, 0.005070623010396957, 0.041793618351221085, 0.8823096752166748, 0.07429976761341095, 0.9889696836471558, 0.01295366883277893, 0.8186718821525574, 0.056996144354343414, 0.023316605016589165, 0.0867895856499672, 0.03642081841826439, 0.7519828081130981, 0.2013857066631317, 0.010712006129324436, 0.989499032497406, 0.9900275468826294, 0.015654398128390312, 0.5386954545974731, 0.1777234673500061, 0.05709251016378403, 0.1289185732603073, 0.03959641978144646, 0.0018416938837617636, 0.041438113898038864, 0.956125795841217, 0.034642238169908524, 0.9942362904548645, 0.20043528079986572, 0.7982853651046753, 0.9992931485176086, 0.029503511264920235, 0.03048696182668209, 0.9391950964927673, 0.9948950409889221, 0.9929196238517761, 0.05053069442510605, 0.05053069442510605, 0.8626311421394348, 0.03609335422515869, 0.9871167540550232, 0.02464824542403221, 0.10915651172399521, 0.08098708838224411, 0.017605889588594437, 0.7464897036552429, 0.007042355835437775, 0.01408471167087555, 0.9994784593582153, 0.029911385849118233, 0.9631465673446655, 0.8657009601593018, 0.10983654856681824, 0.023620761930942535, 0.003857866395264864, 0.9490351676940918, 0.04243653267621994, 0.011400311253964901, 0.22331197559833527, 0.0697430819272995, 0.07644914835691452, 0.004023639019578695, 0.1488746553659439, 0.19782893359661102, 0.06303701549768448, 0.09522613137960434, 0.10997947305440903, 0.9820893406867981, 0.017412932589650154, 0.9933030009269714, 0.9920571446418762, 0.03944803774356842, 0.9588907361030579, 0.7954779863357544, 0.004642867483198643, 0.010059546679258347, 0.14934557676315308, 0.0007738112471997738, 0.010059546679258347, 0.02940482832491398, 0.997638463973999, 0.9823446273803711, 0.08993932604789734, 0.8993932604789734, 0.9824125170707703, 0.0062460871413350105, 0.9910458326339722, 0.9939238429069519, 0.9975072741508484, 0.29065191745758057, 0.7079982757568359, 0.3073197603225708, 0.05826270580291748, 0.00768299400806427, 0.08771418035030365, 0.09987892210483551, 0.12804989516735077, 0.15558062493801117, 0.0166464876383543, 0.053140707314014435, 0.08579343557357788, 0.9964796304702759, 0.989776611328125, 0.030239975079894066, 0.004031996708363295, 0.9293752312660217, 0.0020159983541816473, 0.006047994829714298, 0.028223976492881775, 0.1430351436138153, 0.5361820459365845, 0.007990790531039238, 0.003196316072717309, 0.1318480372428894, 0.09349224716424942, 0.018378818407654762, 0.005593553185462952, 0.057533688843250275, 0.0015981580363586545, 0.03587382659316063, 0.051888927817344666, 0.591277539730072, 0.041639264672994614, 0.0012812081258744001, 0.11146511137485504, 0.05381074175238609, 0.03203020244836807, 0.0051248325034976006, 0.07559128105640411, 0.3883173167705536, 0.2538767158985138, 0.09002719819545746, 0.15784768760204315, 0.027608342468738556, 0.002400725381448865, 0.04261287674307823, 0.03661106154322624, 0.9923387765884399, 0.10636710375547409, 0.12472809106111526, 0.03482256457209587, 0.0810416042804718, 0.24059225618839264, 0.09623690694570541, 0.12282868474721909, 0.09307121485471725, 0.0734439566731453, 0.026591775938868523, 0.08147607743740082, 0.0805872455239296, 0.18221013247966766, 0.13391704857349396, 0.11673299968242645, 0.15347130596637726, 0.17628459632396698, 0.01807287521660328, 0.028442557901144028, 0.029035111889243126, 0.9883348941802979, 0.05344466120004654, 0.9451266527175903, 0.11607211828231812, 0.09041406959295273, 0.040319789201021194, 0.054981529712677, 0.045207034796476364, 0.03909797593951225, 0.37509623169898987, 0.023214424028992653, 0.05375972017645836, 0.16127915680408478, 0.057641707360744476, 0.6063464283943176, 0.031037842854857445, 0.024386875331401825, 0.19620350003242493, 0.05653321370482445, 0.011084944009780884, 0.016627416014671326, 0.007937688380479813, 0.9882422089576721, 0.9813222885131836, 0.04756404459476471, 0.21023307740688324, 0.6021608114242554, 0.0038051235023885965, 0.04756404459476471, 0.0323435515165329, 0.004756404552608728, 0.05327172949910164, 0.9908990263938904, 0.9984796643257141, 0.0164179727435112, 0.5438979864120483, 0.14986662566661835, 0.06062020733952522, 0.11366288363933563, 0.05472657456994057, 0.009261419996619225, 0.05220073461532593, 0.8966673016548157, 0.100186288356781, 0.030339591205120087, 0.9658102989196777, 0.0051825144328176975, 0.9898602962493896, 0.9964926838874817, 0.9940032958984375, 0.995389461517334, 0.9921508431434631, 0.1297713965177536, 0.02752726525068283, 0.8376153707504272, 0.10296144336462021, 0.3724781572818756, 0.030282776802778244, 0.0768425464630127, 0.0673791766166687, 0.1090179979801178, 0.06132262572646141, 0.10712532699108124, 0.04996658116579056, 0.022712083533406258, 0.057786159217357635, 0.03638387843966484, 0.002140228170901537, 0.006420684512704611, 0.8946153521537781, 0.004666417837142944, 0.03266492486000061, 0.06532984972000122, 0.8959521651268005, 0.9891890287399292, 0.03148955851793289, 0.024222739040851593, 0.03027842380106449, 0.798139214515686, 0.027856148779392242, 0.02906728722155094, 0.05934571102261543, 0.07341376692056656, 0.09762468934059143, 0.313960999250412, 0.13511256873607635, 0.03280189633369446, 0.06560379266738892, 0.0015619950136169791, 0.2647581696510315, 0.01640094816684723, 0.9913778901100159, 0.034172557294368744, 0.09112682193517685, 0.8543139696121216, 0.017086278647184372, 0.9906675815582275, 0.08192655444145203, 0.02730885148048401, 0.8848068118095398, 0.9931009411811829, 0.998070240020752, 0.988185465335846, 0.00870155543088913, 0.0406072624027729, 0.20593681931495667, 0.7425327897071838, 0.9880222082138062, 0.009207574650645256, 0.053710851818323135, 0.888530969619751, 0.010742170736193657, 0.02915732003748417, 0.0076729790307581425, 0.020768266171216965, 0.9553402662277222, 0.023364299908280373, 0.02318478561937809, 0.04289185628294945, 0.032458700239658356, 0.4683326780796051, 0.29444679617881775, 0.0602804459631443, 0.027821743860840797, 0.05100652948021889, 0.8876805305480957, 0.03227929025888443, 0.07923098653554916, 0.009056972339749336, 0.9872100353240967, 0.01922890916466713, 0.004807227291166782, 0.9734635949134827, 0.05321671813726425, 0.9460749626159668, 0.9958201050758362, 0.9951406717300415, 0.9989522099494934, 0.9976341724395752, 0.9939318299293518, 0.007695188280194998, 0.9907554388046265, 0.9945312142372131, 0.002001068787649274, 0.002001068787649274, 0.7687157392501831, 0.22880834341049194, 0.20650435984134674, 0.7854675054550171, 0.006758324336260557, 0.34681469202041626, 0.03489511087536812, 0.11750394850969315, 0.017091482877731323, 0.17589984834194183, 0.010682176798582077, 0.044865142554044724, 0.18586988747119904, 0.012818612158298492, 0.053410883992910385, 0.996290385723114, 0.9905754327774048, 0.04634307324886322, 0.09325476735830307, 0.14556841552257538, 0.28886234760284424, 0.09695084393024445, 0.09581358730792999, 0.07704891264438629, 0.09581358730792999, 0.03866661339998245, 0.02189212664961815, 0.06009218469262123, 0.06687678396701813, 0.13084588944911957, 0.4409990906715393, 0.256845623254776, 0.04361529275774956, 0.00642987247556448, 0.9902003407478333, 0.9888010025024414, 0.9949706196784973, 0.9919202327728271, 0.09934737533330917, 0.03804792836308479, 0.16318334639072418, 0.17163844406604767, 0.03382038325071335, 0.05242159217596054, 0.0925832986831665, 0.24435226619243622, 0.02536528743803501, 0.07905514538288116, 0.0493512861430645, 0.9421609044075012, 0.00747746741399169, 0.9954060316085815, 0.058951377868652344, 0.21875932812690735, 0.016335923224687576, 0.11222069710493088, 0.06179240718483925, 0.247169628739357, 0.026279529556632042, 0.014205151237547398, 0.11293095350265503, 0.1306873857975006, 0.9945565462112427, 0.9965836405754089, 0.11972963064908981, 0.8785793781280518, 0.00485058082267642, 0.9895185232162476, 0.08816379308700562, 0.9062418341636658, 0.004100641701370478, 0.012021970003843307, 0.012021970003843307, 0.07453621178865433, 0.009617576375603676, 0.7092962265014648, 0.00721318181604147, 0.17552076280117035, 0.08571454137563705, 0.08571454137563705, 0.027649851515889168, 0.03317982330918312, 0.7659009099006653, 0.998058557510376, 0.0335407555103302, 0.8608793616294861, 0.10062225908041, 0.009945032186806202, 0.9878731966018677, 0.9939717054367065, 0.9972440004348755, 0.38646844029426575, 0.2595732808113098, 0.01553143747150898, 0.022966699674725533, 0.06509985774755478, 0.10211094468832016, 0.01420961320400238, 0.05749936401844025, 0.060308244079351425, 0.016027122735977173, 0.07528243213891983, 0.05646182596683502, 0.13516618311405182, 0.09581400454044342, 0.0684385746717453, 0.037641216069459915, 0.051328931003808975, 0.04961796849966049, 0.4277411103248596, 0.17850686609745026, 0.32199332118034363, 0.04134355112910271, 0.036965999752283096, 0.046693895012140274, 0.1381361037492752, 0.027724498882889748, 0.1177075207233429, 0.07539118081331253, 0.015078236348927021, 0.0029351895209401846, 0.012719154357910156, 0.22796638309955597, 0.15262985229492188, 0.04304944723844528, 0.13306193053722382, 0.41484013199806213, 0.011740758083760738, 0.9922082424163818, 0.9938311576843262, 0.9842427968978882, 0.006768323015421629, 0.9915593266487122, 0.9902106523513794, 0.021416107192635536, 0.8905531167984009, 0.0874491035938263, 0.013841218315064907, 0.2886882722377777, 0.6960155367851257, 0.9894993305206299, 0.015452922321856022, 0.035822682082653046, 0.021774571388959885, 0.016857733950018883, 0.013345705345273018, 0.23741307854652405, 0.013345705345273018, 0.6469154953956604, 0.3705628216266632, 0.6290480494499207, 0.9973105788230896, 0.9915122389793396, 0.06309384852647781, 0.231595978140831, 0.09142940491437912, 0.037780746817588806, 0.05515988916158676, 0.10087459534406662, 0.044959086924791336, 0.05175962299108505, 0.19872672855854034, 0.125054270029068, 0.5734701156616211, 0.1194729432463646, 0.09026844054460526, 0.11681798845529556, 0.09292339533567429, 0.006637385580688715, 0.9915998578071594, 0.7821849584579468, 0.03164910152554512, 0.12433575838804245, 0.06103755533695221, 0.11312486231327057, 0.8551472425460815, 0.028760557994246483, 0.11257313936948776, 0.059926994144916534, 0.0016801961464807391, 0.1814611852169037, 0.20834431052207947, 0.05376627668738365, 0.18930210173130035, 0.04480522871017456, 0.05208607763051987, 0.09633124619722366, 0.9851661920547485, 0.15788765251636505, 0.6178212761878967, 0.17962580919265747, 0.04462042450904846, 0.05229882523417473, 0.0018678151536732912, 0.08405168354511261, 0.3259337544441223, 0.04389365762472153, 0.47629284858703613, 0.01494252122938633, 0.021584073081612587, 0.05396018177270889, 0.1187123954296112, 0.8040066957473755, 0.08918201923370361, 0.9111027717590332, 0.9925987720489502, 0.9948096871376038, 0.9976964592933655, 0.014667067676782608, 0.1222255676984787, 0.017926417291164398, 0.02770446240901947, 0.23630276322364807, 0.016296742483973503, 0.5654969811439514, 0.09710930287837982, 0.8601109981536865, 0.03699402138590813, 0.05591879040002823, 0.08879411965608597, 0.05991298705339432, 0.4362894594669342, 0.06943761557340622, 0.10845787078142166, 0.016898535192012787, 0.006144921761006117, 0.14286942780017853, 0.015362304635345936, 0.0076918532140553, 0.5176617503166199, 0.2649843394756317, 0.1346074342727661, 0.07038045674562454, 0.004999704658985138, 0.38159796595573425, 0.4875108599662781, 0.1105855256319046, 0.007787713315337896, 0.012460341677069664, 0.9943277835845947, 0.9964197278022766, 0.05934993922710419, 0.025178762152791023, 0.2356012761592865, 0.5917009115219116, 0.052156005054712296, 0.034171175211668015, 0.1887255609035492, 0.0022073164582252502, 0.046353645622730255, 0.04304267093539238, 0.18210361897945404, 0.020969506353139877, 0.5165120363235474, 0.058811839669942856, 0.10455438494682312, 0.28679847717285156, 0.06099005788564682, 0.07623757421970367, 0.007986793294548988, 0.014521442353725433, 0.2911549210548401, 0.07986792922019958, 0.019603947177529335, 0.14539244771003723, 0.03940024599432945, 0.2047702819108963, 0.01609305664896965, 0.0016647990560159087, 0.07658075541257858, 0.0005549330380745232, 0.4916706383228302, 0.024971986189484596, 0.9955393671989441, 0.9898155927658081, 0.9977903366088867, 0.988472580909729, 0.991112470626831, 0.04804662615060806, 0.30499163269996643, 0.12394636869430542, 0.12046472728252411, 0.09400427341461182, 0.06649931520223618, 0.07102544605731964, 0.06336583942174911, 0.08495200425386429, 0.022978821769356728, 0.9855749607086182, 0.991823673248291, 0.9906700253486633, 0.9936048984527588, 0.07083205878734589, 0.9249833822250366, 0.05752526596188545, 0.264791876077652, 0.13217636942863464, 0.1901407688856125, 0.040399424731731415, 0.10363329946994781, 0.0421559177339077, 0.07245548814535141, 0.07552935928106308, 0.020638834685087204, 0.08443303406238556, 0.3670561909675598, 0.031851984560489655, 0.05965927243232727, 0.059153683483600616, 0.11881295591592789, 0.05814250931143761, 0.0894889086484909, 0.10769003629684448, 0.022751417011022568, 0.022307951003313065, 0.9703959226608276, 0.9775837659835815, 0.9887065291404724, 0.21927835047245026, 0.7780164480209351, 0.09416694939136505, 0.9042441844940186, 0.0651455670595169, 0.08344487845897675, 0.13724486529827118, 0.2170298844575882, 0.038062576204538345, 0.14419861137866974, 0.09625440090894699, 0.03659863397479057, 0.10869793593883514, 0.07319726794958115, 0.04354088380932808, 0.031975336372852325, 0.24967974424362183, 0.04966381937265396, 0.2020569145679474, 0.0006803263095207512, 0.031975336372852325, 0.09864731132984161, 0.2333519160747528, 0.05850806087255478, 0.02580989897251129, 0.011731772683560848, 0.8540730476379395, 0.0023463545367121696, 0.08212240785360336, 0.021117189899086952, 0.9889315366744995, 0.0668911337852478, 0.0998058170080185, 0.13484403491020203, 0.13590580224990845, 0.06582936644554138, 0.006370584014803171, 0.024420572444796562, 0.06052054837346077, 0.33020859956741333, 0.07432348281145096, 0.9912629127502441, 0.9977747201919556, 0.9882981777191162, 0.0415370836853981, 0.9553529024124146, 0.14116810262203217, 0.857092022895813, 0.9956228137016296, 0.37793493270874023, 0.09960217773914337, 0.006086799781769514, 0.07110488414764404, 0.04454430565237999, 0.15023328363895416, 0.059484630823135376, 0.11647921055555344, 0.014663653448224068, 0.059761304408311844, 0.9974615573883057, 0.1840101033449173, 0.002920795464888215, 0.09346545487642288, 0.04965352267026901, 0.020445566624403, 0.07886147499084473, 0.5695551037788391, 0.9935731291770935, 0.2841089963912964, 0.0568218007683754, 0.0701916366815567, 0.46794426441192627, 0.09693130850791931, 0.005013688467442989, 0.01838352344930172, 0.9945606589317322, 0.1063975989818573, 0.03546586632728577, 0.03819401189684868, 0.600191593170166, 0.22097963094711304, 0.995009183883667, 0.9792357683181763, 0.009374520741403103, 0.007030890788882971, 0.20858308672904968, 0.35779422521591187, 0.003124840324744582, 0.019530251622200012, 0.378886878490448, 0.01562420092523098, 0.9002392888069153, 0.09726203233003616, 0.9930251836776733, 0.9916316270828247, 0.09693365544080734, 0.3130149245262146, 0.07068078964948654, 0.23930495977401733, 0.27868425846099854, 0.9976932406425476, 0.9929656386375427, 0.15088479220867157, 0.8490967750549316, 0.34195584058761597, 0.2523147463798523, 0.0018201243365183473, 0.046185653656721115, 0.09464646130800247, 0.06575199216604233, 0.05596882104873657, 0.04049776494503021, 0.06074664741754532, 0.04027025029063225, 0.009788339026272297, 0.09788339585065842, 0.029365018010139465, 0.822220504283905, 0.03915335610508919, 0.9929429292678833, 0.014371379278600216, 0.124968521296978, 0.22619301080703735, 0.05811036005616188, 0.07060721516609192, 0.017495593056082726, 0.07560595124959946, 0.01562106516212225, 0.3499118387699127, 0.04748803749680519, 0.1100185215473175, 0.20536790788173676, 0.07579053938388824, 0.03178313001990318, 0.5745411515235901, 0.32186359167099, 0.6759135127067566, 0.04023103043437004, 0.04446587339043617, 0.029643917456269264, 0.09104917198419571, 0.5357078909873962, 0.1588066965341568, 0.09951886534690857, 0.21029403805732727, 0.7732859253883362, 0.0016558585921302438, 0.01324686873704195, 0.996273934841156, 0.9994207620620728, 0.9942842125892639, 0.9879215955734253, 0.31940343976020813, 0.6791054606437683, 0.17297396063804626, 0.014766070060431957, 0.8100244402885437, 0.07929293811321259, 0.004719818010926247, 0.9128127694129944, 0.0018879271810874343, 0.9901733994483948, 0.009147335775196552, 0.042687565088272095, 0.2154705673456192, 0.07521142810583115, 0.4339902400970459, 0.14229188859462738, 0.054884012788534164, 0.027442006394267082, 0.12139881402254105, 0.02926022745668888, 0.5005366206169128, 0.1270018368959427, 0.036730922758579254, 0.02365720458328724, 0.06785882264375687, 0.041711386293172836, 0.006225580349564552, 0.0454467348754406, 0.9917294383049011, 0.9968920350074768, 0.9306492209434509, 0.06876718252897263, 0.9906982779502869, 0.03595567122101784, 0.9528253078460693, 0.9878548979759216, 0.9904950857162476, 0.11256667226552963, 0.8850069642066956, 0.9979623556137085, 0.9954518675804138, 0.014250417239964008, 0.983278751373291, 0.9919945001602173, 0.9889539480209351, 0.028080632910132408, 0.9547415375709534, 0.009360210970044136, 0.012287922203540802, 0.03891175612807274, 0.04300772771239281, 0.13311916589736938, 0.06553558260202408, 0.08806344121694565, 0.5345246195793152, 0.08191948384046555, 0.988900363445282, 0.0012262659147381783, 0.517484188079834, 0.3231210708618164, 0.04230617359280586, 0.05211630091071129, 0.005518196616321802, 0.035561710596084595, 0.004291930701583624, 0.017780855298042297, 0.057518623769283295, 0.8575504422187805, 0.0836634561419487, 0.9363574385643005, 0.06113674119114876, 0.9921925663948059, 0.11348026245832443, 0.09020226448774338, 0.6205042600631714, 0.04364625737071037, 0.0065469383262097836, 0.014548752456903458, 0.03855419158935547, 0.06546938419342041, 0.007274376228451729, 0.0005373483872972429, 0.21493935585021973, 0.02847946621477604, 0.752825140953064, 0.003224090440198779, 0.05142543837428093, 0.9427996873855591, 0.9487872123718262, 0.04447440057992935, 0.0049415999092161655, 0.582501232624054, 0.0932001993060112, 0.2895863354206085, 0.015533366240561008, 0.01886194385588169, 0.9940780997276306, 0.07539986819028854, 0.09514745324850082, 0.007180939894169569, 0.025133289396762848, 0.5152324438095093, 0.15798068046569824, 0.014361879788339138, 0.02154281921684742, 0.07360463589429855, 0.014361879788339138, 0.9952544569969177, 0.0444549061357975, 0.9261438846588135, 0.029636604711413383, 0.9802224636077881, 0.03679625317454338, 0.08714901655912399, 0.21303093433380127, 0.0232397373765707, 0.07552915066480637, 0.5054643154144287, 0.01355651393532753, 0.0445428304374218, 0.01616777665913105, 0.01077851839363575, 0.9646773934364319, 0.25457799434661865, 0.05604906752705574, 0.09533579647541046, 0.08485933393239975, 0.07543051987886429, 0.07909727841615677, 0.19381453096866608, 0.02985791303217411, 0.05657288804650307, 0.07490669190883636, 0.9938384294509888, 0.2710508406162262, 0.05701809376478195, 0.04784935712814331, 0.042405419051647186, 0.06332160532474518, 0.3194732367992401, 0.00401132320985198, 0.12406449764966965, 0.014326154254376888, 0.05673157051205635, 0.0856575295329094, 0.05930136516690254, 0.024159815162420273, 0.7291871905326843, 0.026356162503361702, 0.013178081251680851, 0.008785387501120567, 0.050515979528427124, 0.9913363456726074, 0.0069246068596839905, 0.1465708464384079, 0.027698427438735962, 0.1419544517993927, 0.19735130667686462, 0.08194117993116379, 0.2919875979423523, 0.10617730766534805, 0.9816988110542297, 0.9771338105201721, 0.9972831010818481, 0.9919394850730896, 0.1665184646844864, 0.16189295053482056, 0.025440320372581482, 0.11216868460178375, 0.016189293935894966, 0.011563781648874283, 0.499555379152298, 0.005781890824437141, 0.9955941438674927, 0.9914425611495972, 0.9890792965888977, 0.9932788014411926, 0.9947019219398499, 0.9942968487739563, 0.23299972712993622, 0.11411148309707642, 0.013268777169287205, 0.05891336873173714, 0.11835748702287674, 0.13640302419662476, 0.05891336873173714, 0.051482852548360825, 0.1480795443058014, 0.06793613731861115, 0.9846557378768921, 0.053808897733688354, 0.8497321605682373, 0.01793629862368107, 0.05605093389749527, 0.022420374676585197, 0.0005919853574596345, 0.02959926798939705, 0.14858832955360413, 0.0017759561305865645, 0.8193077445030212, 0.0007286216714419425, 0.08889184892177582, 0.13552363216876984, 0.17486920952796936, 0.16175401210784912, 0.00291448668576777, 0.11657947301864624, 0.3133073151111603, 0.006557594984769821, 0.27615758776664734, 0.19481515884399414, 0.00813424400985241, 0.15861776471138, 0.06629408895969391, 0.11225257068872452, 0.06304039061069489, 0.04026450961828232, 0.05571957305073738, 0.025216158479452133, 0.9917768239974976, 0.016399454325437546, 0.2193426936864853, 0.21831771731376648, 0.11889603734016418, 0.06969767808914185, 0.006149794906377792, 0.09224692732095718, 0.2582913935184479, 0.9895025491714478, 0.010923417285084724, 0.024905391037464142, 0.2569187581539154, 0.417274534702301, 0.031896378844976425, 0.09263058006763458, 0.11972065269947052, 0.027527010068297386, 0.01791440322995186, 0.9879209399223328, 0.9828146696090698, 0.9952401518821716, 0.011208872310817242, 0.25332051515579224, 0.13226468861103058, 0.017934195697307587, 0.051560815423727036, 0.5313005447387695, 0.9885645508766174, 0.11263793706893921, 0.25891709327697754, 0.019223541021347046, 0.10693094879388809, 0.1228504478931427, 0.14748060703277588, 0.10512874275445938, 0.0423518642783165, 0.07779526710510254, 0.006908460520207882, 0.9894654750823975, 0.9859137535095215, 0.988101065158844, 0.13968415558338165, 0.12965160608291626, 0.05652964115142822, 0.13370321691036224, 0.14470043778419495, 0.09781750291585922, 0.11248047649860382, 0.047268811613321304, 0.0692632794380188, 0.06907034665346146, 0.010665087029337883, 0.06754554808139801, 0.8496519327163696, 0.021330174058675766, 0.04977040737867355, 0.9942588210105896, 0.01854361593723297, 0.002852864097803831, 0.46073755621910095, 0.04136652871966362, 0.47500187158584595, 0.16666944324970245, 0.8295592665672302, 0.9949787259101868, 0.06429426372051239, 0.4737083315849304, 0.01330226194113493, 0.13376162946224213, 0.05173102021217346, 0.08129160106182098, 0.008129159919917583, 0.04951397702097893, 0.06133820861577988, 0.06355524808168411, 0.9839065670967102, 0.10247236490249634, 0.8284385204315186, 0.04907127097249031, 0.0028865453787148, 0.01587599888443947, 0.9984540939331055, 0.9972016215324402, 0.9988705515861511, 0.9919763207435608, 0.03858592361211777, 0.9576324224472046, 0.0035078111104667187, 0.9930582642555237, 0.9932459592819214, 0.03595590591430664, 0.014648702926933765, 0.0426144078373909, 0.06392160803079605, 0.033292505890131, 0.6791671514511108, 0.08389711380004883, 0.045277807861566544, 0.014019694179296494, 0.9720321297645569, 0.009346462786197662, 0.9923473596572876, 0.005523554980754852, 0.994239866733551, 0.9954299330711365, 0.046779386699199677, 0.8836106657981873, 0.06757022440433502, 0.7120974659919739, 0.12702780961990356, 0.052850984036922455, 0.10662917792797089, 0.9876187443733215, 0.9899839758872986, 0.9931995272636414, 0.9878475666046143, 0.020768698304891586, 0.6824000477790833, 0.2937287390232086, 0.0029669569339603186, 0.9904960989952087, 0.003083867020905018, 0.05119219422340393, 0.5261077284812927, 0.30653637647628784, 0.0018503202591091394, 0.036389630287885666, 0.028371578082442284, 0.0431741401553154, 0.003083867020905018, 0.9957234263420105, 0.9857167601585388, 0.021710535511374474, 0.005427633877843618, 0.9457652568817139, 0.025781262665987015, 0.9877657294273376, 0.0066740927286446095, 0.007349411956965923, 0.07349412143230438, 0.012861470691859722, 0.22231970727443695, 0.09554235637187958, 0.014698823913931847, 0.5750914812088013, 0.9970661401748657, 0.0032690693624317646, 0.9879963397979736, 0.9933649897575378, 0.9527984857559204, 0.0392906591296196, 0.9773064255714417, 0.01338775921612978, 0.1733044683933258, 0.11415430158376694, 0.09121287614107132, 0.1843605786561966, 0.10005776584148407, 0.14179456233978271, 0.06937706470489502, 0.04201320558786392, 0.052792906761169434, 0.030404292047023773, 0.08409424871206284, 0.021624235436320305, 0.07688616961240768, 0.06727539747953415, 0.747237503528595, 0.33517640829086304, 0.6620768904685974, 0.002758653601631522, 0.04095998778939247, 0.959634006023407, 0.9987404942512512, 0.013819515705108643, 0.3151523768901825, 0.6707521080970764, 0.05502551794052124, 0.14756843447685242, 0.010004639625549316, 0.005002319812774658, 0.7828630208969116, 0.042391955852508545, 0.9507910013198853, 0.012515492737293243, 0.007822182960808277, 0.9777728319168091, 0.994380533695221, 0.11777878552675247, 0.5513847470283508, 0.10502567142248154, 0.062265217304229736, 0.0270066000521183, 0.0405099019408226, 0.0157538503408432, 0.028506968170404434, 0.0157538503408432, 0.0360088013112545, 0.10179044306278229, 0.0622747428715229, 0.09353716671466827, 0.3176262080669403, 0.21183417737483978, 0.047518882900476456, 0.05627235770225525, 0.05527196079492569, 0.050269972532987595, 0.004001589957624674, 0.2278156876564026, 0.16641081869602203, 0.0973757654428482, 0.15006041526794434, 0.10609598457813263, 0.05123127996921539, 0.08029866963624954, 0.011990299448370934, 0.0534113347530365, 0.054864704608917236, 0.009547729976475239, 0.9881900548934937, 0.9945070743560791, 0.9949353933334351, 0.9954512119293213, 0.9885648488998413, 0.9812148213386536, 0.9881600737571716, 0.12985055148601532, 0.03196321427822113, 0.015482181683182716, 0.038955166935920715, 0.21625111997127533, 0.06367671489715576, 0.24471835792064667, 0.04095286875963211, 0.06792183220386505, 0.14982756972312927, 0.9866440296173096, 0.9905340671539307, 0.991249680519104], \"Term\": [\"accept\", \"accept\", \"accept\", \"accept\", \"accept\", \"accept\", \"accept\", \"accept\", \"accept\", \"access\", \"access\", \"access\", \"access\", \"access\", \"access\", \"adaptec\", \"address\", \"address\", \"address\", \"address\", \"address\", \"address\", \"address\", \"address\", \"address\", \"address\", \"administr\", \"administr\", \"administr\", \"administr\", \"agenc\", \"agenc\", \"agenc\", \"agenc\", \"agenc\", \"aid\", \"aid\", \"aid\", \"aid\", \"alaska\", \"algorithm\", \"algorithm\", \"alomar\", \"amanda\", \"american\", \"american\", \"american\", \"american\", \"american\", \"american\", \"american\", \"american\", \"andrew\", \"andrew\", \"andrew\", \"andrew\", \"andrew\", \"andrew\", \"andrew\", \"andrew\", \"anonym\", \"anonym\", \"anti\", \"anti\", \"anti\", \"appl\", \"appl\", \"appl\", \"applic\", \"applic\", \"applic\", \"applic\", \"applic\", \"arab\", \"arab\", \"archiv\", \"archiv\", \"archiv\", \"archiv\", \"argic\", \"argument\", \"argument\", \"argument\", \"argument\", \"argument\", \"argument\", \"argument\", \"argument\", \"arm\", \"arm\", \"arm\", \"arm\", \"arm\", \"armenia\", \"armenian\", \"armi\", \"armi\", \"armi\", \"armi\", \"armori\", \"atheism\", \"atheist\", \"atho\", \"attack\", \"attack\", \"attack\", \"attack\", \"attack\", \"attack\", \"aurora\", \"author\", \"author\", \"author\", \"author\", \"author\", \"auto\", \"auto\", \"auto\", \"auto\", \"auto\", \"auto\", \"autom\", \"automot\", \"avail\", \"avail\", \"avail\", \"avail\", \"avail\", \"avail\", \"avail\", \"avail\", \"avail\", \"avail\", \"azerbaijan\", \"azerbaijani\", \"azeri\", \"baalk\", \"baerga\", \"ball\", \"ball\", \"ball\", \"bank\", \"bank\", \"bank\", \"bank\", \"bank\", \"bank\", \"bank\", \"bank\", \"bank\", \"basebal\", \"basebal\", \"bat\", \"batf\", \"batf\", \"batteri\", \"batteri\", \"belief\", \"belief\", \"believ\", \"believ\", \"believ\", \"believ\", \"believ\", \"believ\", \"believ\", \"believ\", \"believ\", \"believ\", \"berkeley\", \"berkeley\", \"berkeley\", \"berkeley\", \"best\", \"best\", \"best\", \"best\", \"best\", \"best\", \"best\", \"best\", \"best\", \"best\", \"better\", \"better\", \"better\", \"better\", \"better\", \"better\", \"better\", \"better\", \"better\", \"better\", \"bibl\", \"biblic\", \"bike\", \"bike\", \"billion\", \"billion\", \"binari\", \"binari\", \"bio\", \"blah\", \"blast\", \"board\", \"board\", \"board\", \"board\", \"board\", \"board\", \"board\", \"board\", \"boni\", \"bontchev\", \"book\", \"book\", \"book\", \"book\", \"book\", \"book\", \"book\", \"book\", \"boyl\", \"brake\", \"brake\", \"brave\", \"brave\", \"bruin\", \"build\", \"build\", \"build\", \"build\", \"build\", \"build\", \"build\", \"build\", \"build\", \"build\", \"buy\", \"buy\", \"buy\", \"buy\", \"buy\", \"byte\", \"byte\", \"byte\", \"cach\", \"cactus\", \"cadr\", \"callison\", \"canada\", \"canada\", \"canada\", \"canada\", \"canada\", \"canada\", \"canada\", \"canada\", \"canada\", \"cancer\", \"cancer\", \"candida\", \"canuck\", \"car\", \"car\", \"card\", \"card\", \"card\", \"card\", \"card\", \"carlo\", \"case\", \"case\", \"case\", \"case\", \"case\", \"case\", \"case\", \"case\", \"case\", \"case\", \"catbyt\", \"catcher\", \"cathol\", \"caus\", \"caus\", \"caus\", \"caus\", \"caus\", \"caus\", \"caus\", \"caus\", \"caus\", \"centerlin\", \"centri\", \"char\", \"chastiti\", \"children\", \"children\", \"children\", \"children\", \"children\", \"children\", \"chip\", \"chip\", \"chip\", \"chopin\", \"christ\", \"christ\", \"christian\", \"christian\", \"church\", \"church\", \"church\", \"cica\", \"cipher\", \"ciphertext\", \"circuit\", \"circuit\", \"circuit\", \"claim\", \"claim\", \"claim\", \"claim\", \"claim\", \"claim\", \"claim\", \"claim\", \"claim\", \"claim\", \"clarkson\", \"classifi\", \"classifi\", \"classifi\", \"classifi\", \"clayton\", \"cleveland\", \"cleveland\", \"cleveland\", \"client\", \"client\", \"clinic\", \"clinic\", \"clinton\", \"clinton\", \"clinton\", \"clinton\", \"clipper\", \"clipper\", \"coach\", \"coach\", \"code\", \"code\", \"code\", \"code\", \"code\", \"code\", \"color\", \"color\", \"color\", \"color\", \"color\", \"color\", \"colorado\", \"colorado\", \"colorado\", \"colorado\", \"colorado\", \"colorado\", \"colorado\", \"colorado\", \"columbia\", \"columbia\", \"columbia\", \"columbia\", \"columbia\", \"come\", \"come\", \"come\", \"come\", \"come\", \"come\", \"come\", \"come\", \"come\", \"come\", \"communic\", \"communic\", \"communic\", \"communic\", \"communic\", \"communic\", \"communic\", \"communic\", \"compil\", \"compil\", \"compil\", \"compil\", \"concordia\", \"config\", \"contradict\", \"contradict\", \"contradict\", \"contrib\", \"control\", \"control\", \"control\", \"control\", \"control\", \"control\", \"control\", \"control\", \"control\", \"copi\", \"copi\", \"copi\", \"copi\", \"copi\", \"copi\", \"copi\", \"copper\", \"cost\", \"cost\", \"cost\", \"cost\", \"cost\", \"cost\", \"cost\", \"cost\", \"counterst\", \"countri\", \"countri\", \"countri\", \"countri\", \"countri\", \"countri\", \"countri\", \"court\", \"court\", \"court\", \"court\", \"cramer\", \"crime\", \"crime\", \"crime\", \"crypt\", \"crypto\", \"cryptograph\", \"cryptographi\", \"ctrl\", \"cub\", \"cunixb\", \"cure\", \"cwru\", \"cwru\", \"data\", \"data\", \"data\", \"data\", \"data\", \"data\", \"data\", \"david\", \"david\", \"david\", \"david\", \"david\", \"david\", \"david\", \"david\", \"david\", \"david\", \"davidian\", \"dealer\", \"dealer\", \"dealer\", \"death\", \"death\", \"death\", \"death\", \"death\", \"death\", \"decrypt\", \"den\", \"desi\", \"design\", \"design\", \"design\", \"design\", \"design\", \"design\", \"design\", \"design\", \"design\", \"deskjet\", \"detroit\", \"devic\", \"devic\", \"devic\", \"devic\", \"diamond\", \"diet\", \"differ\", \"differ\", \"differ\", \"differ\", \"differ\", \"differ\", \"differ\", \"differ\", \"differ\", \"differ\", \"dillon\", \"directori\", \"directori\", \"directori\", \"diseas\", \"disk\", \"disk\", \"disk\", \"display\", \"display\", \"display\", \"display\", \"display\", \"display\", \"display\", \"distribut\", \"distribut\", \"distribut\", \"distribut\", \"distribut\", \"distribut\", \"distribut\", \"distribut\", \"distribut\", \"distribut\", \"divin\", \"divis\", \"divis\", \"divis\", \"divis\", \"divis\", \"divis\", \"divis\", \"divis\", \"divis\", \"dock\", \"doctor\", \"doctor\", \"doctor\", \"doctrin\", \"dodger\", \"drive\", \"drive\", \"drive\", \"drive\", \"drive\", \"drive\", \"drive\", \"drive\", \"driver\", \"driver\", \"driver\", \"driver\", \"driver\", \"dseg\", \"dseg\", \"dtmedin\", \"duke\", \"duke\", \"dyer\", \"earth\", \"earth\", \"earth\", \"earth\", \"earth\", \"earth\", \"edmonton\", \"effect\", \"effect\", \"effect\", \"effect\", \"effect\", \"effect\", \"effect\", \"effect\", \"effect\", \"effect\", \"einstein\", \"eisa\", \"email\", \"email\", \"email\", \"email\", \"email\", \"email\", \"email\", \"email\", \"encrypt\", \"enforc\", \"enforc\", \"enforc\", \"enforc\", \"enforc\", \"engin\", \"engin\", \"engin\", \"engin\", \"engin\", \"engin\", \"engin\", \"engin\", \"engin\", \"engin\", \"engr\", \"entri\", \"entri\", \"entri\", \"ericsson\", \"escrow\", \"esdi\", \"espn\", \"etern\", \"etern\", \"etern\", \"ether\", \"ethernet\", \"ethnic\", \"evid\", \"evid\", \"evid\", \"evid\", \"evid\", \"evid\", \"exist\", \"exist\", \"exist\", \"exist\", \"exist\", \"exist\", \"exist\", \"exist\", \"exist\", \"extermin\", \"faith\", \"faith\", \"fbihh\", \"feder\", \"feder\", \"feder\", \"feder\", \"file\", \"file\", \"file\", \"file\", \"final\", \"final\", \"final\", \"final\", \"final\", \"final\", \"final\", \"final\", \"final\", \"final\", \"firearm\", \"fischer\", \"flight\", \"flight\", \"flight\", \"flight\", \"floppi\", \"floppi\", \"flyer\", \"flyer\", \"fnal\", \"follow\", \"follow\", \"follow\", \"follow\", \"follow\", \"follow\", \"follow\", \"follow\", \"follow\", \"follow\", \"font\", \"font\", \"food\", \"food\", \"food\", \"food\", \"forc\", \"forc\", \"forc\", \"forc\", \"forc\", \"forc\", \"forc\", \"forc\", \"forc\", \"forc\", \"format\", \"format\", \"format\", \"format\", \"format\", \"freenet\", \"freenet\", \"freenet\", \"frost\", \"frost\", \"function\", \"function\", \"function\", \"function\", \"function\", \"function\", \"fund\", \"fund\", \"fund\", \"fund\", \"fund\", \"game\", \"game\", \"game\", \"game\", \"gatech\", \"gaza\", \"genet\", \"genet\", \"genocid\", \"go\", \"go\", \"go\", \"go\", \"go\", \"go\", \"go\", \"go\", \"go\", \"go\", \"goal\", \"goal\", \"goal\", \"goal\", \"goal\", \"goal\", \"god\", \"good\", \"good\", \"good\", \"good\", \"good\", \"good\", \"good\", \"good\", \"good\", \"good\", \"gordon\", \"gordon\", \"gospel\", \"govern\", \"govern\", \"govern\", \"govern\", \"gradi\", \"graphic\", \"graphic\", \"great\", \"great\", \"great\", \"great\", \"great\", \"great\", \"great\", \"great\", \"great\", \"great\", \"greec\", \"greec\", \"greek\", \"greek\", \"greenbelt\", \"grind\", \"grind\", \"grind\", \"grind\", \"grind\", \"grind\", \"grind\", \"group\", \"group\", \"group\", \"group\", \"group\", \"group\", \"group\", \"group\", \"group\", \"group\", \"gtoal\", \"gun\", \"gun\", \"halat\", \"hallam\", \"hamburg\", \"handbook\", \"handgun\", \"handgun\", \"handheld\", \"handheld\", \"handheld\", \"happen\", \"happen\", \"happen\", \"happen\", \"happen\", \"happen\", \"happen\", \"happen\", \"happen\", \"happen\", \"hard\", \"hard\", \"hard\", \"hard\", \"hard\", \"hard\", \"hard\", \"hard\", \"hard\", \"harley\", \"health\", \"health\", \"health\", \"health\", \"heaven\", \"heaven\", \"heaven\", \"heaven\", \"helmet\", \"helmet\", \"helmet\", \"help\", \"help\", \"help\", \"help\", \"help\", \"help\", \"help\", \"help\", \"help\", \"help\", \"henri\", \"henri\", \"higgin\", \"high\", \"high\", \"high\", \"high\", \"high\", \"high\", \"high\", \"high\", \"high\", \"high\", \"hit\", \"hit\", \"hit\", \"hit\", \"hit\", \"hitler\", \"hitter\", \"hockey\", \"holi\", \"holi\", \"home\", \"home\", \"home\", \"home\", \"home\", \"home\", \"home\", \"home\", \"home\", \"home\", \"homeopathi\", \"homicid\", \"honda\", \"hulman\", \"husc\", \"hydro\", \"iastat\", \"iastat\", \"ifa\", \"illinoi\", \"illinoi\", \"illinoi\", \"illinoi\", \"illinoi\", \"illinoi\", \"illinoi\", \"illinoi\", \"imag\", \"imag\", \"imag\", \"imag\", \"imag\", \"imak\", \"includ\", \"includ\", \"includ\", \"includ\", \"includ\", \"includ\", \"includ\", \"includ\", \"includ\", \"includ\", \"indiana\", \"indiana\", \"indiana\", \"indiana\", \"indiana\", \"indiana\", \"infect\", \"inform\", \"inform\", \"inform\", \"inform\", \"inform\", \"inform\", \"inform\", \"inform\", \"inform\", \"inform\", \"ingr\", \"ingr\", \"ingr\", \"inning\", \"instal\", \"instal\", \"instal\", \"instal\", \"instal\", \"insur\", \"insur\", \"insur\", \"insur\", \"intellect\", \"intercon\", \"internet\", \"internet\", \"internet\", \"internet\", \"internet\", \"internet\", \"internet\", \"internet\", \"invest\", \"invest\", \"iran\", \"islam\", \"islam\", \"isra\", \"israel\", \"israel\", \"israel\", \"jaeger\", \"jake\", \"jason\", \"jason\", \"jason\", \"jason\", \"jay\", \"jeff\", \"jeff\", \"jeff\", \"jeff\", \"jeff\", \"jeff\", \"jeff\", \"jesus\", \"jet\", \"jet\", \"jew\", \"jew\", \"jew\", \"job\", \"job\", \"job\", \"john\", \"john\", \"john\", \"john\", \"john\", \"john\", \"john\", \"john\", \"john\", \"john\", \"jumper\", \"jumper\", \"kaldi\", \"kelvin\", \"key\", \"key\", \"kill\", \"kill\", \"kill\", \"kill\", \"kill\", \"kill\", \"kill\", \"koresh\", \"lamp\", \"larc\", \"larc\", \"laughter\", \"launch\", \"launch\", \"laurentian\", \"leaf\", \"leagu\", \"leagu\", \"leav\", \"leav\", \"leav\", \"leav\", \"leav\", \"leav\", \"leav\", \"leav\", \"leav\", \"leav\", \"lebanes\", \"lemieux\", \"librari\", \"librari\", \"librari\", \"librari\", \"librari\", \"librari\", \"life\", \"life\", \"life\", \"life\", \"life\", \"life\", \"life\", \"life\", \"life\", \"life\", \"list\", \"list\", \"list\", \"list\", \"list\", \"list\", \"list\", \"list\", \"list\", \"list\", \"live\", \"live\", \"live\", \"live\", \"live\", \"live\", \"live\", \"live\", \"livesey\", \"long\", \"long\", \"long\", \"long\", \"long\", \"long\", \"long\", \"long\", \"long\", \"long\", \"look\", \"look\", \"look\", \"look\", \"look\", \"look\", \"look\", \"look\", \"look\", \"look\", \"lopez\", \"lord\", \"lord\", \"lose\", \"lose\", \"lose\", \"lose\", \"lose\", \"lose\", \"lose\", \"lose\", \"lose\", \"lose\", \"love\", \"love\", \"love\", \"love\", \"love\", \"love\", \"love\", \"love\", \"lunar\", \"lunar\", \"lyme\", \"machin\", \"machin\", \"machin\", \"machin\", \"machin\", \"machin\", \"machin\", \"machin\", \"magellan\", \"magnus\", \"mail\", \"mail\", \"mail\", \"mail\", \"mail\", \"mail\", \"mail\", \"mail\", \"map\", \"map\", \"mar\", \"mar\", \"marriag\", \"marriag\", \"massacr\", \"maxtor\", \"maynard\", \"mccall\", \"mcgill\", \"mcgill\", \"mcgill\", \"mean\", \"mean\", \"mean\", \"mean\", \"mean\", \"mean\", \"mean\", \"mean\", \"mean\", \"mean\", \"medic\", \"medic\", \"medic\", \"medic\", \"medic\", \"medicin\", \"medicin\", \"medicin\", \"medicin\", \"meg\", \"memori\", \"memori\", \"memori\", \"memori\", \"memori\", \"memori\", \"memori\", \"messag\", \"messag\", \"messag\", \"messag\", \"messag\", \"messag\", \"messag\", \"messag\", \"messag\", \"met\", \"metal\", \"metal\", \"metal\", \"metal\", \"methodolog\", \"midway\", \"midway\", \"midway\", \"migrain\", \"militia\", \"mime\", \"mission\", \"mission\", \"mission\", \"mission\", \"mksol\", \"mode\", \"mode\", \"mode\", \"mode\", \"mode\", \"mode\", \"modem\", \"modem\", \"modem\", \"money\", \"money\", \"money\", \"money\", \"money\", \"money\", \"money\", \"money\", \"monitor\", \"monitor\", \"monitor\", \"montreal\", \"montreal\", \"moon\", \"moon\", \"moon\", \"moral\", \"moral\", \"mormon\", \"motherboard\", \"motif\", \"motorcycl\", \"motto\", \"mous\", \"mous\", \"murder\", \"murder\", \"murder\", \"muslim\", \"muslim\", \"nasa\", \"nasa\", \"nasa\", \"nation\", \"nation\", \"nation\", \"nation\", \"nation\", \"nation\", \"nation\", \"nation\", \"nation\", \"nation\", \"nazi\", \"ncsl\", \"need\", \"need\", \"need\", \"need\", \"need\", \"need\", \"need\", \"need\", \"need\", \"need\", \"netcom\", \"netcom\", \"netcom\", \"netcom\", \"netcom\", \"netcom\", \"nist\", \"nist\", \"nore\", \"nsmca\", \"nubus\", \"number\", \"number\", \"number\", \"number\", \"number\", \"number\", \"number\", \"number\", \"number\", \"number\", \"ohio\", \"ohio\", \"ohio\", \"openwindow\", \"opinion\", \"opinion\", \"opinion\", \"opinion\", \"opinion\", \"opinion\", \"opinion\", \"opinion\", \"opinion\", \"opinion\", \"optilink\", \"oracl\", \"orbit\", \"orbit\", \"outlet\", \"outlet\", \"output\", \"output\", \"output\", \"owner\", \"owner\", \"owner\", \"owner\", \"owner\", \"owner\", \"owner\", \"pain\", \"pain\", \"pain\", \"pain\", \"pain\", \"palestinian\", \"patent\", \"patent\", \"patent\", \"patient\", \"patient\", \"pen\", \"penguin\", \"peopl\", \"peopl\", \"peopl\", \"peopl\", \"peopl\", \"peopl\", \"peopl\", \"peopl\", \"peopl\", \"peopl\", \"period\", \"period\", \"period\", \"period\", \"period\", \"period\", \"period\", \"period\", \"period\", \"person\", \"person\", \"person\", \"person\", \"person\", \"person\", \"person\", \"person\", \"person\", \"person\", \"phone\", \"phone\", \"phone\", \"phone\", \"phone\", \"phone\", \"phone\", \"phone\", \"photographi\", \"physician\", \"pistol\", \"pitch\", \"pitch\", \"pitcher\", \"pitt\", \"pitt\", \"pitt\", \"pittsburgh\", \"pittsburgh\", \"pittsburgh\", \"plaintext\", \"play\", \"play\", \"play\", \"play\", \"play\", \"play\", \"play\", \"play\", \"player\", \"player\", \"playoff\", \"plymouth\", \"point\", \"point\", \"point\", \"point\", \"point\", \"point\", \"point\", \"point\", \"point\", \"point\", \"polit\", \"polit\", \"polit\", \"polit\", \"polit\", \"polit\", \"polygon\", \"popul\", \"popul\", \"popul\", \"popul\", \"port\", \"port\", \"port\", \"power\", \"power\", \"power\", \"power\", \"power\", \"power\", \"power\", \"power\", \"power\", \"power\", \"powerbook\", \"presid\", \"presid\", \"presid\", \"presid\", \"price\", \"price\", \"price\", \"price\", \"price\", \"price\", \"price\", \"princeton\", \"princeton\", \"princeton\", \"princeton\", \"printer\", \"printer\", \"prism\", \"prison\", \"privaci\", \"privat\", \"privat\", \"privat\", \"privat\", \"privat\", \"privat\", \"privat\", \"probe\", \"probe\", \"probe\", \"problem\", \"problem\", \"problem\", \"problem\", \"problem\", \"problem\", \"problem\", \"problem\", \"problem\", \"problem\", \"program\", \"program\", \"program\", \"program\", \"program\", \"program\", \"project\", \"project\", \"project\", \"project\", \"project\", \"propheci\", \"prophet\", \"propos\", \"propos\", \"propos\", \"propos\", \"propos\", \"propos\", \"protect\", \"protect\", \"protect\", \"protect\", \"protect\", \"protect\", \"protect\", \"provid\", \"provid\", \"provid\", \"provid\", \"provid\", \"provid\", \"provid\", \"provid\", \"provid\", \"provid\", \"public\", \"public\", \"public\", \"public\", \"public\", \"public\", \"public\", \"public\", \"public\", \"puck\", \"pyron\", \"quadra\", \"qualcomm\", \"quebec\", \"question\", \"question\", \"question\", \"question\", \"question\", \"question\", \"question\", \"question\", \"question\", \"question\", \"quicktim\", \"raider\", \"ramsey\", \"ranck\", \"ranger\", \"ranger\", \"read\", \"read\", \"read\", \"read\", \"read\", \"read\", \"read\", \"read\", \"read\", \"read\", \"reason\", \"reason\", \"reason\", \"reason\", \"reason\", \"reason\", \"reason\", \"reason\", \"reason\", \"reason\", \"recipi\", \"recipi\", \"redesign\", \"reilli\", \"religi\", \"religi\", \"religion\", \"religion\", \"repli\", \"repli\", \"repli\", \"repli\", \"repli\", \"repli\", \"repli\", \"repli\", \"repli\", \"repli\", \"research\", \"research\", \"research\", \"research\", \"research\", \"research\", \"research\", \"research\", \"research\", \"research\", \"resourc\", \"resourc\", \"resourc\", \"resourc\", \"resourc\", \"resourc\", \"restaur\", \"result\", \"result\", \"result\", \"result\", \"result\", \"result\", \"result\", \"result\", \"result\", \"result\", \"resurrect\", \"revel\", \"revolv\", \"rid\", \"rid\", \"ride\", \"ride\", \"rider\", \"right\", \"right\", \"right\", \"right\", \"right\", \"right\", \"right\", \"right\", \"right\", \"right\", \"ripem\", \"risk\", \"risk\", \"risk\", \"risk\", \"risk\", \"risk\", \"risk\", \"rkba\", \"road\", \"road\", \"road\", \"road\", \"road\", \"road\", \"road\", \"robi\", \"rochest\", \"rochest\", \"rochest\", \"rochest\", \"rochest\", \"rocki\", \"rockwel\", \"run\", \"run\", \"run\", \"run\", \"run\", \"run\", \"run\", \"run\", \"rutger\", \"rutger\", \"rwing\", \"sabbath\", \"sale\", \"sale\", \"sale\", \"sale\", \"sale\", \"sandvik\", \"satan\", \"satellit\", \"satellit\", \"say\", \"say\", \"say\", \"say\", \"say\", \"say\", \"say\", \"say\", \"say\", \"say\", \"scheme\", \"scheme\", \"scheme\", \"scheme\", \"scheme\", \"schneider\", \"scienc\", \"scienc\", \"scienc\", \"scienc\", \"scienc\", \"scienc\", \"scienc\", \"scienc\", \"scienc\", \"scienc\", \"scientif\", \"scientif\", \"scientif\", \"scientif\", \"scientif\", \"score\", \"score\", \"scott\", \"scott\", \"scott\", \"scott\", \"scott\", \"scott\", \"scott\", \"screen\", \"screen\", \"screen\", \"screen\", \"scriptur\", \"scsi\", \"sdpa\", \"sdsu\", \"season\", \"season\", \"secret\", \"secret\", \"secret\", \"secur\", \"secur\", \"secur\", \"secur\", \"selann\", \"sell\", \"sell\", \"sell\", \"sell\", \"sell\", \"sell\", \"sell\", \"sell\", \"send\", \"send\", \"send\", \"send\", \"send\", \"send\", \"send\", \"send\", \"send\", \"send\", \"sera\", \"serdar\", \"server\", \"server\", \"shafer\", \"shaft\", \"shaft\", \"shark\", \"shotgun\", \"shuttl\", \"shuttl\", \"simm\", \"sin\", \"skeptic\", \"skeptic\", \"skndiv\", \"slaughter\", \"sleev\", \"sleev\", \"sleev\", \"smith\", \"smith\", \"smith\", \"smith\", \"smith\", \"smith\", \"smith\", \"smith\", \"smuggl\", \"softwar\", \"softwar\", \"softwar\", \"softwar\", \"softwar\", \"softwar\", \"softwar\", \"softwar\", \"softwar\", \"solar\", \"solar\", \"solar\", \"soldier\", \"soldier\", \"solntz\", \"sourc\", \"sourc\", \"sourc\", \"sourc\", \"sourc\", \"sourc\", \"sourc\", \"sourc\", \"sourc\", \"space\", \"space\", \"space\", \"space\", \"space\", \"spacecraft\", \"spacecraft\", \"spec\", \"spec\", \"spec\", \"speed\", \"speed\", \"speed\", \"speed\", \"speed\", \"spencer\", \"spend\", \"spend\", \"spend\", \"spend\", \"spend\", \"spend\", \"spend\", \"spend\", \"spend\", \"spend\", \"sphere\", \"spirit\", \"spirit\", \"spirit\", \"ssto\", \"stanford\", \"stanford\", \"stanford\", \"stanford\", \"stanford\", \"stanford\", \"stanford\", \"stanford\", \"stanley\", \"stanley\", \"stanley\", \"start\", \"start\", \"start\", \"start\", \"start\", \"start\", \"start\", \"start\", \"start\", \"start\", \"starter\", \"state\", \"state\", \"state\", \"state\", \"state\", \"state\", \"state\", \"state\", \"state\", \"state\", \"station\", \"station\", \"station\", \"station\", \"station\", \"station\", \"station\", \"station\", \"sternlight\", \"steve\", \"steve\", \"steve\", \"steve\", \"steve\", \"steve\", \"steve\", \"steve\", \"steveh\", \"stimulus\", \"stratus\", \"strnlght\", \"studi\", \"studi\", \"studi\", \"studi\", \"studi\", \"studi\", \"studi\", \"studi\", \"suno\", \"superstit\", \"surveil\", \"svga\", \"swap\", \"syndrom\", \"take\", \"take\", \"take\", \"take\", \"take\", \"take\", \"take\", \"take\", \"take\", \"take\", \"tampa\", \"teach\", \"teach\", \"teach\", \"teach\", \"teach\", \"team\", \"team\", \"team\", \"team\", \"team\", \"technolog\", \"technolog\", \"technolog\", \"technolog\", \"technolog\", \"technolog\", \"technolog\", \"technolog\", \"technolog\", \"tell\", \"tell\", \"tell\", \"tell\", \"tell\", \"tell\", \"tell\", \"tell\", \"tell\", \"tell\", \"tennesse\", \"test\", \"test\", \"test\", \"test\", \"test\", \"test\", \"test\", \"test\", \"testament\", \"thank\", \"thank\", \"thank\", \"thank\", \"thank\", \"thank\", \"thank\", \"thank\", \"thank\", \"theist\", \"theodor\", \"theolog\", \"theori\", \"theori\", \"theori\", \"theori\", \"theori\", \"theori\", \"therapi\", \"thing\", \"thing\", \"thing\", \"thing\", \"thing\", \"thing\", \"thing\", \"thing\", \"thing\", \"thing\", \"thomasp\", \"tiff\", \"tiger\", \"time\", \"time\", \"time\", \"time\", \"time\", \"time\", \"time\", \"time\", \"time\", \"time\", \"tire\", \"tire\", \"tire\", \"tire\", \"tire\", \"toolkit\", \"toronto\", \"toronto\", \"toronto\", \"toronto\", \"toronto\", \"treatment\", \"treatment\", \"troop\", \"true\", \"true\", \"true\", \"true\", \"true\", \"true\", \"true\", \"true\", \"true\", \"true\", \"trunk\", \"truth\", \"truth\", \"truth\", \"truth\", \"truth\", \"turk\", \"turkey\", \"turkish\", \"ualberta\", \"uchicago\", \"uchicago\", \"uchicago\", \"ucsc\", \"uicvm\", \"uiuc\", \"uiuc\", \"uiuc\", \"uiuc\", \"uiuc\", \"uiuc\", \"uiuc\", \"uiuc\", \"umich\", \"umich\", \"umich\", \"uoknor\", \"upgrad\", \"upgrad\", \"urartu\", \"urbana\", \"urbana\", \"urbana\", \"user\", \"user\", \"user\", \"user\", \"utah\", \"utkvm\", \"uvic\", \"veal\", \"vehicl\", \"vehicl\", \"vehicl\", \"vehicl\", \"vers\", \"version\", \"version\", \"version\", \"version\", \"version\", \"version\", \"version\", \"version\", \"version\", \"vesa\", \"vesselin\", \"video\", \"video\", \"video\", \"video\", \"villag\", \"villag\", \"virginia\", \"virginia\", \"virginia\", \"virginia\", \"virginia\", \"virginia\", \"virginia\", \"visual\", \"visual\", \"volt\", \"vram\", \"waco\", \"waco\", \"wagon\", \"wagon\", \"want\", \"want\", \"want\", \"want\", \"want\", \"want\", \"want\", \"want\", \"want\", \"want\", \"water\", \"water\", \"water\", \"water\", \"water\", \"weapon\", \"weapon\", \"weapon\", \"wheel\", \"wheel\", \"widget\", \"window\", \"window\", \"window\", \"wing\", \"wing\", \"wing\", \"wing\", \"wing\", \"winnipeg\", \"winnipeg\", \"wire\", \"wire\", \"wire\", \"wiretap\", \"word\", \"word\", \"word\", \"word\", \"word\", \"word\", \"word\", \"word\", \"word\", \"word\", \"work\", \"work\", \"work\", \"work\", \"work\", \"work\", \"work\", \"work\", \"work\", \"work\", \"world\", \"world\", \"world\", \"world\", \"world\", \"world\", \"world\", \"world\", \"world\", \"world\", \"worship\", \"worship\", \"xlib\", \"xpert\", \"xterm\", \"xview\", \"yamaha\", \"yanke\", \"year\", \"year\", \"year\", \"year\", \"year\", \"year\", \"year\", \"year\", \"year\", \"year\", \"yeast\", \"zoolog\", \"zuma\"]}, \"R\": 30, \"lambda.step\": 0.01, \"plot.opts\": {\"xlab\": \"PC1\", \"ylab\": \"PC2\"}, \"topic.order\": [3, 1, 8, 9, 2, 4, 7, 10, 5, 6]};\n", + "\n", + "function LDAvis_load_lib(url, callback){\n", + " var s = document.createElement('script');\n", + " s.src = url;\n", + " s.async = true;\n", + " s.onreadystatechange = s.onload = callback;\n", + " s.onerror = function(){console.warn(\"failed to load library \" + url);};\n", + " document.getElementsByTagName(\"head\")[0].appendChild(s);\n", + "}\n", + "\n", + "if(typeof(LDAvis) !== \"undefined\"){\n", + " // already loaded: just create the visualization\n", + " !function(LDAvis){\n", + " new LDAvis(\"#\" + \"ldavis_el591011124069819927707340541\", ldavis_el591011124069819927707340541_data);\n", + " }(LDAvis);\n", + "}else if(typeof define === \"function\" && define.amd){\n", + " // require.js is available: use it to load d3/LDAvis\n", + " require.config({paths: {d3: \"https://cdnjs.cloudflare.com/ajax/libs/d3/3.5.5/d3.min\"}});\n", + " require([\"d3\"], function(d3){\n", + " window.d3 = d3;\n", + " LDAvis_load_lib(\"https://cdn.rawgit.com/bmabey/pyLDAvis/files/ldavis.v1.0.0.js\", function(){\n", + " new LDAvis(\"#\" + \"ldavis_el591011124069819927707340541\", ldavis_el591011124069819927707340541_data);\n", + " });\n", + " });\n", + "}else{\n", + " // require.js not available: dynamically load d3 & LDAvis\n", + " LDAvis_load_lib(\"https://cdnjs.cloudflare.com/ajax/libs/d3/3.5.5/d3.min.js\", function(){\n", + " LDAvis_load_lib(\"https://cdn.rawgit.com/bmabey/pyLDAvis/files/ldavis.v1.0.0.js\", function(){\n", + " new LDAvis(\"#\" + \"ldavis_el591011124069819927707340541\", ldavis_el591011124069819927707340541_data);\n", + " })\n", + " });\n", + "}\n", + "</script>" + ], + "text/plain": [ + "<IPython.core.display.HTML object>" + ] + }, + "execution_count": 26, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "show_pyldavis('/Users/williamjaubert/Documents/Allianz_William/', 'pyldavis_test_func')" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Step 7: Testing model on unseen document" + ] + }, + { + "cell_type": "code", + "execution_count": 74, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Subject: help\n", + "From: C..Doelle@p26.f3333.n106.z1.fidonet.org (C. Doelle)\n", + "Lines: 13\n", + "\n", + "Hello All!\n", + "\n", + " It is my understanding that all True-Type fonts in Windows are loaded in\n", + "prior to starting Windows - this makes getting into Windows quite slow if you\n", + "have hundreds of them as I do. First off, am I correct in this thinking -\n", + "secondly, if that is the case - can you get Windows to ignore them on boot and\n", + "maybe make something like a PIF file to load them only when you enter the\n", + "applications that need fonts? Any ideas?\n", + "\n", + "\n", + "Chris\n", + "\n", + " * Origin: chris.doelle.@f3333.n106.z1.fidonet.org (1:106/3333.26)\n", + "\n" + ] + } + ], + "source": [ + "unseen_document = newsgroups_test.data[100]\n", + "print(unseen_document)" + ] + }, + { + "cell_type": "code", + "execution_count": 75, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "# Data preprocessing step for the unseen document\n", + "bow_new = dictionary.doc2bow(preprocess(unseen_document))" + ] + }, + { + "cell_type": "code", + "execution_count": 48, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "from nautilus_nlp.models.topic_modeling import fit_data" + ] + }, + { + "cell_type": "code", + "execution_count": 31, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "[(0, 0.0027796067),\n", + " (1, 0.002779247),\n", + " (2, 0.0027795879),\n", + " (3, 0.0027795406),\n", + " (4, 0.0027792477),\n", + " (5, 0.002779096),\n", + " (6, 0.0027791534),\n", + " (7, 0.20895894),\n", + " (8, 0.76880664),\n", + " (9, 0.0027789928)]" + ] + }, + "execution_count": 31, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "fit_data(model, bow_new)" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "# Show the dominant topics of the new document and their keywords \n", + "from nautilus_nlp.models.topic_modeling import show_dominant_topic" + ] + }, + { + "cell_type": "code", + "execution_count": 147, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Score: 0.7688832879066467\t Topic: ['window', 'drive', 'problem', 'card', 'work']\n", + "Score: 0.2088821828365326\t Topic: ['file', 'program', 'mail', 'imag', 'inform']\n", + "Score: 0.0027796069625765085\t Topic: ['christian', 'peopl', 'believ', 'jesus', 'say']\n" + ] + } + ], + "source": [ + "show_dominant_topic(model, bow_new, 3)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": true + }, + "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.7.0" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} From 7216e97cefbc152544306cad170d2d478222c147 Mon Sep 17 00:00:00 2001 From: hugovasselin <waaaouu@gmail.com> Date: Wed, 5 Jun 2019 11:48:50 +0200 Subject: [PATCH 204/496] rm buggy notebook --- notebooks/TopicModeling.ipynb | 1023 --------------------------------- 1 file changed, 1023 deletions(-) delete mode 100644 notebooks/TopicModeling.ipynb diff --git a/notebooks/TopicModeling.ipynb b/notebooks/TopicModeling.ipynb deleted file mode 100644 index c58cf2c..0000000 --- a/notebooks/TopicModeling.ipynb +++ /dev/null @@ -1,1023 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Step 1: Load the dataset" - ] - }, - { - "cell_type": "code", -<<<<<<< HEAD - "execution_count": 8, - "metadata": { - "collapsed": true - }, -======= - "execution_count": 1, - "metadata": {}, ->>>>>>> 6197a072a0845f714fca92bb469a7e224b1c15d3 - "outputs": [], - "source": [ - "from sklearn.datasets import fetch_20newsgroups\n", - "newsgroups_train = fetch_20newsgroups(subset='train', shuffle = True)\n", - "newsgroups_test = fetch_20newsgroups(subset='test', shuffle = True)" - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "['alt.atheism', 'comp.graphics', 'comp.os.ms-windows.misc', 'comp.sys.ibm.pc.hardware', 'comp.sys.mac.hardware', 'comp.windows.x', 'misc.forsale', 'rec.autos', 'rec.motorcycles', 'rec.sport.baseball', 'rec.sport.hockey', 'sci.crypt', 'sci.electronics', 'sci.med', 'sci.space', 'soc.religion.christian', 'talk.politics.guns', 'talk.politics.mideast', 'talk.politics.misc', 'talk.religion.misc']\n" - ] - } - ], - "source": [ - "print(list(newsgroups_train.target_names))" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Step 2: Data Preprocessing¶\n" - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "metadata": {}, - "outputs": [], - "source": [ - "import gensim\n", - "from gensim.utils import simple_preprocess\n", - "from gensim.parsing.preprocessing import STOPWORDS\n", - "from nltk.stem import WordNetLemmatizer, SnowballStemmer\n", - "from nltk.stem.porter import *\n", - "import numpy as np\n", - "np.random.seed(400)\n", - "\n", - "import nltk\n", - "\n", - "import pandas as pd\n", - "stemmer = SnowballStemmer(\"english\")" - ] - }, - { - "cell_type": "code", -<<<<<<< HEAD - "execution_count": 11, - "metadata": { - "collapsed": true - }, -======= - "execution_count": 4, - "metadata": {}, ->>>>>>> 6197a072a0845f714fca92bb469a7e224b1c15d3 - "outputs": [], - "source": [ - "def lemmatize_stemming(text):\n", - " return stemmer.stem(WordNetLemmatizer().lemmatize(text, pos='v'))\n", - "\n", - "# Tokenize and lemmatize\n", - "def preprocess(text):\n", - " result=[]\n", - " for token in gensim.utils.simple_preprocess(text) :\n", - " if token not in gensim.parsing.preprocessing.STOPWORDS and len(token) > 3:\n", - " result.append(lemmatize_stemming(token))\n", - " \n", - " return result" - ] - }, - { - "cell_type": "code", -<<<<<<< HEAD - "execution_count": 12, - "metadata": { - "collapsed": true - }, -======= - "execution_count": 5, - "metadata": {}, ->>>>>>> 6197a072a0845f714fca92bb469a7e224b1c15d3 - "outputs": [], - "source": [ - "processed_docs = []\n", - "\n", - "for doc in newsgroups_train.data:\n", - " processed_docs.append(preprocess(doc))" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Step 3: Bag of words" - ] - }, - { - "cell_type": "code", -<<<<<<< HEAD - "execution_count": 13, - "metadata": { - "collapsed": true - }, -======= - "execution_count": 6, - "metadata": {}, ->>>>>>> 6197a072a0845f714fca92bb469a7e224b1c15d3 - "outputs": [], - "source": [ - "# Create the dictionnary\n", - "from nautilus_nlp.models.topic_modeling import create_dictionary" - ] - }, - { - "cell_type": "code", -<<<<<<< HEAD - "execution_count": 14, - "metadata": { - "collapsed": true - }, -======= - "execution_count": 7, - "metadata": {}, ->>>>>>> 6197a072a0845f714fca92bb469a7e224b1c15d3 - "outputs": [], - "source": [ - "dictionary = create_dictionary(processed_docs)" - ] - }, - { - "cell_type": "code", -<<<<<<< HEAD - "execution_count": 15, - "metadata": { - "collapsed": true - }, -======= - "execution_count": 8, - "metadata": {}, ->>>>>>> 6197a072a0845f714fca92bb469a7e224b1c15d3 - "outputs": [], - "source": [ - "# Filter out tokens that appear in too few or too many documents\n", - "from nautilus_nlp.models.topic_modeling import filter_extremes" - ] - }, - { - "cell_type": "code", -<<<<<<< HEAD - "execution_count": 16, - "metadata": { - "collapsed": true - }, -======= - "execution_count": 9, - "metadata": {}, ->>>>>>> 6197a072a0845f714fca92bb469a7e224b1c15d3 - "outputs": [], - "source": [ - "filter_extremes(dictionary)" - ] - }, - { - "cell_type": "code", -<<<<<<< HEAD - "execution_count": 17, - "metadata": { - "collapsed": true - }, -======= - "execution_count": 10, - "metadata": {}, ->>>>>>> 6197a072a0845f714fca92bb469a7e224b1c15d3 - "outputs": [], - "source": [ - "# Create the bow \n", - "from nautilus_nlp.models.topic_modeling import create_bow_corpus" - ] - }, - { - "cell_type": "code", -<<<<<<< HEAD - "execution_count": 18, - "metadata": { - "collapsed": true - }, -======= - "execution_count": 11, - "metadata": {}, ->>>>>>> 6197a072a0845f714fca92bb469a7e224b1c15d3 - "outputs": [], - "source": [ - "bow_corpus = create_bow_corpus(processed_docs, dictionary)" - ] - }, - { - "cell_type": "code", - "execution_count": 12, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "[(13, 1), (26, 1), (55, 1), (88, 1), (99, 1), (152, 1), (153, 2), (154, 1), (155, 1), (156, 1), (157, 2), (158, 1), (159, 2), (160, 4), (161, 1), (162, 2), (163, 1), (164, 2), (165, 1), (166, 1), (167, 1), (168, 1), (169, 1), (170, 1), (171, 1), (172, 1), (173, 1), (174, 1), (175, 1), (176, 1), (177, 1), (178, 2), (179, 1), (180, 1), (181, 1), (182, 1)]\n" - ] - } - ], - "source": [ - "print(bow_corpus[3])" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Step 4: Find optimal number of topics" - ] - }, - { - "cell_type": "code", - "execution_count": 13, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "# Compute coherence values for various number of topics in order to pick the optimal one\n", - "from nautilus_nlp.models.topic_modeling import compute_coherence_values" - ] - }, - { - "cell_type": "code", - "execution_count": 14, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "# Take a long time to run\n", - "model_list, coherence_values = compute_coherence_values(dictionary=dictionary, bow_corpus=bow_corpus, texts=processed_docs, start=2, limit=25, step=4)\n" - ] - }, - { - "cell_type": "code", - "execution_count": 17, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "[0.37900998646286865,\n", - " 0.42680154447577845,\n", - " 0.47716566398237525,\n", - " 0.5261650723885645,\n", - " 0.49607461078243215,\n", - " 0.4978727171365794]" - ] - }, - "execution_count": 17, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "coherence_values" - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "from nautilus_nlp.models.topic_modeling import plot_optimal_topic_number" - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "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\n", - "text/plain": [ - "<Figure size 432x288 with 1 Axes>" - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - } - ], - "source": [ - "plot_optimal_topic_number(coherence_values, start=2, limit=25, step=4)" - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "# Print the coherences scores for the number we tested\n", - "from nautilus_nlp.models.topic_modeling import print_coherence_scores" - ] - }, - { - "cell_type": "code", - "execution_count": 5, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Num Topics = 2 has Coherence Value of 0.379\n", - "Num Topics = 6 has Coherence Value of 0.4268\n", - "Num Topics = 10 has Coherence Value of 0.4772\n", - "Num Topics = 14 has Coherence Value of 0.5262\n", - "Num Topics = 18 has Coherence Value of 0.4961\n", - "Num Topics = 22 has Coherence Value of 0.4979\n" - ] - } - ], - "source": [ - "print_coherence_scores(coherence_values)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Step 5: Running LDA using Bag of Words with Gensim or Mallet" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "#### Gensim" - ] - }, - { - "cell_type": "code", -<<<<<<< HEAD - "execution_count": 12, - "metadata": { - "collapsed": true - }, -======= - "execution_count": 13, - "metadata": {}, ->>>>>>> 6197a072a0845f714fca92bb469a7e224b1c15d3 - "outputs": [], - "source": [ - "# Train the LDA model with gensim\n", - "from nautilus_nlp.models.topic_modeling import train_lda_model" - ] - }, - { - "cell_type": "code", -<<<<<<< HEAD - "execution_count": 13, - "metadata": { - "collapsed": true - }, -======= - "execution_count": 14, - "metadata": {}, ->>>>>>> 6197a072a0845f714fca92bb469a7e224b1c15d3 - "outputs": [], - "source": [ - "# By default the model used will be gensim implementation of LDA\n", - "model = train_lda_model(bow_corpus, dictionary, 10)" - ] - }, - { - "cell_type": "code", - "execution_count": 15, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "<gensim.models.ldamodel.LdaModel at 0x10a171ef0>" - ] - }, - "execution_count": 15, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "model" - ] - }, - { - "cell_type": "code", -<<<<<<< HEAD - "execution_count": 15, - "metadata": { - "collapsed": true - }, -======= - "execution_count": 53, - "metadata": {}, ->>>>>>> 6197a072a0845f714fca92bb469a7e224b1c15d3 - "outputs": [], - "source": [ - "# Save model: The model will be saved on your current emplacement.\n", - "from nautilus_nlp.models.topic_modeling import save_model" - ] - }, - { - "cell_type": "code", -<<<<<<< HEAD - "execution_count": 16, - "metadata": { - "collapsed": true - }, -======= - "execution_count": 54, - "metadata": {}, ->>>>>>> 6197a072a0845f714fca92bb469a7e224b1c15d3 - "outputs": [], - "source": [ - "save_model(model, 'ldamodel_nautilus')" - ] - }, - { - "cell_type": "code", -<<<<<<< HEAD - "execution_count": 152, - "metadata": { - "collapsed": true - }, -======= - "execution_count": 24, - "metadata": {}, ->>>>>>> 6197a072a0845f714fca92bb469a7e224b1c15d3 - "outputs": [], - "source": [ - "# Load model" - ] - }, - { - "cell_type": "code", -<<<<<<< HEAD - "execution_count": 17, - "metadata": { - "collapsed": true - }, -======= - "execution_count": 55, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "<gensim.models.ldamodel.LdaModel at 0x1a3142fc88>" - ] - }, - "execution_count": 55, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "model_loaded = load_model('/Users/williamjaubert/nautilus_nlp/notebooks', 'ldamodel_nautilus')\n", - "model_loaded" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "#### Mallet " - ] - }, - { - "cell_type": "code", - "execution_count": 22, - "metadata": {}, ->>>>>>> 6197a072a0845f714fca92bb469a7e224b1c15d3 - "outputs": [], - "source": [ - "# You can train Mallet model by precising 'mallet' in the model parameter and give the path where the mallet-2.0.8 file that has been downloaded \n", - "model_mallet = train_lda_model(bow_corpus, dictionary, 10, model='mallet', mallet_path='/Users/williamjaubert/nautilus_nlp')" - ] - }, - { - "cell_type": "code", - "execution_count": 23, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "<gensim.models.wrappers.ldamallet.LdaMallet at 0x1a2eb0e320>" - ] - }, - "execution_count": 23, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "model_mallet" - ] - }, - { - "cell_type": "code", - "execution_count": 47, - "metadata": {}, - "outputs": [], - "source": [ - "save_model(model_mallet, 'ldamodel_mallet_nautilus')" - ] - }, - { - "cell_type": "code", - "execution_count": 52, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "<gensim.models.wrappers.ldamallet.LdaMallet at 0x1a30d1e550>" - ] - }, - "execution_count": 52, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "model_mallet_loaded = load_model('/Users/williamjaubert/nautilus_nlp/notebooks', 'ldamodel_mallet_nautilus', model='mallet')\n", - "model_mallet_loaded" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Step 6: Visualize the top keywords per topic with Pyldavis interactive chart" - ] - }, - { - "cell_type": "code", -<<<<<<< HEAD - "execution_count": 19, - "metadata": { - "collapsed": true - }, -======= - "execution_count": 56, - "metadata": {}, ->>>>>>> 6197a072a0845f714fca92bb469a7e224b1c15d3 - "outputs": [], - "source": [ - "# Display the top keywords per topic in a interactive chart\n", - "from nautilus_nlp.models.topic_modeling import visualize_topics" - ] - }, - { - "cell_type": "code", - "execution_count": 30, - "metadata": { - "collapsed": true - }, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "/Users/williamjaubert/anaconda2/envs/nautilus/lib/python3.7/site-packages/pyLDAvis/_prepare.py:257: FutureWarning: Sorting because non-concatenation axis is not aligned. A future version\n", - "of pandas will change to not sort by default.\n", - "\n", - "To accept the future behavior, pass 'sort=False'.\n", - "\n", - "To retain the current behavior and silence the warning, pass 'sort=True'.\n", - "\n", - " return pd.concat([default_term_info] + list(topic_dfs))\n" - ] - }, - { - "data": { - "text/html": [ - "\n", - "<link rel=\"stylesheet\" type=\"text/css\" href=\"https://cdn.rawgit.com/bmabey/pyLDAvis/files/ldavis.v1.0.0.css\">\n", - "\n", - "\n", - "<div id=\"ldavis_el155871124265505206097197808\"></div>\n", - "<script type=\"text/javascript\">\n", - "\n", - "var ldavis_el155871124265505206097197808_data = {\"mdsDat\": {\"x\": [-0.07866945427665124, -0.01699948489792914, 0.20896689238873523, 0.14744605031212607, -0.008849073212760983, -0.04505413872814077, -0.08949897686453376, 0.10780299734830809, 0.004524270451044093, -0.22966908252019716], \"y\": [-0.15170611822961017, -0.1504468301902949, 0.08013685816591506, 0.13647834612774523, -0.009046128981188077, 0.003906923765221535, 0.14472746444813225, -0.07737607739594787, -0.1051004751701791, 0.1284260374602061], \"topics\": [1, 2, 3, 4, 5, 6, 7, 8, 9, 10], \"cluster\": [1, 1, 1, 1, 1, 1, 1, 1, 1, 1], \"Freq\": [13.182523727416992, 12.927214622497559, 12.466279029846191, 11.995635986328125, 9.558399200439453, 9.468915939331055, 8.925769805908203, 7.879937648773193, 7.025284290313721, 6.570040225982666]}, \"tinfo\": {\"Category\": [\"Default\", \"Default\", \"Default\", \"Default\", \"Default\", \"Default\", \"Default\", \"Default\", \"Default\", \"Default\", \"Default\", \"Default\", \"Default\", \"Default\", \"Default\", \"Default\", \"Default\", \"Default\", \"Default\", \"Default\", \"Default\", \"Default\", \"Default\", \"Default\", \"Default\", \"Default\", \"Default\", \"Default\", \"Default\", \"Default\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\"], \"Freq\": [2966.0, 1940.0, 1924.0, 1689.0, 2638.0, 2884.0, 1860.0, 1161.0, 1997.0, 1477.0, 1274.0, 1016.0, 1577.0, 1423.0, 1059.0, 1331.0, 1142.0, 2600.0, 837.0, 1391.0, 6052.0, 742.0, 990.0, 784.0, 1802.0, 1023.0, 4004.0, 867.0, 1190.0, 747.0, 1142.055419921875, 698.05224609375, 406.822998046875, 375.2376708984375, 365.2073059082031, 324.9424743652344, 317.34478759765625, 293.7341003417969, 242.91107177734375, 242.62696838378906, 238.57559204101562, 222.68405151367188, 219.24844360351562, 497.5247802734375, 182.90701293945312, 189.09542846679688, 180.7755584716797, 167.61598205566406, 170.0655975341797, 162.4678955078125, 156.04269409179688, 152.99169921875, 147.42819213867188, 144.9635009765625, 144.00869750976562, 142.5484161376953, 140.01553344726562, 137.27061462402344, 111.63611602783203, 111.36160278320312, 296.4661560058594, 234.76409912109375, 534.499755859375, 227.33987426757812, 733.429931640625, 290.58575439453125, 1027.8203125, 194.5054931640625, 462.2497863769531, 638.7841186523438, 383.043212890625, 557.0750732421875, 270.9018249511719, 346.3732604980469, 2339.71875, 353.4012145996094, 956.245849609375, 1366.771240234375, 489.0573425292969, 1502.895751953125, 432.2204284667969, 423.6861267089844, 946.194091796875, 647.374267578125, 868.9714965820312, 843.220458984375, 679.2152099609375, 536.1279907226562, 452.23583984375, 627.34814453125, 723.7843017578125, 487.5303955078125, 627.2381591796875, 480.2864074707031, 485.9241027832031, 520.5202026367188, 439.0645751953125, 1273.9940185546875, 843.2352905273438, 687.68017578125, 378.1650390625, 599.6139526367188, 284.2032165527344, 264.94561767578125, 257.7326354980469, 233.39744567871094, 198.56727600097656, 196.57557678222656, 186.44007873535156, 185.79148864746094, 190.49740600585938, 160.6958770751953, 157.22314453125, 147.5255126953125, 143.9540557861328, 141.30377197265625, 132.96551513671875, 132.7198944091797, 136.27581787109375, 134.09678649902344, 122.40459442138672, 117.67374420166016, 110.74125671386719, 103.36602783203125, 103.82383728027344, 102.62226867675781, 191.18621826171875, 1897.701904296875, 734.26708984375, 595.4009399414062, 628.1726684570312, 206.8068084716797, 246.9746551513672, 800.2630004882812, 749.1760864257812, 336.1791687011719, 271.76513671875, 265.7337646484375, 398.0518493652344, 574.373046875, 250.1859588623047, 378.887451171875, 461.79827880859375, 1507.2969970703125, 256.8887939453125, 577.1434936523438, 989.2410888671875, 369.3199768066406, 600.9796142578125, 735.3451538085938, 547.3312377929688, 671.5762939453125, 658.3866577148438, 983.743896484375, 1571.6390380859375, 640.6453247070312, 527.5475463867188, 1109.1285400390625, 876.5189208984375, 725.872802734375, 862.2279052734375, 662.5578002929688, 745.310791015625, 665.8807373046875, 603.2730102539062, 672.1204833984375, 613.4678344726562, 579.8084716796875, 513.6640625, 478.726806640625, 261.3017272949219, 304.5247802734375, 182.1022186279297, 164.4860076904297, 158.4976806640625, 152.06784057617188, 137.89913940429688, 135.18289184570312, 117.30463409423828, 101.55142974853516, 100.56641387939453, 94.58324432373047, 94.09687042236328, 92.84982299804688, 88.5089340209961, 85.08229064941406, 77.89446258544922, 76.2107925415039, 74.78726196289062, 76.93608856201172, 66.28611755371094, 65.85179901123047, 62.60702896118164, 61.64711380004883, 56.684181213378906, 56.66085433959961, 56.48657989501953, 56.25629425048828, 433.47705078125, 57.65424346923828, 175.3953399658203, 811.90380859375, 352.3983459472656, 460.9333190917969, 1244.6767578125, 397.8313903808594, 319.14727783203125, 364.238525390625, 817.3678588867188, 179.156005859375, 759.4703979492188, 353.9140319824219, 768.052490234375, 704.2166748046875, 1031.30419921875, 338.80908203125, 853.342041015625, 1558.97509765625, 1291.6134033203125, 922.5968627929688, 1345.8406982421875, 471.89697265625, 490.1734313964844, 677.6243896484375, 1059.35986328125, 853.4227294921875, 843.9307861328125, 1006.844482421875, 803.6572265625, 784.7794799804688, 584.8036499023438, 572.954345703125, 507.81884765625, 935.0308227539062, 496.60784912109375, 583.3577880859375, 624.0257568359375, 588.1732788085938, 615.0451049804688, 528.2354736328125, 511.3616638183594, 511.8392028808594, 866.5529174804688, 316.7214050292969, 249.29296875, 229.89987182617188, 228.7329864501953, 211.54818725585938, 183.02696228027344, 166.189453125, 164.78927612304688, 155.5567626953125, 157.8963623046875, 359.6830749511719, 133.46484375, 124.17033386230469, 122.31136322021484, 117.03580474853516, 111.2578125, 110.83413696289062, 109.16254425048828, 103.20903778076172, 98.91317749023438, 514.7620239257812, 89.62692260742188, 82.74740600585938, 81.7151107788086, 103.24954986572266, 75.25740814208984, 75.21385955810547, 70.78356170654297, 69.34468078613281, 281.7769775390625, 311.1161804199219, 971.2522583007812, 208.0157012939453, 697.12548828125, 367.600830078125, 1416.2847900390625, 441.63238525390625, 604.5270385742188, 578.8829345703125, 377.5157165527344, 192.00230407714844, 648.326171875, 1969.8695068359375, 938.555908203125, 446.4116516113281, 632.3428955078125, 658.61083984375, 1989.8314208984375, 746.812744140625, 677.7919311523438, 282.146728515625, 467.3158264160156, 480.80426025390625, 1419.9505615234375, 633.121826171875, 1121.5931396484375, 955.2892456054688, 821.8540649414062, 1269.9755859375, 524.888427734375, 1015.9006958007812, 611.8128662109375, 745.4096069335938, 688.5107421875, 667.1905517578125, 692.5095825195312, 593.0684814453125, 527.0250244140625, 546.2423095703125, 266.114990234375, 171.07672119140625, 155.59559631347656, 226.86813354492188, 131.54354858398438, 110.63026428222656, 109.70304107666016, 476.1914367675781, 123.78545379638672, 96.52113342285156, 90.68626403808594, 86.90491485595703, 84.74632263183594, 84.66790008544922, 83.12593078613281, 249.02166748046875, 73.43721008300781, 70.66108703613281, 70.30034637451172, 68.83010864257812, 66.70625305175781, 65.87735748291016, 60.60390853881836, 60.28896713256836, 59.591712951660156, 59.43132019042969, 59.13471603393555, 58.30850601196289, 57.81100082397461, 57.412742614746094, 405.0126037597656, 341.4114074707031, 190.88427734375, 246.2154541015625, 163.5002899169922, 257.431884765625, 138.4030303955078, 165.07150268554688, 520.9752197265625, 1046.2001953125, 1400.7467041015625, 228.14353942871094, 286.6177673339844, 343.2210388183594, 185.7271728515625, 229.62884521484375, 175.0425262451172, 332.4382019042969, 163.80191040039062, 539.6254272460938, 256.20074462890625, 439.7074890136719, 517.5069580078125, 403.4648742675781, 229.6062774658203, 866.2342529296875, 846.6046142578125, 313.1013488769531, 322.7994079589844, 286.8825988769531, 653.3096923828125, 749.8143310546875, 426.5758361816406, 379.9896240234375, 366.7738037109375, 372.0238037109375, 408.4358825683594, 415.59478759765625, 394.1047668457031, 394.35479736328125, 349.4744567871094, 362.33544921875, 340.7461853027344, 296.1064453125, 297.4900817871094, 494.6859130859375, 745.9567260742188, 324.6907043457031, 301.4524230957031, 243.7508087158203, 158.0762481689453, 107.37081909179688, 95.01962280273438, 99.3011474609375, 90.9953842163086, 88.63602447509766, 79.32609558105469, 77.81234741210938, 76.28094482421875, 74.5477523803711, 68.68788146972656, 66.95661163330078, 65.4609603881836, 64.79485321044922, 62.89779281616211, 62.08255386352539, 61.0522575378418, 61.06364059448242, 58.69823455810547, 57.730560302734375, 57.52555847167969, 57.3940315246582, 53.519378662109375, 53.08652114868164, 81.0350341796875, 466.36419677734375, 629.7886352539062, 272.4364318847656, 229.78268432617188, 524.4359130859375, 169.08595275878906, 106.43968963623047, 468.24310302734375, 321.1138000488281, 72.86544799804688, 215.64964294433594, 420.10101318359375, 254.942626953125, 238.94778442382812, 170.3827667236328, 161.82569885253906, 350.83050537109375, 510.26483154296875, 280.41705322265625, 480.01007080078125, 199.6502227783203, 294.41473388671875, 258.04718017578125, 376.5404357910156, 509.953857421875, 1114.255615234375, 256.1049499511719, 426.6167297363281, 319.6080017089844, 739.0460815429688, 280.2945861816406, 489.26593017578125, 542.7006225585938, 517.6249389648438, 617.398193359375, 513.2488403320312, 436.5852355957031, 491.0060729980469, 506.6981201171875, 460.2760925292969, 441.2689514160156, 394.2432861328125, 351.3202209472656, 347.7408447265625, 353.126953125, 336.9276428222656, 274.96478271484375, 206.24520874023438, 205.8778839111328, 185.45875549316406, 142.32308959960938, 138.44577026367188, 125.2013931274414, 124.9319839477539, 113.29893493652344, 111.32070922851562, 109.3732681274414, 105.69730377197266, 106.31715393066406, 292.8519592285156, 101.5099105834961, 98.15204620361328, 98.07687377929688, 96.68441009521484, 95.22706604003906, 93.90098571777344, 90.92635345458984, 90.10281372070312, 204.0241241455078, 83.50175476074219, 83.1670913696289, 82.08647155761719, 80.05599975585938, 80.02828979492188, 78.9681167602539, 77.46800231933594, 624.7637329101562, 218.5225372314453, 299.7414245605469, 218.29824829101562, 189.66014099121094, 356.5953674316406, 202.443603515625, 416.9382019042969, 238.60166931152344, 212.23965454101562, 149.82025146484375, 211.91717529296875, 303.8674621582031, 120.30265808105469, 237.61758422851562, 454.83984375, 333.9742431640625, 980.4507446289062, 485.376220703125, 911.305419921875, 590.20458984375, 261.1830139160156, 253.10174560546875, 366.5967712402344, 366.9039306640625, 261.41119384765625, 595.3799438476562, 533.9219970703125, 533.9361572265625, 583.4500732421875, 307.1800842285156, 439.3072814941406, 370.0991516113281, 337.719970703125, 344.1241149902344, 325.0099182128906, 340.11822509765625, 337.7254638671875, 350.0095520019531, 294.60064697265625, 276.2853698730469, 278.6145324707031, 1160.58984375, 424.50238037109375, 361.8892517089844, 388.7125244140625, 255.1268768310547, 223.3338623046875, 186.762939453125, 150.89361572265625, 148.3457489013672, 142.3264923095703, 778.56103515625, 125.92803955078125, 122.35221099853516, 113.48704528808594, 110.97245025634766, 117.078857421875, 97.76728820800781, 95.12934875488281, 153.9966278076172, 85.8322525024414, 85.79349517822266, 83.88031005859375, 83.049072265625, 81.00745391845703, 86.68553161621094, 72.2030258178711, 70.9286117553711, 66.03843688964844, 65.31908416748047, 61.585960388183594, 631.8247680664062, 967.0392456054688, 392.36920166015625, 86.89588165283203, 116.68437957763672, 384.3710632324219, 954.7767944335938, 325.4287414550781, 153.96957397460938, 168.00067138671875, 885.979736328125, 877.2123413085938, 327.0912780761719, 468.21343994140625, 329.3387451171875, 302.2326965332031, 346.50006103515625, 350.1670227050781, 277.64501953125, 424.3413391113281, 266.8286437988281, 331.93865966796875, 578.1422729492188, 328.27899169921875, 429.783447265625, 517.3900756835938, 400.8196716308594, 346.1986083984375, 433.2355041503906, 421.3186950683594, 338.8460693359375, 347.48797607421875, 348.34832763671875, 336.5150451660156, 398.3799743652344, 299.8478088378906, 164.65841674804688, 151.2684783935547, 134.80027770996094, 134.81512451171875, 128.8002166748047, 120.19515991210938, 119.80908966064453, 103.69074249267578, 93.05683135986328, 105.7276840209961, 91.12390899658203, 88.88589477539062, 86.48591613769531, 83.19534301757812, 82.55879974365234, 76.6402587890625, 73.9295425415039, 137.460205078125, 73.58722686767578, 73.4345474243164, 297.82000732421875, 71.52425384521484, 71.52425384521484, 71.37834930419922, 68.60929870605469, 70.64924621582031, 67.04999542236328, 64.62285614013672, 137.5844268798828, 329.9851989746094, 498.69488525390625, 418.2344665527344, 321.6512145996094, 192.27369689941406, 436.75238037109375, 120.4453125, 101.72257995605469, 189.66383361816406, 107.88653564453125, 180.29656982421875, 406.5184020996094, 219.2642059326172, 311.06512451171875, 276.8393859863281, 364.6037902832031, 122.6226577758789, 431.5712890625, 148.89491271972656, 478.09197998046875, 448.48828125, 560.1773681640625, 235.3953399658203, 220.0911102294922, 236.9821014404297, 525.9251708984375, 310.51556396484375, 195.2233428955078, 465.06982421875, 342.7114562988281, 343.9149475097656, 252.50462341308594, 252.32774353027344, 359.384033203125, 365.0752868652344, 297.08123779296875, 278.8789978027344, 264.2633056640625, 271.80364990234375, 267.00006103515625, 258.7322692871094, 836.8089599609375, 741.7046508789062, 348.0799560546875, 262.6398620605469, 234.7030792236328, 225.68736267089844, 214.62384033203125, 197.19635009765625, 176.1823272705078, 163.71646118164062, 159.67762756347656, 156.5457305908203, 155.54039001464844, 147.15855407714844, 143.77687072753906, 151.9088592529297, 140.539794921875, 133.0351104736328, 131.78204345703125, 122.36679077148438, 118.65074920654297, 115.62535095214844, 112.39591979980469, 112.21659088134766, 111.78970336914062, 119.10252380371094, 102.06414031982422, 93.4384765625, 92.23306274414062, 89.7177963256836, 218.4290313720703, 151.79112243652344, 955.3695678710938, 178.93502807617188, 1384.0147705078125, 160.96975708007812, 191.55270385742188, 221.74310302734375, 157.2467803955078, 1290.6207275390625, 920.702392578125, 312.78350830078125, 623.0559692382812, 397.7104187011719, 455.4053039550781, 379.91558837890625, 351.7355041503906, 356.9503479003906, 374.8177490234375, 212.80392456054688, 346.6185607910156, 312.7834777832031, 333.1203918457031, 336.03326416015625, 600.264892578125, 295.4298400878906, 283.64044189453125, 250.129150390625, 267.2162780761719, 330.6562194824219, 357.99395751953125, 262.14569091796875, 242.08404541015625], \"Term\": [\"window\", \"game\", \"christian\", \"team\", \"drive\", \"file\", \"space\", \"encrypt\", \"govern\", \"chip\", \"jesus\", \"israel\", \"card\", \"play\", \"secur\", \"nasa\", \"armenian\", \"program\", \"isra\", \"imag\", \"peopl\", \"hockey\", \"player\", \"clipper\", \"public\", \"disk\", \"year\", \"scsi\", \"driver\", \"bike\", \"armenian\", \"turkish\", \"turk\", \"turkey\", \"armenia\", \"koresh\", \"nazi\", \"militia\", \"serdar\", \"argic\", \"genocid\", \"davidian\", \"troop\", \"murder\", \"mormon\", \"prison\", \"massacr\", \"azeri\", \"ethnic\", \"azerbaijani\", \"hitler\", \"iran\", \"zuma\", \"sdpa\", \"motto\", \"azerbaijan\", \"extermin\", \"sera\", \"urartu\", \"slaughter\", \"villag\", \"batf\", \"greek\", \"greec\", \"jew\", \"soldier\", \"kill\", \"waco\", \"arm\", \"countri\", \"muslim\", \"children\", \"armi\", \"popul\", \"peopl\", \"anti\", \"govern\", \"right\", \"attack\", \"say\", \"polit\", \"death\", \"state\", \"live\", \"go\", \"come\", \"tell\", \"happen\", \"forc\", \"world\", \"time\", \"nation\", \"want\", \"leav\", \"start\", \"year\", \"take\", \"jesus\", \"bibl\", \"atheist\", \"atheism\", \"christ\", \"scriptur\", \"cathol\", \"sandvik\", \"doctrin\", \"revel\", \"biblic\", \"satan\", \"atho\", \"livesey\", \"prophet\", \"divin\", \"vers\", \"gospel\", \"sabbath\", \"god\", \"sin\", \"resurrect\", \"solntz\", \"testament\", \"theolog\", \"propheci\", \"theist\", \"schneider\", \"jaeger\", \"marriag\", \"christian\", \"church\", \"belief\", \"faith\", \"worship\", \"contradict\", \"moral\", \"religion\", \"lord\", \"heaven\", \"holi\", \"rutger\", \"truth\", \"spirit\", \"teach\", \"islam\", \"believ\", \"etern\", \"argument\", \"exist\", \"religi\", \"evid\", \"word\", \"love\", \"life\", \"claim\", \"mean\", \"peopl\", \"true\", \"accept\", \"say\", \"question\", \"reason\", \"thing\", \"person\", \"come\", \"good\", \"read\", \"time\", \"point\", \"follow\", \"motif\", \"widget\", \"xterm\", \"visual\", \"xlib\", \"polygon\", \"baalk\", \"contrib\", \"toolkit\", \"kelvin\", \"pyron\", \"suno\", \"deskjet\", \"xpert\", \"plaintext\", \"skndiv\", \"openwindow\", \"xview\", \"ether\", \"quicktim\", \"magellan\", \"utah\", \"greenbelt\", \"reilli\", \"ualberta\", \"copper\", \"ciphertext\", \"autom\", \"gradi\", \"dillon\", \"font\", \"handbook\", \"binari\", \"server\", \"client\", \"librari\", \"imag\", \"anonym\", \"compil\", \"resourc\", \"graphic\", \"map\", \"applic\", \"archiv\", \"user\", \"code\", \"avail\", \"directori\", \"sourc\", \"file\", \"mail\", \"list\", \"program\", \"function\", \"format\", \"email\", \"inform\", \"version\", \"softwar\", \"includ\", \"send\", \"data\", \"internet\", \"address\", \"display\", \"window\", \"copi\", \"access\", \"distribut\", \"thank\", \"look\", \"book\", \"group\", \"need\", \"scsi\", \"simm\", \"motherboard\", \"cach\", \"bio\", \"quadra\", \"diamond\", \"vram\", \"vesa\", \"centri\", \"swap\", \"upgrad\", \"char\", \"eisa\", \"intercon\", \"nubus\", \"ethernet\", \"svga\", \"amanda\", \"meg\", \"cadr\", \"mous\", \"maxtor\", \"config\", \"cica\", \"tiff\", \"adaptec\", \"powerbook\", \"ctrl\", \"esdi\", \"jumper\", \"floppi\", \"disk\", \"umich\", \"video\", \"modem\", \"card\", \"output\", \"monitor\", \"mode\", \"printer\", \"spec\", \"entri\", \"drive\", \"driver\", \"port\", \"instal\", \"memori\", \"window\", \"color\", \"appl\", \"byte\", \"screen\", \"board\", \"problem\", \"machin\", \"file\", \"thank\", \"control\", \"work\", \"speed\", \"need\", \"hard\", \"help\", \"program\", \"want\", \"time\", \"repli\", \"softwar\", \"distribut\", \"alaska\", \"spencer\", \"oracl\", \"dseg\", \"aurora\", \"nsmca\", \"engr\", \"launch\", \"uoknor\", \"callison\", \"kaldi\", \"zoolog\", \"mccall\", \"ucsc\", \"hallam\", \"lunar\", \"automot\", \"raider\", \"theodor\", \"dock\", \"shafer\", \"mksol\", \"hydro\", \"ssto\", \"plymouth\", \"redesign\", \"laughter\", \"rockwel\", \"desi\", \"stimulus\", \"moon\", \"henri\", \"mar\", \"job\", \"wheel\", \"billion\", \"invest\", \"spacecraft\", \"orbit\", \"nasa\", \"space\", \"shuttl\", \"satellit\", \"fund\", \"probe\", \"flight\", \"helmet\", \"station\", \"solar\", \"presid\", \"mission\", \"earth\", \"cost\", \"money\", \"vehicl\", \"year\", \"work\", \"project\", \"toronto\", \"spend\", \"go\", \"time\", \"engin\", \"long\", \"high\", \"power\", \"thing\", \"say\", \"look\", \"peopl\", \"program\", \"want\", \"need\", \"design\", \"build\", \"firearm\", \"bike\", \"motorcycl\", \"magnus\", \"rider\", \"honda\", \"veal\", \"utkvm\", \"centerlin\", \"cactus\", \"rkba\", \"harley\", \"shotgun\", \"pistol\", \"ranck\", \"boyl\", \"husc\", \"ifa\", \"smuggl\", \"fischer\", \"counterst\", \"armori\", \"trunk\", \"thomasp\", \"imak\", \"photographi\", \"concordia\", \"tennesse\", \"yamaha\", \"frost\", \"car\", \"ohio\", \"uchicago\", \"rid\", \"gun\", \"brake\", \"shaft\", \"cwru\", \"auto\", \"wagon\", \"handgun\", \"cleveland\", \"ride\", \"tire\", \"urbana\", \"midway\", \"insur\", \"uiuc\", \"dealer\", \"weapon\", \"iastat\", \"owner\", \"illinoi\", \"crime\", \"price\", \"state\", \"freenet\", \"sell\", \"buy\", \"good\", \"road\", \"drive\", \"right\", \"look\", \"peopl\", \"want\", \"case\", \"thing\", \"time\", \"go\", \"distribut\", \"repli\", \"engin\", \"opinion\", \"problem\", \"need\", \"gatech\", \"cub\", \"fnal\", \"prism\", \"hitter\", \"pitcher\", \"alomar\", \"uicvm\", \"higgin\", \"inning\", \"revolv\", \"hulman\", \"yanke\", \"pitch\", \"catcher\", \"dodger\", \"blast\", \"starter\", \"tiger\", \"met\", \"bat\", \"nore\", \"outlet\", \"rocki\", \"jay\", \"sdsu\", \"volt\", \"lopez\", \"restaur\", \"lamp\", \"wire\", \"duke\", \"circuit\", \"batteri\", \"brave\", \"basebal\", \"hit\", \"berkeley\", \"jason\", \"ball\", \"metal\", \"jeff\", \"grind\", \"larc\", \"indiana\", \"netcom\", \"colorado\", \"year\", \"run\", \"good\", \"game\", \"smith\", \"scott\", \"player\", \"home\", \"stanford\", \"look\", \"distribut\", \"go\", \"time\", \"lose\", \"come\", \"start\", \"play\", \"david\", \"best\", \"better\", \"power\", \"thing\", \"john\", \"sale\", \"great\", \"encrypt\", \"escrow\", \"privaci\", \"ripem\", \"crypto\", \"wiretap\", \"cryptographi\", \"cipher\", \"decrypt\", \"hamburg\", \"clipper\", \"homicid\", \"bontchev\", \"gtoal\", \"crypt\", \"clarkson\", \"rwing\", \"surveil\", \"nist\", \"sternlight\", \"den\", \"ncsl\", \"qualcomm\", \"fbihh\", \"cryptograph\", \"tampa\", \"mime\", \"vesselin\", \"lyme\", \"strnlght\", \"key\", \"secur\", \"enforc\", \"recipi\", \"classifi\", \"secret\", \"chip\", \"agenc\", \"patent\", \"scheme\", \"public\", \"govern\", \"algorithm\", \"protect\", \"propos\", \"administr\", \"privat\", \"clinton\", \"feder\", \"phone\", \"court\", \"devic\", \"number\", \"communic\", \"technolog\", \"inform\", \"provid\", \"author\", \"state\", \"right\", \"messag\", \"data\", \"peopl\", \"need\", \"diseas\", \"stratus\", \"dyer\", \"diet\", \"robi\", \"infect\", \"syndrom\", \"methodolog\", \"physician\", \"cure\", \"intellect\", \"einstein\", \"chopin\", \"candida\", \"sphere\", \"yeast\", \"chastiti\", \"halat\", \"therapi\", \"clinic\", \"migrain\", \"steveh\", \"patient\", \"catbyt\", \"dtmedin\", \"blah\", \"carlo\", \"superstit\", \"baerga\", \"homeopathi\", \"skeptic\", \"gordon\", \"pitt\", \"medic\", \"doctor\", \"medicin\", \"food\", \"cancer\", \"sleev\", \"ingr\", \"genet\", \"aid\", \"bank\", \"treatment\", \"water\", \"pain\", \"health\", \"handheld\", \"studi\", \"princeton\", \"caus\", \"effect\", \"scienc\", \"scientif\", \"rochest\", \"theori\", \"point\", \"result\", \"risk\", \"problem\", \"research\", \"case\", \"steve\", \"test\", \"time\", \"peopl\", \"repli\", \"take\", \"differ\", \"year\", \"say\", \"thing\", \"isra\", \"hockey\", \"playoff\", \"palestinian\", \"detroit\", \"leaf\", \"cramer\", \"optilink\", \"pen\", \"cunixb\", \"lebanes\", \"penguin\", \"clayton\", \"jake\", \"maynard\", \"espn\", \"edmonton\", \"ericsson\", \"boni\", \"lemieux\", \"gaza\", \"puck\", \"bruin\", \"selann\", \"laurentian\", \"quebec\", \"ramsey\", \"canuck\", \"shark\", \"uvic\", \"montreal\", \"flyer\", \"israel\", \"stanley\", \"team\", \"jet\", \"coach\", \"ranger\", \"winnipeg\", \"game\", \"play\", \"wing\", \"player\", \"columbia\", \"season\", \"leagu\", \"pittsburgh\", \"score\", \"arab\", \"mcgill\", \"goal\", \"virginia\", \"toronto\", \"andrew\", \"year\", \"divis\", \"canada\", \"period\", \"final\", \"point\", \"time\", \"american\", \"go\"], \"Total\": [2966.0, 1940.0, 1924.0, 1689.0, 2638.0, 2884.0, 1860.0, 1161.0, 1997.0, 1477.0, 1274.0, 1016.0, 1577.0, 1423.0, 1059.0, 1331.0, 1142.0, 2600.0, 837.0, 1391.0, 6052.0, 742.0, 990.0, 784.0, 1802.0, 1023.0, 4004.0, 867.0, 1190.0, 747.0, 1142.9603271484375, 698.9571533203125, 407.72796630859375, 376.14263916015625, 366.1121826171875, 325.8475036621094, 318.2566833496094, 294.63909912109375, 243.81597900390625, 243.5318603515625, 239.48057556152344, 223.58897399902344, 220.15792846679688, 499.8524475097656, 183.81210327148438, 190.03155517578125, 181.68051147460938, 168.5208740234375, 170.9889373779297, 163.37278747558594, 156.9476776123047, 153.92372131347656, 148.3330841064453, 145.86839294433594, 144.91375732421875, 143.45330810546875, 140.92047119140625, 138.17550659179688, 112.54103088378906, 112.26655578613281, 299.73785400390625, 239.29342651367188, 575.2807006835938, 235.9646759033203, 846.909912109375, 310.8516845703125, 1292.495849609375, 203.65487670898438, 568.3539428710938, 904.9415283203125, 498.3475341796875, 821.7435302734375, 317.73541259765625, 442.4269714355469, 6052.7568359375, 470.1634521484375, 1997.4742431640625, 3614.554931640625, 771.30322265625, 4395.65673828125, 753.386474609375, 729.10546875, 3489.9912109375, 1666.2821044921875, 3510.59228515625, 3362.487060546875, 2458.833984375, 1374.8499755859375, 910.4705200195312, 2752.347412109375, 5183.0615234375, 1404.285400390625, 3617.8623046875, 1561.919189453125, 1909.090576171875, 4004.499755859375, 1884.099853515625, 1274.90771484375, 844.1483154296875, 688.5940551757812, 379.07818603515625, 601.140869140625, 285.1163330078125, 265.8630065917969, 258.6456298828125, 234.31048583984375, 199.48165893554688, 197.49954223632812, 187.35317993164062, 186.70449829101562, 191.50320434570312, 161.609130859375, 158.14089965820312, 148.43858337402344, 144.8671112060547, 142.21681213378906, 133.87864685058594, 133.63296508789062, 137.22470092773438, 135.08001708984375, 123.31761169433594, 118.5867691040039, 111.65430450439453, 104.27904510498047, 104.7589340209961, 103.54805755615234, 192.99319458007812, 1924.420654296875, 744.669677734375, 604.4502563476562, 642.6378784179688, 209.51373291015625, 250.72772216796875, 845.7623291015625, 828.4779663085938, 355.576416015625, 287.8231201171875, 282.98614501953125, 442.1787109375, 692.9871826171875, 269.98553466796875, 446.0935363769531, 578.8563842773438, 2561.801513671875, 282.8560791015625, 815.1890258789062, 1700.040283203125, 474.37847900390625, 965.2655029296875, 1333.167236328125, 902.1780395507812, 1251.5302734375, 1317.348876953125, 2641.8525390625, 6052.7568359375, 1353.2353515625, 1007.024658203125, 4395.65673828125, 2872.251953125, 1977.931884765625, 3329.194091796875, 2056.011474609375, 3362.487060546875, 3754.324462890625, 2277.275146484375, 5183.0615234375, 2646.844970703125, 1892.52294921875, 514.570068359375, 479.6328430175781, 262.20831298828125, 305.9157409667969, 183.0161590576172, 165.39915466308594, 159.4037322998047, 152.9738311767578, 138.80514526367188, 136.08897399902344, 118.21088409423828, 102.45747375488281, 101.47250366210938, 95.48925018310547, 95.00318145751953, 93.7560806274414, 89.41605377197266, 85.98832702636719, 78.80107879638672, 77.11690521240234, 75.69332885742188, 77.96991729736328, 67.19242095947266, 66.7578353881836, 63.51332092285156, 62.5534782409668, 57.590476989746094, 57.5670166015625, 57.39277648925781, 57.16252136230469, 448.58203125, 58.587608337402344, 180.90525817871094, 872.5556030273438, 374.153564453125, 496.06207275390625, 1391.7647705078125, 441.0435791015625, 358.5755615234375, 426.2104797363281, 1054.81982421875, 199.63804626464844, 1032.6685791015625, 440.0850830078125, 1078.519775390625, 1021.2532958984375, 1669.5401611328125, 441.5390930175781, 1374.777099609375, 2884.2314453125, 2375.46533203125, 1561.0626220703125, 2600.132568359375, 691.9703369140625, 736.288330078125, 1159.4346923828125, 2169.3818359375, 1621.36328125, 1630.9560546875, 2103.51220703125, 1606.3494873046875, 1651.1046142578125, 1085.9647216796875, 1067.6014404296875, 839.2589721679688, 2966.799072265625, 872.6826171875, 1443.4285888671875, 3038.840576171875, 2288.573486328125, 3375.089111328125, 1421.2718505859375, 1956.87451171875, 3517.12158203125, 867.4650268554688, 317.6335754394531, 250.2051239013672, 230.8120574951172, 229.64512634277344, 212.46034240722656, 183.939208984375, 167.10159301757812, 165.70152282714844, 156.46893310546875, 158.83473205566406, 362.0701904296875, 134.3770294189453, 125.0824966430664, 123.22360229492188, 117.9479751586914, 112.16997528076172, 111.74629974365234, 110.07479858398438, 104.12123107910156, 99.82710266113281, 519.783203125, 90.53907775878906, 83.65958404541016, 82.6272964477539, 104.46712493896484, 76.1695556640625, 76.12603759765625, 71.69577026367188, 70.25682830810547, 287.1305236816406, 317.72869873046875, 1023.153564453125, 213.97622680664062, 736.9422607421875, 385.1871643066406, 1577.8626708984375, 487.7118835449219, 681.5184326171875, 651.6133422851562, 414.8677673339844, 202.35369873046875, 773.6500854492188, 2638.11669921875, 1190.9949951171875, 521.5310668945312, 771.9429321289062, 825.655517578125, 2966.799072265625, 979.7059936523438, 877.653076171875, 316.51055908203125, 603.9048461914062, 656.5213012695312, 3254.53125, 1051.2015380859375, 2884.2314453125, 2288.573486328125, 1818.9423828125, 3998.25146484375, 901.1630249023438, 3517.12158203125, 1391.7637939453125, 2348.668212890625, 2600.132568359375, 3617.8623046875, 5183.0615234375, 2732.23828125, 1630.9560546875, 3038.840576171875, 267.0257263183594, 171.98744201660156, 156.5063934326172, 228.2922821044922, 132.4541778564453, 111.54090118408203, 110.61382293701172, 480.2140197753906, 124.9337158203125, 97.43182373046875, 91.59697723388672, 87.81555938720703, 85.65699768066406, 85.5787124633789, 84.03668212890625, 251.917236328125, 74.3480224609375, 71.57240295410156, 71.21118927001953, 69.74082946777344, 67.61688995361328, 66.78809356689453, 61.514625549316406, 61.19959259033203, 60.50275421142578, 60.342044830322266, 60.04544448852539, 59.2192268371582, 58.72171401977539, 58.32341003417969, 415.9680480957031, 351.16400146484375, 197.7269287109375, 259.1622314453125, 170.86904907226562, 275.1458435058594, 144.30697631835938, 174.9811248779297, 592.9119262695312, 1331.5164794921875, 1860.7562255859375, 257.585205078125, 337.95697021484375, 441.28607177734375, 216.21592712402344, 284.10626220703125, 205.7402801513672, 455.25067138671875, 191.21556091308594, 873.9714965820312, 344.7267761230469, 726.9257202148438, 1014.5090942382812, 862.4901733398438, 336.9737243652344, 4004.499755859375, 3998.25146484375, 641.9896850585938, 701.0418090820312, 556.9617919921875, 3510.59228515625, 5183.0615234375, 1432.9788818359375, 1579.3616943359375, 1517.9344482421875, 1785.4522705078125, 3329.194091796875, 4395.65673828125, 3375.089111328125, 6052.7568359375, 2600.132568359375, 3617.8623046875, 3517.12158203125, 1000.6307983398438, 1483.9180908203125, 495.768310546875, 747.65087890625, 325.66717529296875, 302.36370849609375, 244.9949493408203, 158.98828125, 108.28207397460938, 95.93086242675781, 100.28355407714844, 91.90662384033203, 89.54743957519531, 80.23743438720703, 78.72370910644531, 77.19242095947266, 75.45897674560547, 69.59910583496094, 67.86799621582031, 66.37223052978516, 65.70891571044922, 63.809295654296875, 62.9937858581543, 61.963539123535156, 61.97830581665039, 59.60945129394531, 58.642459869384766, 58.43714141845703, 58.30545425415039, 54.43068313598633, 53.99776840209961, 82.42749786376953, 485.30303955078125, 668.4765625, 284.99322509765625, 240.6736602783203, 577.3501586914062, 179.90444946289062, 111.21510314941406, 528.9468383789062, 357.52178955078125, 74.67184448242188, 242.34613037109375, 502.913818359375, 297.42877197265625, 281.2137145996094, 192.33717346191406, 183.0419158935547, 466.63409423828125, 750.7517700195312, 366.50677490234375, 724.8965454101562, 250.31179809570312, 415.8218994140625, 353.0378723144531, 657.658203125, 1070.60205078125, 3489.9912109375, 395.5966796875, 983.7339477539062, 606.9436645507812, 3754.324462890625, 598.3063354492188, 2638.11669921875, 3614.554931640625, 3375.089111328125, 6052.7568359375, 3617.8623046875, 2113.190673828125, 3329.194091796875, 5183.0615234375, 3510.59228515625, 3038.840576171875, 2732.23828125, 1432.9788818359375, 1407.8818359375, 3254.53125, 3517.12158203125, 275.8772277832031, 207.15757751464844, 206.79428100585938, 186.37115478515625, 143.23545837402344, 139.3581085205078, 126.11384582519531, 125.84441375732422, 114.21138000488281, 112.2330322265625, 110.28572082519531, 106.60977935791016, 107.26533508300781, 295.4808044433594, 102.42223358154297, 99.06439971923828, 98.99042510986328, 97.59706115722656, 96.1397705078125, 94.81333923339844, 91.83870697021484, 91.01528930664062, 206.15138244628906, 84.41759490966797, 84.07954406738281, 82.9988784790039, 80.96837615966797, 80.94064331054688, 79.88065338134766, 78.38043975830078, 639.179443359375, 227.34768676757812, 322.9873046875, 231.69212341308594, 201.00955200195312, 428.8465270996094, 227.2183380126953, 525.5809326171875, 277.0488586425781, 257.5307312011719, 175.57052612304688, 283.98089599609375, 476.7163391113281, 133.4186248779297, 365.1439514160156, 1031.6707763671875, 640.4948120117188, 4004.499755859375, 1280.0391845703125, 3754.324462890625, 1940.480712890625, 488.2629089355469, 472.26141357421875, 990.4652099609375, 1023.2092895507812, 516.3364868164062, 3375.089111328125, 3038.840576171875, 3510.59228515625, 5183.0615234375, 818.473876953125, 3362.487060546875, 1909.090576171875, 1423.8079833984375, 1658.5771484375, 1346.3623046875, 1717.4796142578125, 1785.4522705078125, 3329.194091796875, 1491.164794921875, 990.2597045898438, 1542.3536376953125, 1161.5042724609375, 425.4167175292969, 362.8162841796875, 389.96905517578125, 256.041259765625, 224.2482147216797, 187.67849731445312, 151.80862426757812, 149.26010131835938, 143.24093627929688, 784.146484375, 126.84251403808594, 123.26657104492188, 114.4028549194336, 111.90643310546875, 118.11632537841797, 98.68305969238281, 96.04377746582031, 155.5158233642578, 86.74695587158203, 86.70785522460938, 84.794677734375, 83.96345520019531, 81.92181396484375, 87.67940521240234, 73.11810302734375, 71.84503173828125, 66.95278930664062, 66.233642578125, 62.500492095947266, 659.0625, 1059.32958984375, 429.3060607910156, 89.6495590209961, 124.40624237060547, 474.05853271484375, 1477.181640625, 430.5038757324219, 178.8761749267578, 204.31564331054688, 1802.0166015625, 1997.4742431640625, 534.6437377929688, 906.0315551757812, 555.987060546875, 491.40655517578125, 613.587890625, 662.8741455078125, 470.1554870605469, 1022.0458984375, 480.70269775390625, 730.8065795898438, 2365.439208984375, 762.9767456054688, 1372.4049072265625, 2169.3818359375, 1377.2789306640625, 1170.3707275390625, 3489.9912109375, 3614.554931640625, 1280.42724609375, 1651.1046142578125, 6052.7568359375, 3517.12158203125, 399.3059997558594, 300.7602844238281, 165.5708770751953, 152.18165588378906, 135.7127227783203, 135.72866821289062, 129.7154541015625, 121.10759735107422, 120.72209930419922, 104.60343933105469, 93.96927642822266, 106.78413391113281, 92.03643035888672, 89.79829406738281, 87.39839935302734, 84.10774230957031, 83.47124481201172, 77.5677490234375, 74.84196472167969, 139.1590118408203, 74.50009155273438, 74.3469467163086, 301.6020812988281, 72.43663787841797, 72.43663787841797, 72.29076385498047, 69.52177429199219, 71.59939575195312, 67.96253204345703, 65.53521728515625, 140.3209686279297, 354.6353759765625, 560.2382202148438, 467.1678161621094, 372.5237731933594, 214.25985717773438, 528.3170776367188, 128.8201446533203, 106.81678009033203, 215.3099365234375, 114.3545913696289, 206.84561157226562, 542.5616455078125, 263.9644470214844, 416.1438293457031, 361.6253356933594, 544.79638671875, 136.72360229492188, 864.7274780273438, 185.29769897460938, 1192.119873046875, 1098.304931640625, 1600.333984375, 408.9844970703125, 366.5314025878906, 446.05267333984375, 2646.844970703125, 941.7982788085938, 342.3374938964844, 3254.53125, 1469.8099365234375, 2113.190673828125, 866.398681640625, 975.55322265625, 5183.0615234375, 6052.7568359375, 2732.23828125, 1884.099853515625, 2258.33203125, 4004.499755859375, 4395.65673828125, 3329.194091796875, 837.7212524414062, 742.6168823242188, 348.9921569824219, 263.5521240234375, 235.61534118652344, 226.59957885742188, 215.53610229492188, 198.10865783691406, 177.09458923339844, 164.6287078857422, 160.58985900878906, 157.4580078125, 156.47132873535156, 148.0709228515625, 144.6891632080078, 152.87937927246094, 141.45484924316406, 133.94744873046875, 132.694580078125, 123.27899932861328, 119.56299591064453, 116.5375747680664, 113.3081283569336, 113.12879943847656, 112.70191955566406, 120.08545684814453, 102.97634887695312, 94.35086822509766, 93.14530181884766, 90.63005065917969, 220.85797119140625, 153.72544860839844, 1016.9886474609375, 185.5819549560547, 1689.4241943359375, 167.1842803955078, 202.2176513671875, 240.0353546142578, 165.1486358642578, 1940.480712890625, 1423.8079833984375, 399.85687255859375, 990.4652099609375, 559.25, 670.059814453125, 536.776123046875, 505.7619934082031, 528.2215576171875, 572.4735717773438, 254.32785034179688, 553.66845703125, 544.2701416015625, 701.0418090820312, 868.3306274414062, 4004.499755859375, 693.3757934570312, 732.4243774414062, 584.494873046875, 822.269287109375, 2646.844970703125, 5183.0615234375, 1242.181884765625, 3510.59228515625], \"loglift\": [30.0, 29.0, 28.0, 27.0, 26.0, 25.0, 24.0, 23.0, 22.0, 21.0, 20.0, 19.0, 18.0, 17.0, 16.0, 15.0, 14.0, 13.0, 12.0, 11.0, 10.0, 9.0, 8.0, 7.0, 6.0, 5.0, 4.0, 3.0, 2.0, 1.0, 2.0255000591278076, 2.0250000953674316, 2.0241000652313232, 2.023900032043457, 2.0237998962402344, 2.0234999656677246, 2.023400068283081, 2.023200035095215, 2.022599935531616, 2.022599935531616, 2.0225000381469727, 2.022200107574463, 2.0220999717712402, 2.0216000080108643, 2.0213000774383545, 2.0213000774383545, 2.0213000774383545, 2.020900011062622, 2.020900011062622, 2.020699977874756, 2.0204999446868896, 2.02020001411438, 2.02020001411438, 2.0201001167297363, 2.0199999809265137, 2.0199999809265137, 2.0197999477386475, 2.019700050354004, 2.018199920654297, 2.018199920654297, 2.0153000354766846, 2.007200002670288, 1.9528000354766846, 1.9889999628067017, 1.8824000358581543, 1.958899974822998, 1.7970999479293823, 1.980299949645996, 1.819599986076355, 1.6779999732971191, 1.763100028038025, 1.6375000476837158, 1.8667999505996704, 1.781499981880188, 1.0757999420166016, 1.7408000230789185, 1.2897000312805176, 1.0537999868392944, 1.5707000494003296, 0.9531000256538391, 1.4706000089645386, 1.4835000038146973, 0.7210999727249146, 1.080899953842163, 0.6299999952316284, 0.6431000232696533, 0.739799976348877, 1.0845999717712402, 1.3265000581741333, 0.5475999712944031, 0.0575999990105629, 0.9682999849319458, 0.27399998903274536, 0.847000002861023, 0.6578999757766724, -0.014100000262260437, 0.5697000026702881, 2.045099973678589, 2.044800043106079, 2.0445001125335693, 2.0434000492095947, 2.043299913406372, 2.04259991645813, 2.0423998832702637, 2.04229998588562, 2.0418999195098877, 2.0411999225616455, 2.041100025177002, 2.0408999919891357, 2.0408999919891357, 2.040600061416626, 2.0401999950408936, 2.0399999618530273, 2.0397000312805176, 2.0394999980926514, 2.039400100708008, 2.0390000343322754, 2.0390000343322754, 2.0388998985290527, 2.0385000705718994, 2.0383999347686768, 2.038100004196167, 2.037600040435791, 2.0369999408721924, 2.036900043487549, 2.036900043487549, 2.036400079727173, 2.031899929046631, 2.0318000316619873, 2.0308001041412354, 2.023099899291992, 2.0327999591827393, 2.0308001041412354, 1.9904999732971191, 1.945199966430664, 1.9896999597549438, 1.9883999824523926, 1.9829000234603882, 1.9407000541687012, 1.8581000566482544, 1.9696999788284302, 1.8825000524520874, 1.8199000358581543, 1.5154000520706177, 1.9494999647140503, 1.7005000114440918, 1.5044000148773193, 1.7955000400543213, 1.5720000267028809, 1.4508999586105347, 1.5461000204086304, 1.42330002784729, 1.3523000478744507, 1.0579999685287476, 0.6973999738693237, 1.2980999946594238, 1.3992999792099, 0.6687999963760376, 0.8589000105857849, 1.0434000492095947, 0.6948999762535095, 0.9133999943733215, 0.5392000079154968, 0.31630000472068787, 0.7174999713897705, 0.003100000089034438, 0.5838000178337097, 0.8629000186920166, 2.080399990081787, 2.0803000926971436, 2.078700065612793, 2.0776000022888184, 2.0771000385284424, 2.0766000747680664, 2.0764000415802, 2.076200008392334, 2.0755999088287354, 2.075500011444092, 2.074399948120117, 2.0732998847961426, 2.073199987411499, 2.0725998878479004, 2.0725998878479004, 2.0724000930786133, 2.071899890899658, 2.0715999603271484, 2.0706000328063965, 2.0703001022338867, 2.0701000690460205, 2.0687999725341797, 2.0685999393463135, 2.06850004196167, 2.0678000450134277, 2.067500114440918, 2.0662999153137207, 2.0662999153137207, 2.066200017929077, 2.066200017929077, 2.0478999614715576, 2.0660998821258545, 2.0511999130249023, 2.0100998878479004, 2.022200107574463, 2.008699893951416, 1.9703999757766724, 1.9789999723434448, 1.9657000303268433, 1.9249999523162842, 1.8271000385284424, 1.9738999605178833, 1.774899959564209, 1.8641999959945679, 1.7426999807357788, 1.7103999853134155, 1.6003999710083008, 1.8172999620437622, 1.605299949645996, 1.4668999910354614, 1.4728000164031982, 1.5562000274658203, 1.4235999584197998, 1.6993999481201172, 1.6753000020980835, 1.5449999570846558, 1.365399956703186, 1.4404000043869019, 1.42330002784729, 1.3453999757766724, 1.3896000385284424, 1.3382999897003174, 1.4631999731063843, 1.4598000049591064, 1.579699993133545, 0.9275000095367432, 1.518399953842163, 1.176200032234192, 0.499099999666214, 0.7235000133514404, 0.3797000050544739, 1.0923999547958374, 0.7401000261306763, 0.15479999780654907, 2.1196000576019287, 2.117799997329712, 2.117000102996826, 2.1166999340057373, 2.1166000366210938, 2.116300106048584, 2.1157000064849854, 2.1152000427246094, 2.1150999069213867, 2.114799976348877, 2.1147000789642334, 2.114000082015991, 2.113800048828125, 2.113300085067749, 2.1131999492645264, 2.1129000186920166, 2.112499952316284, 2.1124000549316406, 2.112299919128418, 2.111799955368042, 2.1113998889923096, 2.1108999252319336, 2.1105000972747803, 2.1096999645233154, 2.109499931335449, 2.1089000701904297, 2.108599901199341, 2.108599901199341, 2.107800006866455, 2.107599973678589, 2.101799964904785, 2.099600076675415, 2.0685999393463135, 2.092400074005127, 2.0650999546051025, 2.073899984359741, 2.0125999450683594, 2.021399974822998, 2.0007998943328857, 2.0023000240325928, 2.0262999534606934, 2.0680999755859375, 1.9438999891281128, 1.8285000324249268, 1.8824000358581543, 1.9651000499725342, 1.9211000204086304, 1.8946000337600708, 1.7211999893188477, 1.8492000102996826, 1.8622000217437744, 2.00570011138916, 1.8641999959945679, 1.8091000318527222, 1.291200041770935, 1.6136000156402588, 1.1761000156402588, 1.246999979019165, 1.326200008392334, 0.973800003528595, 1.5801000595092773, 0.8787999749183655, 1.298699975013733, 0.9729999899864197, 0.7918000221252441, 0.4300999939441681, 0.10779999941587448, 0.5931000113487244, 0.9909999966621399, 0.40450000762939453, 2.3443000316619873, 2.342400074005127, 2.341900110244751, 2.3415000438690186, 2.34089994430542, 2.339600086212158, 2.3394999504089355, 2.3392999172210693, 2.3385000228881836, 2.338399887084961, 2.3378000259399414, 2.3373000621795654, 2.337100028991699, 2.3369998931884766, 2.336899995803833, 2.336199998855591, 2.335400104522705, 2.33489990234375, 2.33489990234375, 2.3345999717712402, 2.334199905395508, 2.3340001106262207, 2.3327999114990234, 2.3327999114990234, 2.3326001167297363, 2.3324999809265137, 2.3324999809265137, 2.3322999477386475, 2.3320999145507812, 2.3320000171661377, 2.3210999965667725, 2.3196001052856445, 2.3125, 2.2964999675750732, 2.3036999702453613, 2.2811999320983887, 2.305999994277954, 2.2894999980926514, 2.218400001525879, 2.106600046157837, 2.063800096511841, 2.2263998985290527, 2.183000087738037, 2.096400022506714, 2.1958000659942627, 2.1349000930786133, 2.186199903488159, 2.033400058746338, 2.193000078201294, 1.8655999898910522, 2.0510001182556152, 1.8450000286102295, 1.6746000051498413, 1.5880000591278076, 1.9641000032424927, 0.8166999816894531, 0.7954000234603882, 1.629699945449829, 1.5721999406814575, 1.6842999458312988, 0.6662999987602234, 0.41440001130104065, 1.1360000371932983, 0.9230999946594238, 0.9273999929428101, 0.7792999744415283, 0.24959999322891235, -0.010900000110268593, 0.20020000636577606, -0.3833000063896179, 0.3409000039100647, 0.04670000076293945, 0.013500000350177288, 1.1301000118255615, 0.7407000064849854, 2.3550000190734863, 2.3548998832702637, 2.3541998863220215, 2.354099988937378, 2.352099895477295, 2.3513998985290527, 2.3487000465393066, 2.347599983215332, 2.3473000526428223, 2.3471999168395996, 2.34689998626709, 2.3457000255584717, 2.3454999923706055, 2.3452999591827393, 2.3450000286102295, 2.3440001010894775, 2.343600034713745, 2.3433001041412354, 2.343100070953369, 2.3427999019622803, 2.342600107192993, 2.3422999382019043, 2.3422999382019043, 2.3417999744415283, 2.3415000438690186, 2.341399908065796, 2.341399908065796, 2.3403000831604004, 2.340100049972534, 2.340100049972534, 2.3173000812530518, 2.297499895095825, 2.3120999336242676, 2.310800075531006, 2.260999917984009, 2.295099973678589, 2.3132998943328857, 2.235300064086914, 2.249799966812134, 2.33270001411438, 2.2404000759124756, 2.1772000789642334, 2.203000068664551, 2.1942999362945557, 2.2360000610351562, 2.2339999675750732, 2.071899890899658, 1.9709999561309814, 2.089400053024292, 1.9449000358581543, 2.13100004196167, 2.011899948120117, 2.0436999797821045, 1.7994999885559082, 1.6154999732971191, 1.215399980545044, 1.9222999811172485, 1.5217000246047974, 1.7158000469207764, 0.7318999767303467, 1.5988999605178833, 0.6722000241279602, 0.460999995470047, 0.4821999967098236, 0.07440000027418137, 0.4043000042438507, 0.7802000045776367, 0.4431000053882599, 0.03189999982714653, 0.3253999948501587, 0.4275999963283539, 0.4212000072002411, 0.9513000249862671, 0.9588000178337097, 0.13619999587535858, 0.011599999852478504, 2.412899971008301, 2.411799907684326, 2.411799907684326, 2.41129994392395, 2.4098000526428223, 2.4096999168395996, 2.4089999198913574, 2.4089999198913574, 2.4082000255584717, 2.408099889755249, 2.407900094985962, 2.407599925994873, 2.4072999954223633, 2.4072999954223633, 2.4072999954223633, 2.4070000648498535, 2.4070000648498535, 2.4068000316619873, 2.4066998958587646, 2.406599998474121, 2.4061999320983887, 2.4061999320983887, 2.405900001525879, 2.4052999019622803, 2.4052999019622803, 2.4052000045776367, 2.404900074005127, 2.404900074005127, 2.4047000408172607, 2.4045000076293945, 2.393399953842163, 2.3766000270843506, 2.3415000438690186, 2.3566999435424805, 2.358099937438965, 2.2316999435424805, 2.300800085067749, 2.1847000122070312, 2.2667999267578125, 2.2228000164031982, 2.2576000690460205, 2.123500108718872, 1.96589994430542, 2.312700033187866, 1.9866000413894653, 1.5972000360488892, 1.7651000022888184, 1.0090999603271484, 1.4464999437332153, 1.0003999471664429, 1.2259999513626099, 1.7905999422073364, 1.7925000190734863, 1.4222999811172485, 1.3905999660491943, 1.7355999946594238, 0.6812999844551086, 0.6772000193595886, 0.5329999923706055, 0.23199999332427979, 1.4362000226974487, 0.38100001215934753, 0.775600016117096, 0.977400004863739, 0.843500018119812, 0.9948999881744385, 0.7968999743461609, 0.7509999871253967, 0.16369999945163727, 0.7944999933242798, 1.1397000551223755, 0.7049999833106995, 2.54010009765625, 2.5387001037597656, 2.538300037384033, 2.537600040435791, 2.5373001098632812, 2.536799907684326, 2.5360000133514404, 2.5348000526428223, 2.5346999168395996, 2.53439998626709, 2.5336999893188477, 2.533600091934204, 2.533400058746338, 2.5327999591827393, 2.5325000286102295, 2.5320000648498535, 2.5315001010894775, 2.5313000679016113, 2.5309998989105225, 2.5302000045776367, 2.5302000045776367, 2.5299999713897705, 2.529900074005127, 2.529599905014038, 2.529400110244751, 2.5283000469207764, 2.5280001163482666, 2.527100086212158, 2.526900053024292, 2.526099920272827, 2.4986000061035156, 2.449700117111206, 2.450900077819824, 2.509700059890747, 2.476799964904785, 2.3310999870300293, 2.1043999195098877, 2.260999917984009, 2.390899896621704, 2.3452000617980957, 1.830899953842163, 1.718000054359436, 2.049499988555908, 1.8806999921798706, 2.017199993133545, 2.054800033569336, 1.9694000482559204, 1.9026999473571777, 2.0141000747680664, 1.6618000268936157, 1.9522000551223755, 1.7517000436782837, 1.1319999694824219, 1.6974999904632568, 1.3797999620437622, 1.1073999404907227, 1.30649995803833, 1.3228000402450562, 0.4544999897480011, 0.39149999618530273, 1.211400032043457, 0.9824000000953674, -0.3142000138759613, 0.1941000074148178, 2.6533000469207764, 2.652600049972534, 2.650099992752075, 2.649600028991699, 2.648900032043457, 2.648900032043457, 2.6486001014709473, 2.648099899291992, 2.648099899291992, 2.646899938583374, 2.645900011062622, 2.645699977874756, 2.645699977874756, 2.645400047302246, 2.64520001411438, 2.644700050354004, 2.644700050354004, 2.6435999870300293, 2.643399953842163, 2.643399953842163, 2.6433000564575195, 2.6433000564575195, 2.6429998874664307, 2.6429998874664307, 2.6429998874664307, 2.6429998874664307, 2.642400026321411, 2.6422998905181885, 2.6421000957489014, 2.6415998935699463, 2.635999917984009, 2.5836000442504883, 2.539299964904785, 2.5450000762939453, 2.5088000297546387, 2.5473999977111816, 2.4653000831604004, 2.588399887084961, 2.606800079345703, 2.5288000106811523, 2.597399950027466, 2.5183000564575195, 2.367000102996826, 2.470099925994873, 2.3645999431610107, 2.3884999752044678, 2.2541000843048096, 2.546799898147583, 1.9607000350952148, 2.4368999004364014, 1.7419999837875366, 1.7599999904632568, 1.6059000492095947, 2.1031999588012695, 2.1456000804901123, 2.023200035095215, 1.0397000312805176, 1.5461000204086304, 2.0940001010894775, 0.7099999785423279, 1.1996999979019165, 0.8400999903678894, 1.422700047492981, 1.3034000396728516, -0.013100000098347664, -0.1525000035762787, 0.4368000030517578, 0.745199978351593, 0.510200023651123, -0.03440000116825104, -0.14550000429153442, 0.10100000351667404, 2.72160005569458, 2.721400022506714, 2.7200000286102295, 2.7191998958587646, 2.7188000679016113, 2.718600034713745, 2.718400001525879, 2.7179999351501465, 2.7174999713897705, 2.717099905014038, 2.7170000076293945, 2.7167999744415283, 2.7167000770568848, 2.7165000438690186, 2.7163000106811523, 2.7163000106811523, 2.716200113296509, 2.7158000469207764, 2.7156999111175537, 2.7151999473571777, 2.7149999141693115, 2.7147998809814453, 2.714600086212158, 2.714600086212158, 2.7144999504089355, 2.714400053024292, 2.7137999534606934, 2.712899923324585, 2.7128000259399414, 2.7125000953674316, 2.7116000652313232, 2.7100000381469727, 2.660099983215332, 2.686199903488159, 2.5232999324798584, 2.684799909591675, 2.6684999465942383, 2.643399953842163, 2.6735999584198, 2.3148000240325928, 2.2867000102996826, 2.477099895477295, 2.2590999603271484, 2.3817999362945557, 2.3364999294281006, 2.377000093460083, 2.359499931335449, 2.330699920654297, 2.299099922180176, 2.5443999767303467, 2.254300117492676, 2.1686999797821045, 1.978600025177002, 1.773300051689148, 0.8248000144958496, 1.8695000410079956, 1.7740000486373901, 1.873900055885315, 1.5986000299453735, 0.6425999999046326, 0.05000000074505806, 1.1669000387191772, 0.04839999973773956], \"logprob\": [30.0, 29.0, 28.0, 27.0, 26.0, 25.0, 24.0, 23.0, 22.0, 21.0, 20.0, 19.0, 18.0, 17.0, 16.0, 15.0, 14.0, 13.0, 12.0, 11.0, 10.0, 9.0, 8.0, 7.0, 6.0, 5.0, 4.0, 3.0, 2.0, 1.0, -4.882199764251709, -5.374499797821045, -5.914400100708008, -5.995299816131592, -6.022299766540527, -6.139200210571289, -6.162799835205078, -6.240099906921387, -6.430099964141846, -6.431300163269043, -6.4481000900268555, -6.517099857330322, -6.532599925994873, -5.713200092315674, -6.713799953460693, -6.680600166320801, -6.725599765777588, -6.80109977722168, -6.786600112915039, -6.832300186157227, -6.872700214385986, -6.892399787902832, -6.929500102996826, -6.946300029754639, -6.952899932861328, -6.963099956512451, -6.981100082397461, -7.000899791717529, -7.207600116729736, -7.210000038146973, -6.230899810791016, -6.464200019836426, -5.641499996185303, -6.496399879455566, -5.325099945068359, -6.250899791717529, -4.987599849700928, -6.652400016784668, -5.7866997718811035, -5.463200092315674, -5.974699974060059, -5.600100040435791, -6.321100234985352, -6.075300216674805, -4.164999961853027, -6.055200099945068, -5.059800148010254, -4.702600002288818, -5.730299949645996, -4.607699871063232, -5.853899955749512, -5.873799800872803, -5.070400238037109, -5.449900150299072, -5.1554999351501465, -5.1855998039245605, -5.401899814605713, -5.638400077819824, -5.808599948883057, -5.481299877166748, -5.3383002281188965, -5.733500003814697, -5.481500148773193, -5.7484002113342285, -5.736800193786621, -5.668000221252441, -5.838200092315674, -4.753300189971924, -5.165999889373779, -5.369900226593018, -5.967899799346924, -5.506999969482422, -6.253600120544434, -6.323699951171875, -6.35129976272583, -6.450500011444092, -6.612100124359131, -6.622200012207031, -6.675099849700928, -6.678599834442139, -6.653600215911865, -6.823699951171875, -6.845600128173828, -6.909299850463867, -6.933800220489502, -6.952300071716309, -7.013199806213379, -7.014999866485596, -6.98859977722168, -7.004700183868408, -7.095900058746338, -7.135300159454346, -7.196100234985352, -7.264999866485596, -7.2606000900268555, -7.272200107574463, -6.650000095367432, -4.354899883270264, -5.3043999671936035, -5.513999938964844, -5.460400104522705, -6.571499824523926, -6.394000053405762, -5.218299865722656, -5.284299850463867, -6.085599899291992, -6.298299789428711, -6.320799827575684, -5.9166998863220215, -5.550000190734863, -6.38100004196167, -5.966000080108643, -5.768099784851074, -4.58519983291626, -6.354599952697754, -5.545199871063232, -5.00629997253418, -5.991600036621094, -5.504700183868408, -5.3028998374938965, -5.598199844360352, -5.393599987030029, -5.41349983215332, -5.011899948120117, -4.543399810791016, -5.440800189971924, -5.635000228881836, -4.891900062561035, -5.127299785614014, -5.315899848937988, -5.143700122833252, -5.407100200653076, -5.2895002365112305, -5.402100086212158, -5.500899791717529, -5.3927998542785645, -5.484099864959717, -5.540599822998047, -5.625400066375732, -5.695799827575684, -6.301300048828125, -6.148200035095215, -6.662399768829346, -6.764100074768066, -6.801199913024902, -6.842599868774414, -6.940400123596191, -6.960299968719482, -7.102200031280518, -7.246399879455566, -7.256100177764893, -7.317500114440918, -7.3225998878479, -7.335999965667725, -7.383800029754639, -7.423299789428711, -7.511600017547607, -7.533400058746338, -7.552299976348877, -7.52400016784668, -7.672999858856201, -7.679500102996826, -7.730100154876709, -7.745500087738037, -7.829500198364258, -7.829899787902832, -7.832900047302246, -7.836999893188477, -5.795100212097168, -7.8125, -6.699900150299072, -5.167600154876709, -6.002200126647949, -5.733699798583984, -4.740300178527832, -5.880899906158447, -6.10129976272583, -5.969099998474121, -5.160900115966797, -6.678699970245361, -5.234300136566162, -5.997900009155273, -5.223100185394287, -5.309899806976318, -4.928400039672852, -6.041500091552734, -5.117800235748291, -4.515200138092041, -4.7032999992370605, -5.03980016708374, -4.662199974060059, -5.71019983291626, -5.6722002029418945, -5.348400115966797, -4.901500225067139, -5.117700099945068, -5.128900051116943, -4.952400207519531, -5.177800178527832, -5.201499938964844, -5.495699882507324, -5.51609992980957, -5.6367998123168945, -5.026400089263916, -5.65910005569458, -5.4980998039245605, -5.430799961090088, -5.4899001121521, -5.445300102233887, -5.597400188446045, -5.629899978637695, -5.628900051116943, -5.063899993896484, -6.070400238037109, -6.309800148010254, -6.3907999992370605, -6.395899772644043, -6.473999977111816, -6.618800163269043, -6.7153000831604, -6.723800182342529, -6.781499862670898, -6.766499996185303, -5.94320011138916, -6.934599876403809, -7.006800174713135, -7.021900177001953, -7.065999984741211, -7.116600036621094, -7.1203999519348145, -7.1356000900268555, -7.191699981689453, -7.2342000007629395, -5.584799766540527, -7.332799911499023, -7.412700176239014, -7.42519998550415, -7.191299915313721, -7.507500171661377, -7.5081000328063965, -7.56879997253418, -7.589399814605713, -6.187300205230713, -6.0883002281188965, -4.949900150299072, -6.490799903869629, -5.281499862670898, -5.921500205993652, -4.572700023651123, -5.73799991607666, -5.423999786376953, -5.467400074005127, -5.894899845123291, -6.571000099182129, -5.354100227355957, -4.242700099945068, -4.984099864959717, -5.727200031280518, -5.379000186920166, -5.3383002281188965, -4.232699871063232, -5.212600231170654, -5.309599876403809, -6.185999870300293, -5.68149995803833, -5.6529998779296875, -4.570099830627441, -5.377799987792969, -4.806000232696533, -4.966400146484375, -5.1168999671936035, -4.681700229644775, -5.565299987792969, -4.904900074005127, -5.4120001792907715, -5.2144999504089355, -5.293900012969971, -5.325399875640869, -5.288099765777588, -5.44320011138916, -5.561200141906738, -5.525400161743164, -6.017399787902832, -6.459199905395508, -6.554100036621094, -6.177000045776367, -6.7220001220703125, -6.895100116729736, -6.903600215911865, -5.435500144958496, -6.782800197601318, -7.031599998474121, -7.093900203704834, -7.136499881744385, -7.1616997718811035, -7.162600040435791, -7.181000232696533, -6.083799839019775, -7.304900169372559, -7.343400001525879, -7.348599910736084, -7.369699954986572, -7.401000022888184, -7.41349983215332, -7.497000217437744, -7.502200126647949, -7.513800144195557, -7.516499996185303, -7.521500110626221, -7.535600185394287, -7.5441999435424805, -7.55109977722168, -5.597400188446045, -5.7683000564575195, -6.349699974060059, -6.095099925994873, -6.504499912261963, -6.050600051879883, -6.671199798583984, -6.494999885559082, -5.345600128173828, -4.648399829864502, -4.356599807739258, -6.17140007019043, -5.94320011138916, -5.763000011444092, -6.377099990844727, -6.164899826049805, -6.436299800872803, -5.794899940490723, -6.502699851989746, -5.310500144958496, -6.0553998947143555, -5.515200138092041, -5.35230016708374, -5.60129976272583, -6.164999961853027, -4.837200164794922, -4.860099792480469, -5.854800224304199, -5.8242998123168945, -5.942299842834473, -5.11929988861084, -4.981500148773193, -5.545599937438965, -5.661200046539307, -5.696599960327148, -5.682400226593018, -5.589000225067139, -5.571599960327148, -5.62470006942749, -5.624100208282471, -5.744900226593018, -5.708799839019775, -5.770199775695801, -5.910600185394287, -5.906000137329102, -5.388000011444092, -4.97730016708374, -5.809100151062012, -5.883299827575684, -6.095799922943115, -6.528900146484375, -6.915599822998047, -7.037899971008301, -6.993800163269043, -7.081099987030029, -7.107399940490723, -7.218400001525879, -7.237599849700928, -7.257500171661377, -7.2804999351501465, -7.362400054931641, -7.387899875640869, -7.4105000495910645, -7.4207000732421875, -7.450399875640869, -7.463500022888184, -7.480199813842773, -7.480000019073486, -7.519499778747559, -7.536099910736084, -7.539700031280518, -7.541999816894531, -7.6118998527526855, -7.619999885559082, -7.1971001625061035, -5.447000026702881, -5.146599769592285, -5.984499931335449, -6.154799938201904, -5.329599857330322, -6.46150016784668, -6.9243998527526855, -5.44290018081665, -5.820099830627441, -7.303299903869629, -6.218299865722656, -5.551400184631348, -6.050899982452393, -6.115699768066406, -6.45389986038208, -6.50540018081665, -5.731599807739258, -5.35699987411499, -5.955699920654297, -5.418099880218506, -6.295400142669678, -5.906899929046631, -6.03879976272583, -5.660900115966797, -5.357600212097168, -4.576000213623047, -6.046299934387207, -5.535999774932861, -5.82480001449585, -4.986599922180176, -5.956099987030029, -5.39900016784668, -5.295400142669678, -5.342700004577637, -5.166399955749512, -5.351200103759766, -5.513000011444092, -5.395500183105469, -5.363999843597412, -5.460100173950195, -5.502299785614014, -5.614999771118164, -5.730199813842773, -5.740499973297119, -5.725100040435791, -5.77209997177124, -5.916200160980225, -6.203800201416016, -6.205599784851074, -6.309999942779541, -6.57480001449585, -6.602399826049805, -6.702899932861328, -6.705100059509277, -6.802800178527832, -6.820400238037109, -6.838099956512451, -6.872300148010254, -6.866399765014648, -5.8531999588012695, -6.912700176239014, -6.946300029754639, -6.9471001625061035, -6.961400032043457, -6.976600170135498, -6.990600109100342, -7.022799968719482, -7.031899929046631, -6.214600086212158, -7.107999801635742, -7.111999988555908, -7.125100135803223, -7.150100231170654, -7.1504998207092285, -7.16379976272583, -7.183000087738037, -5.0954999923706055, -6.145999908447266, -5.829899787902832, -6.146999835968018, -6.287600040435791, -5.656300067901611, -6.222400188446045, -5.499899864196777, -6.05810022354126, -6.175099849700928, -6.523399829864502, -6.176700115203857, -5.816299915313721, -6.7428998947143555, -6.06220006942749, -5.412899971008301, -5.721799850463867, -4.644899845123291, -5.347899913787842, -4.7179999351501465, -5.152400016784668, -5.967599868774414, -5.999100208282471, -5.628600120544434, -5.627799987792969, -5.966800212860107, -5.143700122833252, -5.252600193023682, -5.252600193023682, -5.163899898529053, -5.8053998947143555, -5.447700023651123, -5.619100093841553, -5.710599899291992, -5.69189977645874, -5.749000072479248, -5.70359992980957, -5.710599899291992, -5.674900054931641, -5.8471999168396, -5.911399841308594, -5.9029998779296875, -4.351600170135498, -5.3572998046875, -5.516900062561035, -5.445400238037109, -5.866499900817871, -5.999599933624268, -6.178400039672852, -6.39169979095459, -6.408699989318848, -6.450099945068359, -4.750800132751465, -6.572500228881836, -6.60129976272583, -6.676599979400635, -6.698999881744385, -6.645400047302246, -6.8256001472473145, -6.853000164031982, -6.371300220489502, -6.9558000564575195, -6.956299781799316, -6.978799819946289, -6.988800048828125, -7.013700008392334, -6.946000099182129, -7.128799915313721, -7.146599769592285, -7.2179999351501465, -7.229000091552734, -7.287799835205078, -4.95959997177124, -4.533999919891357, -5.435999870300293, -6.94350004196167, -6.648799896240234, -5.456600189208984, -4.546800136566162, -5.6230998039245605, -6.371500015258789, -6.284299850463867, -4.621500015258789, -4.631499767303467, -5.618000030517578, -5.259300231933594, -5.611199855804443, -5.697000026702881, -5.560400009155273, -5.549799919128418, -5.781899929046631, -5.357699871063232, -5.821599960327148, -5.603300094604492, -5.048399925231934, -5.6143999099731445, -5.34499979019165, -5.15939998626709, -5.414700031280518, -5.561200141906738, -5.336999893188477, -5.3649001121521, -5.582699775695801, -5.557499885559082, -5.554999828338623, -5.589600086212158, -5.306000232696533, -5.590199947357178, -6.189599990844727, -6.274400234222412, -6.389599800109863, -6.389500141143799, -6.435200214385986, -6.504300117492676, -6.507500171661377, -6.6519999504089355, -6.760200023651123, -6.632599830627441, -6.781199932098389, -6.806099891662598, -6.833499908447266, -6.872200012207031, -6.879899978637695, -6.9542999267578125, -6.990300178527832, -6.370100021362305, -6.994999885559082, -6.997000217437744, -5.59689998626709, -7.023399829864502, -7.023399829864502, -7.025400161743164, -7.065000057220459, -7.035699844360352, -7.0879998207092285, -7.124899864196777, -6.369200229644775, -5.4944000244140625, -5.081399917602539, -5.257400035858154, -5.519999980926514, -6.0345001220703125, -5.214099884033203, -6.502200126647949, -6.671199798583984, -6.0482001304626465, -6.612400054931641, -6.098800182342529, -5.285799980163574, -5.903200149536133, -5.553400039672852, -5.670000076293945, -5.394599914550781, -6.484300136566162, -5.22599983215332, -6.290200233459473, -5.123600006103516, -5.187600135803223, -4.965199947357178, -5.832200050354004, -5.899400234222412, -5.825500011444092, -5.028299808502197, -5.555200099945068, -6.0192999839782715, -5.151199817657471, -5.456500053405762, -5.453000068664551, -5.76200008392334, -5.762700080871582, -5.408999919891357, -5.3933000564575195, -5.599400043487549, -5.662700176239014, -5.7164998054504395, -5.688399791717529, -5.706200122833252, -5.737599849700928, -4.496799945831299, -4.617499828338623, -5.374000072479248, -5.655700206756592, -5.768099784851074, -5.807300090789795, -5.857600212097168, -5.942200183868408, -6.054900169372559, -6.128300189971924, -6.153299808502197, -6.173099994659424, -6.179500102996826, -6.234899997711182, -6.258200168609619, -6.203199863433838, -6.280900001525879, -6.3358001708984375, -6.345300197601318, -6.419400215148926, -6.450300216674805, -6.476099967956543, -6.50439977645874, -6.50600004196167, -6.509799957275391, -6.446499824523926, -6.600800037384033, -6.6890997886657715, -6.702099800109863, -6.729800224304199, -5.840000152587891, -6.20389986038208, -4.364299774169922, -6.039400100708008, -3.9937000274658203, -6.145199775695801, -5.97130012512207, -5.824900150299072, -6.168600082397461, -4.063600063323975, -4.401299953460693, -5.480899810791016, -4.791800022125244, -5.240699768066406, -5.105299949645996, -5.286499977111816, -5.36359977722168, -5.348800182342529, -5.300000190734863, -5.866099834442139, -5.378200054168701, -5.480899810791016, -5.417900085449219, -5.409200191497803, -4.829100131988525, -5.538000106811523, -5.578700065612793, -5.704500198364258, -5.638400077819824, -5.4253997802734375, -5.345900058746338, -5.65749979019165, -5.737199783325195]}, \"token.table\": {\"Topic\": [1, 2, 3, 4, 5, 6, 8, 9, 10, 3, 4, 5, 6, 7, 8, 4, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 1, 3, 5, 8, 1, 2, 3, 5, 8, 1, 5, 8, 9, 5, 3, 8, 7, 4, 1, 2, 5, 6, 7, 8, 9, 10, 2, 3, 4, 5, 6, 7, 8, 10, 3, 8, 1, 6, 9, 2, 4, 5, 2, 3, 4, 5, 8, 1, 10, 1, 3, 4, 8, 1, 1, 2, 3, 5, 6, 7, 8, 9, 1, 6, 8, 9, 10, 1, 1, 1, 3, 5, 6, 6, 2, 2, 2, 1, 2, 6, 8, 9, 10, 5, 1, 2, 3, 4, 8, 2, 3, 4, 5, 6, 7, 3, 5, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 1, 1, 1, 3, 9, 4, 5, 7, 1, 3, 4, 5, 6, 7, 8, 9, 10, 7, 10, 7, 1, 8, 6, 7, 1, 2, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 1, 3, 7, 8, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 2, 2, 5, 6, 2, 5, 3, 4, 4, 9, 7, 1, 3, 4, 5, 7, 8, 9, 10, 10, 8, 1, 2, 3, 4, 5, 6, 7, 9, 6, 5, 6, 7, 10, 10, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 1, 4, 5, 6, 7, 3, 4, 8, 4, 6, 4, 5, 1, 3, 4, 5, 6, 7, 8, 9, 10, 8, 9, 9, 10, 5, 6, 4, 6, 7, 8, 10, 9, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 9, 7, 2, 1, 2, 3, 4, 5, 6, 7, 8, 9, 6, 4, 4, 9, 1, 2, 3, 5, 8, 9, 4, 7, 8, 9, 1, 2, 1, 2, 1, 2, 5, 4, 8, 3, 4, 7, 8, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 8, 1, 2, 3, 8, 10, 6, 7, 10, 3, 4, 4, 9, 1, 5, 6, 8, 7, 8, 7, 10, 2, 3, 4, 6, 7, 8, 1, 2, 3, 4, 7, 10, 2, 3, 4, 5, 6, 7, 8, 10, 1, 4, 6, 7, 10, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 2, 3, 4, 5, 6, 7, 8, 9, 3, 4, 7, 9, 6, 4, 2, 9, 10, 3, 1, 3, 4, 5, 6, 7, 8, 9, 10, 1, 2, 3, 4, 6, 7, 8, 3, 1, 3, 4, 5, 6, 7, 8, 9, 6, 1, 4, 5, 6, 8, 9, 10, 1, 2, 6, 8, 10, 1, 6, 8, 8, 8, 8, 8, 4, 7, 10, 9, 2, 6, 2, 3, 4, 6, 7, 8, 9, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 1, 4, 6, 8, 1, 2, 4, 6, 9, 10, 8, 8, 5, 1, 2, 3, 4, 5, 6, 7, 8, 9, 3, 10, 3, 4, 7, 8, 4, 9, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 3, 3, 4, 8, 9, 3, 4, 8, 1, 2, 3, 4, 5, 9, 10, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 2, 1, 3, 4, 5, 6, 7, 8, 9, 10, 5, 1, 6, 9, 2, 7, 1, 2, 4, 5, 6, 7, 9, 10, 4, 5, 6, 8, 10, 3, 5, 9, 1, 7, 9, 1, 2, 3, 5, 7, 9, 10, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 9, 4, 1, 2, 3, 4, 5, 6, 7, 10, 8, 1, 2, 6, 8, 10, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 5, 3, 4, 8, 10, 8, 4, 10, 1, 2, 9, 3, 4, 1, 1, 2, 6, 8, 9, 10, 1, 2, 3, 4, 5, 7, 8, 9, 10, 1, 2, 7, 8, 1, 5, 6, 8, 1, 3, 4, 8, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 6, 6, 1, 3, 5, 9, 3, 4, 5, 10, 7, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 3, 4, 1, 2, 5, 9, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 2, 3, 4, 8, 9, 2, 6, 10, 6, 9, 1, 2, 3, 4, 8, 9, 5, 6, 8, 9, 10, 2, 4, 7, 10, 7, 10, 7, 9, 1, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 1, 2, 3, 5, 8, 10, 2, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 4, 9, 2, 1, 5, 6, 8, 3, 3, 4, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 1, 3, 1, 2, 3, 1, 2, 5, 6, 7, 8, 9, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 8, 1, 6, 9, 5, 8, 3, 6, 8, 6, 7, 9, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 1, 2, 4, 5, 6, 7, 8, 9, 10, 6, 1, 5, 8, 9, 1, 2, 5, 7, 5, 6, 7, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 5, 10, 7, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 1, 5, 6, 7, 9, 1, 7, 10, 1, 2, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 9, 8, 6, 7, 6, 5, 1, 6, 6, 1, 2, 3, 4, 5, 6, 7, 9, 1, 2, 3, 4, 8, 6, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 2, 3, 4, 7, 8, 9, 9, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 7, 9, 10, 7, 3, 4, 5, 7, 8, 5, 6, 9, 10, 9, 4, 2, 3, 4, 6, 7, 8, 9, 10, 5, 8, 1, 1, 2, 10, 1, 2, 10, 2, 10, 2, 4, 7, 9, 7, 2, 4, 5, 6, 7, 9, 10, 2, 5, 10, 1, 2, 10, 3, 5, 6, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 4, 7, 5, 3, 3, 8, 1, 2, 3, 6, 7, 9, 10, 1, 7, 3, 7, 5, 3, 5, 10, 10, 7, 10, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 10, 10, 1, 2, 3, 4, 6, 7, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 1, 2, 5, 6, 7, 8, 9, 10, 2, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 7, 1, 2, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 1, 2, 4, 5, 6, 7, 9, 10, 3, 5, 8, 1, 3, 4, 5, 6, 8, 9, 10, 3, 6, 2, 3, 4, 6, 7, 8, 9, 10, 3, 4, 3, 5, 1, 2, 1, 4, 10, 5, 3, 4, 10, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 1, 3, 7, 8, 9, 1, 4, 8, 9, 4, 1, 2, 3, 4, 5, 7, 10, 1, 2, 3, 4, 5, 6, 7, 8, 10, 7, 1, 5, 7, 9, 9, 2, 4, 6, 9, 1, 8, 1, 2, 3, 5, 5, 2, 3, 4, 7, 8, 9, 3, 4, 8, 1, 2, 4, 5, 6, 8, 9, 10, 4, 5, 8, 4, 10, 2, 3, 5, 1, 2, 1, 4, 3, 6, 1, 3, 4, 1, 2, 6, 1, 2, 3, 5, 7, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 1, 8, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 2, 4, 6, 7, 8, 9, 3, 8, 7, 5, 4, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 3, 6, 8, 3, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 10, 5, 3, 5, 6, 7, 3, 4, 8, 1, 3, 4, 5, 6, 7, 10, 1, 2, 4, 7, 9, 10, 2, 8, 9, 2, 9, 10, 10, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 1, 2, 3, 5, 6, 7, 8, 9, 10, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 1, 2, 3, 4, 6, 7, 8, 9, 6, 9, 6, 5, 7, 7, 7, 9, 10, 8, 9, 10, 3, 1, 2, 4, 5, 6, 7, 8, 10, 7, 10, 10, 5, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 1, 2, 5, 6, 8, 10, 3, 1, 8, 9, 10, 3, 4, 8, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 4, 1, 5, 8, 10, 1, 2, 3, 4, 5, 6, 7, 1, 2, 3, 9, 3, 4, 7, 1, 8, 1, 2, 3, 4, 5, 6, 8, 3, 5, 6, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 2, 3, 4, 5, 8, 9, 3, 5, 7, 8, 9, 2, 2, 2, 3, 5, 8, 9, 10, 1, 3, 4, 5, 6, 7, 8, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 3, 4, 8, 10, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 3, 5, 10, 6, 5, 10, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 3, 8, 5, 3, 1, 2, 1, 2, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 1, 2, 3, 4, 5, 9, 7, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 2, 2, 7, 5, 6, 5, 6, 6, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 8, 1, 3, 5, 6, 7, 8, 9, 6, 1, 3, 5, 6, 7, 9, 10, 9, 1, 2, 4, 9, 10, 7, 5, 1, 2, 3, 4, 5, 6, 7, 10, 2, 7, 8, 2, 3, 4, 5, 6, 7, 2, 2, 3, 5, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 2, 3, 4, 8, 9, 2, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 2, 3, 5, 8, 9, 7, 10, 1, 2, 3, 4, 7, 9, 10, 3, 4, 8, 10, 2, 4, 1, 7, 7, 10, 1, 7, 8, 1, 6, 8, 10, 10, 1, 3, 4, 5, 6, 7, 8, 10, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 1, 1, 3, 4, 5, 1, 6, 10, 6, 3, 5, 4, 2, 2, 9, 3, 1, 1, 9, 10, 1, 2, 3, 4, 5, 6, 7, 10, 6, 2, 3, 4, 5, 6, 7, 8, 9, 10, 3, 5, 10, 1, 10, 2, 1, 2, 3, 4, 5, 7, 8, 9, 10, 1, 3, 4, 5, 8, 3, 5, 4, 5, 7, 4, 5, 6, 7, 8, 5, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 9, 1, 2, 5, 5, 1, 3, 4, 5, 6, 7, 8, 10, 3, 7, 10, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 7, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 1, 3, 4, 5, 6, 7, 8, 10, 8, 2, 3, 4, 6, 7, 8, 9, 10, 9, 5, 9, 8, 1, 2, 3, 5, 6, 8, 9, 10, 3, 9, 8, 4, 4, 9, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 8, 1, 2, 3, 5, 6, 3, 5, 7, 8, 10, 1, 2, 3, 4, 5, 6, 7, 8, 9, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 6, 2, 3, 4, 5, 6, 7, 8, 9, 2, 1, 2, 3, 4, 5, 6, 7, 9, 10, 2, 5, 2, 1, 2, 3, 6, 8, 9, 9, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 6, 4, 7, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 4, 5, 6, 7, 10, 3, 3, 4, 5, 7, 10, 1, 9, 1, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 6, 1, 2, 6, 9, 10, 1, 1, 1, 3, 2, 6, 7, 5, 7, 1, 2, 3, 4, 5, 6, 7, 9, 2, 4, 7, 5, 3, 4, 1, 4, 6, 7, 3, 4, 6, 8, 3, 6, 10, 6, 1, 5, 6, 8, 2, 1, 2, 3, 4, 5, 6, 7, 8, 10, 4, 8, 1, 3, 4, 8, 1, 10, 2, 3, 5, 6, 7, 8, 10, 3, 7, 7, 4, 1, 6, 6, 7, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 1, 2, 5, 7, 9, 1, 6, 7, 3, 5, 3, 1, 3, 4, 1, 5, 8, 9, 10, 5, 10, 3, 5, 7, 8, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 1, 2, 3, 3, 3, 3, 6, 7, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 9, 5, 1], \"Freq\": [0.14597457647323608, 0.5243168473243713, 0.12909317016601562, 0.049651216715574265, 0.007944194599986076, 0.022839559242129326, 0.06553960591554642, 0.034755852073431015, 0.018867462873458862, 0.4038994312286377, 0.19606097042560577, 0.17181314527988434, 0.03325415775179863, 0.0006927949143573642, 0.19328978657722473, 0.9846453666687012, 0.05245403200387955, 0.07399765402078629, 0.5367171764373779, 0.18265242874622345, 0.030910411849617958, 0.026227016001939774, 0.03278376907110214, 0.04964399337768555, 0.005620074924081564, 0.008430112153291702, 0.12413346767425537, 0.06308422237634659, 0.1973925679922104, 0.6145623922348022, 0.07897721976041794, 0.027874313294887543, 0.006968578323721886, 0.127757266163826, 0.7549293041229248, 0.0386761873960495, 0.08218690007925034, 0.0048345234245061874, 0.8702142834663391, 0.9961587190628052, 0.38717371225357056, 0.6116222143173218, 0.9911679625511169, 0.9902357459068298, 0.3397248089313507, 0.01449063140898943, 0.0941891074180603, 0.10062938928604126, 0.0040251752361655235, 0.20286883413791656, 0.03300643712282181, 0.21091918647289276, 0.1255282163619995, 0.12667985260486603, 0.06333992630243301, 0.012667985633015633, 0.1738968938589096, 0.03685232251882553, 0.07370464503765106, 0.3869493901729584, 0.9024051427841187, 0.09522868692874908, 0.7508026957511902, 0.0531729981303215, 0.19354970753192902, 0.22446227073669434, 0.772514820098877, 0.0022788047790527344, 0.02517748810350895, 0.7349889278411865, 0.18786278367042542, 0.01162037905305624, 0.03970295935869217, 0.34412068128585815, 0.6550520658493042, 0.04771804437041283, 0.8043898940086365, 0.03408431634306908, 0.11361439526081085, 0.9978160262107849, 0.06133546680212021, 0.7078112959861755, 0.06010875850915909, 0.011040383949875832, 0.05642862990498543, 0.013493802398443222, 0.012267093174159527, 0.07728268951177597, 0.8128737211227417, 0.14955469965934753, 0.015835203230381012, 0.012316268868744373, 0.007037867791950703, 0.9969621896743774, 0.9991598129272461, 0.8529109358787537, 0.0881236344575882, 0.006294545251876116, 0.050356362015008926, 0.9844499230384827, 0.9971557855606079, 0.999137282371521, 0.9962266683578491, 0.6339918971061707, 0.02204061858355999, 0.04278472810983658, 0.24115028977394104, 0.03241267427802086, 0.02722664549946785, 0.9965710639953613, 0.14439868927001953, 0.3110125660896301, 0.1871201992034912, 0.061518967151641846, 0.29563280940055847, 0.030767355114221573, 0.01678219437599182, 0.019579226151108742, 0.00839109718799591, 0.8978473544120789, 0.025173291563987732, 0.9901503324508667, 0.9818687438964844, 0.0017969019245356321, 0.02096385695040226, 0.6175352931022644, 0.11859553307294846, 0.024557659402489662, 0.027552496641874313, 0.004192771390080452, 0.14075732231140137, 0.031745269894599915, 0.012578314170241356, 0.9968400597572327, 0.9915972352027893, 0.9969091415405273, 0.9911938309669495, 0.9858373403549194, 0.023298190906643867, 0.15143823623657227, 0.8232027292251587, 0.003686217125505209, 0.012901759706437588, 0.02764662727713585, 0.020274193957448006, 0.007372434251010418, 0.00552932545542717, 0.1032140776515007, 0.7501451969146729, 0.06819501519203186, 0.832465648651123, 0.16556039452552795, 0.9908676147460938, 0.9820579290390015, 0.01671587862074375, 0.05610894411802292, 0.9409037828445435, 0.013235166668891907, 0.9843655228614807, 0.09290337562561035, 0.588257908821106, 0.0011710509425029159, 0.03083767369389534, 0.050745539367198944, 0.05933324620127678, 0.04801308736205101, 0.04332888498902321, 0.07065340876579285, 0.014052610844373703, 0.009513283148407936, 0.16172580420970917, 0.7934077978134155, 0.03424781933426857, 0.007427421398460865, 0.13072261214256287, 0.06758953630924225, 0.18197181820869446, 0.03936533257365227, 0.10546938329935074, 0.24139119684696198, 0.019311295822262764, 0.07501695305109024, 0.13295084238052368, 0.044250890612602234, 0.11761420220136642, 0.023289941251277924, 0.16128285229206085, 0.10946272313594818, 0.1676875799894333, 0.19796450436115265, 0.02270769327878952, 0.06288284063339233, 0.0931597650051117, 0.998639702796936, 0.9974706768989563, 0.001337522640824318, 0.9977918863296509, 0.061785414814949036, 0.9340500831604004, 0.9673571586608887, 0.02763877622783184, 0.9971907734870911, 0.982144832611084, 0.9899947643280029, 0.030463596805930138, 0.09139078855514526, 0.7326495051383972, 0.04874175414443016, 0.01675497740507126, 0.007615899201482534, 0.01218543853610754, 0.05940401181578636, 0.99476557970047, 0.9897249341011047, 0.10202129930257797, 0.3764234185218811, 0.3714982569217682, 0.004925166256725788, 0.0014071903424337506, 0.023922234773635864, 0.0731738954782486, 0.046437282115221024, 0.9913920760154724, 0.05558506026864052, 0.9393875598907471, 0.9452286958694458, 0.05472376570105553, 0.9884551167488098, 0.18599408864974976, 0.01752118207514286, 0.20149360597133636, 0.2715783417224884, 0.20014581084251404, 0.01347783301025629, 0.06671527028083801, 0.035716257989406586, 0.0006738916272297502, 0.0074128080159425735, 0.01812359318137169, 0.4086046516895294, 0.023066390305757523, 0.5272318124771118, 0.023066390305757523, 0.04739178344607353, 0.8909655213356018, 0.05687014013528824, 0.996481716632843, 0.9901353716850281, 0.9917146563529968, 0.9955679178237915, 0.0054613146930933, 0.13243688642978668, 0.045055847615003586, 0.046421173959970474, 0.20479929447174072, 0.13789819180965424, 0.028671901673078537, 0.0109226293861866, 0.38775333762168884, 0.06210208684206009, 0.9315313100814819, 0.9911101460456848, 0.985682487487793, 0.037090227007865906, 0.9602247476577759, 0.8974165320396423, 0.03992743045091629, 0.04689888656139374, 0.005703918635845184, 0.008872762322425842, 0.9924948215484619, 0.09890257567167282, 0.14101898670196533, 0.05016111582517624, 0.13344749808311462, 0.028866302222013474, 0.2067962884902954, 0.028866302222013474, 0.12918853759765625, 0.16278702020645142, 0.019875159487128258, 0.99397212266922, 0.9958775043487549, 0.9967539310455322, 0.12163206189870834, 0.17699562013149261, 0.04529745876789093, 0.08556186407804489, 0.02432641200721264, 0.09478912502527237, 0.04110324755311012, 0.009227260015904903, 0.4009663760662079, 0.9872007369995117, 0.9970030188560486, 0.989752471446991, 0.9943544268608093, 0.6778270602226257, 0.13264478743076324, 0.02312156930565834, 0.007301548030227423, 0.03772466629743576, 0.12047554552555084, 0.3486368954181671, 0.0047387536615133286, 0.6465014219284058, 0.9887388944625854, 0.0016635035863146186, 0.9981021881103516, 0.013510559685528278, 0.9862708449363708, 0.0026857545599341393, 0.9856719374656677, 0.009400141425430775, 0.9924080967903137, 0.9946733713150024, 0.9897469878196716, 0.049537550657987595, 0.9288290739059448, 0.021672679111361504, 0.23152561485767365, 0.4994880259037018, 0.006072802934795618, 0.04630511999130249, 0.00910920463502407, 0.024291211739182472, 0.019736608490347862, 0.05237792432308197, 0.08198283612728119, 0.029604913666844368, 0.9905489087104797, 0.016076363623142242, 0.032152727246284485, 0.008038181811571121, 0.9404672980308533, 0.9969877600669861, 0.8351331353187561, 0.03579141944646835, 0.12725839018821716, 0.9407901763916016, 0.05612668767571449, 0.007186023984104395, 0.9844852685928345, 0.12219513952732086, 0.32132795453071594, 0.027154475450515747, 0.5280036926269531, 0.006376359611749649, 0.9934368133544922, 0.049451667815446854, 0.9494720101356506, 0.04700107127428055, 0.6893490552902222, 0.03916756063699722, 0.0019583781249821186, 0.007833512499928474, 0.2134632021188736, 0.019393572583794594, 0.003062143223360181, 0.16433501243591309, 0.7624736428260803, 0.04695286229252815, 0.003062143223360181, 0.024980686604976654, 0.01405163574963808, 0.026541979983448982, 0.01405163574963808, 0.27010366320610046, 0.5214717984199524, 0.11709696799516678, 0.012490343302488327, 0.0858292356133461, 0.15020115673542023, 0.007152436301112175, 0.04470272734761238, 0.7116674184799194, 0.2507072985172272, 0.2215621918439865, 0.014572546817362309, 0.11628297716379166, 0.07137574255466461, 0.06988874822854996, 0.13055811822414398, 0.032119084149599075, 0.041041050106287, 0.051450010389089584, 0.01048524770885706, 0.19528773427009583, 0.12320166081190109, 0.07863935828208923, 0.01179590355604887, 0.14679346978664398, 0.4298951327800751, 0.0013106559636071324, 0.8896311521530151, 0.08087556064128876, 0.008366437628865242, 0.01952168717980385, 0.9776101112365723, 0.99211585521698, 0.9851323962211609, 0.007976780645549297, 0.003988390322774649, 0.9936339855194092, 0.14129090309143066, 0.029137810692191124, 0.45191097259521484, 0.049479302018880844, 0.1335941106081009, 0.01099540013819933, 0.11490193754434586, 0.062124013900756836, 0.007696780376136303, 0.011458919383585453, 0.05500281602144241, 0.5695083141326904, 0.21771948039531708, 0.06989941000938416, 0.010313027538359165, 0.065315842628479, 0.9911519289016724, 0.00985698401927948, 0.062098998576402664, 0.14194056391716003, 0.5105918049812317, 0.18235421180725098, 0.031542349606752396, 0.030556650832295418, 0.031542349606752396, 0.9842240810394287, 0.7061229944229126, 0.005525218788534403, 0.07514297962188721, 0.11934472620487213, 0.07514297962188721, 0.0011050438042730093, 0.018785744905471802, 0.29332059621810913, 0.04784662276506424, 0.10401439666748047, 0.5554368495941162, 0.997512698173523, 0.32539698481559753, 0.5732461214065552, 0.1003560796380043, 0.9919000864028931, 0.9959332346916199, 0.9922512769699097, 0.9963847994804382, 0.9902955293655396, 0.9944120645523071, 0.996181070804596, 0.9942311644554138, 0.11343295127153397, 0.8847770094871521, 0.003028275677934289, 0.47543928027153015, 0.2640656530857086, 0.016352688893675804, 0.004239586181938648, 0.21016234159469604, 0.02604317106306553, 0.10129164159297943, 0.11214431375265121, 0.1175706535577774, 0.0771745815873146, 0.0012058528373017907, 0.19173060357570648, 0.207406684756279, 0.08802726119756699, 0.06813068687915802, 0.035572659224271774, 0.9973658323287964, 0.114595428109169, 0.7639694809913635, 0.12005235254764557, 0.5815345048904419, 0.2825379967689514, 0.013715436682105064, 0.09326496720314026, 0.024687785655260086, 0.004114631097763777, 0.9915576577186584, 0.9918363094329834, 0.9877095818519592, 0.006995587144047022, 0.0029981087427586317, 0.24484555423259735, 0.12192308902740479, 0.2958134114742279, 0.11292876303195953, 0.044971633702516556, 0.12991805374622345, 0.038975413888692856, 0.9953435063362122, 0.9973883628845215, 0.009578458033502102, 0.47481784224510193, 0.06157580018043518, 0.45429256558418274, 0.9948939085006714, 0.9922352433204651, 0.0447232723236084, 0.2554982900619507, 0.08590410649776459, 0.18686357140541077, 0.07749082148075104, 0.13461261987686157, 0.03143913298845291, 0.04250925034284592, 0.11690043658018112, 0.023025844246149063, 0.9796628952026367, 0.767768919467926, 0.20836207270622253, 0.022648051381111145, 0.99672931432724, 0.012705815024673939, 0.9490266442298889, 0.037140075117349625, 0.011915273033082485, 0.013106800615787506, 0.6052958965301514, 0.3467344641685486, 0.010723746381700039, 0.0011915273498743773, 0.010723746381700039, 0.05133536830544472, 0.01480827946215868, 0.20534147322177887, 0.17967379093170166, 0.05429702252149582, 0.14512114226818085, 0.17572490870952606, 0.10299980640411377, 0.04936093091964722, 0.021389735862612724, 0.9927855730056763, 0.005768877454102039, 0.0879753828048706, 0.012979974038898945, 0.015864413231611252, 0.1543174684047699, 0.186046302318573, 0.09518647938966751, 0.015864413231611252, 0.425454705953598, 0.9893773794174194, 0.13153523206710815, 0.002684392500668764, 0.8643743395805359, 0.994407057762146, 0.9892554879188538, 0.03373618796467781, 0.00606493279337883, 0.7467448115348816, 0.015162331983447075, 0.18535950779914856, 0.010992689989507198, 0.0007581165991723537, 0.0011371748987585306, 0.7884163856506348, 0.004198170267045498, 0.19731400907039642, 0.004198170267045498, 0.0058774384669959545, 0.004380349535495043, 0.9943393468856812, 0.99397212266922, 0.03518839552998543, 0.9632822871208191, 0.996552050113678, 0.0027513126842677593, 0.2998930811882019, 0.09079331904649734, 0.6052888035774231, 0.0013756563421338797, 0.0013756563421338797, 0.996784508228302, 0.042793214321136475, 0.06828704476356506, 0.05462963879108429, 0.022762348875403404, 0.07192902266979218, 0.07830248028039932, 0.06464507430791855, 0.18118830025196075, 0.4079012870788574, 0.008194445632398129, 0.9926568269729614, 0.9913457632064819, 0.002587467897683382, 0.007762403693050146, 0.584767758846283, 0.26133424043655396, 0.0008624892798252404, 0.055199313908815384, 0.07331158965826035, 0.013799828477203846, 0.999565839767456, 0.03261076658964157, 0.011646702885627747, 0.016305383294820786, 0.9131014943122864, 0.025622745975852013, 0.006280622910708189, 0.027913879603147507, 0.10188566148281097, 0.2023756206035614, 0.2979806661605835, 0.24494428932666779, 0.03768373653292656, 0.039777278900146484, 0.016748327761888504, 0.025122491642832756, 0.9944507479667664, 0.15898659825325012, 0.8375879526138306, 0.002585147973150015, 0.9929267168045044, 0.9990204572677612, 0.9821109175682068, 0.9942479133605957, 0.014141467399895191, 0.9085893034934998, 0.07424270361661911, 0.989834189414978, 0.9895696043968201, 0.9942163825035095, 0.09427458047866821, 0.6226266026496887, 0.01035984419286251, 0.038331422954797745, 0.228952556848526, 0.004143937490880489, 0.15293754637241364, 0.5817509293556213, 0.06882189959287643, 0.07235122472047806, 0.029411068186163902, 0.0011764427181333303, 0.042940158396959305, 0.04411660134792328, 0.007058656308799982, 0.993468165397644, 0.977222204208374, 0.021785208955407143, 0.9887476563453674, 0.21482254564762115, 0.08933214843273163, 0.10422083735466003, 0.5912937521934509, 0.007280969060957432, 0.5405252575874329, 0.38901177048683167, 0.06275501847267151, 0.12769539654254913, 0.08756255358457565, 0.0583750382065773, 0.11310163140296936, 0.13134382665157318, 0.012161466293036938, 0.08999484777450562, 0.025539077818393707, 0.030403664335608482, 0.3247111439704895, 0.9984502792358398, 0.9873169660568237, 0.03167828917503357, 0.09503486752510071, 0.809556245803833, 0.05983676761388779, 0.01888403482735157, 0.9788225293159485, 0.006505103781819344, 0.9887757897377014, 0.9961590766906738, 0.1199457049369812, 0.306469202041626, 0.2245679497718811, 0.1421383023262024, 0.028533339500427246, 0.031175315380096436, 0.030646920204162598, 0.0544247031211853, 0.028533339500427246, 0.033817291259765625, 0.9652637839317322, 0.03120945394039154, 0.09274733066558838, 0.022713633254170418, 0.054891277104616165, 0.827154815196991, 0.4964466094970703, 0.04393332824110985, 0.03514666110277176, 0.005491666030138731, 0.14717665314674377, 0.03953999653458595, 0.04722832888364792, 0.1021449863910675, 0.04722832888364792, 0.03514666110277176, 0.005432654172182083, 0.6655001640319824, 0.2974378168582916, 0.008148981258273125, 0.021730616688728333, 0.11880787461996078, 0.6471237540245056, 0.23256009817123413, 0.9826817512512207, 0.012131873518228531, 0.03757386654615402, 0.03757386654615402, 0.6821101903915405, 0.12139248847961426, 0.06069624423980713, 0.06069624423980713, 0.7772735953330994, 0.011330518871545792, 0.18582050502300262, 0.022661037743091583, 0.002266103634610772, 0.010306724347174168, 0.020098112523555756, 0.3040483593940735, 0.6652990579605103, 0.9968202114105225, 0.9952912330627441, 0.052468378096818924, 0.9444308280944824, 0.9979932308197021, 0.2475365847349167, 0.07662525027990341, 0.0008545566815882921, 0.08631022274494171, 0.1860084980726242, 0.13103201985359192, 0.15211108326911926, 0.027060961350798607, 0.023357881233096123, 0.06893423944711685, 0.005418404936790466, 0.16616442799568176, 0.012642945162951946, 0.12462332099676132, 0.06140859052538872, 0.6267288327217102, 0.9934369921684265, 0.028500467538833618, 0.17739543318748474, 0.0495428666472435, 0.08203873038291931, 0.06525807827711105, 0.19683967530727386, 0.2426535040140152, 0.04927650839090347, 0.054870057851076126, 0.05380462110042572, 0.0676751434803009, 0.930533230304718, 0.9940144419670105, 0.47860440611839294, 0.06758534908294678, 0.014017703011631966, 0.4390544593334198, 0.9757325649261475, 0.7745398879051208, 0.22468292713165283, 0.0706712082028389, 0.13032031059265137, 0.06418761610984802, 0.1335621029138565, 0.09530888497829437, 0.14523258805274963, 0.18089236319065094, 0.02204423025250435, 0.056407298892736435, 0.10114412009716034, 0.9620084166526794, 0.03390337899327278, 0.9282425045967102, 0.06953127682209015, 0.9822536110877991, 0.07761429250240326, 0.054539769887924194, 0.19927993416786194, 0.018879150971770287, 0.6376957893371582, 0.004195366986095905, 0.006293050479143858, 0.15075059235095978, 0.19674231112003326, 0.261130690574646, 0.06489940732717514, 0.07409775257110596, 0.09811564534902573, 0.012264455668628216, 0.0884062796831131, 0.032194193452596664, 0.020951777696609497, 0.9877375960350037, 0.09006665647029877, 0.9075947999954224, 0.9926806092262268, 0.9876639246940613, 0.9913367033004761, 0.9899704456329346, 0.8912872076034546, 0.10728456825017929, 0.04388415813446045, 0.05119818449020386, 0.8996252417564392, 0.38986071944236755, 0.08291813731193542, 0.0029094084165990353, 0.09746517986059189, 0.06109757721424103, 0.1280139684677124, 0.09019166231155396, 0.050914645195007324, 0.06255228072404861, 0.032730843871831894, 0.06610316783189774, 0.1192731112241745, 0.439729779958725, 0.06538465619087219, 0.14873214066028595, 0.01796281896531582, 0.021555382758378983, 0.05748101696372032, 0.06466614454984665, 0.9845778346061707, 0.016519933938980103, 0.20191030204296112, 0.11013288795948029, 0.6699751019477844, 0.024320492520928383, 0.945024847984314, 0.0034743561409413815, 0.024320492520928383, 0.8505869507789612, 0.1069309338927269, 0.03888397663831711, 0.1204938143491745, 0.0472608245909214, 0.20181649923324585, 0.31720104813575745, 0.05407319590449333, 0.055776290595531464, 0.06727216392755508, 0.032784536480903625, 0.09281855821609497, 0.010644330643117428, 0.9710562825202942, 0.02562905102968216, 0.9893935322761536, 0.02042248845100403, 0.04413892701268196, 0.05138561874628067, 0.18709635734558105, 0.24177591502666473, 0.10870034247636795, 0.09552454948425293, 0.11067671328783035, 0.11001792550086975, 0.030963128432631493, 0.03080737218260765, 0.01760421320796013, 0.04401053115725517, 0.8890127539634705, 0.013203159905970097, 0.9939618110656738, 0.9913746118545532, 0.9991692900657654, 0.0565398707985878, 0.9399753212928772, 0.27267149090766907, 0.003909268882125616, 0.06548024713993073, 0.07329878956079483, 0.01954634301364422, 0.10555025190114975, 0.35867539048194885, 0.023455612361431122, 0.0029319515451788902, 0.07427610456943512, 0.9918331503868103, 0.99335777759552, 0.9937839508056641, 0.9942802786827087, 0.9872105121612549, 0.9916340708732605, 0.1997508704662323, 0.7990034818649292, 0.9793252348899841, 0.011330229230225086, 0.022660458460450172, 0.022660458460450172, 0.07931160181760788, 0.008497672155499458, 0.7307997941970825, 0.12179996073246002, 0.0028325573075562716, 0.009340658783912659, 0.01939982920885086, 0.894547700881958, 0.07041420042514801, 0.005748097784817219, 0.9890444874763489, 0.08462037891149521, 0.058473631739616394, 0.4787231683731079, 0.13738927245140076, 0.04040860757231712, 0.029474513605237007, 0.03422846645116806, 0.062276795506477356, 0.03708083927631378, 0.03708083927631378, 0.005477291997522116, 0.021909167990088463, 0.13419364392757416, 0.6517977118492126, 0.16979604959487915, 0.013693229295313358, 0.9946314096450806, 0.05208856984972954, 0.02996245212852955, 0.4881574809551239, 0.07928525656461716, 0.00046096081496216357, 0.02673572674393654, 0.01428978517651558, 0.23831672966480255, 0.06591739505529404, 0.00507056899368763, 0.041800208389759064, 0.8824488520622253, 0.07431147992610931, 0.989013671875, 0.012954325415194035, 0.818713366985321, 0.05699903145432472, 0.023317785933613777, 0.08679398149251938, 0.03643111512064934, 0.7521953582763672, 0.2014426290988922, 0.010715033859014511, 0.9896851778030396, 0.9900700449943542, 0.01565428450703621, 0.538691520690918, 0.17772217094898224, 0.0570920929312706, 0.1289176344871521, 0.03959612920880318, 0.0018416804959997535, 0.04143780842423439, 0.9562947154045105, 0.034648358821868896, 0.9939988255500793, 0.2003951221704483, 0.7981254458427429, 0.9991390109062195, 0.029498854652047157, 0.030482148751616478, 0.9390468597412109, 0.9947072267532349, 0.9927675127983093, 0.05053260177373886, 0.05053260177373886, 0.862663745880127, 0.03609471768140793, 0.9871604442596436, 0.024649545550346375, 0.10916227102279663, 0.08099136501550674, 0.017606819048523903, 0.7465291023254395, 0.007042727433145046, 0.014085454866290092, 0.999288022518158, 0.029907118529081345, 0.9630091786384583, 0.8654993772506714, 0.109810970723629, 0.023615263402462006, 0.0038585870061069727, 0.949212372303009, 0.04244445636868477, 0.011400483548641205, 0.22331535816192627, 0.06974413245916367, 0.07645030319690704, 0.004023700021207333, 0.14887690544128418, 0.197831928730011, 0.06303796917200089, 0.09522756934165955, 0.10998113453388214, 0.9821317195892334, 0.017413683235645294, 0.9934825897216797, 0.9919980764389038, 0.03944997489452362, 0.9589378833770752, 0.7953603863716125, 0.004642181098461151, 0.010058059357106686, 0.1493234932422638, 0.0007736968691460788, 0.010058059357106686, 0.029400480911135674, 0.997399091720581, 0.9823879599571228, 0.08994246274232864, 0.89942467212677, 0.9825891256332397, 0.0062472145073115826, 0.9912247061729431, 0.9937719106674194, 0.9973540306091309, 0.2906239628791809, 0.7079301476478577, 0.3073142468929291, 0.058261655271053314, 0.00768285570666194, 0.0877126008272171, 0.09987712651491165, 0.12804760038852692, 0.15557783842086792, 0.016646187752485275, 0.05313975363969803, 0.08579189330339432, 0.9963269233703613, 0.9896251559257507, 0.03023815155029297, 0.00403175363317132, 0.9293192028999329, 0.00201587681658566, 0.006047630216926336, 0.028222274035215378, 0.14302490651607513, 0.5369426608085632, 0.00799021776765585, 0.0031960872001945972, 0.1318386048078537, 0.09348555654287338, 0.018377501517534256, 0.005593152716755867, 0.057529572397470474, 0.0015980436000972986, 0.03587299957871437, 0.05188773199915886, 0.5912638902664185, 0.04163830354809761, 0.001281178556382656, 0.1114625334739685, 0.053809501230716705, 0.03202946484088898, 0.005124714225530624, 0.07558953762054443, 0.38828960061073303, 0.2538585662841797, 0.09002076834440231, 0.1578364223241806, 0.02760636992752552, 0.002400553785264492, 0.04260983318090439, 0.03660844638943672, 0.9921504855155945, 0.10637208819389343, 0.12473393231630325, 0.0348241962492466, 0.08104539662599564, 0.24060353636741638, 0.09624141454696655, 0.12283443659543991, 0.09307557344436646, 0.07344739139080048, 0.026593022048473358, 0.08147933334112167, 0.08059046417474747, 0.18221740424633026, 0.13392238318920135, 0.11673765629529953, 0.15347743034362793, 0.17629164457321167, 0.01807359606027603, 0.02844369411468506, 0.029036270454525948, 0.9883785843849182, 0.05343436449766159, 0.9449445605278015, 0.11606968194246292, 0.09041216969490051, 0.040318939834833145, 0.05498037487268448, 0.045206084847450256, 0.03909715637564659, 0.37508833408355713, 0.023213936015963554, 0.053758587688207626, 0.16127575933933258, 0.05763829126954079, 0.6063104867935181, 0.031036002561450005, 0.02438542991876602, 0.19619187712669373, 0.05652986094355583, 0.011084286496043205, 0.016626430675387383, 0.007939115166664124, 0.9884198904037476, 0.9813743829727173, 0.04756461828947067, 0.2102356106042862, 0.602168083190918, 0.0038051693700253963, 0.04756461828947067, 0.03234393894672394, 0.004756461828947067, 0.05327237397432327, 0.9908403158187866, 0.9954898357391357, 0.016417836770415306, 0.5438934564590454, 0.14986537396907806, 0.06061970070004463, 0.11366193741559982, 0.054726120084524155, 0.009261343628168106, 0.05220029875636101, 0.8966226577758789, 0.10018130391836166, 0.030344881117343903, 0.9659786820411682, 0.005181530024856329, 0.9896721839904785, 0.9962543249130249, 0.9940459132194519, 0.9952369332313538, 0.9923298954963684, 0.12975378334522247, 0.027523528784513474, 0.8375016450881958, 0.10295805335044861, 0.37246590852737427, 0.030281780287623405, 0.07684002071619034, 0.06737696379423141, 0.10901441425085068, 0.061320606619119644, 0.10712180286645889, 0.049964938312768936, 0.022711336612701416, 0.05779507756233215, 0.03638949245214462, 0.002140558324754238, 0.006421675439924002, 0.8947533965110779, 0.004667229950428009, 0.03267060965299606, 0.06534121930599213, 0.8961081504821777, 0.9892314672470093, 0.031490132212638855, 0.024223176762461662, 0.030278971418738365, 0.7981536984443665, 0.027856653556227684, 0.029067812487483025, 0.05934678390622139, 0.07341299206018448, 0.09762366116046906, 0.31395769119262695, 0.13511115312576294, 0.0328015498816967, 0.0656030997633934, 0.0015619785990566015, 0.26475536823272705, 0.01640077494084835, 0.9914216995239258, 0.034174300730228424, 0.09113147109746933, 0.8543575406074524, 0.017087150365114212, 0.9908544421195984, 0.08194844424724579, 0.027316147461533546, 0.885043203830719, 0.9932873845100403, 0.9978309273719788, 0.9882381558418274, 0.008702544495463371, 0.0406118743121624, 0.205960214138031, 0.742617130279541, 0.9882000684738159, 0.00920791458338499, 0.05371283367276192, 0.8885637521743774, 0.010742567479610443, 0.029158396646380424, 0.007673262152820826, 0.02076912485063076, 0.9553797245025635, 0.023365264758467674, 0.023188669234514236, 0.04289903864264488, 0.03246413916349411, 0.4672516882419586, 0.2944961190223694, 0.060290541499853134, 0.027826404199004173, 0.05101507529616356, 0.8877236247062683, 0.03228085860610008, 0.07923483103513718, 0.00905559305101633, 0.9870597124099731, 0.01923224702477455, 0.004808061756193638, 0.9736324548721313, 0.0532064363360405, 0.9458922147750854, 0.995581865310669, 0.9951834678649902, 0.9988921284675598, 0.997951328754425, 0.9936944842338562, 0.0076955161057412624, 0.9907976984977722, 0.9962940216064453, 0.002000590320676565, 0.002000590320676565, 0.7685399651527405, 0.22875602543354034, 0.20653143525123596, 0.7855704426765442, 0.006759210489690304, 0.3475077152252197, 0.03489319235086441, 0.11749748140573502, 0.01709054224193096, 0.17589017748832703, 0.010681589134037495, 0.04486267641186714, 0.18585965037345886, 0.012817907147109509, 0.0534079484641552, 0.9960513710975647, 0.990628182888031, 0.04634471610188484, 0.0932580754160881, 0.14557358622550964, 0.2888725697994232, 0.09695428609848022, 0.09581699222326279, 0.07705164700746536, 0.09581699222326279, 0.038667984306812286, 0.021892903372645378, 0.06009669229388237, 0.06688179820775986, 0.13085569441318512, 0.44103217124938965, 0.25686487555503845, 0.043618567287921906, 0.006430213805288076, 0.9902529120445251, 0.9888448715209961, 0.995150625705719, 0.9919627904891968, 0.0993473008275032, 0.038047902286052704, 0.16318322718143463, 0.17163830995559692, 0.03382035717368126, 0.052421554923057556, 0.09258323162794113, 0.2443520873785019, 0.02536526881158352, 0.07905508577823639, 0.04936597868800163, 0.9424414038658142, 0.007479693740606308, 0.9953469634056091, 0.05895381048321724, 0.21876835823059082, 0.016336597502231598, 0.11222532391548157, 0.061794959008693695, 0.24717983603477478, 0.026280615478754044, 0.014205737970769405, 0.1129356175661087, 0.13069278001785278, 0.9944037795066833, 0.9967643618583679, 0.11974797397851944, 0.8787139654159546, 0.004850804340094328, 0.989564061164856, 0.08816681057214737, 0.9062727689743042, 0.004100781865417957, 0.012024378404021263, 0.012024378404021263, 0.07455115020275116, 0.009619503282010555, 0.7070334553718567, 0.007214627228677273, 0.17555592954158783, 0.08572408556938171, 0.08572408556938171, 0.027652930468320847, 0.033183515071868896, 0.7659861445426941, 0.9979050755500793, 0.033542755991220474, 0.8609307408332825, 0.10062827169895172, 0.009946880862116814, 0.9880568385124207, 0.9938191771507263, 0.9970912337303162, 0.38660070300102234, 0.25971636176109314, 0.015530113130807877, 0.02296474203467369, 0.06509430706501007, 0.10193701833486557, 0.014208401553332806, 0.05749446153640747, 0.06030309945344925, 0.016025755554437637, 0.07527867704629898, 0.056459005922079086, 0.1351594477891922, 0.0958092212677002, 0.06843516230583191, 0.03763933852314949, 0.05132636800408363, 0.049615491181612015, 0.42771974205970764, 0.1785009503364563, 0.322469025850296, 0.04134218022227287, 0.0369647741317749, 0.046692345291376114, 0.1381315290927887, 0.027723580598831177, 0.1177036240696907, 0.07538868486881256, 0.015077737160027027, 0.002935288939625025, 0.012719585560262203, 0.22797410190105438, 0.15263502299785614, 0.04305090382695198, 0.13306643068790436, 0.41485416889190674, 0.0117411557585001, 0.9925194382667542, 0.9940184950828552, 0.9845526218414307, 0.0067686294205486774, 0.9916041493415833, 0.9902545213699341, 0.021419459953904152, 0.8906925320625305, 0.08746279031038284, 0.013840502128005028, 0.2886733412742615, 0.6959795355796814, 0.9894405603408813, 0.0154515216127038, 0.035819437354803085, 0.02177259884774685, 0.016856204718351364, 0.013344496488571167, 0.23739156126976013, 0.013344496488571167, 0.6468569040298462, 0.37053295969963074, 0.6289973855018616, 0.997157096862793, 0.9916903972625732, 0.06309398263692856, 0.23159648478031158, 0.09142960608005524, 0.03778082877397537, 0.05516001209616661, 0.10049700736999512, 0.044959187507629395, 0.051759738475084305, 0.19872716069221497, 0.12505455315113068, 0.5734108686447144, 0.11946059763431549, 0.0902591198682785, 0.11680591851472855, 0.09291379898786545, 0.006636700127273798, 0.9915407299995422, 0.7820499539375305, 0.031643640249967575, 0.12431430071592331, 0.06102702021598816, 0.11312844604253769, 0.8551743626594543, 0.028761468827724457, 0.11257651448249817, 0.05992879346013069, 0.0016802465543150902, 0.18146662414073944, 0.20835056900978088, 0.053767889738082886, 0.1893077790737152, 0.044806573539972305, 0.05208764225244522, 0.09633413702249527, 0.98520827293396, 0.1578998863697052, 0.6178691387176514, 0.17963972687721252, 0.044623881578445435, 0.052307017147541046, 0.0018681077053770423, 0.08406484872102737, 0.32598480582237244, 0.04390053078532219, 0.4763674736022949, 0.014944861643016338, 0.021586883813142776, 0.05396721139550209, 0.11872786283493042, 0.8041114211082458, 0.08918504416942596, 0.9111337065696716, 0.992642879486084, 0.9945716857910156, 0.9977501630783081, 0.014667825773358345, 0.1222318783402443, 0.017927341163158417, 0.02770589292049408, 0.23631496727466583, 0.016297584399580956, 0.5655261278152466, 0.09712512791156769, 0.8602511286735535, 0.03700004890561104, 0.05592203140258789, 0.08879926800727844, 0.05991646274924278, 0.43631476163864136, 0.06944164633750916, 0.10846415907144547, 0.016899514943361282, 0.006145277991890907, 0.1428777128458023, 0.015363195911049843, 0.007691915612667799, 0.5176659226417542, 0.26498648524284363, 0.13422392308712006, 0.0703810304403305, 0.004999745171517134, 0.38162606954574585, 0.48754677176475525, 0.11059367656707764, 0.0077882870100438595, 0.01246125902980566, 0.9941399097442627, 0.9962308406829834, 0.05935389921069145, 0.02518044225871563, 0.235616996884346, 0.5917403697967529, 0.05215948820114136, 0.03417345881462097, 0.18873514235019684, 0.0022074286825954914, 0.04635600000619888, 0.04304485768079758, 0.18100914359092712, 0.020970571786165237, 0.5165383219718933, 0.05881161615252495, 0.10455398261547089, 0.2867973744869232, 0.06098982319235802, 0.0762372836470604, 0.007986762560904026, 0.014521386474370956, 0.29115381836891174, 0.07986762374639511, 0.019603872671723366, 0.14539267122745514, 0.03940030187368393, 0.20477059483528137, 0.01609308086335659, 0.001664801500737667, 0.07658086717128754, 0.000554933852981776, 0.4916713833808899, 0.02497202344238758, 0.9953871369361877, 0.9897565841674805, 0.997833251953125, 0.9885253310203552, 0.990960955619812, 0.04804592579603195, 0.3053353428840637, 0.12394455820322037, 0.12046296894550323, 0.09365473687648773, 0.06649834662675858, 0.07102441042661667, 0.0633649155497551, 0.0849507674574852, 0.022978484630584717, 0.9855167269706726, 0.9920024871826172, 0.9905186891555786, 0.9939175248146057, 0.07082290202379227, 0.9248637557029724, 0.05752488970756531, 0.2647901475429535, 0.1321755051612854, 0.1901395171880722, 0.040399160236120224, 0.1036326214671135, 0.04215564206242561, 0.0724550113081932, 0.07552886009216309, 0.02063870057463646, 0.08443162590265274, 0.36705005168914795, 0.031851451843976974, 0.05965827405452728, 0.059152692556381226, 0.11881096661090851, 0.05814153701066971, 0.08948741108179092, 0.10768824070692062, 0.022751037031412125, 0.022309089079499245, 0.9704453945159912, 0.9777593612670898, 0.988647997379303, 0.21923422813415527, 0.7778599262237549, 0.09414855390787125, 0.9040675163269043, 0.06514804810285568, 0.08344806730747223, 0.1372501105070114, 0.21703816950321198, 0.038064029067754745, 0.14420410990715027, 0.09625807404518127, 0.0366000272333622, 0.10870208591222763, 0.0732000544667244, 0.04354304447770119, 0.03197692334651947, 0.2496921420097351, 0.04966628551483154, 0.20206694304943085, 0.000680360069964081, 0.03197692334651947, 0.09865221381187439, 0.23336350917816162, 0.05851096659898758, 0.025808844715356827, 0.011731293052434921, 0.8540381193161011, 0.0023462586104869843, 0.08211904764175415, 0.02111632749438286, 0.9889754056930542, 0.06689330190420151, 0.09980905801057816, 0.13484841585159302, 0.13591021299362183, 0.0658315047621727, 0.006370791234076023, 0.024421365931630135, 0.06052251532673836, 0.3302193284034729, 0.07432589679956436, 0.9910752177238464, 0.9975854754447937, 0.9883419275283813, 0.04155004024505615, 0.9556509256362915, 0.14121027290821075, 0.8573481440544128, 0.9959388971328735, 0.3781931698322296, 0.09959732741117477, 0.006086503155529499, 0.07110141962766647, 0.044542137533426285, 0.15022596716880798, 0.05948173627257347, 0.11647354066371918, 0.014662939123809338, 0.059758394956588745, 0.9975150227546692, 0.18402892351150513, 0.0029210939537733793, 0.09347500652074814, 0.04965859651565552, 0.020447658374905586, 0.0788695365190506, 0.5696133375167847, 0.9938865900039673, 0.2841353714466095, 0.05682707577943802, 0.07019815593957901, 0.46798768639564514, 0.0969403088092804, 0.00501415366306901, 0.018385231494903564, 0.9947482943534851, 0.10640288889408112, 0.03546762838959694, 0.038195908069610596, 0.6002213954925537, 0.2209906131029129, 0.995053231716156, 0.9794116616249084, 0.009374712593853474, 0.007031034678220749, 0.20858736336231232, 0.35780155658721924, 0.003124904353171587, 0.019530652090907097, 0.3788946568965912, 0.015624521300196648, 0.9000885486602783, 0.09724575281143188, 0.9930782318115234, 0.9914439916610718, 0.09694426506757736, 0.31304919719696045, 0.07068853080272675, 0.23933115601539612, 0.27871477603912354, 0.9975038170814514, 0.992777407169342, 0.1509067863225937, 0.8492205142974854, 0.3419284224510193, 0.25229448080062866, 0.0018199783517047763, 0.046181950718164444, 0.0946388766169548, 0.0657467171549797, 0.055964332073926926, 0.040494516491889954, 0.06074177846312523, 0.04026702046394348, 0.009788775816559792, 0.09788775444030762, 0.029366327449679375, 0.8222571611404419, 0.039155103266239166, 0.9927554130554199, 0.01437199953943491, 0.12559878826141357, 0.22620278596878052, 0.058112870901823044, 0.07061026245355606, 0.017496347427368164, 0.07560921460390091, 0.015621739439666271, 0.3499269485473633, 0.047490086406469345, 0.11002861708402634, 0.20538675785064697, 0.07579749077558517, 0.03178604692220688, 0.5745939016342163, 0.32183465361595154, 0.6758527755737305, 0.04023195430636406, 0.04446689784526825, 0.029644599184393883, 0.09105126559734344, 0.5357202291488647, 0.1588103473186493, 0.09952115267515182, 0.21029803156852722, 0.7733006477355957, 0.001655890024267137, 0.013247120194137096, 0.9960846304893494, 0.9994639158248901, 0.9940467476844788, 0.9879651665687561, 0.3193744719028473, 0.6790438294410706, 0.17297442257404327, 0.014766109175980091, 0.8100265264511108, 0.07929543405771255, 0.004719966556876898, 0.9128414988517761, 0.001887986552901566, 0.9900220036506653, 0.009148814715445042, 0.04269447177648544, 0.2155054211616516, 0.07522358745336533, 0.4340604543685913, 0.14231489598751068, 0.0548928901553154, 0.0274464450776577, 0.12139325588941574, 0.029258888214826584, 0.5005137324333191, 0.1269960254430771, 0.03672924265265465, 0.023656122386455536, 0.06785571575164795, 0.041709478944540024, 0.00622529536485672, 0.045444656163454056, 0.9914926290512085, 0.9966533184051514, 0.9305997490882874, 0.06876352429389954, 0.9908766746520996, 0.035966336727142334, 0.9531079530715942, 0.9877041578292847, 0.9908069968223572, 0.11258410662412643, 0.8851439952850342, 0.9980053305625916, 0.995263397693634, 0.014253037050366402, 0.9834595918655396, 0.991935670375824, 0.9887183308601379, 0.02808547578752041, 0.954906165599823, 0.009361824952065945, 0.012288461439311504, 0.038913462311029434, 0.04300961643457413, 0.13312500715255737, 0.06553845852613449, 0.08806730806827545, 0.5345481038093567, 0.08192307502031326, 0.9892112612724304, 0.0012262746458873153, 0.5174878835678101, 0.32312336564064026, 0.04230647534132004, 0.052116669714450836, 0.005518235731869936, 0.03556196391582489, 0.004291960969567299, 0.017780981957912445, 0.05752670019865036, 0.857670783996582, 0.08367519825696945, 0.9361377358436584, 0.06112239509820938, 0.9920046329498291, 0.11347293853759766, 0.09019643813371658, 0.6204642057418823, 0.04364343732595444, 0.0065465159714221954, 0.01454781275242567, 0.038551703095436096, 0.06546515971422195, 0.007273906376212835, 0.0005374159081839025, 0.21496635675430298, 0.028483042493462563, 0.7529196739196777, 0.003224495565518737, 0.051434118300676346, 0.9429588317871094, 0.9488336443901062, 0.044476576149463654, 0.004941842053085566, 0.5825805068016052, 0.09321288019418716, 0.28962573409080505, 0.015535479411482811, 0.01886451058089733, 0.9942586421966553, 0.07540912181138992, 0.0951591283082962, 0.0071818213909864426, 0.025136373937129974, 0.515295684337616, 0.15800006687641144, 0.014363642781972885, 0.021545464172959328, 0.07361366599798203, 0.014363642781972885, 0.9839997291564941, 0.04444682598114014, 0.9259755611419678, 0.029631217941641808, 0.9803986549377441, 0.03679770976305008, 0.08715246617794037, 0.213039368391037, 0.02324065938591957, 0.07553213834762573, 0.5054843425750732, 0.013557050377130508, 0.04454459622502327, 0.016165364533662796, 0.010776909999549389, 0.9645334482192993, 0.25457146763801575, 0.056047629565000534, 0.09533335268497467, 0.08485715836286545, 0.07542858272790909, 0.0790952518582344, 0.19380955398082733, 0.029857147485017776, 0.056571438908576965, 0.07490477710962296, 0.9938823580741882, 0.27106085419654846, 0.05702020227909088, 0.04785112291574478, 0.04240698367357254, 0.06332394480705261, 0.31919851899147034, 0.004011471290141344, 0.12406907975673676, 0.01432668324559927, 0.056733667850494385, 0.08566708862781525, 0.05930798500776291, 0.02416251227259636, 0.7292685508728027, 0.026359103620052338, 0.013179551810026169, 0.008786368183791637, 0.0505216158926487, 0.991389274597168, 0.0069252182729542255, 0.14658378064632416, 0.027700873091816902, 0.14196696877479553, 0.19736872613430023, 0.0819484144449234, 0.29201337695121765, 0.10618668049573898, 0.9818829298019409, 0.9773091077804565, 0.9974721074104309, 0.991992175579071, 0.1665264517068863, 0.16190071403980255, 0.025441542267799377, 0.11217407137155533, 0.016190072521567345, 0.011564336717128754, 0.49957937002182007, 0.005782168358564377, 0.9955350160598755, 0.9916284680366516, 0.989132285118103, 0.9933214783668518, 0.9947446584701538, 0.9944844245910645, 0.23300251364707947, 0.11411284655332565, 0.01326893549412489, 0.058914076536893845, 0.11835891008377075, 0.13640466332435608, 0.058914076536893845, 0.05148347094655037, 0.14808131754398346, 0.06793694943189621, 0.9847082495689392, 0.053800374269485474, 0.8495976328849792, 0.01793345808982849, 0.056042056530714035, 0.022416822612285614, 0.0005919176619499922, 0.029595881700515747, 0.14857132732868195, 0.0017757529858499765, 0.8192140460014343, 0.0007286479230970144, 0.0888950452208519, 0.13552851974964142, 0.1741468608379364, 0.16175983846187592, 0.0029145916923880577, 0.11658366769552231, 0.3133186101913452, 0.0065578315407037735, 0.27614715695381165, 0.19480778276920319, 0.008133936673402786, 0.15861175954341888, 0.06629158556461334, 0.11224832385778427, 0.06303800642490387, 0.04026298597455025, 0.05571746826171875, 0.025215202942490578, 0.9920874834060669, 0.016400950029492378, 0.21936270594596863, 0.21833765506744385, 0.1189068928360939, 0.06970404088497162, 0.0061503564938902855, 0.09225534647703171, 0.25831496715545654, 0.9893152713775635, 0.010923835448920727, 0.024906344711780548, 0.25692862272262573, 0.41729050874710083, 0.03189760074019432, 0.09263412654399872, 0.11972523480653763, 0.02752806432545185, 0.017915090546011925, 0.9877343773841858, 0.9829915761947632, 0.9950519800186157, 0.011209438554942608, 0.25333330035209656, 0.13227137923240662, 0.017935100942850113, 0.05156341567635536, 0.5313273668289185, 0.9887501001358032, 0.11263987421989441, 0.2589215338230133, 0.01922387257218361, 0.10693278908729553, 0.12255217880010605, 0.14748314023017883, 0.10513054579496384, 0.0423525907099247, 0.07779660820960999, 0.006908578798174858, 0.9897759556770325, 0.9859561324119568, 0.9881446361541748, 0.13968577980995178, 0.12965309619903564, 0.05653029680252075, 0.1337047666311264, 0.14470212161540985, 0.09781863540410995, 0.11248178035020828, 0.04726935923099518, 0.06926408410072327, 0.06907114386558533, 0.010668043047189713, 0.06756427139043808, 0.8498874306678772, 0.021336086094379425, 0.04978420212864876, 0.9941994547843933, 0.018543830141425133, 0.0028528969269245863, 0.46074286103248596, 0.04136700555682182, 0.4750073254108429, 0.16668911278247833, 0.8296571969985962, 0.9947404861450195, 0.0642903670668602, 0.4736796021461487, 0.013301455415785313, 0.13375352323055267, 0.05172788351774216, 0.08128667622804642, 0.008128667250275612, 0.04951097443699837, 0.06133449077606201, 0.0635513961315155, 0.9842153787612915, 0.10245499759912491, 0.8282981514930725, 0.049062956124544144, 0.002886056201532483, 0.01587330922484398, 0.998214602470398, 0.9969621896743774, 0.9986305832862854, 0.9919179081916809, 0.038597408682107925, 0.9544086456298828, 0.0035088553559035063, 0.9932376742362976, 0.9932900071144104, 0.03596395254135132, 0.014651980251073837, 0.042623940855264664, 0.06393591314554214, 0.03329995647072792, 0.6793190836906433, 0.08391588926315308, 0.04528793692588806, 0.014020249247550964, 0.972070574760437, 0.009346832521259785, 0.9925262928009033, 0.00552379060536623, 0.9942823648452759, 0.9951925873756409, 0.04679282754659653, 0.8838645219802856, 0.0675896406173706, 0.712087094783783, 0.12702594697475433, 0.05285021290183067, 0.10662762075662613, 0.9875603914260864, 0.9902965426445007, 0.9930481314659119, 0.9881598949432373, 0.020773133262991905, 0.6825457811355591, 0.29379144310951233, 0.0029675904661417007, 0.9970453381538391, 0.003083824645727873, 0.05119149014353752, 0.5261004567146301, 0.3065321743488312, 0.0018502947641536593, 0.03638913109898567, 0.028371186926960945, 0.043173544108867645, 0.003083824645727873, 0.9957663416862488, 0.9857692122459412, 0.021711334586143494, 0.005427833646535873, 0.9458000063896179, 0.025782210752367973, 0.9875295758247375, 0.006672497373074293, 0.007349291816353798, 0.07349291443824768, 0.012861260212957859, 0.22231607139110565, 0.09554079174995422, 0.014698583632707596, 0.5750820636749268, 0.9970065355300903, 0.003268874017521739, 0.9880400896072388, 0.993407666683197, 0.9575022459030151, 0.039282143115997314, 0.9776107668876648, 0.013391928747296333, 0.17330676317214966, 0.11415580660104752, 0.09121408313512802, 0.1843630075454712, 0.10005908459424973, 0.14179643988609314, 0.06937798857688904, 0.04201376065611839, 0.052793607115745544, 0.030404694378376007, 0.08410553634166718, 0.021627137437462807, 0.07689648866653442, 0.06728442758321762, 0.7473377585411072, 0.33522024750709534, 0.6621634364128113, 0.0027590144891291857, 0.04096704348921776, 0.9597993493080139, 0.998680591583252, 0.01381960790604353, 0.31515446305274963, 0.6707565784454346, 0.05501968786120415, 0.14755280315876007, 0.010003579780459404, 0.005001789890229702, 0.782780110836029, 0.04238605871796608, 0.9506587982177734, 0.01251604687422514, 0.007822529412806034, 0.9778161644935608, 0.9944337606430054, 0.1177646666765213, 0.5513187050819397, 0.10501307994127274, 0.06225775554776192, 0.027003364637494087, 0.04050504416227341, 0.01575196161866188, 0.028503550216555595, 0.01575196161866188, 0.036004483699798584, 0.10179449617862701, 0.06227722391486168, 0.09354089200496674, 0.3176388442516327, 0.2118425965309143, 0.047520771622657776, 0.05627460032701492, 0.05527416244149208, 0.05027197673916817, 0.004001749213784933, 0.22780553996562958, 0.1664034128189087, 0.0973714292049408, 0.1500537246465683, 0.10609126091003418, 0.051228996366262436, 0.08029509335756302, 0.011989765800535679, 0.05340895429253578, 0.054862260818481445, 0.009545913897454739, 0.9880020618438721, 0.9944477081298828, 0.9948763847351074, 0.9953917860984802, 0.9885062575340271, 0.9815220236778259, 0.9882037043571472, 0.13010364770889282, 0.032213762402534485, 0.015482583083212376, 0.0389561764895916, 0.21625672280788422, 0.06367836892604828, 0.24472470581531525, 0.04095393046736717, 0.06792359054088593, 0.14983144402503967, 0.9868294596672058, 0.9907128214836121, 0.9910128712654114], \"Term\": [\"accept\", \"accept\", \"accept\", \"accept\", \"accept\", \"accept\", \"accept\", \"accept\", \"accept\", \"access\", \"access\", \"access\", \"access\", \"access\", \"access\", \"adaptec\", \"address\", \"address\", \"address\", \"address\", \"address\", \"address\", \"address\", \"address\", \"address\", \"address\", \"administr\", \"administr\", \"administr\", \"administr\", \"agenc\", \"agenc\", \"agenc\", \"agenc\", \"agenc\", \"aid\", \"aid\", \"aid\", \"aid\", \"alaska\", \"algorithm\", \"algorithm\", \"alomar\", \"amanda\", \"american\", \"american\", \"american\", \"american\", \"american\", \"american\", \"american\", \"american\", \"andrew\", \"andrew\", \"andrew\", \"andrew\", \"andrew\", \"andrew\", \"andrew\", \"andrew\", \"anonym\", \"anonym\", \"anti\", \"anti\", \"anti\", \"appl\", \"appl\", \"appl\", \"applic\", \"applic\", \"applic\", \"applic\", \"applic\", \"arab\", \"arab\", \"archiv\", \"archiv\", \"archiv\", \"archiv\", \"argic\", \"argument\", \"argument\", \"argument\", \"argument\", \"argument\", \"argument\", \"argument\", \"argument\", \"arm\", \"arm\", \"arm\", \"arm\", \"arm\", \"armenia\", \"armenian\", \"armi\", \"armi\", \"armi\", \"armi\", \"armori\", \"atheism\", \"atheist\", \"atho\", \"attack\", \"attack\", \"attack\", \"attack\", \"attack\", \"attack\", \"aurora\", \"author\", \"author\", \"author\", \"author\", \"author\", \"auto\", \"auto\", \"auto\", \"auto\", \"auto\", \"auto\", \"autom\", \"automot\", \"avail\", \"avail\", \"avail\", \"avail\", \"avail\", \"avail\", \"avail\", \"avail\", \"avail\", \"avail\", \"azerbaijan\", \"azerbaijani\", \"azeri\", \"baalk\", \"baerga\", \"ball\", \"ball\", \"ball\", \"bank\", \"bank\", \"bank\", \"bank\", \"bank\", \"bank\", \"bank\", \"bank\", \"bank\", \"basebal\", \"basebal\", \"bat\", \"batf\", \"batf\", \"batteri\", \"batteri\", \"belief\", \"belief\", \"believ\", \"believ\", \"believ\", \"believ\", \"believ\", \"believ\", \"believ\", \"believ\", \"believ\", \"believ\", \"berkeley\", \"berkeley\", \"berkeley\", \"berkeley\", \"best\", \"best\", \"best\", \"best\", \"best\", \"best\", \"best\", \"best\", \"best\", \"best\", \"better\", \"better\", \"better\", \"better\", \"better\", \"better\", \"better\", \"better\", \"better\", \"better\", \"bibl\", \"biblic\", \"bike\", \"bike\", \"billion\", \"billion\", \"binari\", \"binari\", \"bio\", \"blah\", \"blast\", \"board\", \"board\", \"board\", \"board\", \"board\", \"board\", \"board\", \"board\", \"boni\", \"bontchev\", \"book\", \"book\", \"book\", \"book\", \"book\", \"book\", \"book\", \"book\", \"boyl\", \"brake\", \"brake\", \"brave\", \"brave\", \"bruin\", \"build\", \"build\", \"build\", \"build\", \"build\", \"build\", \"build\", \"build\", \"build\", \"build\", \"buy\", \"buy\", \"buy\", \"buy\", \"buy\", \"byte\", \"byte\", \"byte\", \"cach\", \"cactus\", \"cadr\", \"callison\", \"canada\", \"canada\", \"canada\", \"canada\", \"canada\", \"canada\", \"canada\", \"canada\", \"canada\", \"cancer\", \"cancer\", \"candida\", \"canuck\", \"car\", \"car\", \"card\", \"card\", \"card\", \"card\", \"card\", \"carlo\", \"case\", \"case\", \"case\", \"case\", \"case\", \"case\", \"case\", \"case\", \"case\", \"case\", \"catbyt\", \"catcher\", \"cathol\", \"caus\", \"caus\", \"caus\", \"caus\", \"caus\", \"caus\", \"caus\", \"caus\", \"caus\", \"centerlin\", \"centri\", \"char\", \"chastiti\", \"children\", \"children\", \"children\", \"children\", \"children\", \"children\", \"chip\", \"chip\", \"chip\", \"chopin\", \"christ\", \"christ\", \"christian\", \"christian\", \"church\", \"church\", \"church\", \"cica\", \"cipher\", \"ciphertext\", \"circuit\", \"circuit\", \"circuit\", \"claim\", \"claim\", \"claim\", \"claim\", \"claim\", \"claim\", \"claim\", \"claim\", \"claim\", \"claim\", \"clarkson\", \"classifi\", \"classifi\", \"classifi\", \"classifi\", \"clayton\", \"cleveland\", \"cleveland\", \"cleveland\", \"client\", \"client\", \"clinic\", \"clinic\", \"clinton\", \"clinton\", \"clinton\", \"clinton\", \"clipper\", \"clipper\", \"coach\", \"coach\", \"code\", \"code\", \"code\", \"code\", \"code\", \"code\", \"color\", \"color\", \"color\", \"color\", \"color\", \"color\", \"colorado\", \"colorado\", \"colorado\", \"colorado\", \"colorado\", \"colorado\", \"colorado\", \"colorado\", \"columbia\", \"columbia\", \"columbia\", \"columbia\", \"columbia\", \"come\", \"come\", \"come\", \"come\", \"come\", \"come\", \"come\", \"come\", \"come\", \"come\", \"communic\", \"communic\", \"communic\", \"communic\", \"communic\", \"communic\", \"communic\", \"communic\", \"compil\", \"compil\", \"compil\", \"compil\", \"concordia\", \"config\", \"contradict\", \"contradict\", \"contradict\", \"contrib\", \"control\", \"control\", \"control\", \"control\", \"control\", \"control\", \"control\", \"control\", \"control\", \"copi\", \"copi\", \"copi\", \"copi\", \"copi\", \"copi\", \"copi\", \"copper\", \"cost\", \"cost\", \"cost\", \"cost\", \"cost\", \"cost\", \"cost\", \"cost\", \"counterst\", \"countri\", \"countri\", \"countri\", \"countri\", \"countri\", \"countri\", \"countri\", \"court\", \"court\", \"court\", \"court\", \"cramer\", \"crime\", \"crime\", \"crime\", \"crypt\", \"crypto\", \"cryptograph\", \"cryptographi\", \"ctrl\", \"cub\", \"cunixb\", \"cure\", \"cwru\", \"cwru\", \"data\", \"data\", \"data\", \"data\", \"data\", \"data\", \"data\", \"david\", \"david\", \"david\", \"david\", \"david\", \"david\", \"david\", \"david\", \"david\", \"david\", \"davidian\", \"dealer\", \"dealer\", \"dealer\", \"death\", \"death\", \"death\", \"death\", \"death\", \"death\", \"decrypt\", \"den\", \"desi\", \"design\", \"design\", \"design\", \"design\", \"design\", \"design\", \"design\", \"design\", \"design\", \"deskjet\", \"detroit\", \"devic\", \"devic\", \"devic\", \"devic\", \"diamond\", \"diet\", \"differ\", \"differ\", \"differ\", \"differ\", \"differ\", \"differ\", \"differ\", \"differ\", \"differ\", \"differ\", \"dillon\", \"directori\", \"directori\", \"directori\", \"diseas\", \"disk\", \"disk\", \"disk\", \"display\", \"display\", \"display\", \"display\", \"display\", \"display\", \"display\", \"distribut\", \"distribut\", \"distribut\", \"distribut\", \"distribut\", \"distribut\", \"distribut\", \"distribut\", \"distribut\", \"distribut\", \"divin\", \"divis\", \"divis\", \"divis\", \"divis\", \"divis\", \"divis\", \"divis\", \"divis\", \"divis\", \"dock\", \"doctor\", \"doctor\", \"doctor\", \"doctrin\", \"dodger\", \"drive\", \"drive\", \"drive\", \"drive\", \"drive\", \"drive\", \"drive\", \"drive\", \"driver\", \"driver\", \"driver\", \"driver\", \"driver\", \"dseg\", \"dseg\", \"dtmedin\", \"duke\", \"duke\", \"dyer\", \"earth\", \"earth\", \"earth\", \"earth\", \"earth\", \"earth\", \"edmonton\", \"effect\", \"effect\", \"effect\", \"effect\", \"effect\", \"effect\", \"effect\", \"effect\", \"effect\", \"effect\", \"einstein\", \"eisa\", \"email\", \"email\", \"email\", \"email\", \"email\", \"email\", \"email\", \"email\", \"encrypt\", \"enforc\", \"enforc\", \"enforc\", \"enforc\", \"enforc\", \"engin\", \"engin\", \"engin\", \"engin\", \"engin\", \"engin\", \"engin\", \"engin\", \"engin\", \"engin\", \"engr\", \"entri\", \"entri\", \"entri\", \"ericsson\", \"escrow\", \"esdi\", \"espn\", \"etern\", \"etern\", \"etern\", \"ether\", \"ethernet\", \"ethnic\", \"evid\", \"evid\", \"evid\", \"evid\", \"evid\", \"evid\", \"exist\", \"exist\", \"exist\", \"exist\", \"exist\", \"exist\", \"exist\", \"exist\", \"exist\", \"extermin\", \"faith\", \"faith\", \"fbihh\", \"feder\", \"feder\", \"feder\", \"feder\", \"file\", \"file\", \"file\", \"file\", \"final\", \"final\", \"final\", \"final\", \"final\", \"final\", \"final\", \"final\", \"final\", \"final\", \"firearm\", \"fischer\", \"flight\", \"flight\", \"flight\", \"flight\", \"floppi\", \"floppi\", \"flyer\", \"flyer\", \"fnal\", \"follow\", \"follow\", \"follow\", \"follow\", \"follow\", \"follow\", \"follow\", \"follow\", \"follow\", \"follow\", \"font\", \"font\", \"food\", \"food\", \"food\", \"food\", \"forc\", \"forc\", \"forc\", \"forc\", \"forc\", \"forc\", \"forc\", \"forc\", \"forc\", \"forc\", \"format\", \"format\", \"format\", \"format\", \"format\", \"freenet\", \"freenet\", \"freenet\", \"frost\", \"frost\", \"function\", \"function\", \"function\", \"function\", \"function\", \"function\", \"fund\", \"fund\", \"fund\", \"fund\", \"fund\", \"game\", \"game\", \"game\", \"game\", \"gatech\", \"gaza\", \"genet\", \"genet\", \"genocid\", \"go\", \"go\", \"go\", \"go\", \"go\", \"go\", \"go\", \"go\", \"go\", \"go\", \"goal\", \"goal\", \"goal\", \"goal\", \"goal\", \"goal\", \"god\", \"good\", \"good\", \"good\", \"good\", \"good\", \"good\", \"good\", \"good\", \"good\", \"good\", \"gordon\", \"gordon\", \"gospel\", \"govern\", \"govern\", \"govern\", \"govern\", \"gradi\", \"graphic\", \"graphic\", \"great\", \"great\", \"great\", \"great\", \"great\", \"great\", \"great\", \"great\", \"great\", \"great\", \"greec\", \"greec\", \"greek\", \"greek\", \"greenbelt\", \"grind\", \"grind\", \"grind\", \"grind\", \"grind\", \"grind\", \"grind\", \"group\", \"group\", \"group\", \"group\", \"group\", \"group\", \"group\", \"group\", \"group\", \"group\", \"gtoal\", \"gun\", \"gun\", \"halat\", \"hallam\", \"hamburg\", \"handbook\", \"handgun\", \"handgun\", \"handheld\", \"handheld\", \"handheld\", \"happen\", \"happen\", \"happen\", \"happen\", \"happen\", \"happen\", \"happen\", \"happen\", \"happen\", \"happen\", \"hard\", \"hard\", \"hard\", \"hard\", \"hard\", \"hard\", \"hard\", \"hard\", \"hard\", \"harley\", \"health\", \"health\", \"health\", \"health\", \"heaven\", \"heaven\", \"heaven\", \"heaven\", \"helmet\", \"helmet\", \"helmet\", \"help\", \"help\", \"help\", \"help\", \"help\", \"help\", \"help\", \"help\", \"help\", \"help\", \"henri\", \"henri\", \"higgin\", \"high\", \"high\", \"high\", \"high\", \"high\", \"high\", \"high\", \"high\", \"high\", \"high\", \"hit\", \"hit\", \"hit\", \"hit\", \"hit\", \"hitler\", \"hitter\", \"hockey\", \"holi\", \"holi\", \"home\", \"home\", \"home\", \"home\", \"home\", \"home\", \"home\", \"home\", \"home\", \"home\", \"homeopathi\", \"homicid\", \"honda\", \"hulman\", \"husc\", \"hydro\", \"iastat\", \"iastat\", \"ifa\", \"illinoi\", \"illinoi\", \"illinoi\", \"illinoi\", \"illinoi\", \"illinoi\", \"illinoi\", \"illinoi\", \"imag\", \"imag\", \"imag\", \"imag\", \"imag\", \"imak\", \"includ\", \"includ\", \"includ\", \"includ\", \"includ\", \"includ\", \"includ\", \"includ\", \"includ\", \"includ\", \"indiana\", \"indiana\", \"indiana\", \"indiana\", \"indiana\", \"indiana\", \"infect\", \"inform\", \"inform\", \"inform\", \"inform\", \"inform\", \"inform\", \"inform\", \"inform\", \"inform\", \"inform\", \"ingr\", \"ingr\", \"ingr\", \"inning\", \"instal\", \"instal\", \"instal\", \"instal\", \"instal\", \"insur\", \"insur\", \"insur\", \"insur\", \"intellect\", \"intercon\", \"internet\", \"internet\", \"internet\", \"internet\", \"internet\", \"internet\", \"internet\", \"internet\", \"invest\", \"invest\", \"iran\", \"islam\", \"islam\", \"isra\", \"israel\", \"israel\", \"israel\", \"jaeger\", \"jake\", \"jason\", \"jason\", \"jason\", \"jason\", \"jay\", \"jeff\", \"jeff\", \"jeff\", \"jeff\", \"jeff\", \"jeff\", \"jeff\", \"jesus\", \"jet\", \"jet\", \"jew\", \"jew\", \"jew\", \"job\", \"job\", \"job\", \"john\", \"john\", \"john\", \"john\", \"john\", \"john\", \"john\", \"john\", \"john\", \"john\", \"jumper\", \"jumper\", \"kaldi\", \"kelvin\", \"key\", \"key\", \"kill\", \"kill\", \"kill\", \"kill\", \"kill\", \"kill\", \"kill\", \"koresh\", \"lamp\", \"larc\", \"larc\", \"laughter\", \"launch\", \"launch\", \"laurentian\", \"leaf\", \"leagu\", \"leagu\", \"leav\", \"leav\", \"leav\", \"leav\", \"leav\", \"leav\", \"leav\", \"leav\", \"leav\", \"leav\", \"lebanes\", \"lemieux\", \"librari\", \"librari\", \"librari\", \"librari\", \"librari\", \"librari\", \"life\", \"life\", \"life\", \"life\", \"life\", \"life\", \"life\", \"life\", \"life\", \"life\", \"list\", \"list\", \"list\", \"list\", \"list\", \"list\", \"list\", \"list\", \"list\", \"list\", \"live\", \"live\", \"live\", \"live\", \"live\", \"live\", \"live\", \"live\", \"livesey\", \"long\", \"long\", \"long\", \"long\", \"long\", \"long\", \"long\", \"long\", \"long\", \"long\", \"look\", \"look\", \"look\", \"look\", \"look\", \"look\", \"look\", \"look\", \"look\", \"look\", \"lopez\", \"lord\", \"lord\", \"lose\", \"lose\", \"lose\", \"lose\", \"lose\", \"lose\", \"lose\", \"lose\", \"lose\", \"lose\", \"love\", \"love\", \"love\", \"love\", \"love\", \"love\", \"love\", \"love\", \"lunar\", \"lunar\", \"lyme\", \"machin\", \"machin\", \"machin\", \"machin\", \"machin\", \"machin\", \"machin\", \"machin\", \"magellan\", \"magnus\", \"mail\", \"mail\", \"mail\", \"mail\", \"mail\", \"mail\", \"mail\", \"mail\", \"map\", \"map\", \"mar\", \"mar\", \"marriag\", \"marriag\", \"massacr\", \"maxtor\", \"maynard\", \"mccall\", \"mcgill\", \"mcgill\", \"mcgill\", \"mean\", \"mean\", \"mean\", \"mean\", \"mean\", \"mean\", \"mean\", \"mean\", \"mean\", \"mean\", \"medic\", \"medic\", \"medic\", \"medic\", \"medic\", \"medicin\", \"medicin\", \"medicin\", \"medicin\", \"meg\", \"memori\", \"memori\", \"memori\", \"memori\", \"memori\", \"memori\", \"memori\", \"messag\", \"messag\", \"messag\", \"messag\", \"messag\", \"messag\", \"messag\", \"messag\", \"messag\", \"met\", \"metal\", \"metal\", \"metal\", \"metal\", \"methodolog\", \"midway\", \"midway\", \"midway\", \"migrain\", \"militia\", \"mime\", \"mission\", \"mission\", \"mission\", \"mission\", \"mksol\", \"mode\", \"mode\", \"mode\", \"mode\", \"mode\", \"mode\", \"modem\", \"modem\", \"modem\", \"money\", \"money\", \"money\", \"money\", \"money\", \"money\", \"money\", \"money\", \"monitor\", \"monitor\", \"monitor\", \"montreal\", \"montreal\", \"moon\", \"moon\", \"moon\", \"moral\", \"moral\", \"mormon\", \"motherboard\", \"motif\", \"motorcycl\", \"motto\", \"mous\", \"mous\", \"murder\", \"murder\", \"murder\", \"muslim\", \"muslim\", \"nasa\", \"nasa\", \"nasa\", \"nation\", \"nation\", \"nation\", \"nation\", \"nation\", \"nation\", \"nation\", \"nation\", \"nation\", \"nation\", \"nazi\", \"ncsl\", \"need\", \"need\", \"need\", \"need\", \"need\", \"need\", \"need\", \"need\", \"need\", \"need\", \"netcom\", \"netcom\", \"netcom\", \"netcom\", \"netcom\", \"netcom\", \"nist\", \"nist\", \"nore\", \"nsmca\", \"nubus\", \"number\", \"number\", \"number\", \"number\", \"number\", \"number\", \"number\", \"number\", \"number\", \"number\", \"ohio\", \"ohio\", \"ohio\", \"openwindow\", \"opinion\", \"opinion\", \"opinion\", \"opinion\", \"opinion\", \"opinion\", \"opinion\", \"opinion\", \"opinion\", \"opinion\", \"optilink\", \"oracl\", \"orbit\", \"orbit\", \"outlet\", \"outlet\", \"output\", \"output\", \"output\", \"owner\", \"owner\", \"owner\", \"owner\", \"owner\", \"owner\", \"owner\", \"pain\", \"pain\", \"pain\", \"pain\", \"pain\", \"palestinian\", \"patent\", \"patent\", \"patent\", \"patient\", \"patient\", \"pen\", \"penguin\", \"peopl\", \"peopl\", \"peopl\", \"peopl\", \"peopl\", \"peopl\", \"peopl\", \"peopl\", \"peopl\", \"peopl\", \"period\", \"period\", \"period\", \"period\", \"period\", \"period\", \"period\", \"period\", \"period\", \"person\", \"person\", \"person\", \"person\", \"person\", \"person\", \"person\", \"person\", \"person\", \"person\", \"phone\", \"phone\", \"phone\", \"phone\", \"phone\", \"phone\", \"phone\", \"phone\", \"photographi\", \"physician\", \"pistol\", \"pitch\", \"pitch\", \"pitcher\", \"pitt\", \"pitt\", \"pitt\", \"pittsburgh\", \"pittsburgh\", \"pittsburgh\", \"plaintext\", \"play\", \"play\", \"play\", \"play\", \"play\", \"play\", \"play\", \"play\", \"player\", \"player\", \"playoff\", \"plymouth\", \"point\", \"point\", \"point\", \"point\", \"point\", \"point\", \"point\", \"point\", \"point\", \"point\", \"polit\", \"polit\", \"polit\", \"polit\", \"polit\", \"polit\", \"polygon\", \"popul\", \"popul\", \"popul\", \"popul\", \"port\", \"port\", \"port\", \"power\", \"power\", \"power\", \"power\", \"power\", \"power\", \"power\", \"power\", \"power\", \"power\", \"powerbook\", \"presid\", \"presid\", \"presid\", \"presid\", \"price\", \"price\", \"price\", \"price\", \"price\", \"price\", \"price\", \"princeton\", \"princeton\", \"princeton\", \"princeton\", \"printer\", \"printer\", \"prism\", \"prison\", \"privaci\", \"privat\", \"privat\", \"privat\", \"privat\", \"privat\", \"privat\", \"privat\", \"probe\", \"probe\", \"probe\", \"problem\", \"problem\", \"problem\", \"problem\", \"problem\", \"problem\", \"problem\", \"problem\", \"problem\", \"problem\", \"program\", \"program\", \"program\", \"program\", \"program\", \"program\", \"project\", \"project\", \"project\", \"project\", \"project\", \"propheci\", \"prophet\", \"propos\", \"propos\", \"propos\", \"propos\", \"propos\", \"propos\", \"protect\", \"protect\", \"protect\", \"protect\", \"protect\", \"protect\", \"protect\", \"provid\", \"provid\", \"provid\", \"provid\", \"provid\", \"provid\", \"provid\", \"provid\", \"provid\", \"provid\", \"public\", \"public\", \"public\", \"public\", \"public\", \"public\", \"public\", \"public\", \"public\", \"puck\", \"pyron\", \"quadra\", \"qualcomm\", \"quebec\", \"question\", \"question\", \"question\", \"question\", \"question\", \"question\", \"question\", \"question\", \"question\", \"question\", \"quicktim\", \"raider\", \"ramsey\", \"ranck\", \"ranger\", \"ranger\", \"read\", \"read\", \"read\", \"read\", \"read\", \"read\", \"read\", \"read\", \"read\", \"read\", \"reason\", \"reason\", \"reason\", \"reason\", \"reason\", \"reason\", \"reason\", \"reason\", \"reason\", \"reason\", \"recipi\", \"recipi\", \"redesign\", \"reilli\", \"religi\", \"religi\", \"religion\", \"religion\", \"repli\", \"repli\", \"repli\", \"repli\", \"repli\", \"repli\", \"repli\", \"repli\", \"repli\", \"repli\", \"research\", \"research\", \"research\", \"research\", \"research\", \"research\", \"research\", \"research\", \"research\", \"research\", \"resourc\", \"resourc\", \"resourc\", \"resourc\", \"resourc\", \"resourc\", \"restaur\", \"result\", \"result\", \"result\", \"result\", \"result\", \"result\", \"result\", \"result\", \"result\", \"result\", \"resurrect\", \"revel\", \"revolv\", \"rid\", \"rid\", \"ride\", \"ride\", \"rider\", \"right\", \"right\", \"right\", \"right\", \"right\", \"right\", \"right\", \"right\", \"right\", \"right\", \"ripem\", \"risk\", \"risk\", \"risk\", \"risk\", \"risk\", \"risk\", \"risk\", \"rkba\", \"road\", \"road\", \"road\", \"road\", \"road\", \"road\", \"road\", \"robi\", \"rochest\", \"rochest\", \"rochest\", \"rochest\", \"rochest\", \"rocki\", \"rockwel\", \"run\", \"run\", \"run\", \"run\", \"run\", \"run\", \"run\", \"run\", \"rutger\", \"rutger\", \"rwing\", \"sabbath\", \"sale\", \"sale\", \"sale\", \"sale\", \"sale\", \"sandvik\", \"satan\", \"satellit\", \"satellit\", \"say\", \"say\", \"say\", \"say\", \"say\", \"say\", \"say\", \"say\", \"say\", \"say\", \"scheme\", \"scheme\", \"scheme\", \"scheme\", \"scheme\", \"schneider\", \"scienc\", \"scienc\", \"scienc\", \"scienc\", \"scienc\", \"scienc\", \"scienc\", \"scienc\", \"scienc\", \"scienc\", \"scientif\", \"scientif\", \"scientif\", \"scientif\", \"scientif\", \"score\", \"score\", \"scott\", \"scott\", \"scott\", \"scott\", \"scott\", \"scott\", \"scott\", \"screen\", \"screen\", \"screen\", \"screen\", \"scriptur\", \"scsi\", \"sdpa\", \"sdsu\", \"season\", \"season\", \"secret\", \"secret\", \"secret\", \"secur\", \"secur\", \"secur\", \"secur\", \"selann\", \"sell\", \"sell\", \"sell\", \"sell\", \"sell\", \"sell\", \"sell\", \"sell\", \"send\", \"send\", \"send\", \"send\", \"send\", \"send\", \"send\", \"send\", \"send\", \"send\", \"sera\", \"serdar\", \"server\", \"server\", \"shafer\", \"shaft\", \"shaft\", \"shark\", \"shotgun\", \"shuttl\", \"shuttl\", \"simm\", \"sin\", \"skeptic\", \"skeptic\", \"skndiv\", \"slaughter\", \"sleev\", \"sleev\", \"sleev\", \"smith\", \"smith\", \"smith\", \"smith\", \"smith\", \"smith\", \"smith\", \"smith\", \"smuggl\", \"softwar\", \"softwar\", \"softwar\", \"softwar\", \"softwar\", \"softwar\", \"softwar\", \"softwar\", \"softwar\", \"solar\", \"solar\", \"solar\", \"soldier\", \"soldier\", \"solntz\", \"sourc\", \"sourc\", \"sourc\", \"sourc\", \"sourc\", \"sourc\", \"sourc\", \"sourc\", \"sourc\", \"space\", \"space\", \"space\", \"space\", \"space\", \"spacecraft\", \"spacecraft\", \"spec\", \"spec\", \"spec\", \"speed\", \"speed\", \"speed\", \"speed\", \"speed\", \"spencer\", \"spend\", \"spend\", \"spend\", \"spend\", \"spend\", \"spend\", \"spend\", \"spend\", \"spend\", \"spend\", \"sphere\", \"spirit\", \"spirit\", \"spirit\", \"ssto\", \"stanford\", \"stanford\", \"stanford\", \"stanford\", \"stanford\", \"stanford\", \"stanford\", \"stanford\", \"stanley\", \"stanley\", \"stanley\", \"start\", \"start\", \"start\", \"start\", \"start\", \"start\", \"start\", \"start\", \"start\", \"start\", \"starter\", \"state\", \"state\", \"state\", \"state\", \"state\", \"state\", \"state\", \"state\", \"state\", \"state\", \"station\", \"station\", \"station\", \"station\", \"station\", \"station\", \"station\", \"station\", \"sternlight\", \"steve\", \"steve\", \"steve\", \"steve\", \"steve\", \"steve\", \"steve\", \"steve\", \"steveh\", \"stimulus\", \"stratus\", \"strnlght\", \"studi\", \"studi\", \"studi\", \"studi\", \"studi\", \"studi\", \"studi\", \"studi\", \"suno\", \"superstit\", \"surveil\", \"svga\", \"swap\", \"syndrom\", \"take\", \"take\", \"take\", \"take\", \"take\", \"take\", \"take\", \"take\", \"take\", \"take\", \"tampa\", \"teach\", \"teach\", \"teach\", \"teach\", \"teach\", \"team\", \"team\", \"team\", \"team\", \"team\", \"technolog\", \"technolog\", \"technolog\", \"technolog\", \"technolog\", \"technolog\", \"technolog\", \"technolog\", \"technolog\", \"tell\", \"tell\", \"tell\", \"tell\", \"tell\", \"tell\", \"tell\", \"tell\", \"tell\", \"tell\", \"tennesse\", \"test\", \"test\", \"test\", \"test\", \"test\", \"test\", \"test\", \"test\", \"testament\", \"thank\", \"thank\", \"thank\", \"thank\", \"thank\", \"thank\", \"thank\", \"thank\", \"thank\", \"theist\", \"theodor\", \"theolog\", \"theori\", \"theori\", \"theori\", \"theori\", \"theori\", \"theori\", \"therapi\", \"thing\", \"thing\", \"thing\", \"thing\", \"thing\", \"thing\", \"thing\", \"thing\", \"thing\", \"thing\", \"thomasp\", \"tiff\", \"tiger\", \"time\", \"time\", \"time\", \"time\", \"time\", \"time\", \"time\", \"time\", \"time\", \"time\", \"tire\", \"tire\", \"tire\", \"tire\", \"tire\", \"toolkit\", \"toronto\", \"toronto\", \"toronto\", \"toronto\", \"toronto\", \"treatment\", \"treatment\", \"troop\", \"true\", \"true\", \"true\", \"true\", \"true\", \"true\", \"true\", \"true\", \"true\", \"true\", \"trunk\", \"truth\", \"truth\", \"truth\", \"truth\", \"truth\", \"turk\", \"turkey\", \"turkish\", \"ualberta\", \"uchicago\", \"uchicago\", \"uchicago\", \"ucsc\", \"uicvm\", \"uiuc\", \"uiuc\", \"uiuc\", \"uiuc\", \"uiuc\", \"uiuc\", \"uiuc\", \"uiuc\", \"umich\", \"umich\", \"umich\", \"uoknor\", \"upgrad\", \"upgrad\", \"urartu\", \"urbana\", \"urbana\", \"urbana\", \"user\", \"user\", \"user\", \"user\", \"utah\", \"utkvm\", \"uvic\", \"veal\", \"vehicl\", \"vehicl\", \"vehicl\", \"vehicl\", \"vers\", \"version\", \"version\", \"version\", \"version\", \"version\", \"version\", \"version\", \"version\", \"version\", \"vesa\", \"vesselin\", \"video\", \"video\", \"video\", \"video\", \"villag\", \"villag\", \"virginia\", \"virginia\", \"virginia\", \"virginia\", \"virginia\", \"virginia\", \"virginia\", \"visual\", \"visual\", \"volt\", \"vram\", \"waco\", \"waco\", \"wagon\", \"wagon\", \"want\", \"want\", \"want\", \"want\", \"want\", \"want\", \"want\", \"want\", \"want\", \"want\", \"water\", \"water\", \"water\", \"water\", \"water\", \"weapon\", \"weapon\", \"weapon\", \"wheel\", \"wheel\", \"widget\", \"window\", \"window\", \"window\", \"wing\", \"wing\", \"wing\", \"wing\", \"wing\", \"winnipeg\", \"winnipeg\", \"wire\", \"wire\", \"wire\", \"wiretap\", \"word\", \"word\", \"word\", \"word\", \"word\", \"word\", \"word\", \"word\", \"word\", \"word\", \"work\", \"work\", \"work\", \"work\", \"work\", \"work\", \"work\", \"work\", \"work\", \"work\", \"world\", \"world\", \"world\", \"world\", \"world\", \"world\", \"world\", \"world\", \"world\", \"world\", \"worship\", \"worship\", \"xlib\", \"xpert\", \"xterm\", \"xview\", \"yamaha\", \"yanke\", \"year\", \"year\", \"year\", \"year\", \"year\", \"year\", \"year\", \"year\", \"year\", \"year\", \"yeast\", \"zoolog\", \"zuma\"]}, \"R\": 30, \"lambda.step\": 0.01, \"plot.opts\": {\"xlab\": \"PC1\", \"ylab\": \"PC2\"}, \"topic.order\": [3, 1, 8, 9, 2, 4, 7, 10, 5, 6]};\n", - "\n", - "function LDAvis_load_lib(url, callback){\n", - " var s = document.createElement('script');\n", - " s.src = url;\n", - " s.async = true;\n", - " s.onreadystatechange = s.onload = callback;\n", - " s.onerror = function(){console.warn(\"failed to load library \" + url);};\n", - " document.getElementsByTagName(\"head\")[0].appendChild(s);\n", - "}\n", - "\n", - "if(typeof(LDAvis) !== \"undefined\"){\n", - " // already loaded: just create the visualization\n", - " !function(LDAvis){\n", - " new LDAvis(\"#\" + \"ldavis_el155871124265505206097197808\", ldavis_el155871124265505206097197808_data);\n", - " }(LDAvis);\n", - "}else if(typeof define === \"function\" && define.amd){\n", - " // require.js is available: use it to load d3/LDAvis\n", - " require.config({paths: {d3: \"https://cdnjs.cloudflare.com/ajax/libs/d3/3.5.5/d3.min\"}});\n", - " require([\"d3\"], function(d3){\n", - " window.d3 = d3;\n", - " LDAvis_load_lib(\"https://cdn.rawgit.com/bmabey/pyLDAvis/files/ldavis.v1.0.0.js\", function(){\n", - " new LDAvis(\"#\" + \"ldavis_el155871124265505206097197808\", ldavis_el155871124265505206097197808_data);\n", - " });\n", - " });\n", - "}else{\n", - " // require.js not available: dynamically load d3 & LDAvis\n", - " LDAvis_load_lib(\"https://cdnjs.cloudflare.com/ajax/libs/d3/3.5.5/d3.min.js\", function(){\n", - " LDAvis_load_lib(\"https://cdn.rawgit.com/bmabey/pyLDAvis/files/ldavis.v1.0.0.js\", function(){\n", - " new LDAvis(\"#\" + \"ldavis_el155871124265505206097197808\", ldavis_el155871124265505206097197808_data);\n", - " })\n", - " });\n", - "}\n", - "</script>" - ], - "text/plain": [ - "<IPython.core.display.HTML object>" - ] - }, - "execution_count": 30, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "# Gensim\n", - "p = visualize_topics(model, bow_corpus, dictionary, model_type='gensim')\n", - "p" - ] - }, - { - "cell_type": "code", - "execution_count": 31, - "metadata": { - "collapsed": true - }, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "/Users/williamjaubert/anaconda2/envs/nautilus/lib/python3.7/site-packages/pyLDAvis/_prepare.py:223: RuntimeWarning: divide by zero encountered in log\n", - " kernel = (topic_given_term * np.log((topic_given_term.T / topic_proportion).T))\n", - "/Users/williamjaubert/anaconda2/envs/nautilus/lib/python3.7/site-packages/pyLDAvis/_prepare.py:240: RuntimeWarning: divide by zero encountered in log\n", - " log_lift = np.log(topic_term_dists / term_proportion)\n", - "/Users/williamjaubert/anaconda2/envs/nautilus/lib/python3.7/site-packages/pyLDAvis/_prepare.py:241: RuntimeWarning: divide by zero encountered in log\n", - " log_ttd = np.log(topic_term_dists)\n", - "/Users/williamjaubert/anaconda2/envs/nautilus/lib/python3.7/site-packages/pyLDAvis/_prepare.py:257: FutureWarning: Sorting because non-concatenation axis is not aligned. A future version\n", - "of pandas will change to not sort by default.\n", - "\n", - "To accept the future behavior, pass 'sort=False'.\n", - "\n", - "To retain the current behavior and silence the warning, pass 'sort=True'.\n", - "\n", - " return pd.concat([default_term_info] + list(topic_dfs))\n" - ] - }, - { - "data": { - "text/html": [ - "\n", - "<link rel=\"stylesheet\" type=\"text/css\" href=\"https://cdn.rawgit.com/bmabey/pyLDAvis/files/ldavis.v1.0.0.css\">\n", - "\n", - "\n", - "<div id=\"ldavis_el15587112430946968420164328\"></div>\n", - "<script type=\"text/javascript\">\n", - "\n", - "var ldavis_el15587112430946968420164328_data = {\"mdsDat\": {\"x\": [-0.11865444229892427, -0.15913644671148153, -0.1021552834840701, -0.1302147807267131, 0.025996119058630945, -0.02613484912760001, -0.04773338510733379, 0.20792709345760607, -0.03261899864327976, 0.38272497358316565], \"y\": [-0.14612969845944368, -0.07809283008476131, -0.21207201799419742, 0.20626190412239923, -0.16846330671503923, 0.13616430604087143, 0.058577567883906, -0.12443061559914777, 0.27343632979353877, 0.05474836101187306], \"topics\": [1, 2, 3, 4, 5, 6, 7, 8, 9, 10], \"cluster\": [1, 1, 1, 1, 1, 1, 1, 1, 1, 1], \"Freq\": [12.365908144728973, 12.10898411608011, 10.931706618523949, 10.925960423580584, 10.198631258133638, 10.029655051537938, 9.063929680129815, 8.785865295646344, 8.485634665680474, 7.103724745958186]}, \"tinfo\": {\"Category\": [\"Default\", \"Default\", \"Default\", \"Default\", \"Default\", \"Default\", \"Default\", \"Default\", \"Default\", \"Default\", \"Default\", \"Default\", \"Default\", \"Default\", \"Default\", \"Default\", \"Default\", \"Default\", \"Default\", \"Default\", \"Default\", \"Default\", \"Default\", \"Default\", \"Default\", \"Default\", \"Default\", \"Default\", \"Default\", \"Default\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\"], \"Freq\": [3333.0, 3298.0, 2707.0, 2823.0, 2140.0, 6405.0, 2581.0, 2822.0, 2058.0, 3159.0, 2052.0, 2604.0, 1636.0, 1640.0, 3593.0, 4267.0, 2355.0, 1604.0, 3488.0, 4034.0, 3489.0, 1446.0, 2179.0, 1501.0, 1476.0, 1456.0, 1929.0, 1778.0, 1780.0, 1776.0, 30.73757280319964, 76.8439320079991, 24.590058242559714, 113.72901937183867, 44.057187684586154, 106.5569190510921, 19.46712944202644, 22.540886722346404, 22.540886722346404, 37.90967312394623, 154.71244977610488, 53.27845952554605, 52.253873765439394, 643.4398573469792, 24.590058242559714, 33.81133008351961, 49.18011648511943, 18.442543681919783, 48.155530725012774, 29.712987043092987, 57.37680256597266, 233.60555330431728, 209.01549506175758, 16.393372161706477, 117.82736241226529, 23.565472482453057, 36.88508736383957, 21.51630096223975, 65.57348864682591, 25.614644002666367, 2052.245277493629, 1269.4617567721452, 918.0288410555626, 810.4473362443639, 806.3489932039372, 751.0213621581779, 653.6857149480458, 585.0384690208999, 570.6942683794067, 406.7605467623419, 343.23622963572933, 324.79368595380953, 303.2773849915698, 290.98235587028995, 286.88401282986337, 284.83484130964996, 282.78566978943667, 276.6381552287968, 261.26936882719696, 249.99892546602376, 241.8022393851705, 207.99090930165093, 196.7204659404777, 196.7204659404777, 194.6712944202644, 190.57295137983778, 187.4991940995178, 343.23622963572933, 472.3340354091678, 704.9150029533785, 510.24370853311405, 339.13788659530275, 831.9636372066037, 2147.5317531835485, 726.4313039156182, 1261.265070691292, 993.8481873034551, 1034.8316177077213, 978.4794009018553, 860.6520384895899, 578.8909544602599, 681.3495304709253, 1115.773892756147, 457.98983476767467, 454.9160774873547, 473.3586211692745, 1823.7626529898455, 595.2843266219664, 705.9395887134851, 674.1774301501788, 1108.6017924354005, 679.300358950712, 920.0780125757759, 944.6680708183357, 728.4804754358315, 741.8000903172181, 753.0705336783913, 757.1688767188178, 683.3987019911388, 21.298748448648094, 100.10411770864603, 92.6495557516192, 44.72737174216099, 41.532559474863774, 288.59804147918163, 38.33774720756657, 42.59749689729619, 42.59749689729619, 26.623435560810115, 27.68837298324252, 506.9102130778246, 48.987121431890614, 96.90930544134882, 25.558498138377708, 69.22093245810629, 85.19499379459238, 281.14347952215485, 48.987121431890614, 63.89624534594427, 97.97424286378123, 280.0785420997224, 25.558498138377708, 96.90930544134882, 57.50662081134985, 35.142934940269356, 129.92236553675335, 25.558498138377708, 21.298748448648094, 88.38980606188957, 1230.0027229094273, 956.3138053442993, 859.4044999029505, 700.7288239605223, 676.2352632445769, 668.7807012875501, 610.2091430537679, 597.4298939845789, 497.325776275933, 436.6243431972859, 420.6502818607998, 405.74115794674617, 453.6633419562044, 310.96172735026215, 291.79285374647884, 290.7279163240465, 282.2084169445872, 256.64991880620954, 460.0529664907988, 201.27317283972448, 201.27317283972448, 190.62379861540043, 185.2991115032384, 169.32505016675233, 157.6107385199959, 156.54580109756347, 669.8456387099825, 197.01342314999485, 481.3517149394469, 448.33865484404237, 604.8844559416058, 486.67640205160893, 569.7415210013365, 832.7810643421404, 925.4306200937597, 1674.08162806374, 593.1701442948493, 635.7676411921456, 521.8193369918782, 715.6379478745758, 439.8191554645831, 1838.0819911183303, 857.2746250580857, 889.2227477310578, 839.1706888767349, 1430.2109583267195, 806.1576287813302, 671.9755135548473, 701.7937613829547, 574.001270691066, 637.8975160370104, 546.3128977078236, 540.9882105956616, 540.9882105956616, 63.83413114755033, 59.43177727530548, 83.64472357265215, 31.917065573775165, 22.01176936122425, 33.01765404183637, 17.6094154889794, 39.62118485020365, 133.17120463540672, 23.112357829285465, 331.277128886425, 147.4788547202025, 241.02887450540555, 569.0042379876469, 45.12412719050971, 20.91118089316304, 19.810592425101824, 27.514711701530313, 30.816477105713954, 45.12412719050971, 97.95237365744792, 25.313534765407887, 34.11824250989759, 414.9218524590771, 23.112357829285465, 57.23060033918305, 227.821812888671, 177.1947433578552, 49.52648106275456, 20.91118089316304, 1476.9897241381473, 1127.0025912946817, 1495.6997280951878, 953.1096133410101, 923.3937247033573, 823.240174109787, 628.4360152629523, 576.7083572640754, 541.4895262861166, 425.9277371396892, 421.5253832674444, 418.22361786326076, 333.4783058225474, 330.17654041836374, 320.2712442058128, 301.5612402487722, 301.5612402487722, 292.7565325042825, 291.65594403622134, 258.63828999438493, 243.23005144152796, 216.81592820805886, 212.41357433581402, 204.70945505938553, 200.3071011871407, 282.85123629173165, 227.821812888671, 364.2947829282613, 569.0042379876469, 721.9860350481554, 468.8506873940765, 464.44833352183167, 321.37183267387405, 521.6789338610147, 392.91008309785286, 591.0160073488711, 516.1759915207086, 2094.4198547204874, 570.1048264557081, 766.009573770604, 942.1037286603978, 545.8918801583615, 507.37128377621895, 802.328993216624, 471.0518643301989, 505.1701068400966, 562.4007071792796, 468.8506873940765, 505.1701068400966, 464.44833352183167, 36.119975512464435, 169.97635535277382, 194.41045643473504, 22.309396640051563, 36.119975512464435, 26.55880552387091, 149.79166315463195, 371.82327733419277, 54.17996326869666, 80.73876879256757, 37.18232773341928, 268.7751119015736, 80.73876879256757, 591.730187071844, 86.05052989734175, 121.10815318885135, 315.51860962358637, 83.92582545543208, 27.621157744825744, 78.61406435065788, 99.86110876975462, 67.99054214110953, 39.30703217532894, 19.122339977187057, 224.1563186214705, 506.742009395457, 80.73876879256757, 49.93055438487731, 27.621157744825744, 32.93291884959993, 3333.6612693562765, 3298.603646064767, 1455.422542708126, 1117.594536444488, 939.1193633240754, 922.121727788798, 1068.7263342805654, 682.030125853005, 678.8430691901405, 659.7207292129534, 648.0348547824502, 571.5454948737021, 542.8619849079214, 538.612576024102, 500.3678960697279, 483.37026053445055, 353.76328957796056, 320.83037072836055, 293.2092129835349, 280.4609863320768, 275.1492252273026, 253.90218080820588, 234.77984083101884, 231.59278416815434, 229.46807972624467, 480.18320387158604, 370.7609251132379, 733.0230324588372, 335.7033018217283, 2319.1148983444077, 904.0617400325657, 1489.4178137786805, 705.4018747140115, 879.6276389506046, 1094.2227875834815, 791.4524046113531, 1100.5969009092105, 653.3466158872244, 499.3055438487731, 619.3513448166697, 846.6947201010047, 985.862861046088, 705.4018747140115, 797.8265179370821, 735.1477369007467, 721.3371580283339, 719.2124535864242, 646.9725025614954, 47.470209668913725, 21.097870963961658, 42.195741927923315, 47.470209668913725, 84.39148385584663, 780.6212256665813, 47.470209668913725, 94.94041933782745, 84.39148385584663, 21.097870963961658, 47.470209668913725, 70.67786772927154, 21.097870963961658, 41.140848379725234, 37.976167735130986, 29.53701934954632, 122.36765159097762, 65.40339998828114, 27.427232253150155, 55.90935805449839, 37.976167735130986, 22.15276451215974, 29.53701934954632, 23.207658060357822, 16.878296771169325, 69.62297418107347, 27.427232253150155, 23.207658060357822, 26.37233870495207, 60.12893224729073, 567.5327289305685, 350.2246580017635, 346.00508380897116, 344.9501902607731, 329.1267870378019, 301.6995547846517, 255.28423866393607, 236.29615479637056, 235.24126124817246, 232.0765806035782, 219.41785802520124, 177.22211609727793, 164.56339351890094, 159.28892577791052, 151.90467094052394, 128.6970128801661, 128.6970128801661, 128.6970128801661, 127.64211933196803, 333.3463612305942, 125.53233223557186, 123.4225451391757, 121.31275804277952, 200.42977415763573, 120.25786449458145, 109.70892901260062, 109.70892901260062, 106.54424836800638, 166.6731806152971, 996.8744030471884, 152.959564488722, 223.63743221799356, 373.43231606212134, 130.80679997656227, 357.6089128391501, 835.4756901728816, 728.9314418048752, 1091.8148223850158, 263.72338704952074, 529.5565611954376, 1969.4862544858206, 622.3871934368689, 1057.003335294479, 2073.920715757431, 608.6735773102938, 950.4590869264728, 486.3059257193162, 789.0603740521659, 1069.6620578728562, 2158.3121996132777, 626.6067676296612, 861.8480288778337, 340.7306160679808, 374.48720961031944, 662.473148268396, 646.6497450454248, 692.0101676179423, 1055.948441746281, 587.5757063463321, 597.0697482801149, 741.5901643832523, 546.434857966607, 418.7927386346389, 486.3059257193162, 585.4659192499361, 475.7569902373354, 21.71707338985634, 47.777561457683944, 42.348293110219856, 66.23707383906184, 82.52487888145409, 65.15122016956902, 28.23219540681324, 41.26243944072704, 55.37853714413366, 31.48975641529169, 24.97463439833479, 82.52487888145409, 60.807805491597755, 48.86341512717676, 32.57561008478451, 55.37853714413366, 62.97951283058338, 45.60585411869831, 32.57561008478451, 80.35317154246846, 55.37853714413366, 221.51414857653464, 115.1004889662386, 30.403902745798877, 18.459512381377888, 80.35317154246846, 27.146341737320423, 17.37365871188507, 39.09073210174141, 32.57561008478451, 859.996106238311, 527.7248833735091, 509.2653709921311, 609.1639085854703, 408.2809797292992, 336.61463754277327, 273.63512471218985, 234.54439261044845, 219.34244123754902, 300.7814664495103, 297.52390544103184, 193.28195316972142, 193.28195316972142, 163.96390409341538, 162.87805042392253, 160.70634308493692, 158.53463574595128, 157.44878207645846, 138.98926969508057, 129.2165866696452, 125.95902566116676, 124.87317199167396, 118.35804997471706, 116.18634263573142, 116.18634263573142, 112.92878162725296, 111.84292795776014, 103.15609860181762, 161.7921967544297, 158.53463574595128, 2288.979535290858, 272.54927104269706, 588.5326888651067, 1488.705380874652, 678.6585434330105, 1814.4614817224972, 533.1541517209731, 260.60488067827606, 639.5678113312691, 560.3004934582935, 921.8897653994015, 1044.5912300520897, 1266.1053786286245, 460.4019558649544, 992.4702539164346, 850.2234232128757, 643.9112260092405, 1258.504402942175, 606.9922012464847, 988.1268392384634, 790.5014713907707, 845.8800085349044, 920.8039117299088, 550.5278104328581, 412.6243944072705, 461.48780953444725, 901.2585456790381, 845.8800085349044, 538.5834200684372, 622.1941526193841, 679.7443971025034, 624.3658599583697, 575.502444831193, 576.5882985006857, 600.4770792295277, 28.132337894656857, 31.37837688250188, 119.02142955431746, 27.050324898708514, 97.38116963535066, 58.42870178121039, 140.66168947328427, 31.37837688250188, 40.034480850088606, 73.57688372448716, 58.42870178121039, 226.14071615320316, 42.19850684198528, 228.30474214509985, 119.02142955431746, 19.47623392707013, 91.97110465560894, 98.46318263129899, 34.624415870346894, 117.93941655836912, 126.59552052595585, 49.77259781362367, 27.050324898708514, 43.280519837933625, 51.93662380552035, 75.74090971638384, 59.51071477715873, 21.640259918966812, 51.93662380552035, 16.230194939225107, 1446.6513755829315, 611.3373427108124, 575.6309138445172, 393.85273052519597, 383.0326005657125, 378.7045485819192, 368.96643161838415, 310.53772983717374, 288.8974699182069, 287.8154569222586, 374.37649659812587, 281.32337894656854, 264.0111710113951, 262.9291580154467, 355.98227566700405, 352.736236679159, 255.3550670438084, 244.53493708432495, 234.7968201207899, 218.5666251815648, 218.5666251815648, 307.2916908493287, 203.41844323828803, 183.94220931121788, 181.77818331932122, 180.69617032337288, 178.5321443314762, 176.3681183395795, 1971.4276786178766, 205.5824692301847, 202.33643024233967, 378.7045485819192, 512.8741600795134, 401.42682149683435, 782.2953960706502, 537.7604589863253, 944.5973454629013, 518.2842250592552, 648.125784573056, 370.0484446143325, 710.8825383380597, 470.67565323752814, 346.244158703469, 824.4939029126356, 505.30006910787506, 556.1546799174471, 498.807991132185, 385.19662655760925, 473.9216922253732, 457.69149728614804, 599.4351997553807, 453.36344530235465, 464.1835752618381, 407.9188994725244, 378.7045485819192, 99.60646984815321, 81.59253381178507, 74.17503073798643, 49.803234924076605, 25.431439110166778, 72.05574414547253, 148.35006147597286, 50.862878220333556, 25.431439110166778, 25.431439110166778, 36.027872072736265, 37.087515368993216, 81.59253381178507, 145.171131587202, 50.862878220333556, 50.862878220333556, 50.862878220333556, 18.013936036368133, 103.84504303318101, 49.803234924076605, 265.9704673604942, 49.803234924076605, 25.431439110166778, 49.803234924076605, 344.38407128350843, 158.94649443854235, 18.013936036368133, 77.35396062675729, 37.087515368993216, 50.862878220333556, 2140.479458439037, 1640.3278226057573, 1604.2999505330208, 1075.5379457008032, 719.4977981584684, 703.6031487146142, 559.4916604236691, 552.0741573498705, 430.2151782803213, 484.2569863894258, 484.2569863894258, 385.7101598375295, 353.92086094982096, 285.0440466931193, 263.8511807679803, 259.61260758295253, 258.5529642866956, 241.5986715465844, 236.30045506529964, 234.18116847278574, 231.0022385840149, 227.82330869524404, 222.5250922139593, 222.5250922139593, 216.1672324364176, 211.9286592513898, 210.86901595513285, 203.45151288133422, 236.30045506529964, 338.0262115059667, 471.54126683434237, 322.1315620621125, 520.284858462162, 406.90302576266845, 565.8495202012108, 351.8015743573071, 334.8472816171959, 292.4615497669179, 340.14549809848063, 1896.761500299939, 452.4676875017172, 540.418081091044, 418.5591020214948, 539.358437794787, 477.89912661188407, 490.61484616696737, 404.78373917015455, 414.32052883646713, 432.3344648728352, 724.7960146397531, 619.8913283103152, 432.3344648728352, 570.0880933862386, 401.6048092813837, 43.839592660341296, 36.53299388361775, 34.445394233125306, 20.875996504924426, 156.5699737869332, 35.489194058371524, 17.744597029185762, 204.58476574825937, 69.93458829149682, 117.949380252823, 108.55518182560702, 22.96359615541687, 56.36519056329595, 75.15358741772793, 31.313994757386638, 39.66439335935641, 124.21217920430034, 73.0659877672355, 66.80318881575816, 79.32878671871282, 61.584189689527065, 27.138795456401756, 32.35779458263286, 25.051195805909312, 136.737777107255, 51.14619143706484, 40.708193184602635, 66.80318881575816, 45.92719231083374, 25.051195805909312, 2707.616746688698, 1636.678125986075, 1022.923828741297, 1186.8004013049535, 737.9664764490785, 591.8345009146075, 434.2207273024281, 427.95792835095074, 370.54893796240856, 367.4175384866699, 358.0233400594539, 330.8845446030522, 265.1251556125402, 257.81855683581665, 252.59955770958555, 246.33675875810826, 243.20535928236959, 242.16155945712336, 230.67976137941488, 216.0665638259678, 192.0591678453047, 186.84016871907363, 184.75256906858118, 177.44597029185763, 171.18317134038028, 169.09557168988783, 154.48237413644074, 236.94256033089226, 1090.7708173823014, 978.0404362557094, 233.8111608551536, 717.0904799441541, 887.2298514592882, 990.566034158664, 502.0677159434325, 904.9744484884739, 515.6371136716333, 678.4698864100438, 397.68773341881035, 596.0097002155924, 374.72413726339346, 1017.7048296150658, 678.4698864100438, 1194.1070000816771, 740.0540760995709, 443.6149257296441, 1695.1309161998636, 494.7611171667089, 1513.509746607021, 638.8054930506875, 516.6809134968795, 631.498894273964, 493.7173173414627, 661.7690892061044, 627.323694972979, 479.10411978801557, 485.3669187394929, 37.704209244169135, 45.03558326386869, 37.704209244169135, 30.37283522446958, 32.467513515812314, 23.041461204770027, 16.757426330741836, 39.79888753551187, 18.852104622084568, 20.9467829134273, 41.8935658268546, 33.51485266148367, 33.51485266148367, 60.74567044893916, 111.01794944116467, 30.37283522446958, 41.8935658268546, 50.272278992225516, 268.1188212918694, 45.03558326386869, 95.30786225609421, 60.74567044893916, 95.30786225609421, 19.899443767755933, 50.272278992225516, 18.852104622084568, 41.8935658268546, 46.08292240954005, 81.69245336236646, 45.03558326386869, 903.8536827143879, 782.3623418165096, 595.9359738870066, 574.9891909735793, 441.977119473316, 433.5984063079451, 423.1250148512314, 413.69896254018914, 384.37346646139093, 352.95329209125, 343.5272397802077, 1052.5758413997216, 298.491656516339, 294.30229993365356, 590.6992781586498, 278.59221274858305, 274.4028561658976, 259.7401081264985, 422.07767570556007, 342.47990063453636, 323.62779601245177, 214.7045248626298, 210.51516827994433, 208.4204899886016, 203.18379426024478, 201.08911596890206, 179.0949939098034, 177.0003156184607, 174.90563732711794, 2571.217602623201, 633.6401831311757, 501.6754507765838, 812.7351770409791, 788.6463766905377, 595.9359738870066, 447.2138152016728, 498.5334333395697, 1280.8957751560793, 488.06004188285607, 479.68132871748514, 1824.4647917595175, 516.3381988159829, 528.9062685640392, 808.5458204582937, 609.5513827807343, 658.7763226272886, 672.3917315210163, 861.9601168875333, 626.3088091114762, 807.4984813126224, 580.2258867019361, 527.8589294183679, 591.7466173043211, 460.82922409540055], \"Term\": [\"file\", \"window\", \"drive\", \"repli\", \"game\", \"peopl\", \"mail\", \"program\", \"space\", \"distribut\", \"christian\", \"believ\", \"card\", \"team\", \"state\", \"year\", \"inform\", \"play\", \"problem\", \"good\", \"thing\", \"nasa\", \"govern\", \"kill\", \"armenian\", \"imag\", \"control\", \"david\", \"version\", \"list\", \"lutheran\", \"okcforum\", \"goddess\", \"luke\", \"virtu\", \"geneva\", \"disobey\", \"communion\", \"crucifi\", \"denomin\", \"divin\", \"meaning\", \"passion\", \"atheist\", \"kinsey\", \"savior\", \"alink\", \"rapist\", \"ksand\", \"conscienc\", \"slaveri\", \"contradict\", \"worship\", \"attest\", \"notion\", \"clearer\", \"heresi\", \"hypothet\", \"infal\", \"kilroy\", \"christian\", \"jesus\", \"moral\", \"bibl\", \"religion\", \"church\", \"faith\", \"christ\", \"belief\", \"homosexu\", \"atheism\", \"evil\", \"koresh\", \"etern\", \"scriptur\", \"sandvik\", \"heaven\", \"cathol\", \"holi\", \"spirit\", \"assert\", \"arrog\", \"assumpt\", \"livesey\", \"biblic\", \"doctrin\", \"marriag\", \"lord\", \"teach\", \"truth\", \"absolut\", \"conclus\", \"evid\", \"believ\", \"argument\", \"exist\", \"claim\", \"word\", \"true\", \"life\", \"natur\", \"accept\", \"reason\", \"islam\", \"keith\", \"definit\", \"peopl\", \"love\", \"human\", \"understand\", \"question\", \"exampl\", \"point\", \"thing\", \"fact\", \"person\", \"differ\", \"read\", \"follow\", \"fiscal\", \"ban\", \"hallam\", \"federalist\", \"dscomsa\", \"regul\", \"secreci\", \"statut\", \"safeguard\", \"passer\", \"partnership\", \"firearm\", \"dorothi\", \"den\", \"bureaucrat\", \"pistol\", \"rwing\", \"agent\", \"myrto\", \"lethal\", \"deficit\", \"crypto\", \"stake\", \"utkvm\", \"tennesse\", \"tenn\", \"republican\", \"halv\", \"evas\", \"tobacco\", \"encrypt\", \"presid\", \"clipper\", \"clinton\", \"legal\", \"drug\", \"gun\", \"health\", \"feder\", \"enforc\", \"congress\", \"amend\", \"escrow\", \"illeg\", \"handgun\", \"job\", \"militia\", \"wiretap\", \"constitut\", \"liberti\", \"libertarian\", \"prohibit\", \"myer\", \"legisl\", \"hamburg\", \"homicid\", \"privat\", \"warrant\", \"insur\", \"agenc\", \"key\", \"court\", \"propos\", \"protect\", \"secur\", \"govern\", \"crime\", \"weapon\", \"administr\", \"hous\", \"secret\", \"state\", \"american\", \"chip\", \"public\", \"peopl\", \"case\", \"control\", \"work\", \"nation\", \"year\", \"consid\", \"issu\", \"provid\", \"disarm\", \"gover\", \"revolut\", \"revok\", \"mein\", \"regret\", \"neccessari\", \"perpetr\", \"gaza\", \"musicb\", \"soldier\", \"ottoman\", \"occupi\", \"muslim\", \"bosnian\", \"thrower\", \"memoir\", \"asham\", \"savag\", \"spanish\", \"baku\", \"mosqu\", \"turkiy\", \"turkey\", \"benevol\", \"depriv\", \"troop\", \"greec\", \"hussein\", \"tranquil\", \"armenian\", \"israel\", \"kill\", \"jew\", \"isra\", \"turkish\", \"arab\", \"murder\", \"greek\", \"armenia\", \"turk\", \"nazi\", \"german\", \"villag\", \"genocid\", \"palestinian\", \"civilian\", \"argic\", \"serdar\", \"bomb\", \"davidian\", \"massacr\", \"azerbaijani\", \"movement\", \"azerbaijan\", \"innoc\", \"territori\", \"armi\", \"jewish\", \"attack\", \"peac\", \"anti\", \"soviet\", \"land\", \"popul\", \"children\", \"histori\", \"peopl\", \"countri\", \"live\", \"world\", \"today\", \"forc\", \"state\", \"human\", \"govern\", \"year\", \"happen\", \"time\", \"fact\", \"photoshop\", \"polygon\", \"xlib\", \"spreadsheet\", \"debug\", \"workgroup\", \"pixmap\", \"bit\", \"callback\", \"dialog\", \"renam\", \"routin\", \"cview\", \"widget\", \"static\", \"viewer\", \"jpeg\", \"gray\", \"xcopyarea\", \"handler\", \"guidelin\", \"reilli\", \"resiz\", \"dutch\", \"patch\", \"librari\", \"melbourn\", \"preview\", \"jade\", \"nearest\", \"file\", \"window\", \"imag\", \"graphic\", \"server\", \"display\", \"applic\", \"screen\", \"output\", \"entri\", \"convert\", \"comp\", \"mous\", \"motif\", \"directori\", \"font\", \"client\", \"compress\", \"default\", \"microsoft\", \"xterm\", \"string\", \"postscript\", \"stream\", \"null\", \"resourc\", \"compil\", \"function\", \"visual\", \"program\", \"code\", \"version\", \"format\", \"color\", \"softwar\", \"manag\", \"avail\", \"packag\", \"section\", \"unix\", \"sourc\", \"includ\", \"user\", \"data\", \"chang\", \"support\", \"work\", \"problem\", \"grip\", \"unsaf\", \"impair\", \"cruiser\", \"coat\", \"bike\", \"fist\", \"muscl\", \"biker\", \"sweat\", \"moto\", \"leather\", \"sysop\", \"bacteria\", \"milk\", \"irrit\", \"hors\", \"piss\", \"dude\", \"carb\", \"dri\", \"grin\", \"cager\", \"windshield\", \"sunni\", \"hadn\", \"tender\", \"niel\", \"liner\", \"stroke\", \"food\", \"pull\", \"motorcycl\", \"pain\", \"ride\", \"drink\", \"rid\", \"wear\", \"rock\", \"rider\", \"accid\", \"truck\", \"weren\", \"eat\", \"gear\", \"candida\", \"tast\", \"steer\", \"flash\", \"wors\", \"revolv\", \"cloth\", \"dog\", \"helmet\", \"gonna\", \"infant\", \"engr\", \"inject\", \"complain\", \"turn\", \"glad\", \"hurt\", \"auto\", \"behanna\", \"couldn\", \"mayb\", \"rememb\", \"littl\", \"lock\", \"wouldn\", \"thing\", \"stop\", \"leav\", \"good\", \"friend\", \"happen\", \"face\", \"hand\", \"start\", \"time\", \"feel\", \"hear\", \"stupid\", \"wasn\", \"caus\", \"cours\", \"long\", \"peopl\", \"probabl\", \"live\", \"problem\", \"tri\", \"coupl\", \"make\", \"work\", \"talk\", \"mauric\", \"roth\", \"marvel\", \"dragon\", \"nore\", \"cryptolog\", \"calendar\", \"diagnosi\", \"bloom\", \"practition\", \"sage\", \"diagnos\", \"dose\", \"artist\", \"reproduct\", \"meyer\", \"protein\", \"frontier\", \"strain\", \"vitamin\", \"subscript\", \"aid\", \"subscrib\", \"bogus\", \"elementari\", \"telnet\", \"launchpad\", \"thai\", \"ieee\", \"bibliographi\", \"network\", \"technic\", \"medic\", \"newsgroup\", \"diseas\", \"patient\", \"medicin\", \"journal\", \"academ\", \"onlin\", \"random\", \"cancer\", \"ripem\", \"clinic\", \"infect\", \"signatur\", \"crypt\", \"santa\", \"symptom\", \"newslett\", \"physician\", \"literatur\", \"introduct\", \"cure\", \"yeast\", \"avenu\", \"syndrom\", \"abstract\", \"patent\", \"annual\", \"mail\", \"treatment\", \"anonym\", \"list\", \"contact\", \"inform\", \"berkeley\", \"topic\", \"request\", \"electron\", \"address\", \"messag\", \"send\", \"associ\", \"servic\", \"internet\", \"receiv\", \"group\", \"comput\", \"research\", \"email\", \"book\", \"public\", \"copi\", \"paper\", \"summari\", \"number\", \"includ\", \"institut\", \"general\", \"news\", \"avail\", \"interest\", \"access\", \"distribut\", \"vulcan\", \"aero\", \"temperatur\", \"talon\", \"toyota\", \"uokmax\", \"uoknor\", \"sunlight\", \"infin\", \"atlas\", \"altitud\", \"detector\", \"axi\", \"ford\", \"venus\", \"dens\", \"fluid\", \"pump\", \"krillean\", \"titan\", \"telescop\", \"porsch\", \"coventri\", \"ukan\", \"diagram\", \"greenbelt\", \"coloni\", \"keen\", \"torqu\", \"madam\", \"nasa\", \"orbit\", \"launch\", \"satellit\", \"moon\", \"rocket\", \"mission\", \"nuclear\", \"surfac\", \"cool\", \"digex\", \"shuttl\", \"lunar\", \"radar\", \"henri\", \"vehicl\", \"cramer\", \"alaska\", \"optilink\", \"probe\", \"brake\", \"flight\", \"solar\", \"honda\", \"spacecraft\", \"dseg\", \"spencer\", \"clayton\", \"space\", \"planet\", \"cycl\", \"mile\", \"water\", \"station\", \"cost\", \"project\", \"engin\", \"earth\", \"design\", \"car\", \"high\", \"model\", \"laboratori\", \"year\", \"center\", \"power\", \"technolog\", \"light\", \"research\", \"access\", \"time\", \"base\", \"work\", \"long\", \"small\", \"hulman\", \"kansa\", \"gibson\", \"hull\", \"richer\", \"gretzki\", \"finland\", \"wong\", \"trivia\", \"dalhousi\", \"kean\", \"koufax\", \"rooki\", \"penguin\", \"crux\", \"panther\", \"roster\", \"slump\", \"lindro\", \"daryl\", \"detroit\", \"bure\", \"burk\", \"marlin\", \"pitch\", \"career\", \"ouch\", \"jagr\", \"mogilni\", \"footbal\", \"game\", \"team\", \"play\", \"player\", \"season\", \"hockey\", \"leagu\", \"score\", \"roger\", \"chicago\", \"basebal\", \"boston\", \"playoff\", \"penalti\", \"leaf\", \"fan\", \"ranger\", \"montreal\", \"upenn\", \"brave\", \"clark\", \"loui\", \"jose\", \"devil\", \"flyer\", \"patrick\", \"minnesota\", \"philadelphia\", \"duke\", \"win\", \"trade\", \"buffalo\", \"goal\", \"blue\", \"divis\", \"gari\", \"wing\", \"offens\", \"sport\", \"year\", \"pick\", \"canada\", \"smith\", \"lose\", \"period\", \"toronto\", \"king\", \"columbia\", \"defens\", \"good\", \"point\", \"final\", \"time\", \"run\", \"apana\", \"init\", \"nctu\", \"intermitt\", \"centri\", \"pinout\", \"bottleneck\", \"jumper\", \"maxtor\", \"watt\", \"scanner\", \"clamp\", \"pentium\", \"powerpc\", \"bernoulli\", \"lemon\", \"svga\", \"mono\", \"uart\", \"esdi\", \"dock\", \"reinstal\", \"ribbon\", \"unplug\", \"vram\", \"seagat\", \"megabyt\", \"baud\", \"laptop\", \"appletalk\", \"drive\", \"card\", \"scsi\", \"driver\", \"video\", \"wire\", \"modem\", \"cabl\", \"simm\", \"upgrad\", \"floppi\", \"circuit\", \"motherboard\", \"boot\", \"batteri\", \"motorola\", \"audio\", \"bio\", \"quadra\", \"brand\", \"connector\", \"backup\", \"outlet\", \"turbo\", \"hook\", \"diamond\", \"voltag\", \"channel\", \"disk\", \"sale\", \"spec\", \"monitor\", \"appl\", \"price\", \"switch\", \"speed\", \"port\", \"instal\", \"printer\", \"board\", \"tape\", \"hard\", \"memori\", \"control\", \"sell\", \"ship\", \"problem\", \"buy\", \"work\", \"sound\", \"connect\", \"machin\", \"mode\", \"chip\", \"power\", \"devic\", \"softwar\", \"brandt\", \"franklin\", \"calstat\", \"bois\", \"hypocrisi\", \"mickey\", \"bmerh\", \"guitar\", \"bigboot\", \"chan\", \"worcest\", \"alexia\", \"robertson\", \"salmon\", \"tamu\", \"pwiseman\", \"teal\", \"rethink\", \"toni\", \"nodak\", \"covington\", \"bailey\", \"freeman\", \"decvax\", \"lynx\", \"wallac\", \"jacob\", \"bcstec\", \"amherst\", \"broward\", \"michael\", \"uiuc\", \"virginia\", \"cwru\", \"austin\", \"utexa\", \"univ\", \"freenet\", \"gordon\", \"andi\", \"illinoi\", \"netcom\", \"gatech\", \"magnus\", \"pitt\", \"uchicago\", \"udel\", \"craig\", \"chris\", \"purdu\", \"william\", \"portal\", \"umich\", \"ingr\", \"prism\", \"urbana\", \"mellon\", \"midway\", \"oracl\", \"repli\", \"ohio\", \"cleveland\", \"andrew\", \"robert\", \"anybodi\", \"texa\", \"bank\", \"david\", \"brian\", \"disclaim\", \"distribut\", \"newsread\", \"mike\", \"news\", \"mark\", \"opinion\", \"john\", \"world\", \"engin\", \"state\", \"hear\", \"scienc\", \"good\", \"phone\"], \"Total\": [3333.0, 3298.0, 2707.0, 2823.0, 2140.0, 6405.0, 2581.0, 2822.0, 2058.0, 3159.0, 2052.0, 2604.0, 1636.0, 1640.0, 3593.0, 4267.0, 2355.0, 1604.0, 3488.0, 4034.0, 3489.0, 1446.0, 2179.0, 1501.0, 1476.0, 1456.0, 1929.0, 1778.0, 1780.0, 1776.0, 30.73757280319964, 76.8439320079991, 24.590058242559714, 113.72901937183867, 44.057187684586154, 106.5569190510921, 19.46712944202644, 22.540886722346404, 22.540886722346404, 37.90967312394623, 154.71244977610488, 53.27845952554605, 52.253873765439394, 643.4398573469792, 24.590058242559714, 33.81133008351961, 49.18011648511943, 18.442543681919783, 48.155530725012774, 29.712987043092987, 57.37680256597266, 233.60555330431728, 209.01549506175758, 16.393372161706477, 117.82736241226529, 23.565472482453057, 36.88508736383957, 21.51630096223975, 65.57348864682591, 25.614644002666367, 2052.245277493629, 1269.4617567721452, 919.0837346037606, 810.4473362443639, 806.3489932039372, 751.0213621581779, 653.6857149480458, 585.0384690208999, 570.6942683794067, 406.7605467623419, 343.23622963572933, 324.79368595380953, 303.2773849915698, 290.98235587028995, 286.88401282986337, 284.83484130964996, 282.78566978943667, 276.6381552287968, 261.26936882719696, 249.99892546602376, 241.8022393851705, 207.99090930165093, 196.7204659404777, 196.7204659404777, 194.6712944202644, 190.57295137983778, 187.4991940995178, 345.3460167321255, 478.81819730483, 742.3350108674597, 531.4579065930175, 348.7223233971944, 917.8095377153783, 2604.38990740705, 857.3151988157011, 1698.5779777396451, 1336.5452315787422, 1446.0498292255654, 1436.3338076857774, 1282.6806697461197, 756.8970964091862, 1010.2050593413377, 2100.1148287454594, 568.0486815737959, 562.9046328794991, 603.1103634085084, 6405.389246929005, 901.1959011968837, 1243.2285268827459, 1144.1851549750884, 3032.568935890614, 1286.188060836125, 2775.479596718089, 3489.8450924448657, 1713.0002250791752, 2074.7512377785656, 2319.905422401006, 2438.9593472862075, 1928.4787576975737, 21.298748448648094, 100.10411770864603, 92.6495557516192, 44.72737174216099, 41.532559474863774, 288.59804147918163, 38.33774720756657, 42.59749689729619, 42.59749689729619, 26.623435560810115, 27.68837298324252, 506.9102130778246, 48.987121431890614, 96.90930544134882, 25.558498138377708, 69.22093245810629, 85.19499379459238, 281.14347952215485, 48.987121431890614, 63.89624534594427, 97.97424286378123, 280.0785420997224, 25.558498138377708, 96.90930544134882, 57.50662081134985, 35.142934940269356, 129.92236553675335, 25.558498138377708, 21.298748448648094, 88.38980606188957, 1230.0027229094273, 956.3138053442993, 859.4044999029505, 700.7288239605223, 676.2352632445769, 668.7807012875501, 610.2091430537679, 598.5157476540718, 497.325776275933, 436.6243431972859, 420.6502818607998, 405.74115794674617, 454.72569417715926, 310.96172735026215, 291.79285374647884, 290.7279163240465, 282.2084169445872, 256.64991880620954, 463.3547318949824, 201.27317283972448, 201.27317283972448, 190.62379861540043, 185.2991115032384, 169.32505016675233, 157.6107385199959, 156.54580109756347, 681.7900290744035, 198.11401161805605, 508.77894719259706, 475.3889797427509, 666.5008847569862, 526.2975869018126, 633.8774953160946, 970.1354923994461, 1102.4209275475444, 2179.2517349038367, 665.8089831868892, 724.9005723065354, 588.2844862609454, 908.240929785288, 494.8485788676437, 3593.617459713399, 1357.8539414854508, 1553.1635442761476, 1842.5187357112345, 6405.389246929005, 2241.690402455026, 1929.840172289862, 4324.247292719088, 1518.7620408754965, 4267.234766619799, 1461.202634943317, 1313.43385799009, 1458.6112633946598, 63.83413114755033, 59.43177727530548, 83.64472357265215, 31.917065573775165, 22.01176936122425, 33.01765404183637, 17.6094154889794, 39.62118485020365, 133.17120463540672, 23.112357829285465, 331.277128886425, 147.4788547202025, 241.02887450540555, 569.0042379876469, 45.12412719050971, 20.91118089316304, 19.810592425101824, 27.514711701530313, 30.816477105713954, 45.12412719050971, 97.95237365744792, 25.313534765407887, 34.11824250989759, 414.9218524590771, 23.112357829285465, 57.23060033918305, 227.821812888671, 177.1947433578552, 49.52648106275456, 20.91118089316304, 1476.9897241381473, 1127.0025912946817, 1501.128996442652, 953.1096133410101, 924.4533679996142, 823.240174109787, 628.4360152629523, 576.7083572640754, 541.4895262861166, 425.9277371396892, 421.5253832674444, 418.22361786326076, 333.4783058225474, 330.17654041836374, 320.2712442058128, 301.5612402487722, 301.5612402487722, 292.7565325042825, 291.65594403622134, 258.63828999438493, 243.23005144152796, 216.81592820805886, 212.41357433581402, 204.70945505938553, 200.3071011871407, 283.93708996122444, 228.87670643686909, 383.41712290544837, 653.0202703163926, 877.2631097856282, 536.4733475611157, 549.141133604708, 352.7502095563759, 680.7348442654207, 465.32582782325636, 844.7676374111895, 696.0003455451144, 6405.389246929005, 949.2225488416441, 1718.6105808077282, 2932.839803794655, 1039.0456410127792, 971.3865951661048, 3593.617459713399, 1243.2285268827459, 2179.2517349038367, 4267.234766619799, 1523.673641718925, 5506.151083820371, 1713.0002250791752, 36.119975512464435, 169.97635535277382, 194.41045643473504, 22.309396640051563, 36.119975512464435, 26.55880552387091, 149.79166315463195, 371.82327733419277, 54.17996326869666, 80.73876879256757, 37.18232773341928, 268.7751119015736, 80.73876879256757, 591.730187071844, 86.05052989734175, 121.10815318885135, 315.51860962358637, 83.92582545543208, 27.621157744825744, 78.61406435065788, 99.86110876975462, 67.99054214110953, 39.30703217532894, 19.122339977187057, 224.1563186214705, 506.742009395457, 80.73876879256757, 49.93055438487731, 27.621157744825744, 32.93291884959993, 3333.6612693562765, 3298.603646064767, 1456.482186004383, 1117.594536444488, 939.1193633240754, 922.121727788798, 1070.8903602724622, 682.030125853005, 678.8430691901405, 659.7207292129534, 648.0348547824502, 571.5454948737021, 542.8619849079214, 538.612576024102, 500.3678960697279, 483.37026053445055, 353.76328957796056, 320.83037072836055, 293.2092129835349, 280.4609863320768, 275.1492252273026, 253.90218080820588, 234.77984083101884, 231.59278416815434, 229.46807972624467, 485.59326885132776, 374.0184861217163, 752.5683985097079, 338.83470129746695, 2822.8348709995626, 1019.0749816552654, 1780.6379650223762, 792.0372602094478, 1036.1976127375378, 1725.094098035012, 1109.5931194572736, 1831.4565031108204, 863.1392881064081, 588.5866260513828, 826.7688106912883, 1385.2945072293742, 2326.9662064128906, 1191.8643186467934, 1728.463843595695, 1627.2683042354015, 1928.2834887179179, 4324.247292719088, 3488.441597101946, 47.470209668913725, 21.097870963961658, 42.195741927923315, 47.470209668913725, 84.39148385584663, 780.6212256665813, 47.470209668913725, 94.94041933782745, 84.39148385584663, 21.097870963961658, 47.470209668913725, 70.67786772927154, 21.097870963961658, 41.140848379725234, 37.976167735130986, 29.53701934954632, 122.36765159097762, 65.40339998828114, 27.427232253150155, 55.90935805449839, 37.976167735130986, 22.15276451215974, 29.53701934954632, 23.207658060357822, 16.878296771169325, 69.62297418107347, 27.427232253150155, 23.207658060357822, 26.37233870495207, 60.12893224729073, 567.5327289305685, 350.2246580017635, 346.00508380897116, 344.9501902607731, 329.1267870378019, 301.6995547846517, 255.28423866393607, 236.29615479637056, 235.24126124817246, 232.0765806035782, 219.41785802520124, 177.22211609727793, 164.56339351890094, 159.28892577791052, 151.90467094052394, 128.6970128801661, 128.6970128801661, 128.6970128801661, 127.64211933196803, 336.64812663477784, 125.53233223557186, 123.4225451391757, 121.31275804277952, 201.45435991774238, 120.25786449458145, 109.70892901260062, 109.70892901260062, 106.54424836800638, 167.69776637540375, 1089.2534655878528, 155.0847387168899, 232.11457858804914, 405.3804387350935, 131.8505998018085, 411.5377477741495, 1081.60047444983, 959.4833310511415, 1555.8412809897586, 301.9680670038949, 701.1989293280624, 3489.8450924448657, 876.1881390534364, 1697.7377027681318, 4034.6354575432615, 862.6662341871505, 1523.673641718925, 653.8797151810995, 1224.2482962279903, 2023.7971917834916, 5506.151083820371, 1036.3234895475994, 1696.1610900280411, 419.5359853279788, 488.92868560606996, 1254.6115846185987, 1456.222590646128, 1734.447294251175, 6405.389246929005, 1562.2626428604092, 1718.6105808077282, 3488.441597101946, 1737.5846886580687, 676.0173373577165, 1509.9466570910924, 4324.247292719088, 1508.9227073731317, 21.71707338985634, 47.777561457683944, 42.348293110219856, 66.23707383906184, 82.52487888145409, 65.15122016956902, 28.23219540681324, 41.26243944072704, 55.37853714413366, 31.48975641529169, 24.97463439833479, 82.52487888145409, 60.807805491597755, 48.86341512717676, 32.57561008478451, 55.37853714413366, 62.97951283058338, 45.60585411869831, 32.57561008478451, 80.35317154246846, 55.37853714413366, 221.51414857653464, 115.1004889662386, 30.403902745798877, 18.459512381377888, 80.35317154246846, 27.146341737320423, 17.37365871188507, 39.09073210174141, 32.57561008478451, 859.996106238311, 527.7248833735091, 509.2653709921311, 611.2886130273799, 408.2809797292992, 336.61463754277327, 273.63512471218985, 234.54439261044845, 219.34244123754902, 301.83635999770837, 298.5862576619867, 193.28195316972142, 193.28195316972142, 163.96390409341538, 162.87805042392253, 160.70634308493692, 158.53463574595128, 157.44878207645846, 138.98926969508057, 129.2165866696452, 125.95902566116676, 124.87317199167396, 118.35804997471706, 116.18634263573142, 116.18634263573142, 112.92878162725296, 111.84292795776014, 103.15609860181762, 162.8571341768621, 159.5784355711975, 2581.187156933169, 285.68032995147706, 654.4011117657841, 1776.3353173096586, 793.100019428761, 2355.472793545131, 613.6747380859157, 281.09659588040915, 776.611247834443, 669.8994751091468, 1182.913021027245, 1367.1037737907961, 1788.147677360813, 550.3960589801403, 1360.0213944348313, 1212.1859776314022, 868.3217502074203, 2014.6830812459746, 815.3342822590118, 1566.3004250978336, 1235.2517250887604, 1442.0485218793074, 1842.5187357112345, 871.3326168026074, 540.7423384562501, 675.7538254495776, 2500.5639745050385, 2326.9662064128906, 995.6046999341991, 1464.7040701507697, 1904.569687666642, 1831.4565031108204, 1500.0196733260323, 1574.4627903106643, 3159.1899532713824, 28.132337894656857, 31.37837688250188, 119.02142955431746, 27.050324898708514, 97.38116963535066, 58.42870178121039, 140.66168947328427, 31.37837688250188, 40.034480850088606, 73.57688372448716, 58.42870178121039, 226.14071615320316, 42.19850684198528, 228.30474214509985, 119.02142955431746, 19.47623392707013, 91.97110465560894, 98.46318263129899, 34.624415870346894, 117.93941655836912, 126.59552052595585, 49.77259781362367, 27.050324898708514, 43.280519837933625, 51.93662380552035, 75.74090971638384, 59.51071477715873, 21.640259918966812, 51.93662380552035, 16.230194939225107, 1446.6513755829315, 611.3373427108124, 575.6309138445172, 393.85273052519597, 383.0326005657125, 378.7045485819192, 368.96643161838415, 310.53772983717374, 288.8974699182069, 287.8154569222586, 375.4238357437972, 281.32337894656854, 264.0111710113951, 262.9291580154467, 357.0828641350653, 353.8011741015914, 255.3550670438084, 244.53493708432495, 234.7968201207899, 218.5666251815648, 218.5666251815648, 308.3775445188215, 203.41844323828803, 183.94220931121788, 181.77818331932122, 180.69617032337288, 178.5321443314762, 176.3681183395795, 2058.540560736173, 206.6474066526171, 203.3987824632945, 400.71631794314345, 561.2240499662522, 472.96507192081316, 1088.4085561021532, 716.9454395220519, 1570.9061545743775, 700.6604903582397, 1084.308126178449, 511.40418007287553, 1598.585672241449, 809.9194175071311, 466.7739160171717, 4267.234766619799, 1389.9895912997056, 1953.8735197924184, 1470.9937055319926, 761.7936232643249, 1566.3004250978336, 1574.4627903106643, 5506.151083820371, 1628.7443907994555, 4324.247292719088, 1734.447294251175, 871.6729157537652, 99.60646984815321, 81.59253381178507, 74.17503073798643, 49.803234924076605, 25.431439110166778, 72.05574414547253, 148.35006147597286, 50.862878220333556, 25.431439110166778, 25.431439110166778, 36.027872072736265, 37.087515368993216, 81.59253381178507, 145.171131587202, 50.862878220333556, 50.862878220333556, 50.862878220333556, 18.013936036368133, 103.84504303318101, 49.803234924076605, 265.9704673604942, 49.803234924076605, 25.431439110166778, 49.803234924076605, 344.38407128350843, 158.94649443854235, 18.013936036368133, 77.35396062675729, 37.087515368993216, 50.862878220333556, 2140.479458439037, 1640.3278226057573, 1604.2999505330208, 1075.5379457008032, 719.4977981584684, 703.6031487146142, 559.4916604236691, 552.0741573498705, 430.2151782803213, 485.3219238118582, 485.3389993853741, 385.7101598375295, 353.92086094982096, 285.0440466931193, 263.8511807679803, 259.61260758295253, 258.5529642866956, 241.5986715465844, 236.30045506529964, 234.18116847278574, 231.0022385840149, 227.82330869524404, 222.5250922139593, 222.5250922139593, 216.1672324364176, 211.9286592513898, 210.86901595513285, 203.45151288133422, 239.60222046948329, 356.08619926219893, 524.7881379559626, 345.69703454456555, 615.378339098852, 460.844311503149, 690.3653248152091, 387.5080032236024, 372.977793084968, 313.760298215566, 384.4510271228001, 4267.234766619799, 578.000019737289, 772.3095195353021, 537.3491720297644, 845.5142246102212, 695.6077443447949, 755.7080301743108, 563.7657261503513, 607.1235050511148, 704.9584450155307, 4034.6354575432615, 2775.479596718089, 868.1125594647388, 5506.151083820371, 1351.0734876601898, 43.839592660341296, 36.53299388361775, 34.445394233125306, 20.875996504924426, 156.5699737869332, 35.489194058371524, 17.744597029185762, 204.58476574825937, 69.93458829149682, 117.949380252823, 108.55518182560702, 22.96359615541687, 56.36519056329595, 75.15358741772793, 31.313994757386638, 39.66439335935641, 124.21217920430034, 73.0659877672355, 66.80318881575816, 79.32878671871282, 61.584189689527065, 27.138795456401756, 32.35779458263286, 25.051195805909312, 136.737777107255, 51.14619143706484, 40.708193184602635, 66.80318881575816, 45.92719231083374, 25.051195805909312, 2707.616746688698, 1636.678125986075, 1022.923828741297, 1189.987457967818, 737.9664764490785, 591.8345009146075, 434.2207273024281, 427.95792835095074, 370.54893796240856, 367.4175384866699, 358.0233400594539, 330.8845446030522, 265.1251556125402, 257.81855683581665, 252.59955770958555, 246.33675875810826, 243.20535928236959, 242.16155945712336, 230.67976137941488, 216.0665638259678, 192.0591678453047, 186.84016871907363, 184.75256906858118, 177.44597029185763, 171.18317134038028, 169.09557168988783, 154.48237413644074, 238.00749775332466, 1113.080214022353, 1003.0150706540443, 234.87351307610842, 740.9792606729961, 934.8468690980148, 1076.121658732719, 526.5018170253937, 1016.3871132208759, 556.006498067917, 766.6686221978332, 425.3088911636361, 736.1222623202239, 419.3429305434966, 1473.4562177179278, 903.6641769301882, 1929.840172289862, 1037.3664188451737, 530.6288336016676, 3488.441597101946, 630.8423848842616, 4324.247292719088, 1019.6588406886142, 722.5935860753691, 1165.1944467816918, 690.2524782181074, 1553.1635442761476, 1953.8735197924184, 781.5463477588185, 1725.094098035012, 37.704209244169135, 45.03558326386869, 37.704209244169135, 30.37283522446958, 32.467513515812314, 23.041461204770027, 16.757426330741836, 39.79888753551187, 18.852104622084568, 20.9467829134273, 41.8935658268546, 33.51485266148367, 33.51485266148367, 60.74567044893916, 111.01794944116467, 30.37283522446958, 41.8935658268546, 50.272278992225516, 268.1188212918694, 45.03558326386869, 95.30786225609421, 60.74567044893916, 95.30786225609421, 19.899443767755933, 50.272278992225516, 18.852104622084568, 41.8935658268546, 46.08292240954005, 81.69245336236646, 45.03558326386869, 903.8536827143879, 782.3623418165096, 595.9359738870066, 574.9891909735793, 441.977119473316, 433.5984063079451, 423.1250148512314, 413.69896254018914, 384.37346646139093, 352.95329209125, 343.5272397802077, 1065.6208202322039, 298.491656516339, 294.30229993365356, 594.9378513436776, 278.59221274858305, 274.4028561658976, 259.7401081264985, 424.20238014746974, 343.53479418273446, 324.71364968194456, 214.7045248626298, 210.51516827994433, 208.4204899886016, 203.18379426024478, 201.08911596890206, 179.0949939098034, 177.0003156184607, 174.90563732711794, 2823.5896720591827, 665.5107497598208, 521.8086734054658, 876.3137748163961, 867.0861909867879, 666.2218437675454, 495.866186848646, 568.3247825277369, 1778.093904298847, 560.1157860283286, 549.5393556014075, 3159.1899532713824, 629.0685799425747, 807.5924554796169, 1904.569687666642, 1239.3680671911266, 1493.5003965369874, 1568.2191563616898, 2932.839803794655, 1570.9061545743775, 3593.617459713399, 1696.1610900280411, 1696.1466678949637, 4034.6354575432615, 1128.3302673231115], \"loglift\": [30.0, 29.0, 28.0, 27.0, 26.0, 25.0, 24.0, 23.0, 22.0, 21.0, 20.0, 19.0, 18.0, 17.0, 16.0, 15.0, 14.0, 13.0, 12.0, 11.0, 10.0, 9.0, 8.0, 7.0, 6.0, 5.0, 4.0, 3.0, 2.0, 1.0, 2.0902, 2.0902, 2.0902, 2.0902, 2.0902, 2.0902, 2.0902, 2.0902, 2.0902, 2.0902, 2.0902, 2.0902, 2.0902, 2.0902, 2.0902, 2.0902, 2.0902, 2.0902, 2.0902, 2.0902, 2.0902, 2.0902, 2.0902, 2.0902, 2.0902, 2.0902, 2.0902, 2.0902, 2.0902, 2.0902, 2.0902, 2.0902, 2.0891, 2.0902, 2.0902, 2.0902, 2.0902, 2.0902, 2.0902, 2.0902, 2.0902, 2.0902, 2.0902, 2.0902, 2.0902, 2.0902, 2.0902, 2.0902, 2.0902, 2.0902, 2.0902, 2.0902, 2.0902, 2.0902, 2.0902, 2.0902, 2.0902, 2.0841, 2.0766, 2.0385, 2.0495, 2.0624, 1.992, 1.8973, 1.9246, 1.7926, 1.794, 1.7556, 1.7064, 1.6912, 1.8221, 1.6964, 1.4578, 1.8749, 1.8772, 1.848, 0.834, 1.6755, 1.5243, 1.5613, 1.0839, 1.4519, 0.9861, 0.7834, 1.2352, 1.0617, 0.9651, 0.9205, 1.0528, 2.1112, 2.1112, 2.1112, 2.1112, 2.1112, 2.1112, 2.1112, 2.1112, 2.1112, 2.1112, 2.1112, 2.1112, 2.1112, 2.1112, 2.1112, 2.1112, 2.1112, 2.1112, 2.1112, 2.1112, 2.1112, 2.1112, 2.1112, 2.1112, 2.1112, 2.1112, 2.1112, 2.1112, 2.1112, 2.1112, 2.1112, 2.1112, 2.1112, 2.1112, 2.1112, 2.1112, 2.1112, 2.1094, 2.1112, 2.1112, 2.1112, 2.1112, 2.1089, 2.1112, 2.1112, 2.1112, 2.1112, 2.1112, 2.1041, 2.1112, 2.1112, 2.1112, 2.1112, 2.1112, 2.1112, 2.1112, 2.0935, 2.1057, 2.0558, 2.0526, 2.0142, 2.033, 2.0045, 1.9586, 1.9362, 1.8475, 1.9957, 1.98, 1.9913, 1.8729, 1.9933, 1.4408, 1.6513, 1.5535, 1.3247, 0.6119, 1.0885, 1.0563, 0.2929, 1.1382, 0.2107, 1.1274, 1.2242, 1.1194, 2.2135, 2.2135, 2.2135, 2.2135, 2.2135, 2.2135, 2.2135, 2.2135, 2.2135, 2.2135, 2.2135, 2.2135, 2.2135, 2.2135, 2.2135, 2.2135, 2.2135, 2.2135, 2.2135, 2.2135, 2.2135, 2.2135, 2.2135, 2.2135, 2.2135, 2.2135, 2.2135, 2.2135, 2.2135, 2.2135, 2.2135, 2.2135, 2.2099, 2.2135, 2.2124, 2.2135, 2.2135, 2.2135, 2.2135, 2.2135, 2.2135, 2.2135, 2.2135, 2.2135, 2.2135, 2.2135, 2.2135, 2.2135, 2.2135, 2.2135, 2.2135, 2.2135, 2.2135, 2.2135, 2.2135, 2.2097, 2.2089, 2.1623, 2.0758, 2.0187, 2.0788, 2.046, 2.1203, 1.9474, 2.0443, 1.8563, 1.9146, 1.0956, 1.7037, 1.4054, 1.0779, 1.5699, 1.564, 0.7141, 1.243, 0.7517, 0.187, 1.0349, -0.1752, 0.9084, 2.214, 2.214, 2.214, 2.214, 2.214, 2.214, 2.214, 2.214, 2.214, 2.214, 2.214, 2.214, 2.214, 2.214, 2.214, 2.214, 2.214, 2.214, 2.214, 2.214, 2.214, 2.214, 2.214, 2.214, 2.214, 2.214, 2.214, 2.214, 2.214, 2.214, 2.214, 2.214, 2.2133, 2.214, 2.214, 2.214, 2.212, 2.214, 2.214, 2.214, 2.214, 2.214, 2.214, 2.214, 2.214, 2.214, 2.214, 2.214, 2.214, 2.214, 2.214, 2.214, 2.214, 2.214, 2.214, 2.2028, 2.2053, 2.1877, 2.2047, 2.0175, 2.0943, 2.0354, 2.0982, 2.0502, 1.7588, 1.8761, 1.7048, 1.9356, 2.0495, 1.9252, 1.7217, 1.3552, 1.6895, 1.4409, 1.4194, 1.2307, 0.4202, 0.5291, 2.2829, 2.2829, 2.2829, 2.2829, 2.2829, 2.2829, 2.2829, 2.2829, 2.2829, 2.2829, 2.2829, 2.2829, 2.2829, 2.2829, 2.2829, 2.2829, 2.2829, 2.2829, 2.2829, 2.2829, 2.2829, 2.2829, 2.2829, 2.2829, 2.2829, 2.2829, 2.2829, 2.2829, 2.2829, 2.2829, 2.2829, 2.2829, 2.2829, 2.2829, 2.2829, 2.2829, 2.2829, 2.2829, 2.2829, 2.2829, 2.2829, 2.2829, 2.2829, 2.2829, 2.2829, 2.2829, 2.2829, 2.2829, 2.2829, 2.2731, 2.2829, 2.2829, 2.2829, 2.2778, 2.2829, 2.2829, 2.2829, 2.2829, 2.2768, 2.1943, 2.2691, 2.2457, 2.2008, 2.275, 2.1425, 2.0247, 2.0081, 1.9287, 2.1475, 2.0022, 1.7108, 1.9409, 1.8091, 1.6174, 1.9342, 1.811, 1.9868, 1.8437, 1.6453, 1.3464, 1.7798, 1.6059, 2.0749, 2.0163, 1.6443, 1.4711, 1.3641, 0.4802, 1.305, 1.2257, 0.7345, 1.1261, 1.8041, 1.1499, 0.2833, 1.1287, 2.2996, 2.2996, 2.2996, 2.2996, 2.2996, 2.2996, 2.2996, 2.2996, 2.2996, 2.2996, 2.2996, 2.2996, 2.2996, 2.2996, 2.2996, 2.2996, 2.2996, 2.2996, 2.2996, 2.2996, 2.2996, 2.2996, 2.2996, 2.2996, 2.2996, 2.2996, 2.2996, 2.2996, 2.2996, 2.2996, 2.2996, 2.2996, 2.2996, 2.2961, 2.2996, 2.2996, 2.2996, 2.2996, 2.2996, 2.2961, 2.2961, 2.2996, 2.2996, 2.2996, 2.2996, 2.2996, 2.2996, 2.2996, 2.2996, 2.2996, 2.2996, 2.2996, 2.2996, 2.2996, 2.2996, 2.2996, 2.2996, 2.2996, 2.2931, 2.2931, 2.1795, 2.2526, 2.1935, 2.123, 2.1438, 2.0387, 2.159, 2.2239, 2.1055, 2.121, 2.0503, 2.0306, 1.9544, 2.1211, 1.9846, 1.9449, 2.0006, 1.8291, 2.0045, 1.839, 1.8533, 1.7662, 1.606, 1.8405, 2.0292, 1.9183, 1.2791, 1.2877, 1.6852, 1.4435, 1.2693, 1.2235, 1.3416, 1.2951, 0.6393, 2.4009, 2.4009, 2.4009, 2.4009, 2.4009, 2.4009, 2.4009, 2.4009, 2.4009, 2.4009, 2.4009, 2.4009, 2.4009, 2.4009, 2.4009, 2.4009, 2.4009, 2.4009, 2.4009, 2.4009, 2.4009, 2.4009, 2.4009, 2.4009, 2.4009, 2.4009, 2.4009, 2.4009, 2.4009, 2.4009, 2.4009, 2.4009, 2.4009, 2.4009, 2.4009, 2.4009, 2.4009, 2.4009, 2.4009, 2.4009, 2.3981, 2.4009, 2.4009, 2.4009, 2.3978, 2.3979, 2.4009, 2.4009, 2.4009, 2.4009, 2.4009, 2.3973, 2.4009, 2.4009, 2.4009, 2.4009, 2.4009, 2.4009, 2.3576, 2.3957, 2.3956, 2.3444, 2.3108, 2.2369, 2.0706, 2.1133, 1.8922, 2.0994, 1.8863, 2.0773, 1.5905, 1.8581, 2.1022, 0.7569, 1.389, 1.1443, 1.3194, 1.7189, 1.2054, 1.1654, 0.1832, 1.122, 0.1692, 0.9535, 1.5672, 2.432, 2.432, 2.432, 2.432, 2.432, 2.432, 2.432, 2.432, 2.432, 2.432, 2.432, 2.432, 2.432, 2.432, 2.432, 2.432, 2.432, 2.432, 2.432, 2.432, 2.432, 2.432, 2.432, 2.432, 2.432, 2.432, 2.432, 2.432, 2.432, 2.432, 2.432, 2.432, 2.432, 2.432, 2.432, 2.432, 2.432, 2.432, 2.432, 2.4298, 2.4298, 2.432, 2.432, 2.432, 2.432, 2.432, 2.432, 2.432, 2.432, 2.432, 2.432, 2.432, 2.432, 2.432, 2.432, 2.432, 2.432, 2.432, 2.4181, 2.38, 2.325, 2.3614, 2.2642, 2.3075, 2.2331, 2.3354, 2.3242, 2.3617, 2.3096, 1.6212, 2.1872, 2.075, 2.1822, 1.9825, 2.0566, 2.0, 2.1007, 2.0499, 1.9431, 0.7152, 0.933, 1.7349, 0.1642, 1.2188, 2.4668, 2.4668, 2.4668, 2.4668, 2.4668, 2.4668, 2.4668, 2.4668, 2.4668, 2.4668, 2.4668, 2.4668, 2.4668, 2.4668, 2.4668, 2.4668, 2.4668, 2.4668, 2.4668, 2.4668, 2.4668, 2.4668, 2.4668, 2.4668, 2.4668, 2.4668, 2.4668, 2.4668, 2.4668, 2.4668, 2.4668, 2.4668, 2.4668, 2.4641, 2.4668, 2.4668, 2.4668, 2.4668, 2.4668, 2.4668, 2.4668, 2.4668, 2.4668, 2.4668, 2.4668, 2.4668, 2.4668, 2.4668, 2.4668, 2.4668, 2.4668, 2.4668, 2.4668, 2.4668, 2.4668, 2.4668, 2.4668, 2.4623, 2.4465, 2.4416, 2.4623, 2.434, 2.4145, 2.384, 2.4193, 2.3507, 2.3914, 2.3446, 2.3996, 2.2557, 2.3543, 2.0967, 2.1802, 1.9868, 2.1291, 2.2877, 1.7451, 2.2238, 1.417, 1.9992, 2.1314, 1.8542, 2.1317, 1.6137, 1.3307, 1.9774, 1.1987, 2.6446, 2.6446, 2.6446, 2.6446, 2.6446, 2.6446, 2.6446, 2.6446, 2.6446, 2.6446, 2.6446, 2.6446, 2.6446, 2.6446, 2.6446, 2.6446, 2.6446, 2.6446, 2.6446, 2.6446, 2.6446, 2.6446, 2.6446, 2.6446, 2.6446, 2.6446, 2.6446, 2.6446, 2.6446, 2.6446, 2.6446, 2.6446, 2.6446, 2.6446, 2.6446, 2.6446, 2.6446, 2.6446, 2.6446, 2.6446, 2.6446, 2.6322, 2.6446, 2.6446, 2.6374, 2.6446, 2.6446, 2.6446, 2.6395, 2.6415, 2.6412, 2.6446, 2.6446, 2.6446, 2.6446, 2.6446, 2.6446, 2.6446, 2.6446, 2.5509, 2.5955, 2.6052, 2.5692, 2.5497, 2.5331, 2.5413, 2.5135, 2.3166, 2.5068, 2.5086, 2.0955, 2.4471, 2.2213, 1.7878, 1.9349, 1.8261, 1.7977, 1.42, 1.725, 1.1516, 1.5718, 1.4773, 0.725, 1.7491], \"logprob\": [30.0, 29.0, 28.0, 27.0, 26.0, 25.0, 24.0, 23.0, 22.0, 21.0, 20.0, 19.0, 18.0, 17.0, 16.0, 15.0, 14.0, 13.0, 12.0, 11.0, 10.0, 9.0, 8.0, 7.0, 6.0, 5.0, 4.0, 3.0, 2.0, 1.0, -8.4334, -7.5171, -8.6565, -7.125, -8.0734, -7.1902, -8.8901, -8.7435, -8.7435, -8.2236, -6.8173, -7.8833, -7.9027, -5.392, -8.6565, -8.3381, -7.9634, -8.9442, -7.9844, -8.4673, -7.8092, -6.4052, -6.5164, -9.062, -7.0896, -8.6991, -8.251, -8.79, -7.6757, -8.6157, -4.2322, -4.7125, -5.0366, -5.1613, -5.1663, -5.2374, -5.3762, -5.4872, -5.512, -5.8506, -6.0204, -6.0757, -6.1442, -6.1856, -6.1998, -6.2069, -6.2142, -6.2361, -6.2933, -6.3374, -6.3707, -6.5214, -6.5771, -6.5771, -6.5875, -6.6088, -6.6251, -6.0204, -5.7012, -5.3008, -5.624, -6.0324, -5.1351, -4.1868, -5.2707, -4.719, -4.9573, -4.9169, -4.9729, -5.1012, -5.4977, -5.3348, -4.8416, -5.732, -5.7387, -5.699, -4.3502, -5.4698, -5.2993, -5.3454, -4.848, -5.3378, -5.0344, -5.008, -5.2679, -5.2498, -5.2347, -5.2293, -5.3318, -8.7792, -7.2316, -7.309, -8.0373, -8.1114, -6.1728, -8.1914, -8.0861, -8.0861, -8.5561, -8.5168, -5.6095, -7.9463, -7.2641, -8.5969, -7.6006, -7.3929, -6.199, -7.9463, -7.6806, -7.2532, -6.2028, -8.5969, -7.2641, -7.786, -8.2784, -6.9709, -8.5969, -8.7792, -7.3561, -4.7231, -4.9748, -5.0816, -5.2857, -5.3213, -5.3324, -5.4241, -5.4452, -5.6286, -5.7588, -5.7961, -5.8321, -5.7205, -6.0982, -6.1618, -6.1655, -6.1952, -6.2901, -5.7065, -6.5332, -6.5332, -6.5876, -6.6159, -6.706, -6.7777, -6.7845, -5.3308, -6.5546, -5.6613, -5.7323, -5.4328, -5.6503, -5.4927, -5.1131, -5.0076, -4.4148, -5.4524, -5.383, -5.5805, -5.2647, -5.7515, -4.3214, -5.0841, -5.0475, -5.1054, -4.5723, -5.1456, -5.3276, -5.2842, -5.4852, -5.3797, -5.5347, -5.5445, -5.5445, -7.5793, -7.6508, -7.309, -8.2724, -8.644, -8.2385, -8.8671, -8.0562, -6.8439, -8.5952, -5.9326, -6.7419, -6.2507, -5.3917, -7.9262, -8.6953, -8.7494, -8.4209, -8.3075, -7.9262, -7.1511, -8.5042, -8.2057, -5.7075, -8.5952, -7.6885, -6.307, -6.5583, -7.8331, -8.6953, -4.4378, -4.7083, -4.4252, -4.8758, -4.9075, -5.0223, -5.2923, -5.3782, -5.4413, -5.6813, -5.6917, -5.6996, -5.926, -5.936, -5.9664, -6.0266, -6.0266, -6.0562, -6.06, -6.1801, -6.2416, -6.3565, -6.377, -6.414, -6.4357, -6.0907, -6.307, -5.8376, -5.3917, -5.1536, -5.5853, -5.5947, -5.963, -5.4785, -5.762, -5.3537, -5.4891, -4.0885, -5.3898, -5.0944, -4.8875, -5.4332, -5.5063, -5.0481, -5.5806, -5.5107, -5.4034, -5.5853, -5.5107, -5.5947, -8.1482, -6.5994, -6.4651, -8.63, -8.1482, -8.4557, -6.7258, -5.8166, -7.7427, -7.3438, -8.1192, -6.1412, -7.3438, -5.352, -7.2801, -6.9384, -5.9808, -7.3051, -8.4165, -7.3705, -7.1313, -7.5157, -8.0637, -8.7842, -6.3227, -5.5071, -7.3438, -7.8244, -8.4165, -8.2406, -3.6232, -3.6338, -4.452, -4.7161, -4.8901, -4.9084, -4.7608, -5.21, -5.2147, -5.2432, -5.2611, -5.3867, -5.4382, -5.4461, -5.5197, -5.5543, -5.8664, -5.9641, -6.0542, -6.0986, -6.1177, -6.1981, -6.2764, -6.2901, -6.2993, -5.5609, -5.8195, -5.1379, -5.9188, -3.9861, -4.9282, -4.4289, -5.1763, -4.9556, -4.7373, -5.0612, -4.7314, -5.2529, -5.5218, -5.3064, -4.9937, -4.8415, -5.1763, -5.0532, -5.135, -5.1539, -5.1569, -5.2627, -7.8061, -8.617, -7.9238, -7.8061, -7.2307, -5.0061, -7.8061, -7.1129, -7.2307, -8.617, -7.8061, -7.408, -8.617, -7.9492, -8.0292, -8.2805, -6.8591, -7.4856, -8.3546, -7.6424, -8.0292, -8.5682, -8.2805, -8.5217, -8.8401, -7.4231, -8.3546, -8.5217, -8.3938, -7.5697, -5.3249, -5.8076, -5.8197, -5.8228, -5.8697, -5.9567, -6.1238, -6.2011, -6.2056, -6.2191, -6.2752, -6.4888, -6.5629, -6.5954, -6.6429, -6.8087, -6.8087, -6.8087, -6.8169, -5.857, -6.8336, -6.8506, -6.8678, -6.3657, -6.8765, -6.9683, -6.9683, -6.9976, -6.5501, -4.7615, -6.636, -6.2561, -5.7434, -6.7924, -5.7867, -4.9382, -5.0746, -4.6706, -6.0913, -5.3941, -4.0806, -5.2326, -4.703, -4.029, -5.2549, -4.8092, -5.4793, -4.9953, -4.6911, -3.9891, -5.2258, -4.9071, -5.8351, -5.7406, -5.1702, -5.1944, -5.1266, -4.704, -5.2902, -5.2741, -5.0574, -5.3628, -5.6288, -5.4793, -5.2938, -5.5013, -8.5714, -7.7829, -7.9035, -7.4562, -7.2364, -7.4727, -8.309, -7.9295, -7.6353, -8.1998, -8.4316, -7.2364, -7.5417, -7.7604, -8.1659, -7.6353, -7.5066, -7.8294, -8.1659, -7.263, -7.6353, -6.249, -6.9037, -8.2349, -8.7339, -7.263, -8.3482, -8.7945, -7.9836, -8.1659, -4.8925, -5.3809, -5.4165, -5.2374, -5.6375, -5.8305, -6.0377, -6.1918, -6.2588, -5.9431, -5.954, -6.3853, -6.3853, -6.5498, -6.5565, -6.5699, -6.5835, -6.5904, -6.7151, -6.788, -6.8135, -6.8222, -6.8757, -6.8943, -6.8943, -6.9227, -6.9324, -7.0132, -6.5631, -6.5835, -3.9136, -6.0416, -5.2718, -4.3438, -5.1293, -4.1459, -5.3706, -6.0865, -5.1887, -5.321, -4.823, -4.6981, -4.5058, -5.5174, -4.7493, -4.904, -5.1819, -4.5118, -5.2409, -4.7536, -4.9768, -4.9091, -4.8242, -5.3386, -5.6269, -5.515, -4.8457, -4.9091, -5.3605, -5.2162, -5.1277, -5.2127, -5.2942, -5.2923, -5.2517, -8.2113, -8.1021, -6.7689, -8.2505, -6.9696, -7.4804, -6.6019, -8.1021, -7.8585, -7.2499, -7.4804, -6.1271, -7.8058, -6.1175, -6.7689, -8.579, -7.0267, -6.9585, -8.0037, -6.778, -6.7072, -7.6408, -8.2505, -7.7805, -7.5982, -7.2209, -7.4621, -8.4737, -7.5982, -8.7613, -4.2712, -5.1326, -5.1927, -5.5722, -5.6001, -5.6115, -5.6375, -5.8099, -5.8821, -5.8859, -5.623, -5.9087, -5.9722, -5.9763, -5.6733, -5.6825, -6.0056, -6.0489, -6.0895, -6.1611, -6.1611, -5.8204, -6.2329, -6.3336, -6.3454, -6.3514, -6.3634, -6.3756, -3.9617, -6.2224, -6.2383, -5.6115, -5.3082, -5.5532, -4.886, -5.2608, -4.6975, -5.2977, -5.0741, -5.6346, -4.9817, -5.394, -5.7011, -4.8334, -5.3231, -5.2272, -5.336, -5.5945, -5.3872, -5.422, -5.1522, -5.4315, -5.4079, -5.5371, -5.6115, -6.9158, -7.1153, -7.2106, -7.609, -8.2811, -7.2396, -6.5175, -7.5879, -8.2811, -8.2811, -7.9328, -7.9038, -7.1153, -6.5391, -7.5879, -7.5879, -7.5879, -8.6259, -6.8742, -7.609, -5.9337, -7.609, -8.2811, -7.609, -5.6753, -6.4485, -8.6259, -7.1687, -7.9038, -7.5879, -3.8483, -4.1144, -4.1366, -4.5365, -4.9385, -4.9608, -5.19, -5.2034, -5.4528, -5.3344, -5.3344, -5.562, -5.648, -5.8644, -5.9417, -5.9579, -5.962, -6.0298, -6.052, -6.061, -6.0746, -6.0885, -6.112, -6.112, -6.141, -6.1608, -6.1658, -6.2016, -6.052, -5.6939, -5.361, -5.7421, -5.2627, -5.5085, -5.1787, -5.654, -5.7034, -5.8387, -5.6877, -3.9692, -5.4023, -5.2247, -5.4802, -5.2267, -5.3477, -5.3214, -5.5137, -5.4904, -5.4479, -4.9312, -5.0875, -5.4479, -5.1713, -5.5216, -7.7017, -7.8841, -7.9429, -8.4437, -6.4288, -7.9131, -8.6062, -6.1613, -7.2347, -6.712, -6.795, -8.3484, -7.4504, -7.1628, -8.0382, -7.8018, -6.6603, -7.1909, -7.2805, -7.1087, -7.3619, -8.1813, -8.0054, -8.2614, -6.5642, -7.5476, -7.7759, -7.2805, -7.6552, -8.2614, -3.5785, -4.0819, -4.5519, -4.4033, -4.8784, -5.0991, -5.4087, -5.4233, -5.5673, -5.5758, -5.6017, -5.6805, -5.9021, -5.93, -5.9505, -5.9756, -5.9884, -5.9927, -6.0413, -6.1067, -6.2245, -6.252, -6.2633, -6.3036, -6.3396, -6.3518, -6.4422, -6.0145, -4.4876, -4.5967, -6.0278, -4.9071, -4.6942, -4.584, -5.2636, -4.6744, -5.2369, -4.9624, -5.4966, -5.092, -5.5561, -4.557, -4.9624, -4.3971, -4.8756, -5.3873, -4.0468, -5.2782, -4.1601, -5.0227, -5.2349, -5.0342, -5.2803, -4.9874, -5.0408, -5.3104, -5.2974, -7.6748, -7.4971, -7.6748, -7.891, -7.8243, -8.1672, -8.4857, -7.6207, -8.3679, -8.2625, -7.5694, -7.7925, -7.7925, -7.1978, -6.5948, -7.891, -7.5694, -7.3871, -5.7131, -7.4971, -6.7474, -7.1978, -6.7474, -8.3138, -7.3871, -8.3679, -7.5694, -7.4741, -6.9016, -7.4971, -4.4979, -4.6422, -4.9144, -4.9502, -5.2133, -5.2324, -5.2569, -5.2794, -5.3529, -5.4382, -5.4653, -4.3455, -5.6058, -5.6199, -4.9232, -5.6748, -5.6899, -5.7448, -5.2593, -5.4683, -5.5249, -5.9353, -5.955, -5.965, -5.9904, -6.0008, -6.1166, -6.1284, -6.1403, -3.4524, -4.853, -5.0866, -4.6041, -4.6342, -4.9144, -5.2015, -5.0929, -4.1492, -5.1141, -5.1314, -3.7955, -5.0578, -5.0337, -4.6093, -4.8918, -4.8141, -4.7937, -4.5453, -4.8647, -4.6106, -4.9411, -5.0357, -4.9215, -5.1715]}, \"token.table\": {\"Topic\": [1, 2, 9, 6, 6, 1, 3, 4, 6, 2, 6, 7, 9, 5, 4, 6, 9, 2, 3, 6, 7, 7, 2, 7, 2, 6, 7, 10, 1, 7, 2, 2, 3, 8, 10, 10, 8, 10, 6, 9, 2, 4, 6, 2, 3, 5, 2, 10, 9, 1, 4, 9, 9, 4, 7, 3, 3, 1, 2, 4, 3, 3, 3, 4, 1, 6, 3, 1, 2, 3, 6, 1, 1, 1, 7, 3, 6, 1, 9, 10, 2, 5, 2, 4, 6, 6, 7, 3, 3, 9, 5, 10, 3, 2, 2, 3, 10, 1, 2, 3, 4, 6, 7, 8, 7, 8, 9, 9, 10, 5, 9, 1, 1, 2, 3, 6, 8, 10, 9, 1, 1, 6, 10, 5, 5, 9, 4, 6, 4, 5, 8, 10, 6, 8, 9, 6, 10, 3, 1, 3, 6, 9, 3, 8, 9, 7, 9, 10, 8, 8, 10, 10, 1, 8, 8, 2, 8, 5, 9, 9, 5, 6, 4, 10, 2, 6, 8, 9, 6, 5, 5, 7, 5, 9, 8, 1, 2, 3, 4, 5, 9, 10, 1, 1, 2, 3, 4, 5, 9, 3, 6, 7, 8, 10, 9, 10, 1, 2, 4, 5, 7, 9, 2, 9, 2, 8, 1, 2, 3, 2, 6, 9, 4, 10, 1, 1, 1, 9, 3, 1, 2, 3, 9, 8, 7, 1, 8, 10, 4, 6, 2, 2, 5, 5, 2, 4, 7, 4, 9, 3, 8, 9, 1, 4, 4, 6, 1, 5, 4, 4, 6, 9, 1, 2, 2, 4, 6, 9, 9, 1, 1, 2, 3, 5, 6, 7, 8, 9, 2, 3, 6, 8, 1, 2, 3, 4, 9, 4, 7, 1, 4, 5, 6, 7, 2, 7, 9, 3, 5, 2, 3, 2, 4, 5, 7, 8, 1, 2, 3, 4, 5, 6, 7, 2, 3, 7, 10, 10, 7, 2, 3, 1, 5, 8, 6, 2, 6, 6, 4, 10, 4, 7, 8, 8, 2, 4, 6, 7, 9, 1, 2, 3, 4, 6, 10, 3, 4, 10, 4, 2, 8, 2, 1, 2, 4, 2, 1, 7, 3, 2, 4, 6, 7, 9, 7, 8, 2, 9, 8, 6, 6, 7, 4, 9, 1, 2, 3, 4, 5, 7, 9, 7, 10, 4, 3, 6, 9, 10, 6, 4, 9, 1, 4, 4, 5, 6, 7, 9, 10, 1, 2, 6, 8, 9, 1, 5, 2, 6, 6, 5, 5, 9, 4, 9, 2, 2, 7, 5, 3, 8, 4, 1, 7, 5, 6, 9, 6, 4, 6, 10, 2, 2, 7, 10, 5, 4, 2, 4, 9, 1, 2, 1, 3, 1, 1, 2, 4, 6, 1, 3, 4, 3, 5, 7, 8, 1, 2, 3, 5, 1, 8, 2, 2, 1, 2, 3, 5, 4, 1, 3, 4, 7, 8, 8, 2, 2, 5, 5, 6, 7, 9, 7, 8, 1, 2, 3, 4, 6, 9, 4, 5, 8, 1, 2, 3, 7, 9, 7, 4, 9, 10, 10, 10, 3, 5, 9, 10, 6, 4, 6, 8, 7, 8, 10, 3, 5, 1, 2, 3, 4, 6, 7, 1, 3, 3, 8, 1, 3, 5, 1, 2, 8, 1, 5, 1, 4, 5, 6, 7, 8, 10, 10, 3, 2, 3, 4, 4, 3, 3, 7, 8, 5, 5, 1, 2, 3, 6, 10, 4, 10, 2, 5, 2, 2, 2, 1, 3, 4, 5, 8, 2, 4, 2, 3, 5, 1, 3, 5, 8, 9, 2, 6, 3, 5, 9, 10, 1, 1, 5, 3, 7, 1, 2, 6, 7, 8, 9, 1, 3, 6, 7, 8, 1, 2, 1, 7, 9, 5, 2, 3, 8, 8, 1, 3, 6, 5, 8, 3, 10, 1, 6, 2, 10, 4, 8, 5, 2, 3, 4, 6, 7, 9, 1, 5, 6, 7, 2, 4, 6, 10, 9, 5, 3, 6, 4, 6, 9, 6, 7, 10, 2, 5, 1, 2, 3, 6, 7, 9, 10, 9, 4, 6, 10, 6, 5, 1, 3, 3, 8, 3, 1, 2, 3, 6, 10, 4, 8, 1, 3, 1, 3, 2, 1, 6, 8, 9, 10, 8, 6, 4, 9, 8, 8, 7, 1, 8, 9, 2, 4, 3, 6, 1, 1, 7, 8, 10, 1, 1, 8, 7, 1, 6, 7, 3, 7, 9, 7, 6, 8, 8, 5, 3, 4, 5, 8, 2, 2, 9, 2, 2, 2, 4, 1, 2, 3, 5, 7, 5, 7, 8, 5, 4, 5, 6, 8, 6, 2, 3, 5, 7, 8, 9, 1, 3, 5, 1, 4, 5, 2, 3, 4, 5, 7, 8, 1, 5, 1, 3, 4, 5, 8, 8, 1, 5, 10, 1, 7, 1, 10, 4, 6, 9, 7, 10, 6, 10, 1, 2, 4, 5, 8, 9, 4, 5, 6, 8, 1, 6, 7, 8, 9, 10, 8, 1, 6, 3, 6, 9, 3, 5, 7, 8, 9, 1, 6, 6, 9, 3, 4, 10, 3, 4, 8, 9, 4, 6, 10, 6, 10, 10, 4, 10, 8, 10, 3, 7, 2, 5, 8, 7, 4, 9, 4, 7, 9, 9, 8, 6, 9, 9, 8, 7, 1, 5, 3, 9, 4, 5, 5, 9, 4, 3, 3, 5, 3, 3, 2, 2, 7, 2, 3, 6, 7, 8, 1, 5, 6, 7, 3, 9, 4, 3, 3, 6, 10, 6, 3, 6, 8, 10, 4, 6, 6, 9, 10, 5, 10, 6, 1, 7, 4, 2, 3, 4, 6, 8, 9, 3, 2, 8, 4, 10, 1, 5, 6, 1, 3, 5, 7, 10, 7, 10, 7, 3, 8, 9, 4, 2, 4, 5, 3, 8, 2, 3, 6, 2, 2, 1, 4, 2, 6, 6, 8, 1, 3, 8, 8, 9, 1, 2, 3, 5, 10, 1, 2, 3, 4, 7, 8, 3, 1, 2, 3, 4, 5, 6, 8, 2, 4, 6, 10, 4, 6, 5, 8, 9, 5, 2, 8, 8, 10, 4, 2, 7, 8, 8, 8, 1, 2, 4, 5, 7, 8, 4, 2, 3, 7, 4, 9, 10, 4, 1, 2, 3, 7, 8, 9, 9, 6, 2, 4, 6, 7, 9, 10, 4, 9, 10, 2, 6, 1, 2, 4, 5, 6, 7, 8, 9, 7, 1, 2, 3, 4, 5, 9, 2, 4, 7, 2, 2, 6, 7, 2, 3, 7, 2, 3, 9, 6, 1, 2, 4, 6, 7, 2, 3, 6, 5, 7, 5, 10, 10, 9, 1, 2, 3, 4, 6, 7, 9, 10, 7, 4, 6, 8, 1, 1, 4, 5, 6, 9, 10, 1, 2, 4, 5, 7, 3, 4, 6, 3, 2, 4, 9, 1, 3, 5, 8, 10, 4, 3, 4, 6, 10, 6, 2, 4, 6, 1, 3, 6, 7, 4, 4, 7, 10, 3, 3, 5, 9, 8, 5, 5, 5, 6, 6, 8, 10, 10, 5, 7, 8, 8, 8, 6, 4, 4, 5, 8, 9, 2, 2, 6, 6, 9, 10, 1, 6, 7, 3, 1, 9, 1, 6, 7, 10, 8, 4, 1, 9, 9, 8, 2, 2, 3, 2, 3, 4, 2, 6, 7, 2, 7, 9, 10, 3, 4, 6, 8, 3, 4, 2, 6, 7, 9, 4, 7, 9, 7, 6, 9, 1, 8, 3, 4, 5, 7, 7, 8, 9, 4, 6, 9, 7, 3, 1, 5, 9, 10, 1, 3, 4, 6, 3, 7, 4, 7, 7, 3, 4, 9, 7, 9, 10, 7, 1, 5, 8, 4, 2, 3, 4, 5, 7, 8, 1, 2, 3, 4, 10, 4, 3, 7, 2, 5, 3, 5, 6, 7, 6, 4, 4, 5, 2, 5, 6, 6, 6, 8, 9, 7, 5, 1, 2, 3, 4, 7, 9, 7, 9, 5, 4, 9, 6, 6, 5, 1, 2, 3, 5, 10, 7, 10, 4, 9, 5, 1, 5, 6, 10, 8, 6, 2, 6, 7, 9, 10, 7, 6, 7, 5, 2, 2, 3, 5, 7, 9, 10, 6, 1, 2, 4, 5, 7, 9, 3, 1, 2, 3, 4, 5, 7, 8, 9, 7, 2, 1, 2, 3, 10, 1, 6, 7, 8, 7, 7, 2, 8, 3, 1, 3, 6, 1, 2, 3, 4, 5, 7, 9, 10, 8, 3, 5, 1, 2, 3, 4, 1, 3, 9, 3, 3, 3, 3, 3, 5, 9, 9, 10, 10, 10, 7, 10, 1, 2, 3, 5, 7, 10, 4, 6, 9, 9, 5, 7, 7, 8, 9, 10, 4, 6, 10, 2, 2, 7, 7, 4, 9, 9, 4, 3, 10, 1, 4, 9, 6, 9, 9, 7, 10, 2, 3, 5, 8, 1, 3, 7, 9, 2, 3, 6, 5, 5, 4, 6, 10, 4, 8, 4, 5, 3, 7, 8, 9, 2, 8, 10, 1, 2, 3, 4, 6, 7, 2, 3, 4, 5, 7, 9, 4, 1, 3, 6, 7, 8, 9, 10, 3, 5, 1, 2, 3, 5, 4, 4, 4, 2, 3, 4, 5, 7, 8, 6], \"Freq\": [0.9596244475304239, 0.031987481584347464, 0.0075264662551405796, 0.9984867729205216, 0.9984387825921106, 0.6741205596851968, 0.12373725398039588, 0.03365653308266768, 0.16729276738149523, 0.15052753323769338, 0.3664742053930341, 0.2908928701386649, 0.19244659312667128, 0.9980956061235761, 0.2054250783282258, 0.7794317786774658, 0.015216672468757467, 0.887325795921901, 0.03059744123868624, 0.07989331878990295, 0.00339971569318736, 0.9879414768992439, 0.9423861702524698, 0.0567955950821801, 0.9994896573009671, 1.0021933200501525, 1.0019018260589678, 1.0144755921625719, 0.996337615727813, 0.9926628220696108, 1.0006379487221944, 0.63114299249481, 0.25996905058420994, 0.10825906639059167, 1.0037646884745808, 1.0001323345320658, 0.07303320093696938, 0.9277498806524392, 0.9963752272095723, 0.006266510862953285, 0.0015281147632858986, 0.0993274596135834, 0.9000595955753943, 0.0582728155691844, 0.8449558257531739, 0.09651435078646167, 0.10507010638399908, 0.8945969057837635, 1.0036589605405666, 0.005348469535790648, 0.04492714410064144, 0.9488184956492609, 0.9979563528102225, 0.9982347770205148, 0.0018676048213667254, 0.9993061898866985, 1.0008316381316407, 0.8468297319386143, 0.10264602811377142, 0.04899014978157273, 1.0001696599070915, 1.000006957300843, 0.9493577053671735, 0.0495543857197151, 1.0000437071907593, 1.0027952379600924, 1.0176374117139195, 1.0008178609732166, 0.07267493897779399, 0.09084367372224249, 0.8357617982446309, 1.0014209709100976, 0.9993117578643139, 0.9993163971085147, 1.005750668608054, 0.8230142040013868, 0.1766858748202423, 0.9760041949986739, 0.999155613663385, 1.000051768577322, 0.0789381946989091, 0.9201233319591592, 0.057877432426024694, 0.6011608783118225, 0.34071243239471144, 1.0006306485531926, 0.9952958799530847, 0.9984668482279428, 0.9980529759592474, 1.000855443891012, 0.9965764347291718, 1.004186793053418, 1.0004862193816624, 0.9989599058357512, 0.09149697778217537, 0.031672030770753014, 0.8780190752558753, 0.13384543408496194, 0.05341537965776004, 0.05648522906337843, 0.35180474188386784, 0.033154373580678645, 0.2781283561490264, 0.09209548216855179, 0.0020604155059996926, 0.9972411049038511, 1.0015852850022597, 1.0029461345742736, 0.9982005826626376, 0.9935487604676272, 0.007584341682958986, 1.0005357187508848, 0.8247612977960603, 0.17547295767821208, 0.9951386254005163, 0.8685382775612623, 0.1287326902951965, 0.0016295277252556517, 0.9899727019877408, 0.999448037862106, 1.0016885159196918, 1.0130278424290728, 1.0078450327366728, 1.0004852216682878, 0.9953610976136485, 0.9993328443313401, 1.0004752867197402, 0.993164551401052, 0.04339860447613084, 0.07377762760942244, 0.8831616010892627, 1.0144755921625719, 0.13313005870941663, 0.05705573944689284, 0.8096481121511461, 0.9867154309374087, 0.9877247144787719, 1.0013985168461441, 0.3328598120779279, 0.08113457919399493, 0.586665418787348, 1.0007037630122912, 0.997249205730104, 1.0007514454962572, 1.0143932809741556, 1.0019828041819066, 0.9996919290759796, 1.0078450327366728, 0.9992263747167749, 0.12854485053981055, 0.8712484314364937, 0.9992098855773622, 0.06942495191380081, 0.9314514381768275, 1.0039508493017242, 1.0172741707760735, 0.9830352066079383, 0.21558475343243055, 0.7846650952136259, 1.0000983079089372, 1.015674589401682, 0.9917755100704211, 0.9966784165614111, 1.0078450327366728, 0.04920307083986814, 0.15408330078800814, 0.6992015329875999, 0.09581650637237481, 0.9985412338550106, 1.0023542669177257, 0.2757114734179673, 0.7234981926570774, 1.0016212303030425, 1.0001966629900005, 1.0003366262442381, 0.14944079683488806, 0.3595500962654322, 0.06379114611160894, 0.13070493573917077, 0.06646769769671142, 0.11464562622855592, 0.11553781009025675, 1.0013080074616025, 0.15462953026930315, 0.0916618349534529, 0.07332946796276232, 0.04862062549704893, 0.5276533455581376, 0.10361772646912067, 0.2424478586813655, 0.34964290599152414, 0.36331207309818864, 0.04316579086315113, 0.0007194298477191855, 1.0027465433037117, 1.0025405851959532, 0.10016787002840825, 0.18005635532713876, 0.4516772053428225, 0.14011211267777351, 0.1044695576983399, 0.023966545589619154, 0.004201548310198271, 0.9957669495169902, 0.0020604879996883553, 0.9972761918491639, 0.18348240762986753, 0.11719198938939926, 0.6996006639306561, 0.5723801613012484, 0.001287694401127668, 0.42622684677325806, 0.0047147307360810185, 0.9948081853130949, 0.9999342453138778, 0.9998804833436241, 0.9999715558581229, 1.0003489295551302, 1.0014549606934426, 0.7437084630692791, 0.06434499781082294, 0.1915385981345427, 1.0015852850022597, 0.9999903092540202, 0.997912784107212, 1.0184391599986165, 0.03832822453769222, 0.9620384358960747, 1.0006691209320273, 1.0002201454447197, 1.0003869914155166, 0.9995293253607629, 0.9965764347291719, 0.9953610976136485, 0.11284743720546209, 0.8870789846411976, 1.0082218004719556, 0.8492588567880617, 0.1515155005860519, 0.19106491353885857, 0.6819040879748918, 0.12682757191803543, 1.0203680220440683, 1.0007952212560058, 0.99192958039851, 0.008020993911578247, 0.005963108642493345, 0.9958391432963887, 1.0005287194951473, 0.1177431172573989, 0.744479918492095, 0.1385934609383966, 0.9721201576587323, 0.028676110845390332, 1.000831375026431, 0.02491026816023044, 0.26017391189574013, 0.7154782577132854, 0.9996919290759796, 1.0096595120675937, 0.26690343329084465, 0.3736648066071825, 0.07733355887657806, 0.09033654665228587, 0.05885562887951958, 0.03421838888344162, 0.03421838888344162, 0.06433057110087025, 0.9927599058257967, 0.006474521124950848, 0.8561341361321075, 0.14373975186901364, 1.0016885159196915, 0.3482153650074736, 0.032127012842951434, 0.0010363552529984333, 0.6187040860400647, 0.9999462146484976, 1.0006411854308133, 0.0011476673554004476, 0.3649582190173423, 0.0011476673554004476, 0.6323647128256467, 0.0011476673554004476, 0.10933394388791555, 0.7184802026920165, 0.17181048325243872, 0.13121518084808836, 0.8699080508076968, 0.3992741222408818, 0.6004914239506666, 0.007396260012417752, 0.03254354405463811, 0.6198065890406076, 0.1257364202111018, 0.21301228835763125, 0.22730041555881564, 0.059056905553045755, 0.07691131885978052, 0.028841744572417696, 0.4443002080560535, 0.12772772596356408, 0.035708826613469524, 0.9253320025023333, 0.07600262854228611, 0.9981395824672362, 0.9967698125967092, 1.0010005842970349, 0.9986095163572867, 0.8906458383328059, 0.10964105598363377, 1.0203680220440683, 0.990094636779714, 1.002695910740097, 1.0029354106240511, 0.999719571163383, 0.9976789357256022, 0.9983961743566053, 1.0032355114072098, 1.0000187986602016, 0.004916450275116375, 0.9931229555735077, 0.9830352066079383, 1.0039508493017242, 0.09835322886844529, 0.46168162727658435, 0.09488193843779427, 0.15852226299972946, 0.18687113485004606, 0.05286559937736633, 0.07311199913891088, 0.044991999470099006, 0.01574719981453465, 0.0927959989070792, 0.7204343915149604, 0.999054181668077, 0.9966784165614112, 1.0050532182415572, 0.999286471999273, 0.38725686872789444, 0.6128020779869978, 1.000262897017276, 0.7842677372128325, 0.09948427956188151, 0.11606499282219508, 1.0009358704846572, 1.0023826867553949, 0.9755479458270313, 0.9959706811073731, 0.11251414340126598, 0.0903802135518366, 0.12173661417186155, 0.597616105934593, 0.0774687544730028, 0.9993777495906229, 1.0001110372884587, 0.3864134236773323, 0.6128875163623912, 1.002134176336321, 1.0057573076747972, 0.9936397497510046, 1.0012202601909006, 1.0032355114072098, 0.9994348066662377, 0.3245821975021189, 0.14009191791260114, 0.005172624661388349, 0.12198773159774191, 0.18190396725882363, 0.08060673430663512, 0.14569559462910517, 0.9962073911983338, 0.0026636561261987536, 0.999264748852559, 1.0025984351861275, 0.045492647151067794, 0.08188676487192202, 0.8734588253005017, 0.9993117981408649, 0.019764972661312795, 0.9801629624314663, 0.976004194998674, 0.9998679916272118, 0.10857213560229863, 0.00031653683849066657, 0.18992210309439994, 0.043682083711711985, 0.07976728329964797, 0.5773631934069758, 1.001858610760228, 0.10574111615403048, 0.07387393046377472, 0.8198557773038527, 1.006751900326516, 1.0022408669072405, 0.997421886635623, 1.000262897017276, 1.0031606881196988, 0.9964208286187602, 1.000627558447583, 1.0009958424219842, 1.000141546366106, 0.002521034973867037, 0.9974895046600577, 1.0003279082545709, 1.0112547969844992, 1.0016814394908502, 0.984423063573938, 0.012520752078681559, 0.9849658301896159, 0.993602248609061, 0.25975490626986186, 0.7393024255372991, 0.9981861527629776, 0.8359463185260134, 0.16420374113903835, 0.9751070141028509, 0.3392021168558921, 0.6403553089093332, 0.021048341380079223, 0.9999977862573988, 1.0008603661444144, 0.6015636244394491, 0.3984961152371377, 1.0026531203067888, 1.0004233166773155, 0.998404105625761, 0.002199127985959826, 0.9958553920674642, 1.0000606364246976, 0.9859734270598863, 0.9065061603859812, 0.09370135792451248, 1.0006352156926468, 0.5279165782013213, 0.12595358714081598, 0.2355798574300447, 0.11040376156787574, 0.7423856994060732, 0.17367468780713055, 0.08359934124953403, 0.17740265878697958, 0.7432559669868283, 0.006117333061619986, 0.07340799673943983, 0.42498534988012143, 0.2615294460800747, 0.2708697834400774, 0.04203151812001201, 1.0004807892306156, 1.001492194160577, 0.9993449439150883, 1.0060953337345782, 0.26246630781160807, 0.07719597288576707, 0.05596708034218113, 0.6050234374921994, 1.0001016091967223, 0.04838082290376766, 0.1877636698408126, 0.10943281371090305, 0.1566617122598191, 0.497631321295896, 0.9976403011061133, 1.0001771258890806, 0.9859734270598863, 0.990094636779714, 1.00280378193268, 0.0032427782689571486, 0.9955329285698447, 0.9999348085534031, 1.0003141785074698, 0.9992263747167749, 0.3541651663383833, 0.06948482033578823, 0.09281927492616489, 0.2556419136234597, 0.17008224679207867, 0.05755832132292906, 0.999234002244902, 1.0008233376607407, 1.002695910740097, 0.015441843725911243, 0.3006012245310722, 0.5219343179358, 0.16059517474947693, 0.0010294562483940829, 0.9986651957281458, 0.8901096393035455, 0.1098433171906503, 0.9992098855773622, 0.9967698125967092, 1.0007276727453278, 0.1472180027072302, 0.7059508948716786, 0.11939727778617881, 0.027820724921051376, 1.0086424405137955, 0.9739978471744778, 0.026575657494528726, 0.9997760041858161, 0.0929013070711395, 0.9083683358066974, 0.9983528634532802, 0.9987144019919664, 1.000627558447583, 0.15907650203772294, 0.1706829421005611, 0.08943786166069402, 0.025261075430883042, 0.424659159946196, 0.13108449953323092, 1.0041581621620972, 0.9991530797387526, 0.9985657063317279, 0.9976403011061133, 0.006448087724644002, 0.006448087724644002, 0.9865574218705322, 0.07475076238036181, 0.07962581210082019, 0.8450086182127856, 1.016671036456952, 0.9978557369560386, 0.0929452001168755, 0.020324017092223444, 0.5140489201130661, 0.012888401082873403, 0.03346027204207518, 0.17969405355929263, 0.14672948925117413, 0.9990283760613626, 0.9927349089140417, 0.7681535699563723, 0.2317309156678423, 1.0003628002305753, 1.0008838107241176, 0.9989009642489117, 0.999095963518493, 1.0034207442792322, 0.999226374716775, 0.9931040429705336, 0.990094636779714, 0.08090602512986467, 0.13153433533382905, 0.11019102809098133, 0.624912181831286, 0.052613734133531626, 1.0013908440628836, 1.0050532182415572, 0.9996572600457587, 1.0054152501147964, 1.0037824708984067, 1.0172741707760735, 1.0024697649643632, 0.09148470971540758, 0.16581603635917624, 0.06452939345997499, 0.6444771068344337, 0.03430676614327784, 1.0007099085905, 1.0049092443258072, 0.06825608657420425, 0.30780869810867106, 0.6234930985143656, 0.08890661183193574, 0.005429411409583862, 0.1493088137635562, 0.06515293691500634, 0.6908926018695465, 0.9974674891011425, 0.0016707998142397697, 0.13618989455546412, 0.5082064463498271, 0.013560032791236687, 0.3419486529964034, 1.0007579245819738, 0.004963903488652809, 0.9927806977305618, 0.002800470424203144, 0.9969674710163193, 1.003115422637526, 0.11885506250884412, 0.1294894628385828, 0.44476815496730615, 0.050669789806401966, 0.25647671383487414, 0.16666658392123015, 0.7413789422702997, 0.08477007285648774, 0.007183904479363369, 1.0005640271595013, 0.998968999586878, 1.0029013802941509, 1.0005886835376834, 1.0003141785074698, 0.9989299687641838, 0.9969955164931454, 0.7883370772216414, 0.21249868142985587, 1.0039508493017242, 1.0039508493017242, 0.567876287210216, 0.3788523105892518, 0.053087584923334645, 0.9650406336499411, 0.03446573691606933, 1.0095609243193646, 0.9856005753078496, 1.022480585236706, 0.9976789357256022, 1.0001230783288477, 1.0013761942723807, 0.9989823521230636, 0.0006865858090192877, 0.9953610976136485, 0.041685177778979995, 0.06489135922294824, 0.42372768340282757, 0.3635635092888358, 0.001718976403256907, 0.1044278164978571, 1.0065043260923825, 1.0026531203067888, 1.0007487170662963, 0.9991387211884245, 0.04797338364920279, 0.18170449736158223, 0.7701213976960518, 0.9979824920830741, 1.0127831329091173, 1.0042775808077358, 0.9966996563874329, 0.003521906913029798, 0.11347797142211762, 0.0013043444991048, 0.8843455703930545, 0.5413795254638948, 0.012052976448175764, 0.4469645432865179, 0.9454007534197727, 0.05306823355994566, 0.08399889830819149, 0.03266623823096336, 0.07799897700046353, 0.3839949636945897, 0.12266505784688281, 0.07999895076970617, 0.21933045669361112, 1.0059400036327044, 0.037123016459841826, 0.7012125331303456, 0.26151102706155244, 0.996974857436452, 1.015674589401682, 0.8062689252813637, 0.19364537506757645, 0.9984278622914652, 0.0010817203275097131, 0.9999977007198548, 0.18577258269661645, 0.4118974067166783, 0.04948859784950849, 0.3532724523411067, 1.0025405851959532, 1.01371565445135, 0.9954241434583396, 0.9996362578315716, 0.9998849939823544, 0.12863306671828342, 0.871335892413134, 1.0009358704846572, 0.173445145658753, 0.15431516635815523, 0.2282844196537999, 0.015303983440478204, 0.42851153633338973, 1.002134176336321, 1.0019425209210107, 1.0015257115166294, 1.0020296440461827, 1.0049939151191807, 0.999226374716775, 1.016623648809222, 0.8083074350844822, 0.1812029854475103, 0.010658999143971193, 0.9077257267566716, 0.09302313232878288, 0.9965832407109539, 0.0033308263392745783, 1.015044362798621, 0.2713893252162624, 0.0017737864393219764, 0.7183835079254004, 0.008868932196609882, 1.016671036456952, 0.9990853752858047, 0.9976403011061133, 1.0108473780773517, 0.9967702417007733, 0.25922613892492796, 0.7412582154382237, 0.7668183939714278, 0.23357112000279123, 1.0015852850022597, 1.0006411854308133, 0.994609154384908, 1.0005640271595015, 0.9991212372615227, 1.0045577530997734, 0.26270253601177895, 0.004712153112318904, 0.6225932299651353, 0.10955755986141454, 0.9996520985264091, 0.9980803184972795, 1.0084611565240142, 1.00162379891798, 0.9986427757069144, 0.9986427757069144, 1.0005091162756583, 0.6712504681078707, 0.021049666247285145, 0.08263943045230464, 0.17073618178353506, 0.05457320878925778, 0.49488468856504153, 0.5053862204178806, 1.001492194160577, 0.9858814681125662, 0.10414700321344227, 0.000562956774126715, 0.8382426366746786, 0.057421590960924924, 1.0010156545741826, 0.08034238551665143, 0.02506682428119525, 0.701871079873467, 0.0674876038339872, 0.07777142918011859, 0.04820543130999086, 0.20714407555473321, 0.4457088816711395, 0.3473736323207184, 1.0014209709100976, 0.12584112080801532, 0.8742646287714748, 0.1723892106673033, 0.04900696624321331, 0.10147324775065344, 0.39897436047416013, 0.2352334379674239, 0.042664888258797475, 0.9932067647563306, 0.005791293088958196, 0.05795289845370587, 0.07451086944047897, 0.02365424426681872, 0.20579192512132288, 0.6374818829907645, 1.0007755628946304, 0.6602338062232384, 0.33843917797997936, 0.0011096366491146863, 1.0023826867553949, 0.9999576873533331, 1.0085376681652964, 0.9945839138848743, 0.3999332482978343, 0.05750113226599763, 0.5415405143260374, 0.985816871572579, 0.9989728251062879, 0.8868012510645178, 0.11312624085226702, 0.28080462181149807, 0.180801089043724, 0.07285025565864336, 0.3218656750009153, 0.05894247957835691, 0.08410893153316099, 0.7128739229988156, 0.05587633783302979, 0.09913543809085931, 0.13157976328423143, 0.10408530235280504, 0.12425687257621687, 0.024205884268094197, 0.22350099807540308, 0.03227451235745893, 0.49218631345124864, 1.0039508493017242, 0.9973376200259674, 0.9917755100704212, 1.0008489772567102, 1.0130278424290728, 1.0009353269977157, 0.05454879263991735, 0.7720040992259489, 0.02958578583859924, 0.11372036431711582, 0.028661230031143015, 0.9947735064409561, 0.9994789141236637, 1.0013334373216667, 1.0071682576053937, 0.9994653150761709, 1.0032355114072098, 0.9994695892513263, 1.0095609243193646, 0.23902684815255976, 0.01106605778484073, 0.7502787178122015, 0.10460069143359915, 0.7643896681686092, 0.13093373263366606, 0.993164551401052, 1.0001618816058508, 0.9982005826626376, 0.998356326353602, 0.9999982168480345, 0.3454712808508174, 0.6550333604662453, 0.05490168234956062, 0.9458062550219761, 0.999261478637513, 1.000627558447583, 1.0006211630678592, 1.0000909795004076, 0.2854028145013795, 0.7156801541303628, 0.14816288806774217, 0.581539335665888, 0.27039727072362946, 0.9994916702760843, 0.9976403011061133, 0.03238957049648319, 0.9676384185824352, 0.9990968743562912, 1.0016611368384045, 0.9999148882740937, 0.9988208532444242, 0.0010880401451464315, 0.9876139477037262, 0.9995279376177978, 1.0007192999071017, 0.990094636779714, 0.9999853071263717, 0.9986329333883989, 1.0002542360598377, 1.0014193039619503, 1.0005057022882557, 1.0006275584475832, 0.9951386254005163, 0.9999925519225272, 0.9983857909473398, 1.000262897017276, 1.0002409871672973, 0.37793939047167346, 0.25942181157811733, 0.20082145312519237, 0.1283940438013525, 0.033579980686507575, 0.7649652809435362, 0.044920241022591074, 0.12815480527033335, 0.0634168108554227, 0.9994653150761709, 0.987069556234111, 1.0020369026719562, 1.0221804358733566, 0.0009384201031114381, 0.011261041237337257, 0.9881563685763444, 1.0000045276503704, 0.13231335226632449, 0.35703602992500255, 0.08610868957014768, 0.4247678650137163, 0.0032717769599781813, 0.9962560843133562, 0.9983238477719665, 0.1796306533229101, 0.8202603284479789, 0.9910521751131566, 0.9992098855773622, 1.0057573076747972, 1.0014651739986393, 1.0014886119089899, 0.9979601532082236, 0.18435841062264777, 0.09237916020353934, 0.19595579437114405, 0.3603187157722465, 0.07838231774845762, 0.08838006235923028, 0.999880203127261, 0.06693007407065935, 0.9306467442205967, 0.04808337057147255, 0.9526517794473, 1.002030973531972, 0.00331305347045529, 0.9972290946070423, 0.177435506956986, 0.16538328384292658, 0.21560088015150752, 0.0006695679507810793, 0.44124527956473125, 1.00086534340246, 1.0005395061835862, 0.9994481889339254, 0.996753061846656, 0.999226374716775, 1.0013392557011045, 1.0002311739148295, 0.24329792756938104, 0.7565406985847897, 1.0001443969031854, 1.0014549606934426, 1.002695910740097, 0.15719131637197872, 0.07952031298817747, 0.763764866607379, 1.011254796984499, 1.0141440964044546, 0.9951415321555106, 0.9993026356676813, 0.006140351204473515, 0.9947368951247094, 1.0011448178844504, 1.0003366262442381, 0.12675373400959747, 0.8742279595661944, 0.9998454740815312, 0.9988211734293797, 0.9935209912421772, 0.2847602120159204, 0.22324950832388493, 0.3269122170840665, 0.16486117537763811, 0.00015611853728943003, 0.0014375918154015343, 0.11213216160131967, 0.06612922350847057, 0.025876652677227614, 0.10781938615511506, 0.6871688877619333, 1.0095609243193646, 0.357633236452221, 0.22942509508255687, 0.11905041698611671, 0.016869492285482124, 0.1455596191490172, 0.1320640253206315, 0.9977807347070573, 0.25081308921314205, 0.006203857330360405, 0.3341220305065532, 0.4085683184708781, 0.9966784165614112, 1.0003252989503384, 0.21799307214084385, 0.7820068937115985, 0.9862156898359846, 0.993832125113474, 0.9968082998847205, 0.9988847588621709, 0.00672339134409742, 0.9933810710903939, 1.0013908440628834, 0.004839160656301106, 0.9968670951980277, 0.9998130333838624, 1.000429602973139, 1.00022360662767, 0.3314742436182449, 0.16717831417268006, 0.07097872390521114, 0.11961896617527969, 0.087192137995234, 0.22338481635142593, 1.0001391055078048, 0.15473028939057212, 0.8445694962568729, 1.004568822934014, 0.07194160524921409, 0.9280467077148616, 1.001376194272381, 1.0009377260338959, 0.019448546497542563, 0.1479113141523632, 0.05681022792703223, 0.2845629434903596, 0.1704306837810967, 0.3209010172094523, 0.9979563528102225, 0.9844471196019204, 0.9996718594434738, 1.0013908440628836, 0.038099781439473235, 0.03902904440141161, 0.9208995952809264, 0.0018585259238767433, 0.06583450424323976, 0.9357904531717652, 0.9990954285457955, 0.9827072433276715, 0.01760072674616725, 0.11265711358094985, 0.08385273794945698, 0.07745176558690302, 0.37637717491817335, 0.029444472867748255, 0.10945662739967287, 0.13250012790486715, 0.07873196005941381, 1.0019828041819066, 0.06249208820956195, 0.042712482308370325, 0.010606455338320149, 0.18546963794305774, 0.21270242867658243, 0.48589031887709866, 0.13036540103023866, 0.8215145787747921, 0.047824263964897334, 1.001973527898049, 0.07531953900982874, 0.17435078474497395, 0.7504057775423678, 0.8992273810190391, 0.028396654137443342, 0.07414681913665762, 0.8586429488727729, 0.0752472212097388, 0.06700095039223318, 1.0003252989503384, 0.03702151584536962, 0.3709007420804623, 0.22487142957928216, 0.3139973010588757, 0.052789939260990015, 0.45535493546888456, 0.04504703175675497, 0.49985923190326903, 0.9993585317406111, 0.9952958799530846, 0.0029109132959268045, 0.9955323472069671, 0.9877247144787719, 1.0013882389103845, 0.36569655082690006, 0.14377249428361444, 0.033634849580111634, 0.05078202779742345, 0.1470700285561744, 0.044846466106815516, 0.09760701446777494, 0.11640295982136674, 1.0002694337329796, 0.003349115956743213, 0.9980365551094774, 1.0017289908647449, 0.9760041949986741, 0.3103782770476688, 0.24600656040766353, 0.11603309432561462, 0.12464332393988285, 0.0701118697161841, 0.1328435426201383, 0.5313995143144922, 0.22046413541900525, 0.06047288379743773, 0.18475180246776252, 0.0023808221967495167, 0.114013037190824, 0.1439558550389192, 0.7416605651605117, 0.999465315076171, 1.0013927971193366, 1.0001391055078048, 0.9948857178784988, 0.9995671933531528, 0.13653181432186606, 0.759783913287331, 0.10109607625359548, 0.002084455180486505, 0.9950963873287738, 0.0538321844367527, 0.007791500379003681, 0.027624410434649412, 0.910543067019021, 1.0130278424290728, 1.0005975450256461, 0.17640743728863104, 0.8240931376987143, 0.002553788491598062, 0.06384471228995156, 0.6307857574247213, 0.3026239362543704, 0.992188874144468, 0.9884815766401404, 0.010296683090001462, 0.9945839138848743, 1.0025984351861275, 1.0042474457703152, 1.0037254765851917, 0.9889425534945172, 0.9830352066079383, 0.9988865796595056, 0.9996147775179803, 0.9996700201141406, 0.9985412338550106, 0.001153287885789012, 0.08880316720575392, 0.9099441418875304, 1.0144755921625719, 0.9989744093068863, 1.0007801633732343, 0.9994998356841304, 1.0049939151191807, 1.002695910740097, 1.004655711499907, 1.0008367147420583, 0.44927237899635797, 0.034787152904166105, 0.29754118015903774, 0.21834489588785108, 0.9977112059534564, 1.0094489848470265, 1.0010156545741828, 0.024924849816761022, 0.9750601248316912, 1.004186793053418, 1.0005798401964825, 0.9971496630806549, 1.0003739201569268, 1.0059553495896525, 1.0055800796956034, 1.00409762267367, 0.25646367040880097, 0.23288080416431353, 0.19927521976591894, 0.3112938344272343, 0.9998656750204965, 0.9999558291461579, 1.0004042998736407, 1.0000744642529216, 0.9971416945630306, 0.9993081310884585, 0.9911902176792508, 0.8891608843393002, 0.11114511054241252, 0.10533708592044612, 0.04757158718987889, 0.847793643133913, 0.8390624460094054, 0.15964863837584362, 0.0009070945362263842, 0.16676845987803288, 0.06747856758070694, 0.7133448572817591, 0.052054894990831074, 0.06039769610047019, 0.20244412952194638, 0.707995215399956, 0.029080372196522684, 1.001179663815581, 0.9998728986657747, 0.06691071211994855, 0.7294002903625161, 0.13896840209527778, 0.06470486446764255, 0.06407491988180032, 0.09988149275692403, 0.8367430713976276, 0.9988505080957741, 1.0018272888887023, 1.0012172806109545, 0.9934328413379361, 0.999226374716775, 0.211088352838047, 0.18699674735109598, 0.1686412384086571, 0.4347961180740207, 0.04466369587831171, 0.779753690542192, 0.17679379618498386, 0.6341683049325444, 0.08463306446083316, 0.2811440839966033, 0.997942943463598, 0.9991634530057764, 0.08826481604300081, 0.22262348046401315, 0.6266801939053057, 0.06276609140835614, 0.062080661946752595, 0.16097660016425383, 0.611422333359296, 0.16530780913728307, 0.9099923722332994, 0.08788088329978903, 0.04226295155869416, 0.9574744542780022, 1.0012202601909006, 0.997249205730104, 0.004257610774851228, 0.9962809213151873, 0.10822648041199179, 0.8904087706622961, 0.0009838770946544706, 1.0026205682471117, 1.000004298154379, 0.11444890739216483, 0.8843779207576373, 0.9861315550104968, 1.0172741707760735, 0.1200713198864822, 0.1255066471241419, 0.528709104026897, 0.05781211698238032, 0.16800102370948128, 0.02281823285846895, 0.5114623413886089, 0.22317344820112314, 0.017809352474902593, 0.22456480386322492, 0.9994127880746112, 0.1522311144617772, 0.8478427347107315, 1.0094489848470265, 1.0023542669177257, 0.2533702410532868, 0.709893197906056, 0.03309791437182576, 0.0022826147842638454, 1.0130278424290728, 1.0017583269414387, 1.0003852632989712, 0.9978557369560386, 0.1883032749580242, 0.8128027438061551, 0.9991269457919673, 0.993164551401052, 0.6822010954851757, 0.13170476680733326, 0.1849786050664793, 0.9879414768992439, 1.0072106344900016, 0.043562059464529325, 0.19862224732041348, 0.09594025001116578, 0.3739076770705434, 0.03630171622044111, 0.2510004378670499, 1.0003549012797588, 0.9982918003237722, 0.9953610976136485, 0.045583888267649524, 0.9534629962650024, 1.0000772023980196, 1.0014043985177068, 0.9953610976136485, 0.2511725737495178, 0.2538234716255022, 0.1789356066289441, 0.31545684724213846, 0.0006627244689960892, 0.9981395824672362, 0.9998383194676624, 0.10731073954597727, 0.8942561628831439, 1.0023542669177257, 0.98576036302879, 0.002088475345399979, 0.010442376726999894, 1.0025405851959532, 0.9998001481159805, 1.0005213258558743, 0.33378796806096955, 0.19102732999008645, 0.3392264685589079, 0.005438500497938404, 0.13052401195052168, 1.003195053603506, 0.995604759144052, 0.9998199521346894, 0.984423063573938, 0.9959327546059459, 1.0085795197437992, 0.9961695252849555, 0.004369164584583138, 0.09680030877897128, 0.0020166730995619018, 0.90145287550417, 0.9784928023462637, 0.27078565809291133, 0.07049023480513883, 0.025789110294562986, 0.5642084241110502, 0.04527421585045502, 0.023210199265106687, 1.0042474457703152, 0.08790169260378938, 0.07936578443771893, 0.0917156090184166, 0.07954739950508212, 0.3919253153697882, 0.10878742535055752, 0.10352058839702469, 0.05720874621940838, 1.0005136827313446, 0.9955899206112452, 0.07603130881045521, 0.39844255503200576, 0.5254822102596018, 0.9995568334542988, 0.0711499189001523, 0.9285064416469877, 0.35066452838786877, 0.6497218242960134, 1.0012202601909006, 0.9960857973181266, 0.10099313640440453, 0.8994105732618669, 1.0042474457703152, 0.003500416007534892, 0.042004992090418705, 0.9556135700570255, 0.139849298619032, 0.04488989832215842, 0.16286975929706196, 0.0892042851273661, 0.31422928825510893, 0.000575511516950749, 0.1703514090174217, 0.07769405478835112, 0.9830352066079383, 1.000782133673109, 0.9987466795783208, 0.680900216068683, 0.11417958633462578, 0.09816659556818436, 0.10652119944632771, 0.9497059813683963, 0.04984272526330591, 0.997486726291253, 1.0011259505391505, 1.0001883427938532, 0.99970825754459, 0.9965343317475016, 0.046821058285525956, 0.9153057864837133, 0.0385585185880802, 1.0029461345742736, 1.001463742462123, 0.998531880565944, 0.9995368618897629, 0.9935185658817397, 1.0023030726195032, 0.5890654996434337, 0.097012270712791, 0.06642281598353257, 0.15294727364629213, 0.09439031745028313, 0.9997045439365588, 0.7486978124905728, 0.15361005199725805, 0.09676223747858775, 0.9979563528102225, 0.9953610976136485, 0.9926628220696108, 1.0024051362384638, 0.9987285040766569, 0.9988635858582318, 0.9995568334542987, 0.591510282647303, 0.4077645352717578, 1.000926188118343, 1.0009358704846572, 0.00282644624495468, 0.997735524469002, 0.9998199521346894, 0.8362171475891724, 0.16342457350466702, 1.0000454269292594, 0.9991069702080033, 0.9994653150761709, 1.0001074379057464, 0.9987019669753873, 0.9916339699369271, 0.008853874731579706, 0.995604759144052, 0.9968774810774548, 1.0019177062717592, 0.9952958799530844, 1.0078450327366728, 0.9943769165595225, 0.00504759856121585, 0.7649377322510628, 0.23316283817278385, 0.0017818195782239418, 0.08374552017652527, 0.9140734436288822, 1.0004291650118762, 0.8773617021384521, 0.1213959587864525, 0.0013794995316642328, 0.9987466795783209, 1.0026531203067888, 1.0004559728978695, 0.003079636476567878, 0.9978022184079924, 0.05054955804885311, 0.9492083678062417, 1.0001201580965042, 0.9910521751131566, 0.040216871562063355, 0.06166586972849714, 0.8981767982194149, 1.0002796374411036, 1.0013640417087168, 1.002695910740097, 1.0025405851959532, 0.7157429703195609, 0.038034650596691644, 0.08990008322854388, 0.05947236275119057, 0.0670792928705289, 0.029736181375595284, 0.16234039186010155, 0.0786264006160036, 0.16627171189090173, 0.13528365988341795, 0.10730191142889903, 0.35011873686067485, 1.0166119848926394, 0.14900234217859, 0.3211904035062513, 0.0688752245310645, 0.1186563274099527, 0.047394337672366164, 0.0006819329161491534, 0.2939130868602851, 0.00891138183357436, 0.989163383526754, 0.9999258664447198, 0.14261288176213696, 0.10268127486873863, 0.7558482733393259, 1.01371565445135, 0.997888712149221, 0.9994576571052332, 0.14951134279995998, 0.13170121419056036, 0.02437175493917843, 0.05671119899308826, 0.19309928913349061, 0.4445501838425142, 0.9983961743566053], \"Term\": [\"absolut\", \"absolut\", \"absolut\", \"abstract\", \"academ\", \"accept\", \"accept\", \"accept\", \"accept\", \"access\", \"access\", \"access\", \"access\", \"accid\", \"address\", \"address\", \"address\", \"administr\", \"administr\", \"administr\", \"administr\", \"aero\", \"agenc\", \"agenc\", \"agent\", \"aid\", \"alaska\", \"alexia\", \"alink\", \"altitud\", \"amend\", \"american\", \"american\", \"american\", \"amherst\", \"andi\", \"andrew\", \"andrew\", \"annual\", \"annual\", \"anonym\", \"anonym\", \"anonym\", \"anti\", \"anti\", \"anti\", \"anybodi\", \"anybodi\", \"apana\", \"appl\", \"appl\", \"appl\", \"appletalk\", \"applic\", \"applic\", \"arab\", \"argic\", \"argument\", \"argument\", \"argument\", \"armenia\", \"armenian\", \"armi\", \"armi\", \"arrog\", \"artist\", \"asham\", \"assert\", \"associ\", \"associ\", \"associ\", \"assumpt\", \"atheism\", \"atheist\", \"atlas\", \"attack\", \"attack\", \"attest\", \"audio\", \"austin\", \"auto\", \"auto\", \"avail\", \"avail\", \"avail\", \"avenu\", \"axi\", \"azerbaijan\", \"azerbaijani\", \"backup\", \"bacteria\", \"bailey\", \"baku\", \"ban\", \"bank\", \"bank\", \"bank\", \"base\", \"base\", \"base\", \"base\", \"base\", \"base\", \"base\", \"basebal\", \"basebal\", \"batteri\", \"baud\", \"bcstec\", \"behanna\", \"behanna\", \"belief\", \"believ\", \"believ\", \"benevol\", \"berkeley\", \"berkeley\", \"berkeley\", \"bernoulli\", \"bibl\", \"biblic\", \"bibliographi\", \"bigboot\", \"bike\", \"biker\", \"bio\", \"bit\", \"bloom\", \"blue\", \"blue\", \"blue\", \"bmerh\", \"board\", \"board\", \"board\", \"bogus\", \"bois\", \"bomb\", \"book\", \"book\", \"book\", \"boot\", \"bosnian\", \"boston\", \"bottleneck\", \"brake\", \"brand\", \"brandt\", \"brave\", \"brian\", \"brian\", \"broward\", \"buffalo\", \"buffalo\", \"bure\", \"bureaucrat\", \"burk\", \"buy\", \"buy\", \"cabl\", \"cager\", \"calendar\", \"callback\", \"calstat\", \"canada\", \"canada\", \"canada\", \"canada\", \"cancer\", \"candida\", \"car\", \"car\", \"carb\", \"card\", \"career\", \"case\", \"case\", \"case\", \"case\", \"case\", \"case\", \"case\", \"cathol\", \"caus\", \"caus\", \"caus\", \"caus\", \"caus\", \"caus\", \"center\", \"center\", \"center\", \"center\", \"center\", \"centri\", \"chan\", \"chang\", \"chang\", \"chang\", \"chang\", \"chang\", \"chang\", \"channel\", \"channel\", \"chicago\", \"chicago\", \"children\", \"children\", \"children\", \"chip\", \"chip\", \"chip\", \"chris\", \"chris\", \"christ\", \"christian\", \"church\", \"circuit\", \"civilian\", \"claim\", \"claim\", \"claim\", \"clamp\", \"clark\", \"clayton\", \"clearer\", \"cleveland\", \"cleveland\", \"client\", \"clinic\", \"clinton\", \"clipper\", \"cloth\", \"coat\", \"code\", \"code\", \"coloni\", \"color\", \"color\", \"columbia\", \"columbia\", \"columbia\", \"communion\", \"comp\", \"compil\", \"compil\", \"complain\", \"complain\", \"compress\", \"comput\", \"comput\", \"comput\", \"conclus\", \"conclus\", \"congress\", \"connect\", \"connect\", \"connect\", \"connector\", \"conscienc\", \"consid\", \"consid\", \"consid\", \"consid\", \"consid\", \"consid\", \"consid\", \"consid\", \"constitut\", \"constitut\", \"contact\", \"contact\", \"contradict\", \"control\", \"control\", \"control\", \"control\", \"convert\", \"cool\", \"copi\", \"copi\", \"copi\", \"copi\", \"copi\", \"cost\", \"cost\", \"cost\", \"couldn\", \"couldn\", \"countri\", \"countri\", \"coupl\", \"coupl\", \"coupl\", \"coupl\", \"coupl\", \"cours\", \"cours\", \"cours\", \"cours\", \"cours\", \"cours\", \"cours\", \"court\", \"court\", \"coventri\", \"covington\", \"craig\", \"cramer\", \"crime\", \"crime\", \"crucifi\", \"cruiser\", \"crux\", \"crypt\", \"crypto\", \"cryptolog\", \"cure\", \"cview\", \"cwru\", \"cycl\", \"cycl\", \"dalhousi\", \"daryl\", \"data\", \"data\", \"data\", \"data\", \"data\", \"david\", \"david\", \"david\", \"david\", \"david\", \"david\", \"davidian\", \"debug\", \"decvax\", \"default\", \"defens\", \"defens\", \"deficit\", \"definit\", \"definit\", \"definit\", \"den\", \"denomin\", \"dens\", \"depriv\", \"design\", \"design\", \"design\", \"design\", \"design\", \"detector\", \"detroit\", \"devic\", \"devic\", \"devil\", \"diagnos\", \"diagnosi\", \"diagram\", \"dialog\", \"diamond\", \"differ\", \"differ\", \"differ\", \"differ\", \"differ\", \"differ\", \"differ\", \"digex\", \"digex\", \"directori\", \"disarm\", \"disclaim\", \"disclaim\", \"disclaim\", \"diseas\", \"disk\", \"disk\", \"disobey\", \"display\", \"distribut\", \"distribut\", \"distribut\", \"distribut\", \"distribut\", \"distribut\", \"divin\", \"divis\", \"divis\", \"divis\", \"dock\", \"doctrin\", \"dog\", \"dorothi\", \"dose\", \"dragon\", \"dri\", \"drink\", \"drive\", \"driver\", \"driver\", \"drug\", \"dscomsa\", \"dseg\", \"dude\", \"duke\", \"duke\", \"dutch\", \"earth\", \"earth\", \"eat\", \"electron\", \"electron\", \"elementari\", \"email\", \"email\", \"email\", \"encrypt\", \"enforc\", \"engin\", \"engin\", \"engr\", \"entri\", \"escrow\", \"escrow\", \"esdi\", \"etern\", \"evas\", \"evid\", \"evid\", \"evil\", \"exampl\", \"exampl\", \"exampl\", \"exampl\", \"exist\", \"exist\", \"exist\", \"face\", \"face\", \"face\", \"face\", \"fact\", \"fact\", \"fact\", \"fact\", \"faith\", \"fan\", \"feder\", \"federalist\", \"feel\", \"feel\", \"feel\", \"feel\", \"file\", \"final\", \"final\", \"final\", \"final\", \"final\", \"finland\", \"firearm\", \"fiscal\", \"fist\", \"flash\", \"flight\", \"flight\", \"floppi\", \"fluid\", \"flyer\", \"follow\", \"follow\", \"follow\", \"follow\", \"follow\", \"follow\", \"font\", \"food\", \"footbal\", \"forc\", \"forc\", \"forc\", \"forc\", \"forc\", \"ford\", \"format\", \"format\", \"franklin\", \"freeman\", \"freenet\", \"friend\", \"friend\", \"friend\", \"friend\", \"frontier\", \"function\", \"function\", \"game\", \"gari\", \"gari\", \"gatech\", \"gaza\", \"gear\", \"general\", \"general\", \"general\", \"general\", \"general\", \"general\", \"geneva\", \"genocid\", \"german\", \"gibson\", \"glad\", \"glad\", \"glad\", \"goal\", \"goal\", \"goal\", \"goddess\", \"gonna\", \"good\", \"good\", \"good\", \"good\", \"good\", \"good\", \"good\", \"gordon\", \"gover\", \"govern\", \"govern\", \"graphic\", \"gray\", \"greec\", \"greek\", \"greenbelt\", \"gretzki\", \"grin\", \"grip\", \"group\", \"group\", \"group\", \"group\", \"group\", \"guidelin\", \"guitar\", \"gun\", \"hadn\", \"hallam\", \"halv\", \"hamburg\", \"hand\", \"hand\", \"hand\", \"hand\", \"hand\", \"handgun\", \"handler\", \"happen\", \"happen\", \"happen\", \"hard\", \"hard\", \"hard\", \"hard\", \"hard\", \"health\", \"health\", \"hear\", \"hear\", \"hear\", \"hear\", \"heaven\", \"helmet\", \"helmet\", \"henri\", \"henri\", \"heresi\", \"high\", \"high\", \"high\", \"high\", \"high\", \"histori\", \"histori\", \"histori\", \"histori\", \"hockey\", \"holi\", \"homicid\", \"homosexu\", \"honda\", \"hook\", \"hors\", \"hous\", \"hous\", \"hull\", \"hulman\", \"human\", \"human\", \"human\", \"hurt\", \"hurt\", \"hussein\", \"hypocrisi\", \"hypothet\", \"ieee\", \"illeg\", \"illinoi\", \"imag\", \"imag\", \"impair\", \"includ\", \"includ\", \"includ\", \"includ\", \"includ\", \"includ\", \"infal\", \"infant\", \"infect\", \"infin\", \"inform\", \"inform\", \"inform\", \"ingr\", \"init\", \"inject\", \"innoc\", \"innoc\", \"instal\", \"instal\", \"instal\", \"institut\", \"institut\", \"institut\", \"insur\", \"insur\", \"interest\", \"interest\", \"interest\", \"interest\", \"interest\", \"interest\", \"interest\", \"intermitt\", \"internet\", \"internet\", \"internet\", \"introduct\", \"irrit\", \"islam\", \"islam\", \"isra\", \"isra\", \"israel\", \"issu\", \"issu\", \"issu\", \"issu\", \"jacob\", \"jade\", \"jagr\", \"jesus\", \"jew\", \"jewish\", \"jewish\", \"job\", \"john\", \"john\", \"john\", \"john\", \"john\", \"jose\", \"journal\", \"jpeg\", \"jumper\", \"kansa\", \"kean\", \"keen\", \"keith\", \"keith\", \"keith\", \"key\", \"key\", \"kill\", \"kill\", \"kilroy\", \"king\", \"king\", \"king\", \"king\", \"kinsey\", \"koresh\", \"koufax\", \"krillean\", \"ksand\", \"laboratori\", \"laboratori\", \"land\", \"land\", \"laptop\", \"launch\", \"launchpad\", \"leaf\", \"leagu\", \"leather\", \"leav\", \"leav\", \"leav\", \"leav\", \"legal\", \"legisl\", \"lemon\", \"lethal\", \"libertarian\", \"liberti\", \"librari\", \"life\", \"life\", \"life\", \"life\", \"life\", \"light\", \"light\", \"lindro\", \"liner\", \"list\", \"list\", \"list\", \"list\", \"literatur\", \"littl\", \"littl\", \"littl\", \"littl\", \"littl\", \"littl\", \"live\", \"live\", \"live\", \"livesey\", \"lock\", \"lock\", \"long\", \"long\", \"long\", \"long\", \"long\", \"long\", \"lord\", \"lord\", \"lose\", \"lose\", \"lose\", \"lose\", \"lose\", \"loui\", \"love\", \"love\", \"love\", \"luke\", \"lunar\", \"lutheran\", \"lynx\", \"machin\", \"machin\", \"machin\", \"madam\", \"magnus\", \"mail\", \"mail\", \"make\", \"make\", \"make\", \"make\", \"make\", \"make\", \"manag\", \"manag\", \"manag\", \"manag\", \"mark\", \"mark\", \"mark\", \"mark\", \"mark\", \"mark\", \"marlin\", \"marriag\", \"marvel\", \"massacr\", \"mauric\", \"maxtor\", \"mayb\", \"mayb\", \"mayb\", \"mayb\", \"mayb\", \"meaning\", \"medic\", \"medicin\", \"megabyt\", \"mein\", \"melbourn\", \"mellon\", \"memoir\", \"memori\", \"memori\", \"memori\", \"messag\", \"messag\", \"messag\", \"meyer\", \"michael\", \"mickey\", \"microsoft\", \"midway\", \"mike\", \"mike\", \"mile\", \"mile\", \"militia\", \"milk\", \"minnesota\", \"mission\", \"mode\", \"mode\", \"model\", \"model\", \"model\", \"modem\", \"mogilni\", \"monitor\", \"monitor\", \"mono\", \"montreal\", \"moon\", \"moral\", \"moral\", \"mosqu\", \"motherboard\", \"motif\", \"moto\", \"motorcycl\", \"motorola\", \"mous\", \"movement\", \"murder\", \"muscl\", \"musicb\", \"muslim\", \"myer\", \"myrto\", \"nasa\", \"nation\", \"nation\", \"nation\", \"nation\", \"nation\", \"natur\", \"natur\", \"natur\", \"natur\", \"nazi\", \"nctu\", \"nearest\", \"neccessari\", \"netcom\", \"netcom\", \"netcom\", \"network\", \"news\", \"news\", \"news\", \"news\", \"newsgroup\", \"newsgroup\", \"newslett\", \"newsread\", \"newsread\", \"niel\", \"nodak\", \"nore\", \"notion\", \"nuclear\", \"null\", \"number\", \"number\", \"number\", \"number\", \"number\", \"number\", \"occupi\", \"offens\", \"offens\", \"ohio\", \"ohio\", \"okcforum\", \"onlin\", \"onlin\", \"opinion\", \"opinion\", \"opinion\", \"opinion\", \"opinion\", \"optilink\", \"oracl\", \"orbit\", \"ottoman\", \"ouch\", \"outlet\", \"output\", \"packag\", \"packag\", \"pain\", \"palestinian\", \"panther\", \"paper\", \"paper\", \"paper\", \"partnership\", \"passer\", \"passion\", \"patch\", \"patent\", \"patent\", \"patient\", \"patrick\", \"peac\", \"peac\", \"penalti\", \"penguin\", \"pentium\", \"peopl\", \"peopl\", \"peopl\", \"peopl\", \"peopl\", \"period\", \"period\", \"period\", \"period\", \"period\", \"period\", \"perpetr\", \"person\", \"person\", \"person\", \"person\", \"person\", \"person\", \"philadelphia\", \"phone\", \"phone\", \"phone\", \"phone\", \"photoshop\", \"physician\", \"pick\", \"pick\", \"pinout\", \"piss\", \"pistol\", \"pitch\", \"pitt\", \"pitt\", \"pixmap\", \"planet\", \"planet\", \"play\", \"player\", \"playoff\", \"point\", \"point\", \"point\", \"point\", \"point\", \"point\", \"polygon\", \"popul\", \"popul\", \"porsch\", \"port\", \"port\", \"portal\", \"postscript\", \"power\", \"power\", \"power\", \"power\", \"power\", \"power\", \"powerpc\", \"practition\", \"presid\", \"preview\", \"price\", \"price\", \"price\", \"price\", \"printer\", \"printer\", \"prism\", \"privat\", \"privat\", \"probabl\", \"probabl\", \"probabl\", \"probabl\", \"probabl\", \"probabl\", \"probabl\", \"probabl\", \"probe\", \"problem\", \"problem\", \"problem\", \"problem\", \"problem\", \"problem\", \"program\", \"program\", \"program\", \"prohibit\", \"project\", \"project\", \"project\", \"propos\", \"propos\", \"propos\", \"protect\", \"protect\", \"protect\", \"protein\", \"provid\", \"provid\", \"provid\", \"provid\", \"provid\", \"public\", \"public\", \"public\", \"pull\", \"pump\", \"purdu\", \"purdu\", \"pwiseman\", \"quadra\", \"question\", \"question\", \"question\", \"question\", \"question\", \"question\", \"question\", \"question\", \"radar\", \"random\", \"random\", \"ranger\", \"rapist\", \"read\", \"read\", \"read\", \"read\", \"read\", \"read\", \"reason\", \"reason\", \"reason\", \"reason\", \"reason\", \"receiv\", \"receiv\", \"receiv\", \"regret\", \"regul\", \"reilli\", \"reinstal\", \"religion\", \"rememb\", \"rememb\", \"rememb\", \"rememb\", \"renam\", \"repli\", \"repli\", \"repli\", \"repli\", \"reproduct\", \"republican\", \"request\", \"request\", \"research\", \"research\", \"research\", \"research\", \"resiz\", \"resourc\", \"resourc\", \"rethink\", \"revok\", \"revolut\", \"revolv\", \"ribbon\", \"richer\", \"rid\", \"ride\", \"rider\", \"ripem\", \"robert\", \"robert\", \"robert\", \"robertson\", \"rock\", \"rocket\", \"roger\", \"rooki\", \"roster\", \"roth\", \"routin\", \"run\", \"run\", \"run\", \"run\", \"rwing\", \"safeguard\", \"sage\", \"sale\", \"sale\", \"salmon\", \"sandvik\", \"santa\", \"satellit\", \"savag\", \"savior\", \"scanner\", \"scienc\", \"scienc\", \"scienc\", \"scienc\", \"score\", \"screen\", \"scriptur\", \"scsi\", \"seagat\", \"season\", \"secreci\", \"secret\", \"secret\", \"section\", \"section\", \"section\", \"secur\", \"secur\", \"secur\", \"sell\", \"sell\", \"sell\", \"sell\", \"send\", \"send\", \"send\", \"send\", \"serdar\", \"server\", \"servic\", \"servic\", \"servic\", \"servic\", \"ship\", \"ship\", \"ship\", \"shuttl\", \"signatur\", \"simm\", \"slaveri\", \"slump\", \"small\", \"small\", \"small\", \"small\", \"smith\", \"smith\", \"smith\", \"softwar\", \"softwar\", \"softwar\", \"solar\", \"soldier\", \"sound\", \"sound\", \"sound\", \"sound\", \"sourc\", \"sourc\", \"sourc\", \"sourc\", \"soviet\", \"soviet\", \"space\", \"space\", \"spacecraft\", \"spanish\", \"spec\", \"spec\", \"speed\", \"speed\", \"speed\", \"spencer\", \"spirit\", \"sport\", \"sport\", \"spreadsheet\", \"stake\", \"start\", \"start\", \"start\", \"start\", \"start\", \"state\", \"state\", \"state\", \"state\", \"state\", \"static\", \"station\", \"station\", \"statut\", \"steer\", \"stop\", \"stop\", \"stop\", \"stop\", \"strain\", \"stream\", \"string\", \"stroke\", \"stupid\", \"stupid\", \"subscrib\", \"subscript\", \"summari\", \"summari\", \"summari\", \"sunlight\", \"sunni\", \"support\", \"support\", \"support\", \"support\", \"support\", \"support\", \"surfac\", \"svga\", \"sweat\", \"switch\", \"switch\", \"symptom\", \"syndrom\", \"sysop\", \"talk\", \"talk\", \"talk\", \"talk\", \"talk\", \"talon\", \"tamu\", \"tape\", \"tape\", \"tast\", \"teach\", \"teach\", \"teach\", \"teal\", \"team\", \"technic\", \"technolog\", \"technolog\", \"technolog\", \"technolog\", \"technolog\", \"telescop\", \"telnet\", \"temperatur\", \"tender\", \"tenn\", \"tennesse\", \"territori\", \"territori\", \"texa\", \"texa\", \"texa\", \"thai\", \"thing\", \"thing\", \"thing\", \"thing\", \"thing\", \"thing\", \"thrower\", \"time\", \"time\", \"time\", \"time\", \"time\", \"time\", \"time\", \"time\", \"titan\", \"tobacco\", \"today\", \"today\", \"today\", \"toni\", \"topic\", \"topic\", \"toronto\", \"toronto\", \"torqu\", \"toyota\", \"trade\", \"trade\", \"tranquil\", \"treatment\", \"treatment\", \"treatment\", \"tri\", \"tri\", \"tri\", \"tri\", \"tri\", \"tri\", \"tri\", \"tri\", \"trivia\", \"troop\", \"truck\", \"true\", \"true\", \"true\", \"true\", \"truth\", \"truth\", \"turbo\", \"turk\", \"turkey\", \"turkish\", \"turkiy\", \"turn\", \"turn\", \"turn\", \"uart\", \"uchicago\", \"udel\", \"uiuc\", \"ukan\", \"umich\", \"understand\", \"understand\", \"understand\", \"understand\", \"understand\", \"univ\", \"unix\", \"unix\", \"unix\", \"unplug\", \"unsaf\", \"uokmax\", \"uoknor\", \"upenn\", \"upgrad\", \"urbana\", \"user\", \"user\", \"utexa\", \"utkvm\", \"vehicl\", \"vehicl\", \"venus\", \"version\", \"version\", \"video\", \"viewer\", \"villag\", \"virginia\", \"virtu\", \"visual\", \"visual\", \"vitamin\", \"voltag\", \"vram\", \"vulcan\", \"wallac\", \"warrant\", \"warrant\", \"wasn\", \"wasn\", \"water\", \"water\", \"water\", \"watt\", \"weapon\", \"weapon\", \"weapon\", \"wear\", \"weren\", \"widget\", \"william\", \"william\", \"win\", \"win\", \"window\", \"windshield\", \"wing\", \"wing\", \"wing\", \"wire\", \"wiretap\", \"wong\", \"worcest\", \"word\", \"word\", \"word\", \"word\", \"word\", \"word\", \"work\", \"work\", \"work\", \"work\", \"work\", \"work\", \"workgroup\", \"world\", \"world\", \"world\", \"world\", \"world\", \"world\", \"world\", \"wors\", \"wors\", \"worship\", \"wouldn\", \"wouldn\", \"wouldn\", \"xcopyarea\", \"xlib\", \"xterm\", \"year\", \"year\", \"year\", \"year\", \"year\", \"year\", \"yeast\"]}, \"R\": 30, \"lambda.step\": 0.01, \"plot.opts\": {\"xlab\": \"PC1\", \"ylab\": \"PC2\"}, \"topic.order\": [4, 9, 5, 6, 10, 2, 7, 1, 8, 3]};\n", - "\n", - "function LDAvis_load_lib(url, callback){\n", - " var s = document.createElement('script');\n", - " s.src = url;\n", - " s.async = true;\n", - " s.onreadystatechange = s.onload = callback;\n", - " s.onerror = function(){console.warn(\"failed to load library \" + url);};\n", - " document.getElementsByTagName(\"head\")[0].appendChild(s);\n", - "}\n", - "\n", - "if(typeof(LDAvis) !== \"undefined\"){\n", - " // already loaded: just create the visualization\n", - " !function(LDAvis){\n", - " new LDAvis(\"#\" + \"ldavis_el15587112430946968420164328\", ldavis_el15587112430946968420164328_data);\n", - " }(LDAvis);\n", - "}else if(typeof define === \"function\" && define.amd){\n", - " // require.js is available: use it to load d3/LDAvis\n", - " require.config({paths: {d3: \"https://cdnjs.cloudflare.com/ajax/libs/d3/3.5.5/d3.min\"}});\n", - " require([\"d3\"], function(d3){\n", - " window.d3 = d3;\n", - " LDAvis_load_lib(\"https://cdn.rawgit.com/bmabey/pyLDAvis/files/ldavis.v1.0.0.js\", function(){\n", - " new LDAvis(\"#\" + \"ldavis_el15587112430946968420164328\", ldavis_el15587112430946968420164328_data);\n", - " });\n", - " });\n", - "}else{\n", - " // require.js not available: dynamically load d3 & LDAvis\n", - " LDAvis_load_lib(\"https://cdnjs.cloudflare.com/ajax/libs/d3/3.5.5/d3.min.js\", function(){\n", - " LDAvis_load_lib(\"https://cdn.rawgit.com/bmabey/pyLDAvis/files/ldavis.v1.0.0.js\", function(){\n", - " new LDAvis(\"#\" + \"ldavis_el15587112430946968420164328\", ldavis_el15587112430946968420164328_data);\n", - " })\n", - " });\n", - "}\n", - "</script>" - ], - "text/plain": [ - "<IPython.core.display.HTML object>" - ] - }, - "execution_count": 31, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "# Mallet\n", - "p = visualize_topics(model_mallet, bow_corpus, dictionary, model_type='mallet')\n", - "p" - ] - }, - { - "cell_type": "code", - "execution_count": 23, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "# Save the pyldavis as HTML\n", - "from nautilus_nlp.models.topic_modeling import save_pyldavis" - ] - }, - { - "cell_type": "code", - "execution_count": 24, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "save_pyldavis(p, '/Users/williamjaubert/Documents/Allianz_William/', 'pyldavis_test_func')" - ] - }, - { - "cell_type": "code", - "execution_count": 27, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "# Load the pyldavis HTML\n", - "from nautilus_nlp.models.topic_modeling import show_pyldavis" - ] - }, - { - "cell_type": "code", - "execution_count": 26, - "metadata": { - "collapsed": true - }, - "outputs": [ - { - "data": { - "text/html": [ - "\n", - "<link rel=\"stylesheet\" type=\"text/css\" href=\"https://cdn.rawgit.com/bmabey/pyLDAvis/files/ldavis.v1.0.0.css\">\n", - "\n", - "\n", - "<div id=\"ldavis_el591011124069819927707340541\"></div>\n", - "<script type=\"text/javascript\">\n", - "\n", - "var ldavis_el591011124069819927707340541_data = {\"mdsDat\": {\"x\": [-0.07866945427665124, -0.01699948489792914, 0.20896689238873523, 0.14744605031212607, -0.008849073212760983, -0.04505413872814077, -0.08949897686453376, 0.10780299734830809, 0.004524270451044093, -0.22966908252019716], \"y\": [-0.15170611822961017, -0.1504468301902949, 0.08013685816591506, 0.13647834612774523, -0.009046128981188077, 0.003906923765221535, 0.14472746444813225, -0.07737607739594787, -0.1051004751701791, 0.1284260374602061], \"topics\": [1, 2, 3, 4, 5, 6, 7, 8, 9, 10], \"cluster\": [1, 1, 1, 1, 1, 1, 1, 1, 1, 1], \"Freq\": [13.179347038269043, 12.924742698669434, 12.465522766113281, 11.996149063110352, 9.560138702392578, 9.471930503845215, 8.926163673400879, 7.8803582191467285, 7.02661657333374, 6.569023609161377]}, \"tinfo\": {\"Category\": [\"Default\", \"Default\", \"Default\", \"Default\", \"Default\", \"Default\", \"Default\", \"Default\", \"Default\", \"Default\", \"Default\", \"Default\", \"Default\", \"Default\", \"Default\", \"Default\", \"Default\", \"Default\", \"Default\", \"Default\", \"Default\", \"Default\", \"Default\", \"Default\", \"Default\", \"Default\", \"Default\", \"Default\", \"Default\", \"Default\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\"], \"Freq\": [2966.0, 1940.0, 1924.0, 1689.0, 2638.0, 2884.0, 1860.0, 1161.0, 1997.0, 1477.0, 1274.0, 1016.0, 1577.0, 1423.0, 1059.0, 1331.0, 1142.0, 2600.0, 837.0, 1391.0, 6052.0, 742.0, 990.0, 784.0, 1802.0, 1023.0, 4004.0, 867.0, 1191.0, 747.0, 1141.7806396484375, 697.88427734375, 406.7251281738281, 375.1473693847656, 365.11944580078125, 324.8642883300781, 317.2684326171875, 293.6634521484375, 242.85263061523438, 242.56858825683594, 238.5181884765625, 222.63047790527344, 219.19569396972656, 497.40509033203125, 182.86300659179688, 189.0499267578125, 180.7320556640625, 167.57565307617188, 170.02467346191406, 162.42880249023438, 156.00514221191406, 152.95489501953125, 147.39271545410156, 144.92861938476562, 143.97406005859375, 142.5141143798828, 139.98184204101562, 137.23757934570312, 111.6092529296875, 111.33480834960938, 296.39483642578125, 234.70761108398438, 534.3711547851562, 227.28517150878906, 733.2534790039062, 290.5158386230469, 1027.5731201171875, 194.4586944580078, 462.1385803222656, 638.6304321289062, 382.9510498046875, 556.9410400390625, 270.836669921875, 346.2899169921875, 2339.156005859375, 353.3161926269531, 956.0157470703125, 1366.4423828125, 488.9396667480469, 1502.5341796875, 432.1164245605469, 423.58416748046875, 945.9664306640625, 647.218505859375, 868.762451171875, 843.017578125, 679.0517578125, 535.9990234375, 452.12701416015625, 627.1972045898438, 723.6101684570312, 487.4131164550781, 627.0872802734375, 480.17083740234375, 485.80718994140625, 520.3949584960938, 438.9589538574219, 1273.7509765625, 843.0744018554688, 687.5490112304688, 378.0928649902344, 599.49951171875, 284.1490173339844, 264.89508056640625, 257.6834716796875, 233.3529052734375, 198.52938842773438, 196.5380859375, 186.40451049804688, 185.75604248046875, 190.4610595703125, 160.6652069091797, 157.19314575195312, 147.49737548828125, 143.9265899658203, 141.27682495117188, 132.94015502929688, 132.69456481933594, 136.24981689453125, 134.07119750976562, 122.38124084472656, 117.65129089355469, 110.72013092041016, 103.34630584716797, 103.80403137207031, 102.60269165039062, 191.14974975585938, 1897.33984375, 734.1270141601562, 595.287353515625, 628.0527954101562, 206.76734924316406, 246.9275360107422, 800.1103515625, 749.0331420898438, 336.11505126953125, 271.7132873535156, 265.6830749511719, 397.9759216308594, 574.263427734375, 250.1382293701172, 378.815185546875, 461.7101745605469, 1507.0093994140625, 256.83978271484375, 577.0333251953125, 989.0523071289062, 369.24951171875, 600.8649291992188, 735.2048950195312, 547.226806640625, 671.4481811523438, 658.2610473632812, 983.5562133789062, 1571.339111328125, 640.5230712890625, 527.4468994140625, 1108.9169921875, 876.3516845703125, 725.7343139648438, 862.0634155273438, 662.431396484375, 745.1685791015625, 665.753662109375, 603.1578979492188, 671.9922485351562, 613.3507690429688, 579.6978759765625, 513.6331176757812, 478.697998046875, 261.2860107421875, 304.5064392089844, 182.0912628173828, 164.47610473632812, 158.48814392089844, 152.05868530273438, 137.89083862304688, 135.1747589111328, 117.29756927490234, 101.5453109741211, 100.56036376953125, 94.57755279541016, 94.09120178222656, 92.84423065185547, 88.50360870361328, 85.07716369628906, 77.8897705078125, 76.20620727539062, 74.78276062011719, 76.93145751953125, 66.28211975097656, 65.84783172607422, 62.6032600402832, 61.643402099609375, 56.68076705932617, 56.65744400024414, 56.483177185058594, 56.252906799316406, 433.4509582519531, 57.65077209472656, 175.38478088378906, 811.8549194335938, 352.3771057128906, 460.9055480957031, 1244.601806640625, 397.80743408203125, 319.1280822753906, 364.2165832519531, 817.3186645507812, 179.1452178955078, 759.4246826171875, 353.8927307128906, 768.0062255859375, 704.1742553710938, 1031.2420654296875, 338.7886962890625, 853.2907104492188, 1558.8812255859375, 1291.53564453125, 922.5413208007812, 1345.7596435546875, 471.8685607910156, 490.1439208984375, 677.5836181640625, 1059.2960205078125, 853.371337890625, 843.8799438476562, 1006.7838745117188, 803.6088256835938, 784.7322387695312, 584.7684936523438, 572.9198608398438, 507.78826904296875, 934.9744873046875, 496.57794189453125, 583.3226318359375, 623.9882202148438, 588.1378784179688, 615.0081176757812, 528.20361328125, 511.33087158203125, 511.8083801269531, 866.59033203125, 316.7350769042969, 249.30372619628906, 229.90980529785156, 228.7428741455078, 211.5573272705078, 183.0348663330078, 166.19662475585938, 164.79638671875, 155.5634765625, 157.90318298339844, 359.6986083984375, 133.47061157226562, 124.17569732666016, 122.316650390625, 117.04086303710938, 111.26261901855469, 110.83892059326172, 109.1672592163086, 103.2135009765625, 98.91744995117188, 514.7843017578125, 89.63079833984375, 82.75098419189453, 81.71863555908203, 103.2540054321289, 75.26065826416016, 75.21710205078125, 70.78661346435547, 69.3476791381836, 281.7891540527344, 311.1296081542969, 971.294189453125, 208.02467346191406, 697.1555786132812, 367.6167297363281, 1416.345947265625, 441.6514587402344, 604.5531616210938, 578.907958984375, 377.5320129394531, 192.01060485839844, 648.3541870117188, 1969.95458984375, 938.596435546875, 446.4309387207031, 632.3701782226562, 658.6392822265625, 1989.91748046875, 746.844970703125, 677.8211669921875, 282.1589050292969, 467.3360290527344, 480.8250427246094, 1420.011962890625, 633.149169921875, 1121.6416015625, 955.3305053710938, 821.8895874023438, 1270.0303955078125, 524.9111328125, 1015.944580078125, 611.8392944335938, 745.4418334960938, 688.5404663085938, 667.2193603515625, 692.5394897460938, 593.0941162109375, 527.0477905273438, 546.2659301757812, 266.1635437011719, 171.10794067382812, 155.6239776611328, 226.90951538085938, 131.5675506591797, 110.65044403076172, 109.72305297851562, 476.2783203125, 123.80803680419922, 96.53874206542969, 90.70281219482422, 86.92076873779297, 84.76178741455078, 84.683349609375, 83.14109802246094, 249.0670928955078, 73.45060729980469, 70.67398071289062, 70.31317138671875, 68.84266662597656, 66.71842193603516, 65.88937377929688, 60.61496353149414, 60.299964904785156, 59.60258483886719, 59.442161560058594, 59.145503997802734, 58.31914138793945, 57.82154846191406, 57.423213958740234, 405.08648681640625, 341.47369384765625, 190.9191131591797, 246.2603759765625, 163.53012084960938, 257.4788513183594, 138.4282684326172, 165.1016082763672, 521.0703125, 1046.3909912109375, 1401.0023193359375, 228.18516540527344, 286.6700439453125, 343.28363037109375, 185.7610626220703, 229.6707305908203, 175.074462890625, 332.49884033203125, 163.83180236816406, 539.723876953125, 256.24749755859375, 439.7876892089844, 517.6013793945312, 403.5384826660156, 229.64816284179688, 866.3922729492188, 846.759033203125, 313.158447265625, 322.8583068847656, 286.9349365234375, 653.4288330078125, 749.9511108398438, 426.6536560058594, 380.0589294433594, 366.8407287597656, 372.0916748046875, 408.5104064941406, 415.6706237792969, 394.1766357421875, 394.4267578125, 349.5382080078125, 362.40155029296875, 340.808349609375, 296.16046142578125, 297.5443420410156, 494.8436584472656, 746.194580078125, 324.79425048828125, 301.5485534667969, 243.8285369873047, 158.12664794921875, 107.40505981445312, 95.04991912841797, 99.33280944824219, 91.02439880371094, 88.6642837524414, 79.35138702392578, 77.837158203125, 76.30526733398438, 74.57151794433594, 68.70978546142578, 66.97795867919922, 65.4818344116211, 64.81551361083984, 62.9178466796875, 62.10234832763672, 61.07172393798828, 61.08311080932617, 58.716949462890625, 57.748966217041016, 57.54390335083008, 57.412330627441406, 53.53644561767578, 53.10344696044922, 81.06087493896484, 466.5129089355469, 629.9894409179688, 272.5233154296875, 229.85595703125, 524.6031494140625, 169.13986206054688, 106.4736328125, 468.3924255371094, 321.2161865234375, 72.88867950439453, 215.71841430664062, 420.2349548339844, 255.02392578125, 239.02398681640625, 170.43710327148438, 161.87730407714844, 350.9423522949219, 510.4275207519531, 280.5064697265625, 480.16314697265625, 199.71388244628906, 294.50860595703125, 258.12945556640625, 376.6604919433594, 510.116455078125, 1114.61083984375, 256.1866149902344, 426.7527770996094, 319.7099304199219, 739.28173828125, 280.38397216796875, 489.42193603515625, 542.8736572265625, 517.7899780273438, 617.5950317382812, 513.4124755859375, 436.72442626953125, 491.1626281738281, 506.85968017578125, 460.4228515625, 441.4096374511719, 394.3690185546875, 351.4322509765625, 347.85174560546875, 353.2395324707031, 337.03509521484375, 274.97705078125, 206.25440979003906, 205.88706970214844, 185.46702575683594, 142.32943725585938, 138.4519500732422, 125.20697021484375, 124.93755340576172, 113.30398559570312, 111.32567596435547, 109.37814331054688, 105.70201110839844, 106.32189178466797, 292.8650207519531, 101.51443481445312, 98.15642547607422, 98.08124542236328, 96.688720703125, 95.23130798339844, 93.90516662597656, 90.93041229248047, 90.10682678222656, 204.03321838378906, 83.50547790527344, 83.1707992553711, 82.09012603759766, 80.0595703125, 80.03185272216797, 78.97164154052734, 77.4714584350586, 624.7915649414062, 218.5322723388672, 299.7547607421875, 218.30796813964844, 189.66859436035156, 356.61126708984375, 202.45262145996094, 416.956787109375, 238.6123046875, 212.24911499023438, 149.82693481445312, 211.92662048339844, 303.8810119628906, 120.30801391601562, 237.628173828125, 454.8601379394531, 333.9891357421875, 980.4944458007812, 485.3978576660156, 911.3460083007812, 590.2308959960938, 261.1946716308594, 253.11302185058594, 366.61309814453125, 366.9202880859375, 261.4228515625, 595.406494140625, 533.9457397460938, 533.9599609375, 583.47607421875, 307.19378662109375, 439.3268737792969, 370.1156311035156, 337.7350158691406, 344.1394348144531, 325.0244140625, 340.1333923339844, 337.7405090332031, 350.025146484375, 294.61376953125, 276.2976989746094, 278.626953125, 1160.65234375, 424.52520751953125, 361.9087219238281, 388.7334289550781, 255.14059448242188, 223.3458709716797, 186.77297973632812, 150.9017333984375, 148.35372924804688, 142.3341522216797, 778.6029052734375, 125.934814453125, 122.35879516601562, 113.49314880371094, 110.9784164428711, 117.08515930175781, 97.77255249023438, 95.13446807861328, 154.00491333007812, 85.83687591552734, 85.79811096191406, 83.88481903076172, 83.05354309082031, 81.01181030273438, 86.69019317626953, 72.2069091796875, 70.93242645263672, 66.0419921875, 65.32259368896484, 61.589271545410156, 631.8587646484375, 967.0912475585938, 392.3902893066406, 86.90055847167969, 116.69065856933594, 384.3917541503906, 954.828125, 325.44622802734375, 153.9778594970703, 168.00970458984375, 886.02734375, 877.259521484375, 327.1088562011719, 468.2386169433594, 329.3564758300781, 302.24896240234375, 346.5186767578125, 350.18585205078125, 277.6599426269531, 424.3641662597656, 266.8429870605469, 331.9565124511719, 578.17333984375, 328.296630859375, 429.8065490722656, 517.4179077148438, 400.8412170410156, 346.21722412109375, 433.2587890625, 421.34136962890625, 338.8642883300781, 347.50665283203125, 348.3670654296875, 336.53314208984375, 398.4556579589844, 299.90478515625, 164.68971252441406, 151.29721069335938, 134.82589721679688, 134.8407440185547, 128.82469177246094, 120.21800231933594, 119.83185577392578, 103.71044921875, 93.07451629638672, 105.74777221679688, 91.14122772216797, 88.90278625488281, 86.50234985351562, 83.21115112304688, 82.5744857788086, 76.65482330322266, 73.94358825683594, 137.486328125, 73.60121154785156, 73.44850158691406, 297.8765869140625, 71.537841796875, 71.537841796875, 71.39191436767578, 68.6223373413086, 70.66267395019531, 67.06273651123047, 64.6351318359375, 137.61058044433594, 330.04791259765625, 498.7896423339844, 418.3139343261719, 321.71234130859375, 192.31024169921875, 436.83538818359375, 120.46820068359375, 101.74191284179688, 189.6998748779297, 107.90703582763672, 180.33082580566406, 406.5956726074219, 219.30587768554688, 311.1242370605469, 276.8919677734375, 364.6730651855469, 122.64595794677734, 431.6532897949219, 148.9232177734375, 478.1828308105469, 448.573486328125, 560.2838134765625, 235.4400634765625, 220.1329345703125, 237.02713012695312, 526.0250854492188, 310.5745544433594, 195.26043701171875, 465.158203125, 342.7765808105469, 343.9803161621094, 252.5526123046875, 252.3756866455078, 359.45233154296875, 365.1446533203125, 297.1376953125, 278.9319763183594, 264.31353759765625, 271.8553161621094, 267.05078125, 258.78143310546875, 836.6797485351562, 741.5901489257812, 348.0262145996094, 262.59930419921875, 234.66685485839844, 225.6525115966797, 214.5906982421875, 197.1658935546875, 176.15512084960938, 163.69117736816406, 159.65298461914062, 156.5215606689453, 155.51637268066406, 147.13583374023438, 143.75466918945312, 151.88540649414062, 140.51809692382812, 133.0145721435547, 131.76170349121094, 122.347900390625, 118.6324234008789, 115.60749816894531, 112.3785629272461, 112.19926452636719, 111.77244567871094, 119.0841293334961, 102.04837799072266, 93.4240493774414, 92.21881866455078, 89.70394897460938, 218.3953094482422, 151.76768493652344, 955.2220458984375, 178.90740966796875, 1383.801025390625, 160.94491577148438, 191.5231170654297, 221.7088623046875, 157.22250366210938, 1290.4215087890625, 920.5602416992188, 312.7351989746094, 622.9597778320312, 397.6490173339844, 455.3349914550781, 379.85693359375, 351.6811828613281, 356.8952331542969, 374.7598876953125, 212.77105712890625, 346.5650634765625, 312.73516845703125, 333.0689392089844, 335.98138427734375, 600.1721801757812, 295.3842468261719, 283.5966491699219, 250.0905303955078, 267.1750183105469, 330.6051940917969, 357.9386901855469, 262.105224609375, 242.04666137695312], \"Term\": [\"window\", \"game\", \"christian\", \"team\", \"drive\", \"file\", \"space\", \"encrypt\", \"govern\", \"chip\", \"jesus\", \"israel\", \"card\", \"play\", \"secur\", \"nasa\", \"armenian\", \"program\", \"isra\", \"imag\", \"peopl\", \"hockey\", \"player\", \"clipper\", \"public\", \"disk\", \"year\", \"scsi\", \"driver\", \"bike\", \"armenian\", \"turkish\", \"turk\", \"turkey\", \"armenia\", \"koresh\", \"nazi\", \"militia\", \"serdar\", \"argic\", \"genocid\", \"davidian\", \"troop\", \"murder\", \"mormon\", \"prison\", \"massacr\", \"azeri\", \"ethnic\", \"azerbaijani\", \"hitler\", \"iran\", \"zuma\", \"sdpa\", \"motto\", \"azerbaijan\", \"extermin\", \"sera\", \"urartu\", \"slaughter\", \"villag\", \"batf\", \"greek\", \"greec\", \"jew\", \"soldier\", \"kill\", \"waco\", \"arm\", \"countri\", \"muslim\", \"children\", \"armi\", \"popul\", \"peopl\", \"anti\", \"govern\", \"right\", \"attack\", \"say\", \"polit\", \"death\", \"state\", \"live\", \"go\", \"come\", \"tell\", \"happen\", \"forc\", \"world\", \"time\", \"nation\", \"want\", \"leav\", \"start\", \"year\", \"take\", \"jesus\", \"bibl\", \"atheist\", \"atheism\", \"christ\", \"scriptur\", \"cathol\", \"sandvik\", \"doctrin\", \"revel\", \"biblic\", \"satan\", \"atho\", \"livesey\", \"prophet\", \"divin\", \"vers\", \"gospel\", \"sabbath\", \"god\", \"sin\", \"resurrect\", \"solntz\", \"testament\", \"theolog\", \"propheci\", \"theist\", \"schneider\", \"jaeger\", \"marriag\", \"christian\", \"church\", \"belief\", \"faith\", \"worship\", \"contradict\", \"moral\", \"religion\", \"lord\", \"heaven\", \"holi\", \"rutger\", \"truth\", \"spirit\", \"teach\", \"islam\", \"believ\", \"etern\", \"argument\", \"exist\", \"religi\", \"evid\", \"word\", \"love\", \"life\", \"claim\", \"mean\", \"peopl\", \"true\", \"accept\", \"say\", \"question\", \"reason\", \"thing\", \"person\", \"come\", \"good\", \"read\", \"time\", \"point\", \"follow\", \"motif\", \"widget\", \"xterm\", \"visual\", \"xlib\", \"polygon\", \"baalk\", \"contrib\", \"toolkit\", \"kelvin\", \"pyron\", \"suno\", \"deskjet\", \"xpert\", \"plaintext\", \"skndiv\", \"openwindow\", \"xview\", \"ether\", \"quicktim\", \"magellan\", \"utah\", \"greenbelt\", \"reilli\", \"ualberta\", \"copper\", \"ciphertext\", \"autom\", \"gradi\", \"dillon\", \"font\", \"handbook\", \"binari\", \"server\", \"client\", \"librari\", \"imag\", \"anonym\", \"compil\", \"resourc\", \"graphic\", \"map\", \"applic\", \"archiv\", \"user\", \"code\", \"avail\", \"directori\", \"sourc\", \"file\", \"mail\", \"list\", \"program\", \"function\", \"format\", \"email\", \"inform\", \"version\", \"softwar\", \"includ\", \"send\", \"data\", \"internet\", \"address\", \"display\", \"window\", \"copi\", \"access\", \"distribut\", \"thank\", \"look\", \"book\", \"group\", \"need\", \"scsi\", \"simm\", \"motherboard\", \"cach\", \"bio\", \"quadra\", \"diamond\", \"vram\", \"vesa\", \"centri\", \"swap\", \"upgrad\", \"char\", \"eisa\", \"intercon\", \"nubus\", \"ethernet\", \"svga\", \"amanda\", \"meg\", \"cadr\", \"mous\", \"maxtor\", \"config\", \"cica\", \"tiff\", \"adaptec\", \"powerbook\", \"ctrl\", \"esdi\", \"jumper\", \"floppi\", \"disk\", \"umich\", \"video\", \"modem\", \"card\", \"output\", \"monitor\", \"mode\", \"printer\", \"spec\", \"entri\", \"drive\", \"driver\", \"port\", \"instal\", \"memori\", \"window\", \"color\", \"appl\", \"byte\", \"screen\", \"board\", \"problem\", \"machin\", \"file\", \"thank\", \"control\", \"work\", \"speed\", \"need\", \"hard\", \"help\", \"program\", \"want\", \"time\", \"repli\", \"softwar\", \"distribut\", \"alaska\", \"spencer\", \"oracl\", \"dseg\", \"aurora\", \"nsmca\", \"engr\", \"launch\", \"uoknor\", \"callison\", \"kaldi\", \"zoolog\", \"mccall\", \"ucsc\", \"hallam\", \"lunar\", \"automot\", \"raider\", \"theodor\", \"dock\", \"shafer\", \"mksol\", \"hydro\", \"ssto\", \"plymouth\", \"redesign\", \"laughter\", \"rockwel\", \"desi\", \"stimulus\", \"moon\", \"henri\", \"mar\", \"job\", \"wheel\", \"billion\", \"invest\", \"spacecraft\", \"orbit\", \"nasa\", \"space\", \"shuttl\", \"satellit\", \"fund\", \"probe\", \"flight\", \"helmet\", \"station\", \"solar\", \"presid\", \"mission\", \"earth\", \"cost\", \"money\", \"vehicl\", \"year\", \"work\", \"project\", \"toronto\", \"spend\", \"go\", \"time\", \"engin\", \"long\", \"high\", \"power\", \"thing\", \"say\", \"look\", \"peopl\", \"program\", \"want\", \"need\", \"design\", \"build\", \"firearm\", \"bike\", \"motorcycl\", \"magnus\", \"rider\", \"honda\", \"veal\", \"utkvm\", \"centerlin\", \"cactus\", \"rkba\", \"harley\", \"shotgun\", \"pistol\", \"ranck\", \"boyl\", \"husc\", \"ifa\", \"smuggl\", \"fischer\", \"counterst\", \"armori\", \"trunk\", \"thomasp\", \"imak\", \"photographi\", \"concordia\", \"tennesse\", \"yamaha\", \"frost\", \"car\", \"ohio\", \"uchicago\", \"rid\", \"gun\", \"brake\", \"shaft\", \"cwru\", \"auto\", \"wagon\", \"handgun\", \"cleveland\", \"ride\", \"tire\", \"urbana\", \"midway\", \"insur\", \"uiuc\", \"dealer\", \"weapon\", \"iastat\", \"owner\", \"illinoi\", \"crime\", \"price\", \"state\", \"freenet\", \"sell\", \"buy\", \"good\", \"road\", \"drive\", \"right\", \"look\", \"peopl\", \"want\", \"case\", \"thing\", \"time\", \"go\", \"distribut\", \"repli\", \"engin\", \"opinion\", \"problem\", \"need\", \"gatech\", \"cub\", \"fnal\", \"prism\", \"hitter\", \"pitcher\", \"alomar\", \"uicvm\", \"higgin\", \"inning\", \"revolv\", \"hulman\", \"yanke\", \"pitch\", \"catcher\", \"dodger\", \"blast\", \"starter\", \"tiger\", \"met\", \"bat\", \"nore\", \"outlet\", \"rocki\", \"jay\", \"sdsu\", \"volt\", \"lopez\", \"restaur\", \"lamp\", \"wire\", \"duke\", \"circuit\", \"batteri\", \"brave\", \"basebal\", \"hit\", \"berkeley\", \"jason\", \"ball\", \"metal\", \"jeff\", \"grind\", \"larc\", \"indiana\", \"netcom\", \"colorado\", \"year\", \"run\", \"good\", \"game\", \"smith\", \"scott\", \"player\", \"home\", \"stanford\", \"look\", \"distribut\", \"go\", \"time\", \"lose\", \"come\", \"start\", \"play\", \"david\", \"best\", \"better\", \"power\", \"thing\", \"john\", \"sale\", \"great\", \"encrypt\", \"escrow\", \"privaci\", \"ripem\", \"crypto\", \"wiretap\", \"cryptographi\", \"cipher\", \"decrypt\", \"hamburg\", \"clipper\", \"homicid\", \"bontchev\", \"gtoal\", \"crypt\", \"clarkson\", \"rwing\", \"surveil\", \"nist\", \"sternlight\", \"den\", \"ncsl\", \"qualcomm\", \"fbihh\", \"cryptograph\", \"tampa\", \"mime\", \"vesselin\", \"lyme\", \"strnlght\", \"key\", \"secur\", \"enforc\", \"recipi\", \"classifi\", \"secret\", \"chip\", \"agenc\", \"patent\", \"scheme\", \"public\", \"govern\", \"algorithm\", \"protect\", \"propos\", \"administr\", \"privat\", \"clinton\", \"feder\", \"phone\", \"court\", \"devic\", \"number\", \"communic\", \"technolog\", \"inform\", \"provid\", \"author\", \"state\", \"right\", \"messag\", \"data\", \"peopl\", \"need\", \"diseas\", \"stratus\", \"dyer\", \"diet\", \"robi\", \"infect\", \"syndrom\", \"methodolog\", \"physician\", \"cure\", \"intellect\", \"einstein\", \"chopin\", \"candida\", \"sphere\", \"yeast\", \"chastiti\", \"halat\", \"therapi\", \"clinic\", \"migrain\", \"steveh\", \"patient\", \"catbyt\", \"dtmedin\", \"blah\", \"carlo\", \"superstit\", \"baerga\", \"homeopathi\", \"skeptic\", \"gordon\", \"pitt\", \"medic\", \"doctor\", \"medicin\", \"food\", \"cancer\", \"sleev\", \"ingr\", \"genet\", \"aid\", \"bank\", \"treatment\", \"water\", \"pain\", \"health\", \"handheld\", \"studi\", \"princeton\", \"caus\", \"effect\", \"scienc\", \"scientif\", \"rochest\", \"theori\", \"point\", \"result\", \"risk\", \"problem\", \"research\", \"case\", \"steve\", \"test\", \"time\", \"peopl\", \"repli\", \"take\", \"differ\", \"year\", \"say\", \"thing\", \"isra\", \"hockey\", \"playoff\", \"palestinian\", \"detroit\", \"leaf\", \"cramer\", \"optilink\", \"pen\", \"cunixb\", \"lebanes\", \"penguin\", \"clayton\", \"jake\", \"maynard\", \"espn\", \"edmonton\", \"ericsson\", \"boni\", \"lemieux\", \"gaza\", \"puck\", \"bruin\", \"selann\", \"laurentian\", \"quebec\", \"ramsey\", \"canuck\", \"shark\", \"uvic\", \"montreal\", \"flyer\", \"israel\", \"stanley\", \"team\", \"jet\", \"coach\", \"ranger\", \"winnipeg\", \"game\", \"play\", \"wing\", \"player\", \"columbia\", \"season\", \"leagu\", \"pittsburgh\", \"score\", \"arab\", \"mcgill\", \"goal\", \"virginia\", \"toronto\", \"andrew\", \"year\", \"divis\", \"canada\", \"period\", \"final\", \"point\", \"time\", \"american\", \"go\"], \"Total\": [2966.0, 1940.0, 1924.0, 1689.0, 2638.0, 2884.0, 1860.0, 1161.0, 1997.0, 1477.0, 1274.0, 1016.0, 1577.0, 1423.0, 1059.0, 1331.0, 1142.0, 2600.0, 837.0, 1391.0, 6052.0, 742.0, 990.0, 784.0, 1802.0, 1023.0, 4004.0, 867.0, 1191.0, 747.0, 1142.6856689453125, 698.7892456054688, 407.6301574707031, 376.0523376464844, 366.0244140625, 325.7693176269531, 318.1803283691406, 294.5684509277344, 243.75758361816406, 243.47354125976562, 239.42320251464844, 223.5354461669922, 220.10520935058594, 499.7329406738281, 183.76812744140625, 189.986083984375, 181.63705444335938, 168.4805908203125, 170.9480438232422, 163.333740234375, 156.91017150878906, 153.886962890625, 148.2976531982422, 145.83355712890625, 144.879150390625, 143.41905212402344, 140.88682556152344, 138.14251708984375, 112.51419830322266, 112.23980712890625, 299.66619873046875, 239.2371826171875, 575.1444702148438, 235.90956115722656, 846.7127075195312, 310.77874755859375, 1292.3048095703125, 203.61073303222656, 568.2711791992188, 904.836181640625, 498.23358154296875, 821.609130859375, 317.67413330078125, 442.3506164550781, 6052.24072265625, 470.10357666015625, 1997.324951171875, 3614.37890625, 771.2041015625, 4395.30419921875, 753.3086547851562, 728.9891967773438, 3490.1201171875, 1666.1630859375, 3510.617431640625, 3362.2998046875, 2458.740966796875, 1374.794921875, 910.3983154296875, 2752.224853515625, 5183.12158203125, 1404.2081298828125, 3617.91015625, 1561.89111328125, 1909.0416259765625, 4004.603515625, 1884.1224365234375, 1274.664794921875, 843.9874877929688, 688.462890625, 379.0060119628906, 601.0263671875, 285.0621643066406, 265.8124694824219, 258.5965270996094, 234.26597595214844, 199.44381713867188, 197.4620819091797, 187.31765747070312, 186.6690673828125, 191.4668731689453, 161.5784912109375, 158.11094665527344, 148.4104766845703, 144.83966064453125, 142.1898956298828, 133.85328674316406, 133.607666015625, 137.19871520996094, 135.05442810058594, 123.29427337646484, 118.56434631347656, 111.63320922851562, 104.25935363769531, 104.73915100097656, 103.52851104736328, 192.95652770996094, 1924.052490234375, 744.5303955078125, 604.3348999023438, 642.5186767578125, 209.473876953125, 250.68084716796875, 845.5989379882812, 828.3161010742188, 355.5079040527344, 287.7699890136719, 282.9315490722656, 442.10467529296875, 692.8697509765625, 269.93646240234375, 446.02288818359375, 578.7404174804688, 2561.57275390625, 282.8100891113281, 815.093017578125, 1699.812744140625, 474.28302001953125, 965.1755981445312, 1333.0074462890625, 902.1245727539062, 1251.440673828125, 1317.1837158203125, 2641.765625, 6052.24072265625, 1353.1533203125, 1006.899169921875, 4395.30419921875, 2872.2099609375, 1977.8988037109375, 3329.251220703125, 2055.943359375, 3362.2998046875, 3754.512451171875, 2277.26025390625, 5183.12158203125, 2646.850830078125, 1892.380859375, 514.5391235351562, 479.60406494140625, 262.1926574707031, 305.8974609375, 183.00523376464844, 165.38929748535156, 159.3942108154297, 152.96470642089844, 138.79685974121094, 136.08087158203125, 118.2038345336914, 102.45138549804688, 101.46646881103516, 95.48358917236328, 94.9975357055664, 93.75051879882812, 89.41075134277344, 85.98323059082031, 78.79640197753906, 77.11235046386719, 75.6888427734375, 77.9653091430664, 67.1884536743164, 66.7538833618164, 63.509578704833984, 62.54978561401367, 57.58708572387695, 57.563636779785156, 57.3893928527832, 57.15915298461914, 448.55657958984375, 58.58415985107422, 180.8949432373047, 872.5092163085938, 374.1332092285156, 496.03216552734375, 1391.68603515625, 441.02191162109375, 358.5589599609375, 426.19305419921875, 1054.7808837890625, 199.62811279296875, 1032.63037109375, 440.0619812011719, 1078.5040283203125, 1021.21630859375, 1669.5213623046875, 441.5232238769531, 1374.6883544921875, 2884.190673828125, 2375.445556640625, 1561.026611328125, 2600.153564453125, 691.944580078125, 736.2711791992188, 1159.4267578125, 2169.358642578125, 1621.3409423828125, 1630.9676513671875, 2103.4462890625, 1606.2760009765625, 1651.1109619140625, 1085.956787109375, 1067.5660400390625, 839.23681640625, 2966.81884765625, 872.6724853515625, 1443.4810791015625, 3039.01025390625, 2288.6611328125, 3375.223876953125, 1421.1317138671875, 1956.808349609375, 3517.246337890625, 867.5025024414062, 317.6472473144531, 250.21588134765625, 230.822021484375, 229.65501403808594, 212.469482421875, 183.94711303710938, 167.1087646484375, 165.7086639404297, 156.47564697265625, 158.841552734375, 362.0856628417969, 134.38279724121094, 125.08786010742188, 123.22889709472656, 117.95303344726562, 112.17479705810547, 111.7510986328125, 110.07952880859375, 104.12570190429688, 99.83139038085938, 519.8053588867188, 90.54296112060547, 83.66317749023438, 82.6308364868164, 104.47161102294922, 76.17282104492188, 76.12928771972656, 71.69883728027344, 70.25984191894531, 287.1429138183594, 317.7418212890625, 1023.19677734375, 213.9846954345703, 736.9693603515625, 385.20306396484375, 1577.9459228515625, 487.7285461425781, 681.551513671875, 651.6373901367188, 414.8818359375, 202.3636016845703, 773.6707763671875, 2638.341552734375, 1191.1107177734375, 521.547607421875, 771.9820556640625, 825.6704711914062, 2966.81884765625, 979.7251586914062, 877.64501953125, 316.5227966308594, 603.9163208007812, 656.5357666015625, 3254.719970703125, 1051.2142333984375, 2884.190673828125, 2288.6611328125, 1819.038330078125, 3998.41064453125, 901.28564453125, 3517.246337890625, 1391.8231201171875, 2348.69677734375, 2600.153564453125, 3617.91015625, 5183.12158203125, 2732.342529296875, 1630.9676513671875, 3039.01025390625, 267.0742492675781, 172.0186767578125, 156.53477478027344, 228.3336181640625, 132.47816467285156, 111.56108093261719, 110.63384246826172, 480.3006896972656, 124.95624542236328, 97.44942474365234, 91.61353302001953, 87.83140563964844, 85.67245483398438, 85.59416961669922, 84.05184936523438, 251.9625244140625, 74.36140441894531, 71.5853042602539, 71.22400665283203, 69.75337982177734, 67.62906646728516, 66.80011749267578, 61.52567672729492, 61.210594177246094, 60.51362609863281, 60.35288619995117, 60.056236267089844, 59.229862213134766, 58.732261657714844, 58.3338737487793, 416.04022216796875, 351.22491455078125, 197.7613983154297, 259.21063232421875, 170.8984832763672, 275.1896057128906, 144.3324737548828, 175.0106658935547, 593.0027465820312, 1331.6910400390625, 1860.989990234375, 257.6250915527344, 338.0062255859375, 441.3564453125, 216.25115966796875, 284.1476135253906, 205.7794952392578, 455.3014831542969, 191.24240112304688, 874.0391845703125, 344.76593017578125, 726.9601440429688, 1014.6715698242188, 862.6346435546875, 337.0456848144531, 4004.603515625, 3998.41064453125, 642.0369873046875, 701.0498657226562, 557.0301513671875, 3510.617431640625, 5183.12158203125, 1433.1673583984375, 1579.4356689453125, 1518.08154296875, 1785.505859375, 3329.251220703125, 4395.30419921875, 3375.223876953125, 6052.24072265625, 2600.153564453125, 3617.91015625, 3517.246337890625, 1000.7255249023438, 1483.91259765625, 495.9259948730469, 747.8888549804688, 325.7707214355469, 302.4598388671875, 245.07272338867188, 159.03866577148438, 108.3163070678711, 95.96115112304688, 100.31522369384766, 91.93561553955078, 89.57569122314453, 80.2626953125, 78.74849700927734, 77.21672058105469, 75.48271942138672, 69.6209945678711, 67.88932800292969, 66.39307403564453, 65.72957611083984, 63.82933807373047, 63.01356506347656, 61.98298645019531, 61.99775695800781, 59.62815475463867, 58.660850524902344, 58.45547103881836, 58.323734283447266, 54.44773483276367, 54.01467514038086, 82.45339965820312, 485.455078125, 668.6755981445312, 285.07806396484375, 240.7487335205078, 577.5048828125, 179.9601593017578, 111.24809265136719, 529.0847778320312, 357.6230773925781, 74.69509887695312, 242.41627502441406, 503.03863525390625, 297.51763916015625, 281.2916564941406, 192.39242553710938, 183.0908203125, 466.7659912109375, 750.9197387695312, 366.600341796875, 724.9913330078125, 250.3634796142578, 415.90521240234375, 353.12091064453125, 657.73046875, 1070.769775390625, 3490.1201171875, 395.6552429199219, 983.89306640625, 607.056640625, 3754.512451171875, 598.3618774414062, 2638.341552734375, 3614.37890625, 3375.223876953125, 6052.24072265625, 3617.91015625, 2113.316162109375, 3329.251220703125, 5183.12158203125, 3510.617431640625, 3039.01025390625, 2732.342529296875, 1433.1673583984375, 1407.93994140625, 3254.719970703125, 3517.246337890625, 275.8894958496094, 207.16677856445312, 206.80348205566406, 186.3794403076172, 143.24180603027344, 139.36428833007812, 126.11944580078125, 125.8499984741211, 114.2164306640625, 112.23802185058594, 110.29060363769531, 106.61448669433594, 107.27007293701172, 295.4941711425781, 102.42676544189453, 99.06878662109375, 98.99481201171875, 97.60137939453125, 96.14401245117188, 94.8175277709961, 91.84278869628906, 91.01932525634766, 206.16087341308594, 84.42133331298828, 84.08326721191406, 83.0025405883789, 80.97196197509766, 80.94422149658203, 79.88419342041016, 78.38389587402344, 639.207763671875, 227.35552978515625, 323.0017395019531, 231.70584106445312, 201.0164031982422, 428.85137939453125, 227.23008728027344, 525.593994140625, 277.059326171875, 257.5475158691406, 175.57948303222656, 283.9958801269531, 476.73712158203125, 133.42327880859375, 365.1600646972656, 1031.7481689453125, 640.5665283203125, 4004.603515625, 1280.0654296875, 3754.512451171875, 1940.3056640625, 488.2843322753906, 472.27227783203125, 990.3853759765625, 1023.18505859375, 516.35693359375, 3375.223876953125, 3039.01025390625, 3510.617431640625, 5183.12158203125, 818.4566650390625, 3362.2998046875, 1909.0416259765625, 1423.678955078125, 1658.632080078125, 1346.393798828125, 1717.5716552734375, 1785.505859375, 3329.251220703125, 1491.1873779296875, 990.3681030273438, 1542.396728515625, 1161.5667724609375, 425.4395751953125, 362.8358154296875, 389.9899597167969, 256.05499267578125, 224.26022338867188, 187.68853759765625, 151.81675720214844, 149.26809692382812, 143.24859619140625, 784.1885986328125, 126.84929656982422, 123.27316284179688, 114.40896606445312, 111.91240692138672, 118.12262725830078, 98.6883316040039, 96.04891967773438, 155.52407836914062, 86.7515869140625, 86.71247863769531, 84.7991943359375, 83.96793365478516, 81.92617797851562, 87.68406677246094, 73.12200164794922, 71.84886169433594, 66.95635223388672, 66.2371597290039, 62.503814697265625, 659.0949096679688, 1059.3629150390625, 429.3234558105469, 89.65412902832031, 124.41126251220703, 474.0597839355469, 1477.2554931640625, 430.520751953125, 178.88685607910156, 204.3247528076172, 1802.019287109375, 1997.324951171875, 534.64892578125, 906.0775756835938, 556.024169921875, 491.4239501953125, 613.6195678710938, 662.9179077148438, 470.1695251464844, 1022.0805053710938, 480.69464111328125, 730.8409423828125, 2365.4375, 763.007080078125, 1372.454345703125, 2169.358642578125, 1377.273681640625, 1170.2694091796875, 3490.1201171875, 3614.37890625, 1280.413818359375, 1651.1109619140625, 6052.24072265625, 3517.246337890625, 399.3816833496094, 300.8172912597656, 165.6021728515625, 152.21038818359375, 135.7383270263672, 135.75428771972656, 129.73992919921875, 121.13043975830078, 120.74485778808594, 104.6231460571289, 93.98695373535156, 106.80420684814453, 92.05374145507812, 89.81517791748047, 87.41483306884766, 84.12355041503906, 83.48693084716797, 77.58230590820312, 74.85601043701172, 139.18516540527344, 74.51407623291016, 74.36089324951172, 301.65814208984375, 72.4502182006836, 72.4502182006836, 72.30432891845703, 69.5348129272461, 71.61282348632812, 67.97527313232422, 65.5474853515625, 140.34677124023438, 354.6991271972656, 560.325927734375, 467.2398986816406, 372.57330322265625, 214.29714965820312, 528.391357421875, 128.8434295654297, 106.83519744873047, 215.34388732910156, 114.37532806396484, 206.88092041015625, 542.6390380859375, 263.99560546875, 416.1996765136719, 361.66558837890625, 544.8867797851562, 136.74913024902344, 864.7689819335938, 185.32183837890625, 1192.1806640625, 1098.416259765625, 1600.403076171875, 409.02203369140625, 366.54962158203125, 446.0751953125, 2646.850830078125, 941.828857421875, 342.37249755859375, 3254.719970703125, 1469.8829345703125, 2113.316162109375, 866.4751586914062, 975.6422729492188, 5183.12158203125, 6052.24072265625, 2732.342529296875, 1884.1224365234375, 2258.383544921875, 4004.603515625, 4395.30419921875, 3329.251220703125, 837.592041015625, 742.5023803710938, 348.9384460449219, 263.5115966796875, 235.57916259765625, 226.56475830078125, 215.50299072265625, 198.07823181152344, 177.06741333007812, 164.60345458984375, 160.56524658203125, 157.4338836669922, 156.4473419189453, 148.04823303222656, 144.6669921875, 152.85597229003906, 141.4331817626953, 133.9269561767578, 132.6742706298828, 123.26013946533203, 119.5447006225586, 116.5197525024414, 113.29080200195312, 113.11150360107422, 112.6846923828125, 120.06710052490234, 102.96061706542969, 94.33647918701172, 93.13108825683594, 90.6162338256836, 220.8243408203125, 153.70223999023438, 1016.828125, 185.55426025390625, 1689.23095703125, 167.16043090820312, 202.18853759765625, 240.0043182373047, 165.12567138671875, 1940.3056640625, 1423.678955078125, 399.81451416015625, 990.3853759765625, 559.1829833984375, 669.9990234375, 536.7244873046875, 505.73583984375, 528.174072265625, 572.368408203125, 254.2933349609375, 553.6107788085938, 544.26123046875, 701.0498657226562, 868.3087768554688, 4004.603515625, 693.3735961914062, 732.436279296875, 584.4656982421875, 822.2222900390625, 2646.850830078125, 5183.12158203125, 1242.119140625, 3510.617431640625], \"loglift\": [30.0, 29.0, 28.0, 27.0, 26.0, 25.0, 24.0, 23.0, 22.0, 21.0, 20.0, 19.0, 18.0, 17.0, 16.0, 15.0, 14.0, 13.0, 12.0, 11.0, 10.0, 9.0, 8.0, 7.0, 6.0, 5.0, 4.0, 3.0, 2.0, 1.0, 2.025700092315674, 2.0251998901367188, 2.0243000984191895, 2.0241000652313232, 2.0239999294281006, 2.023699998855591, 2.0236001014709473, 2.023400068283081, 2.0227999687194824, 2.0227999687194824, 2.022700071334839, 2.0225000381469727, 2.02239990234375, 2.021899938583374, 2.0216000080108643, 2.0216000080108643, 2.0215001106262207, 2.0211000442504883, 2.0211000442504883, 2.0209999084472656, 2.020699977874756, 2.020400047302246, 2.020400047302246, 2.0202999114990234, 2.0202999114990234, 2.02020001411438, 2.0201001167297363, 2.01990008354187, 2.018399953842163, 2.018399953842163, 2.015500068664551, 2.0074000358581543, 1.9529999494552612, 1.989300012588501, 1.882599949836731, 1.9591000080108643, 1.7972999811172485, 1.9804999828338623, 1.8198000192642212, 1.6780999898910522, 1.7633999586105347, 1.6376999616622925, 1.8669999837875366, 1.7817000150680542, 1.0758999586105347, 1.7409000396728516, 1.2897000312805176, 1.0537999868392944, 1.5707999467849731, 0.9531000256538391, 1.4707000255584717, 1.4836000204086304, 0.7210000157356262, 1.080899953842163, 0.6299999952316284, 0.6431000232696533, 0.739799976348877, 1.0845999717712402, 1.3265999555587769, 0.5475999712944031, 0.0575999990105629, 0.9684000015258789, 0.27399998903274536, 0.847000002861023, 0.6579999923706055, -0.014100000262260437, 0.5697000026702881, 2.045300006866455, 2.0448999404907227, 2.0446999073028564, 2.043600082397461, 2.0434999465942383, 2.042799949645996, 2.04259991645813, 2.0425000190734863, 2.042099952697754, 2.0413999557495117, 2.041300058364868, 2.041100025177002, 2.041100025177002, 2.040800094604492, 2.0404000282287598, 2.0401999950408936, 2.039900064468384, 2.0397000312805176, 2.039599895477295, 2.0392000675201416, 2.0392000675201416, 2.039099931716919, 2.0387001037597656, 2.038599967956543, 2.038300037384033, 2.0378000736236572, 2.0371999740600586, 2.037100076675415, 2.0369999408721924, 2.036600112915039, 2.0320000648498535, 2.0320000648498535, 2.030900001525879, 2.0232999324798584, 2.0329999923706055, 2.030900001525879, 1.9907000064849854, 1.9453999996185303, 1.98989999294281, 1.9886000156402588, 1.9831000566482544, 1.9408999681472778, 1.858299970626831, 1.9699000120162964, 1.882699966430664, 1.820099949836731, 1.5154999494552612, 1.9496999979019165, 1.700600028038025, 1.5045000314712524, 1.795699954032898, 1.572100043296814, 1.4509999752044678, 1.5461000204086304, 1.4234000444412231, 1.3523999452590942, 1.0579999685287476, 0.6974999904632568, 1.2980999946594238, 1.399399995803833, 0.6689000129699707, 0.859000027179718, 1.0434000492095947, 0.6948999762535095, 0.9135000109672546, 0.5393000245094299, 0.31619998812675476, 0.7174999713897705, 0.003100000089034438, 0.5838000178337097, 0.8629000186920166, 2.080399990081787, 2.0803000926971436, 2.078700065612793, 2.0776000022888184, 2.077199935913086, 2.07669997215271, 2.0764999389648438, 2.0762999057769775, 2.075700044631958, 2.075500011444092, 2.07450008392334, 2.0732998847961426, 2.073199987411499, 2.072700023651123, 2.0725998878479004, 2.072499990463257, 2.072000026702881, 2.0715999603271484, 2.0706000328063965, 2.0703999996185303, 2.070199966430664, 2.0689001083374023, 2.0685999393463135, 2.06850004196167, 2.0678000450134277, 2.0676000118255615, 2.0662999153137207, 2.0662999153137207, 2.0662999153137207, 2.066200017929077, 2.0478999614715576, 2.0660998821258545, 2.051300048828125, 2.010200023651123, 2.0223000049591064, 2.0088000297546387, 1.9704999923706055, 1.979099988937378, 1.9657000303268433, 1.9250999689102173, 1.8271000385284424, 1.9738999605178833, 1.774899959564209, 1.864300012588501, 1.7426999807357788, 1.7105000019073486, 1.6003999710083008, 1.8172999620437622, 1.605299949645996, 1.4668999910354614, 1.4729000329971313, 1.5562000274658203, 1.4235999584197998, 1.6993999481201172, 1.6753000020980835, 1.5450999736785889, 1.365399956703186, 1.4404000043869019, 1.42330002784729, 1.3453999757766724, 1.3896000385284424, 1.3382999897003174, 1.4631999731063843, 1.4598000049591064, 1.579800009727478, 0.9275000095367432, 1.518399953842163, 1.1761000156402588, 0.49900001287460327, 0.7233999967575073, 0.37959998846054077, 1.0924999713897705, 0.7401999831199646, 0.15469999611377716, 2.119499921798706, 2.1177000999450684, 2.1168999671936035, 2.1166000366210938, 2.1166000366210938, 2.116300106048584, 2.115600109100342, 2.1150999069213867, 2.1150999069213867, 2.1147000789642334, 2.1147000789642334, 2.114000082015991, 2.113800048828125, 2.113300085067749, 2.1131999492645264, 2.112799882888794, 2.1124000549316406, 2.1124000549316406, 2.112299919128418, 2.111799955368042, 2.1113998889923096, 2.1108999252319336, 2.1105000972747803, 2.109600067138672, 2.109499931335449, 2.1089000701904297, 2.1085000038146973, 2.1085000038146973, 2.107800006866455, 2.1075000762939453, 2.101799964904785, 2.099600076675415, 2.06850004196167, 2.0922999382019043, 2.065000057220459, 2.073899984359741, 2.012500047683716, 2.0213000774383545, 2.000699996948242, 2.00219988822937, 2.02620005607605, 2.0680999755859375, 1.9438999891281128, 1.8284000158309937, 1.8823000192642212, 1.9651000499725342, 1.9211000204086304, 1.8946000337600708, 1.7211999893188477, 1.8492000102996826, 1.8622000217437744, 2.00570011138916, 1.8641999959945679, 1.8091000318527222, 1.291100025177002, 1.6136000156402588, 1.1761000156402588, 1.246899962425232, 1.3260999917984009, 0.9736999869346619, 1.5800000429153442, 0.8787000179290771, 1.298699975013733, 0.9728999733924866, 0.7918000221252441, 0.4300999939441681, 0.10779999941587448, 0.5929999947547913, 0.9908999800682068, 0.4043999910354614, 2.3441998958587646, 2.3422999382019043, 2.3417000770568848, 2.3413000106811523, 2.3406999111175537, 2.339400053024292, 2.3392999172210693, 2.339200019836426, 2.3382999897003174, 2.338200092315674, 2.337599992752075, 2.337100028991699, 2.336899995803833, 2.336899995803833, 2.336699962615967, 2.3359999656677246, 2.335200071334839, 2.3348000049591064, 2.334700107574463, 2.334399938583374, 2.3340001106262207, 2.3338000774383545, 2.33270001411438, 2.3326001167297363, 2.33240008354187, 2.33240008354187, 2.3322999477386475, 2.3320999145507812, 2.331899881362915, 2.3317999839782715, 2.3208999633789062, 2.3194000720977783, 2.3124001026153564, 2.296299934387207, 2.303499937057495, 2.2809998989105225, 2.305799961090088, 2.289299964904785, 2.2183001041412354, 2.1064999103546143, 2.0636000633239746, 2.2262001037597656, 2.182800054550171, 2.096299886703491, 2.1956000328063965, 2.134700059890747, 2.186000108718872, 2.0332000255584717, 2.1928999423980713, 1.8654999732971191, 2.050800085067749, 1.8450000286102295, 1.6744999885559082, 1.5878000259399414, 1.9638999700546265, 0.8166999816894531, 0.7953000068664551, 1.6296000480651855, 1.5721999406814575, 1.6842000484466553, 0.6662999987602234, 0.41440001130104065, 1.1359000205993652, 0.9230999946594238, 0.927299976348877, 0.7792999744415283, 0.24959999322891235, -0.01080000028014183, 0.20020000636577606, -0.3831999897956848, 0.3409000039100647, 0.04670000076293945, 0.013500000350177288, 1.1299999952316284, 0.7407000064849854, 2.3547000885009766, 2.354599952697754, 2.353800058364868, 2.353800058364868, 2.3517000675201416, 2.351099967956543, 2.348400115966797, 2.3473000526428223, 2.3469998836517334, 2.34689998626709, 2.34660005569458, 2.345400094985962, 2.3452000617980957, 2.3450000286102295, 2.3447000980377197, 2.3436999320983887, 2.3433001041412354, 2.3429999351501465, 2.3427999019622803, 2.3424999713897705, 2.3422999382019043, 2.3420000076293945, 2.3420000076293945, 2.341399908065796, 2.341200113296509, 2.341099977493286, 2.341099977493286, 2.3399999141693115, 2.3397998809814453, 2.3397998809814453, 2.316999912261963, 2.2971999645233154, 2.311800003051758, 2.310499906539917, 2.2607998847961426, 2.294800043106079, 2.312999963760376, 2.234999895095825, 2.249500036239624, 2.33240008354187, 2.2402000427246094, 2.177000045776367, 2.202699899673462, 2.194000005722046, 2.2356998920440674, 2.2337000370025635, 2.0715999603271484, 1.9708000421524048, 2.089200019836426, 1.9448000192642212, 2.1308000087738037, 2.011699914932251, 2.0434999465942383, 1.799399971961975, 1.6153000593185425, 1.215399980545044, 1.9221999645233154, 1.5214999914169312, 1.7156000137329102, 0.7318000197410583, 1.5987999439239502, 0.6722000241279602, 0.460999995470047, 0.4821999967098236, 0.07450000196695328, 0.4043000042438507, 0.7800999879837036, 0.4431000053882599, 0.03189999982714653, 0.3253999948501587, 0.42750000953674316, 0.4212000072002411, 0.951200008392334, 0.9587000012397766, 0.13609999418258667, 0.011599999852478504, 2.412899971008301, 2.411799907684326, 2.4117000102996826, 2.41129994392395, 2.4098000526428223, 2.409600019454956, 2.408900022506714, 2.408900022506714, 2.4082000255584717, 2.4079999923706055, 2.407900094985962, 2.407599925994873, 2.4072999954223633, 2.4072000980377197, 2.4072000980377197, 2.406899929046631, 2.406899929046631, 2.4068000316619873, 2.406599998474121, 2.4065001010894775, 2.4061999320983887, 2.406100034713745, 2.4058001041412354, 2.4052999019622803, 2.4052999019622803, 2.405100107192993, 2.404900074005127, 2.4047999382019043, 2.4047000408172607, 2.4045000076293945, 2.393399953842163, 2.3766000270843506, 2.3415000438690186, 2.356600046157837, 2.358099937438965, 2.2316999435424805, 2.3006999492645264, 2.1846001148223877, 2.2667999267578125, 2.2227001190185547, 2.2576000690460205, 2.123500108718872, 1.96589994430542, 2.312700033187866, 1.9866000413894653, 1.5972000360488892, 1.7648999691009521, 1.0089999437332153, 1.4464999437332153, 1.0003999471664429, 1.226099967956543, 1.7905999422073364, 1.7925000190734863, 1.4223999977111816, 1.3906999826431274, 1.7354999780654907, 0.6812000274658203, 0.6772000193595886, 0.5329999923706055, 0.23199999332427979, 1.4362000226974487, 0.38100001215934753, 0.775600016117096, 0.977400004863739, 0.843500018119812, 0.9948999881744385, 0.7968999743461609, 0.7509999871253967, 0.16369999945163727, 0.7944999933242798, 1.1396000385284424, 0.7049999833106995, 2.5399999618530273, 2.538599967956543, 2.5381999015808105, 2.537600040435791, 2.5371999740600586, 2.5367000102996826, 2.535900115966797, 2.5348000526428223, 2.5346999168395996, 2.53439998626709, 2.533600091934204, 2.533600091934204, 2.533400058746338, 2.5327999591827393, 2.532399892807007, 2.5320000648498535, 2.5315001010894775, 2.5311999320983887, 2.5309998989105225, 2.5302000045776367, 2.5302000045776367, 2.5299999713897705, 2.5297999382019043, 2.529599905014038, 2.529400110244751, 2.5281999111175537, 2.5280001163482666, 2.5269999504089355, 2.526900053024292, 2.526099920272827, 2.4986000061035156, 2.449700117111206, 2.4507999420166016, 2.5095999240875244, 2.4767000675201416, 2.3310999870300293, 2.1043999195098877, 2.260999917984009, 2.390899896621704, 2.345099925994873, 1.830899953842163, 1.718000054359436, 2.049499988555908, 1.8805999755859375, 2.0171000957489014, 2.0546998977661133, 1.9694000482559204, 1.9026000499725342, 2.0141000747680664, 1.6618000268936157, 1.9522000551223755, 1.7516000270843506, 1.1319999694824219, 1.6973999738693237, 1.3797999620437622, 1.1074999570846558, 1.30649995803833, 1.3229000568389893, 0.4544000029563904, 0.39160001277923584, 1.2115000486373901, 0.9824000000953674, -0.3140999972820282, 0.1941000074148178, 2.65310001373291, 2.652400016784668, 2.649899959564209, 2.649399995803833, 2.648699998855591, 2.648699998855591, 2.648400068283081, 2.647900104522705, 2.647900104522705, 2.646699905395508, 2.645699977874756, 2.6454999446868896, 2.6454999446868896, 2.6452999114990234, 2.6449999809265137, 2.6445999145507812, 2.6445000171661377, 2.643399953842163, 2.643199920654297, 2.643199920654297, 2.6431000232696533, 2.6431000232696533, 2.6428000926971436, 2.6428000926971436, 2.6428000926971436, 2.6428000926971436, 2.6422998905181885, 2.6421000957489014, 2.641900062561035, 2.641400098800659, 2.6357998847961426, 2.583400011062622, 2.539099931716919, 2.5448999404907227, 2.508699893951416, 2.5471999645233154, 2.4651999473571777, 2.5882999897003174, 2.606600046157837, 2.528700113296509, 2.5971999168395996, 2.5181000232696533, 2.36680006980896, 2.4700000286102295, 2.364500045776367, 2.388400077819824, 2.2539000511169434, 2.546600103378296, 1.9606000185012817, 2.436800003051758, 1.7418999671936035, 1.7598999738693237, 1.6059000492095947, 2.1031999588012695, 2.1456000804901123, 2.023200035095215, 1.0397000312805176, 1.5461000204086304, 2.093899965286255, 0.7099999785423279, 1.1995999813079834, 0.8399999737739563, 1.422700047492981, 1.3033000230789185, -0.013100000098347664, -0.15240000188350677, 0.4366999864578247, 0.745199978351593, 0.510200023651123, -0.03449999913573265, -0.1454000025987625, 0.10090000182390213, 2.7216999530792236, 2.72160005569458, 2.7202000617980957, 2.7193000316619873, 2.718899965286255, 2.7188000679016113, 2.718600034713745, 2.7181999683380127, 2.717600107192993, 2.7172000408172607, 2.717099905014038, 2.7170000076293945, 2.7167999744415283, 2.716599941253662, 2.7165000438690186, 2.716399908065796, 2.7163000106811523, 2.7160000801086426, 2.71589994430542, 2.715399980545044, 2.715100049972534, 2.714900016784668, 2.7146999835968018, 2.7146999835968018, 2.7146999835968018, 2.714600086212158, 2.713900089263916, 2.713099956512451, 2.7130000591278076, 2.7126998901367188, 2.711699962615967, 2.710099935531616, 2.6603000164031982, 2.686300039291382, 2.523400068283081, 2.6849000453948975, 2.668600082397461, 2.6435000896453857, 2.673799991607666, 2.3148999214172363, 2.286799907684326, 2.4772000312805176, 2.259200096130371, 2.3819000720977783, 2.3366000652313232, 2.3770999908447266, 2.359499931335449, 2.3308000564575195, 2.299299955368042, 2.5445001125335693, 2.2544000148773193, 2.1686999797821045, 1.978600025177002, 1.773300051689148, 0.8248000144958496, 1.8695000410079956, 1.7740000486373901, 1.873900055885315, 1.5987000465393066, 0.6425999999046326, 0.05000000074505806, 1.1670000553131104, 0.04839999973773956], \"logprob\": [30.0, 29.0, 28.0, 27.0, 26.0, 25.0, 24.0, 23.0, 22.0, 21.0, 20.0, 19.0, 18.0, 17.0, 16.0, 15.0, 14.0, 13.0, 12.0, 11.0, 10.0, 9.0, 8.0, 7.0, 6.0, 5.0, 4.0, 3.0, 2.0, 1.0, -4.882199764251709, -5.374499797821045, -5.914400100708008, -5.995299816131592, -6.022299766540527, -6.139200210571289, -6.162799835205078, -6.240099906921387, -6.430099964141846, -6.431300163269043, -6.4481000900268555, -6.517099857330322, -6.532599925994873, -5.713200092315674, -6.713799953460693, -6.680600166320801, -6.725599765777588, -6.80109977722168, -6.786600112915039, -6.832300186157227, -6.872700214385986, -6.892399787902832, -6.929500102996826, -6.946300029754639, -6.952899932861328, -6.963099956512451, -6.981100082397461, -7.000899791717529, -7.207600116729736, -7.210000038146973, -6.230899810791016, -6.464200019836426, -5.641499996185303, -6.496399879455566, -5.325099945068359, -6.250899791717529, -4.987599849700928, -6.652400016784668, -5.7866997718811035, -5.463200092315674, -5.974699974060059, -5.600100040435791, -6.321100234985352, -6.075300216674805, -4.164999961853027, -6.055200099945068, -5.059800148010254, -4.702600002288818, -5.730299949645996, -4.607699871063232, -5.853899955749512, -5.873799800872803, -5.070400238037109, -5.449900150299072, -5.1554999351501465, -5.1855998039245605, -5.401899814605713, -5.638400077819824, -5.808599948883057, -5.481299877166748, -5.3383002281188965, -5.733500003814697, -5.481500148773193, -5.7484002113342285, -5.736800193786621, -5.668000221252441, -5.838200092315674, -4.753300189971924, -5.165999889373779, -5.369900226593018, -5.967899799346924, -5.506999969482422, -6.253600120544434, -6.323699951171875, -6.35129976272583, -6.450500011444092, -6.612100124359131, -6.622200012207031, -6.675099849700928, -6.678599834442139, -6.653600215911865, -6.823699951171875, -6.845600128173828, -6.909299850463867, -6.933800220489502, -6.952300071716309, -7.013199806213379, -7.014999866485596, -6.98859977722168, -7.004700183868408, -7.095900058746338, -7.135300159454346, -7.196100234985352, -7.264999866485596, -7.2606000900268555, -7.272200107574463, -6.650000095367432, -4.354899883270264, -5.3043999671936035, -5.513999938964844, -5.460400104522705, -6.571499824523926, -6.394000053405762, -5.218299865722656, -5.284299850463867, -6.085599899291992, -6.298299789428711, -6.320799827575684, -5.9166998863220215, -5.550000190734863, -6.38100004196167, -5.966000080108643, -5.768099784851074, -4.58519983291626, -6.354599952697754, -5.545199871063232, -5.00629997253418, -5.991600036621094, -5.504700183868408, -5.3028998374938965, -5.598199844360352, -5.393599987030029, -5.41349983215332, -5.011899948120117, -4.543399810791016, -5.440800189971924, -5.635000228881836, -4.891900062561035, -5.127299785614014, -5.315899848937988, -5.143700122833252, -5.407100200653076, -5.2895002365112305, -5.402100086212158, -5.500899791717529, -5.3927998542785645, -5.484099864959717, -5.540599822998047, -5.625400066375732, -5.695799827575684, -6.301300048828125, -6.148200035095215, -6.662399768829346, -6.764100074768066, -6.801199913024902, -6.842599868774414, -6.940400123596191, -6.960299968719482, -7.102200031280518, -7.246399879455566, -7.256100177764893, -7.317500114440918, -7.3225998878479, -7.335999965667725, -7.383800029754639, -7.423299789428711, -7.511600017547607, -7.533400058746338, -7.552299976348877, -7.52400016784668, -7.672999858856201, -7.679500102996826, -7.730100154876709, -7.745500087738037, -7.829500198364258, -7.829899787902832, -7.832900047302246, -7.836999893188477, -5.795100212097168, -7.8125, -6.699900150299072, -5.167600154876709, -6.002200126647949, -5.733699798583984, -4.740300178527832, -5.880899906158447, -6.10129976272583, -5.969099998474121, -5.160900115966797, -6.678699970245361, -5.234300136566162, -5.997900009155273, -5.223100185394287, -5.309899806976318, -4.928400039672852, -6.041500091552734, -5.117800235748291, -4.515200138092041, -4.7032999992370605, -5.03980016708374, -4.662199974060059, -5.71019983291626, -5.6722002029418945, -5.348400115966797, -4.901500225067139, -5.117700099945068, -5.128900051116943, -4.952400207519531, -5.177800178527832, -5.201499938964844, -5.495699882507324, -5.51609992980957, -5.6367998123168945, -5.026400089263916, -5.65910005569458, -5.4980998039245605, -5.430799961090088, -5.4899001121521, -5.445300102233887, -5.597400188446045, -5.629899978637695, -5.628900051116943, -5.063899993896484, -6.070400238037109, -6.309800148010254, -6.3907999992370605, -6.395899772644043, -6.473999977111816, -6.618800163269043, -6.7153000831604, -6.723800182342529, -6.781499862670898, -6.766499996185303, -5.94320011138916, -6.934599876403809, -7.006800174713135, -7.021900177001953, -7.065999984741211, -7.116600036621094, -7.1203999519348145, -7.1356000900268555, -7.191699981689453, -7.2342000007629395, -5.584799766540527, -7.332799911499023, -7.412700176239014, -7.42519998550415, -7.191299915313721, -7.507500171661377, -7.5081000328063965, -7.56879997253418, -7.589399814605713, -6.187300205230713, -6.0883002281188965, -4.949900150299072, -6.490799903869629, -5.281499862670898, -5.921500205993652, -4.572700023651123, -5.73799991607666, -5.423999786376953, -5.467400074005127, -5.894899845123291, -6.571000099182129, -5.354100227355957, -4.242700099945068, -4.984099864959717, -5.727200031280518, -5.379000186920166, -5.3383002281188965, -4.232699871063232, -5.212600231170654, -5.309599876403809, -6.185999870300293, -5.68149995803833, -5.6529998779296875, -4.570099830627441, -5.377799987792969, -4.806000232696533, -4.966400146484375, -5.1168999671936035, -4.681700229644775, -5.565299987792969, -4.904900074005127, -5.4120001792907715, -5.2144999504089355, -5.293900012969971, -5.325399875640869, -5.288099765777588, -5.44320011138916, -5.561200141906738, -5.525400161743164, -6.017399787902832, -6.459199905395508, -6.554100036621094, -6.177000045776367, -6.7220001220703125, -6.895100116729736, -6.903600215911865, -5.435500144958496, -6.782800197601318, -7.031599998474121, -7.093900203704834, -7.136499881744385, -7.1616997718811035, -7.162600040435791, -7.181000232696533, -6.083799839019775, -7.304900169372559, -7.343400001525879, -7.348599910736084, -7.369699954986572, -7.401000022888184, -7.41349983215332, -7.497000217437744, -7.502200126647949, -7.513800144195557, -7.516499996185303, -7.521500110626221, -7.535600185394287, -7.5441999435424805, -7.55109977722168, -5.597400188446045, -5.7683000564575195, -6.349699974060059, -6.095099925994873, -6.504499912261963, -6.050600051879883, -6.671199798583984, -6.494999885559082, -5.345600128173828, -4.648399829864502, -4.356599807739258, -6.17140007019043, -5.94320011138916, -5.763000011444092, -6.377099990844727, -6.164899826049805, -6.436299800872803, -5.794899940490723, -6.502699851989746, -5.310500144958496, -6.0553998947143555, -5.515200138092041, -5.35230016708374, -5.60129976272583, -6.164999961853027, -4.837200164794922, -4.860099792480469, -5.854800224304199, -5.8242998123168945, -5.942299842834473, -5.11929988861084, -4.981500148773193, -5.545599937438965, -5.661200046539307, -5.696599960327148, -5.682400226593018, -5.589000225067139, -5.571599960327148, -5.62470006942749, -5.624100208282471, -5.744900226593018, -5.708799839019775, -5.770199775695801, -5.910600185394287, -5.906000137329102, -5.388000011444092, -4.97730016708374, -5.809100151062012, -5.883299827575684, -6.095799922943115, -6.528900146484375, -6.915599822998047, -7.037899971008301, -6.993800163269043, -7.081099987030029, -7.107399940490723, -7.218400001525879, -7.237599849700928, -7.257500171661377, -7.2804999351501465, -7.362400054931641, -7.387899875640869, -7.4105000495910645, -7.4207000732421875, -7.450399875640869, -7.463500022888184, -7.480199813842773, -7.480000019073486, -7.519499778747559, -7.536099910736084, -7.539700031280518, -7.541999816894531, -7.6118998527526855, -7.619999885559082, -7.1971001625061035, -5.447000026702881, -5.146599769592285, -5.984499931335449, -6.154799938201904, -5.329599857330322, -6.46150016784668, -6.9243998527526855, -5.44290018081665, -5.820099830627441, -7.303299903869629, -6.218299865722656, -5.551400184631348, -6.050899982452393, -6.115699768066406, -6.45389986038208, -6.50540018081665, -5.731599807739258, -5.35699987411499, -5.955699920654297, -5.418099880218506, -6.295400142669678, -5.906899929046631, -6.03879976272583, -5.660900115966797, -5.357600212097168, -4.576000213623047, -6.046299934387207, -5.535999774932861, -5.82480001449585, -4.986599922180176, -5.956099987030029, -5.39900016784668, -5.295400142669678, -5.342700004577637, -5.166399955749512, -5.351200103759766, -5.513000011444092, -5.395500183105469, -5.363999843597412, -5.460100173950195, -5.502299785614014, -5.614999771118164, -5.730199813842773, -5.740499973297119, -5.725100040435791, -5.77209997177124, -5.916200160980225, -6.203800201416016, -6.205599784851074, -6.309999942779541, -6.57480001449585, -6.602399826049805, -6.702899932861328, -6.705100059509277, -6.802800178527832, -6.820400238037109, -6.838099956512451, -6.872300148010254, -6.866399765014648, -5.8531999588012695, -6.912700176239014, -6.946300029754639, -6.9471001625061035, -6.961400032043457, -6.976600170135498, -6.990600109100342, -7.022799968719482, -7.031899929046631, -6.214600086212158, -7.107999801635742, -7.111999988555908, -7.125100135803223, -7.150100231170654, -7.1504998207092285, -7.16379976272583, -7.183000087738037, -5.0954999923706055, -6.145999908447266, -5.829899787902832, -6.146999835968018, -6.287600040435791, -5.656300067901611, -6.222400188446045, -5.499899864196777, -6.05810022354126, -6.175099849700928, -6.523399829864502, -6.176700115203857, -5.816299915313721, -6.7428998947143555, -6.06220006942749, -5.412899971008301, -5.721799850463867, -4.644899845123291, -5.347899913787842, -4.7179999351501465, -5.152400016784668, -5.967599868774414, -5.999100208282471, -5.628600120544434, -5.627799987792969, -5.966800212860107, -5.143700122833252, -5.252600193023682, -5.252600193023682, -5.163899898529053, -5.8053998947143555, -5.447700023651123, -5.619100093841553, -5.710599899291992, -5.69189977645874, -5.749000072479248, -5.70359992980957, -5.710599899291992, -5.674900054931641, -5.8471999168396, -5.911399841308594, -5.9029998779296875, -4.351600170135498, -5.3572998046875, -5.516900062561035, -5.445400238037109, -5.866499900817871, -5.999599933624268, -6.178400039672852, -6.39169979095459, -6.408699989318848, -6.450099945068359, -4.750800132751465, -6.572500228881836, -6.60129976272583, -6.676599979400635, -6.698999881744385, -6.645400047302246, -6.8256001472473145, -6.853000164031982, -6.371300220489502, -6.9558000564575195, -6.956299781799316, -6.978799819946289, -6.988800048828125, -7.013700008392334, -6.946000099182129, -7.128799915313721, -7.146599769592285, -7.2179999351501465, -7.229000091552734, -7.287799835205078, -4.95959997177124, -4.533999919891357, -5.435999870300293, -6.94350004196167, -6.648799896240234, -5.456600189208984, -4.546800136566162, -5.6230998039245605, -6.371500015258789, -6.284299850463867, -4.621500015258789, -4.631499767303467, -5.618000030517578, -5.259300231933594, -5.611199855804443, -5.697000026702881, -5.560400009155273, -5.549799919128418, -5.781899929046631, -5.357699871063232, -5.821599960327148, -5.603300094604492, -5.048399925231934, -5.6143999099731445, -5.34499979019165, -5.15939998626709, -5.414700031280518, -5.561200141906738, -5.336999893188477, -5.3649001121521, -5.582699775695801, -5.557499885559082, -5.554999828338623, -5.589600086212158, -5.306000232696533, -5.590199947357178, -6.189599990844727, -6.274400234222412, -6.389599800109863, -6.389500141143799, -6.435200214385986, -6.504300117492676, -6.507500171661377, -6.6519999504089355, -6.760200023651123, -6.632599830627441, -6.781199932098389, -6.806099891662598, -6.833499908447266, -6.872200012207031, -6.879899978637695, -6.9542999267578125, -6.990300178527832, -6.370100021362305, -6.994999885559082, -6.997000217437744, -5.59689998626709, -7.023399829864502, -7.023399829864502, -7.025400161743164, -7.065000057220459, -7.035699844360352, -7.0879998207092285, -7.124899864196777, -6.369200229644775, -5.4944000244140625, -5.081399917602539, -5.257400035858154, -5.519999980926514, -6.0345001220703125, -5.214099884033203, -6.502200126647949, -6.671199798583984, -6.0482001304626465, -6.612400054931641, -6.098800182342529, -5.285799980163574, -5.903200149536133, -5.553400039672852, -5.670000076293945, -5.394599914550781, -6.484300136566162, -5.22599983215332, -6.290200233459473, -5.123600006103516, -5.187600135803223, -4.965199947357178, -5.832200050354004, -5.899400234222412, -5.825500011444092, -5.028299808502197, -5.555200099945068, -6.0192999839782715, -5.151199817657471, -5.456500053405762, -5.453000068664551, -5.76200008392334, -5.762700080871582, -5.408999919891357, -5.3933000564575195, -5.599400043487549, -5.662700176239014, -5.7164998054504395, -5.688399791717529, -5.706200122833252, -5.737599849700928, -4.496799945831299, -4.617499828338623, -5.374000072479248, -5.655700206756592, -5.768099784851074, -5.807300090789795, -5.857600212097168, -5.942200183868408, -6.054900169372559, -6.128300189971924, -6.153299808502197, -6.173099994659424, -6.179500102996826, -6.234899997711182, -6.258200168609619, -6.203199863433838, -6.280900001525879, -6.3358001708984375, -6.345300197601318, -6.419400215148926, -6.450300216674805, -6.476099967956543, -6.50439977645874, -6.50600004196167, -6.509799957275391, -6.446499824523926, -6.600800037384033, -6.6890997886657715, -6.702099800109863, -6.729800224304199, -5.840000152587891, -6.20389986038208, -4.364299774169922, -6.039400100708008, -3.9937000274658203, -6.145199775695801, -5.97130012512207, -5.824900150299072, -6.168600082397461, -4.063600063323975, -4.401299953460693, -5.480899810791016, -4.791800022125244, -5.240699768066406, -5.105299949645996, -5.286499977111816, -5.36359977722168, -5.348800182342529, -5.300000190734863, -5.866099834442139, -5.378200054168701, -5.480899810791016, -5.417900085449219, -5.409200191497803, -4.829100131988525, -5.538000106811523, -5.578700065612793, -5.704500198364258, -5.638400077819824, -5.4253997802734375, -5.345900058746338, -5.65749979019165, -5.737199783325195]}, \"token.table\": {\"Topic\": [1, 2, 3, 4, 5, 6, 8, 9, 10, 3, 4, 5, 6, 7, 8, 4, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 1, 3, 5, 8, 1, 2, 3, 5, 8, 1, 5, 8, 9, 5, 3, 8, 7, 4, 1, 2, 5, 6, 7, 8, 9, 10, 2, 3, 4, 5, 6, 7, 8, 10, 3, 8, 1, 6, 9, 2, 4, 5, 2, 3, 4, 5, 8, 1, 10, 1, 3, 4, 8, 1, 1, 2, 3, 5, 6, 7, 8, 9, 1, 6, 8, 9, 10, 1, 1, 1, 3, 5, 6, 6, 2, 2, 2, 1, 2, 6, 8, 9, 10, 5, 1, 2, 3, 4, 8, 2, 3, 4, 5, 6, 7, 3, 5, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 1, 1, 1, 3, 9, 4, 5, 7, 1, 3, 4, 5, 6, 7, 8, 9, 10, 7, 10, 7, 1, 8, 6, 7, 1, 2, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 1, 3, 7, 8, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 2, 2, 5, 6, 2, 5, 3, 4, 4, 9, 7, 1, 3, 4, 5, 7, 8, 9, 10, 10, 8, 1, 2, 3, 4, 5, 6, 7, 9, 6, 5, 6, 7, 10, 10, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 1, 4, 5, 6, 7, 3, 4, 8, 4, 6, 4, 5, 1, 3, 4, 5, 6, 7, 8, 9, 10, 8, 9, 9, 10, 5, 6, 4, 6, 7, 8, 10, 9, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 9, 7, 2, 1, 2, 3, 4, 5, 6, 7, 8, 9, 6, 4, 4, 9, 1, 2, 3, 5, 8, 9, 4, 7, 8, 9, 1, 2, 1, 2, 1, 2, 5, 4, 8, 3, 4, 7, 8, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 8, 1, 2, 3, 8, 10, 6, 7, 10, 3, 4, 4, 9, 1, 5, 6, 8, 7, 8, 7, 10, 2, 3, 4, 6, 7, 8, 1, 2, 3, 4, 7, 10, 2, 3, 4, 5, 6, 7, 8, 10, 1, 4, 6, 7, 10, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 2, 3, 4, 5, 6, 7, 8, 9, 3, 4, 7, 9, 6, 4, 2, 9, 10, 3, 1, 3, 4, 5, 6, 7, 8, 9, 10, 1, 2, 3, 4, 6, 7, 8, 3, 1, 3, 4, 5, 6, 7, 8, 9, 6, 1, 4, 5, 6, 8, 9, 10, 1, 2, 6, 8, 10, 1, 6, 8, 8, 8, 8, 8, 4, 7, 10, 9, 2, 6, 2, 3, 4, 6, 7, 8, 9, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 1, 4, 6, 8, 1, 2, 4, 6, 9, 10, 8, 8, 5, 1, 2, 3, 4, 5, 6, 7, 8, 9, 3, 10, 3, 4, 7, 8, 4, 9, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 3, 3, 4, 8, 9, 3, 4, 8, 1, 2, 3, 4, 5, 9, 10, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 2, 1, 3, 4, 5, 6, 7, 8, 9, 10, 5, 1, 6, 9, 2, 7, 1, 2, 4, 5, 6, 7, 9, 10, 4, 5, 6, 8, 10, 3, 5, 9, 1, 7, 9, 1, 2, 3, 5, 7, 9, 10, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 9, 4, 1, 2, 3, 4, 5, 6, 7, 10, 8, 1, 2, 6, 8, 10, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 5, 3, 4, 8, 10, 8, 4, 10, 1, 2, 9, 3, 4, 1, 1, 2, 6, 8, 9, 10, 1, 2, 3, 4, 5, 7, 8, 9, 10, 1, 2, 7, 8, 1, 5, 6, 8, 1, 3, 4, 8, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 6, 6, 1, 3, 5, 9, 3, 4, 5, 10, 7, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 3, 4, 1, 2, 5, 9, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 2, 3, 4, 8, 9, 2, 6, 10, 6, 9, 1, 2, 3, 4, 8, 9, 5, 6, 8, 9, 10, 2, 4, 7, 10, 7, 10, 7, 9, 1, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 1, 2, 3, 5, 8, 10, 2, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 4, 9, 2, 1, 5, 6, 8, 3, 3, 4, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 1, 3, 1, 2, 3, 1, 2, 5, 6, 7, 8, 9, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 8, 1, 6, 9, 5, 8, 3, 6, 8, 6, 7, 9, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 1, 2, 4, 5, 6, 7, 8, 9, 10, 6, 1, 5, 8, 9, 1, 2, 5, 7, 5, 6, 7, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 5, 10, 7, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 1, 5, 6, 7, 9, 1, 7, 10, 1, 2, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 9, 8, 6, 7, 6, 5, 1, 6, 6, 1, 2, 3, 4, 5, 6, 7, 9, 1, 2, 3, 4, 8, 6, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 2, 3, 4, 7, 8, 9, 9, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 7, 9, 10, 7, 3, 4, 5, 7, 8, 5, 6, 9, 10, 9, 4, 2, 3, 4, 6, 7, 8, 9, 10, 5, 8, 1, 1, 2, 10, 1, 2, 10, 2, 10, 2, 4, 7, 9, 7, 2, 4, 5, 6, 7, 9, 10, 2, 5, 10, 1, 2, 10, 3, 5, 6, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 4, 7, 5, 3, 3, 8, 1, 2, 3, 6, 7, 9, 10, 1, 7, 3, 7, 5, 3, 5, 10, 10, 7, 10, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 10, 10, 1, 2, 3, 4, 6, 7, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 1, 2, 5, 6, 7, 8, 9, 10, 2, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 7, 1, 2, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 1, 2, 4, 5, 6, 7, 9, 10, 3, 5, 8, 1, 3, 4, 5, 6, 8, 9, 10, 3, 6, 2, 3, 4, 6, 7, 8, 9, 10, 3, 4, 3, 5, 1, 2, 1, 4, 10, 5, 3, 4, 10, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 1, 3, 7, 8, 9, 1, 4, 8, 9, 4, 1, 2, 3, 4, 5, 7, 10, 1, 2, 3, 4, 5, 6, 7, 8, 10, 7, 1, 5, 7, 9, 9, 2, 4, 6, 9, 1, 8, 1, 2, 3, 5, 5, 2, 3, 4, 7, 8, 9, 3, 4, 8, 1, 2, 4, 5, 6, 8, 9, 10, 4, 5, 8, 4, 10, 2, 3, 5, 1, 2, 1, 4, 3, 6, 1, 3, 4, 1, 2, 6, 1, 2, 3, 5, 7, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 1, 8, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 2, 4, 6, 7, 8, 9, 3, 8, 7, 5, 4, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 3, 6, 8, 3, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 10, 5, 3, 5, 6, 7, 3, 4, 8, 1, 3, 4, 5, 6, 7, 10, 1, 2, 4, 7, 9, 10, 2, 8, 9, 2, 9, 10, 10, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 1, 2, 3, 5, 6, 7, 8, 9, 10, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 1, 2, 3, 4, 6, 7, 8, 9, 6, 9, 6, 5, 7, 7, 7, 9, 10, 8, 9, 10, 3, 1, 2, 4, 5, 6, 7, 8, 10, 7, 10, 10, 5, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 1, 2, 5, 6, 8, 10, 3, 1, 8, 9, 10, 3, 4, 8, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 4, 1, 5, 8, 10, 1, 2, 3, 4, 5, 6, 7, 1, 2, 3, 9, 3, 4, 7, 1, 8, 1, 2, 3, 4, 5, 6, 8, 3, 5, 6, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 2, 3, 4, 5, 8, 9, 3, 5, 7, 8, 9, 2, 2, 2, 3, 5, 8, 9, 10, 1, 3, 4, 5, 6, 7, 8, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 3, 4, 8, 10, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 3, 5, 10, 6, 5, 10, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 3, 8, 5, 3, 1, 2, 1, 2, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 1, 2, 3, 4, 5, 9, 7, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 2, 2, 7, 5, 6, 5, 6, 6, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 8, 1, 3, 5, 6, 7, 8, 9, 6, 1, 3, 5, 6, 7, 9, 10, 9, 1, 2, 4, 9, 10, 7, 5, 1, 2, 3, 4, 5, 6, 7, 10, 2, 7, 8, 2, 3, 4, 5, 6, 7, 2, 2, 3, 5, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 2, 3, 4, 8, 9, 2, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 2, 3, 5, 8, 9, 7, 10, 1, 2, 3, 4, 7, 9, 10, 3, 4, 8, 10, 2, 4, 1, 7, 7, 10, 1, 7, 8, 1, 6, 8, 10, 10, 1, 3, 4, 5, 6, 7, 8, 10, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 1, 1, 3, 4, 5, 1, 6, 10, 6, 3, 5, 4, 2, 2, 9, 3, 1, 1, 9, 10, 1, 2, 3, 4, 5, 6, 7, 10, 6, 2, 3, 4, 5, 6, 7, 8, 9, 10, 3, 5, 10, 1, 10, 2, 1, 2, 3, 4, 5, 7, 8, 9, 10, 1, 3, 4, 5, 8, 3, 5, 4, 5, 7, 4, 5, 6, 7, 8, 5, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 9, 1, 2, 5, 5, 1, 3, 4, 5, 6, 7, 8, 10, 3, 7, 10, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 7, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 1, 3, 4, 5, 6, 7, 8, 10, 8, 2, 3, 4, 6, 7, 8, 9, 10, 9, 5, 9, 8, 1, 2, 3, 5, 6, 8, 9, 10, 3, 9, 8, 4, 4, 9, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 8, 1, 2, 3, 5, 6, 3, 5, 7, 8, 10, 1, 2, 3, 4, 5, 6, 7, 8, 9, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 6, 2, 3, 4, 5, 6, 7, 8, 9, 2, 1, 2, 3, 4, 5, 6, 7, 9, 10, 2, 5, 2, 1, 2, 3, 6, 8, 9, 9, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 6, 4, 7, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 4, 5, 6, 7, 10, 3, 3, 4, 5, 7, 10, 1, 9, 1, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 6, 1, 2, 6, 9, 10, 1, 1, 1, 3, 2, 6, 7, 5, 7, 1, 2, 3, 4, 5, 6, 7, 9, 2, 4, 7, 5, 3, 4, 1, 4, 6, 7, 3, 4, 6, 8, 3, 6, 10, 6, 1, 5, 6, 8, 2, 1, 2, 3, 4, 5, 6, 7, 8, 10, 4, 8, 1, 3, 4, 8, 1, 10, 2, 3, 5, 6, 7, 8, 10, 3, 7, 7, 4, 1, 6, 6, 7, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 1, 2, 5, 7, 9, 1, 6, 7, 3, 5, 3, 1, 3, 4, 1, 5, 8, 9, 10, 5, 10, 3, 5, 7, 8, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 1, 2, 3, 3, 3, 3, 6, 7, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 9, 5, 1], \"Freq\": [0.14599277079105377, 0.5233890414237976, 0.1291092485189438, 0.04965740442276001, 0.007945184595882893, 0.0228424072265625, 0.06554777175188065, 0.034760184586048126, 0.018869813531637192, 0.40388476848602295, 0.19605383276939392, 0.17180688679218292, 0.03325294703245163, 0.0006927697104401886, 0.19328275322914124, 0.9846031665802002, 0.05245577171444893, 0.07400010526180267, 0.536734938621521, 0.18265849351882935, 0.030911436304450035, 0.026227885857224464, 0.03278485685586929, 0.04964563995599747, 0.005620261188596487, 0.008430391550064087, 0.12412907183170319, 0.06308198720216751, 0.19738557934761047, 0.6145406365394592, 0.07897412776947021, 0.027873219922184944, 0.006968304980546236, 0.12775225937366486, 0.7548997402191162, 0.03866958990693092, 0.08217287808656693, 0.004833698738366365, 0.8700657486915588, 0.9959776997566223, 0.3871699571609497, 0.611616313457489, 0.9911239147186279, 0.9901931881904602, 0.339741975069046, 0.014491363428533077, 0.09419386088848114, 0.10063447058200836, 0.004025378730148077, 0.20287908613681793, 0.03300810605287552, 0.21092984080314636, 0.1255313754081726, 0.1266830414533615, 0.06334152072668076, 0.012668304145336151, 0.1739012748003006, 0.03685325011610985, 0.0737065002322197, 0.38695910573005676, 0.9024494886398315, 0.09523336589336395, 0.7508983612060547, 0.053179770708084106, 0.19357436895370483, 0.2244643270969391, 0.7725219130516052, 0.0022788257338106632, 0.025178419426083565, 0.7350161671638489, 0.18786974251270294, 0.011620808392763138, 0.03970443084836006, 0.34418392181396484, 0.6551724076271057, 0.04772055149078369, 0.8044321537017822, 0.03408610820770264, 0.11362035572528839, 0.9980550408363342, 0.061342693865299225, 0.7078946828842163, 0.060115836560726166, 0.01104168500751257, 0.056435275822877884, 0.01349539216607809, 0.01226853858679533, 0.07729179412126541, 0.8129921555519104, 0.14957647025585175, 0.01583750918507576, 0.012318062596023083, 0.007038893178105354, 0.9972012639045715, 0.9993999600410461, 0.8530754446983337, 0.08814063668251038, 0.006295759696513414, 0.050366077572107315, 0.9841410517692566, 0.9973456859588623, 0.9993276596069336, 0.9964157342910767, 0.6340733766555786, 0.02204345166683197, 0.04279023036360741, 0.24118128418922424, 0.03241683915257454, 0.027230145409703255, 0.9963906407356262, 0.14441119134426117, 0.3110394775867462, 0.18713639676570892, 0.061524294316768646, 0.2956584095954895, 0.03075864166021347, 0.016777440905570984, 0.01957368105649948, 0.008388720452785492, 0.897593080997467, 0.025166161358356476, 0.9902084469795227, 0.9816920757293701, 0.00179692218080163, 0.020964091643691063, 0.6175422668457031, 0.1185968667268753, 0.025156911462545395, 0.027552807703614235, 0.00419281842187047, 0.14075890183448792, 0.03174562379717827, 0.012578455731272697, 0.9970781207084656, 0.991834282875061, 0.9971475005149841, 0.9912530779838562, 0.985652506351471, 0.023296672850847244, 0.15142837166786194, 0.8231490850448608, 0.0036856913939118385, 0.012899919413030148, 0.027642685920000076, 0.0202713031321764, 0.007371382787823677, 0.005528537090867758, 0.10319935530424118, 0.750038206577301, 0.06818529218435287, 0.8324562311172485, 0.16555851697921753, 0.9908235669136047, 0.9822887778282166, 0.01671980880200863, 0.05610562115907669, 0.9408481121063232, 0.013237693347036839, 0.9845534563064575, 0.09291166812181473, 0.5883104205131531, 0.0011711554834619164, 0.030840428546071053, 0.05075007304549217, 0.05933854356408119, 0.04801737517118454, 0.04333275184035301, 0.07065971195697784, 0.014053866267204285, 0.009513046592473984, 0.16172178089618683, 0.7933880686759949, 0.03424696624279022, 0.007427247706800699, 0.13071955740451813, 0.0675879493355751, 0.1819675713777542, 0.03936441242694855, 0.10546691715717316, 0.2413855493068695, 0.0193108431994915, 0.07501520216464996, 0.13294772803783417, 0.044248517602682114, 0.11702568829059601, 0.02328869327902794, 0.16127420961856842, 0.1094568595290184, 0.1676785945892334, 0.19795389473438263, 0.022706476971507072, 0.06287947297096252, 0.09315477311611176, 0.9988299608230591, 0.9976599216461182, 0.0013370970264077187, 0.9974744319915771, 0.06177558749914169, 0.9339015483856201, 0.9674123525619507, 0.02764035202562809, 0.9971478581428528, 0.9819605946540833, 0.9899508953094482, 0.030462924391031265, 0.0913887768983841, 0.7326333522796631, 0.048740681260824203, 0.01675460860133171, 0.007615731097757816, 0.012185170315206051, 0.0594027042388916, 0.9949178695678711, 0.9896720051765442, 0.10203135758638382, 0.3764605224132538, 0.37153488397598267, 0.00492565194144845, 0.0014073291094973683, 0.024628259241580963, 0.07318111509084702, 0.04644186049699783, 0.9910803437232971, 0.05556785315275192, 0.9390967488288879, 0.9451965093612671, 0.054721903055906296, 0.9886062741279602, 0.18599478900432587, 0.017521247267723083, 0.20149435102939606, 0.2715793251991272, 0.2008204460144043, 0.013477882370352745, 0.06671551614999771, 0.03571638837456703, 0.0006738941301591694, 0.007412835489958525, 0.01812021993100643, 0.408528596162796, 0.023062098771333694, 0.5271337032318115, 0.023062098771333694, 0.04738995060324669, 0.8909310698509216, 0.056867942214012146, 0.99643874168396, 0.9898231625556946, 0.9916720390319824, 0.9953881502151489, 0.005461225751787424, 0.13243472576141357, 0.04505511373281479, 0.046420421451330185, 0.2047959715127945, 0.13789595663547516, 0.02867143601179123, 0.010922451503574848, 0.38774704933166504, 0.06209086626768112, 0.9313629865646362, 0.9909238219261169, 0.9858328700065613, 0.0370786115527153, 0.9619839787483215, 0.8973691463470459, 0.03992532193660736, 0.04689640924334526, 0.005703617352992296, 0.00887229386717081, 0.9923086762428284, 0.09889670461416245, 0.1410106122493744, 0.05015813559293747, 0.1334395706653595, 0.02886458858847618, 0.20678400993347168, 0.02886458858847618, 0.12918086349964142, 0.1627773493528366, 0.019873978570103645, 0.9937857985496521, 0.9958334565162659, 0.996943473815918, 0.1216258630156517, 0.17698660492897034, 0.045295149087905884, 0.08555750548839569, 0.02432517148554325, 0.09478428959846497, 0.04110115393996239, 0.009226789698004723, 0.4009459316730499, 0.9868890643119812, 0.9969602227210999, 0.9897100329399109, 0.9941675662994385, 0.677937924861908, 0.1326664835214615, 0.02312535233795643, 0.007302742451429367, 0.03773083537817001, 0.1204952523112297, 0.3486194610595703, 0.004738516639918089, 0.6464690566062927, 0.988552987575531, 0.0016638204688206315, 0.99662846326828, 0.013513145036995411, 0.9859398603439331, 0.0026862570084631443, 0.9858563542366028, 0.009401899762451649, 0.9923655986785889, 0.9946200847625732, 0.989805281162262, 0.04953533783555031, 0.9287875890731812, 0.021671710535883904, 0.23079544305801392, 0.4995506703853607, 0.006073564291000366, 0.04631092771887779, 0.00911034643650055, 0.024294257164001465, 0.01973908394575119, 0.05238449200987816, 0.08199311792850494, 0.029608625918626785, 0.9904960989952087, 0.01607571542263031, 0.03215143084526062, 0.008037857711315155, 0.9404293298721313, 0.997140645980835, 0.8349259495735168, 0.03578253835439682, 0.1272268146276474, 0.9408413767814636, 0.05612974241375923, 0.0071846735663712025, 0.9843003153800964, 0.12218707799911499, 0.3213067650794983, 0.027152683585882187, 0.5279688239097595, 0.006376017350703478, 0.9933834671974182, 0.049458786845207214, 0.9496087431907654, 0.047002773731946945, 0.6893740296363831, 0.03916897997260094, 0.0019584489054977894, 0.007833795621991158, 0.2134709358215332, 0.0193931944668293, 0.003062083153054118, 0.16433179378509521, 0.7624587416648865, 0.04797263815999031, 0.003062083153054118, 0.02497788891196251, 0.014050062745809555, 0.02653900720179081, 0.014050062745809555, 0.27007344365119934, 0.5214134454727173, 0.11708385497331619, 0.012488944455981255, 0.08583952486515045, 0.1502191573381424, 0.0071532935835421085, 0.04470808431506157, 0.711752712726593, 0.2507212460041046, 0.22157453000545502, 0.014573357999324799, 0.11628945171833038, 0.07137971371412277, 0.06989263743162155, 0.13056538999080658, 0.03212087228894234, 0.04104333743453026, 0.0514528788626194, 0.010484830476343632, 0.19527997076511383, 0.12319675832986832, 0.07863622903823853, 0.011795434169471264, 0.146787628531456, 0.4298780560493469, 0.001310603809542954, 0.8896723985671997, 0.08087930828332901, 0.008366825059056282, 0.019522590562701225, 0.977303683757782, 0.9920732378959656, 0.9853165745735168, 0.007978271692991257, 0.003989135846495628, 0.9936932921409607, 0.14128343760967255, 0.02913627400994301, 0.4518871307373047, 0.04947669059038162, 0.1335870623588562, 0.010994820855557919, 0.11489587277173996, 0.06212073564529419, 0.007696374319493771, 0.011459052562713623, 0.05500345304608345, 0.5695149302482605, 0.21772199869155884, 0.06990022212266922, 0.01031314767897129, 0.06531660258769989, 0.9912104606628418, 0.009855405427515507, 0.06208905577659607, 0.14191783964633942, 0.5105100274085999, 0.18232500553131104, 0.03153729811310768, 0.030551757663488388, 0.03153729811310768, 0.9839151501655579, 0.7062051892280579, 0.005525862332433462, 0.075151726603508, 0.1193586215376854, 0.075151726603508, 0.001105172443203628, 0.018787931650877, 0.2933255136013031, 0.04784742370247841, 0.10401614010334015, 0.5554461479187012, 0.9976659417152405, 0.3253612518310547, 0.5731831192970276, 0.10034505277872086, 0.9918471574783325, 0.9958798289299011, 0.9921985268592834, 0.996331512928009, 0.9902531504631042, 0.9943678975105286, 0.9963338971138, 0.9940438866615295, 0.11340337246656418, 0.8845463395118713, 0.0030282640364021063, 0.4754374623298645, 0.26406463980674744, 0.01635262556374073, 0.0042395698837935925, 0.21076717972755432, 0.02604307048022747, 0.10128828883171082, 0.11214060336351395, 0.11756675690412521, 0.07717202603816986, 0.001205812906846404, 0.1917242556810379, 0.20739983022212982, 0.08802434056997299, 0.06812842935323715, 0.03557148203253746, 0.9976046681404114, 0.11456617712974548, 0.7665022611618042, 0.12002170830965042, 0.5816272497177124, 0.2825830578804016, 0.013717624358832836, 0.09327984601259232, 0.02469172328710556, 0.004115287214517593, 0.9915045499801636, 0.9917834401130676, 0.9875321984291077, 0.00699492497369647, 0.0029978249222040176, 0.24482236802577972, 0.12191154807806015, 0.29578539729118347, 0.11291807144880295, 0.044967375695705414, 0.12990574538707733, 0.03897172585129738, 0.9954027533531189, 0.9975415468215942, 0.009578007273375988, 0.47479552030563354, 0.061572905629873276, 0.45427119731903076, 0.9948511719703674, 0.992047905921936, 0.04472225159406662, 0.2554924786090851, 0.0859021469950676, 0.18685930967330933, 0.07793184369802475, 0.13460955023765564, 0.03143841400742531, 0.04250828176736832, 0.11689776927232742, 0.02302531898021698, 0.9797205924987793, 0.767796516418457, 0.20836955308914185, 0.02264886535704136, 0.9965404272079468, 0.01270527858287096, 0.9489865899085999, 0.03713850677013397, 0.011915587820112705, 0.013107147067785263, 0.6053118705749512, 0.3467436134815216, 0.010724029503762722, 0.0011915587820112705, 0.010724029503762722, 0.0513325035572052, 0.014807452447712421, 0.2053300142288208, 0.1796637624502182, 0.05429399386048317, 0.1451130360364914, 0.1757151037454605, 0.10299406200647354, 0.049358174204826355, 0.021388541907072067, 0.9929736256599426, 0.005768895614892244, 0.08797565847635269, 0.012980015017092228, 0.01586446352303028, 0.1543179601430893, 0.18604688346385956, 0.09518677741289139, 0.01586446352303028, 0.42545607686042786, 0.9891993999481201, 0.13151773810386658, 0.0026840355712920427, 0.8642594814300537, 0.994596004486084, 0.9892116785049438, 0.0337333120405674, 0.006064415909349918, 0.7466812133789062, 0.015161039307713509, 0.18534371256828308, 0.010991753078997135, 0.0007580519886687398, 0.0011370779247954488, 0.7883397936820984, 0.004197762347757816, 0.19729484617710114, 0.004197762347757816, 0.005876867566257715, 0.004379556514322758, 0.9941593408584595, 0.9937857985496521, 0.03518718108534813, 0.9632490873336792, 0.9963637590408325, 0.002751182531937957, 0.29987889528274536, 0.09078902006149292, 0.6052601337432861, 0.0013755912659689784, 0.0013755912659689784, 0.9969372153282166, 0.042788878083229065, 0.06828012317419052, 0.05462409928441048, 0.022760041058063507, 0.07192172855138779, 0.0782945454120636, 0.06463851779699326, 0.18116992712020874, 0.408770352602005, 0.008193614892661572, 0.9924702644348145, 0.9913032054901123, 0.0025874855928122997, 0.007762456778436899, 0.5847717523574829, 0.2613360285758972, 0.0008624952170066535, 0.05519969388842583, 0.07331208884716034, 0.013799923472106457, 0.9995120763778687, 0.03260944411158562, 0.011646230705082417, 0.01630472205579281, 0.9130644798278809, 0.025621706619858742, 0.006279796827584505, 0.027910208329558372, 0.10187225788831711, 0.2023490071296692, 0.2979414761066437, 0.24491208791732788, 0.037678781896829605, 0.039772048592567444, 0.016746126115322113, 0.02511918731033802, 0.9942708015441895, 0.15898235142230988, 0.837565541267395, 0.0025850788224488497, 0.9930786490440369, 0.9989667534828186, 0.9820688366889954, 0.994400143623352, 0.014143766835331917, 0.9087370038032532, 0.07425477355718613, 0.9898928999900818, 0.9895271062850952, 0.9944542050361633, 0.09428336471319199, 0.6226845979690552, 0.010360809043049812, 0.03833499178290367, 0.2289738804101944, 0.0041443235240876675, 0.15295802056789398, 0.581828773021698, 0.06883110851049423, 0.07236091047525406, 0.029415003955364227, 0.0011766002280637622, 0.04294590651988983, 0.04412250593304634, 0.0070596011355519295, 0.9937053918838501, 0.9774035215377808, 0.021789249032735825, 0.988694965839386, 0.2148161381483078, 0.08932948112487793, 0.10421773046255112, 0.5912761092185974, 0.007281071972101927, 0.5405329465866089, 0.3890172839164734, 0.06275590509176254, 0.12770269811153412, 0.08756756037473679, 0.058378372341394424, 0.11310809850692749, 0.13135133683681488, 0.0121621610596776, 0.08999999612569809, 0.025540538132190704, 0.030405402183532715, 0.32472971081733704, 0.9981328248977661, 0.9870069622993469, 0.031673677265644073, 0.09502103179693222, 0.8094384074211121, 0.05982805788516998, 0.01888325624167919, 0.978782057762146, 0.006506085861474276, 0.9889250993728638, 0.9961147308349609, 0.11995471268892288, 0.3064922094345093, 0.22458481788635254, 0.1421489715576172, 0.029063917696475983, 0.03117765672504902, 0.030649220570921898, 0.054428789764642715, 0.02853548154234886, 0.033819831907749176, 0.9653185606002808, 0.03121122345328331, 0.09273429214954376, 0.022710438817739487, 0.05488356202840805, 0.8270385265350342, 0.49648597836494446, 0.04393681138753891, 0.03514945134520531, 0.005492101423442364, 0.14718832075595856, 0.03954312950372696, 0.04723207280039787, 0.10215308517217636, 0.04723207280039787, 0.03514945134520531, 0.005432780832052231, 0.665515661239624, 0.29744476079940796, 0.008149171248078346, 0.021731123328208923, 0.11879028379917145, 0.6470279693603516, 0.23252566158771515, 0.982373058795929, 0.012128062546253204, 0.037575263530015945, 0.037575263530015945, 0.6821355819702148, 0.121397003531456, 0.060698501765728, 0.060698501765728, 0.7771496176719666, 0.011328712105751038, 0.18579088151454926, 0.022657424211502075, 0.0022657422814518213, 0.010307654738426208, 0.020099926739931107, 0.30407580733299255, 0.6648436784744263, 0.9967759251594543, 0.9954435229301453, 0.05245886743068695, 0.9442595839500427, 0.9982324242591858, 0.24753481149673462, 0.07662469893693924, 0.0008545505115762353, 0.08630960434675217, 0.18600717186927795, 0.1310310810804367, 0.1521099954843521, 0.027060767635703087, 0.02335771545767784, 0.06893374025821686, 0.005418969783931971, 0.16618172824382782, 0.012644262053072453, 0.12463629990816116, 0.061414990574121475, 0.626794159412384, 0.9936252236366272, 0.028499040752649307, 0.1773865520954132, 0.049540385603904724, 0.08203461766242981, 0.065254807472229, 0.19682981073856354, 0.2426413595676422, 0.04927404224872589, 0.05486730858683586, 0.053801923990249634, 0.06766297668218613, 0.9303659796714783, 0.9942028522491455, 0.47864019870758057, 0.06759040057659149, 0.014018750749528408, 0.43908730149269104, 0.9757900834083557, 0.7745684385299683, 0.2246912121772766, 0.07066923379898071, 0.13031665980815887, 0.06418582051992416, 0.13355837762355804, 0.09530621767044067, 0.1452285200357437, 0.18088731169700623, 0.022043615579605103, 0.056405723094940186, 0.1011412963271141, 0.9622331261634827, 0.03391129896044731, 0.9284623861312866, 0.06954774260520935, 0.9823116660118103, 0.07761090248823166, 0.054537393152713776, 0.19927124679088593, 0.018878327682614326, 0.6376680135726929, 0.004195183981209993, 0.006292776204645634, 0.15075568854808807, 0.19674895703792572, 0.26113951206207275, 0.06490160524845123, 0.07410025596618652, 0.09811896085739136, 0.01226487010717392, 0.08840927481651306, 0.032195284962654114, 0.020952485501766205, 0.9876848459243774, 0.09004253149032593, 0.9090832471847534, 0.9924943447113037, 0.9874857068061829, 0.9912837147712708, 0.9900286793708801, 0.8910292983055115, 0.10725352168083191, 0.04387596622109413, 0.051188625395298004, 0.8994572758674622, 0.3898763358592987, 0.08292146027088165, 0.002909524831920862, 0.09746908396482468, 0.06110002100467682, 0.12801909446716309, 0.09019526839256287, 0.05091668665409088, 0.06255478411912918, 0.03273215517401695, 0.0661003515124321, 0.1192680299282074, 0.4397110342979431, 0.06538186967372894, 0.14944428205490112, 0.017962053418159485, 0.021554462611675262, 0.05747856944799423, 0.06466338783502579, 0.9842679500579834, 0.016517192125320435, 0.20187680423259735, 0.11011461913585663, 0.6698639392852783, 0.02432498335838318, 0.9451993107795715, 0.003474997589364648, 0.02432498335838318, 0.8504248857498169, 0.10691055655479431, 0.03887656703591347, 0.1204923540353775, 0.04726025089621544, 0.20181404054164886, 0.31719717383384705, 0.0540725402534008, 0.055775612592697144, 0.06727135181427002, 0.03278413787484169, 0.09281743317842484, 0.010644201189279556, 0.9708878397941589, 0.025624606758356094, 0.9893497824668884, 0.020420510321855545, 0.04413465037941933, 0.05138063803315163, 0.18707822263240814, 0.241752490401268, 0.1086898148059845, 0.09551528841257095, 0.11066599190235138, 0.11000726372003555, 0.03096012957394123, 0.03080577962100506, 0.017603302374482155, 0.04400825500488281, 0.8889667987823486, 0.013202477246522903, 0.9941993951797485, 0.9913306832313538, 0.9993233680725098, 0.056550782173871994, 0.9401567578315735, 0.2726779580116272, 0.003909361083060503, 0.06548180431127548, 0.07330052554607391, 0.019546806812286377, 0.10555275529623032, 0.35868388414382935, 0.023456167429685593, 0.002932020928710699, 0.074277862906456, 0.991647481918335, 0.9933046698570251, 0.9934691190719604, 0.9942363500595093, 0.9869003295898438, 0.9914559721946716, 0.19970963895320892, 0.7988385558128357, 0.9790177941322327, 0.011327564716339111, 0.022655129432678223, 0.022655129432678223, 0.07929295301437378, 0.008495673537254333, 0.7306279540061951, 0.12177132070064545, 0.002831891179084778, 0.00934118777513504, 0.019400928169488907, 0.8945983052253723, 0.07041817903518677, 0.00574842281639576, 0.9887343645095825, 0.08462303131818771, 0.05847546458244324, 0.4787381589412689, 0.13739357888698578, 0.0404098741710186, 0.029475437477231026, 0.03422953933477402, 0.06227874755859375, 0.0370820015668869, 0.0370820015668869, 0.005477050319314003, 0.021908201277256012, 0.1341877281665802, 0.6517689824104309, 0.16978855431079865, 0.013692625798285007, 0.9944437146186829, 0.05208912864327431, 0.029962772503495216, 0.48816272616386414, 0.0792861059308052, 0.00046096573350951076, 0.02673601172864437, 0.014289937913417816, 0.2383192777633667, 0.06591810286045074, 0.005070623010396957, 0.041793618351221085, 0.8823096752166748, 0.07429976761341095, 0.9889696836471558, 0.01295366883277893, 0.8186718821525574, 0.056996144354343414, 0.023316605016589165, 0.0867895856499672, 0.03642081841826439, 0.7519828081130981, 0.2013857066631317, 0.010712006129324436, 0.989499032497406, 0.9900275468826294, 0.015654398128390312, 0.5386954545974731, 0.1777234673500061, 0.05709251016378403, 0.1289185732603073, 0.03959641978144646, 0.0018416938837617636, 0.041438113898038864, 0.956125795841217, 0.034642238169908524, 0.9942362904548645, 0.20043528079986572, 0.7982853651046753, 0.9992931485176086, 0.029503511264920235, 0.03048696182668209, 0.9391950964927673, 0.9948950409889221, 0.9929196238517761, 0.05053069442510605, 0.05053069442510605, 0.8626311421394348, 0.03609335422515869, 0.9871167540550232, 0.02464824542403221, 0.10915651172399521, 0.08098708838224411, 0.017605889588594437, 0.7464897036552429, 0.007042355835437775, 0.01408471167087555, 0.9994784593582153, 0.029911385849118233, 0.9631465673446655, 0.8657009601593018, 0.10983654856681824, 0.023620761930942535, 0.003857866395264864, 0.9490351676940918, 0.04243653267621994, 0.011400311253964901, 0.22331197559833527, 0.0697430819272995, 0.07644914835691452, 0.004023639019578695, 0.1488746553659439, 0.19782893359661102, 0.06303701549768448, 0.09522613137960434, 0.10997947305440903, 0.9820893406867981, 0.017412932589650154, 0.9933030009269714, 0.9920571446418762, 0.03944803774356842, 0.9588907361030579, 0.7954779863357544, 0.004642867483198643, 0.010059546679258347, 0.14934557676315308, 0.0007738112471997738, 0.010059546679258347, 0.02940482832491398, 0.997638463973999, 0.9823446273803711, 0.08993932604789734, 0.8993932604789734, 0.9824125170707703, 0.0062460871413350105, 0.9910458326339722, 0.9939238429069519, 0.9975072741508484, 0.29065191745758057, 0.7079982757568359, 0.3073197603225708, 0.05826270580291748, 0.00768299400806427, 0.08771418035030365, 0.09987892210483551, 0.12804989516735077, 0.15558062493801117, 0.0166464876383543, 0.053140707314014435, 0.08579343557357788, 0.9964796304702759, 0.989776611328125, 0.030239975079894066, 0.004031996708363295, 0.9293752312660217, 0.0020159983541816473, 0.006047994829714298, 0.028223976492881775, 0.1430351436138153, 0.5361820459365845, 0.007990790531039238, 0.003196316072717309, 0.1318480372428894, 0.09349224716424942, 0.018378818407654762, 0.005593553185462952, 0.057533688843250275, 0.0015981580363586545, 0.03587382659316063, 0.051888927817344666, 0.591277539730072, 0.041639264672994614, 0.0012812081258744001, 0.11146511137485504, 0.05381074175238609, 0.03203020244836807, 0.0051248325034976006, 0.07559128105640411, 0.3883173167705536, 0.2538767158985138, 0.09002719819545746, 0.15784768760204315, 0.027608342468738556, 0.002400725381448865, 0.04261287674307823, 0.03661106154322624, 0.9923387765884399, 0.10636710375547409, 0.12472809106111526, 0.03482256457209587, 0.0810416042804718, 0.24059225618839264, 0.09623690694570541, 0.12282868474721909, 0.09307121485471725, 0.0734439566731453, 0.026591775938868523, 0.08147607743740082, 0.0805872455239296, 0.18221013247966766, 0.13391704857349396, 0.11673299968242645, 0.15347130596637726, 0.17628459632396698, 0.01807287521660328, 0.028442557901144028, 0.029035111889243126, 0.9883348941802979, 0.05344466120004654, 0.9451266527175903, 0.11607211828231812, 0.09041406959295273, 0.040319789201021194, 0.054981529712677, 0.045207034796476364, 0.03909797593951225, 0.37509623169898987, 0.023214424028992653, 0.05375972017645836, 0.16127915680408478, 0.057641707360744476, 0.6063464283943176, 0.031037842854857445, 0.024386875331401825, 0.19620350003242493, 0.05653321370482445, 0.011084944009780884, 0.016627416014671326, 0.007937688380479813, 0.9882422089576721, 0.9813222885131836, 0.04756404459476471, 0.21023307740688324, 0.6021608114242554, 0.0038051235023885965, 0.04756404459476471, 0.0323435515165329, 0.004756404552608728, 0.05327172949910164, 0.9908990263938904, 0.9984796643257141, 0.0164179727435112, 0.5438979864120483, 0.14986662566661835, 0.06062020733952522, 0.11366288363933563, 0.05472657456994057, 0.009261419996619225, 0.05220073461532593, 0.8966673016548157, 0.100186288356781, 0.030339591205120087, 0.9658102989196777, 0.0051825144328176975, 0.9898602962493896, 0.9964926838874817, 0.9940032958984375, 0.995389461517334, 0.9921508431434631, 0.1297713965177536, 0.02752726525068283, 0.8376153707504272, 0.10296144336462021, 0.3724781572818756, 0.030282776802778244, 0.0768425464630127, 0.0673791766166687, 0.1090179979801178, 0.06132262572646141, 0.10712532699108124, 0.04996658116579056, 0.022712083533406258, 0.057786159217357635, 0.03638387843966484, 0.002140228170901537, 0.006420684512704611, 0.8946153521537781, 0.004666417837142944, 0.03266492486000061, 0.06532984972000122, 0.8959521651268005, 0.9891890287399292, 0.03148955851793289, 0.024222739040851593, 0.03027842380106449, 0.798139214515686, 0.027856148779392242, 0.02906728722155094, 0.05934571102261543, 0.07341376692056656, 0.09762468934059143, 0.313960999250412, 0.13511256873607635, 0.03280189633369446, 0.06560379266738892, 0.0015619950136169791, 0.2647581696510315, 0.01640094816684723, 0.9913778901100159, 0.034172557294368744, 0.09112682193517685, 0.8543139696121216, 0.017086278647184372, 0.9906675815582275, 0.08192655444145203, 0.02730885148048401, 0.8848068118095398, 0.9931009411811829, 0.998070240020752, 0.988185465335846, 0.00870155543088913, 0.0406072624027729, 0.20593681931495667, 0.7425327897071838, 0.9880222082138062, 0.009207574650645256, 0.053710851818323135, 0.888530969619751, 0.010742170736193657, 0.02915732003748417, 0.0076729790307581425, 0.020768266171216965, 0.9553402662277222, 0.023364299908280373, 0.02318478561937809, 0.04289185628294945, 0.032458700239658356, 0.4683326780796051, 0.29444679617881775, 0.0602804459631443, 0.027821743860840797, 0.05100652948021889, 0.8876805305480957, 0.03227929025888443, 0.07923098653554916, 0.009056972339749336, 0.9872100353240967, 0.01922890916466713, 0.004807227291166782, 0.9734635949134827, 0.05321671813726425, 0.9460749626159668, 0.9958201050758362, 0.9951406717300415, 0.9989522099494934, 0.9976341724395752, 0.9939318299293518, 0.007695188280194998, 0.9907554388046265, 0.9945312142372131, 0.002001068787649274, 0.002001068787649274, 0.7687157392501831, 0.22880834341049194, 0.20650435984134674, 0.7854675054550171, 0.006758324336260557, 0.34681469202041626, 0.03489511087536812, 0.11750394850969315, 0.017091482877731323, 0.17589984834194183, 0.010682176798582077, 0.044865142554044724, 0.18586988747119904, 0.012818612158298492, 0.053410883992910385, 0.996290385723114, 0.9905754327774048, 0.04634307324886322, 0.09325476735830307, 0.14556841552257538, 0.28886234760284424, 0.09695084393024445, 0.09581358730792999, 0.07704891264438629, 0.09581358730792999, 0.03866661339998245, 0.02189212664961815, 0.06009218469262123, 0.06687678396701813, 0.13084588944911957, 0.4409990906715393, 0.256845623254776, 0.04361529275774956, 0.00642987247556448, 0.9902003407478333, 0.9888010025024414, 0.9949706196784973, 0.9919202327728271, 0.09934737533330917, 0.03804792836308479, 0.16318334639072418, 0.17163844406604767, 0.03382038325071335, 0.05242159217596054, 0.0925832986831665, 0.24435226619243622, 0.02536528743803501, 0.07905514538288116, 0.0493512861430645, 0.9421609044075012, 0.00747746741399169, 0.9954060316085815, 0.058951377868652344, 0.21875932812690735, 0.016335923224687576, 0.11222069710493088, 0.06179240718483925, 0.247169628739357, 0.026279529556632042, 0.014205151237547398, 0.11293095350265503, 0.1306873857975006, 0.9945565462112427, 0.9965836405754089, 0.11972963064908981, 0.8785793781280518, 0.00485058082267642, 0.9895185232162476, 0.08816379308700562, 0.9062418341636658, 0.004100641701370478, 0.012021970003843307, 0.012021970003843307, 0.07453621178865433, 0.009617576375603676, 0.7092962265014648, 0.00721318181604147, 0.17552076280117035, 0.08571454137563705, 0.08571454137563705, 0.027649851515889168, 0.03317982330918312, 0.7659009099006653, 0.998058557510376, 0.0335407555103302, 0.8608793616294861, 0.10062225908041, 0.009945032186806202, 0.9878731966018677, 0.9939717054367065, 0.9972440004348755, 0.38646844029426575, 0.2595732808113098, 0.01553143747150898, 0.022966699674725533, 0.06509985774755478, 0.10211094468832016, 0.01420961320400238, 0.05749936401844025, 0.060308244079351425, 0.016027122735977173, 0.07528243213891983, 0.05646182596683502, 0.13516618311405182, 0.09581400454044342, 0.0684385746717453, 0.037641216069459915, 0.051328931003808975, 0.04961796849966049, 0.4277411103248596, 0.17850686609745026, 0.32199332118034363, 0.04134355112910271, 0.036965999752283096, 0.046693895012140274, 0.1381361037492752, 0.027724498882889748, 0.1177075207233429, 0.07539118081331253, 0.015078236348927021, 0.0029351895209401846, 0.012719154357910156, 0.22796638309955597, 0.15262985229492188, 0.04304944723844528, 0.13306193053722382, 0.41484013199806213, 0.011740758083760738, 0.9922082424163818, 0.9938311576843262, 0.9842427968978882, 0.006768323015421629, 0.9915593266487122, 0.9902106523513794, 0.021416107192635536, 0.8905531167984009, 0.0874491035938263, 0.013841218315064907, 0.2886882722377777, 0.6960155367851257, 0.9894993305206299, 0.015452922321856022, 0.035822682082653046, 0.021774571388959885, 0.016857733950018883, 0.013345705345273018, 0.23741307854652405, 0.013345705345273018, 0.6469154953956604, 0.3705628216266632, 0.6290480494499207, 0.9973105788230896, 0.9915122389793396, 0.06309384852647781, 0.231595978140831, 0.09142940491437912, 0.037780746817588806, 0.05515988916158676, 0.10087459534406662, 0.044959086924791336, 0.05175962299108505, 0.19872672855854034, 0.125054270029068, 0.5734701156616211, 0.1194729432463646, 0.09026844054460526, 0.11681798845529556, 0.09292339533567429, 0.006637385580688715, 0.9915998578071594, 0.7821849584579468, 0.03164910152554512, 0.12433575838804245, 0.06103755533695221, 0.11312486231327057, 0.8551472425460815, 0.028760557994246483, 0.11257313936948776, 0.059926994144916534, 0.0016801961464807391, 0.1814611852169037, 0.20834431052207947, 0.05376627668738365, 0.18930210173130035, 0.04480522871017456, 0.05208607763051987, 0.09633124619722366, 0.9851661920547485, 0.15788765251636505, 0.6178212761878967, 0.17962580919265747, 0.04462042450904846, 0.05229882523417473, 0.0018678151536732912, 0.08405168354511261, 0.3259337544441223, 0.04389365762472153, 0.47629284858703613, 0.01494252122938633, 0.021584073081612587, 0.05396018177270889, 0.1187123954296112, 0.8040066957473755, 0.08918201923370361, 0.9111027717590332, 0.9925987720489502, 0.9948096871376038, 0.9976964592933655, 0.014667067676782608, 0.1222255676984787, 0.017926417291164398, 0.02770446240901947, 0.23630276322364807, 0.016296742483973503, 0.5654969811439514, 0.09710930287837982, 0.8601109981536865, 0.03699402138590813, 0.05591879040002823, 0.08879411965608597, 0.05991298705339432, 0.4362894594669342, 0.06943761557340622, 0.10845787078142166, 0.016898535192012787, 0.006144921761006117, 0.14286942780017853, 0.015362304635345936, 0.0076918532140553, 0.5176617503166199, 0.2649843394756317, 0.1346074342727661, 0.07038045674562454, 0.004999704658985138, 0.38159796595573425, 0.4875108599662781, 0.1105855256319046, 0.007787713315337896, 0.012460341677069664, 0.9943277835845947, 0.9964197278022766, 0.05934993922710419, 0.025178762152791023, 0.2356012761592865, 0.5917009115219116, 0.052156005054712296, 0.034171175211668015, 0.1887255609035492, 0.0022073164582252502, 0.046353645622730255, 0.04304267093539238, 0.18210361897945404, 0.020969506353139877, 0.5165120363235474, 0.058811839669942856, 0.10455438494682312, 0.28679847717285156, 0.06099005788564682, 0.07623757421970367, 0.007986793294548988, 0.014521442353725433, 0.2911549210548401, 0.07986792922019958, 0.019603947177529335, 0.14539244771003723, 0.03940024599432945, 0.2047702819108963, 0.01609305664896965, 0.0016647990560159087, 0.07658075541257858, 0.0005549330380745232, 0.4916706383228302, 0.024971986189484596, 0.9955393671989441, 0.9898155927658081, 0.9977903366088867, 0.988472580909729, 0.991112470626831, 0.04804662615060806, 0.30499163269996643, 0.12394636869430542, 0.12046472728252411, 0.09400427341461182, 0.06649931520223618, 0.07102544605731964, 0.06336583942174911, 0.08495200425386429, 0.022978821769356728, 0.9855749607086182, 0.991823673248291, 0.9906700253486633, 0.9936048984527588, 0.07083205878734589, 0.9249833822250366, 0.05752526596188545, 0.264791876077652, 0.13217636942863464, 0.1901407688856125, 0.040399424731731415, 0.10363329946994781, 0.0421559177339077, 0.07245548814535141, 0.07552935928106308, 0.020638834685087204, 0.08443303406238556, 0.3670561909675598, 0.031851984560489655, 0.05965927243232727, 0.059153683483600616, 0.11881295591592789, 0.05814250931143761, 0.0894889086484909, 0.10769003629684448, 0.022751417011022568, 0.022307951003313065, 0.9703959226608276, 0.9775837659835815, 0.9887065291404724, 0.21927835047245026, 0.7780164480209351, 0.09416694939136505, 0.9042441844940186, 0.0651455670595169, 0.08344487845897675, 0.13724486529827118, 0.2170298844575882, 0.038062576204538345, 0.14419861137866974, 0.09625440090894699, 0.03659863397479057, 0.10869793593883514, 0.07319726794958115, 0.04354088380932808, 0.031975336372852325, 0.24967974424362183, 0.04966381937265396, 0.2020569145679474, 0.0006803263095207512, 0.031975336372852325, 0.09864731132984161, 0.2333519160747528, 0.05850806087255478, 0.02580989897251129, 0.011731772683560848, 0.8540730476379395, 0.0023463545367121696, 0.08212240785360336, 0.021117189899086952, 0.9889315366744995, 0.0668911337852478, 0.0998058170080185, 0.13484403491020203, 0.13590580224990845, 0.06582936644554138, 0.006370584014803171, 0.024420572444796562, 0.06052054837346077, 0.33020859956741333, 0.07432348281145096, 0.9912629127502441, 0.9977747201919556, 0.9882981777191162, 0.0415370836853981, 0.9553529024124146, 0.14116810262203217, 0.857092022895813, 0.9956228137016296, 0.37793493270874023, 0.09960217773914337, 0.006086799781769514, 0.07110488414764404, 0.04454430565237999, 0.15023328363895416, 0.059484630823135376, 0.11647921055555344, 0.014663653448224068, 0.059761304408311844, 0.9974615573883057, 0.1840101033449173, 0.002920795464888215, 0.09346545487642288, 0.04965352267026901, 0.020445566624403, 0.07886147499084473, 0.5695551037788391, 0.9935731291770935, 0.2841089963912964, 0.0568218007683754, 0.0701916366815567, 0.46794426441192627, 0.09693130850791931, 0.005013688467442989, 0.01838352344930172, 0.9945606589317322, 0.1063975989818573, 0.03546586632728577, 0.03819401189684868, 0.600191593170166, 0.22097963094711304, 0.995009183883667, 0.9792357683181763, 0.009374520741403103, 0.007030890788882971, 0.20858308672904968, 0.35779422521591187, 0.003124840324744582, 0.019530251622200012, 0.378886878490448, 0.01562420092523098, 0.9002392888069153, 0.09726203233003616, 0.9930251836776733, 0.9916316270828247, 0.09693365544080734, 0.3130149245262146, 0.07068078964948654, 0.23930495977401733, 0.27868425846099854, 0.9976932406425476, 0.9929656386375427, 0.15088479220867157, 0.8490967750549316, 0.34195584058761597, 0.2523147463798523, 0.0018201243365183473, 0.046185653656721115, 0.09464646130800247, 0.06575199216604233, 0.05596882104873657, 0.04049776494503021, 0.06074664741754532, 0.04027025029063225, 0.009788339026272297, 0.09788339585065842, 0.029365018010139465, 0.822220504283905, 0.03915335610508919, 0.9929429292678833, 0.014371379278600216, 0.124968521296978, 0.22619301080703735, 0.05811036005616188, 0.07060721516609192, 0.017495593056082726, 0.07560595124959946, 0.01562106516212225, 0.3499118387699127, 0.04748803749680519, 0.1100185215473175, 0.20536790788173676, 0.07579053938388824, 0.03178313001990318, 0.5745411515235901, 0.32186359167099, 0.6759135127067566, 0.04023103043437004, 0.04446587339043617, 0.029643917456269264, 0.09104917198419571, 0.5357078909873962, 0.1588066965341568, 0.09951886534690857, 0.21029403805732727, 0.7732859253883362, 0.0016558585921302438, 0.01324686873704195, 0.996273934841156, 0.9994207620620728, 0.9942842125892639, 0.9879215955734253, 0.31940343976020813, 0.6791054606437683, 0.17297396063804626, 0.014766070060431957, 0.8100244402885437, 0.07929293811321259, 0.004719818010926247, 0.9128127694129944, 0.0018879271810874343, 0.9901733994483948, 0.009147335775196552, 0.042687565088272095, 0.2154705673456192, 0.07521142810583115, 0.4339902400970459, 0.14229188859462738, 0.054884012788534164, 0.027442006394267082, 0.12139881402254105, 0.02926022745668888, 0.5005366206169128, 0.1270018368959427, 0.036730922758579254, 0.02365720458328724, 0.06785882264375687, 0.041711386293172836, 0.006225580349564552, 0.0454467348754406, 0.9917294383049011, 0.9968920350074768, 0.9306492209434509, 0.06876718252897263, 0.9906982779502869, 0.03595567122101784, 0.9528253078460693, 0.9878548979759216, 0.9904950857162476, 0.11256667226552963, 0.8850069642066956, 0.9979623556137085, 0.9954518675804138, 0.014250417239964008, 0.983278751373291, 0.9919945001602173, 0.9889539480209351, 0.028080632910132408, 0.9547415375709534, 0.009360210970044136, 0.012287922203540802, 0.03891175612807274, 0.04300772771239281, 0.13311916589736938, 0.06553558260202408, 0.08806344121694565, 0.5345246195793152, 0.08191948384046555, 0.988900363445282, 0.0012262659147381783, 0.517484188079834, 0.3231210708618164, 0.04230617359280586, 0.05211630091071129, 0.005518196616321802, 0.035561710596084595, 0.004291930701583624, 0.017780855298042297, 0.057518623769283295, 0.8575504422187805, 0.0836634561419487, 0.9363574385643005, 0.06113674119114876, 0.9921925663948059, 0.11348026245832443, 0.09020226448774338, 0.6205042600631714, 0.04364625737071037, 0.0065469383262097836, 0.014548752456903458, 0.03855419158935547, 0.06546938419342041, 0.007274376228451729, 0.0005373483872972429, 0.21493935585021973, 0.02847946621477604, 0.752825140953064, 0.003224090440198779, 0.05142543837428093, 0.9427996873855591, 0.9487872123718262, 0.04447440057992935, 0.0049415999092161655, 0.582501232624054, 0.0932001993060112, 0.2895863354206085, 0.015533366240561008, 0.01886194385588169, 0.9940780997276306, 0.07539986819028854, 0.09514745324850082, 0.007180939894169569, 0.025133289396762848, 0.5152324438095093, 0.15798068046569824, 0.014361879788339138, 0.02154281921684742, 0.07360463589429855, 0.014361879788339138, 0.9952544569969177, 0.0444549061357975, 0.9261438846588135, 0.029636604711413383, 0.9802224636077881, 0.03679625317454338, 0.08714901655912399, 0.21303093433380127, 0.0232397373765707, 0.07552915066480637, 0.5054643154144287, 0.01355651393532753, 0.0445428304374218, 0.01616777665913105, 0.01077851839363575, 0.9646773934364319, 0.25457799434661865, 0.05604906752705574, 0.09533579647541046, 0.08485933393239975, 0.07543051987886429, 0.07909727841615677, 0.19381453096866608, 0.02985791303217411, 0.05657288804650307, 0.07490669190883636, 0.9938384294509888, 0.2710508406162262, 0.05701809376478195, 0.04784935712814331, 0.042405419051647186, 0.06332160532474518, 0.3194732367992401, 0.00401132320985198, 0.12406449764966965, 0.014326154254376888, 0.05673157051205635, 0.0856575295329094, 0.05930136516690254, 0.024159815162420273, 0.7291871905326843, 0.026356162503361702, 0.013178081251680851, 0.008785387501120567, 0.050515979528427124, 0.9913363456726074, 0.0069246068596839905, 0.1465708464384079, 0.027698427438735962, 0.1419544517993927, 0.19735130667686462, 0.08194117993116379, 0.2919875979423523, 0.10617730766534805, 0.9816988110542297, 0.9771338105201721, 0.9972831010818481, 0.9919394850730896, 0.1665184646844864, 0.16189295053482056, 0.025440320372581482, 0.11216868460178375, 0.016189293935894966, 0.011563781648874283, 0.499555379152298, 0.005781890824437141, 0.9955941438674927, 0.9914425611495972, 0.9890792965888977, 0.9932788014411926, 0.9947019219398499, 0.9942968487739563, 0.23299972712993622, 0.11411148309707642, 0.013268777169287205, 0.05891336873173714, 0.11835748702287674, 0.13640302419662476, 0.05891336873173714, 0.051482852548360825, 0.1480795443058014, 0.06793613731861115, 0.9846557378768921, 0.053808897733688354, 0.8497321605682373, 0.01793629862368107, 0.05605093389749527, 0.022420374676585197, 0.0005919853574596345, 0.02959926798939705, 0.14858832955360413, 0.0017759561305865645, 0.8193077445030212, 0.0007286216714419425, 0.08889184892177582, 0.13552363216876984, 0.17486920952796936, 0.16175401210784912, 0.00291448668576777, 0.11657947301864624, 0.3133073151111603, 0.006557594984769821, 0.27615758776664734, 0.19481515884399414, 0.00813424400985241, 0.15861776471138, 0.06629408895969391, 0.11225257068872452, 0.06304039061069489, 0.04026450961828232, 0.05571957305073738, 0.025216158479452133, 0.9917768239974976, 0.016399454325437546, 0.2193426936864853, 0.21831771731376648, 0.11889603734016418, 0.06969767808914185, 0.006149794906377792, 0.09224692732095718, 0.2582913935184479, 0.9895025491714478, 0.010923417285084724, 0.024905391037464142, 0.2569187581539154, 0.417274534702301, 0.031896378844976425, 0.09263058006763458, 0.11972065269947052, 0.027527010068297386, 0.01791440322995186, 0.9879209399223328, 0.9828146696090698, 0.9952401518821716, 0.011208872310817242, 0.25332051515579224, 0.13226468861103058, 0.017934195697307587, 0.051560815423727036, 0.5313005447387695, 0.9885645508766174, 0.11263793706893921, 0.25891709327697754, 0.019223541021347046, 0.10693094879388809, 0.1228504478931427, 0.14748060703277588, 0.10512874275445938, 0.0423518642783165, 0.07779526710510254, 0.006908460520207882, 0.9894654750823975, 0.9859137535095215, 0.988101065158844, 0.13968415558338165, 0.12965160608291626, 0.05652964115142822, 0.13370321691036224, 0.14470043778419495, 0.09781750291585922, 0.11248047649860382, 0.047268811613321304, 0.0692632794380188, 0.06907034665346146, 0.010665087029337883, 0.06754554808139801, 0.8496519327163696, 0.021330174058675766, 0.04977040737867355, 0.9942588210105896, 0.01854361593723297, 0.002852864097803831, 0.46073755621910095, 0.04136652871966362, 0.47500187158584595, 0.16666944324970245, 0.8295592665672302, 0.9949787259101868, 0.06429426372051239, 0.4737083315849304, 0.01330226194113493, 0.13376162946224213, 0.05173102021217346, 0.08129160106182098, 0.008129159919917583, 0.04951397702097893, 0.06133820861577988, 0.06355524808168411, 0.9839065670967102, 0.10247236490249634, 0.8284385204315186, 0.04907127097249031, 0.0028865453787148, 0.01587599888443947, 0.9984540939331055, 0.9972016215324402, 0.9988705515861511, 0.9919763207435608, 0.03858592361211777, 0.9576324224472046, 0.0035078111104667187, 0.9930582642555237, 0.9932459592819214, 0.03595590591430664, 0.014648702926933765, 0.0426144078373909, 0.06392160803079605, 0.033292505890131, 0.6791671514511108, 0.08389711380004883, 0.045277807861566544, 0.014019694179296494, 0.9720321297645569, 0.009346462786197662, 0.9923473596572876, 0.005523554980754852, 0.994239866733551, 0.9954299330711365, 0.046779386699199677, 0.8836106657981873, 0.06757022440433502, 0.7120974659919739, 0.12702780961990356, 0.052850984036922455, 0.10662917792797089, 0.9876187443733215, 0.9899839758872986, 0.9931995272636414, 0.9878475666046143, 0.020768698304891586, 0.6824000477790833, 0.2937287390232086, 0.0029669569339603186, 0.9904960989952087, 0.003083867020905018, 0.05119219422340393, 0.5261077284812927, 0.30653637647628784, 0.0018503202591091394, 0.036389630287885666, 0.028371578082442284, 0.0431741401553154, 0.003083867020905018, 0.9957234263420105, 0.9857167601585388, 0.021710535511374474, 0.005427633877843618, 0.9457652568817139, 0.025781262665987015, 0.9877657294273376, 0.0066740927286446095, 0.007349411956965923, 0.07349412143230438, 0.012861470691859722, 0.22231970727443695, 0.09554235637187958, 0.014698823913931847, 0.5750914812088013, 0.9970661401748657, 0.0032690693624317646, 0.9879963397979736, 0.9933649897575378, 0.9527984857559204, 0.0392906591296196, 0.9773064255714417, 0.01338775921612978, 0.1733044683933258, 0.11415430158376694, 0.09121287614107132, 0.1843605786561966, 0.10005776584148407, 0.14179456233978271, 0.06937706470489502, 0.04201320558786392, 0.052792906761169434, 0.030404292047023773, 0.08409424871206284, 0.021624235436320305, 0.07688616961240768, 0.06727539747953415, 0.747237503528595, 0.33517640829086304, 0.6620768904685974, 0.002758653601631522, 0.04095998778939247, 0.959634006023407, 0.9987404942512512, 0.013819515705108643, 0.3151523768901825, 0.6707521080970764, 0.05502551794052124, 0.14756843447685242, 0.010004639625549316, 0.005002319812774658, 0.7828630208969116, 0.042391955852508545, 0.9507910013198853, 0.012515492737293243, 0.007822182960808277, 0.9777728319168091, 0.994380533695221, 0.11777878552675247, 0.5513847470283508, 0.10502567142248154, 0.062265217304229736, 0.0270066000521183, 0.0405099019408226, 0.0157538503408432, 0.028506968170404434, 0.0157538503408432, 0.0360088013112545, 0.10179044306278229, 0.0622747428715229, 0.09353716671466827, 0.3176262080669403, 0.21183417737483978, 0.047518882900476456, 0.05627235770225525, 0.05527196079492569, 0.050269972532987595, 0.004001589957624674, 0.2278156876564026, 0.16641081869602203, 0.0973757654428482, 0.15006041526794434, 0.10609598457813263, 0.05123127996921539, 0.08029866963624954, 0.011990299448370934, 0.0534113347530365, 0.054864704608917236, 0.009547729976475239, 0.9881900548934937, 0.9945070743560791, 0.9949353933334351, 0.9954512119293213, 0.9885648488998413, 0.9812148213386536, 0.9881600737571716, 0.12985055148601532, 0.03196321427822113, 0.015482181683182716, 0.038955166935920715, 0.21625111997127533, 0.06367671489715576, 0.24471835792064667, 0.04095286875963211, 0.06792183220386505, 0.14982756972312927, 0.9866440296173096, 0.9905340671539307, 0.991249680519104], \"Term\": [\"accept\", \"accept\", \"accept\", \"accept\", \"accept\", \"accept\", \"accept\", \"accept\", \"accept\", \"access\", \"access\", \"access\", \"access\", \"access\", \"access\", \"adaptec\", \"address\", \"address\", \"address\", \"address\", \"address\", \"address\", \"address\", \"address\", \"address\", \"address\", \"administr\", \"administr\", \"administr\", \"administr\", \"agenc\", \"agenc\", \"agenc\", \"agenc\", \"agenc\", \"aid\", \"aid\", \"aid\", \"aid\", \"alaska\", \"algorithm\", \"algorithm\", \"alomar\", \"amanda\", \"american\", \"american\", \"american\", \"american\", \"american\", \"american\", \"american\", \"american\", \"andrew\", \"andrew\", \"andrew\", \"andrew\", \"andrew\", \"andrew\", \"andrew\", \"andrew\", \"anonym\", \"anonym\", \"anti\", \"anti\", \"anti\", \"appl\", \"appl\", \"appl\", \"applic\", \"applic\", \"applic\", \"applic\", \"applic\", \"arab\", \"arab\", \"archiv\", \"archiv\", \"archiv\", \"archiv\", \"argic\", \"argument\", \"argument\", \"argument\", \"argument\", \"argument\", \"argument\", \"argument\", \"argument\", \"arm\", \"arm\", \"arm\", \"arm\", \"arm\", \"armenia\", \"armenian\", \"armi\", \"armi\", \"armi\", \"armi\", \"armori\", \"atheism\", \"atheist\", \"atho\", \"attack\", \"attack\", \"attack\", \"attack\", \"attack\", \"attack\", \"aurora\", \"author\", \"author\", \"author\", \"author\", \"author\", \"auto\", \"auto\", \"auto\", \"auto\", \"auto\", \"auto\", \"autom\", \"automot\", \"avail\", \"avail\", \"avail\", \"avail\", \"avail\", \"avail\", \"avail\", \"avail\", \"avail\", \"avail\", \"azerbaijan\", \"azerbaijani\", \"azeri\", \"baalk\", \"baerga\", \"ball\", \"ball\", \"ball\", \"bank\", \"bank\", \"bank\", \"bank\", \"bank\", \"bank\", \"bank\", \"bank\", \"bank\", \"basebal\", \"basebal\", \"bat\", \"batf\", \"batf\", \"batteri\", \"batteri\", \"belief\", \"belief\", \"believ\", \"believ\", \"believ\", \"believ\", \"believ\", \"believ\", \"believ\", \"believ\", \"believ\", \"believ\", \"berkeley\", \"berkeley\", \"berkeley\", \"berkeley\", \"best\", \"best\", \"best\", \"best\", \"best\", \"best\", \"best\", \"best\", \"best\", \"best\", \"better\", \"better\", \"better\", \"better\", \"better\", \"better\", \"better\", \"better\", \"better\", \"better\", \"bibl\", \"biblic\", \"bike\", \"bike\", \"billion\", \"billion\", \"binari\", \"binari\", \"bio\", \"blah\", \"blast\", \"board\", \"board\", \"board\", \"board\", \"board\", \"board\", \"board\", \"board\", \"boni\", \"bontchev\", \"book\", \"book\", \"book\", \"book\", \"book\", \"book\", \"book\", \"book\", \"boyl\", \"brake\", \"brake\", \"brave\", \"brave\", \"bruin\", \"build\", \"build\", \"build\", \"build\", \"build\", \"build\", \"build\", \"build\", \"build\", \"build\", \"buy\", \"buy\", \"buy\", \"buy\", \"buy\", \"byte\", \"byte\", \"byte\", \"cach\", \"cactus\", \"cadr\", \"callison\", \"canada\", \"canada\", \"canada\", \"canada\", \"canada\", \"canada\", \"canada\", \"canada\", \"canada\", \"cancer\", \"cancer\", \"candida\", \"canuck\", \"car\", \"car\", \"card\", \"card\", \"card\", \"card\", \"card\", \"carlo\", \"case\", \"case\", \"case\", \"case\", \"case\", \"case\", \"case\", \"case\", \"case\", \"case\", \"catbyt\", \"catcher\", \"cathol\", \"caus\", \"caus\", \"caus\", \"caus\", \"caus\", \"caus\", \"caus\", \"caus\", \"caus\", \"centerlin\", \"centri\", \"char\", \"chastiti\", \"children\", \"children\", \"children\", \"children\", \"children\", \"children\", \"chip\", \"chip\", \"chip\", \"chopin\", \"christ\", \"christ\", \"christian\", \"christian\", \"church\", \"church\", \"church\", \"cica\", \"cipher\", \"ciphertext\", \"circuit\", \"circuit\", \"circuit\", \"claim\", \"claim\", \"claim\", \"claim\", \"claim\", \"claim\", \"claim\", \"claim\", \"claim\", \"claim\", \"clarkson\", \"classifi\", \"classifi\", \"classifi\", \"classifi\", \"clayton\", \"cleveland\", \"cleveland\", \"cleveland\", \"client\", \"client\", \"clinic\", \"clinic\", \"clinton\", \"clinton\", \"clinton\", \"clinton\", \"clipper\", \"clipper\", \"coach\", \"coach\", \"code\", \"code\", \"code\", \"code\", \"code\", \"code\", \"color\", \"color\", \"color\", \"color\", \"color\", \"color\", \"colorado\", \"colorado\", \"colorado\", \"colorado\", \"colorado\", \"colorado\", \"colorado\", \"colorado\", \"columbia\", \"columbia\", \"columbia\", \"columbia\", \"columbia\", \"come\", \"come\", \"come\", \"come\", \"come\", \"come\", \"come\", \"come\", \"come\", \"come\", \"communic\", \"communic\", \"communic\", \"communic\", \"communic\", \"communic\", \"communic\", \"communic\", \"compil\", \"compil\", \"compil\", \"compil\", \"concordia\", \"config\", \"contradict\", \"contradict\", \"contradict\", \"contrib\", \"control\", \"control\", \"control\", \"control\", \"control\", \"control\", \"control\", \"control\", \"control\", \"copi\", \"copi\", \"copi\", \"copi\", \"copi\", \"copi\", \"copi\", \"copper\", \"cost\", \"cost\", \"cost\", \"cost\", \"cost\", \"cost\", \"cost\", \"cost\", \"counterst\", \"countri\", \"countri\", \"countri\", \"countri\", \"countri\", \"countri\", \"countri\", \"court\", \"court\", \"court\", \"court\", \"cramer\", \"crime\", \"crime\", \"crime\", \"crypt\", \"crypto\", \"cryptograph\", \"cryptographi\", \"ctrl\", \"cub\", \"cunixb\", \"cure\", \"cwru\", \"cwru\", \"data\", \"data\", \"data\", \"data\", \"data\", \"data\", \"data\", \"david\", \"david\", \"david\", \"david\", \"david\", \"david\", \"david\", \"david\", \"david\", \"david\", \"davidian\", \"dealer\", \"dealer\", \"dealer\", \"death\", \"death\", \"death\", \"death\", \"death\", \"death\", \"decrypt\", \"den\", \"desi\", \"design\", \"design\", \"design\", \"design\", \"design\", \"design\", \"design\", \"design\", \"design\", \"deskjet\", \"detroit\", \"devic\", \"devic\", \"devic\", \"devic\", \"diamond\", \"diet\", \"differ\", \"differ\", \"differ\", \"differ\", \"differ\", \"differ\", \"differ\", \"differ\", \"differ\", \"differ\", \"dillon\", \"directori\", \"directori\", \"directori\", \"diseas\", \"disk\", \"disk\", \"disk\", \"display\", \"display\", \"display\", \"display\", \"display\", \"display\", \"display\", \"distribut\", \"distribut\", \"distribut\", \"distribut\", \"distribut\", \"distribut\", \"distribut\", \"distribut\", \"distribut\", \"distribut\", \"divin\", \"divis\", \"divis\", \"divis\", \"divis\", \"divis\", \"divis\", \"divis\", \"divis\", \"divis\", \"dock\", \"doctor\", \"doctor\", \"doctor\", \"doctrin\", \"dodger\", \"drive\", \"drive\", \"drive\", \"drive\", \"drive\", \"drive\", \"drive\", \"drive\", \"driver\", \"driver\", \"driver\", \"driver\", \"driver\", \"dseg\", \"dseg\", \"dtmedin\", \"duke\", \"duke\", \"dyer\", \"earth\", \"earth\", \"earth\", \"earth\", \"earth\", \"earth\", \"edmonton\", \"effect\", \"effect\", \"effect\", \"effect\", \"effect\", \"effect\", \"effect\", \"effect\", \"effect\", \"effect\", \"einstein\", \"eisa\", \"email\", \"email\", \"email\", \"email\", \"email\", \"email\", \"email\", \"email\", \"encrypt\", \"enforc\", \"enforc\", \"enforc\", \"enforc\", \"enforc\", \"engin\", \"engin\", \"engin\", \"engin\", \"engin\", \"engin\", \"engin\", \"engin\", \"engin\", \"engin\", \"engr\", \"entri\", \"entri\", \"entri\", \"ericsson\", \"escrow\", \"esdi\", \"espn\", \"etern\", \"etern\", \"etern\", \"ether\", \"ethernet\", \"ethnic\", \"evid\", \"evid\", \"evid\", \"evid\", \"evid\", \"evid\", \"exist\", \"exist\", \"exist\", \"exist\", \"exist\", \"exist\", \"exist\", \"exist\", \"exist\", \"extermin\", \"faith\", \"faith\", \"fbihh\", \"feder\", \"feder\", \"feder\", \"feder\", \"file\", \"file\", \"file\", \"file\", \"final\", \"final\", \"final\", \"final\", \"final\", \"final\", \"final\", \"final\", \"final\", \"final\", \"firearm\", \"fischer\", \"flight\", \"flight\", \"flight\", \"flight\", \"floppi\", \"floppi\", \"flyer\", \"flyer\", \"fnal\", \"follow\", \"follow\", \"follow\", \"follow\", \"follow\", \"follow\", \"follow\", \"follow\", \"follow\", \"follow\", \"font\", \"font\", \"food\", \"food\", \"food\", \"food\", \"forc\", \"forc\", \"forc\", \"forc\", \"forc\", \"forc\", \"forc\", \"forc\", \"forc\", \"forc\", \"format\", \"format\", \"format\", \"format\", \"format\", \"freenet\", \"freenet\", \"freenet\", \"frost\", \"frost\", \"function\", \"function\", \"function\", \"function\", \"function\", \"function\", \"fund\", \"fund\", \"fund\", \"fund\", \"fund\", \"game\", \"game\", \"game\", \"game\", \"gatech\", \"gaza\", \"genet\", \"genet\", \"genocid\", \"go\", \"go\", \"go\", \"go\", \"go\", \"go\", \"go\", \"go\", \"go\", \"go\", \"goal\", \"goal\", \"goal\", \"goal\", \"goal\", \"goal\", \"god\", \"good\", \"good\", \"good\", \"good\", \"good\", \"good\", \"good\", \"good\", \"good\", \"good\", \"gordon\", \"gordon\", \"gospel\", \"govern\", \"govern\", \"govern\", \"govern\", \"gradi\", \"graphic\", \"graphic\", \"great\", \"great\", \"great\", \"great\", \"great\", \"great\", \"great\", \"great\", \"great\", \"great\", \"greec\", \"greec\", \"greek\", \"greek\", \"greenbelt\", \"grind\", \"grind\", \"grind\", \"grind\", \"grind\", \"grind\", \"grind\", \"group\", \"group\", \"group\", \"group\", \"group\", \"group\", \"group\", \"group\", \"group\", \"group\", \"gtoal\", \"gun\", \"gun\", \"halat\", \"hallam\", \"hamburg\", \"handbook\", \"handgun\", \"handgun\", \"handheld\", \"handheld\", \"handheld\", \"happen\", \"happen\", \"happen\", \"happen\", \"happen\", \"happen\", \"happen\", \"happen\", \"happen\", \"happen\", \"hard\", \"hard\", \"hard\", \"hard\", \"hard\", \"hard\", \"hard\", \"hard\", \"hard\", \"harley\", \"health\", \"health\", \"health\", \"health\", \"heaven\", \"heaven\", \"heaven\", \"heaven\", \"helmet\", \"helmet\", \"helmet\", \"help\", \"help\", \"help\", \"help\", \"help\", \"help\", \"help\", \"help\", \"help\", \"help\", \"henri\", \"henri\", \"higgin\", \"high\", \"high\", \"high\", \"high\", \"high\", \"high\", \"high\", \"high\", \"high\", \"high\", \"hit\", \"hit\", \"hit\", \"hit\", \"hit\", \"hitler\", \"hitter\", \"hockey\", \"holi\", \"holi\", \"home\", \"home\", \"home\", \"home\", \"home\", \"home\", \"home\", \"home\", \"home\", \"home\", \"homeopathi\", \"homicid\", \"honda\", \"hulman\", \"husc\", \"hydro\", \"iastat\", \"iastat\", \"ifa\", \"illinoi\", \"illinoi\", \"illinoi\", \"illinoi\", \"illinoi\", \"illinoi\", \"illinoi\", \"illinoi\", \"imag\", \"imag\", \"imag\", \"imag\", \"imag\", \"imak\", \"includ\", \"includ\", \"includ\", \"includ\", \"includ\", \"includ\", \"includ\", \"includ\", \"includ\", \"includ\", \"indiana\", \"indiana\", \"indiana\", \"indiana\", \"indiana\", \"indiana\", \"infect\", \"inform\", \"inform\", \"inform\", \"inform\", \"inform\", \"inform\", \"inform\", \"inform\", \"inform\", \"inform\", \"ingr\", \"ingr\", \"ingr\", \"inning\", \"instal\", \"instal\", \"instal\", \"instal\", \"instal\", \"insur\", \"insur\", \"insur\", \"insur\", \"intellect\", \"intercon\", \"internet\", \"internet\", \"internet\", \"internet\", \"internet\", \"internet\", \"internet\", \"internet\", \"invest\", \"invest\", \"iran\", \"islam\", \"islam\", \"isra\", \"israel\", \"israel\", \"israel\", \"jaeger\", \"jake\", \"jason\", \"jason\", \"jason\", \"jason\", \"jay\", \"jeff\", \"jeff\", \"jeff\", \"jeff\", \"jeff\", \"jeff\", \"jeff\", \"jesus\", \"jet\", \"jet\", \"jew\", \"jew\", \"jew\", \"job\", \"job\", \"job\", \"john\", \"john\", \"john\", \"john\", \"john\", \"john\", \"john\", \"john\", \"john\", \"john\", \"jumper\", \"jumper\", \"kaldi\", \"kelvin\", \"key\", \"key\", \"kill\", \"kill\", \"kill\", \"kill\", \"kill\", \"kill\", \"kill\", \"koresh\", \"lamp\", \"larc\", \"larc\", \"laughter\", \"launch\", \"launch\", \"laurentian\", \"leaf\", \"leagu\", \"leagu\", \"leav\", \"leav\", \"leav\", \"leav\", \"leav\", \"leav\", \"leav\", \"leav\", \"leav\", \"leav\", \"lebanes\", \"lemieux\", \"librari\", \"librari\", \"librari\", \"librari\", \"librari\", \"librari\", \"life\", \"life\", \"life\", \"life\", \"life\", \"life\", \"life\", \"life\", \"life\", \"life\", \"list\", \"list\", \"list\", \"list\", \"list\", \"list\", \"list\", \"list\", \"list\", \"list\", \"live\", \"live\", \"live\", \"live\", \"live\", \"live\", \"live\", \"live\", \"livesey\", \"long\", \"long\", \"long\", \"long\", \"long\", \"long\", \"long\", \"long\", \"long\", \"long\", \"look\", \"look\", \"look\", \"look\", \"look\", \"look\", \"look\", \"look\", \"look\", \"look\", \"lopez\", \"lord\", \"lord\", \"lose\", \"lose\", \"lose\", \"lose\", \"lose\", \"lose\", \"lose\", \"lose\", \"lose\", \"lose\", \"love\", \"love\", \"love\", \"love\", \"love\", \"love\", \"love\", \"love\", \"lunar\", \"lunar\", \"lyme\", \"machin\", \"machin\", \"machin\", \"machin\", \"machin\", \"machin\", \"machin\", \"machin\", \"magellan\", \"magnus\", \"mail\", \"mail\", \"mail\", \"mail\", \"mail\", \"mail\", \"mail\", \"mail\", \"map\", \"map\", \"mar\", \"mar\", \"marriag\", \"marriag\", \"massacr\", \"maxtor\", \"maynard\", \"mccall\", \"mcgill\", \"mcgill\", \"mcgill\", \"mean\", \"mean\", \"mean\", \"mean\", \"mean\", \"mean\", \"mean\", \"mean\", \"mean\", \"mean\", \"medic\", \"medic\", \"medic\", \"medic\", \"medic\", \"medicin\", \"medicin\", \"medicin\", \"medicin\", \"meg\", \"memori\", \"memori\", \"memori\", \"memori\", \"memori\", \"memori\", \"memori\", \"messag\", \"messag\", \"messag\", \"messag\", \"messag\", \"messag\", \"messag\", \"messag\", \"messag\", \"met\", \"metal\", \"metal\", \"metal\", \"metal\", \"methodolog\", \"midway\", \"midway\", \"midway\", \"migrain\", \"militia\", \"mime\", \"mission\", \"mission\", \"mission\", \"mission\", \"mksol\", \"mode\", \"mode\", \"mode\", \"mode\", \"mode\", \"mode\", \"modem\", \"modem\", \"modem\", \"money\", \"money\", \"money\", \"money\", \"money\", \"money\", \"money\", \"money\", \"monitor\", \"monitor\", \"monitor\", \"montreal\", \"montreal\", \"moon\", \"moon\", \"moon\", \"moral\", \"moral\", \"mormon\", \"motherboard\", \"motif\", \"motorcycl\", \"motto\", \"mous\", \"mous\", \"murder\", \"murder\", \"murder\", \"muslim\", \"muslim\", \"nasa\", \"nasa\", \"nasa\", \"nation\", \"nation\", \"nation\", \"nation\", \"nation\", \"nation\", \"nation\", \"nation\", \"nation\", \"nation\", \"nazi\", \"ncsl\", \"need\", \"need\", \"need\", \"need\", \"need\", \"need\", \"need\", \"need\", \"need\", \"need\", \"netcom\", \"netcom\", \"netcom\", \"netcom\", \"netcom\", \"netcom\", \"nist\", \"nist\", \"nore\", \"nsmca\", \"nubus\", \"number\", \"number\", \"number\", \"number\", \"number\", \"number\", \"number\", \"number\", \"number\", \"number\", \"ohio\", \"ohio\", \"ohio\", \"openwindow\", \"opinion\", \"opinion\", \"opinion\", \"opinion\", \"opinion\", \"opinion\", \"opinion\", \"opinion\", \"opinion\", \"opinion\", \"optilink\", \"oracl\", \"orbit\", \"orbit\", \"outlet\", \"outlet\", \"output\", \"output\", \"output\", \"owner\", \"owner\", \"owner\", \"owner\", \"owner\", \"owner\", \"owner\", \"pain\", \"pain\", \"pain\", \"pain\", \"pain\", \"palestinian\", \"patent\", \"patent\", \"patent\", \"patient\", \"patient\", \"pen\", \"penguin\", \"peopl\", \"peopl\", \"peopl\", \"peopl\", \"peopl\", \"peopl\", \"peopl\", \"peopl\", \"peopl\", \"peopl\", \"period\", \"period\", \"period\", \"period\", \"period\", \"period\", \"period\", \"period\", \"period\", \"person\", \"person\", \"person\", \"person\", \"person\", \"person\", \"person\", \"person\", \"person\", \"person\", \"phone\", \"phone\", \"phone\", \"phone\", \"phone\", \"phone\", \"phone\", \"phone\", \"photographi\", \"physician\", \"pistol\", \"pitch\", \"pitch\", \"pitcher\", \"pitt\", \"pitt\", \"pitt\", \"pittsburgh\", \"pittsburgh\", \"pittsburgh\", \"plaintext\", \"play\", \"play\", \"play\", \"play\", \"play\", \"play\", \"play\", \"play\", \"player\", \"player\", \"playoff\", \"plymouth\", \"point\", \"point\", \"point\", \"point\", \"point\", \"point\", \"point\", \"point\", \"point\", \"point\", \"polit\", \"polit\", \"polit\", \"polit\", \"polit\", \"polit\", \"polygon\", \"popul\", \"popul\", \"popul\", \"popul\", \"port\", \"port\", \"port\", \"power\", \"power\", \"power\", \"power\", \"power\", \"power\", \"power\", \"power\", \"power\", \"power\", \"powerbook\", \"presid\", \"presid\", \"presid\", \"presid\", \"price\", \"price\", \"price\", \"price\", \"price\", \"price\", \"price\", \"princeton\", \"princeton\", \"princeton\", \"princeton\", \"printer\", \"printer\", \"prism\", \"prison\", \"privaci\", \"privat\", \"privat\", \"privat\", \"privat\", \"privat\", \"privat\", \"privat\", \"probe\", \"probe\", \"probe\", \"problem\", \"problem\", \"problem\", \"problem\", \"problem\", \"problem\", \"problem\", \"problem\", \"problem\", \"problem\", \"program\", \"program\", \"program\", \"program\", \"program\", \"program\", \"project\", \"project\", \"project\", \"project\", \"project\", \"propheci\", \"prophet\", \"propos\", \"propos\", \"propos\", \"propos\", \"propos\", \"propos\", \"protect\", \"protect\", \"protect\", \"protect\", \"protect\", \"protect\", \"protect\", \"provid\", \"provid\", \"provid\", \"provid\", \"provid\", \"provid\", \"provid\", \"provid\", \"provid\", \"provid\", \"public\", \"public\", \"public\", \"public\", \"public\", \"public\", \"public\", \"public\", \"public\", \"puck\", \"pyron\", \"quadra\", \"qualcomm\", \"quebec\", \"question\", \"question\", \"question\", \"question\", \"question\", \"question\", \"question\", \"question\", \"question\", \"question\", \"quicktim\", \"raider\", \"ramsey\", \"ranck\", \"ranger\", \"ranger\", \"read\", \"read\", \"read\", \"read\", \"read\", \"read\", \"read\", \"read\", \"read\", \"read\", \"reason\", \"reason\", \"reason\", \"reason\", \"reason\", \"reason\", \"reason\", \"reason\", \"reason\", \"reason\", \"recipi\", \"recipi\", \"redesign\", \"reilli\", \"religi\", \"religi\", \"religion\", \"religion\", \"repli\", \"repli\", \"repli\", \"repli\", \"repli\", \"repli\", \"repli\", \"repli\", \"repli\", \"repli\", \"research\", \"research\", \"research\", \"research\", \"research\", \"research\", \"research\", \"research\", \"research\", \"research\", \"resourc\", \"resourc\", \"resourc\", \"resourc\", \"resourc\", \"resourc\", \"restaur\", \"result\", \"result\", \"result\", \"result\", \"result\", \"result\", \"result\", \"result\", \"result\", \"result\", \"resurrect\", \"revel\", \"revolv\", \"rid\", \"rid\", \"ride\", \"ride\", \"rider\", \"right\", \"right\", \"right\", \"right\", \"right\", \"right\", \"right\", \"right\", \"right\", \"right\", \"ripem\", \"risk\", \"risk\", \"risk\", \"risk\", \"risk\", \"risk\", \"risk\", \"rkba\", \"road\", \"road\", \"road\", \"road\", \"road\", \"road\", \"road\", \"robi\", \"rochest\", \"rochest\", \"rochest\", \"rochest\", \"rochest\", \"rocki\", \"rockwel\", \"run\", \"run\", \"run\", \"run\", \"run\", \"run\", \"run\", \"run\", \"rutger\", \"rutger\", \"rwing\", \"sabbath\", \"sale\", \"sale\", \"sale\", \"sale\", \"sale\", \"sandvik\", \"satan\", \"satellit\", \"satellit\", \"say\", \"say\", \"say\", \"say\", \"say\", \"say\", \"say\", \"say\", \"say\", \"say\", \"scheme\", \"scheme\", \"scheme\", \"scheme\", \"scheme\", \"schneider\", \"scienc\", \"scienc\", \"scienc\", \"scienc\", \"scienc\", \"scienc\", \"scienc\", \"scienc\", \"scienc\", \"scienc\", \"scientif\", \"scientif\", \"scientif\", \"scientif\", \"scientif\", \"score\", \"score\", \"scott\", \"scott\", \"scott\", \"scott\", \"scott\", \"scott\", \"scott\", \"screen\", \"screen\", \"screen\", \"screen\", \"scriptur\", \"scsi\", \"sdpa\", \"sdsu\", \"season\", \"season\", \"secret\", \"secret\", \"secret\", \"secur\", \"secur\", \"secur\", \"secur\", \"selann\", \"sell\", \"sell\", \"sell\", \"sell\", \"sell\", \"sell\", \"sell\", \"sell\", \"send\", \"send\", \"send\", \"send\", \"send\", \"send\", \"send\", \"send\", \"send\", \"send\", \"sera\", \"serdar\", \"server\", \"server\", \"shafer\", \"shaft\", \"shaft\", \"shark\", \"shotgun\", \"shuttl\", \"shuttl\", \"simm\", \"sin\", \"skeptic\", \"skeptic\", \"skndiv\", \"slaughter\", \"sleev\", \"sleev\", \"sleev\", \"smith\", \"smith\", \"smith\", \"smith\", \"smith\", \"smith\", \"smith\", \"smith\", \"smuggl\", \"softwar\", \"softwar\", \"softwar\", \"softwar\", \"softwar\", \"softwar\", \"softwar\", \"softwar\", \"softwar\", \"solar\", \"solar\", \"solar\", \"soldier\", \"soldier\", \"solntz\", \"sourc\", \"sourc\", \"sourc\", \"sourc\", \"sourc\", \"sourc\", \"sourc\", \"sourc\", \"sourc\", \"space\", \"space\", \"space\", \"space\", \"space\", \"spacecraft\", \"spacecraft\", \"spec\", \"spec\", \"spec\", \"speed\", \"speed\", \"speed\", \"speed\", \"speed\", \"spencer\", \"spend\", \"spend\", \"spend\", \"spend\", \"spend\", \"spend\", \"spend\", \"spend\", \"spend\", \"spend\", \"sphere\", \"spirit\", \"spirit\", \"spirit\", \"ssto\", \"stanford\", \"stanford\", \"stanford\", \"stanford\", \"stanford\", \"stanford\", \"stanford\", \"stanford\", \"stanley\", \"stanley\", \"stanley\", \"start\", \"start\", \"start\", \"start\", \"start\", \"start\", \"start\", \"start\", \"start\", \"start\", \"starter\", \"state\", \"state\", \"state\", \"state\", \"state\", \"state\", \"state\", \"state\", \"state\", \"state\", \"station\", \"station\", \"station\", \"station\", \"station\", \"station\", \"station\", \"station\", \"sternlight\", \"steve\", \"steve\", \"steve\", \"steve\", \"steve\", \"steve\", \"steve\", \"steve\", \"steveh\", \"stimulus\", \"stratus\", \"strnlght\", \"studi\", \"studi\", \"studi\", \"studi\", \"studi\", \"studi\", \"studi\", \"studi\", \"suno\", \"superstit\", \"surveil\", \"svga\", \"swap\", \"syndrom\", \"take\", \"take\", \"take\", \"take\", \"take\", \"take\", \"take\", \"take\", \"take\", \"take\", \"tampa\", \"teach\", \"teach\", \"teach\", \"teach\", \"teach\", \"team\", \"team\", \"team\", \"team\", \"team\", \"technolog\", \"technolog\", \"technolog\", \"technolog\", \"technolog\", \"technolog\", \"technolog\", \"technolog\", \"technolog\", \"tell\", \"tell\", \"tell\", \"tell\", \"tell\", \"tell\", \"tell\", \"tell\", \"tell\", \"tell\", \"tennesse\", \"test\", \"test\", \"test\", \"test\", \"test\", \"test\", \"test\", \"test\", \"testament\", \"thank\", \"thank\", \"thank\", \"thank\", \"thank\", \"thank\", \"thank\", \"thank\", \"thank\", \"theist\", \"theodor\", \"theolog\", \"theori\", \"theori\", \"theori\", \"theori\", \"theori\", \"theori\", \"therapi\", \"thing\", \"thing\", \"thing\", \"thing\", \"thing\", \"thing\", \"thing\", \"thing\", \"thing\", \"thing\", \"thomasp\", \"tiff\", \"tiger\", \"time\", \"time\", \"time\", \"time\", \"time\", \"time\", \"time\", \"time\", \"time\", \"time\", \"tire\", \"tire\", \"tire\", \"tire\", \"tire\", \"toolkit\", \"toronto\", \"toronto\", \"toronto\", \"toronto\", \"toronto\", \"treatment\", \"treatment\", \"troop\", \"true\", \"true\", \"true\", \"true\", \"true\", \"true\", \"true\", \"true\", \"true\", \"true\", \"trunk\", \"truth\", \"truth\", \"truth\", \"truth\", \"truth\", \"turk\", \"turkey\", \"turkish\", \"ualberta\", \"uchicago\", \"uchicago\", \"uchicago\", \"ucsc\", \"uicvm\", \"uiuc\", \"uiuc\", \"uiuc\", \"uiuc\", \"uiuc\", \"uiuc\", \"uiuc\", \"uiuc\", \"umich\", \"umich\", \"umich\", \"uoknor\", \"upgrad\", \"upgrad\", \"urartu\", \"urbana\", \"urbana\", \"urbana\", \"user\", \"user\", \"user\", \"user\", \"utah\", \"utkvm\", \"uvic\", \"veal\", \"vehicl\", \"vehicl\", \"vehicl\", \"vehicl\", \"vers\", \"version\", \"version\", \"version\", \"version\", \"version\", \"version\", \"version\", \"version\", \"version\", \"vesa\", \"vesselin\", \"video\", \"video\", \"video\", \"video\", \"villag\", \"villag\", \"virginia\", \"virginia\", \"virginia\", \"virginia\", \"virginia\", \"virginia\", \"virginia\", \"visual\", \"visual\", \"volt\", \"vram\", \"waco\", \"waco\", \"wagon\", \"wagon\", \"want\", \"want\", \"want\", \"want\", \"want\", \"want\", \"want\", \"want\", \"want\", \"want\", \"water\", \"water\", \"water\", \"water\", \"water\", \"weapon\", \"weapon\", \"weapon\", \"wheel\", \"wheel\", \"widget\", \"window\", \"window\", \"window\", \"wing\", \"wing\", \"wing\", \"wing\", \"wing\", \"winnipeg\", \"winnipeg\", \"wire\", \"wire\", \"wire\", \"wiretap\", \"word\", \"word\", \"word\", \"word\", \"word\", \"word\", \"word\", \"word\", \"word\", \"word\", \"work\", \"work\", \"work\", \"work\", \"work\", \"work\", \"work\", \"work\", \"work\", \"work\", \"world\", \"world\", \"world\", \"world\", \"world\", \"world\", \"world\", \"world\", \"world\", \"world\", \"worship\", \"worship\", \"xlib\", \"xpert\", \"xterm\", \"xview\", \"yamaha\", \"yanke\", \"year\", \"year\", \"year\", \"year\", \"year\", \"year\", \"year\", \"year\", \"year\", \"year\", \"yeast\", \"zoolog\", \"zuma\"]}, \"R\": 30, \"lambda.step\": 0.01, \"plot.opts\": {\"xlab\": \"PC1\", \"ylab\": \"PC2\"}, \"topic.order\": [3, 1, 8, 9, 2, 4, 7, 10, 5, 6]};\n", - "\n", - "function LDAvis_load_lib(url, callback){\n", - " var s = document.createElement('script');\n", - " s.src = url;\n", - " s.async = true;\n", - " s.onreadystatechange = s.onload = callback;\n", - " s.onerror = function(){console.warn(\"failed to load library \" + url);};\n", - " document.getElementsByTagName(\"head\")[0].appendChild(s);\n", - "}\n", - "\n", - "if(typeof(LDAvis) !== \"undefined\"){\n", - " // already loaded: just create the visualization\n", - " !function(LDAvis){\n", - " new LDAvis(\"#\" + \"ldavis_el591011124069819927707340541\", ldavis_el591011124069819927707340541_data);\n", - " }(LDAvis);\n", - "}else if(typeof define === \"function\" && define.amd){\n", - " // require.js is available: use it to load d3/LDAvis\n", - " require.config({paths: {d3: \"https://cdnjs.cloudflare.com/ajax/libs/d3/3.5.5/d3.min\"}});\n", - " require([\"d3\"], function(d3){\n", - " window.d3 = d3;\n", - " LDAvis_load_lib(\"https://cdn.rawgit.com/bmabey/pyLDAvis/files/ldavis.v1.0.0.js\", function(){\n", - " new LDAvis(\"#\" + \"ldavis_el591011124069819927707340541\", ldavis_el591011124069819927707340541_data);\n", - " });\n", - " });\n", - "}else{\n", - " // require.js not available: dynamically load d3 & LDAvis\n", - " LDAvis_load_lib(\"https://cdnjs.cloudflare.com/ajax/libs/d3/3.5.5/d3.min.js\", function(){\n", - " LDAvis_load_lib(\"https://cdn.rawgit.com/bmabey/pyLDAvis/files/ldavis.v1.0.0.js\", function(){\n", - " new LDAvis(\"#\" + \"ldavis_el591011124069819927707340541\", ldavis_el591011124069819927707340541_data);\n", - " })\n", - " });\n", - "}\n", - "</script>" - ], - "text/plain": [ - "<IPython.core.display.HTML object>" - ] - }, - "execution_count": 26, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "show_pyldavis('/Users/williamjaubert/Documents/Allianz_William/', 'pyldavis_test_func')" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Step 7: Testing model on unseen document" - ] - }, - { - "cell_type": "code", - "execution_count": 74, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Subject: help\n", - "From: C..Doelle@p26.f3333.n106.z1.fidonet.org (C. Doelle)\n", - "Lines: 13\n", - "\n", - "Hello All!\n", - "\n", - " It is my understanding that all True-Type fonts in Windows are loaded in\n", - "prior to starting Windows - this makes getting into Windows quite slow if you\n", - "have hundreds of them as I do. First off, am I correct in this thinking -\n", - "secondly, if that is the case - can you get Windows to ignore them on boot and\n", - "maybe make something like a PIF file to load them only when you enter the\n", - "applications that need fonts? Any ideas?\n", - "\n", - "\n", - "Chris\n", - "\n", - " * Origin: chris.doelle.@f3333.n106.z1.fidonet.org (1:106/3333.26)\n", - "\n" - ] - } - ], - "source": [ - "unseen_document = newsgroups_test.data[100]\n", - "print(unseen_document)" - ] - }, - { - "cell_type": "code", - "execution_count": 75, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "# Data preprocessing step for the unseen document\n", - "bow_new = dictionary.doc2bow(preprocess(unseen_document))" - ] - }, - { - "cell_type": "code", - "execution_count": 48, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "from nautilus_nlp.models.topic_modeling import fit_data" - ] - }, - { - "cell_type": "code", - "execution_count": 31, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "[(0, 0.0027796067),\n", - " (1, 0.002779247),\n", - " (2, 0.0027795879),\n", - " (3, 0.0027795406),\n", - " (4, 0.0027792477),\n", - " (5, 0.002779096),\n", - " (6, 0.0027791534),\n", - " (7, 0.20895894),\n", - " (8, 0.76880664),\n", - " (9, 0.0027789928)]" - ] - }, - "execution_count": 31, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "fit_data(model, bow_new)" - ] - }, - { - "cell_type": "code", - "execution_count": 1, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "# Show the dominant topics of the new document and their keywords \n", - "from nautilus_nlp.models.topic_modeling import show_dominant_topic" - ] - }, - { - "cell_type": "code", - "execution_count": 147, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Score: 0.7688832879066467\t Topic: ['window', 'drive', 'problem', 'card', 'work']\n", - "Score: 0.2088821828365326\t Topic: ['file', 'program', 'mail', 'imag', 'inform']\n", - "Score: 0.0027796069625765085\t Topic: ['christian', 'peopl', 'believ', 'jesus', 'say']\n" - ] - } - ], - "source": [ - "show_dominant_topic(model, bow_new, 3)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "collapsed": true - }, - "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.7.0" - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} From fc01a49681154b81e76909f135c5dcfc75cbe55c Mon Sep 17 00:00:00 2001 From: Robin <rdoume@gmail.com> Date: Wed, 5 Jun 2019 15:57:10 +0200 Subject: [PATCH 205/496] change import of fasttext_clf --- notebooks/Sentiment_analysis_FT.ipynb | 81 +++++++++++++++------------ 1 file changed, 44 insertions(+), 37 deletions(-) diff --git a/notebooks/Sentiment_analysis_FT.ipynb b/notebooks/Sentiment_analysis_FT.ipynb index 3690d34..e8ba22e 100644 --- a/notebooks/Sentiment_analysis_FT.ipynb +++ b/notebooks/Sentiment_analysis_FT.ipynb @@ -20,21 +20,28 @@ }, { "cell_type": "code", - "execution_count": 3, + "execution_count": 2, "metadata": {}, "outputs": [ { - "ename": "NameError", - "evalue": "name 'train' is not defined", - "output_type": "error", - "traceback": [ - "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", - "\u001b[0;31mNameError\u001b[0m Traceback (most recent call last)", - "\u001b[0;32m<ipython-input-3-56711baad5fa>\u001b[0m in \u001b[0;36m<module>\u001b[0;34m\u001b[0m\n\u001b[1;32m 23\u001b[0m \u001b[0mprint\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34mf'__label__{row[\"target\"]} {text}'\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mfile\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mtest\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 24\u001b[0m \u001b[0;32melse\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m---> 25\u001b[0;31m \u001b[0mprint\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34mf'__label__{row[\"target\"]} {text}'\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mfile\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mtrain\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", - "\u001b[0;31mNameError\u001b[0m: name 'train' is not defined" + "name": "stdout", + "output_type": "stream", + "text": [ + "total 86M\n", + "-rw-rw-r-- 1 robin robin 81M juin 5 15:31 tweets.train\n", + "-rw-rw-r-- 1 robin robin 5,4M juin 5 15:31 tweets.valid\n" ] } ], + "source": [ + "ls -lh ../data/processed" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [], "source": [ "\n", "train = open('../data/processed/tweets.train','w',encoding='utf-8') \n", @@ -74,16 +81,16 @@ }, { "cell_type": "code", - "execution_count": 2, + "execution_count": 4, "metadata": {}, "outputs": [], "source": [ - "from nautilus_nlp.models import Fasttext_classifier " + "from nautilus_nlp.models import fasttext_classifier " ] }, { "cell_type": "code", - "execution_count": 3, + "execution_count": 5, "metadata": {}, "outputs": [], "source": [ @@ -95,77 +102,77 @@ "train_data = '../data/processed/tweets.train'\n", "valid_data = '../data/processed/tweets.valid'\n", "\n", - "model = Fasttext_classifier.Fasttext_clf()\n" + "model = fasttext_classifier.Fasttext_clf()\n" ] }, { "cell_type": "code", - "execution_count": 8, + "execution_count": 6, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "N\t100000\n", - "P@1\t0.759\n", - "R@1\t0.759\n" + "12.3 s ± 944 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)\n" ] } ], "source": [ - "print_results(*model.test(valid_data))\n" + "%%timeit\n", + "model.train(train_data)\n" ] }, { "cell_type": "code", - "execution_count": 6, + "execution_count": 7, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "12.9 s ± 1.26 s per loop (mean ± std. dev. of 7 runs, 1 loop each)\n" + "N\t99880\n", + "P@1\t0.755\n", + "R@1\t0.755\n" ] } ], "source": [ - "%%timeit\n", - "model.train(train_data)\n" + "print_results(*model.test(valid_data))\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ - "Il faut donc 13 secondes pour entrainer un modèle sur 1.5 Millions de tweets, avec une précision de 0.759. Not bad" + "Il faut donc 13 secondes pour entrainer un modèle sur 1.5 Millions de tweets, avec une précision de 0.75. Not bad" ] }, { "cell_type": "code", - "execution_count": 9, + "execution_count": 8, "metadata": {}, "outputs": [], "source": [ - "model.save_model('/home/nautilus_nlp/models/sentiments.bin')" + "model.save_model('sentiments.bin')" ] }, { "cell_type": "code", - "execution_count": 11, + "execution_count": 9, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "-rw-r--r-- 1 root root 232M Mar 14 12:51 /home/nautilus_nlp/models/sentiments.bin\n" + "-rw-rw-r-- 1 robin robin 232M juin 5 15:55 sentiments.bin\n" ] } ], "source": [ - "!ls -lh '/home/nautilus_nlp/models/sentiments.bin'" + "!ls -lh 'sentiments.bin'" ] }, { @@ -184,40 +191,40 @@ }, { "cell_type": "code", - "execution_count": 12, + "execution_count": 10, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "N\t100000\n", - "P@1\t0.759\n", - "R@1\t0.759\n" + "N\t99880\n", + "P@1\t0.755\n", + "R@1\t0.755\n" ] } ], "source": [ "model.quantize(input=train_data, qnorm=True, retrain=True, cutoff=100000)\n", "print_results(*model.test(valid_data))\n", - "model.save_model('/home/nautilus_nlp/models/sentiments.ftz')" + "model.save_model('sentiments.ftz')" ] }, { "cell_type": "code", - "execution_count": 13, + "execution_count": 11, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "-rw-r--r-- 1 root root 6.8M Mar 14 12:53 /home/nautilus_nlp/models/sentiments.ftz\n" + "-rw-rw-r-- 1 robin robin 6,8M juin 5 15:56 sentiments.ftz\n" ] } ], "source": [ - "!ls -lh '/home/nautilus_nlp/models/sentiments.ftz'" + "!ls -lh 'sentiments.ftz'" ] }, { @@ -244,7 +251,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.7.3" + "version": "3.7.2" } }, "nbformat": 4, From a0707803d35984bbf36bcdc48593b1fd06de90f9 Mon Sep 17 00:00:00 2001 From: pymousse <py.mousset@hotmail.fr> Date: Fri, 7 Jun 2019 11:08:22 +0200 Subject: [PATCH 206/496] add biterm model script V0 --- .gitignore | 4 +- nautilus_nlp/models/biterm_model.py | 59 +++++++++++++++++++++++++++++ requirements.txt | 1 + 3 files changed, 63 insertions(+), 1 deletion(-) create mode 100644 nautilus_nlp/models/biterm_model.py diff --git a/.gitignore b/.gitignore index ca31cb0..183f817 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,4 @@ + # Byte-compiled / optimized / DLL files __pycache__/ *.py[cod] @@ -65,6 +66,7 @@ target/ # Pycharm .idea +venv/ # VS Code .vscode/ @@ -97,4 +99,4 @@ target/ # PyTest cache .pytest_cache/ -data/ \ No newline at end of file +data/ diff --git a/nautilus_nlp/models/biterm_model.py b/nautilus_nlp/models/biterm_model.py new file mode 100644 index 0000000..d07e65d --- /dev/null +++ b/nautilus_nlp/models/biterm_model.py @@ -0,0 +1,59 @@ +import numpy as np +from biterm.btm import oBTM +from biterm.utility import vec_to_biterms, topic_summuary +from sklearn.feature_extraction.text import CountVectorizer + + +class biterm_model: + + def __init__(self, data, nb_topics, nb_iteration, lang='english'): + self.data = data + self.nb_topics = nb_topics + self.nb_iteration = nb_iteration + self.lang = lang + self.btm = None + self.topics = None + self.vocab = None + self.X = None + + def train_biterm_model(self): + vec = CountVectorizer(stop_words=self.lang) + self.X = vec.fit_transform(self.data).toarray() + + self.vocab = np.array(vec.get_feature_names()) + biterms = vec_to_biterms(self.X) + self.btm = oBTM(num_topics=self.nb_topics, V=self.vocab) + self.topics = self.btm.fit_transform(biterms, iterations=self.nb_iteration) + + def get_cluster_biterm(self, nb_word_per_cluster): + results = topic_summuary(self.btm.phi_wz.T, self.X, self.vocab, nb_word_per_cluster, verbose=False) + + return results + + def get_text_topic(self, indice): + return self.topics[indice].argmax() + + +text = """Cola 1.5L Carrefour,Pepsi Cola Light 1.5L,Pepsi Cola Twist Light +,Cola 1.5L CRF DISC,Coca-Cola Light 1.5L,Coca-Cola Light 4x0.5L,Coca-Cola Light 6x0.3L +,Panzani 200g x 4 bio,Rustichella 150g bio,De Cecco - Fusilli bio,Gerblé sans Gluten50g +,Penne de riz 100g sans gluten,Spaghetti de maïs 50g sans Glute""" +text = text.split(",") + +nb_topics = 5 +nb_word_per_cluster = 5 +nb_iteration = 100 +language = 'english' + +BitermModel = biterm_model(data=text + , nb_topics=nb_topics + , nb_iteration=nb_iteration + , lang='english') + +BitermModel.train_biterm_model() + +clusters = BitermModel.get_cluster_biterm(nb_word_per_cluster=nb_word_per_cluster) +print(clusters) + +indice = 0 +print("cluster indice", BitermModel.get_text_topic(indice)) diff --git a/requirements.txt b/requirements.txt index b36aa9c..4dfae63 100644 --- a/requirements.txt +++ b/requirements.txt @@ -37,6 +37,7 @@ flashtext==2.7 phonenumbers==8.10.12 emoji>=0.5.2 summa==1.2.0 +biterm==0.1.5 From f2fcf904ebf4c445be445e969e15d5d0cc8f022a Mon Sep 17 00:00:00 2001 From: pymousse <py.mousset@hotmail.fr> Date: Fri, 7 Jun 2019 12:02:35 +0200 Subject: [PATCH 207/496] add jupyter notebook and add refacto biterm_model --- nautilus_nlp/models/biterm_model.py | 59 +++---- notebooks/4. Topic Modeling.ipynb | 15 +- notebooks/5. Topic Modeling - Biterm.ipynb | 181 +++++++++++++++++++++ 3 files changed, 219 insertions(+), 36 deletions(-) create mode 100644 notebooks/5. Topic Modeling - Biterm.ipynb diff --git a/nautilus_nlp/models/biterm_model.py b/nautilus_nlp/models/biterm_model.py index d07e65d..89d37a0 100644 --- a/nautilus_nlp/models/biterm_model.py +++ b/nautilus_nlp/models/biterm_model.py @@ -4,9 +4,17 @@ from sklearn.feature_extraction.text import CountVectorizer -class biterm_model: +class BitermModel: def __init__(self, data, nb_topics, nb_iteration, lang='english'): + """ + Model for topic modelling + Particularly useful for short texts + :param data: a list of string, each string can be a document + :param nb_topics: positive int + :param nb_iteration: positive int + :param lang: str, language to remove the stop words + """ self.data = data self.nb_topics = nb_topics self.nb_iteration = nb_iteration @@ -16,44 +24,25 @@ def __init__(self, data, nb_topics, nb_iteration, lang='english'): self.vocab = None self.X = None - def train_biterm_model(self): + def pre_processing(self, data): vec = CountVectorizer(stop_words=self.lang) - self.X = vec.fit_transform(self.data).toarray() - - self.vocab = np.array(vec.get_feature_names()) - biterms = vec_to_biterms(self.X) - self.btm = oBTM(num_topics=self.nb_topics, V=self.vocab) - self.topics = self.btm.fit_transform(biterms, iterations=self.nb_iteration) - - def get_cluster_biterm(self, nb_word_per_cluster): - results = topic_summuary(self.btm.phi_wz.T, self.X, self.vocab, nb_word_per_cluster, verbose=False) - - return results + X = vec.fit_transform(data).toarray() + vocab = np.array(vec.get_feature_names()) - def get_text_topic(self, indice): - return self.topics[indice].argmax() + return X, vocab + def train_biterm_model(self): + X, vocab = self.pre_processing(self.data) -text = """Cola 1.5L Carrefour,Pepsi Cola Light 1.5L,Pepsi Cola Twist Light -,Cola 1.5L CRF DISC,Coca-Cola Light 1.5L,Coca-Cola Light 4x0.5L,Coca-Cola Light 6x0.3L -,Panzani 200g x 4 bio,Rustichella 150g bio,De Cecco - Fusilli bio,Gerblé sans Gluten50g -,Penne de riz 100g sans gluten,Spaghetti de maïs 50g sans Glute""" -text = text.split(",") - -nb_topics = 5 -nb_word_per_cluster = 5 -nb_iteration = 100 -language = 'english' - -BitermModel = biterm_model(data=text - , nb_topics=nb_topics - , nb_iteration=nb_iteration - , lang='english') + biterms = vec_to_biterms(X) + self.btm = oBTM(num_topics=self.nb_topics, V=vocab) + self.topics = self.btm.fit_transform(biterms, iterations=self.nb_iteration) -BitermModel.train_biterm_model() + def get_cluster_biterm(self, data, nb_word_per_cluster): + X, vocab = self.pre_processing(data) + results = topic_summuary(self.btm.phi_wz.T, X, vocab, nb_word_per_cluster, verbose=False) -clusters = BitermModel.get_cluster_biterm(nb_word_per_cluster=nb_word_per_cluster) -print(clusters) + return results -indice = 0 -print("cluster indice", BitermModel.get_text_topic(indice)) + def get_text_topic(self, index): + return self.topics[index].argmax() diff --git a/notebooks/4. Topic Modeling.ipynb b/notebooks/4. Topic Modeling.ipynb index 56d3efe..7d040fd 100644 --- a/notebooks/4. Topic Modeling.ipynb +++ b/notebooks/4. Topic Modeling.ipynb @@ -933,7 +933,20 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.7.0" + "version": "3.7.1" + }, + "toc": { + "base_numbering": 1, + "nav_menu": {}, + "number_sections": true, + "sideBar": true, + "skip_h1_title": false, + "title_cell": "Table of Contents", + "title_sidebar": "Contents", + "toc_cell": false, + "toc_position": {}, + "toc_section_display": true, + "toc_window_display": false } }, "nbformat": 4, diff --git a/notebooks/5. Topic Modeling - Biterm.ipynb b/notebooks/5. Topic Modeling - Biterm.ipynb new file mode 100644 index 0000000..0a519e0 --- /dev/null +++ b/notebooks/5. Topic Modeling - Biterm.ipynb @@ -0,0 +1,181 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# 5. Topic Modeling - Biterm Model" + ] + }, + { + "cell_type": "code", + "execution_count": 23, + "metadata": {}, + "outputs": [], + "source": [ + "from nautilus_nlp.models.biterm_model import BiterModel\n", + "import pandas as pd" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Step 1: Load the dataset" + ] + }, + { + "cell_type": "code", + "execution_count": 24, + "metadata": {}, + "outputs": [], + "source": [ + "text = ['Cola 1.5L Carrefour',\n", + " 'Pepsi Cola Light 1.5L',\n", + " 'Pepsi Cola Twist Light\\n',\n", + " 'Cola 1.5L CRF DISC',\n", + " 'Coca-Cola Light 1.5L',\n", + " 'Coca-Cola Light 4x0.5L',\n", + " 'Coca-Cola Light 6x0.3L\\n',\n", + " 'Panzani 200g x 4 bio',\n", + " 'Rustichella 150g bio',\n", + " 'De Cecco - Fusilli bio',\n", + " 'Gerblé sans Gluten50g\\n',\n", + " 'Penne de riz 100g sans gluten',\n", + " 'Spaghetti de maïs 50g sans Glute']\n", + "\n", + "text2 = ['De Cecco - Fusilli bio',\n", + " 'Gerblé sans Gluten50g\\n',\n", + " 'Penne de riz 100g sans gluten',\n", + " 'Spaghetti de maïs 50g sans Glute']" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Step 2: Prediction" + ] + }, + { + "cell_type": "code", + "execution_count": 25, + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "100%|██████████| 100/100 [00:00<00:00, 109.64it/s]\n" + ] + }, + { + "ename": "TypeError", + "evalue": "get_cluster_biterm() got an unexpected keyword argument 'data'", + "output_type": "error", + "traceback": [ + "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", + "\u001b[0;31mTypeError\u001b[0m Traceback (most recent call last)", + "\u001b[0;32m<ipython-input-25-d9e10b244579>\u001b[0m in \u001b[0;36m<module>\u001b[0;34m\u001b[0m\n\u001b[1;32m 12\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 13\u001b[0m clusters = BitermModel.get_cluster_biterm(data=text\n\u001b[0;32m---> 14\u001b[0;31m ,nb_word_per_cluster=nb_word_per_cluster)\n\u001b[0m", + "\u001b[0;31mTypeError\u001b[0m: get_cluster_biterm() got an unexpected keyword argument 'data'" + ] + } + ], + "source": [ + "nb_topics = 5\n", + "nb_word_per_cluster = 5\n", + "nb_iteration = 100\n", + "language = 'english'\n", + "\n", + "BitermModel = biterm_model(data=text\n", + " , nb_topics=nb_topics\n", + " , nb_iteration=nb_iteration\n", + " , lang='english')\n", + "\n", + "BitermModel.train_biterm_model()\n", + "\n", + "clusters = BitermModel.get_cluster_biterm(data=text2\n", + " ,nb_word_per_cluster=nb_word_per_cluster)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "pd.DataFrame(clusters)" + ] + }, + { + "cell_type": "code", + "execution_count": 22, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "text: Cola 1.5L Carrefour\n", + "cluster indice: 3\n" + ] + } + ], + "source": [ + "index = 0\n", + "cluster_predicted = BitermModel.get_text_topic(index=index)\n", + "\n", + "print(\"text:\", text[index])\n", + "print(\"cluster indice:\", cluster_predicted)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "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.7.1" + }, + "toc": { + "base_numbering": 1, + "nav_menu": {}, + "number_sections": true, + "sideBar": true, + "skip_h1_title": false, + "title_cell": "Table of Contents", + "title_sidebar": "Contents", + "toc_cell": false, + "toc_position": {}, + "toc_section_display": true, + "toc_window_display": false + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} From 1bfd05e2dc958d576d32aa39088716ab89b921bd Mon Sep 17 00:00:00 2001 From: pymousse <py.mousset@hotmail.fr> Date: Fri, 7 Jun 2019 14:22:09 +0200 Subject: [PATCH 208/496] add unit test --- nautilus_nlp/models/biterm_model.py | 47 ++++++++----- notebooks/5. Topic Modeling - Biterm.ipynb | 75 +++++++++++---------- tests/biterm_testing.py | 77 ++++++++++++++++++++++ 3 files changed, 149 insertions(+), 50 deletions(-) create mode 100644 tests/biterm_testing.py diff --git a/nautilus_nlp/models/biterm_model.py b/nautilus_nlp/models/biterm_model.py index 89d37a0..d366f24 100644 --- a/nautilus_nlp/models/biterm_model.py +++ b/nautilus_nlp/models/biterm_model.py @@ -6,6 +6,23 @@ class BitermModel: + @staticmethod + def is_int_positive(number): + if type(number) != int: + raise ValueError("Parameter {} has to be an integer".format(number)) + if number < 1: + raise ValueError("Parameter {} has to be positive".format(number)) + + @staticmethod + def is_list_of_string(data): + if type(data) != list: + raise ValueError("{} has to be a list".format(data)) + if len(data) == 0: + raise ValueError("{} is empty".format(data)) + for document in data: + if type(document) != str: + raise ValueError("All elements of {} have to be a string, problem with {}".format(data, document)) + def __init__(self, data, nb_topics, nb_iteration, lang='english'): """ Model for topic modelling @@ -15,34 +32,32 @@ def __init__(self, data, nb_topics, nb_iteration, lang='english'): :param nb_iteration: positive int :param lang: str, language to remove the stop words """ + + self.is_int_positive(nb_topics) + self.is_int_positive(nb_iteration) + self.is_list_of_string(data) + self.data = data self.nb_topics = nb_topics self.nb_iteration = nb_iteration self.lang = lang - self.btm = None self.topics = None - self.vocab = None - self.X = None - def pre_processing(self, data): + def get_clusters(self, nb_word_per_cluster): vec = CountVectorizer(stop_words=self.lang) - X = vec.fit_transform(data).toarray() + X = vec.fit_transform(self.data).toarray() vocab = np.array(vec.get_feature_names()) - return X, vocab - - def train_biterm_model(self): - X, vocab = self.pre_processing(self.data) - biterms = vec_to_biterms(X) - self.btm = oBTM(num_topics=self.nb_topics, V=vocab) - self.topics = self.btm.fit_transform(biterms, iterations=self.nb_iteration) + btm = oBTM(num_topics=self.nb_topics, V=vocab) + self.topics = btm.fit_transform(biterms, iterations=self.nb_iteration) - def get_cluster_biterm(self, data, nb_word_per_cluster): - X, vocab = self.pre_processing(data) - results = topic_summuary(self.btm.phi_wz.T, X, vocab, nb_word_per_cluster, verbose=False) + results = topic_summuary(btm.phi_wz.T, X, vocab, nb_word_per_cluster, verbose=False) return results - def get_text_topic(self, index): + def get_document_topic(self, index): + if self.topics is None: + raise ValueError("Model needs to be trained first") + return self.topics[index].argmax() diff --git a/notebooks/5. Topic Modeling - Biterm.ipynb b/notebooks/5. Topic Modeling - Biterm.ipynb index 0a519e0..fcde300 100644 --- a/notebooks/5. Topic Modeling - Biterm.ipynb +++ b/notebooks/5. Topic Modeling - Biterm.ipynb @@ -9,11 +9,11 @@ }, { "cell_type": "code", - "execution_count": 23, + "execution_count": 2, "metadata": {}, "outputs": [], "source": [ - "from nautilus_nlp.models.biterm_model import BiterModel\n", + "from nautilus_nlp.models.biterm_model import BitermModel\n", "import pandas as pd" ] }, @@ -26,7 +26,7 @@ }, { "cell_type": "code", - "execution_count": 24, + "execution_count": 3, "metadata": {}, "outputs": [], "source": [ @@ -42,12 +42,7 @@ " 'De Cecco - Fusilli bio',\n", " 'Gerblé sans Gluten50g\\n',\n", " 'Penne de riz 100g sans gluten',\n", - " 'Spaghetti de maïs 50g sans Glute']\n", - "\n", - "text2 = ['De Cecco - Fusilli bio',\n", - " 'Gerblé sans Gluten50g\\n',\n", - " 'Penne de riz 100g sans gluten',\n", - " 'Spaghetti de maïs 50g sans Glute']" + " 'Spaghetti de maïs 50g sans Glute']\n" ] }, { @@ -59,25 +54,18 @@ }, { "cell_type": "code", - "execution_count": 25, + "execution_count": 8, "metadata": {}, "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "100%|██████████| 100/100 [00:00<00:00, 109.64it/s]\n" - ] - }, { "ename": "TypeError", - "evalue": "get_cluster_biterm() got an unexpected keyword argument 'data'", + "evalue": "'BitermModel' object is not callable", "output_type": "error", "traceback": [ "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", "\u001b[0;31mTypeError\u001b[0m Traceback (most recent call last)", - "\u001b[0;32m<ipython-input-25-d9e10b244579>\u001b[0m in \u001b[0;36m<module>\u001b[0;34m\u001b[0m\n\u001b[1;32m 12\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 13\u001b[0m clusters = BitermModel.get_cluster_biterm(data=text\n\u001b[0;32m---> 14\u001b[0;31m ,nb_word_per_cluster=nb_word_per_cluster)\n\u001b[0m", - "\u001b[0;31mTypeError\u001b[0m: get_cluster_biterm() got an unexpected keyword argument 'data'" + "\u001b[0;32m<ipython-input-8-0a7a42618657>\u001b[0m in \u001b[0;36m<module>\u001b[0;34m\u001b[0m\n\u001b[1;32m 7\u001b[0m \u001b[0;34m,\u001b[0m \u001b[0mnb_topics\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mnb_topics\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 8\u001b[0m \u001b[0;34m,\u001b[0m \u001b[0mnb_iteration\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mnb_iteration\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 9\u001b[0;31m , lang='english')\n\u001b[0m\u001b[1;32m 10\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 11\u001b[0m \u001b[0mBitermModel\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mtrain_biterm_model\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;31mTypeError\u001b[0m: 'BitermModel' object is not callable" ] } ], @@ -87,37 +75,49 @@ "nb_iteration = 100\n", "language = 'english'\n", "\n", - "BitermModel = biterm_model(data=text\n", + "biterm_model = BitermModel(data=text\n", " , nb_topics=nb_topics\n", " , nb_iteration=nb_iteration\n", - " , lang='english')\n", - "\n", - "BitermModel.train_biterm_model()\n", + " , lang=language)\n", "\n", - "clusters = BitermModel.get_cluster_biterm(data=text2\n", - " ,nb_word_per_cluster=nb_word_per_cluster)" + "clusters = biterm_model.get_clusters(nb_word_per_cluster)" ] }, { "cell_type": "code", - "execution_count": null, + "execution_count": 5, "metadata": {}, - "outputs": [], + "outputs": [ + { + "ename": "NameError", + "evalue": "name 'clusters' is not defined", + "output_type": "error", + "traceback": [ + "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", + "\u001b[0;31mNameError\u001b[0m Traceback (most recent call last)", + "\u001b[0;32m<ipython-input-5-04f384659793>\u001b[0m in \u001b[0;36m<module>\u001b[0;34m\u001b[0m\n\u001b[0;32m----> 1\u001b[0;31m \u001b[0mpd\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mDataFrame\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mclusters\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", + "\u001b[0;31mNameError\u001b[0m: name 'clusters' is not defined" + ] + } + ], "source": [ "pd.DataFrame(clusters)" ] }, { "cell_type": "code", - "execution_count": 22, + "execution_count": 6, "metadata": {}, "outputs": [ { - "name": "stdout", - "output_type": "stream", - "text": [ - "text: Cola 1.5L Carrefour\n", - "cluster indice: 3\n" + "ename": "TypeError", + "evalue": "get_text_topic() missing 1 required positional argument: 'self'", + "output_type": "error", + "traceback": [ + "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", + "\u001b[0;31mTypeError\u001b[0m Traceback (most recent call last)", + "\u001b[0;32m<ipython-input-6-9cb3dc9a51fd>\u001b[0m in \u001b[0;36m<module>\u001b[0;34m\u001b[0m\n\u001b[1;32m 1\u001b[0m \u001b[0mindex\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;36m0\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 2\u001b[0;31m \u001b[0mcluster_predicted\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mBitermModel\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mget_text_topic\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mindex\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mindex\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 3\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 4\u001b[0m \u001b[0mprint\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m\"text:\"\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mtext\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mindex\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 5\u001b[0m \u001b[0mprint\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m\"cluster indice:\"\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mcluster_predicted\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;31mTypeError\u001b[0m: get_text_topic() missing 1 required positional argument: 'self'" ] } ], @@ -136,6 +136,13 @@ "outputs": [], "source": [] }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + }, { "cell_type": "code", "execution_count": null, diff --git a/tests/biterm_testing.py b/tests/biterm_testing.py new file mode 100644 index 0000000..a397765 --- /dev/null +++ b/tests/biterm_testing.py @@ -0,0 +1,77 @@ +from nautilus_nlp.models.biterm_model import BitermModel +import pandas as pd +import pytest + + +class UnitTestBiterm: + + def __init__(self): + self.text = ['Cola 1.5L Carrefour', + 'Pepsi Cola Light 1.5L', + 'Pepsi Cola Twist Light', + 'Cola 1.5L CRF DISC', + 'Coca-Cola Light 1.5L', + 'Coca-Cola Light 4x0.5L', + 'Coca-Cola Light 6x0.3L', + 'Panzani 200g x 4 bio', + 'Rustichella 150g bio', + 'De Cecco - Fusilli bio', + 'Gerblé sans Gluten50g', + 'Penne de riz 100g sans gluten', + 'Spaghetti de maïs 50g sans Glute'] + + self.nb_topics = 5 + self.nb_word_per_cluster = 5 + self.nb_iteration = 100 + self.language = 'english' + + def run_tests(self): + self.test_number_topic_correct() + for element in ["de", [], 4.5, (23, 24)]: + self.test_number_iteration_non_int(element) + self.test_number_topic_non_int(element) + self.test_data_input(element) + + self.test_number_iteration_negative(-5) + self.test_number_topic_negative(-5) + self.test_data_input(["def", 3]) + self.test_data_input(3) + self.test_no_initialisation() + + def test_number_topic_correct(self): + biterm_model = BitermModel(data=self.text + , nb_topics=self.nb_topics + , nb_iteration=self.nb_iteration + , lang=self.language) + clusters = biterm_model.get_clusters(nb_word_per_cluster=self.nb_word_per_cluster) + assert len(pd.DataFrame(clusters)) == 5 + + def test_number_topic_negative(self, nb_topics): + with pytest.raises(ValueError): + BitermModel(data=self.text, nb_topics=nb_topics, nb_iteration=self.nb_iteration, lang=self.language) + + def test_number_topic_non_int(self, nb_topics): + with pytest.raises(ValueError): + BitermModel(data=self.text, nb_topics=nb_topics, nb_iteration=self.nb_iteration, lang=self.language) + + def test_number_iteration_negative(self, nb_iteration): + with pytest.raises(ValueError): + BitermModel(data=self.text, nb_topics=self.nb_topics, nb_iteration=nb_iteration, lang=self.language) + + def test_number_iteration_non_int(self, nb_iteration): + with pytest.raises(ValueError): + BitermModel(data=self.text, nb_topics=self.nb_topics, nb_iteration=nb_iteration, lang=self.language) + + def test_data_input(self, data): + with pytest.raises(ValueError): + BitermModel(data=data, nb_topics=self.nb_topics, nb_iteration=self.nb_iteration, lang=self.language) + + def test_no_initialisation(self): + with pytest.raises(ValueError): + biter_model = BitermModel(data=self.text, nb_topics=self.nb_topics, nb_iteration=self.nb_iteration, + lang=self.language) + biter_model.get_document_topic(2) + + +unit_test = UnitTestBiterm() +unit_test.run_tests() From e0eb0cec53ae986dc4c3a3bdfd40f16a962fc6e8 Mon Sep 17 00:00:00 2001 From: pymousse <py.mousset@hotmail.fr> Date: Fri, 7 Jun 2019 14:24:52 +0200 Subject: [PATCH 209/496] fix bug variable naming --- notebooks/5. Topic Modeling - Biterm.ipynb | 112 +++++++++++++++------ 1 file changed, 81 insertions(+), 31 deletions(-) diff --git a/notebooks/5. Topic Modeling - Biterm.ipynb b/notebooks/5. Topic Modeling - Biterm.ipynb index fcde300..c92dc18 100644 --- a/notebooks/5. Topic Modeling - Biterm.ipynb +++ b/notebooks/5. Topic Modeling - Biterm.ipynb @@ -9,7 +9,7 @@ }, { "cell_type": "code", - "execution_count": 2, + "execution_count": 1, "metadata": {}, "outputs": [], "source": [ @@ -26,7 +26,7 @@ }, { "cell_type": "code", - "execution_count": 3, + "execution_count": 2, "metadata": {}, "outputs": [], "source": [ @@ -54,18 +54,14 @@ }, { "cell_type": "code", - "execution_count": 8, + "execution_count": 3, "metadata": {}, "outputs": [ { - "ename": "TypeError", - "evalue": "'BitermModel' object is not callable", - "output_type": "error", - "traceback": [ - "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", - "\u001b[0;31mTypeError\u001b[0m Traceback (most recent call last)", - "\u001b[0;32m<ipython-input-8-0a7a42618657>\u001b[0m in \u001b[0;36m<module>\u001b[0;34m\u001b[0m\n\u001b[1;32m 7\u001b[0m \u001b[0;34m,\u001b[0m \u001b[0mnb_topics\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mnb_topics\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 8\u001b[0m \u001b[0;34m,\u001b[0m \u001b[0mnb_iteration\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mnb_iteration\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 9\u001b[0;31m , lang='english')\n\u001b[0m\u001b[1;32m 10\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 11\u001b[0m \u001b[0mBitermModel\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mtrain_biterm_model\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", - "\u001b[0;31mTypeError\u001b[0m: 'BitermModel' object is not callable" + "name": "stderr", + "output_type": "stream", + "text": [ + "100%|██████████| 100/100 [00:00<00:00, 101.68it/s]\n" ] } ], @@ -85,19 +81,76 @@ }, { "cell_type": "code", - "execution_count": 5, + "execution_count": 4, "metadata": {}, "outputs": [ { - "ename": "NameError", - "evalue": "name 'clusters' is not defined", - "output_type": "error", - "traceback": [ - "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", - "\u001b[0;31mNameError\u001b[0m Traceback (most recent call last)", - "\u001b[0;32m<ipython-input-5-04f384659793>\u001b[0m in \u001b[0;36m<module>\u001b[0;34m\u001b[0m\n\u001b[0;32m----> 1\u001b[0;31m \u001b[0mpd\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mDataFrame\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mclusters\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", - "\u001b[0;31mNameError\u001b[0m: name 'clusters' is not defined" - ] + "data": { + "text/html": [ + "<div>\n", + "<style scoped>\n", + " .dataframe tbody tr th:only-of-type {\n", + " vertical-align: middle;\n", + " }\n", + "\n", + " .dataframe tbody tr th {\n", + " vertical-align: top;\n", + " }\n", + "\n", + " .dataframe thead th {\n", + " text-align: right;\n", + " }\n", + "</style>\n", + "<table border=\"1\" class=\"dataframe\">\n", + " <thead>\n", + " <tr style=\"text-align: right;\">\n", + " <th></th>\n", + " <th>coherence</th>\n", + " <th>top_words</th>\n", + " </tr>\n", + " </thead>\n", + " <tbody>\n", + " <tr>\n", + " <th>0</th>\n", + " <td>-5.631692</td>\n", + " <td>[5l, cola, disc, crf, carrefour]</td>\n", + " </tr>\n", + " <tr>\n", + " <th>1</th>\n", + " <td>-4.350759</td>\n", + " <td>[light, cola, coca, 5l, pepsi]</td>\n", + " </tr>\n", + " <tr>\n", + " <th>2</th>\n", + " <td>3.635635</td>\n", + " <td>[100g, sans, riz, penne, gluten]</td>\n", + " </tr>\n", + " <tr>\n", + " <th>3</th>\n", + " <td>2.537023</td>\n", + " <td>[sans, spaghetti, 50g, maïs, glute]</td>\n", + " </tr>\n", + " <tr>\n", + " <th>4</th>\n", + " <td>-0.235566</td>\n", + " <td>[bio, 150g, rustichella, 200g, panzani]</td>\n", + " </tr>\n", + " </tbody>\n", + "</table>\n", + "</div>" + ], + "text/plain": [ + " coherence top_words\n", + "0 -5.631692 [5l, cola, disc, crf, carrefour]\n", + "1 -4.350759 [light, cola, coca, 5l, pepsi]\n", + "2 3.635635 [100g, sans, riz, penne, gluten]\n", + "3 2.537023 [sans, spaghetti, 50g, maïs, glute]\n", + "4 -0.235566 [bio, 150g, rustichella, 200g, panzani]" + ] + }, + "execution_count": 4, + "metadata": {}, + "output_type": "execute_result" } ], "source": [ @@ -106,24 +159,21 @@ }, { "cell_type": "code", - "execution_count": 6, + "execution_count": 7, "metadata": {}, "outputs": [ { - "ename": "TypeError", - "evalue": "get_text_topic() missing 1 required positional argument: 'self'", - "output_type": "error", - "traceback": [ - "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", - "\u001b[0;31mTypeError\u001b[0m Traceback (most recent call last)", - "\u001b[0;32m<ipython-input-6-9cb3dc9a51fd>\u001b[0m in \u001b[0;36m<module>\u001b[0;34m\u001b[0m\n\u001b[1;32m 1\u001b[0m \u001b[0mindex\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;36m0\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 2\u001b[0;31m \u001b[0mcluster_predicted\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mBitermModel\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mget_text_topic\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mindex\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mindex\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 3\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 4\u001b[0m \u001b[0mprint\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m\"text:\"\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mtext\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mindex\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 5\u001b[0m \u001b[0mprint\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m\"cluster indice:\"\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mcluster_predicted\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", - "\u001b[0;31mTypeError\u001b[0m: get_text_topic() missing 1 required positional argument: 'self'" + "name": "stdout", + "output_type": "stream", + "text": [ + "text: Cola 1.5L Carrefour\n", + "cluster indice: 0\n" ] } ], "source": [ "index = 0\n", - "cluster_predicted = BitermModel.get_text_topic(index=index)\n", + "cluster_predicted = biterm_model.get_document_topic(index=index)\n", "\n", "print(\"text:\", text[index])\n", "print(\"cluster indice:\", cluster_predicted)" From cf1c71c2e74a936797eef188fca9de6b0c0d31e3 Mon Sep 17 00:00:00 2001 From: pymousse <py.mousset@hotmail.fr> Date: Fri, 7 Jun 2019 14:58:31 +0200 Subject: [PATCH 210/496] just nicer code --- nautilus_nlp/models/biterm_model.py | 34 +++++++++++----------- notebooks/5. Topic Modeling - Biterm.ipynb | 2 +- 2 files changed, 18 insertions(+), 18 deletions(-) diff --git a/nautilus_nlp/models/biterm_model.py b/nautilus_nlp/models/biterm_model.py index d366f24..550b718 100644 --- a/nautilus_nlp/models/biterm_model.py +++ b/nautilus_nlp/models/biterm_model.py @@ -6,23 +6,6 @@ class BitermModel: - @staticmethod - def is_int_positive(number): - if type(number) != int: - raise ValueError("Parameter {} has to be an integer".format(number)) - if number < 1: - raise ValueError("Parameter {} has to be positive".format(number)) - - @staticmethod - def is_list_of_string(data): - if type(data) != list: - raise ValueError("{} has to be a list".format(data)) - if len(data) == 0: - raise ValueError("{} is empty".format(data)) - for document in data: - if type(document) != str: - raise ValueError("All elements of {} have to be a string, problem with {}".format(data, document)) - def __init__(self, data, nb_topics, nb_iteration, lang='english'): """ Model for topic modelling @@ -43,6 +26,23 @@ def __init__(self, data, nb_topics, nb_iteration, lang='english'): self.lang = lang self.topics = None + @staticmethod + def is_int_positive(number): + if type(number) != int: + raise ValueError("Parameter {} has to be an integer".format(number)) + if number < 1: + raise ValueError("Parameter {} has to be positive".format(number)) + + @staticmethod + def is_list_of_string(data): + if type(data) != list: + raise ValueError("{} has to be a list".format(data)) + if len(data) == 0: + raise ValueError("{} is empty".format(data)) + for document in data: + if type(document) != str: + raise ValueError("All elements of {} have to be a string, problem with {}".format(data, document)) + def get_clusters(self, nb_word_per_cluster): vec = CountVectorizer(stop_words=self.lang) X = vec.fit_transform(self.data).toarray() diff --git a/notebooks/5. Topic Modeling - Biterm.ipynb b/notebooks/5. Topic Modeling - Biterm.ipynb index c92dc18..1c0c102 100644 --- a/notebooks/5. Topic Modeling - Biterm.ipynb +++ b/notebooks/5. Topic Modeling - Biterm.ipynb @@ -220,7 +220,7 @@ "version": "3.7.1" }, "toc": { - "base_numbering": 1, + "base_numbering": 1.0, "nav_menu": {}, "number_sections": true, "sideBar": true, From a59cb7e4ca75abc2bc80468e23ba26a97274a2eb Mon Sep 17 00:00:00 2001 From: pymousse <py.mousset@hotmail.fr> Date: Fri, 7 Jun 2019 15:41:40 +0200 Subject: [PATCH 211/496] add save_pyLDAvis_plot function --- nautilus_nlp/models/biterm_model.py | 24 ++++++++++++++++++------ 1 file changed, 18 insertions(+), 6 deletions(-) diff --git a/nautilus_nlp/models/biterm_model.py b/nautilus_nlp/models/biterm_model.py index 550b718..1c8a248 100644 --- a/nautilus_nlp/models/biterm_model.py +++ b/nautilus_nlp/models/biterm_model.py @@ -2,6 +2,7 @@ from biterm.btm import oBTM from biterm.utility import vec_to_biterms, topic_summuary from sklearn.feature_extraction.text import CountVectorizer +import pyLDAvis class BitermModel: @@ -25,6 +26,9 @@ def __init__(self, data, nb_topics, nb_iteration, lang='english'): self.nb_iteration = nb_iteration self.lang = lang self.topics = None + self.btm = None + self.X = None + self.vocab = None @staticmethod def is_int_positive(number): @@ -45,14 +49,14 @@ def is_list_of_string(data): def get_clusters(self, nb_word_per_cluster): vec = CountVectorizer(stop_words=self.lang) - X = vec.fit_transform(self.data).toarray() - vocab = np.array(vec.get_feature_names()) + self.X = vec.fit_transform(self.data).toarray() + self.vocab = np.array(vec.get_feature_names()) - biterms = vec_to_biterms(X) - btm = oBTM(num_topics=self.nb_topics, V=vocab) - self.topics = btm.fit_transform(biterms, iterations=self.nb_iteration) + biterms = vec_to_biterms(self.X) + self.btm = oBTM(num_topics=self.nb_topics, V=self.vocab) + self.topics = self.btm.fit_transform(biterms, iterations=self.nb_iteration) - results = topic_summuary(btm.phi_wz.T, X, vocab, nb_word_per_cluster, verbose=False) + results = topic_summuary(self.btm.phi_wz.T, self.X, self.vocab, nb_word_per_cluster, verbose=False) return results @@ -61,3 +65,11 @@ def get_document_topic(self, index): raise ValueError("Model needs to be trained first") return self.topics[index].argmax() + + def save_pyLDAvis_plot(self, path_to_output='./plot.html'): + if self.topics is None or self.btm is None or self.X is None or self.vocab is None: + raise ValueError("Model needs to be trained first") + + vis = pyLDAvis.prepare(self.btm.phi_wz.T, self.topics, np.count_nonzero(self.X, axis=1), self.vocab, + np.sum(self.X, axis=0)) + pyLDAvis.save_html(vis, path_to_output) From f0fcaf329ada179d56b88ee7b877fa3d69cff4a8 Mon Sep 17 00:00:00 2001 From: pymousse <py.mousset@hotmail.fr> Date: Fri, 7 Jun 2019 15:50:20 +0200 Subject: [PATCH 212/496] add some comments, more information --- nautilus_nlp/models/biterm_model.py | 4 +- notebooks/5. Topic Modeling - Biterm.ipynb | 82 +++++++++++++++------- 2 files changed, 57 insertions(+), 29 deletions(-) diff --git a/nautilus_nlp/models/biterm_model.py b/nautilus_nlp/models/biterm_model.py index 1c8a248..41a8f2f 100644 --- a/nautilus_nlp/models/biterm_model.py +++ b/nautilus_nlp/models/biterm_model.py @@ -7,14 +7,14 @@ class BitermModel: - def __init__(self, data, nb_topics, nb_iteration, lang='english'): + def __init__(self, data, nb_topics, nb_iteration, lang): """ Model for topic modelling Particularly useful for short texts :param data: a list of string, each string can be a document :param nb_topics: positive int :param nb_iteration: positive int - :param lang: str, language to remove the stop words + :param lang: str, language to remove the stop words, can be setup to None """ self.is_int_positive(nb_topics) diff --git a/notebooks/5. Topic Modeling - Biterm.ipynb b/notebooks/5. Topic Modeling - Biterm.ipynb index 1c0c102..f959ecc 100644 --- a/notebooks/5. Topic Modeling - Biterm.ipynb +++ b/notebooks/5. Topic Modeling - Biterm.ipynb @@ -26,30 +26,31 @@ }, { "cell_type": "code", - "execution_count": 2, + "execution_count": 7, "metadata": {}, "outputs": [], "source": [ + "# Input of the model has to be a list of string/documents\n", "text = ['Cola 1.5L Carrefour',\n", " 'Pepsi Cola Light 1.5L',\n", - " 'Pepsi Cola Twist Light\\n',\n", + " 'Pepsi Cola Twist Light',\n", " 'Cola 1.5L CRF DISC',\n", " 'Coca-Cola Light 1.5L',\n", " 'Coca-Cola Light 4x0.5L',\n", - " 'Coca-Cola Light 6x0.3L\\n',\n", + " 'Coca-Cola Light 6x0.3L',\n", " 'Panzani 200g x 4 bio',\n", " 'Rustichella 150g bio',\n", " 'De Cecco - Fusilli bio',\n", - " 'Gerblé sans Gluten50g\\n',\n", + " 'Gerblé sans Gluten50g',\n", " 'Penne de riz 100g sans gluten',\n", - " 'Spaghetti de maïs 50g sans Glute']\n" + " 'Spaghetti de maïs 50g sans Glute']" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ - "### Step 2: Prediction" + "### Step 2: Topic Modelling" ] }, { @@ -61,7 +62,7 @@ "name": "stderr", "output_type": "stream", "text": [ - "100%|██████████| 100/100 [00:00<00:00, 101.68it/s]\n" + "100%|██████████| 100/100 [00:00<00:00, 123.16it/s]\n" ] } ], @@ -69,6 +70,7 @@ "nb_topics = 5\n", "nb_word_per_cluster = 5\n", "nb_iteration = 100\n", + "# Based on sklearn to remove the stop words, can be set up to None\n", "language = 'english'\n", "\n", "biterm_model = BitermModel(data=text\n", @@ -112,18 +114,18 @@ " <tbody>\n", " <tr>\n", " <th>0</th>\n", - " <td>-5.631692</td>\n", - " <td>[5l, cola, disc, crf, carrefour]</td>\n", + " <td>3.635635</td>\n", + " <td>[100g, sans, riz, penne, gluten]</td>\n", " </tr>\n", " <tr>\n", " <th>1</th>\n", - " <td>-4.350759</td>\n", - " <td>[light, cola, coca, 5l, pepsi]</td>\n", + " <td>-2.076344</td>\n", + " <td>[disc, 5l, cola, crf, carrefour]</td>\n", " </tr>\n", " <tr>\n", " <th>2</th>\n", - " <td>3.635635</td>\n", - " <td>[100g, sans, riz, penne, gluten]</td>\n", + " <td>-0.235566</td>\n", + " <td>[bio, 150g, rustichella, 200g, panzani]</td>\n", " </tr>\n", " <tr>\n", " <th>3</th>\n", @@ -132,8 +134,8 @@ " </tr>\n", " <tr>\n", " <th>4</th>\n", - " <td>-0.235566</td>\n", - " <td>[bio, 150g, rustichella, 200g, panzani]</td>\n", + " <td>-5.198056</td>\n", + " <td>[cola, light, 5l, coca, pepsi]</td>\n", " </tr>\n", " </tbody>\n", "</table>\n", @@ -141,11 +143,11 @@ ], "text/plain": [ " coherence top_words\n", - "0 -5.631692 [5l, cola, disc, crf, carrefour]\n", - "1 -4.350759 [light, cola, coca, 5l, pepsi]\n", - "2 3.635635 [100g, sans, riz, penne, gluten]\n", + "0 3.635635 [100g, sans, riz, penne, gluten]\n", + "1 -2.076344 [disc, 5l, cola, crf, carrefour]\n", + "2 -0.235566 [bio, 150g, rustichella, 200g, panzani]\n", "3 2.537023 [sans, spaghetti, 50g, maïs, glute]\n", - "4 -0.235566 [bio, 150g, rustichella, 200g, panzani]" + "4 -5.198056 [cola, light, 5l, coca, pepsi]" ] }, "execution_count": 4, @@ -159,7 +161,7 @@ }, { "cell_type": "code", - "execution_count": 7, + "execution_count": 5, "metadata": {}, "outputs": [ { @@ -167,24 +169,50 @@ "output_type": "stream", "text": [ "text: Cola 1.5L Carrefour\n", - "cluster indice: 0\n" + "cluster indice: 1\n" ] } ], "source": [ + "# To get the cluster index of one document\n", "index = 0\n", - "cluster_predicted = biterm_model.get_document_topic(index=index)\n", + "cluster_index = biterm_model.get_document_topic(index=index)\n", "\n", "print(\"text:\", text[index])\n", - "print(\"cluster indice:\", cluster_predicted)" + "print(\"cluster index:\", cluster_index)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Step 3: Viz" ] }, { "cell_type": "code", - "execution_count": null, + "execution_count": 6, "metadata": {}, - "outputs": [], - "source": [] + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/anaconda3/lib/python3.7/site-packages/pyLDAvis/_prepare.py:257: FutureWarning: Sorting because non-concatenation axis is not aligned. A future version\n", + "of pandas will change to not sort by default.\n", + "\n", + "To accept the future behavior, pass 'sort=False'.\n", + "\n", + "To retain the current behavior and silence the warning, pass 'sort=True'.\n", + "\n", + " return pd.concat([default_term_info] + list(topic_dfs))\n" + ] + } + ], + "source": [ + "output_path = './plot_biterm_html'\n", + "biterm_model.save_pyLDAvis_plot()" + ] }, { "cell_type": "code", @@ -220,7 +248,7 @@ "version": "3.7.1" }, "toc": { - "base_numbering": 1.0, + "base_numbering": 1, "nav_menu": {}, "number_sections": true, "sideBar": true, From 0e4fda6fbd859c99cb1abeb5eb23eca1c2bed290 Mon Sep 17 00:00:00 2001 From: pymousse <py.mousset@hotmail.fr> Date: Fri, 7 Jun 2019 15:51:54 +0200 Subject: [PATCH 213/496] change name unit test file --- tests/{biterm_testing.py => test_biterm.py} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename tests/{biterm_testing.py => test_biterm.py} (100%) diff --git a/tests/biterm_testing.py b/tests/test_biterm.py similarity index 100% rename from tests/biterm_testing.py rename to tests/test_biterm.py From 164474a132c4a53df83a6e5d76a6e980b216279a Mon Sep 17 00:00:00 2001 From: pymousse <py.mousset@hotmail.fr> Date: Mon, 10 Jun 2019 13:11:51 +0200 Subject: [PATCH 214/496] change naming --- nautilus_nlp/models/biterm_model.py | 52 +++++++++++++++---------- tests/{test_biterm.py => biterm_try.py} | 2 +- 2 files changed, 32 insertions(+), 22 deletions(-) rename tests/{test_biterm.py => biterm_try.py} (97%) diff --git a/nautilus_nlp/models/biterm_model.py b/nautilus_nlp/models/biterm_model.py index 41a8f2f..de9bc0f 100644 --- a/nautilus_nlp/models/biterm_model.py +++ b/nautilus_nlp/models/biterm_model.py @@ -14,7 +14,7 @@ def __init__(self, data, nb_topics, nb_iteration, lang): :param data: a list of string, each string can be a document :param nb_topics: positive int :param nb_iteration: positive int - :param lang: str, language to remove the stop words, can be setup to None + :param lang: str, _language to remove the stop words, can be setup to None """ self.is_int_positive(nb_topics) @@ -25,51 +25,61 @@ def __init__(self, data, nb_topics, nb_iteration, lang): self.nb_topics = nb_topics self.nb_iteration = nb_iteration self.lang = lang - self.topics = None - self.btm = None - self.X = None - self.vocab = None + self._topics = None + self._btm = None + self._X = None + self._vocab = None @staticmethod def is_int_positive(number): - if type(number) != int: + """ + Function to check if the input parameter is a integer and positive otherwise raise an error + :param number: + :return: + """ + if not isinstance(number, int): raise ValueError("Parameter {} has to be an integer".format(number)) if number < 1: raise ValueError("Parameter {} has to be positive".format(number)) @staticmethod def is_list_of_string(data): - if type(data) != list: + """ + Function to check if the input parameter is a list of strings otherwise raise an error + :param data: + :return: + """ + if not isinstance(data, list): raise ValueError("{} has to be a list".format(data)) if len(data) == 0: raise ValueError("{} is empty".format(data)) for document in data: - if type(document) != str: + if not isinstance(document, str): raise ValueError("All elements of {} have to be a string, problem with {}".format(data, document)) - def get_clusters(self, nb_word_per_cluster): + def compute_topics(self, nb_word_per_cluster): vec = CountVectorizer(stop_words=self.lang) - self.X = vec.fit_transform(self.data).toarray() - self.vocab = np.array(vec.get_feature_names()) + self._X = vec.fit_transform(self.data).toarray() + self._vocab = np.array(vec.get_feature_names()) - biterms = vec_to_biterms(self.X) - self.btm = oBTM(num_topics=self.nb_topics, V=self.vocab) - self.topics = self.btm.fit_transform(biterms, iterations=self.nb_iteration) + biterms = vec_to_biterms(self._X) + self._btm = oBTM(num_topics=self.nb_topics, V=self._vocab) + self._topics = self._btm.fit_transform(biterms, iterations=self.nb_iteration) - results = topic_summuary(self.btm.phi_wz.T, self.X, self.vocab, nb_word_per_cluster, verbose=False) + results = topic_summuary(self._btm.phi_wz.T, self._X, self._vocab, nb_word_per_cluster, verbose=False) return results def get_document_topic(self, index): - if self.topics is None: + if self._topics is None: raise ValueError("Model needs to be trained first") - return self.topics[index].argmax() + return self._topics[index].argmax() - def save_pyLDAvis_plot(self, path_to_output='./plot.html'): - if self.topics is None or self.btm is None or self.X is None or self.vocab is None: + def save_pyLDAvis_plot(self, path_to_output='./biterm_pyLDAavis_plot.html'): + if self._topics is None or self._btm is None or self._X is None or self._vocab is None: raise ValueError("Model needs to be trained first") - vis = pyLDAvis.prepare(self.btm.phi_wz.T, self.topics, np.count_nonzero(self.X, axis=1), self.vocab, - np.sum(self.X, axis=0)) + vis = pyLDAvis.prepare(self._btm.phi_wz.T, self._topics, np.count_nonzero(self._X, axis=1), self._vocab, + np.sum(self._X, axis=0)) pyLDAvis.save_html(vis, path_to_output) diff --git a/tests/test_biterm.py b/tests/biterm_try.py similarity index 97% rename from tests/test_biterm.py rename to tests/biterm_try.py index a397765..904959f 100644 --- a/tests/test_biterm.py +++ b/tests/biterm_try.py @@ -43,7 +43,7 @@ def test_number_topic_correct(self): , nb_topics=self.nb_topics , nb_iteration=self.nb_iteration , lang=self.language) - clusters = biterm_model.get_clusters(nb_word_per_cluster=self.nb_word_per_cluster) + clusters = biterm_model.compute_topics(nb_word_per_cluster=self.nb_word_per_cluster) assert len(pd.DataFrame(clusters)) == 5 def test_number_topic_negative(self, nb_topics): From 1d149f0e1cb59038add20e82c406b0bf71357eb8 Mon Sep 17 00:00:00 2001 From: pymousse <py.mousset@hotmail.fr> Date: Mon, 10 Jun 2019 13:14:05 +0200 Subject: [PATCH 215/496] change naming v2 --- nautilus_nlp/models/biterm_model.py | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/nautilus_nlp/models/biterm_model.py b/nautilus_nlp/models/biterm_model.py index de9bc0f..df4078f 100644 --- a/nautilus_nlp/models/biterm_model.py +++ b/nautilus_nlp/models/biterm_model.py @@ -27,8 +27,8 @@ def __init__(self, data, nb_topics, nb_iteration, lang): self.lang = lang self._topics = None self._btm = None - self._X = None - self._vocab = None + self._vectorize_text = None + self._vocabulary = None @staticmethod def is_int_positive(number): @@ -59,14 +59,14 @@ def is_list_of_string(data): def compute_topics(self, nb_word_per_cluster): vec = CountVectorizer(stop_words=self.lang) - self._X = vec.fit_transform(self.data).toarray() - self._vocab = np.array(vec.get_feature_names()) + self._vectorize_text = vec.fit_transform(self.data).toarray() + self._vocabulary = np.array(vec.get_feature_names()) - biterms = vec_to_biterms(self._X) - self._btm = oBTM(num_topics=self.nb_topics, V=self._vocab) + biterms = vec_to_biterms(self._vectorize_text) + self._btm = oBTM(num_topics=self.nb_topics, V=self._vocabulary) self._topics = self._btm.fit_transform(biterms, iterations=self.nb_iteration) - results = topic_summuary(self._btm.phi_wz.T, self._X, self._vocab, nb_word_per_cluster, verbose=False) + results = topic_summuary(self._btm.phi_wz.T, self._vectorize_text, self._vocabulary, nb_word_per_cluster, verbose=False) return results @@ -77,9 +77,9 @@ def get_document_topic(self, index): return self._topics[index].argmax() def save_pyLDAvis_plot(self, path_to_output='./biterm_pyLDAavis_plot.html'): - if self._topics is None or self._btm is None or self._X is None or self._vocab is None: + if self._topics is None or self._btm is None or self._vectorize_text is None or self._vocabulary is None: raise ValueError("Model needs to be trained first") - vis = pyLDAvis.prepare(self._btm.phi_wz.T, self._topics, np.count_nonzero(self._X, axis=1), self._vocab, - np.sum(self._X, axis=0)) + vis = pyLDAvis.prepare(self._btm.phi_wz.T, self._topics, np.count_nonzero(self._vectorize_text, axis=1), self._vocabulary, + np.sum(self._vectorize_text, axis=0)) pyLDAvis.save_html(vis, path_to_output) From b1f1ad7d00e31b34b74abce5586e2e05411e7fda Mon Sep 17 00:00:00 2001 From: pymousse <py.mousset@hotmail.fr> Date: Mon, 10 Jun 2019 13:21:24 +0200 Subject: [PATCH 216/496] add doc strings to functions' --- nautilus_nlp/models/biterm_model.py | 17 ++++++++++++++++- notebooks/5. Topic Modeling - Biterm.ipynb | 4 ++-- 2 files changed, 18 insertions(+), 3 deletions(-) diff --git a/nautilus_nlp/models/biterm_model.py b/nautilus_nlp/models/biterm_model.py index df4078f..dd53eb1 100644 --- a/nautilus_nlp/models/biterm_model.py +++ b/nautilus_nlp/models/biterm_model.py @@ -58,6 +58,11 @@ def is_list_of_string(data): raise ValueError("All elements of {} have to be a string, problem with {}".format(data, document)) def compute_topics(self, nb_word_per_cluster): + """ + Main function computing the topic modeling, topics + :param nb_word_per_cluster: positive integer + :return: a dictionary containing the the different topics with the top words and coherence associated + """ vec = CountVectorizer(stop_words=self.lang) self._vectorize_text = vec.fit_transform(self.data).toarray() self._vocabulary = np.array(vec.get_feature_names()) @@ -71,12 +76,22 @@ def compute_topics(self, nb_word_per_cluster): return results def get_document_topic(self, index): + """ + Get the cluster associated to the specified document + :param index: the document index, positive integer + :return: the cluster index + """ if self._topics is None: raise ValueError("Model needs to be trained first") return self._topics[index].argmax() - def save_pyLDAvis_plot(self, path_to_output='./biterm_pyLDAavis_plot.html'): + def save_pyLDAvis_plot_as_html(self, path_to_output='./biterm_pyLDAavis_plot.html'): + """ + Function saving the pyLDAvis plot associated with the compute_topics function + :param path_to_output: path to save the plut, must be a html file + :return: + """ if self._topics is None or self._btm is None or self._vectorize_text is None or self._vocabulary is None: raise ValueError("Model needs to be trained first") diff --git a/notebooks/5. Topic Modeling - Biterm.ipynb b/notebooks/5. Topic Modeling - Biterm.ipynb index f959ecc..243d4a5 100644 --- a/notebooks/5. Topic Modeling - Biterm.ipynb +++ b/notebooks/5. Topic Modeling - Biterm.ipynb @@ -210,8 +210,8 @@ } ], "source": [ - "output_path = './plot_biterm_html'\n", - "biterm_model.save_pyLDAvis_plot()" + "output_path = './biterm_pyLDAavis_plot.html'\n", + "biterm_model.save_pyLDAvis_plot_as_html(output_path)" ] }, { From 2408a8444e8fe1632e1f7aa550adcbc7757f036c Mon Sep 17 00:00:00 2001 From: pymousse <py.mousset@hotmail.fr> Date: Mon, 10 Jun 2019 14:16:17 +0200 Subject: [PATCH 217/496] refacto unit test --- tests/biterm_try.py | 77 -------------------------------------------- tests/test_biterm.py | 68 ++++++++++++++++++++++++++++++++++++++ 2 files changed, 68 insertions(+), 77 deletions(-) delete mode 100644 tests/biterm_try.py create mode 100644 tests/test_biterm.py diff --git a/tests/biterm_try.py b/tests/biterm_try.py deleted file mode 100644 index 904959f..0000000 --- a/tests/biterm_try.py +++ /dev/null @@ -1,77 +0,0 @@ -from nautilus_nlp.models.biterm_model import BitermModel -import pandas as pd -import pytest - - -class UnitTestBiterm: - - def __init__(self): - self.text = ['Cola 1.5L Carrefour', - 'Pepsi Cola Light 1.5L', - 'Pepsi Cola Twist Light', - 'Cola 1.5L CRF DISC', - 'Coca-Cola Light 1.5L', - 'Coca-Cola Light 4x0.5L', - 'Coca-Cola Light 6x0.3L', - 'Panzani 200g x 4 bio', - 'Rustichella 150g bio', - 'De Cecco - Fusilli bio', - 'Gerblé sans Gluten50g', - 'Penne de riz 100g sans gluten', - 'Spaghetti de maïs 50g sans Glute'] - - self.nb_topics = 5 - self.nb_word_per_cluster = 5 - self.nb_iteration = 100 - self.language = 'english' - - def run_tests(self): - self.test_number_topic_correct() - for element in ["de", [], 4.5, (23, 24)]: - self.test_number_iteration_non_int(element) - self.test_number_topic_non_int(element) - self.test_data_input(element) - - self.test_number_iteration_negative(-5) - self.test_number_topic_negative(-5) - self.test_data_input(["def", 3]) - self.test_data_input(3) - self.test_no_initialisation() - - def test_number_topic_correct(self): - biterm_model = BitermModel(data=self.text - , nb_topics=self.nb_topics - , nb_iteration=self.nb_iteration - , lang=self.language) - clusters = biterm_model.compute_topics(nb_word_per_cluster=self.nb_word_per_cluster) - assert len(pd.DataFrame(clusters)) == 5 - - def test_number_topic_negative(self, nb_topics): - with pytest.raises(ValueError): - BitermModel(data=self.text, nb_topics=nb_topics, nb_iteration=self.nb_iteration, lang=self.language) - - def test_number_topic_non_int(self, nb_topics): - with pytest.raises(ValueError): - BitermModel(data=self.text, nb_topics=nb_topics, nb_iteration=self.nb_iteration, lang=self.language) - - def test_number_iteration_negative(self, nb_iteration): - with pytest.raises(ValueError): - BitermModel(data=self.text, nb_topics=self.nb_topics, nb_iteration=nb_iteration, lang=self.language) - - def test_number_iteration_non_int(self, nb_iteration): - with pytest.raises(ValueError): - BitermModel(data=self.text, nb_topics=self.nb_topics, nb_iteration=nb_iteration, lang=self.language) - - def test_data_input(self, data): - with pytest.raises(ValueError): - BitermModel(data=data, nb_topics=self.nb_topics, nb_iteration=self.nb_iteration, lang=self.language) - - def test_no_initialisation(self): - with pytest.raises(ValueError): - biter_model = BitermModel(data=self.text, nb_topics=self.nb_topics, nb_iteration=self.nb_iteration, - lang=self.language) - biter_model.get_document_topic(2) - - -unit_test = UnitTestBiterm() -unit_test.run_tests() diff --git a/tests/test_biterm.py b/tests/test_biterm.py new file mode 100644 index 0000000..04bd067 --- /dev/null +++ b/tests/test_biterm.py @@ -0,0 +1,68 @@ +from nautilus_nlp.models.biterm_model import BitermModel +import pandas as pd +import pytest + +text = ['Cola 1.5L Carrefour', + 'Pepsi Cola Light 1.5L', + 'Pepsi Cola Twist Light', + 'Cola 1.5L CRF DISC', + 'Coca-Cola Light 1.5L', + 'Coca-Cola Light 4x0.5L', + 'Coca-Cola Light 6x0.3L', + 'Panzani 200g x 4 bio', + 'Rustichella 150g bio', + 'De Cecco - Fusilli bio', + 'Gerblé sans Gluten50g', + 'Penne de riz 100g sans gluten', + 'Spaghetti de maïs 50g sans Glute'] + +nb_topics = 5 +nb_word_per_cluster = 5 +nb_iteration = 100 +language = 'english' + + +@pytest.mark.parametrize( + "input_text, input_nb_topic , input_nb_iteration , input_language", + [ + (text, -1, nb_iteration, language), + (text, "Panzani", nb_iteration, language), + (text, 3.4, nb_iteration, language), + (text, (3, 5), nb_iteration, language), + (text, [3, 5], nb_iteration, language), + (text, nb_topics, (2, 4), language), + (text, nb_topics, [1, 3], language), + (text, nb_topics, -1, language), + (text, nb_topics, "Panzani", language), + (text, nb_topics, 2.4, language), + (3, nb_topics, nb_iteration, language), + ("Panzani", nb_topics, nb_iteration, language), + (("Panzani", "Rustichella"), nb_topics, nb_iteration, language), + ([], nb_topics, nb_iteration, language), + (["Panzani", "Rustichella", 3], nb_topics, nb_iteration, language) + ] +) +def text_input_parameter_error_handling(input_text + , input_nb_topic + , input_nb_iteration + , input_language): + with pytest.raises(ValueError): + BitermModel(data=input_text, nb_topics=input_nb_topic, nb_iteration=input_nb_iteration, lang=input_language) + + +def test_number_topic_correct(): + biterm_model = BitermModel(data=text + , nb_topics=nb_topics + , nb_iteration=nb_iteration + , lang=language) + clusters = biterm_model.compute_topics(nb_word_per_cluster=nb_word_per_cluster) + assert len(pd.DataFrame(clusters)) == nb_topics + + +def test_no_initialisation(): + with pytest.raises(ValueError): + biter_model = BitermModel(data=text + , nb_topics=nb_topics + , nb_iteration=nb_iteration, + lang=language) + biter_model.get_document_topic(2) From ecd3172b6492f8d3306eece652bfa472ad742bd5 Mon Sep 17 00:00:00 2001 From: hugovasselin <waaaouu@gmail.com> Date: Wed, 19 Jun 2019 14:57:12 +0200 Subject: [PATCH 218/496] add logo --- README.md | 1 + references/nautilus_nlp_logo.png | Bin 0 -> 25433 bytes 2 files changed, 1 insertion(+) create mode 100644 references/nautilus_nlp_logo.png diff --git a/README.md b/README.md index 5bae6f7..5bfd9cb 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,6 @@ Nautilus_NLP [![Build Status](https://travis-ci.com/artefactory/nautilus-nlp.svg?token=Ssg4shz5pz9qGnYCybSj&branch=master)](https://travis-ci.com/artefactory/nautilus-nlp) ============================== +![Nautilus-NLP](/references/nautilus_nlp_logo.png) The Nautilus NLP library aimed to be a meta-library to be used to help you get started on handling your NLP use-case. diff --git a/references/nautilus_nlp_logo.png b/references/nautilus_nlp_logo.png new file mode 100644 index 0000000000000000000000000000000000000000..547adb3a77cc4ddd32102449dacea78772649b41 GIT binary patch literal 25433 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 AI{*Lx literal 0 HcmV?d00001 From 80eb38dba3c4040bb428f5e0865554affda90dd5 Mon Sep 17 00:00:00 2001 From: hugovasselin <waaaouu@gmail.com> Date: Wed, 19 Jun 2019 15:05:40 +0200 Subject: [PATCH 219/496] harmonize docstring #75 --- nautilus_nlp/models/biterm_model.py | 85 ++++++++++++++++++++++------- 1 file changed, 65 insertions(+), 20 deletions(-) diff --git a/nautilus_nlp/models/biterm_model.py b/nautilus_nlp/models/biterm_model.py index dd53eb1..a30d80f 100644 --- a/nautilus_nlp/models/biterm_model.py +++ b/nautilus_nlp/models/biterm_model.py @@ -9,14 +9,24 @@ class BitermModel: def __init__(self, data, nb_topics, nb_iteration, lang): """ - Model for topic modelling - Particularly useful for short texts - :param data: a list of string, each string can be a document - :param nb_topics: positive int - :param nb_iteration: positive int - :param lang: str, _language to remove the stop words, can be setup to None - """ + Model for topic modelling. Particularly useful for short texts. + + Parameters + ---------- + data : list + a list of string, each string can be a document + nb_topics : positive int + + nb_iteration : positive int + lang : str + _language to remove the stop words, can be setup to None + + Returns + ------- + string + the text with removed multiple spaces and strip text + """ self.is_int_positive(nb_topics) self.is_int_positive(nb_iteration) self.is_list_of_string(data) @@ -33,10 +43,19 @@ def __init__(self, data, nb_topics, nb_iteration, lang): @staticmethod def is_int_positive(number): """ - Function to check if the input parameter is a integer and positive otherwise raise an error - :param number: - :return: - """ + Function to check if the input parameter is a integer and positive + otherwise raise an error + + Parameters + ---------- + number : str + + Returns + ------- + str: + the text with removed multiple spaces and strip text + + """ if not isinstance(number, int): raise ValueError("Parameter {} has to be an integer".format(number)) if number < 1: @@ -46,8 +65,13 @@ def is_int_positive(number): def is_list_of_string(data): """ Function to check if the input parameter is a list of strings otherwise raise an error - :param data: - :return: + + Parameters + ---------- + data + + Returns + ------- """ if not isinstance(data, list): raise ValueError("{} has to be a list".format(data)) @@ -60,8 +84,16 @@ def is_list_of_string(data): def compute_topics(self, nb_word_per_cluster): """ Main function computing the topic modeling, topics - :param nb_word_per_cluster: positive integer - :return: a dictionary containing the the different topics with the top words and coherence associated + + Parameters + ---------- + nb_word_per_cluster : positive integer + + Returns + ------- + dict : + a dictionary containing the the different topics with the top words + and coherence associated """ vec = CountVectorizer(stop_words=self.lang) self._vectorize_text = vec.fit_transform(self.data).toarray() @@ -78,8 +110,15 @@ def compute_topics(self, nb_word_per_cluster): def get_document_topic(self, index): """ Get the cluster associated to the specified document - :param index: the document index, positive integer - :return: the cluster index + + Parameters + ---------- + index : positive integer + the document index + + Returns + ------- + the cluster index """ if self._topics is None: raise ValueError("Model needs to be trained first") @@ -89,9 +128,15 @@ def get_document_topic(self, index): def save_pyLDAvis_plot_as_html(self, path_to_output='./biterm_pyLDAavis_plot.html'): """ Function saving the pyLDAvis plot associated with the compute_topics function - :param path_to_output: path to save the plut, must be a html file - :return: - """ + + Parameters + ---------- + path_to_output : str + path to save the plut, must be a html file + + Returns + ------- + """ if self._topics is None or self._btm is None or self._vectorize_text is None or self._vocabulary is None: raise ValueError("Model needs to be trained first") From 765fad12a944eb321e80bf4951ff309092af882a Mon Sep 17 00:00:00 2001 From: hugovasselin <waaaouu@gmail.com> Date: Wed, 19 Jun 2019 15:13:08 +0200 Subject: [PATCH 220/496] docstring #75 --- nautilus_nlp/models/fasttext_classifier.py | 2 +- nautilus_nlp/models/fasttext_embedding.py | 33 ++++++++++++++++------ 2 files changed, 26 insertions(+), 9 deletions(-) diff --git a/nautilus_nlp/models/fasttext_classifier.py b/nautilus_nlp/models/fasttext_classifier.py index 9d0fee4..5bd1f0a 100644 --- a/nautilus_nlp/models/fasttext_classifier.py +++ b/nautilus_nlp/models/fasttext_classifier.py @@ -37,7 +37,7 @@ def train( verbose=2, pretrainedVectors="", ): - """ + """ Train a supervised model and return a model object. input must be a filepath. The input text does not need to be tokenized as per the tokenize function, but it must be preprocessed and encoded diff --git a/nautilus_nlp/models/fasttext_embedding.py b/nautilus_nlp/models/fasttext_embedding.py index ced0ce7..79f7d8a 100644 --- a/nautilus_nlp/models/fasttext_embedding.py +++ b/nautilus_nlp/models/fasttext_embedding.py @@ -11,18 +11,35 @@ def __init__(self, path=None): self.model = None def get_word_vector(self, word: str): - """Return the wordvector of a word according to pretrained model - Input document: string - output: array """ + Return the wordvector of a word according to pretrained model + + Parameters + ---------- + word : string + the input document + + Returns + ------- + array + """ + return self.model.get_word_vector(word) def get_document_vector(self, document: str): - """Return the wordvector of a full document according to pretrained model - To build the vector, each word-wordvector is divided by its norm, then the array of vector is averaged - The document must be cleaned beforehand (no EOL) - Input document: string - output: array + """ + Return the wordvector of a full document according to pretrained model + To build the vector, each word-wordvector is divided by its norm, then the array of vector is averaged + The document must be cleaned beforehand (no EOL) + + Parameters + ---------- + Input document : string + the input document + + Returns + ------- + array """ return self.model.get_sentence_vector(document) From b090f45fc09188e7590de9b1ca248d80179311de Mon Sep 17 00:00:00 2001 From: hugovasselin <waaaouu@gmail.com> Date: Wed, 19 Jun 2019 15:46:42 +0200 Subject: [PATCH 221/496] harmonize docstrings #75 --- nautilus_nlp/models/language_detector.py | 21 ++++--- nautilus_nlp/models/topic_modeling.py | 73 ++++++++++++++++-------- nautilus_nlp/utils/emoji.py | 16 ++++-- nautilus_nlp/utils/file_loader.py | 58 ++++++++++++++----- nautilus_nlp/utils/keyword_extractor.py | 20 +++++-- nautilus_nlp/utils/ngrams_analysis.py | 37 ++++++++---- nautilus_nlp/utils/text_summary.py | 35 +++++++++--- nautilus_nlp/utils/tokenizer.py | 20 +++++-- 8 files changed, 201 insertions(+), 79 deletions(-) diff --git a/nautilus_nlp/models/language_detector.py b/nautilus_nlp/models/language_detector.py index acd1819..d124871 100644 --- a/nautilus_nlp/models/language_detector.py +++ b/nautilus_nlp/models/language_detector.py @@ -8,8 +8,8 @@ class LangDetector: - """ This class is to instantiante a language detector. - + """ + This class is to instantiante a language detector. """ def __init__(self, path=None): @@ -20,12 +20,17 @@ def detect_language(self, text_to_detect=None): """ Detected the language of a text - Args: - hint_language: language you expect your text to be - - Returns: - is_reliable: is the top language is much better than 2nd best language? - language: 2-letter code for the language of the text + Parameters + ---------- + hint_language : string + language you expect your text to be + + Returns + ------- + is_reliable : + is the top language is much better than 2nd best language? + language: + 2-letter code for the language of the text """ best_guesses = self.model.predict(remove_EOL_characters(text_to_detect)) return best_guesses[0][0].replace("__label__", ""), best_guesses[1][0] diff --git a/nautilus_nlp/models/topic_modeling.py b/nautilus_nlp/models/topic_modeling.py index 9e2c0f9..518d8c0 100644 --- a/nautilus_nlp/models/topic_modeling.py +++ b/nautilus_nlp/models/topic_modeling.py @@ -13,8 +13,8 @@ def create_dictionary(data): - - """ Create a Dictionary encapsulates the mapping between normalized words and their integer ids. + """ + Create a Dictionary encapsulates the mapping between normalized words and their integer ids. Parameters ---------- @@ -27,7 +27,8 @@ def create_dictionary(data): return gensim.corpora.Dictionary(data) def filter_extremes(dictionary, no_below=15, no_above=0.3 , **kwargs) : - """ Remove very rare and very common words + """ + Remove very rare and very common words Parameters ---------- @@ -45,8 +46,10 @@ def filter_extremes(dictionary, no_below=15, no_above=0.3 , **kwargs) : def create_bow_corpus(data, dictionary): - """ Create the corpus: one of the two main inputs to the LDA topic model with the dictionary (id2word) - The produced corpus is a mapping of (token_id, token_count). + """ + Create the corpus: one of the two main inputs to the LDA topic model with the dictionary (id2word) + The produced corpus is a mapping of (token_id, token_count). + Parameters ---------- data : list of list of tokens @@ -168,23 +171,40 @@ def train_lda_mallet(bow_corpus, dictionary, num_topics, mallet_path, **kwargs): def save_model(model, model_name): - """ Save the model that has been trained. The model will be saved on your current emplacement. + """ + Save the model that has been trained. The model will be saved on your current emplacement. - Parameters - ---------- - model: ldamodel - model_name: str. Name the model that will be saved + Parameters + ---------- + model: ldamodel + model_name: str. + Name the model that will be saved """ return model.save(os.path.join(model_name)) def load_model(model_path,model_name, model='gensim', model_prefix='composant'): - ''' - model : str. Precise the topic modeling model wanted, must be "gensim" or "mallet" - model_path: str. path where the model has been saved - model_name: str. name of the saved model - model_prefix: str. By default, 'composant' default prefix used while saving the mallet model with train_lda_model function. - ''' + """ + Detected the language of a text + + Parameters + ---------- + model_path: str + path where the model has been saved + model_name: str + name of the saved model + model : str + Precise the topic modeling model wanted, must be "gensim" or "mallet" + model_prefix : str + By default, 'composant' default prefix used while saving the mallet model with train_lda_model function. + + Returns + ------- + is_reliable : + is the top language is much better than 2nd best language? + language: + 2-letter code for the language of the text + """ if model =='gensim': ldamodel = gensim.models.LdaModel.load(os.path.join(model_path,model_name)) elif model =='mallet': @@ -204,7 +224,8 @@ def fit_data(model, bow): def visualize_topics(model, bow_corpus, dictionary, model_type=None): - """ Visualize the topics-keywords with the pyLDAvis interactive chart. + """ + Visualize the topics-keywords with the pyLDAvis interactive chart. (Work well in notebook) Parameters @@ -217,7 +238,6 @@ def visualize_topics(model, bow_corpus, dictionary, model_type=None): Returns: ---------- 3D interactive chart - """ if model_type == 'mallet': model_vis = gensim.models.wrappers.ldamallet.malletmodel2ldamodel(model) @@ -230,19 +250,27 @@ def visualize_topics(model, bow_corpus, dictionary, model_type=None): return pyLDAvis.gensim.prepare(model_vis, bow_corpus, dictionary) def save_pyldavis(pyldavis, vis_path, vis_name): - """ Save the pyldavis interactive chart + """ + Save the pyldavis interactive chart + + Parameters + ---------- pyldavis: pyLDAvis._prepare.PreparedData vis_path: str - vis_path: str + vis_name: str """ return pyLDAvis.save_html(pyldavis, os.path.join(vis_path, vis_name + '{}'.format('.html'))) def show_pyldavis(vis_path, vis_name): - """ Display the HTML of the saved pyldavis interactive chart - vis_path: str + """ + Display the HTML of the saved pyldavis interactive chart + + Parameters + ---------- vis_path: str + vis_name: str """ return HTML(filename=os.path.join(vis_path, vis_name + '{}'.format('.html'))) @@ -253,7 +281,6 @@ def show_dominant_topic(model, bow_corpus, topic_number=1, topn=5): Parameters ---------- - gensim.ldamodel model: ldamodel bow_corpus: iterable of list of tokens. diff --git a/nautilus_nlp/utils/emoji.py b/nautilus_nlp/utils/emoji.py index 85177af..b7f9534 100644 --- a/nautilus_nlp/utils/emoji.py +++ b/nautilus_nlp/utils/emoji.py @@ -1,12 +1,18 @@ import csv def rebuilt_emoji_dictionaries(filename): - """ - This function recreate the dictionnaries with emoji2unicode_name, emoji2sentiment that are hardcoded below. - - :input: csv filename - :return: dict,dict + """ + This function recreate the dictionnaries with emoji2unicode_name, emoji2sentiment that are hardcoded below. + Parameters + ---------- + filename : string + csv filename + + Returns + ------- + dict + This dataset is based on and can be found: Kralj Novak, Petra; Smailović, Jasmina; Sluban, Borut and Mozetič, Igor, 2015, Emoji Sentiment Ranking 1.0, Slovenian language resource repository CLARIN.SI, diff --git a/nautilus_nlp/utils/file_loader.py b/nautilus_nlp/utils/file_loader.py index 6d710f6..08a816e 100644 --- a/nautilus_nlp/utils/file_loader.py +++ b/nautilus_nlp/utils/file_loader.py @@ -19,9 +19,20 @@ def open_textfile(filepath, encoding='utf-8'): def detect_encoding(file_path_or_string, n_lines=100): - ''' + """ Predict a file's encoding using chardet - ''' + + Parameters + ---------- + file_path_or_string : string + if filepath, will open the file. Otherwise will predict from the string + n_lines : int + number of line to predict from + + Returns + ------- + the code of the detected encoding + """ if isfile(file_path_or_string): with open(file_path_or_string, 'rb') as f: # Open the file as binary data rawdata = b''.join([f.readline() for _ in range(n_lines)]) # Join binary lines for specified number of lines @@ -32,8 +43,22 @@ def detect_encoding(file_path_or_string, n_lines=100): def text_loader(filepath, encoding=None, detectencoding=True): ''' - Args: - detect_encoding[bool]= If file is not encoded into UTF-8, try to detect encoding using the chardet library. + This util loads a file. If the encoding is specified, will use the specified + encoding to load the text file. + If not specified, this function tries to open the doc as UTF-U, and if + it fails it will try to detect the encoding using **detect_encoding** + + Parameters + ---------- + filepath : str + encoding : str + If the encoding is specified, will use the specified encoding to load the text file. + detect_encoding : bool + If file is not encoded into UTF-8, try to detect encoding using the chardet library. + + Returns + ------- + string ''' if encoding is not None: return open_textfile(filepath, encoding=encoding) @@ -88,17 +113,24 @@ def documents_loader(filepath:str, encoding=None, detectencoding=True, output_as Input a filepath, a filepath with wildcard (eg. *.txt), or a list of filepaths. Output a string, or a dict of strings. - Args: - filepath: filepath, a filepath with wildcard (eg. *.txt), - or a list of filepaths. - output_as: list or dict. If dict, key will be the filename. - encoding: if not specified, will try to detect encoding except if - detectencoding is false. - detectencoding: if True and if encoding is not specified, will try to - detect encoding using chardet. - ''' + Parameters + ---------- + filepath: filepath + A filepath with wildcard (eg. *.txt), or a list of filepaths. + output_as: list or dict. + If dict, key will be the filename. + encoding: + if not specified, will try to detect encoding except if detectencoding is false. + detectencoding : bool + if True and if encoding is not specified, will try to detect encoding using chardet. + Returns + ------- + string + the document loaded + ''' + if type(filepath) is str: documents = list_files(filepath) nb_of_documents = len(documents) diff --git a/nautilus_nlp/utils/keyword_extractor.py b/nautilus_nlp/utils/keyword_extractor.py index e384bf2..1956983 100644 --- a/nautilus_nlp/utils/keyword_extractor.py +++ b/nautilus_nlp/utils/keyword_extractor.py @@ -1,14 +1,24 @@ from flashtext import KeywordProcessor -def extract_keywords(text,keyword,case_sensitive=True): +def extract_keywords(text, keyword, case_sensitive=True): """ Extract Keywords from a document. - args : - text: Text to extract keywords from - keyword : Single keyword (str) or list of keywords (list) - return list of extracted keyworkds + Parameters + ---------- + text : str + Text to extract keywords from + keyword : + Single keyword (str) or list of keywords (list) + case_sensitive : + If False, will be case insensitive. + + Returns + ------- + list + Return list of extracted keyworkds """ + processor=KeywordProcessor(case_sensitive=case_sensitive) if isinstance(keyword,list): processor.add_keywords_from_list(keyword) diff --git a/nautilus_nlp/utils/ngrams_analysis.py b/nautilus_nlp/utils/ngrams_analysis.py index 5e61009..268fe3c 100644 --- a/nautilus_nlp/utils/ngrams_analysis.py +++ b/nautilus_nlp/utils/ngrams_analysis.py @@ -8,22 +8,39 @@ def create_ngrams(token, n): """ Create n-grams for list of tokens - :param token: list of strings - :param n: number of elements in the n-gram - :return: list of n-grams - """ + + Parameters + ---------- + token : list + list of strings + n : + number of elements in the n-gram + + Returns + ------- + list + list of n-grams + """ ngrams = zip(*[token[i:] for i in range(n)]) return [" ".join(ngram) for ngram in ngrams] def frequent_words(list_words, ngrams_number=1, number_top_words=10): """ - Compute n-grams frequencies and return number_top_words top n-grams. - :param list_words: list of strings - :param ngrams_number: output dataframe length - :param number_top_words: output dataframe length - :return: dataframe with the entities and their frequencies. - """ + Create n-grams for list of tokens + + Parameters + ---------- + ngrams_number : int + + number_top_words : int + output dataframe length + + Returns + ------- + DataFrame + Dataframe with the entities and their frequencies. + """ frequent = [] if ngrams_number == 1: pass diff --git a/nautilus_nlp/utils/text_summary.py b/nautilus_nlp/utils/text_summary.py index ad873b3..db498bf 100644 --- a/nautilus_nlp/utils/text_summary.py +++ b/nautilus_nlp/utils/text_summary.py @@ -3,20 +3,37 @@ def is_list_of_strings(lst): """ - :param lst: list - :return: boolean indicator - """ + Parameters + ---------- + lst : list + + Returns + ------- + book + boolean indicator + """ + return bool(lst) and isinstance(lst, list) and all(isinstance(elem, str) for elem in lst) def summarize_text(txt, ratio=0.2, words=None, language="english"): """ - :param txt: Sting or list of strings containing text to summarize - :param ratio: Percentage giving the output text length in reference to the input length. - :param words: number of words of the output text - :param language: text language - :return: string containing the summarized text - """ + Parameters + ---------- + txt : str + Sting or list of strings containing text to summarize + ratio : float + Percentage giving the output text length in reference to the input length. + words : + number of words of the output text + language : + text language. eg. "english" + + Returns + ------- + string + string containing the summarized text + """ if is_list_of_strings(txt): txt = ' '.join(txt) diff --git a/nautilus_nlp/utils/tokenizer.py b/nautilus_nlp/utils/tokenizer.py index 526185b..a550bf7 100644 --- a/nautilus_nlp/utils/tokenizer.py +++ b/nautilus_nlp/utils/tokenizer.py @@ -26,15 +26,18 @@ def tokenize(text: str, lang_module: str = 'en_spacy'): """ Convert text to a list of tokens. - Args: - lang_module ({'en_spacy', 'en_nltk', 'fr_spacy', 'fr_moses'}): choose - the tokenization module according to the langage and the implementation. + Parameters + ---------- + lang_module : ({'en_spacy', 'en_nltk', 'fr_spacy', 'fr_moses'}) + choose the tokenization module according to the langage and the implementation. Recommanded: Spacy (faster, better results). To process other langages import models.Spacy_models - Returns: - list - """ + Returns + ------- + list + list of string + """ if lang_module is 'en_nltk': return nltk.word_tokenize(text) elif lang_module is 'en_spacy': @@ -52,6 +55,11 @@ def untokenize(tokens, lang='fr'): ''' Inputs a list of tokens output string. ["J'", 'ai'] >>> "J' ai" + + Parameters + ---------- + lang : string + language code ''' d = MosesDetokenizer(lang=lang) text = d.detokenize(tokens, unescape=False) From 96e685ad5997b87d94b3f50284a2eeecb8d6314e Mon Sep 17 00:00:00 2001 From: hugovasselin <waaaouu@gmail.com> Date: Wed, 19 Jun 2019 15:58:44 +0200 Subject: [PATCH 222/496] update readme --- README.md | 87 ++++++++++++++++++++++++++++++++----------------------- 1 file changed, 50 insertions(+), 37 deletions(-) diff --git a/README.md b/README.md index 5bfd9cb..279cd7e 100644 --- a/README.md +++ b/README.md @@ -45,8 +45,57 @@ then you can install it via pip: pip install -e . ``` -## Handling installation errors +Once it's done, please install the additional required libraries: + +## Installation of the additional required libraries + +If you want to leverage all the features of nautilus-nlp, you need to **install others required libraries** (such as FastText). + +### Install spaCy language models (highly recommanded) + +Installing additional spaCy models will give you the possibility to handle a lot of new language for text processing feature (such as lemmatization or tokenization). + +To do so, run: *(on your virtual environment if you are using one)* + +``` +bash nautilus_nlp/scripts/download_spacy_models.sh +``` + +### Install FastText + +run: + +``` +bash nautilus_nlp/scripts/install_fasttext.sh +``` + +### Install Lang Detect + +run: + +``` +bash nautilus_nlp/scripts/download_ft_langdetect.sh +``` + +### Install Mallet +Mallet is an implementation of the LDA algorithm (used for **topic modeling**). + +1) Install Mallet file +run: + +``` +bash nautilus_nlp/scripts/install_mallet.sh +``` + +2) Install Java JDK (required to implement mallet) +run: + +``` +bash nautilus_nlp/scripts/install_java.sh +``` + +## Handling installation errors ### Problem when building FastText on MACOS: @@ -93,42 +142,6 @@ wget https://repo.anaconda.com/archive/Anaconda3-2019.03-Linux-x86_64.sh bash Anaconda3-2019.03-Linux-x86_64.sh ``` -## Installation of additional required libraries - -If you want to leverage all the features of nautilus-nlp, you need to **install others required libraries** (such as FastText). - -### Install spaCy language models - -Installing additional spaCy models will give you the possibility to handle a lot of new language for text processing feature (such as lemmatization or tokenization). - -To do so, run: *(on your virtual environment if you are using one)* - -`bash nautilus_nlp/scripts/download_spacy_models.sh` - -### Install FastText - -run: - -`bash nautilus_nlp/scripts/install_fasttext.sh` - -### Install Lang Detect - -run: - -`bash nautilus_nlp/scripts/download_ft_langdetect.sh` - -### Install Mallet - -1) Install Mallet file -run: - -`bash nautilus_nlp/scripts/install_mallet.sh` - -2) Install Java JDK (required to implement mallet) -run: - -`bash nautilus_nlp/scripts/install_java.sh` - # Quick start The [notebook](notebooks/) folder contains various notebook on how to use this library. From 4c25108c67452679144aaa39c0fed368458c249f Mon Sep 17 00:00:00 2001 From: hugovasselin <waaaouu@gmail.com> Date: Wed, 19 Jun 2019 16:50:24 +0200 Subject: [PATCH 223/496] update logo --- references/nautilus_nlp_logo.png | Bin 25433 -> 23981 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/references/nautilus_nlp_logo.png b/references/nautilus_nlp_logo.png index 547adb3a77cc4ddd32102449dacea78772649b41..61e8480cb0582b809a94bae354c5d359ad592adc 100644 GIT binary patch delta 22305 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%0A7CvX{C4}? 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 As{jB1 literal 25433 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 AI{*Lx From b08881c8553336e5ee6c642da29bc8efdd26992d Mon Sep 17 00:00:00 2001 From: Robin <rdoume@gmail.com> Date: Wed, 19 Jun 2019 17:31:21 +0200 Subject: [PATCH 224/496] fix indentation error in fasttext_clf --- nautilus_nlp/models/fasttext_classifier.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/nautilus_nlp/models/fasttext_classifier.py b/nautilus_nlp/models/fasttext_classifier.py index 5bd1f0a..9d0fee4 100644 --- a/nautilus_nlp/models/fasttext_classifier.py +++ b/nautilus_nlp/models/fasttext_classifier.py @@ -37,7 +37,7 @@ def train( verbose=2, pretrainedVectors="", ): - """ + """ Train a supervised model and return a model object. input must be a filepath. The input text does not need to be tokenized as per the tokenize function, but it must be preprocessed and encoded From 18502e80e4bff1921fe82ada5959a73bb8ceebbd Mon Sep 17 00:00:00 2001 From: hugovasselin <waaaouu@gmail.com> Date: Mon, 24 Jun 2019 20:27:30 +0200 Subject: [PATCH 225/496] update logo --- references/nautilus_nlp_logo.png | Bin 23981 -> 24573 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/references/nautilus_nlp_logo.png b/references/nautilus_nlp_logo.png index 61e8480cb0582b809a94bae354c5d359ad592adc..f91effef13885c1f27e57c6783fe156b8ea6cfaf 100644 GIT binary patch delta 22495 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 delta 21986 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%0DHgQ3e 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 IPS+*wKi3CYC;$Ke From 9a91b2faa196d97130eb8dbf7a7c6db21abfcf2e Mon Sep 17 00:00:00 2001 From: Kais LARIBI <kais.laribi@artefact.com> Date: Fri, 23 Aug 2019 17:29:38 +0200 Subject: [PATCH 226/496] data preparation for short text --- nautilus_nlp/models/nmf_seanmf_models.py | 0 nautilus_nlp/models/spacy_model.py | 61 ------------------- .../models/topic_modeling_short_text.py | 0 3 files changed, 61 deletions(-) create mode 100644 nautilus_nlp/models/nmf_seanmf_models.py delete mode 100644 nautilus_nlp/models/spacy_model.py create mode 100644 nautilus_nlp/models/topic_modeling_short_text.py diff --git a/nautilus_nlp/models/nmf_seanmf_models.py b/nautilus_nlp/models/nmf_seanmf_models.py new file mode 100644 index 0000000..e69de29 diff --git a/nautilus_nlp/models/spacy_model.py b/nautilus_nlp/models/spacy_model.py deleted file mode 100644 index c7eca79..0000000 --- a/nautilus_nlp/models/spacy_model.py +++ /dev/null @@ -1,61 +0,0 @@ -import spacy - -class spacy_model: - - def __init__(self, lang: str): - try: - self.model = spacy.load(lang) - except Exception as e: - print(e) - print(f"Cannot load lang {lang}, loading default") - self.model = spacy.load("xx") - - def get_spacy_doc(self, text): - - return self.model(text) - - @staticmethod - def get_tokens_from_document(spacydoc: spacy.tokens.doc.Doc): - - return [tokens for tokens in spacydoc] - - def get_tokens_from_str(self, text: str): - spacydoc = self.model(text) - return [tokens for tokens in spacydoc] - - @staticmethod - def get_sentence_from_document(spacydoc: spacy.tokens.doc.Doc): - return [sent for sent in spacydoc.sents] - - def get_sentence_from_str(self, text: str): - spacydoc = self.model(text) - return [sent for sent in spacydoc.sents] - - @staticmethod - def get_tokenized_sentence_from_document(spacydoc: spacy.tokens.doc.Doc): - return [[(token) for token in sent] for sent in spacydoc.sents] - - def get_tokenized_sentence_from_str(self, text: str): - spacydoc = self.model(text) - return [[(token) for token in sent] for sent in spacydoc.sents] - - @staticmethod - def get_entities_from_document(spacydoc): - return [(ent, ent.label_) for ent in spacydoc.ents] - - @staticmethod - def get_entities_from_str(self, text: str): - spacydoc = self.model(text) - return [(ent, ent.label_) for ent in spacydoc.ents] - - @staticmethod - def get_lemma_from_document(spacydoc: spacy.tokens.doc.Doc) -> list: - return [token.lemma_ for token in spacydoc] - - def get_lemma_from_str(self, text: str): - spacydoc = self.model(text) - return [token.lemma_ for token in spacydoc] - - def get_pos_from_str(self, text: str): - spacydoc = self.model(text) - return [token.pos_ for token in spacydoc] \ No newline at end of file diff --git a/nautilus_nlp/models/topic_modeling_short_text.py b/nautilus_nlp/models/topic_modeling_short_text.py new file mode 100644 index 0000000..e69de29 From 8fdcc37c8fb6b8990e3386168c922a2202f567ef Mon Sep 17 00:00:00 2001 From: Kais LARIBI <kais.laribi@artefact.com> Date: Fri, 23 Aug 2019 17:58:35 +0200 Subject: [PATCH 227/496] train NMF func --- nautilus_nlp/models/nmf_seanmf_models.py | 223 ++++++++++++++++++ .../models/topic_modeling_short_text.py | 84 +++++++ 2 files changed, 307 insertions(+) diff --git a/nautilus_nlp/models/nmf_seanmf_models.py b/nautilus_nlp/models/nmf_seanmf_models.py index e69de29..e713175 100644 --- a/nautilus_nlp/models/nmf_seanmf_models.py +++ b/nautilus_nlp/models/nmf_seanmf_models.py @@ -0,0 +1,223 @@ +''' +Short Text Topic Modeling via SeaNMF +''' +import time +import numpy as np +from numpy.linalg import norm + + +class SeaNMFL1(object): + def __init__( + self, + A, S, + IW1=[], IW2=[], IH=[], + alpha=1.0, beta=0.1, n_topic=10, max_iter=100, max_err=1e-3, + rand_init=True, fix_seed=False): + ''' + 0.5*||A-WH^T||_F^2+0.5*alpha*||S-WW_c^T||_F^2+0.5*beta*||W||_1^2 + W = W1 + Wc = W2 + ''' + if fix_seed: + np.random.seed(0) + + self.A = A + self.S = S + + self.n_row = A.shape[0] + self.n_col = A.shape[1] + + self.n_topic = n_topic + self.max_iter = max_iter + self.alpha = alpha + self.beta = beta + self.B = np.ones([self.n_topic, 1]) + self.max_err = max_err + + if rand_init: + self.nmf_init_rand() + else: + self.nmf_init(IW1, IW2, IH) + self.nmf_iter() + + def nmf_init_rand(self): + self.W1 = np.random.random((self.n_row, self.n_topic)) + self.W2 = np.random.random((self.n_row, self.n_topic)) + self.H = np.random.random((self.n_col, self.n_topic)) + + for k in range(self.n_topic): + self.W1[:, k] /= norm(self.W1[:, k]) + self.W2[:, k] /= norm(self.W2[:, k]) + + def nmf_init(self, IW1, IW2, IH): + self.W1 = IW1 + self.W2 = IW2 + self.H = IH + + for k in range(self.n_topic): + self.W1[:, k] /= norm(self.W1[:, k]) + self.W2[:, k] /= norm(self.W2[:, k]) + + def nmf_iter(self): + loss_old = 1e20 + print('loop begin') + start_time = time.time() + for i in range(self.max_iter): + self.nmf_solver() + loss = self.nmf_loss() + if loss_old - loss < self.max_err: + break + loss_old = loss + end_time = time.time() + print('Step={}, Loss={}, Time={}s'.format(i, loss, end_time - start_time)) + + def nmf_solver(self): + ''' + using BCD framework + ''' + epss = 1e-20 + # Update W1 + AH = np.dot(self.A, self.H) + SW2 = np.dot(self.S, self.W2) + HtH = np.dot(self.H.T, self.H) + W2tW2 = np.dot(self.W2.T, self.W2) + W11 = self.W1.dot(self.B) + + for k in range(self.n_topic): + num0 = HtH[k, k] * self.W1[:, k] + self.alpha * W2tW2[k, k] * self.W1[:, k] + num1 = AH[:, k] + self.alpha * SW2[:, k] + num2 = np.dot(self.W1, HtH[:, k]) + self.alpha * np.dot(self.W1, W2tW2[:, k]) + self.beta * W11[0] + self.W1[:, k] = num0 + num1 - num2 + self.W1[:, k] = np.maximum(self.W1[:, k], epss) # project > 0 + self.W1[:, k] /= norm(self.W1[:, k]) + epss # normalize + # Update W2 + W1tW1 = self.W1.T.dot(self.W1) + StW1 = np.dot(self.S, self.W1) + for k in range(self.n_topic): + self.W2[:, k] = self.W2[:, k] + StW1[:, k] - np.dot(self.W2, W1tW1[:, k]) + self.W2[:, k] = np.maximum(self.W2[:, k], epss) + # Update H + AtW1 = np.dot(self.A.T, self.W1) + for k in range(self.n_topic): + self.H[:, k] = self.H[:, k] + AtW1[:, k] - np.dot(self.H, W1tW1[:, k]) + self.H[:, k] = np.maximum(self.H[:, k], epss) + + def nmf_loss(self): + ''' + Calculate loss + ''' + loss = norm(self.A - np.dot(self.W1, np.transpose(self.H)), 'fro') ** 2 / 2.0 + if self.alpha > 0: + loss += self.alpha * norm(np.dot(self.W1, np.transpose(self.W2)) - self.S, 'fro') ** 2 / 2.0 + if self.beta > 0: + loss += self.beta * norm(self.W1, 1) ** 2 / 2.0 + + return loss + + def get_lowrank_matrix(self): + return self.W1, self.W2, self.H + + def get_decomposition_matrix(self): + return self.W1, self.W2, self.H + + def save_format(self, W1file='W.txt', W2file='Wc.txt', Hfile='H.txt'): + np.savetxt(W1file, self.W1) + np.savetxt(W2file, self.W2) + np.savetxt(Hfile, self.H) + + +''' +Topic Modeling via NMF +''' + + +class NMF(object): + def __init__( + self, + A, IW=[], IH=[], + n_topic=10, max_iter=100, max_err=1e-3, + rand_init=True): + ''' + A = WH^T + ''' + self.A = A + self.n_row = A.shape[0] + self.n_col = A.shape[1] + + self.n_topic = n_topic + self.max_iter = max_iter + self.max_err = max_err + + self.obj = [] + if rand_init: + self.nmf_init_rand() + else: + self.nmf_init(IW, IH) + self.nmf_iter() + + def nmf_init_rand(self): + self.W = np.random.random((self.n_row, self.n_topic)) + self.H = np.random.random((self.n_col, self.n_topic)) + + for k in range(self.n_topic): + self.W[:, k] /= norm(self.W[:, k]) + + def nmf_init(self, IW, IH): + self.W = IW + self.H = IH + + for k in range(self.n_topic): + self.W[:, k] /= norm(self.W[:, k]) + + def nmf_iter(self): + loss_old = 1e20 + print('loop begin') + start_time = time.time() + for i in range(self.max_iter): + self.nmf_solver() + loss = self.nmf_loss() + self.obj.append(loss) + + if loss_old - loss < self.max_err: + break + loss_old = loss + end_time = time.time() + print('Step={}, Loss={}, Time={}s'.format(i, loss, end_time - start_time)) + print('loop end') + + def nmf_solver(self): + ''' + regular NMF without constraint. + Block Coordinate Decent + ''' + epss = 1e-20 + + HtH = self.H.T.dot(self.H) + AH = self.A.dot(self.H) + for k in range(self.n_topic): + tmpW = self.W[:, k] * HtH[k, k] + AH[:, k] - np.dot(self.W, HtH[:, k]) + self.W[:, k] = np.maximum(tmpW, epss) + self.W[:, k] /= norm(self.W[:, k]) + epss + + WtW = self.W.T.dot(self.W) + AtW = self.A.T.dot(self.W) + for k in range(self.n_topic): + self.H[:, k] = self.H[:, k] * WtW[k, k] + AtW[:, k] - np.dot(self.H, WtW[:, k]) + self.H[:, k] = np.maximum(self.H[:, k], epss) + + def nmf_loss(self): + loss = norm(self.A - np.dot(self.W, np.transpose(self.H)), 'fro') ** 2 / 2.0 + return loss + + def get_loss(self): + return np.array(self.obj) + + def get_lowrank_matrix(self): + return self.W, self.H + + def get_decomposition_matrix(self): + return self.W, self.H + + def save_format(self, Wfile='W.txt', Hfile='H.txt'): + np.savetxt(Wfile, self.W) + np.savetxt(Hfile, self.H) \ No newline at end of file diff --git a/nautilus_nlp/models/topic_modeling_short_text.py b/nautilus_nlp/models/topic_modeling_short_text.py index e69de29..56a0994 100644 --- a/nautilus_nlp/models/topic_modeling_short_text.py +++ b/nautilus_nlp/models/topic_modeling_short_text.py @@ -0,0 +1,84 @@ +import re +from nmf_seanmf_models import * +import numpy as np + +def data_preparation(text, vocab_min_count=1, vocab_max_size=10000): + """ + This function expects a list of documents (sentences) and returns the needed data to + make topic modeling for short text using NMF. + :return: + + """ + + vocab = {} + for sentence in text: + sentence = re.split('\s', sentence) + for wd in sentence: + try: + vocab[wd] += 1 + except: + vocab[wd] = 1 + # Create Vocab array ( list of sorted vocab + counts ) + vocab_arr = [[wd, vocab[wd]] for wd in vocab if vocab[wd] > vocab_min_count] + vocab_arr = sorted(vocab_arr, key=lambda k: k[1])[::-1] + vocab_arr = vocab_arr[:vocab_max_size] + vocab_arr = sorted(vocab_arr) + + vocab_list = list(map(lambda x:x[0], vocab_arr)) + # Create Vocab to ID dictionnary + vocab2id = {itm[1][0]: itm[0] for itm in enumerate(vocab_arr)} + + # Create ID representation of text (ie: each sentence is a list of vocabId ) + encoded_text_id = [] + for sentence in text: + sentence = re.split('\s', sentence) + sentence = [int(vocab2id[wd]) for wd in sentence if wd in vocab2id] + encoded_text_id.append(sentence) + return encoded_text_id, vocab_list, vocab_arr + + +def train_model(model,n_docs, n_terms, docs, n_topics= 20, max_iter= 20, max_err=0.1, alpha = 0, beta=0): + """ + :param model: + :param n_docs: + :param n_terms: + :param docs: + :param n_topics: + :param max_iter: + :param max_err: + :param alpha: + :param beta: + :return: + """ + if model == 'nmf': + dt_mat = np.zeros([n_terms, n_docs]) + for k in range(n_docs): + for j in docs[k]: + dt_mat[j, k] += 1.0 + model = NMF( + dt_mat, + n_topic=n_topics, + max_iter=max_iter, + max_err=max_err) + + return model + +## TEST + +text = ['abs souscription ird abs collaborateur message bloquant finaliser merci selectionner un personne physique comme assurer principal', +'ref contrat af752001033 date heure creation avener non technique abs abs souscription ird collaborateur souhaiter repasser contrat mensuel selectionner bon rib car rib present sur contrat être errone celer cause impaye sur contrat', +'demande refair devis faire depuis im non traduire dans ab avec declanchement visa correction un message erreur', +'abs souscription ird souscription un affaire nouveau abs collab arriver pas finaliser son contrat'] +encoded_text_id, vocab_list, vocab_arr = data_preparation(text) + +print(encoded_text_id) + +print(vocab_arr) + +n_docs = len(encoded_text_id) +n_terms = len(vocab_list) +docs = encoded_text_id +vocab = vocab_list + +x = train_model('nmf', n_docs, n_terms, docs) +W, H = x.get_decomposition_matrix() From c3370af8a2b1f153e3bcb82d9d0758d2ba593ccb Mon Sep 17 00:00:00 2001 From: Kais LARIBI <kais.laribi@artefact.com> Date: Tue, 27 Aug 2019 14:51:15 +0200 Subject: [PATCH 228/496] NMF short text --- nautilus_nlp/models/nmf_model.py | 99 ++++++++ nautilus_nlp/models/nmf_seanmf_models.py | 223 ------------------ .../models/topic_modeling_short_text.py | 105 +++++++-- 3 files changed, 190 insertions(+), 237 deletions(-) create mode 100644 nautilus_nlp/models/nmf_model.py delete mode 100644 nautilus_nlp/models/nmf_seanmf_models.py diff --git a/nautilus_nlp/models/nmf_model.py b/nautilus_nlp/models/nmf_model.py new file mode 100644 index 0000000..252b612 --- /dev/null +++ b/nautilus_nlp/models/nmf_model.py @@ -0,0 +1,99 @@ + +import time +import numpy as np +from numpy.linalg import norm + +''' +Topic Modeling via NMF +''' + +class NMF(object): + def __init__( + self, + A, IW=[], IH=[], + n_topic=10, max_iter=100, max_err=1e-3, + rand_init=True): + ''' + A = WH^T + ''' + self.A = A + self.n_row = A.shape[0] + self.n_col = A.shape[1] + + self.n_topic = n_topic + self.max_iter = max_iter + self.max_err = max_err + + self.obj = [] + if rand_init: + self.nmf_init_rand() + else: + self.nmf_init(IW, IH) + self.nmf_iter() + + def nmf_init_rand(self): + self.W = np.random.random((self.n_row, self.n_topic)) + self.H = np.random.random((self.n_col, self.n_topic)) + + for k in range(self.n_topic): + self.W[:, k] /= norm(self.W[:, k]) + + def nmf_init(self, IW, IH): + self.W = IW + self.H = IH + + for k in range(self.n_topic): + self.W[:, k] /= norm(self.W[:, k]) + + def nmf_iter(self): + loss_old = 1e20 + print('loop begin') + start_time = time.time() + for i in range(self.max_iter): + self.nmf_solver() + loss = self.nmf_loss() + self.obj.append(loss) + + if loss_old - loss < self.max_err: + break + loss_old = loss + end_time = time.time() + print('Step={}, Loss={}, Time={}s'.format(i, loss, end_time - start_time)) + print('loop end') + + def nmf_solver(self): + ''' + regular NMF without constraint. + Block Coordinate Decent + ''' + epss = 1e-20 + + HtH = self.H.T.dot(self.H) + AH = self.A.dot(self.H) + for k in range(self.n_topic): + tmpW = self.W[:, k] * HtH[k, k] + AH[:, k] - np.dot(self.W, HtH[:, k]) + self.W[:, k] = np.maximum(tmpW, epss) + self.W[:, k] /= norm(self.W[:, k]) + epss + + WtW = self.W.T.dot(self.W) + AtW = self.A.T.dot(self.W) + for k in range(self.n_topic): + self.H[:, k] = self.H[:, k] * WtW[k, k] + AtW[:, k] - np.dot(self.H, WtW[:, k]) + self.H[:, k] = np.maximum(self.H[:, k], epss) + + def nmf_loss(self): + loss = norm(self.A - np.dot(self.W, np.transpose(self.H)), 'fro') ** 2 / 2.0 + return loss + + def get_loss(self): + return np.array(self.obj) + + def get_lowrank_matrix(self): + return self.W, self.H + + def get_decomposition_matrix(self): + return self.W, self.H + + def save_format(self, Wfile='W.txt', Hfile='H.txt'): + np.savetxt(Wfile, self.W) + np.savetxt(Hfile, self.H) \ No newline at end of file diff --git a/nautilus_nlp/models/nmf_seanmf_models.py b/nautilus_nlp/models/nmf_seanmf_models.py deleted file mode 100644 index e713175..0000000 --- a/nautilus_nlp/models/nmf_seanmf_models.py +++ /dev/null @@ -1,223 +0,0 @@ -''' -Short Text Topic Modeling via SeaNMF -''' -import time -import numpy as np -from numpy.linalg import norm - - -class SeaNMFL1(object): - def __init__( - self, - A, S, - IW1=[], IW2=[], IH=[], - alpha=1.0, beta=0.1, n_topic=10, max_iter=100, max_err=1e-3, - rand_init=True, fix_seed=False): - ''' - 0.5*||A-WH^T||_F^2+0.5*alpha*||S-WW_c^T||_F^2+0.5*beta*||W||_1^2 - W = W1 - Wc = W2 - ''' - if fix_seed: - np.random.seed(0) - - self.A = A - self.S = S - - self.n_row = A.shape[0] - self.n_col = A.shape[1] - - self.n_topic = n_topic - self.max_iter = max_iter - self.alpha = alpha - self.beta = beta - self.B = np.ones([self.n_topic, 1]) - self.max_err = max_err - - if rand_init: - self.nmf_init_rand() - else: - self.nmf_init(IW1, IW2, IH) - self.nmf_iter() - - def nmf_init_rand(self): - self.W1 = np.random.random((self.n_row, self.n_topic)) - self.W2 = np.random.random((self.n_row, self.n_topic)) - self.H = np.random.random((self.n_col, self.n_topic)) - - for k in range(self.n_topic): - self.W1[:, k] /= norm(self.W1[:, k]) - self.W2[:, k] /= norm(self.W2[:, k]) - - def nmf_init(self, IW1, IW2, IH): - self.W1 = IW1 - self.W2 = IW2 - self.H = IH - - for k in range(self.n_topic): - self.W1[:, k] /= norm(self.W1[:, k]) - self.W2[:, k] /= norm(self.W2[:, k]) - - def nmf_iter(self): - loss_old = 1e20 - print('loop begin') - start_time = time.time() - for i in range(self.max_iter): - self.nmf_solver() - loss = self.nmf_loss() - if loss_old - loss < self.max_err: - break - loss_old = loss - end_time = time.time() - print('Step={}, Loss={}, Time={}s'.format(i, loss, end_time - start_time)) - - def nmf_solver(self): - ''' - using BCD framework - ''' - epss = 1e-20 - # Update W1 - AH = np.dot(self.A, self.H) - SW2 = np.dot(self.S, self.W2) - HtH = np.dot(self.H.T, self.H) - W2tW2 = np.dot(self.W2.T, self.W2) - W11 = self.W1.dot(self.B) - - for k in range(self.n_topic): - num0 = HtH[k, k] * self.W1[:, k] + self.alpha * W2tW2[k, k] * self.W1[:, k] - num1 = AH[:, k] + self.alpha * SW2[:, k] - num2 = np.dot(self.W1, HtH[:, k]) + self.alpha * np.dot(self.W1, W2tW2[:, k]) + self.beta * W11[0] - self.W1[:, k] = num0 + num1 - num2 - self.W1[:, k] = np.maximum(self.W1[:, k], epss) # project > 0 - self.W1[:, k] /= norm(self.W1[:, k]) + epss # normalize - # Update W2 - W1tW1 = self.W1.T.dot(self.W1) - StW1 = np.dot(self.S, self.W1) - for k in range(self.n_topic): - self.W2[:, k] = self.W2[:, k] + StW1[:, k] - np.dot(self.W2, W1tW1[:, k]) - self.W2[:, k] = np.maximum(self.W2[:, k], epss) - # Update H - AtW1 = np.dot(self.A.T, self.W1) - for k in range(self.n_topic): - self.H[:, k] = self.H[:, k] + AtW1[:, k] - np.dot(self.H, W1tW1[:, k]) - self.H[:, k] = np.maximum(self.H[:, k], epss) - - def nmf_loss(self): - ''' - Calculate loss - ''' - loss = norm(self.A - np.dot(self.W1, np.transpose(self.H)), 'fro') ** 2 / 2.0 - if self.alpha > 0: - loss += self.alpha * norm(np.dot(self.W1, np.transpose(self.W2)) - self.S, 'fro') ** 2 / 2.0 - if self.beta > 0: - loss += self.beta * norm(self.W1, 1) ** 2 / 2.0 - - return loss - - def get_lowrank_matrix(self): - return self.W1, self.W2, self.H - - def get_decomposition_matrix(self): - return self.W1, self.W2, self.H - - def save_format(self, W1file='W.txt', W2file='Wc.txt', Hfile='H.txt'): - np.savetxt(W1file, self.W1) - np.savetxt(W2file, self.W2) - np.savetxt(Hfile, self.H) - - -''' -Topic Modeling via NMF -''' - - -class NMF(object): - def __init__( - self, - A, IW=[], IH=[], - n_topic=10, max_iter=100, max_err=1e-3, - rand_init=True): - ''' - A = WH^T - ''' - self.A = A - self.n_row = A.shape[0] - self.n_col = A.shape[1] - - self.n_topic = n_topic - self.max_iter = max_iter - self.max_err = max_err - - self.obj = [] - if rand_init: - self.nmf_init_rand() - else: - self.nmf_init(IW, IH) - self.nmf_iter() - - def nmf_init_rand(self): - self.W = np.random.random((self.n_row, self.n_topic)) - self.H = np.random.random((self.n_col, self.n_topic)) - - for k in range(self.n_topic): - self.W[:, k] /= norm(self.W[:, k]) - - def nmf_init(self, IW, IH): - self.W = IW - self.H = IH - - for k in range(self.n_topic): - self.W[:, k] /= norm(self.W[:, k]) - - def nmf_iter(self): - loss_old = 1e20 - print('loop begin') - start_time = time.time() - for i in range(self.max_iter): - self.nmf_solver() - loss = self.nmf_loss() - self.obj.append(loss) - - if loss_old - loss < self.max_err: - break - loss_old = loss - end_time = time.time() - print('Step={}, Loss={}, Time={}s'.format(i, loss, end_time - start_time)) - print('loop end') - - def nmf_solver(self): - ''' - regular NMF without constraint. - Block Coordinate Decent - ''' - epss = 1e-20 - - HtH = self.H.T.dot(self.H) - AH = self.A.dot(self.H) - for k in range(self.n_topic): - tmpW = self.W[:, k] * HtH[k, k] + AH[:, k] - np.dot(self.W, HtH[:, k]) - self.W[:, k] = np.maximum(tmpW, epss) - self.W[:, k] /= norm(self.W[:, k]) + epss - - WtW = self.W.T.dot(self.W) - AtW = self.A.T.dot(self.W) - for k in range(self.n_topic): - self.H[:, k] = self.H[:, k] * WtW[k, k] + AtW[:, k] - np.dot(self.H, WtW[:, k]) - self.H[:, k] = np.maximum(self.H[:, k], epss) - - def nmf_loss(self): - loss = norm(self.A - np.dot(self.W, np.transpose(self.H)), 'fro') ** 2 / 2.0 - return loss - - def get_loss(self): - return np.array(self.obj) - - def get_lowrank_matrix(self): - return self.W, self.H - - def get_decomposition_matrix(self): - return self.W, self.H - - def save_format(self, Wfile='W.txt', Hfile='H.txt'): - np.savetxt(Wfile, self.W) - np.savetxt(Hfile, self.H) \ No newline at end of file diff --git a/nautilus_nlp/models/topic_modeling_short_text.py b/nautilus_nlp/models/topic_modeling_short_text.py index 56a0994..1553fff 100644 --- a/nautilus_nlp/models/topic_modeling_short_text.py +++ b/nautilus_nlp/models/topic_modeling_short_text.py @@ -5,9 +5,8 @@ def data_preparation(text, vocab_min_count=1, vocab_max_size=10000): """ This function expects a list of documents (sentences) and returns the needed data to - make topic modeling for short text using NMF. + make topic modeling for short text using NMF model. :return: - """ vocab = {} @@ -37,11 +36,9 @@ def data_preparation(text, vocab_min_count=1, vocab_max_size=10000): return encoded_text_id, vocab_list, vocab_arr -def train_model(model,n_docs, n_terms, docs, n_topics= 20, max_iter= 20, max_err=0.1, alpha = 0, beta=0): +def train_model(model, encoded_text_id, vocab_list, n_topics= 20, max_iter= 20, max_err=0.1, alpha = 0, beta=0): """ :param model: - :param n_docs: - :param n_terms: :param docs: :param n_topics: :param max_iter: @@ -50,10 +47,14 @@ def train_model(model,n_docs, n_terms, docs, n_topics= 20, max_iter= 20, max_err :param beta: :return: """ + + n_docs = len(encoded_text_id) + n_terms = len(vocab_list) + if model == 'nmf': dt_mat = np.zeros([n_terms, n_docs]) for k in range(n_docs): - for j in docs[k]: + for j in encoded_text_id[k]: dt_mat[j, k] += 1.0 model = NMF( dt_mat, @@ -63,6 +64,81 @@ def train_model(model,n_docs, n_terms, docs, n_topics= 20, max_iter= 20, max_err return model + +def show_dominant_topic(model, encoded_text_id, vocab_list, n_topKeyword =10): + """ + Computes the PMi score for each topic and the topKeywords describing each of them. + :param model: + :param encoded_text_id: + :param vocab_list: + :return: topics = dictionnary with the topic number and its topkeywords + pmi_score = dictionnary with the topic number and its PMI score + """ + + dt_mat = __build_cooccurence_matrix(n_terms=len(vocab_list), encoded_text_id=encoded_text_id) + W,_ = model.get_decomposition_matrix() + n_topic = W.shape[1] + PMI_arr = [] + for k in range(n_topic): + top_keywords_index = W[:, k].argsort()[::-1][:n_topKeyword] + PMI_arr.append(__calculate_PMI(dt_mat, top_keywords_index)) + + index = np.argsort(PMI_arr) + topics = {} + pmi_score = {} + for k in index: + words = [] + for w in np.argsort(W[:, k])[::-1][:n_topKeyword]: + words.append(vocab_list[w]) + # Complete the topic and the score dicts. Format {Topic_number: words or score} + topics[k] = words + pmi_score[k] = PMI_arr[k] + + return topics, pmi_score + +def get_assigned_topics(model): + """ + Assign the topic number to the sentences used when training the model + :param model: trained model + :return topics_list: list having the same length as the training text containing topics assigned to each sentence. + """ + _, H = model.get_decomposition_matrix() + H_probs = H / H.sum(axis=1, keepdims=True) + topics_list = list(np.argmax(H_probs, axis=1) + 1) + return topics_list + + +def __build_cooccurence_matrix(n_terms, encoded_text_id): + dt_mat = np.zeros([n_terms, n_terms]) + for itm in encoded_text_id: + for kk in itm: + for jj in itm: + if kk != jj: + dt_mat[int(kk), int(jj)] += 1.0 + return dt_mat + +def __calculate_PMI(AA, topKeywordsIndex): + ''' + Method to compute PMi score + Reference: + Short and Sparse Text Topic Modeling via Self-Aggregation + ''' + D1 = np.sum(AA) + n_tp = len(topKeywordsIndex) + PMI = [] + for index1 in topKeywordsIndex: + for index2 in topKeywordsIndex: + if index2 < index1: + if AA[index1, index2] == 0: + PMI.append(0.0) + else: + C1 = np.sum(AA[index1]) + C2 = np.sum(AA[index2]) + PMI.append(np.log(AA[index1,index2]*D1/C1/C2)) + avg_PMI = 2.0*np.sum(PMI)/float(n_tp)/(float(n_tp)-1.0) + + return avg_PMI + ## TEST text = ['abs souscription ird abs collaborateur message bloquant finaliser merci selectionner un personne physique comme assurer principal', @@ -71,14 +147,15 @@ def train_model(model,n_docs, n_terms, docs, n_topics= 20, max_iter= 20, max_err 'abs souscription ird souscription un affaire nouveau abs collab arriver pas finaliser son contrat'] encoded_text_id, vocab_list, vocab_arr = data_preparation(text) -print(encoded_text_id) +#print(encoded_text_id) +#print(vocab_arr) + +x = train_model('nmf', encoded_text_id, vocab_list, n_topics= 3) +topics, pmi_score = show_dominant_topic(x, encoded_text_id, vocab_list, n_topKeyword =10) -print(vocab_arr) +print(topics) -n_docs = len(encoded_text_id) -n_terms = len(vocab_list) -docs = encoded_text_id -vocab = vocab_list +print(pmi_score) -x = train_model('nmf', n_docs, n_terms, docs) -W, H = x.get_decomposition_matrix() +list_of_topics= get_assigned_topics(x) +print(list_of_topics) From 7b036bb2c75ff2b4ada197c8ad32657f70840113 Mon Sep 17 00:00:00 2001 From: Kais LARIBI <kais.laribi@artefact.com> Date: Tue, 27 Aug 2019 17:51:29 +0200 Subject: [PATCH 229/496] add pyldavis viz for Short text --- tests/test_topic_modeling_shot_text.py | 0 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 tests/test_topic_modeling_shot_text.py diff --git a/tests/test_topic_modeling_shot_text.py b/tests/test_topic_modeling_shot_text.py new file mode 100644 index 0000000..e69de29 From 16f4f1ae4992484256a3cba9b6bad3644058c2c0 Mon Sep 17 00:00:00 2001 From: Kais LARIBI <kais.laribi@artefact.com> Date: Tue, 27 Aug 2019 17:53:46 +0200 Subject: [PATCH 230/496] add pyldavis viz for Short text --- .../models/topic_modeling_short_text.py | 118 +++++++++++------- 1 file changed, 72 insertions(+), 46 deletions(-) diff --git a/nautilus_nlp/models/topic_modeling_short_text.py b/nautilus_nlp/models/topic_modeling_short_text.py index 1553fff..38fc507 100644 --- a/nautilus_nlp/models/topic_modeling_short_text.py +++ b/nautilus_nlp/models/topic_modeling_short_text.py @@ -1,12 +1,15 @@ import re -from nmf_seanmf_models import * +from nautilus_nlp.models.nmf_model import * import numpy as np +import pyLDAvis -def data_preparation(text, vocab_min_count=1, vocab_max_size=10000): +def prepare_data(text, vocab_min_count=1, vocab_max_size=10000): """ This function expects a list of documents (sentences) and returns the needed data to make topic modeling for short text using NMF model. - :return: + :return: encoded_text_id: list of encoded sentences using vocab IDs + vocab_list: list of vocabulary + vocab_arr: array with vocab frequency counts """ vocab = {} @@ -36,31 +39,30 @@ def data_preparation(text, vocab_min_count=1, vocab_max_size=10000): return encoded_text_id, vocab_list, vocab_arr -def train_model(model, encoded_text_id, vocab_list, n_topics= 20, max_iter= 20, max_err=0.1, alpha = 0, beta=0): +def train_nmf_model(encoded_text_id, vocab_list, n_topics= 20, max_iter= 20, max_err=0.1, alpha = 0, beta=0): """ - :param model: - :param docs: - :param n_topics: - :param max_iter: - :param max_err: - :param alpha: - :param beta: - :return: + :param encoded_text_id: list of encoded sentences + :param vocab_list: list of vocabulary + :param n_topics: number of topics + :param max_iter: maximum number of iterations while training + :param max_err: training error + :param alpha: regularization param for the NMF model + :param beta: regularization param for the NMF model + :return: Trained NMF model """ n_docs = len(encoded_text_id) n_terms = len(vocab_list) - if model == 'nmf': - dt_mat = np.zeros([n_terms, n_docs]) - for k in range(n_docs): - for j in encoded_text_id[k]: - dt_mat[j, k] += 1.0 - model = NMF( - dt_mat, - n_topic=n_topics, - max_iter=max_iter, - max_err=max_err) + dt_mat = np.zeros([n_terms, n_docs]) + for k in range(n_docs): + for j in encoded_text_id[k]: + dt_mat[j, k] += 1.0 + model = NMF( + dt_mat, + n_topic=n_topics, + max_iter=max_iter, + max_err=max_err) return model @@ -68,9 +70,9 @@ def train_model(model, encoded_text_id, vocab_list, n_topics= 20, max_iter= 20, def show_dominant_topic(model, encoded_text_id, vocab_list, n_topKeyword =10): """ Computes the PMi score for each topic and the topKeywords describing each of them. - :param model: - :param encoded_text_id: - :param vocab_list: + :param model: trained NMF model + :param encoded_text_id: list of encoded sentences + :param vocab_list: list of vocabulary :return: topics = dictionnary with the topic number and its topkeywords pmi_score = dictionnary with the topic number and its PMI score """ @@ -99,7 +101,7 @@ def show_dominant_topic(model, encoded_text_id, vocab_list, n_topKeyword =10): def get_assigned_topics(model): """ Assign the topic number to the sentences used when training the model - :param model: trained model + :param model: trained model for short text :return topics_list: list having the same length as the training text containing topics assigned to each sentence. """ _, H = model.get_decomposition_matrix() @@ -108,6 +110,49 @@ def get_assigned_topics(model): return topics_list +def show_pyldavis(model, encoded_text_id, vocab_arr): + """ + :param model: trained model + :param encoded_text_id: encoded_text_id: list of encoded sentences + :param vocab_arr: array of vocabulary frequency + :return: pyldavis topics plot + """ + data = prepare_data_pyldavis(model, encoded_text_id, vocab_arr) + vis_data = pyLDAvis.prepare(**data) + return pyLDAvis.display(vis_data) + +def prepare_data_pyldavis(model, encoded_text_id, vocab_arr): + """ + Transform the model decomposed matrix to create topic term and document topics matrices + and prepare data to feed pyldavis. + link : http://jeriwieringa.com/2018/07/17/pyLDAviz-and-Mallet/ + :return dict of data needed by pyldavis + """ + # 1 List of documents lengths + doc_length_values=[] + for doc in encoded_text_id: + doc_length_values.append(len(doc)) + # 2 List of vocab + list_vocab = list(map(lambda x: x[0], vocab_arr)) + # 3 List of vocab. Frequency + freq_vocab = list(map(lambda x: x[1], vocab_arr)) + W, H = model.get_decomposition_matrix() + # Normlize the decomposition to get probabilities + W_probs = W / W.sum(axis=1, keepdims=True) + # 4 topic term matrix phi + phi = W_probs.T + # 5 document term matrix theta + theta = H / H.sum(axis=1, keepdims=True) + + data = {'topic_term_dists': phi, + 'doc_topic_dists': theta, + 'doc_lengths': doc_length_values, + 'vocab': list_vocab, + 'term_frequency': freq_vocab + } + + return data + def __build_cooccurence_matrix(n_terms, encoded_text_id): dt_mat = np.zeros([n_terms, n_terms]) for itm in encoded_text_id: @@ -115,6 +160,7 @@ def __build_cooccurence_matrix(n_terms, encoded_text_id): for jj in itm: if kk != jj: dt_mat[int(kk), int(jj)] += 1.0 + return dt_mat def __calculate_PMI(AA, topKeywordsIndex): @@ -139,23 +185,3 @@ def __calculate_PMI(AA, topKeywordsIndex): return avg_PMI -## TEST - -text = ['abs souscription ird abs collaborateur message bloquant finaliser merci selectionner un personne physique comme assurer principal', -'ref contrat af752001033 date heure creation avener non technique abs abs souscription ird collaborateur souhaiter repasser contrat mensuel selectionner bon rib car rib present sur contrat être errone celer cause impaye sur contrat', -'demande refair devis faire depuis im non traduire dans ab avec declanchement visa correction un message erreur', -'abs souscription ird souscription un affaire nouveau abs collab arriver pas finaliser son contrat'] -encoded_text_id, vocab_list, vocab_arr = data_preparation(text) - -#print(encoded_text_id) -#print(vocab_arr) - -x = train_model('nmf', encoded_text_id, vocab_list, n_topics= 3) -topics, pmi_score = show_dominant_topic(x, encoded_text_id, vocab_list, n_topKeyword =10) - -print(topics) - -print(pmi_score) - -list_of_topics= get_assigned_topics(x) -print(list_of_topics) From 0057b5c9349dcec910953238b8da8433b53f97f3 Mon Sep 17 00:00:00 2001 From: Kais LARIBI <kais.laribi@artefact.com> Date: Wed, 28 Aug 2019 10:46:38 +0200 Subject: [PATCH 231/496] Add notebook short text modeling --- nautilus_nlp/models/nmf_model.py | 3 - .../models/topic_modeling_short_text.py | 10 +- .../6. Topic Modeling - short text.ipynb | 312 ++++++++++++++++++ ...t.py => test_topic_modeling_short_text.py} | 0 4 files changed, 320 insertions(+), 5 deletions(-) create mode 100644 notebooks/6. Topic Modeling - short text.ipynb rename tests/{test_topic_modeling_shot_text.py => test_topic_modeling_short_text.py} (100%) diff --git a/nautilus_nlp/models/nmf_model.py b/nautilus_nlp/models/nmf_model.py index 252b612..93a6715 100644 --- a/nautilus_nlp/models/nmf_model.py +++ b/nautilus_nlp/models/nmf_model.py @@ -88,9 +88,6 @@ def nmf_loss(self): def get_loss(self): return np.array(self.obj) - def get_lowrank_matrix(self): - return self.W, self.H - def get_decomposition_matrix(self): return self.W, self.H diff --git a/nautilus_nlp/models/topic_modeling_short_text.py b/nautilus_nlp/models/topic_modeling_short_text.py index 38fc507..9b1bb8f 100644 --- a/nautilus_nlp/models/topic_modeling_short_text.py +++ b/nautilus_nlp/models/topic_modeling_short_text.py @@ -36,6 +36,7 @@ def prepare_data(text, vocab_min_count=1, vocab_max_size=10000): sentence = re.split('\s', sentence) sentence = [int(vocab2id[wd]) for wd in sentence if wd in vocab2id] encoded_text_id.append(sentence) + return encoded_text_id, vocab_list, vocab_arr @@ -104,9 +105,11 @@ def get_assigned_topics(model): :param model: trained model for short text :return topics_list: list having the same length as the training text containing topics assigned to each sentence. """ + _, H = model.get_decomposition_matrix() H_probs = H / H.sum(axis=1, keepdims=True) topics_list = list(np.argmax(H_probs, axis=1) + 1) + return topics_list @@ -117,8 +120,10 @@ def show_pyldavis(model, encoded_text_id, vocab_arr): :param vocab_arr: array of vocabulary frequency :return: pyldavis topics plot """ + data = prepare_data_pyldavis(model, encoded_text_id, vocab_arr) vis_data = pyLDAvis.prepare(**data) + return pyLDAvis.display(vis_data) def prepare_data_pyldavis(model, encoded_text_id, vocab_arr): @@ -128,6 +133,7 @@ def prepare_data_pyldavis(model, encoded_text_id, vocab_arr): link : http://jeriwieringa.com/2018/07/17/pyLDAviz-and-Mallet/ :return dict of data needed by pyldavis """ + # 1 List of documents lengths doc_length_values=[] for doc in encoded_text_id: @@ -169,6 +175,7 @@ def __calculate_PMI(AA, topKeywordsIndex): Reference: Short and Sparse Text Topic Modeling via Self-Aggregation ''' + D1 = np.sum(AA) n_tp = len(topKeywordsIndex) PMI = [] @@ -183,5 +190,4 @@ def __calculate_PMI(AA, topKeywordsIndex): PMI.append(np.log(AA[index1,index2]*D1/C1/C2)) avg_PMI = 2.0*np.sum(PMI)/float(n_tp)/(float(n_tp)-1.0) - return avg_PMI - + return avg_PMI \ No newline at end of file diff --git a/notebooks/6. Topic Modeling - short text.ipynb b/notebooks/6. Topic Modeling - short text.ipynb new file mode 100644 index 0000000..e6b7417 --- /dev/null +++ b/notebooks/6. Topic Modeling - short text.ipynb @@ -0,0 +1,312 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Topic modeling for short text\n" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [], + "source": [ + "from nautilus_nlp.models.topic_modeling_short_text import *\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Data Preparation " + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "It is possible to use Nautilus functions to clean and preprocess raw text. The ouput of the cleaning process should be a list of sentences (strings). " + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [], + "source": [ + "text = ['Cola 1.5L Carrefour',\n", + " 'Pepsi Cola Light 1.5L',\n", + " 'Pepsi Cola Twist Light',\n", + " 'Cola 1.5L CRF DISC',\n", + " 'Coca-Cola Light 1.5L',\n", + " 'Coca-Cola Light 4x0.5L',\n", + " 'Coca-Cola Light 6x0.3L',\n", + " 'Panzani 200g x 4 bio',\n", + " 'Rustichella 150g bio',\n", + " 'De Cecco - Fusilli bio',\n", + " 'Gerblé sans Gluten50g',\n", + " 'Penne de riz 100g sans gluten',\n", + " 'Spaghetti de maïs 50g sans Glute']\n", + "\n", + "encoded_text_id, vocab_list, vocab_arr = prepare_data(text)" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "[['1.5L', 4],\n", + " ['Coca-Cola', 3],\n", + " ['Cola', 4],\n", + " ['Light', 5],\n", + " ['Pepsi', 2],\n", + " ['bio', 3],\n", + " ['de', 2],\n", + " ['sans', 3]]" + ] + }, + "execution_count": 3, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "vocab_arr" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[[2, 0], [4, 2, 3, 0], [4, 2, 3], [2, 0], [1, 3, 0], [1, 3], [1, 3], [5], [5], [5], [7], [6, 7], [6, 7]]\n", + "[[2, 0], [4, 2, 3, 0], [4, 2, 3], [2, 0], [1, 3, 0], [1, 3], [1, 3], [5], [5], [5], [7], [6, 7], [6, 7]]\n", + "[['1.5L', 4], ['Coca-Cola', 3], ['Cola', 4], ['Light', 5], ['Pepsi', 2], ['bio', 3], ['de', 2], ['sans', 3]]\n" + ] + } + ], + "source": [ + "print(encoded_text_id)\n", + "print(encoded_text_id)\n", + "print(vocab_arr)\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Train the NMF model" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "loop begin\n", + "Step=0, Loss=5.91164999713721, Time=0.0003788471221923828s\n", + "Step=1, Loss=4.985359112354993, Time=0.0023560523986816406s\n", + "Step=2, Loss=4.323260756623319, Time=0.0044097900390625s\n", + "Step=3, Loss=4.021169618891115, Time=0.005792856216430664s\n", + "Step=4, Loss=3.9201702703506403, Time=0.006429910659790039s\n", + "loop end\n" + ] + } + ], + "source": [ + "x = train_nmf_model(encoded_text_id, vocab_list, n_topics= 3)\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Get keywords description of the topics\n" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "topic 2 : Pmi: 0.22768662780017118 ['1.5L', 'Cola', 'Pepsi', 'Light', 'bio']\n", + "topic 0 : Pmi: 0.42152248372930645 ['Light', 'Pepsi', 'sans', 'Cola', 'de']\n", + "topic 1 : Pmi: 0.4373829867469703 ['Coca-Cola', 'Light', '1.5L', 'sans', 'de']\n" + ] + } + ], + "source": [ + "topics, pmi_score = show_dominant_topic(x, encoded_text_id, vocab_list, n_topKeyword =5)\n", + "\n", + "\n", + "for t in topics.keys():\n", + " print('topic', t,': Pmi:', pmi_score[t], topics[t])\n", + " \n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Assign topics to sentences" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[3, 3, 1, 3, 2, 2, 2, 3, 3, 3, 1, 1, 1]\n", + "topic 3 ---> Cola 1.5L Carrefour\n", + "topic 3 ---> Pepsi Cola Light 1.5L\n", + "topic 1 ---> Pepsi Cola Twist Light\n", + "topic 3 ---> Cola 1.5L CRF DISC\n", + "topic 2 ---> Coca-Cola Light 1.5L\n", + "topic 2 ---> Coca-Cola Light 4x0.5L\n", + "topic 2 ---> Coca-Cola Light 6x0.3L\n", + "topic 3 ---> Panzani 200g x 4 bio\n", + "topic 3 ---> Rustichella 150g bio\n", + "topic 3 ---> De Cecco - Fusilli bio\n", + "topic 1 ---> Gerblé sans Gluten50g\n", + "topic 1 ---> Penne de riz 100g sans gluten\n", + "topic 1 ---> Spaghetti de maïs 50g sans Glute\n" + ] + } + ], + "source": [ + "list_of_topics= get_assigned_topics(x)\n", + "print(list_of_topics)\n", + "\n", + "for i in range(len(list_of_topics)) : \n", + " print('topic ', list_of_topics[i],'--->',text[i])" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Plot topics with pyldavis" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/Users/kaislaribi/anaconda3/envs/DataScience/lib/python3.7/site-packages/pyLDAvis/_prepare.py:257: FutureWarning: Sorting because non-concatenation axis is not aligned. A future version\n", + "of pandas will change to not sort by default.\n", + "\n", + "To accept the future behavior, pass 'sort=False'.\n", + "\n", + "To retain the current behavior and silence the warning, pass 'sort=True'.\n", + "\n", + " return pd.concat([default_term_info] + list(topic_dfs))\n" + ] + }, + { + "data": { + "text/html": [ + "\n", + "<link rel=\"stylesheet\" type=\"text/css\" href=\"https://cdn.rawgit.com/bmabey/pyLDAvis/files/ldavis.v1.0.0.css\">\n", + "\n", + "\n", + "<div id=\"ldavis_el973044658186304304441590\"></div>\n", + "<script type=\"text/javascript\">\n", + "\n", + "var ldavis_el973044658186304304441590_data = {\"mdsDat\": {\"x\": [-0.07207828005578075, -0.27085879991560496, 0.3429370799713856], \"y\": [-0.28854072014416055, 0.19509552731956145, 0.09344519282459897], \"topics\": [1, 2, 3], \"cluster\": [1, 1, 1], \"Freq\": [40.10719756781703, 35.155302123790236, 24.73750030839274]}, \"tinfo\": {\"Category\": [\"Default\", \"Default\", \"Default\", \"Default\", \"Default\", \"Default\", \"Default\", \"Default\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\"], \"Freq\": [9.0, 9.0, 10.0, 6.0, 9.0, 9.0, 10.0, 7.0, 10.427871367632429, 8.486483566091643, 7.272729095695264, 1.2006516108182672, 0.41204790158952415, 6.421558091596925e-20, 5.013797446678124e-20, 2.4883131435107527e-20, 9.14037855218546, 9.14037855218546, 8.087967197531219, 4.1120406489053, 2.76558788795799, 1.253310853243789e-18, 3.2243865698780584e-20, 2.5201191342509088e-20, 6.431750080182113, 3.2841126876287086, 1.1974180259819893, 5.98670235584042e-19, 3.97476403756747e-20, 3.103399751032683e-20, 1.6274775761634947e-20, 1.153801355593048e-20], \"Term\": [\"de\", \"sans\", \"bio\", \"Coca-Cola\", \"Pepsi\", \"1.5L\", \"Cola\", \"Light\", \"bio\", \"1.5L\", \"Cola\", \"Pepsi\", \"Light\", \"de\", \"sans\", \"Coca-Cola\", \"sans\", \"de\", \"Pepsi\", \"Light\", \"Cola\", \"bio\", \"Coca-Cola\", \"1.5L\", \"Coca-Cola\", \"Light\", \"1.5L\", \"bio\", \"de\", \"sans\", \"Pepsi\", \"Cola\"], \"Total\": [9.0, 9.0, 10.0, 6.0, 9.0, 9.0, 10.0, 7.0, 10.427871367632429, 9.683901592073632, 10.038316983653253, 9.288618808349486, 7.808201238123532, 9.14037855218546, 9.14037855218546, 6.431750080182113, 9.14037855218546, 9.14037855218546, 9.288618808349486, 7.808201238123532, 10.038316983653253, 10.427871367632429, 6.431750080182113, 9.683901592073632, 6.431750080182113, 7.808201238123532, 9.683901592073632, 10.427871367632429, 9.14037855218546, 9.14037855218546, 9.288618808349486, 10.038316983653253], \"loglift\": [8.0, 7.0, 6.0, 5.0, 4.0, 3.0, 2.0, 1.0, 1.9316, 1.7996, 1.6093, -0.1143, -1.0102, -44.4731, -44.7206, -45.0697, 2.0634, 2.0634, 1.925, 1.4221, 0.7742, -41.5018, -44.6788, -45.3345, 2.4149, 1.5488, 0.3246, -41.8892, -44.4696, -44.717, -45.3786, -45.8002], \"logprob\": [8.0, 7.0, 6.0, 5.0, 4.0, 3.0, 2.0, 1.0, 0.0, -0.206, -0.3604, -2.1616, -3.2311, -46.5365, -46.784, -47.4846, 0.0, 0.0, -0.1223, -0.7988, -1.1954, -43.4334, -47.0937, -47.3401, 0.0, -0.6722, -1.6811, -43.8208, -46.533, -46.7805, -47.4259, -47.7699]}, \"token.table\": {\"Topic\": [1, 3, 3, 1, 2, 2, 3, 1, 2, 1, 2, 2], \"Freq\": [0.8261133102124952, 0.1032641637765619, 0.9328720682862902, 0.6973280492535796, 0.2988548782515341, 0.5122818787597335, 0.3842114090698001, 0.10765863263772928, 0.8612690611018342, 0.9589684843101806, 0.984641932346238, 0.984641932346238], \"Term\": [\"1.5L\", \"1.5L\", \"Coca-Cola\", \"Cola\", \"Cola\", \"Light\", \"Light\", \"Pepsi\", \"Pepsi\", \"bio\", \"de\", \"sans\"]}, \"R\": 8, \"lambda.step\": 0.01, \"plot.opts\": {\"xlab\": \"PC1\", \"ylab\": \"PC2\"}, \"topic.order\": [3, 1, 2]};\n", + "\n", + "function LDAvis_load_lib(url, callback){\n", + " var s = document.createElement('script');\n", + " s.src = url;\n", + " s.async = true;\n", + " s.onreadystatechange = s.onload = callback;\n", + " s.onerror = function(){console.warn(\"failed to load library \" + url);};\n", + " document.getElementsByTagName(\"head\")[0].appendChild(s);\n", + "}\n", + "\n", + "if(typeof(LDAvis) !== \"undefined\"){\n", + " // already loaded: just create the visualization\n", + " !function(LDAvis){\n", + " new LDAvis(\"#\" + \"ldavis_el973044658186304304441590\", ldavis_el973044658186304304441590_data);\n", + " }(LDAvis);\n", + "}else if(typeof define === \"function\" && define.amd){\n", + " // require.js is available: use it to load d3/LDAvis\n", + " require.config({paths: {d3: \"https://cdnjs.cloudflare.com/ajax/libs/d3/3.5.5/d3.min\"}});\n", + " require([\"d3\"], function(d3){\n", + " window.d3 = d3;\n", + " LDAvis_load_lib(\"https://cdn.rawgit.com/bmabey/pyLDAvis/files/ldavis.v1.0.0.js\", function(){\n", + " new LDAvis(\"#\" + \"ldavis_el973044658186304304441590\", ldavis_el973044658186304304441590_data);\n", + " });\n", + " });\n", + "}else{\n", + " // require.js not available: dynamically load d3 & LDAvis\n", + " LDAvis_load_lib(\"https://cdnjs.cloudflare.com/ajax/libs/d3/3.5.5/d3.min.js\", function(){\n", + " LDAvis_load_lib(\"https://cdn.rawgit.com/bmabey/pyLDAvis/files/ldavis.v1.0.0.js\", function(){\n", + " new LDAvis(\"#\" + \"ldavis_el973044658186304304441590\", ldavis_el973044658186304304441590_data);\n", + " })\n", + " });\n", + "}\n", + "</script>" + ], + "text/plain": [ + "<IPython.core.display.HTML object>" + ] + }, + "execution_count": 8, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "show_pyldavis(x, encoded_text_id, vocab_arr)\n" + ] + } + ], + "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.7.3" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/tests/test_topic_modeling_shot_text.py b/tests/test_topic_modeling_short_text.py similarity index 100% rename from tests/test_topic_modeling_shot_text.py rename to tests/test_topic_modeling_short_text.py From 4d44f0f9836aefbe1f762e7274fb6f43d7b0f793 Mon Sep 17 00:00:00 2001 From: Kais LARIBI <kais.laribi@artefact.com> Date: Wed, 28 Aug 2019 11:25:32 +0200 Subject: [PATCH 232/496] tests for short text modeling --- .../models/topic_modeling_short_text.py | 2 +- tests/test_topic_modeling_short_text.py | 27 +++++++++++++++++++ 2 files changed, 28 insertions(+), 1 deletion(-) diff --git a/nautilus_nlp/models/topic_modeling_short_text.py b/nautilus_nlp/models/topic_modeling_short_text.py index 9b1bb8f..930c305 100644 --- a/nautilus_nlp/models/topic_modeling_short_text.py +++ b/nautilus_nlp/models/topic_modeling_short_text.py @@ -108,7 +108,7 @@ def get_assigned_topics(model): _, H = model.get_decomposition_matrix() H_probs = H / H.sum(axis=1, keepdims=True) - topics_list = list(np.argmax(H_probs, axis=1) + 1) + topics_list = list(np.argmax(H_probs, axis=1)) return topics_list diff --git a/tests/test_topic_modeling_short_text.py b/tests/test_topic_modeling_short_text.py index e69de29..0b3867c 100644 --- a/tests/test_topic_modeling_short_text.py +++ b/tests/test_topic_modeling_short_text.py @@ -0,0 +1,27 @@ +import pytest +from nautilus_nlp.models.topic_modeling_short_text import prepare_data + + +def test_prepare_data(): + + text = ['Cola 1.5L Carrefour', + 'Pepsi Cola Light 1.5L', + 'Pepsi Cola Twist Light', + 'Cola 1.5L CRF DISC', + 'Coca-Cola Light 1.5L', + 'Coca-Cola Light 4x0.5L', + 'Coca-Cola Light 6x0.3L', + 'Panzani 200g x 4 bio', + 'Rustichella 150g bio', + 'De Cecco - Fusilli bio', + 'Gerblé sans Gluten50g', + 'Penne de riz 100g sans gluten', + 'Spaghetti de maïs 50g sans Glute'] + + expected1 = [['1.5L', 4],['Coca-Cola', 3],['Cola', 4],['Light', 5],['Pepsi', 2],['bio', 3],['de', 2],['sans', 3]] + expected2 = [['1.5L', 4], ['Coca-Cola', 3], ['Cola', 4], ['Light', 5], ['bio', 3], ['sans', 3]] + _,_,output1 = prepare_data(text) + _,_,output2 = prepare_data(text, vocab_min_count=2) + + assert output1 == expected1 + assert output2 == expected2 From 3edfe12b36b9da59f2b629e857abbb71cd96bf3d Mon Sep 17 00:00:00 2001 From: Robin <rdoume@gmail.com> Date: Wed, 28 Aug 2019 19:14:56 +0200 Subject: [PATCH 233/496] Change the travis script for fasttext install --- .travis.yml | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/.travis.yml b/.travis.yml index 6c093cd..93381c6 100644 --- a/.travis.yml +++ b/.travis.yml @@ -6,8 +6,7 @@ services: - docker before_script: - - wget https://github.com/facebookresearch/fastText/archive/v0.2.0.zip && unzip v0.2.0.zip && cd fastText-0.2.0 && make && cd .. - - git clone https://github.com/facebookresearch/fastText.git && cd fastText && pip install . && cd .. && ls + - wget https://github.com/facebookresearch/fastText/archive/v0.2.0.zip && unzip v0.2.0.zip && cd fastText-0.2.0 && make && pip install . && cd .. - python3 -m spacy download fr && python3 -m spacy download en && python3 -m spacy download de && python3 -m spacy download nl && python3 -m spacy download it && python3 -m spacy download xx && python3 -m spacy validate - wget http://mallet.cs.umass.edu/dist/mallet-2.0.8.zip && unzip mallet-2.0.8.zip && rm mallet-2.0.8.zip From 1cb200f37821845fc97a2b8442b4b2d56cd18fd6 Mon Sep 17 00:00:00 2001 From: Robin <rdoume@gmail.com> Date: Thu, 29 Aug 2019 15:33:16 +0200 Subject: [PATCH 234/496] Fix requirement to solve security issue with NLTK package --- requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements.txt b/requirements.txt index 4dfae63..59d0f2e 100644 --- a/requirements.txt +++ b/requirements.txt @@ -21,7 +21,7 @@ matplotlib>=3.0.3 mosestokenizer numpy>1.15.4 stop_words==2018.7.23 -nltk==3.4 +nltk>=3.4.5 textblob==0.15.3 textblob_fr==0.2.0 pandas>=0.23.4 From 5e105375231b03122be336c07e8bbe96bee1ca8a Mon Sep 17 00:00:00 2001 From: Kais LARIBI <kais.laribi@artefact.com> Date: Thu, 5 Sep 2019 14:34:26 +0200 Subject: [PATCH 235/496] improve doc string --- nautilus_nlp/models/nmf_model.py | 63 ++++++++++--------- .../models/topic_modeling_short_text.py | 9 +-- 2 files changed, 39 insertions(+), 33 deletions(-) diff --git a/nautilus_nlp/models/nmf_model.py b/nautilus_nlp/models/nmf_model.py index 93a6715..0a18a6b 100644 --- a/nautilus_nlp/models/nmf_model.py +++ b/nautilus_nlp/models/nmf_model.py @@ -1,7 +1,7 @@ - import time import numpy as np from numpy.linalg import norm +from tqdm import tqdm ''' Topic Modeling via NMF @@ -13,9 +13,19 @@ def __init__( A, IW=[], IH=[], n_topic=10, max_iter=100, max_err=1e-3, rand_init=True): - ''' - A = WH^T - ''' + """ + The objective of the NMF model is to approximate the term-document matrix A by two lower-rank matrices W and H. + The process is iterative and we denote IW and IH the the matrix W and H that are updated at each step. + + :param A: The term-document matrix + :param IW: topics Matrix, each column vector W(:,k) represents the k-th topic in terms of M keywords + and its elements are the weights of the corresponding keywords. + :param IH: The row vector H(j,:) is the latent representation for document j in terms of K topics + :param n_topic: Number of selected topics + :param max_iter: Maximum number of iterations to update W and H + :param max_err: maximum error under which we consider that the loop converged + :param rand_init: random init boolean + """ self.A = A self.n_row = A.shape[0] self.n_col = A.shape[1] @@ -24,42 +34,41 @@ def __init__( self.max_iter = max_iter self.max_err = max_err - self.obj = [] - if rand_init: - self.nmf_init_rand() - else: - self.nmf_init(IW, IH) + self.loss_hist = [] + self.nmf_mat_init(rand_init) self.nmf_iter() - def nmf_init_rand(self): - self.W = np.random.random((self.n_row, self.n_topic)) - self.H = np.random.random((self.n_col, self.n_topic)) - - for k in range(self.n_topic): - self.W[:, k] /= norm(self.W[:, k]) - - def nmf_init(self, IW, IH): - self.W = IW - self.H = IH - + def nmf_mat_init(self, rand_init): + """ + Init Matrices W and H initially either randomly or using existing IW, IH matrices taken when iterating. + :param rand_init: Boolean indicating initial random init + """ + if rand_init: + self.W = np.random.random((self.n_row, self.n_topic)) + self.H = np.random.random((self.n_col, self.n_topic)) + else: + self.W = IW + self.H = IH for k in range(self.n_topic): self.W[:, k] /= norm(self.W[:, k]) def nmf_iter(self): + """ + Main iterative loop for matrix decomposition + """ loss_old = 1e20 - print('loop begin') start_time = time.time() - for i in range(self.max_iter): + for i in tqdm(range(self.max_iter)): self.nmf_solver() loss = self.nmf_loss() - self.obj.append(loss) + self.loss_hist.append(loss) if loss_old - loss < self.max_err: + print('Matrix decomposition loop converged!') break loss_old = loss end_time = time.time() print('Step={}, Loss={}, Time={}s'.format(i, loss, end_time - start_time)) - print('loop end') def nmf_solver(self): ''' @@ -86,11 +95,7 @@ def nmf_loss(self): return loss def get_loss(self): - return np.array(self.obj) + return np.array(self.loss_hist) def get_decomposition_matrix(self): return self.W, self.H - - def save_format(self, Wfile='W.txt', Hfile='H.txt'): - np.savetxt(Wfile, self.W) - np.savetxt(Hfile, self.H) \ No newline at end of file diff --git a/nautilus_nlp/models/topic_modeling_short_text.py b/nautilus_nlp/models/topic_modeling_short_text.py index 930c305..bc1c82b 100644 --- a/nautilus_nlp/models/topic_modeling_short_text.py +++ b/nautilus_nlp/models/topic_modeling_short_text.py @@ -5,13 +5,13 @@ def prepare_data(text, vocab_min_count=1, vocab_max_size=10000): """ - This function expects a list of documents (sentences) and returns the needed data to - make topic modeling for short text using NMF model. + :param text: list of str on which the topic modeling will be performed + :param vocab_min_count: minimum number of occurrences of a word to be considered in the vocabulary + :param vocab_max_size: maximum number of word in the vocabulary :return: encoded_text_id: list of encoded sentences using vocab IDs vocab_list: list of vocabulary vocab_arr: array with vocab frequency counts """ - vocab = {} for sentence in text: sentence = re.split('\s', sentence) @@ -190,4 +190,5 @@ def __calculate_PMI(AA, topKeywordsIndex): PMI.append(np.log(AA[index1,index2]*D1/C1/C2)) avg_PMI = 2.0*np.sum(PMI)/float(n_tp)/(float(n_tp)-1.0) - return avg_PMI \ No newline at end of file + return avg_PMI + From 25fd5c94ee12107a1a196627e626c34faedbc100 Mon Sep 17 00:00:00 2001 From: Kais LARIBI <kais.laribi@artefact.com> Date: Fri, 6 Sep 2019 13:00:20 +0200 Subject: [PATCH 236/496] improve code cooccurence matrix --- .../models/topic_modeling_short_text.py | 42 +++++++++++++------ 1 file changed, 29 insertions(+), 13 deletions(-) diff --git a/nautilus_nlp/models/topic_modeling_short_text.py b/nautilus_nlp/models/topic_modeling_short_text.py index bc1c82b..c0b366a 100644 --- a/nautilus_nlp/models/topic_modeling_short_text.py +++ b/nautilus_nlp/models/topic_modeling_short_text.py @@ -1,4 +1,6 @@ import re +from collections import Counter +from itertools import permutations from nautilus_nlp.models.nmf_model import * import numpy as np import pyLDAvis @@ -13,13 +15,14 @@ def prepare_data(text, vocab_min_count=1, vocab_max_size=10000): vocab_arr: array with vocab frequency counts """ vocab = {} + + # Tokens_list is a list of sub-lists where each sub-list contains a sentences' tokens. + tokens_list=[] for sentence in text: sentence = re.split('\s', sentence) - for wd in sentence: - try: - vocab[wd] += 1 - except: - vocab[wd] = 1 + tokens_list.append(sentence) + vocab = dict(Counter(x for xs in tokens_list for x in xs)) + # Create Vocab array ( list of sorted vocab + counts ) vocab_arr = [[wd, vocab[wd]] for wd in vocab if vocab[wd] > vocab_min_count] vocab_arr = sorted(vocab_arr, key=lambda k: k[1])[::-1] @@ -99,6 +102,7 @@ def show_dominant_topic(model, encoded_text_id, vocab_list, n_topKeyword =10): return topics, pmi_score + def get_assigned_topics(model): """ Assign the topic number to the sentences used when training the model @@ -126,6 +130,7 @@ def show_pyldavis(model, encoded_text_id, vocab_arr): return pyLDAvis.display(vis_data) + def prepare_data_pyldavis(model, encoded_text_id, vocab_arr): """ Transform the model decomposed matrix to create topic term and document topics matrices @@ -159,15 +164,26 @@ def prepare_data_pyldavis(model, encoded_text_id, vocab_arr): return data + + def __build_cooccurence_matrix(n_terms, encoded_text_id): - dt_mat = np.zeros([n_terms, n_terms]) - for itm in encoded_text_id: - for kk in itm: - for jj in itm: - if kk != jj: - dt_mat[int(kk), int(jj)] += 1.0 - - return dt_mat + """ + The cooccurence matrix represents the number of times each word + appeared in the same context as another word from the vocabulary. + The matrix has the size of vocab. columns and rows denote the vocab. + Cell values represent the number of times words occured together in the same sentence + + :param :encoded_text_id : list of encoded sentences + :return: res: the co-occurence matrix + + """ + res = np.zeros([n_terms, n_terms]) + for row in encoded_text_id: + counts = Counter(row) + for key_from, key_to in permutations(counts, 2): + res[key_from, key_to] += counts[key_from] * counts[key_to] + return res + def __calculate_PMI(AA, topKeywordsIndex): ''' From e022d931d5e23ba843983eaafce4c693b7b5d663 Mon Sep 17 00:00:00 2001 From: Kais LARIBI <kais.laribi@artefact.com> Date: Mon, 9 Sep 2019 15:32:15 +0200 Subject: [PATCH 237/496] test cases --- tests/test_topic_modeling_short_text.py | 108 ++++++++++++++++++++---- 1 file changed, 92 insertions(+), 16 deletions(-) diff --git a/tests/test_topic_modeling_short_text.py b/tests/test_topic_modeling_short_text.py index 0b3867c..bd1149d 100644 --- a/tests/test_topic_modeling_short_text.py +++ b/tests/test_topic_modeling_short_text.py @@ -1,22 +1,24 @@ -import pytest -from nautilus_nlp.models.topic_modeling_short_text import prepare_data +from nautilus_nlp.models.topic_modeling_short_text import prepare_data, \ + __build_cooccurence_matrix, train_nmf_model, prepare_data_pyldavis, \ + show_dominant_topic, get_assigned_topics +import numpy as np +text = ['Cola 1.5L Carrefour', + 'Pepsi Cola Light 1.5L', + 'Pepsi Cola Twist Light', + 'Cola 1.5L CRF DISC', + 'Coca-Cola Light 1.5L', + 'Coca-Cola Light 4x0.5L', + 'Coca-Cola Light 6x0.3L', + 'Panzani 200g x 4 bio', + 'Rustichella 150g bio', + 'De Cecco - Fusilli bio', + 'Gerblé sans Gluten50g', + 'Penne de riz 100g sans gluten', + 'Spaghetti de maïs 50g sans Glute'] -def test_prepare_data(): - text = ['Cola 1.5L Carrefour', - 'Pepsi Cola Light 1.5L', - 'Pepsi Cola Twist Light', - 'Cola 1.5L CRF DISC', - 'Coca-Cola Light 1.5L', - 'Coca-Cola Light 4x0.5L', - 'Coca-Cola Light 6x0.3L', - 'Panzani 200g x 4 bio', - 'Rustichella 150g bio', - 'De Cecco - Fusilli bio', - 'Gerblé sans Gluten50g', - 'Penne de riz 100g sans gluten', - 'Spaghetti de maïs 50g sans Glute'] +def test_prepare_data(): expected1 = [['1.5L', 4],['Coca-Cola', 3],['Cola', 4],['Light', 5],['Pepsi', 2],['bio', 3],['de', 2],['sans', 3]] expected2 = [['1.5L', 4], ['Coca-Cola', 3], ['Cola', 4], ['Light', 5], ['bio', 3], ['sans', 3]] @@ -25,3 +27,77 @@ def test_prepare_data(): assert output1 == expected1 assert output2 == expected2 + + +def test_build_cooccurence_matrix(): + # The co-occurence matrix is an array with the list of vocab in rows and in columns + # The weights denote the occurrences of a word i with a word j in same sentence for i != j and 0 elsewhere + + case_1 = [[1, 3, 3, 2, 2, 0], [1, 3], [3, 0, 0]] + case_2 = [[0, 1, 2, 3, 4], [5, 6], [1]] + + mat_1 = __build_cooccurence_matrix(4, case_1) + mat_2 = __build_cooccurence_matrix(7, case_2) + + expected_1 =np.array( + [[0., 1., 2., 4.], + [1., 0., 2., 3.], + [2., 2., 0., 4.], + [4., 3., 4., 0.]]) + + + expected_2 = np.array( + [[0., 1., 1., 1., 1., 0., 0.], + [1., 0., 1., 1., 1., 0., 0.], + [1., 1., 0., 1., 1., 0., 0.], + [1., 1., 1., 0., 1., 0., 0.], + [1., 1., 1., 1., 0., 0., 0.], + [0., 0., 0., 0., 0., 0., 1.], + [0., 0., 0., 0., 0., 1., 0.]]) + + assert np.array_equal(mat_1, expected_1) + assert np.array_equal(mat_2, expected_2) + + +def test_show_dominant_topic(): + encoded_text_id, vocab_list, vocab_arr = prepare_data(text) + n_topics = 3 + n_topKeyword = 2 + model = train_nmf_model(encoded_text_id, vocab_list, n_topics=n_topics) + topics, pmi_score = show_dominant_topic(model, encoded_text_id, vocab_list, n_topKeyword = n_topKeyword) + + assert len(pmi_score) == n_topics + assert len(topics) == n_topics + for i in topics.values(): + assert len(i) == n_topKeyword + + +def test_get_assigned_topics(): + encoded_text_id, vocab_list, vocab_arr = prepare_data(text) + n_topics = 3 + model = train_nmf_model(encoded_text_id, vocab_list, n_topics=n_topics) + topics_list = get_assigned_topics(model) + + assert len(topics_list) == len(text) + for topic_num in topics_list: + assert topic_num<n_topics + + +def test_prepare_data_pyldavis(): + + encoded_text_id, vocab_list, vocab_arr = prepare_data(text) + n_topics = 3 + model = train_nmf_model(encoded_text_id, vocab_list, n_topics=n_topics) + data = prepare_data_pyldavis(model, encoded_text_id, vocab_arr) + phi= data['topic_term_dists'] + theta= data['doc_topic_dists'] + doc_length_values = data['doc_lengths'] + list_vocab=data['vocab'] + freq_vocab = data['term_frequency'] + + assert phi.shape == (n_topics, len(list_vocab)) + assert theta.shape == (len(text), n_topics) + assert len(doc_length_values) == len(text) + assert len(list_vocab) == len(freq_vocab) + + From 25b1a32931cc4300f83136af8e6aaf1e7a7dc8ac Mon Sep 17 00:00:00 2001 From: Kais LARIBI <kais.laribi@artefact.com> Date: Thu, 12 Sep 2019 15:37:09 +0200 Subject: [PATCH 238/496] add seanmf model --- nautilus_nlp/models/seanmf_model.py | 116 ++++++++++++++++++ .../models/topic_modeling_short_text.py | 83 ++++++++++--- 2 files changed, 184 insertions(+), 15 deletions(-) create mode 100644 nautilus_nlp/models/seanmf_model.py diff --git a/nautilus_nlp/models/seanmf_model.py b/nautilus_nlp/models/seanmf_model.py new file mode 100644 index 0000000..6fbe37f --- /dev/null +++ b/nautilus_nlp/models/seanmf_model.py @@ -0,0 +1,116 @@ + +import time +import numpy as np +from numpy.linalg import norm +from tqdm import tqdm + + +class SeaNMF(object): + def __init__( + self, + A, S, + IW=[], IWc=[], IH=[], + alpha=1.0, beta=0.1, n_topic=10, max_iter=100, max_err=1e-3, + rand_init=True, fix_seed=False): + ''' + 0.5*||A-WH^T||_F^2+0.5*alpha*||S-WW_c^T||_F^2+0.5*beta*||W||_1^2 + ''' + if fix_seed: + np.random.seed(0) + + self.A = A + self.S = S + + self.n_row = A.shape[0] + self.n_col = A.shape[1] + + self.n_topic = n_topic + self.max_iter = max_iter + self.alpha = alpha + self.beta = beta + self.B = np.ones([self.n_topic, 1]) + self.max_err = max_err + self.snmf_mat_init(rand_init, IW, IWc, IH) + self.snmf_iter() + + def snmf_mat_init(self, rand_init, IW=[], IWc=[], IH=[]): + """ + Init Matrices W,Wc and H initially either randomly or using existing IW,IWc IH matrices taken when iterating. + :param rand_init: Boolean indicating initial random init + """ + if rand_init: + self.W = np.random.random((self.n_row, self.n_topic)) + self.Wc = np.random.random((self.n_row, self.n_topic)) + self.H = np.random.random((self.n_col, self.n_topic)) + else: + self.W = IW + self.Wc = IWc + self.H = IH + for k in range(self.n_topic): + self.W[:, k] /= norm(self.W[:, k]) + self.Wc[:, k] /= norm(self.Wc[:, k]) + + def snmf_iter(self): + """ + Main iterative loop for matrix decomposition + """ + loss_old = 1e20 + start_time = time.time() + for i in tqdm(range(self.max_iter)): + self.snmf_solver() + loss = self.snmf_loss() + if loss_old - loss < self.max_err: + print('Matrix decomposition loop converged!') + break + loss_old = loss + end_time = time.time() + print('Step={}, Loss={}, Time={}s'.format(i, loss, end_time - start_time)) + + def snmf_solver(self): + ''' + using BCD framework + Alogorithm 1: Equations to update W, wc, H are described in the paper + http://dmkd.cs.vt.edu/papers/WWW18.pdf + ''' + + epss = 1e-20 + # Update W + AH = np.dot(self.A, self.H) + SWc = np.dot(self.S, self.Wc) + HtH = np.dot(self.H.T, self.H) + WctWc = np.dot(self.Wc.T, self.Wc) + W1 = self.W.dot(self.B) + + for k in range(self.n_topic): + num0 = HtH[k, k] * self.W[:, k] + self.alpha * WctWc[k, k] * self.W[:, k] + num1 = AH[:, k] + self.alpha * SWc[:, k] + num2 = np.dot(self.W, HtH[:, k]) + self.alpha * np.dot(self.W, WctWc[:, k]) + self.beta * W1[0] + self.W[:, k] = num0 + num1 - num2 + self.W[:, k] = np.maximum(self.W[:, k], epss) # project > 0 + self.W[:, k] /= norm(self.W[:, k]) + epss # normalize + # Update Wc + WtW = self.W.T.dot(self.W) + StW = np.dot(self.S, self.W) + for k in range(self.n_topic): + self.Wc[:, k] = self.Wc[:, k] + StW[:, k] - np.dot(self.Wc, WtW[:, k]) + self.Wc[:, k] = np.maximum(self.Wc[:, k], epss) + # Update H + AtW = np.dot(self.A.T, self.W) + for k in range(self.n_topic): + self.H[:, k] = self.H[:, k] + AtW[:, k] - np.dot(self.H, WtW[:, k]) + self.H[:, k] = np.maximum(self.H[:, k], epss) + + def snmf_loss(self): + loss = norm(self.A - np.dot(self.W, np.transpose(self.H)), 'fro') ** 2 / 2.0 + if self.alpha > 0: + loss += self.alpha * norm(np.dot(self.W, np.transpose(self.Wc)) - self.S, 'fro') ** 2 / 2.0 + if self.beta > 0: + loss += self.beta * norm(self.W, 1) ** 2 / 2.0 + + return loss + + def get_decomposition_matrix(self): + # Wc was not considered to keep same structure as NMF + return self.W, self.H + + diff --git a/nautilus_nlp/models/topic_modeling_short_text.py b/nautilus_nlp/models/topic_modeling_short_text.py index c0b366a..4f72169 100644 --- a/nautilus_nlp/models/topic_modeling_short_text.py +++ b/nautilus_nlp/models/topic_modeling_short_text.py @@ -1,10 +1,12 @@ import re from collections import Counter -from itertools import permutations +from itertools import product from nautilus_nlp.models.nmf_model import * +from nautilus_nlp.models.seanmf_model import * import numpy as np import pyLDAvis + def prepare_data(text, vocab_min_count=1, vocab_max_size=10000): """ :param text: list of str on which the topic modeling will be performed @@ -43,8 +45,9 @@ def prepare_data(text, vocab_min_count=1, vocab_max_size=10000): return encoded_text_id, vocab_list, vocab_arr -def train_nmf_model(encoded_text_id, vocab_list, n_topics= 20, max_iter= 20, max_err=0.1, alpha = 0, beta=0): +def train_shorttext_model(model_name, encoded_text_id, vocab_list, n_topics=20, max_iter=20, max_err=0.1, alpha=0, beta=0): """ + :param model_name: string = 'nmf' or 'seanmf' :param encoded_text_id: list of encoded sentences :param vocab_list: list of vocabulary :param n_topics: number of topics @@ -58,17 +61,43 @@ def train_nmf_model(encoded_text_id, vocab_list, n_topics= 20, max_iter= 20, max n_docs = len(encoded_text_id) n_terms = len(vocab_list) + if model_name == 'nmf': + dt_mat = __build_doc_term_matrix(n_terms, n_docs, encoded_text_id) + model = NMF( + dt_mat, + n_topic=n_topics, + max_iter=max_iter, + max_err=max_err) + + elif model_name == 'seanmf': + # Calculate co-occurence matrix + cm = __build_cooccurence_matrix(n_terms, encoded_text_id) + # Calculate PPMI + SS = __calulate_PPMI(cm, n_terms) + # Build doc-term matrix + dt_mat = __build_doc_term_matrix(n_terms, n_docs, encoded_text_id) + model = SeaNMF( + dt_mat, SS, + alpha=alpha, + beta=beta, + n_topic=n_topics, + max_iter=max_iter, + max_err=max_err, + fix_seed=1024) + + else: + model = None + print('Invalid model name: Use nmf or seanmf') + + return model + + +def __build_doc_term_matrix(n_terms, n_docs, encoded_text_id): dt_mat = np.zeros([n_terms, n_docs]) for k in range(n_docs): for j in encoded_text_id[k]: dt_mat[j, k] += 1.0 - model = NMF( - dt_mat, - n_topic=n_topics, - max_iter=max_iter, - max_err=max_err) - - return model + return dt_mat def show_dominant_topic(model, encoded_text_id, vocab_list, n_topKeyword =10): @@ -82,6 +111,7 @@ def show_dominant_topic(model, encoded_text_id, vocab_list, n_topKeyword =10): """ dt_mat = __build_cooccurence_matrix(n_terms=len(vocab_list), encoded_text_id=encoded_text_id) + np.fill_diagonal(dt_mat, 0) W,_ = model.get_decomposition_matrix() n_topic = W.shape[1] PMI_arr = [] @@ -111,6 +141,7 @@ def get_assigned_topics(model): """ _, H = model.get_decomposition_matrix() + # The weights of the H matrix are converted into probabilities H_probs = H / H.sum(axis=1, keepdims=True) topics_list = list(np.argmax(H_probs, axis=1)) @@ -165,14 +196,12 @@ def prepare_data_pyldavis(model, encoded_text_id, vocab_arr): return data - def __build_cooccurence_matrix(n_terms, encoded_text_id): """ The cooccurence matrix represents the number of times each word appeared in the same context as another word from the vocabulary. - The matrix has the size of vocab. columns and rows denote the vocab. - Cell values represent the number of times words occured together in the same sentence - + The matrix has n_terms x n_terms size, columns and rows denote the vocab. + Cell values represent the number of times words occured together in the same sentence. :param :encoded_text_id : list of encoded sentences :return: res: the co-occurence matrix @@ -180,11 +209,36 @@ def __build_cooccurence_matrix(n_terms, encoded_text_id): res = np.zeros([n_terms, n_terms]) for row in encoded_text_id: counts = Counter(row) - for key_from, key_to in permutations(counts, 2): + for key_from, key_to in product(counts, repeat=2): res[key_from, key_to] += counts[key_from] * counts[key_to] return res +def __calulate_PPMI(cm, n_terms): + D1 = np.sum(cm) + print('D1= ', D1) + SS = D1 * cm + print('SS= ',SS) + for k in range(n_terms): + SS[k] /= np.sum(cm[k]) + for k in range(n_terms): + SS[:, k] /= np.sum(cm[:, k]) + print('SS = ', SS ) + cm = [] # release memory + SS[SS == 0] = 1.0 + SS = np.log(SS) + SS[SS < 0.0] = 0.0 + return SS + + +def __build_doc_term_matrix(n_terms, n_docs, encoded_text_id): + dt_mat = np.zeros([n_terms, n_docs]) + for k in range(n_docs): + for j in encoded_text_id[k]: + dt_mat[j, k] += 1.0 + return dt_mat + + def __calculate_PMI(AA, topKeywordsIndex): ''' Method to compute PMi score @@ -207,4 +261,3 @@ def __calculate_PMI(AA, topKeywordsIndex): avg_PMI = 2.0*np.sum(PMI)/float(n_tp)/(float(n_tp)-1.0) return avg_PMI - From 9431bf0f9b5976d29e2155d16a7e3e916f841c25 Mon Sep 17 00:00:00 2001 From: Kais LARIBI <kais.laribi@artefact.com> Date: Mon, 16 Sep 2019 13:24:48 +0200 Subject: [PATCH 239/496] imporve tests --- tests/test_topic_modeling_short_text.py | 111 +++++++++++++----------- 1 file changed, 59 insertions(+), 52 deletions(-) diff --git a/tests/test_topic_modeling_short_text.py b/tests/test_topic_modeling_short_text.py index bd1149d..e52b40e 100644 --- a/tests/test_topic_modeling_short_text.py +++ b/tests/test_topic_modeling_short_text.py @@ -1,7 +1,8 @@ from nautilus_nlp.models.topic_modeling_short_text import prepare_data, \ - __build_cooccurence_matrix, train_nmf_model, prepare_data_pyldavis, \ + __build_cooccurence_matrix, train_shorttext_model, prepare_data_pyldavis, \ show_dominant_topic, get_assigned_topics import numpy as np +import pytest text = ['Cola 1.5L Carrefour', 'Pepsi Cola Light 1.5L', @@ -18,53 +19,27 @@ 'Spaghetti de maïs 50g sans Glute'] -def test_prepare_data(): +@pytest.mark.parametrize( + "input_text, expected_output", + [ + (text, [['1.5L', 4], ['Coca-Cola', 3], ['Cola', 4], ['Light', 5], ['Pepsi', 2], ['bio', 3], ['de', 2], ['sans', 3]]), + ([],[]), + (['',''],[]), + ], +) +def test_prepare_data(input_text, expected_output): + assert prepare_data(input_text), expected_output - expected1 = [['1.5L', 4],['Coca-Cola', 3],['Cola', 4],['Light', 5],['Pepsi', 2],['bio', 3],['de', 2],['sans', 3]] - expected2 = [['1.5L', 4], ['Coca-Cola', 3], ['Cola', 4], ['Light', 5], ['bio', 3], ['sans', 3]] - _,_,output1 = prepare_data(text) - _,_,output2 = prepare_data(text, vocab_min_count=2) - assert output1 == expected1 - assert output2 == expected2 +@pytest.mark.parametrize("model_name", ['nmf', 'seanmf']) +@pytest.mark.parametrize("n_topics", [3,0]) +@pytest.mark.parametrize("n_topKeyword", [2,0]) +def test_show_dominant_topic(model_name, n_topics, n_topKeyword): - -def test_build_cooccurence_matrix(): - # The co-occurence matrix is an array with the list of vocab in rows and in columns - # The weights denote the occurrences of a word i with a word j in same sentence for i != j and 0 elsewhere - - case_1 = [[1, 3, 3, 2, 2, 0], [1, 3], [3, 0, 0]] - case_2 = [[0, 1, 2, 3, 4], [5, 6], [1]] - - mat_1 = __build_cooccurence_matrix(4, case_1) - mat_2 = __build_cooccurence_matrix(7, case_2) - - expected_1 =np.array( - [[0., 1., 2., 4.], - [1., 0., 2., 3.], - [2., 2., 0., 4.], - [4., 3., 4., 0.]]) - - - expected_2 = np.array( - [[0., 1., 1., 1., 1., 0., 0.], - [1., 0., 1., 1., 1., 0., 0.], - [1., 1., 0., 1., 1., 0., 0.], - [1., 1., 1., 0., 1., 0., 0.], - [1., 1., 1., 1., 0., 0., 0.], - [0., 0., 0., 0., 0., 0., 1.], - [0., 0., 0., 0., 0., 1., 0.]]) - - assert np.array_equal(mat_1, expected_1) - assert np.array_equal(mat_2, expected_2) - - -def test_show_dominant_topic(): encoded_text_id, vocab_list, vocab_arr = prepare_data(text) - n_topics = 3 - n_topKeyword = 2 - model = train_nmf_model(encoded_text_id, vocab_list, n_topics=n_topics) - topics, pmi_score = show_dominant_topic(model, encoded_text_id, vocab_list, n_topKeyword = n_topKeyword) + + model = train_shorttext_model(model_name, encoded_text_id, vocab_list, n_topics=n_topics) + topics, pmi_score = show_dominant_topic(model, encoded_text_id, vocab_list, n_topKeyword=n_topKeyword) assert len(pmi_score) == n_topics assert len(topics) == n_topics @@ -72,22 +47,25 @@ def test_show_dominant_topic(): assert len(i) == n_topKeyword -def test_get_assigned_topics(): +@pytest.mark.parametrize("model_name", ['nmf', 'seanmf']) +@pytest.mark.parametrize("n_topics", [3]) +@pytest.mark.parametrize("n_topKeyword", [2]) +def test_get_assigned_topics(model_name,n_topics,n_topKeyword): encoded_text_id, vocab_list, vocab_arr = prepare_data(text) - n_topics = 3 - model = train_nmf_model(encoded_text_id, vocab_list, n_topics=n_topics) + model = train_shorttext_model(model_name,encoded_text_id, vocab_list, n_topics=n_topics) topics_list = get_assigned_topics(model) assert len(topics_list) == len(text) for topic_num in topics_list: - assert topic_num<n_topics - + assert topic_num < n_topics -def test_prepare_data_pyldavis(): +@pytest.mark.parametrize("model_name", ['nmf', 'seanmf']) +@pytest.mark.parametrize("n_topics", [0,3]) +def test_prepare_data_pyldavis(model_name, n_topics): encoded_text_id, vocab_list, vocab_arr = prepare_data(text) - n_topics = 3 - model = train_nmf_model(encoded_text_id, vocab_list, n_topics=n_topics) + model = train_shorttext_model(model_name, encoded_text_id, vocab_list, n_topics=n_topics) + data = prepare_data_pyldavis(model, encoded_text_id, vocab_arr) phi= data['topic_term_dists'] theta= data['doc_topic_dists'] @@ -101,3 +79,32 @@ def test_prepare_data_pyldavis(): assert len(list_vocab) == len(freq_vocab) +@pytest.mark.parametrize( + "input_coded, expected_output", + [ + ([[1, 3, 3, 2, 2, 0], [1, 3], [3, 0, 0]], + [[5., 1., 2., 4.], + [1., 2., 2., 3.], + [2., 2., 4., 4.], + [4., 3., 4., 6.]]), + + ([[0, 1, 2, 3, 4], [5, 6], [1]], + [[1., 1., 1., 1., 1., 0., 0.], + [1., 2., 1., 1., 1., 0., 0.], + [1., 1., 1., 1., 1., 0., 0.], + [1., 1., 1., 1., 1., 0., 0.], + [1., 1., 1., 1., 1., 0., 0.], + [0., 0., 0., 0., 0., 1., 1.], + [0., 0., 0., 0., 0., 1., 1.]] + ) + ], +) +def test_build_cooccurence_matrix(input_coded, expected_output): + # The co-occurence matrix is an array with the list of vocab in rows and in columns + # The weights denote the occurrences of a word i with a word j in same sentence. + + flat_list = [item for sublist in input_coded for item in sublist] + nb_vocab = len(set(flat_list)) # number of distinct words + mat = __build_cooccurence_matrix(nb_vocab, input_coded) + + assert np.array_equal(mat, np.array(expected_output)) From b5af7eee3e4ecef2d7ea3a1f0952cd4b13fae99d Mon Sep 17 00:00:00 2001 From: Kais LARIBI <kais.laribi@artefact.com> Date: Mon, 16 Sep 2019 13:38:12 +0200 Subject: [PATCH 240/496] doc string for seanmf --- nautilus_nlp/models/seanmf_model.py | 21 ++++++++++++++++++--- 1 file changed, 18 insertions(+), 3 deletions(-) diff --git a/nautilus_nlp/models/seanmf_model.py b/nautilus_nlp/models/seanmf_model.py index 6fbe37f..639110b 100644 --- a/nautilus_nlp/models/seanmf_model.py +++ b/nautilus_nlp/models/seanmf_model.py @@ -12,9 +12,24 @@ def __init__( IW=[], IWc=[], IH=[], alpha=1.0, beta=0.1, n_topic=10, max_iter=100, max_err=1e-3, rand_init=True, fix_seed=False): - ''' - 0.5*||A-WH^T||_F^2+0.5*alpha*||S-WW_c^T||_F^2+0.5*beta*||W||_1^2 - ''' + """ + Seanmf is a topic modeling algorithm, paper: http://dmkd.cs.vt.edu/papers/WWW18.pdf. + It finds an approximation to the term-document matrix A by two lower-rank matrices W and H, + at each iteration a context matrix Wc are computed and used to update W. + :param A: document term matrix + :param S: Word-context (semantic) correlation matrix + :param IW: topics Matrix, each column vector W(:,k) represents the k-th topic in terms of M keywords + and its elements are the weights of the corresponding keywords. + :param IWc: Latent factor matrix of contexts. + :param IH: The row vector H(j,:) is the latent representation for document j in terms of K topics + :param alpha: Seanmf algorithm parameter + :param beta: Seanmf algorithm parameter + :param n_topic: Number of selected topics + :param max_iter: Maximum number of iterations to update W and H + :param max_err: maximum error under which we consider that the loop converged + :param rand_init: random init boolean + :param fix_seed: int number to fix random seed. + """ if fix_seed: np.random.seed(0) From eea07133d495092973d78d58587cbbdc29fb637c Mon Sep 17 00:00:00 2001 From: William Jaubert <jaubert.william@gmail.com> Date: Wed, 2 Oct 2019 19:04:13 +0200 Subject: [PATCH 241/496] change lda fit function on unseen doc --- nautilus_nlp/models/Spacy_model.py | 61 --------------------------- nautilus_nlp/models/topic_modeling.py | 2 +- 2 files changed, 1 insertion(+), 62 deletions(-) delete mode 100644 nautilus_nlp/models/Spacy_model.py diff --git a/nautilus_nlp/models/Spacy_model.py b/nautilus_nlp/models/Spacy_model.py deleted file mode 100644 index c7eca79..0000000 --- a/nautilus_nlp/models/Spacy_model.py +++ /dev/null @@ -1,61 +0,0 @@ -import spacy - -class spacy_model: - - def __init__(self, lang: str): - try: - self.model = spacy.load(lang) - except Exception as e: - print(e) - print(f"Cannot load lang {lang}, loading default") - self.model = spacy.load("xx") - - def get_spacy_doc(self, text): - - return self.model(text) - - @staticmethod - def get_tokens_from_document(spacydoc: spacy.tokens.doc.Doc): - - return [tokens for tokens in spacydoc] - - def get_tokens_from_str(self, text: str): - spacydoc = self.model(text) - return [tokens for tokens in spacydoc] - - @staticmethod - def get_sentence_from_document(spacydoc: spacy.tokens.doc.Doc): - return [sent for sent in spacydoc.sents] - - def get_sentence_from_str(self, text: str): - spacydoc = self.model(text) - return [sent for sent in spacydoc.sents] - - @staticmethod - def get_tokenized_sentence_from_document(spacydoc: spacy.tokens.doc.Doc): - return [[(token) for token in sent] for sent in spacydoc.sents] - - def get_tokenized_sentence_from_str(self, text: str): - spacydoc = self.model(text) - return [[(token) for token in sent] for sent in spacydoc.sents] - - @staticmethod - def get_entities_from_document(spacydoc): - return [(ent, ent.label_) for ent in spacydoc.ents] - - @staticmethod - def get_entities_from_str(self, text: str): - spacydoc = self.model(text) - return [(ent, ent.label_) for ent in spacydoc.ents] - - @staticmethod - def get_lemma_from_document(spacydoc: spacy.tokens.doc.Doc) -> list: - return [token.lemma_ for token in spacydoc] - - def get_lemma_from_str(self, text: str): - spacydoc = self.model(text) - return [token.lemma_ for token in spacydoc] - - def get_pos_from_str(self, text: str): - spacydoc = self.model(text) - return [token.pos_ for token in spacydoc] \ No newline at end of file diff --git a/nautilus_nlp/models/topic_modeling.py b/nautilus_nlp/models/topic_modeling.py index 518d8c0..9ffd52f 100644 --- a/nautilus_nlp/models/topic_modeling.py +++ b/nautilus_nlp/models/topic_modeling.py @@ -217,7 +217,7 @@ def load_model(model_path,model_name, model='gensim', model_prefix='composant'): def fit_data(model, bow): """Test the model on new, unseen documents""" - return model[bow] + return model.get_document_topics(bow, minimum_probability=0.000000000000001) # Visualization From b2fde909a07b65dc618102abaf861755aab1c4cd Mon Sep 17 00:00:00 2001 From: Thomas Griseau <thomas.griseau@artefact.com> Date: Tue, 15 Oct 2019 13:59:11 +0200 Subject: [PATCH 242/496] Compare string with == instead of is statement --- nautilus_nlp/preprocessing/tokenizer.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/nautilus_nlp/preprocessing/tokenizer.py b/nautilus_nlp/preprocessing/tokenizer.py index 1fddaa9..7885dc9 100644 --- a/nautilus_nlp/preprocessing/tokenizer.py +++ b/nautilus_nlp/preprocessing/tokenizer.py @@ -39,15 +39,15 @@ def tokenize(text: str, lang_module: str = 'en_spacy')-> list: list Outputs a list of tokens. """ - if lang_module is 'en_nltk': + if lang_module == 'en_nltk': return nltk.word_tokenize(text) - elif lang_module is 'en_spacy': + elif lang_module == 'en_spacy': spacydoc = english_spacy(text) return [tokens.text for tokens in spacydoc] - elif lang_module is 'fr_spacy': + elif lang_module == 'fr_spacy': spacydoc = french_spacy(text) return [tokens.text for tokens in spacydoc] - elif lang_module is 'fr_moses': + elif lang_module == 'fr_moses': t = MosesTokenizer(lang='fr') return t.tokenize(text, escape=False) From fa74ae8d06399970d48b1bf00c88c0bb741e08ae Mon Sep 17 00:00:00 2001 From: William Jaubert <jaubert.william@gmail.com> Date: Wed, 16 Oct 2019 09:47:06 +0200 Subject: [PATCH 243/496] change minimum probability threshold to 0 --- nautilus_nlp/models/topic_modeling.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/nautilus_nlp/models/topic_modeling.py b/nautilus_nlp/models/topic_modeling.py index 9ffd52f..fdee8df 100644 --- a/nautilus_nlp/models/topic_modeling.py +++ b/nautilus_nlp/models/topic_modeling.py @@ -217,7 +217,7 @@ def load_model(model_path,model_name, model='gensim', model_prefix='composant'): def fit_data(model, bow): """Test the model on new, unseen documents""" - return model.get_document_topics(bow, minimum_probability=0.000000000000001) + return model.get_document_topics(bow, minimum_probability=0) # Visualization From 3002884ca76020dd0af5a4b6f64705e0927938d8 Mon Sep 17 00:00:00 2001 From: Robin <rdoume@gmail.com> Date: Wed, 12 Feb 2020 10:41:25 +0100 Subject: [PATCH 244/496] Change licensing to LGPLv3 --- .travis.yml | 17 ++ LICENSE | 165 +++++++++++++++++- data/external/get_language_dataset.sh | 17 ++ data/external/get_stanfordtweets.sh | 17 ++ docker/build_docker.sh | 17 ++ docs/conf.py | 17 ++ nautilus_nlp/__init__.py | 17 ++ nautilus_nlp/config/__init__.py | 17 ++ nautilus_nlp/config/config.py | 17 ++ nautilus_nlp/data/__init__.py | 17 ++ nautilus_nlp/data/make_dataset.py | 17 ++ nautilus_nlp/doc.py | 17 ++ nautilus_nlp/models/__init__.py | 17 ++ nautilus_nlp/models/biterm_model.py | 17 ++ nautilus_nlp/models/fasttext_classifier.py | 17 ++ nautilus_nlp/models/fasttext_embedding.py | 17 ++ nautilus_nlp/models/language_detector.py | 17 ++ nautilus_nlp/models/nmf_model.py | 17 ++ nautilus_nlp/models/seanmf_model.py | 17 ++ nautilus_nlp/models/sentiment_detector.py | 17 ++ nautilus_nlp/models/sk_vectorizer.py | 17 ++ nautilus_nlp/models/topic_modeling.py | 17 ++ .../models/topic_modeling_short_text.py | 17 ++ nautilus_nlp/preprocessing/__init__.py | 17 ++ .../preprocessing/keyword_extractor.py | 17 ++ nautilus_nlp/preprocessing/lemmatization.py | 17 ++ nautilus_nlp/preprocessing/preprocess.py | 17 ++ nautilus_nlp/preprocessing/stemming.py | 17 ++ .../preprocessing/text_vectorizers.py | 17 ++ nautilus_nlp/preprocessing/tokenizer.py | 17 ++ .../scripts/download_ft_langdetect.sh | 17 ++ nautilus_nlp/scripts/download_spacy_models.sh | 17 ++ nautilus_nlp/scripts/init_langmodel.sh | 17 ++ nautilus_nlp/scripts/install_fasttext.sh | 17 ++ nautilus_nlp/scripts/install_java.sh | 17 ++ nautilus_nlp/scripts/install_mallet.sh | 17 ++ nautilus_nlp/utils/__init__.py | 17 ++ nautilus_nlp/utils/compat.py | 17 ++ nautilus_nlp/utils/constants.py | 17 ++ nautilus_nlp/utils/emoji.py | 17 ++ nautilus_nlp/utils/file_loader.py | 17 ++ nautilus_nlp/utils/keyword_extractor.py | 17 ++ nautilus_nlp/utils/ngrams_analysis.py | 17 ++ nautilus_nlp/utils/phone_number.py | 17 ++ nautilus_nlp/utils/text_summary.py | 17 ++ nautilus_nlp/utils/tokenizer.py | 17 ++ nautilus_nlp/utils/vector_similarity.py | 17 ++ nautilus_nlp/utils/visualize.py | 17 ++ setup.py | 17 ++ test_environment.py | 17 ++ tests/test_biterm.py | 17 ++ tests/test_doc.py | 17 ++ tests/test_document_loader.py | 17 ++ tests/test_extraction.py | 17 ++ tests/test_fix_bad_encoding.py | 17 ++ tests/test_language_detection.py | 17 ++ tests/test_lemmatization.py | 17 ++ tests/test_ngrams_analysis.py | 17 ++ tests/test_phone_number.py | 17 ++ tests/test_preprocessor.py | 17 ++ tests/test_stemming.py | 17 ++ tests/test_text_summary.py | 17 ++ tests/test_tokenizer.py | 17 ++ tests/test_topic_modeling_short_text.py | 17 ++ 64 files changed, 1231 insertions(+), 5 deletions(-) diff --git a/.travis.yml b/.travis.yml index 93381c6..0304bca 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,3 +1,20 @@ +# GNU Lesser General Public License v3.0 only +# Copyright (C) 2020 Artefact +# licence-information@artefact.com +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 3 of the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public License +# along with this program; if not, write to the Free Software Foundation, +# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. language: python os: diff --git a/LICENSE b/LICENSE index 617fc8b..153d416 100644 --- a/LICENSE +++ b/LICENSE @@ -1,10 +1,165 @@ + GNU LESSER GENERAL PUBLIC LICENSE + Version 3, 29 June 2007 -The MIT License (MIT) -Copyright (c) 2019, Robin Doumerc + Copyright (C) 2007 Free Software Foundation, Inc. <https://fsf.org/> + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. -Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: -The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + This version of the GNU Lesser General Public License incorporates +the terms and conditions of version 3 of the GNU General Public +License, supplemented by the additional permissions listed below. -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + 0. Additional Definitions. + As used herein, "this License" refers to version 3 of the GNU Lesser +General Public License, and the "GNU GPL" refers to version 3 of the GNU +General Public License. + + "The Library" refers to a covered work governed by this License, +other than an Application or a Combined Work as defined below. + + An "Application" is any work that makes use of an interface provided +by the Library, but which is not otherwise based on the Library. +Defining a subclass of a class defined by the Library is deemed a mode +of using an interface provided by the Library. + + A "Combined Work" is a work produced by combining or linking an +Application with the Library. The particular version of the Library +with which the Combined Work was made is also called the "Linked +Version". + + The "Minimal Corresponding Source" for a Combined Work means the +Corresponding Source for the Combined Work, excluding any source code +for portions of the Combined Work that, considered in isolation, are +based on the Application, and not on the Linked Version. + + The "Corresponding Application Code" for a Combined Work means the +object code and/or source code for the Application, including any data +and utility programs needed for reproducing the Combined Work from the +Application, but excluding the System Libraries of the Combined Work. + + 1. Exception to Section 3 of the GNU GPL. + + You may convey a covered work under sections 3 and 4 of this License +without being bound by section 3 of the GNU GPL. + + 2. Conveying Modified Versions. + + If you modify a copy of the Library, and, in your modifications, a +facility refers to a function or data to be supplied by an Application +that uses the facility (other than as an argument passed when the +facility is invoked), then you may convey a copy of the modified +version: + + a) under this License, provided that you make a good faith effort to + ensure that, in the event an Application does not supply the + function or data, the facility still operates, and performs + whatever part of its purpose remains meaningful, or + + b) under the GNU GPL, with none of the additional permissions of + this License applicable to that copy. + + 3. Object Code Incorporating Material from Library Header Files. + + The object code form of an Application may incorporate material from +a header file that is part of the Library. You may convey such object +code under terms of your choice, provided that, if the incorporated +material is not limited to numerical parameters, data structure +layouts and accessors, or small macros, inline functions and templates +(ten or fewer lines in length), you do both of the following: + + a) Give prominent notice with each copy of the object code that the + Library is used in it and that the Library and its use are + covered by this License. + + b) Accompany the object code with a copy of the GNU GPL and this license + document. + + 4. Combined Works. + + You may convey a Combined Work under terms of your choice that, +taken together, effectively do not restrict modification of the +portions of the Library contained in the Combined Work and reverse +engineering for debugging such modifications, if you also do each of +the following: + + a) Give prominent notice with each copy of the Combined Work that + the Library is used in it and that the Library and its use are + covered by this License. + + b) Accompany the Combined Work with a copy of the GNU GPL and this license + document. + + c) For a Combined Work that displays copyright notices during + execution, include the copyright notice for the Library among + these notices, as well as a reference directing the user to the + copies of the GNU GPL and this license document. + + d) Do one of the following: + + 0) Convey the Minimal Corresponding Source under the terms of this + License, and the Corresponding Application Code in a form + suitable for, and under terms that permit, the user to + recombine or relink the Application with a modified version of + the Linked Version to produce a modified Combined Work, in the + manner specified by section 6 of the GNU GPL for conveying + Corresponding Source. + + 1) Use a suitable shared library mechanism for linking with the + Library. A suitable mechanism is one that (a) uses at run time + a copy of the Library already present on the user's computer + system, and (b) will operate properly with a modified version + of the Library that is interface-compatible with the Linked + Version. + + e) Provide Installation Information, but only if you would otherwise + be required to provide such information under section 6 of the + GNU GPL, and only to the extent that such information is + necessary to install and execute a modified version of the + Combined Work produced by recombining or relinking the + Application with a modified version of the Linked Version. (If + you use option 4d0, the Installation Information must accompany + the Minimal Corresponding Source and Corresponding Application + Code. If you use option 4d1, you must provide the Installation + Information in the manner specified by section 6 of the GNU GPL + for conveying Corresponding Source.) + + 5. Combined Libraries. + + You may place library facilities that are a work based on the +Library side by side in a single library together with other library +facilities that are not Applications and are not covered by this +License, and convey such a combined library under terms of your +choice, if you do both of the following: + + a) Accompany the combined library with a copy of the same work based + on the Library, uncombined with any other library facilities, + conveyed under the terms of this License. + + b) Give prominent notice with the combined library that part of it + is a work based on the Library, and explaining where to find the + accompanying uncombined form of the same work. + + 6. Revised Versions of the GNU Lesser General Public License. + + The Free Software Foundation may publish revised and/or new versions +of the GNU Lesser General Public License from time to time. Such new +versions will be similar in spirit to the present version, but may +differ in detail to address new problems or concerns. + + Each version is given a distinguishing version number. If the +Library as you received it specifies that a certain numbered version +of the GNU Lesser General Public License "or any later version" +applies to it, you have the option of following the terms and +conditions either of that published version or of any later version +published by the Free Software Foundation. If the Library as you +received it does not specify a version number of the GNU Lesser +General Public License, you may choose any version of the GNU Lesser +General Public License ever published by the Free Software Foundation. + + If the Library as you received it specifies that a proxy can decide +whether future versions of the GNU Lesser General Public License shall +apply, that proxy's public statement of acceptance of any version is +permanent authorization for you to choose that version for the +Library. \ No newline at end of file diff --git a/data/external/get_language_dataset.sh b/data/external/get_language_dataset.sh index 9fddef8..4e87a8b 100644 --- a/data/external/get_language_dataset.sh +++ b/data/external/get_language_dataset.sh @@ -1,3 +1,20 @@ +# GNU Lesser General Public License v3.0 only +# Copyright (C) 2020 Artefact +# licence-information@artefact.com +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 3 of the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public License +# along with this program; if not, write to the Free Software Foundation, +# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. #!/bin/bash wget -O wili.zip https://zenodo.org/record/841984/files/wili-2018.zip?download=1 mkdir -p wili && cp wili.zip wili && cd wili && unzip wili.zip && cd .. diff --git a/data/external/get_stanfordtweets.sh b/data/external/get_stanfordtweets.sh index 4423bcf..ef7ae1e 100644 --- a/data/external/get_stanfordtweets.sh +++ b/data/external/get_stanfordtweets.sh @@ -1,3 +1,20 @@ +# GNU Lesser General Public License v3.0 only +# Copyright (C) 2020 Artefact +# licence-information@artefact.com +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 3 of the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public License +# along with this program; if not, write to the Free Software Foundation, +# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. #!/bin/bash wget -O trainingandtestdata.zip http://cs.stanford.edu/people/alecmgo/trainingandtestdata.zip trainingandtestdata.zip mkdir -p tweets_sentiment && cp trainingandtestdata.zip tweets_sentiment && cd tweets_sentiment && unzip trainingandtestdata.zip diff --git a/docker/build_docker.sh b/docker/build_docker.sh index bfd80cc..40d9933 100644 --- a/docker/build_docker.sh +++ b/docker/build_docker.sh @@ -1,3 +1,20 @@ +# GNU Lesser General Public License v3.0 only +# Copyright (C) 2020 Artefact +# licence-information@artefact.com +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 3 of the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public License +# along with this program; if not, write to the Free Software Foundation, +# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. #!/bin/bash cp docker/Dockerfile . docker build -t nautilus_nlp:latest . diff --git a/docs/conf.py b/docs/conf.py index 43b0a98..02f1785 100644 --- a/docs/conf.py +++ b/docs/conf.py @@ -1,3 +1,20 @@ +# GNU Lesser General Public License v3.0 only +# Copyright (C) 2020 Artefact +# licence-information@artefact.com +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 3 of the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public License +# along with this program; if not, write to the Free Software Foundation, +# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. # -*- coding: utf-8 -*- # # Configuration file for the Sphinx documentation builder. diff --git a/nautilus_nlp/__init__.py b/nautilus_nlp/__init__.py index e69de29..d46139b 100644 --- a/nautilus_nlp/__init__.py +++ b/nautilus_nlp/__init__.py @@ -0,0 +1,17 @@ +# GNU Lesser General Public License v3.0 only +# Copyright (C) 2020 Artefact +# licence-information@artefact.com +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 3 of the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public License +# along with this program; if not, write to the Free Software Foundation, +# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. diff --git a/nautilus_nlp/config/__init__.py b/nautilus_nlp/config/__init__.py index e69de29..d46139b 100644 --- a/nautilus_nlp/config/__init__.py +++ b/nautilus_nlp/config/__init__.py @@ -0,0 +1,17 @@ +# GNU Lesser General Public License v3.0 only +# Copyright (C) 2020 Artefact +# licence-information@artefact.com +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 3 of the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public License +# along with this program; if not, write to the Free Software Foundation, +# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. diff --git a/nautilus_nlp/config/config.py b/nautilus_nlp/config/config.py index ed87b43..4f880ff 100644 --- a/nautilus_nlp/config/config.py +++ b/nautilus_nlp/config/config.py @@ -1,3 +1,20 @@ +# GNU Lesser General Public License v3.0 only +# Copyright (C) 2020 Artefact +# licence-information@artefact.com +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 3 of the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public License +# along with this program; if not, write to the Free Software Foundation, +# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. #!/usr/local/bin/python3 import os diff --git a/nautilus_nlp/data/__init__.py b/nautilus_nlp/data/__init__.py index e69de29..d46139b 100644 --- a/nautilus_nlp/data/__init__.py +++ b/nautilus_nlp/data/__init__.py @@ -0,0 +1,17 @@ +# GNU Lesser General Public License v3.0 only +# Copyright (C) 2020 Artefact +# licence-information@artefact.com +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 3 of the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public License +# along with this program; if not, write to the Free Software Foundation, +# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. diff --git a/nautilus_nlp/data/make_dataset.py b/nautilus_nlp/data/make_dataset.py index 1bb5467..186fb78 100644 --- a/nautilus_nlp/data/make_dataset.py +++ b/nautilus_nlp/data/make_dataset.py @@ -1,3 +1,20 @@ +# GNU Lesser General Public License v3.0 only +# Copyright (C) 2020 Artefact +# licence-information@artefact.com +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 3 of the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public License +# along with this program; if not, write to the Free Software Foundation, +# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. # -*- coding: utf-8 -*- import click import logging diff --git a/nautilus_nlp/doc.py b/nautilus_nlp/doc.py index e5f69f0..420b2a7 100644 --- a/nautilus_nlp/doc.py +++ b/nautilus_nlp/doc.py @@ -1,3 +1,20 @@ +# GNU Lesser General Public License v3.0 only +# Copyright (C) 2020 Artefact +# licence-information@artefact.com +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 3 of the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public License +# along with this program; if not, write to the Free Software Foundation, +# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. import functools import pkg_resources import nautilus_nlp diff --git a/nautilus_nlp/models/__init__.py b/nautilus_nlp/models/__init__.py index e69de29..d46139b 100644 --- a/nautilus_nlp/models/__init__.py +++ b/nautilus_nlp/models/__init__.py @@ -0,0 +1,17 @@ +# GNU Lesser General Public License v3.0 only +# Copyright (C) 2020 Artefact +# licence-information@artefact.com +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 3 of the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public License +# along with this program; if not, write to the Free Software Foundation, +# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. diff --git a/nautilus_nlp/models/biterm_model.py b/nautilus_nlp/models/biterm_model.py index a30d80f..8aa1ab4 100644 --- a/nautilus_nlp/models/biterm_model.py +++ b/nautilus_nlp/models/biterm_model.py @@ -1,3 +1,20 @@ +# GNU Lesser General Public License v3.0 only +# Copyright (C) 2020 Artefact +# licence-information@artefact.com +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 3 of the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public License +# along with this program; if not, write to the Free Software Foundation, +# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. import numpy as np from biterm.btm import oBTM from biterm.utility import vec_to_biterms, topic_summuary diff --git a/nautilus_nlp/models/fasttext_classifier.py b/nautilus_nlp/models/fasttext_classifier.py index 9d0fee4..39e0b08 100644 --- a/nautilus_nlp/models/fasttext_classifier.py +++ b/nautilus_nlp/models/fasttext_classifier.py @@ -1,3 +1,20 @@ +# GNU Lesser General Public License v3.0 only +# Copyright (C) 2020 Artefact +# licence-information@artefact.com +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 3 of the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public License +# along with this program; if not, write to the Free Software Foundation, +# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. from sklearn.base import BaseEstimator, ClassifierMixin import fastText import multiprocessing diff --git a/nautilus_nlp/models/fasttext_embedding.py b/nautilus_nlp/models/fasttext_embedding.py index 79f7d8a..f3432b7 100644 --- a/nautilus_nlp/models/fasttext_embedding.py +++ b/nautilus_nlp/models/fasttext_embedding.py @@ -1,3 +1,20 @@ +# GNU Lesser General Public License v3.0 only +# Copyright (C) 2020 Artefact +# licence-information@artefact.com +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 3 of the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public License +# along with this program; if not, write to the Free Software Foundation, +# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. import fastText import multiprocessing diff --git a/nautilus_nlp/models/language_detector.py b/nautilus_nlp/models/language_detector.py index d124871..74eb3fc 100644 --- a/nautilus_nlp/models/language_detector.py +++ b/nautilus_nlp/models/language_detector.py @@ -1,3 +1,20 @@ +# GNU Lesser General Public License v3.0 only +# Copyright (C) 2020 Artefact +# licence-information@artefact.com +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 3 of the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public License +# along with this program; if not, write to the Free Software Foundation, +# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. from nautilus_nlp.models.fasttext_classifier import Fasttext_clf as langdetect from nautilus_nlp.preprocessing.preprocess import remove_EOL_characters import pkg_resources diff --git a/nautilus_nlp/models/nmf_model.py b/nautilus_nlp/models/nmf_model.py index 0a18a6b..005c09b 100644 --- a/nautilus_nlp/models/nmf_model.py +++ b/nautilus_nlp/models/nmf_model.py @@ -1,3 +1,20 @@ +# GNU Lesser General Public License v3.0 only +# Copyright (C) 2020 Artefact +# licence-information@artefact.com +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 3 of the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public License +# along with this program; if not, write to the Free Software Foundation, +# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. import time import numpy as np from numpy.linalg import norm diff --git a/nautilus_nlp/models/seanmf_model.py b/nautilus_nlp/models/seanmf_model.py index 639110b..7248148 100644 --- a/nautilus_nlp/models/seanmf_model.py +++ b/nautilus_nlp/models/seanmf_model.py @@ -1,3 +1,20 @@ +# GNU Lesser General Public License v3.0 only +# Copyright (C) 2020 Artefact +# licence-information@artefact.com +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 3 of the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public License +# along with this program; if not, write to the Free Software Foundation, +# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. import time import numpy as np diff --git a/nautilus_nlp/models/sentiment_detector.py b/nautilus_nlp/models/sentiment_detector.py index 439050b..146eeac 100644 --- a/nautilus_nlp/models/sentiment_detector.py +++ b/nautilus_nlp/models/sentiment_detector.py @@ -1,3 +1,20 @@ +# GNU Lesser General Public License v3.0 only +# Copyright (C) 2020 Artefact +# licence-information@artefact.com +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 3 of the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public License +# along with this program; if not, write to the Free Software Foundation, +# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. from nautilus_nlp.utils.tokenizer import _convert_tokens_to_string, _convert_string_to_tokens import textblob diff --git a/nautilus_nlp/models/sk_vectorizer.py b/nautilus_nlp/models/sk_vectorizer.py index fd407d6..926735a 100644 --- a/nautilus_nlp/models/sk_vectorizer.py +++ b/nautilus_nlp/models/sk_vectorizer.py @@ -1,3 +1,20 @@ +# GNU Lesser General Public License v3.0 only +# Copyright (C) 2020 Artefact +# licence-information@artefact.com +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 3 of the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public License +# along with this program; if not, write to the Free Software Foundation, +# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. from sklearn.feature_extraction.text import CountVectorizer from sklearn.base import BaseEstimator, ClassifierMixin diff --git a/nautilus_nlp/models/topic_modeling.py b/nautilus_nlp/models/topic_modeling.py index fdee8df..686c824 100644 --- a/nautilus_nlp/models/topic_modeling.py +++ b/nautilus_nlp/models/topic_modeling.py @@ -1,3 +1,20 @@ +# GNU Lesser General Public License v3.0 only +# Copyright (C) 2020 Artefact +# licence-information@artefact.com +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 3 of the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public License +# along with this program; if not, write to the Free Software Foundation, +# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. import gensim import logging import os diff --git a/nautilus_nlp/models/topic_modeling_short_text.py b/nautilus_nlp/models/topic_modeling_short_text.py index 4f72169..73fad26 100644 --- a/nautilus_nlp/models/topic_modeling_short_text.py +++ b/nautilus_nlp/models/topic_modeling_short_text.py @@ -1,3 +1,20 @@ +# GNU Lesser General Public License v3.0 only +# Copyright (C) 2020 Artefact +# licence-information@artefact.com +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 3 of the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public License +# along with this program; if not, write to the Free Software Foundation, +# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. import re from collections import Counter from itertools import product diff --git a/nautilus_nlp/preprocessing/__init__.py b/nautilus_nlp/preprocessing/__init__.py index e69de29..d46139b 100644 --- a/nautilus_nlp/preprocessing/__init__.py +++ b/nautilus_nlp/preprocessing/__init__.py @@ -0,0 +1,17 @@ +# GNU Lesser General Public License v3.0 only +# Copyright (C) 2020 Artefact +# licence-information@artefact.com +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 3 of the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public License +# along with this program; if not, write to the Free Software Foundation, +# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. diff --git a/nautilus_nlp/preprocessing/keyword_extractor.py b/nautilus_nlp/preprocessing/keyword_extractor.py index 11933bc..304fe02 100644 --- a/nautilus_nlp/preprocessing/keyword_extractor.py +++ b/nautilus_nlp/preprocessing/keyword_extractor.py @@ -1,3 +1,20 @@ +# GNU Lesser General Public License v3.0 only +# Copyright (C) 2020 Artefact +# licence-information@artefact.com +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 3 of the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public License +# along with this program; if not, write to the Free Software Foundation, +# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. from flashtext import KeywordProcessor def extract_keywords(text:str, keyword, case_sensitive=True) -> list: diff --git a/nautilus_nlp/preprocessing/lemmatization.py b/nautilus_nlp/preprocessing/lemmatization.py index 2b54ae2..2ee94e7 100644 --- a/nautilus_nlp/preprocessing/lemmatization.py +++ b/nautilus_nlp/preprocessing/lemmatization.py @@ -1,3 +1,20 @@ +# GNU Lesser General Public License v3.0 only +# Copyright (C) 2020 Artefact +# licence-information@artefact.com +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 3 of the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public License +# along with this program; if not, write to the Free Software Foundation, +# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. import spacy import nltk nltk.download('wordnet') diff --git a/nautilus_nlp/preprocessing/preprocess.py b/nautilus_nlp/preprocessing/preprocess.py index 4467cf0..8dfb218 100644 --- a/nautilus_nlp/preprocessing/preprocess.py +++ b/nautilus_nlp/preprocessing/preprocess.py @@ -1,3 +1,20 @@ +# GNU Lesser General Public License v3.0 only +# Copyright (C) 2020 Artefact +# licence-information@artefact.com +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 3 of the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public License +# along with this program; if not, write to the Free Software Foundation, +# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. # -*- coding: utf-8 -*- from __future__ import absolute_import, division, print_function, unicode_literals diff --git a/nautilus_nlp/preprocessing/stemming.py b/nautilus_nlp/preprocessing/stemming.py index a4dfc0e..92028ec 100644 --- a/nautilus_nlp/preprocessing/stemming.py +++ b/nautilus_nlp/preprocessing/stemming.py @@ -1,3 +1,20 @@ +# GNU Lesser General Public License v3.0 only +# Copyright (C) 2020 Artefact +# licence-information@artefact.com +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 3 of the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public License +# along with this program; if not, write to the Free Software Foundation, +# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. from nltk.stem.snowball import * diff --git a/nautilus_nlp/preprocessing/text_vectorizers.py b/nautilus_nlp/preprocessing/text_vectorizers.py index 68fa172..dec03dc 100644 --- a/nautilus_nlp/preprocessing/text_vectorizers.py +++ b/nautilus_nlp/preprocessing/text_vectorizers.py @@ -1,3 +1,20 @@ +# GNU Lesser General Public License v3.0 only +# Copyright (C) 2020 Artefact +# licence-information@artefact.com +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 3 of the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public License +# along with this program; if not, write to the Free Software Foundation, +# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. import spacy from gensim.corpora import Dictionary from gensim.models.tfidfmodel import TfidfModel diff --git a/nautilus_nlp/preprocessing/tokenizer.py b/nautilus_nlp/preprocessing/tokenizer.py index 7885dc9..4236f23 100644 --- a/nautilus_nlp/preprocessing/tokenizer.py +++ b/nautilus_nlp/preprocessing/tokenizer.py @@ -1,3 +1,20 @@ +# GNU Lesser General Public License v3.0 only +# Copyright (C) 2020 Artefact +# licence-information@artefact.com +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 3 of the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public License +# along with this program; if not, write to the Free Software Foundation, +# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. import nltk from sacremoses import MosesTokenizer, MosesDetokenizer import spacy diff --git a/nautilus_nlp/scripts/download_ft_langdetect.sh b/nautilus_nlp/scripts/download_ft_langdetect.sh index 92e628a..300dc9a 100644 --- a/nautilus_nlp/scripts/download_ft_langdetect.sh +++ b/nautilus_nlp/scripts/download_ft_langdetect.sh @@ -1,2 +1,19 @@ +# GNU Lesser General Public License v3.0 only +# Copyright (C) 2020 Artefact +# licence-information@artefact.com +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 3 of the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public License +# along with this program; if not, write to the Free Software Foundation, +# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. wget https://dl.fbaipublicfiles.com/fasttext/supervised-models/lid.176.ftz cp lid.176.ftz data/ \ No newline at end of file diff --git a/nautilus_nlp/scripts/download_spacy_models.sh b/nautilus_nlp/scripts/download_spacy_models.sh index 0a3a374..cd84284 100644 --- a/nautilus_nlp/scripts/download_spacy_models.sh +++ b/nautilus_nlp/scripts/download_spacy_models.sh @@ -1,3 +1,20 @@ +# GNU Lesser General Public License v3.0 only +# Copyright (C) 2020 Artefact +# licence-information@artefact.com +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 3 of the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public License +# along with this program; if not, write to the Free Software Foundation, +# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. python -m spacy download en_core_web_sm python -m spacy download de_core_news_sm python -m spacy download fr_core_news_sm diff --git a/nautilus_nlp/scripts/init_langmodel.sh b/nautilus_nlp/scripts/init_langmodel.sh index 75ad255..2bf0b48 100644 --- a/nautilus_nlp/scripts/init_langmodel.sh +++ b/nautilus_nlp/scripts/init_langmodel.sh @@ -1,3 +1,20 @@ +# GNU Lesser General Public License v3.0 only +# Copyright (C) 2020 Artefact +# licence-information@artefact.com +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 3 of the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public License +# along with this program; if not, write to the Free Software Foundation, +# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. #!/bin/bash echo 'Which Language do you want to use: en/fr?' diff --git a/nautilus_nlp/scripts/install_fasttext.sh b/nautilus_nlp/scripts/install_fasttext.sh index b53f600..c5dc339 100644 --- a/nautilus_nlp/scripts/install_fasttext.sh +++ b/nautilus_nlp/scripts/install_fasttext.sh @@ -1,3 +1,20 @@ +# GNU Lesser General Public License v3.0 only +# Copyright (C) 2020 Artefact +# licence-information@artefact.com +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 3 of the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public License +# along with this program; if not, write to the Free Software Foundation, +# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. #!/bin/bash wget https://github.com/facebookresearch/fastText/archive/v0.2.0.zip && unzip v0.2.0.zip && cd fastText-0.2.0 && make git clone https://github.com/facebookresearch/fastText.git && cd fastText && pip install . \ No newline at end of file diff --git a/nautilus_nlp/scripts/install_java.sh b/nautilus_nlp/scripts/install_java.sh index 648abf3..8c894d2 100644 --- a/nautilus_nlp/scripts/install_java.sh +++ b/nautilus_nlp/scripts/install_java.sh @@ -1,3 +1,20 @@ +# GNU Lesser General Public License v3.0 only +# Copyright (C) 2020 Artefact +# licence-information@artefact.com +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 3 of the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public License +# along with this program; if not, write to the Free Software Foundation, +# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. sudo add-apt-repository ppa:openjdk-r/ppa # only Ubuntu 17.4 and earlier sudo apt update apt search openjdk diff --git a/nautilus_nlp/scripts/install_mallet.sh b/nautilus_nlp/scripts/install_mallet.sh index 99d2af5..51ff9f7 100644 --- a/nautilus_nlp/scripts/install_mallet.sh +++ b/nautilus_nlp/scripts/install_mallet.sh @@ -1,3 +1,20 @@ +# GNU Lesser General Public License v3.0 only +# Copyright (C) 2020 Artefact +# licence-information@artefact.com +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 3 of the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public License +# along with this program; if not, write to the Free Software Foundation, +# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. #!/bin/bash wget http://mallet.cs.umass.edu/dist/mallet-2.0.8.zip unzip mallet-2.0.8.zip diff --git a/nautilus_nlp/utils/__init__.py b/nautilus_nlp/utils/__init__.py index e69de29..d46139b 100644 --- a/nautilus_nlp/utils/__init__.py +++ b/nautilus_nlp/utils/__init__.py @@ -0,0 +1,17 @@ +# GNU Lesser General Public License v3.0 only +# Copyright (C) 2020 Artefact +# licence-information@artefact.com +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 3 of the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public License +# along with this program; if not, write to the Free Software Foundation, +# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. diff --git a/nautilus_nlp/utils/compat.py b/nautilus_nlp/utils/compat.py index 31d04d6..644ac2b 100644 --- a/nautilus_nlp/utils/compat.py +++ b/nautilus_nlp/utils/compat.py @@ -1,3 +1,20 @@ +# GNU Lesser General Public License v3.0 only +# Copyright (C) 2020 Artefact +# licence-information@artefact.com +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 3 of the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public License +# along with this program; if not, write to the Free Software Foundation, +# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. from __future__ import print_function import sys diff --git a/nautilus_nlp/utils/constants.py b/nautilus_nlp/utils/constants.py index 5f5418a..e98cce9 100644 --- a/nautilus_nlp/utils/constants.py +++ b/nautilus_nlp/utils/constants.py @@ -1,3 +1,20 @@ +# GNU Lesser General Public License v3.0 only +# Copyright (C) 2020 Artefact +# licence-information@artefact.com +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 3 of the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public License +# along with this program; if not, write to the Free Software Foundation, +# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. # -*- coding: utf-8 -*- """ Collection of regular expressions and other (small, generally useful) constants. diff --git a/nautilus_nlp/utils/emoji.py b/nautilus_nlp/utils/emoji.py index b7f9534..6ee23f1 100644 --- a/nautilus_nlp/utils/emoji.py +++ b/nautilus_nlp/utils/emoji.py @@ -1,3 +1,20 @@ +# GNU Lesser General Public License v3.0 only +# Copyright (C) 2020 Artefact +# licence-information@artefact.com +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 3 of the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public License +# along with this program; if not, write to the Free Software Foundation, +# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. import csv def rebuilt_emoji_dictionaries(filename): diff --git a/nautilus_nlp/utils/file_loader.py b/nautilus_nlp/utils/file_loader.py index 08a816e..73ef8e3 100644 --- a/nautilus_nlp/utils/file_loader.py +++ b/nautilus_nlp/utils/file_loader.py @@ -1,3 +1,20 @@ +# GNU Lesser General Public License v3.0 only +# Copyright (C) 2020 Artefact +# licence-information@artefact.com +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 3 of the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public License +# along with this program; if not, write to the Free Software Foundation, +# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. import io import chardet import glob diff --git a/nautilus_nlp/utils/keyword_extractor.py b/nautilus_nlp/utils/keyword_extractor.py index 1956983..28545c2 100644 --- a/nautilus_nlp/utils/keyword_extractor.py +++ b/nautilus_nlp/utils/keyword_extractor.py @@ -1,3 +1,20 @@ +# GNU Lesser General Public License v3.0 only +# Copyright (C) 2020 Artefact +# licence-information@artefact.com +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 3 of the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public License +# along with this program; if not, write to the Free Software Foundation, +# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. from flashtext import KeywordProcessor def extract_keywords(text, keyword, case_sensitive=True): diff --git a/nautilus_nlp/utils/ngrams_analysis.py b/nautilus_nlp/utils/ngrams_analysis.py index 268fe3c..3716ee1 100644 --- a/nautilus_nlp/utils/ngrams_analysis.py +++ b/nautilus_nlp/utils/ngrams_analysis.py @@ -1,3 +1,20 @@ +# GNU Lesser General Public License v3.0 only +# Copyright (C) 2020 Artefact +# licence-information@artefact.com +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 3 of the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public License +# along with this program; if not, write to the Free Software Foundation, +# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. # -*- coding: utf-8 -*- """ Functions to calculate words or ngrams frequencies. diff --git a/nautilus_nlp/utils/phone_number.py b/nautilus_nlp/utils/phone_number.py index b922484..8f76205 100644 --- a/nautilus_nlp/utils/phone_number.py +++ b/nautilus_nlp/utils/phone_number.py @@ -1,3 +1,20 @@ +# GNU Lesser General Public License v3.0 only +# Copyright (C) 2020 Artefact +# licence-information@artefact.com +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 3 of the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public License +# along with this program; if not, write to the Free Software Foundation, +# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. import re import phonenumbers as _phonenumbers diff --git a/nautilus_nlp/utils/text_summary.py b/nautilus_nlp/utils/text_summary.py index db498bf..9fe6eb3 100644 --- a/nautilus_nlp/utils/text_summary.py +++ b/nautilus_nlp/utils/text_summary.py @@ -1,3 +1,20 @@ +# GNU Lesser General Public License v3.0 only +# Copyright (C) 2020 Artefact +# licence-information@artefact.com +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 3 of the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public License +# along with this program; if not, write to the Free Software Foundation, +# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. from summa.summarizer import summarize diff --git a/nautilus_nlp/utils/tokenizer.py b/nautilus_nlp/utils/tokenizer.py index a550bf7..49fac6b 100644 --- a/nautilus_nlp/utils/tokenizer.py +++ b/nautilus_nlp/utils/tokenizer.py @@ -1,3 +1,20 @@ +# GNU Lesser General Public License v3.0 only +# Copyright (C) 2020 Artefact +# licence-information@artefact.com +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 3 of the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public License +# along with this program; if not, write to the Free Software Foundation, +# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. import nltk from sacremoses import MosesTokenizer, MosesDetokenizer import spacy diff --git a/nautilus_nlp/utils/vector_similarity.py b/nautilus_nlp/utils/vector_similarity.py index 1971c39..174d1a2 100644 --- a/nautilus_nlp/utils/vector_similarity.py +++ b/nautilus_nlp/utils/vector_similarity.py @@ -1,3 +1,20 @@ +# GNU Lesser General Public License v3.0 only +# Copyright (C) 2020 Artefact +# licence-information@artefact.com +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 3 of the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public License +# along with this program; if not, write to the Free Software Foundation, +# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. import numpy as np import math diff --git a/nautilus_nlp/utils/visualize.py b/nautilus_nlp/utils/visualize.py index bb9cfb1..c7e58b4 100644 --- a/nautilus_nlp/utils/visualize.py +++ b/nautilus_nlp/utils/visualize.py @@ -1,3 +1,20 @@ +# GNU Lesser General Public License v3.0 only +# Copyright (C) 2020 Artefact +# licence-information@artefact.com +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 3 of the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public License +# along with this program; if not, write to the Free Software Foundation, +# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. ''' import matplotlib import numpy as np diff --git a/setup.py b/setup.py index 5b02f87..b9b77e0 100644 --- a/setup.py +++ b/setup.py @@ -1,3 +1,20 @@ +# GNU Lesser General Public License v3.0 only +# Copyright (C) 2020 Artefact +# licence-information@artefact.com +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 3 of the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public License +# along with this program; if not, write to the Free Software Foundation, +# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. from setuptools import find_packages, setup import setuptools import setuptools.command.install diff --git a/test_environment.py b/test_environment.py index d0ac4a7..341e9cb 100644 --- a/test_environment.py +++ b/test_environment.py @@ -1,3 +1,20 @@ +# GNU Lesser General Public License v3.0 only +# Copyright (C) 2020 Artefact +# licence-information@artefact.com +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 3 of the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public License +# along with this program; if not, write to the Free Software Foundation, +# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. import sys REQUIRED_PYTHON = "python3" diff --git a/tests/test_biterm.py b/tests/test_biterm.py index 04bd067..975d42c 100644 --- a/tests/test_biterm.py +++ b/tests/test_biterm.py @@ -1,3 +1,20 @@ +# GNU Lesser General Public License v3.0 only +# Copyright (C) 2020 Artefact +# licence-information@artefact.com +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 3 of the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public License +# along with this program; if not, write to the Free Software Foundation, +# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. from nautilus_nlp.models.biterm_model import BitermModel import pandas as pd import pytest diff --git a/tests/test_doc.py b/tests/test_doc.py index 1354f89..75e9dcc 100644 --- a/tests/test_doc.py +++ b/tests/test_doc.py @@ -1,3 +1,20 @@ +# GNU Lesser General Public License v3.0 only +# Copyright (C) 2020 Artefact +# licence-information@artefact.com +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 3 of the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public License +# along with this program; if not, write to the Free Software Foundation, +# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. """ Testing for textpipe doc.py """ diff --git a/tests/test_document_loader.py b/tests/test_document_loader.py index f445f26..0be9eb7 100644 --- a/tests/test_document_loader.py +++ b/tests/test_document_loader.py @@ -1,3 +1,20 @@ +# GNU Lesser General Public License v3.0 only +# Copyright (C) 2020 Artefact +# licence-information@artefact.com +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 3 of the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public License +# along with this program; if not, write to the Free Software Foundation, +# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. # -*- coding: utf-8 -*- import os diff --git a/tests/test_extraction.py b/tests/test_extraction.py index 461e801..f2a1a74 100644 --- a/tests/test_extraction.py +++ b/tests/test_extraction.py @@ -1,3 +1,20 @@ +# GNU Lesser General Public License v3.0 only +# Copyright (C) 2020 Artefact +# licence-information@artefact.com +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 3 of the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public License +# along with this program; if not, write to the Free Software Foundation, +# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. from nautilus_nlp.preprocessing.keyword_extractor import extract_keywords str_="""Les moteurs de recherche tels Google, Exalead ou Yahoo! sont diff --git a/tests/test_fix_bad_encoding.py b/tests/test_fix_bad_encoding.py index a2a14ea..097a2e2 100644 --- a/tests/test_fix_bad_encoding.py +++ b/tests/test_fix_bad_encoding.py @@ -1,3 +1,20 @@ +# GNU Lesser General Public License v3.0 only +# Copyright (C) 2020 Artefact +# licence-information@artefact.com +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 3 of the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public License +# along with this program; if not, write to the Free Software Foundation, +# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. import pytest import numpy as np diff --git a/tests/test_language_detection.py b/tests/test_language_detection.py index d2b4260..b6b8d87 100644 --- a/tests/test_language_detection.py +++ b/tests/test_language_detection.py @@ -1,3 +1,20 @@ +# GNU Lesser General Public License v3.0 only +# Copyright (C) 2020 Artefact +# licence-information@artefact.com +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 3 of the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public License +# along with this program; if not, write to the Free Software Foundation, +# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. from nautilus_nlp.models import language_detector import pytest import numpy as np diff --git a/tests/test_lemmatization.py b/tests/test_lemmatization.py index ce205f4..c23667f 100644 --- a/tests/test_lemmatization.py +++ b/tests/test_lemmatization.py @@ -1,3 +1,20 @@ +# GNU Lesser General Public License v3.0 only +# Copyright (C) 2020 Artefact +# licence-information@artefact.com +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 3 of the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public License +# along with this program; if not, write to the Free Software Foundation, +# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. import pytest from nautilus_nlp.preprocessing.lemmatization import lemmatize_french_tokens, lemmatize_english_tokens diff --git a/tests/test_ngrams_analysis.py b/tests/test_ngrams_analysis.py index 5e42781..f20ff5d 100644 --- a/tests/test_ngrams_analysis.py +++ b/tests/test_ngrams_analysis.py @@ -1,3 +1,20 @@ +# GNU Lesser General Public License v3.0 only +# Copyright (C) 2020 Artefact +# licence-information@artefact.com +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 3 of the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public License +# along with this program; if not, write to the Free Software Foundation, +# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. from nautilus_nlp.utils.ngrams_analysis import frequent_words import pytest diff --git a/tests/test_phone_number.py b/tests/test_phone_number.py index 61fe9a6..0043734 100644 --- a/tests/test_phone_number.py +++ b/tests/test_phone_number.py @@ -1,3 +1,20 @@ +# GNU Lesser General Public License v3.0 only +# Copyright (C) 2020 Artefact +# licence-information@artefact.com +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 3 of the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public License +# along with this program; if not, write to the Free Software Foundation, +# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. import pytest import nautilus_nlp.utils.phone_number as phone diff --git a/tests/test_preprocessor.py b/tests/test_preprocessor.py index d06ca80..bd6b6c9 100644 --- a/tests/test_preprocessor.py +++ b/tests/test_preprocessor.py @@ -1,3 +1,20 @@ +# GNU Lesser General Public License v3.0 only +# Copyright (C) 2020 Artefact +# licence-information@artefact.com +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 3 of the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public License +# along with this program; if not, write to the Free Software Foundation, +# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. import pytest import numpy as np from nautilus_nlp.preprocessing.preprocess import ( diff --git a/tests/test_stemming.py b/tests/test_stemming.py index faf4b0d..731bc14 100644 --- a/tests/test_stemming.py +++ b/tests/test_stemming.py @@ -1,3 +1,20 @@ +# GNU Lesser General Public License v3.0 only +# Copyright (C) 2020 Artefact +# licence-information@artefact.com +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 3 of the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public License +# along with this program; if not, write to the Free Software Foundation, +# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. import pytest from nautilus_nlp.preprocessing.stemming import stem_tokens diff --git a/tests/test_text_summary.py b/tests/test_text_summary.py index e233812..954fef6 100644 --- a/tests/test_text_summary.py +++ b/tests/test_text_summary.py @@ -1,3 +1,20 @@ +# GNU Lesser General Public License v3.0 only +# Copyright (C) 2020 Artefact +# licence-information@artefact.com +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 3 of the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public License +# along with this program; if not, write to the Free Software Foundation, +# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. from nautilus_nlp.utils.text_summary import summarize_text case1 = """Automatic summarization is the process of reducing a text document with a \ diff --git a/tests/test_tokenizer.py b/tests/test_tokenizer.py index 744de9d..a156529 100644 --- a/tests/test_tokenizer.py +++ b/tests/test_tokenizer.py @@ -1,3 +1,20 @@ +# GNU Lesser General Public License v3.0 only +# Copyright (C) 2020 Artefact +# licence-information@artefact.com +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 3 of the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public License +# along with this program; if not, write to the Free Software Foundation, +# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. import pytest from nautilus_nlp.preprocessing.tokenizer import tokenize, untokenize diff --git a/tests/test_topic_modeling_short_text.py b/tests/test_topic_modeling_short_text.py index e52b40e..405fc6b 100644 --- a/tests/test_topic_modeling_short_text.py +++ b/tests/test_topic_modeling_short_text.py @@ -1,3 +1,20 @@ +# GNU Lesser General Public License v3.0 only +# Copyright (C) 2020 Artefact +# licence-information@artefact.com +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 3 of the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public License +# along with this program; if not, write to the Free Software Foundation, +# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. from nautilus_nlp.models.topic_modeling_short_text import prepare_data, \ __build_cooccurence_matrix, train_shorttext_model, prepare_data_pyldavis, \ show_dominant_topic, get_assigned_topics From 5578f1da198b006deee4c7d5458f187581028160 Mon Sep 17 00:00:00 2001 From: BrianLz <45944551+BrianLz@users.noreply.github.com> Date: Thu, 19 Mar 2020 15:57:08 +0100 Subject: [PATCH 245/496] Updated README.md Updated installation command according to new 2FA system (from https to SSH) --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 279cd7e..bed36ab 100644 --- a/README.md +++ b/README.md @@ -28,7 +28,7 @@ Beware, this package has been tested on Python **3.6** & **3.7**, and will proba To install this library you should first clone the repository: ``` -git clone https://github.com/artefactory/nautilus_nlp/ && cd nautilus_nlp +git clone git@github.com:artefactory/nautilus-nlp.git && cd nautilus_nlp/ ``` **If you don't use the docker container, we strongly advise you to do these steps in a virtual environnement** @@ -211,4 +211,4 @@ You can now open the file index.html located in the build folder. ├── wiki <- Where the Markdown for the Wiki lives ├── setup.py <- makes project pip installable (pip install -e .) so nautilus_nlp can be imported ├── requirements.txt <- The requirements file for reproducing the analysis environment, e.g. - generated with `pip freeze > requirements.txt` \ No newline at end of file + generated with `pip freeze > requirements.txt` From c42a470a7fc132bac32588d7ef4b29e8cef739bd Mon Sep 17 00:00:00 2001 From: Amale EL HAMRI <amale.elhamri@artefact.com> Date: Mon, 23 Mar 2020 11:34:27 +0100 Subject: [PATCH 246/496] adding trendspotter cleaning functions --- nautilus_nlp/preprocessing/preprocess.py | 138 ++++++++++++++++++++++- tests/test_preprocessor.py | 104 ++++++++++++++++- 2 files changed, 240 insertions(+), 2 deletions(-) diff --git a/nautilus_nlp/preprocessing/preprocess.py b/nautilus_nlp/preprocessing/preprocess.py index 8dfb218..9aee2f0 100644 --- a/nautilus_nlp/preprocessing/preprocess.py +++ b/nautilus_nlp/preprocessing/preprocess.py @@ -25,6 +25,7 @@ import unicodedata import emoji as _emoji +import regex from ftfy import fix_text as _fix_text from stop_words import get_stop_words as _get_stop_words from stop_words import LANGUAGE_MAPPING as _LANGUAGE_MAPPING @@ -284,6 +285,22 @@ def unpack_english_contractions(text:str) -> str: return text +def filter_non_latin_characters(text:str) -> str: + """ + Function that filters non latin characters of a text + + Parameters + ---------- + text : string + + Returns + ------- + string + """ + text = regex.sub(r'[^\p{Latin}1-9]', ' ', text).strip() + return re.sub(' +', ' ', text) + + def replace_urls(text:str, replace_with:str="*URL*") -> str: """ Replace all URLs in ``text`` str with ``replace_with`` str. @@ -320,7 +337,6 @@ def replace_emails(text, replace_with="*EMAIL*") -> str: return constants.EMAIL_REGEX.sub(replace_with, text) - def replace_phone_numbers(text, replace_with:str="*PHONE*", method:str="regex", country_format_to_detect:list=[None,'FR','US','GB']) -> str: @@ -475,6 +491,72 @@ def remove_accents(text:str, method:str="unicode") -> str: raise ValueError(msg) +def remove_mentions(text:str) -> str: + """ + Function that removes words preceded with a '@' + + Parameters + ---------- + text : str + + Returns + ------- + string + """ + return normalize_whitespace(re.sub(r'@\w*', '', text)) + + +def extract_mentions(text:str) -> str: + """ + Function that extracts words preceded with a '@' + eg. "I take care of my skin with @thisproduct" --> ["@thisproduct"] + + Parameters + ---------- + text : str + + Returns + ------- + string + """ + return re.findall(r'[@][^\s@]+', text) + + +def remove_html_tags(text:str) -> str: + """ + Function that removes words between < and > + + Parameters + ---------- + text : str + + Returns + ------- + string + """ + return normalize_whitespace(re.sub(r'<.*?>', '', text)) + + +def remove_smallwords(tokens_list:list, smallwords_threshold:int) -> list: + """ + Function that removes words which length is below a threshold + ["hello", "my", "name", "is", "John", "Doe"] --> ["hello","name","John","Doe"] + + Parameters + ---------- + text : list + list of strings + smallwords_threshold: int + threshold of small word + + Returns + ------- + list + """ + result = [word for word in tokens_list if len(word) > smallwords_threshold] + return result + + def remove_emoji(text:str) -> str: """ Remove emoji from any str by stripping any unicode in the range of Emoji unicode @@ -514,6 +596,60 @@ def convert_emoji_to_text(text:str, code_delimiters=(':', ':')) -> str: return _emoji.demojize(text, delimiters=code_delimiters) +def extract_emojis(text:str) -> list: + """ + Function that extracts emojis from a text and translates them into words + eg. "I take care of my skin 😀 :(" --> [":grinning_face:"] + + Parameters + ---------- + text : str + + Returns + ------- + list + list of all emojis converted with their unicode conventions + """ + emoji_pattern = _emoji.get_emoji_regexp() + emojis_in_text = re.findall(emoji_pattern, text) + emojis_converted = [convert_emoji_to_text(emoji_text) for emoji_text in emojis_in_text] + return emojis_converted + + +def extract_hashtags(text) -> list: + """ + Function that extracts words preceded with a '#' + eg. "I take care of my skin #selfcare#selfestim" --> ["skincare", "selfestim"] + + Parameters + ---------- + text : str + + Returns + ------- + list + list of all hashtags + """ + return re.findall(r'[#][^\s#]+', text) + + +def remove_hashtag(text) -> str: + """ + Function that removes words preceded with a '#' + eg. "I take care of my skin #selfcare#selfestim" --> "I take care of my skin" + + Parameters + ---------- + text : str + + Returns + ------- + str + text of a post without hashtags + """ + return normalize_whitespace(re.sub(r'#\w*', '', text)) + + def preprocess_text( text, remove_eol_char=True, diff --git a/tests/test_preprocessor.py b/tests/test_preprocessor.py index bd6b6c9..03ebba8 100644 --- a/tests/test_preprocessor.py +++ b/tests/test_preprocessor.py @@ -35,10 +35,112 @@ replace_currency_symbols, remove_punct, remove_emoji, - convert_emoji_to_text + convert_emoji_to_text, + extract_emojis, + remove_mentions, + extract_mentions, + remove_html_tags, + remove_smallwords, + extract_hashtags, + remove_hashtag, + filter_non_latin_characters ) import nautilus_nlp.utils.phone_number as phone +@pytest.mark.parametrize("text, expected_result", + [("ACV water + cinnamon + turmeric + cucumber + lemon. 👍🏻", + [":thumbs_up_light_skin_tone:"]), + ("This is a text without emojis", + [])]) +def test_extract_emojis(text, expected_result): + result = extract_emojis(text) + assert expected_result == result + + +@pytest.mark.parametrize("text, expected_result", + [("I take care of my skin with @hellobody", + "I take care of my skin with"), + ("This is a text without mentions", + "This is a text without mentions")]) +def test_remove_mentions(text, expected_result): + result = remove_mentions(text) + assert expected_result == result + + +@pytest.mark.parametrize("text, expected_result", + [("I take care of my skin with @hellobody", + ["@hellobody"]), + ("This is a text without mentions", + [])]) +def test_extract_mentions(text, expected_result): + result = extract_mentions(text) + assert expected_result == result + + +@pytest.mark.parametrize("text, expected_result", + [("This is a text with <html> content of html tag </html>", + "This is a text with content of html tag"), + ("This is a text without html tags", + "This is a text without html tags")]) +def test_remove_html_tags(text, expected_result): + result = remove_html_tags(text) + assert expected_result == result + + +@pytest.mark.parametrize("tokens_list, smallwords_threshold, expected_result", + [(["I", "take", "care", "of", "my", "skin"], + 2, + ["take", "care", "skin"]), + (["This", "text", "contains", "only", "long", "words"], + 2, + ["This", "text", "contains", "only", "long", "words"])]) +def test_remove_smallwords(tokens_list, smallwords_threshold, expected_result): + result = remove_smallwords(tokens_list, smallwords_threshold) + assert expected_result == result + + +@pytest.mark.parametrize("text, expected_result", + [("this is a #hashtag in the middle of the text", + ["#hashtag"]), + ("#this is a hashtag in the beginning of the text", + ["#this"]), + ("this is a hashtag in the end of the #text", + ["#text"]), + ("this is a text with no hashtag", + []), + ("this is a text with #many #hashtags", + ["#many", "#hashtags"])] + ) +def test_extract_hashtags(text, expected_result): + result = extract_hashtags(text) + assert expected_result == result + + +@pytest.mark.parametrize("text, expected_result", + [("this is a #hashtag in the middle of the text", + "this is a in the middle of the text"), + ("#this is a hashtag in the beginning of the text", + "is a hashtag in the beginning of the text"), + ("this is a hashtag in the end of the #text", + "this is a hashtag in the end of the"), + ("this is a text with no hashtag", + "this is a text with no hashtag"), + ("this is a text with #many #hashtags", + "this is a text with")] + ) +def test_remove_hashtag(text, expected_result): + result = remove_hashtag(text) + assert expected_result == result + + +@pytest.mark.parametrize("text, expected_filtered_text", + [("كلمات Learn 3 Arabic كلمات words EASILY- Vocabulary #1 تعلم ٣ جديدة", + "Learn 3 Arabic words EASILY Vocabulary 1")]) +def test_filter_non_latin_characters(text, expected_filtered_text): + filtered_text = filter_non_latin_characters(text) + assert expected_filtered_text == filtered_text + + @pytest.mark.parametrize( "input_str, expected_str", [ From 04a70a38d2e28205ddd8b8edf8d5b8d1422df164 Mon Sep 17 00:00:00 2001 From: Amale EL HAMRI <amale.elhamri@artefact.com> Date: Mon, 23 Mar 2020 11:34:39 +0100 Subject: [PATCH 247/496] adding regex reqirement --- requirements.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/requirements.txt b/requirements.txt index 59d0f2e..256e891 100644 --- a/requirements.txt +++ b/requirements.txt @@ -35,6 +35,7 @@ vaderSentiment==3.2.1 google-compute-engine==2.8.13 flashtext==2.7 phonenumbers==8.10.12 +regex==2019.8.19p emoji>=0.5.2 summa==1.2.0 biterm==0.1.5 From 9dfa8adc994cd5845ef850e8881bda0b8e7cc1e1 Mon Sep 17 00:00:00 2001 From: Amale EL HAMRI <amale.elhamri@artefact.com> Date: Mon, 23 Mar 2020 12:01:35 +0100 Subject: [PATCH 248/496] typo in requirements --- requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements.txt b/requirements.txt index 256e891..8b4b58d 100644 --- a/requirements.txt +++ b/requirements.txt @@ -35,7 +35,7 @@ vaderSentiment==3.2.1 google-compute-engine==2.8.13 flashtext==2.7 phonenumbers==8.10.12 -regex==2019.8.19p +regex==2019.8.19 emoji>=0.5.2 summa==1.2.0 biterm==0.1.5 From bb305ac30a3320939e27c3df7a82d1875fb9b21e Mon Sep 17 00:00:00 2001 From: Rafaelle AYGALENQ <rafaelle.aygalenq@artefact.com> Date: Wed, 25 Mar 2020 11:28:12 +0100 Subject: [PATCH 249/496] refacto preprocessing and utils folders --- .../{utils => analysis}/keyword_extractor.py | 0 .../{utils => analysis}/ngrams_analysis.py | 0 .../{utils => analysis}/text_summary.py | 0 nautilus_nlp/{utils => analysis}/visualize.py | 0 .../text_vectorizers.py | 0 .../preprocessing/additional_preprocess.py | 117 ++++ .../preprocessing/keyword_extractor.py | 47 -- nautilus_nlp/preprocessing/lemmatization.py | 129 ----- .../{preprocess.py => main_preprocess.py} | 502 ++++-------------- .../preprocessing/social_preprocess.py | 164 ++++++ nautilus_nlp/preprocessing/stemming.py | 53 -- nautilus_nlp/preprocessing/tokenizer.py | 150 ------ nautilus_nlp/utils/stopwords.py | 87 +++ 13 files changed, 472 insertions(+), 777 deletions(-) rename nautilus_nlp/{utils => analysis}/keyword_extractor.py (100%) rename nautilus_nlp/{utils => analysis}/ngrams_analysis.py (100%) rename nautilus_nlp/{utils => analysis}/text_summary.py (100%) rename nautilus_nlp/{utils => analysis}/visualize.py (100%) rename nautilus_nlp/{preprocessing => models}/text_vectorizers.py (100%) create mode 100644 nautilus_nlp/preprocessing/additional_preprocess.py delete mode 100644 nautilus_nlp/preprocessing/keyword_extractor.py delete mode 100644 nautilus_nlp/preprocessing/lemmatization.py rename nautilus_nlp/preprocessing/{preprocess.py => main_preprocess.py} (65%) create mode 100644 nautilus_nlp/preprocessing/social_preprocess.py delete mode 100644 nautilus_nlp/preprocessing/stemming.py delete mode 100644 nautilus_nlp/preprocessing/tokenizer.py create mode 100644 nautilus_nlp/utils/stopwords.py diff --git a/nautilus_nlp/utils/keyword_extractor.py b/nautilus_nlp/analysis/keyword_extractor.py similarity index 100% rename from nautilus_nlp/utils/keyword_extractor.py rename to nautilus_nlp/analysis/keyword_extractor.py diff --git a/nautilus_nlp/utils/ngrams_analysis.py b/nautilus_nlp/analysis/ngrams_analysis.py similarity index 100% rename from nautilus_nlp/utils/ngrams_analysis.py rename to nautilus_nlp/analysis/ngrams_analysis.py diff --git a/nautilus_nlp/utils/text_summary.py b/nautilus_nlp/analysis/text_summary.py similarity index 100% rename from nautilus_nlp/utils/text_summary.py rename to nautilus_nlp/analysis/text_summary.py diff --git a/nautilus_nlp/utils/visualize.py b/nautilus_nlp/analysis/visualize.py similarity index 100% rename from nautilus_nlp/utils/visualize.py rename to nautilus_nlp/analysis/visualize.py diff --git a/nautilus_nlp/preprocessing/text_vectorizers.py b/nautilus_nlp/models/text_vectorizers.py similarity index 100% rename from nautilus_nlp/preprocessing/text_vectorizers.py rename to nautilus_nlp/models/text_vectorizers.py diff --git a/nautilus_nlp/preprocessing/additional_preprocess.py b/nautilus_nlp/preprocessing/additional_preprocess.py new file mode 100644 index 0000000..5ec89d5 --- /dev/null +++ b/nautilus_nlp/preprocessing/additional_preprocess.py @@ -0,0 +1,117 @@ +# GNU Lesser General Public License v3.0 only +# Copyright (C) 2020 Artefact +# licence-information@artefact.com +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 3 of the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public License +# along with this program; if not, write to the Free Software Foundation, +# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +# -*- coding: utf-8 -*- + +from __future__ import absolute_import, division, print_function, unicode_literals + +import re +import regex + +def remove_multiple_spaces_and_strip_text(text: str) -> str: + """ + Remove multiple spaces, strip text, and remove '-', '*' characters. + + Parameters + ---------- + text : str + the text to be processed + + Returns + ------- + string + the text with removed multiple spaces and strip text + """ + regex_remove_multiple_spaces_list = ["\\t", "[\\s\\-\\*]{2,}"] + for regex_remove_multiple_spaces in regex_remove_multiple_spaces_list: + text = re.sub(regex_remove_multiple_spaces, " ", text) + text = text.strip() + return text + + +def remove_tokens_with_nonletters(tokens: list) -> list: + """ + Inputs a list of tokens, outputs a list of tokens without tokens that + includes numbers of special caracters. + ['foo','bar','124','34euros'] -> ['foo','bar'] + + Parameters + ---------- + tokens : list + list of tokens to be cleaned + + Returns + ------- + list + list of tokens without tokens with numbers + """ + return [word for word in tokens if re.search("[^a-zA-Z]", word) is None] + + +def remove_special_caracters_from_tokenslist(tokens: list) -> list: + """ + Remove tokens that doesn't contains any number or letter. + eg. ['foo','bar','---',"'s",'#'] -> ['foo','bar',"'s"] + + Parameters + ---------- + tokens : list + list of tokens to be cleaned + + Returns + ------- + list + list of tokens without tokens that contains only special caracters + + """ + return [word for word in tokens if re.search("[a-zA-Z0-9]", word)] + + +def filter_non_latin_characters(text:str) -> str: + """ + Function that filters non latin characters of a text + + Parameters + ---------- + text : string + + Returns + ------- + string + """ + text = regex.sub(r'[^\p{Latin}1-9]', ' ', text).strip() + return re.sub(' +', ' ', text) + + +def remove_smallwords(tokens_list:list, smallwords_threshold:int) -> list: + """ + Function that removes words which length is below a threshold + ["hello", "my", "name", "is", "John", "Doe"] --> ["hello","name","John","Doe"] + + Parameters + ---------- + text : list + list of strings + smallwords_threshold: int + threshold of small word + + Returns + ------- + list + """ + result = [word for word in tokens_list if len(word) > smallwords_threshold] + return result \ No newline at end of file diff --git a/nautilus_nlp/preprocessing/keyword_extractor.py b/nautilus_nlp/preprocessing/keyword_extractor.py deleted file mode 100644 index 304fe02..0000000 --- a/nautilus_nlp/preprocessing/keyword_extractor.py +++ /dev/null @@ -1,47 +0,0 @@ -# GNU Lesser General Public License v3.0 only -# Copyright (C) 2020 Artefact -# licence-information@artefact.com -# -# This program is free software; you can redistribute it and/or -# modify it under the terms of the GNU Lesser General Public -# License as published by the Free Software Foundation; either -# version 3 of the License, or (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public License -# along with this program; if not, write to the Free Software Foundation, -# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. -from flashtext import KeywordProcessor - -def extract_keywords(text:str, keyword, case_sensitive=True) -> list: - """ - Extract Keywords from a document. - - Parameters - ---------- - text : str - Text to extract keywords from - keyword : str or list - Single keyword (str) or list of keywords (list) - case_sensitive : bool - If True, will be case-sensitive. - - Returns - ------- - string - return list of extracted keyworkds - """ - processor=KeywordProcessor(case_sensitive=case_sensitive) - if isinstance(keyword,list): - processor.add_keywords_from_list(keyword) - elif isinstance(keyword,str): - processor.add_keyword(keyword) - elif isinstance(keyword,dict): - processor.add_keywords_from_dict(keyword) - - return processor.extract_keywords(text) - diff --git a/nautilus_nlp/preprocessing/lemmatization.py b/nautilus_nlp/preprocessing/lemmatization.py deleted file mode 100644 index 2ee94e7..0000000 --- a/nautilus_nlp/preprocessing/lemmatization.py +++ /dev/null @@ -1,129 +0,0 @@ -# GNU Lesser General Public License v3.0 only -# Copyright (C) 2020 Artefact -# licence-information@artefact.com -# -# This program is free software; you can redistribute it and/or -# modify it under the terms of the GNU Lesser General Public -# License as published by the Free Software Foundation; either -# version 3 of the License, or (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public License -# along with this program; if not, write to the Free Software Foundation, -# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. -import spacy -import nltk -nltk.download('wordnet') -nltk.download('averaged_perceptron_tagger') -from nltk.stem import WordNetLemmatizer -from nltk.corpus import wordnet - -try: - french_spacy = spacy.load('fr_core_news_sm') -except: - raise OSError("""You must install French langage to use SpaCy. - python -m spacy download fr - See https://spacy.io/usage/ for details - """) -try: - english_spacy = spacy.load('en_core_web_sm') -except: - raise OSError("""You must install english langage to use SpaCy. - python -m spacy download en - See https://spacy.io/usage/ for details - """) - - -def lemmatize_french_tokens(tokens:list, module:str='spacy')->list: - """ - Wrappers of SpaCy french lemmatizers (based on FrenchLeffLemmatizer but - faster and more accurate.) - - Parameters - ---------- - tokens : list - List of tokens - module : ({'spacy'}) - Only spaCy is available. We removed FrenchLeffLemmatizer for performance - considerations. - - Returns - ------- - list - list of lemmatized tokens - """ - - tokens = _make_sure_input_is_list_of_tokens(tokens) - - if module == 'spacy': - # Doc : https://spacy.io/api/token#attributes - text = ' '.join(tokens) - doc = french_spacy(text) - return [token.lemma_ for token in doc] - - else: - raise ValueError("must pass a valid module name!") - - -def lemmatize_english_tokens(tokens:list, module:str='spacy')->list: - """ - Wrapper of SpaCy english lemmatizer and NLTK WordNet. - - Parameters - ---------- - tokens : list - List of tokens - module : ({'spacy'},{'nltk'}) - Tokenizer module. Default: 'spacy' - - Returns - ------- - list - list of lemmatized tokens - """ - tokens = _make_sure_input_is_list_of_tokens(tokens) - - if module == 'nltk': - # Doc : https://github.com/ClaudeCoulombe/FrenchLefffLemmatizer - lemmatizer = WordNetLemmatizer() - return [lemmatizer.lemmatize(word, _get_wordnet_pos(word)) for word in tokens] - - elif module == 'spacy': - # Doc : https://spacy.io/api/token#attributes - text = ' '.join(tokens) - doc = english_spacy(text) - return [token.lemma_ for token in doc] - - else: - raise ValueError("must pass a valid module name!") - - -def _get_wordnet_pos(word): - """ - Map POS tag to first character lemmatize() accepts - """ - tag = nltk.pos_tag([word])[0][1][0].upper() - tag_dict = {"J": wordnet.ADJ, - "N": wordnet.NOUN, - "V": wordnet.VERB, - "R": wordnet.ADV} - - return tag_dict.get(tag, wordnet.NOUN) - - -def _make_sure_input_is_list_of_tokens(tokens): - """ - Raises an error if input is not a list, and convert "None" to blank list - to handle dataset with no text. - """ - if type(tokens) is list: - return tokens - elif tokens is None: - return [] - elif type(tokens) is str: - raise ValueError("must pass a list of tokens, not text!") - diff --git a/nautilus_nlp/preprocessing/preprocess.py b/nautilus_nlp/preprocessing/main_preprocess.py similarity index 65% rename from nautilus_nlp/preprocessing/preprocess.py rename to nautilus_nlp/preprocessing/main_preprocess.py index 9aee2f0..d91c4a2 100644 --- a/nautilus_nlp/preprocessing/preprocess.py +++ b/nautilus_nlp/preprocessing/main_preprocess.py @@ -19,43 +19,127 @@ from __future__ import absolute_import, division, print_function, unicode_literals -import os -import json import re import unicodedata - -import emoji as _emoji -import regex from ftfy import fix_text as _fix_text -from stop_words import get_stop_words as _get_stop_words -from stop_words import LANGUAGE_MAPPING as _LANGUAGE_MAPPING +from nautilus_nlp.utils.stopwords_utils import get_stopwords from nautilus_nlp.utils.phone_number import extract_phone_numbers as _extract_phone_numbers from nautilus_nlp.utils import constants -from nautilus_nlp.config.config import ROOT_FOLDER -from nautilus_nlp.utils.file_loader import documents_loader - -STOPWORDS_JSON_FILEPATH = os.path.join(ROOT_FOLDER, "data", "stopwords.json") -def remove_multiple_spaces_and_strip_text(text: str) -> str: +def preprocess_text( + text, + remove_eol_char=True, + fix_unicode=False, + lowercase=False, + no_urls=False, + no_emails=False, + no_phone_numbers=False, + no_numbers=False, + no_currency_symbols=False, + no_punct=False, + no_contractions=False, + no_accents=False, + replace_with=' ', + no_stopwords=None, + phone_countries_format=[None,'US','FR'], + phone_method='regex' +) -> str: """ - Remove multiple spaces, strip text, and remove '-', '*' characters. + Normalize various aspects of a raw text doc. A convenience function for + applying all other preprocessing functions in one go. Parameters ---------- text : str - the text to be processed - + raw text to preprocess + fix_unicode : bool + if True, fix "broken" unicode such as mojibake and garbled HTML entities + remove_eol_char : bool + if True, will remove the end-of-line characters \\n + lowercase : bool + if True, all text is lower-cased + no_urls : bool + if True, replace all URL strings with '*URL*' or with "replace_with" if + specified. + no_emails : bool + if True, replace all email strings with '*EMAIL*' or with "replace_with" if + specified. + no_phone_numbers : bool + if True, replace all phone number strings with '*PHONE*' or with "replace_with" if + specified. + no_numbers : bool + if True, replace all number-like strings with '*NUMBER*' or with "replace_with" if + specified. + no_currency_symbols : bool + if True, if True, replace all currency symbols with their standard + 3-letter abbreviations. + no_punct : bool + if True, remove all punctuation (replace with empty string) + no_contractions : bool + if True, if True, replace *English* contractions with their unshortened forms + no_accents : bool + if True, replace all accented characters with unaccented versions + replace_with : string + The string you want the entities to be replaced with. + no_stopwords : 2-letter country code + If specified, will remove the stopwords of the given language. + Supported languages: ['ar', 'bg', 'ca', 'cz', 'da', 'nl', 'en', + 'fi', 'fr', 'de', 'hi', 'hu', 'id', 'it', 'nb', 'pl', 'pt', 'ro', 'ru', + 'sk', 'es', 'sv', 'tr', 'uk', 'vi', 'af', 'ha', 'so', 'st', 'sw', 'yo', + 'zu', 'da', 'de', 'es', 'et', 'fi', 'fr', 'hr', 'hu', 'it', 'ko', 'nl', + 'no', 'pl', 'pt', 'ru', 'sv', 'tr', 'zh', 'eo', 'he', 'la', 'sk', 'sl', + 'br', 'ca', 'cs', 'el', 'eu', 'ga', 'gl', 'hy', 'id', 'ja', 'lv', 'th', + 'ar', 'bg', 'bn', 'fa', 'hi', 'mr', 'ro', 'en'] + phone_countries_format : list + formats of the phone numbers to be removed. Full list is available at + utils.SUPPORTED_COUNTRY + phone_method : ['regex','detection'] + regex is faster but will omit a lot of numbers, while detection will + catch every numbers, but takes a while. Returns ------- string - the text with removed multiple spaces and strip text + input ``text`` processed according to function args + + Warning + ------- + These changes may negatively affect subsequent NLP analysis performed + on the text, so choose carefully, and preprocess at your own risk! """ - regex_remove_multiple_spaces_list = ["\\t", "[\\s\\-\\*]{2,}"] - for regex_remove_multiple_spaces in regex_remove_multiple_spaces_list: - text = re.sub(regex_remove_multiple_spaces, " ", text) - text = text.strip() + assert isinstance(text, str), "The text to preprocess must be a string" + + if fix_unicode is True: + text = fix_bad_unicode(text, normalization="NFC") + if remove_eol_char is True: + text = remove_EOL_characters(text) + if no_urls is True: + text = replace_urls(text, replace_with=replace_with) + if no_emails is True: + text = replace_emails(text, replace_with=replace_with) + if no_phone_numbers is True: + text = replace_phone_numbers(text, replace_with=replace_with, + method=phone_method, + country_format_to_detect=phone_countries_format) + if no_numbers is True: + text = replace_numbers(text, replace_with=replace_with) + if no_currency_symbols is True: + text = replace_currency_symbols(text, replace_with=replace_with) + if no_contractions is True: + text = unpack_english_contractions(text) + if no_accents is True: + text = remove_accents(text, method="unicode") + if no_punct is True: + text = remove_punct(text) + if lowercase is True: + text = text.lower() + if no_stopwords is not None: + stopwords = get_stopwords(no_stopwords) + text = ' '.join(remove_stopwords(text, stopwords)) + # always normalize whitespace; treat linebreaks separately from spacing + text = normalize_whitespace(text) + return text @@ -74,102 +158,6 @@ def remove_EOL_characters(text: str) -> str: return text.replace("\n", " ") -def remove_tokens_with_nonletters(tokens: list) -> list: - """ - Inputs a list of tokens, outputs a list of tokens without tokens that - includes numbers of special caracters. - ['foo','bar','124','34euros'] -> ['foo','bar'] - - Parameters - ---------- - tokens : list - list of tokens to be cleaned - - Returns - ------- - list - list of tokens without tokens with numbers - """ - return [word for word in tokens if re.search("[^a-zA-Z]", word) is None] - - -def remove_special_caracters_from_tokenslist(tokens: list) -> list: - """ - Remove tokens that doesn't contains any number or letter. - eg. ['foo','bar','---',"'s",'#'] -> ['foo','bar',"'s"] - - Parameters - ---------- - tokens : list - list of tokens to be cleaned - - Returns - ------- - list - list of tokens without tokens that contains only special caracters - - """ - return [word for word in tokens if re.search("[a-zA-Z0-9]", word)] - - -def _load_stopwords_from_json(filepath=STOPWORDS_JSON_FILEPATH): - stopwords = documents_loader(filepath) - stopwords = json.loads(stopwords) - return stopwords - - -def get_stopwords(lang: str = "en") -> list: - """ - Inputs a language code, returns a list of stopwords for the specified language - - Parameters - ---------- - lang : str - Supported languages: ['ar', 'bg', 'ca', 'cz', 'da', 'nl', 'en', - 'fi', 'fr', 'de', 'hi', 'hu', 'id', 'it', 'nb', 'pl', 'pt', 'ro', 'ru', - 'sk', 'es', 'sv', 'tr', 'uk', 'vi', 'af', 'ha', 'so', 'st', 'sw', 'yo', - 'zu', 'da', 'de', 'es', 'et', 'fi', 'fr', 'hr', 'hu', 'it', 'ko', 'nl', - 'no', 'pl', 'pt', 'ru', 'sv', 'tr', 'zh', 'eo', 'he', 'la', 'sk', 'sl', - 'br', 'ca', 'cs', 'el', 'eu', 'ga', 'gl', 'hy', 'id', 'ja', 'lv', 'th', - 'ar', 'bg', 'bn', 'fa', 'hi', 'mr', 'ro', 'en'] - - Returns - ------- - list - list of stopwords for a given language - - Raises - ------ - ValueError - When language is not available yet or incorrect country code - """ - if type(lang) == str and len(lang) == 2: - lang = lang.lower() - - custom_stopwords = _load_stopwords_from_json(STOPWORDS_JSON_FILEPATH) - stopwords = [] - - supported_lang_lib = list(_LANGUAGE_MAPPING.keys()) - supported_lang_custom = list(custom_stopwords.keys()) - supported_lang = supported_lang_lib + supported_lang_custom - if lang in supported_lang: - if lang in supported_lang_lib: - stopwords += _get_stop_words(lang) - if lang in supported_lang_custom: - stopwords += custom_stopwords[lang] - else: - raise ValueError( - "Language not available yet or incorrect country code. Supported languages: {}".format( - supported_lang - ) - ) - else: - raise ValueError( - 'Please input a valid country code, in 2 letters. Eg. "us" for USA. ' - ) - return list(set(stopwords)) - - def remove_stopwords(text_or_tokens, stopwords: list) -> list: """ Remove stopwords from a list of tokens or a text. @@ -285,20 +273,7 @@ def unpack_english_contractions(text:str) -> str: return text -def filter_non_latin_characters(text:str) -> str: - """ - Function that filters non latin characters of a text - - Parameters - ---------- - text : string - Returns - ------- - string - """ - text = regex.sub(r'[^\p{Latin}1-9]', ' ', text).strip() - return re.sub(' +', ' ', text) def replace_urls(text:str, replace_with:str="*URL*") -> str: @@ -491,280 +466,11 @@ def remove_accents(text:str, method:str="unicode") -> str: raise ValueError(msg) -def remove_mentions(text:str) -> str: - """ - Function that removes words preceded with a '@' - Parameters - ---------- - text : str - - Returns - ------- - string - """ - return normalize_whitespace(re.sub(r'@\w*', '', text)) -def extract_mentions(text:str) -> str: - """ - Function that extracts words preceded with a '@' - eg. "I take care of my skin with @thisproduct" --> ["@thisproduct"] - Parameters - ---------- - text : str - - Returns - ------- - string - """ - return re.findall(r'[@][^\s@]+', text) -def remove_html_tags(text:str) -> str: - """ - Function that removes words between < and > - Parameters - ---------- - text : str - - Returns - ------- - string - """ - return normalize_whitespace(re.sub(r'<.*?>', '', text)) - - -def remove_smallwords(tokens_list:list, smallwords_threshold:int) -> list: - """ - Function that removes words which length is below a threshold - ["hello", "my", "name", "is", "John", "Doe"] --> ["hello","name","John","Doe"] - - Parameters - ---------- - text : list - list of strings - smallwords_threshold: int - threshold of small word - - Returns - ------- - list - """ - result = [word for word in tokens_list if len(word) > smallwords_threshold] - return result - - -def remove_emoji(text:str) -> str: - """ - Remove emoji from any str by stripping any unicode in the range of Emoji unicode - as defined in the unicode convention: - http://www.unicode.org/emoji/charts/full-emoji-list.html - - Parameters - ---------- - text : str - - Returns - ------- - str - """ - emoji_pattern = _emoji.get_emoji_regexp() - word = emoji_pattern.sub("", text) - return word - - -def convert_emoji_to_text(text:str, code_delimiters=(':', ':')) -> str: - """ - Convert emoji to their CLDR Short Name, according to the unicode convention - http://www.unicode.org/emoji/charts/full-emoji-list.html - eg. 😀 --> :grinning_face: - - Parameters - ---------- - text : str - code_delimiters : tuple of symbols around the emoji code. - eg: (':',':') --> :grinning_face: - - Returns - ------- - str - string - """ - return _emoji.demojize(text, delimiters=code_delimiters) - - -def extract_emojis(text:str) -> list: - """ - Function that extracts emojis from a text and translates them into words - eg. "I take care of my skin 😀 :(" --> [":grinning_face:"] - - Parameters - ---------- - text : str - - Returns - ------- - list - list of all emojis converted with their unicode conventions - """ - emoji_pattern = _emoji.get_emoji_regexp() - emojis_in_text = re.findall(emoji_pattern, text) - emojis_converted = [convert_emoji_to_text(emoji_text) for emoji_text in emojis_in_text] - return emojis_converted - - -def extract_hashtags(text) -> list: - """ - Function that extracts words preceded with a '#' - eg. "I take care of my skin #selfcare#selfestim" --> ["skincare", "selfestim"] - - Parameters - ---------- - text : str - - Returns - ------- - list - list of all hashtags - """ - return re.findall(r'[#][^\s#]+', text) - - -def remove_hashtag(text) -> str: - """ - Function that removes words preceded with a '#' - eg. "I take care of my skin #selfcare#selfestim" --> "I take care of my skin" - - Parameters - ---------- - text : str - - Returns - ------- - str - text of a post without hashtags - """ - return normalize_whitespace(re.sub(r'#\w*', '', text)) - - -def preprocess_text( - text, - remove_eol_char=True, - fix_unicode=False, - lowercase=False, - no_urls=False, - no_emails=False, - no_phone_numbers=False, - no_numbers=False, - no_currency_symbols=False, - no_punct=False, - no_contractions=False, - no_accents=False, - no_emoji=False, - replace_with=' ', - no_stopwords=None, - phone_countries_format=[None,'US','FR'], - phone_method='regex' -) -> str: - """ - Normalize various aspects of a raw text doc. A convenience function for - applying all other preprocessing functions in one go. - - Parameters - ---------- - text : str - raw text to preprocess - fix_unicode : bool - if True, fix "broken" unicode such as mojibake and garbled HTML entities - remove_eol_char : bool - if True, will remove the end-of-line characters \\n - lowercase : bool - if True, all text is lower-cased - no_urls : bool - if True, replace all URL strings with '*URL*' or with "replace_with" if - specified. - no_emails : bool - if True, replace all email strings with '*EMAIL*' or with "replace_with" if - specified. - no_phone_numbers : bool - if True, replace all phone number strings with '*PHONE*' or with "replace_with" if - specified. - no_numbers : bool - if True, replace all number-like strings with '*NUMBER*' or with "replace_with" if - specified. - no_currency_symbols : bool - if True, if True, replace all currency symbols with their standard - 3-letter abbreviations. - no_punct : bool - if True, remove all punctuation (replace with empty string) - no_contractions : bool - if True, if True, replace *English* contractions with their unshortened forms - no_accents : bool - if True, replace all accented characters with unaccented versions - no_emoji : bool - if True, remove all emojis from text - replace_with : string - The string you want the entities to be replaced with. - no_stopwords : 2-letter country code - If specified, will remove the stopwords of the given language. - Supported languages: ['ar', 'bg', 'ca', 'cz', 'da', 'nl', 'en', - 'fi', 'fr', 'de', 'hi', 'hu', 'id', 'it', 'nb', 'pl', 'pt', 'ro', 'ru', - 'sk', 'es', 'sv', 'tr', 'uk', 'vi', 'af', 'ha', 'so', 'st', 'sw', 'yo', - 'zu', 'da', 'de', 'es', 'et', 'fi', 'fr', 'hr', 'hu', 'it', 'ko', 'nl', - 'no', 'pl', 'pt', 'ru', 'sv', 'tr', 'zh', 'eo', 'he', 'la', 'sk', 'sl', - 'br', 'ca', 'cs', 'el', 'eu', 'ga', 'gl', 'hy', 'id', 'ja', 'lv', 'th', - 'ar', 'bg', 'bn', 'fa', 'hi', 'mr', 'ro', 'en'] - phone_countries_format : list - formats of the phone numbers to be removed. Full list is available at - utils.SUPPORTED_COUNTRY - phone_method : ['regex','detection'] - regex is faster but will omit a lot of numbers, while detection will - catch every numbers, but takes a while. - Returns - ------- - string - input ``text`` processed according to function args - - Warning - ------- - These changes may negatively affect subsequent NLP analysis performed - on the text, so choose carefully, and preprocess at your own risk! - """ - assert isinstance(text, str), "The text to preprocess must be a string" - if fix_unicode is True: - text = fix_bad_unicode(text, normalization="NFC") - if remove_eol_char is True: - text = remove_EOL_characters(text) - if no_urls is True: - text = replace_urls(text, replace_with=replace_with) - if no_emails is True: - text = replace_emails(text, replace_with=replace_with) - if no_phone_numbers is True: - text = replace_phone_numbers(text, replace_with=replace_with, - method=phone_method, - country_format_to_detect=phone_countries_format) - if no_numbers is True: - text = replace_numbers(text, replace_with=replace_with) - if no_currency_symbols is True: - text = replace_currency_symbols(text, replace_with=replace_with) - if no_emoji is True: - text = remove_emoji(text) - if no_contractions is True: - text = unpack_english_contractions(text) - if no_accents is True: - text = remove_accents(text, method="unicode") - if no_punct is True: - text = remove_punct(text) - if lowercase is True: - text = text.lower() - if no_stopwords is not None: - stopwords = get_stopwords(no_stopwords) - text = ' '.join(remove_stopwords(text, stopwords)) - # always normalize whitespace; treat linebreaks separately from spacing - text = normalize_whitespace(text) - - return text diff --git a/nautilus_nlp/preprocessing/social_preprocess.py b/nautilus_nlp/preprocessing/social_preprocess.py new file mode 100644 index 0000000..a88fad2 --- /dev/null +++ b/nautilus_nlp/preprocessing/social_preprocess.py @@ -0,0 +1,164 @@ +# GNU Lesser General Public License v3.0 only +# Copyright (C) 2020 Artefact +# licence-information@artefact.com +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 3 of the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public License +# along with this program; if not, write to the Free Software Foundation, +# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +# -*- coding: utf-8 -*- + +from __future__ import absolute_import, division, print_function, unicode_literals + +import re +import emoji as _emoji + +from nautilus_nlp.utils.preprocess import normalize_whitespace + + +def remove_mentions(text:str) -> str: + """ + Function that removes words preceded with a '@' + + Parameters + ---------- + text : str + + Returns + ------- + string + """ + return normalize_whitespace(re.sub(r'@\w*', '', text)) + + +def extract_mentions(text:str) -> str: + """ + Function that extracts words preceded with a '@' + eg. "I take care of my skin with @thisproduct" --> ["@thisproduct"] + + Parameters + ---------- + text : str + + Returns + ------- + string + """ + return re.findall(r'[@][^\s@]+', text) + + +def remove_html_tags(text:str) -> str: + """ + Function that removes words between < and > + + Parameters + ---------- + text : str + + Returns + ------- + string + """ + return normalize_whitespace(re.sub(r'<.*?>', '', text)) + + +def remove_emoji(text:str) -> str: + """ + Remove emoji from any str by stripping any unicode in the range of Emoji unicode + as defined in the unicode convention: + http://www.unicode.org/emoji/charts/full-emoji-list.html + + Parameters + ---------- + text : str + + Returns + ------- + str + """ + emoji_pattern = _emoji.get_emoji_regexp() + word = emoji_pattern.sub("", text) + return word + + +def convert_emoji_to_text(text:str, code_delimiters=(':', ':')) -> str: + """ + Convert emoji to their CLDR Short Name, according to the unicode convention + http://www.unicode.org/emoji/charts/full-emoji-list.html + eg. 😀 --> :grinning_face: + + Parameters + ---------- + text : str + code_delimiters : tuple of symbols around the emoji code. + eg: (':',':') --> :grinning_face: + + Returns + ------- + str + string + """ + return _emoji.demojize(text, delimiters=code_delimiters) + + +def extract_emojis(text:str) -> list: + """ + Function that extracts emojis from a text and translates them into words + eg. "I take care of my skin 😀 :(" --> [":grinning_face:"] + + Parameters + ---------- + text : str + + Returns + ------- + list + list of all emojis converted with their unicode conventions + """ + emoji_pattern = _emoji.get_emoji_regexp() + emojis_in_text = re.findall(emoji_pattern, text) + emojis_converted = [convert_emoji_to_text(emoji_text) for emoji_text in emojis_in_text] + return emojis_converted + + +def extract_hashtags(text) -> list: + """ + Function that extracts words preceded with a '#' + eg. "I take care of my skin #selfcare#selfestim" --> ["skincare", "selfestim"] + + Parameters + ---------- + text : str + + Returns + ------- + list + list of all hashtags + """ + return re.findall(r'[#][^\s#]+', text) + + +def remove_hashtag(text) -> str: + """ + Function that removes words preceded with a '#' + eg. "I take care of my skin #selfcare#selfestim" --> "I take care of my skin" + + Parameters + ---------- + text : str + + Returns + ------- + str + text of a post without hashtags + """ + return normalize_whitespace(re.sub(r'#\w*', '', text)) diff --git a/nautilus_nlp/preprocessing/stemming.py b/nautilus_nlp/preprocessing/stemming.py deleted file mode 100644 index 92028ec..0000000 --- a/nautilus_nlp/preprocessing/stemming.py +++ /dev/null @@ -1,53 +0,0 @@ -# GNU Lesser General Public License v3.0 only -# Copyright (C) 2020 Artefact -# licence-information@artefact.com -# -# This program is free software; you can redistribute it and/or -# modify it under the terms of the GNU Lesser General Public -# License as published by the Free Software Foundation; either -# version 3 of the License, or (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public License -# along with this program; if not, write to the Free Software Foundation, -# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. -from nltk.stem.snowball import * - - -def stem_tokens(tokens: list, lang: str ='english')-> list: - """ - Wrapper of NLTK's Snowball stemmers : http://www.nltk.org/howto/stem.html - - Parameters - ---------- - tokens : list - List of tokens - lang : string - Supported languages: ({'arabic', 'danish', 'dutch', 'english', 'finnish', 'french', - 'german', 'hungarian', 'italian', 'norwegian', 'porter', 'portuguese', - 'romanian', 'russian', 'spanish', 'swedish'}): - - Returns - ------- - list - list of stemmed tokens - """ - - supported_lang = [lang for lang in SnowballStemmer.languages] - - if lang in supported_lang: - stemmer = eval(lang.capitalize()+'Stemmer()') - else: - raise ValueError("Langage not supported of mispelled") - - # Make sure tokens are actually a list, and handle NaN. - if type(tokens) is list: - return [stemmer.stem(token) for token in tokens] - elif tokens is None: - return [] - elif type(tokens) is str: - raise ValueError("must pass a list of tokens, not text!") \ No newline at end of file diff --git a/nautilus_nlp/preprocessing/tokenizer.py b/nautilus_nlp/preprocessing/tokenizer.py deleted file mode 100644 index 4236f23..0000000 --- a/nautilus_nlp/preprocessing/tokenizer.py +++ /dev/null @@ -1,150 +0,0 @@ -# GNU Lesser General Public License v3.0 only -# Copyright (C) 2020 Artefact -# licence-information@artefact.com -# -# This program is free software; you can redistribute it and/or -# modify it under the terms of the GNU Lesser General Public -# License as published by the Free Software Foundation; either -# version 3 of the License, or (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public License -# along with this program; if not, write to the Free Software Foundation, -# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. -import nltk -from sacremoses import MosesTokenizer, MosesDetokenizer -import spacy -from spacy.lang.fr import French -from spacy.lang.en import English -import spacy.lang as spacylang -nltk.download('punkt') - -try: - french_spacy = spacylang.fr.French() -except: - raise OSError("""You must install French langage to use SpaCy. - python -m spacy download fr - See https://spacy.io/usage/ for details - """) -try: - english_spacy = spacylang.en.English() -except: - raise OSError("""You must install english langage to use SpaCy. - python -m spacy download en - See https://spacy.io/usage/ for details - """) - - -def tokenize(text: str, lang_module: str = 'en_spacy')-> list: - """ - Split text into a list of tokens. - - Parameters - ---------- - lang_module - ({'en_spacy', 'en_nltk', 'fr_spacy', 'fr_moses'}): choose - the tokenization module according to the langage and the implementation. - Recommanded: Spacy (faster, better results). To process other langages - import models.Spacy_models - - Returns - ------- - list - Outputs a list of tokens. - """ - if lang_module == 'en_nltk': - return nltk.word_tokenize(text) - elif lang_module == 'en_spacy': - spacydoc = english_spacy(text) - return [tokens.text for tokens in spacydoc] - elif lang_module == 'fr_spacy': - spacydoc = french_spacy(text) - return [tokens.text for tokens in spacydoc] - elif lang_module == 'fr_moses': - t = MosesTokenizer(lang='fr') - return t.tokenize(text, escape=False) - - -def untokenize(tokens:list, lang:str='fr')->str: - """ - Inputs a list of tokens, output the text joined. - Wrapper of https://github.com/alvations/sacremoses - - Parameters - ---------- - lang - Supported languages: ({'fr', 'en', 'cs','it','ga'}) - - Returns - ------- - string - """ - d = MosesDetokenizer(lang=lang) - text = d.detokenize(tokens, unescape=False) - return text - - -def _convert_tokens_to_string(tokens_or_str, lang:str='en')->str: - """ - Test if the input is tokens or string, and convert tokens to string - using untokenize(). If the input is null, it will return an empty string. - - Parameters - ---------- - lang - Supported languages: ({'fr', 'en', 'cs','it','ga'}). - - Returns - ------- - string - - Raises - ------- - ValueError - If the input is not string, list or Nonetype. - """ - if type(tokens_or_str) is str: - return tokens_or_str - elif type(tokens_or_str) is list: - return untokenize(tokens_or_str, lang=lang) - elif type(tokens_or_str) is None: - return '' - else: - raise ValueError('Please input string or tokens') - - -def _convert_string_to_tokens(tokens_or_str, lang_module:str='en_spacy')->str: - """ - Test if the input is tokens or string, and convert string to tokens - using tokenize(). If the input is null, it will return an empty list. - - Parameters - ---------- - lang_module - ({'en_spacy', 'en_nltk', 'fr_spacy', 'fr_moses'}): choose - the tokenization module according to the langage and the implementation. - Recommanded: Spacy (faster, better results). To process other langages - import models.Spacy_models - - Returns - ------- - list - list of tokens - - Raises - ------- - ValueError - If the input is not string, list or Nonetype. - """ - if type(tokens_or_str) is str: - return tokenize(tokens_or_str, lang_module=lang_module) - elif type(tokens_or_str) is list: - return tokens_or_str - elif type(tokens_or_str) is None: - return [] - else: - raise ValueError('Please input string or tokens') \ No newline at end of file diff --git a/nautilus_nlp/utils/stopwords.py b/nautilus_nlp/utils/stopwords.py new file mode 100644 index 0000000..0ea81a2 --- /dev/null +++ b/nautilus_nlp/utils/stopwords.py @@ -0,0 +1,87 @@ +# GNU Lesser General Public License v3.0 only +# Copyright (C) 2020 Artefact +# licence-information@artefact.com +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 3 of the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public License +# along with this program; if not, write to the Free Software Foundation, +# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +# -*- coding: utf-8 -*- + +from __future__ import absolute_import, division, print_function, unicode_literals + +import json +import os +from stop_words import get_stop_words as _get_stop_words +from stop_words import LANGUAGE_MAPPING as _LANGUAGE_MAPPING +from nautilus_nlp.config.config import ROOT_FOLDER +from nautilus_nlp.utils.file_loader import documents_loader + +STOPWORDS_JSON_FILEPATH = os.path.join(ROOT_FOLDER, "data", "stopwords.json") + + +def _load_stopwords_from_json(filepath=STOPWORDS_JSON_FILEPATH): + stopwords = documents_loader(filepath) + stopwords = json.loads(stopwords) + return stopwords + + +def get_stopwords(lang: str = "en") -> list: + """ + Inputs a language code, returns a list of stopwords for the specified language + + Parameters + ---------- + lang : str + Supported languages: ['ar', 'bg', 'ca', 'cz', 'da', 'nl', 'en', + 'fi', 'fr', 'de', 'hi', 'hu', 'id', 'it', 'nb', 'pl', 'pt', 'ro', 'ru', + 'sk', 'es', 'sv', 'tr', 'uk', 'vi', 'af', 'ha', 'so', 'st', 'sw', 'yo', + 'zu', 'da', 'de', 'es', 'et', 'fi', 'fr', 'hr', 'hu', 'it', 'ko', 'nl', + 'no', 'pl', 'pt', 'ru', 'sv', 'tr', 'zh', 'eo', 'he', 'la', 'sk', 'sl', + 'br', 'ca', 'cs', 'el', 'eu', 'ga', 'gl', 'hy', 'id', 'ja', 'lv', 'th', + 'ar', 'bg', 'bn', 'fa', 'hi', 'mr', 'ro', 'en'] + + Returns + ------- + list + list of stopwords for a given language + + Raises + ------ + ValueError + When language is not available yet or incorrect country code + """ + if type(lang) == str and len(lang) == 2: + lang = lang.lower() + + custom_stopwords = _load_stopwords_from_json(STOPWORDS_JSON_FILEPATH) + stopwords = [] + + supported_lang_lib = list(_LANGUAGE_MAPPING.keys()) + supported_lang_custom = list(custom_stopwords.keys()) + supported_lang = supported_lang_lib + supported_lang_custom + if lang in supported_lang: + if lang in supported_lang_lib: + stopwords += _get_stop_words(lang) + if lang in supported_lang_custom: + stopwords += custom_stopwords[lang] + else: + raise ValueError( + "Language not available yet or incorrect country code. Supported languages: {}".format( + supported_lang + ) + ) + else: + raise ValueError( + 'Please input a valid country code, in 2 letters. Eg. "us" for USA. ' + ) + return list(set(stopwords)) \ No newline at end of file From 46b229ad015c7d261000f01c1d8b4769693c225e Mon Sep 17 00:00:00 2001 From: Bruce DELATTRE <bruce.delattre@FRART0231M.local> Date: Wed, 25 Mar 2020 13:07:08 +0100 Subject: [PATCH 250/496] Cleaning repository and updating tests --- .travis.yml | 7 - models/.gitkeep | 0 nautilus_nlp/doc.py | 344 ------------------ .../scripts/download_ft_langdetect.sh | 19 - nautilus_nlp/scripts/download_spacy_models.sh | 22 -- nautilus_nlp/scripts/init_langmodel.sh | 27 -- nautilus_nlp/scripts/install_fasttext.sh | 20 - nautilus_nlp/scripts/install_java.sh | 21 -- nautilus_nlp/scripts/install_mallet.sh | 21 -- reports/.gitkeep | 0 reports/figures/.gitkeep | 0 tests/test_doc.py | 161 -------- tests/test_extraction.py | 33 -- tests/test_fix_bad_encoding.py | 2 +- tests/test_lemmatization.py | 39 -- tests/test_ngrams_analysis.py | 38 -- tests/test_preprocessor.py | 30 +- tests/test_stemming.py | 33 -- tests/test_text_summary.py | 44 --- tests/test_tokenizer.py | 63 ---- 20 files changed, 18 insertions(+), 906 deletions(-) delete mode 100644 models/.gitkeep delete mode 100644 nautilus_nlp/doc.py delete mode 100644 nautilus_nlp/scripts/download_ft_langdetect.sh delete mode 100644 nautilus_nlp/scripts/download_spacy_models.sh delete mode 100644 nautilus_nlp/scripts/init_langmodel.sh delete mode 100644 nautilus_nlp/scripts/install_fasttext.sh delete mode 100644 nautilus_nlp/scripts/install_java.sh delete mode 100644 nautilus_nlp/scripts/install_mallet.sh delete mode 100644 reports/.gitkeep delete mode 100644 reports/figures/.gitkeep delete mode 100644 tests/test_doc.py delete mode 100644 tests/test_extraction.py delete mode 100644 tests/test_lemmatization.py delete mode 100644 tests/test_ngrams_analysis.py delete mode 100644 tests/test_stemming.py delete mode 100644 tests/test_text_summary.py delete mode 100644 tests/test_tokenizer.py diff --git a/.travis.yml b/.travis.yml index 0304bca..907e302 100644 --- a/.travis.yml +++ b/.travis.yml @@ -21,13 +21,6 @@ os: - linux services: - docker - -before_script: - - wget https://github.com/facebookresearch/fastText/archive/v0.2.0.zip && unzip v0.2.0.zip && cd fastText-0.2.0 && make && pip install . && cd .. - - python3 -m spacy download fr && python3 -m spacy download en && python3 -m spacy download de && python3 -m spacy download nl && python3 -m spacy download it && python3 -m spacy download xx && python3 -m spacy validate - - - wget http://mallet.cs.umass.edu/dist/mallet-2.0.8.zip && unzip mallet-2.0.8.zip && rm mallet-2.0.8.zip - - sudo add-apt-repository -y ppa:openjdk-r/ppa && sudo apt update && apt search openjdk && sudo apt install openjdk-8-jdk install: - pip install -r requirements.txt diff --git a/models/.gitkeep b/models/.gitkeep deleted file mode 100644 index e69de29..0000000 diff --git a/nautilus_nlp/doc.py b/nautilus_nlp/doc.py deleted file mode 100644 index 420b2a7..0000000 --- a/nautilus_nlp/doc.py +++ /dev/null @@ -1,344 +0,0 @@ -# GNU Lesser General Public License v3.0 only -# Copyright (C) 2020 Artefact -# licence-information@artefact.com -# -# This program is free software; you can redistribute it and/or -# modify it under the terms of the GNU Lesser General Public -# License as published by the Free Software Foundation; either -# version 3 of the License, or (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public License -# along with this program; if not, write to the Free Software Foundation, -# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. -import functools -import pkg_resources -import nautilus_nlp -import spacy -import textacy -from collections import Counter -import re -import unicodedata -import spacy -import spacy.matcher -import textacy -import textacy.keyterms -import textacy.text_utils - -class NautilusMissingModelException(Exception): - """Raised when the requested model is missing""" - - pass - - -class Doc: - """ - Create a doc instance of text, obtain cleaned, readable text and - metadata from this doc. - - Properties: - raw: incoming, unedited text - language: 2-letter code for the language of the text - is_detected_language: is the language detected or specified beforehand - is_reliable_language: is the language specified or was it reliably detected - _spacy_nlps: nested dictionary {lang: {model_id: model}} with loaded spacy language modules - """ - - def __init__( - self, - raw, - language=None, - spacy_nlps=None, - langdetect=None, - sentiment_detect=None, - ): - self.raw = raw - self._spacy_nlps = spacy_nlps or dict() - self._language = language - self._is_reliable_language = 1 if language else None - self._language_detector = langdetect - self._sentiment_detector = sentiment_detect - self._text_stats = {} - - @property - def language(self): - """ - Provided or detected language of a text - - >>> from nautilus_nlp.doc import Doc - >>> Doc('Test sentence for testing text').language - 'en' - >>> Doc('Test sentence for testing text', language='en').language - 'en' - >>> Doc('Test', hint_language='nl').language - 'nl' - """ - - if not self._language: - if self._language_detector: - self._language,self._is_reliable_language = self._language_detector.detect_language( - self.clean - ) - else: - raise NautilusMissingModelException( - "You must either provide a language for the document or an instance of LangDetector" - ) - - return self._language - - @property - def _spacy_doc(self): - """ - Loads the default spacy doc or creates one if necessary - - >>> doc = Doc('Test sentence for testing text') - >>> type(doc._spacy_doc) - <class 'spacy.tokens.doc.Doc'> - """ - lang = self.language - - return self._load_spacy_doc(lang) - - def _load_spacy_doc(self, lang, model_name=None): - """ - Loads a spacy doc or creates one if necessary - """ - # Load default spacy model if necessary, if not loaded already - if lang not in self._spacy_nlps or ( - model_name is None and model_name not in self._spacy_nlps[lang] - ): - if lang not in self._spacy_nlps: - self._spacy_nlps[lang] = {} - self._spacy_nlps[lang][None] = self._get_default_nlp(lang) - if model_name not in self._spacy_nlps[lang] and model_name is not None: - raise NautilusMissingModelException( - f"Custom model {model_name} " f"is missing." - ) - nlp = self._spacy_nlps[lang][model_name] - doc = nlp(self.clean_text()) - return doc - - @staticmethod - @functools.lru_cache() - def _get_default_nlp(lang): - """ - Loads the spacy default language module for the Doc's language - """ - try: - if lang!='un': - return spacy.load( - "{}_core_{}_sm".format(lang, "web" if lang == "en" else "news") - ) - else: - return spacy.load('xx_ent_wiki_sm') - except IOError: - raise NautilusMissingModelException( - f'Default model for language "{lang}" is not available. You should try to run python -m spacy download {lang}_core_news_sm' - - ) - - @property - def clean(self): - """ - Cleaned text with sensible defaults. - >>> doc = Doc('“Please clean this piece… of text</b>„') - >>> doc.clean - '"Please clean this piece... of text"' - - Right now this is done here by a simple regex. Next step is to use the preprocessing functions - """ - - return self.clean_text() - - @functools.lru_cache() - def clean_text(self, clean_dots=True, clean_quotes=True, clean_whitespace=True): - """ - Clean text and normalise punctuation. - >>> doc = Doc('“Please clean this piece… of text„') - >>> doc.clean_text(False, False, False, False) == doc.raw - True - """ - text = self.raw - text.replace('\n',' ') - if clean_dots: - text = re.sub(r"…", "...", text) - if clean_quotes: - text = re.sub(r"[`‘’‛⸂⸃⸌⸍⸜⸝]", "'", text) - text = re.sub(r"[„“]|(\'\')|(,,)", '"', text) - if clean_whitespace: - text = re.sub(r"\s+", " ", text).strip() - - return text - - @property - def lemma(self): - - return self.get_lemma() - - @functools.lru_cache() - def get_lemma(self,model_name=None): - - return [token.lemma_ for token in self._load_spacy_doc(self.language, model_name)] - - @property - def entities(self): - """ - A list of the named entities with sensible defaults. - - >>> doc = Doc('Sentence for testing Google text') - >>> doc.entities - [('Google', 'ORG')] - """ - return self.find_entities() - - @functools.lru_cache() - def find_entities(self, model_name=None): - """ - Extract a list of the named entities in text, with the possibility of using a custom model. - - >>> doc = Doc('Sentence for testing Google text') - >>> doc.find_entities() - [('Google', 'ORG')] - """ - - return list( - { - (ent.text, ent.label_) - for ent in self._load_spacy_doc(self.language, model_name).ents - } - ) - - @property - def n_sentences(self): - """ - Extract the number of sentences from text - - >>> doc = Doc('Test sentence for testing text. And another sentence for testing!') - >>> doc.n_sentences - 2 - """ - return len(list(self._spacy_doc.sents)) - - @property - def sentences(self): - """ - Extract the text and character offset (begin) of sentences from text - - >>> doc = Doc('Test sentence for testing text. And another one with, some, punctuation! And stuff.') - >>> doc.sentences - [('Test sentence for testing text.', 0), ('And another one with, some, punctuation!', 32), ('And stuff.', 73)] - """ - - return [(span.text, span.start_char) for span in self._spacy_doc.sents] - - @property - def n_words(self): - """ - Extract the number of words from text - - >>> doc = Doc('Test sentence for testing text') - >>> doc.n_words - 5 - """ - return len(self.words) - - @property - def words(self): - """ - Extract the text and character offset (begin) of words from text - - >>> doc = Doc('Test sentence for testing text.') - >>> doc.words - [('Test', 0), ('sentence', 5), ('for', 14), ('testing', 18), ('text', 26), ('.', 30)] - """ - - return [(token.text, token.idx) for token in self._spacy_doc] - - @property - def word_counts(self): - """ - Extract words with their counts - - >>> doc = Doc('Test sentence for testing vectorisation of a sentence.') - >>> doc.word_counts - {'Test': 1, 'sentence': 2, 'for': 1, 'testing': 1, 'vectorisation': 1, 'of': 1, 'a': 1, '.': 1} - """ - - return dict(Counter(word for word, _ in self.words)) - - @property - def complexity(self): - """ - Determine the complexity of text using the Flesch - reading ease test ranging from 0.0 - 100.0 with 0.0 - being the most difficult to read. - - >>> doc = Doc('Test sentence for testing text') - >>> doc.complexity - 83.32000000000004 - """ - if not self._text_stats: - self._text_stats = textacy.TextStats(self._spacy_doc) - if self._text_stats.n_syllables == 0: - return 100 - return self._text_stats.flesch_reading_ease - - @property - def sentiment(self): - """ - Returns polarity score (-1 to 1) and a subjectivity score (0 to 1) - - >>> doc = Doc('C'est trop cool !.') - >>> doc.sentiment - (0.8, 0.9666666666666667) - """ - - raise NautilusMissingModelException(f"No sentiment model for {self.language}") - - @functools.lru_cache() - def extract_keyterms(self, ranker="textrank", n_terms=10, **kwargs): - """ - Extract and rank key terms in the document by proxying to - `textacy.keyterms`. Returns a list of (term, score) tuples. Depending - on the ranking algorithm used, terms can consist of multiple words. - - Available rankers are TextRank (textrank), SingleRank (singlerank) and - SGRank ('sgrank'). - - >>> doc = Doc('Amsterdam is the awesome capital of the Netherlands.') - >>> doc.extract_keyterms(n_terms=3) - [('awesome', 0.32456160227748454), ('capital', 0.32456160227748454), ('Amsterdam', 0.17543839772251532)] - >>> doc.extract_keyterms(ranker='sgrank') - [('awesome capital', 0.5638711013322963), ('Netherlands', 0.22636566128805719), ('Amsterdam', 0.20976323737964653)] - >>> doc.extract_keyterms(ranker='sgrank', ngrams=(1)) - [('Netherlands', 0.4020557546031188), ('capital', 0.29395103364295216), ('awesome', 0.18105611227666252), ('Amsterdam', 0.12293709947726655)] - """ - if self.n_words < 1: - return [] - rankers = ["textrank", "sgrank", "singlerank"] - if ranker not in rankers: - raise ValueError( - f'ranker "{ranker}" not available; use one ' f"of {rankers}" - ) - ranking_fn = getattr(textacy.keyterms, ranker) - return ranking_fn(self._spacy_doc, n_keyterms=n_terms, **kwargs) - - @property - def keyterms(self): - """ - Return textranked keyterms for the document. - - >>> doc = Doc('Amsterdam is the awesome capital of the Netherlands.') - >>> doc.extract_keyterms(n_terms=3) - [('awesome', 0.32456160227748454), ('capital', 0.32456160227748454), ('Amsterdam', 0.17543839772251532)] - """ - return self.extract_keyterms() - - @functools.lru_cache() - def extract_keywords(self,keyword_list:list): - from flashtext import KeywordProcessor - return KeywordProcessor().add_keywords_from_list(keyword_list).extract_keywords(self.raw) diff --git a/nautilus_nlp/scripts/download_ft_langdetect.sh b/nautilus_nlp/scripts/download_ft_langdetect.sh deleted file mode 100644 index 300dc9a..0000000 --- a/nautilus_nlp/scripts/download_ft_langdetect.sh +++ /dev/null @@ -1,19 +0,0 @@ -# GNU Lesser General Public License v3.0 only -# Copyright (C) 2020 Artefact -# licence-information@artefact.com -# -# This program is free software; you can redistribute it and/or -# modify it under the terms of the GNU Lesser General Public -# License as published by the Free Software Foundation; either -# version 3 of the License, or (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public License -# along with this program; if not, write to the Free Software Foundation, -# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. -wget https://dl.fbaipublicfiles.com/fasttext/supervised-models/lid.176.ftz -cp lid.176.ftz data/ \ No newline at end of file diff --git a/nautilus_nlp/scripts/download_spacy_models.sh b/nautilus_nlp/scripts/download_spacy_models.sh deleted file mode 100644 index cd84284..0000000 --- a/nautilus_nlp/scripts/download_spacy_models.sh +++ /dev/null @@ -1,22 +0,0 @@ -# GNU Lesser General Public License v3.0 only -# Copyright (C) 2020 Artefact -# licence-information@artefact.com -# -# This program is free software; you can redistribute it and/or -# modify it under the terms of the GNU Lesser General Public -# License as published by the Free Software Foundation; either -# version 3 of the License, or (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public License -# along with this program; if not, write to the Free Software Foundation, -# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. -python -m spacy download en_core_web_sm -python -m spacy download de_core_news_sm -python -m spacy download fr_core_news_sm -python -m spacy download es_core_news_sm -python -m spacy download nl_core_news_sm diff --git a/nautilus_nlp/scripts/init_langmodel.sh b/nautilus_nlp/scripts/init_langmodel.sh deleted file mode 100644 index 2bf0b48..0000000 --- a/nautilus_nlp/scripts/init_langmodel.sh +++ /dev/null @@ -1,27 +0,0 @@ -# GNU Lesser General Public License v3.0 only -# Copyright (C) 2020 Artefact -# licence-information@artefact.com -# -# This program is free software; you can redistribute it and/or -# modify it under the terms of the GNU Lesser General Public -# License as published by the Free Software Foundation; either -# version 3 of the License, or (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public License -# along with this program; if not, write to the Free Software Foundation, -# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. -#!/bin/bash - -echo 'Which Language do you want to use: en/fr?' -read lang -echo "Now downloading spacy models for language $lang" -python -m spacy download $lang -python -m spacy download xx - -wget https://dl.fbaipublicfiles.com/fasttext/vectors-crawl/cc.$lang.300.bin.gz -cp cc.$lang.300.bin.gz data/ && gunzip data/cc.$lang.300.bin.gz diff --git a/nautilus_nlp/scripts/install_fasttext.sh b/nautilus_nlp/scripts/install_fasttext.sh deleted file mode 100644 index c5dc339..0000000 --- a/nautilus_nlp/scripts/install_fasttext.sh +++ /dev/null @@ -1,20 +0,0 @@ -# GNU Lesser General Public License v3.0 only -# Copyright (C) 2020 Artefact -# licence-information@artefact.com -# -# This program is free software; you can redistribute it and/or -# modify it under the terms of the GNU Lesser General Public -# License as published by the Free Software Foundation; either -# version 3 of the License, or (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public License -# along with this program; if not, write to the Free Software Foundation, -# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. -#!/bin/bash -wget https://github.com/facebookresearch/fastText/archive/v0.2.0.zip && unzip v0.2.0.zip && cd fastText-0.2.0 && make -git clone https://github.com/facebookresearch/fastText.git && cd fastText && pip install . \ No newline at end of file diff --git a/nautilus_nlp/scripts/install_java.sh b/nautilus_nlp/scripts/install_java.sh deleted file mode 100644 index 8c894d2..0000000 --- a/nautilus_nlp/scripts/install_java.sh +++ /dev/null @@ -1,21 +0,0 @@ -# GNU Lesser General Public License v3.0 only -# Copyright (C) 2020 Artefact -# licence-information@artefact.com -# -# This program is free software; you can redistribute it and/or -# modify it under the terms of the GNU Lesser General Public -# License as published by the Free Software Foundation; either -# version 3 of the License, or (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public License -# along with this program; if not, write to the Free Software Foundation, -# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. -sudo add-apt-repository ppa:openjdk-r/ppa # only Ubuntu 17.4 and earlier -sudo apt update -apt search openjdk -sudo apt install openjdk-8-jdk \ No newline at end of file diff --git a/nautilus_nlp/scripts/install_mallet.sh b/nautilus_nlp/scripts/install_mallet.sh deleted file mode 100644 index 51ff9f7..0000000 --- a/nautilus_nlp/scripts/install_mallet.sh +++ /dev/null @@ -1,21 +0,0 @@ -# GNU Lesser General Public License v3.0 only -# Copyright (C) 2020 Artefact -# licence-information@artefact.com -# -# This program is free software; you can redistribute it and/or -# modify it under the terms of the GNU Lesser General Public -# License as published by the Free Software Foundation; either -# version 3 of the License, or (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public License -# along with this program; if not, write to the Free Software Foundation, -# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. -#!/bin/bash -wget http://mallet.cs.umass.edu/dist/mallet-2.0.8.zip -unzip mallet-2.0.8.zip -rm mallet-2.0.8.zip \ No newline at end of file diff --git a/reports/.gitkeep b/reports/.gitkeep deleted file mode 100644 index e69de29..0000000 diff --git a/reports/figures/.gitkeep b/reports/figures/.gitkeep deleted file mode 100644 index e69de29..0000000 diff --git a/tests/test_doc.py b/tests/test_doc.py deleted file mode 100644 index 75e9dcc..0000000 --- a/tests/test_doc.py +++ /dev/null @@ -1,161 +0,0 @@ -# GNU Lesser General Public License v3.0 only -# Copyright (C) 2020 Artefact -# licence-information@artefact.com -# -# This program is free software; you can redistribute it and/or -# modify it under the terms of the GNU Lesser General Public -# License as published by the Free Software Foundation; either -# version 3 of the License, or (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public License -# along with this program; if not, write to the Free Software Foundation, -# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. -""" -Testing for textpipe doc.py -""" -import pytest -import random -import spacy -from nautilus_nlp.models.language_detector import LangDetector -from nautilus_nlp.doc import Doc, NautilusMissingModelException - -TEXT_1 = """ -Google was founded in 1998 by Larry Page and Sergey Brin while they were Ph.D. students at Stanford University in California. Together they own about 14 percent of its shares and control 56 percent of the stockholder voting power through supervoting stock. They incorporated Google as a privately held company on September 4, 1998. An initial public offering (IPO) took place on August 19, 2004, and Google moved to its headquarters in Mountain View, California, nicknamed the Googleplex. In August 2015, Google announced plans to reorganize its various interests as a conglomerate called Alphabet Inc. Google is Alphabet's leading subsidiary and will continue to be the umbrella company for Alphabet's Internet interests. Sundar Pichai was appointed CEO of Google, replacing Larry Page who became the CEO of Alphabet. -""" - -TEXT_2 = """Les moteurs de recherche tels Google, Exalead ou Yahoo! sont des applications très connues de fouille de textes sur de grandes masses de données. - Cependant, les moteurs de recherche ne se basent pas uniquement sur le texte pour l'indexer, - mais également sur la façon dont les pages sont mises en valeur les unes par rapport aux autres. - L'algorithme utilisé par Google est PageRank, et il est courant de voir HITS dans le milieu académique -""" - -TEXT_3 = "" - -TEXT_4 = """this is a paragraph -this is a paragraph -""" - -TEXT_5 = """Mark Zuckerberg is sinds de oprichting van Facebook de directeur van het bedrijf.""" - -TEXT_6 = """ -မြန်မာဘာသာစကားသည် တိဘက်-ဗမာနွယ် ဘာသာစကားများ အုပ်စုတွင် ပါဝင်သည်။ -တိဘက်-ဗမာနွယ် ဘာသာစကားများ အုပ်စုသည် တရုတ်-တိဗက်နွယ် ဘာသာစကားများ -မိသားစု ထဲတွင် ပါသည်။ မြန်မာဘာသာသည် တက်ကျသံရှိသော -၊နိမ့်မြင့်အမှတ်အသားရှိ ဖြစ်သော၊ ဧကဝဏ္ဏစကားလုံး အလွန်များသော ဘာသာစကား -ဖြစ်သည်။ ကတ္တား-ကံ-တြိယာ စကားလုံးအစီအစဉ်ဖြင့် ရေးသော သရုပ်ခွဲဘာသာစကား -လည်းဖြစ်သည်။ မြန်မာအက္ခရာများသည် ဗြာဟ္မီအက္ခရာ သို့မဟုတ် ဗြာဟ္မီအက္ခရာမှ -ဆက်ခံထားသောမွန်အက္ခရာတို့မှ ဆင်းသက်လာသည်။ -""" - -TEXT_7 = """\nHi <<First Name>>\nthis is filler text \xa325 more filler.\nadditilnal -filler.\nyet more\xa0still more\xa0filler.\n\xa0\nmore\nfiller.\x03\n\t\t\t\t\t\t -almost there \n\\n\nthe end\n""" - -ents_model = spacy.blank("nl") -custom_spacy_nlps = {"nl": {"ents": ents_model}} -detector = LangDetector() - -DOC_1 = Doc(TEXT_1, language="en") -DOC_2 = Doc(TEXT_2, language="fr") -DOC_4 = Doc(TEXT_4, "en") -DOC_5 = Doc(TEXT_5, language="nl", spacy_nlps=custom_spacy_nlps) -DOC_6 = Doc(TEXT_6, langdetect=detector) -DOC_7 = Doc(TEXT_7, "en") - - -def test_load_custom_model(): - """ - The custom spacy language modules should be correctly loaded into the doc. - """ - model_mapping = {"nl": "ents"} - lang = DOC_5.language - assert lang == "nl" - assert sorted(DOC_5.find_entities()) == sorted( - [("Mark Zuckerberg", "PER"), ("Facebook", "PER")] - ) - assert DOC_5.find_entities(model_mapping[lang]) == [] - - -def test_nwords_nsents(): - assert DOC_1.n_words == 145 - assert DOC_2.n_words == 83 - assert DOC_1.n_sentences == 7 - assert DOC_2.n_sentences == 3 - - -def test_entities(): - assert sorted(DOC_1.entities) == sorted( - [ - ("1998", "DATE"), - ("56 percent", "PERCENT"), - ("Alphabet", "GPE"), - ("Alphabet", "ORG"), - ("Alphabet Inc. Google", "ORG"), - ("August 19, 2004", "DATE"), - ("August 2015", "DATE"), - ("California", "GPE"), - ("Google", "ORG"), - ("Googleplex", "ORG"), - ("IPO", "ORG"), - ("Larry Page", "PERSON"), - ("Mountain View", "GPE"), - ("Ph.D.", "PERSON"), - ("September 4, 1998", "DATE"), - ("Sergey Brin", "PERSON"), - ("Stanford University", "ORG"), - ("Sundar Pichai", "PERSON"), - ("about 14 percent", "PERCENT"), - ] - ) - assert sorted(DOC_2.entities) == sorted( - [ - ("Exalead", "ORG"), - ("Google", "ORG"), - ("HITS", "MISC"), - ("PageRank", "MISC"), - ("Yahoo!", "ORG"), - ] - ) - - -def test_complexity(): - assert DOC_1.complexity == 48.06961538461539 - assert DOC_2.complexity == 78.634_035_087_719_3 - - -def test_clean(): - assert len(TEXT_1) >= len(DOC_1.clean) - assert len(TEXT_2) >= len(DOC_2.clean) - - -def test_clean_newlines(): - assert " ".join(TEXT_4.split()) == DOC_4.clean - - -def test_extract_keyterms(): - non_ranker = "bulthaup" - rankers = ["textrank", "sgrank", "singlerank"] - with pytest.raises( - ValueError, - message=f'algorithm "{non_ranker}" not ' f"available; use one of {rankers}", - ): - DOC_1.extract_keyterms(ranker=non_ranker) - assert len(DOC_1.extract_keyterms()) == 10 - # limits number of keyterms - assert len(DOC_1.extract_keyterms(n_terms=2)) == 2 - # works with other rankers - assert isinstance(DOC_2.extract_keyterms(ranker=random.choice(rankers)), list) - - -def test_missing_language_model(): - with pytest.raises(NautilusMissingModelException): - DOC_6.n_words - - -def test_non_utf_chars(): - assert DOC_7.language == "en" diff --git a/tests/test_extraction.py b/tests/test_extraction.py deleted file mode 100644 index f2a1a74..0000000 --- a/tests/test_extraction.py +++ /dev/null @@ -1,33 +0,0 @@ -# GNU Lesser General Public License v3.0 only -# Copyright (C) 2020 Artefact -# licence-information@artefact.com -# -# This program is free software; you can redistribute it and/or -# modify it under the terms of the GNU Lesser General Public -# License as published by the Free Software Foundation; either -# version 3 of the License, or (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public License -# along with this program; if not, write to the Free Software Foundation, -# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. -from nautilus_nlp.preprocessing.keyword_extractor import extract_keywords - -str_="""Les moteurs de recherche tels Google, Exalead ou Yahoo! sont - des applications très connues de fouille de textes sur de grandes masses de données. - Cependant, les moteurs de recherche ne se basent pas uniquement sur le texte pour l'indexer, mais également sur la façon - dont les pages sont mises en valeur les unes par rapport aux autres. L'algorithme utilisé par Google est PageRank, et il est courant de voir HITS - dans le milieu académique""" - -dict_extract={"US_Companies":['Yahoo','Google'], - "French_Companies":['Exalead'] -} -def test_keyword_extraction(): - assert extract_keywords(str_,['Google'])==['Google','Google'] - assert extract_keywords(str_,'Google')==['Google','Google'] - assert extract_keywords(str_,['Google','Yahoo'])==['Google','Yahoo','Google'] - assert extract_keywords(str_,dict_extract) == ['US_Companies', 'French_Companies', 'US_Companies', 'US_Companies'] diff --git a/tests/test_fix_bad_encoding.py b/tests/test_fix_bad_encoding.py index 097a2e2..ad44230 100644 --- a/tests/test_fix_bad_encoding.py +++ b/tests/test_fix_bad_encoding.py @@ -18,7 +18,7 @@ import pytest import numpy as np -from nautilus_nlp.preprocessing.preprocess import fix_bad_unicode +from nautilus_nlp.preprocessing.main_preprocess import fix_bad_unicode diff --git a/tests/test_lemmatization.py b/tests/test_lemmatization.py deleted file mode 100644 index c23667f..0000000 --- a/tests/test_lemmatization.py +++ /dev/null @@ -1,39 +0,0 @@ -# GNU Lesser General Public License v3.0 only -# Copyright (C) 2020 Artefact -# licence-information@artefact.com -# -# This program is free software; you can redistribute it and/or -# modify it under the terms of the GNU Lesser General Public -# License as published by the Free Software Foundation; either -# version 3 of the License, or (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public License -# along with this program; if not, write to the Free Software Foundation, -# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. -import pytest -from nautilus_nlp.preprocessing.lemmatization import lemmatize_french_tokens, lemmatize_english_tokens - -def test_lemmatize_french_tokens_spacy(): - input_tokens = ['Ceci', 'est', 'un', 'texte', 'français', ',', "j'", 'adore', 'tes', 'frites', 'bien', 'grasses', 'YOLO', '!'] - expected = ['ceci', 'être', 'un', 'texte', 'français', ',', 'j', "'", 'adorer', 'ton', 'frit', 'bien', 'gras', 'yolo', '!'] - res = lemmatize_french_tokens(input_tokens, module='spacy') - assert res == expected - - -def test_lemmatize_english_tokens_spacy(): - input_tokens = ['The', 'strip', 'bats', 'are', 'hanging', 'on', 'their', 'feet', 'for', 'best'] - expected = ['the', 'strip', 'bat', 'be', 'hang', 'on', '-PRON-', 'foot', 'for', 'good'] - res = lemmatize_english_tokens(input_tokens, module='spacy') - assert res == expected - - -def test_lemmatize_english_tokens_nltk(): - input_tokens = ['The', 'striped', 'bats', 'are', 'hanging', 'on', 'their', 'feet', 'for', 'best'] - expected = ['The', 'strip', 'bat', 'be', 'hang', 'on', 'their', 'foot', 'for', 'best'] - res = lemmatize_english_tokens(input_tokens, module='nltk') - assert res == expected \ No newline at end of file diff --git a/tests/test_ngrams_analysis.py b/tests/test_ngrams_analysis.py deleted file mode 100644 index f20ff5d..0000000 --- a/tests/test_ngrams_analysis.py +++ /dev/null @@ -1,38 +0,0 @@ -# GNU Lesser General Public License v3.0 only -# Copyright (C) 2020 Artefact -# licence-information@artefact.com -# -# This program is free software; you can redistribute it and/or -# modify it under the terms of the GNU Lesser General Public -# License as published by the Free Software Foundation; either -# version 3 of the License, or (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public License -# along with this program; if not, write to the Free Software Foundation, -# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. -from nautilus_nlp.utils.ngrams_analysis import frequent_words -import pytest - - -def test_frequent_words(): - list_words = ['Hello', 'world', 'this', 'is', 'an', 'example', 'of', 'ngrams', 'count', 'an', 'example', - 'to', 'test', 'this', 'is', 'an', 'example', 'function', 'hello', 'world'] - - res_1 = frequent_words(list_words, ngrams_number=1, number_top_words=10) - res_2 = frequent_words(list_words, ngrams_number=2, number_top_words=3) - res_3 = frequent_words(list_words, ngrams_number=3, number_top_words=5) - - exp_res_1 = [('an', 3), ('example', 3), ('world', 2), ('this', 2), ('is', 2), - ('Hello', 1), ('of', 1), ('ngrams', 1), ('count', 1), ('to', 1)] - exp_res_2 = [('an example', 3), ('this is', 2), ('is an', 2)] - exp_res_3 = [('this is an', 2), ('is an example', 2), ('Hello world this', 1), - ('world this is', 1), ('an example of', 1)] - - assert res_1 == exp_res_1 - assert res_2 == exp_res_2 - assert res_3 == exp_res_3 diff --git a/tests/test_preprocessor.py b/tests/test_preprocessor.py index 03ebba8..aa1ddea 100644 --- a/tests/test_preprocessor.py +++ b/tests/test_preprocessor.py @@ -17,13 +17,27 @@ # Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. import pytest import numpy as np -from nautilus_nlp.preprocessing.preprocess import ( +from nautilus_nlp.preprocessing.additional_preprocess import ( remove_multiple_spaces_and_strip_text, + remove_tokens_with_nonletters, + remove_special_caracters_from_tokenslist, + filter_non_latin_characters, + remove_smallwords +) +from nautilus_nlp.preprocessing.social_preprocess import ( + remove_emoji, + convert_emoji_to_text, + extract_emojis, + remove_mentions, + extract_mentions, + remove_html_tags, + extract_hashtags, + remove_hashtag +) +from nautilus_nlp.preprocessing.main_preprocess import ( remove_accents, fix_bad_unicode, remove_EOL_characters, - remove_tokens_with_nonletters, - remove_special_caracters_from_tokenslist, get_stopwords, remove_stopwords, normalize_whitespace, @@ -34,16 +48,6 @@ replace_numbers, replace_currency_symbols, remove_punct, - remove_emoji, - convert_emoji_to_text, - extract_emojis, - remove_mentions, - extract_mentions, - remove_html_tags, - remove_smallwords, - extract_hashtags, - remove_hashtag, - filter_non_latin_characters ) import nautilus_nlp.utils.phone_number as phone diff --git a/tests/test_stemming.py b/tests/test_stemming.py deleted file mode 100644 index 731bc14..0000000 --- a/tests/test_stemming.py +++ /dev/null @@ -1,33 +0,0 @@ -# GNU Lesser General Public License v3.0 only -# Copyright (C) 2020 Artefact -# licence-information@artefact.com -# -# This program is free software; you can redistribute it and/or -# modify it under the terms of the GNU Lesser General Public -# License as published by the Free Software Foundation; either -# version 3 of the License, or (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public License -# along with this program; if not, write to the Free Software Foundation, -# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. -import pytest -from nautilus_nlp.preprocessing.stemming import stem_tokens - -def test_stem_en(): - input_tokens = ['I','survived','these', 'dogs'] - expected = ['i', 'surviv', 'these', 'dog'] - res = stem_tokens(input_tokens, lang='english') - assert res == expected - -def test_stem_fr(): - input_tokens = ['je', 'mangerai', 'dans', 'les', 'cuisines', 'du', 'château'] - expected = ['je', 'mang', 'dan', 'le', 'cuisin', 'du', 'château'] - res = stem_tokens(input_tokens, lang='french') - assert res == expected - - \ No newline at end of file diff --git a/tests/test_text_summary.py b/tests/test_text_summary.py deleted file mode 100644 index 954fef6..0000000 --- a/tests/test_text_summary.py +++ /dev/null @@ -1,44 +0,0 @@ -# GNU Lesser General Public License v3.0 only -# Copyright (C) 2020 Artefact -# licence-information@artefact.com -# -# This program is free software; you can redistribute it and/or -# modify it under the terms of the GNU Lesser General Public -# License as published by the Free Software Foundation; either -# version 3 of the License, or (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public License -# along with this program; if not, write to the Free Software Foundation, -# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. -from nautilus_nlp.utils.text_summary import summarize_text - -case1 = """Automatic summarization is the process of reducing a text document with a \ -computer program in order to create a summary that retains the most important points \ -of the original document. As the problem of information overload has grown, and as \ -the quantity of data has increased, so has interest in automatic summarization. \ -Technologies that can make a coherent summary take into account variables such as \ -length, writing style and syntax. An example of the use of summarization technology \ -is search engines such as Google. Document summarization is another.""" - -case2 = ["Automatic summarization is the process of reducing a text document with a " \ -"computer program in order to create a summary that retains the most important points " \ -"of the original document. ", "As the problem of information overload has grown, and as" \ -"the quantity of data has increased, so has interest in automatic summarization. "\ -"Technologies that can make a coherent summary take into account variables such as "\ -"length, writing style and syntax." ,"An example of the use of summarization technology "\ -"is search engines such as Google.", "Document summarization is another."] - -result = """Automatic summarization is the process of reducing a text document with a computer \ -program in order to create a summary that retains the most important points of the original document.""" - - -def test_summarize_text(): - # Single string containing all text - assert summarize_text(case1) == result - # Text split in many sentences (list of strings) - assert summarize_text(case2) == result diff --git a/tests/test_tokenizer.py b/tests/test_tokenizer.py deleted file mode 100644 index a156529..0000000 --- a/tests/test_tokenizer.py +++ /dev/null @@ -1,63 +0,0 @@ -# GNU Lesser General Public License v3.0 only -# Copyright (C) 2020 Artefact -# licence-information@artefact.com -# -# This program is free software; you can redistribute it and/or -# modify it under the terms of the GNU Lesser General Public -# License as published by the Free Software Foundation; either -# version 3 of the License, or (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public License -# along with this program; if not, write to the Free Software Foundation, -# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. -import pytest -from nautilus_nlp.preprocessing.tokenizer import tokenize, untokenize - - -def test_tokenize_fr_spacy(): - input_str = """Les moteurs de recherche tels Google, Exalead ou Yahoo! sont des applications très connues de fouille de textes sur de grandes masses de données. Cependant, les moteurs de recherche ne se basent pas uniquement sur le texte pour l'indexer, mais également sur la façon dont les pages sont mises en valeur les unes par rapport aux autres. L'algorithme utilisé par Google est PageRank, et il est courant de voir HITS dans le milieu académique""" - expected = ['Les', 'moteurs', 'de', 'recherche', 'tels', 'Google', ',', 'Exalead', 'ou', 'Yahoo', '!', 'sont', 'des', 'applications', 'très', 'connues', 'de', 'fouille', 'de', 'textes', 'sur', 'de', 'grandes', 'masses', 'de', 'données', '.', 'Cependant', ',', 'les', 'moteurs', 'de', 'recherche', 'ne', 'se', 'basent', 'pas', 'uniquement', 'sur', 'le', 'texte', 'pour', "l'", 'indexer', ',', 'mais', 'également', 'sur', 'la', 'façon', 'dont', 'les', 'pages', 'sont', 'mises', 'en', 'valeur', 'les', 'unes', 'par', 'rapport', 'aux', 'autres', '.', "L'", 'algorithme', 'utilisé', 'par', 'Google', 'est', 'PageRank', ',', 'et', 'il', 'est', 'courant', 'de', 'voir', 'HITS', 'dans', 'le', 'milieu', 'académique'] - res = tokenize(input_str, lang_module="fr_spacy") - assert res == expected - - -def test_tokenize_fr_moses(): - input_str = """Les moteurs de recherche tels Google, Exalead ou Yahoo! sont des applications très connues de fouille de textes sur de grandes masses de données. Cependant, les moteurs de recherche ne se basent pas uniquement sur le texte pour l'indexer, mais également sur la façon dont les pages sont mises en valeur les unes par rapport aux autres. L'algorithme utilisé par Google est PageRank, et il est courant de voir HITS dans le milieu académique""" - expected = ['Les', 'moteurs', 'de', 'recherche', 'tels', 'Google', ',', 'Exalead', 'ou', 'Yahoo', '!', 'sont', 'des', 'applications', 'très', 'connues', 'de', 'fouille', 'de', 'textes', 'sur', 'de', 'grandes', 'masses', 'de', 'données', '.', 'Cependant', ',', 'les', 'moteurs', 'de', 'recherche', 'ne', 'se', 'basent', 'pas', 'uniquement', 'sur', 'le', 'texte', 'pour', "l'", 'indexer', ',', 'mais', 'également', 'sur', 'la', 'façon', 'dont', 'les', 'pages', 'sont', 'mises', 'en', 'valeur', 'les', 'unes', 'par', 'rapport', 'aux', 'autres', '.', "L'", 'algorithme', 'utilisé', 'par', 'Google', 'est', 'PageRank', ',', 'et', 'il', 'est', 'courant', 'de', 'voir', 'HITS', 'dans', 'le', 'milieu', 'académique'] - res = tokenize(input_str, lang_module="fr_moses") - assert res == expected - -def test_tokenize_null_input(): - input_str = '' - expected = [] - res = tokenize(input_str, lang_module="en_spacy") - assert res == expected - -def test_tokenize_en_spacy(): - input_str = "Let's play together!" - expected = ['Let', "'s", 'play', 'together', '!'] - res = tokenize(input_str, lang_module="en_spacy") - assert res == expected - -def test_tokenize_en_nltk(): - input_str = "Let's play together!" - expected = ['Let', "'s", 'play', 'together', '!'] - res = tokenize(input_str, lang_module="en_nltk") - assert res == expected - -def test_untokenize_en(): - input_str = ['Let', "'s", 'play', 'together', '!'] - expected = "Let's play together!" - res = untokenize(input_str,lang='en') - assert res == expected - -def test_untokenize_fr(): - input_str = ['Les', 'moteurs', 'de', 'recherche', 'tels', 'Google', ',', 'Exalead', 'ou', 'Yahoo', '!'] - expected = "Les moteurs de recherche tels Google, Exalead ou Yahoo !" - res = untokenize(input_str,lang='fr') - assert res == expected \ No newline at end of file From ad7e0afcce2178e97b88cedd1f5be5993f392249 Mon Sep 17 00:00:00 2001 From: Bruce DELATTRE <bruce.delattre@FRART0231M.local> Date: Wed, 25 Mar 2020 13:15:12 +0100 Subject: [PATCH 251/496] Fix/ Trying to fix tests --- .travis.yml | 7 +++++++ nautilus_nlp/preprocessing/main_preprocess.py | 2 +- nautilus_nlp/preprocessing/social_preprocess.py | 2 +- 3 files changed, 9 insertions(+), 2 deletions(-) diff --git a/.travis.yml b/.travis.yml index 907e302..0304bca 100644 --- a/.travis.yml +++ b/.travis.yml @@ -21,6 +21,13 @@ os: - linux services: - docker + +before_script: + - wget https://github.com/facebookresearch/fastText/archive/v0.2.0.zip && unzip v0.2.0.zip && cd fastText-0.2.0 && make && pip install . && cd .. + - python3 -m spacy download fr && python3 -m spacy download en && python3 -m spacy download de && python3 -m spacy download nl && python3 -m spacy download it && python3 -m spacy download xx && python3 -m spacy validate + + - wget http://mallet.cs.umass.edu/dist/mallet-2.0.8.zip && unzip mallet-2.0.8.zip && rm mallet-2.0.8.zip + - sudo add-apt-repository -y ppa:openjdk-r/ppa && sudo apt update && apt search openjdk && sudo apt install openjdk-8-jdk install: - pip install -r requirements.txt diff --git a/nautilus_nlp/preprocessing/main_preprocess.py b/nautilus_nlp/preprocessing/main_preprocess.py index d91c4a2..60d0303 100644 --- a/nautilus_nlp/preprocessing/main_preprocess.py +++ b/nautilus_nlp/preprocessing/main_preprocess.py @@ -23,7 +23,7 @@ import unicodedata from ftfy import fix_text as _fix_text -from nautilus_nlp.utils.stopwords_utils import get_stopwords +from nautilus_nlp.utils.stopwords import get_stopwords from nautilus_nlp.utils.phone_number import extract_phone_numbers as _extract_phone_numbers from nautilus_nlp.utils import constants diff --git a/nautilus_nlp/preprocessing/social_preprocess.py b/nautilus_nlp/preprocessing/social_preprocess.py index a88fad2..4984e1b 100644 --- a/nautilus_nlp/preprocessing/social_preprocess.py +++ b/nautilus_nlp/preprocessing/social_preprocess.py @@ -22,7 +22,7 @@ import re import emoji as _emoji -from nautilus_nlp.utils.preprocess import normalize_whitespace +from nautilus_nlp.preprocessing.main_preprocess import normalize_whitespace def remove_mentions(text:str) -> str: From 5289b2554ec04d7596708f899393d041e0298cd8 Mon Sep 17 00:00:00 2001 From: Bruce DELATTRE <bruce.delattre@FRART0231M.local> Date: Wed, 25 Mar 2020 13:21:58 +0100 Subject: [PATCH 252/496] Updating import in language detection --- nautilus_nlp/models/language_detector.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/nautilus_nlp/models/language_detector.py b/nautilus_nlp/models/language_detector.py index 74eb3fc..255347b 100644 --- a/nautilus_nlp/models/language_detector.py +++ b/nautilus_nlp/models/language_detector.py @@ -16,7 +16,7 @@ # along with this program; if not, write to the Free Software Foundation, # Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. from nautilus_nlp.models.fasttext_classifier import Fasttext_clf as langdetect -from nautilus_nlp.preprocessing.preprocess import remove_EOL_characters +from nautilus_nlp.preprocessing.main_preprocess import remove_EOL_characters import pkg_resources lang_path = pkg_resources.resource_filename( From ad51b1eb50711b844a180af891f317e6c9cd54ab Mon Sep 17 00:00:00 2001 From: Amale EL HAMRI <amale.elhamri@artefact.com> Date: Thu, 7 May 2020 12:51:44 +0200 Subject: [PATCH 253/496] compiling latin regex outside --- nautilus_nlp/preprocessing/additional_preprocess.py | 11 +++++++---- nautilus_nlp/utils/constants.py | 3 ++- 2 files changed, 9 insertions(+), 5 deletions(-) diff --git a/nautilus_nlp/preprocessing/additional_preprocess.py b/nautilus_nlp/preprocessing/additional_preprocess.py index 5ec89d5..98d12eb 100644 --- a/nautilus_nlp/preprocessing/additional_preprocess.py +++ b/nautilus_nlp/preprocessing/additional_preprocess.py @@ -20,7 +20,9 @@ from __future__ import absolute_import, division, print_function, unicode_literals import re -import regex +from nautilus_nlp.utils import constants +from nautilus_nlp.preprocessing.main_preprocess import normalize_whitespace + def remove_multiple_spaces_and_strip_text(text: str) -> str: """ @@ -93,8 +95,9 @@ def filter_non_latin_characters(text:str) -> str: ------- string """ - text = regex.sub(r'[^\p{Latin}1-9]', ' ', text).strip() - return re.sub(' +', ' ', text) + text = constants.LATIN_CHARACTERS_RE.sub(' ', text) + #text = regex.sub(r'[^\p{Latin}1-9]', ' ', text).strip() + return normalize_whitespace(text) def remove_smallwords(tokens_list:list, smallwords_threshold:int) -> list: @@ -114,4 +117,4 @@ def remove_smallwords(tokens_list:list, smallwords_threshold:int) -> list: list """ result = [word for word in tokens_list if len(word) > smallwords_threshold] - return result \ No newline at end of file + return result diff --git a/nautilus_nlp/utils/constants.py b/nautilus_nlp/utils/constants.py index e98cce9..80e4cfa 100644 --- a/nautilus_nlp/utils/constants.py +++ b/nautilus_nlp/utils/constants.py @@ -23,6 +23,7 @@ import os import re +import regex import sys import unicodedata @@ -33,7 +34,6 @@ - NUMERIC_NE_TYPES = { "ORDINAL", "CARDINAL", @@ -213,3 +213,4 @@ NEG_DIGIT_TERM_RE = re.compile(r"(-) (\d)", flags=re.UNICODE) WEIRD_HYPHEN_SPACE_TERM_RE = re.compile(r"(?<=[^\W\d]) (-[^\W\d])", flags=re.UNICODE) WEIRD_APOSTR_SPACE_TERM_RE = re.compile(r"([^\W\d]+) ('[a-z]{1,2}\b)", flags=re.UNICODE) +LATIN_CHARACTERS_RE = regex.compile(r'[^\p{Latin}1-9]') From a4c955696890679ee5b9b3f88c2a421cb6aea4be Mon Sep 17 00:00:00 2001 From: Amale EL HAMRI <amale.elhamri@artefact.com> Date: Thu, 7 May 2020 13:32:24 +0200 Subject: [PATCH 254/496] removing useless comment --- nautilus_nlp/preprocessing/additional_preprocess.py | 1 - 1 file changed, 1 deletion(-) diff --git a/nautilus_nlp/preprocessing/additional_preprocess.py b/nautilus_nlp/preprocessing/additional_preprocess.py index 98d12eb..2d4b403 100644 --- a/nautilus_nlp/preprocessing/additional_preprocess.py +++ b/nautilus_nlp/preprocessing/additional_preprocess.py @@ -96,7 +96,6 @@ def filter_non_latin_characters(text:str) -> str: string """ text = constants.LATIN_CHARACTERS_RE.sub(' ', text) - #text = regex.sub(r'[^\p{Latin}1-9]', ' ', text).strip() return normalize_whitespace(text) From d70817b6c6da4bacdc5fdd060a967c0c58c2873b Mon Sep 17 00:00:00 2001 From: Amale EL HAMRI <amale.elhamri@artefact.com> Date: Thu, 7 May 2020 13:38:17 +0200 Subject: [PATCH 255/496] compiling all contractions regex in constants file --- nautilus_nlp/preprocessing/main_preprocess.py | 26 +++++++------------ nautilus_nlp/utils/constants.py | 13 ++++++++++ 2 files changed, 23 insertions(+), 16 deletions(-) diff --git a/nautilus_nlp/preprocessing/main_preprocess.py b/nautilus_nlp/preprocessing/main_preprocess.py index 60d0303..ddf4a21 100644 --- a/nautilus_nlp/preprocessing/main_preprocess.py +++ b/nautilus_nlp/preprocessing/main_preprocess.py @@ -245,31 +245,25 @@ def unpack_english_contractions(text:str) -> str: ------- string """ - - # standard - text = re.sub( - r"(\b)([Aa]re|[Cc]ould|[Dd]id|[Dd]oes|[Dd]o|[Hh]ad|[Hh]as|[Hh]ave|[Ii]s|[Mm]ight|[Mm]ust|[Ss]hould|[Ww]ere|[Ww]ould)n't", + text = constants.CONTRACTION_NT_NOT.sub( r"\1\2 not", text, ) - text = re.sub( - r"(\b)([Hh]e|[Ii]|[Ss]he|[Tt]hey|[Ww]e|[Ww]hat|[Ww]ho|[Yy]ou)'ll", + text = constants.CONTRACTION_LL_WILL.sub( r"\1\2 will", text, ) - text = re.sub(r"(\b)([Tt]hey|[Ww]e|[Ww]hat|[Ww]ho|[Yy]ou)'re", r"\1\2 are", text) - text = re.sub( - r"(\b)([Ii]|[Ss]hould|[Tt]hey|[Ww]e|[Ww]hat|[Ww]ho|[Ww]ould|[Yy]ou)'ve", + text = constants.CONTRACTION_RE_ARE.sub(r"\1\2 are", text) + text = constants.CONTRACTION_VE_HAVE.sub( r"\1\2 have", text, ) - # non-standard - text = re.sub(r"(\b)([Cc]a)n't", r"\1\2n not", text) - text = re.sub(r"(\b)([Ii])'m", r"\1\2 am", text) - text = re.sub(r"(\b)([Ll]et)'s", r"\1\2 us", text) - text = re.sub(r"(\b)([Ww])on't", r"\1\2ill not", text) - text = re.sub(r"(\b)([Ss])han't", r"\1\2hall not", text) - text = re.sub(r"(\b)([Yy])(?:'all|a'll)", r"\1\2ou all", text) + text = constants.CONTRACTION_CANT_CANNOT.sub(r"\1\2n not", text) + text = constants.CONTRACTION_M_AM.sub(r"\1\2 am", text) + text = constants.CONTRACTION_LET_LETUS.sub(r"\1\2 us", text) + text = constants.CONTRACTION_WONT_WILLNOT.sub(r"\1\2ill not", text) + text = constants.CONTRACTION_SHANT_SHALLNOT.sub(r"\1\2hall not", text) + text = constants.CONTRACTION_YALL_YOUALL.sub(r"\1\2ou all", text) return text diff --git a/nautilus_nlp/utils/constants.py b/nautilus_nlp/utils/constants.py index 80e4cfa..0ab14e8 100644 --- a/nautilus_nlp/utils/constants.py +++ b/nautilus_nlp/utils/constants.py @@ -214,3 +214,16 @@ WEIRD_HYPHEN_SPACE_TERM_RE = re.compile(r"(?<=[^\W\d]) (-[^\W\d])", flags=re.UNICODE) WEIRD_APOSTR_SPACE_TERM_RE = re.compile(r"([^\W\d]+) ('[a-z]{1,2}\b)", flags=re.UNICODE) LATIN_CHARACTERS_RE = regex.compile(r'[^\p{Latin}1-9]') + +# ENGLISH CONTRACTIONS +CONTRACTION_NT_NOT = re.compile( + r"(\b)(are|could|did|does|do|had|has|have|is|might|must|should|were|would)n't", re.IGNORECASE) +CONTRACTION_LL_WILL = re.compile(r"(\b)(he|i|she|they|we|what|who|you)'ll", re.IGNORECASE) +CONTRACTION_RE_ARE = re.compile(r"(\b)(they|we|what|who|you)'re", re.IGNORECASE) +CONTRACTION_VE_HAVE = re.compile(r"(\b)(i|should|they|we|what|who|would|you)'ve", re.IGNORECASE) +CONTRACTION_CANT_CANNOT = re.compile(r"(\b)(ca)n't", re.IGNORECASE) +CONTRACTION_M_AM = re.compile(r"(\b)(i)'m", re.IGNORECASE) +CONTRACTION_LET_LETUS = re.compile(r"(\b)(let)'s", re.IGNORECASE) +CONTRACTION_WONT_WILLNOT = re.compile(r"(\b)(w)on't", re.IGNORECASE) +CONTRACTION_SHANT_SHALLNOT = re.compile(r"(\b)(s)han't", re.IGNORECASE) +CONTRACTION_YALL_YOUALL = re.compile(r"(\b)(y)(?:'all|a'll)", re.IGNORECASE) From 731eeacaf04777d1647da80d0f1c870940c42fe3 Mon Sep 17 00:00:00 2001 From: Amale EL HAMRI <amale.elhamri@artefact.com> Date: Thu, 7 May 2020 13:45:17 +0200 Subject: [PATCH 256/496] compiling all social regex in constants file --- nautilus_nlp/preprocessing/social_preprocess.py | 17 ++++++++--------- nautilus_nlp/utils/constants.py | 8 ++++++++ 2 files changed, 16 insertions(+), 9 deletions(-) diff --git a/nautilus_nlp/preprocessing/social_preprocess.py b/nautilus_nlp/preprocessing/social_preprocess.py index 4984e1b..ffa1fc8 100644 --- a/nautilus_nlp/preprocessing/social_preprocess.py +++ b/nautilus_nlp/preprocessing/social_preprocess.py @@ -23,6 +23,7 @@ import emoji as _emoji from nautilus_nlp.preprocessing.main_preprocess import normalize_whitespace +from nautilus_nlp.utils import constants def remove_mentions(text:str) -> str: @@ -37,7 +38,7 @@ def remove_mentions(text:str) -> str: ------- string """ - return normalize_whitespace(re.sub(r'@\w*', '', text)) + return normalize_whitespace(constants.AT_PATTERN.sub('', text)) def extract_mentions(text:str) -> str: @@ -53,7 +54,7 @@ def extract_mentions(text:str) -> str: ------- string """ - return re.findall(r'[@][^\s@]+', text) + return constants.AT_PATTERN.findall(text) def remove_html_tags(text:str) -> str: @@ -68,7 +69,7 @@ def remove_html_tags(text:str) -> str: ------- string """ - return normalize_whitespace(re.sub(r'<.*?>', '', text)) + return normalize_whitespace(constants.HTML_TAG_PATTERN.sub('', text)) def remove_emoji(text:str) -> str: @@ -85,8 +86,7 @@ def remove_emoji(text:str) -> str: ------- str """ - emoji_pattern = _emoji.get_emoji_regexp() - word = emoji_pattern.sub("", text) + word = constants.EMOJI_PATTERN.sub("", text) return word @@ -124,8 +124,7 @@ def extract_emojis(text:str) -> list: list list of all emojis converted with their unicode conventions """ - emoji_pattern = _emoji.get_emoji_regexp() - emojis_in_text = re.findall(emoji_pattern, text) + emojis_in_text = constants.EMOJI_PATTERN.findall(text) emojis_converted = [convert_emoji_to_text(emoji_text) for emoji_text in emojis_in_text] return emojis_converted @@ -144,7 +143,7 @@ def extract_hashtags(text) -> list: list list of all hashtags """ - return re.findall(r'[#][^\s#]+', text) + return constants.HASHTAG_PATTERN.findall(text) def remove_hashtag(text) -> str: @@ -161,4 +160,4 @@ def remove_hashtag(text) -> str: str text of a post without hashtags """ - return normalize_whitespace(re.sub(r'#\w*', '', text)) + return normalize_whitespace(constants.HASHTAG_PATTERN.sub('', text)) diff --git a/nautilus_nlp/utils/constants.py b/nautilus_nlp/utils/constants.py index 0ab14e8..4595660 100644 --- a/nautilus_nlp/utils/constants.py +++ b/nautilus_nlp/utils/constants.py @@ -26,6 +26,8 @@ import regex import sys import unicodedata +import emoji as _emoji + from . import compat from . import file_loader as util @@ -227,3 +229,9 @@ CONTRACTION_WONT_WILLNOT = re.compile(r"(\b)(w)on't", re.IGNORECASE) CONTRACTION_SHANT_SHALLNOT = re.compile(r"(\b)(s)han't", re.IGNORECASE) CONTRACTION_YALL_YOUALL = re.compile(r"(\b)(y)(?:'all|a'll)", re.IGNORECASE) + +# SOCIAL DATA +EMOJI_PATTERN = _emoji.get_emoji_regexp() +HASHTAG_PATTERN = re.compile(r'#\w*') +AT_PATTERN = re.compile(r'@\w*') +HTML_TAG_PATTERN = re.compile(r'<.*?>') From 7c7179b294459ea1524cc43667e59d10004d5cd2 Mon Sep 17 00:00:00 2001 From: Amale EL HAMRI <amale.elhamri@artefact.com> Date: Thu, 7 May 2020 13:50:13 +0200 Subject: [PATCH 257/496] enabling only tokenizing part of spacy to avoid additional computing (such as POS tagging for example) and casting return type to string --- nautilus_nlp/utils/tokenizer.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/nautilus_nlp/utils/tokenizer.py b/nautilus_nlp/utils/tokenizer.py index 49fac6b..5eae255 100644 --- a/nautilus_nlp/utils/tokenizer.py +++ b/nautilus_nlp/utils/tokenizer.py @@ -24,14 +24,14 @@ #nltk.download('punkt') try: - french_spacy = spacylang.fr.French() + french_spacy = spacylang.fr.French().tokenizer except OSError: raise OSError("""You must install French langage to use SpaCy. python -m spacy download fr See https://spacy.io/usage/ for details """) try: - english_spacy = spacylang.en.English() + english_spacy = spacylang.en.English().tokenizer except OSError: raise OSError("""You must install english langage to use SpaCy. python -m spacy download en @@ -59,10 +59,10 @@ def tokenize(text: str, lang_module: str = 'en_spacy'): return nltk.word_tokenize(text) elif lang_module is 'en_spacy': spacydoc = english_spacy(text) - return list(spacydoc) + return [spacy_token.text for spacy_token in spacydoc] elif lang_module is 'fr_spacy': spacydoc = french_spacy(text) - return list(spacydoc) + return [spacy_token.text for spacy_token in spacydoc] elif lang_module is 'fr_moses': t = MosesTokenizer(lang='fr') return t.tokenize(text, escape=False) From 879bb406f73a8e1958a2dfced70d16a21282ac25 Mon Sep 17 00:00:00 2001 From: Rafaelle AYGALENQ <rafaelle.aygalenq@artefact.com> Date: Mon, 1 Jun 2020 16:17:06 +0200 Subject: [PATCH 258/496] refacto preprocessing into classes --- nautilus_nlp/models/language_detector.py | 5 +- .../preprocessing/additional_preprocess.py | 119 ----- .../preprocessing/data_augmentation.py | 107 ++++ nautilus_nlp/preprocessing/main_preprocess.py | 470 ------------------ .../preprocessing/social_preprocess.py | 294 ++++++----- nautilus_nlp/preprocessing/text_preprocess.py | 417 ++++++++++++++++ .../preprocessing/token_preprocess.py | 109 ++++ tests/test_fix_bad_encoding.py | 5 +- tests/test_preprocessor.py | 140 +++--- 9 files changed, 871 insertions(+), 795 deletions(-) delete mode 100644 nautilus_nlp/preprocessing/additional_preprocess.py create mode 100644 nautilus_nlp/preprocessing/data_augmentation.py delete mode 100644 nautilus_nlp/preprocessing/main_preprocess.py create mode 100644 nautilus_nlp/preprocessing/text_preprocess.py create mode 100644 nautilus_nlp/preprocessing/token_preprocess.py diff --git a/nautilus_nlp/models/language_detector.py b/nautilus_nlp/models/language_detector.py index 255347b..cc3a0a9 100644 --- a/nautilus_nlp/models/language_detector.py +++ b/nautilus_nlp/models/language_detector.py @@ -16,7 +16,7 @@ # along with this program; if not, write to the Free Software Foundation, # Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. from nautilus_nlp.models.fasttext_classifier import Fasttext_clf as langdetect -from nautilus_nlp.preprocessing.main_preprocess import remove_EOL_characters +from nautilus_nlp.preprocessing.text_preprocess import TextPreprocessor import pkg_resources lang_path = pkg_resources.resource_filename( @@ -49,5 +49,6 @@ def detect_language(self, text_to_detect=None): language: 2-letter code for the language of the text """ - best_guesses = self.model.predict(remove_EOL_characters(text_to_detect)) + preprocessor = TextPreprocessor(text_to_detect) + best_guesses = self.model.predict(preprocessor.remove_EOL_characters()) return best_guesses[0][0].replace("__label__", ""), best_guesses[1][0] diff --git a/nautilus_nlp/preprocessing/additional_preprocess.py b/nautilus_nlp/preprocessing/additional_preprocess.py deleted file mode 100644 index 2d4b403..0000000 --- a/nautilus_nlp/preprocessing/additional_preprocess.py +++ /dev/null @@ -1,119 +0,0 @@ -# GNU Lesser General Public License v3.0 only -# Copyright (C) 2020 Artefact -# licence-information@artefact.com -# -# This program is free software; you can redistribute it and/or -# modify it under the terms of the GNU Lesser General Public -# License as published by the Free Software Foundation; either -# version 3 of the License, or (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public License -# along with this program; if not, write to the Free Software Foundation, -# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. -# -*- coding: utf-8 -*- - -from __future__ import absolute_import, division, print_function, unicode_literals - -import re -from nautilus_nlp.utils import constants -from nautilus_nlp.preprocessing.main_preprocess import normalize_whitespace - - -def remove_multiple_spaces_and_strip_text(text: str) -> str: - """ - Remove multiple spaces, strip text, and remove '-', '*' characters. - - Parameters - ---------- - text : str - the text to be processed - - Returns - ------- - string - the text with removed multiple spaces and strip text - """ - regex_remove_multiple_spaces_list = ["\\t", "[\\s\\-\\*]{2,}"] - for regex_remove_multiple_spaces in regex_remove_multiple_spaces_list: - text = re.sub(regex_remove_multiple_spaces, " ", text) - text = text.strip() - return text - - -def remove_tokens_with_nonletters(tokens: list) -> list: - """ - Inputs a list of tokens, outputs a list of tokens without tokens that - includes numbers of special caracters. - ['foo','bar','124','34euros'] -> ['foo','bar'] - - Parameters - ---------- - tokens : list - list of tokens to be cleaned - - Returns - ------- - list - list of tokens without tokens with numbers - """ - return [word for word in tokens if re.search("[^a-zA-Z]", word) is None] - - -def remove_special_caracters_from_tokenslist(tokens: list) -> list: - """ - Remove tokens that doesn't contains any number or letter. - eg. ['foo','bar','---',"'s",'#'] -> ['foo','bar',"'s"] - - Parameters - ---------- - tokens : list - list of tokens to be cleaned - - Returns - ------- - list - list of tokens without tokens that contains only special caracters - - """ - return [word for word in tokens if re.search("[a-zA-Z0-9]", word)] - - -def filter_non_latin_characters(text:str) -> str: - """ - Function that filters non latin characters of a text - - Parameters - ---------- - text : string - - Returns - ------- - string - """ - text = constants.LATIN_CHARACTERS_RE.sub(' ', text) - return normalize_whitespace(text) - - -def remove_smallwords(tokens_list:list, smallwords_threshold:int) -> list: - """ - Function that removes words which length is below a threshold - ["hello", "my", "name", "is", "John", "Doe"] --> ["hello","name","John","Doe"] - - Parameters - ---------- - text : list - list of strings - smallwords_threshold: int - threshold of small word - - Returns - ------- - list - """ - result = [word for word in tokens_list if len(word) > smallwords_threshold] - return result diff --git a/nautilus_nlp/preprocessing/data_augmentation.py b/nautilus_nlp/preprocessing/data_augmentation.py new file mode 100644 index 0000000..69b84e1 --- /dev/null +++ b/nautilus_nlp/preprocessing/data_augmentation.py @@ -0,0 +1,107 @@ +import copy +import logging +import nlpaug.augmenter.word as naw +import re + +def augment_utterance(text, method, stopwords, intent=None, entities=None): + """ + Given ``text`` str, create a new similar utterance by modifying some words + in the initial sentence, modifications depend on the chosen method + (substitution with synonym, addition, deletion). If intent and/or entities + are given as input, they will remain unchanged. + + Parameters + ---------- + text : string + method : string + augmenter to use ('wordnet_synonym' or 'aug_sub_bert') + stopwords : list + list of words to freeze throughout the augmentation + intent : string + intent associated to text if any + entities : list + entities associated to text if any, must be in the following format: + [ + { + 'entity': str, + 'startCharIndex': int, + 'endCharIndex': int + }, + { + ... + } + ] + + Returns + ------- + dictionary with augmented text and optional keys depending on input + """ + new_utt = {} + if entities: + formatted_entities = [(text[entities[i]['startCharIndex']:entities[i]['endCharIndex']].strip(),entities[i]['entity']) for i in range(len(entities))] + augmenter = select_augmenter(method,stopwords) + new_utt['text'] = augmenter.augment(text) + if intent: + new_utt['intent'] = intent + if entities: + if are_entities_in_augmented_text(entities,new_utt['text']): + new_utt['entities'] = get_augmented_entities(new_utt['text'],formatted_entities) + return clean_sentence_entities(new_utt) + else: + logging.info('Text was not correctly augmented so not added') + else: + return new_utt + +def are_entities_in_augmented_text(entities,augmented_text): + check = True + for ent in entities: + if ent['word'] not in augmented_text: + check = False + return check + +def select_augmenter(method,stopwords,use_stopwords=True): + if use_stopwords: + stopwords = stopwords + else: + stopwords = [] + if method == 'wordnet_synonym': + augmenter = naw.SynonymAug(aug_src='wordnet',stopwords=stopwords) + elif method == 'aug_sub_bert': + augmenter = naw.ContextualWordEmbsAug(model_path='bert-base-uncased', action="substitute",stopwords=stopwords) + return(augmenter) + +def get_augmented_entities(sentence_augmented,entities): + entities_augmented = [] + for entity in entities : + regex = r'(?:^|\W)' + re.escape(entity[0].strip()) + '(?:$|\W)' + if (re.search(re.compile(regex), sentence_augmented)): + start_index = re.search(regex,sentence_augmented).start()+1 + end_index = re.search(regex,sentence_augmented).end()-1 + new_entity = {'entity': entity[1],'word': sentence_augmented[start_index:end_index],'startCharIndex': start_index,'endCharIndex': end_index} + entities_augmented.append(new_entity) + return entities_augmented + +def clean_sentence_entities(sentence_input): + sentence = copy.copy(sentence_input) + for element1 in sentence['entities']: + for element2 in sentence['entities'] : + result = check_interval_included(element1,element2) + if result: + try : + sentence[1]['entities'].remove(result[0]) + except : + logging.info("Cant remove entity : {} \n entities are now :{} \n for sentence : {} ".format(result,sentence['entities'],sentence['text'])) + continue + return(sentence) + +def check_interval_included(element1,element2): + if ((element1 != element2) and (element1['startCharIndex'] >= element2['startCharIndex']) and (element1['endCharIndex'] <= element2['endCharIndex'])): + return((element1,element2)) + elif ((element1 != element2) and (element2['startCharIndex'] >= element1['startCharIndex']) and (element2['endCharIndex'] <= element1['endCharIndex'])): + return((element2,element1)) + elif ((element1 != element2) and (element1['startCharIndex'] >= element2['startCharIndex']) and (element1['endCharIndex'] >= element2['endCharIndex']) and (element1['startCharIndex'] <= element2['endCharIndex']-1)): + return((element1,element2)) + elif ((element1 != element2) and (element2['startCharIndex'] >= element1['startCharIndex']) and (element2['endCharIndex'] >= element1['endCharIndex']) and (element2['startCharIndex'] < element1['endCharIndex']-1)): + return((element2,element1)) + else : + return(False) \ No newline at end of file diff --git a/nautilus_nlp/preprocessing/main_preprocess.py b/nautilus_nlp/preprocessing/main_preprocess.py deleted file mode 100644 index ddf4a21..0000000 --- a/nautilus_nlp/preprocessing/main_preprocess.py +++ /dev/null @@ -1,470 +0,0 @@ -# GNU Lesser General Public License v3.0 only -# Copyright (C) 2020 Artefact -# licence-information@artefact.com -# -# This program is free software; you can redistribute it and/or -# modify it under the terms of the GNU Lesser General Public -# License as published by the Free Software Foundation; either -# version 3 of the License, or (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public License -# along with this program; if not, write to the Free Software Foundation, -# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. -# -*- coding: utf-8 -*- - -from __future__ import absolute_import, division, print_function, unicode_literals - -import re -import unicodedata -from ftfy import fix_text as _fix_text - -from nautilus_nlp.utils.stopwords import get_stopwords -from nautilus_nlp.utils.phone_number import extract_phone_numbers as _extract_phone_numbers -from nautilus_nlp.utils import constants - - -def preprocess_text( - text, - remove_eol_char=True, - fix_unicode=False, - lowercase=False, - no_urls=False, - no_emails=False, - no_phone_numbers=False, - no_numbers=False, - no_currency_symbols=False, - no_punct=False, - no_contractions=False, - no_accents=False, - replace_with=' ', - no_stopwords=None, - phone_countries_format=[None,'US','FR'], - phone_method='regex' -) -> str: - """ - Normalize various aspects of a raw text doc. A convenience function for - applying all other preprocessing functions in one go. - - Parameters - ---------- - text : str - raw text to preprocess - fix_unicode : bool - if True, fix "broken" unicode such as mojibake and garbled HTML entities - remove_eol_char : bool - if True, will remove the end-of-line characters \\n - lowercase : bool - if True, all text is lower-cased - no_urls : bool - if True, replace all URL strings with '*URL*' or with "replace_with" if - specified. - no_emails : bool - if True, replace all email strings with '*EMAIL*' or with "replace_with" if - specified. - no_phone_numbers : bool - if True, replace all phone number strings with '*PHONE*' or with "replace_with" if - specified. - no_numbers : bool - if True, replace all number-like strings with '*NUMBER*' or with "replace_with" if - specified. - no_currency_symbols : bool - if True, if True, replace all currency symbols with their standard - 3-letter abbreviations. - no_punct : bool - if True, remove all punctuation (replace with empty string) - no_contractions : bool - if True, if True, replace *English* contractions with their unshortened forms - no_accents : bool - if True, replace all accented characters with unaccented versions - replace_with : string - The string you want the entities to be replaced with. - no_stopwords : 2-letter country code - If specified, will remove the stopwords of the given language. - Supported languages: ['ar', 'bg', 'ca', 'cz', 'da', 'nl', 'en', - 'fi', 'fr', 'de', 'hi', 'hu', 'id', 'it', 'nb', 'pl', 'pt', 'ro', 'ru', - 'sk', 'es', 'sv', 'tr', 'uk', 'vi', 'af', 'ha', 'so', 'st', 'sw', 'yo', - 'zu', 'da', 'de', 'es', 'et', 'fi', 'fr', 'hr', 'hu', 'it', 'ko', 'nl', - 'no', 'pl', 'pt', 'ru', 'sv', 'tr', 'zh', 'eo', 'he', 'la', 'sk', 'sl', - 'br', 'ca', 'cs', 'el', 'eu', 'ga', 'gl', 'hy', 'id', 'ja', 'lv', 'th', - 'ar', 'bg', 'bn', 'fa', 'hi', 'mr', 'ro', 'en'] - phone_countries_format : list - formats of the phone numbers to be removed. Full list is available at - utils.SUPPORTED_COUNTRY - phone_method : ['regex','detection'] - regex is faster but will omit a lot of numbers, while detection will - catch every numbers, but takes a while. - Returns - ------- - string - input ``text`` processed according to function args - - Warning - ------- - These changes may negatively affect subsequent NLP analysis performed - on the text, so choose carefully, and preprocess at your own risk! - """ - assert isinstance(text, str), "The text to preprocess must be a string" - - if fix_unicode is True: - text = fix_bad_unicode(text, normalization="NFC") - if remove_eol_char is True: - text = remove_EOL_characters(text) - if no_urls is True: - text = replace_urls(text, replace_with=replace_with) - if no_emails is True: - text = replace_emails(text, replace_with=replace_with) - if no_phone_numbers is True: - text = replace_phone_numbers(text, replace_with=replace_with, - method=phone_method, - country_format_to_detect=phone_countries_format) - if no_numbers is True: - text = replace_numbers(text, replace_with=replace_with) - if no_currency_symbols is True: - text = replace_currency_symbols(text, replace_with=replace_with) - if no_contractions is True: - text = unpack_english_contractions(text) - if no_accents is True: - text = remove_accents(text, method="unicode") - if no_punct is True: - text = remove_punct(text) - if lowercase is True: - text = text.lower() - if no_stopwords is not None: - stopwords = get_stopwords(no_stopwords) - text = ' '.join(remove_stopwords(text, stopwords)) - # always normalize whitespace; treat linebreaks separately from spacing - text = normalize_whitespace(text) - - return text - - -def remove_EOL_characters(text: str) -> str: - """ - Remove end of line (\n) char. - - Parameters - ---------- - text : str - - Returns - ------- - str - """ - return text.replace("\n", " ") - - -def remove_stopwords(text_or_tokens, stopwords: list) -> list: - """ - Remove stopwords from a list of tokens or a text. - eg. ['I','like','when','you','move','your','body','!'] -> ['I', 'move', 'body', '!'] - - Parameters - ---------- - text_or_tokens : list or string - list of tokens to be cleaned - - Returns - ------- - list - list of tokens without stopwords - - Raises - ------ - ValueError - When inputs is not a string or a list - """ - if type(text_or_tokens) is str: - return [word for word in text_or_tokens.split() if word not in stopwords] - elif type(text_or_tokens) is list: - return [word for word in text_or_tokens if word not in stopwords] - else: - raise ValueError("must input string or list of tokens") - - -def fix_bad_unicode(text: str, normalization: str = "NFC") -> str: - """ - Fix unicode text that's "broken" using `ftfy <http://ftfy.readthedocs.org/>`_; - this includes mojibake, HTML entities and other code cruft, - and non-standard forms for display purposes. - - Parameters - ---------- - text : string - - normalization ({'NFC', 'NFKC', 'NFD', 'NFKD'}): - if 'NFC', combines characters and diacritics written using separate code points, - e.g. converting "e" plus an acute accent modifier into "é"; unicode - can be converted to NFC form without any change in its meaning! - if 'NFKC', additional normalizations are applied that can change - the meanings of characters, e.g. ellipsis characters will be replaced - with three periods - Returns - ------- - string - """ - return _fix_text(text, normalization=normalization) - - -def normalize_whitespace(text:str) -> str: - """ - Given ``text`` str, replace one or more spacings with a single space, and one - or more linebreaks with a single newline. Also strip leading/trailing whitespace. - eg. " foo bar " -> "foo bar" - - Parameters - ---------- - text : string - - Returns - ------- - string - """ - return constants.NONBREAKING_SPACE_REGEX.sub( - " ", constants.LINEBREAK_REGEX.sub(r"\n", text) - ).strip() - - - -def unpack_english_contractions(text:str) -> str: - """ - Replace *English* contractions in ``text`` str with their unshortened forms. - N.B. The "'d" and "'s" forms are ambiguous (had/would, is/has/possessive), - so are left as-is. - eg. "You're fired. She's nice." -> "You are fired. She's nice." - - Parameters - ---------- - text : string - - Returns - ------- - string - """ - text = constants.CONTRACTION_NT_NOT.sub( - r"\1\2 not", - text, - ) - text = constants.CONTRACTION_LL_WILL.sub( - r"\1\2 will", - text, - ) - text = constants.CONTRACTION_RE_ARE.sub(r"\1\2 are", text) - text = constants.CONTRACTION_VE_HAVE.sub( - r"\1\2 have", - text, - ) - text = constants.CONTRACTION_CANT_CANNOT.sub(r"\1\2n not", text) - text = constants.CONTRACTION_M_AM.sub(r"\1\2 am", text) - text = constants.CONTRACTION_LET_LETUS.sub(r"\1\2 us", text) - text = constants.CONTRACTION_WONT_WILLNOT.sub(r"\1\2ill not", text) - text = constants.CONTRACTION_SHANT_SHALLNOT.sub(r"\1\2hall not", text) - text = constants.CONTRACTION_YALL_YOUALL.sub(r"\1\2ou all", text) - return text - - - - - -def replace_urls(text:str, replace_with:str="*URL*") -> str: - """ - Replace all URLs in ``text`` str with ``replace_with`` str. - - Parameters - ---------- - text : string - replace_with : string - the string you want the URL to be replaced with. - - Returns - ------- - string - """ - return constants.URL_REGEX.sub( - replace_with, constants.SHORT_URL_REGEX.sub(replace_with, text) - ) - - -def replace_emails(text, replace_with="*EMAIL*") -> str: - """ - Replace all emails in ``text`` str with ``replace_with`` str - - Parameters - ---------- - text : string - replace_with : string - the string you want the email address to be replaced with. - - Returns - ------- - string - """ - return constants.EMAIL_REGEX.sub(replace_with, text) - - -def replace_phone_numbers(text, replace_with:str="*PHONE*", - method:str="regex", - country_format_to_detect:list=[None,'FR','US','GB']) -> str: - """ - Replace all phone numbers in ``text`` str with ``replace_with`` str - - Parameters - ---------- - text : string - replace_with : string - the string you want the phone number to be replaced with. - method : ['regex','detection'] - regex is faster but will omit a lot of numbers, while detection will - catch every numbers, but takes a while. - country_format_to_detect : list - If a list of country code is specified, will catch every number formatted. - Only when method = 'detection'. - Returns - ------- - string - """ - if method == 'regex': - return constants.PHONE_REGEX.sub(replace_with, text) - - elif method == 'detection': - found_nums = _extract_phone_numbers(text, countrylist=country_format_to_detect) - - # order by lenght to avoid truncated numbers to be removed first. - found_nums.sort(key=len,reverse=True) - for phone_number in found_nums: - text = text.replace(phone_number, replace_with) - - return text - else: - raise ValueError('Please input a valid method between "regex" or "detection"') - - -def replace_numbers(text, replace_with="*NUMBER*") -> str: - """ - Replace all numbers in ``text`` str with ``replace_with`` str. - - Parameters - ---------- - text : string - replace_with : string - the string you want the number to be replaced with. - - Returns - ------- - string - """ - return constants.NUMBERS_REGEX.sub(replace_with, text) - - -def replace_currency_symbols(text, replace_with=None) -> str: - """ - Replace all currency symbols in ``text`` str with string specified by ``replace_with`` str. - - Parameters - ---------- - text : str - raw text - replace_with : None or string - if None (default), replace symbols with - their standard 3-letter abbreviations (e.g. '$' with 'USD', '£' with 'GBP'); - otherwise, pass in a string with which to replace all symbols - (e.g. "*CURRENCY*") - - Returns - ------- - string - """ - if replace_with is None: - for k, v in constants.CURRENCIES.items(): - text = text.replace(k, v) - return text - else: - return constants.CURRENCY_REGEX.sub(replace_with, text) - - -def remove_punct(text, marks=None) -> str: - """ - Remove punctuation from ``text`` by replacing all instances of ``marks`` - with whitespace. - - Parameters - ---------- - text : str - raw text - - marks : str or None - If specified, remove only the characters in this string, - e.g. ``marks=',;:'`` removes commas, semi-colons, and colons. - Otherwise, all punctuation marks are removed. - - Returns - ------- - string - - Note - ------- - When ``marks=None``, Python's built-in :meth:`str.translate()` is - used to remove punctuation; otherwise, a regular expression is used - instead. The former's performance is about 5-10x faster. - """ - if marks: - return re.sub("[{}]+".format(re.escape(marks)), " ", text, flags=re.UNICODE) - else: - return text.translate(constants.PUNCT_TRANSLATE_UNICODE) - - -def remove_accents(text:str, method:str="unicode") -> str: - """ - Remove accents from any accented unicode characters in ``text`` str, either by - transforming them into ascii equivalents or removing them entirely. - - Parameters - ---------- - text : str - raw text - - method : ({'unicode', 'ascii'}) - if 'unicode', remove accented - char for any unicode symbol with a direct ASCII equivalent; if 'ascii', - remove accented char for any unicode symbol - - NB: the 'ascii' method is notably faster than 'unicode', but less good - - Returns - ------- - string - - Raises - ------- - ValueError - if ``method`` is not in {'unicode', 'ascii'} - """ - if method == "unicode": - return "".join( - c - for c in unicodedata.normalize("NFKD", text) - if not unicodedata.combining(c) - ) - elif method == "ascii": - return ( - unicodedata.normalize("NFKD", text) - .encode("ascii", errors="ignore") - .decode("ascii") - ) - else: - msg = '`method` must be either "unicode" and "ascii", not {}'.format(method) - raise ValueError(msg) - - - - - - - - - - diff --git a/nautilus_nlp/preprocessing/social_preprocess.py b/nautilus_nlp/preprocessing/social_preprocess.py index ffa1fc8..cde003e 100644 --- a/nautilus_nlp/preprocessing/social_preprocess.py +++ b/nautilus_nlp/preprocessing/social_preprocess.py @@ -21,143 +21,163 @@ import re import emoji as _emoji - -from nautilus_nlp.preprocessing.main_preprocess import normalize_whitespace from nautilus_nlp.utils import constants -def remove_mentions(text:str) -> str: - """ - Function that removes words preceded with a '@' - - Parameters - ---------- - text : str - - Returns - ------- - string - """ - return normalize_whitespace(constants.AT_PATTERN.sub('', text)) - - -def extract_mentions(text:str) -> str: - """ - Function that extracts words preceded with a '@' - eg. "I take care of my skin with @thisproduct" --> ["@thisproduct"] - - Parameters - ---------- - text : str - - Returns - ------- - string - """ - return constants.AT_PATTERN.findall(text) - - -def remove_html_tags(text:str) -> str: - """ - Function that removes words between < and > - - Parameters - ---------- - text : str - - Returns - ------- - string - """ - return normalize_whitespace(constants.HTML_TAG_PATTERN.sub('', text)) - - -def remove_emoji(text:str) -> str: - """ - Remove emoji from any str by stripping any unicode in the range of Emoji unicode - as defined in the unicode convention: - http://www.unicode.org/emoji/charts/full-emoji-list.html - - Parameters - ---------- - text : str - - Returns - ------- - str - """ - word = constants.EMOJI_PATTERN.sub("", text) - return word - - -def convert_emoji_to_text(text:str, code_delimiters=(':', ':')) -> str: - """ - Convert emoji to their CLDR Short Name, according to the unicode convention - http://www.unicode.org/emoji/charts/full-emoji-list.html - eg. 😀 --> :grinning_face: - - Parameters - ---------- - text : str - code_delimiters : tuple of symbols around the emoji code. - eg: (':',':') --> :grinning_face: - - Returns - ------- - str - string - """ - return _emoji.demojize(text, delimiters=code_delimiters) - - -def extract_emojis(text:str) -> list: - """ - Function that extracts emojis from a text and translates them into words - eg. "I take care of my skin 😀 :(" --> [":grinning_face:"] - - Parameters - ---------- - text : str - - Returns - ------- - list - list of all emojis converted with their unicode conventions - """ - emojis_in_text = constants.EMOJI_PATTERN.findall(text) - emojis_converted = [convert_emoji_to_text(emoji_text) for emoji_text in emojis_in_text] - return emojis_converted - - -def extract_hashtags(text) -> list: - """ - Function that extracts words preceded with a '#' - eg. "I take care of my skin #selfcare#selfestim" --> ["skincare", "selfestim"] - - Parameters - ---------- - text : str - - Returns - ------- - list - list of all hashtags - """ - return constants.HASHTAG_PATTERN.findall(text) - - -def remove_hashtag(text) -> str: - """ - Function that removes words preceded with a '#' - eg. "I take care of my skin #selfcare#selfestim" --> "I take care of my skin" - - Parameters - ---------- - text : str - - Returns - ------- - str - text of a post without hashtags - """ - return normalize_whitespace(constants.HASHTAG_PATTERN.sub('', text)) +class SocialPreprocessor(): + + def __init__(self,text): + self.text = text + + def remove_mentions(self) -> str: + """ + Function that removes words preceded with a '@' + + Parameters + ---------- + text : str + + Returns + ------- + string + """ + self.text = self.normalize_whitespace(constants.AT_PATTERN.sub('', self.text)) + return self.text + + def extract_mentions(self) -> list: + """ + Function that extracts words preceded with a '@' + eg. "I take care of my skin with @thisproduct" --> ["@thisproduct"] + + Parameters + ---------- + text : str + + Returns + ------- + string + """ + return constants.AT_PATTERN.findall(self.text) + + def remove_html_tags(self) -> str: + """ + Function that removes words between < and > + + Parameters + ---------- + text : str + + Returns + ------- + string + """ + self.text = self.normalize_whitespace(constants.HTML_TAG_PATTERN.sub('', self.text)) + return self.text + + def remove_emoji(self) -> str: + """ + Remove emoji from any str by stripping any unicode in the range of Emoji unicode + as defined in the unicode convention: + http://www.unicode.org/emoji/charts/full-emoji-list.html + + Parameters + ---------- + text : str + + Returns + ------- + str + """ + self.text = constants.EMOJI_PATTERN.sub("", self.text) + return self.text + + def convert_emoji_to_text(self, code_delimiters=(':', ':'), input_str=None) -> str: + """ + Convert emoji to their CLDR Short Name, according to the unicode convention + http://www.unicode.org/emoji/charts/full-emoji-list.html + eg. 😀 --> :grinning_face: + + Parameters + ---------- + text : str + code_delimiters : tuple of symbols around the emoji code. + eg: (':',':') --> :grinning_face: + + Returns + ------- + str + string + """ + if input_str: + return _emoji.demojize(input_str, delimiters=code_delimiters) + else: + return _emoji.demojize(self.text, delimiters=code_delimiters) + + def extract_emojis(self) -> list: + """ + Function that extracts emojis from a text and translates them into words + eg. "I take care of my skin 😀 :(" --> [":grinning_face:"] + + Parameters + ---------- + text : str + + Returns + ------- + list + list of all emojis converted with their unicode conventions + """ + emojis_in_text = constants.EMOJI_PATTERN.findall(self.text) + emojis_converted = [self.convert_emoji_to_text(input_str=emoji_text) for emoji_text in emojis_in_text] + return emojis_converted + + def extract_hashtags(self) -> list: + """ + Function that extracts words preceded with a '#' + eg. "I take care of my skin #selfcare#selfestim" --> ["skincare", "selfestim"] + + Parameters + ---------- + text : str + + Returns + ------- + list + list of all hashtags + """ + return constants.HASHTAG_PATTERN.findall(self.text) + + def remove_hashtag(self) -> str: + """ + Function that removes words preceded with a '#' + eg. "I take care of my skin #selfcare#selfestim" --> "I take care of my skin" + + Parameters + ---------- + text : str + + Returns + ------- + str + text of a post without hashtags + """ + self.text = self.normalize_whitespace(constants.HASHTAG_PATTERN.sub('', self.text)) + return self.text + + def normalize_whitespace(self, text) -> str: + """ + Given ``text`` str, replace one or more spacings with a single space, and one + or more linebreaks with a single newline. Also strip leading/trailing whitespace. + eg. " foo bar " -> "foo bar" + + Parameters + ---------- + text : string + + Returns + ------- + string + """ + return constants.NONBREAKING_SPACE_REGEX.sub( + " ", constants.LINEBREAK_REGEX.sub(r"\n", text) + ).strip() diff --git a/nautilus_nlp/preprocessing/text_preprocess.py b/nautilus_nlp/preprocessing/text_preprocess.py new file mode 100644 index 0000000..718b061 --- /dev/null +++ b/nautilus_nlp/preprocessing/text_preprocess.py @@ -0,0 +1,417 @@ +# GNU Lesser General Public License v3.0 only +# Copyright (C) 2020 Artefact +# licence-information@artefact.com +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 3 of the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public License +# along with this program; if not, write to the Free Software Foundation, +# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +# -*- coding: utf-8 -*- + +from __future__ import absolute_import, division, print_function, unicode_literals + +import re +import regex +import unicodedata +from ftfy import fix_text as _fix_text + +from nautilus_nlp.utils.stopwords import get_stopwords +from nautilus_nlp.utils.phone_number import extract_phone_numbers as _extract_phone_numbers +from nautilus_nlp.utils import constants + +class TextPreprocessor(): + + def __init__(self,text): + if isinstance(text,str): + self.text = text + else: + raise ValueError("Input must be a string") + + def clean_text(self,lang='en') -> str: + stopwords = get_stopwords(lang) + self.text = self.fix_bad_unicode(normalization="NFC") + self.text = self.remove_EOL_characters() + self.text = self.remove_accents(method="unicode") + self.text = self.remove_punct() + self.text = self.text.lower() + self.text = self.remove_stopwords(stopwords=stopwords) + return self.normalize_whitespace() + + def remove_EOL_characters(self) -> str: + """ + Remove end of line (\n) char. + + Parameters + ---------- + text : str + + Returns + ------- + str + """ + self.text = self.text.replace("\n", " ") + return self.text + + def remove_stopwords(self, stopwords: list) -> str: + """ + Remove stopwords from a text. + eg. 'I like when you move your body !' -> 'I move body !' + + Parameters + ---------- + stopwords : list of stopwords to remove + + Returns + ------- + str + text without stopwords + + Raises + ------ + ValueError + When inputs is not a string + """ + self.text = ' '.join([word.strip() for word in self.text.split() if word not in stopwords]) + + return self.text + + def fix_bad_unicode(self, normalization: str = "NFC") -> str: + """ + Fix unicode text that's "broken" using `ftfy <http://ftfy.readthedocs.org/>`_; + this includes mojibake, HTML entities and other code cruft, + and non-standard forms for display purposes. + + Parameters + ---------- + text : string + + normalization ({'NFC', 'NFKC', 'NFD', 'NFKD'}): + if 'NFC', combines characters and diacritics written using separate code points, + e.g. converting "e" plus an acute accent modifier into "é"; unicode + can be converted to NFC form without any change in its meaning! + if 'NFKC', additional normalizations are applied that can change + the meanings of characters, e.g. ellipsis characters will be replaced + with three periods + Returns + ------- + string + """ + self.text = _fix_text(self.text, normalization=normalization) + return self.text + + def normalize_whitespace(self) -> str: + """ + Given ``text`` str, replace one or more spacings with a single space, and one + or more linebreaks with a single newline. Also strip leading/trailing whitespace. + eg. " foo bar " -> "foo bar" + + Parameters + ---------- + text : string + + Returns + ------- + string + """ + self.text = constants.NONBREAKING_SPACE_REGEX.sub( + " ", constants.LINEBREAK_REGEX.sub(r"\n", self.text) + ).strip() + return self.text + + def unpack_english_contractions(self) -> str: + """ + Replace *English* contractions in ``text`` str with their unshortened forms. + N.B. The "'d" and "'s" forms are ambiguous (had/would, is/has/possessive), + so are left as-is. + eg. "You're fired. She's nice." -> "You are fired. She's nice." + + Parameters + ---------- + text : string + + Returns + ------- + string + """ + + # standard + self.text = constants.CONTRACTION_NT_NOT.sub( + r"\1\2 not", + self.text, + ) + self.text = constants.CONTRACTION_LL_WILL.sub( + r"\1\2 will", + self.text, + ) + self.text = constants.CONTRACTION_RE_ARE.sub(r"\1\2 are", self.text) + self.text = constants.CONTRACTION_VE_HAVE.sub( + r"\1\2 have", + self.text, + ) + self.text = constants.CONTRACTION_CANT_CANNOT.sub(r"\1\2n not", self.text) + self.text = constants.CONTRACTION_M_AM.sub(r"\1\2 am", self.text) + self.text = constants.CONTRACTION_LET_LETUS.sub(r"\1\2 us", self.text) + self.text = constants.CONTRACTION_WONT_WILLNOT.sub(r"\1\2ill not", self.text) + self.text = constants.CONTRACTION_SHANT_SHALLNOT.sub(r"\1\2hall not", self.text) + self.text = constants.CONTRACTION_YALL_YOUALL.sub(r"\1\2ou all", self.text) + return self.text + + def replace_urls(self, replace_with:str="*URL*") -> str: + """ + Replace all URLs in ``text`` str with ``replace_with`` str. + + Parameters + ---------- + text : string + replace_with : string + the string you want the URL to be replaced with. + + Returns + ------- + string + """ + self.text = constants.URL_REGEX.sub( + replace_with, constants.SHORT_URL_REGEX.sub(replace_with, self.text) + ) + return self.text + + def replace_emails(self, replace_with="*EMAIL*") -> str: + """ + Replace all emails in ``text`` str with ``replace_with`` str + + Parameters + ---------- + text : string + replace_with : string + the string you want the email address to be replaced with. + + Returns + ------- + string + """ + self.text = constants.EMAIL_REGEX.sub(replace_with, self.text) + return self.text + + def replace_phone_numbers(self, replace_with:str="*PHONE*", + method:str="regex", + country_format_to_detect:list=[None,'FR','US','GB'], + return_text: bool = False) -> str: + """ + Replace all phone numbers in ``text`` str with ``replace_with`` str + + Parameters + ---------- + text : string + replace_with : string + the string you want the phone number to be replaced with. + method : ['regex','detection'] + regex is faster but will omit a lot of numbers, while detection will + catch every numbers, but takes a while. + country_format_to_detect : list + If a list of country code is specified, will catch every number formatted. + Only when method = 'detection'. + Returns + ------- + string + """ + if method == 'regex': + self.text = constants.PHONE_REGEX.sub(replace_with, self.text) + elif method == 'detection': + found_nums = _extract_phone_numbers(self.text, countrylist=country_format_to_detect) + + # order by lenght to avoid truncated numbers to be removed first. + found_nums.sort(key=len,reverse=True) + for phone_number in found_nums: + self.text = self.text.replace(phone_number, replace_with) + else: + raise ValueError('Please input a valid method between "regex" or "detection"') + return self.text + + def replace_numbers(self, replace_with="*NUMBER*") -> str: + """ + Replace all numbers in ``text`` str with ``replace_with`` str. + + Parameters + ---------- + text : string + replace_with : string + the string you want the number to be replaced with. + + Returns + ------- + string + """ + self.text = constants.NUMBERS_REGEX.sub(replace_with, self.text) + return self.text + + def replace_currency_symbols(self, replace_with=None) -> str: + """ + Replace all currency symbols in ``text`` str with string specified by ``replace_with`` str. + + Parameters + ---------- + text : str + raw text + replace_with : None or string + if None (default), replace symbols with + their standard 3-letter abbreviations (e.g. '$' with 'USD', '£' with 'GBP'); + otherwise, pass in a string with which to replace all symbols + (e.g. "*CURRENCY*") + + Returns + ------- + string + """ + if replace_with is None: + for k, v in constants.CURRENCIES.items(): + self.text = self.text.replace(k, v) + else: + self.text = constants.CURRENCY_REGEX.sub(replace_with, self.text) + return self.text + + def remove_punct(self, marks=None) -> str: + """ + Remove punctuation from ``text`` by replacing all instances of ``marks`` + with whitespace. + + Parameters + ---------- + text : str + raw text + + marks : str or None + If specified, remove only the characters in this string, + e.g. ``marks=',;:'`` removes commas, semi-colons, and colons. + Otherwise, all punctuation marks are removed. + + Returns + ------- + string + + Note + ------- + When ``marks=None``, Python's built-in :meth:`str.translate()` is + used to remove punctuation; otherwise, a regular expression is used + instead. The former's performance is about 5-10x faster. + """ + if marks: + self.text = re.sub("[{}]+".format(re.escape(marks)), " ", self.text, flags=re.UNICODE) + else: + self.text = self.text.translate(constants.PUNCT_TRANSLATE_UNICODE) + return self.text + + def remove_accents(self, method:str="unicode") -> str: + """ + Remove accents from any accented unicode characters in ``text`` str, either by + transforming them into ascii equivalents or removing them entirely. + + Parameters + ---------- + text : str + raw text + + method : ({'unicode', 'ascii'}) + if 'unicode', remove accented + char for any unicode symbol with a direct ASCII equivalent; if 'ascii', + remove accented char for any unicode symbol + + NB: the 'ascii' method is notably faster than 'unicode', but less good + + Returns + ------- + string + + Raises + ------- + ValueError + if ``method`` is not in {'unicode', 'ascii'} + """ + if method == "unicode": + self.text = "".join( + c + for c in unicodedata.normalize("NFKD", self.text) + if not unicodedata.combining(c) + ) + elif method == "ascii": + self.text = ( + unicodedata.normalize("NFKD", self.text) + .encode("ascii", errors="ignore") + .decode("ascii") + ) + else: + msg = '`method` must be either "unicode" and "ascii", not {}'.format(method) + raise ValueError(msg) + return self.text + + def remove_multiple_spaces_and_strip_text(self) -> str: + """ + Remove multiple spaces, strip text, and remove '-', '*' characters. + + Parameters + ---------- + text : str + the text to be processed + + Returns + ------- + string + the text with removed multiple spaces and strip text + """ + regex_remove_multiple_spaces_list = ["\\t", "[\\s\\-\\*]{2,}"] + for regex_remove_multiple_spaces in regex_remove_multiple_spaces_list: + self.text = re.sub(regex_remove_multiple_spaces, " ", self.text) + self.text = self.text.strip() + return self.text + + def filter_non_latin_characters(self) -> str: + """ + Function that filters non latin characters of a text + + Parameters + ---------- + text : string + + Returns + ------- + string + """ + self.text = constants.LATIN_CHARACTERS_RE.sub(' ', self.text) + self.text = self.normalize_whitespace() + return self.text + + def remove_smallwords(self, smallwords_threshold:int) -> list: + """ + Function that removes words which length is below a threshold + 'Hello my name is John Doe' --> 'Hello name John Doe' + + Parameters + ---------- + text : str + smallwords_threshold: int + threshold of small word + + Returns + ------- + str + """ + self.text = ' '.join([word for word in self.text.split() if len(word) > smallwords_threshold]) + return self.text + + + + + + + + + + diff --git a/nautilus_nlp/preprocessing/token_preprocess.py b/nautilus_nlp/preprocessing/token_preprocess.py new file mode 100644 index 0000000..5e3f3b6 --- /dev/null +++ b/nautilus_nlp/preprocessing/token_preprocess.py @@ -0,0 +1,109 @@ +# GNU Lesser General Public License v3.0 only +# Copyright (C) 2020 Artefact +# licence-information@artefact.com +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 3 of the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public License +# along with this program; if not, write to the Free Software Foundation, +# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +# -*- coding: utf-8 -*- + +from __future__ import absolute_import, division, print_function, unicode_literals + +import re + +class TokenPreprocessor(): + + def __init__(self,tokens): + if isinstance(tokens,list): + self.tokens = tokens + else: + raise ValueError("Input must be a list") + + def remove_stopwords(self, stopwords: list) -> str: + """ + Remove stopwords from a text. + eg. 'I like when you move your body !' -> 'I move body !' + + Parameters + ---------- + stopwords : list of stopwords to remove + + Returns + ------- + list + tokens without stopwords + + Raises + ------ + ValueError + When inputs is not a list + """ + self.tokens = [word for word in self.tokens if word not in stopwords] + return self.tokens + + def remove_tokens_with_nonletters(self) -> list: + """ + Inputs a list of tokens, outputs a list of tokens without tokens that + includes numbers of special caracters. + ['foo','bar','124','34euros'] -> ['foo','bar'] + + Parameters + ---------- + tokens : list + list of tokens to be cleaned + + Returns + ------- + list + list of tokens without tokens with numbers + """ + self.tokens = [word for word in self.tokens if re.search("[^a-zA-Z]", word) is None] + return self.tokens + + def remove_special_caracters_from_tokenslist(self) -> list: + """ + Remove tokens that doesn't contains any number or letter. + eg. ['foo','bar','---',"'s",'#'] -> ['foo','bar',"'s"] + + Parameters + ---------- + tokens : list + list of tokens to be cleaned + + Returns + ------- + list + list of tokens without tokens that contains only special caracters + + """ + self.tokens = [word for word in self.tokens if re.search("[a-zA-Z0-9]", word)] + return self.tokens + + def remove_smallwords(self, smallwords_threshold:int) -> list: + """ + Function that removes words which length is below a threshold + ["hello", "my", "name", "is", "John", "Doe"] --> ["hello","name","John","Doe"] + + Parameters + ---------- + text : list + list of strings + smallwords_threshold: int + threshold of small word + + Returns + ------- + list + """ + self.tokens = [word for word in self.tokens if len(word) > smallwords_threshold] + return self.tokens \ No newline at end of file diff --git a/tests/test_fix_bad_encoding.py b/tests/test_fix_bad_encoding.py index ad44230..50d4ca3 100644 --- a/tests/test_fix_bad_encoding.py +++ b/tests/test_fix_bad_encoding.py @@ -18,7 +18,7 @@ import pytest import numpy as np -from nautilus_nlp.preprocessing.main_preprocess import fix_bad_unicode +from nautilus_nlp.preprocessing.text_preprocess import TextPreprocessor @@ -45,5 +45,6 @@ ], ) def test_remove_multiple_spaces_and_strip_text(input_str, expected_str): - result = fix_bad_unicode(input_str) + preprocessor = TextPreprocessor(input_str) + result = preprocessor.fix_bad_unicode() np.testing.assert_string_equal(result, expected_str) diff --git a/tests/test_preprocessor.py b/tests/test_preprocessor.py index aa1ddea..d93635b 100644 --- a/tests/test_preprocessor.py +++ b/tests/test_preprocessor.py @@ -17,39 +17,13 @@ # Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. import pytest import numpy as np -from nautilus_nlp.preprocessing.additional_preprocess import ( - remove_multiple_spaces_and_strip_text, - remove_tokens_with_nonletters, - remove_special_caracters_from_tokenslist, - filter_non_latin_characters, - remove_smallwords -) -from nautilus_nlp.preprocessing.social_preprocess import ( - remove_emoji, - convert_emoji_to_text, - extract_emojis, - remove_mentions, - extract_mentions, - remove_html_tags, - extract_hashtags, - remove_hashtag -) -from nautilus_nlp.preprocessing.main_preprocess import ( - remove_accents, - fix_bad_unicode, - remove_EOL_characters, - get_stopwords, - remove_stopwords, - normalize_whitespace, - unpack_english_contractions, - replace_urls, - replace_emails, - replace_phone_numbers, - replace_numbers, - replace_currency_symbols, - remove_punct, -) +from nautilus_nlp.preprocessing.text_preprocess import TextPreprocessor +from nautilus_nlp.preprocessing.social_preprocess import SocialPreprocessor +from nautilus_nlp.preprocessing.token_preprocess import TokenPreprocessor import nautilus_nlp.utils.phone_number as phone +from nautilus_nlp.utils.stopwords import get_stopwords + + @pytest.mark.parametrize("text, expected_result", [("ACV water + cinnamon + turmeric + cucumber + lemon. 👍🏻", @@ -57,7 +31,8 @@ ("This is a text without emojis", [])]) def test_extract_emojis(text, expected_result): - result = extract_emojis(text) + preprocessor = SocialPreprocessor(text) + result = preprocessor.extract_emojis() assert expected_result == result @@ -67,7 +42,8 @@ def test_extract_emojis(text, expected_result): ("This is a text without mentions", "This is a text without mentions")]) def test_remove_mentions(text, expected_result): - result = remove_mentions(text) + preprocessor = SocialPreprocessor(text) + result = preprocessor.remove_mentions() assert expected_result == result @@ -77,7 +53,8 @@ def test_remove_mentions(text, expected_result): ("This is a text without mentions", [])]) def test_extract_mentions(text, expected_result): - result = extract_mentions(text) + preprocessor = SocialPreprocessor(text) + result = preprocessor.extract_mentions() assert expected_result == result @@ -87,7 +64,8 @@ def test_extract_mentions(text, expected_result): ("This is a text without html tags", "This is a text without html tags")]) def test_remove_html_tags(text, expected_result): - result = remove_html_tags(text) + preprocessor = SocialPreprocessor(text) + result = preprocessor.remove_html_tags() assert expected_result == result @@ -99,7 +77,8 @@ def test_remove_html_tags(text, expected_result): 2, ["This", "text", "contains", "only", "long", "words"])]) def test_remove_smallwords(tokens_list, smallwords_threshold, expected_result): - result = remove_smallwords(tokens_list, smallwords_threshold) + preprocessor = TokenPreprocessor(tokens_list) + result = preprocessor.remove_smallwords(smallwords_threshold) assert expected_result == result @@ -116,7 +95,8 @@ def test_remove_smallwords(tokens_list, smallwords_threshold, expected_result): ["#many", "#hashtags"])] ) def test_extract_hashtags(text, expected_result): - result = extract_hashtags(text) + preprocessor = SocialPreprocessor(text) + result = preprocessor.extract_hashtags() assert expected_result == result @@ -133,7 +113,8 @@ def test_extract_hashtags(text, expected_result): "this is a text with")] ) def test_remove_hashtag(text, expected_result): - result = remove_hashtag(text) + preprocessor = SocialPreprocessor(text) + result = preprocessor.remove_hashtag() assert expected_result == result @@ -141,8 +122,9 @@ def test_remove_hashtag(text, expected_result): [("كلمات Learn 3 Arabic كلمات words EASILY- Vocabulary #1 تعلم ٣ جديدة", "Learn 3 Arabic words EASILY Vocabulary 1")]) def test_filter_non_latin_characters(text, expected_filtered_text): - filtered_text = filter_non_latin_characters(text) - assert expected_filtered_text == filtered_text + preprocessor = TextPreprocessor(text) + result = preprocessor.filter_non_latin_characters() + assert expected_filtered_text == result @pytest.mark.parametrize( @@ -156,7 +138,8 @@ def test_filter_non_latin_characters(text, expected_filtered_text): ], ) def test_remove_multiple_spaces_and_strip_text(input_str, expected_str): - result = remove_multiple_spaces_and_strip_text(input_str) + preprocessor = TextPreprocessor(input_str) + result = preprocessor.remove_multiple_spaces_and_strip_text() np.testing.assert_string_equal(result, expected_str) @pytest.mark.parametrize( @@ -168,21 +151,24 @@ def test_remove_multiple_spaces_and_strip_text(input_str, expected_str): ], ) def test_remove_EOL_characters(input_str, expected_str): - result = remove_EOL_characters(input_str) + preprocessor = TextPreprocessor(input_str) + result = preprocessor.remove_EOL_characters() np.testing.assert_string_equal(result, expected_str) def test_remove_tokens_with_nonletters(): input_tokens = ['foo','bar','124','34euros'] expected_output = ['foo','bar'] - result = remove_tokens_with_nonletters(input_tokens) + preprocessor = TokenPreprocessor(input_tokens) + result = preprocessor.remove_tokens_with_nonletters() np.testing.assert_array_equal(result,expected_output) def test_remove_special_caracters_from_tokenslist(): input_tokens = ['foo','bar','---',"'s",'#'] expected_output = ['foo','bar',"'s"] - result = remove_special_caracters_from_tokenslist(input_tokens) + preprocessor = TokenPreprocessor(input_tokens) + result = preprocessor.remove_special_caracters_from_tokenslist() np.testing.assert_array_equal(result, expected_output) @@ -196,21 +182,33 @@ def test_get_stopwords(): @pytest.mark.parametrize( "input_tokens, expected_output", [ - (['I','like','when','you','move','your','body','!'], ['I', 'move', 'body', '!']), - ('I like when you move your body !', ['I', 'move', 'body', '!']), + (['I','like','when','you','move','your','body','!'], ['I', 'move', 'body', '!']) ], ) -def test_remove_stopwords(input_tokens, expected_output): +def test_remove_stopwords_tokens(input_tokens, expected_output): + stopwords = get_stopwords('en') + preprocessor = TokenPreprocessor(input_tokens) + result = preprocessor.remove_stopwords(stopwords) + np.testing.assert_array_equal(result, expected_output) + +@pytest.mark.parametrize( + "input_str, expected_output", + [ + ('I like when you move your body !', 'I move body !'), + ], +) +def test_remove_stopwords_text(input_str, expected_output): stopwords = get_stopwords('en') - result = remove_stopwords(input_tokens, stopwords) + preprocessor = TextPreprocessor(input_str) + result = preprocessor.remove_stopwords(stopwords) np.testing.assert_array_equal(result, expected_output) def test_remove_accents(): input_str = "éèëêàù" expected_str = "eeeeau" - - result = remove_accents(input_str) + preprocessor = TextPreprocessor(input_str) + result = preprocessor.remove_accents() np.testing.assert_string_equal(result, expected_str) @@ -237,7 +235,8 @@ def test_remove_accents(): ], ) def test_fix_bad_unicode(input_str, expected_str): - result = fix_bad_unicode(input_str) + preprocessor = TextPreprocessor(input_str) + result = preprocessor.fix_bad_unicode() np.testing.assert_string_equal(result, expected_str) @@ -249,7 +248,8 @@ def test_fix_bad_unicode(input_str, expected_str): ], ) def test_normalize_whitespace(input_str, expected_str): - result = normalize_whitespace(input_str) + preprocessor = TextPreprocessor(input_str) + result = preprocessor.normalize_whitespace() np.testing.assert_equal(result, expected_str) @pytest.mark.parametrize( @@ -264,7 +264,8 @@ def test_normalize_whitespace(input_str, expected_str): ] ) def test_unpack_english_contractions(input_str, expected_str): - result = unpack_english_contractions(input_str) + preprocessor = TextPreprocessor(input_str) + result = preprocessor.unpack_english_contractions() np.testing.assert_equal(result, expected_str) @pytest.mark.parametrize( @@ -280,7 +281,8 @@ def test_unpack_english_contractions(input_str, expected_str): ] ) def test_replace_urls(input_str, expected_str): - result = replace_urls(input_str) + preprocessor = TextPreprocessor(input_str) + result = preprocessor.replace_urls() np.testing.assert_equal(result, expected_str) @@ -294,7 +296,8 @@ def test_replace_urls(input_str, expected_str): ] ) def test_replace_emails(input_str, expected_str): - result = replace_emails(input_str) + preprocessor = TextPreprocessor(input_str) + result = preprocessor.replace_emails() np.testing.assert_equal(result, expected_str) @@ -315,10 +318,12 @@ def test_replace_emails(input_str, expected_str): ] ) def test_replace_phone_numbers(input_str, expected_str): - result = replace_phone_numbers(input_str, replace_with="*PHONE*", - method="detection", - country_format_to_detect=phone.SUPPORTED_COUNTRY - ) + preprocessor = TextPreprocessor(input_str) + result = preprocessor.replace_phone_numbers( + replace_with="*PHONE*", + method="detection", + country_format_to_detect=phone.SUPPORTED_COUNTRY + ) np.testing.assert_equal(result, expected_str) @@ -332,7 +337,8 @@ def test_replace_phone_numbers(input_str, expected_str): ] ) def test_replace_numbers(input_str, expected_str): - result = replace_numbers(input_str) + preprocessor = TextPreprocessor(input_str) + result = preprocessor.replace_numbers() np.testing.assert_equal(result, expected_str) @@ -347,7 +353,8 @@ def test_replace_numbers(input_str, expected_str): ] ) def test_replace_currency_symbols(input_str, param, expected_str): - result = replace_currency_symbols(input_str, replace_with=param) + preprocessor = TextPreprocessor(input_str) + result = preprocessor.replace_currency_symbols(replace_with=param) np.testing.assert_equal(result, expected_str) @pytest.mark.parametrize( @@ -372,7 +379,8 @@ def test_replace_currency_symbols(input_str, param, expected_str): ] ) def test_remove_punct(input_str, param, expected_str): - result = remove_punct(input_str, marks=param) + preprocessor = TextPreprocessor(input_str) + result = preprocessor.remove_punct(marks=param) np.testing.assert_equal(result, expected_str) @@ -390,7 +398,8 @@ def test_remove_punct(input_str, param, expected_str): ] ) def test_remove_emoji(input_str, expected_str): - result = remove_emoji(input_str) + preprocessor = SocialPreprocessor(input_str) + result = preprocessor.remove_emoji() np.testing.assert_equal(result, expected_str) @@ -404,5 +413,6 @@ def test_remove_emoji(input_str, expected_str): ] ) def test_convert_emoji_to_text(input_str, expected_str): - result = convert_emoji_to_text(input_str) + preprocessor = SocialPreprocessor(input_str) + result = preprocessor.convert_emoji_to_text() np.testing.assert_equal(result, expected_str) \ No newline at end of file From 697f53118548d3f38b8df0350d0a37195ea7cf93 Mon Sep 17 00:00:00 2001 From: Amale EL HAMRI <amale.elhamri@artefact.com> Date: Tue, 8 Sep 2020 15:42:03 +0200 Subject: [PATCH 259/496] removing models/ folder --- .../external/get_language_dataset.sh | 5 +- .../external/get_stanfordtweets.sh | 3 + docker/Dockerfile | 48 --- nautilus_nlp/models/.gitkeep | 0 nautilus_nlp/models/biterm_model.py | 162 --------- nautilus_nlp/models/fasttext_classifier.py | 155 --------- nautilus_nlp/models/fasttext_embedding.py | 118 ------- nautilus_nlp/models/language_detector.py | 54 --- nautilus_nlp/models/nmf_model.py | 118 ------- nautilus_nlp/models/seanmf_model.py | 148 -------- nautilus_nlp/models/sentiment_detector.py | 65 ---- nautilus_nlp/models/sk_vectorizer.py | 34 -- nautilus_nlp/models/text_vectorizers.py | 295 ---------------- nautilus_nlp/models/topic_modeling.py | 315 ------------------ .../models/topic_modeling_short_text.py | 280 ---------------- 15 files changed, 6 insertions(+), 1794 deletions(-) rename docker/build_docker.sh => datasets/external/get_language_dataset.sh (84%) rename nautilus_nlp/models/__init__.py => datasets/external/get_stanfordtweets.sh (76%) delete mode 100644 docker/Dockerfile delete mode 100644 nautilus_nlp/models/.gitkeep delete mode 100644 nautilus_nlp/models/biterm_model.py delete mode 100644 nautilus_nlp/models/fasttext_classifier.py delete mode 100644 nautilus_nlp/models/fasttext_embedding.py delete mode 100644 nautilus_nlp/models/language_detector.py delete mode 100644 nautilus_nlp/models/nmf_model.py delete mode 100644 nautilus_nlp/models/seanmf_model.py delete mode 100644 nautilus_nlp/models/sentiment_detector.py delete mode 100644 nautilus_nlp/models/sk_vectorizer.py delete mode 100644 nautilus_nlp/models/text_vectorizers.py delete mode 100644 nautilus_nlp/models/topic_modeling.py delete mode 100644 nautilus_nlp/models/topic_modeling_short_text.py diff --git a/docker/build_docker.sh b/datasets/external/get_language_dataset.sh similarity index 84% rename from docker/build_docker.sh rename to datasets/external/get_language_dataset.sh index 40d9933..4e87a8b 100644 --- a/docker/build_docker.sh +++ b/datasets/external/get_language_dataset.sh @@ -16,5 +16,6 @@ # along with this program; if not, write to the Free Software Foundation, # Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. #!/bin/bash -cp docker/Dockerfile . -docker build -t nautilus_nlp:latest . +wget -O wili.zip https://zenodo.org/record/841984/files/wili-2018.zip?download=1 +mkdir -p wili && cp wili.zip wili && cd wili && unzip wili.zip && cd .. + diff --git a/nautilus_nlp/models/__init__.py b/datasets/external/get_stanfordtweets.sh similarity index 76% rename from nautilus_nlp/models/__init__.py rename to datasets/external/get_stanfordtweets.sh index d46139b..ef7ae1e 100644 --- a/nautilus_nlp/models/__init__.py +++ b/datasets/external/get_stanfordtweets.sh @@ -15,3 +15,6 @@ # You should have received a copy of the GNU Lesser General Public License # along with this program; if not, write to the Free Software Foundation, # Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +#!/bin/bash +wget -O trainingandtestdata.zip http://cs.stanford.edu/people/alecmgo/trainingandtestdata.zip trainingandtestdata.zip +mkdir -p tweets_sentiment && cp trainingandtestdata.zip tweets_sentiment && cd tweets_sentiment && unzip trainingandtestdata.zip diff --git a/docker/Dockerfile b/docker/Dockerfile deleted file mode 100644 index 8530975..0000000 --- a/docker/Dockerfile +++ /dev/null @@ -1,48 +0,0 @@ -FROM ubuntu:latest - -SHELL ["/bin/bash", "-c"] - -RUN apt-get update --fix-missing && \ - apt-get install -y wget bzip2 ca-certificates curl git && \ - apt-get clean && \ - rm -rf /var/lib/apt/lists/* - -RUN wget --quiet https://repo.anaconda.com/miniconda/Miniconda3-4.5.11-Linux-x86_64.sh -O ~/miniconda.sh && \ - /bin/bash ~/miniconda.sh -b -p /opt/conda && \ - rm ~/miniconda.sh && \ - /opt/conda/bin/conda clean -tipsy && \ - ln -s /opt/conda/etc/profile.d/conda.sh /etc/profile.d/conda.sh && \ - echo ". /opt/conda/etc/profile.d/conda.sh" >> ~/.bashrc && \ - echo "conda activate base" >> ~/.bashrc - -ENV TINI_VERSION v0.16.1 -ADD https://github.com/krallin/tini/releases/download/${TINI_VERSION}/tini /usr/bin/tini -RUN chmod +x /usr/bin/tini - - -RUN apt-get update && apt-get install -y build-essential unzip -RUN apt-get install -y g++-5 && apt-get install -y gcc-5 -RUN apt-get install -y python3-pip && alias pip=pip3 && pip3 install --upgrade pip -RUN update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-5 10 && update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-5 20 && update-alternatives --install /usr/bin/g++ g++ /usr/bin/g++-5 10 && update-alternatives --install /usr/bin/g++ g++ /usr/bin/g++-5 20 && update-alternatives --install /usr/bin/cc cc /usr/bin/gcc 30 && update-alternatives --set cc /usr/bin/gcc && update-alternatives --install /usr/bin/c++ c++ /usr/bin/g++ 30 && update-alternatives --set c++ /usr/bin/g++ - -RUN wget https://github.com/facebookresearch/fastText/archive/v0.2.0.zip && unzip v0.2.0.zip && cd fastText-0.2.0 && make -RUN git clone https://github.com/facebookresearch/fastText.git -RUN cd fastText && pip3 install . -RUN pip3 install pandas schedule nltk pendulum bounter spacy==2.1 jupyterlab confluent-kafka xxhash scikit-learn -RUN python3 -m spacy download fr && python3 -m spacy download en && python3 -m spacy download de && python3 -m spacy download it && python3 -m spacy download xx && python3 -m spacy validate -RUN python3 -m nltk.downloader stopwords - -RUN wget http://mallet.cs.umass.edu/dist/mallet-2.0.8.zip - unzip mallet-2.0.8.zip - rm mallet-2.0.8.zip - -RUN sudo add-apt-repository ppa:openjdk-r/ppa # only Ubuntu 17.4 and earlier - sudo apt update - apt search openjdk - sudo apt install openjdk-8-jdk - -RUN echo "alias python='python3'" >> .bash_aliases -RUN echo "alias pip='pip3' ">> ~/.bash_aliases -RUN source ~/.bashrc -ENTRYPOINT [ "/usr/bin/tini", "--" ] -CMD [ "/bin/bash" ] diff --git a/nautilus_nlp/models/.gitkeep b/nautilus_nlp/models/.gitkeep deleted file mode 100644 index e69de29..0000000 diff --git a/nautilus_nlp/models/biterm_model.py b/nautilus_nlp/models/biterm_model.py deleted file mode 100644 index 8aa1ab4..0000000 --- a/nautilus_nlp/models/biterm_model.py +++ /dev/null @@ -1,162 +0,0 @@ -# GNU Lesser General Public License v3.0 only -# Copyright (C) 2020 Artefact -# licence-information@artefact.com -# -# This program is free software; you can redistribute it and/or -# modify it under the terms of the GNU Lesser General Public -# License as published by the Free Software Foundation; either -# version 3 of the License, or (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public License -# along with this program; if not, write to the Free Software Foundation, -# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. -import numpy as np -from biterm.btm import oBTM -from biterm.utility import vec_to_biterms, topic_summuary -from sklearn.feature_extraction.text import CountVectorizer -import pyLDAvis - - -class BitermModel: - - def __init__(self, data, nb_topics, nb_iteration, lang): - """ - Model for topic modelling. Particularly useful for short texts. - - Parameters - ---------- - data : list - a list of string, each string can be a document - nb_topics : positive int - - nb_iteration : positive int - - lang : str - _language to remove the stop words, can be setup to None - - Returns - ------- - string - the text with removed multiple spaces and strip text - """ - self.is_int_positive(nb_topics) - self.is_int_positive(nb_iteration) - self.is_list_of_string(data) - - self.data = data - self.nb_topics = nb_topics - self.nb_iteration = nb_iteration - self.lang = lang - self._topics = None - self._btm = None - self._vectorize_text = None - self._vocabulary = None - - @staticmethod - def is_int_positive(number): - """ - Function to check if the input parameter is a integer and positive - otherwise raise an error - - Parameters - ---------- - number : str - - Returns - ------- - str: - the text with removed multiple spaces and strip text - - """ - if not isinstance(number, int): - raise ValueError("Parameter {} has to be an integer".format(number)) - if number < 1: - raise ValueError("Parameter {} has to be positive".format(number)) - - @staticmethod - def is_list_of_string(data): - """ - Function to check if the input parameter is a list of strings otherwise raise an error - - Parameters - ---------- - data - - Returns - ------- - """ - if not isinstance(data, list): - raise ValueError("{} has to be a list".format(data)) - if len(data) == 0: - raise ValueError("{} is empty".format(data)) - for document in data: - if not isinstance(document, str): - raise ValueError("All elements of {} have to be a string, problem with {}".format(data, document)) - - def compute_topics(self, nb_word_per_cluster): - """ - Main function computing the topic modeling, topics - - Parameters - ---------- - nb_word_per_cluster : positive integer - - Returns - ------- - dict : - a dictionary containing the the different topics with the top words - and coherence associated - """ - vec = CountVectorizer(stop_words=self.lang) - self._vectorize_text = vec.fit_transform(self.data).toarray() - self._vocabulary = np.array(vec.get_feature_names()) - - biterms = vec_to_biterms(self._vectorize_text) - self._btm = oBTM(num_topics=self.nb_topics, V=self._vocabulary) - self._topics = self._btm.fit_transform(biterms, iterations=self.nb_iteration) - - results = topic_summuary(self._btm.phi_wz.T, self._vectorize_text, self._vocabulary, nb_word_per_cluster, verbose=False) - - return results - - def get_document_topic(self, index): - """ - Get the cluster associated to the specified document - - Parameters - ---------- - index : positive integer - the document index - - Returns - ------- - the cluster index - """ - if self._topics is None: - raise ValueError("Model needs to be trained first") - - return self._topics[index].argmax() - - def save_pyLDAvis_plot_as_html(self, path_to_output='./biterm_pyLDAavis_plot.html'): - """ - Function saving the pyLDAvis plot associated with the compute_topics function - - Parameters - ---------- - path_to_output : str - path to save the plut, must be a html file - - Returns - ------- - """ - if self._topics is None or self._btm is None or self._vectorize_text is None or self._vocabulary is None: - raise ValueError("Model needs to be trained first") - - vis = pyLDAvis.prepare(self._btm.phi_wz.T, self._topics, np.count_nonzero(self._vectorize_text, axis=1), self._vocabulary, - np.sum(self._vectorize_text, axis=0)) - pyLDAvis.save_html(vis, path_to_output) diff --git a/nautilus_nlp/models/fasttext_classifier.py b/nautilus_nlp/models/fasttext_classifier.py deleted file mode 100644 index 39e0b08..0000000 --- a/nautilus_nlp/models/fasttext_classifier.py +++ /dev/null @@ -1,155 +0,0 @@ -# GNU Lesser General Public License v3.0 only -# Copyright (C) 2020 Artefact -# licence-information@artefact.com -# -# This program is free software; you can redistribute it and/or -# modify it under the terms of the GNU Lesser General Public -# License as published by the Free Software Foundation; either -# version 3 of the License, or (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public License -# along with this program; if not, write to the Free Software Foundation, -# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. -from sklearn.base import BaseEstimator, ClassifierMixin -import fastText -import multiprocessing - - -class Fasttext_clf(BaseEstimator, ClassifierMixin): - def __init__(self, path=None): - try: - self.model = fastText.load_model(path) - except Exception as e: - print(e) - self.model = None - - def fit(self, X, y): - # Todo Build SKlearn compatible API for training - return self - - def train( - self, - train_data, - lr=0.1, - dim=100, - ws=5, - epoch=5, - minCount=1, - minCountLabel=0, - minn=0, - maxn=0, - neg=5, - wordNgrams=1, - loss="softmax", - bucket=2000000, - thread=multiprocessing.cpu_count() - 1, - lrUpdateRate=100, - t=1e-4, - label="__label__", - verbose=2, - pretrainedVectors="", - ): - """ - Train a supervised model and return a model object. - input must be a filepath. The input text does not need to be tokenized - as per the tokenize function, but it must be preprocessed and encoded - as UTF-8. You might want to consult standard preprocessing scripts such - as tokenizer.perl mentioned here: http://www.statmt.org/wmt07/baseline.html - The input file must must contain at least one label per line. For an - example consult the example datasets which are part of the fastText - repository such as the dataset pulled by classification-example.sh. - """ - self.model = fastText.train_supervised( - input=train_data, - lr=lr, - dim=dim, - ws=ws, - epoch=epoch, - minCount=minCount, - minCountLabel=minCountLabel, - minn=minn, - maxn=maxn, - neg=neg, - wordNgrams=wordNgrams, - loss=loss, - bucket=bucket, - thread=thread, - lrUpdateRate=lrUpdateRate, - t=t, - label=label, - verbose=verbose, - pretrainedVectors=pretrainedVectors, - ) - - def predict(self, text, k=1, threshold=0.0, on_unicode_error="strict"): - """ - Given a string, get a list of labels and a list of - corresponding probabilities. k controls the number - of returned labels. A choice of 5, will return the 5 - most probable labels. By default this returns only - the most likely label and probability. threshold filters - the returned labels by a threshold on probability. A - choice of 0.5 will return labels with at least 0.5 - probability. k and threshold will be applied together to - determine the returned labels. - This function assumes to be given - a single line of text. We split words on whitespace (space, - newline, tab, vertical tab) and the control characters carriage - return, formfeed and the null character. - If the model is not supervised, this function will throw a ValueError. - If given a list of strings, it will return a list of results as usually - received for a single line of text. - """ - r = self.model.predict(text) - return r - - def predict_proba(self, text): - result_predict = self.model.predict(text) - if result_predict and len(result_predict) >= 2: - probas = result_predict[1] - if probas: - return probas[0] - return False - - def score(self, X, y=None): - return sum(self.predict(X)) - - def quantize( - self, - input=None, - qout=False, - cutoff=0, - retrain=False, - epoch=None, - lr=None, - thread=None, - verbose=None, - dsub=2, - qnorm=False, - ): - self.model.quantize( - input, qout, cutoff, retrain, epoch, lr, thread, verbose, dsub, qnorm - ) - - def test(self, path, k=1): - """Evaluate supervised model using file given by path""" - return self.model.test(path, k) - - def test_label(self, path, k=1, threshold=0.0): - """ - Return the precision and recall score for each label. - The returned value is a dictionary, where the key is the label. - For example: - f.test_label(...) - {'__label__italian-cuisine' : {'precision' : 0.7, 'recall' : 0.74}} - """ - return self.model.test_label(path, k, threshold) - - def save_model(self, path): - """Save the model to the given path""" - self.model.save_model(path) diff --git a/nautilus_nlp/models/fasttext_embedding.py b/nautilus_nlp/models/fasttext_embedding.py deleted file mode 100644 index f3432b7..0000000 --- a/nautilus_nlp/models/fasttext_embedding.py +++ /dev/null @@ -1,118 +0,0 @@ -# GNU Lesser General Public License v3.0 only -# Copyright (C) 2020 Artefact -# licence-information@artefact.com -# -# This program is free software; you can redistribute it and/or -# modify it under the terms of the GNU Lesser General Public -# License as published by the Free Software Foundation; either -# version 3 of the License, or (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public License -# along with this program; if not, write to the Free Software Foundation, -# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. -import fastText -import multiprocessing - - -class FasttextEmbedding(object): - def __init__(self, path=None): - try: - self.model = fastText.load_model(path) - except Exception as e: - print(e) - self.model = None - - def get_word_vector(self, word: str): - """ - Return the wordvector of a word according to pretrained model - - Parameters - ---------- - word : string - the input document - - Returns - ------- - array - """ - - return self.model.get_word_vector(word) - - def get_document_vector(self, document: str): - """ - Return the wordvector of a full document according to pretrained model - To build the vector, each word-wordvector is divided by its norm, then the array of vector is averaged - The document must be cleaned beforehand (no EOL) - - Parameters - ---------- - Input document : string - the input document - - Returns - ------- - array - """ - return self.model.get_sentence_vector(document) - - def train( - self, - input, - model="skipgram", - lr=0.05, - dim=100, - ws=5, - epoch=5, - minCount=5, - minCountLabel=0, - minn=3, - maxn=6, - neg=5, - wordNgrams=1, - loss="ns", - bucket=2000000, - thread=multiprocessing.cpu_count() - 1, - lrUpdateRate=100, - t=1e-4, - label="__label__", - verbose=2, - pretrainedVectors="", - ): - """ - Train an unsupervised model and return a model object. - input must be a filepath. The input text does not need to be tokenized - as per the tokenize function, but it must be preprocessed and encoded - as UTF-8. You might want to consult standard preprocessing scripts such - as tokenizer.perl mentioned here: http://www.statmt.org/wmt07/baseline.html - The input field must not contain any labels or use the specified label prefix - unless it is ok for those words to be ignored. For an example consult the - dataset pulled by the example script word-vector-example.sh, which is - part of the fastText repository. - """ - self.model.train_unsupervised( - input=input, - model=model, - lr=lr, - dim=dim, - ws=ws, - epoch=epoch, - minCount=minCount, - minCountLabel=minCountLabel, - minn=minn, - maxn=maxn, - neg=neg, - wordNgrams=wordNgrams, - loss=loss, - bucket=bucket, - thread=thread, - lrUpdateRate=lrUpdateRate, - t=t, - label=label, - verbose=verbose, - pretrainedVectors=pretrainedVectors, - ) diff --git a/nautilus_nlp/models/language_detector.py b/nautilus_nlp/models/language_detector.py deleted file mode 100644 index cc3a0a9..0000000 --- a/nautilus_nlp/models/language_detector.py +++ /dev/null @@ -1,54 +0,0 @@ -# GNU Lesser General Public License v3.0 only -# Copyright (C) 2020 Artefact -# licence-information@artefact.com -# -# This program is free software; you can redistribute it and/or -# modify it under the terms of the GNU Lesser General Public -# License as published by the Free Software Foundation; either -# version 3 of the License, or (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public License -# along with this program; if not, write to the Free Software Foundation, -# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. -from nautilus_nlp.models.fasttext_classifier import Fasttext_clf as langdetect -from nautilus_nlp.preprocessing.text_preprocess import TextPreprocessor -import pkg_resources - -lang_path = pkg_resources.resource_filename( - "nautilus_nlp.data", "lang_identification.ftz" -) - - -class LangDetector: - """ - This class is to instantiante a language detector. - """ - - def __init__(self, path=None): - self.path = path if path is not None else lang_path - self.model = langdetect(self.path) - - def detect_language(self, text_to_detect=None): - """ - Detected the language of a text - - Parameters - ---------- - hint_language : string - language you expect your text to be - - Returns - ------- - is_reliable : - is the top language is much better than 2nd best language? - language: - 2-letter code for the language of the text - """ - preprocessor = TextPreprocessor(text_to_detect) - best_guesses = self.model.predict(preprocessor.remove_EOL_characters()) - return best_guesses[0][0].replace("__label__", ""), best_guesses[1][0] diff --git a/nautilus_nlp/models/nmf_model.py b/nautilus_nlp/models/nmf_model.py deleted file mode 100644 index 005c09b..0000000 --- a/nautilus_nlp/models/nmf_model.py +++ /dev/null @@ -1,118 +0,0 @@ -# GNU Lesser General Public License v3.0 only -# Copyright (C) 2020 Artefact -# licence-information@artefact.com -# -# This program is free software; you can redistribute it and/or -# modify it under the terms of the GNU Lesser General Public -# License as published by the Free Software Foundation; either -# version 3 of the License, or (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public License -# along with this program; if not, write to the Free Software Foundation, -# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. -import time -import numpy as np -from numpy.linalg import norm -from tqdm import tqdm - -''' -Topic Modeling via NMF -''' - -class NMF(object): - def __init__( - self, - A, IW=[], IH=[], - n_topic=10, max_iter=100, max_err=1e-3, - rand_init=True): - """ - The objective of the NMF model is to approximate the term-document matrix A by two lower-rank matrices W and H. - The process is iterative and we denote IW and IH the the matrix W and H that are updated at each step. - - :param A: The term-document matrix - :param IW: topics Matrix, each column vector W(:,k) represents the k-th topic in terms of M keywords - and its elements are the weights of the corresponding keywords. - :param IH: The row vector H(j,:) is the latent representation for document j in terms of K topics - :param n_topic: Number of selected topics - :param max_iter: Maximum number of iterations to update W and H - :param max_err: maximum error under which we consider that the loop converged - :param rand_init: random init boolean - """ - self.A = A - self.n_row = A.shape[0] - self.n_col = A.shape[1] - - self.n_topic = n_topic - self.max_iter = max_iter - self.max_err = max_err - - self.loss_hist = [] - self.nmf_mat_init(rand_init) - self.nmf_iter() - - def nmf_mat_init(self, rand_init): - """ - Init Matrices W and H initially either randomly or using existing IW, IH matrices taken when iterating. - :param rand_init: Boolean indicating initial random init - """ - if rand_init: - self.W = np.random.random((self.n_row, self.n_topic)) - self.H = np.random.random((self.n_col, self.n_topic)) - else: - self.W = IW - self.H = IH - for k in range(self.n_topic): - self.W[:, k] /= norm(self.W[:, k]) - - def nmf_iter(self): - """ - Main iterative loop for matrix decomposition - """ - loss_old = 1e20 - start_time = time.time() - for i in tqdm(range(self.max_iter)): - self.nmf_solver() - loss = self.nmf_loss() - self.loss_hist.append(loss) - - if loss_old - loss < self.max_err: - print('Matrix decomposition loop converged!') - break - loss_old = loss - end_time = time.time() - print('Step={}, Loss={}, Time={}s'.format(i, loss, end_time - start_time)) - - def nmf_solver(self): - ''' - regular NMF without constraint. - Block Coordinate Decent - ''' - epss = 1e-20 - - HtH = self.H.T.dot(self.H) - AH = self.A.dot(self.H) - for k in range(self.n_topic): - tmpW = self.W[:, k] * HtH[k, k] + AH[:, k] - np.dot(self.W, HtH[:, k]) - self.W[:, k] = np.maximum(tmpW, epss) - self.W[:, k] /= norm(self.W[:, k]) + epss - - WtW = self.W.T.dot(self.W) - AtW = self.A.T.dot(self.W) - for k in range(self.n_topic): - self.H[:, k] = self.H[:, k] * WtW[k, k] + AtW[:, k] - np.dot(self.H, WtW[:, k]) - self.H[:, k] = np.maximum(self.H[:, k], epss) - - def nmf_loss(self): - loss = norm(self.A - np.dot(self.W, np.transpose(self.H)), 'fro') ** 2 / 2.0 - return loss - - def get_loss(self): - return np.array(self.loss_hist) - - def get_decomposition_matrix(self): - return self.W, self.H diff --git a/nautilus_nlp/models/seanmf_model.py b/nautilus_nlp/models/seanmf_model.py deleted file mode 100644 index 7248148..0000000 --- a/nautilus_nlp/models/seanmf_model.py +++ /dev/null @@ -1,148 +0,0 @@ -# GNU Lesser General Public License v3.0 only -# Copyright (C) 2020 Artefact -# licence-information@artefact.com -# -# This program is free software; you can redistribute it and/or -# modify it under the terms of the GNU Lesser General Public -# License as published by the Free Software Foundation; either -# version 3 of the License, or (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public License -# along with this program; if not, write to the Free Software Foundation, -# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - -import time -import numpy as np -from numpy.linalg import norm -from tqdm import tqdm - - -class SeaNMF(object): - def __init__( - self, - A, S, - IW=[], IWc=[], IH=[], - alpha=1.0, beta=0.1, n_topic=10, max_iter=100, max_err=1e-3, - rand_init=True, fix_seed=False): - """ - Seanmf is a topic modeling algorithm, paper: http://dmkd.cs.vt.edu/papers/WWW18.pdf. - It finds an approximation to the term-document matrix A by two lower-rank matrices W and H, - at each iteration a context matrix Wc are computed and used to update W. - :param A: document term matrix - :param S: Word-context (semantic) correlation matrix - :param IW: topics Matrix, each column vector W(:,k) represents the k-th topic in terms of M keywords - and its elements are the weights of the corresponding keywords. - :param IWc: Latent factor matrix of contexts. - :param IH: The row vector H(j,:) is the latent representation for document j in terms of K topics - :param alpha: Seanmf algorithm parameter - :param beta: Seanmf algorithm parameter - :param n_topic: Number of selected topics - :param max_iter: Maximum number of iterations to update W and H - :param max_err: maximum error under which we consider that the loop converged - :param rand_init: random init boolean - :param fix_seed: int number to fix random seed. - """ - if fix_seed: - np.random.seed(0) - - self.A = A - self.S = S - - self.n_row = A.shape[0] - self.n_col = A.shape[1] - - self.n_topic = n_topic - self.max_iter = max_iter - self.alpha = alpha - self.beta = beta - self.B = np.ones([self.n_topic, 1]) - self.max_err = max_err - self.snmf_mat_init(rand_init, IW, IWc, IH) - self.snmf_iter() - - def snmf_mat_init(self, rand_init, IW=[], IWc=[], IH=[]): - """ - Init Matrices W,Wc and H initially either randomly or using existing IW,IWc IH matrices taken when iterating. - :param rand_init: Boolean indicating initial random init - """ - if rand_init: - self.W = np.random.random((self.n_row, self.n_topic)) - self.Wc = np.random.random((self.n_row, self.n_topic)) - self.H = np.random.random((self.n_col, self.n_topic)) - else: - self.W = IW - self.Wc = IWc - self.H = IH - for k in range(self.n_topic): - self.W[:, k] /= norm(self.W[:, k]) - self.Wc[:, k] /= norm(self.Wc[:, k]) - - def snmf_iter(self): - """ - Main iterative loop for matrix decomposition - """ - loss_old = 1e20 - start_time = time.time() - for i in tqdm(range(self.max_iter)): - self.snmf_solver() - loss = self.snmf_loss() - if loss_old - loss < self.max_err: - print('Matrix decomposition loop converged!') - break - loss_old = loss - end_time = time.time() - print('Step={}, Loss={}, Time={}s'.format(i, loss, end_time - start_time)) - - def snmf_solver(self): - ''' - using BCD framework - Alogorithm 1: Equations to update W, wc, H are described in the paper - http://dmkd.cs.vt.edu/papers/WWW18.pdf - ''' - - epss = 1e-20 - # Update W - AH = np.dot(self.A, self.H) - SWc = np.dot(self.S, self.Wc) - HtH = np.dot(self.H.T, self.H) - WctWc = np.dot(self.Wc.T, self.Wc) - W1 = self.W.dot(self.B) - - for k in range(self.n_topic): - num0 = HtH[k, k] * self.W[:, k] + self.alpha * WctWc[k, k] * self.W[:, k] - num1 = AH[:, k] + self.alpha * SWc[:, k] - num2 = np.dot(self.W, HtH[:, k]) + self.alpha * np.dot(self.W, WctWc[:, k]) + self.beta * W1[0] - self.W[:, k] = num0 + num1 - num2 - self.W[:, k] = np.maximum(self.W[:, k], epss) # project > 0 - self.W[:, k] /= norm(self.W[:, k]) + epss # normalize - # Update Wc - WtW = self.W.T.dot(self.W) - StW = np.dot(self.S, self.W) - for k in range(self.n_topic): - self.Wc[:, k] = self.Wc[:, k] + StW[:, k] - np.dot(self.Wc, WtW[:, k]) - self.Wc[:, k] = np.maximum(self.Wc[:, k], epss) - # Update H - AtW = np.dot(self.A.T, self.W) - for k in range(self.n_topic): - self.H[:, k] = self.H[:, k] + AtW[:, k] - np.dot(self.H, WtW[:, k]) - self.H[:, k] = np.maximum(self.H[:, k], epss) - - def snmf_loss(self): - loss = norm(self.A - np.dot(self.W, np.transpose(self.H)), 'fro') ** 2 / 2.0 - if self.alpha > 0: - loss += self.alpha * norm(np.dot(self.W, np.transpose(self.Wc)) - self.S, 'fro') ** 2 / 2.0 - if self.beta > 0: - loss += self.beta * norm(self.W, 1) ** 2 / 2.0 - - return loss - - def get_decomposition_matrix(self): - # Wc was not considered to keep same structure as NMF - return self.W, self.H - - diff --git a/nautilus_nlp/models/sentiment_detector.py b/nautilus_nlp/models/sentiment_detector.py deleted file mode 100644 index 146eeac..0000000 --- a/nautilus_nlp/models/sentiment_detector.py +++ /dev/null @@ -1,65 +0,0 @@ -# GNU Lesser General Public License v3.0 only -# Copyright (C) 2020 Artefact -# licence-information@artefact.com -# -# This program is free software; you can redistribute it and/or -# modify it under the terms of the GNU Lesser General Public -# License as published by the Free Software Foundation; either -# version 3 of the License, or (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public License -# along with this program; if not, write to the Free Software Foundation, -# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. -from nautilus_nlp.utils.tokenizer import _convert_tokens_to_string, _convert_string_to_tokens - -import textblob -from textblob import Blobber -from textblob import TextBlob -from textblob_fr import PatternTagger, PatternAnalyzer -from vaderSentiment.vaderSentiment import SentimentIntensityAnalyzer - - -def compute_sentiment_score(tokens_or_txt, lang_module:str='en_textblob')->float: - """ - Compute a sentiment score using pre-trained lexicons: TextBlob or Vader. - Output a score from -1 to 1, depending if the text is negative neutral - of positive. - - Parameters - ---------- - tokens_or_txt - the text to be processed - - lang_module - ('fr_textblob','en_textblob','en_vader') - - Returns - ------- - float - Polarity score from -1 to 1 - """ - text = _convert_tokens_to_string(tokens_or_txt) - output = '' - if lang_module is 'fr_textblob': - tb = Blobber(pos_tagger=PatternTagger(), analyzer=PatternAnalyzer()) - blob = tb(text) - output = blob.sentiment[0] - - elif lang_module is 'en_textblob': - blob = TextBlob(text) - output = blob.sentiment.polarity - - elif lang_module is 'en_vader': - analyser = SentimentIntensityAnalyzer() - snt = analyser.polarity_scores(text) - output = snt['compound'] - else: - raise ValueError('Please enter a valid module name!') - - assert output != '' - return output \ No newline at end of file diff --git a/nautilus_nlp/models/sk_vectorizer.py b/nautilus_nlp/models/sk_vectorizer.py deleted file mode 100644 index 926735a..0000000 --- a/nautilus_nlp/models/sk_vectorizer.py +++ /dev/null @@ -1,34 +0,0 @@ -# GNU Lesser General Public License v3.0 only -# Copyright (C) 2020 Artefact -# licence-information@artefact.com -# -# This program is free software; you can redistribute it and/or -# modify it under the terms of the GNU Lesser General Public -# License as published by the Free Software Foundation; either -# version 3 of the License, or (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public License -# along with this program; if not, write to the Free Software Foundation, -# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. -from sklearn.feature_extraction.text import CountVectorizer -from sklearn.base import BaseEstimator, ClassifierMixin - - -class sk_vectorizer(BaseEstimator, ClassifierMixin): - def __init__(self): - self.model = CountVectorizer() - - def fit(self, train_data): - self.model.fit(train_data) - - def fit_transform(self, train_data): - self.model.fit_transform(train_data) - return train_data - - def transform(self, data): - return self.model.transform(data) diff --git a/nautilus_nlp/models/text_vectorizers.py b/nautilus_nlp/models/text_vectorizers.py deleted file mode 100644 index dec03dc..0000000 --- a/nautilus_nlp/models/text_vectorizers.py +++ /dev/null @@ -1,295 +0,0 @@ -# GNU Lesser General Public License v3.0 only -# Copyright (C) 2020 Artefact -# licence-information@artefact.com -# -# This program is free software; you can redistribute it and/or -# modify it under the terms of the GNU Lesser General Public -# License as published by the Free Software Foundation; either -# version 3 of the License, or (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public License -# along with this program; if not, write to the Free Software Foundation, -# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. -import spacy -from gensim.corpora import Dictionary -from gensim.models.tfidfmodel import TfidfModel -from gensim import corpora, models, similarities -from gensim.matutils import sparse2full -import numpy as np -import math - -from sklearn.feature_extraction.text import TfidfVectorizer as _TfidfVectorizer - - -class TfidfTextVectorizer(object): - """ - Convert a collection of raw documents to a matrix of TF-IDF features. - - Inputs a list of string. - and the list of feature name. - Wrapper of https://scikit-learn.org/stable/modules/generated/sklearn.feature_extraction.text.TfidfVectorizer.html - - Parameters - ---------- - input=’content’, encoding=’utf-8’, decode_error=’strict’, strip_accents=None, - lowercase=True, preprocessor=None, tokenizer=None, analyzer=’word’, - stop_words=None, token_pattern=’(?u)\b\w\w+\b’, ngram_range=(1, 1), - max_df=1.0, min_df=1, max_features=None, vocabulary=None, binary=False, - dtype=<class ‘numpy.float64’>, norm=’l2’, use_idf=True, smooth_idf=True, sublinear_tf=False - """ - - def __init__(self, **kwargs): - self.tfidf_vectorizer = _TfidfVectorizer(**kwargs) - - - def _get_features_name(self): - ''' - Array mapping from feature integer indices to feature name - ''' - self.feature_names = self.tfidf_vectorizer.get_feature_names() - return self.feature_names - - - def compute_tfidf(self, raw_documents): - ''' - Learn vocabulary and idf, return term-document matrix. - - Input a list of documents (string) - Output the wordcount vector matrix. - - params - ------ - raw_documents : iterable - an iterable which yields either str, unicode or file objects - - returns - ------- - X : sparse matrix, [n_samples, n_features] - Tf-idf-weighted document-term matrix. - ''' - self.word_count_vector = self.tfidf_vectorizer.fit_transform(raw_documents) - self._get_features_name() - return self.word_count_vector - - - def apply_tfidf_to_documents(self, raw_document): - ''' - Apply the tf-idf weights to a document or a list of documents. - Equivalent to .transform() method in sci-kit learn. - - Uses the vocabulary and document frequencies (df) learned by fit - (or fit_transform), and convert documents to document-term matrix. - - parameters - --------- - raw_documents : iterable or document - an iterable which yields either str, unicode or file objects, or - a string. - - Returns - ------- - X : sparse matrix, [n_samples, n_features] - Tf-idf-weighted document-term matrix. - ''' - if type(raw_document) == str: - raw_document = [raw_document] - return self.tfidf_vectorizer.transform(raw_document) - - - def _sort_coo(self, coo_matrix): - '''sort the tf-idf vectors by descending order of scores''' - tuples = zip(coo_matrix.col, coo_matrix.data) - return sorted(tuples, key=lambda x: (x[1], x[0]), reverse=True) - - - def _extract_topn_from_vector(self, feature_names, sorted_items, topn=10): - """get the feature names and tf-idf score of top n items""" - - #use only topn items from vector - sorted_items = sorted_items[:topn] - - score_vals = [] - feature_vals = [] - - # word index and corresponding tf-idf score - for idx, score in sorted_items: - - #keep track of feature name and its corresponding score - score_vals.append(round(score, 3)) - feature_vals.append(feature_names[idx]) - - #create a tuples of feature,score - #results = zip(feature_vals,score_vals) - results= {} - for idx in range(len(feature_vals)): - results[feature_vals[idx]]=score_vals[idx] - - return results - - - def get_top_tfidf_per_doc(self, text:str, n:int=10)->list: - ''' - compute TF-IDF for a given doc, and returns a list of the top N weighted words - - parameters - --------- - text : sparse matrix, [n_samples, n_features] - If specified, will return the top weighted words for the given matrix, - otherwise will give the result of the tf-idf matrix - a string. - - n : number of terms to display - - Returns - ------- - top-n weighted terms : dict - List of top terms for the given document - ''' - tf_idf_vector= self.apply_tfidf_to_documents([text]) - sorted_items=self._sort_coo(tf_idf_vector.tocoo()) - return list(self._extract_topn_from_vector(self.feature_names, sorted_items, n).keys()) - - - def get_top_tfidf(self, tfidf_matrix=None, n:int=10)->list: - ''' - Input a tf-idf matrix, and returns a dict of the top N weighted words, - with their weight. - - parameters - --------- - tfidf_matrix : sparse matrix, [n_samples, n_features] - If specified, will return the top weighted words for the given matrix, - otherwise will give the result of the tf-idf matrix - a string. - - Returns - ------- - top-n weighted terms : dict - Dict of top terms and their associated weighted. - ''' - if tfidf_matrix is None: - tfidf_matrix = self.word_count_vector - return self._extract_topn_from_vector(self.feature_names, self._sort_coo(tfidf_matrix.tocoo()), topn=n) - - -class GensimTextVectorizer(object): - ''' - Gensim's implementation of TF-IDF, BOW models etc. - ''' - def __init__(self, doc_list): - # Initialize - self.doc_list = doc_list - self.nlp, self.docs, self.docs_dict = self._preprocess(self.doc_list) - - # Functions to lemmatise docs - def _keep_token(self, t): - return t.is_alpha and not (t.is_space or t.is_punct or t.is_stop or t.like_num) - - def _lemmatize_doc(self, doc): - return [t.lemma_ for t in doc if self._keep_token(t)] - - # Gensim to create a dictionary and filter out stop and infrequent words (lemmas). - def _get_docs_dict(self, docs): - docs_dict = Dictionary(docs) - # CAREFUL: For small corpus please carefully modify the parameters for filter_extremes, or simply comment it out. - docs_dict.filter_extremes(no_below=5, no_above=0.2) - docs_dict.compactify() - return docs_dict - - # Preprocess docs - def _preprocess(self, doc_list): - # Load spacy model - nlp = spacy.load("en") - # lemmatise docs - docs = [self._lemmatize_doc(nlp(doc)) for doc in doc_list] - # Get docs dictionary - docs_dict = self._get_docs_dict(docs) - return nlp, docs, docs_dict - - - def _get_tfidf(self, docs, docs_dict): - ''' - Gensim can again be used to create a bag-of-words representation of each document, - Build the TF-IDF model, and compute the TF-IDF vector for each document. - ''' - docs_corpus = [docs_dict.doc2bow(doc) for doc in docs] - model_tfidf = TfidfModel(docs_corpus, id2word=docs_dict) - docs_tfidf = model_tfidf[docs_corpus] - docs_vecs = np.vstack([sparse2full(c, len(docs_dict)) for c in docs_tfidf]) - return docs_vecs - - def _document_vector(self, doc, docs_dict, nlp): - """ - Get avg w2v for one document. Remove out-of-vocabulary words. - """ - - doc_vector = [nlp(word).vector for word in doc if word in docs_dict.token2id] - return np.mean(doc_vector, axis=0) - - - def avg_wv(self): - ''' - Get average vector for document list - ''' - docs_vecs = np.vstack( - [self._document_vector(doc, self.docs_dict, self.nlp) for doc in self.docs] - ) - return docs_vecs - - - def get_tfidf(self): - ''' - Get TF-IDF vector for document list - ''' - docs_corpus = [self.docs_dict.doc2bow(doc) for doc in self.docs] - model_tfidf = TfidfModel(docs_corpus, id2word=self.docs_dict) - docs_tfidf = model_tfidf[docs_corpus] - docs_vecs = np.vstack([sparse2full(c, len(self.docs_dict)) for c in docs_tfidf]) - return docs_vecs - - - def get_lsi(self, num_topics=300): - ''' - Get Latent Semantic Indexing(LSI) vector for document list - ''' - docs_corpus = [self.docs_dict.doc2bow(doc) for doc in self.docs] - model_lsi = models.LsiModel(docs_corpus, num_topics, id2word=self.docs_dict) - docs_lsi = model_lsi[docs_corpus] - docs_vecs = np.vstack([sparse2full(c, len(self.docs_dict)) for c in docs_lsi]) - return docs_vecs - - - def get_rp(self): - ''' - Get Random Projections(RP) vector for document list - ''' - docs_corpus = [self.docs_dict.doc2bow(doc) for doc in self.docs] - model_rp = models.RpModel(docs_corpus, id2word=self.docs_dict) - docs_rp = model_rp[docs_corpus] - docs_vecs = np.vstack([sparse2full(c, len(self.docs_dict)) for c in docs_rp]) - return docs_vecs - - def get_lda(self, num_topics=100): - ''' - Get Latent Dirichlet Allocation(LDA) vector for document list - ''' - docs_corpus = [self.docs_dict.doc2bow(doc) for doc in self.docs] - model_lda = models.LdaModel(docs_corpus, num_topics, id2word=self.docs_dict) - docs_lda = model_lda[docs_corpus] - docs_vecs = np.vstack([sparse2full(c, len(self.docs_dict)) for c in docs_lda]) - return docs_vecs - - def get_hdp(self): - ''' - Get Hierarchical Dirichlet Process(HDP) vector for document list - ''' - docs_corpus = [self.docs_dict.doc2bow(doc) for doc in self.docs] - model_hdp = models.HdpModel(docs_corpus, id2word=self.docs_dict) - docs_hdp = model_hdp[docs_corpus] - docs_vecs = np.vstack([sparse2full(c, len(self.docs_dict)) for c in docs_hdp]) - return docs_vecs diff --git a/nautilus_nlp/models/topic_modeling.py b/nautilus_nlp/models/topic_modeling.py deleted file mode 100644 index 686c824..0000000 --- a/nautilus_nlp/models/topic_modeling.py +++ /dev/null @@ -1,315 +0,0 @@ -# GNU Lesser General Public License v3.0 only -# Copyright (C) 2020 Artefact -# licence-information@artefact.com -# -# This program is free software; you can redistribute it and/or -# modify it under the terms of the GNU Lesser General Public -# License as published by the Free Software Foundation; either -# version 3 of the License, or (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public License -# along with this program; if not, write to the Free Software Foundation, -# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. -import gensim -import logging -import os -import pyLDAvis -import pyLDAvis.gensim -from gensim.models import CoherenceModel -from gensim.models.wrappers import LdaMallet -import matplotlib.pyplot as plt - -from IPython.display import HTML - -logging.getLogger("gensim").setLevel(logging.WARNING) - - -def create_dictionary(data): - """ - Create a Dictionary encapsulates the mapping between normalized words and their integer ids. - - Parameters - ---------- - data : list of list of tokens - - Returns - ------- - list of list of tuples - """ - return gensim.corpora.Dictionary(data) - -def filter_extremes(dictionary, no_below=15, no_above=0.3 , **kwargs) : - """ - Remove very rare and very common words - - Parameters - ---------- - dictionary: dictionary containing the number of times a word appears in the dataset set - no_below : int, optional - Keep tokens which are contained in at least `no_below` documents. - no_above : float, optional - Keep tokens which are contained in no more than `no_above` documents - (fraction of total corpus size, not an absolute number). - - (Add to docstring) + other func - """ - return dictionary.filter_extremes(no_below=no_below, no_above=no_above, **kwargs) - - -def create_bow_corpus(data, dictionary): - - """ - Create the corpus: one of the two main inputs to the LDA topic model with the dictionary (id2word) - The produced corpus is a mapping of (token_id, token_count). - - Parameters - ---------- - data : list of list of tokens - - Returns - ------- - list of list of tuples - """ - texts = data - corpus = [dictionary.doc2bow(text) for text in texts] - return corpus - -### Find Number of topics - -def compute_coherence_values(dictionary, bow_corpus, texts, limit=25, start=2, step=4): - """ - Compute c_v coherence for various number of topics - - /!\ It takes a really long time. - - Parameters: - ---------- - dictionary : Gensim dictionary - bow_corpus : Gensim bow corpus - texts : List of input texts - limit : Max num of topics - - Returns: - ------- - model_list : List of LDA topic models - coherence_values : Coherence values corresponding to the LDA model with respective number of topics - """ - coherence_values = [] - model_list = [] - for num_topics in range(start, limit, step): - model = gensim.models.ldamodel.LdaModel(corpus=bow_corpus, - id2word=dictionary, - num_topics=num_topics, - random_state=0, - update_every=5, - chunksize=1000, - passes=10) - model_list.append(model) - coherencemodel = CoherenceModel(model=model, texts=texts, dictionary=dictionary, coherence='c_v') - coherence_values.append(coherencemodel.get_coherence()) - - return model_list, coherence_values - -def plot_optimal_topic_number(coherence_values, start=2, limit=25, step=4): - """ - Plot the coherence scores per number of topics - - Parameters: - ---------- - coherence_values : list of coherence scores for various number of topics - start : int. Min num of topics - limit : int. Max num of topics - step: int - - Output: - ------- - Lineplot - """ - x = range(start, limit, step) - plt.plot(x, coherence_values) - plt.xlabel("Num Topics") - plt.ylabel("Coherence score") - plt.legend(("coherence_values"), loc='best') - return plt.show() - -def print_coherence_scores(coherence_values, start=2, limit=25, step=4): - """ - Print the coherences scores for the ldamodels that had been tested with different number of topics - """ - x = range(start, limit, step) - for m, cv in zip(x, coherence_values): - print("Num Topics =", m, " has Coherence Value of", round(cv, 4)) - - -### LdaModel: Gensim & Mallet - -def train_lda_model(bow_corpus, dictionary, num_topics, model='gensim', mallet_path=None, **kwargs): - """ Train the lda model on the corpus - - Parameters - ---------- - bow_corpus : iterable of list of tokens. Stream of document vectors or sparse matrix of shape (num_terms, num_documents). - dictionary: corpora.Dictionary. Mapping from word IDs to words - num_topics: int - model : str. Precise the topic modeling model wanted, must be "gensim" or "mallet" - mallet_path: str, optionnal if model='gensim', required if model='mallet'. Path to the mallet-2.0.8 file - - Returns - ------- - gensim.ldamodel - """ - if model == 'gensim': - model = train_lda_gensim(bow_corpus, dictionary, num_topics, **kwargs) - elif model == 'mallet': - if mallet_path is None: - raise ValueError('You must precise the path to the mallet-2.0.8 file that has been downloaded before') - else: - model = train_lda_mallet(bow_corpus, dictionary, num_topics, mallet_path, **kwargs) - else: - raise ValueError('Please enter a valid model name: gensim or mallet') - return model - -def train_lda_gensim(bow_corpus, dictionary, num_topics, **kwargs): - - model = gensim.models.ldamodel.LdaModel(corpus=bow_corpus, id2word=dictionary, num_topics=num_topics, passes=10, minimum_probability=0.001, random_state=0, **kwargs) - return model - -def train_lda_mallet(bow_corpus, dictionary, num_topics, mallet_path, **kwargs): - - os.environ['MALLET_PATH'] = mallet_path - mallet = '$MALLET_PATH/mallet-2.0.8/bin/mallet' - model = gensim.models.wrappers.LdaMallet(mallet, corpus=bow_corpus, id2word=dictionary, num_topics=num_topics, prefix='composant', random_seed=0, **kwargs) - return model - - -def save_model(model, model_name): - """ - Save the model that has been trained. The model will be saved on your current emplacement. - - Parameters - ---------- - model: ldamodel - model_name: str. - Name the model that will be saved - """ - return model.save(os.path.join(model_name)) - - -def load_model(model_path,model_name, model='gensim', model_prefix='composant'): - """ - Detected the language of a text - - Parameters - ---------- - model_path: str - path where the model has been saved - model_name: str - name of the saved model - model : str - Precise the topic modeling model wanted, must be "gensim" or "mallet" - model_prefix : str - By default, 'composant' default prefix used while saving the mallet model with train_lda_model function. - - Returns - ------- - is_reliable : - is the top language is much better than 2nd best language? - language: - 2-letter code for the language of the text - """ - if model =='gensim': - ldamodel = gensim.models.LdaModel.load(os.path.join(model_path,model_name)) - elif model =='mallet': - ldamodel = LdaMallet.load(os.path.join(model_path,model_name)) - if model_prefix is not None: - ldamodel.prefix = model_path+'/'+ model_prefix - else: - raise ValueError('Please enter a valid model name: gensim or mallet') - return ldamodel - -def fit_data(model, bow): - """Test the model on new, unseen documents""" - return model.get_document_topics(bow, minimum_probability=0) - - -# Visualization - - -def visualize_topics(model, bow_corpus, dictionary, model_type=None): - """ - Visualize the topics-keywords with the pyLDAvis interactive chart. - (Work well in notebook) - - Parameters - ---------- - model: LDA model: gensim or mallet - bow_corpus : iterable of list of tokens. - dictionary: corpora.Dictionary. Dictionary encapsulates the mapping between normalized words and their integer ids. - model : str. Precise the topic modeling model used, must be "gensim" or "mallet" - - Returns: - ---------- - 3D interactive chart - """ - if model_type == 'mallet': - model_vis = gensim.models.wrappers.ldamallet.malletmodel2ldamodel(model) - elif model_type == 'gensim': - model_vis = model - elif model_type is None: - raise ValueError('You forgot to precise your model type, it must be: gensim or mallet') - else: - raise ValueError('Please enter a valid model name: gensim or mallet') - return pyLDAvis.gensim.prepare(model_vis, bow_corpus, dictionary) - -def save_pyldavis(pyldavis, vis_path, vis_name): - """ - Save the pyldavis interactive chart - - Parameters - ---------- - pyldavis: pyLDAvis._prepare.PreparedData - vis_path: str - vis_name: str - """ - return pyLDAvis.save_html(pyldavis, os.path.join(vis_path, vis_name + '{}'.format('.html'))) - - - -def show_pyldavis(vis_path, vis_name): - """ - Display the HTML of the saved pyldavis interactive chart - - Parameters - ---------- - vis_path: str - vis_name: str - """ - return HTML(filename=os.path.join(vis_path, vis_name + '{}'.format('.html'))) - -def show_dominant_topic(model, bow_corpus, topic_number=1, topn=5): - """ Print the dominant topics in the document, its score and the topics' top keywords. - - Quick way to interpret the topics - - Parameters - ---------- - gensim.ldamodel - model: ldamodel - bow_corpus: iterable of list of tokens. - topic_number: int. Pick the number of topics displayed - topn: int. Number of topics' top keyword displayed - - """ - i = 0 - for index, score in sorted(model[bow_corpus], key=lambda tup: -1*tup[1]): - weight = model.show_topic(index, topn=topn) - keywords = [i[0] for i in weight] - print("Score: {}\t Topic: {}".format(score, keywords)) - i +=1 - if i == topic_number: - break diff --git a/nautilus_nlp/models/topic_modeling_short_text.py b/nautilus_nlp/models/topic_modeling_short_text.py deleted file mode 100644 index 73fad26..0000000 --- a/nautilus_nlp/models/topic_modeling_short_text.py +++ /dev/null @@ -1,280 +0,0 @@ -# GNU Lesser General Public License v3.0 only -# Copyright (C) 2020 Artefact -# licence-information@artefact.com -# -# This program is free software; you can redistribute it and/or -# modify it under the terms of the GNU Lesser General Public -# License as published by the Free Software Foundation; either -# version 3 of the License, or (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public License -# along with this program; if not, write to the Free Software Foundation, -# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. -import re -from collections import Counter -from itertools import product -from nautilus_nlp.models.nmf_model import * -from nautilus_nlp.models.seanmf_model import * -import numpy as np -import pyLDAvis - - -def prepare_data(text, vocab_min_count=1, vocab_max_size=10000): - """ - :param text: list of str on which the topic modeling will be performed - :param vocab_min_count: minimum number of occurrences of a word to be considered in the vocabulary - :param vocab_max_size: maximum number of word in the vocabulary - :return: encoded_text_id: list of encoded sentences using vocab IDs - vocab_list: list of vocabulary - vocab_arr: array with vocab frequency counts - """ - vocab = {} - - # Tokens_list is a list of sub-lists where each sub-list contains a sentences' tokens. - tokens_list=[] - for sentence in text: - sentence = re.split('\s', sentence) - tokens_list.append(sentence) - vocab = dict(Counter(x for xs in tokens_list for x in xs)) - - # Create Vocab array ( list of sorted vocab + counts ) - vocab_arr = [[wd, vocab[wd]] for wd in vocab if vocab[wd] > vocab_min_count] - vocab_arr = sorted(vocab_arr, key=lambda k: k[1])[::-1] - vocab_arr = vocab_arr[:vocab_max_size] - vocab_arr = sorted(vocab_arr) - - vocab_list = list(map(lambda x:x[0], vocab_arr)) - # Create Vocab to ID dictionnary - vocab2id = {itm[1][0]: itm[0] for itm in enumerate(vocab_arr)} - - # Create ID representation of text (ie: each sentence is a list of vocabId ) - encoded_text_id = [] - for sentence in text: - sentence = re.split('\s', sentence) - sentence = [int(vocab2id[wd]) for wd in sentence if wd in vocab2id] - encoded_text_id.append(sentence) - - return encoded_text_id, vocab_list, vocab_arr - - -def train_shorttext_model(model_name, encoded_text_id, vocab_list, n_topics=20, max_iter=20, max_err=0.1, alpha=0, beta=0): - """ - :param model_name: string = 'nmf' or 'seanmf' - :param encoded_text_id: list of encoded sentences - :param vocab_list: list of vocabulary - :param n_topics: number of topics - :param max_iter: maximum number of iterations while training - :param max_err: training error - :param alpha: regularization param for the NMF model - :param beta: regularization param for the NMF model - :return: Trained NMF model - """ - - n_docs = len(encoded_text_id) - n_terms = len(vocab_list) - - if model_name == 'nmf': - dt_mat = __build_doc_term_matrix(n_terms, n_docs, encoded_text_id) - model = NMF( - dt_mat, - n_topic=n_topics, - max_iter=max_iter, - max_err=max_err) - - elif model_name == 'seanmf': - # Calculate co-occurence matrix - cm = __build_cooccurence_matrix(n_terms, encoded_text_id) - # Calculate PPMI - SS = __calulate_PPMI(cm, n_terms) - # Build doc-term matrix - dt_mat = __build_doc_term_matrix(n_terms, n_docs, encoded_text_id) - model = SeaNMF( - dt_mat, SS, - alpha=alpha, - beta=beta, - n_topic=n_topics, - max_iter=max_iter, - max_err=max_err, - fix_seed=1024) - - else: - model = None - print('Invalid model name: Use nmf or seanmf') - - return model - - -def __build_doc_term_matrix(n_terms, n_docs, encoded_text_id): - dt_mat = np.zeros([n_terms, n_docs]) - for k in range(n_docs): - for j in encoded_text_id[k]: - dt_mat[j, k] += 1.0 - return dt_mat - - -def show_dominant_topic(model, encoded_text_id, vocab_list, n_topKeyword =10): - """ - Computes the PMi score for each topic and the topKeywords describing each of them. - :param model: trained NMF model - :param encoded_text_id: list of encoded sentences - :param vocab_list: list of vocabulary - :return: topics = dictionnary with the topic number and its topkeywords - pmi_score = dictionnary with the topic number and its PMI score - """ - - dt_mat = __build_cooccurence_matrix(n_terms=len(vocab_list), encoded_text_id=encoded_text_id) - np.fill_diagonal(dt_mat, 0) - W,_ = model.get_decomposition_matrix() - n_topic = W.shape[1] - PMI_arr = [] - for k in range(n_topic): - top_keywords_index = W[:, k].argsort()[::-1][:n_topKeyword] - PMI_arr.append(__calculate_PMI(dt_mat, top_keywords_index)) - - index = np.argsort(PMI_arr) - topics = {} - pmi_score = {} - for k in index: - words = [] - for w in np.argsort(W[:, k])[::-1][:n_topKeyword]: - words.append(vocab_list[w]) - # Complete the topic and the score dicts. Format {Topic_number: words or score} - topics[k] = words - pmi_score[k] = PMI_arr[k] - - return topics, pmi_score - - -def get_assigned_topics(model): - """ - Assign the topic number to the sentences used when training the model - :param model: trained model for short text - :return topics_list: list having the same length as the training text containing topics assigned to each sentence. - """ - - _, H = model.get_decomposition_matrix() - # The weights of the H matrix are converted into probabilities - H_probs = H / H.sum(axis=1, keepdims=True) - topics_list = list(np.argmax(H_probs, axis=1)) - - return topics_list - - -def show_pyldavis(model, encoded_text_id, vocab_arr): - """ - :param model: trained model - :param encoded_text_id: encoded_text_id: list of encoded sentences - :param vocab_arr: array of vocabulary frequency - :return: pyldavis topics plot - """ - - data = prepare_data_pyldavis(model, encoded_text_id, vocab_arr) - vis_data = pyLDAvis.prepare(**data) - - return pyLDAvis.display(vis_data) - - -def prepare_data_pyldavis(model, encoded_text_id, vocab_arr): - """ - Transform the model decomposed matrix to create topic term and document topics matrices - and prepare data to feed pyldavis. - link : http://jeriwieringa.com/2018/07/17/pyLDAviz-and-Mallet/ - :return dict of data needed by pyldavis - """ - - # 1 List of documents lengths - doc_length_values=[] - for doc in encoded_text_id: - doc_length_values.append(len(doc)) - # 2 List of vocab - list_vocab = list(map(lambda x: x[0], vocab_arr)) - # 3 List of vocab. Frequency - freq_vocab = list(map(lambda x: x[1], vocab_arr)) - W, H = model.get_decomposition_matrix() - # Normlize the decomposition to get probabilities - W_probs = W / W.sum(axis=1, keepdims=True) - # 4 topic term matrix phi - phi = W_probs.T - # 5 document term matrix theta - theta = H / H.sum(axis=1, keepdims=True) - - data = {'topic_term_dists': phi, - 'doc_topic_dists': theta, - 'doc_lengths': doc_length_values, - 'vocab': list_vocab, - 'term_frequency': freq_vocab - } - - return data - - -def __build_cooccurence_matrix(n_terms, encoded_text_id): - """ - The cooccurence matrix represents the number of times each word - appeared in the same context as another word from the vocabulary. - The matrix has n_terms x n_terms size, columns and rows denote the vocab. - Cell values represent the number of times words occured together in the same sentence. - :param :encoded_text_id : list of encoded sentences - :return: res: the co-occurence matrix - - """ - res = np.zeros([n_terms, n_terms]) - for row in encoded_text_id: - counts = Counter(row) - for key_from, key_to in product(counts, repeat=2): - res[key_from, key_to] += counts[key_from] * counts[key_to] - return res - - -def __calulate_PPMI(cm, n_terms): - D1 = np.sum(cm) - print('D1= ', D1) - SS = D1 * cm - print('SS= ',SS) - for k in range(n_terms): - SS[k] /= np.sum(cm[k]) - for k in range(n_terms): - SS[:, k] /= np.sum(cm[:, k]) - print('SS = ', SS ) - cm = [] # release memory - SS[SS == 0] = 1.0 - SS = np.log(SS) - SS[SS < 0.0] = 0.0 - return SS - - -def __build_doc_term_matrix(n_terms, n_docs, encoded_text_id): - dt_mat = np.zeros([n_terms, n_docs]) - for k in range(n_docs): - for j in encoded_text_id[k]: - dt_mat[j, k] += 1.0 - return dt_mat - - -def __calculate_PMI(AA, topKeywordsIndex): - ''' - Method to compute PMi score - Reference: - Short and Sparse Text Topic Modeling via Self-Aggregation - ''' - - D1 = np.sum(AA) - n_tp = len(topKeywordsIndex) - PMI = [] - for index1 in topKeywordsIndex: - for index2 in topKeywordsIndex: - if index2 < index1: - if AA[index1, index2] == 0: - PMI.append(0.0) - else: - C1 = np.sum(AA[index1]) - C2 = np.sum(AA[index2]) - PMI.append(np.log(AA[index1,index2]*D1/C1/C2)) - avg_PMI = 2.0*np.sum(PMI)/float(n_tp)/(float(n_tp)-1.0) - - return avg_PMI From 11c26e45137595e2f46dae034b04d93f7f9144ae Mon Sep 17 00:00:00 2001 From: Amale EL HAMRI <amale.elhamri@artefact.com> Date: Tue, 8 Sep 2020 15:42:26 +0200 Subject: [PATCH 260/496] moved all topic modeling in specific folder --- nautilus_nlp/topic_modeling/biterm_model.py | 162 +++++++++ nautilus_nlp/topic_modeling/lda.py | 315 ++++++++++++++++++ nautilus_nlp/topic_modeling/nmf_model.py | 118 +++++++ nautilus_nlp/topic_modeling/seanmf_model.py | 148 ++++++++ .../topic_modeling_short_text.py | 280 ++++++++++++++++ 5 files changed, 1023 insertions(+) create mode 100644 nautilus_nlp/topic_modeling/biterm_model.py create mode 100644 nautilus_nlp/topic_modeling/lda.py create mode 100644 nautilus_nlp/topic_modeling/nmf_model.py create mode 100644 nautilus_nlp/topic_modeling/seanmf_model.py create mode 100644 nautilus_nlp/topic_modeling/topic_modeling_short_text.py diff --git a/nautilus_nlp/topic_modeling/biterm_model.py b/nautilus_nlp/topic_modeling/biterm_model.py new file mode 100644 index 0000000..8aa1ab4 --- /dev/null +++ b/nautilus_nlp/topic_modeling/biterm_model.py @@ -0,0 +1,162 @@ +# GNU Lesser General Public License v3.0 only +# Copyright (C) 2020 Artefact +# licence-information@artefact.com +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 3 of the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public License +# along with this program; if not, write to the Free Software Foundation, +# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +import numpy as np +from biterm.btm import oBTM +from biterm.utility import vec_to_biterms, topic_summuary +from sklearn.feature_extraction.text import CountVectorizer +import pyLDAvis + + +class BitermModel: + + def __init__(self, data, nb_topics, nb_iteration, lang): + """ + Model for topic modelling. Particularly useful for short texts. + + Parameters + ---------- + data : list + a list of string, each string can be a document + nb_topics : positive int + + nb_iteration : positive int + + lang : str + _language to remove the stop words, can be setup to None + + Returns + ------- + string + the text with removed multiple spaces and strip text + """ + self.is_int_positive(nb_topics) + self.is_int_positive(nb_iteration) + self.is_list_of_string(data) + + self.data = data + self.nb_topics = nb_topics + self.nb_iteration = nb_iteration + self.lang = lang + self._topics = None + self._btm = None + self._vectorize_text = None + self._vocabulary = None + + @staticmethod + def is_int_positive(number): + """ + Function to check if the input parameter is a integer and positive + otherwise raise an error + + Parameters + ---------- + number : str + + Returns + ------- + str: + the text with removed multiple spaces and strip text + + """ + if not isinstance(number, int): + raise ValueError("Parameter {} has to be an integer".format(number)) + if number < 1: + raise ValueError("Parameter {} has to be positive".format(number)) + + @staticmethod + def is_list_of_string(data): + """ + Function to check if the input parameter is a list of strings otherwise raise an error + + Parameters + ---------- + data + + Returns + ------- + """ + if not isinstance(data, list): + raise ValueError("{} has to be a list".format(data)) + if len(data) == 0: + raise ValueError("{} is empty".format(data)) + for document in data: + if not isinstance(document, str): + raise ValueError("All elements of {} have to be a string, problem with {}".format(data, document)) + + def compute_topics(self, nb_word_per_cluster): + """ + Main function computing the topic modeling, topics + + Parameters + ---------- + nb_word_per_cluster : positive integer + + Returns + ------- + dict : + a dictionary containing the the different topics with the top words + and coherence associated + """ + vec = CountVectorizer(stop_words=self.lang) + self._vectorize_text = vec.fit_transform(self.data).toarray() + self._vocabulary = np.array(vec.get_feature_names()) + + biterms = vec_to_biterms(self._vectorize_text) + self._btm = oBTM(num_topics=self.nb_topics, V=self._vocabulary) + self._topics = self._btm.fit_transform(biterms, iterations=self.nb_iteration) + + results = topic_summuary(self._btm.phi_wz.T, self._vectorize_text, self._vocabulary, nb_word_per_cluster, verbose=False) + + return results + + def get_document_topic(self, index): + """ + Get the cluster associated to the specified document + + Parameters + ---------- + index : positive integer + the document index + + Returns + ------- + the cluster index + """ + if self._topics is None: + raise ValueError("Model needs to be trained first") + + return self._topics[index].argmax() + + def save_pyLDAvis_plot_as_html(self, path_to_output='./biterm_pyLDAavis_plot.html'): + """ + Function saving the pyLDAvis plot associated with the compute_topics function + + Parameters + ---------- + path_to_output : str + path to save the plut, must be a html file + + Returns + ------- + """ + if self._topics is None or self._btm is None or self._vectorize_text is None or self._vocabulary is None: + raise ValueError("Model needs to be trained first") + + vis = pyLDAvis.prepare(self._btm.phi_wz.T, self._topics, np.count_nonzero(self._vectorize_text, axis=1), self._vocabulary, + np.sum(self._vectorize_text, axis=0)) + pyLDAvis.save_html(vis, path_to_output) diff --git a/nautilus_nlp/topic_modeling/lda.py b/nautilus_nlp/topic_modeling/lda.py new file mode 100644 index 0000000..686c824 --- /dev/null +++ b/nautilus_nlp/topic_modeling/lda.py @@ -0,0 +1,315 @@ +# GNU Lesser General Public License v3.0 only +# Copyright (C) 2020 Artefact +# licence-information@artefact.com +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 3 of the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public License +# along with this program; if not, write to the Free Software Foundation, +# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +import gensim +import logging +import os +import pyLDAvis +import pyLDAvis.gensim +from gensim.models import CoherenceModel +from gensim.models.wrappers import LdaMallet +import matplotlib.pyplot as plt + +from IPython.display import HTML + +logging.getLogger("gensim").setLevel(logging.WARNING) + + +def create_dictionary(data): + """ + Create a Dictionary encapsulates the mapping between normalized words and their integer ids. + + Parameters + ---------- + data : list of list of tokens + + Returns + ------- + list of list of tuples + """ + return gensim.corpora.Dictionary(data) + +def filter_extremes(dictionary, no_below=15, no_above=0.3 , **kwargs) : + """ + Remove very rare and very common words + + Parameters + ---------- + dictionary: dictionary containing the number of times a word appears in the dataset set + no_below : int, optional + Keep tokens which are contained in at least `no_below` documents. + no_above : float, optional + Keep tokens which are contained in no more than `no_above` documents + (fraction of total corpus size, not an absolute number). + + (Add to docstring) + other func + """ + return dictionary.filter_extremes(no_below=no_below, no_above=no_above, **kwargs) + + +def create_bow_corpus(data, dictionary): + + """ + Create the corpus: one of the two main inputs to the LDA topic model with the dictionary (id2word) + The produced corpus is a mapping of (token_id, token_count). + + Parameters + ---------- + data : list of list of tokens + + Returns + ------- + list of list of tuples + """ + texts = data + corpus = [dictionary.doc2bow(text) for text in texts] + return corpus + +### Find Number of topics + +def compute_coherence_values(dictionary, bow_corpus, texts, limit=25, start=2, step=4): + """ + Compute c_v coherence for various number of topics + + /!\ It takes a really long time. + + Parameters: + ---------- + dictionary : Gensim dictionary + bow_corpus : Gensim bow corpus + texts : List of input texts + limit : Max num of topics + + Returns: + ------- + model_list : List of LDA topic models + coherence_values : Coherence values corresponding to the LDA model with respective number of topics + """ + coherence_values = [] + model_list = [] + for num_topics in range(start, limit, step): + model = gensim.models.ldamodel.LdaModel(corpus=bow_corpus, + id2word=dictionary, + num_topics=num_topics, + random_state=0, + update_every=5, + chunksize=1000, + passes=10) + model_list.append(model) + coherencemodel = CoherenceModel(model=model, texts=texts, dictionary=dictionary, coherence='c_v') + coherence_values.append(coherencemodel.get_coherence()) + + return model_list, coherence_values + +def plot_optimal_topic_number(coherence_values, start=2, limit=25, step=4): + """ + Plot the coherence scores per number of topics + + Parameters: + ---------- + coherence_values : list of coherence scores for various number of topics + start : int. Min num of topics + limit : int. Max num of topics + step: int + + Output: + ------- + Lineplot + """ + x = range(start, limit, step) + plt.plot(x, coherence_values) + plt.xlabel("Num Topics") + plt.ylabel("Coherence score") + plt.legend(("coherence_values"), loc='best') + return plt.show() + +def print_coherence_scores(coherence_values, start=2, limit=25, step=4): + """ + Print the coherences scores for the ldamodels that had been tested with different number of topics + """ + x = range(start, limit, step) + for m, cv in zip(x, coherence_values): + print("Num Topics =", m, " has Coherence Value of", round(cv, 4)) + + +### LdaModel: Gensim & Mallet + +def train_lda_model(bow_corpus, dictionary, num_topics, model='gensim', mallet_path=None, **kwargs): + """ Train the lda model on the corpus + + Parameters + ---------- + bow_corpus : iterable of list of tokens. Stream of document vectors or sparse matrix of shape (num_terms, num_documents). + dictionary: corpora.Dictionary. Mapping from word IDs to words + num_topics: int + model : str. Precise the topic modeling model wanted, must be "gensim" or "mallet" + mallet_path: str, optionnal if model='gensim', required if model='mallet'. Path to the mallet-2.0.8 file + + Returns + ------- + gensim.ldamodel + """ + if model == 'gensim': + model = train_lda_gensim(bow_corpus, dictionary, num_topics, **kwargs) + elif model == 'mallet': + if mallet_path is None: + raise ValueError('You must precise the path to the mallet-2.0.8 file that has been downloaded before') + else: + model = train_lda_mallet(bow_corpus, dictionary, num_topics, mallet_path, **kwargs) + else: + raise ValueError('Please enter a valid model name: gensim or mallet') + return model + +def train_lda_gensim(bow_corpus, dictionary, num_topics, **kwargs): + + model = gensim.models.ldamodel.LdaModel(corpus=bow_corpus, id2word=dictionary, num_topics=num_topics, passes=10, minimum_probability=0.001, random_state=0, **kwargs) + return model + +def train_lda_mallet(bow_corpus, dictionary, num_topics, mallet_path, **kwargs): + + os.environ['MALLET_PATH'] = mallet_path + mallet = '$MALLET_PATH/mallet-2.0.8/bin/mallet' + model = gensim.models.wrappers.LdaMallet(mallet, corpus=bow_corpus, id2word=dictionary, num_topics=num_topics, prefix='composant', random_seed=0, **kwargs) + return model + + +def save_model(model, model_name): + """ + Save the model that has been trained. The model will be saved on your current emplacement. + + Parameters + ---------- + model: ldamodel + model_name: str. + Name the model that will be saved + """ + return model.save(os.path.join(model_name)) + + +def load_model(model_path,model_name, model='gensim', model_prefix='composant'): + """ + Detected the language of a text + + Parameters + ---------- + model_path: str + path where the model has been saved + model_name: str + name of the saved model + model : str + Precise the topic modeling model wanted, must be "gensim" or "mallet" + model_prefix : str + By default, 'composant' default prefix used while saving the mallet model with train_lda_model function. + + Returns + ------- + is_reliable : + is the top language is much better than 2nd best language? + language: + 2-letter code for the language of the text + """ + if model =='gensim': + ldamodel = gensim.models.LdaModel.load(os.path.join(model_path,model_name)) + elif model =='mallet': + ldamodel = LdaMallet.load(os.path.join(model_path,model_name)) + if model_prefix is not None: + ldamodel.prefix = model_path+'/'+ model_prefix + else: + raise ValueError('Please enter a valid model name: gensim or mallet') + return ldamodel + +def fit_data(model, bow): + """Test the model on new, unseen documents""" + return model.get_document_topics(bow, minimum_probability=0) + + +# Visualization + + +def visualize_topics(model, bow_corpus, dictionary, model_type=None): + """ + Visualize the topics-keywords with the pyLDAvis interactive chart. + (Work well in notebook) + + Parameters + ---------- + model: LDA model: gensim or mallet + bow_corpus : iterable of list of tokens. + dictionary: corpora.Dictionary. Dictionary encapsulates the mapping between normalized words and their integer ids. + model : str. Precise the topic modeling model used, must be "gensim" or "mallet" + + Returns: + ---------- + 3D interactive chart + """ + if model_type == 'mallet': + model_vis = gensim.models.wrappers.ldamallet.malletmodel2ldamodel(model) + elif model_type == 'gensim': + model_vis = model + elif model_type is None: + raise ValueError('You forgot to precise your model type, it must be: gensim or mallet') + else: + raise ValueError('Please enter a valid model name: gensim or mallet') + return pyLDAvis.gensim.prepare(model_vis, bow_corpus, dictionary) + +def save_pyldavis(pyldavis, vis_path, vis_name): + """ + Save the pyldavis interactive chart + + Parameters + ---------- + pyldavis: pyLDAvis._prepare.PreparedData + vis_path: str + vis_name: str + """ + return pyLDAvis.save_html(pyldavis, os.path.join(vis_path, vis_name + '{}'.format('.html'))) + + + +def show_pyldavis(vis_path, vis_name): + """ + Display the HTML of the saved pyldavis interactive chart + + Parameters + ---------- + vis_path: str + vis_name: str + """ + return HTML(filename=os.path.join(vis_path, vis_name + '{}'.format('.html'))) + +def show_dominant_topic(model, bow_corpus, topic_number=1, topn=5): + """ Print the dominant topics in the document, its score and the topics' top keywords. + + Quick way to interpret the topics + + Parameters + ---------- + gensim.ldamodel + model: ldamodel + bow_corpus: iterable of list of tokens. + topic_number: int. Pick the number of topics displayed + topn: int. Number of topics' top keyword displayed + + """ + i = 0 + for index, score in sorted(model[bow_corpus], key=lambda tup: -1*tup[1]): + weight = model.show_topic(index, topn=topn) + keywords = [i[0] for i in weight] + print("Score: {}\t Topic: {}".format(score, keywords)) + i +=1 + if i == topic_number: + break diff --git a/nautilus_nlp/topic_modeling/nmf_model.py b/nautilus_nlp/topic_modeling/nmf_model.py new file mode 100644 index 0000000..005c09b --- /dev/null +++ b/nautilus_nlp/topic_modeling/nmf_model.py @@ -0,0 +1,118 @@ +# GNU Lesser General Public License v3.0 only +# Copyright (C) 2020 Artefact +# licence-information@artefact.com +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 3 of the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public License +# along with this program; if not, write to the Free Software Foundation, +# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +import time +import numpy as np +from numpy.linalg import norm +from tqdm import tqdm + +''' +Topic Modeling via NMF +''' + +class NMF(object): + def __init__( + self, + A, IW=[], IH=[], + n_topic=10, max_iter=100, max_err=1e-3, + rand_init=True): + """ + The objective of the NMF model is to approximate the term-document matrix A by two lower-rank matrices W and H. + The process is iterative and we denote IW and IH the the matrix W and H that are updated at each step. + + :param A: The term-document matrix + :param IW: topics Matrix, each column vector W(:,k) represents the k-th topic in terms of M keywords + and its elements are the weights of the corresponding keywords. + :param IH: The row vector H(j,:) is the latent representation for document j in terms of K topics + :param n_topic: Number of selected topics + :param max_iter: Maximum number of iterations to update W and H + :param max_err: maximum error under which we consider that the loop converged + :param rand_init: random init boolean + """ + self.A = A + self.n_row = A.shape[0] + self.n_col = A.shape[1] + + self.n_topic = n_topic + self.max_iter = max_iter + self.max_err = max_err + + self.loss_hist = [] + self.nmf_mat_init(rand_init) + self.nmf_iter() + + def nmf_mat_init(self, rand_init): + """ + Init Matrices W and H initially either randomly or using existing IW, IH matrices taken when iterating. + :param rand_init: Boolean indicating initial random init + """ + if rand_init: + self.W = np.random.random((self.n_row, self.n_topic)) + self.H = np.random.random((self.n_col, self.n_topic)) + else: + self.W = IW + self.H = IH + for k in range(self.n_topic): + self.W[:, k] /= norm(self.W[:, k]) + + def nmf_iter(self): + """ + Main iterative loop for matrix decomposition + """ + loss_old = 1e20 + start_time = time.time() + for i in tqdm(range(self.max_iter)): + self.nmf_solver() + loss = self.nmf_loss() + self.loss_hist.append(loss) + + if loss_old - loss < self.max_err: + print('Matrix decomposition loop converged!') + break + loss_old = loss + end_time = time.time() + print('Step={}, Loss={}, Time={}s'.format(i, loss, end_time - start_time)) + + def nmf_solver(self): + ''' + regular NMF without constraint. + Block Coordinate Decent + ''' + epss = 1e-20 + + HtH = self.H.T.dot(self.H) + AH = self.A.dot(self.H) + for k in range(self.n_topic): + tmpW = self.W[:, k] * HtH[k, k] + AH[:, k] - np.dot(self.W, HtH[:, k]) + self.W[:, k] = np.maximum(tmpW, epss) + self.W[:, k] /= norm(self.W[:, k]) + epss + + WtW = self.W.T.dot(self.W) + AtW = self.A.T.dot(self.W) + for k in range(self.n_topic): + self.H[:, k] = self.H[:, k] * WtW[k, k] + AtW[:, k] - np.dot(self.H, WtW[:, k]) + self.H[:, k] = np.maximum(self.H[:, k], epss) + + def nmf_loss(self): + loss = norm(self.A - np.dot(self.W, np.transpose(self.H)), 'fro') ** 2 / 2.0 + return loss + + def get_loss(self): + return np.array(self.loss_hist) + + def get_decomposition_matrix(self): + return self.W, self.H diff --git a/nautilus_nlp/topic_modeling/seanmf_model.py b/nautilus_nlp/topic_modeling/seanmf_model.py new file mode 100644 index 0000000..7248148 --- /dev/null +++ b/nautilus_nlp/topic_modeling/seanmf_model.py @@ -0,0 +1,148 @@ +# GNU Lesser General Public License v3.0 only +# Copyright (C) 2020 Artefact +# licence-information@artefact.com +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 3 of the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public License +# along with this program; if not, write to the Free Software Foundation, +# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + +import time +import numpy as np +from numpy.linalg import norm +from tqdm import tqdm + + +class SeaNMF(object): + def __init__( + self, + A, S, + IW=[], IWc=[], IH=[], + alpha=1.0, beta=0.1, n_topic=10, max_iter=100, max_err=1e-3, + rand_init=True, fix_seed=False): + """ + Seanmf is a topic modeling algorithm, paper: http://dmkd.cs.vt.edu/papers/WWW18.pdf. + It finds an approximation to the term-document matrix A by two lower-rank matrices W and H, + at each iteration a context matrix Wc are computed and used to update W. + :param A: document term matrix + :param S: Word-context (semantic) correlation matrix + :param IW: topics Matrix, each column vector W(:,k) represents the k-th topic in terms of M keywords + and its elements are the weights of the corresponding keywords. + :param IWc: Latent factor matrix of contexts. + :param IH: The row vector H(j,:) is the latent representation for document j in terms of K topics + :param alpha: Seanmf algorithm parameter + :param beta: Seanmf algorithm parameter + :param n_topic: Number of selected topics + :param max_iter: Maximum number of iterations to update W and H + :param max_err: maximum error under which we consider that the loop converged + :param rand_init: random init boolean + :param fix_seed: int number to fix random seed. + """ + if fix_seed: + np.random.seed(0) + + self.A = A + self.S = S + + self.n_row = A.shape[0] + self.n_col = A.shape[1] + + self.n_topic = n_topic + self.max_iter = max_iter + self.alpha = alpha + self.beta = beta + self.B = np.ones([self.n_topic, 1]) + self.max_err = max_err + self.snmf_mat_init(rand_init, IW, IWc, IH) + self.snmf_iter() + + def snmf_mat_init(self, rand_init, IW=[], IWc=[], IH=[]): + """ + Init Matrices W,Wc and H initially either randomly or using existing IW,IWc IH matrices taken when iterating. + :param rand_init: Boolean indicating initial random init + """ + if rand_init: + self.W = np.random.random((self.n_row, self.n_topic)) + self.Wc = np.random.random((self.n_row, self.n_topic)) + self.H = np.random.random((self.n_col, self.n_topic)) + else: + self.W = IW + self.Wc = IWc + self.H = IH + for k in range(self.n_topic): + self.W[:, k] /= norm(self.W[:, k]) + self.Wc[:, k] /= norm(self.Wc[:, k]) + + def snmf_iter(self): + """ + Main iterative loop for matrix decomposition + """ + loss_old = 1e20 + start_time = time.time() + for i in tqdm(range(self.max_iter)): + self.snmf_solver() + loss = self.snmf_loss() + if loss_old - loss < self.max_err: + print('Matrix decomposition loop converged!') + break + loss_old = loss + end_time = time.time() + print('Step={}, Loss={}, Time={}s'.format(i, loss, end_time - start_time)) + + def snmf_solver(self): + ''' + using BCD framework + Alogorithm 1: Equations to update W, wc, H are described in the paper + http://dmkd.cs.vt.edu/papers/WWW18.pdf + ''' + + epss = 1e-20 + # Update W + AH = np.dot(self.A, self.H) + SWc = np.dot(self.S, self.Wc) + HtH = np.dot(self.H.T, self.H) + WctWc = np.dot(self.Wc.T, self.Wc) + W1 = self.W.dot(self.B) + + for k in range(self.n_topic): + num0 = HtH[k, k] * self.W[:, k] + self.alpha * WctWc[k, k] * self.W[:, k] + num1 = AH[:, k] + self.alpha * SWc[:, k] + num2 = np.dot(self.W, HtH[:, k]) + self.alpha * np.dot(self.W, WctWc[:, k]) + self.beta * W1[0] + self.W[:, k] = num0 + num1 - num2 + self.W[:, k] = np.maximum(self.W[:, k], epss) # project > 0 + self.W[:, k] /= norm(self.W[:, k]) + epss # normalize + # Update Wc + WtW = self.W.T.dot(self.W) + StW = np.dot(self.S, self.W) + for k in range(self.n_topic): + self.Wc[:, k] = self.Wc[:, k] + StW[:, k] - np.dot(self.Wc, WtW[:, k]) + self.Wc[:, k] = np.maximum(self.Wc[:, k], epss) + # Update H + AtW = np.dot(self.A.T, self.W) + for k in range(self.n_topic): + self.H[:, k] = self.H[:, k] + AtW[:, k] - np.dot(self.H, WtW[:, k]) + self.H[:, k] = np.maximum(self.H[:, k], epss) + + def snmf_loss(self): + loss = norm(self.A - np.dot(self.W, np.transpose(self.H)), 'fro') ** 2 / 2.0 + if self.alpha > 0: + loss += self.alpha * norm(np.dot(self.W, np.transpose(self.Wc)) - self.S, 'fro') ** 2 / 2.0 + if self.beta > 0: + loss += self.beta * norm(self.W, 1) ** 2 / 2.0 + + return loss + + def get_decomposition_matrix(self): + # Wc was not considered to keep same structure as NMF + return self.W, self.H + + diff --git a/nautilus_nlp/topic_modeling/topic_modeling_short_text.py b/nautilus_nlp/topic_modeling/topic_modeling_short_text.py new file mode 100644 index 0000000..73fad26 --- /dev/null +++ b/nautilus_nlp/topic_modeling/topic_modeling_short_text.py @@ -0,0 +1,280 @@ +# GNU Lesser General Public License v3.0 only +# Copyright (C) 2020 Artefact +# licence-information@artefact.com +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 3 of the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public License +# along with this program; if not, write to the Free Software Foundation, +# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +import re +from collections import Counter +from itertools import product +from nautilus_nlp.models.nmf_model import * +from nautilus_nlp.models.seanmf_model import * +import numpy as np +import pyLDAvis + + +def prepare_data(text, vocab_min_count=1, vocab_max_size=10000): + """ + :param text: list of str on which the topic modeling will be performed + :param vocab_min_count: minimum number of occurrences of a word to be considered in the vocabulary + :param vocab_max_size: maximum number of word in the vocabulary + :return: encoded_text_id: list of encoded sentences using vocab IDs + vocab_list: list of vocabulary + vocab_arr: array with vocab frequency counts + """ + vocab = {} + + # Tokens_list is a list of sub-lists where each sub-list contains a sentences' tokens. + tokens_list=[] + for sentence in text: + sentence = re.split('\s', sentence) + tokens_list.append(sentence) + vocab = dict(Counter(x for xs in tokens_list for x in xs)) + + # Create Vocab array ( list of sorted vocab + counts ) + vocab_arr = [[wd, vocab[wd]] for wd in vocab if vocab[wd] > vocab_min_count] + vocab_arr = sorted(vocab_arr, key=lambda k: k[1])[::-1] + vocab_arr = vocab_arr[:vocab_max_size] + vocab_arr = sorted(vocab_arr) + + vocab_list = list(map(lambda x:x[0], vocab_arr)) + # Create Vocab to ID dictionnary + vocab2id = {itm[1][0]: itm[0] for itm in enumerate(vocab_arr)} + + # Create ID representation of text (ie: each sentence is a list of vocabId ) + encoded_text_id = [] + for sentence in text: + sentence = re.split('\s', sentence) + sentence = [int(vocab2id[wd]) for wd in sentence if wd in vocab2id] + encoded_text_id.append(sentence) + + return encoded_text_id, vocab_list, vocab_arr + + +def train_shorttext_model(model_name, encoded_text_id, vocab_list, n_topics=20, max_iter=20, max_err=0.1, alpha=0, beta=0): + """ + :param model_name: string = 'nmf' or 'seanmf' + :param encoded_text_id: list of encoded sentences + :param vocab_list: list of vocabulary + :param n_topics: number of topics + :param max_iter: maximum number of iterations while training + :param max_err: training error + :param alpha: regularization param for the NMF model + :param beta: regularization param for the NMF model + :return: Trained NMF model + """ + + n_docs = len(encoded_text_id) + n_terms = len(vocab_list) + + if model_name == 'nmf': + dt_mat = __build_doc_term_matrix(n_terms, n_docs, encoded_text_id) + model = NMF( + dt_mat, + n_topic=n_topics, + max_iter=max_iter, + max_err=max_err) + + elif model_name == 'seanmf': + # Calculate co-occurence matrix + cm = __build_cooccurence_matrix(n_terms, encoded_text_id) + # Calculate PPMI + SS = __calulate_PPMI(cm, n_terms) + # Build doc-term matrix + dt_mat = __build_doc_term_matrix(n_terms, n_docs, encoded_text_id) + model = SeaNMF( + dt_mat, SS, + alpha=alpha, + beta=beta, + n_topic=n_topics, + max_iter=max_iter, + max_err=max_err, + fix_seed=1024) + + else: + model = None + print('Invalid model name: Use nmf or seanmf') + + return model + + +def __build_doc_term_matrix(n_terms, n_docs, encoded_text_id): + dt_mat = np.zeros([n_terms, n_docs]) + for k in range(n_docs): + for j in encoded_text_id[k]: + dt_mat[j, k] += 1.0 + return dt_mat + + +def show_dominant_topic(model, encoded_text_id, vocab_list, n_topKeyword =10): + """ + Computes the PMi score for each topic and the topKeywords describing each of them. + :param model: trained NMF model + :param encoded_text_id: list of encoded sentences + :param vocab_list: list of vocabulary + :return: topics = dictionnary with the topic number and its topkeywords + pmi_score = dictionnary with the topic number and its PMI score + """ + + dt_mat = __build_cooccurence_matrix(n_terms=len(vocab_list), encoded_text_id=encoded_text_id) + np.fill_diagonal(dt_mat, 0) + W,_ = model.get_decomposition_matrix() + n_topic = W.shape[1] + PMI_arr = [] + for k in range(n_topic): + top_keywords_index = W[:, k].argsort()[::-1][:n_topKeyword] + PMI_arr.append(__calculate_PMI(dt_mat, top_keywords_index)) + + index = np.argsort(PMI_arr) + topics = {} + pmi_score = {} + for k in index: + words = [] + for w in np.argsort(W[:, k])[::-1][:n_topKeyword]: + words.append(vocab_list[w]) + # Complete the topic and the score dicts. Format {Topic_number: words or score} + topics[k] = words + pmi_score[k] = PMI_arr[k] + + return topics, pmi_score + + +def get_assigned_topics(model): + """ + Assign the topic number to the sentences used when training the model + :param model: trained model for short text + :return topics_list: list having the same length as the training text containing topics assigned to each sentence. + """ + + _, H = model.get_decomposition_matrix() + # The weights of the H matrix are converted into probabilities + H_probs = H / H.sum(axis=1, keepdims=True) + topics_list = list(np.argmax(H_probs, axis=1)) + + return topics_list + + +def show_pyldavis(model, encoded_text_id, vocab_arr): + """ + :param model: trained model + :param encoded_text_id: encoded_text_id: list of encoded sentences + :param vocab_arr: array of vocabulary frequency + :return: pyldavis topics plot + """ + + data = prepare_data_pyldavis(model, encoded_text_id, vocab_arr) + vis_data = pyLDAvis.prepare(**data) + + return pyLDAvis.display(vis_data) + + +def prepare_data_pyldavis(model, encoded_text_id, vocab_arr): + """ + Transform the model decomposed matrix to create topic term and document topics matrices + and prepare data to feed pyldavis. + link : http://jeriwieringa.com/2018/07/17/pyLDAviz-and-Mallet/ + :return dict of data needed by pyldavis + """ + + # 1 List of documents lengths + doc_length_values=[] + for doc in encoded_text_id: + doc_length_values.append(len(doc)) + # 2 List of vocab + list_vocab = list(map(lambda x: x[0], vocab_arr)) + # 3 List of vocab. Frequency + freq_vocab = list(map(lambda x: x[1], vocab_arr)) + W, H = model.get_decomposition_matrix() + # Normlize the decomposition to get probabilities + W_probs = W / W.sum(axis=1, keepdims=True) + # 4 topic term matrix phi + phi = W_probs.T + # 5 document term matrix theta + theta = H / H.sum(axis=1, keepdims=True) + + data = {'topic_term_dists': phi, + 'doc_topic_dists': theta, + 'doc_lengths': doc_length_values, + 'vocab': list_vocab, + 'term_frequency': freq_vocab + } + + return data + + +def __build_cooccurence_matrix(n_terms, encoded_text_id): + """ + The cooccurence matrix represents the number of times each word + appeared in the same context as another word from the vocabulary. + The matrix has n_terms x n_terms size, columns and rows denote the vocab. + Cell values represent the number of times words occured together in the same sentence. + :param :encoded_text_id : list of encoded sentences + :return: res: the co-occurence matrix + + """ + res = np.zeros([n_terms, n_terms]) + for row in encoded_text_id: + counts = Counter(row) + for key_from, key_to in product(counts, repeat=2): + res[key_from, key_to] += counts[key_from] * counts[key_to] + return res + + +def __calulate_PPMI(cm, n_terms): + D1 = np.sum(cm) + print('D1= ', D1) + SS = D1 * cm + print('SS= ',SS) + for k in range(n_terms): + SS[k] /= np.sum(cm[k]) + for k in range(n_terms): + SS[:, k] /= np.sum(cm[:, k]) + print('SS = ', SS ) + cm = [] # release memory + SS[SS == 0] = 1.0 + SS = np.log(SS) + SS[SS < 0.0] = 0.0 + return SS + + +def __build_doc_term_matrix(n_terms, n_docs, encoded_text_id): + dt_mat = np.zeros([n_terms, n_docs]) + for k in range(n_docs): + for j in encoded_text_id[k]: + dt_mat[j, k] += 1.0 + return dt_mat + + +def __calculate_PMI(AA, topKeywordsIndex): + ''' + Method to compute PMi score + Reference: + Short and Sparse Text Topic Modeling via Self-Aggregation + ''' + + D1 = np.sum(AA) + n_tp = len(topKeywordsIndex) + PMI = [] + for index1 in topKeywordsIndex: + for index2 in topKeywordsIndex: + if index2 < index1: + if AA[index1, index2] == 0: + PMI.append(0.0) + else: + C1 = np.sum(AA[index1]) + C2 = np.sum(AA[index2]) + PMI.append(np.log(AA[index1,index2]*D1/C1/C2)) + avg_PMI = 2.0*np.sum(PMI)/float(n_tp)/(float(n_tp)-1.0) + + return avg_PMI From ca6023f5bd3f1c923697bb8fb9d182b0fa4df05f Mon Sep 17 00:00:00 2001 From: Amale EL HAMRI <amale.elhamri@artefact.com> Date: Tue, 8 Sep 2020 15:42:49 +0200 Subject: [PATCH 261/496] renamed author --- docs/conf.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/conf.py b/docs/conf.py index 02f1785..fffe634 100644 --- a/docs/conf.py +++ b/docs/conf.py @@ -37,8 +37,8 @@ # -- Project information ----------------------------------------------------- project = 'Nautilus_nlp' -copyright = '2019, Robin Doumerc' -author = 'Robin Doumerc' +copyright = '2020, Artefact' +author = 'Artefact' # The short X.Y version version = '0.1.0' From 2c614dc76cc9c57db72a73c3353e933a7a8a63e5 Mon Sep 17 00:00:00 2001 From: Amale EL HAMRI <amale.elhamri@artefact.com> Date: Tue, 8 Sep 2020 15:43:07 +0200 Subject: [PATCH 262/496] renaming data to datasets --- data/external/get_language_dataset.sh | 21 --------------------- data/external/get_stanfordtweets.sh | 20 -------------------- 2 files changed, 41 deletions(-) delete mode 100644 data/external/get_language_dataset.sh delete mode 100644 data/external/get_stanfordtweets.sh diff --git a/data/external/get_language_dataset.sh b/data/external/get_language_dataset.sh deleted file mode 100644 index 4e87a8b..0000000 --- a/data/external/get_language_dataset.sh +++ /dev/null @@ -1,21 +0,0 @@ -# GNU Lesser General Public License v3.0 only -# Copyright (C) 2020 Artefact -# licence-information@artefact.com -# -# This program is free software; you can redistribute it and/or -# modify it under the terms of the GNU Lesser General Public -# License as published by the Free Software Foundation; either -# version 3 of the License, or (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public License -# along with this program; if not, write to the Free Software Foundation, -# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. -#!/bin/bash -wget -O wili.zip https://zenodo.org/record/841984/files/wili-2018.zip?download=1 -mkdir -p wili && cp wili.zip wili && cd wili && unzip wili.zip && cd .. - diff --git a/data/external/get_stanfordtweets.sh b/data/external/get_stanfordtweets.sh deleted file mode 100644 index ef7ae1e..0000000 --- a/data/external/get_stanfordtweets.sh +++ /dev/null @@ -1,20 +0,0 @@ -# GNU Lesser General Public License v3.0 only -# Copyright (C) 2020 Artefact -# licence-information@artefact.com -# -# This program is free software; you can redistribute it and/or -# modify it under the terms of the GNU Lesser General Public -# License as published by the Free Software Foundation; either -# version 3 of the License, or (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public License -# along with this program; if not, write to the Free Software Foundation, -# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. -#!/bin/bash -wget -O trainingandtestdata.zip http://cs.stanford.edu/people/alecmgo/trainingandtestdata.zip trainingandtestdata.zip -mkdir -p tweets_sentiment && cp trainingandtestdata.zip tweets_sentiment && cd tweets_sentiment && unzip trainingandtestdata.zip From b3a44cf4019d54a2a4d9f31bfaf22851cfa07249 Mon Sep 17 00:00:00 2001 From: Amale EL HAMRI <amale.elhamri@artefact.com> Date: Tue, 8 Sep 2020 15:43:35 +0200 Subject: [PATCH 263/496] deleting wiki folder --- wiki/Entities_extraction.md | 5 ----- wiki/README.md | 22 ---------------------- wiki/Speech_to_text.md | 6 ------ wiki/Text_classification.md | 7 ------- wiki/Text_generation.md | 1 - wiki/Text_processing.md | 37 ------------------------------------- wiki/Topic_Modeling.md | 7 ------- 7 files changed, 85 deletions(-) delete mode 100644 wiki/Entities_extraction.md delete mode 100644 wiki/README.md delete mode 100644 wiki/Speech_to_text.md delete mode 100644 wiki/Text_classification.md delete mode 100644 wiki/Text_generation.md delete mode 100644 wiki/Text_processing.md delete mode 100644 wiki/Topic_Modeling.md diff --git a/wiki/Entities_extraction.md b/wiki/Entities_extraction.md deleted file mode 100644 index 7fbbf2c..0000000 --- a/wiki/Entities_extraction.md +++ /dev/null @@ -1,5 +0,0 @@ -# Entities Extraction - -## Part of Speech Tagging - -## Entity detections \ No newline at end of file diff --git a/wiki/README.md b/wiki/README.md deleted file mode 100644 index b98f83e..0000000 --- a/wiki/README.md +++ /dev/null @@ -1,22 +0,0 @@ -# Nautilus NLP SUMMARY - -This Mardown is used as the summary for the following parts: - -## **Text Based NLP** - -### [*Topic Modeling*](Topic_Modeling.md) - -### [*Text Classification*](Text_classification.md) - -### [*Entities Extraction*](Entities_extraction.md) - -### [*Text Processing*](Text_processing.md) - -### [*Text Generation*](Text_generation.md) - - -## **Audio-Based NLP** - -### [*Speech to Text*](Speech_to_text.md) - -### [*Voice Classification*](Voice_Classification.md) \ No newline at end of file diff --git a/wiki/Speech_to_text.md b/wiki/Speech_to_text.md deleted file mode 100644 index 0f6eb92..0000000 --- a/wiki/Speech_to_text.md +++ /dev/null @@ -1,6 +0,0 @@ -# Speech to Text - - -## Corpus - -## State of the art diff --git a/wiki/Text_classification.md b/wiki/Text_classification.md deleted file mode 100644 index b0d8c19..0000000 --- a/wiki/Text_classification.md +++ /dev/null @@ -1,7 +0,0 @@ -# Text Classification (Applied to Sentiment Analysis) - -## Machine-learning based - -## Word-vector based - -## Deep-learning based \ No newline at end of file diff --git a/wiki/Text_generation.md b/wiki/Text_generation.md deleted file mode 100644 index 1ae1192..0000000 --- a/wiki/Text_generation.md +++ /dev/null @@ -1 +0,0 @@ -# Text Generation \ No newline at end of file diff --git a/wiki/Text_processing.md b/wiki/Text_processing.md deleted file mode 100644 index a9c7740..0000000 --- a/wiki/Text_processing.md +++ /dev/null @@ -1,37 +0,0 @@ -# Text Processing - -## Introduction & Best practice - -## Encoding / Decoding - -In our python programming lives, pretty much everyone working with text data encountered one day the terrible: - - `UnicodeDecodeError: 'machine' codec can't decode character 'somethingsomething' in position x: ordinal not in range(z)` -And you probably spend the next hour trying to figure out to get out of this mess. - -Usually, most of programming language automatically infer the encoding of the text. However, Python does not, and this can lead to a ton of problem. - -Encoding is the table of representation between the binary code understood by the computer and the letters as we see them. Therefore, everytime you see text on a screen, it is encoded in a way. -The problem is, pretty much every country in the world had his own way of encoding and these encodings still persist: The encoding module of python can understand around 100 different encoding. - -So, how do we get out of this mess? - - -### **The Absolute Rule:** -Use 'UTF-8' as default encoding for your processes. - -### If you are still in Python2.7 -*And you want to use it until its end of life(December 2019)* - - - -### If you are in Python 3 - - -## Stemmatization / Lemmatization - -## Vector Representation - -### Bag of Word & TF-IDF - -### Word Embeddings diff --git a/wiki/Topic_Modeling.md b/wiki/Topic_Modeling.md deleted file mode 100644 index 9a04ef4..0000000 --- a/wiki/Topic_Modeling.md +++ /dev/null @@ -1,7 +0,0 @@ -# Topic Modelling - -## LDA - -## LSA - -## Topic clustering/propagation? \ No newline at end of file From 604071871962a6d6918f19f994045b76f20e31d2 Mon Sep 17 00:00:00 2001 From: Amale EL HAMRI <amale.elhamri@artefact.com> Date: Tue, 8 Sep 2020 15:44:32 +0200 Subject: [PATCH 264/496] removing tox --- tox.ini | 3 --- 1 file changed, 3 deletions(-) delete mode 100644 tox.ini diff --git a/tox.ini b/tox.ini deleted file mode 100644 index c32fbd8..0000000 --- a/tox.ini +++ /dev/null @@ -1,3 +0,0 @@ -[flake8] -max-line-length = 79 -max-complexity = 10 From 977d37654e4279463ee292a51e86f42defffa6fb Mon Sep 17 00:00:00 2001 From: Amale EL HAMRI <amale.elhamri@artefact.com> Date: Tue, 8 Sep 2020 15:45:41 +0200 Subject: [PATCH 265/496] renaming author --- setup.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/setup.py b/setup.py index b9b77e0..39d4c4c 100644 --- a/setup.py +++ b/setup.py @@ -42,7 +42,7 @@ def run(self): packages=find_packages(), version=version, description='All the goto functions you need to handle NLP use-cases', - author='Robin Doumerc', + author='Artefact', license='MIT', url='https://github.com/artefactory/nautilus-nlp', classifiers=[ From 9eb7d58df829c7b06e38c1e2baa93e4f9a71ce57 Mon Sep 17 00:00:00 2001 From: Amale EL HAMRI <amale.elhamri@artefact.com> Date: Tue, 8 Sep 2020 15:46:03 +0200 Subject: [PATCH 266/496] removing test_environnement.py --- test_environment.py | 42 ------------------------------------------ 1 file changed, 42 deletions(-) delete mode 100644 test_environment.py diff --git a/test_environment.py b/test_environment.py deleted file mode 100644 index 341e9cb..0000000 --- a/test_environment.py +++ /dev/null @@ -1,42 +0,0 @@ -# GNU Lesser General Public License v3.0 only -# Copyright (C) 2020 Artefact -# licence-information@artefact.com -# -# This program is free software; you can redistribute it and/or -# modify it under the terms of the GNU Lesser General Public -# License as published by the Free Software Foundation; either -# version 3 of the License, or (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public License -# along with this program; if not, write to the Free Software Foundation, -# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. -import sys - -REQUIRED_PYTHON = "python3" - - -def main(): - system_major = sys.version_info.major - if REQUIRED_PYTHON == "python": - required_major = 2 - elif REQUIRED_PYTHON == "python3": - required_major = 3 - else: - raise ValueError("Unrecognized python interpreter: {}".format( - REQUIRED_PYTHON)) - - if system_major != required_major: - raise TypeError( - "This project requires Python {}. Found: Python {}".format( - required_major, sys.version)) - else: - print(">>> Development environment passes all tests!") - - -if __name__ == '__main__': - main() From d7e8f0fdffa446dd556ffe751f7612f7d16daeb8 Mon Sep 17 00:00:00 2001 From: Amale EL HAMRI <amale.elhamri@artefact.com> Date: Tue, 8 Sep 2020 16:04:34 +0200 Subject: [PATCH 267/496] added frequent words in keyword_extractor --- nautilus_nlp/analysis/keyword_extractor.py | 27 ++++++++++++++++++++++ 1 file changed, 27 insertions(+) diff --git a/nautilus_nlp/analysis/keyword_extractor.py b/nautilus_nlp/analysis/keyword_extractor.py index 28545c2..acdb963 100644 --- a/nautilus_nlp/analysis/keyword_extractor.py +++ b/nautilus_nlp/analysis/keyword_extractor.py @@ -45,4 +45,31 @@ def extract_keywords(text, keyword, case_sensitive=True): processor.add_keywords_from_dict(keyword) return processor.extract_keywords(text) + + +def frequent_words(list_words, ngrams_number=1, number_top_words=10): + """ + Create n-grams for list of tokens + + Parameters + ---------- + ngrams_number : int + number_top_words : int + output dataframe length + + Returns + ------- + DataFrame + Dataframe with the entities and their frequencies. + """ + frequent = [] + if ngrams_number == 1: + pass + elif ngrams_number >= 2: + list_words = create_ngrams(list_words, ngrams_number) + else: + raise ValueError("number of n-grams should be >= 1") + x = Counter(list_words) + frequent = x.most_common(number_top_words) + return frequent From 96ec9fc1a9f286bcc389b8c455bd8d7160064a5f Mon Sep 17 00:00:00 2001 From: Amale EL HAMRI <amale.elhamri@artefact.com> Date: Tue, 8 Sep 2020 16:04:43 +0200 Subject: [PATCH 268/496] returning a generator instead of list --- nautilus_nlp/analysis/ngrams.py | 42 +++++++++++++++++++++++++++++++++ 1 file changed, 42 insertions(+) create mode 100644 nautilus_nlp/analysis/ngrams.py diff --git a/nautilus_nlp/analysis/ngrams.py b/nautilus_nlp/analysis/ngrams.py new file mode 100644 index 0000000..cc892c7 --- /dev/null +++ b/nautilus_nlp/analysis/ngrams.py @@ -0,0 +1,42 @@ +# GNU Lesser General Public License v3.0 only +# Copyright (C) 2020 Artefact +# licence-information@artefact.com +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 3 of the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public License +# along with this program; if not, write to the Free Software Foundation, +# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +# -*- coding: utf-8 -*- +""" +Functions to calculate words or ngrams frequencies. +""" +from collections import Counter + + +def create_ngrams(token_list, n): + """ + Create n-grams for list of tokens + + Parameters + ---------- + token_list : list + list of strings + n : + number of elements in the n-gram + + Returns + ------- + Generator + generator of all n-grams + """ + ngrams = zip(*[token_list[i:] for i in range(n)]) + return (" ".join(ngram) for ngram in ngrams) From 33f1f542c4c3058635aabbd2bc28c7c06b36e8b3 Mon Sep 17 00:00:00 2001 From: Amale EL HAMRI <amale.elhamri@artefact.com> Date: Tue, 8 Sep 2020 16:04:56 +0200 Subject: [PATCH 269/496] making language non optional --- nautilus_nlp/analysis/text_summary.py | 13 +++++-------- 1 file changed, 5 insertions(+), 8 deletions(-) diff --git a/nautilus_nlp/analysis/text_summary.py b/nautilus_nlp/analysis/text_summary.py index 9fe6eb3..b109146 100644 --- a/nautilus_nlp/analysis/text_summary.py +++ b/nautilus_nlp/analysis/text_summary.py @@ -33,7 +33,7 @@ def is_list_of_strings(lst): return bool(lst) and isinstance(lst, list) and all(isinstance(elem, str) for elem in lst) -def summarize_text(txt, ratio=0.2, words=None, language="english"): +def summarize_text(txt, ratio=0.2, language, words=None): """ Parameters ---------- @@ -41,10 +41,10 @@ def summarize_text(txt, ratio=0.2, words=None, language="english"): Sting or list of strings containing text to summarize ratio : float Percentage giving the output text length in reference to the input length. - words : - number of words of the output text language : text language. eg. "english" + words : + number of words of the output text or None Returns ------- @@ -54,9 +54,6 @@ def summarize_text(txt, ratio=0.2, words=None, language="english"): if is_list_of_strings(txt): txt = ' '.join(txt) - elif isinstance(txt, str): - pass - else: - raise ValueError("Text parameter must be a Unicode object (str) or list of str!") + elif not isinstance(txt, str): + raise TypeError("Text parameter must be a Unicode object (str) or list of str!") return summarize(txt, ratio, words, language) - From a815c6afc56c70e2c05a06aabce8cbd5fa8bf556 Mon Sep 17 00:00:00 2001 From: Amale EL HAMRI <amale.elhamri@artefact.com> Date: Tue, 8 Sep 2020 16:05:21 +0200 Subject: [PATCH 270/496] removing useless commented lines --- nautilus_nlp/analysis/visualize.py | 5 ----- 1 file changed, 5 deletions(-) diff --git a/nautilus_nlp/analysis/visualize.py b/nautilus_nlp/analysis/visualize.py index c7e58b4..6f8d36b 100644 --- a/nautilus_nlp/analysis/visualize.py +++ b/nautilus_nlp/analysis/visualize.py @@ -15,11 +15,6 @@ # You should have received a copy of the GNU Lesser General Public License # along with this program; if not, write to the Free Software Foundation, # Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. -''' -import matplotlib -import numpy as np - -''' import matplotlib.pyplot as plt import wordcloud plt.rcParams["figure.figsize"] = [16,9] From 99fd7e195324aa29a272e1f57615e3d19e61d529 Mon Sep 17 00:00:00 2001 From: Amale EL HAMRI <amale.elhamri@artefact.com> Date: Tue, 8 Sep 2020 16:05:52 +0200 Subject: [PATCH 271/496] renaming ngrams_analysis.py to ngrams.py --- nautilus_nlp/analysis/ngrams_analysis.py | 70 ------------------------ 1 file changed, 70 deletions(-) delete mode 100644 nautilus_nlp/analysis/ngrams_analysis.py diff --git a/nautilus_nlp/analysis/ngrams_analysis.py b/nautilus_nlp/analysis/ngrams_analysis.py deleted file mode 100644 index 3716ee1..0000000 --- a/nautilus_nlp/analysis/ngrams_analysis.py +++ /dev/null @@ -1,70 +0,0 @@ -# GNU Lesser General Public License v3.0 only -# Copyright (C) 2020 Artefact -# licence-information@artefact.com -# -# This program is free software; you can redistribute it and/or -# modify it under the terms of the GNU Lesser General Public -# License as published by the Free Software Foundation; either -# version 3 of the License, or (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public License -# along with this program; if not, write to the Free Software Foundation, -# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. -# -*- coding: utf-8 -*- -""" -Functions to calculate words or ngrams frequencies. -""" -from collections import Counter - - -def create_ngrams(token, n): - """ - Create n-grams for list of tokens - - Parameters - ---------- - token : list - list of strings - n : - number of elements in the n-gram - - Returns - ------- - list - list of n-grams - """ - ngrams = zip(*[token[i:] for i in range(n)]) - return [" ".join(ngram) for ngram in ngrams] - - -def frequent_words(list_words, ngrams_number=1, number_top_words=10): - """ - Create n-grams for list of tokens - - Parameters - ---------- - ngrams_number : int - - number_top_words : int - output dataframe length - - Returns - ------- - DataFrame - Dataframe with the entities and their frequencies. - """ - frequent = [] - if ngrams_number == 1: - pass - elif ngrams_number >= 2: - list_words = create_ngrams(list_words, ngrams_number) - else: - raise ValueError("number of n-grams should be >= 1") - x = Counter(list_words) - frequent = x.most_common(number_top_words) - return frequent From 64b99da04da2307f3bce48fe3f1ed0313ed00dda Mon Sep 17 00:00:00 2001 From: Amale EL HAMRI <amale.elhamri@artefact.com> Date: Thu, 24 Sep 2020 16:48:51 +0200 Subject: [PATCH 272/496] cleaning requirements --- requirements.txt | 65 ++++++++++++++++-------------------------------- 1 file changed, 21 insertions(+), 44 deletions(-) diff --git a/requirements.txt b/requirements.txt index 8b4b58d..88a97f3 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,46 +1,23 @@ -# local package -#-e . - -# external requirements -Sphinx -sphinx_rtd_theme -coverage -python-dotenv>=0.5.1 -pillow -pytest - -#library requirements -pyLDAvis==2.1.2 -gensim==3.7.1 -sacremoses==0.0.13 -stop-words==2018.7.23 -spacy==2.1.3 -ftfy<5.0.0,>=4.2.0 -wordcloud>=1.5.0 -matplotlib>=3.0.3 -mosestokenizer -numpy>1.15.4 -stop_words==2018.7.23 -nltk>=3.4.5 -textblob==0.15.3 -textblob_fr==0.2.0 -pandas>=0.23.4 +numpy==1.18.1 chardet==3.0.4 -setuptools==40.8.0 -textacy==0.6.3 -#fastText==0.8.3 -gensim==3.7.1 -scikit_learn==0.20.3 -vaderSentiment==3.2.1 -google-compute-engine==2.8.13 -flashtext==2.7 -phonenumbers==8.10.12 -regex==2019.8.19 -emoji>=0.5.2 -summa==1.2.0 +pandas==0.25.1 +spacy==2.1.8 +click==7.1.1 +matplotlib==3.1.1 +tqdm==4.45.0 biterm==0.1.5 - - - - - +flashtext==2.7 +ftfy==5.8 +gensim==3.8.3 +ipython==7.18.1 +nlpaug==0.0.20 +nltk==3.5 +phonenumbers==8.12.9 +pyLDAvis==2.1.2 +pytest==6.0.2 +python-dotenv==0.14.0 +regex==2020.7.14 +sacremoses==0.0.43 +scikit_learn==0.23.2 +stop_words==2018.7.23 +wordcloud==1.8.0 From 078ba268bb026c65bd6173b9c68fe6ad1e994b8e Mon Sep 17 00:00:00 2001 From: Amale EL HAMRI <amale.elhamri@artefact.com> Date: Thu, 24 Sep 2020 16:49:35 +0200 Subject: [PATCH 273/496] adding summa requirement --- requirements.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/requirements.txt b/requirements.txt index 88a97f3..5b30424 100644 --- a/requirements.txt +++ b/requirements.txt @@ -21,3 +21,4 @@ sacremoses==0.0.43 scikit_learn==0.23.2 stop_words==2018.7.23 wordcloud==1.8.0 +summa==1.2.0 From c143d61dfa719cdd61f492748f9c96cca3f94a8a Mon Sep 17 00:00:00 2001 From: Amale EL HAMRI <amale.elhamri@artefact.com> Date: Thu, 24 Sep 2020 16:53:06 +0200 Subject: [PATCH 274/496] changing path in test biterm --- tests/test_biterm.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/test_biterm.py b/tests/test_biterm.py index 975d42c..5f9c3a7 100644 --- a/tests/test_biterm.py +++ b/tests/test_biterm.py @@ -15,7 +15,7 @@ # You should have received a copy of the GNU Lesser General Public License # along with this program; if not, write to the Free Software Foundation, # Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. -from nautilus_nlp.models.biterm_model import BitermModel +from nautilus_nlp.topic_modeling.biterm_model import BitermModel import pandas as pd import pytest From aa89f2fabcc11cb71f54f0b9d3dbd3aab68872b1 Mon Sep 17 00:00:00 2001 From: Amale EL HAMRI <amale.elhamri@artefact.com> Date: Thu, 24 Sep 2020 16:56:21 +0200 Subject: [PATCH 275/496] adding comment TODO --- nautilus_nlp/preprocessing/text_preprocess.py | 1 + 1 file changed, 1 insertion(+) diff --git a/nautilus_nlp/preprocessing/text_preprocess.py b/nautilus_nlp/preprocessing/text_preprocess.py index 718b061..1b4353a 100644 --- a/nautilus_nlp/preprocessing/text_preprocess.py +++ b/nautilus_nlp/preprocessing/text_preprocess.py @@ -37,6 +37,7 @@ def __init__(self,text): raise ValueError("Input must be a string") def clean_text(self,lang='en') -> str: + #TODO : check how to pipe operations stopwords = get_stopwords(lang) self.text = self.fix_bad_unicode(normalization="NFC") self.text = self.remove_EOL_characters() From eb7ab373b365980fb9129f223f03b3324f1a49e0 Mon Sep 17 00:00:00 2001 From: Amale EL HAMRI <amale.elhamri@artefact.com> Date: Thu, 24 Sep 2020 16:57:01 +0200 Subject: [PATCH 276/496] updating path for files topic modeling --- nautilus_nlp/topic_modeling/topic_modeling_short_text.py | 4 ++-- tests/test_topic_modeling_short_text.py | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/nautilus_nlp/topic_modeling/topic_modeling_short_text.py b/nautilus_nlp/topic_modeling/topic_modeling_short_text.py index 73fad26..951f5fb 100644 --- a/nautilus_nlp/topic_modeling/topic_modeling_short_text.py +++ b/nautilus_nlp/topic_modeling/topic_modeling_short_text.py @@ -18,8 +18,8 @@ import re from collections import Counter from itertools import product -from nautilus_nlp.models.nmf_model import * -from nautilus_nlp.models.seanmf_model import * +from nautilus_nlp.topic_modeling.nmf_model import * +from nautilus_nlp.topic_modeling.seanmf_model import * import numpy as np import pyLDAvis diff --git a/tests/test_topic_modeling_short_text.py b/tests/test_topic_modeling_short_text.py index 405fc6b..9a8caac 100644 --- a/tests/test_topic_modeling_short_text.py +++ b/tests/test_topic_modeling_short_text.py @@ -15,7 +15,7 @@ # You should have received a copy of the GNU Lesser General Public License # along with this program; if not, write to the Free Software Foundation, # Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. -from nautilus_nlp.models.topic_modeling_short_text import prepare_data, \ +from nautilus_nlp.topic_modeling.topic_modeling_short_text import prepare_data, \ __build_cooccurence_matrix, train_shorttext_model, prepare_data_pyldavis, \ show_dominant_topic, get_assigned_topics import numpy as np From 69fea2651793d0dd80a6dbc2996c90db3c71040b Mon Sep 17 00:00:00 2001 From: Amale EL HAMRI <amale.elhamri@artefact.com> Date: Thu, 24 Sep 2020 16:57:13 +0200 Subject: [PATCH 277/496] removing test for language detection --- tests/test_language_detection.py | 48 -------------------------------- 1 file changed, 48 deletions(-) delete mode 100644 tests/test_language_detection.py diff --git a/tests/test_language_detection.py b/tests/test_language_detection.py deleted file mode 100644 index b6b8d87..0000000 --- a/tests/test_language_detection.py +++ /dev/null @@ -1,48 +0,0 @@ -# GNU Lesser General Public License v3.0 only -# Copyright (C) 2020 Artefact -# licence-information@artefact.com -# -# This program is free software; you can redistribute it and/or -# modify it under the terms of the GNU Lesser General Public -# License as published by the Free Software Foundation; either -# version 3 of the License, or (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public License -# along with this program; if not, write to the Free Software Foundation, -# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. -from nautilus_nlp.models import language_detector -import pytest -import numpy as np - -model = language_detector.LangDetector() - -TEXT_1 = """Кипрская война (итал. Guerra di Cipro; тур. Kıbrıs Savaşı) — одна из нескольких войн между Османской империей и Венецианской республикой за господство в Восточном Средиземноморье. Сначала Венеция воевала с османами одна. Затем, когда сформировалась Священная лига (в которую помимо Венеции входили Испания с Неаполем и Сицилией, Республика Генуя, Герцогство Савойское, госпитальеры, Великое герцогство Тосканское и другие итальянские государства), Османская империя воевала уже против Лиги.""" -TEXT_2 = """ -Wiborada († 1. Mai 926 in St. Gallen) war eine Einsiedlerin, geweihte Jungfrau und Märtyrin der katholischen Kirche. Sie lebte als Inklusin in St. Gallen und wurde während eines Ungarneinfalls getötet. Ihre letzte Ruhestätte, deren genaue Lage bei der Kirche St. Mangen heute nicht mehr bekannt ist, war über Jahrhunderte hinweg Ziel vieler Wallfahrer. Sie wurde im Jahr 1047 von Papst Clemens II. heiliggesprochen und gilt als Schutzpatronin der Pfarrhaushälterinnen, Köchinnen, Bibliotheken und Bücherfreunde. In der Ikonografie wird Wiborada im Habit dargestellt; als ikonografische Heiligenattribute sind ihr eine Hellebarde als Verweis auf das Martyrium und ein Buch beigegeben.""" -TEXT_3 = """De geschiedenis van het werelddeel Europa valt ruwweg chronologisch in te delen in de prehistorie, de klassieke oudheid, de middeleeuwen, de nieuwe tijd, de moderne tijd en de eigentijdse tijd.""" -TEXT_4 = """ -The absolute difference between At and Ft is divided by half the sum of absolute values of the actual value At and the forecast value Ft. The value of this calculation is summed for every fitted point t and divided again by the number of fitted points n. -""" -TEXT_5 = """Joseph Athanase Doumerc dit Paul Doumer est un homme d'État français né le 22 mars 1857 à Aurillac (Cantal) et mort assassiné le 7 mai 1932 à Paris. Il a été président de la République du 13 juin 1931 à sa mort.""" -TEXT_6 = """1997年加延地震是于5月10日协调世界时7時57分发生在伊朗北部呼罗珊的一起重大地震,是该地区自1990年以来最大的一次地震,矩震级为7.3,中心位于马什哈德以南约270公里的一个名叫阿德库尔的乡村。这也是该国1997年所发生的第三场地震,造成严重的灾情,比尔詹德-加延地区变得满目疮痍,有1,567人丧生,超过2,300人受伤,5万人无家可归,超过15,000幢房屋遭到破坏或损毁,美国地质调查局形容这是1997年最致命的一场地震。其后还发生了约155次余震造成进一步的破坏并迫使幸存者离开。最终估计此次灾害的损失约为1亿美元。围绕地震震中的地区几乎全部被毁,这与乡村地区建筑质量不佳有很大关系,联合国建议调整相应建筑法规。按死亡人数计算,自进入20世纪以来,伊朗平均每3,000人就有1人在地震相关事件中遇难,一位美国地球物理学家建议为了解决持续的公共安全隐患,需要有一个全国范围的重建方案。""" - - -@pytest.mark.parametrize( - "text, lang", - [ - (TEXT_1, "ru"), - (TEXT_2, "de"), - (TEXT_3, "nl"), - (TEXT_4, "en"), - (TEXT_5, "fr"), - (TEXT_6, "zh"), - ], -) -def test_detect_language(text, lang): - result = model.detect_language(text)[0] - np.testing.assert_string_equal(result, lang) From 7e572b7d4f397fa2edc0b5ca1b8432376cedfa1d Mon Sep 17 00:00:00 2001 From: Amale EL HAMRI <amale.elhamri@artefact.com> Date: Thu, 24 Sep 2020 17:02:41 +0200 Subject: [PATCH 278/496] adding pylint to requirements --- requirements.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/requirements.txt b/requirements.txt index 5b30424..14c8197 100644 --- a/requirements.txt +++ b/requirements.txt @@ -22,3 +22,4 @@ scikit_learn==0.23.2 stop_words==2018.7.23 wordcloud==1.8.0 summa==1.2.0 +pylint==2.4.4 From 535406763518fde037e01489337bbf49d14dc335 Mon Sep 17 00:00:00 2001 From: Amale EL HAMRI <amale.elhamri@artefact.com> Date: Thu, 24 Sep 2020 17:02:58 +0200 Subject: [PATCH 279/496] fixing lint issues on keyword_extractor.py --- nautilus_nlp/analysis/keyword_extractor.py | 24 +++++++++++++--------- 1 file changed, 14 insertions(+), 10 deletions(-) diff --git a/nautilus_nlp/analysis/keyword_extractor.py b/nautilus_nlp/analysis/keyword_extractor.py index acdb963..4ef2b49 100644 --- a/nautilus_nlp/analysis/keyword_extractor.py +++ b/nautilus_nlp/analysis/keyword_extractor.py @@ -15,14 +15,18 @@ # You should have received a copy of the GNU Lesser General Public License # along with this program; if not, write to the Free Software Foundation, # Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +from collections import Counter + from flashtext import KeywordProcessor +from nautilus_nlp.analysis.ngrams import create_ngrams + def extract_keywords(text, keyword, case_sensitive=True): """ Extract Keywords from a document. Parameters - ---------- + ---------- text : str Text to extract keywords from keyword : @@ -35,13 +39,13 @@ def extract_keywords(text, keyword, case_sensitive=True): list Return list of extracted keyworkds """ - - processor=KeywordProcessor(case_sensitive=case_sensitive) - if isinstance(keyword,list): + + processor = KeywordProcessor(case_sensitive=case_sensitive) + if isinstance(keyword, list): processor.add_keywords_from_list(keyword) - elif isinstance(keyword,str): + elif isinstance(keyword, str): processor.add_keyword(keyword) - elif isinstance(keyword,dict): + elif isinstance(keyword, dict): processor.add_keywords_from_dict(keyword) return processor.extract_keywords(text) @@ -52,17 +56,17 @@ def frequent_words(list_words, ngrams_number=1, number_top_words=10): Create n-grams for list of tokens Parameters - ---------- + ---------- ngrams_number : int - - number_top_words : int + + number_top_words : int output dataframe length Returns ------- DataFrame Dataframe with the entities and their frequencies. - """ + """ frequent = [] if ngrams_number == 1: pass From d43eef4a17fd68471575e7eda7e5b679d5e3dec7 Mon Sep 17 00:00:00 2001 From: Amale EL HAMRI <amale.elhamri@artefact.com> Date: Thu, 24 Sep 2020 17:05:07 +0200 Subject: [PATCH 280/496] fixing lint issues on ngrams.py --- nautilus_nlp/analysis/ngrams.py | 14 ++++---------- 1 file changed, 4 insertions(+), 10 deletions(-) diff --git a/nautilus_nlp/analysis/ngrams.py b/nautilus_nlp/analysis/ngrams.py index cc892c7..7369b93 100644 --- a/nautilus_nlp/analysis/ngrams.py +++ b/nautilus_nlp/analysis/ngrams.py @@ -16,21 +16,15 @@ # along with this program; if not, write to the Free Software Foundation, # Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. # -*- coding: utf-8 -*- -""" -Functions to calculate words or ngrams frequencies. -""" -from collections import Counter - - -def create_ngrams(token_list, n): +def create_ngrams(token_list, nb_elements): """ Create n-grams for list of tokens Parameters - ---------- + ---------- token_list : list list of strings - n : + nb_elements : number of elements in the n-gram Returns @@ -38,5 +32,5 @@ def create_ngrams(token_list, n): Generator generator of all n-grams """ - ngrams = zip(*[token_list[i:] for i in range(n)]) + ngrams = zip(*[token_list[index_token:] for index_token in range(nb_elements)]) return (" ".join(ngram) for ngram in ngrams) From 13415e62fb997ba5c4c1eef25ff6af87354a679d Mon Sep 17 00:00:00 2001 From: Amale EL HAMRI <amale.elhamri@artefact.com> Date: Thu, 24 Sep 2020 17:07:01 +0200 Subject: [PATCH 281/496] fixing lint issues on text_summary.py --- nautilus_nlp/analysis/text_summary.py | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/nautilus_nlp/analysis/text_summary.py b/nautilus_nlp/analysis/text_summary.py index b109146..02457c6 100644 --- a/nautilus_nlp/analysis/text_summary.py +++ b/nautilus_nlp/analysis/text_summary.py @@ -21,36 +21,35 @@ def is_list_of_strings(lst): """ Parameters - ---------- + ---------- lst : list Returns ------- book boolean indicator - """ - + """ return bool(lst) and isinstance(lst, list) and all(isinstance(elem, str) for elem in lst) -def summarize_text(txt, ratio=0.2, language, words=None): +def summarize_text(txt, ratio=0.2, language="english", words=None): """ Parameters - ---------- + ---------- txt : str Sting or list of strings containing text to summarize ratio : float Percentage giving the output text length in reference to the input length. language : text language. eg. "english" - words : + words : number of words of the output text or None Returns ------- string string containing the summarized text - """ + """ if is_list_of_strings(txt): txt = ' '.join(txt) From 8d90917a354fa667931b4f080353ac01b508ddb8 Mon Sep 17 00:00:00 2001 From: Amale EL HAMRI <amale.elhamri@artefact.com> Date: Thu, 24 Sep 2020 17:15:57 +0200 Subject: [PATCH 282/496] fix lint issues on nautilus_nlp/analysis/visualize.py --- nautilus_nlp/analysis/visualize.py | 38 +++++++++++++++--------------- 1 file changed, 19 insertions(+), 19 deletions(-) diff --git a/nautilus_nlp/analysis/visualize.py b/nautilus_nlp/analysis/visualize.py index 6f8d36b..dd16cfb 100644 --- a/nautilus_nlp/analysis/visualize.py +++ b/nautilus_nlp/analysis/visualize.py @@ -15,52 +15,52 @@ # You should have received a copy of the GNU Lesser General Public License # along with this program; if not, write to the Free Software Foundation, # Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +from collections import Counter + import matplotlib.pyplot as plt import wordcloud -plt.rcParams["figure.figsize"] = [16,9] +plt.rcParams["figure.figsize"] = [16, 9] -def make_word_cloud(text_or_counter, stop_words=[]): - if type(text_or_counter) is str: - myWordcloud = wordcloud.WordCloud(stopwords=stop_words).generate(text_or_counter) +def make_word_cloud(text_or_counter, stop_words=None): + if isinstance(text_or_counter, str): + word_cloud = wordcloud.WordCloud(stopwords=stop_words).generate(text_or_counter) else: - for w in stop_words: - del text_or_counter[w] - myWordcloud = wordcloud.WordCloud(stopwords=stop_words).generate_from_frequencies(text_or_counter) - plt.imshow(myWordcloud) + if stop_words is not None: + text_or_counter = Counter(word for word in text_or_counter if word not in stop_words) + word_cloud = wordcloud.WordCloud(stopwords=stop_words).generate_from_frequencies(text_or_counter) + plt.imshow(word_cloud) plt.axis("off") plt.show() def print_concordance(tokens, query_word, width=110, n_results=None): ''' - Inputs a list of token and a query word, outputs all the sentences that - contains the query word, display in a nice way. + Inputs a list of token and a query word, outputs all the sentences that + contains the query word, display in a nice way. width = Integer. Number of caracters to display per text chunk n_results = Integer. If not null, filters the number of results displayed. - This function is an adaptation of NLTK's print_concordance function. + This function is an adaptation of NLTK's print_concordance function. Source: http://www.nltk.org/_modules/nltk/text.html ''' half_width = (width - len(query_word) - 2) // 2 context = width // 4 # approx number of words of context - + results = [i for i, j in enumerate(tokens) if j == query_word] if len(results) > 0: - if n_results == None: + if n_results is None: n_results = len(results) - print('{} matches for "{}":'.format(len(results),query_word)) + print('{} matches for "{}":'.format(len(results), query_word)) for i in results[:n_results]: - # Find the context of query word. - left_context = tokens[max(0, i - context) : i] - right_context = tokens[i + 1 : i + context] + left_context = tokens[max(0, i - context): i] + right_context = tokens[i + 1: i + context] # Create the pretty lines with the query_word in the middle. left_print = ' '.join(left_context)[-half_width:] right_print = ' '.join(right_context)[:half_width] # The WYSIWYG line of the concordance. line_print = ' '.join([left_print, query_word, right_print]) - before = tokens[:] print(line_print) else: - print('No match for "{}"'.format(query_word)) \ No newline at end of file + print('No match for "{}"'.format(query_word)) From dae686bda227a5e01753d92580fe4f3aa804b135 Mon Sep 17 00:00:00 2001 From: Amale EL HAMRI <amale.elhamri@artefact.com> Date: Thu, 24 Sep 2020 17:17:31 +0200 Subject: [PATCH 283/496] linting config.py --- nautilus_nlp/config/config.py | 57 ++++++++++++++++++++++++++++++++--- 1 file changed, 53 insertions(+), 4 deletions(-) diff --git a/nautilus_nlp/config/config.py b/nautilus_nlp/config/config.py index 4f880ff..35681cf 100644 --- a/nautilus_nlp/config/config.py +++ b/nautilus_nlp/config/config.py @@ -16,11 +16,60 @@ # along with this program; if not, write to the Free Software Foundation, # Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. #!/usr/local/bin/python3 -import os +import os -path_data = "data/" -langmodel_name = "lid.176.ftz" ROOT_FOLDER = os.path.abspath(os.path.join(os.path.dirname(__file__), '..')) -COUNTRY_MAPPING_ISO = {'af': 'Afghanistan', 'ax': 'Åland Islands', 'al': 'Albania', 'dz': 'Algeria', 'as': 'American Samoa', 'ad': 'Andorra', 'ao': 'Angola', 'ai': 'Anguilla', 'aq': 'Antarctica', 'ag': 'Antigua and Barbuda', 'ar': 'Argentina', 'am': 'Armenia', 'aw': 'Aruba', 'au': 'Australia', 'at': 'Austria', 'az': 'Azerbaijan', 'bs': 'Bahamas', 'bh': 'Bahrain', 'bd': 'Bangladesh', 'bb': 'Barbados', 'by': 'Belarus', 'be': 'Belgium', 'bz': 'Belize', 'bj': 'Benin', 'bm': 'Bermuda', 'bt': 'Bhutan', 'bo': 'Bolivia (Plurinational State of)', 'bq': 'Bonaire, Sint Eustatius and Saba', 'ba': 'Bosnia and Herzegovina', 'bw': 'Botswana', 'bv': 'Bouvet Island', 'br': 'Brazil', 'io': 'British Indian Ocean Territory', 'bn': 'Brunei Darussalam', 'bg': 'Bulgaria', 'bf': 'Burkina Faso', 'bi': 'Burundi', 'cv': 'Cabo Verde', 'kh': 'Cambodia', 'cm': 'Cameroon', 'ca': 'Canada', 'ky': 'Cayman Islands', 'cf': 'Central African Republic', 'td': 'Chad', 'cl': 'Chile', 'cn': 'China', 'cx': 'Christmas Island', 'cc': 'Cocos (Keeling) Islands', 'co': 'Colombia', 'km': 'Comoros', 'cg': 'Congo', 'cd': 'Congo, Democratic Republic of the', 'ck': 'Cook Islands', 'cr': 'Costa Rica', 'ci': "Côte d'Ivoire", 'hr': 'Croatia', 'cu': 'Cuba', 'cw': 'Curaçao', 'cy': 'Cyprus', 'cz': 'Czechia', 'dk': 'Denmark', 'dj': 'Djibouti', 'dm': 'Dominica', 'do': 'Dominican Republic', 'ec': 'Ecuador', 'eg': 'Egypt', 'sv': 'El Salvador', 'gq': 'Equatorial Guinea', 'er': 'Eritrea', 'ee': 'Estonia', 'sz': 'Eswatini', 'et': 'Ethiopia', 'fk': 'Falkland Islands (Malvinas)', 'fo': 'Faroe Islands', 'fj': 'Fiji', 'fi': 'Finland', 'fr': 'France', 'gf': 'French Guiana', 'pf': 'French Polynesia', 'tf': 'French Southern Territories', 'ga': 'Gabon', 'gm': 'Gambia', 'ge': 'Georgia', 'de': 'Germany', 'gh': 'Ghana', 'gi': 'Gibraltar', 'gr': 'Greece', 'gl': 'Greenland', 'gd': 'Grenada', 'gp': 'Guadeloupe', 'gu': 'Guam', 'gt': 'Guatemala', 'gg': 'Guernsey', 'gn': 'Guinea', 'gw': 'Guinea-Bissau', 'gy': 'Guyana', 'ht': 'Haiti', 'hm': 'Heard Island and McDonald Islands', 'va': 'Holy See', 'hn': 'Honduras', 'hk': 'Hong Kong', 'hu': 'Hungary', 'is': 'Iceland', 'in': 'India', 'id': 'Indonesia', 'ir': 'Iran (Islamic Republic of)', 'iq': 'Iraq', 'ie': 'Ireland', 'im': 'Isle of Man', 'il': 'Israel', 'it': 'Italy', 'jm': 'Jamaica', 'jp': 'Japan', 'je': 'Jersey', 'jo': 'Jordan', 'kz': 'Kazakhstan', 'ke': 'Kenya', 'ki': 'Kiribati', 'kp': "Korea (Democratic People's Republic of)", 'kr': 'Korea, Republic of', 'kw': 'Kuwait', 'kg': 'Kyrgyzstan', 'la': "Lao People's Democratic Republic", 'lv': 'Latvia', 'lb': 'Lebanon', 'ls': 'Lesotho', 'lr': 'Liberia', 'ly': 'Libya', 'li': 'Liechtenstein', 'lt': 'Lithuania', 'lu': 'Luxembourg', 'mo': 'Macao', 'mg': 'Madagascar', 'mw': 'Malawi', 'my': 'Malaysia', 'mv': 'Maldives', 'ml': 'Mali', 'mt': 'Malta', 'mh': 'Marshall Islands', 'mq': 'Martinique', 'mr': 'Mauritania', 'mu': 'Mauritius', 'yt': 'Mayotte', 'mx': 'Mexico', 'fm': 'Micronesia (Federated States of)', 'md': 'Moldova, Republic of', 'mc': 'Monaco', 'mn': 'Mongolia', 'me': 'Montenegro', 'ms': 'Montserrat', 'ma': 'Morocco', 'mz': 'Mozambique', 'mm': 'Myanmar', 'na': 'Namibia', 'nr': 'Nauru', 'np': 'Nepal', 'nl': 'Netherlands', 'nc': 'New Caledonia', 'nz': 'New Zealand', 'ni': 'Nicaragua', 'ne': 'Niger', 'ng': 'Nigeria', 'nu': 'Niue', 'nf': 'Norfolk Island', 'mk': 'North Macedonia', 'mp': 'Northern Mariana Islands', 'no': 'Norway', 'om': 'Oman', 'pk': 'Pakistan', 'pw': 'Palau', 'ps': 'Palestine, State of', 'pa': 'Panama', 'pg': 'Papua New Guinea', 'py': 'Paraguay', 'pe': 'Peru', 'ph': 'Philippines', 'pn': 'Pitcairn', 'pl': 'Poland', 'pt': 'Portugal', 'pr': 'Puerto Rico', 'qa': 'Qatar', 're': 'Réunion', 'ro': 'Romania', 'ru': 'Russian Federation', 'rw': 'Rwanda', 'bl': 'Saint Barthélemy', 'sh': 'Saint Helena, Ascension and Tristan da Cunha', 'kn': 'Saint Kitts and Nevis', 'lc': 'Saint Lucia', 'mf': 'Saint Martin (French part)', 'pm': 'Saint Pierre and Miquelon', 'vc': 'Saint Vincent and the Grenadines', 'ws': 'Samoa', 'sm': 'San Marino', 'st': 'Sao Tome and Principe', 'sa': 'Saudi Arabia', 'sn': 'Senegal', 'rs': 'Serbia', 'sc': 'Seychelles', 'sl': 'Sierra Leone', 'sg': 'Singapore', 'sx': 'Sint Maarten (Dutch part)', 'sk': 'Slovakia', 'si': 'Slovenia', 'sb': 'Solomon Islands', 'so': 'Somalia', 'za': 'South Africa', 'gs': 'South Georgia and the South Sandwich Islands', 'ss': 'South Sudan', 'es': 'Spain', 'lk': 'Sri Lanka', 'sd': 'Sudan', 'sr': 'Suriname', 'sj': 'Svalbard and Jan Mayen', 'se': 'Sweden', 'ch': 'Switzerland', 'sy': 'Syrian Arab Republic', 'tw': 'Taiwan, Province of China', 'tj': 'Tajikistan', 'tz': 'Tanzania, United Republic of', 'th': 'Thailand', 'tl': 'Timor-Leste', 'tg': 'Togo', 'tk': 'Tokelau', 'to': 'Tonga', 'tt': 'Trinidad and Tobago', 'tn': 'Tunisia', 'tr': 'Turkey', 'tm': 'Turkmenistan', 'tc': 'Turks and Caicos Islands', 'tv': 'Tuvalu', 'ug': 'Uganda', 'ua': 'Ukraine', 'ae': 'United Arab Emirates', 'gb': 'United Kingdom of Great Britain and Northern Ireland', 'us': 'United States of America', 'um': 'United States Minor Outlying Islands', 'uy': 'Uruguay', 'uz': 'Uzbekistan', 'vu': 'Vanuatu', 've': 'Venezuela (Bolivarian Republic of)', 'vn': 'Viet Nam', 'vg': 'Virgin Islands (British)', 'vi': 'Virgin Islands (U.S.)', 'wf': 'Wallis and Futuna', 'eh': 'Western Sahara', 'ye': 'Yemen', 'zm': 'Zambia', 'zw': 'Zimbabwe'} \ No newline at end of file +COUNTRY_MAPPING_ISO = { + 'af': 'Afghanistan', 'ax': 'Åland Islands', 'al': 'Albania', 'dz': 'Algeria', 'as': 'American Samoa', 'ad': + 'Andorra', 'ao': 'Angola', 'ai': 'Anguilla', 'aq': 'Antarctica', 'ag': 'Antigua and Barbuda', 'ar': 'Argentina', + 'am': 'Armenia', 'aw': 'Aruba', 'au': 'Australia', 'at': 'Austria', 'az': 'Azerbaijan', 'bs': 'Bahamas', + 'bh': 'Bahrain', 'bd': 'Bangladesh', 'bb': 'Barbados', 'by': 'Belarus', 'be': 'Belgium', 'bz': 'Belize', + 'bj': 'Benin', 'bm': 'Bermuda', 'bt': 'Bhutan', 'bo': 'Bolivia (Plurinational State of)', + 'bq': 'Bonaire, Sint Eustatius and Saba', 'ba': 'Bosnia and Herzegovina', 'bw': 'Botswana', 'bv': 'Bouvet Island', + 'br': 'Brazil', 'io': 'British Indian Ocean Territory', 'bn': 'Brunei Darussalam', 'bg': 'Bulgaria', + 'bf': 'Burkina Faso', 'bi': 'Burundi', 'cv': 'Cabo Verde', 'kh': 'Cambodia', 'cm': 'Cameroon', 'ca': 'Canada', + 'ky': 'Cayman Islands', 'cf': 'Central African Republic', 'td': 'Chad', 'cl': 'Chile', 'cn': 'China', + 'cx': 'Christmas Island', 'cc': 'Cocos (Keeling) Islands', 'co': 'Colombia', 'km': 'Comoros', 'cg': 'Congo', + 'cd': 'Congo, Democratic Republic of the', 'ck': 'Cook Islands', 'cr': 'Costa Rica', 'ci': "Côte d'Ivoire", + 'hr': 'Croatia', 'cu': 'Cuba', 'cw': 'Curaçao', 'cy': 'Cyprus', 'cz': 'Czechia', 'dk': 'Denmark', 'dj': 'Djibouti', + 'dm': 'Dominica', 'do': 'Dominican Republic', 'ec': 'Ecuador', 'eg': 'Egypt', 'sv': 'El Salvador', + 'gq': 'Equatorial Guinea', 'er': 'Eritrea', 'ee': 'Estonia', 'sz': 'Eswatini', 'et': 'Ethiopia', + 'fk': 'Falkland Islands (Malvinas)', 'fo': 'Faroe Islands', 'fj': 'Fiji', 'fi': 'Finland', 'fr': 'France', + 'gf': 'French Guiana', 'pf': 'French Polynesia', 'tf': 'French Southern Territories', 'ga': 'Gabon', 'gm': 'Gambia', + 'ge': 'Georgia', 'de': 'Germany', 'gh': 'Ghana', 'gi': 'Gibraltar', 'gr': 'Greece', 'gl': 'Greenland', + 'gd': 'Grenada', 'gp': 'Guadeloupe', 'gu': 'Guam', 'gt': 'Guatemala', 'gg': 'Guernsey', 'gn': 'Guinea', + 'gw': 'Guinea-Bissau', 'gy': 'Guyana', 'ht': 'Haiti', 'hm': 'Heard Island and McDonald Islands', 'va': 'Holy See', + 'hn': 'Honduras', 'hk': 'Hong Kong', 'hu': 'Hungary', 'is': 'Iceland', 'in': 'India', 'id': 'Indonesia', + 'ir': 'Iran (Islamic Republic of)', 'iq': 'Iraq', 'ie': 'Ireland', 'im': 'Isle of Man', 'il': 'Israel', 'it': + 'Italy', 'jm': 'Jamaica', 'jp': 'Japan', 'je': 'Jersey', 'jo': 'Jordan', 'kz': 'Kazakhstan', 'ke': 'Kenya', + 'ki': 'Kiribati', 'kp': "Korea (Democratic People's Republic of)", 'kr': 'Korea, Republic of', 'kw': 'Kuwait', + 'kg': 'Kyrgyzstan', 'la': "Lao People's Democratic Republic", 'lv': 'Latvia', 'lb': 'Lebanon', 'ls': 'Lesotho', + 'lr': 'Liberia', 'ly': 'Libya', 'li': 'Liechtenstein', 'lt': 'Lithuania', 'lu': 'Luxembourg', 'mo': 'Macao', + 'mg': 'Madagascar', 'mw': 'Malawi', 'my': 'Malaysia', 'mv': 'Maldives', 'ml': 'Mali', 'mt': 'Malta', + 'mh': 'Marshall Islands', 'mq': 'Martinique', 'mr': 'Mauritania', 'mu': 'Mauritius', 'yt': 'Mayotte', + 'mx': 'Mexico', 'fm': 'Micronesia (Federated States of)', 'md': 'Moldova, Republic of', 'mc': 'Monaco', + 'mn': 'Mongolia', 'me': 'Montenegro', 'ms': 'Montserrat', 'ma': 'Morocco', 'mz': 'Mozambique', 'mm': 'Myanmar', + 'na': 'Namibia', 'nr': 'Nauru', 'np': 'Nepal', 'nl': 'Netherlands', 'nc': 'New Caledonia', 'nz': 'New Zealand', + 'ni': 'Nicaragua', 'ne': 'Niger', 'ng': 'Nigeria', 'nu': 'Niue', 'nf': 'Norfolk Island', 'mk': 'North Macedonia', + 'mp': 'Northern Mariana Islands', 'no': 'Norway', 'om': 'Oman', 'pk': 'Pakistan', 'pw': 'Palau', + 'ps': 'Palestine, State of', 'pa': 'Panama', 'pg': 'Papua New Guinea', 'py': 'Paraguay', 'pe': 'Peru', + 'ph': 'Philippines', 'pn': 'Pitcairn', 'pl': 'Poland', 'pt': 'Portugal', 'pr': 'Puerto Rico', 'qa': 'Qatar', + 're': 'Réunion', 'ro': 'Romania', 'ru': 'Russian Federation', 'rw': 'Rwanda', 'bl': 'Saint Barthélemy', + 'sh': 'Saint Helena, Ascension and Tristan da Cunha', 'kn': 'Saint Kitts and Nevis', 'lc': 'Saint Lucia', + 'mf': 'Saint Martin (French part)', 'pm': 'Saint Pierre and Miquelon', 'vc': 'Saint Vincent and the Grenadines', + 'ws': 'Samoa', 'sm': 'San Marino', 'st': 'Sao Tome and Principe', 'sa': 'Saudi Arabia', 'sn': 'Senegal', + 'rs': 'Serbia', 'sc': 'Seychelles', 'sl': 'Sierra Leone', 'sg': 'Singapore', 'sx': 'Sint Maarten (Dutch part)', + 'sk': 'Slovakia', 'si': 'Slovenia', 'sb': 'Solomon Islands', 'so': 'Somalia', 'za': 'South Africa', + 'gs': 'South Georgia and the South Sandwich Islands', 'ss': 'South Sudan', 'es': 'Spain', 'lk': 'Sri Lanka', + 'sd': 'Sudan', 'sr': 'Suriname', 'sj': 'Svalbard and Jan Mayen', 'se': 'Sweden', 'ch': 'Switzerland', + 'sy': 'Syrian Arab Republic', 'tw': 'Taiwan, Province of China', 'tj': 'Tajikistan', + 'tz': 'Tanzania, United Republic of', 'th': 'Thailand', 'tl': 'Timor-Leste', 'tg': 'Togo', 'tk': 'Tokelau', + 'to': 'Tonga', 'tt': 'Trinidad and Tobago', 'tn': 'Tunisia', 'tr': 'Turkey', 'tm': 'Turkmenistan', + 'tc': 'Turks and Caicos Islands', 'tv': 'Tuvalu', 'ug': 'Uganda', 'ua': 'Ukraine', 'ae': 'United Arab Emirates', + 'gb': 'United Kingdom of Great Britain and Northern Ireland', 'us': 'United States of America', + 'um': 'United States Minor Outlying Islands', 'uy': 'Uruguay', 'uz': 'Uzbekistan', 'vu': 'Vanuatu', + 've': 'Venezuela (Bolivarian Republic of)', 'vn': 'Viet Nam', 'vg': 'Virgin Islands (British)', + 'vi': 'Virgin Islands (U.S.)', 'wf': 'Wallis and Futuna', 'eh': 'Western Sahara', 'ye': 'Yemen', 'zm': 'Zambia', + 'zw': 'Zimbabwe'} From c467246a87523cf3ae3e631bf2fc92cedbef623b Mon Sep 17 00:00:00 2001 From: Amale EL HAMRI <amale.elhamri@artefact.com> Date: Thu, 24 Sep 2020 17:50:12 +0200 Subject: [PATCH 284/496] not downloading fasttext in CI --- .travis.yml | 1 - 1 file changed, 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index 0304bca..ff06902 100644 --- a/.travis.yml +++ b/.travis.yml @@ -23,7 +23,6 @@ services: - docker before_script: - - wget https://github.com/facebookresearch/fastText/archive/v0.2.0.zip && unzip v0.2.0.zip && cd fastText-0.2.0 && make && pip install . && cd .. - python3 -m spacy download fr && python3 -m spacy download en && python3 -m spacy download de && python3 -m spacy download nl && python3 -m spacy download it && python3 -m spacy download xx && python3 -m spacy validate - wget http://mallet.cs.umass.edu/dist/mallet-2.0.8.zip && unzip mallet-2.0.8.zip && rm mallet-2.0.8.zip From 22374e829c6071c2f098398b92780d08ee4f0ca9 Mon Sep 17 00:00:00 2001 From: Amale EL HAMRI <amale.elhamri@artefact.com> Date: Thu, 24 Sep 2020 17:59:54 +0200 Subject: [PATCH 285/496] downloading spacy from requirements --- .travis.yml | 2 -- requirements.txt | 6 ++++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/.travis.yml b/.travis.yml index ff06902..964c33b 100644 --- a/.travis.yml +++ b/.travis.yml @@ -23,8 +23,6 @@ services: - docker before_script: - - python3 -m spacy download fr && python3 -m spacy download en && python3 -m spacy download de && python3 -m spacy download nl && python3 -m spacy download it && python3 -m spacy download xx && python3 -m spacy validate - - wget http://mallet.cs.umass.edu/dist/mallet-2.0.8.zip && unzip mallet-2.0.8.zip && rm mallet-2.0.8.zip - sudo add-apt-repository -y ppa:openjdk-r/ppa && sudo apt update && apt search openjdk && sudo apt install openjdk-8-jdk diff --git a/requirements.txt b/requirements.txt index 14c8197..3c52e2d 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,14 +1,16 @@ numpy==1.18.1 chardet==3.0.4 pandas==0.25.1 -spacy==2.1.8 +spacy==2.2.4 +https://github.com/explosion/spacy-models/releases/download/en_core_web_sm-2.2.5/en_core_web_sm-2.2.5.tar.gz +https://github.com/explosion/spacy-models/releases/download/fr_core_news_sm-2.2.5/fr_core_news_sm-2.2.5.tar.gz click==7.1.1 matplotlib==3.1.1 tqdm==4.45.0 biterm==0.1.5 flashtext==2.7 ftfy==5.8 -gensim==3.8.3 +gensim==3.7.1 ipython==7.18.1 nlpaug==0.0.20 nltk==3.5 From 5f3fea6e397c90e2de50fb2232fa8e9cdbf201f8 Mon Sep 17 00:00:00 2001 From: Amale EL HAMRI <amale.elhamri@artefact.com> Date: Thu, 24 Sep 2020 18:03:59 +0200 Subject: [PATCH 286/496] installing in CI with pip3 --- .travis.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.travis.yml b/.travis.yml index 964c33b..8eb1c9e 100644 --- a/.travis.yml +++ b/.travis.yml @@ -27,7 +27,7 @@ before_script: - sudo add-apt-repository -y ppa:openjdk-r/ppa && sudo apt update && apt search openjdk && sudo apt install openjdk-8-jdk install: - - pip install -r requirements.txt - - pip install -e . + - pip3 install -r requirements.txt + - pip3 install -e . script: - pytest tests/* From 66f2e6649d062bca04eaf50e9243c6cf0756c80a Mon Sep 17 00:00:00 2001 From: Amale EL HAMRI <amale.elhamri@artefact.com> Date: Thu, 24 Sep 2020 18:08:04 +0200 Subject: [PATCH 287/496] adding external requirements to fix CI --- requirements.txt | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/requirements.txt b/requirements.txt index 3c52e2d..0b561bb 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,3 +1,11 @@ +# external requirements +Sphinx +sphinx_rtd_theme +coverage +python-dotenv>=0.5.1 +pillow +pytest==6.0.2 + numpy==1.18.1 chardet==3.0.4 pandas==0.25.1 From b98b2afb31c0f8cc1df4e35104e003bb99f1e748 Mon Sep 17 00:00:00 2001 From: Amale EL HAMRI <amale.elhamri@artefact.com> Date: Thu, 24 Sep 2020 18:10:42 +0200 Subject: [PATCH 288/496] adding external requirements to fix CI --- requirements.txt | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/requirements.txt b/requirements.txt index 0b561bb..c7a93b1 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,7 +1,7 @@ # external requirements -Sphinx -sphinx_rtd_theme -coverage +Sphinx==3.2.1 +sphinx_rtd_theme==0.5.0 +coverage==5.3 python-dotenv>=0.5.1 pillow pytest==6.0.2 @@ -25,7 +25,6 @@ nltk==3.5 phonenumbers==8.12.9 pyLDAvis==2.1.2 pytest==6.0.2 -python-dotenv==0.14.0 regex==2020.7.14 sacremoses==0.0.43 scikit_learn==0.23.2 From b4b4c3597dcc6bea227a66d71694c007e6e9d473 Mon Sep 17 00:00:00 2001 From: Amale EL HAMRI <amale.elhamri@artefact.com> Date: Thu, 24 Sep 2020 18:13:41 +0200 Subject: [PATCH 289/496] removing ipython to fix CI --- requirements.txt | 1 - 1 file changed, 1 deletion(-) diff --git a/requirements.txt b/requirements.txt index c7a93b1..928dad5 100644 --- a/requirements.txt +++ b/requirements.txt @@ -19,7 +19,6 @@ biterm==0.1.5 flashtext==2.7 ftfy==5.8 gensim==3.7.1 -ipython==7.18.1 nlpaug==0.0.20 nltk==3.5 phonenumbers==8.12.9 From eda21ec8f2ef592e063b4b155a86edfa94b67bc8 Mon Sep 17 00:00:00 2001 From: Amale EL HAMRI <amale.elhamri@artefact.com> Date: Thu, 24 Sep 2020 18:17:46 +0200 Subject: [PATCH 290/496] removing pip3 --- .travis.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.travis.yml b/.travis.yml index 8eb1c9e..964c33b 100644 --- a/.travis.yml +++ b/.travis.yml @@ -27,7 +27,7 @@ before_script: - sudo add-apt-repository -y ppa:openjdk-r/ppa && sudo apt update && apt search openjdk && sudo apt install openjdk-8-jdk install: - - pip3 install -r requirements.txt - - pip3 install -e . + - pip install -r requirements.txt + - pip install -e . script: - pytest tests/* From 5b9d72c89e2884928b486423e3013175c121869d Mon Sep 17 00:00:00 2001 From: Amale EL HAMRI <amale.elhamri@artefact.com> Date: Thu, 24 Sep 2020 18:25:20 +0200 Subject: [PATCH 291/496] rollback to old versions packages --- requirements.txt | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) diff --git a/requirements.txt b/requirements.txt index 928dad5..bbe857c 100644 --- a/requirements.txt +++ b/requirements.txt @@ -6,7 +6,9 @@ python-dotenv>=0.5.1 pillow pytest==6.0.2 -numpy==1.18.1 +pyLDAvis==2.1.2 +gensim==3.7.1 +numpy==1.15.4 chardet==3.0.4 pandas==0.25.1 spacy==2.2.4 @@ -17,17 +19,16 @@ matplotlib==3.1.1 tqdm==4.45.0 biterm==0.1.5 flashtext==2.7 -ftfy==5.8 -gensim==3.7.1 +ftfy<5.0.0,>=4.2.0 nlpaug==0.0.20 -nltk==3.5 -phonenumbers==8.12.9 -pyLDAvis==2.1.2 +nltk==3.4.5 +phonenumbers==8.10.12 pytest==6.0.2 -regex==2020.7.14 +regex==2019.8.19 sacremoses==0.0.43 -scikit_learn==0.23.2 +scikit_learn==0.20.3 stop_words==2018.7.23 wordcloud==1.8.0 +emoji>=0.5.2 summa==1.2.0 pylint==2.4.4 From 32e2bedfab36628babd40ace62bdfa5128819c33 Mon Sep 17 00:00:00 2001 From: Amale EL HAMRI <amale.elhamri@artefact.com> Date: Thu, 24 Sep 2020 18:29:16 +0200 Subject: [PATCH 292/496] rolling back to old requirements and CI --- .travis.yml | 5 ++++- requirements.txt | 51 +++++++++++++++++++++++++++--------------------- 2 files changed, 33 insertions(+), 23 deletions(-) diff --git a/.travis.yml b/.travis.yml index 964c33b..d2220c0 100644 --- a/.travis.yml +++ b/.travis.yml @@ -23,6 +23,9 @@ services: - docker before_script: + - wget https://github.com/facebookresearch/fastText/archive/v0.2.0.zip && unzip v0.2.0.zip && cd fastText-0.2.0 && make && pip install . && cd .. + - python3 -m spacy download fr && python3 -m spacy download en && python3 -m spacy download de && python3 -m spacy download nl && python3 -m spacy download it && python3 -m spacy download xx && python3 -m spacy validate + - wget http://mallet.cs.umass.edu/dist/mallet-2.0.8.zip && unzip mallet-2.0.8.zip && rm mallet-2.0.8.zip - sudo add-apt-repository -y ppa:openjdk-r/ppa && sudo apt update && apt search openjdk && sudo apt install openjdk-8-jdk @@ -30,4 +33,4 @@ install: - pip install -r requirements.txt - pip install -e . script: - - pytest tests/* + - pytest tests/* \ No newline at end of file diff --git a/requirements.txt b/requirements.txt index bbe857c..36d1946 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,34 +1,41 @@ +# local package +#-e . + # external requirements -Sphinx==3.2.1 -sphinx_rtd_theme==0.5.0 -coverage==5.3 +Sphinx +sphinx_rtd_theme +coverage python-dotenv>=0.5.1 pillow -pytest==6.0.2 +pytest +#library requirements pyLDAvis==2.1.2 gensim==3.7.1 -numpy==1.15.4 +sacremoses==0.0.13 +stop-words==2018.7.23 +spacy==2.1.3 +ftfy<5.0.0,>=4.2.0 +wordcloud>=1.5.0 +matplotlib>=3.0.3 +mosestokenizer +numpy>1.15.4 +stop_words==2018.7.23 +nltk>=3.4.5 +textblob==0.15.3 +textblob_fr==0.2.0 +pandas>=0.23.4 chardet==3.0.4 -pandas==0.25.1 -spacy==2.2.4 -https://github.com/explosion/spacy-models/releases/download/en_core_web_sm-2.2.5/en_core_web_sm-2.2.5.tar.gz -https://github.com/explosion/spacy-models/releases/download/fr_core_news_sm-2.2.5/fr_core_news_sm-2.2.5.tar.gz -click==7.1.1 -matplotlib==3.1.1 -tqdm==4.45.0 -biterm==0.1.5 +setuptools==40.8.0 +textacy==0.6.3 +#fastText==0.8.3 +gensim==3.7.1 +scikit_learn==0.20.3 +vaderSentiment==3.2.1 +google-compute-engine==2.8.13 flashtext==2.7 -ftfy<5.0.0,>=4.2.0 -nlpaug==0.0.20 -nltk==3.4.5 phonenumbers==8.10.12 -pytest==6.0.2 regex==2019.8.19 -sacremoses==0.0.43 -scikit_learn==0.20.3 -stop_words==2018.7.23 -wordcloud==1.8.0 emoji>=0.5.2 summa==1.2.0 -pylint==2.4.4 +biterm==0.1.5 From b309e35c0c63bfae0bb8e96e2f4ee4110b5ad295 Mon Sep 17 00:00:00 2001 From: Amale EL HAMRI <amale.elhamri@artefact.com> Date: Thu, 1 Oct 2020 10:41:49 +0200 Subject: [PATCH 293/496] removing make_dataset.py file --- nautilus_nlp/data/make_dataset.py | 47 ------------------------------- 1 file changed, 47 deletions(-) delete mode 100644 nautilus_nlp/data/make_dataset.py diff --git a/nautilus_nlp/data/make_dataset.py b/nautilus_nlp/data/make_dataset.py deleted file mode 100644 index 186fb78..0000000 --- a/nautilus_nlp/data/make_dataset.py +++ /dev/null @@ -1,47 +0,0 @@ -# GNU Lesser General Public License v3.0 only -# Copyright (C) 2020 Artefact -# licence-information@artefact.com -# -# This program is free software; you can redistribute it and/or -# modify it under the terms of the GNU Lesser General Public -# License as published by the Free Software Foundation; either -# version 3 of the License, or (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public License -# along with this program; if not, write to the Free Software Foundation, -# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. -# -*- coding: utf-8 -*- -import click -import logging -from pathlib import Path -from dotenv import find_dotenv, load_dotenv - - -@click.command() -@click.argument("input_filepath", type=click.Path(exists=True)) -@click.argument("output_filepath", type=click.Path()) -def main(input_filepath, output_filepath): - """ Runs data processing scripts to turn raw data from (../raw) into - cleaned data ready to be analyzed (saved in ../processed). - """ - logger = logging.getLogger(__name__) - logger.info("making final data set from raw data") - - -if __name__ == "__main__": - log_fmt = "%(asctime)s - %(name)s - %(levelname)s - %(message)s" - logging.basicConfig(level=logging.INFO, format=log_fmt) - - # not used in this stub but often useful for finding various files - project_dir = Path(__file__).resolve().parents[2] - - # find .env automagically by walking up directories until it's found, then - # load up the .env entries as environment variables - load_dotenv(find_dotenv()) - - main() From 4eb3d37c3356d724fb849258d3752b0a15860123 Mon Sep 17 00:00:00 2001 From: Amale EL HAMRI <amale.elhamri@artefact.com> Date: Thu, 1 Oct 2020 11:14:50 +0200 Subject: [PATCH 294/496] linting data_augmentation.py --- .../preprocessing/data_augmentation.py | 118 ++++++++++-------- requirements.txt | 1 + 2 files changed, 69 insertions(+), 50 deletions(-) diff --git a/nautilus_nlp/preprocessing/data_augmentation.py b/nautilus_nlp/preprocessing/data_augmentation.py index 69b84e1..1263260 100644 --- a/nautilus_nlp/preprocessing/data_augmentation.py +++ b/nautilus_nlp/preprocessing/data_augmentation.py @@ -1,13 +1,19 @@ import copy import logging -import nlpaug.augmenter.word as naw import re +import nlpaug.augmenter.word as naw + + +class CouldNotAugment(ValueError): + pass + + def augment_utterance(text, method, stopwords, intent=None, entities=None): """ Given ``text`` str, create a new similar utterance by modifying some words - in the initial sentence, modifications depend on the chosen method - (substitution with synonym, addition, deletion). If intent and/or entities + in the initial sentence, modifications depend on the chosen method + (substitution with synonym, addition, deletion). If intent and/or entities are given as input, they will remain unchanged. Parameters @@ -34,74 +40,86 @@ def augment_utterance(text, method, stopwords, intent=None, entities=None): Returns ------- - dictionary with augmented text and optional keys depending on input + dictionary with augmented text and optional keys depending on input """ new_utt = {} - if entities: - formatted_entities = [(text[entities[i]['startCharIndex']:entities[i]['endCharIndex']].strip(),entities[i]['entity']) for i in range(len(entities))] - augmenter = select_augmenter(method,stopwords) + augmenter = select_augmenter(method, stopwords) new_utt['text'] = augmenter.augment(text) - if intent: + if intent is not None: new_utt['intent'] = intent - if entities: - if are_entities_in_augmented_text(entities,new_utt['text']): - new_utt['entities'] = get_augmented_entities(new_utt['text'],formatted_entities) + if entities is not None: + formatted_entities = [(text[entities[i]['startCharIndex']:entities[i]['endCharIndex'] + ].strip(), entities[i]['entity']) for i in range(len(entities))] + if are_entities_in_augmented_text(entities, new_utt['text']): + new_utt['entities'] = get_augmented_entities(new_utt['text'], formatted_entities) return clean_sentence_entities(new_utt) - else: - logging.info('Text was not correctly augmented so not added') - else: - return new_utt + raise CouldNotAugment('Text was not correctly augmented so not added') + return new_utt -def are_entities_in_augmented_text(entities,augmented_text): + +def are_entities_in_augmented_text(entities, augmented_text): check = True for ent in entities: if ent['word'] not in augmented_text: check = False return check -def select_augmenter(method,stopwords,use_stopwords=True): - if use_stopwords: - stopwords = stopwords - else: + +def select_augmenter(method, stopwords, use_stopwords=True): + if not use_stopwords: stopwords = [] if method == 'wordnet_synonym': - augmenter = naw.SynonymAug(aug_src='wordnet',stopwords=stopwords) + augmenter = naw.SynonymAug(aug_src='wordnet', stopwords=stopwords) elif method == 'aug_sub_bert': - augmenter = naw.ContextualWordEmbsAug(model_path='bert-base-uncased', action="substitute",stopwords=stopwords) - return(augmenter) + augmenter = naw.ContextualWordEmbsAug(model_path='bert-base-uncased', action="substitute", stopwords=stopwords) + return(augmenter) + -def get_augmented_entities(sentence_augmented,entities): +def get_augmented_entities(sentence_augmented, entities): entities_augmented = [] - for entity in entities : - regex = r'(?:^|\W)' + re.escape(entity[0].strip()) + '(?:$|\W)' + for entity in entities: + regex = r'(?:^|\W)' + re.escape(entity[0].strip()) + r'(?:$|\W)' if (re.search(re.compile(regex), sentence_augmented)): - start_index = re.search(regex,sentence_augmented).start()+1 - end_index = re.search(regex,sentence_augmented).end()-1 - new_entity = {'entity': entity[1],'word': sentence_augmented[start_index:end_index],'startCharIndex': start_index,'endCharIndex': end_index} - entities_augmented.append(new_entity) + start_index = re.search(regex, sentence_augmented).start()+1 + end_index = re.search(regex, sentence_augmented).end()-1 + new_entity = { + 'entity': entity[1], + 'word': sentence_augmented[start_index: end_index], + 'startCharIndex': start_index, 'endCharIndex': end_index} + entities_augmented.append(new_entity) return entities_augmented + def clean_sentence_entities(sentence_input): sentence = copy.copy(sentence_input) - for element1 in sentence['entities']: - for element2 in sentence['entities'] : - result = check_interval_included(element1,element2) - if result: - try : + for element1 in sentence['entities']: + for element2 in sentence['entities']: + result = check_interval_included(element1, element2) + if result is not None: + try: sentence[1]['entities'].remove(result[0]) - except : - logging.info("Cant remove entity : {} \n entities are now :{} \n for sentence : {} ".format(result,sentence['entities'],sentence['text'])) + except IndexError: + logging.warning( + "Cant remove entity : {} \n entities are now :{} \n for sentence : {} ".format( + result, sentence['entities'], + sentence['text'])) continue - return(sentence) - -def check_interval_included(element1,element2): - if ((element1 != element2) and (element1['startCharIndex'] >= element2['startCharIndex']) and (element1['endCharIndex'] <= element2['endCharIndex'])): - return((element1,element2)) - elif ((element1 != element2) and (element2['startCharIndex'] >= element1['startCharIndex']) and (element2['endCharIndex'] <= element1['endCharIndex'])): - return((element2,element1)) - elif ((element1 != element2) and (element1['startCharIndex'] >= element2['startCharIndex']) and (element1['endCharIndex'] >= element2['endCharIndex']) and (element1['startCharIndex'] <= element2['endCharIndex']-1)): - return((element1,element2)) - elif ((element1 != element2) and (element2['startCharIndex'] >= element1['startCharIndex']) and (element2['endCharIndex'] >= element1['endCharIndex']) and (element2['startCharIndex'] < element1['endCharIndex']-1)): - return((element2,element1)) - else : - return(False) \ No newline at end of file + return sentence + + +def check_interval_included(element1, element2): + if ((element1 != element2) and (element1['startCharIndex'] >= element2['startCharIndex']) and + (element1['endCharIndex'] <= element2['endCharIndex'])): + return element1, element2 + if ((element1 != element2) and (element2['startCharIndex'] >= element1['startCharIndex']) and + (element2['endCharIndex'] <= element1['endCharIndex'])): + return element2, element1 + if ((element1 != element2) and (element1['startCharIndex'] >= element2['startCharIndex']) and + (element1['endCharIndex'] >= element2['endCharIndex']) and + (element1['startCharIndex'] <= element2['endCharIndex']-1)): + return element1, element2 + if ((element1 != element2) and (element2['startCharIndex'] >= element1['startCharIndex']) and + (element2['endCharIndex'] >= element1['endCharIndex']) and + (element2['startCharIndex'] < element1['endCharIndex']-1)): + return element2, element1 + return None diff --git a/requirements.txt b/requirements.txt index 36d1946..87479ee 100644 --- a/requirements.txt +++ b/requirements.txt @@ -39,3 +39,4 @@ regex==2019.8.19 emoji>=0.5.2 summa==1.2.0 biterm==0.1.5 +nlpaug==1.0.1 From 100067b4ca4296e3108601ebb3a78882712966b3 Mon Sep 17 00:00:00 2001 From: Amale EL HAMRI <amale.elhamri@artefact.com> Date: Thu, 1 Oct 2020 11:15:01 +0200 Subject: [PATCH 295/496] adding pylintrc --- pylintrc | 382 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 382 insertions(+) create mode 100644 pylintrc diff --git a/pylintrc b/pylintrc new file mode 100644 index 0000000..f16004a --- /dev/null +++ b/pylintrc @@ -0,0 +1,382 @@ +[MASTER] + +# Specify a configuration file. +#rcfile= + +# Python code to execute, usually for sys.path manipulation such as +# pygtk.require(). +#init-hook= + +# Add files or directories to the blacklist. They should be base names, not +# paths. +ignore=CVS + +# Pickle collected data for later comparisons. +persistent=yes + +# List of plugins (as comma separated values of python modules names) to load, +# usually to register additional checkers. +load-plugins= + +# Use multiple processes to speed up Pylint. +jobs=4 + +# Allow loading of arbitrary C extensions. Extensions are imported into the +# active Python interpreter and may run arbitrary code. +unsafe-load-any-extension=no + +# A comma-separated list of package or module names from where C extensions may +# be loaded. Extensions are loading into the active Python interpreter and may +# run arbitrary code +extension-pkg-whitelist= + +# Allow optimization of some AST trees. This will activate a peephole AST +# optimizer, which will apply various small optimizations. For instance, it can +# be used to obtain the result of joining multiple strings with the addition +# operator. Joining a lot of strings can lead to a maximum recursion error in +# Pylint and this flag can prevent that. It has one side effect, the resulting +# AST will be different than the one from reality. +optimize-ast=no + + +[MESSAGES CONTROL] + +# Only show warnings with the listed confidence levels. Leave empty to show +# all. Valid levels: HIGH, INFERENCE, INFERENCE_FAILURE, UNDEFINED +confidence= + +# Enable the message, report, category or checker with the given id(s). You can +# either give multiple identifier separated by comma (,) or put this option +# multiple time (only on the command line, not in the configuration file where +# it should appear only once). See also the "--disable" option for examples. +#enable= + +# Disable the message, report, category or checker with the given id(s). You +# can either give multiple identifiers separated by comma (,) or put this +# option multiple times (only on the command line, not in the configuration +# file where it should appear only once).You can also use "--disable=all" to +# disable everything first and then reenable specific checks. For example, if +# you want to run only the similarities checker, you can use "--disable=all +# --enable=similarities". If you want to run only the classes checker, but have +# no Warning level messages displayed, use"--disable=all --enable=classes +# --disable=W" +disable=unpacking-in-except,unicode-builtin,getslice-method,intern-builtin,long-suffix,reload-builtin,oct-method,indexing-exception,file-builtin,basestring-builtin,coerce-method,old-ne-operator,old-raise-syntax,import-star-module-level,range-builtin-not-iterating,map-builtin-not-iterating,backtick,dict-iter-method,hex-method,nonzero-method,buffer-builtin,setslice-method,xrange-builtin,no-absolute-import,unichr-builtin,long-builtin,old-division,using-cmp-argument,parameter-unpacking,reduce-builtin,old-octal-literal,filter-builtin-not-iterating,cmp-builtin,raising-string,useless-suppression,print-statement,round-builtin,input-builtin,raw_input-builtin,coerce-builtin,next-method-called,standarderror-builtin,suppressed-message,metaclass-assignment,apply-builtin,delslice-method,cmp-method,zip-builtin-not-iterating,execfile-builtin,dict-view-method,missing-docstring,too-few-public-methods,superfluous-parens,logging-format-interpolation,too-many-arguments + + +[REPORTS] + +# Set the output format. Available formats are text, parseable, colorized, msvs +# (visual studio) and html. You can also give a reporter class, eg +# mypackage.mymodule.MyReporterClass. +output-format=text + +# Put messages in a separate file for each module / package specified on the +# command line instead of printing them on stdout. Reports (if any) will be +# written in a file name "pylint_global.[txt|html]". +files-output=no + +# Tells whether to display a full report or only the messages +reports=yes + +# Python expression which should return a note less than 10 (10 is the highest +# note). You have access to the variables errors warning, statement which +# respectively contain the number of errors / warnings messages and the total +# number of statements analyzed. This is used by the global evaluation report +# (RP0004). +evaluation=10.0 - ((float(5 * error + warning + refactor + convention) / statement) * 10) + +# Template used to display messages. This is a python new-style format string +# used to format the message information. See doc for all details +#msg-template= + + +[VARIABLES] + +# Tells whether we should check for unused import in __init__ files. +init-import=no + +# A regular expression matching the name of dummy variables (i.e. expectedly +# not used). +dummy-variables-rgx=_$|dummy + +# List of additional names supposed to be defined in builtins. Remember that +# you should avoid to define new builtins when possible. +additional-builtins= + +# List of strings which can identify a callback function by name. A callback +# name must start or end with one of those strings. +callbacks=cb_,_cb + +# Enable pylint to get numpy and pandas dependencies +generated-members=pandas.*,numpy.* + + +[SIMILARITIES] + +# Minimum lines number of a similarity. +min-similarity-lines=15 + +# Ignore comments when computing similarities. +ignore-comments=yes + +# Ignore docstrings when computing similarities. +ignore-docstrings=yes + +# Ignore imports when computing similarities. +ignore-imports=no + + +[SPELLING] + +# Spelling dictionary name. Available dictionaries: none. To make it working +# install python-enchant package. +spelling-dict= + +# List of comma separated words that should not be checked. +spelling-ignore-words= + +# A path to a file that contains private dictionary; one word per line. +spelling-private-dict-file= + +# Tells whether to store unknown words to indicated private dictionary in +# --spelling-private-dict-file option instead of raising a message. +spelling-store-unknown-words=no + + +[LOGGING] + +# Logging modules to check that the string format arguments are in logging +# function parameter format +logging-modules=logging + + +[FORMAT] + +# Maximum number of characters on a single line. +max-line-length=120 + +# Regexp for a line that is allowed to be longer than the limit. +ignore-long-lines=^\s*(# )?<?https?://\S+>?$ + +# Allow the body of an if to be on the same line as the test if there is no +# else. +single-line-if-stmt=no + +# List of optional constructs for which whitespace checking is disabled. `dict- +# separator` is used to allow tabulation in dicts, etc.: {1 : 1,\n222: 2}. +# `trailing-comma` allows a space between comma and closing bracket: (a, ). +# `empty-line` allows space-only lines. +no-space-check=trailing-comma,dict-separator + +# Maximum number of lines in a module +max-module-lines=1000 + +# String used as indentation unit. This is usually " " (4 spaces) or "\t" (1 +# tab). +indent-string=' ' + +# Number of spaces of indent required inside a hanging or continued line. +indent-after-paren=4 + +# Expected format of line ending, e.g. empty (any line ending), LF or CRLF. +expected-line-ending-format= + + +[BASIC] + +# List of builtins function names that should not be used, separated by a comma +bad-functions=map,filter + +# Good variable names which should always be accepted, separated by a comma +good-names=i,j,k,s,ex,Run,_,X,standardized_X,df,logger,y,X_train,X_test,X_predict,X_validate + +# Bad variable names which should always be refused, separated by a comma +bad-names=foo,bar,baz,toto,tutu,tata + +# Colon-delimited sets of names that determine each other's naming style when +# the name regexes allow several styles. +name-group= + +# Include a hint for the correct naming format with invalid-name +include-naming-hint=no + +# Regular expression matching correct constant names +const-rgx=(([A-Z_][A-Z0-9_]*)|(__.*__))$ + +# Naming hint for constant names +const-name-hint=(([A-Z_][A-Z0-9_]*)|(__.*__))$ + +# Regular expression matching correct class names +class-rgx=[A-Z_][a-zA-Z0-9]+$ + +# Naming hint for class names +class-name-hint=[A-Z_][a-zA-Z0-9]+$ + +# Regular expression matching correct attribute names +attr-rgx=[a-z_][a-zX0-9_]{2,30}$ + +# Naming hint for attribute names +attr-name-hint=[a-z_][a-zX0-9_]{2,30}$ + +# Regular expression matching correct class attribute names +class-attribute-rgx=([A-Za-z_][A-Za-z0-9_]{2,30}|(__.*__))$ + +# Naming hint for class attribute names +class-attribute-name-hint=([A-Za-z_][A-Za-z0-9_]{2,30}|(__.*__))$ + +# Regular expression matching correct function names +function-rgx=[a-z_]([a-z0-9_]{2,30})*$ + +# Naming hint for function names +function-name-hint=[a-z_]([a-z0-9_]{2,30})*$ + +# Regular expression matching correct inline iteration names +inlinevar-rgx=[A-Za-z_][A-Za-z0-9_]*$ + +# Naming hint for inline iteration names +inlinevar-name-hint=[A-Za-z_][A-Za-z0-9_]*$ + +# Regular expression matching correct argument names +argument-rgx=[a-z_][a-z0-9_]{2,30}$ + +# Naming hint for argument names +argument-name-hint=[a-z_][a-z0-9_]{2,30}$ + +# Regular expression matching correct method names +method-rgx=[a-z_]([a-z0-9_]{2,30})*$ + +# Naming hint for method names +method-name-hint=[a-z_]([a-z0-9_]{2,30})*$ + +# Regular expression matching correct variable names +variable-rgx=[a-z_]([a-z0-9_]{2,30})*$ + +# Naming hint for variable names +variable-name-hint=[a-z_]([a-z0-9_]{2,30})*$ + +# Regular expression matching correct module names +module-rgx=(([a-z_][a-z0-9_]*)|([A-Z][a-zA-Z0-9]+))$ + +# Naming hint for module names +module-name-hint=(([a-z_][a-z0-9_]*)|([A-Z][a-zA-Z0-9]+))$ + +# Regular expression which should only match function or class names that do +# not require a docstring. +no-docstring-rgx=^_ + +# Minimum line length for functions/classes that require docstrings, shorter +# ones are exempt. +docstring-min-length=-1 + + +[ELIF] + +# Maximum number of nested blocks for function / method body +max-nested-blocks=5 + + +[MISCELLANEOUS] + +# List of note tags to take in consideration, separated by a comma. +notes=FIXME,XXX + + +[TYPECHECK] + +# Tells whether missing members accessed in mixin class should be ignored. A +# mixin class is detected if its name ends with "mixin" (case insensitive). +ignore-mixin-members=yes + +# List of module names for which member attributes should not be checked +# (useful for modules/projects where namespaces are manipulated during runtime +# and thus existing member attributes cannot be deduced by static analysis. It +# supports qualified module names, as well as Unix pattern matching. +ignored-modules= + +# List of classes names for which member attributes should not be checked +# (useful for classes with attributes dynamically set). This supports can work +# with qualified names. +ignored-classes=DatetimeIndex + +# List of members which are set dynamically and missed by pylint inference +# system, and so shouldn't trigger E1101 when accessed. Python regular +# expressions are accepted. +generated-members= + + +[IMPORTS] + +# Deprecated modules which should not be used, separated by a comma +deprecated-modules=optparse + +# Create a graph of every (i.e. internal and external) dependencies in the +# given file (report RP0402 must not be disabled) +import-graph= + +# Create a graph of external dependencies in the given file (report RP0402 must +# not be disabled) +ext-import-graph= + +# Create a graph of internal dependencies in the given file (report RP0402 must +# not be disabled) +int-import-graph= + + +[DESIGN] + +# Maximum number of arguments for function / method +max-args=6 + +# Argument names that match this expression will be ignored. Default to name +# with leading underscore +ignored-argument-names=_.* + +# Maximum number of locals for function / method body +max-locals=20 + +# Maximum number of return / yield for function / method body +max-returns=6 + +# Maximum number of branch for function / method body +max-branches=12 + +# Maximum number of statements in function / method body +max-statements=51 + +# Maximum number of parents for a class (see R0901). +max-parents=7 + +# Maximum number of attributes for a class (see R0902). +max-attributes=7 + +# Minimum number of public methods for a class (see R0903). +min-public-methods=2 + +# Maximum number of public methods for a class (see R0904). +max-public-methods=20 + +# Maximum number of boolean expressions in a if statement +max-bool-expr=5 + + +[CLASSES] + +# List of method names used to declare (i.e. assign) instance attributes. +defining-attr-methods=__init__,__new__,setUp + +# List of valid names for the first argument in a class method. +valid-classmethod-first-arg=cls + +# List of valid names for the first argument in a metaclass class method. +valid-metaclass-classmethod-first-arg=mcs + +# List of member names, which should be excluded from the protected access +# warning. +exclude-protected=_asdict,_fields,_replace,_source,_make + + +[EXCEPTIONS] + +# Exceptions that will emit a warning when being caught. Defaults to +# "Exception" +overgeneral-exceptions=Exception From 269628003006114a07f2e7f56b99329859e6fc33 Mon Sep 17 00:00:00 2001 From: Amale EL HAMRI <amale.elhamri@artefact.com> Date: Thu, 1 Oct 2020 11:17:54 +0200 Subject: [PATCH 296/496] linting social_preprocess.py --- .../preprocessing/social_preprocess.py | 25 +++++++++---------- 1 file changed, 12 insertions(+), 13 deletions(-) diff --git a/nautilus_nlp/preprocessing/social_preprocess.py b/nautilus_nlp/preprocessing/social_preprocess.py index cde003e..8bab161 100644 --- a/nautilus_nlp/preprocessing/social_preprocess.py +++ b/nautilus_nlp/preprocessing/social_preprocess.py @@ -19,14 +19,13 @@ from __future__ import absolute_import, division, print_function, unicode_literals -import re import emoji as _emoji from nautilus_nlp.utils import constants class SocialPreprocessor(): - def __init__(self,text): + def __init__(self, text): self.text = text def remove_mentions(self) -> str: @@ -36,7 +35,7 @@ def remove_mentions(self) -> str: Parameters ---------- text : str - + Returns ------- string @@ -52,7 +51,7 @@ def extract_mentions(self) -> list: Parameters ---------- text : str - + Returns ------- string @@ -66,7 +65,7 @@ def remove_html_tags(self) -> str: Parameters ---------- text : str - + Returns ------- string @@ -77,7 +76,7 @@ def remove_html_tags(self) -> str: def remove_emoji(self) -> str: """ Remove emoji from any str by stripping any unicode in the range of Emoji unicode - as defined in the unicode convention: + as defined in the unicode convention: http://www.unicode.org/emoji/charts/full-emoji-list.html Parameters @@ -100,18 +99,17 @@ def convert_emoji_to_text(self, code_delimiters=(':', ':'), input_str=None) -> s Parameters ---------- text : str - code_delimiters : tuple of symbols around the emoji code. + code_delimiters : tuple of symbols around the emoji code. eg: (':',':') --> :grinning_face: Returns ------- str - string + string """ - if input_str: + if input_str is not None: return _emoji.demojize(input_str, delimiters=code_delimiters) - else: - return _emoji.demojize(self.text, delimiters=code_delimiters) + return _emoji.demojize(self.text, delimiters=code_delimiters) def extract_emojis(self) -> list: """ @@ -164,7 +162,8 @@ def remove_hashtag(self) -> str: self.text = self.normalize_whitespace(constants.HASHTAG_PATTERN.sub('', self.text)) return self.text - def normalize_whitespace(self, text) -> str: + @staticmethod + def normalize_whitespace(text) -> str: """ Given ``text`` str, replace one or more spacings with a single space, and one or more linebreaks with a single newline. Also strip leading/trailing whitespace. @@ -176,7 +175,7 @@ def normalize_whitespace(self, text) -> str: Returns ------- - string + string """ return constants.NONBREAKING_SPACE_REGEX.sub( " ", constants.LINEBREAK_REGEX.sub(r"\n", text) From 9b147a86ae29d70e54ef5d2bdf34d6df6c8ff79c Mon Sep 17 00:00:00 2001 From: Amale EL HAMRI <amale.elhamri@artefact.com> Date: Thu, 1 Oct 2020 11:30:55 +0200 Subject: [PATCH 297/496] linting text_preprocess.py --- nautilus_nlp/preprocessing/text_preprocess.py | 80 ++++++++----------- nautilus_nlp/utils/phone_number.py | 2 +- tests/test_preprocessor.py | 4 +- 3 files changed, 38 insertions(+), 48 deletions(-) diff --git a/nautilus_nlp/preprocessing/text_preprocess.py b/nautilus_nlp/preprocessing/text_preprocess.py index 1b4353a..5c112cb 100644 --- a/nautilus_nlp/preprocessing/text_preprocess.py +++ b/nautilus_nlp/preprocessing/text_preprocess.py @@ -17,37 +17,39 @@ # Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. # -*- coding: utf-8 -*- -from __future__ import absolute_import, division, print_function, unicode_literals +from __future__ import (absolute_import, division, print_function, + unicode_literals) import re -import regex import unicodedata -from ftfy import fix_text as _fix_text -from nautilus_nlp.utils.stopwords import get_stopwords -from nautilus_nlp.utils.phone_number import extract_phone_numbers as _extract_phone_numbers +from ftfy import fix_text as _fix_text from nautilus_nlp.utils import constants +from nautilus_nlp.utils.phone_number import \ + extract_phone_numbers as _extract_phone_numbers +from nautilus_nlp.utils.stopwords import get_stopwords + class TextPreprocessor(): - def __init__(self,text): - if isinstance(text,str): + def __init__(self, text): + if isinstance(text, str): self.text = text else: raise ValueError("Input must be a string") - def clean_text(self,lang='en') -> str: + def clean_text(self, lang='en') -> str: #TODO : check how to pipe operations stopwords = get_stopwords(lang) self.text = self.fix_bad_unicode(normalization="NFC") - self.text = self.remove_EOL_characters() + self.text = self.remove_eol_characters() self.text = self.remove_accents(method="unicode") self.text = self.remove_punct() self.text = self.text.lower() self.text = self.remove_stopwords(stopwords=stopwords) return self.normalize_whitespace() - def remove_EOL_characters(self) -> str: + def remove_eol_characters(self) -> str: """ Remove end of line (\n) char. @@ -63,7 +65,7 @@ def remove_EOL_characters(self) -> str: return self.text def remove_stopwords(self, stopwords: list) -> str: - """ + """ Remove stopwords from a text. eg. 'I like when you move your body !' -> 'I move body !' @@ -81,8 +83,7 @@ def remove_stopwords(self, stopwords: list) -> str: ValueError When inputs is not a string """ - self.text = ' '.join([word.strip() for word in self.text.split() if word not in stopwords]) - + self.text = ' '.join([word.strip() for word in self.text.split() if word not in stopwords]) return self.text def fix_bad_unicode(self, normalization: str = "NFC") -> str: @@ -95,7 +96,7 @@ def fix_bad_unicode(self, normalization: str = "NFC") -> str: ---------- text : string - normalization ({'NFC', 'NFKC', 'NFD', 'NFKD'}): + normalization ({'NFC', 'NFKC', 'NFD', 'NFKD'}): if 'NFC', combines characters and diacritics written using separate code points, e.g. converting "e" plus an acute accent modifier into "é"; unicode can be converted to NFC form without any change in its meaning! @@ -121,7 +122,7 @@ def normalize_whitespace(self) -> str: Returns ------- - string + string """ self.text = constants.NONBREAKING_SPACE_REGEX.sub( " ", constants.LINEBREAK_REGEX.sub(r"\n", self.text) @@ -141,7 +142,7 @@ def unpack_english_contractions(self) -> str: Returns ------- - string + string """ # standard @@ -166,7 +167,7 @@ def unpack_english_contractions(self) -> str: self.text = constants.CONTRACTION_YALL_YOUALL.sub(r"\1\2ou all", self.text) return self.text - def replace_urls(self, replace_with:str="*URL*") -> str: + def replace_urls(self, replace_with: str = "*URL*") -> str: """ Replace all URLs in ``text`` str with ``replace_with`` str. @@ -179,7 +180,7 @@ def replace_urls(self, replace_with:str="*URL*") -> str: Returns ------- string - """ + """ self.text = constants.URL_REGEX.sub( replace_with, constants.SHORT_URL_REGEX.sub(replace_with, self.text) ) @@ -202,10 +203,9 @@ def replace_emails(self, replace_with="*EMAIL*") -> str: self.text = constants.EMAIL_REGEX.sub(replace_with, self.text) return self.text - def replace_phone_numbers(self, replace_with:str="*PHONE*", - method:str="regex", - country_format_to_detect:list=[None,'FR','US','GB'], - return_text: bool = False) -> str: + def replace_phone_numbers(self, country_format_to_detect: list, + replace_with: str = "*PHONE*", + method: str = "regex") -> str: """ Replace all phone numbers in ``text`` str with ``replace_with`` str @@ -215,9 +215,9 @@ def replace_phone_numbers(self, replace_with:str="*PHONE*", replace_with : string the string you want the phone number to be replaced with. method : ['regex','detection'] - regex is faster but will omit a lot of numbers, while detection will + regex is faster but will omit a lot of numbers, while detection will catch every numbers, but takes a while. - country_format_to_detect : list + country_format_to_detect : list If a list of country code is specified, will catch every number formatted. Only when method = 'detection'. Returns @@ -230,7 +230,7 @@ def replace_phone_numbers(self, replace_with:str="*PHONE*", found_nums = _extract_phone_numbers(self.text, countrylist=country_format_to_detect) # order by lenght to avoid truncated numbers to be removed first. - found_nums.sort(key=len,reverse=True) + found_nums.sort(key=len, reverse=True) for phone_number in found_nums: self.text = self.text.replace(phone_number, replace_with) else: @@ -250,7 +250,7 @@ def replace_numbers(self, replace_with="*NUMBER*") -> str: Returns ------- string - """ + """ self.text = constants.NUMBERS_REGEX.sub(replace_with, self.text) return self.text @@ -271,10 +271,10 @@ def replace_currency_symbols(self, replace_with=None) -> str: Returns ------- string - """ + """ if replace_with is None: for k, v in constants.CURRENCIES.items(): - self.text = self.text.replace(k, v) + self.text = self.text.replace(k, v) else: self.text = constants.CURRENCY_REGEX.sub(replace_with, self.text) return self.text @@ -288,7 +288,7 @@ def remove_punct(self, marks=None) -> str: ---------- text : str raw text - + marks : str or None If specified, remove only the characters in this string, e.g. ``marks=',;:'`` removes commas, semi-colons, and colons. @@ -302,15 +302,15 @@ def remove_punct(self, marks=None) -> str: ------- When ``marks=None``, Python's built-in :meth:`str.translate()` is used to remove punctuation; otherwise, a regular expression is used - instead. The former's performance is about 5-10x faster. - """ + instead. The former's performance is about 5-10x faster. + """ if marks: self.text = re.sub("[{}]+".format(re.escape(marks)), " ", self.text, flags=re.UNICODE) else: self.text = self.text.translate(constants.PUNCT_TRANSLATE_UNICODE) return self.text - def remove_accents(self, method:str="unicode") -> str: + def remove_accents(self, method: str = "unicode") -> str: """ Remove accents from any accented unicode characters in ``text`` str, either by transforming them into ascii equivalents or removing them entirely. @@ -319,7 +319,7 @@ def remove_accents(self, method:str="unicode") -> str: ---------- text : str raw text - + method : ({'unicode', 'ascii'}) if 'unicode', remove accented char for any unicode symbol with a direct ASCII equivalent; if 'ascii', @@ -334,7 +334,7 @@ def remove_accents(self, method:str="unicode") -> str: Raises ------- ValueError - if ``method`` is not in {'unicode', 'ascii'} + if ``method`` is not in {'unicode', 'ascii'} """ if method == "unicode": self.text = "".join( @@ -389,7 +389,7 @@ def filter_non_latin_characters(self) -> str: self.text = self.normalize_whitespace() return self.text - def remove_smallwords(self, smallwords_threshold:int) -> list: + def remove_smallwords(self, smallwords_threshold: int) -> list: """ Function that removes words which length is below a threshold 'Hello my name is John Doe' --> 'Hello name John Doe' @@ -406,13 +406,3 @@ def remove_smallwords(self, smallwords_threshold:int) -> list: """ self.text = ' '.join([word for word in self.text.split() if len(word) > smallwords_threshold]) return self.text - - - - - - - - - - diff --git a/nautilus_nlp/utils/phone_number.py b/nautilus_nlp/utils/phone_number.py index 8f76205..9819879 100644 --- a/nautilus_nlp/utils/phone_number.py +++ b/nautilus_nlp/utils/phone_number.py @@ -66,7 +66,7 @@ def find_phone_numbers(string, region_code=None): return [match.raw_string for match in _phonenumbers.PhoneNumberMatcher(string, region_code)] -def extract_phone_numbers(string:str, countrylist:list=[None,'FR','US','GB'])->list: +def extract_phone_numbers(string:str, countrylist: list)->list: ''' Find phone numbers in a string, returns a list of phone numbers. diff --git a/tests/test_preprocessor.py b/tests/test_preprocessor.py index d93635b..eaf8edb 100644 --- a/tests/test_preprocessor.py +++ b/tests/test_preprocessor.py @@ -150,9 +150,9 @@ def test_remove_multiple_spaces_and_strip_text(input_str, expected_str): ("hello world\n", "hello world ") ], ) -def test_remove_EOL_characters(input_str, expected_str): +def test_remove_eol_characters(input_str, expected_str): preprocessor = TextPreprocessor(input_str) - result = preprocessor.remove_EOL_characters() + result = preprocessor.remove_eol_characters() np.testing.assert_string_equal(result, expected_str) From 01d6cd9ef4eefab8dcd4ee4e91ba6d34320132eb Mon Sep 17 00:00:00 2001 From: Amale EL HAMRI <amale.elhamri@artefact.com> Date: Thu, 1 Oct 2020 11:32:20 +0200 Subject: [PATCH 298/496] linting stopwords.py --- nautilus_nlp/utils/stopwords.py | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/nautilus_nlp/utils/stopwords.py b/nautilus_nlp/utils/stopwords.py index 0ea81a2..c94e812 100644 --- a/nautilus_nlp/utils/stopwords.py +++ b/nautilus_nlp/utils/stopwords.py @@ -43,10 +43,10 @@ def get_stopwords(lang: str = "en") -> list: ---------- lang : str Supported languages: ['ar', 'bg', 'ca', 'cz', 'da', 'nl', 'en', - 'fi', 'fr', 'de', 'hi', 'hu', 'id', 'it', 'nb', 'pl', 'pt', 'ro', 'ru', - 'sk', 'es', 'sv', 'tr', 'uk', 'vi', 'af', 'ha', 'so', 'st', 'sw', 'yo', + 'fi', 'fr', 'de', 'hi', 'hu', 'id', 'it', 'nb', 'pl', 'pt', 'ro', 'ru', + 'sk', 'es', 'sv', 'tr', 'uk', 'vi', 'af', 'ha', 'so', 'st', 'sw', 'yo', 'zu', 'da', 'de', 'es', 'et', 'fi', 'fr', 'hr', 'hu', 'it', 'ko', 'nl', - 'no', 'pl', 'pt', 'ru', 'sv', 'tr', 'zh', 'eo', 'he', 'la', 'sk', 'sl', + 'no', 'pl', 'pt', 'ru', 'sv', 'tr', 'zh', 'eo', 'he', 'la', 'sk', 'sl', 'br', 'ca', 'cs', 'el', 'eu', 'ga', 'gl', 'hy', 'id', 'ja', 'lv', 'th', 'ar', 'bg', 'bn', 'fa', 'hi', 'mr', 'ro', 'en'] @@ -60,9 +60,8 @@ def get_stopwords(lang: str = "en") -> list: ValueError When language is not available yet or incorrect country code """ - if type(lang) == str and len(lang) == 2: + if isinstance(lang, str) and len(lang) == 2: lang = lang.lower() - custom_stopwords = _load_stopwords_from_json(STOPWORDS_JSON_FILEPATH) stopwords = [] @@ -84,4 +83,4 @@ def get_stopwords(lang: str = "en") -> list: raise ValueError( 'Please input a valid country code, in 2 letters. Eg. "us" for USA. ' ) - return list(set(stopwords)) \ No newline at end of file + return list(set(stopwords)) From f164f86571016961a10ca07f6f79af5195105a24 Mon Sep 17 00:00:00 2001 From: Amale EL HAMRI <amale.elhamri@artefact.com> Date: Thu, 1 Oct 2020 11:35:02 +0200 Subject: [PATCH 299/496] linting token_preprocess.py --- nautilus_nlp/preprocessing/token_preprocess.py | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/nautilus_nlp/preprocessing/token_preprocess.py b/nautilus_nlp/preprocessing/token_preprocess.py index 5e3f3b6..b753564 100644 --- a/nautilus_nlp/preprocessing/token_preprocess.py +++ b/nautilus_nlp/preprocessing/token_preprocess.py @@ -23,14 +23,14 @@ class TokenPreprocessor(): - def __init__(self,tokens): - if isinstance(tokens,list): + def __init__(self, tokens): + if isinstance(tokens, list): self.tokens = tokens else: - raise ValueError("Input must be a list") + raise TypeError("Input must be a list") def remove_stopwords(self, stopwords: list) -> str: - """ + """ Remove stopwords from a text. eg. 'I like when you move your body !' -> 'I move body !' @@ -71,8 +71,8 @@ def remove_tokens_with_nonletters(self) -> list: return self.tokens def remove_special_caracters_from_tokenslist(self) -> list: - """ - Remove tokens that doesn't contains any number or letter. + """ + Remove tokens that doesn't contains any number or letter. eg. ['foo','bar','---',"'s",'#'] -> ['foo','bar',"'s"] Parameters @@ -84,12 +84,12 @@ def remove_special_caracters_from_tokenslist(self) -> list: ------- list list of tokens without tokens that contains only special caracters - + """ self.tokens = [word for word in self.tokens if re.search("[a-zA-Z0-9]", word)] return self.tokens - def remove_smallwords(self, smallwords_threshold:int) -> list: + def remove_smallwords(self, smallwords_threshold: int) -> list: """ Function that removes words which length is below a threshold ["hello", "my", "name", "is", "John", "Doe"] --> ["hello","name","John","Doe"] @@ -106,4 +106,4 @@ def remove_smallwords(self, smallwords_threshold:int) -> list: list """ self.tokens = [word for word in self.tokens if len(word) > smallwords_threshold] - return self.tokens \ No newline at end of file + return self.tokens From c11ff9a8b5f4a6d924f5e8c6298f844297d79b6a Mon Sep 17 00:00:00 2001 From: Amale EL HAMRI <amale.elhamri@artefact.com> Date: Thu, 1 Oct 2020 11:48:41 +0200 Subject: [PATCH 300/496] fixing phone_number tests --- nautilus_nlp/utils/phone_number.py | 12 ++++++------ tests/test_phone_number.py | 6 +++--- 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/nautilus_nlp/utils/phone_number.py b/nautilus_nlp/utils/phone_number.py index 9819879..ac4ece8 100644 --- a/nautilus_nlp/utils/phone_number.py +++ b/nautilus_nlp/utils/phone_number.py @@ -66,9 +66,9 @@ def find_phone_numbers(string, region_code=None): return [match.raw_string for match in _phonenumbers.PhoneNumberMatcher(string, region_code)] -def extract_phone_numbers(string:str, countrylist: list)->list: +def extract_phone_numbers(text:str, countrylist: list)->list: ''' - Find phone numbers in a string, returns a list of phone numbers. + Find phone numbers in a text, returns a list of phone numbers. Parameters ---------- @@ -76,11 +76,11 @@ def extract_phone_numbers(string:str, countrylist: list)->list: Look for phone numbers formatted according to the specified countlist. supported value: look SUPPORTED_COUNTRY variable. ''' - res = [] + all_phone_numbers = [] for country in countrylist: - new_numbers_founds = find_phone_numbers(string, region_code=country) - res += new_numbers_founds - return list(set(res)) + new_numbers_founds = find_phone_numbers(text, region_code=country) + all_phone_numbers.extend(new_numbers_founds) + return list(set(all_phone_numbers)) class phoneParser(object): diff --git a/tests/test_phone_number.py b/tests/test_phone_number.py index 0043734..96d16f3 100644 --- a/tests/test_phone_number.py +++ b/tests/test_phone_number.py @@ -28,18 +28,18 @@ def test_extract_phone_number_us(): input_str = '(541) 754-3010 is a US. Phone' expected = ['(541) 754-3010'] res = phone.extract_phone_numbers(input_str, countrylist=['US']) - assert res == expected + assert res == expected def test_extract_phone_number_fr(): input_str = '06.25.09.32.56 is a FR Phone' expected = ['06.25.09.32.56'] - res = phone.extract_phone_numbers(input_str) + res = phone.extract_phone_numbers(input_str, countrylist=['FR']) assert res == expected def test_extract_phone_number_international(): input_str = '+33625093423 is an international Phone number' expected = ['+33625093423'] - res = phone.extract_phone_numbers(input_str) + res = phone.extract_phone_numbers(input_str, countrylist=['US', 'GB', 'FR', None]) assert res == expected def test_phoneParser_us(): From 1db6e33bce630ac291846938e021999c8a324ef9 Mon Sep 17 00:00:00 2001 From: Amale EL HAMRI <amale.elhamri@artefact.com> Date: Thu, 1 Oct 2020 11:55:07 +0200 Subject: [PATCH 301/496] fixing pylint phone_number --- nautilus_nlp/utils/phone_number.py | 77 +++++++++++++++--------------- tests/test_phone_number.py | 15 +++--- 2 files changed, 45 insertions(+), 47 deletions(-) diff --git a/nautilus_nlp/utils/phone_number.py b/nautilus_nlp/utils/phone_number.py index ac4ece8..a1583e9 100644 --- a/nautilus_nlp/utils/phone_number.py +++ b/nautilus_nlp/utils/phone_number.py @@ -15,30 +15,29 @@ # You should have received a copy of the GNU Lesser General Public License # along with this program; if not, write to the Free Software Foundation, # Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. -import re import phonenumbers as _phonenumbers SUPPORTED_COUNTRY = [None, 'US', 'AG', 'AI', 'AS', 'BB', 'BM', 'BS', 'CA', 'DM', - 'GD', 'GU', 'JM', 'KN', 'KY', 'LC', 'MP', 'MS', 'PR', 'SX', 'TC', 'TT', - 'VC', 'VG', 'VI', 'RU', 'KZ', 'EG', 'ZA', 'GR', 'NL', 'BE', 'FR', 'ES', - 'HU', 'IT', 'VA', 'RO', 'CH', 'AT', 'GB', 'GG', 'IM', 'JE', 'DK', 'SE', - 'NO', 'SJ', 'PL', 'DE', 'PE', 'MX', 'CU', 'AR', 'BR', 'CL', 'CO', 'VE', - 'MY', 'AU', 'CC', 'CX', 'ID', 'PH', 'NZ', 'SG', 'TH', 'JP', 'KR', 'VN', - 'CN', 'TR', 'IN', 'PK', 'AF', 'LK', 'MM', 'IR', 'SS', 'MA', 'EH', 'DZ', - 'TN', 'LY', 'GM', 'SN', 'MR', 'ML', 'GN', 'CI', 'BF', 'NE', 'TG', 'BJ', - 'MU', 'LR', 'SL', 'GH', 'NG', 'TD', 'CF', 'CM', 'CV', 'ST', 'GQ', 'GA', - 'CG', 'CD', 'AO', 'GW', 'IO', 'AC', 'SC', 'SD', 'RW', 'ET', 'SO', 'DJ', - 'KE', 'TZ', 'UG', 'BI', 'MZ', 'ZM', 'MG', 'RE', 'YT', 'ZW', 'NA', 'MW', - 'LS', 'BW', 'SZ', 'KM', 'SH', 'TA', 'ER', 'AW', 'FO', 'GL', 'GI', 'PT', - 'LU', 'IE', 'IS', 'AL', 'MT', 'CY', 'FI', 'AX', 'BG', 'LT', 'LV', 'EE', - 'MD', 'AM', 'BY', 'AD', 'MC', 'SM', 'UA', 'RS', 'ME', 'XK', 'HR', 'SI', - 'BA', 'MK', 'CZ', 'SK', 'LI', 'FK', 'BZ', 'GT', 'SV', 'HN', 'NI', 'CR', - 'PA', 'PM', 'HT', 'GP', 'BL', 'MF', 'BO', 'GY', 'EC', 'GF', 'PY', 'MQ', - 'SR', 'UY', 'CW', 'BQ', 'TL', 'NF', 'BN', 'NR', 'PG', 'TO', 'SB', 'VU', - 'FJ', 'PW', 'WF', 'CK', 'NU', 'WS', 'KI', 'NC', 'TV', 'PF', 'TK', 'FM', - 'MH', 'KP', 'HK', 'MO', 'KH', 'LA', 'BD', 'TW', 'MV', 'LB', 'JO', 'SY', - 'IQ', 'KW', 'SA', 'YE', 'OM', 'PS', 'AE', 'IL', 'BH', 'QA', 'BT', 'MN', - 'NP', 'TJ', 'TM', 'AZ', 'GE', 'KG', 'UZ','DO'] + 'GD', 'GU', 'JM', 'KN', 'KY', 'LC', 'MP', 'MS', 'PR', 'SX', 'TC', 'TT', + 'VC', 'VG', 'VI', 'RU', 'KZ', 'EG', 'ZA', 'GR', 'NL', 'BE', 'FR', 'ES', + 'HU', 'IT', 'VA', 'RO', 'CH', 'AT', 'GB', 'GG', 'IM', 'JE', 'DK', 'SE', + 'NO', 'SJ', 'PL', 'DE', 'PE', 'MX', 'CU', 'AR', 'BR', 'CL', 'CO', 'VE', + 'MY', 'AU', 'CC', 'CX', 'ID', 'PH', 'NZ', 'SG', 'TH', 'JP', 'KR', 'VN', + 'CN', 'TR', 'IN', 'PK', 'AF', 'LK', 'MM', 'IR', 'SS', 'MA', 'EH', 'DZ', + 'TN', 'LY', 'GM', 'SN', 'MR', 'ML', 'GN', 'CI', 'BF', 'NE', 'TG', 'BJ', + 'MU', 'LR', 'SL', 'GH', 'NG', 'TD', 'CF', 'CM', 'CV', 'ST', 'GQ', 'GA', + 'CG', 'CD', 'AO', 'GW', 'IO', 'AC', 'SC', 'SD', 'RW', 'ET', 'SO', 'DJ', + 'KE', 'TZ', 'UG', 'BI', 'MZ', 'ZM', 'MG', 'RE', 'YT', 'ZW', 'NA', 'MW', + 'LS', 'BW', 'SZ', 'KM', 'SH', 'TA', 'ER', 'AW', 'FO', 'GL', 'GI', 'PT', + 'LU', 'IE', 'IS', 'AL', 'MT', 'CY', 'FI', 'AX', 'BG', 'LT', 'LV', 'EE', + 'MD', 'AM', 'BY', 'AD', 'MC', 'SM', 'UA', 'RS', 'ME', 'XK', 'HR', 'SI', + 'BA', 'MK', 'CZ', 'SK', 'LI', 'FK', 'BZ', 'GT', 'SV', 'HN', 'NI', 'CR', + 'PA', 'PM', 'HT', 'GP', 'BL', 'MF', 'BO', 'GY', 'EC', 'GF', 'PY', 'MQ', + 'SR', 'UY', 'CW', 'BQ', 'TL', 'NF', 'BN', 'NR', 'PG', 'TO', 'SB', 'VU', + 'FJ', 'PW', 'WF', 'CK', 'NU', 'WS', 'KI', 'NC', 'TV', 'PF', 'TK', 'FM', + 'MH', 'KP', 'HK', 'MO', 'KH', 'LA', 'BD', 'TW', 'MV', 'LB', 'JO', 'SY', + 'IQ', 'KW', 'SA', 'YE', 'OM', 'PS', 'AE', 'IL', 'BH', 'QA', 'BT', 'MN', + 'NP', 'TJ', 'TM', 'AZ', 'GE', 'KG', 'UZ', 'DO'] def find_phone_numbers(string, region_code=None): @@ -49,12 +48,12 @@ def find_phone_numbers(string, region_code=None): Parameters ---------- region_code - If specified, will find the number of the specified country. + If specified, will find the number of the specified country. eg. 06.25.09.32.67 if "FR" is specified. If not specified, only works for international-formatted phone numbers. - - ie. phone number with +counttry code specified - eg. 06.25.09.32.67 will return an error but +33 6 25 09 32 67 will work. + - ie. phone number with +counttry code specified + eg. 06.25.09.32.67 will return an error but +33 6 25 09 32 67 will work. region_code supported value: look SUPPORTED_COUNTRY variable. @@ -66,14 +65,14 @@ def find_phone_numbers(string, region_code=None): return [match.raw_string for match in _phonenumbers.PhoneNumberMatcher(string, region_code)] -def extract_phone_numbers(text:str, countrylist: list)->list: +def extract_phone_numbers(text: str, countrylist: list)->list: ''' - Find phone numbers in a text, returns a list of phone numbers. + Find phone numbers in a text, returns a list of phone numbers. Parameters ---------- countrylist: list - Look for phone numbers formatted according to the specified countlist. + Look for phone numbers formatted according to the specified countlist. supported value: look SUPPORTED_COUNTRY variable. ''' all_phone_numbers = [] @@ -83,28 +82,28 @@ def extract_phone_numbers(text:str, countrylist: list)->list: return list(set(all_phone_numbers)) -class phoneParser(object): +class phone_parser(object): """ Python port of Google's libphonenumber. - https://github.com/daviddrysdale/python-phonenumbers + https://github.com/daviddrysdale/python-phonenumbers """ def __init__(self): self.region_code = None - self.string = None + self.text = None self.parsed_num = None - def parse_number(self, string:str, region_code=None): + def parse_number(self, text: str, region_code=None): ''' Parameters ---------- region_code - If specified, will find the number of the specified country. + If specified, will find the number of the specified country. eg. 06.25.09.32.67 if "FR" is specified. If not specified, only works for international-formatted phone numbers. - - ie. phone number with +counttry code specified - eg. 06.25.09.32.67 will return an error but +33 6 25 09 32 67 will work. + - ie. phone number with +counttry code specified + eg. 06.25.09.32.67 will return an error but +33 6 25 09 32 67 will work. region_code supported value: look SUPPORTED_COUNTRY variable. @@ -112,17 +111,17 @@ def parse_number(self, string:str, region_code=None): Raises ------ NumberParseException - If the string doesn't contains phone number of is the parser fails. + If the string doesn't contains phone number of is the parser fails. ''' self.region_code = region_code - self.string = string - self.parsed_num = _phonenumbers.parse(self.string, self.region_code) + self.text = text + self.parsed_num = _phonenumbers.parse(self.text, self.region_code) return self.parsed_num def format_number(self, num_format): ''' ['E164','INTERNATIONAL','NATIONAL','RFC3966'] ''' + # TODO: why exec ??? standard_format = exec('_phonenumbers.PhoneNumberFormat.'+num_format) - - return _phonenumbers.format_number(self.parsed_num, standard_format) \ No newline at end of file + return _phonenumbers.format_number(self.parsed_num, standard_format) diff --git a/tests/test_phone_number.py b/tests/test_phone_number.py index 96d16f3..724a4b9 100644 --- a/tests/test_phone_number.py +++ b/tests/test_phone_number.py @@ -15,7 +15,6 @@ # You should have received a copy of the GNU Lesser General Public License # along with this program; if not, write to the Free Software Foundation, # Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. -import pytest import nautilus_nlp.utils.phone_number as phone def test_extract_phone_number(): @@ -42,18 +41,18 @@ def test_extract_phone_number_international(): res = phone.extract_phone_numbers(input_str, countrylist=['US', 'GB', 'FR', None]) assert res == expected -def test_phoneParser_us(): +def test_phone_parser_us(): input_str = '(541) 754-3010' expected = '541-754-3010' - p = phone.phoneParser() - p.parse_number(input_str,region_code='US') + p = phone.phone_parser() + p.parse_number(input_str, region_code='US') res = p.format_number('INTERNATIONAL') assert res == expected -def test_phoneParser_fr(): +def test_phone_parser_fr(): input_str = '0625093267' expected = '6 25 09 32 67' - p = phone.phoneParser() - p.parse_number(input_str,region_code='FR') + p = phone.phone_parser() + p.parse_number(input_str, region_code='FR') res = p.format_number('E164') - assert res == expected \ No newline at end of file + assert res == expected From 6ce83b480f9126c6991de69aebda4f08ee98d3af Mon Sep 17 00:00:00 2001 From: Amale EL HAMRI <amale.elhamri@artefact.com> Date: Thu, 1 Oct 2020 12:12:08 +0200 Subject: [PATCH 302/496] linting tokenizer.py --- nautilus_nlp/utils/tokenizer.py | 111 +++++++++++++++++++------------- 1 file changed, 65 insertions(+), 46 deletions(-) diff --git a/nautilus_nlp/utils/tokenizer.py b/nautilus_nlp/utils/tokenizer.py index 5eae255..f06def1 100644 --- a/nautilus_nlp/utils/tokenizer.py +++ b/nautilus_nlp/utils/tokenizer.py @@ -18,34 +18,55 @@ import nltk from sacremoses import MosesTokenizer, MosesDetokenizer import spacy -from spacy.lang.fr import French -from spacy.lang.en import English -import spacy.lang as spacylang -#nltk.download('punkt') - -try: - french_spacy = spacylang.fr.French().tokenizer -except OSError: - raise OSError("""You must install French langage to use SpaCy. - python -m spacy download fr - See https://spacy.io/usage/ for details - """) -try: - english_spacy = spacylang.en.English().tokenizer -except OSError: - raise OSError("""You must install english langage to use SpaCy. - python -m spacy download en - See https://spacy.io/usage/ for details - """) + +class LanguageNotHandled(Exception): + pass + +class SpacyModel: + class SingletonSpacyModel: + def __init__(self, lang): + self.lang = lang + if lang == 'en': + self.model = spacy.load('en_core_web_sm') + elif lang == 'fr': + self.model = spacy.load('fr_core_news_sm') + elif lang == 'ko': + self.model = spacy.blank('ko') + elif lang == 'ja': + self.model = spacy.blank('ja') + else: + raise(LanguageNotHandled('This spacy model is not available')) + + model = None + + def __init__(self, lang): + if not SpacyModel.model: + SpacyModel.model = SpacyModel.SingletonSpacyModel(lang).model + + def get_lang_model(self): + return self.model.lang + + +def _get_spacy_tokenizer(lang): + """ + Function that gets the right tokenizer given the language + :param str lang: language in which text is written + Languages handled : ["en", "fr", "ko", "ja"] + + :return: spacy tokenizer + :rtype: spacy.tokenizer.Tokenizer + """ + model = SpacyModel(lang).model + return model.tokenizer def tokenize(text: str, lang_module: str = 'en_spacy'): """ - Convert text to a list of tokens. + Convert text to a list of tokens. Parameters - ---------- - lang_module : ({'en_spacy', 'en_nltk', 'fr_spacy', 'fr_moses'}) + ---------- + lang_module : ({'en_spacy', 'en_nltk', 'fr_spacy', 'fr_moses', 'ko_spacy', 'ja_spacy'}) choose the tokenization module according to the langage and the implementation. Recommanded: Spacy (faster, better results). To process other langages import models.Spacy_models @@ -54,18 +75,18 @@ def tokenize(text: str, lang_module: str = 'en_spacy'): ------- list list of string - """ - if lang_module is 'en_nltk': - return nltk.word_tokenize(text) - elif lang_module is 'en_spacy': - spacydoc = english_spacy(text) - return [spacy_token.text for spacy_token in spacydoc] - elif lang_module is 'fr_spacy': - spacydoc = french_spacy(text) + """ + if "spacy" in lang_module: + lang = lang_module.split()[0] + spacymodel = _get_spacy_tokenizer(lang) + spacydoc = spacymodel(text) return [spacy_token.text for spacy_token in spacydoc] - elif lang_module is 'fr_moses': - t = MosesTokenizer(lang='fr') - return t.tokenize(text, escape=False) + if lang_module == 'en_nltk': + return nltk.word_tokenize(text) + if lang_module == 'fr_moses': + return MosesTokenizer(lang='fr').tokenize(text, escape=False) + raise ValueError("Please pass a lang_module in list of values "\ + "{'en_spacy', 'en_nltk', 'fr_spacy', 'fr_moses', 'ko_spacy', 'ja_spacy'}") def untokenize(tokens, lang='fr'): @@ -74,32 +95,30 @@ def untokenize(tokens, lang='fr'): ["J'", 'ai'] >>> "J' ai" Parameters - ---------- + ---------- lang : string - language code + language code ''' d = MosesDetokenizer(lang=lang) text = d.detokenize(tokens, unescape=False) - return text + return text def _convert_tokens_to_string(tokens_or_str): - if type(tokens_or_str) is str: + if isinstance(tokens_or_str, str): return tokens_or_str - elif type(tokens_or_str) is list: + if isinstance(tokens_or_str, list): return untokenize(tokens_or_str) - elif type(tokens_or_str) is None: + if tokens_or_str is None: return '' - else: - raise ValueError('Please input string or tokens') + raise TypeError('Please input string or tokens') def _convert_string_to_tokens(tokens_or_str, lang_module='en_spacy'): - if type(tokens_or_str) is str: + if isinstance(tokens_or_str, str): return tokenize(tokens_or_str, lang_module=lang_module) - elif type(tokens_or_str) is list: + if isinstance(tokens_or_str, list): return tokens_or_str - elif type(tokens_or_str) is None: + if tokens_or_str is None: return [] - else: - raise ValueError('Please input string or tokens') \ No newline at end of file + raise TypeError('Please input string or tokens') From db3f176b9755607355aa18a72856f6aff1921e98 Mon Sep 17 00:00:00 2001 From: Amale EL HAMRI <amale.elhamri@artefact.com> Date: Thu, 1 Oct 2020 12:17:19 +0200 Subject: [PATCH 303/496] removing compat.py --- nautilus_nlp/utils/compat.py | 45 ------------------------------------ 1 file changed, 45 deletions(-) delete mode 100644 nautilus_nlp/utils/compat.py diff --git a/nautilus_nlp/utils/compat.py b/nautilus_nlp/utils/compat.py deleted file mode 100644 index 644ac2b..0000000 --- a/nautilus_nlp/utils/compat.py +++ /dev/null @@ -1,45 +0,0 @@ -# GNU Lesser General Public License v3.0 only -# Copyright (C) 2020 Artefact -# licence-information@artefact.com -# -# This program is free software; you can redistribute it and/or -# modify it under the terms of the GNU Lesser General Public -# License as published by the Free Software Foundation; either -# version 3 of the License, or (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public License -# along with this program; if not, write to the Free Software Foundation, -# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. -from __future__ import print_function - -import sys - -is_python2 = int(sys.version[0]) == 2 -is_windows = sys.platform.startswith("win") -is_linux = sys.platform.startswith("linux") -is_osx = sys.platform == "darwin" - - -import csv -import pickle -from builtins import zip as zip_ -from urllib.parse import urljoin - -range_ = range - -bytes_ = bytes -unicode_ = str -string_types = (bytes, str) -int_types = (int,) -chr_ = chr - -def unicode_to_bytes(s, encoding="utf8", errors="strict"): - return s.encode(encoding=encoding, errors=errors) - -def bytes_to_unicode(b, encoding="utf8", errors="strict"): - return b.decode(encoding=encoding, errors=errors) From 3abc58eba86287694c86054f74ce2da75cc325a8 Mon Sep 17 00:00:00 2001 From: Amale EL HAMRI <amale.elhamri@artefact.com> Date: Thu, 1 Oct 2020 12:20:26 +0200 Subject: [PATCH 304/496] linting constants.py --- nautilus_nlp/utils/constants.py | 36 ++++++++++++++------------------- 1 file changed, 15 insertions(+), 21 deletions(-) diff --git a/nautilus_nlp/utils/constants.py b/nautilus_nlp/utils/constants.py index 4595660..401811b 100644 --- a/nautilus_nlp/utils/constants.py +++ b/nautilus_nlp/utils/constants.py @@ -21,30 +21,23 @@ """ from __future__ import unicode_literals -import os import re -import regex import sys import unicodedata -import emoji as _emoji - - -from . import compat -from . import file_loader as util - - +import regex +import emoji as _emoji NUMERIC_NE_TYPES = { - "ORDINAL", - "CARDINAL", - "MONEY", - "QUANTITY", - "PERCENT", - "TIME", - "DATE", - } + "ORDINAL", + "CARDINAL", + "MONEY", + "QUANTITY", + "PERCENT", + "TIME", + "DATE", +} SUBJ_DEPS = {"agent", "csubj", "csubjpass", "expl", "nsubj", "nsubjpass"} OBJ_DEPS = {"attr", "dobj", "dative", "oprd"} AUX_DEPS = {"aux", "auxpass", "neg"} @@ -136,8 +129,8 @@ PUNCT_TRANSLATE_UNICODE = dict.fromkeys( ( i - for i in compat.range_(sys.maxunicode) - if unicodedata.category(compat.chr_(i)).startswith("P") + for i in range(sys.maxunicode) + if unicodedata.category(chr(i)).startswith("P") ), " ", ) @@ -155,10 +148,11 @@ r"(?:^|(?<=[^\w)]))(\+?1[ .-]?)?(\(?\d{3}\)?[ .-]?)?(\d{3}[ .-]?\d{4})(\s?(?:ext\.?|[#x-])\s?\d{2,6})?(?:$|(?=\W))" ) NUMBERS_REGEX = re.compile( - r"(?:^|(?<=[^\w,.]))[+–-]?(([1-9]\d{0,2}(,\d{3})+(\.\d*)?)|([1-9]\d{0,2}([ .]\d{3})+(,\d*)?)|(\d*?[.,]\d+)|\d+)(?:|(?=\b))" + r"(?:^|(?<=[^\w,.]))[+–-]?(([1-9]\d{0,2}(,\d{3})+(\.\d*)?)|([1-9]\d{0,2}([ .]\d{3})+(,\d*)?)|" + r"(\d*?[.,]\d+)|\d+)(?:|(?=\b))" ) CURRENCY_REGEX = re.compile( - "({})+".format("|".join(re.escape(c) for c in CURRENCIES.keys())) + "({})+".format("|".join(re.escape(c) for c in CURRENCIES)) ) LINEBREAK_REGEX = re.compile(r"((\r\n)|[\n\v])+") NONBREAKING_SPACE_REGEX = re.compile(r"(?!\n)\s+") From 3c139ed55929cfa1342360053f99be39daa361c6 Mon Sep 17 00:00:00 2001 From: Amale EL HAMRI <amale.elhamri@artefact.com> Date: Thu, 1 Oct 2020 17:05:34 +0200 Subject: [PATCH 305/496] removing unused utils emoji --- nautilus_nlp/utils/emoji.py | 1998 ----------------------------------- 1 file changed, 1998 deletions(-) delete mode 100644 nautilus_nlp/utils/emoji.py diff --git a/nautilus_nlp/utils/emoji.py b/nautilus_nlp/utils/emoji.py deleted file mode 100644 index 6ee23f1..0000000 --- a/nautilus_nlp/utils/emoji.py +++ /dev/null @@ -1,1998 +0,0 @@ -# GNU Lesser General Public License v3.0 only -# Copyright (C) 2020 Artefact -# licence-information@artefact.com -# -# This program is free software; you can redistribute it and/or -# modify it under the terms of the GNU Lesser General Public -# License as published by the Free Software Foundation; either -# version 3 of the License, or (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public License -# along with this program; if not, write to the Free Software Foundation, -# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. -import csv - -def rebuilt_emoji_dictionaries(filename): - """ - This function recreate the dictionnaries with emoji2unicode_name, emoji2sentiment that are hardcoded below. - - Parameters - ---------- - filename : string - csv filename - - Returns - ------- - dict - - This dataset is based on and can be found: - Kralj Novak, Petra; Smailović, Jasmina; Sluban, Borut and Mozetič, Igor, 2015, - Emoji Sentiment Ranking 1.0, Slovenian language resource repository CLARIN.SI, - http://hdl.handle.net/11356/1048. - - """ - - emoji2unicode_name, emoji2sentiment = dict(),dict() - with open(filename) as csvin: - for emoji in csv.DictReader(csvin): - for key, value in emoji.items(): - if key in ('Occurrences', 'Positive', 'Neutral', 'Negative'): - emoji[key] = int(value) - elif key in ('Position',): - emoji[key] = float(value) - - emoji['Sentiment'] = (emoji['Positive'] - emoji['Negative']) / \ - max(100, (emoji['Positive'] + emoji['Neutral'] + emoji['Negative'])) - emoji2unicode_name[emoji['Emoji']] = emoji['Unicode name'] - emoji2sentiment[emoji['Emoji']] = emoji['Sentiment'] - - return emoji2unicode_name, emoji2sentiment - -emoji2unicode_name = { - '😂': 'FACE WITH TEARS OF JOY', - '❤': 'HEAVY BLACK HEART', - '♥': 'BLACK HEART SUIT', - '😍': 'SMILING FACE WITH HEART-SHAPED EYES', - '😭': 'LOUDLY CRYING FACE', - '😘': 'FACE THROWING A KISS', - '😊': 'SMILING FACE WITH SMILING EYES', - '👌': 'OK HAND SIGN', - '💕': 'TWO HEARTS', - '👏': 'CLAPPING HANDS SIGN', - '😁': 'GRINNING FACE WITH SMILING EYES', - '☺': 'WHITE SMILING FACE', - '♡': 'WHITE HEART SUIT', - '👍': 'THUMBS UP SIGN', - '😩': 'WEARY FACE', - '🙏': 'PERSON WITH FOLDED HANDS', - '✌': 'VICTORY HAND', - '😏': 'SMIRKING FACE', - '😉': 'WINKING FACE', - '🙌': 'PERSON RAISING BOTH HANDS IN CELEBRATION', - '🙈': 'SEE-NO-EVIL MONKEY', - '💪': 'FLEXED BICEPS', - '😄': 'SMILING FACE WITH OPEN MOUTH AND SMILING EYES', - '😒': 'UNAMUSED FACE', - '💃': 'DANCER', - '💖': 'SPARKLING HEART', - '😃': 'SMILING FACE WITH OPEN MOUTH', - '😔': 'PENSIVE FACE', - '😱': 'FACE SCREAMING IN FEAR', - '🎉': 'PARTY POPPER', - '😜': 'FACE WITH STUCK-OUT TONGUE AND WINKING EYE', - '☯': 'YIN YANG', - '🌸': 'CHERRY BLOSSOM', - '💜': 'PURPLE HEART', - '💙': 'BLUE HEART', - '✨': 'SPARKLES', - '😳': 'FLUSHED FACE', - '💗': 'GROWING HEART', - '★': 'BLACK STAR', - '█': 'FULL BLOCK', - '☀': 'BLACK SUN WITH RAYS', - '😡': 'POUTING FACE', - '😎': 'SMILING FACE WITH SUNGLASSES', - '😢': 'CRYING FACE', - '💋': 'KISS MARK', - '😋': 'FACE SAVOURING DELICIOUS FOOD', - '🙊': 'SPEAK-NO-EVIL MONKEY', - '😴': 'SLEEPING FACE', - '🎶': 'MULTIPLE MUSICAL NOTES', - '💞': 'REVOLVING HEARTS', - '😌': 'RELIEVED FACE', - '🔥': 'FIRE', - '💯': 'HUNDRED POINTS SYMBOL', - '🔫': 'PISTOL', - '💛': 'YELLOW HEART', - '💁': 'INFORMATION DESK PERSON', - '💚': 'GREEN HEART', - '♫': 'BEAMED EIGHTH NOTES', - '😞': 'DISAPPOINTED FACE', - '😆': 'SMILING FACE WITH OPEN MOUTH AND TIGHTLY-CLOSED EYES', - '😝': 'FACE WITH STUCK-OUT TONGUE AND TIGHTLY-CLOSED EYES', - '😪': 'SLEEPY FACE', - '�': 'REPLACEMENT CHARACTER', - '😫': 'TIRED FACE', - '😅': 'SMILING FACE WITH OPEN MOUTH AND COLD SWEAT', - '👊': 'FISTED HAND SIGN', - '💀': 'SKULL', - '😀': 'GRINNING FACE', - '😚': 'KISSING FACE WITH CLOSED EYES', - '😻': 'SMILING CAT FACE WITH HEART-SHAPED EYES', - '©': 'COPYRIGHT SIGN', - '👀': 'EYES', - '💘': 'HEART WITH ARROW', - '🐓': 'ROOSTER', - '☕': 'HOT BEVERAGE', - '👋': 'WAVING HAND SIGN', - '✋': 'RAISED HAND', - '🎊': 'CONFETTI BALL', - '🍕': 'SLICE OF PIZZA', - '❄': 'SNOWFLAKE', - '😥': 'DISAPPOINTED BUT RELIEVED FACE', - '😕': 'CONFUSED FACE', - '💥': 'COLLISION SYMBOL', - '💔': 'BROKEN HEART', - '😤': 'FACE WITH LOOK OF TRIUMPH', - '😈': 'SMILING FACE WITH HORNS', - '►': 'BLACK RIGHT-POINTING POINTER', - '✈': 'AIRPLANE', - '🔝': 'TOP WITH UPWARDS ARROW ABOVE', - '😰': 'FACE WITH OPEN MOUTH AND COLD SWEAT', - '⚽': 'SOCCER BALL', - '😑': 'EXPRESSIONLESS FACE', - '👑': 'CROWN', - '😹': 'CAT FACE WITH TEARS OF JOY', - '👉': 'WHITE RIGHT POINTING BACKHAND INDEX', - '🍃': 'LEAF FLUTTERING IN WIND', - '🎁': 'WRAPPED PRESENT', - '😠': 'ANGRY FACE', - '🐧': 'PENGUIN', - '☆': 'WHITE STAR', - '🍀': 'FOUR LEAF CLOVER', - '🎈': 'BALLOON', - '🎅': 'FATHER CHRISTMAS', - '😓': 'FACE WITH COLD SWEAT', - '😣': 'PERSEVERING FACE', - '😐': 'NEUTRAL FACE', - '✊': 'RAISED FIST', - '😨': 'FEARFUL FACE', - '😖': 'CONFOUNDED FACE', - '💤': 'SLEEPING SYMBOL', - '💓': 'BEATING HEART', - '👎': 'THUMBS DOWN SIGN', - '💦': 'SPLASHING SWEAT SYMBOL', - '✔': 'HEAVY CHECK MARK', - '😷': 'FACE WITH MEDICAL MASK', - '⚡': 'HIGH VOLTAGE SIGN', - '🙋': 'HAPPY PERSON RAISING ONE HAND', - '🎄': 'CHRISTMAS TREE', - '💩': 'PILE OF POO', - '🎵': 'MUSICAL NOTE', - '➡': 'BLACK RIGHTWARDS ARROW', - '😛': 'FACE WITH STUCK-OUT TONGUE', - '😬': 'GRIMACING FACE', - '👯': 'WOMAN WITH BUNNY EARS', - '💎': 'GEM STONE', - '🌿': 'HERB', - '🎂': 'BIRTHDAY CAKE', - '🌟': 'GLOWING STAR', - '🔮': 'CRYSTAL BALL', - '❗': 'HEAVY EXCLAMATION MARK SYMBOL', - '👫': 'MAN AND WOMAN HOLDING HANDS', - '🏆': 'TROPHY', - '✖': 'HEAVY MULTIPLICATION X', - '☝': 'WHITE UP POINTING INDEX', - '😙': 'KISSING FACE WITH SMILING EYES', - '⛄': 'SNOWMAN WITHOUT SNOW', - '👅': 'TONGUE', - '♪': 'EIGHTH NOTE', - '🍂': 'FALLEN LEAF', - '💏': 'KISS', - '🔪': 'HOCHO', - '🌴': 'PALM TREE', - '👈': 'WHITE LEFT POINTING BACKHAND INDEX', - '🌹': 'ROSE', - '🙆': 'FACE WITH OK GESTURE', - '➜': 'HEAVY ROUND-TIPPED RIGHTWARDS ARROW', - '👻': 'GHOST', - '💰': 'MONEY BAG', - '🍻': 'CLINKING BEER MUGS', - '🙅': 'FACE WITH NO GOOD GESTURE', - '🌞': 'SUN WITH FACE', - '🍁': 'MAPLE LEAF', - '⭐': 'WHITE MEDIUM STAR', - '▪': 'BLACK SMALL SQUARE', - '🎀': 'RIBBON', - '━': 'BOX DRAWINGS HEAVY HORIZONTAL', - '☷': 'TRIGRAM FOR EARTH', - '🐷': 'PIG FACE', - '🙉': 'HEAR-NO-EVIL MONKEY', - '🌺': 'HIBISCUS', - '💅': 'NAIL POLISH', - '🐶': 'DOG FACE', - '🌚': 'NEW MOON WITH FACE', - '👽': 'EXTRATERRESTRIAL ALIEN', - '🎤': 'MICROPHONE', - '👭': 'TWO WOMEN HOLDING HANDS', - '🎧': 'HEADPHONE', - '👆': 'WHITE UP POINTING BACKHAND INDEX', - '🍸': 'COCKTAIL GLASS', - '🍷': 'WINE GLASS', - '®': 'REGISTERED SIGN', - '🍉': 'WATERMELON', - '😇': 'SMILING FACE WITH HALO', - '☑': 'BALLOT BOX WITH CHECK', - '🏃': 'RUNNER', - '😿': 'CRYING CAT FACE', - '│': 'BOX DRAWINGS LIGHT VERTICAL', - '💣': 'BOMB', - '🍺': 'BEER MUG', - '▶': 'BLACK RIGHT-POINTING TRIANGLE', - '😲': 'ASTONISHED FACE', - '🎸': 'GUITAR', - '🍹': 'TROPICAL DRINK', - '💫': 'DIZZY SYMBOL', - '📚': 'BOOKS', - '😶': 'FACE WITHOUT MOUTH', - '🌷': 'TULIP', - '💝': 'HEART WITH RIBBON', - '💨': 'DASH SYMBOL', - '🏈': 'AMERICAN FOOTBALL', - '💍': 'RING', - '☔': 'UMBRELLA WITH RAIN DROPS', - '👸': 'PRINCESS', - '🇪': 'REGIONAL INDICATOR SYMBOL LETTER E', - '░': 'LIGHT SHADE', - '🍩': 'DOUGHNUT', - '👾': 'ALIEN MONSTER', - '☁': 'CLOUD', - '🌻': 'SUNFLOWER', - '😵': 'DIZZY FACE', - '📒': 'LEDGER', - '↿': 'UPWARDS HARPOON WITH BARB LEFTWARDS', - '🐯': 'TIGER FACE', - '👼': 'BABY ANGEL', - '🍔': 'HAMBURGER', - '😸': 'GRINNING CAT FACE WITH SMILING EYES', - '👶': 'BABY', - '↾': 'UPWARDS HARPOON WITH BARB RIGHTWARDS', - '💐': 'BOUQUET', - '🌊': 'WATER WAVE', - '🍦': 'SOFT ICE CREAM', - '🍓': 'STRAWBERRY', - '👇': 'WHITE DOWN POINTING BACKHAND INDEX', - '💆': 'FACE MASSAGE', - '🍴': 'FORK AND KNIFE', - '😧': 'ANGUISHED FACE', - '🇸': 'REGIONAL INDICATOR SYMBOL LETTER S', - '😮': 'FACE WITH OPEN MOUTH', - '▓': 'DARK SHADE', - '🚫': 'NO ENTRY SIGN', - '😽': 'KISSING CAT FACE WITH CLOSED EYES', - '🌈': 'RAINBOW', - '🙀': 'WEARY CAT FACE', - '⚠': 'WARNING SIGN', - '🎮': 'VIDEO GAME', - '╯': 'BOX DRAWINGS LIGHT ARC UP AND LEFT', - '🍆': 'AUBERGINE', - '🍰': 'SHORTCAKE', - '✓': 'CHECK MARK', - '👐': 'OPEN HANDS SIGN', - '🙇': 'PERSON BOWING DEEPLY', - '🍟': 'FRENCH FRIES', - '🍌': 'BANANA', - '💑': 'COUPLE WITH HEART', - '👬': 'TWO MEN HOLDING HANDS', - '🐣': 'HATCHING CHICK', - '🎃': 'JACK-O-LANTERN', - '▬': 'BLACK RECTANGLE', - '': 'OBJECT REPLACEMENT CHARACTER', - '😟': 'WORRIED FACE', - '🐾': 'PAW PRINTS', - '🎓': 'GRADUATION CAP', - '🏊': 'SWIMMER', - '🍫': 'CHOCOLATE BAR', - '📷': 'CAMERA', - '👄': 'MOUTH', - '🌼': 'BLOSSOM', - '🚶': 'PEDESTRIAN', - '🐱': 'CAT FACE', - '║': 'BOX DRAWINGS DOUBLE VERTICAL', - '🐸': 'FROG FACE', - '🇺': 'REGIONAL INDICATOR SYMBOL LETTER U', - '👿': 'IMP', - '🚬': 'SMOKING SYMBOL', - '✿': 'BLACK FLORETTE', - '📖': 'OPEN BOOK', - '🐒': 'MONKEY', - '🌍': 'EARTH GLOBE EUROPE-AFRICA', - '┊': 'BOX DRAWINGS LIGHT QUADRUPLE DASH VERTICAL', - '🐥': 'FRONT-FACING BABY CHICK', - '🌀': 'CYCLONE', - '🐼': 'PANDA FACE', - '🎥': 'MOVIE CAMERA', - '💄': 'LIPSTICK', - '💸': 'MONEY WITH WINGS', - '⛔': 'NO ENTRY', - '●': 'BLACK CIRCLE', - '🏀': 'BASKETBALL AND HOOP', - '💉': 'SYRINGE', - '💟': 'HEART DECORATION', - '🚗': 'AUTOMOBILE', - '😯': 'HUSHED FACE', - '📝': 'MEMO', - '═': 'BOX DRAWINGS DOUBLE HORIZONTAL', - '♦': 'BLACK DIAMOND SUIT', - '💭': 'THOUGHT BALLOON', - '🌙': 'CRESCENT MOON', - '🐟': 'FISH', - '👣': 'FOOTPRINTS', - '☞': 'WHITE RIGHT POINTING INDEX', - '✂': 'BLACK SCISSORS', - '🗿': 'MOYAI', - '🍝': 'SPAGHETTI', - '👪': 'FAMILY', - '🍭': 'LOLLIPOP', - '🌃': 'NIGHT WITH STARS', - '❌': 'CROSS MARK', - '🐰': 'RABBIT FACE', - '💊': 'PILL', - '🚨': 'POLICE CARS REVOLVING LIGHT', - '😦': 'FROWNING FACE WITH OPEN MOUTH', - '🍪': 'COOKIE', - '🍣': 'SUSHI', - '╭': 'BOX DRAWINGS LIGHT ARC DOWN AND RIGHT', - '✧': 'WHITE FOUR POINTED STAR', - '🎆': 'FIREWORKS', - '╮': 'BOX DRAWINGS LIGHT ARC DOWN AND LEFT', - '🎎': 'JAPANESE DOLLS', - '🇩': 'REGIONAL INDICATOR SYMBOL LETTER D', - '✅': 'WHITE HEAVY CHECK MARK', - '👹': 'JAPANESE OGRE', - '📱': 'MOBILE PHONE', - '🙍': 'PERSON FROWNING', - '🍑': 'PEACH', - '🎼': 'MUSICAL SCORE', - '🔊': 'SPEAKER WITH THREE SOUND WAVES', - '🌌': 'MILKY WAY', - '🍎': 'RED APPLE', - '🐻': 'BEAR FACE', - '─': 'BOX DRAWINGS LIGHT HORIZONTAL', - '╰': 'BOX DRAWINGS LIGHT ARC UP AND RIGHT', - '💇': 'HAIRCUT', - '♬': 'BEAMED SIXTEENTH NOTES', - '♚': 'BLACK CHESS KING', - '🔴': 'LARGE RED CIRCLE', - '🍱': 'BENTO BOX', - '🍊': 'TANGERINE', - '🍒': 'CHERRIES', - '🐭': 'MOUSE FACE', - '👟': 'ATHLETIC SHOE', - '🌎': 'EARTH GLOBE AMERICAS', - '🍍': 'PINEAPPLE', - '🐮': 'COW FACE', - '📲': 'MOBILE PHONE WITH RIGHTWARDS ARROW AT LEFT', - '☼': 'WHITE SUN WITH RAYS', - '🌅': 'SUNRISE', - '🇷': 'REGIONAL INDICATOR SYMBOL LETTER R', - '👠': 'HIGH-HEELED SHOE', - '🌽': 'EAR OF MAIZE', - '💧': 'DROPLET', - '❓': 'BLACK QUESTION MARK ORNAMENT', - '🍬': 'CANDY', - '😺': 'SMILING CAT FACE WITH OPEN MOUTH', - '🐴': 'HORSE FACE', - '🚀': 'ROCKET', - '¦': 'BROKEN BAR', - '💢': 'ANGER SYMBOL', - '🎬': 'CLAPPER BOARD', - '🍧': 'SHAVED ICE', - '🍜': 'STEAMING BOWL', - '🐏': 'RAM', - '🐘': 'ELEPHANT', - '👧': 'GIRL', - '⠀': 'BRAILLE PATTERN BLANK', - '🏄': 'SURFER', - '➤': 'BLACK RIGHTWARDS ARROWHEAD', - '⬆': 'UPWARDS BLACK ARROW', - '🍋': 'LEMON', - '🆗': 'SQUARED OK', - '⚪': 'MEDIUM WHITE CIRCLE', - '📺': 'TELEVISION', - '🍅': 'TOMATO', - '⛅': 'SUN BEHIND CLOUD', - '🐢': 'TURTLE', - '👙': 'BIKINI', - '🏡': 'HOUSE WITH GARDEN', - '🌾': 'EAR OF RICE', - '◉': 'FISHEYE', - '✏': 'PENCIL', - '🐬': 'DOLPHIN', - '🍤': 'FRIED SHRIMP', - '🇹': 'REGIONAL INDICATOR SYMBOL LETTER T', - '♣': 'BLACK CLUB SUIT', - '🐝': 'HONEYBEE', - '🌝': 'FULL MOON WITH FACE', - '🇮': 'REGIONAL INDICATOR SYMBOL LETTER I', - '🔋': 'BATTERY', - '🐍': 'SNAKE', - '♔': 'WHITE CHESS KING', - '🍳': 'COOKING', - '🔵': 'LARGE BLUE CIRCLE', - '😾': 'POUTING CAT FACE', - '🌕': 'FULL MOON SYMBOL', - '🐨': 'KOALA', - '🔐': 'CLOSED LOCK WITH KEY', - '💿': 'OPTICAL DISC', - '❁': 'EIGHT PETALLED OUTLINED BLACK FLORETTE', - '🌳': 'DECIDUOUS TREE', - '👰': 'BRIDE WITH VEIL', - '❀': 'WHITE FLORETTE', - '⚓': 'ANCHOR', - '🚴': 'BICYCLIST', - '▀': 'UPPER HALF BLOCK', - '👗': 'DRESS', - '➕': 'HEAVY PLUS SIGN', - '💬': 'SPEECH BALLOON', - '▒': 'MEDIUM SHADE', - '🔜': 'SOON WITH RIGHTWARDS ARROW ABOVE', - '🍨': 'ICE CREAM', - '💲': 'HEAVY DOLLAR SIGN', - '⛽': 'FUEL PUMP', - '🍙': 'RICE BALL', - '🍗': 'POULTRY LEG', - '🍲': 'POT OF FOOD', - '🍥': 'FISH CAKE WITH SWIRL DESIGN', - '▸': 'BLACK RIGHT-POINTING SMALL TRIANGLE', - '♛': 'BLACK CHESS QUEEN', - '😼': 'CAT FACE WITH WRY SMILE', - '🐙': 'OCTOPUS', - '👨': 'MAN', - '🍚': 'COOKED RICE', - '🍖': 'MEAT ON BONE', - '♨': 'HOT SPRINGS', - '🎹': 'MUSICAL KEYBOARD', - '♕': 'WHITE CHESS QUEEN', - '▃': 'LOWER THREE EIGHTHS BLOCK', - '🚘': 'ONCOMING AUTOMOBILE', - '🍏': 'GREEN APPLE', - '👩': 'WOMAN', - '👦': 'BOY', - '🇬': 'REGIONAL INDICATOR SYMBOL LETTER G', - '🇧': 'REGIONAL INDICATOR SYMBOL LETTER B', - '☠': 'SKULL AND CROSSBONES', - '🐠': 'TROPICAL FISH', - '🚹': 'MENS SYMBOL', - '💵': 'BANKNOTE WITH DOLLAR SIGN', - '✰': 'SHADOWED WHITE STAR', - '╠': 'BOX DRAWINGS DOUBLE VERTICAL AND RIGHT', - '👛': 'PURSE', - '🚙': 'RECREATIONAL VEHICLE', - '🌱': 'SEEDLING', - '💻': 'PERSONAL COMPUTER', - '🌏': 'EARTH GLOBE ASIA-AUSTRALIA', - '▄': 'LOWER HALF BLOCK', - '👓': 'EYEGLASSES', - '◄': 'BLACK LEFT-POINTING POINTER', - '⚾': 'BASEBALL', - '🌲': 'EVERGREEN TREE', - '👴': 'OLDER MAN', - '🏠': 'HOUSE BUILDING', - '🍇': 'GRAPES', - '🍘': 'RICE CRACKER', - '🍛': 'CURRY AND RICE', - '🐇': 'RABBIT', - '🔞': 'NO ONE UNDER EIGHTEEN SYMBOL', - '👵': 'OLDER WOMAN', - '◀': 'BLACK LEFT-POINTING TRIANGLE', - '🔙': 'BACK WITH LEFTWARDS ARROW ABOVE', - '🌵': 'CACTUS', - '🐽': 'PIG NOSE', - '🍮': 'CUSTARD', - '🎇': 'FIREWORK SPARKLER', - '🐎': 'HORSE', - '➔': 'HEAVY WIDE-HEADED RIGHTWARDS ARROW', - '💶': 'BANKNOTE WITH EURO SIGN', - '🐤': 'BABY CHICK', - '╩': 'BOX DRAWINGS DOUBLE UP AND HORIZONTAL', - '🛀': 'BATH', - '🌑': 'NEW MOON SYMBOL', - '🚲': 'BICYCLE', - '🐑': 'SHEEP', - '🏁': 'CHEQUERED FLAG', - '🍞': 'BREAD', - '🎾': 'TENNIS RACQUET AND BALL', - '╚': 'BOX DRAWINGS DOUBLE UP AND RIGHT', - '🈹': 'SQUARED CJK UNIFIED IDEOGRAPH-5272', - '🐳': 'SPOUTING WHALE', - '👮': 'POLICE OFFICER', - '☹': 'WHITE FROWNING FACE', - '🐵': 'MONKEY FACE', - '✪': 'CIRCLED WHITE STAR', - '◕': 'CIRCLE WITH ALL BUT UPPER LEFT QUADRANT BLACK', - '🗼': 'TOKYO TOWER', - '▐': 'RIGHT HALF BLOCK', - '♠': 'BLACK SPADE SUIT', - '┳': 'BOX DRAWINGS HEAVY DOWN AND HORIZONTAL', - '👺': 'JAPANESE GOBLIN', - '🐚': 'SPIRAL SHELL', - '👂': 'EAR', - '🗽': 'STATUE OF LIBERTY', - '🍵': 'TEACUP WITHOUT HANDLE', - '🆒': 'SQUARED COOL', - '🍯': 'HONEY POT', - '🐺': 'WOLF FACE', - '⇨': 'RIGHTWARDS WHITE ARROW', - '➨': 'HEAVY CONCAVE-POINTED BLACK RIGHTWARDS ARROW', - '🌓': 'FIRST QUARTER MOON SYMBOL', - '🔒': 'LOCK', - '╬': 'BOX DRAWINGS DOUBLE VERTICAL AND HORIZONTAL', - '👳': 'MAN WITH TURBAN', - '🌂': 'CLOSED UMBRELLA', - '🚌': 'BUS', - '♩': 'QUARTER NOTE', - '🍡': 'DANGO', - '❥': 'ROTATED HEAVY BLACK HEART BULLET', - '🎡': 'FERRIS WHEEL', - '💌': 'LOVE LETTER', - '🐩': 'POODLE', - '🌜': 'LAST QUARTER MOON WITH FACE', - '⌚': 'WATCH', - '🚿': 'SHOWER', - '🐖': 'PIG', - '🔆': 'HIGH BRIGHTNESS SYMBOL', - '🌛': 'FIRST QUARTER MOON WITH FACE', - '💂': 'GUARDSMAN', - '🐔': 'CHICKEN', - '🙎': 'PERSON WITH POUTING FACE', - '🏩': 'LOVE HOTEL', - '🇫': 'REGIONAL INDICATOR SYMBOL LETTER F', - '🔨': 'HAMMER', - '📢': 'PUBLIC ADDRESS LOUDSPEAKER', - '🐦': 'BIRD', - '🐲': 'DRAGON FACE', - '♻': 'BLACK UNIVERSAL RECYCLING SYMBOL', - '🌘': 'WANING CRESCENT MOON SYMBOL', - '🍐': 'PEAR', - '🌔': 'WAXING GIBBOUS MOON SYMBOL', - '╥': 'BOX DRAWINGS DOWN DOUBLE AND HORIZONTAL SINGLE', - '❊': 'EIGHT TEARDROP-SPOKED PROPELLER ASTERISK', - '👖': 'JEANS', - '🚺': 'WOMENS SYMBOL', - '😗': 'KISSING FACE', - '🎭': 'PERFORMING ARTS', - '🐄': 'COW', - '◟': 'LOWER LEFT QUADRANT CIRCULAR ARC', - '🍢': 'ODEN', - '🎨': 'ARTIST PALETTE', - '⬇': 'DOWNWARDS BLACK ARROW', - '🚼': 'BABY SYMBOL', - '⛲': 'FOUNTAIN', - '▁': 'LOWER ONE EIGHTH BLOCK', - '🇴': 'REGIONAL INDICATOR SYMBOL LETTER O', - '🌗': 'LAST QUARTER MOON SYMBOL', - '🌖': 'WANING GIBBOUS MOON SYMBOL', - '🔅': 'LOW BRIGHTNESS SYMBOL', - '👜': 'HANDBAG', - '🐌': 'SNAIL', - '💼': 'BRIEFCASE', - '🚕': 'TAXI', - '🐹': 'HAMSTER FACE', - '🌠': 'SHOOTING STAR', - '🐈': 'CAT', - '⇧': 'UPWARDS WHITE ARROW', - '☎': 'BLACK TELEPHONE', - '🌁': 'FOGGY', - '⚫': 'MEDIUM BLACK CIRCLE', - '♧': 'WHITE CLUB SUIT', - '🏰': 'EUROPEAN CASTLE', - '🚵': 'MOUNTAIN BICYCLIST', - '🎢': 'ROLLER COASTER', - '🎷': 'SAXOPHONE', - '🎐': 'WIND CHIME', - '┈': 'BOX DRAWINGS LIGHT QUADRUPLE DASH HORIZONTAL', - '╗': 'BOX DRAWINGS DOUBLE DOWN AND LEFT', - '╱': 'BOX DRAWINGS LIGHT DIAGONAL UPPER RIGHT TO LOWER LEFT', - '🌇': 'SUNSET OVER BUILDINGS', - '⏰': 'ALARM CLOCK', - '⇩': 'DOWNWARDS WHITE ARROW', - '🚂': 'STEAM LOCOMOTIVE', - '◠': 'UPPER HALF CIRCLE', - '🎿': 'SKI AND SKI BOOT', - '✦': 'BLACK FOUR POINTED STAR', - '🆔': 'SQUARED ID', - '⛪': 'CHURCH', - '🌒': 'WAXING CRESCENT MOON SYMBOL', - '🐪': 'DROMEDARY CAMEL', - '╔': 'BOX DRAWINGS DOUBLE DOWN AND RIGHT', - '╝': 'BOX DRAWINGS DOUBLE UP AND LEFT', - '👔': 'NECKTIE', - '🔱': 'TRIDENT EMBLEM', - '🆓': 'SQUARED FREE', - '🐋': 'WHALE', - '▽': 'WHITE DOWN-POINTING TRIANGLE', - '▂': 'LOWER ONE QUARTER BLOCK', - '🐛': 'BUG', - '👕': 'T-SHIRT', - '🚋': 'TRAM CAR', - '💳': 'CREDIT CARD', - '🌆': 'CITYSCAPE AT DUSK', - '🏧': 'AUTOMATED TELLER MACHINE', - '💡': 'ELECTRIC LIGHT BULB', - '🔹': 'SMALL BLUE DIAMOND', - '⬅': 'LEFTWARDS BLACK ARROW', - '🍠': 'ROASTED SWEET POTATO', - '🐫': 'BACTRIAN CAMEL', - '🏪': 'CONVENIENCE STORE', - '۩': 'ARABIC PLACE OF SAJDAH', - '🇱': 'REGIONAL INDICATOR SYMBOL LETTER L', - '📹': 'VIDEO CAMERA', - '👞': 'MANS SHOE', - '🚑': 'AMBULANCE', - '🆘': 'SQUARED SOS', - '👚': 'WOMANS CLOTHES', - '🚍': 'ONCOMING BUS', - '□': 'WHITE SQUARE', - '🐂': 'OX', - '🚣': 'ROWBOAT', - '✳': 'EIGHT SPOKED ASTERISK', - '🏉': 'RUGBY FOOTBALL', - '🗻': 'MOUNT FUJI', - '🐀': 'RAT', - '╦': 'BOX DRAWINGS DOUBLE DOWN AND HORIZONTAL', - '⛺': 'TENT', - '🐕': 'DOG', - '🏂': 'SNOWBOARDER', - '👡': 'WOMANS SANDAL', - '📻': 'RADIO', - '✒': 'BLACK NIB', - '🌰': 'CHESTNUT', - '🏢': 'OFFICE BUILDING', - '🎒': 'SCHOOL SATCHEL', - '⌒': 'ARC', - '🏫': 'SCHOOL', - '📴': 'MOBILE PHONE OFF', - '🚢': 'SHIP', - '🚚': 'DELIVERY TRUCK', - '🐉': 'DRAGON', - '❒': 'UPPER RIGHT SHADOWED WHITE SQUARE', - '🐊': 'CROCODILE', - '🔔': 'BELL', - '◢': 'BLACK LOWER RIGHT TRIANGLE', - '🏥': 'HOSPITAL', - '❔': 'WHITE QUESTION MARK ORNAMENT', - '🚖': 'ONCOMING TAXI', - '🃏': 'PLAYING CARD BLACK JOKER', - '▼': 'BLACK DOWN-POINTING TRIANGLE', - '▌': 'LEFT HALF BLOCK', - '☛': 'BLACK RIGHT POINTING INDEX', - '✩': 'STRESS OUTLINED WHITE STAR', - '💒': 'WEDDING', - '🚤': 'SPEEDBOAT', - '🐐': 'GOAT', - '■': 'BLACK SQUARE', - '🔚': 'END WITH LEFTWARDS ARROW ABOVE', - '🎻': 'VIOLIN', - '🔷': 'LARGE BLUE DIAMOND', - '🚦': 'VERTICAL TRAFFIC LIGHT', - '🔓': 'OPEN LOCK', - '🎽': 'RUNNING SHIRT WITH SASH', - '📅': 'CALENDAR', - '🎺': 'TRUMPET', - '✯': 'PINWHEEL STAR', - '🍈': 'MELON', - '✉': 'ENVELOPE', - '╣': 'BOX DRAWINGS DOUBLE VERTICAL AND LEFT', - '◤': 'BLACK UPPER LEFT TRIANGLE', - '○': 'WHITE CIRCLE', - '🍼': 'BABY BOTTLE', - '📀': 'DVD', - '🚛': 'ARTICULATED LORRY', - '📓': 'NOTEBOOK', - '☉': 'SUN', - '💴': 'BANKNOTE WITH YEN SIGN', - '┼': 'BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL', - '🐃': 'WATER BUFFALO', - '➰': 'CURLY LOOP', - '🔌': 'ELECTRIC PLUG', - '🍄': 'MUSHROOM', - '📕': 'CLOSED BOOK', - '📣': 'CHEERING MEGAPHONE', - '🚓': 'POLICE CAR', - '🐗': 'BOAR', - '↪': 'RIGHTWARDS ARROW WITH HOOK', - '⛳': 'FLAG IN HOLE', - '┻': 'BOX DRAWINGS HEAVY UP AND HORIZONTAL', - '┛': 'BOX DRAWINGS HEAVY UP AND LEFT', - '┃': 'BOX DRAWINGS HEAVY VERTICAL', - '👱': 'PERSON WITH BLOND HAIR', - '⏳': 'HOURGLASS WITH FLOWING SAND', - '💺': 'SEAT', - '🏇': 'HORSE RACING', - '☻': 'BLACK SMILING FACE', - '📞': 'TELEPHONE RECEIVER', - 'Ⓐ': 'CIRCLED LATIN CAPITAL LETTER A', - '🌉': 'BRIDGE AT NIGHT', - '🚩': 'TRIANGULAR FLAG ON POST', - '✎': 'LOWER RIGHT PENCIL', - '📃': 'PAGE WITH CURL', - '🏨': 'HOTEL', - '📌': 'PUSHPIN', - '♎': 'LIBRA', - '💷': 'BANKNOTE WITH POUND SIGN', - '🚄': 'HIGH-SPEED TRAIN', - '▲': 'BLACK UP-POINTING TRIANGLE', - '⛵': 'SAILBOAT', - '🔸': 'SMALL ORANGE DIAMOND', - '⌛': 'HOURGLASS', - '🚜': 'TRACTOR', - '🐆': 'LEOPARD', - '👒': 'WOMANS HAT', - '❕': 'WHITE EXCLAMATION MARK ORNAMENT', - '🔛': 'ON WITH EXCLAMATION MARK WITH LEFT RIGHT ARROW ABOVE', - '♢': 'WHITE DIAMOND SUIT', - '🇲': 'REGIONAL INDICATOR SYMBOL LETTER M', - '❅': 'TIGHT TRIFOLIATE SNOWFLAKE', - '👝': 'POUCH', - '✞': 'SHADOWED WHITE LATIN CROSS', - '◡': 'LOWER HALF CIRCLE', - '🎋': 'TANABATA TREE', - '👥': 'BUSTS IN SILHOUETTE', - '📵': 'NO MOBILE PHONES', - '🐡': 'BLOWFISH', - '◆': 'BLACK DIAMOND', - '🏯': 'JAPANESE CASTLE', - '☂': 'UMBRELLA', - '🔭': 'TELESCOPE', - '🎪': 'CIRCUS TENT', - '🐜': 'ANT', - '♌': 'LEO', - '☐': 'BALLOT BOX', - '👷': 'CONSTRUCTION WORKER', - '↳': 'DOWNWARDS ARROW WITH TIP RIGHTWARDS', - '🔈': 'SPEAKER', - '📄': 'PAGE FACING UP', - '📍': 'ROUND PUSHPIN', - '🚐': 'MINIBUS', - '🚔': 'ONCOMING POLICE CAR', - '🌋': 'VOLCANO', - '📡': 'SATELLITE ANTENNA', - '⏩': 'BLACK RIGHT-POINTING DOUBLE TRIANGLE', - '🚳': 'NO BICYCLES', - '✘': 'HEAVY BALLOT X', - '۞': 'ARABIC START OF RUB EL HIZB', - '☾': 'LAST QUARTER MOON', - '🅰': 'NEGATIVE SQUARED LATIN CAPITAL LETTER A', - '📥': 'INBOX TRAY', - '🇼': 'REGIONAL INDICATOR SYMBOL LETTER W', - '┓': 'BOX DRAWINGS HEAVY DOWN AND LEFT', - '┣': 'BOX DRAWINGS HEAVY VERTICAL AND RIGHT', - 'Ⓛ': 'CIRCLED LATIN CAPITAL LETTER L', - 'Ⓔ': 'CIRCLED LATIN CAPITAL LETTER E', - '🔦': 'ELECTRIC TORCH', - '👤': 'BUST IN SILHOUETTE', - '🚁': 'HELICOPTER', - '🎠': 'CAROUSEL HORSE', - '🐁': 'MOUSE', - '📗': 'GREEN BOOK', - '┐': 'BOX DRAWINGS LIGHT DOWN AND LEFT', - '☮': 'PEACE SYMBOL', - '♂': 'MALE SIGN', - '◞': 'LOWER RIGHT QUADRANT CIRCULAR ARC', - '📯': 'POSTAL HORN', - '🔩': 'NUT AND BOLT', - '👢': 'WOMANS BOOTS', - '◂': 'BLACK LEFT-POINTING SMALL TRIANGLE', - '📰': 'NEWSPAPER', - '📶': 'ANTENNA WITH BARS', - '🚥': 'HORIZONTAL TRAFFIC LIGHT', - '🌄': 'SUNRISE OVER MOUNTAINS', - '🗾': 'SILHOUETTE OF JAPAN', - '🔶': 'LARGE ORANGE DIAMOND', - '🏤': 'EUROPEAN POST OFFICE', - '🎩': 'TOP HAT', - 'Ⓜ': 'CIRCLED LATIN CAPITAL LETTER M', - '🔧': 'WRENCH', - '🐅': 'TIGER', - '♮': 'MUSIC NATURAL SIGN', - '🅾': 'NEGATIVE SQUARED LATIN CAPITAL LETTER O', - '🔄': 'ANTICLOCKWISE DOWNWARDS AND UPWARDS OPEN CIRCLE ARROWS', - '☄': 'COMET', - '☨': 'CROSS OF LORRAINE', - '📦': 'PACKAGE', - '🚊': 'TRAM', - '🔲': 'BLACK SQUARE BUTTON', - '🔁': 'CLOCKWISE RIGHTWARDS AND LEFTWARDS OPEN CIRCLE ARROWS', - '△': 'WHITE UP-POINTING TRIANGLE', - '📆': 'TEAR-OFF CALENDAR', - '❛': 'HEAVY SINGLE TURNED COMMA QUOTATION MARK ORNAMENT', - '📉': 'CHART WITH DOWNWARDS TREND', - '▵': 'WHITE UP-POINTING SMALL TRIANGLE', - '🔎': 'RIGHT-POINTING MAGNIFYING GLASS', - '☜': 'WHITE LEFT POINTING INDEX', - '🇯': 'REGIONAL INDICATOR SYMBOL LETTER J', - '🇵': 'REGIONAL INDICATOR SYMBOL LETTER P', - '📘': 'BLUE BOOK', - '✡': 'STAR OF DAVID', - 'ⓔ': 'CIRCLED LATIN SMALL LETTER E', - '🔑': 'KEY', - '🔃': 'CLOCKWISE DOWNWARDS AND UPWARDS OPEN CIRCLE ARROWS', - '👃': 'NOSE', - '⭕': 'HEAVY LARGE CIRCLE', - '🔘': 'RADIO BUTTON', - 'ⓒ': 'CIRCLED LATIN SMALL LETTER C', - '🚭': 'NO SMOKING SYMBOL', - '🚉': 'STATION', - '🚪': 'DOOR', - '➳': 'WHITE-FEATHERED RIGHTWARDS ARROW', - '🚃': 'RAILWAY CAR', - '┯': 'BOX DRAWINGS DOWN LIGHT AND HORIZONTAL HEAVY', - '🏬': 'DEPARTMENT STORE', - '☽': 'FIRST QUARTER MOON', - '🆙': 'SQUARED UP WITH EXCLAMATION MARK', - '🆖': 'SQUARED NG', - '☪': 'STAR AND CRESCENT', - '┗': 'BOX DRAWINGS HEAVY UP AND RIGHT', - '🚮': 'PUT LITTER IN ITS PLACE SYMBOL', - '┫': 'BOX DRAWINGS HEAVY VERTICAL AND LEFT', - 'Ⓞ': 'CIRCLED LATIN CAPITAL LETTER O', - '❇': 'SPARKLE', - '✴': 'EIGHT POINTED BLACK STAR', - '┌': 'BOX DRAWINGS LIGHT DOWN AND RIGHT', - '☊': 'ASCENDING NODE', - '🔕': 'BELL WITH CANCELLATION STROKE', - '⬛': 'BLACK LARGE SQUARE', - '❝': 'HEAVY DOUBLE TURNED COMMA QUOTATION MARK ORNAMENT', - '❞': 'HEAVY DOUBLE COMMA QUOTATION MARK ORNAMENT', - '🚞': 'MOUNTAIN RAILWAY', - '🍶': 'SAKE BOTTLE AND CUP', - '🌐': 'GLOBE WITH MERIDIANS', - '♀': 'FEMALE SIGN', - '🚅': 'HIGH-SPEED TRAIN WITH BULLET NOSE', - '🚒': 'FIRE ENGINE', - '➣': 'THREE-D BOTTOM-LIGHTED RIGHTWARDS ARROWHEAD', - '♋': 'CANCER', - '♍': 'VIRGO', - '🕝': 'CLOCK FACE TWO-THIRTY', - 'ⓐ': 'CIRCLED LATIN SMALL LETTER A', - '✗': 'BALLOT X', - '📙': 'ORANGE BOOK', - 'Ⓢ': 'CIRCLED LATIN CAPITAL LETTER S', - '📋': 'CLIPBOARD', - '⇢': 'RIGHTWARDS DASHED ARROW', - '🎱': 'BILLIARDS', - '🐞': 'LADY BEETLE', - '🔺': 'UP-POINTING RED TRIANGLE', - 'ⓡ': 'CIRCLED LATIN SMALL LETTER R', - '🎍': 'PINE DECORATION', - '♤': 'WHITE SPADE SUIT', - '🎲': 'GAME DIE', - '🎯': 'DIRECT HIT', - '〠': 'POSTAL MARK FACE', - '🔉': 'SPEAKER WITH ONE SOUND WAVE', - '↩': 'LEFTWARDS ARROW WITH HOOK', - '🚾': 'WATER CLOSET', - '🎣': 'FISHING POLE AND FISH', - '🔣': 'INPUT SYMBOL FOR SYMBOLS', - '❎': 'NEGATIVE SQUARED CROSS MARK', - '➥': 'HEAVY BLACK CURVED DOWNWARDS AND RIGHTWARDS ARROW', - '🅱': 'NEGATIVE SQUARED LATIN CAPITAL LETTER B', - '🎌': 'CROSSED FLAGS', - '◣': 'BLACK LOWER LEFT TRIANGLE', - '⏬': 'BLACK DOWN-POINTING DOUBLE TRIANGLE', - '♭': 'MUSIC FLAT SIGN', - '💠': 'DIAMOND SHAPE WITH A DOT INSIDE', - 'ⓞ': 'CIRCLED LATIN SMALL LETTER O', - '🔳': 'WHITE SQUARE BUTTON', - '🏭': 'FACTORY', - '🔰': 'JAPANESE SYMBOL FOR BEGINNER', - '🎳': 'BOWLING', - '☚': 'BLACK LEFT POINTING INDEX', - '➽': 'HEAVY WEDGE-TAILED RIGHTWARDS ARROW', - '➫': 'BACK-TILTED SHADOWED WHITE RIGHTWARDS ARROW', - '➖': 'HEAVY MINUS SIGN', - '🏮': 'IZAKAYA LANTERN', - '📛': 'NAME BADGE', - '꒰': 'YI RADICAL SHY', - '꒱': 'YI RADICAL VEP', - '◝': 'UPPER RIGHT QUADRANT CIRCULAR ARC', - '📑': 'BOOKMARK TABS', - '🎦': 'CINEMA', - 'ⓧ': 'CIRCLED LATIN SMALL LETTER X', - '🇨': 'REGIONAL INDICATOR SYMBOL LETTER C', - '🇳': 'REGIONAL INDICATOR SYMBOL LETTER N', - '🔟': 'KEYCAP TEN', - '〓': 'GETA MARK', - 'ⓜ': 'CIRCLED LATIN SMALL LETTER M', - '➠': 'HEAVY DASHED TRIANGLE-HEADED RIGHTWARDS ARROW', - '🚆': 'TRAIN', - '🚠': 'MOUNTAIN CABLEWAY', - '℅': 'CARE OF', - '☃': 'SNOWMAN', - '🚽': 'TOILET', - '📐': 'TRIANGULAR RULER', - 'ⓝ': 'CIRCLED LATIN SMALL LETTER N', - '✮': 'HEAVY OUTLINED BLACK STAR', - '⇦': 'LEFTWARDS WHITE ARROW', - '👲': 'MAN WITH GUA PI MAO', - '🚡': 'AERIAL TRAMWAY', - '🎑': 'MOON VIEWING CEREMONY', - '🔬': 'MICROSCOPE', - '➗': 'HEAVY DIVISION SIGN', - '📈': 'CHART WITH UPWARDS TREND', - '⌘': 'PLACE OF INTEREST SIGN', - '⏪': 'BLACK LEFT-POINTING DOUBLE TRIANGLE', - '╹': 'BOX DRAWINGS HEAVY UP', - '◎': 'BULLSEYE', - '🔼': 'UP-POINTING SMALL RED TRIANGLE', - '꒦': 'YI RADICAL GGUO', - '📎': 'PAPERCLIP', - '⑅': 'OCR BOW TIE', - '⍝': 'APL FUNCTIONAL SYMBOL UP SHOE JOT', - '📁': 'FILE FOLDER', - '✭': 'OUTLINED BLACK STAR', - '➲': 'CIRCLED HEAVY WHITE RIGHTWARDS ARROW', - '♓': 'PISCES', - '┏': 'BOX DRAWINGS HEAVY DOWN AND RIGHT', - '☇': 'LIGHTNING', - '♺': 'RECYCLING SYMBOL FOR GENERIC MATERIALS', - '♞': 'BLACK CHESS KNIGHT', - '࿎': 'TIBETAN SIGN RDEL NAG RDEL DKAR', - '📠': 'FAX MACHINE', - '👘': 'KIMONO', - '↙': 'SOUTH WEST ARROW', - 'Ⓕ': 'CIRCLED LATIN CAPITAL LETTER F', - 'Ⓦ': 'CIRCLED LATIN CAPITAL LETTER W', - 'Ⓟ': 'CIRCLED LATIN CAPITAL LETTER P', - '🕑': 'CLOCK FACE TWO OCLOCK', - '💽': 'MINIDISC', - '🕛': 'CLOCK FACE TWELVE OCLOCK', - '🎫': 'TICKET', - '♈': 'ARIES', - '📟': 'PAGER', - '℃': 'DEGREE CELSIUS', - '↬': 'RIGHTWARDS ARROW WITH LOOP', - '🕒': 'CLOCK FACE THREE OCLOCK', - '🇰': 'REGIONAL INDICATOR SYMBOL LETTER K', - '↱': 'UPWARDS ARROW WITH TIP RIGHTWARDS', - '✍': 'WRITING HAND', - '⇐': 'LEFTWARDS DOUBLE ARROW', - '🏦': 'BANK', - '🔻': 'DOWN-POINTING RED TRIANGLE', - 'ⓟ': 'CIRCLED LATIN SMALL LETTER P', - 'ⓕ': 'CIRCLED LATIN SMALL LETTER F', - 'ⓘ': 'CIRCLED LATIN SMALL LETTER I', - '♿': 'WHEELCHAIR SYMBOL', - '⇗': 'NORTH EAST DOUBLE ARROW', - '⇘': 'SOUTH EAST DOUBLE ARROW', - 'ⓨ': 'CIRCLED LATIN SMALL LETTER Y', - 'ⓙ': 'CIRCLED LATIN SMALL LETTER J', - '▫': 'WHITE SMALL SQUARE', - '🔇': 'SPEAKER WITH CANCELLATION STROKE', - '⌃': 'UP ARROWHEAD', - '🔖': 'BOOKMARK', - '📜': 'SCROLL', - '♏': 'SCORPIUS', - '🚝': 'MONORAIL', - '☢': 'RADIOACTIVE SIGN', - '🎏': 'CARP STREAMER', - '┘': 'BOX DRAWINGS LIGHT UP AND LEFT', - '✝': 'LATIN CROSS', - '❖': 'BLACK DIAMOND MINUS WHITE X', - '⍣': 'APL FUNCTIONAL SYMBOL STAR DIAERESIS', - '📮': 'POSTBOX', - '🕕': 'CLOCK FACE SIX OCLOCK', - '🇭': 'REGIONAL INDICATOR SYMBOL LETTER H', - '◜': 'UPPER LEFT QUADRANT CIRCULAR ARC', - '🔯': 'SIX POINTED STAR WITH MIDDLE DOT', - '➸': 'HEAVY BLACK-FEATHERED RIGHTWARDS ARROW', - '꒵': 'YI RADICAL JJY', - '🕥': 'CLOCK FACE TEN-THIRTY', - '♙': 'WHITE CHESS PAWN', - '▿': 'WHITE DOWN-POINTING SMALL TRIANGLE', - '⚃': 'DIE FACE-4', - '✽': 'HEAVY TEARDROP-SPOKED ASTERISK', - '📼': 'VIDEOCASSETTE', - '🕐': 'CLOCK FACE ONE OCLOCK', - '🀄': 'MAHJONG TILE RED DRAGON', - '✾': 'SIX PETALLED BLACK AND WHITE FLORETTE', - '✬': 'BLACK CENTRE WHITE STAR', - '🆑': 'SQUARED CL', - '✫': 'OPEN CENTRE BLACK STAR', - '🕔': 'CLOCK FACE FIVE OCLOCK', - '❣': 'HEAVY HEART EXCLAMATION MARK ORNAMENT', - '➱': 'NOTCHED UPPER RIGHT-SHADOWED WHITE RIGHTWARDS ARROW', - '🆕': 'SQUARED NEW', - '➢': 'THREE-D TOP-LIGHTED RIGHTWARDS ARROWHEAD', - '↕': 'UP DOWN ARROW', - '📫': 'CLOSED MAILBOX WITH RAISED FLAG', - '🉐': 'CIRCLED IDEOGRAPH ADVANTAGE', - '♊': 'GEMINI', - '🈂': 'SQUARED KATAKANA SA', - '🎰': 'SLOT MACHINE', - '҂': 'CYRILLIC THOUSANDS SIGN', - '╤': 'BOX DRAWINGS DOWN SINGLE AND HORIZONTAL DOUBLE', - '➛': 'DRAFTING POINT RIGHTWARDS ARROW', - '♝': 'BLACK CHESS BISHOP', - '❋': 'HEAVY EIGHT TEARDROP-SPOKED PROPELLER ASTERISK', - '✆': 'TELEPHONE LOCATION SIGN', - '📔': 'NOTEBOOK WITH DECORATIVE COVER' -} - -emoji2sentiment = { - '😂': 0.22096840377513335, - '❤': 0.7460869565217392, - '♥': 0.6576147816349384, - '😍': 0.6779367825129737, - '😭': -0.09337676438653637, - '😘': 0.7017543859649122, - '😊': 0.6446955430006277, - '👌': 0.5637606837606838, - '💕': 0.6329166666666667, - '👏': 0.5205479452054794, - '😁': 0.4499771585198721, - '☺': 0.6580989330746848, - '♡': 0.669873417721519, - '👍': 0.5221143473570659, - '😩': -0.36836283185840707, - '🙏': 0.41780376868096164, - '✌': 0.4641460234680574, - '😏': 0.3324572930354796, - '😉': 0.4641683103221565, - '🙌': 0.5604249667994687, - '🙈': 0.4326923076923077, - '💪': 0.5557132718239887, - '😄': 0.4220314735336195, - '😒': -0.3747292418772563, - '💃': 0.7358630952380952, - '💖': 0.7133808392715756, - '😃': 0.5580431177446102, - '😔': -0.14605809128630706, - '😱': 0.1902654867256637, - '🎉': 0.7395555555555555, - '😜': 0.45603864734299515, - '☯': 0.0010080645161290322, - '🌸': 0.6522198731501057, - '💜': 0.6560170394036209, - '💙': 0.7324561403508771, - '✨': 0.35259433962264153, - '😳': 0.01773049645390071, - '💗': 0.6590909090909091, - '★': 0.28381642512077293, - '█': -0.03258145363408521, - '☀': 0.4669211195928753, - '😡': -0.17328042328042328, - '😎': 0.493368700265252, - '😢': 0.006675567423230975, - '💋': 0.6934604904632152, - '😋': 0.6335149863760218, - '🙊': 0.4606896551724138, - '😴': -0.0807799442896936, - '🎶': 0.5392296718972895, - '💞': 0.74235807860262, - '😌': 0.4842105263157895, - '🔥': 0.13978494623655913, - '💯': 0.12087912087912088, - '🔫': -0.19536423841059603, - '💛': 0.7126245847176079, - '💁': 0.32786885245901637, - '💚': 0.659217877094972, - '♫': 0.28893058161350843, - '😞': -0.11842105263157894, - '😆': 0.4117647058823529, - '😝': 0.4254032258064516, - '😪': -0.08091286307053942, - '�': 0.08686440677966102, - '😫': -0.145610278372591, - '😅': 0.17965367965367965, - '👊': 0.2292576419213974, - '💀': -0.20833333333333334, - '😀': 0.571753986332574, - '😚': 0.714622641509434, - '😻': 0.6235011990407674, - '©': 0.11778846153846154, - '👀': 0.06341463414634146, - '💘': 0.6886075949367089, - '🐓': 0.028645833333333332, - '☕': 0.24607329842931938, - '👋': 0.4162303664921466, - '✋': 0.12698412698412698, - '🎊': 0.7272727272727273, - '🍕': 0.42045454545454547, - '❄': 0.5100286532951289, - '😥': 0.12316715542521994, - '😕': -0.4, - '💥': 0.14893617021276595, - '💔': -0.12195121951219512, - '😤': -0.21100917431192662, - '😈': 0.2676923076923077, - '►': 0.16307692307692306, - '✈': 0.4192546583850932, - '🔝': 0.47854785478547857, - '😰': -0.019867549668874173, - '⚽': 0.6220735785953178, - '😑': -0.31438127090301005, - '👑': 0.7013422818791947, - '😹': 0.1423728813559322, - '👉': 0.3938356164383562, - '🍃': 0.38144329896907214, - '🎁': 0.7673611111111112, - '😠': -0.3020833333333333, - '🐧': 0.4612676056338028, - '☆': 0.4326241134751773, - '🍀': 0.28776978417266186, - '🎈': 0.7256317689530686, - '🎅': 0.32116788321167883, - '😓': -0.08058608058608059, - '😣': -0.2140221402214022, - '😐': -0.3925925925925926, - '✊': 0.43333333333333335, - '😨': -0.1412639405204461, - '😖': -0.15671641791044777, - '💤': 0.37453183520599254, - '💓': 0.6718146718146718, - '👎': -0.18992248062015504, - '💦': 0.47619047619047616, - '✔': 0.27309236947791166, - '😷': -0.17073170731707318, - '⚡': 0.17886178861788618, - '🙋': 0.4915254237288136, - '🎄': 0.538135593220339, - '💩': -0.11790393013100436, - '🎵': 0.5067264573991032, - '➡': 0.14864864864864866, - '😛': 0.6090909090909091, - '😬': 0.19626168224299065, - '👯': 0.44549763033175355, - '💎': 0.569377990430622, - '🌿': 0.3894230769230769, - '🎂': 0.6218905472636815, - '🌟': 0.3316582914572864, - '🔮': 0.271356783919598, - '❗': 0.10101010101010101, - '👫': 0.25888324873096447, - '🏆': 0.7371134020618557, - '✖': 0.3160621761658031, - '☝': 0.31413612565445026, - '😙': 0.7905759162303665, - '⛄': 0.5287958115183246, - '👅': 0.46842105263157896, - '♪': 0.5421052631578948, - '🍂': 0.5555555555555556, - '💏': 0.3945945945945946, - '🔪': 0.07103825136612021, - '🌴': 0.5337078651685393, - '👈': 0.43103448275862066, - '🌹': 0.6104651162790697, - '🙆': 0.5087719298245614, - '➜': 0.16470588235294117, - '👻': 0.23214285714285715, - '💰': 0.25595238095238093, - '🍻': 0.5212121212121212, - '🙅': -0.20606060606060606, - '🌞': 0.5679012345679012, - '🍁': 0.4906832298136646, - '⭐': 0.5911949685534591, - '▪': 0.20125786163522014, - '🎀': 0.6410256410256411, - '━': 0.1794871794871795, - '☷': 0.06493506493506493, - '🐷': 0.375, - '🙉': 0.34, - '🌺': 0.56, - '💅': 0.3959731543624161, - '🐶': 0.5878378378378378, - '🌚': 0.47297297297297297, - '👽': 0.3219178082191781, - '🎤': 0.4861111111111111, - '👭': 0.4722222222222222, - '🎧': 0.4225352112676056, - '👆': 0.3333333333333333, - '🍸': 0.5507246376811594, - '🍷': 0.40145985401459855, - '®': 0.2846715328467153, - '🍉': 0.6102941176470589, - '😇': 0.6, - '☑': 0.1037037037037037, - '🏃': 0.4148148148148148, - '😿': -0.3805970149253731, - '│': 0.35074626865671643, - '💣': 0.007633587786259542, - '🍺': 0.5038167938931297, - '▶': 0.21374045801526717, - '😲': -0.06976744186046512, - '🎸': 0.528, - '🍹': 0.6747967479674797, - '💫': 0.512396694214876, - '📚': 0.3445378151260504, - '😶': -0.1452991452991453, - '🌷': 0.5517241379310345, - '💝': 0.6608695652173913, - '💨': 0.391304347826087, - '🏈': 0.543859649122807, - '💍': 0.49107142857142855, - '☔': 0.2972972972972973, - '👸': 0.6216216216216216, - '🇪': 0.6330275229357798, - '░': -0.046296296296296294, - '🍩': 0.3925233644859813, - '👾': 0.37142857142857144, - '☁': 0.3173076923076923, - '🌻': 0.5865384615384616, - '😵': 0.08737864077669903, - '📒': 0.0392156862745098, - '↿': 0.6666666666666666, - '🐯': 0.49, - '👼': 0.34, - '🍔': 0.28, - '😸': 0.41, - '👶': 0.43, - '↾': 0.64, - '💐': 0.72, - '🌊': 0.49, - '🍦': 0.45, - '🍓': 0.65, - '👇': 0.24, - '💆': 0.21, - '🍴': 0.51, - '😧': -0.06, - '🇸': 0.48, - '😮': 0.25, - '▓': 0.01, - '🚫': -0.4, - '😽': 0.52, - '🌈': 0.47, - '🙀': 0.3, - '⚠': -0.06, - '🎮': 0.38, - '╯': -0.01, - '🍆': 0.35, - '🍰': 0.39, - '✓': 0.25, - '👐': -0.02, - '🙇': 0.12, - '🍟': 0.26, - '🍌': 0.37, - '💑': 0.56, - '👬': -0.05, - '🐣': 0.4, - '🎃': 0.5, - '▬': 0.39, - '': -0.4, - '😟': 0.06, - '🐾': 0.49, - '🎓': 0.45, - '🏊': 0.46, - '🍫': 0.12, - '📷': 0.34, - '👄': 0.37, - '🌼': 0.6, - '🚶': -0.11, - '🐱': 0.39, - '║': 0.11, - '🐸': -0.06, - '🇺': 0.4, - '👿': -0.39, - '🚬': 0.38, - '✿': 0.28, - '📖': 0.12, - '🐒': 0.37, - '🌍': 0.42, - '┊': 0.68, - '🐥': 0.41, - '🌀': 0.07, - '🐼': 0.18, - '🎥': 0.2, - '💄': 0.3, - '💸': 0.11, - '⛔': 0.33, - '●': 0.12, - '🏀': 0.17, - '💉': 0.24, - '💟': 0.45, - '🚗': 0.15, - '😯': 0.08, - '📝': 0.15, - '═': 0.01, - '♦': 0.29, - '💭': 0.13, - '🌙': 0.36, - '🐟': 0.42, - '👣': 0.21, - '☞': 0.07, - '✂': -0.28, - '🗿': 0.27, - '🍝': 0.07, - '👪': -0.01, - '🍭': 0.18, - '🌃': 0.23, - '❌': 0.16, - '🐰': 0.34, - '💊': 0.25, - '🚨': 0.37, - '😦': -0.21, - '🍪': 0.18, - '🍣': -0.13, - '╭': 0.09, - '✧': 0.18, - '🎆': 0.39, - '╮': 0.07, - '🎎': 0.49, - '🇩': 0.33, - '✅': 0.22, - '👹': 0.03, - '📱': 0.16, - '🙍': -0.17, - '🍑': 0.13, - '🎼': 0.17, - '🔊': 0.21, - '🌌': 0.26, - '🍎': 0.16, - '🐻': 0.22, - '─': 0.07, - '╰': -0.03, - '💇': 0.16, - '♬': 0.12, - '♚': 0.02, - '🔴': 0.19, - '🍱': -0.15, - '🍊': 0.2, - '🍒': 0.15, - '🐭': 0.33, - '👟': 0.2, - '🌎': 0.15, - '🍍': 0.22, - '🐮': 0.27, - '📲': 0.11, - '☼': 0.09, - '🌅': 0.16, - '🇷': 0.3, - '👠': 0.16, - '🌽': 0.2, - '💧': -0.07, - '❓': 0.03, - '🍬': 0.16, - '😺': 0.17, - '🐴': 0.03, - '🚀': 0.21, - '¦': 0.25, - '💢': 0.1, - '🎬': 0.12, - '🍧': 0.13, - '🍜': 0.17, - '🐏': 0.24, - '🐘': 0.01, - '👧': 0.06, - '⠀': 0.02, - '🏄': 0.22, - '➤': 0.13, - '⬆': 0.12, - '🍋': 0.1, - '🆗': 0.22, - '⚪': 0.18, - '📺': 0.15, - '🍅': 0.14, - '⛅': 0.18, - '🐢': 0.08, - '👙': 0.2, - '🏡': 0.17, - '🌾': 0.21, - '◉': 0.1, - '✏': 0.13, - '🐬': 0.16, - '🍤': 0.02, - '🇹': 0.22, - '♣': 0.13, - '🐝': 0.08, - '🌝': 0.07, - '🇮': 0.22, - '🔋': -0.18, - '🐍': 0.13, - '♔': 0.2, - '🍳': 0.01, - '🔵': 0.11, - '😾': -0.12, - '🌕': 0.2, - '🐨': 0.16, - '🔐': 0.12, - '💿': 0.22, - '❁': 0.02, - '🌳': 0.17, - '👰': 0.17, - '❀': 0.14, - '⚓': 0.2, - '🚴': 0.23, - '▀': -0.05, - '👗': 0.08, - '➕': 0.18, - '💬': 0.12, - '▒': -0.01, - '🔜': 0.09, - '🍨': 0.07, - '💲': 0.08, - '⛽': 0.05, - '🍙': 0.09, - '🍗': 0.02, - '🍲': 0.04, - '🍥': -0.19, - '▸': 0.07, - '♛': 0.06, - '😼': 0.11, - '🐙': 0.12, - '👨': 0.16, - '🍚': 0.14, - '🍖': 0.04, - '♨': 0.27, - '🎹': 0.11, - '♕': 0.12, - '▃': 0.28, - '🚘': 0.02, - '🍏': 0.02, - '👩': 0.02, - '👦': 0.04, - '🇬': 0.08, - '🇧': 0.08, - '☠': -0.01, - '🐠': 0.12, - '🚹': 0.2, - '💵': 0.11, - '✰': 0.23, - '╠': 0.06, - '👛': 0.1, - '🚙': 0.01, - '🌱': 0.16, - '💻': 0.07, - '🌏': 0.09, - '▄': -0.02, - '👓': 0.08, - '◄': 0.06, - '⚾': -0.01, - '🌲': 0.1, - '👴': 0.06, - '🏠': 0.13, - '🍇': 0.07, - '🍘': 0.1, - '🍛': 0.01, - '🐇': 0.06, - '🔞': -0.01, - '👵': 0.11, - '◀': 0.07, - '🔙': 0.05, - '🌵': 0.05, - '🐽': 0.03, - '🍮': -0.03, - '🎇': 0.17, - '🐎': 0.1, - '➔': -0.03, - '💶': 0.0, - '🐤': 0.13, - '╩': 0.05, - '🛀': 0.03, - '🌑': 0.11, - '🚲': 0.09, - '🐑': -0.04, - '🏁': 0.12, - '🍞': 0.01, - '🎾': 0.13, - '╚': 0.07, - '🈹': 0.07, - '🐳': 0.03, - '👮': -0.08, - '☹': -0.12, - '🐵': 0.11, - '✪': 0.07, - '◕': 0.1, - '🗼': 0.12, - '▐': -0.03, - '♠': 0.07, - '┳': -0.08, - '👺': -0.04, - '🐚': 0.05, - '👂': -0.03, - '🗽': 0.07, - '🍵': 0.08, - '🆒': 0.08, - '🍯': 0.01, - '🐺': 0.05, - '⇨': 0.1, - '➨': 0.03, - '🌓': 0.13, - '🔒': 0.04, - '╬': -0.03, - '👳': 0.13, - '🌂': 0.05, - '🚌': 0.04, - '♩': 0.11, - '🍡': -0.01, - '❥': 0.05, - '🎡': 0.06, - '💌': 0.1, - '🐩': 0.07, - '🌜': 0.1, - '⌚': 0.04, - '🚿': 0.12, - '🐖': 0.03, - '🔆': 0.11, - '🌛': 0.11, - '💂': -0.03, - '🐔': 0.06, - '🙎': -0.01, - '🏩': 0.08, - '🇫': 0.09, - '🔨': -0.02, - '📢': 0.08, - '🐦': 0.08, - '🐲': -0.01, - '♻': 0.09, - '🌘': 0.11, - '🍐': 0.03, - '🌔': 0.11, - '╥': 0.02, - '❊': 0.0, - '👖': 0.06, - '🚺': 0.03, - '😗': 0.11, - '🎭': 0.0, - '🐄': 0.05, - '◟': -0.01, - '🍢': -0.02, - '🎨': 0.03, - '⬇': 0.07, - '🚼': 0.1, - '⛲': 0.01, - '▁': 0.0, - '🇴': 0.06, - '🌗': 0.11, - '🌖': 0.11, - '🔅': 0.15, - '👜': 0.04, - '🐌': 0.11, - '💼': 0.09, - '🚕': 0.0, - '🐹': 0.05, - '🌠': 0.09, - '🐈': 0.05, - '⇧': 0.02, - '☎': 0.0, - '🌁': 0.03, - '⚫': 0.04, - '♧': 0.08, - '🏰': 0.05, - '🚵': 0.06, - '🎢': 0.08, - '🎷': 0.11, - '🎐': 0.03, - '┈': -0.1, - '╗': 0.06, - '╱': 0.0, - '🌇': 0.08, - '⏰': 0.07, - '⇩': 0.0, - '🚂': 0.04, - '◠': 0.07, - '🎿': 0.06, - '✦': 0.01, - '🆔': 0.12, - '⛪': 0.02, - '🌒': 0.09, - '🐪': 0.09, - '╔': 0.04, - '╝': 0.07, - '👔': 0.05, - '🔱': 0.01, - '🆓': 0.03, - '🐋': 0.03, - '▽': 0.06, - '▂': 0.0, - '🐛': 0.04, - '👕': 0.06, - '🚋': 0.01, - '💳': 0.06, - '🌆': 0.02, - '🏧': 0.12, - '💡': 0.09, - '🔹': 0.02, - '⬅': 0.07, - '🍠': 0.0, - '🐫': 0.05, - '🏪': 0.01, - '۩': 0.0, - '🇱': 0.06, - '📹': 0.06, - '👞': 0.06, - '🚑': 0.01, - '🆘': 0.01, - '👚': 0.08, - '🚍': 0.01, - '□': -0.03, - '🐂': 0.02, - '🚣': 0.08, - '✳': 0.0, - '🏉': 0.07, - '🗻': 0.08, - '🐀': 0.02, - '╦': 0.05, - '⛺': 0.06, - '🐕': 0.03, - '🏂': 0.05, - '👡': 0.05, - '📻': 0.04, - '✒': 0.03, - '🌰': 0.07, - '🏢': 0.02, - '🎒': 0.06, - '⌒': 0.07, - '🏫': -0.03, - '📴': 0.08, - '🚢': 0.03, - '🚚': -0.01, - '🐉': 0.02, - '❒': 0.03, - '🐊': 0.01, - '🔔': 0.1, - '◢': 0.08, - '🏥': 0.03, - '❔': 0.0, - '🚖': -0.01, - '🃏': 0.01, - '▼': 0.01, - '▌': -0.03, - '☛': 0.04, - '✩': 0.0, - '💒': 0.06, - '🚤': 0.04, - '🐐': 0.05, - '■': -0.03, - '🔚': 0.04, - '🎻': 0.04, - '🔷': 0.02, - '🚦': 0.01, - '🔓': 0.01, - '🎽': 0.05, - '📅': 0.02, - '🎺': 0.07, - '✯': 0.0, - '🍈': -0.04, - '✉': 0.03, - '╣': 0.0, - '◤': 0.09, - '○': 0.05, - '🍼': 0.05, - '📀': 0.01, - '🚛': -0.02, - '📓': 0.02, - '☉': 0.02, - '💴': -0.02, - '┼': 0.0, - '🐃': 0.0, - '➰': -0.01, - '🔌': -0.01, - '🍄': 0.0, - '📕': 0.02, - '📣': 0.04, - '🚓': 0.03, - '🐗': 0.05, - '↪': 0.01, - '⛳': 0.07, - '┻': -0.04, - '┛': 0.06, - '┃': 0.04, - '👱': 0.01, - '⏳': 0.0, - '💺': 0.02, - '🏇': -0.01, - '☻': 0.02, - '📞': 0.04, - 'Ⓐ': -0.01, - '🌉': 0.05, - '🚩': -0.02, - '✎': 0.05, - '📃': 0.04, - '🏨': 0.02, - '📌': -0.04, - '♎': -0.01, - '💷': 0.04, - '🚄': 0.05, - '▲': 0.05, - '⛵': 0.05, - '🔸': 0.02, - '⌛': 0.01, - '🚜': 0.07, - '🐆': 0.03, - '👒': 0.02, - '❕': 0.02, - '🔛': 0.04, - '♢': 0.03, - '🇲': 0.04, - '❅': 0.06, - '👝': 0.03, - '✞': 0.03, - '◡': 0.02, - '🎋': 0.04, - '👥': 0.02, - '📵': 0.01, - '🐡': 0.02, - '◆': 0.05, - '🏯': 0.01, - '☂': 0.0, - '🔭': 0.03, - '🎪': 0.02, - '🐜': 0.04, - '♌': 0.05, - '☐': -0.06, - '👷': 0.02, - '↳': 0.0, - '🔈': 0.02, - '📄': 0.06, - '📍': 0.01, - '🚐': 0.05, - '🚔': 0.0, - '🌋': 0.04, - '📡': 0.02, - '⏩': 0.01, - '🚳': 0.06, - '✘': 0.05, - '۞': 0.0, - '☾': 0.0, - '🅰': 0.02, - '📥': 0.0, - '🇼': 0.03, - '┓': 0.04, - '┣': 0.04, - 'Ⓛ': 0.03, - 'Ⓔ': 0.03, - '🔦': 0.0, - '👤': 0.04, - '🚁': 0.01, - '🎠': 0.03, - '🐁': -0.02, - '📗': 0.01, - '┐': -0.01, - '☮': 0.0, - '♂': 0.01, - '◞': 0.0, - '📯': -0.01, - '🔩': 0.01, - '👢': 0.04, - '◂': 0.02, - '📰': 0.02, - '📶': 0.02, - '🚥': 0.0, - '🌄': 0.01, - '🗾': 0.02, - '🔶': 0.02, - '🏤': 0.02, - '🎩': 0.02, - 'Ⓜ': 0.02, - '🔧': -0.03, - '🐅': 0.01, - '♮': 0.01, - '🅾': -0.01, - '🔄': 0.0, - '☄': 0.0, - '☨': 0.0, - '📦': 0.01, - '🚊': 0.01, - '🔲': 0.03, - '🔁': 0.0, - '△': 0.01, - '📆': 0.04, - '❛': 0.02, - '📉': 0.02, - '▵': 0.02, - '🔎': 0.03, - '☜': 0.01, - '🇯': 0.02, - '🇵': 0.02, - '📘': 0.01, - '✡': 0.0, - 'ⓔ': 0.03, - '🔑': 0.01, - '🔃': 0.0, - '👃': 0.0, - '⭕': 0.02, - '🔘': 0.01, - 'ⓒ': 0.0, - '🚭': 0.04, - '🚉': 0.03, - '🚪': 0.03, - '➳': 0.02, - '🚃': 0.03, - '┯': -0.02, - '🏬': 0.0, - '☽': 0.0, - '🆙': 0.02, - '🆖': 0.01, - '☪': 0.0, - '┗': 0.04, - '🚮': 0.0, - '┫': 0.0, - 'Ⓞ': 0.02, - '❇': 0.02, - '✴': 0.02, - '┌': 0.0, - '☊': 0.03, - '🔕': -0.01, - '⬛': -0.01, - '❝': 0.0, - '❞': 0.0, - '🚞': 0.02, - '🍶': 0.02, - '🌐': 0.02, - '♀': 0.01, - '🚅': 0.02, - '🚒': -0.01, - '➣': 0.0, - '♋': 0.01, - '♍': 0.02, - '🕝': -0.01, - 'ⓐ': 0.03, - '✗': 0.0, - '📙': 0.01, - 'Ⓢ': 0.01, - '📋': 0.02, - '⇢': 0.0, - '🎱': 0.01, - '🐞': 0.01, - '🔺': 0.01, - 'ⓡ': 0.03, - '🎍': 0.0, - '♤': 0.02, - '🎲': 0.0, - '🎯': 0.02, - '〠': 0.0, - '🔉': 0.02, - '↩': 0.03, - '🚾': 0.01, - '🎣': -0.02, - '🔣': 0.01, - '❎': -0.03, - '➥': 0.01, - '🅱': 0.0, - '🎌': 0.03, - '◣': 0.01, - '⏬': 0.03, - '♭': 0.01, - '💠': 0.0, - 'ⓞ': 0.02, - '🔳': 0.01, - '🏭': 0.01, - '🔰': 0.0, - '🎳': -0.01, - '☚': 0.02, - '➽': 0.01, - '➫': 0.01, - '➖': -0.02, - '🏮': 0.0, - '📛': 0.0, - '꒰': 0.01, - '꒱': 0.01, - '◝': -0.01, - '📑': 0.02, - '🎦': 0.0, - 'ⓧ': 0.02, - '🇨': 0.0, - '🇳': 0.0, - '🔟': 0.02, - '〓': 0.02, - 'ⓜ': 0.01, - '➠': 0.02, - '🚆': 0.01, - '🚠': 0.0, - '℅': -0.02, - '☃': 0.01, - '🚽': 0.02, - '📐': 0.0, - 'ⓝ': 0.02, - '✮': 0.0, - '⇦': 0.02, - '👲': 0.01, - '🚡': -0.01, - '🎑': 0.0, - '🔬': 0.02, - '➗': -0.01, - '📈': 0.01, - '⌘': 0.0, - '⏪': 0.01, - '╹': 0.0, - '◎': 0.02, - '🔼': 0.0, - '꒦': -0.02, - '📎': 0.02, - '⑅': 0.02, - '⍝': 0.0, - '📁': 0.0, - '✭': 0.02, - '➲': 0.0, - '♓': 0.01, - '┏': 0.02, - '☇': 0.02, - '♺': 0.0, - '♞': 0.0, - '࿎': -0.02, - '📠': 0.0, - '👘': 0.02, - '↙': 0.02, - 'Ⓕ': 0.01, - 'Ⓦ': 0.01, - 'Ⓟ': 0.01, - '🕑': 0.01, - '💽': 0.0, - '🕛': 0.01, - '🎫': 0.0, - '♈': -0.01, - '📟': 0.0, - '℃': 0.0, - '↬': 0.01, - '🕒': 0.0, - '🇰': 0.0, - '↱': 0.0, - '✍': 0.01, - '⇐': 0.0, - '🏦': 0.01, - '🔻': 0.01, - 'ⓟ': 0.01, - 'ⓕ': 0.01, - 'ⓘ': 0.01, - '♿': 0.01, - '⇗': 0.01, - '⇘': 0.01, - 'ⓨ': 0.01, - 'ⓙ': 0.01, - '▫': 0.01, - '🔇': 0.01, - '⌃': -0.01, - '🔖': 0.01, - '📜': 0.01, - '♏': 0.0, - '🚝': 0.01, - '☢': 0.0, - '🎏': 0.0, - '┘': -0.01, - '✝': -0.01, - '❖': 0.0, - '⍣': -0.01, - '📮': -0.01, - '🕕': -0.01, - '🇭': 0.0, - '◜': 0.0, - '🔯': 0.01, - '➸': 0.01, - '꒵': 0.01, - '🕥': -0.01, - '♙': 0.0, - '▿': 0.0, - '⚃': 0.0, - '✽': 0.01, - '📼': 0.01, - '🕐': -0.01, - '🀄': 0.01, - '✾': 0.0, - '✬': 0.01, - '🆑': 0.0, - '✫': 0.01, - '🕔': -0.01, - '❣': 0.01, - '➱': 0.0, - '🆕': 0.0, - '➢': 0.0, - '↕': 0.0, - '📫': 0.01, - '🉐': 0.01, - '♊': 0.0, - '🈂': -0.01, - '🎰': -0.01, - '҂': -0.01, - '╤': -0.01, - '➛': 0.0, - '♝': 0.0, - '❋': 0.0, - '✆': 0.0, - '📔': 0.01 -} \ No newline at end of file From 194738c2ab3bef99acd3f2bc6379cdba68a6d41e Mon Sep 17 00:00:00 2001 From: Amale EL HAMRI <amale.elhamri@artefact.com> Date: Thu, 1 Oct 2020 17:34:09 +0200 Subject: [PATCH 306/496] fix pylint file_loader --- nautilus_nlp/utils/file_loader.py | 132 +++++++++++++++--------------- 1 file changed, 64 insertions(+), 68 deletions(-) diff --git a/nautilus_nlp/utils/file_loader.py b/nautilus_nlp/utils/file_loader.py index 73ef8e3..876b54f 100644 --- a/nautilus_nlp/utils/file_loader.py +++ b/nautilus_nlp/utils/file_loader.py @@ -15,16 +15,16 @@ # You should have received a copy of the GNU Lesser General Public License # along with this program; if not, write to the Free Software Foundation, # Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. -import io -import chardet +import codecs import glob -import re -import os -from os import listdir -from os.path import isfile, isdir, join +import io import json import logging +import os +import re +import shutil +import chardet logging.basicConfig(level=logging.INFO) @@ -36,38 +36,39 @@ def open_textfile(filepath, encoding='utf-8'): def detect_encoding(file_path_or_string, n_lines=100): - """ + """ Predict a file's encoding using chardet - + Parameters ---------- file_path_or_string : string if filepath, will open the file. Otherwise will predict from the string n_lines : int - number of line to predict from - + number of line to predict from + Returns ------- the code of the detected encoding """ - if isfile(file_path_or_string): + if os.path.isfile(file_path_or_string): with open(file_path_or_string, 'rb') as f: # Open the file as binary data - rawdata = b''.join([f.readline() for _ in range(n_lines)]) # Join binary lines for specified number of lines - elif type(file_path_or_string) is bytes: + # Join binary lines for specified number of lines + rawdata = b''.join([f.readline() for _ in range(n_lines)]) + elif isinstance(file_path_or_string, bytes): rawdata = file_path_or_string return chardet.detect(rawdata) def text_loader(filepath, encoding=None, detectencoding=True): ''' - This util loads a file. If the encoding is specified, will use the specified - encoding to load the text file. - If not specified, this function tries to open the doc as UTF-U, and if - it fails it will try to detect the encoding using **detect_encoding** + This util loads a file. If the encoding is specified, will use the specified + encoding to load the text file. + If not specified, this function tries to open the doc as UTF-U, and if + it fails it will try to detect the encoding using **detect_encoding** Parameters ---------- - filepath : str + filepath : str encoding : str If the encoding is specified, will use the specified encoding to load the text file. detect_encoding : bool @@ -79,25 +80,24 @@ def text_loader(filepath, encoding=None, detectencoding=True): ''' if encoding is not None: return open_textfile(filepath, encoding=encoding) - else: - try: - return open_textfile(filepath, encoding='utf-8') - except UnicodeDecodeError: - logging.warning('Encoding for {} is not UTF-8.'.format(filepath)) - if detectencoding is True: - logging.warning('Trying to detect encoding for {}'.format(filepath)) - detected_encoding = detect_encoding(filepath) - logging.info('{filepath}: detected encoding is {encod}, with a confidence rate of {conf_rate}'.format(filepath=filepath, encod=detected_encoding['encoding'], - conf_rate=detected_encoding['confidence'])) - return open_textfile(filepath, encoding=detected_encoding['encoding']) - else: - raise UnicodeDecodeError('Cannot load document using utf-8. Try to detect encoding using detectencoding=True') + try: + return open_textfile(filepath, encoding='utf-8') + except UnicodeDecodeError: + logging.warning('Encoding for {} is not UTF-8.'.format(filepath)) + if detectencoding is True: + logging.warning('Trying to detect encoding for {}'.format(filepath)) + detected_encoding = detect_encoding(filepath) + logging.info('{filepath}: detected encoding is {encod}, with a confidence rate of {conf_rate}'.format( + filepath=filepath, encod=detected_encoding['encoding'], conf_rate=detected_encoding['confidence'])) + return open_textfile(filepath, encoding=detected_encoding['encoding']) + raise UnicodeDecodeError( + 'Cannot load document using utf-8. Try to detect encoding using detectencoding=True') def get_subfolders_path(folder): if not folder.endswith("/"): folder = folder + "/" - return [folder + f+'/' for f in listdir(folder)if isdir(join(folder, f)) and f != ".DS_Store"] + return [folder + f+'/' for f in os.listdir(folder)if os.path.isdir(os.path.join(folder, f)) and f != ".DS_Store"] def list_files_in_subdir(filepath): @@ -105,29 +105,29 @@ def list_files_in_subdir(filepath): Get a list of all the filepath of files in directory and subdirectory. ''' res = [] - for path, subdirs, files in os.walk(filepath): + for path, _, files in os.walk(filepath): for name in files: res.append(os.path.join(path, name)) return res -def list_files(filepath:str): - """ - inputs a filepath. - Outputs a list of filepath. +def list_files(filepath: str): + """ + inputs a filepath. + Outputs a list of filepath. Supports regex """ - if isdir(filepath) and len(re.findall(r"[\w.]$",filepath)): - filepath=filepath+'/*' + if os.path.isdir(filepath) and len(re.findall(r"[\w.]$", filepath)) > 0: + filepath = filepath+'/*' if filepath.endswith('/'): - filepath=filepath+'*' - return[file for file in glob.glob(filepath) if isfile(file)] + filepath = filepath+'*' + return[file for file in glob.glob(filepath) if os.path.isdir(file)] -def documents_loader(filepath:str, encoding=None, detectencoding=True, output_as='dict'): +def documents_loader(filepath: str, encoding=None, detectencoding=True, output_as='dict'): ''' - Input a filepath, a filepath with wildcard (eg. *.txt), + Input a filepath, a filepath with wildcard (eg. *.txt), or a list of filepaths. Output a string, or a dict of strings. @@ -137,41 +137,41 @@ def documents_loader(filepath:str, encoding=None, detectencoding=True, output_as A filepath with wildcard (eg. *.txt), or a list of filepaths. output_as: list or dict. If dict, key will be the filename. - encoding: - if not specified, will try to detect encoding except if detectencoding is false. - detectencoding : bool - if True and if encoding is not specified, will try to detect encoding using chardet. - + encoding: + if not specified, will try to detect encoding except if detectencoding is false. + detectencoding : bool + if True and if encoding is not specified, will try to detect encoding using chardet. + Returns ------- string the document loaded ''' - - if type(filepath) is str: + if isinstance(filepath, str): documents = list_files(filepath) nb_of_documents = len(documents) - elif type(filepath) is list: + elif isinstance(filepath, list): nb_of_documents = len(filepath) documents = filepath else: raise IOError('Please enter a valid filepath or a valid list of filepath') - + if nb_of_documents == 1: - return text_loader(documents[0],encoding=encoding, detectencoding=detectencoding) - elif nb_of_documents > 1: + return text_loader( + documents[0], encoding=encoding, detectencoding=detectencoding) + if nb_of_documents > 1: if output_as == 'list': - return [text_loader(document, encoding=encoding, detectencoding=detectencoding) for document in documents] - elif output_as == 'dict': - return { document : text_loader(document, encoding=encoding, detectencoding=detectencoding) for document in documents} - else: - raise ValueError('Enter a valid output format between list or dict') - else: - raise IOError('No files detected in {}'.format(filepath)) + return [text_loader( + document, encoding=encoding, detectencoding=detectencoding) for document in documents] + if output_as == 'dict': + return {document: text_loader( + document, encoding=encoding, detectencoding=detectencoding) for document in documents} + raise ValueError('Enter a valid output format between list or dict') + raise IOError('No files detected in {}'.format(filepath)) ################# -## CSV Loader +# CSV Loader def encode_columns(df, columns_to_encode): ''' @@ -187,21 +187,17 @@ def decode_columns(df, columns_to_encode): ''' for col in columns_to_encode: df[col] = df[col].apply(json.loads) - + ################# -## Encoding functions +# Encoding functions def convert_encoding(file_path, input_encoding, output_encoding): ''' Encode a file according to a specified encoding ''' - import codecs - import shutil - with codecs.open(file_path, encoding=input_encoding) as input_file: with codecs.open( 'encoded_'+file_path, "w", encoding=output_encoding) as output_file: shutil.copyfileobj(input_file, output_file) - From 5529c6e9087679f4c37c1307e56c7a44d2f32f03 Mon Sep 17 00:00:00 2001 From: Amale EL HAMRI <amale.elhamri@artefact.com> Date: Thu, 1 Oct 2020 18:13:27 +0200 Subject: [PATCH 307/496] fixing pylint on phone_number.py --- nautilus_nlp/utils/phone_number.py | 16 ++++++++++++---- tests/test_phone_number.py | 8 ++++---- 2 files changed, 16 insertions(+), 8 deletions(-) diff --git a/nautilus_nlp/utils/phone_number.py b/nautilus_nlp/utils/phone_number.py index a1583e9..f3af336 100644 --- a/nautilus_nlp/utils/phone_number.py +++ b/nautilus_nlp/utils/phone_number.py @@ -17,7 +17,7 @@ # Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. import phonenumbers as _phonenumbers -SUPPORTED_COUNTRY = [None, 'US', 'AG', 'AI', 'AS', 'BB', 'BM', 'BS', 'CA', 'DM', +SUPPORTED_COUNTRY = [None, 'US', 'AG', 'AI', 'AS', 'BB', 'BM', 'BS', 'CA', 'DM', 'GD', 'GU', 'JM', 'KN', 'KY', 'LC', 'MP', 'MS', 'PR', 'SX', 'TC', 'TT', 'VC', 'VG', 'VI', 'RU', 'KZ', 'EG', 'ZA', 'GR', 'NL', 'BE', 'FR', 'ES', 'HU', 'IT', 'VA', 'RO', 'CH', 'AT', 'GB', 'GG', 'IM', 'JE', 'DK', 'SE', @@ -39,6 +39,12 @@ 'IQ', 'KW', 'SA', 'YE', 'OM', 'PS', 'AE', 'IL', 'BH', 'QA', 'BT', 'MN', 'NP', 'TJ', 'TM', 'AZ', 'GE', 'KG', 'UZ', 'DO'] +FORMAT_NUMBERS = { + "E164": _phonenumbers.PhoneNumberFormat.E164, + "INTERNATIONAL": _phonenumbers.PhoneNumberFormat.INTERNATIONAL, + "NATIONAL": _phonenumbers.PhoneNumberFormat.NATIONAL, + "RFC3966": _phonenumbers.PhoneNumberFormat.RFC3966 +} def find_phone_numbers(string, region_code=None): """ @@ -82,7 +88,7 @@ def extract_phone_numbers(text: str, countrylist: list)->list: return list(set(all_phone_numbers)) -class phone_parser(object): +class PhoneParser: """ Python port of Google's libphonenumber. https://github.com/daviddrysdale/python-phonenumbers @@ -118,10 +124,12 @@ def parse_number(self, text: str, region_code=None): self.parsed_num = _phonenumbers.parse(self.text, self.region_code) return self.parsed_num + def format_number(self, num_format): ''' ['E164','INTERNATIONAL','NATIONAL','RFC3966'] ''' - # TODO: why exec ??? - standard_format = exec('_phonenumbers.PhoneNumberFormat.'+num_format) + standard_format = FORMAT_NUMBERS.get(num_format) + if standard_format is None: + raise ValueError(f"Please choose a num_format in {list(FORMAT_NUMBERS.keys())}") return _phonenumbers.format_number(self.parsed_num, standard_format) diff --git a/tests/test_phone_number.py b/tests/test_phone_number.py index 724a4b9..e416f09 100644 --- a/tests/test_phone_number.py +++ b/tests/test_phone_number.py @@ -43,16 +43,16 @@ def test_extract_phone_number_international(): def test_phone_parser_us(): input_str = '(541) 754-3010' - expected = '541-754-3010' - p = phone.phone_parser() + expected = '+1 541-754-3010' + p = phone.PhoneParser() p.parse_number(input_str, region_code='US') res = p.format_number('INTERNATIONAL') assert res == expected def test_phone_parser_fr(): input_str = '0625093267' - expected = '6 25 09 32 67' - p = phone.phone_parser() + expected = '+33625093267' + p = phone.PhoneParser() p.parse_number(input_str, region_code='FR') res = p.format_number('E164') assert res == expected From 9fa3b4c219886f70029b141bb841eb9af95906b9 Mon Sep 17 00:00:00 2001 From: Amale EL HAMRI <amale.elhamri@artefact.com> Date: Thu, 1 Oct 2020 18:15:25 +0200 Subject: [PATCH 308/496] removing uncalled utils vector_similarity --- nautilus_nlp/utils/vector_similarity.py | 60 ------------------------- 1 file changed, 60 deletions(-) delete mode 100644 nautilus_nlp/utils/vector_similarity.py diff --git a/nautilus_nlp/utils/vector_similarity.py b/nautilus_nlp/utils/vector_similarity.py deleted file mode 100644 index 174d1a2..0000000 --- a/nautilus_nlp/utils/vector_similarity.py +++ /dev/null @@ -1,60 +0,0 @@ -# GNU Lesser General Public License v3.0 only -# Copyright (C) 2020 Artefact -# licence-information@artefact.com -# -# This program is free software; you can redistribute it and/or -# modify it under the terms of the GNU Lesser General Public -# License as published by the Free Software Foundation; either -# version 3 of the License, or (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public License -# along with this program; if not, write to the Free Software Foundation, -# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. -import numpy as np -import math - - -def _VectorSize(vec): - return math.sqrt(sum(math.pow(v, 2) for v in vec)) - - -def _InnerProduct(vec1, vec2): - return sum(v1 * v2 for v1, v2 in zip(vec1, vec2)) - - -def _Theta(vec1, vec2): - return math.acos(Cosine(vec1, vec2)) + 10 - - -def _Magnitude_Difference(vec1, vec2): - return abs(_VectorSize(vec1) - _VectorSize(vec2)) - - -def Euclidean(vec1, vec2): - return math.sqrt(sum(math.pow((v1 - v2), 2) for v1, v2 in zip(vec1, vec2))) - - -def Cosine(vec1, vec2): - result = _InnerProduct(vec1, vec2) / (_VectorSize(vec1) * _VectorSize(vec2)) - return result - - -def Triangle(vec1, vec2): - theta = math.radians(_Theta(vec1, vec2)) - return (_VectorSize(vec1) * _VectorSize(vec2) * math.sin(theta)) / 2 - - -def Sector(vec1, vec2): - ED = Euclidean(vec1, vec2) - MD = _Magnitude_Difference(vec1, vec2) - theta = _Theta(vec1, vec2) - return math.pi * math.pow((ED + MD), 2) * theta / 360 - - -def TS_SS(vec1, vec2): - return Triangle(vec1, vec2) * Sector(vec1, vec2) From 78b48a048362421e74394fb5c648a7d323677957 Mon Sep 17 00:00:00 2001 From: Amale EL HAMRI <amale.elhamri@artefact.com> Date: Thu, 1 Oct 2020 18:23:56 +0200 Subject: [PATCH 309/496] linting test_biterm.py --- tests/test_biterm.py | 62 ++++++++++++++++++++++---------------------- 1 file changed, 31 insertions(+), 31 deletions(-) diff --git a/tests/test_biterm.py b/tests/test_biterm.py index 5f9c3a7..21e7320 100644 --- a/tests/test_biterm.py +++ b/tests/test_biterm.py @@ -15,11 +15,11 @@ # You should have received a copy of the GNU Lesser General Public License # along with this program; if not, write to the Free Software Foundation, # Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. -from nautilus_nlp.topic_modeling.biterm_model import BitermModel import pandas as pd import pytest +from nautilus_nlp.topic_modeling.biterm_model import BitermModel -text = ['Cola 1.5L Carrefour', +TEXT = ['Cola 1.5L Carrefour', 'Pepsi Cola Light 1.5L', 'Pepsi Cola Twist Light', 'Cola 1.5L CRF DISC', @@ -33,30 +33,30 @@ 'Penne de riz 100g sans gluten', 'Spaghetti de maïs 50g sans Glute'] -nb_topics = 5 -nb_word_per_cluster = 5 -nb_iteration = 100 -language = 'english' +NB_TOPICS = 5 +NB_WORD_PER_CLUSTER = 5 +NB_ITERATION = 100 +LANGUAGE = 'english' @pytest.mark.parametrize( "input_text, input_nb_topic , input_nb_iteration , input_language", [ - (text, -1, nb_iteration, language), - (text, "Panzani", nb_iteration, language), - (text, 3.4, nb_iteration, language), - (text, (3, 5), nb_iteration, language), - (text, [3, 5], nb_iteration, language), - (text, nb_topics, (2, 4), language), - (text, nb_topics, [1, 3], language), - (text, nb_topics, -1, language), - (text, nb_topics, "Panzani", language), - (text, nb_topics, 2.4, language), - (3, nb_topics, nb_iteration, language), - ("Panzani", nb_topics, nb_iteration, language), - (("Panzani", "Rustichella"), nb_topics, nb_iteration, language), - ([], nb_topics, nb_iteration, language), - (["Panzani", "Rustichella", 3], nb_topics, nb_iteration, language) + (TEXT, -1, NB_ITERATION, LANGUAGE), + (TEXT, "Panzani", NB_ITERATION, LANGUAGE), + (TEXT, 3.4, NB_ITERATION, LANGUAGE), + (TEXT, (3, 5), NB_ITERATION, LANGUAGE), + (TEXT, [3, 5], NB_ITERATION, LANGUAGE), + (TEXT, NB_TOPICS, (2, 4), LANGUAGE), + (TEXT, NB_TOPICS, [1, 3], LANGUAGE), + (TEXT, NB_TOPICS, -1, LANGUAGE), + (TEXT, NB_TOPICS, "Panzani", LANGUAGE), + (TEXT, NB_TOPICS, 2.4, LANGUAGE), + (3, NB_TOPICS, NB_ITERATION, LANGUAGE), + ("Panzani", NB_TOPICS, NB_ITERATION, LANGUAGE), + (("Panzani", "Rustichella"), NB_TOPICS, NB_ITERATION, LANGUAGE), + ([], NB_TOPICS, NB_ITERATION, LANGUAGE), + (["Panzani", "Rustichella", 3], NB_TOPICS, NB_ITERATION, LANGUAGE) ] ) def text_input_parameter_error_handling(input_text @@ -68,18 +68,18 @@ def text_input_parameter_error_handling(input_text def test_number_topic_correct(): - biterm_model = BitermModel(data=text - , nb_topics=nb_topics - , nb_iteration=nb_iteration - , lang=language) - clusters = biterm_model.compute_topics(nb_word_per_cluster=nb_word_per_cluster) - assert len(pd.DataFrame(clusters)) == nb_topics + biterm_model = BitermModel(data=TEXT + , nb_topics=NB_TOPICS + , nb_iteration=NB_ITERATION + , lang=LANGUAGE) + clusters = biterm_model.compute_topics(nb_word_per_cluster=NB_WORD_PER_CLUSTER) + assert len(pd.DataFrame(clusters)) == NB_TOPICS def test_no_initialisation(): with pytest.raises(ValueError): - biter_model = BitermModel(data=text - , nb_topics=nb_topics - , nb_iteration=nb_iteration, - lang=language) + biter_model = BitermModel(data=TEXT, + nb_topics=NB_TOPICS, + nb_iteration=NB_ITERATION, + lang=LANGUAGE) biter_model.get_document_topic(2) From 6e9613e914cd080cc51785e253745ceb98be165e Mon Sep 17 00:00:00 2001 From: Amale EL HAMRI <amale.elhamri@artefact.com> Date: Thu, 1 Oct 2020 18:47:34 +0200 Subject: [PATCH 310/496] fixing lint file_loader --- nautilus_nlp/utils/file_loader.py | 33 ++++++++++++------------------- 1 file changed, 13 insertions(+), 20 deletions(-) diff --git a/nautilus_nlp/utils/file_loader.py b/nautilus_nlp/utils/file_loader.py index 876b54f..cda3997 100644 --- a/nautilus_nlp/utils/file_loader.py +++ b/nautilus_nlp/utils/file_loader.py @@ -15,13 +15,13 @@ # You should have received a copy of the GNU Lesser General Public License # along with this program; if not, write to the Free Software Foundation, # Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. -import codecs import glob import io import json import logging import os import re +import codecs import shutil import chardet @@ -51,8 +51,7 @@ def detect_encoding(file_path_or_string, n_lines=100): the code of the detected encoding """ if os.path.isfile(file_path_or_string): - with open(file_path_or_string, 'rb') as f: # Open the file as binary data - # Join binary lines for specified number of lines + with open(file_path_or_string, 'rb') as f: rawdata = b''.join([f.readline() for _ in range(n_lines)]) elif isinstance(file_path_or_string, bytes): rawdata = file_path_or_string @@ -65,7 +64,6 @@ def text_loader(filepath, encoding=None, detectencoding=True): encoding to load the text file. If not specified, this function tries to open the doc as UTF-U, and if it fails it will try to detect the encoding using **detect_encoding** - Parameters ---------- filepath : str @@ -73,7 +71,6 @@ def text_loader(filepath, encoding=None, detectencoding=True): If the encoding is specified, will use the specified encoding to load the text file. detect_encoding : bool If file is not encoded into UTF-8, try to detect encoding using the chardet library. - Returns ------- string @@ -90,8 +87,8 @@ def text_loader(filepath, encoding=None, detectencoding=True): logging.info('{filepath}: detected encoding is {encod}, with a confidence rate of {conf_rate}'.format( filepath=filepath, encod=detected_encoding['encoding'], conf_rate=detected_encoding['confidence'])) return open_textfile(filepath, encoding=detected_encoding['encoding']) - raise UnicodeDecodeError( - 'Cannot load document using utf-8. Try to detect encoding using detectencoding=True') + raise UnicodeDecodeError('Cannot load document using utf-8. '\ + 'Try to detect encoding using detectencoding=True') def get_subfolders_path(folder): @@ -122,7 +119,7 @@ def list_files(filepath: str): filepath = filepath+'/*' if filepath.endswith('/'): filepath = filepath+'*' - return[file for file in glob.glob(filepath) if os.path.isdir(file)] + return [file for file in glob.glob(filepath) if os.path.isfile(file)] def documents_loader(filepath: str, encoding=None, detectencoding=True, output_as='dict'): @@ -130,7 +127,6 @@ def documents_loader(filepath: str, encoding=None, detectencoding=True, output_a Input a filepath, a filepath with wildcard (eg. *.txt), or a list of filepaths. Output a string, or a dict of strings. - Parameters ---------- filepath: filepath @@ -147,6 +143,7 @@ def documents_loader(filepath: str, encoding=None, detectencoding=True, output_a string the document loaded ''' + if isinstance(filepath, str): documents = list_files(filepath) nb_of_documents = len(documents) @@ -154,24 +151,22 @@ def documents_loader(filepath: str, encoding=None, detectencoding=True, output_a nb_of_documents = len(filepath) documents = filepath else: - raise IOError('Please enter a valid filepath or a valid list of filepath') + raise TypeError('Please enter a valid filepath or a valid list of filepath') if nb_of_documents == 1: - return text_loader( - documents[0], encoding=encoding, detectencoding=detectencoding) + return text_loader(documents[0], encoding=encoding, detectencoding=detectencoding) if nb_of_documents > 1: if output_as == 'list': - return [text_loader( - document, encoding=encoding, detectencoding=detectencoding) for document in documents] + return [text_loader(document, encoding=encoding, detectencoding=detectencoding) for document in documents] if output_as == 'dict': - return {document: text_loader( + return {document : text_loader( document, encoding=encoding, detectencoding=detectencoding) for document in documents} - raise ValueError('Enter a valid output format between list or dict') + raise TypeError('Enter a valid output format between list or dict') raise IOError('No files detected in {}'.format(filepath)) ################# -# CSV Loader +## CSV Loader def encode_columns(df, columns_to_encode): ''' @@ -190,9 +185,7 @@ def decode_columns(df, columns_to_encode): ################# -# Encoding functions - - +## Encoding functions def convert_encoding(file_path, input_encoding, output_encoding): ''' Encode a file according to a specified encoding From 853f66ddc3f3b293a6602aaf9f63ab5a1f5f6192 Mon Sep 17 00:00:00 2001 From: Amale EL HAMRI <amale.elhamri@artefact.com> Date: Thu, 1 Oct 2020 18:51:26 +0200 Subject: [PATCH 311/496] linting test_document_loader.py --- tests/test_document_loader.py | 37 ++++++++++++++--------------------- 1 file changed, 15 insertions(+), 22 deletions(-) diff --git a/tests/test_document_loader.py b/tests/test_document_loader.py index 0be9eb7..a757619 100644 --- a/tests/test_document_loader.py +++ b/tests/test_document_loader.py @@ -17,21 +17,21 @@ # Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. # -*- coding: utf-8 -*- -import os -import pytest +import os + import numpy as np -from nautilus_nlp.utils.file_loader import documents_loader, list_files, detect_encoding +from nautilus_nlp.utils.file_loader import (detect_encoding, documents_loader) -testdoc_latin1 = "J'aime les frites bien grasse étalon châpeau!" -testdoc_utf8 = "Un deuxième exemple de texte en utf-8 cette fois!" +TESTDOC_LATIN1 = "J'aime les frites bien grasse étalon châpeau!" +TESTDOC_UTF8 = "Un deuxième exemple de texte en utf-8 cette fois!" def create_files(): - encoded_s = testdoc_latin1.encode('latin-1') + encoded_s = TESTDOC_LATIN1.encode('latin-1') with open('testdoc_latin1.txt', 'wb') as f: f.write(encoded_s) - encoded_s = testdoc_utf8.encode('utf-8') + encoded_s = TESTDOC_UTF8.encode('utf-8') with open('testdoc_utf8.txt', 'wb') as f: f.write(encoded_s) return True @@ -40,7 +40,7 @@ def create_files(): def test_openfile_with_encoding(): create_files() input_str = "testdoc_latin1.txt" - expected_str = testdoc_latin1 + expected_str = TESTDOC_LATIN1 result = documents_loader(input_str, encoding='latin-1') np.testing.assert_string_equal(result, expected_str) remove_files() @@ -49,7 +49,7 @@ def test_openfile_with_encoding(): def test_openfile_utf8(): create_files() input_str = "testdoc_utf8.txt" - expected_str = testdoc_utf8 + expected_str = TESTDOC_UTF8 result = documents_loader(input_str) np.testing.assert_string_equal(result, expected_str) remove_files() @@ -57,9 +57,9 @@ def test_openfile_utf8(): def test_encoding_detection(): create_files() input_str = "testdoc_latin1.txt" - expected_str = testdoc_latin1 + expected_str = TESTDOC_LATIN1 result = documents_loader(input_str) - np.testing.assert_string_equal(result, expected_str) + np.testing.assert_string_equal(result, expected_str) remove_files() def test_load_several_docs_wildcard(): @@ -67,14 +67,14 @@ def test_load_several_docs_wildcard(): expected = {'testdoc_latin1.txt': "J'aime les frites bien grasse étalon châpeau!", 'testdoc_utf8.txt': 'Un deuxième exemple de texte en utf-8 cette fois!'} result = documents_loader('test*.txt', output_as='dict') - np.testing.assert_equal(result, expected) + np.testing.assert_equal(result, expected) remove_files() def test_load_several_docs_list(): create_files() expected = {'testdoc_latin1.txt': "J'aime les frites bien grasse étalon châpeau!", 'testdoc_utf8.txt': 'Un deuxième exemple de texte en utf-8 cette fois!'} - result = documents_loader(['testdoc_latin1.txt','testdoc_utf8.txt'], output_as='dict') + result = documents_loader(['testdoc_latin1.txt', 'testdoc_utf8.txt'], output_as='dict') np.testing.assert_equal(result, expected) remove_files() @@ -83,18 +83,11 @@ def test_load_several_docs_output_list(): create_files() expected = ["J'aime les frites bien grasse étalon châpeau!", 'Un deuxième exemple de texte en utf-8 cette fois!'] - result = documents_loader(['testdoc_latin1.txt','testdoc_utf8.txt'], output_as='list') + result = documents_loader(['testdoc_latin1.txt', 'testdoc_utf8.txt'], output_as='list') remove_files() return len(expected) == len(result) and sorted(expected) == sorted(result) -#@pytest.mark.parametrize("input_filepath", ['*.txt','','testfolder_fileloader']) -#def test_list_files(input_filepath): -# expected = ['testdoc_latin1.txt','testdoc_utf8.txt'] -# result = list_files(input_filepath) -# return len(expected) == len(result) and sorted(expected) == sorted(result) - - def test_detect_encoding(): create_files() expected = {'encoding': 'ISO-8859-1', 'confidence': 0.73, 'language': ''} @@ -104,4 +97,4 @@ def test_detect_encoding(): def remove_files(): os.remove('testdoc_latin1.txt') - os.remove('testdoc_utf8.txt') \ No newline at end of file + os.remove('testdoc_utf8.txt') From 3a64275915f25b0e6fede09d83b9ad0803a21a88 Mon Sep 17 00:00:00 2001 From: Amale EL HAMRI <amale.elhamri@artefact.com> Date: Thu, 1 Oct 2020 18:53:16 +0200 Subject: [PATCH 312/496] linting tests/test_fix_bad_encoding --- tests/test_fix_bad_encoding.py | 36 ++++++++++++++-------------------- 1 file changed, 15 insertions(+), 21 deletions(-) diff --git a/tests/test_fix_bad_encoding.py b/tests/test_fix_bad_encoding.py index 50d4ca3..cfc21ba 100644 --- a/tests/test_fix_bad_encoding.py +++ b/tests/test_fix_bad_encoding.py @@ -21,29 +21,23 @@ from nautilus_nlp.preprocessing.text_preprocess import TextPreprocessor - @pytest.mark.parametrize( "input_str, expected_str", - [ - ('Les augmentations de rémunérations', - 'Les augmentations de rémunérations'), - ("rénover l'enquête publique pour en faire un vrai outil d'aménagement du territoire et de dialogue social", - "rénover l'enquête publique pour en faire un vrai outil d'aménagement du territoire et de dialogue social"), - ('Limitations de vitesse et sécurité routière', - 'Limitations de vitesse et sécurité routière'), - ('Pour un nouveau contrat citoyen', 'Pour un nouveau contrat citoyen'), - ('Développer les démarches de budget participatif dans les collectivités et associer les citoyens dans la réalisation des projets', - 'Développer les démarches de budget participatif dans les collectivités et associer les citoyens dans la réalisation des projets'), - ('proportienelle', 'proportienelle'), - ('Pour plus de démocratie participative', - 'Pour plus de démocratie participative'), - ('Transparence de la vie public', 'Transparence de la vie public'), - ('18 mois de trop....ca suffit macron', - '18 mois de trop....ca suffit macron'), - ('Egalité devant les infractions routières', - 'Egalité devant les infractions routières') - ], -) + [('Les augmentations de rémunérations', 'Les augmentations de rémunérations'), + ("rénover l'enquête publique pour en faire un vrai outil d'aménagement du territoire et de dialogue social", + "rénover l'enquête publique pour en faire un vrai outil d'aménagement du territoire et de dialogue social"), + ('Limitations de vitesse et sécurité routière', 'Limitations de vitesse et sécurité routière'), + ('Pour un nouveau contrat citoyen', 'Pour un nouveau contrat citoyen'), + ( + 'Développer les démarches de budget participatif dans les collectivités et associer les citoyens '\ + 'dans la réalisation des projets', + 'Développer les démarches de budget participatif dans les collectivités et associer les citoyens '\ + 'dans la réalisation des projets'), + ('proportienelle', 'proportienelle'), + ('Pour plus de démocratie participative', 'Pour plus de démocratie participative'), + ('Transparence de la vie public', 'Transparence de la vie public'), + ('18 mois de trop....ca suffit macron', '18 mois de trop....ca suffit macron'), + ('Egalité devant les infractions routières', 'Egalité devant les infractions routières')],) def test_remove_multiple_spaces_and_strip_text(input_str, expected_str): preprocessor = TextPreprocessor(input_str) result = preprocessor.fix_bad_unicode() From 75914c40cce234cb1222931c03ccedc9fbff26b9 Mon Sep 17 00:00:00 2001 From: Amale EL HAMRI <amale.elhamri@artefact.com> Date: Thu, 1 Oct 2020 19:01:04 +0200 Subject: [PATCH 313/496] linting tests/test_preprocessor.py --- tests/test_preprocessor.py | 204 ++++++++++++++++++------------------- 1 file changed, 101 insertions(+), 103 deletions(-) diff --git a/tests/test_preprocessor.py b/tests/test_preprocessor.py index eaf8edb..37524f8 100644 --- a/tests/test_preprocessor.py +++ b/tests/test_preprocessor.py @@ -24,7 +24,6 @@ from nautilus_nlp.utils.stopwords import get_stopwords - @pytest.mark.parametrize("text, expected_result", [("ACV water + cinnamon + turmeric + cucumber + lemon. 👍🏻", [":thumbs_up_light_skin_tone:"]), @@ -142,6 +141,7 @@ def test_remove_multiple_spaces_and_strip_text(input_str, expected_str): result = preprocessor.remove_multiple_spaces_and_strip_text() np.testing.assert_string_equal(result, expected_str) + @pytest.mark.parametrize( "input_str, expected_str", [ @@ -153,50 +153,51 @@ def test_remove_multiple_spaces_and_strip_text(input_str, expected_str): def test_remove_eol_characters(input_str, expected_str): preprocessor = TextPreprocessor(input_str) result = preprocessor.remove_eol_characters() - np.testing.assert_string_equal(result, expected_str) + np.testing.assert_string_equal(result, expected_str) def test_remove_tokens_with_nonletters(): - input_tokens = ['foo','bar','124','34euros'] - expected_output = ['foo','bar'] + input_tokens = ['foo', 'bar', '124', '34euros'] + expected_output = ['foo', 'bar'] preprocessor = TokenPreprocessor(input_tokens) result = preprocessor.remove_tokens_with_nonletters() - np.testing.assert_array_equal(result,expected_output) + np.testing.assert_array_equal(result, expected_output) def test_remove_special_caracters_from_tokenslist(): - input_tokens = ['foo','bar','---',"'s",'#'] - expected_output = ['foo','bar',"'s"] + input_tokens = ['foo', 'bar', '---', "'s", '#'] + expected_output = ['foo', 'bar', "'s"] preprocessor = TokenPreprocessor(input_tokens) result = preprocessor.remove_special_caracters_from_tokenslist() np.testing.assert_array_equal(result, expected_output) def test_get_stopwords(): - languages_to_test = ['fr','en','ga','zh'] + languages_to_test = ['fr', 'en', 'ga', 'zh'] for lang in languages_to_test: result = get_stopwords(lang) - assert len(result) > 0 and type(result) == list + assert len(result) > 0 and isinstance(result, list) @pytest.mark.parametrize( "input_tokens, expected_output", [ - (['I','like','when','you','move','your','body','!'], ['I', 'move', 'body', '!']) + (['I', 'like', 'when', 'you', 'move', 'your', 'body', '!'], ['I', 'move', 'body', '!']) ], -) +) def test_remove_stopwords_tokens(input_tokens, expected_output): stopwords = get_stopwords('en') preprocessor = TokenPreprocessor(input_tokens) result = preprocessor.remove_stopwords(stopwords) np.testing.assert_array_equal(result, expected_output) + @pytest.mark.parametrize( "input_str, expected_output", [ ('I like when you move your body !', 'I move body !'), ], -) +) def test_remove_stopwords_text(input_str, expected_output): stopwords = get_stopwords('en') preprocessor = TextPreprocessor(input_str) @@ -214,26 +215,21 @@ def test_remove_accents(): @pytest.mark.parametrize( "input_str, expected_str", - [ - ('Les augmentations de rémunérations', - 'Les augmentations de rémunérations'), - ("rénover l'enquête publique pour en faire un vrai outil d'aménagement du territoire et de dialogue social", - "rénover l'enquête publique pour en faire un vrai outil d'aménagement du territoire et de dialogue social"), - ('Limitations de vitesse et sécurité routière', - 'Limitations de vitesse et sécurité routière'), - ('Pour un nouveau contrat citoyen', 'Pour un nouveau contrat citoyen'), - ('Développer les démarches de budget participatif dans les collectivités et associer les citoyens dans la réalisation des projets', - 'Développer les démarches de budget participatif dans les collectivités et associer les citoyens dans la réalisation des projets'), - ('proportienelle', 'proportienelle'), - ('Pour plus de démocratie participative', - 'Pour plus de démocratie participative'), - ('Transparence de la vie public', 'Transparence de la vie public'), - ('18 mois de trop....ca suffit macron', - '18 mois de trop....ca suffit macron'), - ('Egalité devant les infractions routières', - 'Egalité devant les infractions routières') - ], -) + [('Les augmentations de rémunérations', 'Les augmentations de rémunérations'), + ("rénover l'enquête publique pour en faire un vrai outil d'aménagement du territoire et de dialogue social", + "rénover l'enquête publique pour en faire un vrai outil d'aménagement du territoire et de dialogue social"), + ('Limitations de vitesse et sécurité routière', 'Limitations de vitesse et sécurité routière'), + ('Pour un nouveau contrat citoyen', 'Pour un nouveau contrat citoyen'), + ( + 'Développer les démarches de budget participatif dans les collectivités et associer les citoyens'\ + ' dans la réalisation des projets', + 'Développer les démarches de budget participatif dans les collectivités et associer les citoyens'\ + ' dans la réalisation des projets'), + ('proportienelle', 'proportienelle'), + ('Pour plus de démocratie participative', 'Pour plus de démocratie participative'), + ('Transparence de la vie public', 'Transparence de la vie public'), + ('18 mois de trop....ca suffit macron', '18 mois de trop....ca suffit macron'), + ('Egalité devant les infractions routières', 'Egalité devant les infractions routières')],) def test_fix_bad_unicode(input_str, expected_str): preprocessor = TextPreprocessor(input_str) result = preprocessor.fix_bad_unicode() @@ -252,34 +248,35 @@ def test_normalize_whitespace(input_str, expected_str): result = preprocessor.normalize_whitespace() np.testing.assert_equal(result, expected_str) + @pytest.mark.parametrize( "input_str, expected_str", [ ("I can't tell how we've done.", 'I can not tell how we have done.'), ("You're fired. She's nice.", "You are fired. She's nice."), - ("Let's go!",'Let us go!'), - ("You've been missing",'You have been missing'), - ("I'm sure you're leaving",'I am sure you are leaving'), - ("We'll survive.","We will survive.") + ("Let's go!", 'Let us go!'), + ("You've been missing", 'You have been missing'), + ("I'm sure you're leaving", 'I am sure you are leaving'), + ("We'll survive.", "We will survive.") ] - ) +) def test_unpack_english_contractions(input_str, expected_str): preprocessor = TextPreprocessor(input_str) result = preprocessor.unpack_english_contractions() np.testing.assert_equal(result, expected_str) + @pytest.mark.parametrize( "input_str, expected_str", - [ - ("Wan't to contribute to Nautilus? read https://github.com/artefactory/nautilus-nlp/blob/docs/CONTRIBUTING.md first", - "Wan't to contribute to Nautilus? read *URL* first"), - ("The ip address of my VM is http://34.76.182.5:8888", "The ip address of my VM is *URL*"), - ("If you go to http://internet.org, you will find a website hosted by FB.", - "If you go to *URL*, you will find a website hosted by FB."), - ("Ishttps://waaaou.com/ available?",'Is*URL* available?'), - ("mailto:hugo.vasselin@artefact.com",'*URL*') - ] - ) + [( + "Wan't to contribute to Nautilus? read https://github.com/artefactory/nautilus-nlp/blob/docs/CONTRIBUTING.md"\ + " first", + "Wan't to contribute to Nautilus? read *URL* first"), + ("The ip address of my VM is http://34.76.182.5:8888", "The ip address of my VM is *URL*"), + ("If you go to http://internet.org, you will find a website hosted by FB.", + "If you go to *URL*, you will find a website hosted by FB."), + ("Ishttps://waaaou.com/ available?", 'Is*URL* available?'), + ("mailto:hugo.vasselin@artefact.com", '*URL*')]) def test_replace_urls(input_str, expected_str): preprocessor = TextPreprocessor(input_str) result = preprocessor.replace_urls() @@ -289,12 +286,12 @@ def test_replace_urls(input_str, expected_str): @pytest.mark.parametrize( "input_str, expected_str", [ - ("my email:hugo.vasselin@artefact.com","my email:*EMAIL*"), + ("my email:hugo.vasselin@artefact.com", "my email:*EMAIL*"), ("v543143@nwytg.net is a temporary email", "*EMAIL* is a temporary email"), - ("our emails used to be name.surname@artefact.is","our emails used to be *EMAIL*"), - ("chaudasse_du_13@hotmail.fr,C ton email bb?",'*EMAIL*,C ton email bb?') + ("our emails used to be name.surname@artefact.is", "our emails used to be *EMAIL*"), + ("chaudasse_du_13@hotmail.fr,C ton email bb?", '*EMAIL*,C ton email bb?') ] - ) +) def test_replace_emails(input_str, expected_str): preprocessor = TextPreprocessor(input_str) result = preprocessor.replace_emails() @@ -304,38 +301,38 @@ def test_replace_emails(input_str, expected_str): @pytest.mark.parametrize( "input_str, expected_str", [ - ("mon 06 bb: 0625093267","mon 06 bb: *PHONE*"), - ("mon 06 bb: 06.25.09.32.67","mon 06 bb: *PHONE*"), - ("call me at +33625093267","call me at *PHONE*"), - ("call me at +33 6 25 09 32 67","call me at *PHONE*"), - ("call me at +33 625 093 267","call me at *PHONE*"), + ("mon 06 bb: 0625093267", "mon 06 bb: *PHONE*"), + ("mon 06 bb: 06.25.09.32.67", "mon 06 bb: *PHONE*"), + ("call me at +33625093267", "call me at *PHONE*"), + ("call me at +33 6 25 09 32 67", "call me at *PHONE*"), + ("call me at +33 625 093 267", "call me at *PHONE*"), ("if this unit test doesn't work, call 3615 and says 'ROBIN'", "if this unit test doesn't work, call *PHONE* and says 'ROBIN'"), - ('(541) 754-3010 is a US. Phone','*PHONE* is a US. Phone'), - ('+1-541-754-3010 is an international Phone','*PHONE* is an international Phone'), - ('+1-541-754-3010 Dialed in the US','*PHONE* Dialed in the US'), - ('+1-541-754-3010 Dialed from Germany','*PHONE* Dialed from Germany') + ('(541) 754-3010 is a US. Phone', '*PHONE* is a US. Phone'), + ('+1-541-754-3010 is an international Phone', '*PHONE* is an international Phone'), + ('+1-541-754-3010 Dialed in the US', '*PHONE* Dialed in the US'), + ('+1-541-754-3010 Dialed from Germany', '*PHONE* Dialed from Germany') ] - ) +) def test_replace_phone_numbers(input_str, expected_str): preprocessor = TextPreprocessor(input_str) result = preprocessor.replace_phone_numbers( replace_with="*PHONE*", method="detection", country_format_to_detect=phone.SUPPORTED_COUNTRY - ) + ) np.testing.assert_equal(result, expected_str) @pytest.mark.parametrize( "input_str, expected_str", [ - ("123, 3 petits chats","*NUMBER*, *NUMBER* petits chats"), - ("l0ve 2 twa <3","l0ve *NUMBER* twa <*NUMBER*"), - ("Give me 45bucks!","Give me *NUMBER*bucks!"), - ("call me at +33625093267","call me at *NUMBER*") + ("123, 3 petits chats", "*NUMBER*, *NUMBER* petits chats"), + ("l0ve 2 twa <3", "l0ve *NUMBER* twa <*NUMBER*"), + ("Give me 45bucks!", "Give me *NUMBER*bucks!"), + ("call me at +33625093267", "call me at *NUMBER*") ] - ) +) def test_replace_numbers(input_str, expected_str): preprocessor = TextPreprocessor(input_str) result = preprocessor.replace_numbers() @@ -345,39 +342,40 @@ def test_replace_numbers(input_str, expected_str): @pytest.mark.parametrize( "input_str, param, expected_str", [ - ("Give me 23$",None,"Give me 23USD"), - ("Give me 23£",None,"Give me 23GBP"), - ("Give me 23 £",None,"Give me 23 GBP"), - ("Give me 23 €",None,"Give me 23 EUR"), - ("¥ is both japanese yen and Chinese Renminbi","*CUR*","*CUR* is both japanese yen and Chinese Renminbi") + ("Give me 23$", None, "Give me 23USD"), + ("Give me 23£", None, "Give me 23GBP"), + ("Give me 23 £", None, "Give me 23 GBP"), + ("Give me 23 €", None, "Give me 23 EUR"), + ("¥ is both japanese yen and Chinese Renminbi", "*CUR*", "*CUR* is both japanese yen and Chinese Renminbi") ] - ) +) def test_replace_currency_symbols(input_str, param, expected_str): preprocessor = TextPreprocessor(input_str) result = preprocessor.replace_currency_symbols(replace_with=param) np.testing.assert_equal(result, expected_str) + @pytest.mark.parametrize( "input_str, param, expected_str", [ - ("Seriously...",None,"Seriously "), - ("Seriously?",None,"Seriously "), - ("Seriously ?",None,"Seriously "), - ("Seriously???",None,"Seriously "), - ("Seriously?!",None,"Seriously "), - ('"Seriously"',None," Seriously "), - ('Seriously:',None,"Seriously "), - ('Seriously;',None,"Seriously "), - ("'Seriously'",None," Seriously "), - ("'Seriously'",'.,;',"'Seriously'"), - ("Seriously.,.",'.,;',"Seriously "), - ("Seriously...",'.,;',"Seriously "), - ("Seriously.!.",'.,;',"Seriously ! "), - ("hugo.vasselin@artefact.com",'.,;',"hugo vasselin@artefact com"), - ("hugo.vasselin@artefact.com",None,"hugo vasselin artefact com"), - ("hugo-vasselin@artefact.com",None,"hugo vasselin artefact com") + ("Seriously...", None, "Seriously "), + ("Seriously?", None, "Seriously "), + ("Seriously ?", None, "Seriously "), + ("Seriously???", None, "Seriously "), + ("Seriously?!", None, "Seriously "), + ('"Seriously"', None, " Seriously "), + ('Seriously:', None, "Seriously "), + ('Seriously;', None, "Seriously "), + ("'Seriously'", None, " Seriously "), + ("'Seriously'", '.,;', "'Seriously'"), + ("Seriously.,.", '.,;', "Seriously "), + ("Seriously...", '.,;', "Seriously "), + ("Seriously.!.", '.,;', "Seriously ! "), + ("hugo.vasselin@artefact.com", '.,;', "hugo vasselin@artefact com"), + ("hugo.vasselin@artefact.com", None, "hugo vasselin artefact com"), + ("hugo-vasselin@artefact.com", None, "hugo vasselin artefact com") ] - ) +) def test_remove_punct(input_str, param, expected_str): preprocessor = TextPreprocessor(input_str) result = preprocessor.remove_punct(marks=param) @@ -387,16 +385,16 @@ def test_remove_punct(input_str, param, expected_str): @pytest.mark.parametrize( "input_str, expected_str", [ - ("👉👌",""), - ("🎅🏿⌚",""), - ("🥖✊💦",""), - ("✊",""), + ("👉👌", ""), + ("🎅🏿⌚", ""), + ("🥖✊💦", ""), + ("✊", ""), ("J'espère que les 🚓 vont pas lire ce test", - "J'espère que les vont pas lire ce test"), + "J'espère que les vont pas lire ce test"), ("J'espère que les vont pas lire ce test🚓", - "J'espère que les vont pas lire ce test") + "J'espère que les vont pas lire ce test") ] - ) +) def test_remove_emoji(input_str, expected_str): preprocessor = SocialPreprocessor(input_str) result = preprocessor.remove_emoji() @@ -406,13 +404,13 @@ def test_remove_emoji(input_str, expected_str): @pytest.mark.parametrize( "input_str, expected_str", [ - ("👉👌",":backhand_index_pointing_right::OK_hand:"), - ("🎅🏿⌚",":Santa_Claus_dark_skin_tone::watch:"), - ("🥖✊💦",":baguette_bread::raised_fist::sweat_droplets:"), - ("✊",":raised_fist:") + ("👉👌", ":backhand_index_pointing_right::OK_hand:"), + ("🎅🏿⌚", ":Santa_Claus_dark_skin_tone::watch:"), + ("🥖✊💦", ":baguette_bread::raised_fist::sweat_droplets:"), + ("✊", ":raised_fist:") ] - ) +) def test_convert_emoji_to_text(input_str, expected_str): preprocessor = SocialPreprocessor(input_str) result = preprocessor.convert_emoji_to_text() - np.testing.assert_equal(result, expected_str) \ No newline at end of file + np.testing.assert_equal(result, expected_str) From c895d52df6c49f2d8b48e21f09c82562021b529c Mon Sep 17 00:00:00 2001 From: Amale EL HAMRI <amale.elhamri@artefact.com> Date: Thu, 1 Oct 2020 19:01:16 +0200 Subject: [PATCH 314/496] linting tests/test_topic_modeling_short_text.py --- tests/test_topic_modeling_short_text.py | 81 +++++++++++++------------ 1 file changed, 43 insertions(+), 38 deletions(-) diff --git a/tests/test_topic_modeling_short_text.py b/tests/test_topic_modeling_short_text.py index 9a8caac..e4570b4 100644 --- a/tests/test_topic_modeling_short_text.py +++ b/tests/test_topic_modeling_short_text.py @@ -15,13 +15,13 @@ # You should have received a copy of the GNU Lesser General Public License # along with this program; if not, write to the Free Software Foundation, # Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. -from nautilus_nlp.topic_modeling.topic_modeling_short_text import prepare_data, \ - __build_cooccurence_matrix, train_shorttext_model, prepare_data_pyldavis, \ - show_dominant_topic, get_assigned_topics import numpy as np import pytest +from nautilus_nlp.topic_modeling.topic_modeling_short_text import ( + __build_cooccurence_matrix, get_assigned_topics, prepare_data, + prepare_data_pyldavis, show_dominant_topic, train_shorttext_model) -text = ['Cola 1.5L Carrefour', +TEXT = ['Cola 1.5L Carrefour', 'Pepsi Cola Light 1.5L', 'Pepsi Cola Twist Light', 'Cola 1.5L CRF DISC', @@ -36,76 +36,81 @@ 'Spaghetti de maïs 50g sans Glute'] -@pytest.mark.parametrize( - "input_text, expected_output", - [ - (text, [['1.5L', 4], ['Coca-Cola', 3], ['Cola', 4], ['Light', 5], ['Pepsi', 2], ['bio', 3], ['de', 2], ['sans', 3]]), - ([],[]), - (['',''],[]), - ], -) -def test_prepare_data(input_text, expected_output): +@pytest.mark.parametrize("input_text, expected_output", + [(TEXT, + [['1.5L', 4], + ['Coca-Cola', 3], + ['Cola', 4], + ['Light', 5], + ['Pepsi', 2], + ['bio', 3], + ['de', 2], + ['sans', 3]]), + ([], + []), + (['', ''], + []), ],) +def test_prepare_data(input_text, expected_output): assert prepare_data(input_text), expected_output @pytest.mark.parametrize("model_name", ['nmf', 'seanmf']) -@pytest.mark.parametrize("n_topics", [3,0]) -@pytest.mark.parametrize("n_topKeyword", [2,0]) -def test_show_dominant_topic(model_name, n_topics, n_topKeyword): +@pytest.mark.parametrize("n_topics", [3, 0]) +@pytest.mark.parametrize("n_keywords", [2, 0]) +def test_show_dominant_topic(model_name, n_topics, n_keywords): - encoded_text_id, vocab_list, vocab_arr = prepare_data(text) + encoded_text_id, vocab_list, _ = prepare_data(TEXT) model = train_shorttext_model(model_name, encoded_text_id, vocab_list, n_topics=n_topics) - topics, pmi_score = show_dominant_topic(model, encoded_text_id, vocab_list, n_topKeyword=n_topKeyword) + topics, pmi_score = show_dominant_topic(model, encoded_text_id, vocab_list, n_topKeyword=n_keywords) assert len(pmi_score) == n_topics assert len(topics) == n_topics for i in topics.values(): - assert len(i) == n_topKeyword + assert len(i) == n_keywords @pytest.mark.parametrize("model_name", ['nmf', 'seanmf']) @pytest.mark.parametrize("n_topics", [3]) -@pytest.mark.parametrize("n_topKeyword", [2]) -def test_get_assigned_topics(model_name,n_topics,n_topKeyword): - encoded_text_id, vocab_list, vocab_arr = prepare_data(text) - model = train_shorttext_model(model_name,encoded_text_id, vocab_list, n_topics=n_topics) +def test_get_assigned_topics(model_name, n_topics): + encoded_text_id, vocab_list, _ = prepare_data(TEXT) + model = train_shorttext_model(model_name, encoded_text_id, vocab_list, n_topics=n_topics) topics_list = get_assigned_topics(model) - assert len(topics_list) == len(text) + assert len(topics_list) == len(TEXT) for topic_num in topics_list: assert topic_num < n_topics @pytest.mark.parametrize("model_name", ['nmf', 'seanmf']) -@pytest.mark.parametrize("n_topics", [0,3]) +@pytest.mark.parametrize("n_topics", [0, 3]) def test_prepare_data_pyldavis(model_name, n_topics): - encoded_text_id, vocab_list, vocab_arr = prepare_data(text) + encoded_text_id, vocab_list, vocab_arr = prepare_data(TEXT) model = train_shorttext_model(model_name, encoded_text_id, vocab_list, n_topics=n_topics) data = prepare_data_pyldavis(model, encoded_text_id, vocab_arr) - phi= data['topic_term_dists'] - theta= data['doc_topic_dists'] + phi = data['topic_term_dists'] + theta = data['doc_topic_dists'] doc_length_values = data['doc_lengths'] - list_vocab=data['vocab'] + list_vocab = data['vocab'] freq_vocab = data['term_frequency'] assert phi.shape == (n_topics, len(list_vocab)) - assert theta.shape == (len(text), n_topics) - assert len(doc_length_values) == len(text) + assert theta.shape == (len(TEXT), n_topics) + assert len(doc_length_values) == len(TEXT) assert len(list_vocab) == len(freq_vocab) @pytest.mark.parametrize( "input_coded, expected_output", [ - ([[1, 3, 3, 2, 2, 0], [1, 3], [3, 0, 0]], - [[5., 1., 2., 4.], - [1., 2., 2., 3.], - [2., 2., 4., 4.], - [4., 3., 4., 6.]]), + ([[1, 3, 3, 2, 2, 0], [1, 3], [3, 0, 0]], + [[5., 1., 2., 4.], + [1., 2., 2., 3.], + [2., 2., 4., 4.], + [4., 3., 4., 6.]]), - ([[0, 1, 2, 3, 4], [5, 6], [1]], + ([[0, 1, 2, 3, 4], [5, 6], [1]], [[1., 1., 1., 1., 1., 0., 0.], [1., 2., 1., 1., 1., 0., 0.], [1., 1., 1., 1., 1., 0., 0.], @@ -121,7 +126,7 @@ def test_build_cooccurence_matrix(input_coded, expected_output): # The weights denote the occurrences of a word i with a word j in same sentence. flat_list = [item for sublist in input_coded for item in sublist] - nb_vocab = len(set(flat_list)) # number of distinct words + nb_vocab = len(set(flat_list)) # number of distinct words mat = __build_cooccurence_matrix(nb_vocab, input_coded) assert np.array_equal(mat, np.array(expected_output)) From 6b9a5e23dab13ad8e51ca9de9aff3592470395f0 Mon Sep 17 00:00:00 2001 From: Rafaelle AYGALENQ <rafaelle.aygalenq@artefact.com> Date: Mon, 5 Oct 2020 14:01:51 +0200 Subject: [PATCH 315/496] linting biterm_model.py --- nautilus_nlp/topic_modeling/biterm_model.py | 48 ++++++++++++--------- 1 file changed, 28 insertions(+), 20 deletions(-) diff --git a/nautilus_nlp/topic_modeling/biterm_model.py b/nautilus_nlp/topic_modeling/biterm_model.py index 8aa1ab4..22146ac 100644 --- a/nautilus_nlp/topic_modeling/biterm_model.py +++ b/nautilus_nlp/topic_modeling/biterm_model.py @@ -16,14 +16,16 @@ # along with this program; if not, write to the Free Software Foundation, # Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. import numpy as np +import pyLDAvis from biterm.btm import oBTM -from biterm.utility import vec_to_biterms, topic_summuary +from biterm.utility import topic_summuary, vec_to_biterms from sklearn.feature_extraction.text import CountVectorizer -import pyLDAvis class BitermModel: + # pylint: disable=too-many-instance-attributes + def __init__(self, data, nb_topics, nb_iteration, lang): """ Model for topic modelling. Particularly useful for short texts. @@ -43,7 +45,7 @@ def __init__(self, data, nb_topics, nb_iteration, lang): ------- string the text with removed multiple spaces and strip text - """ + """ self.is_int_positive(nb_topics) self.is_int_positive(nb_iteration) self.is_list_of_string(data) @@ -60,19 +62,19 @@ def __init__(self, data, nb_topics, nb_iteration, lang): @staticmethod def is_int_positive(number): """ - Function to check if the input parameter is a integer and positive + Function to check if the input parameter is a integer and positive otherwise raise an error Parameters ---------- number : str - + Returns ------- str: the text with removed multiple spaces and strip text - - """ + + """ if not isinstance(number, int): raise ValueError("Parameter {} has to be an integer".format(number)) if number < 1: @@ -82,11 +84,11 @@ def is_int_positive(number): def is_list_of_string(data): """ Function to check if the input parameter is a list of strings otherwise raise an error - + Parameters ---------- data - + Returns ------- """ @@ -101,15 +103,15 @@ def is_list_of_string(data): def compute_topics(self, nb_word_per_cluster): """ Main function computing the topic modeling, topics - + Parameters ---------- nb_word_per_cluster : positive integer - + Returns ------- - dict : - a dictionary containing the the different topics with the top words + dict : + a dictionary containing the the different topics with the top words and coherence associated """ vec = CountVectorizer(stop_words=self.lang) @@ -120,14 +122,17 @@ def compute_topics(self, nb_word_per_cluster): self._btm = oBTM(num_topics=self.nb_topics, V=self._vocabulary) self._topics = self._btm.fit_transform(biterms, iterations=self.nb_iteration) - results = topic_summuary(self._btm.phi_wz.T, self._vectorize_text, self._vocabulary, nb_word_per_cluster, verbose=False) + results = topic_summuary( + self._btm.phi_wz.T, self._vectorize_text, + self._vocabulary, nb_word_per_cluster, verbose=False + ) return results def get_document_topic(self, index): """ Get the cluster associated to the specified document - + Parameters ---------- index : positive integer @@ -142,10 +147,10 @@ def get_document_topic(self, index): return self._topics[index].argmax() - def save_pyLDAvis_plot_as_html(self, path_to_output='./biterm_pyLDAavis_plot.html'): + def save_pyldavis_plot_as_html(self, path_to_output='./biterm_pyLDAavis_plot.html'): """ Function saving the pyLDAvis plot associated with the compute_topics function - + Parameters ---------- path_to_output : str @@ -153,10 +158,13 @@ def save_pyLDAvis_plot_as_html(self, path_to_output='./biterm_pyLDAavis_plot.htm Returns ------- - """ + """ if self._topics is None or self._btm is None or self._vectorize_text is None or self._vocabulary is None: raise ValueError("Model needs to be trained first") - vis = pyLDAvis.prepare(self._btm.phi_wz.T, self._topics, np.count_nonzero(self._vectorize_text, axis=1), self._vocabulary, - np.sum(self._vectorize_text, axis=0)) + vis = pyLDAvis.prepare( + self._btm.phi_wz.T, self._topics, + np.count_nonzero(self._vectorize_text, axis=1), self._vocabulary, + np.sum(self._vectorize_text, axis=0) + ) pyLDAvis.save_html(vis, path_to_output) From a3ab9a912c1a61555a5b3af3ffb4db7a44060cd7 Mon Sep 17 00:00:00 2001 From: Rafaelle AYGALENQ <rafaelle.aygalenq@artefact.com> Date: Mon, 5 Oct 2020 14:13:11 +0200 Subject: [PATCH 316/496] linting lda.py --- nautilus_nlp/topic_modeling/lda.py | 118 +++++++++++++++-------------- requirements.txt | 1 + 2 files changed, 63 insertions(+), 56 deletions(-) diff --git a/nautilus_nlp/topic_modeling/lda.py b/nautilus_nlp/topic_modeling/lda.py index 686c824..3363805 100644 --- a/nautilus_nlp/topic_modeling/lda.py +++ b/nautilus_nlp/topic_modeling/lda.py @@ -15,36 +15,36 @@ # You should have received a copy of the GNU Lesser General Public License # along with this program; if not, write to the Free Software Foundation, # Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. -import gensim import logging import os + +import gensim +import matplotlib.pyplot as plt import pyLDAvis -import pyLDAvis.gensim +import pyLDAvis.gensim from gensim.models import CoherenceModel from gensim.models.wrappers import LdaMallet -import matplotlib.pyplot as plt - from IPython.display import HTML logging.getLogger("gensim").setLevel(logging.WARNING) def create_dictionary(data): - """ + """ Create a Dictionary encapsulates the mapping between normalized words and their integer ids. - + Parameters ---------- data : list of list of tokens - + Returns ------- list of list of tuples """ return gensim.corpora.Dictionary(data) -def filter_extremes(dictionary, no_below=15, no_above=0.3 , **kwargs) : - """ +def filter_extremes(dictionary, no_below=15, no_above=0.3, **kwargs): + """ Remove very rare and very common words Parameters @@ -62,15 +62,15 @@ def filter_extremes(dictionary, no_below=15, no_above=0.3 , **kwargs) : def create_bow_corpus(data, dictionary): - - """ + + """ Create the corpus: one of the two main inputs to the LDA topic model with the dictionary (id2word) The produced corpus is a mapping of (token_id, token_count). Parameters ---------- data : list of list of tokens - + Returns ------- list of list of tuples @@ -85,7 +85,7 @@ def compute_coherence_values(dictionary, bow_corpus, texts, limit=25, start=2, s """ Compute c_v coherence for various number of topics - /!\ It takes a really long time. + WARNING: It takes a really long time. Parameters: ---------- @@ -102,13 +102,15 @@ def compute_coherence_values(dictionary, bow_corpus, texts, limit=25, start=2, s coherence_values = [] model_list = [] for num_topics in range(start, limit, step): - model = gensim.models.ldamodel.LdaModel(corpus=bow_corpus, - id2word=dictionary, - num_topics=num_topics, - random_state=0, - update_every=5, - chunksize=1000, - passes=10) + model = gensim.models.ldamodel.LdaModel( + corpus=bow_corpus, + id2word=dictionary, + num_topics=num_topics, + random_state=0, + update_every=5, + chunksize=1000, + passes=10 + ) model_list.append(model) coherencemodel = CoherenceModel(model=model, texts=texts, dictionary=dictionary, coherence='c_v') coherence_values.append(coherencemodel.get_coherence()) @@ -142,23 +144,24 @@ def print_coherence_scores(coherence_values, start=2, limit=25, step=4): Print the coherences scores for the ldamodels that had been tested with different number of topics """ x = range(start, limit, step) - for m, cv in zip(x, coherence_values): - print("Num Topics =", m, " has Coherence Value of", round(cv, 4)) + for m, c_value in zip(x, coherence_values): + print("Num Topics =", m, " has Coherence Value of", round(c_value, 4)) ### LdaModel: Gensim & Mallet def train_lda_model(bow_corpus, dictionary, num_topics, model='gensim', mallet_path=None, **kwargs): """ Train the lda model on the corpus - + Parameters ---------- - bow_corpus : iterable of list of tokens. Stream of document vectors or sparse matrix of shape (num_terms, num_documents). + bow_corpus : iterable of list of tokens. Stream of document vectors or sparse matrix of shape \ + (num_terms, num_documents). dictionary: corpora.Dictionary. Mapping from word IDs to words num_topics: int model : str. Precise the topic modeling model wanted, must be "gensim" or "mallet" - mallet_path: str, optionnal if model='gensim', required if model='mallet'. Path to the mallet-2.0.8 file - + mallet_path: str, optionnal if model='gensim', required if model='mallet'. Path to the mallet-2.0.8 file + Returns ------- gensim.ldamodel @@ -168,39 +171,42 @@ def train_lda_model(bow_corpus, dictionary, num_topics, model='gensim', mallet_p elif model == 'mallet': if mallet_path is None: raise ValueError('You must precise the path to the mallet-2.0.8 file that has been downloaded before') - else: - model = train_lda_mallet(bow_corpus, dictionary, num_topics, mallet_path, **kwargs) + model = train_lda_mallet(bow_corpus, dictionary, num_topics, mallet_path, **kwargs) else: raise ValueError('Please enter a valid model name: gensim or mallet') return model def train_lda_gensim(bow_corpus, dictionary, num_topics, **kwargs): - - model = gensim.models.ldamodel.LdaModel(corpus=bow_corpus, id2word=dictionary, num_topics=num_topics, passes=10, minimum_probability=0.001, random_state=0, **kwargs) + model = gensim.models.ldamodel.LdaModel( + corpus=bow_corpus, id2word=dictionary, num_topics=num_topics, + passes=10, minimum_probability=0.001, random_state=0, **kwargs + ) return model def train_lda_mallet(bow_corpus, dictionary, num_topics, mallet_path, **kwargs): - os.environ['MALLET_PATH'] = mallet_path mallet = '$MALLET_PATH/mallet-2.0.8/bin/mallet' - model = gensim.models.wrappers.LdaMallet(mallet, corpus=bow_corpus, id2word=dictionary, num_topics=num_topics, prefix='composant', random_seed=0, **kwargs) + model = gensim.models.wrappers.LdaMallet( + mallet, corpus=bow_corpus, id2word=dictionary, num_topics=num_topics, + prefix='composant', random_seed=0, **kwargs + ) return model def save_model(model, model_name): - """ + """ Save the model that has been trained. The model will be saved on your current emplacement. - + Parameters ---------- model: ldamodel - model_name: str. + model_name: str. Name the model that will be saved """ return model.save(os.path.join(model_name)) -def load_model(model_path,model_name, model='gensim', model_prefix='composant'): +def load_model(model_path, model_name, model='gensim', model_prefix='composant'): """ Detected the language of a text @@ -213,19 +219,19 @@ def load_model(model_path,model_name, model='gensim', model_prefix='composant'): model : str Precise the topic modeling model wanted, must be "gensim" or "mallet" model_prefix : str - By default, 'composant' default prefix used while saving the mallet model with train_lda_model function. - + By default, 'composant' default prefix used while saving the mallet model with train_lda_model function. + Returns ------- - is_reliable : + is_reliable : is the top language is much better than 2nd best language? - language: + language: 2-letter code for the language of the text """ - if model =='gensim': - ldamodel = gensim.models.LdaModel.load(os.path.join(model_path,model_name)) - elif model =='mallet': - ldamodel = LdaMallet.load(os.path.join(model_path,model_name)) + if model == 'gensim': + ldamodel = gensim.models.LdaModel.load(os.path.join(model_path, model_name)) + elif model == 'mallet': + ldamodel = LdaMallet.load(os.path.join(model_path, model_name)) if model_prefix is not None: ldamodel.prefix = model_path+'/'+ model_prefix else: @@ -241,17 +247,17 @@ def fit_data(model, bow): def visualize_topics(model, bow_corpus, dictionary, model_type=None): - """ + """ Visualize the topics-keywords with the pyLDAvis interactive chart. (Work well in notebook) - + Parameters ---------- model: LDA model: gensim or mallet - bow_corpus : iterable of list of tokens. + bow_corpus : iterable of list of tokens. dictionary: corpora.Dictionary. Dictionary encapsulates the mapping between normalized words and their integer ids. model : str. Precise the topic modeling model used, must be "gensim" or "mallet" - + Returns: ---------- 3D interactive chart @@ -263,25 +269,25 @@ def visualize_topics(model, bow_corpus, dictionary, model_type=None): elif model_type is None: raise ValueError('You forgot to precise your model type, it must be: gensim or mallet') else: - raise ValueError('Please enter a valid model name: gensim or mallet') + raise ValueError('Please enter a valid model name: gensim or mallet') return pyLDAvis.gensim.prepare(model_vis, bow_corpus, dictionary) def save_pyldavis(pyldavis, vis_path, vis_name): - """ + """ Save the pyldavis interactive chart - + Parameters ---------- pyldavis: pyLDAvis._prepare.PreparedData vis_path: str vis_name: str - """ + """ return pyLDAvis.save_html(pyldavis, os.path.join(vis_path, vis_name + '{}'.format('.html'))) def show_pyldavis(vis_path, vis_name): - """ + """ Display the HTML of the saved pyldavis interactive chart Parameters @@ -293,7 +299,7 @@ def show_pyldavis(vis_path, vis_name): def show_dominant_topic(model, bow_corpus, topic_number=1, topn=5): """ Print the dominant topics in the document, its score and the topics' top keywords. - + Quick way to interpret the topics Parameters @@ -306,10 +312,10 @@ def show_dominant_topic(model, bow_corpus, topic_number=1, topn=5): """ i = 0 - for index, score in sorted(model[bow_corpus], key=lambda tup: -1*tup[1]): + for index, score in sorted(model[bow_corpus], key=lambda tup: -1*tup[1]): weight = model.show_topic(index, topn=topn) keywords = [i[0] for i in weight] print("Score: {}\t Topic: {}".format(score, keywords)) - i +=1 + i += 1 if i == topic_number: break diff --git a/requirements.txt b/requirements.txt index 87479ee..8de1a43 100644 --- a/requirements.txt +++ b/requirements.txt @@ -40,3 +40,4 @@ emoji>=0.5.2 summa==1.2.0 biterm==0.1.5 nlpaug==1.0.1 +IPython==7.18.1 From 812b49e36e41e21cdd0f52da796330ce7fe581ab Mon Sep 17 00:00:00 2001 From: Rafaelle AYGALENQ <rafaelle.aygalenq@artefact.com> Date: Mon, 5 Oct 2020 14:17:05 +0200 Subject: [PATCH 317/496] fix ipython --- requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements.txt b/requirements.txt index 8de1a43..d71d229 100644 --- a/requirements.txt +++ b/requirements.txt @@ -40,4 +40,4 @@ emoji>=0.5.2 summa==1.2.0 biterm==0.1.5 nlpaug==1.0.1 -IPython==7.18.1 +ipython==7.18.1 From aaa4065b9af59f74ef607256b88fd6ed9be59d43 Mon Sep 17 00:00:00 2001 From: Rafaelle AYGALENQ <rafaelle.aygalenq@artefact.com> Date: Mon, 5 Oct 2020 14:19:49 +0200 Subject: [PATCH 318/496] fix ipython version --- requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements.txt b/requirements.txt index d71d229..c485909 100644 --- a/requirements.txt +++ b/requirements.txt @@ -40,4 +40,4 @@ emoji>=0.5.2 summa==1.2.0 biterm==0.1.5 nlpaug==1.0.1 -ipython==7.18.1 +ipython==7.16.1 From ad49727018b8318ff86e1564cbc02277c1317a0d Mon Sep 17 00:00:00 2001 From: Rafaelle AYGALENQ <rafaelle.aygalenq@artefact.com> Date: Mon, 5 Oct 2020 14:37:31 +0200 Subject: [PATCH 319/496] linting nmf_model.py --- nautilus_nlp/topic_modeling/nmf_model.py | 56 ++++++++++++------------ pylintrc | 2 +- 2 files changed, 29 insertions(+), 29 deletions(-) diff --git a/nautilus_nlp/topic_modeling/nmf_model.py b/nautilus_nlp/topic_modeling/nmf_model.py index 005c09b..8d2650c 100644 --- a/nautilus_nlp/topic_modeling/nmf_model.py +++ b/nautilus_nlp/topic_modeling/nmf_model.py @@ -20,21 +20,19 @@ from numpy.linalg import norm from tqdm import tqdm -''' -Topic Modeling via NMF -''' -class NMF(object): +class NMF: + + # pylint: disable=too-many-instance-attributes + def __init__( - self, - A, IW=[], IH=[], - n_topic=10, max_iter=100, max_err=1e-3, - rand_init=True): + self, mat_a, mat_iw, mat_ih, n_topic=10, + max_iter=100, max_err=1e-3, rand_init=True): """ The objective of the NMF model is to approximate the term-document matrix A by two lower-rank matrices W and H. The process is iterative and we denote IW and IH the the matrix W and H that are updated at each step. - :param A: The term-document matrix + :param a: The term-document matrix :param IW: topics Matrix, each column vector W(:,k) represents the k-th topic in terms of M keywords and its elements are the weights of the corresponding keywords. :param IH: The row vector H(j,:) is the latent representation for document j in terms of K topics @@ -43,9 +41,11 @@ def __init__( :param max_err: maximum error under which we consider that the loop converged :param rand_init: random init boolean """ - self.A = A - self.n_row = A.shape[0] - self.n_col = A.shape[1] + self.mat_a = mat_a + self.mat_iw = mat_iw + self.mat_ih = mat_ih + self.n_row = mat_a.shape[0] + self.n_col = mat_a.shape[1] self.n_topic = n_topic self.max_iter = max_iter @@ -61,13 +61,13 @@ def nmf_mat_init(self, rand_init): :param rand_init: Boolean indicating initial random init """ if rand_init: - self.W = np.random.random((self.n_row, self.n_topic)) - self.H = np.random.random((self.n_col, self.n_topic)) + self.mat_w = np.random.random((self.n_row, self.n_topic)) + self.mat_h = np.random.random((self.n_col, self.n_topic)) else: - self.W = IW - self.H = IH + self.mat_w = self.mat_iw + self.mat_h = self.mat_ih for k in range(self.n_topic): - self.W[:, k] /= norm(self.W[:, k]) + self.mat_w[:, k] /= norm(self.mat_w[:, k]) def nmf_iter(self): """ @@ -94,25 +94,25 @@ def nmf_solver(self): ''' epss = 1e-20 - HtH = self.H.T.dot(self.H) - AH = self.A.dot(self.H) + mat_hth = self.mat_h.T.dot(self.mat_h) + mat_ah = self.mat_a.dot(self.mat_h) for k in range(self.n_topic): - tmpW = self.W[:, k] * HtH[k, k] + AH[:, k] - np.dot(self.W, HtH[:, k]) - self.W[:, k] = np.maximum(tmpW, epss) - self.W[:, k] /= norm(self.W[:, k]) + epss + tmp_w = self.mat_w[:, k] * mat_hth[k, k] + mat_ah[:, k] - np.dot(self.mat_w, mat_hth[:, k]) + self.mat_w[:, k] = np.maximum(tmp_w, epss) + self.mat_w[:, k] /= norm(self.mat_w[:, k]) + epss - WtW = self.W.T.dot(self.W) - AtW = self.A.T.dot(self.W) + mat_wtw = self.mat_w.T.dot(self.mat_w) + mat_atw = self.mat_a.T.dot(self.mat_w) for k in range(self.n_topic): - self.H[:, k] = self.H[:, k] * WtW[k, k] + AtW[:, k] - np.dot(self.H, WtW[:, k]) - self.H[:, k] = np.maximum(self.H[:, k], epss) + self.mat_h[:, k] = self.mat_h[:, k] * mat_wtw[k, k] + mat_atw[:, k] - np.dot(self.mat_h, mat_wtw[:, k]) + self.mat_h[:, k] = np.maximum(self.mat_h[:, k], epss) def nmf_loss(self): - loss = norm(self.A - np.dot(self.W, np.transpose(self.H)), 'fro') ** 2 / 2.0 + loss = norm(self.mat_a - np.dot(self.mat_w, np.transpose(self.mat_h)), 'fro') ** 2 / 2.0 return loss def get_loss(self): return np.array(self.loss_hist) def get_decomposition_matrix(self): - return self.W, self.H + return self.mat_w, self.mat_h diff --git a/pylintrc b/pylintrc index f16004a..54d4c85 100644 --- a/pylintrc +++ b/pylintrc @@ -291,7 +291,7 @@ ignore-mixin-members=yes # (useful for modules/projects where namespaces are manipulated during runtime # and thus existing member attributes cannot be deduced by static analysis. It # supports qualified module names, as well as Unix pattern matching. -ignored-modules= +ignored-modules=numpy # List of classes names for which member attributes should not be checked # (useful for classes with attributes dynamically set). This supports can work From ba6505e2ab6712a82023b2d050642a5cecb74a7f Mon Sep 17 00:00:00 2001 From: Rafaelle AYGALENQ <rafaelle.aygalenq@artefact.com> Date: Mon, 5 Oct 2020 14:41:44 +0200 Subject: [PATCH 320/496] update docstring --- nautilus_nlp/topic_modeling/nmf_model.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/nautilus_nlp/topic_modeling/nmf_model.py b/nautilus_nlp/topic_modeling/nmf_model.py index 8d2650c..1a9f38d 100644 --- a/nautilus_nlp/topic_modeling/nmf_model.py +++ b/nautilus_nlp/topic_modeling/nmf_model.py @@ -32,10 +32,10 @@ def __init__( The objective of the NMF model is to approximate the term-document matrix A by two lower-rank matrices W and H. The process is iterative and we denote IW and IH the the matrix W and H that are updated at each step. - :param a: The term-document matrix - :param IW: topics Matrix, each column vector W(:,k) represents the k-th topic in terms of M keywords + :param mat_a: The term-document matrix + :param mat_iw: topics Matrix, each column vector W(:,k) represents the k-th topic in terms of M keywords and its elements are the weights of the corresponding keywords. - :param IH: The row vector H(j,:) is the latent representation for document j in terms of K topics + :param mat_ih: The row vector H(j,:) is the latent representation for document j in terms of K topics :param n_topic: Number of selected topics :param max_iter: Maximum number of iterations to update W and H :param max_err: maximum error under which we consider that the loop converged From 3a0afe28247b90ceab82169c4534a4f70152e228 Mon Sep 17 00:00:00 2001 From: Rafaelle AYGALENQ <rafaelle.aygalenq@artefact.com> Date: Mon, 5 Oct 2020 15:02:53 +0200 Subject: [PATCH 321/496] linting seanmf_model.py and fix tests --- nautilus_nlp/topic_modeling/seanmf_model.py | 101 +++++++++--------- .../topic_modeling_short_text.py | 5 + 2 files changed, 55 insertions(+), 51 deletions(-) diff --git a/nautilus_nlp/topic_modeling/seanmf_model.py b/nautilus_nlp/topic_modeling/seanmf_model.py index 7248148..9513435 100644 --- a/nautilus_nlp/topic_modeling/seanmf_model.py +++ b/nautilus_nlp/topic_modeling/seanmf_model.py @@ -22,23 +22,23 @@ from tqdm import tqdm -class SeaNMF(object): +class SeaNMF: + + # pylint: disable=too-many-instance-attributes + def __init__( - self, - A, S, - IW=[], IWc=[], IH=[], - alpha=1.0, beta=0.1, n_topic=10, max_iter=100, max_err=1e-3, - rand_init=True, fix_seed=False): + self, mat_a, mat_s, mat_iw, mat_iwc, mat_ih, alpha=1.0, beta=0.1, n_topic=10, + max_iter=100, max_err=1e-3, rand_init=True, fix_seed=False): """ Seanmf is a topic modeling algorithm, paper: http://dmkd.cs.vt.edu/papers/WWW18.pdf. It finds an approximation to the term-document matrix A by two lower-rank matrices W and H, at each iteration a context matrix Wc are computed and used to update W. - :param A: document term matrix - :param S: Word-context (semantic) correlation matrix - :param IW: topics Matrix, each column vector W(:,k) represents the k-th topic in terms of M keywords + :param mat_a: document term matrix + :param mat_s: Word-context (semantic) correlation matrix + :param mat_iw: topics Matrix, each column vector W(:,k) represents the k-th topic in terms of M keywords and its elements are the weights of the corresponding keywords. - :param IWc: Latent factor matrix of contexts. - :param IH: The row vector H(j,:) is the latent representation for document j in terms of K topics + :param mat_iwc: Latent factor matrix of contexts. + :param mat_ih: The row vector H(j,:) is the latent representation for document j in terms of K topics :param alpha: Seanmf algorithm parameter :param beta: Seanmf algorithm parameter :param n_topic: Number of selected topics @@ -50,37 +50,37 @@ def __init__( if fix_seed: np.random.seed(0) - self.A = A - self.S = S + self.mat_a = mat_a + self.mat_s = mat_s - self.n_row = A.shape[0] - self.n_col = A.shape[1] + self.n_row = mat_a.shape[0] + self.n_col = mat_a.shape[1] self.n_topic = n_topic self.max_iter = max_iter self.alpha = alpha self.beta = beta - self.B = np.ones([self.n_topic, 1]) + self.mat_b = np.ones([self.n_topic, 1]) self.max_err = max_err - self.snmf_mat_init(rand_init, IW, IWc, IH) + self.snmf_mat_init(rand_init, mat_iw, mat_iwc, mat_ih) self.snmf_iter() - def snmf_mat_init(self, rand_init, IW=[], IWc=[], IH=[]): + def snmf_mat_init(self, rand_init, mat_iw, mat_iwc, mat_ih): """ Init Matrices W,Wc and H initially either randomly or using existing IW,IWc IH matrices taken when iterating. :param rand_init: Boolean indicating initial random init """ if rand_init: - self.W = np.random.random((self.n_row, self.n_topic)) - self.Wc = np.random.random((self.n_row, self.n_topic)) - self.H = np.random.random((self.n_col, self.n_topic)) + self.mat_w = np.random.random((self.n_row, self.n_topic)) + self.mat_wc = np.random.random((self.n_row, self.n_topic)) + self.mat_h = np.random.random((self.n_col, self.n_topic)) else: - self.W = IW - self.Wc = IWc - self.H = IH + self.mat_w = mat_iw + self.mat_wc = mat_iwc + self.mat_h = mat_ih for k in range(self.n_topic): - self.W[:, k] /= norm(self.W[:, k]) - self.Wc[:, k] /= norm(self.Wc[:, k]) + self.mat_w[:, k] /= norm(self.mat_w[:, k]) + self.mat_wc[:, k] /= norm(self.mat_wc[:, k]) def snmf_iter(self): """ @@ -101,48 +101,47 @@ def snmf_iter(self): def snmf_solver(self): ''' using BCD framework - Alogorithm 1: Equations to update W, wc, H are described in the paper + Alogorithm 1: Equations to update W, wc, H matrices are described in the paper http://dmkd.cs.vt.edu/papers/WWW18.pdf ''' epss = 1e-20 # Update W - AH = np.dot(self.A, self.H) - SWc = np.dot(self.S, self.Wc) - HtH = np.dot(self.H.T, self.H) - WctWc = np.dot(self.Wc.T, self.Wc) - W1 = self.W.dot(self.B) + mat_ah = np.dot(self.mat_a, self.mat_h) + mat_swc = np.dot(self.mat_s, self.mat_wc) + mat_hth = np.dot(self.mat_h.T, self.mat_h) + mat_wctwc = np.dot(self.mat_wc.T, self.mat_wc) + mat_w1 = self.mat_w.dot(self.mat_b) for k in range(self.n_topic): - num0 = HtH[k, k] * self.W[:, k] + self.alpha * WctWc[k, k] * self.W[:, k] - num1 = AH[:, k] + self.alpha * SWc[:, k] - num2 = np.dot(self.W, HtH[:, k]) + self.alpha * np.dot(self.W, WctWc[:, k]) + self.beta * W1[0] - self.W[:, k] = num0 + num1 - num2 - self.W[:, k] = np.maximum(self.W[:, k], epss) # project > 0 - self.W[:, k] /= norm(self.W[:, k]) + epss # normalize + num0 = mat_hth[k, k] * self.mat_w[:, k] + self.alpha * mat_wctwc[k, k] * self.mat_w[:, k] + num1 = mat_ah[:, k] + self.alpha * mat_swc[:, k] + num2 = np.dot(self.mat_w, mat_hth[:, k]) + self.alpha * np.dot( + self.mat_w, mat_wctwc[:, k]) + self.beta * mat_w1[0] + self.mat_w[:, k] = num0 + num1 - num2 + self.mat_w[:, k] = np.maximum(self.mat_w[:, k], epss) # project > 0 + self.mat_w[:, k] /= norm(self.mat_w[:, k]) + epss # normalize # Update Wc - WtW = self.W.T.dot(self.W) - StW = np.dot(self.S, self.W) + mat_wtw = self.mat_w.T.dot(self.mat_w) + mat_stw = np.dot(self.mat_s, self.mat_w) for k in range(self.n_topic): - self.Wc[:, k] = self.Wc[:, k] + StW[:, k] - np.dot(self.Wc, WtW[:, k]) - self.Wc[:, k] = np.maximum(self.Wc[:, k], epss) + self.mat_wc[:, k] = self.mat_wc[:, k] + mat_stw[:, k] - np.dot(self.mat_wc, mat_wtw[:, k]) + self.mat_wc[:, k] = np.maximum(self.mat_wc[:, k], epss) # Update H - AtW = np.dot(self.A.T, self.W) + mat_atw = np.dot(self.mat_a.T, self.mat_w) for k in range(self.n_topic): - self.H[:, k] = self.H[:, k] + AtW[:, k] - np.dot(self.H, WtW[:, k]) - self.H[:, k] = np.maximum(self.H[:, k], epss) + self.mat_h[:, k] = self.mat_h[:, k] + mat_atw[:, k] - np.dot(self.mat_h, mat_wtw[:, k]) + self.mat_h[:, k] = np.maximum(self.mat_h[:, k], epss) def snmf_loss(self): - loss = norm(self.A - np.dot(self.W, np.transpose(self.H)), 'fro') ** 2 / 2.0 + loss = norm(self.mat_a - np.dot(self.mat_w, np.transpose(self.mat_h)), 'fro') ** 2 / 2.0 if self.alpha > 0: - loss += self.alpha * norm(np.dot(self.W, np.transpose(self.Wc)) - self.S, 'fro') ** 2 / 2.0 + loss += self.alpha * norm(np.dot(self.mat_w, np.transpose(self.mat_wc)) - self.mat_s, 'fro') ** 2 / 2.0 if self.beta > 0: - loss += self.beta * norm(self.W, 1) ** 2 / 2.0 + loss += self.beta * norm(self.mat_w, 1) ** 2 / 2.0 return loss def get_decomposition_matrix(self): # Wc was not considered to keep same structure as NMF - return self.W, self.H - - + return self.mat_w, self.mat_h diff --git a/nautilus_nlp/topic_modeling/topic_modeling_short_text.py b/nautilus_nlp/topic_modeling/topic_modeling_short_text.py index 951f5fb..630a91a 100644 --- a/nautilus_nlp/topic_modeling/topic_modeling_short_text.py +++ b/nautilus_nlp/topic_modeling/topic_modeling_short_text.py @@ -82,6 +82,8 @@ def train_shorttext_model(model_name, encoded_text_id, vocab_list, n_topics=20, dt_mat = __build_doc_term_matrix(n_terms, n_docs, encoded_text_id) model = NMF( dt_mat, + mat_iw=[], + mat_ih=[], n_topic=n_topics, max_iter=max_iter, max_err=max_err) @@ -95,6 +97,9 @@ def train_shorttext_model(model_name, encoded_text_id, vocab_list, n_topics=20, dt_mat = __build_doc_term_matrix(n_terms, n_docs, encoded_text_id) model = SeaNMF( dt_mat, SS, + mat_iw=[], + mat_iwc=[], + mat_ih=[], alpha=alpha, beta=beta, n_topic=n_topics, From 3cd41be4c365b47721095a1265a51bba2bd0ed83 Mon Sep 17 00:00:00 2001 From: Rafaelle AYGALENQ <rafaelle.aygalenq@artefact.com> Date: Mon, 5 Oct 2020 15:21:55 +0200 Subject: [PATCH 322/496] linting topic_modeling_short_text.py --- .../topic_modeling_short_text.py | 117 +++++++++--------- tests/test_topic_modeling_short_text.py | 2 +- 2 files changed, 57 insertions(+), 62 deletions(-) diff --git a/nautilus_nlp/topic_modeling/topic_modeling_short_text.py b/nautilus_nlp/topic_modeling/topic_modeling_short_text.py index 630a91a..a31a772 100644 --- a/nautilus_nlp/topic_modeling/topic_modeling_short_text.py +++ b/nautilus_nlp/topic_modeling/topic_modeling_short_text.py @@ -18,10 +18,11 @@ import re from collections import Counter from itertools import product -from nautilus_nlp.topic_modeling.nmf_model import * -from nautilus_nlp.topic_modeling.seanmf_model import * + import numpy as np import pyLDAvis +from nautilus_nlp.topic_modeling.nmf_model import NMF +from nautilus_nlp.topic_modeling.seanmf_model import SeaNMF def prepare_data(text, vocab_min_count=1, vocab_max_size=10000): @@ -36,9 +37,9 @@ def prepare_data(text, vocab_min_count=1, vocab_max_size=10000): vocab = {} # Tokens_list is a list of sub-lists where each sub-list contains a sentences' tokens. - tokens_list=[] + tokens_list = [] for sentence in text: - sentence = re.split('\s', sentence) + sentence = re.split(r'\s', sentence) tokens_list.append(sentence) vocab = dict(Counter(x for xs in tokens_list for x in xs)) @@ -48,21 +49,23 @@ def prepare_data(text, vocab_min_count=1, vocab_max_size=10000): vocab_arr = vocab_arr[:vocab_max_size] vocab_arr = sorted(vocab_arr) - vocab_list = list(map(lambda x:x[0], vocab_arr)) + vocab_list = list(map(lambda x: x[0], vocab_arr)) # Create Vocab to ID dictionnary vocab2id = {itm[1][0]: itm[0] for itm in enumerate(vocab_arr)} # Create ID representation of text (ie: each sentence is a list of vocabId ) encoded_text_id = [] for sentence in text: - sentence = re.split('\s', sentence) + sentence = re.split(r'\s', sentence) sentence = [int(vocab2id[wd]) for wd in sentence if wd in vocab2id] encoded_text_id.append(sentence) return encoded_text_id, vocab_list, vocab_arr -def train_shorttext_model(model_name, encoded_text_id, vocab_list, n_topics=20, max_iter=20, max_err=0.1, alpha=0, beta=0): +def train_shorttext_model( + model_name, encoded_text_id, vocab_list, n_topics=20, + max_iter=20, max_err=0.1, alpha=0, beta=0): """ :param model_name: string = 'nmf' or 'seanmf' :param encoded_text_id: list of encoded sentences @@ -90,13 +93,13 @@ def train_shorttext_model(model_name, encoded_text_id, vocab_list, n_topics=20, elif model_name == 'seanmf': # Calculate co-occurence matrix - cm = __build_cooccurence_matrix(n_terms, encoded_text_id) + cooc_mat = __build_cooccurence_matrix(n_terms, encoded_text_id) # Calculate PPMI - SS = __calulate_PPMI(cm, n_terms) + mat_ss = __calculate_ppmi(cooc_mat, n_terms) # Build doc-term matrix dt_mat = __build_doc_term_matrix(n_terms, n_docs, encoded_text_id) model = SeaNMF( - dt_mat, SS, + dt_mat, mat_ss, mat_iw=[], mat_iwc=[], mat_ih=[], @@ -114,15 +117,7 @@ def train_shorttext_model(model_name, encoded_text_id, vocab_list, n_topics=20, return model -def __build_doc_term_matrix(n_terms, n_docs, encoded_text_id): - dt_mat = np.zeros([n_terms, n_docs]) - for k in range(n_docs): - for j in encoded_text_id[k]: - dt_mat[j, k] += 1.0 - return dt_mat - - -def show_dominant_topic(model, encoded_text_id, vocab_list, n_topKeyword =10): +def show_dominant_topic(model, encoded_text_id, vocab_list, n_top_keyword=10): """ Computes the PMi score for each topic and the topKeywords describing each of them. :param model: trained NMF model @@ -134,23 +129,23 @@ def show_dominant_topic(model, encoded_text_id, vocab_list, n_topKeyword =10): dt_mat = __build_cooccurence_matrix(n_terms=len(vocab_list), encoded_text_id=encoded_text_id) np.fill_diagonal(dt_mat, 0) - W,_ = model.get_decomposition_matrix() - n_topic = W.shape[1] - PMI_arr = [] + mat_w, _ = model.get_decomposition_matrix() + n_topic = mat_w.shape[1] + pmi_arr = [] for k in range(n_topic): - top_keywords_index = W[:, k].argsort()[::-1][:n_topKeyword] - PMI_arr.append(__calculate_PMI(dt_mat, top_keywords_index)) + top_keywords_index = mat_w[:, k].argsort()[::-1][:n_top_keyword] + pmi_arr.append(__calculate_pmi(dt_mat, top_keywords_index)) - index = np.argsort(PMI_arr) + index = np.argsort(pmi_arr) topics = {} pmi_score = {} for k in index: words = [] - for w in np.argsort(W[:, k])[::-1][:n_topKeyword]: + for w in np.argsort(mat_w[:, k])[::-1][:n_top_keyword]: words.append(vocab_list[w]) # Complete the topic and the score dicts. Format {Topic_number: words or score} topics[k] = words - pmi_score[k] = PMI_arr[k] + pmi_score[k] = pmi_arr[k] return topics, pmi_score @@ -162,10 +157,10 @@ def get_assigned_topics(model): :return topics_list: list having the same length as the training text containing topics assigned to each sentence. """ - _, H = model.get_decomposition_matrix() + _, mat_h = model.get_decomposition_matrix() # The weights of the H matrix are converted into probabilities - H_probs = H / H.sum(axis=1, keepdims=True) - topics_list = list(np.argmax(H_probs, axis=1)) + h_probs = mat_h / mat_h.sum(axis=1, keepdims=True) + topics_list = list(np.argmax(h_probs, axis=1)) return topics_list @@ -193,20 +188,20 @@ def prepare_data_pyldavis(model, encoded_text_id, vocab_arr): """ # 1 List of documents lengths - doc_length_values=[] + doc_length_values = [] for doc in encoded_text_id: doc_length_values.append(len(doc)) # 2 List of vocab list_vocab = list(map(lambda x: x[0], vocab_arr)) # 3 List of vocab. Frequency freq_vocab = list(map(lambda x: x[1], vocab_arr)) - W, H = model.get_decomposition_matrix() + mat_w, mat_h = model.get_decomposition_matrix() # Normlize the decomposition to get probabilities - W_probs = W / W.sum(axis=1, keepdims=True) + w_probs = mat_w / mat_w.sum(axis=1, keepdims=True) # 4 topic term matrix phi - phi = W_probs.T + phi = w_probs.T # 5 document term matrix theta - theta = H / H.sum(axis=1, keepdims=True) + theta = mat_h / mat_h.sum(axis=1, keepdims=True) data = {'topic_term_dists': phi, 'doc_topic_dists': theta, @@ -236,21 +231,21 @@ def __build_cooccurence_matrix(n_terms, encoded_text_id): return res -def __calulate_PPMI(cm, n_terms): - D1 = np.sum(cm) - print('D1= ', D1) - SS = D1 * cm - print('SS= ',SS) +def __calculate_ppmi(cooc_mat, n_terms): + mat_d1 = np.sum(cooc_mat) + print('D1= ', mat_d1) + mat_ss = mat_d1 * cooc_mat + print('SS= ', mat_ss) for k in range(n_terms): - SS[k] /= np.sum(cm[k]) + mat_ss[k] /= np.sum(cooc_mat[k]) for k in range(n_terms): - SS[:, k] /= np.sum(cm[:, k]) - print('SS = ', SS ) - cm = [] # release memory - SS[SS == 0] = 1.0 - SS = np.log(SS) - SS[SS < 0.0] = 0.0 - return SS + mat_ss[:, k] /= np.sum(cooc_mat[:, k]) + print('SS = ', mat_ss) + cooc_mat = [] # release memory + mat_ss[mat_ss == 0] = 1.0 + mat_ss = np.log(mat_ss) + mat_ss[mat_ss < 0.0] = 0.0 + return mat_ss def __build_doc_term_matrix(n_terms, n_docs, encoded_text_id): @@ -261,25 +256,25 @@ def __build_doc_term_matrix(n_terms, n_docs, encoded_text_id): return dt_mat -def __calculate_PMI(AA, topKeywordsIndex): +def __calculate_pmi(mat_aa, top_keywords_index): ''' Method to compute PMi score Reference: Short and Sparse Text Topic Modeling via Self-Aggregation ''' - D1 = np.sum(AA) - n_tp = len(topKeywordsIndex) - PMI = [] - for index1 in topKeywordsIndex: - for index2 in topKeywordsIndex: + mat_d1 = np.sum(mat_aa) + n_tp = len(top_keywords_index) + mat_pmi = [] + for index1 in top_keywords_index: + for index2 in top_keywords_index: if index2 < index1: - if AA[index1, index2] == 0: - PMI.append(0.0) + if mat_aa[index1, index2] == 0: + mat_pmi.append(0.0) else: - C1 = np.sum(AA[index1]) - C2 = np.sum(AA[index2]) - PMI.append(np.log(AA[index1,index2]*D1/C1/C2)) - avg_PMI = 2.0*np.sum(PMI)/float(n_tp)/(float(n_tp)-1.0) + mat_c1 = np.sum(mat_aa[index1]) + mat_c2 = np.sum(mat_aa[index2]) + mat_pmi.append(np.log(mat_aa[index1,index2]*mat_d1/mat_c1/mat_c2)) + avg_pmi = 2.0*np.sum(mat_pmi)/float(n_tp)/(float(n_tp)-1.0) - return avg_PMI + return avg_pmi diff --git a/tests/test_topic_modeling_short_text.py b/tests/test_topic_modeling_short_text.py index e4570b4..2265738 100644 --- a/tests/test_topic_modeling_short_text.py +++ b/tests/test_topic_modeling_short_text.py @@ -62,7 +62,7 @@ def test_show_dominant_topic(model_name, n_topics, n_keywords): encoded_text_id, vocab_list, _ = prepare_data(TEXT) model = train_shorttext_model(model_name, encoded_text_id, vocab_list, n_topics=n_topics) - topics, pmi_score = show_dominant_topic(model, encoded_text_id, vocab_list, n_topKeyword=n_keywords) + topics, pmi_score = show_dominant_topic(model, encoded_text_id, vocab_list, n_top_keyword=n_keywords) assert len(pmi_score) == n_topics assert len(topics) == n_topics From 5357ac91bbd3073a208a71edd84c438f9048f552 Mon Sep 17 00:00:00 2001 From: Amale EL HAMRI <amale.elhamri@artefact.com> Date: Mon, 5 Oct 2020 15:43:16 +0200 Subject: [PATCH 323/496] adding linting to CI --- .travis.yml | 4 +++- tests/__init__.py | 0 2 files changed, 3 insertions(+), 1 deletion(-) create mode 100644 tests/__init__.py diff --git a/.travis.yml b/.travis.yml index d2220c0..e99a71f 100644 --- a/.travis.yml +++ b/.travis.yml @@ -33,4 +33,6 @@ install: - pip install -r requirements.txt - pip install -e . script: - - pytest tests/* \ No newline at end of file + - pylint nautilus_nlp/ + - pylint tests/ + - pytest tests/* diff --git a/tests/__init__.py b/tests/__init__.py new file mode 100644 index 0000000..e69de29 From babcb3c2162ea763471fb2c728b13a0a9be0742d Mon Sep 17 00:00:00 2001 From: Amale EL HAMRI <amale.elhamri@artefact.com> Date: Mon, 5 Oct 2020 17:59:33 +0200 Subject: [PATCH 324/496] adding pylint to requirements --- requirements.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/requirements.txt b/requirements.txt index c485909..00dc863 100644 --- a/requirements.txt +++ b/requirements.txt @@ -41,3 +41,4 @@ summa==1.2.0 biterm==0.1.5 nlpaug==1.0.1 ipython==7.16.1 +pylint==2.4.4 From 91577321dd71b4f6296c24c3e81ade7785a529a9 Mon Sep 17 00:00:00 2001 From: Amale EL HAMRI <amale.elhamri@artefact.com> Date: Wed, 7 Oct 2020 10:03:27 +0200 Subject: [PATCH 325/496] replacing x variable with counter --- nautilus_nlp/analysis/keyword_extractor.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/nautilus_nlp/analysis/keyword_extractor.py b/nautilus_nlp/analysis/keyword_extractor.py index 4ef2b49..ab86a7d 100644 --- a/nautilus_nlp/analysis/keyword_extractor.py +++ b/nautilus_nlp/analysis/keyword_extractor.py @@ -74,6 +74,6 @@ def frequent_words(list_words, ngrams_number=1, number_top_words=10): list_words = create_ngrams(list_words, ngrams_number) else: raise ValueError("number of n-grams should be >= 1") - x = Counter(list_words) - frequent = x.most_common(number_top_words) + counter = Counter(list_words) + frequent = counter.most_common(number_top_words) return frequent From d2762e786d1797a55c5f175cbcb96a594df2553c Mon Sep 17 00:00:00 2001 From: Amale EL HAMRI <amale.elhamri@artefact.com> Date: Wed, 7 Oct 2020 10:04:02 +0200 Subject: [PATCH 326/496] replacing bad return to lign --- nautilus_nlp/analysis/keyword_extractor.py | 1 - 1 file changed, 1 deletion(-) diff --git a/nautilus_nlp/analysis/keyword_extractor.py b/nautilus_nlp/analysis/keyword_extractor.py index ab86a7d..94154e5 100644 --- a/nautilus_nlp/analysis/keyword_extractor.py +++ b/nautilus_nlp/analysis/keyword_extractor.py @@ -58,7 +58,6 @@ def frequent_words(list_words, ngrams_number=1, number_top_words=10): Parameters ---------- ngrams_number : int - number_top_words : int output dataframe length From e52e490573c6bddac5d058b85c04d5efcf9c5d20 Mon Sep 17 00:00:00 2001 From: Amale EL HAMRI <amale.elhamri@artefact.com> Date: Wed, 7 Oct 2020 10:10:00 +0200 Subject: [PATCH 327/496] renaming variable words to nb_words --- nautilus_nlp/analysis/text_summary.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/nautilus_nlp/analysis/text_summary.py b/nautilus_nlp/analysis/text_summary.py index 02457c6..6469729 100644 --- a/nautilus_nlp/analysis/text_summary.py +++ b/nautilus_nlp/analysis/text_summary.py @@ -32,7 +32,7 @@ def is_list_of_strings(lst): return bool(lst) and isinstance(lst, list) and all(isinstance(elem, str) for elem in lst) -def summarize_text(txt, ratio=0.2, language="english", words=None): +def summarize_text(txt, ratio=0.2, language="english", nb_words=None): """ Parameters ---------- @@ -42,7 +42,7 @@ def summarize_text(txt, ratio=0.2, language="english", words=None): Percentage giving the output text length in reference to the input length. language : text language. eg. "english" - words : + nb_words : number of words of the output text or None Returns @@ -55,4 +55,4 @@ def summarize_text(txt, ratio=0.2, language="english", words=None): txt = ' '.join(txt) elif not isinstance(txt, str): raise TypeError("Text parameter must be a Unicode object (str) or list of str!") - return summarize(txt, ratio, words, language) + return summarize(txt, ratio, nb_words, language) From b7ce7f72650215f34a5d244dfec6f54beb530adf Mon Sep 17 00:00:00 2001 From: Amale EL HAMRI <amale.elhamri@artefact.com> Date: Wed, 7 Oct 2020 10:10:54 +0200 Subject: [PATCH 328/496] adding example of variable countrylist in docstring --- nautilus_nlp/utils/phone_number.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/nautilus_nlp/utils/phone_number.py b/nautilus_nlp/utils/phone_number.py index f3af336..3647908 100644 --- a/nautilus_nlp/utils/phone_number.py +++ b/nautilus_nlp/utils/phone_number.py @@ -77,7 +77,7 @@ def extract_phone_numbers(text: str, countrylist: list)->list: Parameters ---------- - countrylist: list + countrylist: list (eg. [None,'FR','US','GB']) Look for phone numbers formatted according to the specified countlist. supported value: look SUPPORTED_COUNTRY variable. ''' From fe33739c420aa1a60ccb9afcc47a82b4a64d051c Mon Sep 17 00:00:00 2001 From: Amale EL HAMRI <amale.elhamri@artefact.com> Date: Wed, 7 Oct 2020 10:11:58 +0200 Subject: [PATCH 329/496] typo counttry > country --- nautilus_nlp/utils/phone_number.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/nautilus_nlp/utils/phone_number.py b/nautilus_nlp/utils/phone_number.py index 3647908..7cde267 100644 --- a/nautilus_nlp/utils/phone_number.py +++ b/nautilus_nlp/utils/phone_number.py @@ -58,7 +58,7 @@ def find_phone_numbers(string, region_code=None): eg. 06.25.09.32.67 if "FR" is specified. If not specified, only works for international-formatted phone numbers. - - ie. phone number with +counttry code specified + - ie. phone number with +country code specified eg. 06.25.09.32.67 will return an error but +33 6 25 09 32 67 will work. region_code @@ -108,7 +108,7 @@ def parse_number(self, text: str, region_code=None): eg. 06.25.09.32.67 if "FR" is specified. If not specified, only works for international-formatted phone numbers. - - ie. phone number with +counttry code specified + - ie. phone number with +country code specified eg. 06.25.09.32.67 will return an error but +33 6 25 09 32 67 will work. region_code From 97266d72cf3c417d788888fccd83eb78b1b3d778 Mon Sep 17 00:00:00 2001 From: Amale EL HAMRI <amale.elhamri@artefact.com> Date: Wed, 7 Oct 2020 12:26:23 +0200 Subject: [PATCH 330/496] putting anonymous phone number in tests --- tests/test_phone_number.py | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/tests/test_phone_number.py b/tests/test_phone_number.py index e416f09..4aff394 100644 --- a/tests/test_phone_number.py +++ b/tests/test_phone_number.py @@ -30,14 +30,14 @@ def test_extract_phone_number_us(): assert res == expected def test_extract_phone_number_fr(): - input_str = '06.25.09.32.56 is a FR Phone' - expected = ['06.25.09.32.56'] + input_str = '06.00.00.00.00 is a FR Phone' + expected = ['06.00.00.00.00'] res = phone.extract_phone_numbers(input_str, countrylist=['FR']) assert res == expected def test_extract_phone_number_international(): - input_str = '+33625093423 is an international Phone number' - expected = ['+33625093423'] + input_str = '+33600000000 is an international Phone number' + expected = ['+33600000000'] res = phone.extract_phone_numbers(input_str, countrylist=['US', 'GB', 'FR', None]) assert res == expected @@ -50,8 +50,8 @@ def test_phone_parser_us(): assert res == expected def test_phone_parser_fr(): - input_str = '0625093267' - expected = '+33625093267' + input_str = '0600000000' + expected = '+33600000000' p = phone.PhoneParser() p.parse_number(input_str, region_code='FR') res = p.format_number('E164') From 6683a73c68f7e7f6dff891e0f268319f4b335f43 Mon Sep 17 00:00:00 2001 From: Amale EL HAMRI <amale.elhamri@artefact.com> Date: Wed, 7 Oct 2020 12:28:42 +0200 Subject: [PATCH 331/496] putting anonymous phone number in tests --- nautilus_nlp/utils/phone_number.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/nautilus_nlp/utils/phone_number.py b/nautilus_nlp/utils/phone_number.py index 7cde267..66571ca 100644 --- a/nautilus_nlp/utils/phone_number.py +++ b/nautilus_nlp/utils/phone_number.py @@ -55,11 +55,11 @@ def find_phone_numbers(string, region_code=None): ---------- region_code If specified, will find the number of the specified country. - eg. 06.25.09.32.67 if "FR" is specified. + eg. 06.00.00.00.00 if "FR" is specified. If not specified, only works for international-formatted phone numbers. - ie. phone number with +country code specified - eg. 06.25.09.32.67 will return an error but +33 6 25 09 32 67 will work. + eg. 06.00.00.00.00 will return an error but +33 6 00 00 00 00 will work. region_code supported value: look SUPPORTED_COUNTRY variable. @@ -105,11 +105,11 @@ def parse_number(self, text: str, region_code=None): ---------- region_code If specified, will find the number of the specified country. - eg. 06.25.09.32.67 if "FR" is specified. + eg. 06.00.00.00.00 if "FR" is specified. If not specified, only works for international-formatted phone numbers. - ie. phone number with +country code specified - eg. 06.25.09.32.67 will return an error but +33 6 25 09 32 67 will work. + eg. 06.00.00.00.00 will return an error but +33 6 00 00 00 00 will work. region_code supported value: look SUPPORTED_COUNTRY variable. From 59145ab3ade6c4c15bdbcb1b671f9c260c294724 Mon Sep 17 00:00:00 2001 From: Amale EL HAMRI <amale.elhamri@artefact.com> Date: Thu, 8 Oct 2020 11:00:28 +0200 Subject: [PATCH 332/496] replacing logging.warning with warnings.warn --- nautilus_nlp/utils/file_loader.py | 13 +++++-------- 1 file changed, 5 insertions(+), 8 deletions(-) diff --git a/nautilus_nlp/utils/file_loader.py b/nautilus_nlp/utils/file_loader.py index cda3997..5bbcc80 100644 --- a/nautilus_nlp/utils/file_loader.py +++ b/nautilus_nlp/utils/file_loader.py @@ -15,19 +15,17 @@ # You should have received a copy of the GNU Lesser General Public License # along with this program; if not, write to the Free Software Foundation, # Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +import codecs import glob import io import json -import logging import os import re -import codecs import shutil +import warnings import chardet -logging.basicConfig(level=logging.INFO) - def open_textfile(filepath, encoding='utf-8'): with io.open(filepath, 'r', encoding=encoding) as f: @@ -80,12 +78,11 @@ def text_loader(filepath, encoding=None, detectencoding=True): try: return open_textfile(filepath, encoding='utf-8') except UnicodeDecodeError: - logging.warning('Encoding for {} is not UTF-8.'.format(filepath)) + warnings.warn(f'Encoding for {filepath} is not UTF-8.') if detectencoding is True: - logging.warning('Trying to detect encoding for {}'.format(filepath)) detected_encoding = detect_encoding(filepath) - logging.info('{filepath}: detected encoding is {encod}, with a confidence rate of {conf_rate}'.format( - filepath=filepath, encod=detected_encoding['encoding'], conf_rate=detected_encoding['confidence'])) + warnings.warn(f'{filepath}: detected encoding is {detected_encoding["encoding"]},\ + with a confidence rate of {detected_encoding["confidence"]}') return open_textfile(filepath, encoding=detected_encoding['encoding']) raise UnicodeDecodeError('Cannot load document using utf-8. '\ 'Try to detect encoding using detectencoding=True') From 7de3eccd1e015984245916f0f2194d012f9082c0 Mon Sep 17 00:00:00 2001 From: Rafaelle AYGALENQ <rafaelle.aygalenq@artefact.com> Date: Wed, 14 Oct 2020 18:28:05 +0200 Subject: [PATCH 333/496] refacto data augmentation functions --- .../preprocessing/data_augmentation.py | 128 ++++++++++++++++-- 1 file changed, 117 insertions(+), 11 deletions(-) diff --git a/nautilus_nlp/preprocessing/data_augmentation.py b/nautilus_nlp/preprocessing/data_augmentation.py index 1263260..a0df7b9 100644 --- a/nautilus_nlp/preprocessing/data_augmentation.py +++ b/nautilus_nlp/preprocessing/data_augmentation.py @@ -8,6 +8,8 @@ class CouldNotAugment(ValueError): pass +class UnavailableAugmenter(ValueError): + pass def augment_utterance(text, method, stopwords, intent=None, entities=None): """ @@ -30,6 +32,7 @@ def augment_utterance(text, method, stopwords, intent=None, entities=None): [ { 'entity': str, + 'word': str, 'startCharIndex': int, 'endCharIndex': int }, @@ -43,21 +46,51 @@ def augment_utterance(text, method, stopwords, intent=None, entities=None): dictionary with augmented text and optional keys depending on input """ new_utt = {} - augmenter = select_augmenter(method, stopwords) + augmenter = get_augmenter(method, stopwords) new_utt['text'] = augmenter.augment(text) if intent is not None: new_utt['intent'] = intent if entities is not None: - formatted_entities = [(text[entities[i]['startCharIndex']:entities[i]['endCharIndex'] - ].strip(), entities[i]['entity']) for i in range(len(entities))] + formatted_entities = [( + text[entities[i]['startCharIndex']:entities[i]['endCharIndex']].strip(), + entities[i]['entity']) for i in range(len(entities) + )] if are_entities_in_augmented_text(entities, new_utt['text']): - new_utt['entities'] = get_augmented_entities(new_utt['text'], formatted_entities) + new_utt['entities'] = get_augmented_entities( + new_utt['text'], + formatted_entities + ) return clean_sentence_entities(new_utt) raise CouldNotAugment('Text was not correctly augmented so not added') return new_utt def are_entities_in_augmented_text(entities, augmented_text): + """ + Given a list of entities, check if all the words associated to each entity + are still present in augmented text. + + Parameters + ---------- + entities : list + entities associated to initial text, must be in the following format: + [ + { + 'entity': str, + 'word': str, + 'startCharIndex': int, + 'endCharIndex': int + }, + { + ... + } + ] + augmented_text : str + + Returns + ------- + True if all entities are present in augmented text, False otherwise + """ check = True for ent in entities: if ent['word'] not in augmented_text: @@ -65,17 +98,53 @@ def are_entities_in_augmented_text(entities, augmented_text): return check -def select_augmenter(method, stopwords, use_stopwords=True): - if not use_stopwords: - stopwords = [] +def get_augmenter(method, stopwords=None): + """ + Initialize an augmenter depending on the given method. + + Parameters + ---------- + method : str (supported methods: wordnet_synonym and aug_sub_bert) + stopwords : list + list of words to freeze throughout the augmentation + + Returns + ------- + Initialized nlpaug augmenter + """ if method == 'wordnet_synonym': - augmenter = naw.SynonymAug(aug_src='wordnet', stopwords=stopwords) - elif method == 'aug_sub_bert': - augmenter = naw.ContextualWordEmbsAug(model_path='bert-base-uncased', action="substitute", stopwords=stopwords) - return(augmenter) + return naw.SynonymAug(aug_src='wordnet', stopwords=stopwords) + if method == 'aug_sub_bert': + return naw.ContextualWordEmbsAug(model_path='bert-base-uncased', action="substitute", stopwords=stopwords) + raise UnavailableAugmenter('The given augmenter is not supported yet') def get_augmented_entities(sentence_augmented, entities): + """ + Get entities with updated positions (start and end) in augmented text + + Parameters + ---------- + sentence_augmented : str + augmented text + entities : list + entities associated to initial text, must be in the following format: + [ + { + 'entity': str, + 'word': str, + 'startCharIndex': int, + 'endCharIndex': int + }, + { + ... + } + ] + + Returns + ------- + Entities with updated positions related to augmented text + """ entities_augmented = [] for entity in entities: regex = r'(?:^|\W)' + re.escape(entity[0].strip()) + r'(?:$|\W)' @@ -91,6 +160,23 @@ def get_augmented_entities(sentence_augmented, entities): def clean_sentence_entities(sentence_input): + """ + Paired entities check to remove nested entities, the longest entity is kept + + Parameters + ---------- + sentence_input : dict + dictionary in the following format + { + 'text' : str, + 'entities' : list of dict, + 'intent' : str (optional) + } + + Returns + ------- + Sentence input with cleaned entities + """ sentence = copy.copy(sentence_input) for element1 in sentence['entities']: for element2 in sentence['entities']: @@ -108,6 +194,26 @@ def clean_sentence_entities(sentence_input): def check_interval_included(element1, element2): + """ + Comparison of two entities on start and end positions to find if they are nested + + Parameters + ---------- + element1 : dict + element2 : dict + both of them in the following format + { + 'entity': str, + 'word': str, + 'startCharIndex': int, + 'endCharIndex': int + } + + Returns + ------- + If there is an entity to remove among the two returns a tuple (element to remove, element to keep) + If not, returns None + """ if ((element1 != element2) and (element1['startCharIndex'] >= element2['startCharIndex']) and (element1['endCharIndex'] <= element2['endCharIndex'])): return element1, element2 From e598d95ae0eb90397c89ba0091545c3383b820fe Mon Sep 17 00:00:00 2001 From: Rafaelle AYGALENQ <rafaelle.aygalenq@artefact.com> Date: Wed, 14 Oct 2020 18:43:05 +0200 Subject: [PATCH 334/496] fix linting --- nautilus_nlp/preprocessing/data_augmentation.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/nautilus_nlp/preprocessing/data_augmentation.py b/nautilus_nlp/preprocessing/data_augmentation.py index a0df7b9..8ac1de7 100644 --- a/nautilus_nlp/preprocessing/data_augmentation.py +++ b/nautilus_nlp/preprocessing/data_augmentation.py @@ -53,8 +53,7 @@ def augment_utterance(text, method, stopwords, intent=None, entities=None): if entities is not None: formatted_entities = [( text[entities[i]['startCharIndex']:entities[i]['endCharIndex']].strip(), - entities[i]['entity']) for i in range(len(entities) - )] + entities[i]['entity']) for i in range(len(entities))] if are_entities_in_augmented_text(entities, new_utt['text']): new_utt['entities'] = get_augmented_entities( new_utt['text'], From 0aa06a83f7b7b6aca8be2122a8c96bf49bcd73f0 Mon Sep 17 00:00:00 2001 From: Rafaelle AYGALENQ <rafaelle.aygalenq@artefact.com> Date: Wed, 14 Oct 2020 18:58:08 +0200 Subject: [PATCH 335/496] refacto data aug functions, remove utterance notion --- .../preprocessing/data_augmentation.py | 61 ++++++++++--------- 1 file changed, 32 insertions(+), 29 deletions(-) diff --git a/nautilus_nlp/preprocessing/data_augmentation.py b/nautilus_nlp/preprocessing/data_augmentation.py index 8ac1de7..b0177af 100644 --- a/nautilus_nlp/preprocessing/data_augmentation.py +++ b/nautilus_nlp/preprocessing/data_augmentation.py @@ -11,7 +11,7 @@ class CouldNotAugment(ValueError): class UnavailableAugmenter(ValueError): pass -def augment_utterance(text, method, stopwords, intent=None, entities=None): +def augment_utterance(text, method, stopwords, entities=None): """ Given ``text`` str, create a new similar utterance by modifying some words in the initial sentence, modifications depend on the chosen method @@ -25,8 +25,6 @@ def augment_utterance(text, method, stopwords, intent=None, entities=None): augmenter to use ('wordnet_synonym' or 'aug_sub_bert') stopwords : list list of words to freeze throughout the augmentation - intent : string - intent associated to text if any entities : list entities associated to text if any, must be in the following format: [ @@ -43,25 +41,22 @@ def augment_utterance(text, method, stopwords, intent=None, entities=None): Returns ------- - dictionary with augmented text and optional keys depending on input + Augmented text and optional augmented entities """ - new_utt = {} augmenter = get_augmenter(method, stopwords) - new_utt['text'] = augmenter.augment(text) - if intent is not None: - new_utt['intent'] = intent + augmented_text = augmenter.augment(text) if entities is not None: formatted_entities = [( text[entities[i]['startCharIndex']:entities[i]['endCharIndex']].strip(), entities[i]['entity']) for i in range(len(entities))] - if are_entities_in_augmented_text(entities, new_utt['text']): - new_utt['entities'] = get_augmented_entities( - new_utt['text'], + if are_entities_in_augmented_text(entities, augmented_text): + augmented_entities = get_augmented_entities( + augmented_text, formatted_entities ) - return clean_sentence_entities(new_utt) + return clean_sentence_entities(text, augmented_entities) raise CouldNotAugment('Text was not correctly augmented so not added') - return new_utt + return augmented_text def are_entities_in_augmented_text(entities, augmented_text): @@ -158,38 +153,46 @@ def get_augmented_entities(sentence_augmented, entities): return entities_augmented -def clean_sentence_entities(sentence_input): +def clean_sentence_entities(text, entities): """ Paired entities check to remove nested entities, the longest entity is kept Parameters ---------- - sentence_input : dict - dictionary in the following format - { - 'text' : str, - 'entities' : list of dict, - 'intent' : str (optional) - } + text : str + augmented text + entities : list + entities associated to augmented text, must be in the following format: + [ + { + 'entity': str, + 'word': str, + 'startCharIndex': int, + 'endCharIndex': int + }, + { + ... + } + ] Returns ------- - Sentence input with cleaned entities + Augmented text and cleaned entities """ - sentence = copy.copy(sentence_input) - for element1 in sentence['entities']: - for element2 in sentence['entities']: + entities_to_clean = copy.copy(entities) + for element1 in entities_to_clean: + for element2 in entities_to_clean: result = check_interval_included(element1, element2) if result is not None: try: - sentence[1]['entities'].remove(result[0]) + entities_to_clean.remove(result[0]) except IndexError: logging.warning( "Cant remove entity : {} \n entities are now :{} \n for sentence : {} ".format( - result, sentence['entities'], - sentence['text'])) + result, entities_to_clean, + text)) continue - return sentence + return text, entities_to_clean def check_interval_included(element1, element2): From 9cadf3aad26b2000a2649aaa51c65535509ca362 Mon Sep 17 00:00:00 2001 From: Rafaelle AYGALENQ <rafaelle.aygalenq@artefact.com> Date: Thu, 15 Oct 2020 18:48:11 +0200 Subject: [PATCH 336/496] rename function and clarify custom errors message --- nautilus_nlp/preprocessing/data_augmentation.py | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/nautilus_nlp/preprocessing/data_augmentation.py b/nautilus_nlp/preprocessing/data_augmentation.py index b0177af..1e47928 100644 --- a/nautilus_nlp/preprocessing/data_augmentation.py +++ b/nautilus_nlp/preprocessing/data_augmentation.py @@ -11,12 +11,13 @@ class CouldNotAugment(ValueError): class UnavailableAugmenter(ValueError): pass -def augment_utterance(text, method, stopwords, entities=None): +def augment_text(text, method, stopwords=None, entities=None): """ - Given ``text`` str, create a new similar utterance by modifying some words - in the initial sentence, modifications depend on the chosen method - (substitution with synonym, addition, deletion). If intent and/or entities - are given as input, they will remain unchanged. + Given a text with or without associated entities, generate a new text by + modifying some words in the initial one, modifications depend on the chosen + method (substitution with synonym, addition, deletion). If entities are + given as input, they will remain unchanged. If you want some words other + than entities to remain unchanged, specify it within the stopwords argument. Parameters ---------- @@ -110,7 +111,8 @@ def get_augmenter(method, stopwords=None): return naw.SynonymAug(aug_src='wordnet', stopwords=stopwords) if method == 'aug_sub_bert': return naw.ContextualWordEmbsAug(model_path='bert-base-uncased', action="substitute", stopwords=stopwords) - raise UnavailableAugmenter('The given augmenter is not supported yet') + raise UnavailableAugmenter('The given augmenter is not supported. You must choose one \ + of the following: wordnet_synonym or aug_sub_bert') def get_augmented_entities(sentence_augmented, entities): From 6e2571a9d342cdbd212dd0e4a6cb1d0e14fd7102 Mon Sep 17 00:00:00 2001 From: hugovasselin <waaaouu@gmail.com> Date: Fri, 16 Oct 2020 18:30:20 +0200 Subject: [PATCH 337/496] feat: add unit test --- nautilus_nlp/analysis/keyword_extractor.py | 38 ++++++++++++++-------- 1 file changed, 24 insertions(+), 14 deletions(-) diff --git a/nautilus_nlp/analysis/keyword_extractor.py b/nautilus_nlp/analysis/keyword_extractor.py index 94154e5..a615f45 100644 --- a/nautilus_nlp/analysis/keyword_extractor.py +++ b/nautilus_nlp/analysis/keyword_extractor.py @@ -15,29 +15,36 @@ # You should have received a copy of the GNU Lesser General Public License # along with this program; if not, write to the Free Software Foundation, # Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +from typing import Union, List, Tuple, Dict from collections import Counter from flashtext import KeywordProcessor from nautilus_nlp.analysis.ngrams import create_ngrams -def extract_keywords(text, keyword, case_sensitive=True): +def extract_keywords( + text: str, keyword: Union[str, List[str], Dict[str, List[str]]], case_sensitive: bool = True + ) -> List[str]: """ - Extract Keywords from a document. + Extract Keywords from a document, using FlashText Parameters ---------- text : str - Text to extract keywords from - keyword : - Single keyword (str) or list of keywords (list) - case_sensitive : + Text to extract keywords from. + keyword : Union[str, list[str], dict[str, list[str]]] + Single keyword (str), list of keywords (list), or keyword dict. + Example of keyword dict: keyword_dict = { + "java": ["java_2e", "java programing"], + "product management": ["PM", "product manager"] + } + case_sensitive : bool If False, will be case insensitive. Returns ------- list - Return list of extracted keyworkds + Return list of extracted keywords """ processor = KeywordProcessor(case_sensitive=case_sensitive) @@ -51,28 +58,31 @@ def extract_keywords(text, keyword, case_sensitive=True): return processor.extract_keywords(text) -def frequent_words(list_words, ngrams_number=1, number_top_words=10): +def get_frequent_words( + tokens: List[str], ngrams_number: int = 1, number_top_words: int = 10) -> List[Tuple[str, int]]: """ - Create n-grams for list of tokens + Create n-grams for a list of tokens Parameters ---------- + tokens : list + list of tokens ngrams_number : int number_top_words : int - output dataframe length + number of top keywords to return Returns ------- - DataFrame - Dataframe with the entities and their frequencies. + list[tuple[str, int]] + Returns a list of the top n words (). """ frequent = [] if ngrams_number == 1: pass elif ngrams_number >= 2: - list_words = create_ngrams(list_words, ngrams_number) + tokens = create_ngrams(tokens, ngrams_number) else: raise ValueError("number of n-grams should be >= 1") - counter = Counter(list_words) + counter = Counter(tokens) frequent = counter.most_common(number_top_words) return frequent From 90d87f1bc4cefe8ad0e850e240a23aae97526cc9 Mon Sep 17 00:00:00 2001 From: hugovasselin <waaaouu@gmail.com> Date: Fri, 16 Oct 2020 18:30:30 +0200 Subject: [PATCH 338/496] feat: add unit test --- tests/test_keyword_extractor.py | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) create mode 100644 tests/test_keyword_extractor.py diff --git a/tests/test_keyword_extractor.py b/tests/test_keyword_extractor.py new file mode 100644 index 0000000..c4e83b3 --- /dev/null +++ b/tests/test_keyword_extractor.py @@ -0,0 +1,20 @@ +import pytest +from nautilus_nlp.analysis.keyword_extractor import get_frequent_words + + +@pytest.mark.parametrize( + "input_tokens, expected, ngrams_number, number_top_words", + [ + (['I', 'eat', 'orange', 'oranges', 'at', 'orange'], [('orange', 2)], 1, 1), + (['Un', 'chat', 'rose', 'reste', 'un', 'chat', 'rose'], [('chat rose', 2)], 2, 1), + ] + ) +def test_get_frequent_words(input_tokens, expected, ngrams_number, number_top_words): + result = get_frequent_words( + input_tokens, ngrams_number=ngrams_number, number_top_words=number_top_words) + assert result == expected + + +def test_get_frequent_words_output_lenght(): + input_tokens = ['one', 'two', 'three', 'four', 'five', 'six', 'seven'] + assert len(get_frequent_words(input_tokens, number_top_words=5)) == 5 From 35954e2bf45642ebf8cd5745dfa3a56e99bb7ccd Mon Sep 17 00:00:00 2001 From: hugovasselin <waaaouu@gmail.com> Date: Fri, 16 Oct 2020 18:38:11 +0200 Subject: [PATCH 339/496] feat: add test for kw extractor --- tests/test_keyword_extractor.py | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/tests/test_keyword_extractor.py b/tests/test_keyword_extractor.py index c4e83b3..66261d5 100644 --- a/tests/test_keyword_extractor.py +++ b/tests/test_keyword_extractor.py @@ -1,5 +1,5 @@ import pytest -from nautilus_nlp.analysis.keyword_extractor import get_frequent_words +from nautilus_nlp.analysis.keyword_extractor import get_frequent_words, extract_keywords @pytest.mark.parametrize( @@ -18,3 +18,17 @@ def test_get_frequent_words(input_tokens, expected, ngrams_number, number_top_wo def test_get_frequent_words_output_lenght(): input_tokens = ['one', 'two', 'three', 'four', 'five', 'six', 'seven'] assert len(get_frequent_words(input_tokens, number_top_words=5)) == 5 + + +@pytest.mark.parametrize( + "input_text, keyword, case_sensitive, expected", + [ + ("I eat an orange oranges at Orange", 'orange', False, ['orange', 'orange']), + ("I eat an orange oranges at Orange", 'orange', True, ['orange']), + ("I eat an orange oranges at Orange", {'orange': ['orange', 'oranges']}, False, ['orange', 'orange', 'orange']), + ("I eat an orange oranges at Orange", {'orange': ['orange', 'oranges']}, True, ['orange', 'orange']), + ("I eat an orange oranges at Orange", {'fruit': ['orange', 'oranges']}, True, ['fruit', 'fruit']), + ] + ) +def test_extract_keywords(input_text, keyword, case_sensitive, expected): + assert extract_keywords(input_text, keyword=keyword, case_sensitive=case_sensitive) == expected \ No newline at end of file From 20bf151d43c2e7d710c8dba48d148804aa4e6337 Mon Sep 17 00:00:00 2001 From: hugovasselin <waaaouu@gmail.com> Date: Fri, 16 Oct 2020 18:42:30 +0200 Subject: [PATCH 340/496] refacto: add typing --- nautilus_nlp/analysis/ngrams.py | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/nautilus_nlp/analysis/ngrams.py b/nautilus_nlp/analysis/ngrams.py index 7369b93..89cbb13 100644 --- a/nautilus_nlp/analysis/ngrams.py +++ b/nautilus_nlp/analysis/ngrams.py @@ -16,15 +16,18 @@ # along with this program; if not, write to the Free Software Foundation, # Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. # -*- coding: utf-8 -*- -def create_ngrams(token_list, nb_elements): +from typing import List, Generator + + +def create_ngrams(tokens: List[str], nb_elements: int) -> Generator: """ Create n-grams for list of tokens Parameters ---------- - token_list : list + tokens : list list of strings - nb_elements : + nb_elements : int number of elements in the n-gram Returns @@ -32,5 +35,5 @@ def create_ngrams(token_list, nb_elements): Generator generator of all n-grams """ - ngrams = zip(*[token_list[index_token:] for index_token in range(nb_elements)]) + ngrams = zip(*[tokens[index_token:] for index_token in range(nb_elements)]) return (" ".join(ngram) for ngram in ngrams) From 5f8d8f0875deee9bcf832db34125492258d23818 Mon Sep 17 00:00:00 2001 From: hugovasselin <waaaouu@gmail.com> Date: Fri, 16 Oct 2020 18:47:02 +0200 Subject: [PATCH 341/496] feat: add typing and docstring --- nautilus_nlp/analysis/text_summary.py | 17 ++++++++++------- 1 file changed, 10 insertions(+), 7 deletions(-) diff --git a/nautilus_nlp/analysis/text_summary.py b/nautilus_nlp/analysis/text_summary.py index 6469729..d4b227d 100644 --- a/nautilus_nlp/analysis/text_summary.py +++ b/nautilus_nlp/analysis/text_summary.py @@ -15,10 +15,11 @@ # You should have received a copy of the GNU Lesser General Public License # along with this program; if not, write to the Free Software Foundation, # Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +from typing import Optional, Any from summa.summarizer import summarize -def is_list_of_strings(lst): +def is_list_of_strings(lst: Any) -> bool: """ Parameters ---------- @@ -26,23 +27,26 @@ def is_list_of_strings(lst): Returns ------- - book - boolean indicator + book : bool + True if is a list of strings, else returns False """ return bool(lst) and isinstance(lst, list) and all(isinstance(elem, str) for elem in lst) -def summarize_text(txt, ratio=0.2, language="english", nb_words=None): +def summarize_text( + txt: str, ratio: float = 0.2, language: str = "english", nb_words: Optional[int] = None) -> str: """ + This function uses the summa library to summazize text + Parameters ---------- txt : str Sting or list of strings containing text to summarize ratio : float Percentage giving the output text length in reference to the input length. - language : + language : str text language. eg. "english" - nb_words : + nb_words : int number of words of the output text or None Returns @@ -50,7 +54,6 @@ def summarize_text(txt, ratio=0.2, language="english", nb_words=None): string string containing the summarized text """ - if is_list_of_strings(txt): txt = ' '.join(txt) elif not isinstance(txt, str): From 68a9824950e37b399f57d52b8d195c13d76bf88e Mon Sep 17 00:00:00 2001 From: hugovasselin <waaaouu@gmail.com> Date: Fri, 16 Oct 2020 18:59:04 +0200 Subject: [PATCH 342/496] feat: add docstring and typing --- nautilus_nlp/analysis/visualize.py | 40 +++++++++++++++++++++++------- 1 file changed, 31 insertions(+), 9 deletions(-) diff --git a/nautilus_nlp/analysis/visualize.py b/nautilus_nlp/analysis/visualize.py index dd16cfb..f933a59 100644 --- a/nautilus_nlp/analysis/visualize.py +++ b/nautilus_nlp/analysis/visualize.py @@ -15,15 +15,28 @@ # You should have received a copy of the GNU Lesser General Public License # along with this program; if not, write to the Free Software Foundation, # Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +from typing import List, Optional, Union from collections import Counter import matplotlib.pyplot as plt import wordcloud +import warnings plt.rcParams["figure.figsize"] = [16, 9] -def make_word_cloud(text_or_counter, stop_words=None): +def make_word_cloud(text_or_counter: Union[str, list], stop_words: Optional[List[str]] = None): + ''' + Prints a word cloud from a text, or a word count. + + Parameters + ---------- + text_or_counter : Union[str, list] + The text or the Counter to be ploted as wordcloud. + Example of counter: [('cat', 2), ('dog', 1)] + stop_words: Optional[List[str]] + List of words to be ignored + ''' if isinstance(text_or_counter, str): word_cloud = wordcloud.WordCloud(stopwords=stop_words).generate(text_or_counter) else: @@ -35,14 +48,23 @@ def make_word_cloud(text_or_counter, stop_words=None): plt.show() -def print_concordance(tokens, query_word, width=110, n_results=None): +def print_concordance( + tokens: List[str], query_word: str, width: int = 110, n_results: Optional[int] = None): ''' - Inputs a list of token and a query word, outputs all the sentences that - contains the query word, display in a nice way. - width = Integer. Number of caracters to display per text chunk - n_results = Integer. If not null, filters the number of results displayed. - This function is an adaptation of NLTK's print_concordance function. - Source: http://www.nltk.org/_modules/nltk/text.html + Inputs a list of token and a query word, and print all the sentences that contains the query\ + word, display in a nice way. This function is an adaptation of NLTK's print_concordance\ + function. Source: http://www.nltk.org/_modules/nltk/text.html + + Parameters + ---------- + tokens : list + list of words + query_word : str + the word to be searched for in the list of tokens + width : int + Number of caracters to be display per text chunk + n_results : Optional[int] + If specified, will print only the N results ''' half_width = (width - len(query_word) - 2) // 2 context = width // 4 # approx number of words of context @@ -63,4 +85,4 @@ def print_concordance(tokens, query_word, width=110, n_results=None): line_print = ' '.join([left_print, query_word, right_print]) print(line_print) else: - print('No match for "{}"'.format(query_word)) + warnings.warn('No match for "{}"'.format(query_word)) From d15d3802021b71e936e6a66e3b93ba0d6e718e80 Mon Sep 17 00:00:00 2001 From: hugovasselin <waaaouu@gmail.com> Date: Fri, 16 Oct 2020 19:06:14 +0200 Subject: [PATCH 343/496] feat: add typing and docstr --- nautilus_nlp/preprocessing/data_augmentation.py | 17 ++++++++++------- 1 file changed, 10 insertions(+), 7 deletions(-) diff --git a/nautilus_nlp/preprocessing/data_augmentation.py b/nautilus_nlp/preprocessing/data_augmentation.py index 1263260..e05da45 100644 --- a/nautilus_nlp/preprocessing/data_augmentation.py +++ b/nautilus_nlp/preprocessing/data_augmentation.py @@ -1,3 +1,4 @@ +from typing import List, Optional import copy import logging import re @@ -9,7 +10,8 @@ class CouldNotAugment(ValueError): pass -def augment_utterance(text, method, stopwords, intent=None, entities=None): +def augment_utterance( + text: str, method: str, stopwords: list[str], intent: Optional[str] = None, entities: Optional[list]=None) -> dict: """ Given ``text`` str, create a new similar utterance by modifying some words in the initial sentence, modifications depend on the chosen method @@ -19,7 +21,7 @@ def augment_utterance(text, method, stopwords, intent=None, entities=None): Parameters ---------- text : string - method : string + method : string {'wordnet_synonym', 'aug_sub_bert'} augmenter to use ('wordnet_synonym' or 'aug_sub_bert') stopwords : list list of words to freeze throughout the augmentation @@ -40,24 +42,25 @@ def augment_utterance(text, method, stopwords, intent=None, entities=None): Returns ------- - dictionary with augmented text and optional keys depending on input + dict + dictionary with augmented text and optional keys depending on input """ new_utt = {} - augmenter = select_augmenter(method, stopwords) + augmenter = _select_augmenter(method, stopwords) new_utt['text'] = augmenter.augment(text) if intent is not None: new_utt['intent'] = intent if entities is not None: formatted_entities = [(text[entities[i]['startCharIndex']:entities[i]['endCharIndex'] ].strip(), entities[i]['entity']) for i in range(len(entities))] - if are_entities_in_augmented_text(entities, new_utt['text']): + if _are_entities_in_augmented_text(entities, new_utt['text']): new_utt['entities'] = get_augmented_entities(new_utt['text'], formatted_entities) return clean_sentence_entities(new_utt) raise CouldNotAugment('Text was not correctly augmented so not added') return new_utt -def are_entities_in_augmented_text(entities, augmented_text): +def _are_entities_in_augmented_text(entities: list, augmented_text: str) -> bool: check = True for ent in entities: if ent['word'] not in augmented_text: @@ -65,7 +68,7 @@ def are_entities_in_augmented_text(entities, augmented_text): return check -def select_augmenter(method, stopwords, use_stopwords=True): +def _select_augmenter(method, stopwords, use_stopwords=True): if not use_stopwords: stopwords = [] if method == 'wordnet_synonym': From e866ca3fb261aab8f91e518cc9f8739499385dca Mon Sep 17 00:00:00 2001 From: hugovasselin <waaaouu@gmail.com> Date: Fri, 16 Oct 2020 19:17:08 +0200 Subject: [PATCH 344/496] feat: harmonize docstring + tying --- .../preprocessing/social_preprocess.py | 16 +++++-- nautilus_nlp/preprocessing/text_preprocess.py | 44 ++++++++++--------- 2 files changed, 35 insertions(+), 25 deletions(-) diff --git a/nautilus_nlp/preprocessing/social_preprocess.py b/nautilus_nlp/preprocessing/social_preprocess.py index 8bab161..e903aa7 100644 --- a/nautilus_nlp/preprocessing/social_preprocess.py +++ b/nautilus_nlp/preprocessing/social_preprocess.py @@ -54,7 +54,8 @@ def extract_mentions(self) -> list: Returns ------- - string + list + list of mentions """ return constants.AT_PATTERN.findall(self.text) @@ -69,6 +70,7 @@ def remove_html_tags(self) -> str: Returns ------- string + text without HTML tags """ self.text = self.normalize_whitespace(constants.HTML_TAG_PATTERN.sub('', self.text)) return self.text @@ -85,11 +87,13 @@ def remove_emoji(self) -> str: Returns ------- - str + string + text without emojies """ self.text = constants.EMOJI_PATTERN.sub("", self.text) return self.text + def convert_emoji_to_text(self, code_delimiters=(':', ':'), input_str=None) -> str: """ Convert emoji to their CLDR Short Name, according to the unicode convention @@ -99,8 +103,12 @@ def convert_emoji_to_text(self, code_delimiters=(':', ':'), input_str=None) -> s Parameters ---------- text : str - code_delimiters : tuple of symbols around the emoji code. - eg: (':',':') --> :grinning_face: + + code_delimiters : tuple + Tuple of symbols around the emoji code. eg: (':',':') --> :grinning_face: + + input_str : str + if specified, will remove emoji from this text rather than the class Returns ------- diff --git a/nautilus_nlp/preprocessing/text_preprocess.py b/nautilus_nlp/preprocessing/text_preprocess.py index 5c112cb..18df85b 100644 --- a/nautilus_nlp/preprocessing/text_preprocess.py +++ b/nautilus_nlp/preprocessing/text_preprocess.py @@ -22,7 +22,7 @@ import re import unicodedata - +from typing import Optional from ftfy import fix_text as _fix_text from nautilus_nlp.utils import constants from nautilus_nlp.utils.phone_number import \ @@ -38,7 +38,7 @@ def __init__(self, text): else: raise ValueError("Input must be a string") - def clean_text(self, lang='en') -> str: + def clean_text(self, lang: str = 'en') -> str: #TODO : check how to pipe operations stopwords = get_stopwords(lang) self.text = self.fix_bad_unicode(normalization="NFC") @@ -71,7 +71,8 @@ def remove_stopwords(self, stopwords: list) -> str: Parameters ---------- - stopwords : list of stopwords to remove + stopwords : list + list of stopwords to remove Returns ------- @@ -96,13 +97,14 @@ def fix_bad_unicode(self, normalization: str = "NFC") -> str: ---------- text : string - normalization ({'NFC', 'NFKC', 'NFD', 'NFKD'}): + normalization : string {'NFC', 'NFKC', 'NFD', 'NFKD'} if 'NFC', combines characters and diacritics written using separate code points, e.g. converting "e" plus an acute accent modifier into "é"; unicode can be converted to NFC form without any change in its meaning! if 'NFKC', additional normalizations are applied that can change the meanings of characters, e.g. ellipsis characters will be replaced with three periods + Returns ------- string @@ -186,7 +188,7 @@ def replace_urls(self, replace_with: str = "*URL*") -> str: ) return self.text - def replace_emails(self, replace_with="*EMAIL*") -> str: + def replace_emails(self, replace_with: str = "*EMAIL*") -> str: """ Replace all emails in ``text`` str with ``replace_with`` str @@ -203,9 +205,10 @@ def replace_emails(self, replace_with="*EMAIL*") -> str: self.text = constants.EMAIL_REGEX.sub(replace_with, self.text) return self.text - def replace_phone_numbers(self, country_format_to_detect: list, - replace_with: str = "*PHONE*", - method: str = "regex") -> str: + def replace_phone_numbers(self, + country_format_to_detect: list, + replace_with: str = "*PHONE*", + method: str = "regex") -> str: """ Replace all phone numbers in ``text`` str with ``replace_with`` str @@ -214,12 +217,13 @@ def replace_phone_numbers(self, country_format_to_detect: list, text : string replace_with : string the string you want the phone number to be replaced with. - method : ['regex','detection'] + method : string {'regex','detection'} regex is faster but will omit a lot of numbers, while detection will catch every numbers, but takes a while. country_format_to_detect : list If a list of country code is specified, will catch every number formatted. Only when method = 'detection'. + Returns ------- string @@ -237,7 +241,7 @@ def replace_phone_numbers(self, country_format_to_detect: list, raise ValueError('Please input a valid method between "regex" or "detection"') return self.text - def replace_numbers(self, replace_with="*NUMBER*") -> str: + def replace_numbers(self, replace_with: str="*NUMBER*") -> str: """ Replace all numbers in ``text`` str with ``replace_with`` str. @@ -254,7 +258,7 @@ def replace_numbers(self, replace_with="*NUMBER*") -> str: self.text = constants.NUMBERS_REGEX.sub(replace_with, self.text) return self.text - def replace_currency_symbols(self, replace_with=None) -> str: + def replace_currency_symbols(self, replace_with: Optional[str] = None) -> str: """ Replace all currency symbols in ``text`` str with string specified by ``replace_with`` str. @@ -262,11 +266,10 @@ def replace_currency_symbols(self, replace_with=None) -> str: ---------- text : str raw text - replace_with : None or string - if None (default), replace symbols with - their standard 3-letter abbreviations (e.g. '$' with 'USD', '£' with 'GBP'); - otherwise, pass in a string with which to replace all symbols - (e.g. "*CURRENCY*") + replace_with : Optional[str] + if None (default), replace symbols with their standard 3-letter abbreviations \ + (e.g. '$' with 'USD', '£' with 'GBP'); otherwise, pass in a string with \ + which to replace all symbols (e.g. "*CURRENCY*") Returns ------- @@ -279,7 +282,7 @@ def replace_currency_symbols(self, replace_with=None) -> str: self.text = constants.CURRENCY_REGEX.sub(replace_with, self.text) return self.text - def remove_punct(self, marks=None) -> str: + def remove_punct(self, marks: Optional[str] = None) -> str: """ Remove punctuation from ``text`` by replacing all instances of ``marks`` with whitespace. @@ -288,8 +291,7 @@ def remove_punct(self, marks=None) -> str: ---------- text : str raw text - - marks : str or None + marks : Optional[str] If specified, remove only the characters in this string, e.g. ``marks=',;:'`` removes commas, semi-colons, and colons. Otherwise, all punctuation marks are removed. @@ -320,7 +322,7 @@ def remove_accents(self, method: str = "unicode") -> str: text : str raw text - method : ({'unicode', 'ascii'}) + method : str ({'unicode', 'ascii'}) if 'unicode', remove accented char for any unicode symbol with a direct ASCII equivalent; if 'ascii', remove accented char for any unicode symbol @@ -379,7 +381,7 @@ def filter_non_latin_characters(self) -> str: Parameters ---------- - text : string + text : str Returns ------- From 06db34fd2256b48cb496b9e14fcb15956c37d829 Mon Sep 17 00:00:00 2001 From: hugovasselin <waaaouu@gmail.com> Date: Fri, 16 Oct 2020 19:18:22 +0200 Subject: [PATCH 345/496] fix: small typo in docstring --- nautilus_nlp/preprocessing/token_preprocess.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/nautilus_nlp/preprocessing/token_preprocess.py b/nautilus_nlp/preprocessing/token_preprocess.py index b753564..174708a 100644 --- a/nautilus_nlp/preprocessing/token_preprocess.py +++ b/nautilus_nlp/preprocessing/token_preprocess.py @@ -36,7 +36,8 @@ def remove_stopwords(self, stopwords: list) -> str: Parameters ---------- - stopwords : list of stopwords to remove + stopwords : list + List of stopwords to remove Returns ------- From d56c93923f532e2ede35e1fcd06e5be0b3b113df Mon Sep 17 00:00:00 2001 From: hugovasselin <waaaouu@gmail.com> Date: Fri, 16 Oct 2020 19:25:45 +0200 Subject: [PATCH 346/496] feat: typing + docstring --- nautilus_nlp/topic_modeling/biterm_model.py | 58 ++++++++++----------- 1 file changed, 29 insertions(+), 29 deletions(-) diff --git a/nautilus_nlp/topic_modeling/biterm_model.py b/nautilus_nlp/topic_modeling/biterm_model.py index 22146ac..0d66b7b 100644 --- a/nautilus_nlp/topic_modeling/biterm_model.py +++ b/nautilus_nlp/topic_modeling/biterm_model.py @@ -15,6 +15,7 @@ # You should have received a copy of the GNU Lesser General Public License # along with this program; if not, write to the Free Software Foundation, # Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +from typing import List, Any import numpy as np import pyLDAvis from biterm.btm import oBTM @@ -26,7 +27,7 @@ class BitermModel: # pylint: disable=too-many-instance-attributes - def __init__(self, data, nb_topics, nb_iteration, lang): + def __init__(self, data: List[str], nb_topics: int, nb_iteration: int, lang: str): """ Model for topic modelling. Particularly useful for short texts. @@ -60,58 +61,59 @@ def __init__(self, data, nb_topics, nb_iteration, lang): self._vocabulary = None @staticmethod - def is_int_positive(number): + def is_int_positive(number: Any): """ Function to check if the input parameter is a integer and positive otherwise raise an error Parameters ---------- - number : str - - Returns - ------- - str: - the text with removed multiple spaces and strip text + number : Any + Raises + ------ + ValueError + If the input is not a positive integer """ if not isinstance(number, int): - raise ValueError("Parameter {} has to be an integer".format(number)) + raise ValueError(f"Parameter {number} has to be an integer") if number < 1: - raise ValueError("Parameter {} has to be positive".format(number)) + raise ValueError(f"Parameter {number} has to be positive") @staticmethod - def is_list_of_string(data): + def is_list_of_string(data: Any): """ Function to check if the input parameter is a list of strings otherwise raise an error Parameters ---------- - data + data: Any - Returns - ------- + Raises + ------ + ValueError + if data is not a list of string, or if is emply """ if not isinstance(data, list): - raise ValueError("{} has to be a list".format(data)) + raise ValueError(f"{data} has to be a list") if len(data) == 0: - raise ValueError("{} is empty".format(data)) + raise ValueError(f"{data} is empty") for document in data: if not isinstance(document, str): - raise ValueError("All elements of {} have to be a string, problem with {}".format(data, document)) + raise ValueError(f"All elements of {data} have to be a string, problem with {document}") - def compute_topics(self, nb_word_per_cluster): + def compute_topics(self, nb_word_per_cluster: int) -> dict: """ Main function computing the topic modeling, topics Parameters ---------- - nb_word_per_cluster : positive integer + nb_word_per_cluster : int Returns ------- - dict : - a dictionary containing the the different topics with the top words + dict + A dictionary containing the the different topics with the top words and coherence associated """ vec = CountVectorizer(stop_words=self.lang) @@ -129,25 +131,26 @@ def compute_topics(self, nb_word_per_cluster): return results - def get_document_topic(self, index): + def get_document_topic(self, index: int) -> int: """ Get the cluster associated to the specified document Parameters ---------- - index : positive integer - the document index + index : int + The document index Returns ------- - the cluster index + int + the cluster index """ if self._topics is None: raise ValueError("Model needs to be trained first") return self._topics[index].argmax() - def save_pyldavis_plot_as_html(self, path_to_output='./biterm_pyLDAavis_plot.html'): + def save_pyldavis_plot_as_html(self, path_to_output: str = './biterm_pyLDAavis_plot.html'): """ Function saving the pyLDAvis plot associated with the compute_topics function @@ -155,9 +158,6 @@ def save_pyldavis_plot_as_html(self, path_to_output='./biterm_pyLDAavis_plot.htm ---------- path_to_output : str path to save the plut, must be a html file - - Returns - ------- """ if self._topics is None or self._btm is None or self._vectorize_text is None or self._vocabulary is None: raise ValueError("Model needs to be trained first") From b787860646ef45d0435e4875a6f65d719a75c986 Mon Sep 17 00:00:00 2001 From: hugovasselin <waaaouu@gmail.com> Date: Fri, 16 Oct 2020 19:35:56 +0200 Subject: [PATCH 347/496] feat: harmonize docstrings --- nautilus_nlp/topic_modeling/lda.py | 128 +++++++++++++++++------------ 1 file changed, 77 insertions(+), 51 deletions(-) diff --git a/nautilus_nlp/topic_modeling/lda.py b/nautilus_nlp/topic_modeling/lda.py index 3363805..6cee4fe 100644 --- a/nautilus_nlp/topic_modeling/lda.py +++ b/nautilus_nlp/topic_modeling/lda.py @@ -15,6 +15,7 @@ # You should have received a copy of the GNU Lesser General Public License # along with this program; if not, write to the Free Software Foundation, # Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +from typing import List, Optional import logging import os @@ -29,54 +30,60 @@ logging.getLogger("gensim").setLevel(logging.WARNING) -def create_dictionary(data): +def create_dictionary(data: List[List[str]]) -> List[List[tuple]]: """ Create a Dictionary encapsulates the mapping between normalized words and their integer ids. Parameters ---------- - data : list of list of tokens + data : list + list of list of tokens Returns ------- - list of list of tuples + list + List of list of tuples """ return gensim.corpora.Dictionary(data) -def filter_extremes(dictionary, no_below=15, no_above=0.3, **kwargs): +def filter_extremes( + dictionary: gensim.corpora.Dictionary, no_below: Optional[int]=15, no_above: Optional[float]=0.3, **kwargs) -> gensim.corpora.Dictionary: """ Remove very rare and very common words Parameters ---------- - dictionary: dictionary containing the number of times a word appears in the dataset set - no_below : int, optional - Keep tokens which are contained in at least `no_below` documents. - no_above : float, optional - Keep tokens which are contained in no more than `no_above` documents - (fraction of total corpus size, not an absolute number). - - (Add to docstring) + other func + dictionary : dict + dictionary containing the number of times a word appears in the dataset set + no_below : Optional[int] + Keep tokens which are contained in at least `no_below` documents. + no_above : Optional[float] + Keep tokens which are contained in no more than `no_above` documents. (fraction\ + of total corpus size, not an absolute number). + + Returns + ------- + gensim.corpora.Dictionary """ return dictionary.filter_extremes(no_below=no_below, no_above=no_above, **kwargs) def create_bow_corpus(data, dictionary): - """ Create the corpus: one of the two main inputs to the LDA topic model with the dictionary (id2word) The produced corpus is a mapping of (token_id, token_count). Parameters ---------- - data : list of list of tokens + data : list + list of list of tokens Returns ------- - list of list of tuples + list + listof list of tuples """ - texts = data - corpus = [dictionary.doc2bow(text) for text in texts] + corpus = [dictionary.doc2bow(text) for text in data] return corpus ### Find Number of topics @@ -89,15 +96,22 @@ def compute_coherence_values(dictionary, bow_corpus, texts, limit=25, start=2, s Parameters: ---------- - dictionary : Gensim dictionary + dictionary : gensim.corpora.Dictionary + Gensim dictionary bow_corpus : Gensim bow corpus - texts : List of input texts - limit : Max num of topics + texts : list + List of input texts + limit : int + Max number of topics + start : int + step : int Returns: ------- - model_list : List of LDA topic models - coherence_values : Coherence values corresponding to the LDA model with respective number of topics + model_list : list + List of LDA topic models + coherence_values : + Coherence values corresponding to the LDA model with respective number of topics """ coherence_values = [] model_list = [] @@ -123,12 +137,15 @@ def plot_optimal_topic_number(coherence_values, start=2, limit=25, step=4): Parameters: ---------- - coherence_values : list of coherence scores for various number of topics - start : int. Min num of topics - limit : int. Max num of topics + coherence_values : list + list of coherence scores for various number of topics + start : int + Min num of topics + limit : int + Max num of topics step: int - Output: + Returns ------- Lineplot """ @@ -150,21 +167,29 @@ def print_coherence_scores(coherence_values, start=2, limit=25, step=4): ### LdaModel: Gensim & Mallet -def train_lda_model(bow_corpus, dictionary, num_topics, model='gensim', mallet_path=None, **kwargs): +def train_lda_model(bow_corpus, dictionary: gensim.corpora.Dictionary, num_topics, model='gensim', mallet_path=None, **kwargs): """ Train the lda model on the corpus Parameters ---------- - bow_corpus : iterable of list of tokens. Stream of document vectors or sparse matrix of shape \ + bow_corpus : list + iterable of list of tokens. Stream of document vectors or sparse matrix of shape \ (num_terms, num_documents). - dictionary: corpora.Dictionary. Mapping from word IDs to words + dictionary: gensim.corpora.Dictionary + Mapping from word IDs to words num_topics: int - model : str. Precise the topic modeling model wanted, must be "gensim" or "mallet" - mallet_path: str, optionnal if model='gensim', required if model='mallet'. Path to the mallet-2.0.8 file + model : str + Precise the topic modeling model wanted, must be "gensim" or "mallet" + mallet_path: Optional[str] + If model='gensim', required if model='mallet'. Path to the mallet-2.0.8 file Returns ------- gensim.ldamodel + + Raises + ------ + ValueError """ if model == 'gensim': model = train_lda_gensim(bow_corpus, dictionary, num_topics, **kwargs) @@ -200,7 +225,7 @@ def save_model(model, model_name): Parameters ---------- model: ldamodel - model_name: str. + model_name: str Name the model that will be saved """ return model.save(os.path.join(model_name)) @@ -220,13 +245,6 @@ def load_model(model_path, model_name, model='gensim', model_prefix='composant') Precise the topic modeling model wanted, must be "gensim" or "mallet" model_prefix : str By default, 'composant' default prefix used while saving the mallet model with train_lda_model function. - - Returns - ------- - is_reliable : - is the top language is much better than 2nd best language? - language: - 2-letter code for the language of the text """ if model == 'gensim': ldamodel = gensim.models.LdaModel.load(os.path.join(model_path, model_name)) @@ -253,14 +271,19 @@ def visualize_topics(model, bow_corpus, dictionary, model_type=None): Parameters ---------- - model: LDA model: gensim or mallet - bow_corpus : iterable of list of tokens. - dictionary: corpora.Dictionary. Dictionary encapsulates the mapping between normalized words and their integer ids. - model : str. Precise the topic modeling model used, must be "gensim" or "mallet" + model: + LDA model: gensim or mallet + bow_corpus : list + iterable of list of tokens. + dictionary: corpora.Dictionary + Dictionary encapsulates the mapping between normalized words and their integer ids. + model : str + Precise the topic modeling model used, must be "gensim" or "mallet" - Returns: - ---------- - 3D interactive chart + Returns + ------- + pyLDAvis + 3D interactive chart """ if model_type == 'mallet': model_vis = gensim.models.wrappers.ldamallet.malletmodel2ldamodel(model) @@ -304,11 +327,14 @@ def show_dominant_topic(model, bow_corpus, topic_number=1, topn=5): Parameters ---------- - gensim.ldamodel - model: ldamodel - bow_corpus: iterable of list of tokens. - topic_number: int. Pick the number of topics displayed - topn: int. Number of topics' top keyword displayed + model + gensim.ldamodel + bow_corpus : list + iterable of list of tokens. + topic_number: int + Pick the number of topics displayed + topn : int + Number of topics' top keyword displayed """ i = 0 From 770ba5bfa49f7d06e8af4ef59877ea278977e7eb Mon Sep 17 00:00:00 2001 From: hugovasselin <waaaouu@gmail.com> Date: Fri, 16 Oct 2020 19:38:03 +0200 Subject: [PATCH 348/496] feat: harmonize docstring --- nautilus_nlp/topic_modeling/nmf_model.py | 37 +++++++++++++++++------- 1 file changed, 26 insertions(+), 11 deletions(-) diff --git a/nautilus_nlp/topic_modeling/nmf_model.py b/nautilus_nlp/topic_modeling/nmf_model.py index 1a9f38d..3bb3ac1 100644 --- a/nautilus_nlp/topic_modeling/nmf_model.py +++ b/nautilus_nlp/topic_modeling/nmf_model.py @@ -29,17 +29,28 @@ def __init__( self, mat_a, mat_iw, mat_ih, n_topic=10, max_iter=100, max_err=1e-3, rand_init=True): """ - The objective of the NMF model is to approximate the term-document matrix A by two lower-rank matrices W and H. - The process is iterative and we denote IW and IH the the matrix W and H that are updated at each step. - - :param mat_a: The term-document matrix - :param mat_iw: topics Matrix, each column vector W(:,k) represents the k-th topic in terms of M keywords + The objective of the NMF model is to approximate the term-document matrix A by two \ + lower-rank matrices W and H. + The process is iterative and we denote IW and IH the the matrix W and H that are \ + updated at each step. + + Parameters + ---------- + mat_a + The term-document matrix + mat_iw + topics Matrix, each column vector W(:,k) represents the k-th topic in terms of M keywords and its elements are the weights of the corresponding keywords. - :param mat_ih: The row vector H(j,:) is the latent representation for document j in terms of K topics - :param n_topic: Number of selected topics - :param max_iter: Maximum number of iterations to update W and H - :param max_err: maximum error under which we consider that the loop converged - :param rand_init: random init boolean + mat_ih + The row vector H(j,:) is the latent representation for document j in terms of K topics + n_topic + Number of selected topics + max_iter + Maximum number of iterations to update W and H + max_err + maximum error under which we consider that the loop converged + rand_init : bool + random init boolean """ self.mat_a = mat_a self.mat_iw = mat_iw @@ -58,7 +69,11 @@ def __init__( def nmf_mat_init(self, rand_init): """ Init Matrices W and H initially either randomly or using existing IW, IH matrices taken when iterating. - :param rand_init: Boolean indicating initial random init + + Parameters + ---------- + rand_init : Boolean + Indicating initial random init """ if rand_init: self.mat_w = np.random.random((self.n_row, self.n_topic)) From 90e1d0909dfa85e34f4b3f203f8ddc49c46f9914 Mon Sep 17 00:00:00 2001 From: hugovasselin <waaaouu@gmail.com> Date: Fri, 16 Oct 2020 23:29:14 +0200 Subject: [PATCH 349/496] refacto: harmonize docstring + typing --- nautilus_nlp/topic_modeling/seanmf_model.py | 45 +++-- .../topic_modeling_short_text.py | 187 +++++++++++------- nautilus_nlp/utils/file_loader.py | 98 +++++---- nautilus_nlp/utils/phone_number.py | 51 +++-- nautilus_nlp/utils/stopwords.py | 8 +- nautilus_nlp/utils/tokenizer.py | 36 +++- tests/test_topic_modeling_short_text.py | 2 +- 7 files changed, 284 insertions(+), 143 deletions(-) diff --git a/nautilus_nlp/topic_modeling/seanmf_model.py b/nautilus_nlp/topic_modeling/seanmf_model.py index 9513435..0fbb584 100644 --- a/nautilus_nlp/topic_modeling/seanmf_model.py +++ b/nautilus_nlp/topic_modeling/seanmf_model.py @@ -33,19 +33,34 @@ def __init__( Seanmf is a topic modeling algorithm, paper: http://dmkd.cs.vt.edu/papers/WWW18.pdf. It finds an approximation to the term-document matrix A by two lower-rank matrices W and H, at each iteration a context matrix Wc are computed and used to update W. - :param mat_a: document term matrix - :param mat_s: Word-context (semantic) correlation matrix - :param mat_iw: topics Matrix, each column vector W(:,k) represents the k-th topic in terms of M keywords + + Parameters + ---------- + mat_a + document term matrix + mat_s + Word-context (semantic) correlation matrix + mat_iw + topics Matrix, each column vector W(:,k) represents the k-th topic in terms of M keywords and its elements are the weights of the corresponding keywords. - :param mat_iwc: Latent factor matrix of contexts. - :param mat_ih: The row vector H(j,:) is the latent representation for document j in terms of K topics - :param alpha: Seanmf algorithm parameter - :param beta: Seanmf algorithm parameter - :param n_topic: Number of selected topics - :param max_iter: Maximum number of iterations to update W and H - :param max_err: maximum error under which we consider that the loop converged - :param rand_init: random init boolean - :param fix_seed: int number to fix random seed. + mat_iwc + Latent factor matrix of contexts. + mat_ih + The row vector H(j,:) is the latent representation for document j in terms of K topics + alpha + Seanmf algorithm parameter + beta + Seanmf algorithm parameter + n_topic + Number of selected topics + max_iter + Maximum number of iterations to update W and H + max_err + maximum error under which we consider that the loop converged + rand_init + random init boolean + fix_seed + int number to fix random seed. """ if fix_seed: np.random.seed(0) @@ -68,7 +83,11 @@ def __init__( def snmf_mat_init(self, rand_init, mat_iw, mat_iwc, mat_ih): """ Init Matrices W,Wc and H initially either randomly or using existing IW,IWc IH matrices taken when iterating. - :param rand_init: Boolean indicating initial random init + + Parameters + ---------- + rand_init : bool + Boolean indicating initial random init """ if rand_init: self.mat_w = np.random.random((self.n_row, self.n_topic)) diff --git a/nautilus_nlp/topic_modeling/topic_modeling_short_text.py b/nautilus_nlp/topic_modeling/topic_modeling_short_text.py index a31a772..5402937 100644 --- a/nautilus_nlp/topic_modeling/topic_modeling_short_text.py +++ b/nautilus_nlp/topic_modeling/topic_modeling_short_text.py @@ -25,14 +25,25 @@ from nautilus_nlp.topic_modeling.seanmf_model import SeaNMF -def prepare_data(text, vocab_min_count=1, vocab_max_size=10000): +def prepare_data(text: str, vocab_min_count: int = 1, vocab_max_size: int = 10000): """ - :param text: list of str on which the topic modeling will be performed - :param vocab_min_count: minimum number of occurrences of a word to be considered in the vocabulary - :param vocab_max_size: maximum number of word in the vocabulary - :return: encoded_text_id: list of encoded sentences using vocab IDs - vocab_list: list of vocabulary - vocab_arr: array with vocab frequency counts + Parameters + ---------- + text : str + list of str on which the topic modeling will be performed + vocab_min_count : int + minimum number of occurrences of a word to be considered in the vocabulary + vocab_max_size : int + maximum number of word in the vocabulary + + Returns + ------- + list + list of encoded sentences using vocab IDs + list + list of vocabulary + Array + array with vocab frequency counts """ vocab = {} @@ -64,18 +75,35 @@ def prepare_data(text, vocab_min_count=1, vocab_max_size=10000): def train_shorttext_model( - model_name, encoded_text_id, vocab_list, n_topics=20, - max_iter=20, max_err=0.1, alpha=0, beta=0): + model_name: str, encoded_text_id: list, vocab_list: list, n_topics: int = 20, + max_iter: int = 20, max_err: float = 0.1, alpha: float = 0, beta: float = 0): """ - :param model_name: string = 'nmf' or 'seanmf' - :param encoded_text_id: list of encoded sentences - :param vocab_list: list of vocabulary - :param n_topics: number of topics - :param max_iter: maximum number of iterations while training - :param max_err: training error - :param alpha: regularization param for the NMF model - :param beta: regularization param for the NMF model - :return: Trained NMF model + Parameters + ---------- + model_name : str {'nmf','seanmf'} + encoded_text_id : list + list of encoded sentences + vocab_list : list + list of vocabulary + n_topics : int + number of topics + max_iter : int + maximum number of iterations while training + max_err : float + training error + alpha : float + regularization param for the NMF model + beta : float + regularization param for the NMF model + + Returns + ------- + Trained NMF model + + Raises + ------ + ValueError + If model_name is not valid """ n_docs = len(encoded_text_id) @@ -83,7 +111,7 @@ def train_shorttext_model( if model_name == 'nmf': dt_mat = __build_doc_term_matrix(n_terms, n_docs, encoded_text_id) - model = NMF( + return NMF( dt_mat, mat_iw=[], mat_ih=[], @@ -98,7 +126,7 @@ def train_shorttext_model( mat_ss = __calculate_ppmi(cooc_mat, n_terms) # Build doc-term matrix dt_mat = __build_doc_term_matrix(n_terms, n_docs, encoded_text_id) - model = SeaNMF( + return SeaNMF( dt_mat, mat_ss, mat_iw=[], mat_iwc=[], @@ -109,24 +137,31 @@ def train_shorttext_model( max_iter=max_iter, max_err=max_err, fix_seed=1024) + raise ValueError("Invalid model name: Use nmf or seanmf") - else: - model = None - print('Invalid model name: Use nmf or seanmf') - return model - - -def show_dominant_topic(model, encoded_text_id, vocab_list, n_top_keyword=10): +def show_dominant_topic(model, encoded_text_id: list, vocab_list: list, n_top_keyword: int = 10): """ Computes the PMi score for each topic and the topKeywords describing each of them. - :param model: trained NMF model - :param encoded_text_id: list of encoded sentences - :param vocab_list: list of vocabulary - :return: topics = dictionnary with the topic number and its topkeywords - pmi_score = dictionnary with the topic number and its PMI score - """ + Parameters + ---------- + - model + trained NMF model + - encoded_text_id : list + list of encoded sentences + - vocab_list : list + list of vocabulary + - n_top_keyword : list + the number of keywords to be returned + + Returns + ------- + dict + A dictionnary with the topic number and its top keywords + dict + A ictionnary with the topic number and its PMI score + """ dt_mat = __build_cooccurence_matrix(n_terms=len(vocab_list), encoded_text_id=encoded_text_id) np.fill_diagonal(dt_mat, 0) mat_w, _ = model.get_decomposition_matrix() @@ -153,8 +188,17 @@ def show_dominant_topic(model, encoded_text_id, vocab_list, n_top_keyword=10): def get_assigned_topics(model): """ Assign the topic number to the sentences used when training the model - :param model: trained model for short text - :return topics_list: list having the same length as the training text containing topics assigned to each sentence. + + Parameters + ---------- + model + trained model for short text + + Returns + ------- + list + list of topics. Having the same length as the training text containing topics assigned \ + to each sentence. """ _, mat_h = model.get_decomposition_matrix() @@ -167,10 +211,18 @@ def get_assigned_topics(model): def show_pyldavis(model, encoded_text_id, vocab_arr): """ - :param model: trained model - :param encoded_text_id: encoded_text_id: list of encoded sentences - :param vocab_arr: array of vocabulary frequency - :return: pyldavis topics plot + Parameters + ---------- + model + trained model + encoded_text_id + encoded_text_id: list of encoded sentences + vocab_arr + array of vocabulary frequency + + Returns + ------- + pyldavis topics plot """ data = prepare_data_pyldavis(model, encoded_text_id, vocab_arr) @@ -179,49 +231,53 @@ def show_pyldavis(model, encoded_text_id, vocab_arr): return pyLDAvis.display(vis_data) -def prepare_data_pyldavis(model, encoded_text_id, vocab_arr): +def prepare_data_pyldavis(model, encoded_text_id, vocab_arr) -> dict: """ Transform the model decomposed matrix to create topic term and document topics matrices and prepare data to feed pyldavis. link : http://jeriwieringa.com/2018/07/17/pyLDAviz-and-Mallet/ - :return dict of data needed by pyldavis - """ - # 1 List of documents lengths - doc_length_values = [] - for doc in encoded_text_id: - doc_length_values.append(len(doc)) - # 2 List of vocab + Returns + ------- + dict + dict of data needed by pyldavis + """ + doc_length_values = [len(doc) for doc in encoded_text_id] list_vocab = list(map(lambda x: x[0], vocab_arr)) - # 3 List of vocab. Frequency freq_vocab = list(map(lambda x: x[1], vocab_arr)) mat_w, mat_h = model.get_decomposition_matrix() # Normlize the decomposition to get probabilities w_probs = mat_w / mat_w.sum(axis=1, keepdims=True) - # 4 topic term matrix phi + # Topic-term matrix phi phi = w_probs.T - # 5 document term matrix theta + # Document-term matrix theta theta = mat_h / mat_h.sum(axis=1, keepdims=True) - - data = {'topic_term_dists': phi, - 'doc_topic_dists': theta, - 'doc_lengths': doc_length_values, - 'vocab': list_vocab, - 'term_frequency': freq_vocab - } - - return data + return { + 'topic_term_dists': phi, + 'doc_topic_dists': theta, + 'doc_lengths': doc_length_values, + 'vocab': list_vocab, + 'term_frequency': freq_vocab + } + -def __build_cooccurence_matrix(n_terms, encoded_text_id): +def __build_cooccurence_matrix(n_terms: int, encoded_text_id: list): """ The cooccurence matrix represents the number of times each word appeared in the same context as another word from the vocabulary. The matrix has n_terms x n_terms size, columns and rows denote the vocab. Cell values represent the number of times words occured together in the same sentence. - :param :encoded_text_id : list of encoded sentences - :return: res: the co-occurence matrix - + + Parameters + ---------- + n_terms : int + encoded_text_id : list + list of encoded sentences + + Returns + ------- + co-occurence matrix """ res = np.zeros([n_terms, n_terms]) for row in encoded_text_id: @@ -259,10 +315,8 @@ def __build_doc_term_matrix(n_terms, n_docs, encoded_text_id): def __calculate_pmi(mat_aa, top_keywords_index): ''' Method to compute PMi score - Reference: - Short and Sparse Text Topic Modeling via Self-Aggregation + Reference: Short and Sparse Text Topic Modeling via Self-Aggregation ''' - mat_d1 = np.sum(mat_aa) n_tp = len(top_keywords_index) mat_pmi = [] @@ -276,5 +330,4 @@ def __calculate_pmi(mat_aa, top_keywords_index): mat_c2 = np.sum(mat_aa[index2]) mat_pmi.append(np.log(mat_aa[index1,index2]*mat_d1/mat_c1/mat_c2)) avg_pmi = 2.0*np.sum(mat_pmi)/float(n_tp)/(float(n_tp)-1.0) - return avg_pmi diff --git a/nautilus_nlp/utils/file_loader.py b/nautilus_nlp/utils/file_loader.py index 5bbcc80..ece5a4d 100644 --- a/nautilus_nlp/utils/file_loader.py +++ b/nautilus_nlp/utils/file_loader.py @@ -23,17 +23,18 @@ import re import shutil import warnings +from typing import Optional, Union import chardet -def open_textfile(filepath, encoding='utf-8'): +def open_textfile(filepath: str, encoding='utf-8'): with io.open(filepath, 'r', encoding=encoding) as f: string = f.read() return string -def detect_encoding(file_path_or_string, n_lines=100): +def detect_encoding(file_path_or_string: str, n_lines: int = 100) -> str: """ Predict a file's encoding using chardet @@ -46,7 +47,8 @@ def detect_encoding(file_path_or_string, n_lines=100): Returns ------- - the code of the detected encoding + string + the code of the detected encoding """ if os.path.isfile(file_path_or_string): with open(file_path_or_string, 'rb') as f: @@ -56,22 +58,29 @@ def detect_encoding(file_path_or_string, n_lines=100): return chardet.detect(rawdata) -def text_loader(filepath, encoding=None, detectencoding=True): +def text_loader(filepath: str, encoding: Optional[str] = None, detectencoding: bool = True) -> str: ''' This util loads a file. If the encoding is specified, will use the specified encoding to load the text file. If not specified, this function tries to open the doc as UTF-U, and if it fails it will try to detect the encoding using **detect_encoding** + Parameters ---------- filepath : str encoding : str If the encoding is specified, will use the specified encoding to load the text file. - detect_encoding : bool - If file is not encoded into UTF-8, try to detect encoding using the chardet library. + detectencoding : bool + If file is not encoded into UTF-8, try to detect encoding using the chardet library. + Returns ------- string + + Raises + ------ + UnicodeDecodeError + if document can't be loaded with utf-8 encoding. ''' if encoding is not None: return open_textfile(filepath, encoding=encoding) @@ -88,13 +97,16 @@ def text_loader(filepath, encoding=None, detectencoding=True): 'Try to detect encoding using detectencoding=True') -def get_subfolders_path(folder): +def get_subfolders_path(folder: str) -> list: if not folder.endswith("/"): folder = folder + "/" - return [folder + f+'/' for f in os.listdir(folder)if os.path.isdir(os.path.join(folder, f)) and f != ".DS_Store"] + return [ + folder + f+'/' for f in os.listdir(folder) + if os.path.isdir(os.path.join(folder, f)) and f != ".DS_Store" + ] -def list_files_in_subdir(filepath): +def list_files_in_subdir(filepath: str) -> list: ''' Get a list of all the filepath of files in directory and subdirectory. ''' @@ -105,11 +117,19 @@ def list_files_in_subdir(filepath): return res -def list_files(filepath: str): +def list_files(filepath: str) -> list[str]: """ - inputs a filepath. - Outputs a list of filepath. - Supports regex + List files within a given filepath. + + Parameters + ---------- + filepath : str + Supports wildcard "*" character. + + Returns + ------- + list + list of filepaths """ if os.path.isdir(filepath) and len(re.findall(r"[\w.]$", filepath)) > 0: @@ -119,28 +139,32 @@ def list_files(filepath: str): return [file for file in glob.glob(filepath) if os.path.isfile(file)] -def documents_loader(filepath: str, encoding=None, detectencoding=True, output_as='dict'): +def documents_loader( + filepath: str, + encoding: Optional[str] = None, + detectencoding: bool = True, + output_as: str = 'dict' + ) -> Union[str, list, dict]: ''' Input a filepath, a filepath with wildcard (eg. *.txt), - or a list of filepaths. - Output a string, or a dict of strings. + or a list of filepaths. Output a string, or a dict of strings. + Parameters ---------- - filepath: filepath + filepath : str A filepath with wildcard (eg. *.txt), or a list of filepaths. - output_as: list or dict. - If dict, key will be the filename. - encoding: + encoding : Optional[str] if not specified, will try to detect encoding except if detectencoding is false. detectencoding : bool if True and if encoding is not specified, will try to detect encoding using chardet. + output_as: str {list, dict} + If dict, key will be the filename. Returns ------- - string - the document loaded + Uniont[string, list, dict] + The document loaded. ''' - if isinstance(filepath, str): documents = list_files(filepath) nb_of_documents = len(documents) @@ -154,18 +178,21 @@ def documents_loader(filepath: str, encoding=None, detectencoding=True, output_a return text_loader(documents[0], encoding=encoding, detectencoding=detectencoding) if nb_of_documents > 1: if output_as == 'list': - return [text_loader(document, encoding=encoding, detectencoding=detectencoding) for document in documents] + return [ + text_loader(document, encoding=encoding, detectencoding=detectencoding) + for document in documents + ] if output_as == 'dict': - return {document : text_loader( - document, encoding=encoding, detectencoding=detectencoding) for document in documents} + return { + document : text_loader( + document, encoding=encoding, detectencoding=detectencoding) for document in documents + } raise TypeError('Enter a valid output format between list or dict') raise IOError('No files detected in {}'.format(filepath)) - -################# ## CSV Loader -def encode_columns(df, columns_to_encode): +def encode_columns(df, columns_to_encode: str): ''' apply json.dumps on columns ''' @@ -173,21 +200,20 @@ def encode_columns(df, columns_to_encode): df[col] = df[col].apply(json.dumps) -def decode_columns(df, columns_to_encode): +def decode_columns(df, columns_to_encode: str): ''' apply json.loads on columns ''' for col in columns_to_encode: df[col] = df[col].apply(json.loads) - -################# ## Encoding functions -def convert_encoding(file_path, input_encoding, output_encoding): + +def convert_encoding(filepath: str, input_encoding: str, output_encoding: str): ''' - Encode a file according to a specified encoding + Encode a file according to a specified encoding. ''' - with codecs.open(file_path, encoding=input_encoding) as input_file: + with codecs.open(filepath, encoding=input_encoding) as input_file: with codecs.open( - 'encoded_'+file_path, "w", encoding=output_encoding) as output_file: + 'encoded_'+filepath, "w", encoding=output_encoding) as output_file: shutil.copyfileobj(input_file, output_file) diff --git a/nautilus_nlp/utils/phone_number.py b/nautilus_nlp/utils/phone_number.py index 66571ca..baff7f6 100644 --- a/nautilus_nlp/utils/phone_number.py +++ b/nautilus_nlp/utils/phone_number.py @@ -15,6 +15,7 @@ # You should have received a copy of the GNU Lesser General Public License # along with this program; if not, write to the Free Software Foundation, # Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +from typing import Optional import phonenumbers as _phonenumbers SUPPORTED_COUNTRY = [None, 'US', 'AG', 'AI', 'AS', 'BB', 'BM', 'BS', 'CA', 'DM', @@ -46,32 +47,38 @@ "RFC3966": _phonenumbers.PhoneNumberFormat.RFC3966 } -def find_phone_numbers(string, region_code=None): +def find_phone_numbers(string: str, region_code: Optional[str] = None) -> str: """ Python port of Google's libphonenumber. https://github.com/daviddrysdale/python-phonenumbers Parameters ---------- - region_code + region_code : str If specified, will find the number of the specified country. eg. 06.00.00.00.00 if "FR" is specified. If not specified, only works for international-formatted phone numbers. - ie. phone number with +country code specified eg. 06.00.00.00.00 will return an error but +33 6 00 00 00 00 will work. + supported value: look SUPPORTED_COUNTRY variable. - region_code - supported value: look SUPPORTED_COUNTRY variable. + Returns + ------- + list + list of matched phone numbers. + Raises + ------ + ValueError + if country code is not supported. """ if region_code not in SUPPORTED_COUNTRY: raise ValueError('Please enter a valid contry code. See SUPPORTED_COUNTRY list.') - return [match.raw_string for match in _phonenumbers.PhoneNumberMatcher(string, region_code)] -def extract_phone_numbers(text: str, countrylist: list)->list: +def extract_phone_numbers(text: str, countrylist: list) -> list: ''' Find phone numbers in a text, returns a list of phone numbers. @@ -80,6 +87,11 @@ def extract_phone_numbers(text: str, countrylist: list)->list: countrylist: list (eg. [None,'FR','US','GB']) Look for phone numbers formatted according to the specified countlist. supported value: look SUPPORTED_COUNTRY variable. + + Returns + ------- + list + List of unique phone numbers found. ''' all_phone_numbers = [] for country in countrylist: @@ -99,20 +111,24 @@ def __init__(self): self.text = None self.parsed_num = None - def parse_number(self, text: str, region_code=None): + def parse_number(self, text: str, region_code: Optional[str] = None) -> str: ''' + Extract phone number from text + Parameters ---------- - region_code + region_code : Optional[str] If specified, will find the number of the specified country. eg. 06.00.00.00.00 if "FR" is specified. - If not specified, only works for international-formatted phone numbers. - ie. phone number with +country code specified eg. 06.00.00.00.00 will return an error but +33 6 00 00 00 00 will work. + supported value: look SUPPORTED_COUNTRY variable. - region_code - supported value: look SUPPORTED_COUNTRY variable. + Returns + ------- + str + The parsed number Raises ------ @@ -125,9 +141,18 @@ def parse_number(self, text: str, region_code=None): return self.parsed_num - def format_number(self, num_format): + def format_number(self, num_format: str) -> str: ''' - ['E164','INTERNATIONAL','NATIONAL','RFC3966'] + Convert a phone number to another standard format. + + Parameters + ---------- + num_format : str {'E164','INTERNATIONAL','NATIONAL','RFC3966'} + + Returns + ------- + str + Number formatted ''' standard_format = FORMAT_NUMBERS.get(num_format) if standard_format is None: diff --git a/nautilus_nlp/utils/stopwords.py b/nautilus_nlp/utils/stopwords.py index c94e812..f34d4b8 100644 --- a/nautilus_nlp/utils/stopwords.py +++ b/nautilus_nlp/utils/stopwords.py @@ -17,14 +17,16 @@ # Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. # -*- coding: utf-8 -*- -from __future__ import absolute_import, division, print_function, unicode_literals +from __future__ import (absolute_import, division, print_function, + unicode_literals) import json import os -from stop_words import get_stop_words as _get_stop_words -from stop_words import LANGUAGE_MAPPING as _LANGUAGE_MAPPING + from nautilus_nlp.config.config import ROOT_FOLDER from nautilus_nlp.utils.file_loader import documents_loader +from stop_words import LANGUAGE_MAPPING as _LANGUAGE_MAPPING +from stop_words import get_stop_words as _get_stop_words STOPWORDS_JSON_FILEPATH = os.path.join(ROOT_FOLDER, "data", "stopwords.json") diff --git a/nautilus_nlp/utils/tokenizer.py b/nautilus_nlp/utils/tokenizer.py index f06def1..92c6217 100644 --- a/nautilus_nlp/utils/tokenizer.py +++ b/nautilus_nlp/utils/tokenizer.py @@ -15,6 +15,7 @@ # You should have received a copy of the GNU Lesser General Public License # along with this program; if not, write to the Free Software Foundation, # Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +from typing import List import nltk from sacremoses import MosesTokenizer, MosesDetokenizer import spacy @@ -47,26 +48,31 @@ def get_lang_model(self): return self.model.lang -def _get_spacy_tokenizer(lang): +def _get_spacy_tokenizer(lang: str) -> spacy.tokenizer.Tokenizer: """ Function that gets the right tokenizer given the language - :param str lang: language in which text is written - Languages handled : ["en", "fr", "ko", "ja"] - :return: spacy tokenizer - :rtype: spacy.tokenizer.Tokenizer + Parameters + ---------- + lang : str + Language in which text is written. Languages handled : ["en", "fr", "ko", "ja"] + + Returns + ------- + spacy.tokenizer.Tokenizer + spacy tokenizer """ model = SpacyModel(lang).model return model.tokenizer -def tokenize(text: str, lang_module: str = 'en_spacy'): +def tokenize(text: str, lang_module: str = 'en_spacy') -> List[str]: """ Convert text to a list of tokens. Parameters ---------- - lang_module : ({'en_spacy', 'en_nltk', 'fr_spacy', 'fr_moses', 'ko_spacy', 'ja_spacy'}) + lang_module : str {'en_spacy', 'en_nltk', 'fr_spacy', 'fr_moses', 'ko_spacy', 'ja_spacy'} choose the tokenization module according to the langage and the implementation. Recommanded: Spacy (faster, better results). To process other langages import models.Spacy_models @@ -75,6 +81,11 @@ def tokenize(text: str, lang_module: str = 'en_spacy'): ------- list list of string + + Raises + ------ + ValueError + If lang_module is not a valid module name """ if "spacy" in lang_module: lang = lang_module.split()[0] @@ -89,7 +100,7 @@ def tokenize(text: str, lang_module: str = 'en_spacy'): "{'en_spacy', 'en_nltk', 'fr_spacy', 'fr_moses', 'ko_spacy', 'ja_spacy'}") -def untokenize(tokens, lang='fr'): +def untokenize(tokens: List[str], lang: str = 'fr') -> str: ''' Inputs a list of tokens output string. ["J'", 'ai'] >>> "J' ai" @@ -98,13 +109,18 @@ def untokenize(tokens, lang='fr'): ---------- lang : string language code + + Returns + ------- + string + text ''' d = MosesDetokenizer(lang=lang) text = d.detokenize(tokens, unescape=False) return text -def _convert_tokens_to_string(tokens_or_str): +def convert_tokens_to_string(tokens_or_str): if isinstance(tokens_or_str, str): return tokens_or_str if isinstance(tokens_or_str, list): @@ -114,7 +130,7 @@ def _convert_tokens_to_string(tokens_or_str): raise TypeError('Please input string or tokens') -def _convert_string_to_tokens(tokens_or_str, lang_module='en_spacy'): +def convert_string_to_tokens(tokens_or_str, lang_module='en_spacy'): if isinstance(tokens_or_str, str): return tokenize(tokens_or_str, lang_module=lang_module) if isinstance(tokens_or_str, list): diff --git a/tests/test_topic_modeling_short_text.py b/tests/test_topic_modeling_short_text.py index 2265738..5d8ad7a 100644 --- a/tests/test_topic_modeling_short_text.py +++ b/tests/test_topic_modeling_short_text.py @@ -51,7 +51,7 @@ (['', ''], []), ],) def test_prepare_data(input_text, expected_output): - assert prepare_data(input_text), expected_output + assert prepare_data(input_text) == expected_output @pytest.mark.parametrize("model_name", ['nmf', 'seanmf']) From 96bafb9f68afb0a2fd223ec098c2d75805f105dc Mon Sep 17 00:00:00 2001 From: hugovasselin <waaaouu@gmail.com> Date: Sun, 18 Oct 2020 18:07:45 +0200 Subject: [PATCH 350/496] refacto: add f strings --- nautilus_nlp/analysis/visualize.py | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/nautilus_nlp/analysis/visualize.py b/nautilus_nlp/analysis/visualize.py index f933a59..9555224 100644 --- a/nautilus_nlp/analysis/visualize.py +++ b/nautilus_nlp/analysis/visualize.py @@ -70,10 +70,11 @@ def print_concordance( context = width // 4 # approx number of words of context results = [i for i, j in enumerate(tokens) if j == query_word] - if len(results) > 0: + nb_results = len(results) + if nb_results > 0: if n_results is None: - n_results = len(results) - print('{} matches for "{}":'.format(len(results), query_word)) + n_results = nb_results + print(f'{nb_results} matches for "{query_word}":') for i in results[:n_results]: # Find the context of query word. left_context = tokens[max(0, i - context): i] @@ -85,4 +86,4 @@ def print_concordance( line_print = ' '.join([left_print, query_word, right_print]) print(line_print) else: - warnings.warn('No match for "{}"'.format(query_word)) + warnings.warn(f'No match for "{query_word}"') From 3f0e03c1975496e19be1c1ee8b68dba3255effcf Mon Sep 17 00:00:00 2001 From: hugovasselin <waaaouu@gmail.com> Date: Sun, 18 Oct 2020 18:15:07 +0200 Subject: [PATCH 351/496] refacto: add typing + small typos --- nautilus_nlp/topic_modeling/topic_modeling_short_text.py | 1 - nautilus_nlp/utils/tokenizer.py | 7 ++++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/nautilus_nlp/topic_modeling/topic_modeling_short_text.py b/nautilus_nlp/topic_modeling/topic_modeling_short_text.py index 5402937..bc0a94e 100644 --- a/nautilus_nlp/topic_modeling/topic_modeling_short_text.py +++ b/nautilus_nlp/topic_modeling/topic_modeling_short_text.py @@ -200,7 +200,6 @@ def get_assigned_topics(model): list of topics. Having the same length as the training text containing topics assigned \ to each sentence. """ - _, mat_h = model.get_decomposition_matrix() # The weights of the H matrix are converted into probabilities h_probs = mat_h / mat_h.sum(axis=1, keepdims=True) diff --git a/nautilus_nlp/utils/tokenizer.py b/nautilus_nlp/utils/tokenizer.py index 92c6217..2f4c22f 100644 --- a/nautilus_nlp/utils/tokenizer.py +++ b/nautilus_nlp/utils/tokenizer.py @@ -15,7 +15,7 @@ # You should have received a copy of the GNU Lesser General Public License # along with this program; if not, write to the Free Software Foundation, # Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. -from typing import List +from typing import List, Union import nltk from sacremoses import MosesTokenizer, MosesDetokenizer import spacy @@ -120,7 +120,7 @@ def untokenize(tokens: List[str], lang: str = 'fr') -> str: return text -def convert_tokens_to_string(tokens_or_str): +def convert_tokens_to_string(tokens_or_str: Union[str, List[str]]) -> str: if isinstance(tokens_or_str, str): return tokens_or_str if isinstance(tokens_or_str, list): @@ -130,7 +130,8 @@ def convert_tokens_to_string(tokens_or_str): raise TypeError('Please input string or tokens') -def convert_string_to_tokens(tokens_or_str, lang_module='en_spacy'): +def convert_string_to_tokens( + tokens_or_str: Union[str, List[str]], lang_module: str = 'en_spacy') -> List[str]: if isinstance(tokens_or_str, str): return tokenize(tokens_or_str, lang_module=lang_module) if isinstance(tokens_or_str, list): From 27c55015e8ab9b11381e97e80513ebbd30176afe Mon Sep 17 00:00:00 2001 From: hugovasselin <waaaouu@gmail.com> Date: Sun, 18 Oct 2020 18:20:29 +0200 Subject: [PATCH 352/496] refacto: harmonize optional in docstring --- nautilus_nlp/analysis/text_summary.py | 2 +- nautilus_nlp/analysis/visualize.py | 4 ++-- nautilus_nlp/preprocessing/data_augmentation.py | 6 +++--- nautilus_nlp/preprocessing/text_preprocess.py | 4 ++-- nautilus_nlp/topic_modeling/lda.py | 4 ++-- nautilus_nlp/utils/file_loader.py | 4 ++-- nautilus_nlp/utils/phone_number.py | 4 ++-- 7 files changed, 14 insertions(+), 14 deletions(-) diff --git a/nautilus_nlp/analysis/text_summary.py b/nautilus_nlp/analysis/text_summary.py index d4b227d..8fb6ff4 100644 --- a/nautilus_nlp/analysis/text_summary.py +++ b/nautilus_nlp/analysis/text_summary.py @@ -46,7 +46,7 @@ def summarize_text( Percentage giving the output text length in reference to the input length. language : str text language. eg. "english" - nb_words : int + nb_words : int, optional number of words of the output text or None Returns diff --git a/nautilus_nlp/analysis/visualize.py b/nautilus_nlp/analysis/visualize.py index 9555224..0dc31e5 100644 --- a/nautilus_nlp/analysis/visualize.py +++ b/nautilus_nlp/analysis/visualize.py @@ -34,7 +34,7 @@ def make_word_cloud(text_or_counter: Union[str, list], stop_words: Optional[List text_or_counter : Union[str, list] The text or the Counter to be ploted as wordcloud. Example of counter: [('cat', 2), ('dog', 1)] - stop_words: Optional[List[str]] + stop_words: List[str], optional List of words to be ignored ''' if isinstance(text_or_counter, str): @@ -63,7 +63,7 @@ def print_concordance( the word to be searched for in the list of tokens width : int Number of caracters to be display per text chunk - n_results : Optional[int] + n_results : int, optional If specified, will print only the N results ''' half_width = (width - len(query_word) - 2) // 2 diff --git a/nautilus_nlp/preprocessing/data_augmentation.py b/nautilus_nlp/preprocessing/data_augmentation.py index e05da45..3c19066 100644 --- a/nautilus_nlp/preprocessing/data_augmentation.py +++ b/nautilus_nlp/preprocessing/data_augmentation.py @@ -21,13 +21,13 @@ def augment_utterance( Parameters ---------- text : string - method : string {'wordnet_synonym', 'aug_sub_bert'} + method : {'wordnet_synonym', 'aug_sub_bert'} augmenter to use ('wordnet_synonym' or 'aug_sub_bert') stopwords : list list of words to freeze throughout the augmentation - intent : string + intent : string, optional intent associated to text if any - entities : list + entities : list, optional entities associated to text if any, must be in the following format: [ { diff --git a/nautilus_nlp/preprocessing/text_preprocess.py b/nautilus_nlp/preprocessing/text_preprocess.py index 18df85b..252dd3e 100644 --- a/nautilus_nlp/preprocessing/text_preprocess.py +++ b/nautilus_nlp/preprocessing/text_preprocess.py @@ -266,7 +266,7 @@ def replace_currency_symbols(self, replace_with: Optional[str] = None) -> str: ---------- text : str raw text - replace_with : Optional[str] + replace_with : str, optional if None (default), replace symbols with their standard 3-letter abbreviations \ (e.g. '$' with 'USD', '£' with 'GBP'); otherwise, pass in a string with \ which to replace all symbols (e.g. "*CURRENCY*") @@ -291,7 +291,7 @@ def remove_punct(self, marks: Optional[str] = None) -> str: ---------- text : str raw text - marks : Optional[str] + marks : str, optional If specified, remove only the characters in this string, e.g. ``marks=',;:'`` removes commas, semi-colons, and colons. Otherwise, all punctuation marks are removed. diff --git a/nautilus_nlp/topic_modeling/lda.py b/nautilus_nlp/topic_modeling/lda.py index 6cee4fe..e9ffa75 100644 --- a/nautilus_nlp/topic_modeling/lda.py +++ b/nautilus_nlp/topic_modeling/lda.py @@ -55,9 +55,9 @@ def filter_extremes( ---------- dictionary : dict dictionary containing the number of times a word appears in the dataset set - no_below : Optional[int] + no_below : int, optional Keep tokens which are contained in at least `no_below` documents. - no_above : Optional[float] + no_above : float, optional Keep tokens which are contained in no more than `no_above` documents. (fraction\ of total corpus size, not an absolute number). diff --git a/nautilus_nlp/utils/file_loader.py b/nautilus_nlp/utils/file_loader.py index ece5a4d..0ed1bfd 100644 --- a/nautilus_nlp/utils/file_loader.py +++ b/nautilus_nlp/utils/file_loader.py @@ -68,7 +68,7 @@ def text_loader(filepath: str, encoding: Optional[str] = None, detectencoding: b Parameters ---------- filepath : str - encoding : str + encoding : str, optional If the encoding is specified, will use the specified encoding to load the text file. detectencoding : bool If file is not encoded into UTF-8, try to detect encoding using the chardet library. @@ -153,7 +153,7 @@ def documents_loader( ---------- filepath : str A filepath with wildcard (eg. *.txt), or a list of filepaths. - encoding : Optional[str] + encoding : str, optional if not specified, will try to detect encoding except if detectencoding is false. detectencoding : bool if True and if encoding is not specified, will try to detect encoding using chardet. diff --git a/nautilus_nlp/utils/phone_number.py b/nautilus_nlp/utils/phone_number.py index baff7f6..e03b47e 100644 --- a/nautilus_nlp/utils/phone_number.py +++ b/nautilus_nlp/utils/phone_number.py @@ -54,7 +54,7 @@ def find_phone_numbers(string: str, region_code: Optional[str] = None) -> str: Parameters ---------- - region_code : str + region_code : str, optional If specified, will find the number of the specified country. eg. 06.00.00.00.00 if "FR" is specified. @@ -117,7 +117,7 @@ def parse_number(self, text: str, region_code: Optional[str] = None) -> str: Parameters ---------- - region_code : Optional[str] + region_code : str, optional If specified, will find the number of the specified country. eg. 06.00.00.00.00 if "FR" is specified. If not specified, only works for international-formatted phone numbers. From 3556da2218a606c74a3213745b6fd42007bef60d Mon Sep 17 00:00:00 2001 From: hugovasselin <waaaouu@gmail.com> Date: Sun, 18 Oct 2020 19:30:39 +0200 Subject: [PATCH 353/496] fix: typing error --- nautilus_nlp/utils/file_loader.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/nautilus_nlp/utils/file_loader.py b/nautilus_nlp/utils/file_loader.py index 0ed1bfd..81a8deb 100644 --- a/nautilus_nlp/utils/file_loader.py +++ b/nautilus_nlp/utils/file_loader.py @@ -23,7 +23,7 @@ import re import shutil import warnings -from typing import Optional, Union +from typing import Optional, Union, List import chardet @@ -117,7 +117,7 @@ def list_files_in_subdir(filepath: str) -> list: return res -def list_files(filepath: str) -> list[str]: +def list_files(filepath: str) -> List[str]: """ List files within a given filepath. From bf947221a47fb8a8f3399fe75a1d6eec84127ebe Mon Sep 17 00:00:00 2001 From: "sacha.lasry" <sacha.lasry@artefact.com> Date: Wed, 28 Oct 2020 16:39:13 +0100 Subject: [PATCH 354/496] added first version of actions --- .github/workflows/ci_actions.yml | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) create mode 100644 .github/workflows/ci_actions.yml diff --git a/.github/workflows/ci_actions.yml b/.github/workflows/ci_actions.yml new file mode 100644 index 0000000..53bb37f --- /dev/null +++ b/.github/workflows/ci_actions.yml @@ -0,0 +1,24 @@ +name: CI + +on: + push + pull_request + +jobs: + - job : CI + name: Launching CI + runs-on: ubuntu-latest + + steps: + - name: Install requirements + run: pip install -r requirements.txt + + - name: Run pylint + run: | + pip install pylint + pylint nautilus_nlp tests + + - name: Run pytest + run: | + pip install pytest + pytest tests From 70d131db0432a6af2a820d3c33a9755d01007161 Mon Sep 17 00:00:00 2001 From: "sacha.lasry" <sacha.lasry@artefact.com> Date: Wed, 28 Oct 2020 16:45:13 +0100 Subject: [PATCH 355/496] modified called events --- .github/workflows/ci_actions.yml | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/.github/workflows/ci_actions.yml b/.github/workflows/ci_actions.yml index 53bb37f..f4a8557 100644 --- a/.github/workflows/ci_actions.yml +++ b/.github/workflows/ci_actions.yml @@ -1,8 +1,6 @@ name: CI -on: - push - pull_request +on: [push, pull_request] jobs: - job : CI From a57bffa1f6794556bae803a0bd129bd6138c25cd Mon Sep 17 00:00:00 2001 From: "sacha.lasry" <sacha.lasry@artefact.com> Date: Wed, 28 Oct 2020 19:35:10 +0100 Subject: [PATCH 356/496] yaml syntax fix --- .github/workflows/ci_actions.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/ci_actions.yml b/.github/workflows/ci_actions.yml index f4a8557..e6e9bc2 100644 --- a/.github/workflows/ci_actions.yml +++ b/.github/workflows/ci_actions.yml @@ -3,7 +3,7 @@ name: CI on: [push, pull_request] jobs: - - job : CI + CI: name: Launching CI runs-on: ubuntu-latest From 23cd333762b21fe2fba3bdc0a474d80ed1105d40 Mon Sep 17 00:00:00 2001 From: "sacha.lasry" <sacha.lasry@artefact.com> Date: Wed, 28 Oct 2020 20:45:47 +0100 Subject: [PATCH 357/496] changed wd path --- .github/workflows/ci_actions.yml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.github/workflows/ci_actions.yml b/.github/workflows/ci_actions.yml index e6e9bc2..6099baa 100644 --- a/.github/workflows/ci_actions.yml +++ b/.github/workflows/ci_actions.yml @@ -9,14 +9,17 @@ jobs: steps: - name: Install requirements + working-directory: . run: pip install -r requirements.txt - name: Run pylint + working-directory: . run: | pip install pylint pylint nautilus_nlp tests - name: Run pytest + working-directory: . run: | pip install pytest pytest tests From bb9fe1e0f4f3ddc5291816195d4addbe6547ffbd Mon Sep 17 00:00:00 2001 From: "sacha.lasry" <sacha.lasry@artefact.com> Date: Wed, 28 Oct 2020 20:51:08 +0100 Subject: [PATCH 358/496] yml syntax fix --- .github/workflows/ci_actions.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/ci_actions.yml b/.github/workflows/ci_actions.yml index 6099baa..c84fb89 100644 --- a/.github/workflows/ci_actions.yml +++ b/.github/workflows/ci_actions.yml @@ -9,17 +9,17 @@ jobs: steps: - name: Install requirements - working-directory: . + working-directory: ./ run: pip install -r requirements.txt - name: Run pylint - working-directory: . + working-directory: ./ run: | pip install pylint pylint nautilus_nlp tests - name: Run pytest - working-directory: . + working-directory: ./ run: | pip install pytest pytest tests From 3699a584dba9eda9576109d1b085ab02d4c8dcd8 Mon Sep 17 00:00:00 2001 From: Rafaelle AYGALENQ <rafaelle.aygalenq@artefact.com> Date: Thu, 5 Nov 2020 11:29:04 +0100 Subject: [PATCH 359/496] refacto following comments --- .../preprocessing/data_augmentation.py | 31 +++++++++---------- 1 file changed, 15 insertions(+), 16 deletions(-) diff --git a/nautilus_nlp/preprocessing/data_augmentation.py b/nautilus_nlp/preprocessing/data_augmentation.py index 1e47928..b6143ff 100644 --- a/nautilus_nlp/preprocessing/data_augmentation.py +++ b/nautilus_nlp/preprocessing/data_augmentation.py @@ -1,6 +1,7 @@ import copy import logging import re +from itertools import combinations import nlpaug.augmenter.word as naw @@ -56,7 +57,7 @@ def augment_text(text, method, stopwords=None, entities=None): formatted_entities ) return clean_sentence_entities(text, augmented_entities) - raise CouldNotAugment('Text was not correctly augmented so not added') + raise CouldNotAugment('Text was not correctly augmented because entities were altered') return augmented_text @@ -86,11 +87,10 @@ def are_entities_in_augmented_text(entities, augmented_text): ------- True if all entities are present in augmented text, False otherwise """ - check = True for ent in entities: if ent['word'] not in augmented_text: - check = False - return check + return False + return True def get_augmenter(method, stopwords=None): @@ -182,18 +182,17 @@ def clean_sentence_entities(text, entities): Augmented text and cleaned entities """ entities_to_clean = copy.copy(entities) - for element1 in entities_to_clean: - for element2 in entities_to_clean: - result = check_interval_included(element1, element2) - if result is not None: - try: - entities_to_clean.remove(result[0]) - except IndexError: - logging.warning( - "Cant remove entity : {} \n entities are now :{} \n for sentence : {} ".format( - result, entities_to_clean, - text)) - continue + for element1, element2 in combinations(entities_to_clean, 2): + result = check_interval_included(element1, element2) + if result is not None: + try: + entities_to_clean.remove(result[0]) + except IndexError: + logging.warning( + "Cant remove entity : {} \n entities are now :{} \n for sentence : {} ".format( + result, entities_to_clean, + text)) + continue return text, entities_to_clean From 923c44be7f4dd9cd1565fca9cc58b348c65d898c Mon Sep 17 00:00:00 2001 From: "sacha.lasry" <sacha.lasry@artefact.com> Date: Thu, 5 Nov 2020 11:57:05 +0100 Subject: [PATCH 360/496] add actions checkout to see if it can find requirements that way --- .github/workflows/ci_actions.yml | 26 +++++++++++++++++++++++--- 1 file changed, 23 insertions(+), 3 deletions(-) diff --git a/.github/workflows/ci_actions.yml b/.github/workflows/ci_actions.yml index c84fb89..5426074 100644 --- a/.github/workflows/ci_actions.yml +++ b/.github/workflows/ci_actions.yml @@ -1,3 +1,20 @@ +# GNU Lesser General Public License v3.0 only +# Copyright (C) 2020 Artefact +# licence-information@artefact.com +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 3 of the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public License +# along with this program; if not, write to the Free Software Foundation, +# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. name: CI on: [push, pull_request] @@ -6,20 +23,23 @@ jobs: CI: name: Launching CI runs-on: ubuntu-latest + #env: + #working-directory: ... steps: + - uses: actions/checkout@v2 - name: Install requirements - working-directory: ./ + #working-directory: ${{env.working-directory}} run: pip install -r requirements.txt - name: Run pylint - working-directory: ./ + #working-directory: ${{env.working-directory}} run: | pip install pylint pylint nautilus_nlp tests - name: Run pytest - working-directory: ./ + #working-directory: ${{env.working-directory}} run: | pip install pytest pytest tests From 04fa9119f900baa755c6675191a45158b1993278 Mon Sep 17 00:00:00 2001 From: Rafaelle AYGALENQ <rafaelle.aygalenq@artefact.com> Date: Thu, 5 Nov 2020 12:10:37 +0100 Subject: [PATCH 361/496] remove text output in clean entities function --- nautilus_nlp/preprocessing/data_augmentation.py | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/nautilus_nlp/preprocessing/data_augmentation.py b/nautilus_nlp/preprocessing/data_augmentation.py index b6143ff..a015f81 100644 --- a/nautilus_nlp/preprocessing/data_augmentation.py +++ b/nautilus_nlp/preprocessing/data_augmentation.py @@ -56,7 +56,8 @@ def augment_text(text, method, stopwords=None, entities=None): augmented_text, formatted_entities ) - return clean_sentence_entities(text, augmented_entities) + clean_entities = clean_sentence_entities(augmented_text, augmented_entities) + return augmented_text, clean_entities raise CouldNotAugment('Text was not correctly augmented because entities were altered') return augmented_text @@ -87,10 +88,12 @@ def are_entities_in_augmented_text(entities, augmented_text): ------- True if all entities are present in augmented text, False otherwise """ + check = True for ent in entities: if ent['word'] not in augmented_text: - return False - return True + check = False + return check + return check def get_augmenter(method, stopwords=None): From 1f5a6439fe0e1c0115cfa9c3fd4256d680ae867e Mon Sep 17 00:00:00 2001 From: "sacha.lasry" <sacha.lasry@artefact.com> Date: Thu, 5 Nov 2020 12:10:37 +0100 Subject: [PATCH 362/496] upgrade pip and specify python version --- .github/workflows/ci_actions.yml | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) diff --git a/.github/workflows/ci_actions.yml b/.github/workflows/ci_actions.yml index 5426074..fceb231 100644 --- a/.github/workflows/ci_actions.yml +++ b/.github/workflows/ci_actions.yml @@ -23,23 +23,27 @@ jobs: CI: name: Launching CI runs-on: ubuntu-latest - #env: - #working-directory: ... + strategy: + matrix: + python-version: [3.6] steps: - uses: actions/checkout@v2 + - name: Set up Python ${{ matrix.python-version }} + uses: actions/setup-python@v2 + with: + python-version: ${{ matrix.python-version }} - name: Install requirements - #working-directory: ${{env.working-directory}} - run: pip install -r requirements.txt + run: + python -m pip install --upgrade pip + pip install -r requirements.txt - name: Run pylint - #working-directory: ${{env.working-directory}} run: | pip install pylint pylint nautilus_nlp tests - name: Run pytest - #working-directory: ${{env.working-directory}} run: | pip install pytest pytest tests From b5af78d9f7202e64620186f05bc06822d9338929 Mon Sep 17 00:00:00 2001 From: Rafaelle AYGALENQ <rafaelle.aygalenq@artefact.com> Date: Thu, 5 Nov 2020 15:33:31 +0100 Subject: [PATCH 363/496] add check of entities duplicates --- nautilus_nlp/preprocessing/data_augmentation.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/nautilus_nlp/preprocessing/data_augmentation.py b/nautilus_nlp/preprocessing/data_augmentation.py index a015f81..eac4384 100644 --- a/nautilus_nlp/preprocessing/data_augmentation.py +++ b/nautilus_nlp/preprocessing/data_augmentation.py @@ -184,7 +184,7 @@ def clean_sentence_entities(text, entities): ------- Augmented text and cleaned entities """ - entities_to_clean = copy.copy(entities) + entities_to_clean = [dict(s) for s in set(frozenset(d.items()) for d in entities)] for element1, element2 in combinations(entities_to_clean, 2): result = check_interval_included(element1, element2) if result is not None: @@ -196,7 +196,7 @@ def clean_sentence_entities(text, entities): result, entities_to_clean, text)) continue - return text, entities_to_clean + return entities_to_clean def check_interval_included(element1, element2): From dcba544130550e56aecd139018dbb3a645dd00ea Mon Sep 17 00:00:00 2001 From: Rafaelle AYGALENQ <rafaelle.aygalenq@artefact.com> Date: Thu, 5 Nov 2020 15:42:13 +0100 Subject: [PATCH 364/496] remove unused import --- nautilus_nlp/preprocessing/data_augmentation.py | 1 - 1 file changed, 1 deletion(-) diff --git a/nautilus_nlp/preprocessing/data_augmentation.py b/nautilus_nlp/preprocessing/data_augmentation.py index eac4384..353be2a 100644 --- a/nautilus_nlp/preprocessing/data_augmentation.py +++ b/nautilus_nlp/preprocessing/data_augmentation.py @@ -1,4 +1,3 @@ -import copy import logging import re from itertools import combinations From 01efce49089fd02641557034fca5876504d4f5e2 Mon Sep 17 00:00:00 2001 From: Rafaelle AYGALENQ <rafaelle.aygalenq@artefact.com> Date: Thu, 5 Nov 2020 15:58:10 +0100 Subject: [PATCH 365/496] update docstring clean entities --- nautilus_nlp/preprocessing/data_augmentation.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/nautilus_nlp/preprocessing/data_augmentation.py b/nautilus_nlp/preprocessing/data_augmentation.py index 353be2a..3b5c231 100644 --- a/nautilus_nlp/preprocessing/data_augmentation.py +++ b/nautilus_nlp/preprocessing/data_augmentation.py @@ -181,7 +181,7 @@ def clean_sentence_entities(text, entities): Returns ------- - Augmented text and cleaned entities + Cleaned entities """ entities_to_clean = [dict(s) for s in set(frozenset(d.items()) for d in entities)] for element1, element2 in combinations(entities_to_clean, 2): From 9e43d709bf8f50d2516c2e625cfdfabccae23251 Mon Sep 17 00:00:00 2001 From: Amale EL HAMRI <amale.elhamri@artefact.com> Date: Thu, 5 Nov 2020 16:09:41 +0100 Subject: [PATCH 366/496] removing classes --- .../preprocessing/social_preprocess.py | 300 ++++---- nautilus_nlp/preprocessing/text_preprocess.py | 706 ++++++++---------- .../preprocessing/token_preprocess.py | 168 ++--- tests/test_preprocessor.py | 107 +-- 4 files changed, 592 insertions(+), 689 deletions(-) diff --git a/nautilus_nlp/preprocessing/social_preprocess.py b/nautilus_nlp/preprocessing/social_preprocess.py index 8bab161..fafb584 100644 --- a/nautilus_nlp/preprocessing/social_preprocess.py +++ b/nautilus_nlp/preprocessing/social_preprocess.py @@ -21,162 +21,146 @@ import emoji as _emoji from nautilus_nlp.utils import constants - - -class SocialPreprocessor(): - - def __init__(self, text): - self.text = text - - def remove_mentions(self) -> str: - """ - Function that removes words preceded with a '@' - - Parameters - ---------- - text : str - - Returns - ------- - string - """ - self.text = self.normalize_whitespace(constants.AT_PATTERN.sub('', self.text)) - return self.text - - def extract_mentions(self) -> list: - """ - Function that extracts words preceded with a '@' - eg. "I take care of my skin with @thisproduct" --> ["@thisproduct"] - - Parameters - ---------- - text : str - - Returns - ------- - string - """ - return constants.AT_PATTERN.findall(self.text) - - def remove_html_tags(self) -> str: - """ - Function that removes words between < and > - - Parameters - ---------- - text : str - - Returns - ------- - string - """ - self.text = self.normalize_whitespace(constants.HTML_TAG_PATTERN.sub('', self.text)) - return self.text - - def remove_emoji(self) -> str: - """ - Remove emoji from any str by stripping any unicode in the range of Emoji unicode - as defined in the unicode convention: - http://www.unicode.org/emoji/charts/full-emoji-list.html - - Parameters - ---------- - text : str - - Returns - ------- - str - """ - self.text = constants.EMOJI_PATTERN.sub("", self.text) - return self.text - - def convert_emoji_to_text(self, code_delimiters=(':', ':'), input_str=None) -> str: - """ - Convert emoji to their CLDR Short Name, according to the unicode convention - http://www.unicode.org/emoji/charts/full-emoji-list.html - eg. 😀 --> :grinning_face: - - Parameters - ---------- - text : str - code_delimiters : tuple of symbols around the emoji code. - eg: (':',':') --> :grinning_face: - - Returns - ------- - str - string - """ - if input_str is not None: - return _emoji.demojize(input_str, delimiters=code_delimiters) - return _emoji.demojize(self.text, delimiters=code_delimiters) - - def extract_emojis(self) -> list: - """ - Function that extracts emojis from a text and translates them into words - eg. "I take care of my skin 😀 :(" --> [":grinning_face:"] - - Parameters - ---------- - text : str - - Returns - ------- - list - list of all emojis converted with their unicode conventions - """ - emojis_in_text = constants.EMOJI_PATTERN.findall(self.text) - emojis_converted = [self.convert_emoji_to_text(input_str=emoji_text) for emoji_text in emojis_in_text] - return emojis_converted - - def extract_hashtags(self) -> list: - """ - Function that extracts words preceded with a '#' - eg. "I take care of my skin #selfcare#selfestim" --> ["skincare", "selfestim"] - - Parameters - ---------- - text : str - - Returns - ------- - list - list of all hashtags - """ - return constants.HASHTAG_PATTERN.findall(self.text) - - def remove_hashtag(self) -> str: - """ - Function that removes words preceded with a '#' - eg. "I take care of my skin #selfcare#selfestim" --> "I take care of my skin" - - Parameters - ---------- - text : str - - Returns - ------- - str - text of a post without hashtags - """ - self.text = self.normalize_whitespace(constants.HASHTAG_PATTERN.sub('', self.text)) - return self.text - - @staticmethod - def normalize_whitespace(text) -> str: - """ - Given ``text`` str, replace one or more spacings with a single space, and one - or more linebreaks with a single newline. Also strip leading/trailing whitespace. - eg. " foo bar " -> "foo bar" - - Parameters - ---------- - text : string - - Returns - ------- +from nautilus_nlp.preprocessing.text_preprocess import normalize_whitespace + + +def remove_mentions(text) -> str: + """ + Function that removes words preceded with a '@' + + Parameters + ---------- + text : str + + Returns + ------- + string + """ + text = normalize_whitespace(constants.AT_PATTERN.sub('', text)) + return text + + +def extract_mentions(text) -> list: + """ + Function that extracts words preceded with a '@' + eg. "I take care of my skin with @thisproduct" --> ["@thisproduct"] + + Parameters + ---------- + text : str + + Returns + ------- + string + """ + return constants.AT_PATTERN.findall(text) + + +def remove_html_tags(text) -> str: + """ + Function that removes words between < and > + + Parameters + ---------- + text : str + + Returns + ------- + string + """ + text = normalize_whitespace(constants.HTML_TAG_PATTERN.sub('', text)) + return text + + +def remove_emoji(text) -> str: + """ + Remove emoji from any str by stripping any unicode in the range of Emoji unicode + as defined in the unicode convention: + http://www.unicode.org/emoji/charts/full-emoji-list.html + + Parameters + ---------- + text : str + + Returns + ------- + str + """ + text = constants.EMOJI_PATTERN.sub("", text) + return text + + +def convert_emoji_to_text(text, code_delimiters=(':', ':'), input_str=None) -> str: + """ + Convert emoji to their CLDR Short Name, according to the unicode convention + http://www.unicode.org/emoji/charts/full-emoji-list.html + eg. 😀 --> :grinning_face: + + Parameters + ---------- + text : str + code_delimiters : tuple of symbols around the emoji code. + eg: (':',':') --> :grinning_face: + + Returns + ------- + str string - """ - return constants.NONBREAKING_SPACE_REGEX.sub( - " ", constants.LINEBREAK_REGEX.sub(r"\n", text) - ).strip() + """ + if input_str is not None: + return _emoji.demojize(input_str, delimiters=code_delimiters) + return _emoji.demojize(text, delimiters=code_delimiters) + + +def extract_emojis(text) -> list: + """ + Function that extracts emojis from a text and translates them into words + eg. "I take care of my skin 😀 :(" --> [":grinning_face:"] + + Parameters + ---------- + text : str + + Returns + ------- + list + list of all emojis converted with their unicode conventions + """ + emojis_in_text = constants.EMOJI_PATTERN.findall(text) + emojis_converted = [convert_emoji_to_text(text, input_str=emoji_text) for emoji_text in emojis_in_text] + return emojis_converted + + +def extract_hashtags(text) -> list: + """ + Function that extracts words preceded with a '#' + eg. "I take care of my skin #selfcare#selfestim" --> ["skincare", "selfestim"] + + Parameters + ---------- + text : str + + Returns + ------- + list + list of all hashtags + """ + return constants.HASHTAG_PATTERN.findall(text) + + +def remove_hashtag(text) -> str: + """ + Function that removes words preceded with a '#' + eg. "I take care of my skin #selfcare#selfestim" --> "I take care of my skin" + + Parameters + ---------- + text : str + + Returns + ------- + str + text of a post without hashtags + """ + text = normalize_whitespace(constants.HASHTAG_PATTERN.sub('', text)) + return text diff --git a/nautilus_nlp/preprocessing/text_preprocess.py b/nautilus_nlp/preprocessing/text_preprocess.py index 5c112cb..9fe587a 100644 --- a/nautilus_nlp/preprocessing/text_preprocess.py +++ b/nautilus_nlp/preprocessing/text_preprocess.py @@ -27,382 +27,334 @@ from nautilus_nlp.utils import constants from nautilus_nlp.utils.phone_number import \ extract_phone_numbers as _extract_phone_numbers -from nautilus_nlp.utils.stopwords import get_stopwords - - -class TextPreprocessor(): - - def __init__(self, text): - if isinstance(text, str): - self.text = text - else: - raise ValueError("Input must be a string") - - def clean_text(self, lang='en') -> str: - #TODO : check how to pipe operations - stopwords = get_stopwords(lang) - self.text = self.fix_bad_unicode(normalization="NFC") - self.text = self.remove_eol_characters() - self.text = self.remove_accents(method="unicode") - self.text = self.remove_punct() - self.text = self.text.lower() - self.text = self.remove_stopwords(stopwords=stopwords) - return self.normalize_whitespace() - - def remove_eol_characters(self) -> str: - """ - Remove end of line (\n) char. - - Parameters - ---------- - text : str - - Returns - ------- - str - """ - self.text = self.text.replace("\n", " ") - return self.text - - def remove_stopwords(self, stopwords: list) -> str: - """ - Remove stopwords from a text. - eg. 'I like when you move your body !' -> 'I move body !' - - Parameters - ---------- - stopwords : list of stopwords to remove - - Returns - ------- - str - text without stopwords - - Raises - ------ - ValueError - When inputs is not a string - """ - self.text = ' '.join([word.strip() for word in self.text.split() if word not in stopwords]) - return self.text - - def fix_bad_unicode(self, normalization: str = "NFC") -> str: - """ - Fix unicode text that's "broken" using `ftfy <http://ftfy.readthedocs.org/>`_; - this includes mojibake, HTML entities and other code cruft, - and non-standard forms for display purposes. - - Parameters - ---------- - text : string - - normalization ({'NFC', 'NFKC', 'NFD', 'NFKD'}): - if 'NFC', combines characters and diacritics written using separate code points, - e.g. converting "e" plus an acute accent modifier into "é"; unicode - can be converted to NFC form without any change in its meaning! - if 'NFKC', additional normalizations are applied that can change - the meanings of characters, e.g. ellipsis characters will be replaced - with three periods - Returns - ------- - string - """ - self.text = _fix_text(self.text, normalization=normalization) - return self.text - - def normalize_whitespace(self) -> str: - """ - Given ``text`` str, replace one or more spacings with a single space, and one - or more linebreaks with a single newline. Also strip leading/trailing whitespace. - eg. " foo bar " -> "foo bar" - - Parameters - ---------- - text : string - - Returns - ------- - string - """ - self.text = constants.NONBREAKING_SPACE_REGEX.sub( - " ", constants.LINEBREAK_REGEX.sub(r"\n", self.text) - ).strip() - return self.text - - def unpack_english_contractions(self) -> str: - """ - Replace *English* contractions in ``text`` str with their unshortened forms. - N.B. The "'d" and "'s" forms are ambiguous (had/would, is/has/possessive), - so are left as-is. - eg. "You're fired. She's nice." -> "You are fired. She's nice." - - Parameters - ---------- - text : string - - Returns - ------- - string - """ - - # standard - self.text = constants.CONTRACTION_NT_NOT.sub( - r"\1\2 not", - self.text, - ) - self.text = constants.CONTRACTION_LL_WILL.sub( - r"\1\2 will", - self.text, - ) - self.text = constants.CONTRACTION_RE_ARE.sub(r"\1\2 are", self.text) - self.text = constants.CONTRACTION_VE_HAVE.sub( - r"\1\2 have", - self.text, + + +def normalize_whitespace(text) -> str: + """ + Given ``text`` str, replace one or more spacings with a single space, and one + or more linebreaks with a single newline. Also strip leading/trailing whitespace. + eg. " foo bar " -> "foo bar" + + Parameters + ---------- + text : string + + Returns + ------- + string + """ + text = constants.NONBREAKING_SPACE_REGEX.sub( + " ", constants.LINEBREAK_REGEX.sub(r"\n", text) + ).strip() + return text + + +def remove_eol_characters(text) -> str: + """ + Remove end of line (\n) char. + + Parameters + ---------- + text : str + + Returns + ------- + str + """ + text = text.replace("\n", " ") + return text + + +def fix_bad_unicode(text, normalization: str = "NFC") -> str: + """ + Fix unicode text that's "broken" using `ftfy <http://ftfy.readthedocs.org/>`_; + this includes mojibake, HTML entities and other code cruft, + and non-standard forms for display purposes. + + Parameters + ---------- + text : string + + normalization ({'NFC', 'NFKC', 'NFD', 'NFKD'}): + if 'NFC', combines characters and diacritics written using separate code points, + e.g. converting "e" plus an acute accent modifier into "é"; unicode + can be converted to NFC form without any change in its meaning! + if 'NFKC', additional normalizations are applied that can change + the meanings of characters, e.g. ellipsis characters will be replaced + with three periods + Returns + ------- + string + """ + text = _fix_text(text, normalization=normalization) + return text + + +def unpack_english_contractions(text) -> str: + """ + Replace *English* contractions in ``text`` str with their unshortened forms. + N.B. The "'d" and "'s" forms are ambiguous (had/would, is/has/possessive), + so are left as-is. + eg. "You're fired. She's nice." -> "You are fired. She's nice." + + Parameters + ---------- + text : string + + Returns + ------- + string + """ + + # standard + text = constants.CONTRACTION_NT_NOT.sub( + r"\1\2 not", + text, + ) + text = constants.CONTRACTION_LL_WILL.sub( + r"\1\2 will", + text, + ) + text = constants.CONTRACTION_RE_ARE.sub(r"\1\2 are", text) + text = constants.CONTRACTION_VE_HAVE.sub( + r"\1\2 have", + text, + ) + text = constants.CONTRACTION_CANT_CANNOT.sub(r"\1\2n not", text) + text = constants.CONTRACTION_M_AM.sub(r"\1\2 am", text) + text = constants.CONTRACTION_LET_LETUS.sub(r"\1\2 us", text) + text = constants.CONTRACTION_WONT_WILLNOT.sub(r"\1\2ill not", text) + text = constants.CONTRACTION_SHANT_SHALLNOT.sub(r"\1\2hall not", text) + text = constants.CONTRACTION_YALL_YOUALL.sub(r"\1\2ou all", text) + return text + + +def replace_urls(text, replace_with: str = "*URL*") -> str: + """ + Replace all URLs in ``text`` str with ``replace_with`` str. + + Parameters + ---------- + text : string + replace_with : string + the string you want the URL to be replaced with. + + Returns + ------- + string + """ + text = constants.URL_REGEX.sub( + replace_with, constants.SHORT_URL_REGEX.sub(replace_with, text) + ) + return text + + +def replace_emails(text, replace_with="*EMAIL*") -> str: + """ + Replace all emails in ``text`` str with ``replace_with`` str + + Parameters + ---------- + text : string + replace_with : string + the string you want the email address to be replaced with. + + Returns + ------- + string + """ + text = constants.EMAIL_REGEX.sub(replace_with, text) + return text + + +def replace_phone_numbers(text, country_format_to_detect: list, + replace_with: str = "*PHONE*", + method: str = "regex") -> str: + """ + Replace all phone numbers in ``text`` str with ``replace_with`` str + + Parameters + ---------- + text : string + replace_with : string + the string you want the phone number to be replaced with. + method : ['regex','detection'] + regex is faster but will omit a lot of numbers, while detection will + catch every numbers, but takes a while. + country_format_to_detect : list + If a list of country code is specified, will catch every number formatted. + Only when method = 'detection'. + Returns + ------- + string + """ + if method == 'regex': + text = constants.PHONE_REGEX.sub(replace_with, text) + elif method == 'detection': + found_nums = _extract_phone_numbers(text, countrylist=country_format_to_detect) + + # order by lenght to avoid truncated numbers to be removed first. + found_nums.sort(key=len, reverse=True) + for phone_number in found_nums: + text = text.replace(phone_number, replace_with) + else: + raise ValueError('Please input a valid method between "regex" or "detection"') + return text + + +def replace_numbers(text, replace_with="*NUMBER*") -> str: + """ + Replace all numbers in ``text`` str with ``replace_with`` str. + + Parameters + ---------- + text : string + replace_with : string + the string you want the number to be replaced with. + + Returns + ------- + string + """ + text = constants.NUMBERS_REGEX.sub(replace_with, text) + return text + + +def replace_currency_symbols(text, replace_with=None) -> str: + """ + Replace all currency symbols in ``text`` str with string specified by ``replace_with`` str. + + Parameters + ---------- + text : str + raw text + replace_with : None or string + if None (default), replace symbols with + their standard 3-letter abbreviations (e.g. '$' with 'USD', '£' with 'GBP'); + otherwise, pass in a string with which to replace all symbols + (e.g. "*CURRENCY*") + + Returns + ------- + string + """ + if replace_with is None: + for k, v in constants.CURRENCIES.items(): + text = text.replace(k, v) + else: + text = constants.CURRENCY_REGEX.sub(replace_with, text) + return text + + +def remove_punct(text, marks=None) -> str: + """ + Remove punctuation from ``text`` by replacing all instances of ``marks`` + with whitespace. + + Parameters + ---------- + text : str + raw text + + marks : str or None + If specified, remove only the characters in this string, + e.g. ``marks=',;:'`` removes commas, semi-colons, and colons. + Otherwise, all punctuation marks are removed. + + Returns + ------- + string + + Note + ------- + When ``marks=None``, Python's built-in :meth:`str.translate()` is + used to remove punctuation; otherwise, a regular expression is used + instead. The former's performance is about 5-10x faster. + """ + if marks: + text = re.sub("[{}]+".format(re.escape(marks)), " ", text, flags=re.UNICODE) + else: + text = text.translate(constants.PUNCT_TRANSLATE_UNICODE) + return text + + +def remove_accents(text, method: str = "unicode") -> str: + """ + Remove accents from any accented unicode characters in ``text`` str, either by + transforming them into ascii equivalents or removing them entirely. + + Parameters + ---------- + text : str + raw text + + method : ({'unicode', 'ascii'}) + if 'unicode', remove accented + char for any unicode symbol with a direct ASCII equivalent; if 'ascii', + remove accented char for any unicode symbol + + NB: the 'ascii' method is notably faster than 'unicode', but less good + + Returns + ------- + string + + Raises + ------- + ValueError + if ``method`` is not in {'unicode', 'ascii'} + """ + if method == "unicode": + text = "".join( + c + for c in unicodedata.normalize("NFKD", text) + if not unicodedata.combining(c) ) - self.text = constants.CONTRACTION_CANT_CANNOT.sub(r"\1\2n not", self.text) - self.text = constants.CONTRACTION_M_AM.sub(r"\1\2 am", self.text) - self.text = constants.CONTRACTION_LET_LETUS.sub(r"\1\2 us", self.text) - self.text = constants.CONTRACTION_WONT_WILLNOT.sub(r"\1\2ill not", self.text) - self.text = constants.CONTRACTION_SHANT_SHALLNOT.sub(r"\1\2hall not", self.text) - self.text = constants.CONTRACTION_YALL_YOUALL.sub(r"\1\2ou all", self.text) - return self.text - - def replace_urls(self, replace_with: str = "*URL*") -> str: - """ - Replace all URLs in ``text`` str with ``replace_with`` str. - - Parameters - ---------- - text : string - replace_with : string - the string you want the URL to be replaced with. - - Returns - ------- - string - """ - self.text = constants.URL_REGEX.sub( - replace_with, constants.SHORT_URL_REGEX.sub(replace_with, self.text) + elif method == "ascii": + text = ( + unicodedata.normalize("NFKD", text) + .encode("ascii", errors="ignore") + .decode("ascii") ) - return self.text - - def replace_emails(self, replace_with="*EMAIL*") -> str: - """ - Replace all emails in ``text`` str with ``replace_with`` str - - Parameters - ---------- - text : string - replace_with : string - the string you want the email address to be replaced with. - - Returns - ------- - string - """ - self.text = constants.EMAIL_REGEX.sub(replace_with, self.text) - return self.text - - def replace_phone_numbers(self, country_format_to_detect: list, - replace_with: str = "*PHONE*", - method: str = "regex") -> str: - """ - Replace all phone numbers in ``text`` str with ``replace_with`` str - - Parameters - ---------- - text : string - replace_with : string - the string you want the phone number to be replaced with. - method : ['regex','detection'] - regex is faster but will omit a lot of numbers, while detection will - catch every numbers, but takes a while. - country_format_to_detect : list - If a list of country code is specified, will catch every number formatted. - Only when method = 'detection'. - Returns - ------- - string - """ - if method == 'regex': - self.text = constants.PHONE_REGEX.sub(replace_with, self.text) - elif method == 'detection': - found_nums = _extract_phone_numbers(self.text, countrylist=country_format_to_detect) - - # order by lenght to avoid truncated numbers to be removed first. - found_nums.sort(key=len, reverse=True) - for phone_number in found_nums: - self.text = self.text.replace(phone_number, replace_with) - else: - raise ValueError('Please input a valid method between "regex" or "detection"') - return self.text - - def replace_numbers(self, replace_with="*NUMBER*") -> str: - """ - Replace all numbers in ``text`` str with ``replace_with`` str. - - Parameters - ---------- - text : string - replace_with : string - the string you want the number to be replaced with. - - Returns - ------- - string - """ - self.text = constants.NUMBERS_REGEX.sub(replace_with, self.text) - return self.text - - def replace_currency_symbols(self, replace_with=None) -> str: - """ - Replace all currency symbols in ``text`` str with string specified by ``replace_with`` str. - - Parameters - ---------- - text : str - raw text - replace_with : None or string - if None (default), replace symbols with - their standard 3-letter abbreviations (e.g. '$' with 'USD', '£' with 'GBP'); - otherwise, pass in a string with which to replace all symbols - (e.g. "*CURRENCY*") - - Returns - ------- - string - """ - if replace_with is None: - for k, v in constants.CURRENCIES.items(): - self.text = self.text.replace(k, v) - else: - self.text = constants.CURRENCY_REGEX.sub(replace_with, self.text) - return self.text - - def remove_punct(self, marks=None) -> str: - """ - Remove punctuation from ``text`` by replacing all instances of ``marks`` - with whitespace. - - Parameters - ---------- - text : str - raw text - - marks : str or None - If specified, remove only the characters in this string, - e.g. ``marks=',;:'`` removes commas, semi-colons, and colons. - Otherwise, all punctuation marks are removed. - - Returns - ------- - string - - Note - ------- - When ``marks=None``, Python's built-in :meth:`str.translate()` is - used to remove punctuation; otherwise, a regular expression is used - instead. The former's performance is about 5-10x faster. - """ - if marks: - self.text = re.sub("[{}]+".format(re.escape(marks)), " ", self.text, flags=re.UNICODE) - else: - self.text = self.text.translate(constants.PUNCT_TRANSLATE_UNICODE) - return self.text - - def remove_accents(self, method: str = "unicode") -> str: - """ - Remove accents from any accented unicode characters in ``text`` str, either by - transforming them into ascii equivalents or removing them entirely. - - Parameters - ---------- - text : str - raw text - - method : ({'unicode', 'ascii'}) - if 'unicode', remove accented - char for any unicode symbol with a direct ASCII equivalent; if 'ascii', - remove accented char for any unicode symbol - - NB: the 'ascii' method is notably faster than 'unicode', but less good - - Returns - ------- - string - - Raises - ------- - ValueError - if ``method`` is not in {'unicode', 'ascii'} - """ - if method == "unicode": - self.text = "".join( - c - for c in unicodedata.normalize("NFKD", self.text) - if not unicodedata.combining(c) - ) - elif method == "ascii": - self.text = ( - unicodedata.normalize("NFKD", self.text) - .encode("ascii", errors="ignore") - .decode("ascii") - ) - else: - msg = '`method` must be either "unicode" and "ascii", not {}'.format(method) - raise ValueError(msg) - return self.text - - def remove_multiple_spaces_and_strip_text(self) -> str: - """ - Remove multiple spaces, strip text, and remove '-', '*' characters. - - Parameters - ---------- - text : str - the text to be processed - - Returns - ------- - string - the text with removed multiple spaces and strip text - """ - regex_remove_multiple_spaces_list = ["\\t", "[\\s\\-\\*]{2,}"] - for regex_remove_multiple_spaces in regex_remove_multiple_spaces_list: - self.text = re.sub(regex_remove_multiple_spaces, " ", self.text) - self.text = self.text.strip() - return self.text - - def filter_non_latin_characters(self) -> str: - """ - Function that filters non latin characters of a text - - Parameters - ---------- - text : string - - Returns - ------- - string - """ - self.text = constants.LATIN_CHARACTERS_RE.sub(' ', self.text) - self.text = self.normalize_whitespace() - return self.text - - def remove_smallwords(self, smallwords_threshold: int) -> list: - """ - Function that removes words which length is below a threshold - 'Hello my name is John Doe' --> 'Hello name John Doe' - - Parameters - ---------- - text : str - smallwords_threshold: int - threshold of small word - - Returns - ------- - str - """ - self.text = ' '.join([word for word in self.text.split() if len(word) > smallwords_threshold]) - return self.text + else: + msg = '`method` must be either "unicode" and "ascii", not {}'.format(method) + raise ValueError(msg) + return text + + +def remove_multiple_spaces_and_strip_text(text) -> str: + """ + Remove multiple spaces, strip text, and remove '-', '*' characters. + + Parameters + ---------- + text : str + the text to be processed + + Returns + ------- + string + the text with removed multiple spaces and strip text + """ + regex_remove_multiple_spaces_list = ["\\t", "[\\s\\-\\*]{2,}"] + for regex_remove_multiple_spaces in regex_remove_multiple_spaces_list: + text = re.sub(regex_remove_multiple_spaces, " ", text) + text = text.strip() + return text + + +def filter_non_latin_characters(text) -> str: + """ + Function that filters non latin characters of a text + + Parameters + ---------- + text : string + + Returns + ------- + string + """ + text = constants.LATIN_CHARACTERS_RE.sub(' ', text) + text = normalize_whitespace(text) + return text diff --git a/nautilus_nlp/preprocessing/token_preprocess.py b/nautilus_nlp/preprocessing/token_preprocess.py index b753564..989bd9a 100644 --- a/nautilus_nlp/preprocessing/token_preprocess.py +++ b/nautilus_nlp/preprocessing/token_preprocess.py @@ -21,89 +21,85 @@ import re -class TokenPreprocessor(): - - def __init__(self, tokens): - if isinstance(tokens, list): - self.tokens = tokens - else: - raise TypeError("Input must be a list") - - def remove_stopwords(self, stopwords: list) -> str: - """ - Remove stopwords from a text. - eg. 'I like when you move your body !' -> 'I move body !' - - Parameters - ---------- - stopwords : list of stopwords to remove - - Returns - ------- - list - tokens without stopwords - - Raises - ------ - ValueError - When inputs is not a list - """ - self.tokens = [word for word in self.tokens if word not in stopwords] - return self.tokens - - def remove_tokens_with_nonletters(self) -> list: - """ - Inputs a list of tokens, outputs a list of tokens without tokens that - includes numbers of special caracters. - ['foo','bar','124','34euros'] -> ['foo','bar'] - - Parameters - ---------- - tokens : list - list of tokens to be cleaned - - Returns - ------- - list - list of tokens without tokens with numbers - """ - self.tokens = [word for word in self.tokens if re.search("[^a-zA-Z]", word) is None] - return self.tokens - - def remove_special_caracters_from_tokenslist(self) -> list: - """ - Remove tokens that doesn't contains any number or letter. - eg. ['foo','bar','---',"'s",'#'] -> ['foo','bar',"'s"] - - Parameters - ---------- - tokens : list - list of tokens to be cleaned - - Returns - ------- - list - list of tokens without tokens that contains only special caracters - - """ - self.tokens = [word for word in self.tokens if re.search("[a-zA-Z0-9]", word)] - return self.tokens - - def remove_smallwords(self, smallwords_threshold: int) -> list: - """ - Function that removes words which length is below a threshold - ["hello", "my", "name", "is", "John", "Doe"] --> ["hello","name","John","Doe"] - - Parameters - ---------- - text : list - list of strings - smallwords_threshold: int - threshold of small word - - Returns - ------- - list - """ - self.tokens = [word for word in self.tokens if len(word) > smallwords_threshold] - return self.tokens + +def remove_stopwords(tokens, stopwords: list) -> str: + """ + Remove stopwords from a text. + eg. 'I like when you move your body !' -> 'I move body !' + + Parameters + ---------- + stopwords : list of stopwords to remove + + Returns + ------- + list + tokens without stopwords + + Raises + ------ + ValueError + When inputs is not a list + """ + tokens = [word for word in tokens if word not in stopwords] + return tokens + + +def remove_tokens_with_nonletters(tokens) -> list: + """ + Inputs a list of tokens, outputs a list of tokens without tokens that + includes numbers of special caracters. + ['foo','bar','124','34euros'] -> ['foo','bar'] + + Parameters + ---------- + tokens : list + list of tokens to be cleaned + + Returns + ------- + list + list of tokens without tokens with numbers + """ + tokens = [word for word in tokens if re.search("[^a-zA-Z]", word) is None] + return tokens + + +def remove_special_caracters_from_tokenslist(tokens) -> list: + """ + Remove tokens that doesn't contains any number or letter. + eg. ['foo','bar','---',"'s",'#'] -> ['foo','bar',"'s"] + + Parameters + ---------- + tokens : list + list of tokens to be cleaned + + Returns + ------- + list + list of tokens without tokens that contains only special caracters + + """ + tokens = [word for word in tokens if re.search("[a-zA-Z0-9]", word)] + return tokens + + +def remove_smallwords(tokens, smallwords_threshold: int) -> list: + """ + Function that removes words which length is below a threshold + ["hello", "my", "name", "is", "John", "Doe"] --> ["hello","name","John","Doe"] + + Parameters + ---------- + text : list + list of strings + smallwords_threshold: int + threshold of small word + + Returns + ------- + list + """ + tokens = [word for word in tokens if len(word) > smallwords_threshold] + return tokens diff --git a/tests/test_preprocessor.py b/tests/test_preprocessor.py index 37524f8..90d448c 100644 --- a/tests/test_preprocessor.py +++ b/tests/test_preprocessor.py @@ -17,9 +17,18 @@ # Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. import pytest import numpy as np -from nautilus_nlp.preprocessing.text_preprocess import TextPreprocessor -from nautilus_nlp.preprocessing.social_preprocess import SocialPreprocessor -from nautilus_nlp.preprocessing.token_preprocess import TokenPreprocessor +from nautilus_nlp.preprocessing.text_preprocess import (normalize_whitespace, remove_eol_characters, + fix_bad_unicode, unpack_english_contractions, + replace_urls, replace_emails, replace_phone_numbers, + replace_numbers, replace_currency_symbols, remove_punct, + remove_accents, remove_multiple_spaces_and_strip_text, + filter_non_latin_characters) +from nautilus_nlp.preprocessing.social_preprocess import (remove_mentions, extract_mentions, remove_html_tags, + remove_emoji, convert_emoji_to_text, extract_emojis, + extract_hashtags, remove_hashtag) +from nautilus_nlp.preprocessing.token_preprocess import (remove_stopwords, remove_tokens_with_nonletters, + remove_special_caracters_from_tokenslist, + remove_smallwords) import nautilus_nlp.utils.phone_number as phone from nautilus_nlp.utils.stopwords import get_stopwords @@ -30,8 +39,7 @@ ("This is a text without emojis", [])]) def test_extract_emojis(text, expected_result): - preprocessor = SocialPreprocessor(text) - result = preprocessor.extract_emojis() + result = extract_emojis(text) assert expected_result == result @@ -41,8 +49,7 @@ def test_extract_emojis(text, expected_result): ("This is a text without mentions", "This is a text without mentions")]) def test_remove_mentions(text, expected_result): - preprocessor = SocialPreprocessor(text) - result = preprocessor.remove_mentions() + result = remove_mentions(text) assert expected_result == result @@ -52,8 +59,7 @@ def test_remove_mentions(text, expected_result): ("This is a text without mentions", [])]) def test_extract_mentions(text, expected_result): - preprocessor = SocialPreprocessor(text) - result = preprocessor.extract_mentions() + result = extract_mentions(text) assert expected_result == result @@ -63,8 +69,7 @@ def test_extract_mentions(text, expected_result): ("This is a text without html tags", "This is a text without html tags")]) def test_remove_html_tags(text, expected_result): - preprocessor = SocialPreprocessor(text) - result = preprocessor.remove_html_tags() + result = remove_html_tags(text) assert expected_result == result @@ -76,8 +81,7 @@ def test_remove_html_tags(text, expected_result): 2, ["This", "text", "contains", "only", "long", "words"])]) def test_remove_smallwords(tokens_list, smallwords_threshold, expected_result): - preprocessor = TokenPreprocessor(tokens_list) - result = preprocessor.remove_smallwords(smallwords_threshold) + result = remove_smallwords(tokens_list, smallwords_threshold) assert expected_result == result @@ -94,8 +98,7 @@ def test_remove_smallwords(tokens_list, smallwords_threshold, expected_result): ["#many", "#hashtags"])] ) def test_extract_hashtags(text, expected_result): - preprocessor = SocialPreprocessor(text) - result = preprocessor.extract_hashtags() + result = extract_hashtags(text) assert expected_result == result @@ -112,8 +115,7 @@ def test_extract_hashtags(text, expected_result): "this is a text with")] ) def test_remove_hashtag(text, expected_result): - preprocessor = SocialPreprocessor(text) - result = preprocessor.remove_hashtag() + result = remove_hashtag(text) assert expected_result == result @@ -121,8 +123,7 @@ def test_remove_hashtag(text, expected_result): [("كلمات Learn 3 Arabic كلمات words EASILY- Vocabulary #1 تعلم ٣ جديدة", "Learn 3 Arabic words EASILY Vocabulary 1")]) def test_filter_non_latin_characters(text, expected_filtered_text): - preprocessor = TextPreprocessor(text) - result = preprocessor.filter_non_latin_characters() + result = filter_non_latin_characters(text) assert expected_filtered_text == result @@ -137,8 +138,7 @@ def test_filter_non_latin_characters(text, expected_filtered_text): ], ) def test_remove_multiple_spaces_and_strip_text(input_str, expected_str): - preprocessor = TextPreprocessor(input_str) - result = preprocessor.remove_multiple_spaces_and_strip_text() + result = remove_multiple_spaces_and_strip_text(input_str) np.testing.assert_string_equal(result, expected_str) @@ -151,24 +151,21 @@ def test_remove_multiple_spaces_and_strip_text(input_str, expected_str): ], ) def test_remove_eol_characters(input_str, expected_str): - preprocessor = TextPreprocessor(input_str) - result = preprocessor.remove_eol_characters() + result = remove_eol_characters(input_str) np.testing.assert_string_equal(result, expected_str) def test_remove_tokens_with_nonletters(): input_tokens = ['foo', 'bar', '124', '34euros'] expected_output = ['foo', 'bar'] - preprocessor = TokenPreprocessor(input_tokens) - result = preprocessor.remove_tokens_with_nonletters() + result = remove_tokens_with_nonletters(input_tokens) np.testing.assert_array_equal(result, expected_output) def test_remove_special_caracters_from_tokenslist(): input_tokens = ['foo', 'bar', '---', "'s", '#'] expected_output = ['foo', 'bar', "'s"] - preprocessor = TokenPreprocessor(input_tokens) - result = preprocessor.remove_special_caracters_from_tokenslist() + result = remove_special_caracters_from_tokenslist(input_tokens) np.testing.assert_array_equal(result, expected_output) @@ -187,29 +184,14 @@ def test_get_stopwords(): ) def test_remove_stopwords_tokens(input_tokens, expected_output): stopwords = get_stopwords('en') - preprocessor = TokenPreprocessor(input_tokens) - result = preprocessor.remove_stopwords(stopwords) - np.testing.assert_array_equal(result, expected_output) - - -@pytest.mark.parametrize( - "input_str, expected_output", - [ - ('I like when you move your body !', 'I move body !'), - ], -) -def test_remove_stopwords_text(input_str, expected_output): - stopwords = get_stopwords('en') - preprocessor = TextPreprocessor(input_str) - result = preprocessor.remove_stopwords(stopwords) + result = remove_stopwords(input_tokens, stopwords) np.testing.assert_array_equal(result, expected_output) def test_remove_accents(): input_str = "éèëêàù" expected_str = "eeeeau" - preprocessor = TextPreprocessor(input_str) - result = preprocessor.remove_accents() + result = remove_accents(input_str) np.testing.assert_string_equal(result, expected_str) @@ -231,8 +213,7 @@ def test_remove_accents(): ('18 mois de trop....ca suffit macron', '18 mois de trop....ca suffit macron'), ('Egalité devant les infractions routières', 'Egalité devant les infractions routières')],) def test_fix_bad_unicode(input_str, expected_str): - preprocessor = TextPreprocessor(input_str) - result = preprocessor.fix_bad_unicode() + result = fix_bad_unicode(input_str) np.testing.assert_string_equal(result, expected_str) @@ -244,8 +225,7 @@ def test_fix_bad_unicode(input_str, expected_str): ], ) def test_normalize_whitespace(input_str, expected_str): - preprocessor = TextPreprocessor(input_str) - result = preprocessor.normalize_whitespace() + result = normalize_whitespace(input_str) np.testing.assert_equal(result, expected_str) @@ -261,8 +241,7 @@ def test_normalize_whitespace(input_str, expected_str): ] ) def test_unpack_english_contractions(input_str, expected_str): - preprocessor = TextPreprocessor(input_str) - result = preprocessor.unpack_english_contractions() + result = unpack_english_contractions(input_str) np.testing.assert_equal(result, expected_str) @@ -278,8 +257,7 @@ def test_unpack_english_contractions(input_str, expected_str): ("Ishttps://waaaou.com/ available?", 'Is*URL* available?'), ("mailto:hugo.vasselin@artefact.com", '*URL*')]) def test_replace_urls(input_str, expected_str): - preprocessor = TextPreprocessor(input_str) - result = preprocessor.replace_urls() + result = replace_urls(input_str) np.testing.assert_equal(result, expected_str) @@ -293,8 +271,7 @@ def test_replace_urls(input_str, expected_str): ] ) def test_replace_emails(input_str, expected_str): - preprocessor = TextPreprocessor(input_str) - result = preprocessor.replace_emails() + result = replace_emails(input_str) np.testing.assert_equal(result, expected_str) @@ -315,12 +292,11 @@ def test_replace_emails(input_str, expected_str): ] ) def test_replace_phone_numbers(input_str, expected_str): - preprocessor = TextPreprocessor(input_str) - result = preprocessor.replace_phone_numbers( + result = replace_phone_numbers( + input_str, replace_with="*PHONE*", method="detection", - country_format_to_detect=phone.SUPPORTED_COUNTRY - ) + country_format_to_detect=phone.SUPPORTED_COUNTRY) np.testing.assert_equal(result, expected_str) @@ -334,8 +310,7 @@ def test_replace_phone_numbers(input_str, expected_str): ] ) def test_replace_numbers(input_str, expected_str): - preprocessor = TextPreprocessor(input_str) - result = preprocessor.replace_numbers() + result = replace_numbers(input_str) np.testing.assert_equal(result, expected_str) @@ -350,8 +325,7 @@ def test_replace_numbers(input_str, expected_str): ] ) def test_replace_currency_symbols(input_str, param, expected_str): - preprocessor = TextPreprocessor(input_str) - result = preprocessor.replace_currency_symbols(replace_with=param) + result = replace_currency_symbols(input_str, replace_with=param) np.testing.assert_equal(result, expected_str) @@ -377,8 +351,7 @@ def test_replace_currency_symbols(input_str, param, expected_str): ] ) def test_remove_punct(input_str, param, expected_str): - preprocessor = TextPreprocessor(input_str) - result = preprocessor.remove_punct(marks=param) + result = remove_punct(input_str, marks=param) np.testing.assert_equal(result, expected_str) @@ -396,8 +369,7 @@ def test_remove_punct(input_str, param, expected_str): ] ) def test_remove_emoji(input_str, expected_str): - preprocessor = SocialPreprocessor(input_str) - result = preprocessor.remove_emoji() + result = remove_emoji(input_str) np.testing.assert_equal(result, expected_str) @@ -411,6 +383,5 @@ def test_remove_emoji(input_str, expected_str): ] ) def test_convert_emoji_to_text(input_str, expected_str): - preprocessor = SocialPreprocessor(input_str) - result = preprocessor.convert_emoji_to_text() + result = convert_emoji_to_text(input_str) np.testing.assert_equal(result, expected_str) From ec3826019f54bbb84d4ac53da20c4e88527c1891 Mon Sep 17 00:00:00 2001 From: Amale EL HAMRI <amale.elhamri@artefact.com> Date: Thu, 5 Nov 2020 16:19:45 +0100 Subject: [PATCH 367/496] removing duplicated test --- tests/test_fix_bad_encoding.py | 44 ---------------------------------- 1 file changed, 44 deletions(-) delete mode 100644 tests/test_fix_bad_encoding.py diff --git a/tests/test_fix_bad_encoding.py b/tests/test_fix_bad_encoding.py deleted file mode 100644 index cfc21ba..0000000 --- a/tests/test_fix_bad_encoding.py +++ /dev/null @@ -1,44 +0,0 @@ -# GNU Lesser General Public License v3.0 only -# Copyright (C) 2020 Artefact -# licence-information@artefact.com -# -# This program is free software; you can redistribute it and/or -# modify it under the terms of the GNU Lesser General Public -# License as published by the Free Software Foundation; either -# version 3 of the License, or (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public License -# along with this program; if not, write to the Free Software Foundation, -# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - -import pytest -import numpy as np -from nautilus_nlp.preprocessing.text_preprocess import TextPreprocessor - - -@pytest.mark.parametrize( - "input_str, expected_str", - [('Les augmentations de rémunérations', 'Les augmentations de rémunérations'), - ("rénover l'enquête publique pour en faire un vrai outil d'aménagement du territoire et de dialogue social", - "rénover l'enquête publique pour en faire un vrai outil d'aménagement du territoire et de dialogue social"), - ('Limitations de vitesse et sécurité routière', 'Limitations de vitesse et sécurité routière'), - ('Pour un nouveau contrat citoyen', 'Pour un nouveau contrat citoyen'), - ( - 'Développer les démarches de budget participatif dans les collectivités et associer les citoyens '\ - 'dans la réalisation des projets', - 'Développer les démarches de budget participatif dans les collectivités et associer les citoyens '\ - 'dans la réalisation des projets'), - ('proportienelle', 'proportienelle'), - ('Pour plus de démocratie participative', 'Pour plus de démocratie participative'), - ('Transparence de la vie public', 'Transparence de la vie public'), - ('18 mois de trop....ca suffit macron', '18 mois de trop....ca suffit macron'), - ('Egalité devant les infractions routières', 'Egalité devant les infractions routières')],) -def test_remove_multiple_spaces_and_strip_text(input_str, expected_str): - preprocessor = TextPreprocessor(input_str) - result = preprocessor.fix_bad_unicode() - np.testing.assert_string_equal(result, expected_str) From 3341997f801941b26837aa3f89551c1aeab8de0b Mon Sep 17 00:00:00 2001 From: Amale EL HAMRI <amale.elhamri@artefact.com> Date: Thu, 5 Nov 2020 17:42:37 +0100 Subject: [PATCH 368/496] adding preprocessor object --- nautilus_nlp/preprocessing/preprocessor.py | 35 ++++++++++++++++++++++ 1 file changed, 35 insertions(+) create mode 100644 nautilus_nlp/preprocessing/preprocessor.py diff --git a/nautilus_nlp/preprocessing/preprocessor.py b/nautilus_nlp/preprocessing/preprocessor.py new file mode 100644 index 0000000..33c8169 --- /dev/null +++ b/nautilus_nlp/preprocessing/preprocessor.py @@ -0,0 +1,35 @@ +from inspect import getmembers, isfunction + +from sklearn.pipeline import Pipeline +from sklearn.preprocessing import FunctionTransformer + +from nautilus_nlp.preprocessing import social_preprocess +from nautilus_nlp.preprocessing import text_preprocess + + +class Preprocessor(object): + def __init__( + self, social_pipelines=None, text_pipelines=None): + """ + """ + if social_pipelines is None: + self.social_pipelines = Pipeline( + steps=[(function_name, FunctionTransformer(function_callable)) + for function_name, function_callable in getmembers(social_preprocess) + if isfunction(function_callable)]) + if text_pipelines is None: + self.text_pipelines = Pipeline( + steps=[(function_name, FunctionTransformer(function_callable)) + for function_name, function_callable in getmembers(text_preprocess) + if isfunction(function_callable)]) + + def apply_social_pipeline(self, text): + return self.social_pipelines.fit_transform(text) + + def apply_text_pipeline(self, text): + return self.text_pipelines.fit_transform(text) + + def apply_all_pipeline(self, text): + text = self.apply_social_pipeline(text) + text = self.apply_text_pipeline(text) + return text From fce1548dee622745e9623576f80c5cfed32826b9 Mon Sep 17 00:00:00 2001 From: "sacha.lasry" <sacha.lasry@artefact.com> Date: Fri, 6 Nov 2020 15:50:43 +0100 Subject: [PATCH 369/496] modified test to see if ci working --- tests/test_preprocessor.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/test_preprocessor.py b/tests/test_preprocessor.py index 37524f8..b605202 100644 --- a/tests/test_preprocessor.py +++ b/tests/test_preprocessor.py @@ -74,7 +74,7 @@ def test_remove_html_tags(text, expected_result): ["take", "care", "skin"]), (["This", "text", "contains", "only", "long", "words"], 2, - ["This", "text", "contains", "only", "long", "words"])]) + ["This", "text", "contains", "only", "nimportequoi", "words"])]) def test_remove_smallwords(tokens_list, smallwords_threshold, expected_result): preprocessor = TokenPreprocessor(tokens_list) result = preprocessor.remove_smallwords(smallwords_threshold) From 7883e0dbf4c534e7d96709ef11d72129d12d7bf2 Mon Sep 17 00:00:00 2001 From: "sacha.lasry" <sacha.lasry@artefact.com> Date: Fri, 6 Nov 2020 16:42:26 +0100 Subject: [PATCH 370/496] fixed tests so CI works --- tests/test_preprocessor.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/test_preprocessor.py b/tests/test_preprocessor.py index b605202..37524f8 100644 --- a/tests/test_preprocessor.py +++ b/tests/test_preprocessor.py @@ -74,7 +74,7 @@ def test_remove_html_tags(text, expected_result): ["take", "care", "skin"]), (["This", "text", "contains", "only", "long", "words"], 2, - ["This", "text", "contains", "only", "nimportequoi", "words"])]) + ["This", "text", "contains", "only", "long", "words"])]) def test_remove_smallwords(tokens_list, smallwords_threshold, expected_result): preprocessor = TokenPreprocessor(tokens_list) result = preprocessor.remove_smallwords(smallwords_threshold) From 556b41591cfabfdea816555c8b55043e4b2c7a84 Mon Sep 17 00:00:00 2001 From: "sacha.lasry" <sacha.lasry@artefact.com> Date: Fri, 6 Nov 2020 18:12:48 +0100 Subject: [PATCH 371/496] removed travis --- .github/workflows/ci_actions.yml | 2 ++ .travis.yml | 38 -------------------------------- 2 files changed, 2 insertions(+), 38 deletions(-) delete mode 100644 .travis.yml diff --git a/.github/workflows/ci_actions.yml b/.github/workflows/ci_actions.yml index fceb231..62d08d4 100644 --- a/.github/workflows/ci_actions.yml +++ b/.github/workflows/ci_actions.yml @@ -35,6 +35,8 @@ jobs: python-version: ${{ matrix.python-version }} - name: Install requirements run: + wget https://github.com/facebookresearch/fastText/archive/v0.2.0.zip && unzip v0.2.0.zip && cd fastText-0.2.0 && make && pip install . && cd .. + python3 -m spacy download fr && python3 -m spacy download en && python3 -m spacy download de && python3 -m spacy download nl && python3 -m spacy download it && python3 -m spacy download xx && python3 -m spacy validate python -m pip install --upgrade pip pip install -r requirements.txt diff --git a/.travis.yml b/.travis.yml deleted file mode 100644 index e99a71f..0000000 --- a/.travis.yml +++ /dev/null @@ -1,38 +0,0 @@ -# GNU Lesser General Public License v3.0 only -# Copyright (C) 2020 Artefact -# licence-information@artefact.com -# -# This program is free software; you can redistribute it and/or -# modify it under the terms of the GNU Lesser General Public -# License as published by the Free Software Foundation; either -# version 3 of the License, or (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public License -# along with this program; if not, write to the Free Software Foundation, -# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. -language: python - -os: - - linux -services: - - docker - -before_script: - - wget https://github.com/facebookresearch/fastText/archive/v0.2.0.zip && unzip v0.2.0.zip && cd fastText-0.2.0 && make && pip install . && cd .. - - python3 -m spacy download fr && python3 -m spacy download en && python3 -m spacy download de && python3 -m spacy download nl && python3 -m spacy download it && python3 -m spacy download xx && python3 -m spacy validate - - - wget http://mallet.cs.umass.edu/dist/mallet-2.0.8.zip && unzip mallet-2.0.8.zip && rm mallet-2.0.8.zip - - sudo add-apt-repository -y ppa:openjdk-r/ppa && sudo apt update && apt search openjdk && sudo apt install openjdk-8-jdk - -install: - - pip install -r requirements.txt - - pip install -e . -script: - - pylint nautilus_nlp/ - - pylint tests/ - - pytest tests/* From e12217b684e4a3d284f3392d10eb5ebda3427843 Mon Sep 17 00:00:00 2001 From: "sacha.lasry" <sacha.lasry@artefact.com> Date: Fri, 6 Nov 2020 18:16:53 +0100 Subject: [PATCH 372/496] updated ci --- .github/workflows/ci_actions.yml | 17 ++++++++++++++--- 1 file changed, 14 insertions(+), 3 deletions(-) diff --git a/.github/workflows/ci_actions.yml b/.github/workflows/ci_actions.yml index 62d08d4..b2d87e1 100644 --- a/.github/workflows/ci_actions.yml +++ b/.github/workflows/ci_actions.yml @@ -29,14 +29,25 @@ jobs: steps: - uses: actions/checkout@v2 + - name: Set up Python ${{ matrix.python-version }} uses: actions/setup-python@v2 with: python-version: ${{ matrix.python-version }} - - name: Install requirements - run: + + - name: Install fastText and spacy models + run: wget https://github.com/facebookresearch/fastText/archive/v0.2.0.zip && unzip v0.2.0.zip && cd fastText-0.2.0 && make && pip install . && cd .. - python3 -m spacy download fr && python3 -m spacy download en && python3 -m spacy download de && python3 -m spacy download nl && python3 -m spacy download it && python3 -m spacy download xx && python3 -m spacy validate + python3 -m spacy download fr + python3 -m spacy download en + python3 -m spacy download de + python3 -m spacy download nl + python3 -m spacy download it + python3 -m spacy download xx + python3 -m spacy validate + + - name: Install requirements + run: python -m pip install --upgrade pip pip install -r requirements.txt From b3a3c6fc688ff675c2b75c9a67d2febf86b8ee52 Mon Sep 17 00:00:00 2001 From: "sacha.lasry" <sacha.lasry@artefact.com> Date: Fri, 6 Nov 2020 18:21:14 +0100 Subject: [PATCH 373/496] separated spacy models and fasttext in ci --- .github/workflows/ci_actions.yml | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/.github/workflows/ci_actions.yml b/.github/workflows/ci_actions.yml index b2d87e1..8d99ada 100644 --- a/.github/workflows/ci_actions.yml +++ b/.github/workflows/ci_actions.yml @@ -35,9 +35,16 @@ jobs: with: python-version: ${{ matrix.python-version }} - - name: Install fastText and spacy models + - name: Install fastText + run: + wget https://github.com/facebookresearch/fastText/archive/v0.2.0.zip + unzip v0.2.0.zip + cd fastText-0.2.0 + make + pip install . + + - name: Install spacy models run: - wget https://github.com/facebookresearch/fastText/archive/v0.2.0.zip && unzip v0.2.0.zip && cd fastText-0.2.0 && make && pip install . && cd .. python3 -m spacy download fr python3 -m spacy download en python3 -m spacy download de From 290602e3f1750fdefe84fcd27617ed59c13adbf2 Mon Sep 17 00:00:00 2001 From: "sacha.lasry" <sacha.lasry@artefact.com> Date: Fri, 6 Nov 2020 18:25:49 +0100 Subject: [PATCH 374/496] removed fast text for ci temporarely --- .github/workflows/ci_actions.yml | 8 -------- 1 file changed, 8 deletions(-) diff --git a/.github/workflows/ci_actions.yml b/.github/workflows/ci_actions.yml index 8d99ada..edfe649 100644 --- a/.github/workflows/ci_actions.yml +++ b/.github/workflows/ci_actions.yml @@ -35,14 +35,6 @@ jobs: with: python-version: ${{ matrix.python-version }} - - name: Install fastText - run: - wget https://github.com/facebookresearch/fastText/archive/v0.2.0.zip - unzip v0.2.0.zip - cd fastText-0.2.0 - make - pip install . - - name: Install spacy models run: python3 -m spacy download fr From 642f1a9c47b57835772816955fc0fb1668491323 Mon Sep 17 00:00:00 2001 From: "sacha.lasry" <sacha.lasry@artefact.com> Date: Fri, 6 Nov 2020 18:27:25 +0100 Subject: [PATCH 375/496] install spacy models after requirements --- .github/workflows/ci_actions.yml | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/.github/workflows/ci_actions.yml b/.github/workflows/ci_actions.yml index edfe649..7677aa1 100644 --- a/.github/workflows/ci_actions.yml +++ b/.github/workflows/ci_actions.yml @@ -35,6 +35,11 @@ jobs: with: python-version: ${{ matrix.python-version }} + - name: Install requirements + run: + python -m pip install --upgrade pip + pip install -r requirements.txt + - name: Install spacy models run: python3 -m spacy download fr @@ -45,11 +50,6 @@ jobs: python3 -m spacy download xx python3 -m spacy validate - - name: Install requirements - run: - python -m pip install --upgrade pip - pip install -r requirements.txt - - name: Run pylint run: | pip install pylint From 4cbafcde255a17e2ecb8bd5b5227e1a3418648f4 Mon Sep 17 00:00:00 2001 From: "sacha.lasry" <sacha.lasry@artefact.com> Date: Mon, 9 Nov 2020 14:19:12 +0100 Subject: [PATCH 376/496] removed spacy install in ci --- .github/workflows/ci_actions.yml | 10 ---------- 1 file changed, 10 deletions(-) diff --git a/.github/workflows/ci_actions.yml b/.github/workflows/ci_actions.yml index 7677aa1..859f7c6 100644 --- a/.github/workflows/ci_actions.yml +++ b/.github/workflows/ci_actions.yml @@ -40,16 +40,6 @@ jobs: python -m pip install --upgrade pip pip install -r requirements.txt - - name: Install spacy models - run: - python3 -m spacy download fr - python3 -m spacy download en - python3 -m spacy download de - python3 -m spacy download nl - python3 -m spacy download it - python3 -m spacy download xx - python3 -m spacy validate - - name: Run pylint run: | pip install pylint From b87766d5d18508ee2b5675a8f65b2d88915b88bc Mon Sep 17 00:00:00 2001 From: hugovasselin <waaaouu@gmail.com> Date: Fri, 13 Nov 2020 12:26:39 +0100 Subject: [PATCH 377/496] refacto: add typo --- .../topic_modeling/topic_modeling_short_text.py | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/nautilus_nlp/topic_modeling/topic_modeling_short_text.py b/nautilus_nlp/topic_modeling/topic_modeling_short_text.py index bc0a94e..56580c3 100644 --- a/nautilus_nlp/topic_modeling/topic_modeling_short_text.py +++ b/nautilus_nlp/topic_modeling/topic_modeling_short_text.py @@ -18,6 +18,7 @@ import re from collections import Counter from itertools import product +from typing import List import numpy as np import pyLDAvis @@ -25,12 +26,12 @@ from nautilus_nlp.topic_modeling.seanmf_model import SeaNMF -def prepare_data(text: str, vocab_min_count: int = 1, vocab_max_size: int = 10000): +def prepare_data(docs: List[str], vocab_min_count: int = 1, vocab_max_size: int = 10000): """ Parameters ---------- - text : str - list of str on which the topic modeling will be performed + docs : list + list of sentences on which the topic modeling will be performed vocab_min_count : int minimum number of occurrences of a word to be considered in the vocabulary vocab_max_size : int @@ -49,7 +50,7 @@ def prepare_data(text: str, vocab_min_count: int = 1, vocab_max_size: int = 1000 # Tokens_list is a list of sub-lists where each sub-list contains a sentences' tokens. tokens_list = [] - for sentence in text: + for sentence in docs: sentence = re.split(r'\s', sentence) tokens_list.append(sentence) vocab = dict(Counter(x for xs in tokens_list for x in xs)) @@ -66,7 +67,7 @@ def prepare_data(text: str, vocab_min_count: int = 1, vocab_max_size: int = 1000 # Create ID representation of text (ie: each sentence is a list of vocabId ) encoded_text_id = [] - for sentence in text: + for sentence in docs: sentence = re.split(r'\s', sentence) sentence = [int(vocab2id[wd]) for wd in sentence if wd in vocab2id] encoded_text_id.append(sentence) From 34cae88bbb9a4256f8dd90b7fb44494e068d008c Mon Sep 17 00:00:00 2001 From: hugovasselin <waaaouu@gmail.com> Date: Fri, 13 Nov 2020 13:13:27 +0100 Subject: [PATCH 378/496] feat: add docstring --- nautilus_nlp/utils/file_loader.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/nautilus_nlp/utils/file_loader.py b/nautilus_nlp/utils/file_loader.py index 81a8deb..437bd7d 100644 --- a/nautilus_nlp/utils/file_loader.py +++ b/nautilus_nlp/utils/file_loader.py @@ -98,10 +98,13 @@ def text_loader(filepath: str, encoding: Optional[str] = None, detectencoding: b def get_subfolders_path(folder: str) -> list: + """ + Get a list of all the subfolder for a folder path + """ if not folder.endswith("/"): folder = folder + "/" return [ - folder + f+'/' for f in os.listdir(folder) + folder + f+'/' for f in os.listdir(folder) if os.path.isdir(os.path.join(folder, f)) and f != ".DS_Store" ] From 8ee5605b0d990b57ae55137ad0436169d51d06d9 Mon Sep 17 00:00:00 2001 From: hugovasselin <waaaouu@gmail.com> Date: Fri, 13 Nov 2020 13:13:44 +0100 Subject: [PATCH 379/496] fix: change error type --- tests/test_biterm.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/test_biterm.py b/tests/test_biterm.py index 21e7320..b7fc830 100644 --- a/tests/test_biterm.py +++ b/tests/test_biterm.py @@ -63,7 +63,7 @@ def text_input_parameter_error_handling(input_text , input_nb_topic , input_nb_iteration , input_language): - with pytest.raises(ValueError): + with pytest.raises(TypeError): BitermModel(data=input_text, nb_topics=input_nb_topic, nb_iteration=input_nb_iteration, lang=input_language) From 7ab683ad6f03986c3d92d6a01fb010eb05f3ce1b Mon Sep 17 00:00:00 2001 From: hugovasselin <waaaouu@gmail.com> Date: Fri, 13 Nov 2020 13:13:58 +0100 Subject: [PATCH 380/496] fix: typo --- nautilus_nlp/topic_modeling/lda.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/nautilus_nlp/topic_modeling/lda.py b/nautilus_nlp/topic_modeling/lda.py index e9ffa75..0b5b257 100644 --- a/nautilus_nlp/topic_modeling/lda.py +++ b/nautilus_nlp/topic_modeling/lda.py @@ -81,7 +81,7 @@ def create_bow_corpus(data, dictionary): Returns ------- list - listof list of tuples + list of list of tuples """ corpus = [dictionary.doc2bow(text) for text in data] return corpus From 5c51fd214033aa979f2b752b2eb69d5676b29e31 Mon Sep 17 00:00:00 2001 From: hugovasselin <waaaouu@gmail.com> Date: Fri, 13 Nov 2020 13:14:41 +0100 Subject: [PATCH 381/496] refacto: import functions rather than everything --- nautilus_nlp/topic_modeling/biterm_model.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/nautilus_nlp/topic_modeling/biterm_model.py b/nautilus_nlp/topic_modeling/biterm_model.py index 0d66b7b..83c4eff 100644 --- a/nautilus_nlp/topic_modeling/biterm_model.py +++ b/nautilus_nlp/topic_modeling/biterm_model.py @@ -17,7 +17,7 @@ # Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. from typing import List, Any import numpy as np -import pyLDAvis +from pyLDAvis import prepare, save_html from biterm.btm import oBTM from biterm.utility import topic_summuary, vec_to_biterms from sklearn.feature_extraction.text import CountVectorizer @@ -162,9 +162,9 @@ def save_pyldavis_plot_as_html(self, path_to_output: str = './biterm_pyLDAavis_p if self._topics is None or self._btm is None or self._vectorize_text is None or self._vocabulary is None: raise ValueError("Model needs to be trained first") - vis = pyLDAvis.prepare( + vis = prepare( self._btm.phi_wz.T, self._topics, np.count_nonzero(self._vectorize_text, axis=1), self._vocabulary, np.sum(self._vectorize_text, axis=0) ) - pyLDAvis.save_html(vis, path_to_output) + save_html(vis, path_to_output) From a823dde238df73808720c008258a0e31dab59898 Mon Sep 17 00:00:00 2001 From: hugovasselin <waaaouu@gmail.com> Date: Fri, 13 Nov 2020 13:17:52 +0100 Subject: [PATCH 382/496] refacto: black this shit out --- .../topic_modeling_short_text.py | 95 +++++++++++-------- 1 file changed, 56 insertions(+), 39 deletions(-) diff --git a/nautilus_nlp/topic_modeling/topic_modeling_short_text.py b/nautilus_nlp/topic_modeling/topic_modeling_short_text.py index 56580c3..cc8f6f5 100644 --- a/nautilus_nlp/topic_modeling/topic_modeling_short_text.py +++ b/nautilus_nlp/topic_modeling/topic_modeling_short_text.py @@ -26,7 +26,9 @@ from nautilus_nlp.topic_modeling.seanmf_model import SeaNMF -def prepare_data(docs: List[str], vocab_min_count: int = 1, vocab_max_size: int = 10000): +def prepare_data( + docs: List[str], vocab_min_count: int = 1, vocab_max_size: int = 10000 +): """ Parameters ---------- @@ -38,7 +40,7 @@ def prepare_data(docs: List[str], vocab_min_count: int = 1, vocab_max_size: int maximum number of word in the vocabulary Returns - ------- + ------- list list of encoded sentences using vocab IDs list @@ -51,7 +53,7 @@ def prepare_data(docs: List[str], vocab_min_count: int = 1, vocab_max_size: int # Tokens_list is a list of sub-lists where each sub-list contains a sentences' tokens. tokens_list = [] for sentence in docs: - sentence = re.split(r'\s', sentence) + sentence = re.split(r"\s", sentence) tokens_list.append(sentence) vocab = dict(Counter(x for xs in tokens_list for x in xs)) @@ -68,7 +70,7 @@ def prepare_data(docs: List[str], vocab_min_count: int = 1, vocab_max_size: int # Create ID representation of text (ie: each sentence is a list of vocabId ) encoded_text_id = [] for sentence in docs: - sentence = re.split(r'\s', sentence) + sentence = re.split(r"\s", sentence) sentence = [int(vocab2id[wd]) for wd in sentence if wd in vocab2id] encoded_text_id.append(sentence) @@ -76,19 +78,26 @@ def prepare_data(docs: List[str], vocab_min_count: int = 1, vocab_max_size: int def train_shorttext_model( - model_name: str, encoded_text_id: list, vocab_list: list, n_topics: int = 20, - max_iter: int = 20, max_err: float = 0.1, alpha: float = 0, beta: float = 0): + model_name: str, + encoded_text_id: list, + vocab_list: list, + n_topics: int = 20, + max_iter: int = 20, + max_err: float = 0.1, + alpha: float = 0, + beta: float = 0, +): """ Parameters - ---------- + ---------- model_name : str {'nmf','seanmf'} encoded_text_id : list list of encoded sentences vocab_list : list list of vocabulary - n_topics : int + n_topics : int number of topics - max_iter : int + max_iter : int maximum number of iterations while training max_err : float training error @@ -98,7 +107,7 @@ def train_shorttext_model( regularization param for the NMF model Returns - ------- + ------- Trained NMF model Raises @@ -110,7 +119,7 @@ def train_shorttext_model( n_docs = len(encoded_text_id) n_terms = len(vocab_list) - if model_name == 'nmf': + if model_name == "nmf": dt_mat = __build_doc_term_matrix(n_terms, n_docs, encoded_text_id) return NMF( dt_mat, @@ -118,9 +127,10 @@ def train_shorttext_model( mat_ih=[], n_topic=n_topics, max_iter=max_iter, - max_err=max_err) + max_err=max_err, + ) - elif model_name == 'seanmf': + if model_name == "seanmf": # Calculate co-occurence matrix cooc_mat = __build_cooccurence_matrix(n_terms, encoded_text_id) # Calculate PPMI @@ -128,7 +138,8 @@ def train_shorttext_model( # Build doc-term matrix dt_mat = __build_doc_term_matrix(n_terms, n_docs, encoded_text_id) return SeaNMF( - dt_mat, mat_ss, + dt_mat, + mat_ss, mat_iw=[], mat_iwc=[], mat_ih=[], @@ -137,16 +148,19 @@ def train_shorttext_model( n_topic=n_topics, max_iter=max_iter, max_err=max_err, - fix_seed=1024) + fix_seed=1024, + ) raise ValueError("Invalid model name: Use nmf or seanmf") -def show_dominant_topic(model, encoded_text_id: list, vocab_list: list, n_top_keyword: int = 10): +def show_dominant_topic( + model, encoded_text_id: list, vocab_list: list, n_top_keyword: int = 10 +): """ Computes the PMi score for each topic and the topKeywords describing each of them. Parameters - ---------- + ---------- - model trained NMF model - encoded_text_id : list @@ -157,13 +171,15 @@ def show_dominant_topic(model, encoded_text_id: list, vocab_list: list, n_top_ke the number of keywords to be returned Returns - ------- + ------- dict A dictionnary with the topic number and its top keywords - dict + dict A ictionnary with the topic number and its PMI score """ - dt_mat = __build_cooccurence_matrix(n_terms=len(vocab_list), encoded_text_id=encoded_text_id) + dt_mat = __build_cooccurence_matrix( + n_terms=len(vocab_list), encoded_text_id=encoded_text_id + ) np.fill_diagonal(dt_mat, 0) mat_w, _ = model.get_decomposition_matrix() n_topic = mat_w.shape[1] @@ -212,7 +228,7 @@ def get_assigned_topics(model): def show_pyldavis(model, encoded_text_id, vocab_arr): """ Parameters - ---------- + ---------- model trained model encoded_text_id @@ -221,7 +237,7 @@ def show_pyldavis(model, encoded_text_id, vocab_arr): array of vocabulary frequency Returns - ------- + ------- pyldavis topics plot """ @@ -238,7 +254,7 @@ def prepare_data_pyldavis(model, encoded_text_id, vocab_arr) -> dict: link : http://jeriwieringa.com/2018/07/17/pyLDAviz-and-Mallet/ Returns - ------- + ------- dict dict of data needed by pyldavis """ @@ -253,13 +269,12 @@ def prepare_data_pyldavis(model, encoded_text_id, vocab_arr) -> dict: # Document-term matrix theta theta = mat_h / mat_h.sum(axis=1, keepdims=True) return { - 'topic_term_dists': phi, - 'doc_topic_dists': theta, - 'doc_lengths': doc_length_values, - 'vocab': list_vocab, - 'term_frequency': freq_vocab - } - + "topic_term_dists": phi, + "doc_topic_dists": theta, + "doc_lengths": doc_length_values, + "vocab": list_vocab, + "term_frequency": freq_vocab, + } def __build_cooccurence_matrix(n_terms: int, encoded_text_id: list): @@ -268,13 +283,13 @@ def __build_cooccurence_matrix(n_terms: int, encoded_text_id: list): appeared in the same context as another word from the vocabulary. The matrix has n_terms x n_terms size, columns and rows denote the vocab. Cell values represent the number of times words occured together in the same sentence. - + Parameters ---------- n_terms : int encoded_text_id : list list of encoded sentences - + Returns ------- co-occurence matrix @@ -289,14 +304,14 @@ def __build_cooccurence_matrix(n_terms: int, encoded_text_id: list): def __calculate_ppmi(cooc_mat, n_terms): mat_d1 = np.sum(cooc_mat) - print('D1= ', mat_d1) + print("D1= ", mat_d1) mat_ss = mat_d1 * cooc_mat - print('SS= ', mat_ss) + print("SS= ", mat_ss) for k in range(n_terms): mat_ss[k] /= np.sum(cooc_mat[k]) for k in range(n_terms): mat_ss[:, k] /= np.sum(cooc_mat[:, k]) - print('SS = ', mat_ss) + print("SS = ", mat_ss) cooc_mat = [] # release memory mat_ss[mat_ss == 0] = 1.0 mat_ss = np.log(mat_ss) @@ -313,10 +328,10 @@ def __build_doc_term_matrix(n_terms, n_docs, encoded_text_id): def __calculate_pmi(mat_aa, top_keywords_index): - ''' + """ Method to compute PMi score Reference: Short and Sparse Text Topic Modeling via Self-Aggregation - ''' + """ mat_d1 = np.sum(mat_aa) n_tp = len(top_keywords_index) mat_pmi = [] @@ -328,6 +343,8 @@ def __calculate_pmi(mat_aa, top_keywords_index): else: mat_c1 = np.sum(mat_aa[index1]) mat_c2 = np.sum(mat_aa[index2]) - mat_pmi.append(np.log(mat_aa[index1,index2]*mat_d1/mat_c1/mat_c2)) - avg_pmi = 2.0*np.sum(mat_pmi)/float(n_tp)/(float(n_tp)-1.0) + mat_pmi.append( + np.log(mat_aa[index1, index2] * mat_d1 / mat_c1 / mat_c2) + ) + avg_pmi = 2.0 * np.sum(mat_pmi) / float(n_tp) / (float(n_tp) - 1.0) return avg_pmi From 648560eaed4779328474def544b2dff39e4f1772 Mon Sep 17 00:00:00 2001 From: hugovasselin <waaaouu@gmail.com> Date: Fri, 13 Nov 2020 13:22:15 +0100 Subject: [PATCH 383/496] fix: add missing param --- nautilus_nlp/utils/phone_number.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/nautilus_nlp/utils/phone_number.py b/nautilus_nlp/utils/phone_number.py index e03b47e..7f72bb5 100644 --- a/nautilus_nlp/utils/phone_number.py +++ b/nautilus_nlp/utils/phone_number.py @@ -84,7 +84,8 @@ def extract_phone_numbers(text: str, countrylist: list) -> list: Parameters ---------- - countrylist: list (eg. [None,'FR','US','GB']) + text : str + countrylist : list (eg. [None,'FR','US','GB']) Look for phone numbers formatted according to the specified countlist. supported value: look SUPPORTED_COUNTRY variable. From 68f3ed4dd144010112e93cdd40c8fae1b821651d Mon Sep 17 00:00:00 2001 From: hugovasselin <waaaouu@gmail.com> Date: Fri, 13 Nov 2020 13:22:33 +0100 Subject: [PATCH 384/496] fix: add python 3.8 support --- requirements.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/requirements.txt b/requirements.txt index 00dc863..c51eb80 100644 --- a/requirements.txt +++ b/requirements.txt @@ -42,3 +42,4 @@ biterm==0.1.5 nlpaug==1.0.1 ipython==7.16.1 pylint==2.4.4 +scikit-learn==0.23.2 From 7e008f1a2ada617097260f2d2cfe9e26595971b0 Mon Sep 17 00:00:00 2001 From: hugovasselin <waaaouu@gmail.com> Date: Fri, 13 Nov 2020 13:30:38 +0100 Subject: [PATCH 385/496] test: requirements --- requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements.txt b/requirements.txt index c51eb80..363bb7f 100644 --- a/requirements.txt +++ b/requirements.txt @@ -8,6 +8,7 @@ coverage python-dotenv>=0.5.1 pillow pytest +scikit-learn==0.23.2 #library requirements pyLDAvis==2.1.2 @@ -42,4 +43,3 @@ biterm==0.1.5 nlpaug==1.0.1 ipython==7.16.1 pylint==2.4.4 -scikit-learn==0.23.2 From 592d03443d8d0c19cd23381519dfca1f81177171 Mon Sep 17 00:00:00 2001 From: hugovasselin <waaaouu@gmail.com> Date: Fri, 13 Nov 2020 13:33:08 +0100 Subject: [PATCH 386/496] text: attempt to fix requirements --- requirements.txt | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/requirements.txt b/requirements.txt index 363bb7f..872256a 100644 --- a/requirements.txt +++ b/requirements.txt @@ -8,7 +8,6 @@ coverage python-dotenv>=0.5.1 pillow pytest -scikit-learn==0.23.2 #library requirements pyLDAvis==2.1.2 @@ -31,7 +30,7 @@ setuptools==40.8.0 textacy==0.6.3 #fastText==0.8.3 gensim==3.7.1 -scikit_learn==0.20.3 +scikit-learn==0.23.2 vaderSentiment==3.2.1 google-compute-engine==2.8.13 flashtext==2.7 From 81ac21bbbf7889e82e55da98baf28cfd5636f165 Mon Sep 17 00:00:00 2001 From: hugovasselin <waaaouu@gmail.com> Date: Fri, 13 Nov 2020 13:48:17 +0100 Subject: [PATCH 387/496] fix: fix unit test --- tests/test_topic_modeling_short_text.py | 161 +++++++++++++++--------- 1 file changed, 102 insertions(+), 59 deletions(-) diff --git a/tests/test_topic_modeling_short_text.py b/tests/test_topic_modeling_short_text.py index 5d8ad7a..0103d4a 100644 --- a/tests/test_topic_modeling_short_text.py +++ b/tests/test_topic_modeling_short_text.py @@ -18,51 +18,84 @@ import numpy as np import pytest from nautilus_nlp.topic_modeling.topic_modeling_short_text import ( - __build_cooccurence_matrix, get_assigned_topics, prepare_data, - prepare_data_pyldavis, show_dominant_topic, train_shorttext_model) - -TEXT = ['Cola 1.5L Carrefour', - 'Pepsi Cola Light 1.5L', - 'Pepsi Cola Twist Light', - 'Cola 1.5L CRF DISC', - 'Coca-Cola Light 1.5L', - 'Coca-Cola Light 4x0.5L', - 'Coca-Cola Light 6x0.3L', - 'Panzani 200g x 4 bio', - 'Rustichella 150g bio', - 'De Cecco - Fusilli bio', - 'Gerblé sans Gluten50g', - 'Penne de riz 100g sans gluten', - 'Spaghetti de maïs 50g sans Glute'] - - -@pytest.mark.parametrize("input_text, expected_output", - [(TEXT, - [['1.5L', 4], - ['Coca-Cola', 3], - ['Cola', 4], - ['Light', 5], - ['Pepsi', 2], - ['bio', 3], - ['de', 2], - ['sans', 3]]), - ([], - []), - (['', ''], - []), ],) + __build_cooccurence_matrix, + get_assigned_topics, + prepare_data, + prepare_data_pyldavis, + show_dominant_topic, + train_shorttext_model, +) + +TEXT = [ + "Cola 1.5L Carrefour", + "Pepsi Cola Light 1.5L", + "Pepsi Cola Twist Light", + "Cola 1.5L CRF DISC", + "Coca-Cola Light 1.5L", + "Coca-Cola Light 4x0.5L", + "Coca-Cola Light 6x0.3L", + "Panzani 200g x 4 bio", + "Rustichella 150g bio", + "De Cecco - Fusilli bio", + "Gerblé sans Gluten50g", + "Penne de riz 100g sans gluten", + "Spaghetti de maïs 50g sans Glute", +] + + +@pytest.mark.parametrize( + "input_text, expected_output", + [ + ( + TEXT, + ( + [ + [2, 0], + [4, 2, 3, 0], + [4, 2, 3], + [2, 0], + [1, 3, 0], + [1, 3], + [1, 3], + [5], + [5], + [5], + [7], + [6, 7], + [6, 7], + ], + ["1.5L", "Coca-Cola", "Cola", "Light", "Pepsi", "bio", "de", "sans"], + [ + ["1.5L", 4], + ["Coca-Cola", 3], + ["Cola", 4], + ["Light", 5], + ["Pepsi", 2], + ["bio", 3], + ["de", 2], + ["sans", 3], + ], + ), + ) + ], +) def test_prepare_data(input_text, expected_output): assert prepare_data(input_text) == expected_output -@pytest.mark.parametrize("model_name", ['nmf', 'seanmf']) +@pytest.mark.parametrize("model_name", ["nmf", "seanmf"]) @pytest.mark.parametrize("n_topics", [3, 0]) @pytest.mark.parametrize("n_keywords", [2, 0]) def test_show_dominant_topic(model_name, n_topics, n_keywords): encoded_text_id, vocab_list, _ = prepare_data(TEXT) - model = train_shorttext_model(model_name, encoded_text_id, vocab_list, n_topics=n_topics) - topics, pmi_score = show_dominant_topic(model, encoded_text_id, vocab_list, n_top_keyword=n_keywords) + model = train_shorttext_model( + model_name, encoded_text_id, vocab_list, n_topics=n_topics + ) + topics, pmi_score = show_dominant_topic( + model, encoded_text_id, vocab_list, n_top_keyword=n_keywords + ) assert len(pmi_score) == n_topics assert len(topics) == n_topics @@ -70,11 +103,13 @@ def test_show_dominant_topic(model_name, n_topics, n_keywords): assert len(i) == n_keywords -@pytest.mark.parametrize("model_name", ['nmf', 'seanmf']) +@pytest.mark.parametrize("model_name", ["nmf", "seanmf"]) @pytest.mark.parametrize("n_topics", [3]) def test_get_assigned_topics(model_name, n_topics): encoded_text_id, vocab_list, _ = prepare_data(TEXT) - model = train_shorttext_model(model_name, encoded_text_id, vocab_list, n_topics=n_topics) + model = train_shorttext_model( + model_name, encoded_text_id, vocab_list, n_topics=n_topics + ) topics_list = get_assigned_topics(model) assert len(topics_list) == len(TEXT) @@ -82,18 +117,20 @@ def test_get_assigned_topics(model_name, n_topics): assert topic_num < n_topics -@pytest.mark.parametrize("model_name", ['nmf', 'seanmf']) +@pytest.mark.parametrize("model_name", ["nmf", "seanmf"]) @pytest.mark.parametrize("n_topics", [0, 3]) def test_prepare_data_pyldavis(model_name, n_topics): encoded_text_id, vocab_list, vocab_arr = prepare_data(TEXT) - model = train_shorttext_model(model_name, encoded_text_id, vocab_list, n_topics=n_topics) + model = train_shorttext_model( + model_name, encoded_text_id, vocab_list, n_topics=n_topics + ) data = prepare_data_pyldavis(model, encoded_text_id, vocab_arr) - phi = data['topic_term_dists'] - theta = data['doc_topic_dists'] - doc_length_values = data['doc_lengths'] - list_vocab = data['vocab'] - freq_vocab = data['term_frequency'] + phi = data["topic_term_dists"] + theta = data["doc_topic_dists"] + doc_length_values = data["doc_lengths"] + list_vocab = data["vocab"] + freq_vocab = data["term_frequency"] assert phi.shape == (n_topics, len(list_vocab)) assert theta.shape == (len(TEXT), n_topics) @@ -104,21 +141,27 @@ def test_prepare_data_pyldavis(model_name, n_topics): @pytest.mark.parametrize( "input_coded, expected_output", [ - ([[1, 3, 3, 2, 2, 0], [1, 3], [3, 0, 0]], - [[5., 1., 2., 4.], - [1., 2., 2., 3.], - [2., 2., 4., 4.], - [4., 3., 4., 6.]]), - - ([[0, 1, 2, 3, 4], [5, 6], [1]], - [[1., 1., 1., 1., 1., 0., 0.], - [1., 2., 1., 1., 1., 0., 0.], - [1., 1., 1., 1., 1., 0., 0.], - [1., 1., 1., 1., 1., 0., 0.], - [1., 1., 1., 1., 1., 0., 0.], - [0., 0., 0., 0., 0., 1., 1.], - [0., 0., 0., 0., 0., 1., 1.]] - ) + ( + [[1, 3, 3, 2, 2, 0], [1, 3], [3, 0, 0]], + [ + [5.0, 1.0, 2.0, 4.0], + [1.0, 2.0, 2.0, 3.0], + [2.0, 2.0, 4.0, 4.0], + [4.0, 3.0, 4.0, 6.0], + ], + ), + ( + [[0, 1, 2, 3, 4], [5, 6], [1]], + [ + [1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0], + [1.0, 2.0, 1.0, 1.0, 1.0, 0.0, 0.0], + [1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0], + [1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0], + [1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0], + [0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0], + [0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0], + ], + ), ], ) def test_build_cooccurence_matrix(input_coded, expected_output): From 4f659d3b7d446bb9b0f1c0bec4ec690bee631855 Mon Sep 17 00:00:00 2001 From: hugovasselin <waaaouu@gmail.com> Date: Fri, 13 Nov 2020 14:47:48 +0100 Subject: [PATCH 388/496] fix: linter errors --- .../preprocessing/data_augmentation.py | 4 +- .../preprocessing/social_preprocess.py | 4 +- nautilus_nlp/preprocessing/text_preprocess.py | 10 +- nautilus_nlp/utils/file_loader.py | 104 ++++++++++-------- nautilus_nlp/utils/phone_number.py | 2 +- nautilus_nlp/utils/stopwords.py | 6 +- nautilus_nlp/utils/tokenizer.py | 2 +- 7 files changed, 74 insertions(+), 58 deletions(-) diff --git a/nautilus_nlp/preprocessing/data_augmentation.py b/nautilus_nlp/preprocessing/data_augmentation.py index d3a464a..d9cdccf 100644 --- a/nautilus_nlp/preprocessing/data_augmentation.py +++ b/nautilus_nlp/preprocessing/data_augmentation.py @@ -13,7 +13,9 @@ class UnavailableAugmenter(ValueError): pass -def augment_text(text: str, method: str, stopwords: Optional[List[str]]=None, entities: Optional[list]=None) -> Tuple[str, list]: +def augment_text( + text: str, method: str, stopwords: Optional[List[str]] = None, entities: Optional[list] = None + ) -> Tuple[str, list]: """ Given a text with or without associated entities, generate a new text by modifying some words in the initial one, modifications depend on the chosen diff --git a/nautilus_nlp/preprocessing/social_preprocess.py b/nautilus_nlp/preprocessing/social_preprocess.py index e903aa7..ff69c08 100644 --- a/nautilus_nlp/preprocessing/social_preprocess.py +++ b/nautilus_nlp/preprocessing/social_preprocess.py @@ -103,10 +103,10 @@ def convert_emoji_to_text(self, code_delimiters=(':', ':'), input_str=None) -> s Parameters ---------- text : str - + code_delimiters : tuple Tuple of symbols around the emoji code. eg: (':',':') --> :grinning_face: - + input_str : str if specified, will remove emoji from this text rather than the class diff --git a/nautilus_nlp/preprocessing/text_preprocess.py b/nautilus_nlp/preprocessing/text_preprocess.py index 252dd3e..949dd9b 100644 --- a/nautilus_nlp/preprocessing/text_preprocess.py +++ b/nautilus_nlp/preprocessing/text_preprocess.py @@ -205,10 +205,10 @@ def replace_emails(self, replace_with: str = "*EMAIL*") -> str: self.text = constants.EMAIL_REGEX.sub(replace_with, self.text) return self.text - def replace_phone_numbers(self, - country_format_to_detect: list, - replace_with: str = "*PHONE*", - method: str = "regex") -> str: + def replace_phone_numbers(self, + country_format_to_detect: list, + replace_with: str = "*PHONE*", + method: str = "regex") -> str: """ Replace all phone numbers in ``text`` str with ``replace_with`` str @@ -241,7 +241,7 @@ def replace_phone_numbers(self, raise ValueError('Please input a valid method between "regex" or "detection"') return self.text - def replace_numbers(self, replace_with: str="*NUMBER*") -> str: + def replace_numbers(self, replace_with: str = "*NUMBER*") -> str: """ Replace all numbers in ``text`` str with ``replace_with`` str. diff --git a/nautilus_nlp/utils/file_loader.py b/nautilus_nlp/utils/file_loader.py index 437bd7d..2e545d3 100644 --- a/nautilus_nlp/utils/file_loader.py +++ b/nautilus_nlp/utils/file_loader.py @@ -28,8 +28,8 @@ import chardet -def open_textfile(filepath: str, encoding='utf-8'): - with io.open(filepath, 'r', encoding=encoding) as f: +def open_textfile(filepath: str, encoding="utf-8"): + with io.open(filepath, "r", encoding=encoding) as f: string = f.read() return string @@ -51,15 +51,17 @@ def detect_encoding(file_path_or_string: str, n_lines: int = 100) -> str: the code of the detected encoding """ if os.path.isfile(file_path_or_string): - with open(file_path_or_string, 'rb') as f: - rawdata = b''.join([f.readline() for _ in range(n_lines)]) + with open(file_path_or_string, "rb") as f: + rawdata = b"".join([f.readline() for _ in range(n_lines)]) elif isinstance(file_path_or_string, bytes): rawdata = file_path_or_string return chardet.detect(rawdata) -def text_loader(filepath: str, encoding: Optional[str] = None, detectencoding: bool = True) -> str: - ''' +def text_loader( + filepath: str, encoding: Optional[str] = None, detectencoding: bool = True +) -> str: + """ This util loads a file. If the encoding is specified, will use the specified encoding to load the text file. If not specified, this function tries to open the doc as UTF-U, and if @@ -81,20 +83,24 @@ def text_loader(filepath: str, encoding: Optional[str] = None, detectencoding: b ------ UnicodeDecodeError if document can't be loaded with utf-8 encoding. - ''' + """ if encoding is not None: return open_textfile(filepath, encoding=encoding) try: - return open_textfile(filepath, encoding='utf-8') + return open_textfile(filepath, encoding="utf-8") except UnicodeDecodeError: - warnings.warn(f'Encoding for {filepath} is not UTF-8.') + warnings.warn(f"Encoding for {filepath} is not UTF-8.") if detectencoding is True: detected_encoding = detect_encoding(filepath) - warnings.warn(f'{filepath}: detected encoding is {detected_encoding["encoding"]},\ - with a confidence rate of {detected_encoding["confidence"]}') - return open_textfile(filepath, encoding=detected_encoding['encoding']) - raise UnicodeDecodeError('Cannot load document using utf-8. '\ - 'Try to detect encoding using detectencoding=True') + warnings.warn( + f'{filepath}: detected encoding is {detected_encoding["encoding"]},\ + with a confidence rate of {detected_encoding["confidence"]}' + ) + return open_textfile(filepath, encoding=detected_encoding["encoding"]) + raise UnicodeDecodeError( + "Cannot load document using utf-8. " + "Try to detect encoding using detectencoding=True" + ) def get_subfolders_path(folder: str) -> list: @@ -104,15 +110,16 @@ def get_subfolders_path(folder: str) -> list: if not folder.endswith("/"): folder = folder + "/" return [ - folder + f+'/' for f in os.listdir(folder) + folder + f + "/" + for f in os.listdir(folder) if os.path.isdir(os.path.join(folder, f)) and f != ".DS_Store" - ] + ] def list_files_in_subdir(filepath: str) -> list: - ''' + """ Get a list of all the filepath of files in directory and subdirectory. - ''' + """ res = [] for path, _, files in os.walk(filepath): for name in files: @@ -122,7 +129,7 @@ def list_files_in_subdir(filepath: str) -> list: def list_files(filepath: str) -> List[str]: """ - List files within a given filepath. + List files within a given filepath. Parameters ---------- @@ -136,9 +143,9 @@ def list_files(filepath: str) -> List[str]: """ if os.path.isdir(filepath) and len(re.findall(r"[\w.]$", filepath)) > 0: - filepath = filepath+'/*' - if filepath.endswith('/'): - filepath = filepath+'*' + filepath = filepath + "/*" + if filepath.endswith("/"): + filepath = filepath + "*" return [file for file in glob.glob(filepath) if os.path.isfile(file)] @@ -146,9 +153,9 @@ def documents_loader( filepath: str, encoding: Optional[str] = None, detectencoding: bool = True, - output_as: str = 'dict' - ) -> Union[str, list, dict]: - ''' + output_as: str = "dict", +) -> Union[str, list, dict]: + """ Input a filepath, a filepath with wildcard (eg. *.txt), or a list of filepaths. Output a string, or a dict of strings. @@ -167,7 +174,7 @@ def documents_loader( ------- Uniont[string, list, dict] The document loaded. - ''' + """ if isinstance(filepath, str): documents = list_files(filepath) nb_of_documents = len(documents) @@ -175,48 +182,55 @@ def documents_loader( nb_of_documents = len(filepath) documents = filepath else: - raise TypeError('Please enter a valid filepath or a valid list of filepath') + raise TypeError("Please enter a valid filepath or a valid list of filepath") if nb_of_documents == 1: - return text_loader(documents[0], encoding=encoding, detectencoding=detectencoding) + return text_loader( + documents[0], encoding=encoding, detectencoding=detectencoding + ) if nb_of_documents > 1: - if output_as == 'list': + if output_as == "list": return [ - text_loader(document, encoding=encoding, detectencoding=detectencoding) + text_loader(document, encoding=encoding, detectencoding=detectencoding) for document in documents - ] - if output_as == 'dict': + ] + if output_as == "dict": return { - document : text_loader( - document, encoding=encoding, detectencoding=detectencoding) for document in documents - } - raise TypeError('Enter a valid output format between list or dict') - raise IOError('No files detected in {}'.format(filepath)) + document: text_loader( + document, encoding=encoding, detectencoding=detectencoding + ) + for document in documents + } + raise TypeError("Enter a valid output format between list or dict") + raise IOError("No files detected in {}".format(filepath)) + ## CSV Loader + def encode_columns(df, columns_to_encode: str): - ''' + """ apply json.dumps on columns - ''' + """ for col in columns_to_encode: df[col] = df[col].apply(json.dumps) def decode_columns(df, columns_to_encode: str): - ''' + """ apply json.loads on columns - ''' + """ for col in columns_to_encode: df[col] = df[col].apply(json.loads) + ## Encoding functions + def convert_encoding(filepath: str, input_encoding: str, output_encoding: str): - ''' + """ Encode a file according to a specified encoding. - ''' + """ with codecs.open(filepath, encoding=input_encoding) as input_file: - with codecs.open( - 'encoded_'+filepath, "w", encoding=output_encoding) as output_file: + with codecs.open("encoded_" + filepath, "w", encoding=output_encoding) as output_file: shutil.copyfileobj(input_file, output_file) diff --git a/nautilus_nlp/utils/phone_number.py b/nautilus_nlp/utils/phone_number.py index 7f72bb5..6ad58fc 100644 --- a/nautilus_nlp/utils/phone_number.py +++ b/nautilus_nlp/utils/phone_number.py @@ -144,7 +144,7 @@ def parse_number(self, text: str, region_code: Optional[str] = None) -> str: def format_number(self, num_format: str) -> str: ''' - Convert a phone number to another standard format. + Convert a phone number to another standard format. Parameters ---------- diff --git a/nautilus_nlp/utils/stopwords.py b/nautilus_nlp/utils/stopwords.py index f34d4b8..0f3eb57 100644 --- a/nautilus_nlp/utils/stopwords.py +++ b/nautilus_nlp/utils/stopwords.py @@ -22,11 +22,11 @@ import json import os - -from nautilus_nlp.config.config import ROOT_FOLDER -from nautilus_nlp.utils.file_loader import documents_loader from stop_words import LANGUAGE_MAPPING as _LANGUAGE_MAPPING from stop_words import get_stop_words as _get_stop_words +from nautilus_nlp.config.config import ROOT_FOLDER +from nautilus_nlp.utils.file_loader import documents_loader + STOPWORDS_JSON_FILEPATH = os.path.join(ROOT_FOLDER, "data", "stopwords.json") diff --git a/nautilus_nlp/utils/tokenizer.py b/nautilus_nlp/utils/tokenizer.py index 2f4c22f..5067849 100644 --- a/nautilus_nlp/utils/tokenizer.py +++ b/nautilus_nlp/utils/tokenizer.py @@ -48,7 +48,7 @@ def get_lang_model(self): return self.model.lang -def _get_spacy_tokenizer(lang: str) -> spacy.tokenizer.Tokenizer: +def _get_spacy_tokenizer(lang: str): """ Function that gets the right tokenizer given the language From 1e7753392e5208011e255275dc295120adacf9d1 Mon Sep 17 00:00:00 2001 From: hugovasselin <waaaouu@gmail.com> Date: Fri, 13 Nov 2020 15:19:46 +0100 Subject: [PATCH 389/496] fix: linting issues --- tests/test_keyword_extractor.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/tests/test_keyword_extractor.py b/tests/test_keyword_extractor.py index 66261d5..69a2a43 100644 --- a/tests/test_keyword_extractor.py +++ b/tests/test_keyword_extractor.py @@ -5,8 +5,8 @@ @pytest.mark.parametrize( "input_tokens, expected, ngrams_number, number_top_words", [ - (['I', 'eat', 'orange', 'oranges', 'at', 'orange'], [('orange', 2)], 1, 1), - (['Un', 'chat', 'rose', 'reste', 'un', 'chat', 'rose'], [('chat rose', 2)], 2, 1), + (['I', 'eat', 'orange', 'oranges', 'at', 'orange'], [('orange', 2)], 1, 1), + (['Un', 'chat', 'rose', 'reste', 'un', 'chat', 'rose'], [('chat rose', 2)], 2, 1), ] ) def test_get_frequent_words(input_tokens, expected, ngrams_number, number_top_words): @@ -31,4 +31,4 @@ def test_get_frequent_words_output_lenght(): ] ) def test_extract_keywords(input_text, keyword, case_sensitive, expected): - assert extract_keywords(input_text, keyword=keyword, case_sensitive=case_sensitive) == expected \ No newline at end of file + assert extract_keywords(input_text, keyword=keyword, case_sensitive=case_sensitive) == expected From bb44253d1ee1e12ea59d1674529a866363f958d2 Mon Sep 17 00:00:00 2001 From: Citronelol <> Date: Sat, 14 Nov 2020 18:53:41 +0100 Subject: [PATCH 390/496] [Cleaning] Removing old notebooks --- notebooks/.gitkeep | 0 notebooks/0. Text file loader.ipynb | 485 --------- notebooks/1. Text Preprocessing.ipynb | 502 --------- notebooks/2. Text processing.ipynb | 638 ------------ .../3. Text Vectorization - TF-IDF.ipynb | 713 ------------- notebooks/4. Topic Modeling.ipynb | 954 ------------------ notebooks/5. Topic Modeling - Biterm.ipynb | 266 ----- .../6. Topic Modeling - short text.ipynb | 312 ------ .../Benchmark text processing tools.ipynb | 876 ---------------- notebooks/Language_identification.ipynb | 201 ---- ...nt analysis using pre-trained models.ipynb | 161 --- notebooks/Sentiment_analysis_FT.ipynb | 259 ----- notebooks/Spacy_model.ipynb | 126 --- notebooks/Visualization tools.ipynb | 100 -- notebooks/someadditionalfile.txt | 1 - notebooks/somefile.txt | 1 - 16 files changed, 5595 deletions(-) delete mode 100644 notebooks/.gitkeep delete mode 100644 notebooks/0. Text file loader.ipynb delete mode 100644 notebooks/1. Text Preprocessing.ipynb delete mode 100644 notebooks/2. Text processing.ipynb delete mode 100644 notebooks/3. Text Vectorization - TF-IDF.ipynb delete mode 100644 notebooks/4. Topic Modeling.ipynb delete mode 100644 notebooks/5. Topic Modeling - Biterm.ipynb delete mode 100644 notebooks/6. Topic Modeling - short text.ipynb delete mode 100644 notebooks/Benchmark text processing tools.ipynb delete mode 100644 notebooks/Language_identification.ipynb delete mode 100644 notebooks/Sentiment analysis using pre-trained models.ipynb delete mode 100644 notebooks/Sentiment_analysis_FT.ipynb delete mode 100644 notebooks/Spacy_model.ipynb delete mode 100644 notebooks/Visualization tools.ipynb delete mode 100644 notebooks/someadditionalfile.txt delete mode 100644 notebooks/somefile.txt diff --git a/notebooks/.gitkeep b/notebooks/.gitkeep deleted file mode 100644 index e69de29..0000000 diff --git a/notebooks/0. Text file loader.ipynb b/notebooks/0. Text file loader.ipynb deleted file mode 100644 index d83208d..0000000 --- a/notebooks/0. Text file loader.ipynb +++ /dev/null @@ -1,485 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Open Text File with encoding handling\n", - "\n", - "Nautilus includes a document loader that handles encoding detection and multiple file loading" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Create example files " - ] - }, - { - "cell_type": "code", - "execution_count": 1, - "metadata": {}, - "outputs": [], - "source": [ - "# Example of a latin1 file\n", - "s = \"J'aime les frites bien grasse étalon châpeau!\"\n", - "encoded_s = s.encode('latin-1')\n", - "with open('somefile.txt', 'wb') as f:\n", - " f.write(encoded_s)" - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "metadata": {}, - "outputs": [], - "source": [ - "# Let's add another document \n", - "s = \"Un deuxième exemple de texte en utf-8 cette fois!\"\n", - "encoded_s = s.encode('utf-8')\n", - "with open('someadditionalfile.txt', 'wb') as f:\n", - " f.write(encoded_s)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Document loader" - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "metadata": {}, - "outputs": [], - "source": [ - "from nautilus_nlp.utils.file_loader import documents_loader" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Open a file when you know the encoding" - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "metadata": { - "scrolled": true - }, - "outputs": [ - { - "data": { - "text/plain": [ - "'Un deuxième exemple de texte en utf-8 cette fois!'" - ] - }, - "execution_count": 4, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "# default encoding is UTF-8\n", - "documents_loader('someadditionalfile.txt')" - ] - }, - { - "cell_type": "code", - "execution_count": 5, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "\"J'aime les frites bien grasse étalon châpeau!\"" - ] - }, - "execution_count": 5, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "# If you know the encoding, you can specify it\n", - "documents_loader('somefile.txt', encoding='latin-1')" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Open a file with encoding detection" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "If you don't specify encoding, `document_loader()` will try to open it as UTF-8, and if it doesn't work it will try to detect encoding." - ] - }, - { - "cell_type": "code", - "execution_count": 6, - "metadata": { - "scrolled": false - }, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "WARNING:root:Encoding for somefile.txt is not UTF-8.\n", - "WARNING:root:Trying to detect encoding for somefile.txt\n", - "INFO:root:somefile.txt: detected encoding is ISO-8859-1, with a confidence rate of 0.73\n" - ] - }, - { - "data": { - "text/plain": [ - "\"J'aime les frites bien grasse étalon châpeau!\"" - ] - }, - "execution_count": 6, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "documents_loader('somefile.txt')" - ] - }, - { - "cell_type": "code", - "execution_count": 19, - "metadata": { - "scrolled": true - }, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "WARNING:root:Encoding for somefile.txt is not UTF-8.\n" - ] - }, - { - "ename": "TypeError", - "evalue": "function takes exactly 5 arguments (1 given)", - "output_type": "error", - "traceback": [ - "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", - "\u001b[0;31mUnicodeDecodeError\u001b[0m Traceback (most recent call last)", - "\u001b[0;32m/home/shared/nautilus_nlp/nautilus_nlp/utils/file_loader.py\u001b[0m in \u001b[0;36mtext_loader\u001b[0;34m(filepath, encoding, detectencoding)\u001b[0m\n\u001b[1;32m 38\u001b[0m \u001b[0;32mtry\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m---> 39\u001b[0;31m \u001b[0;32mreturn\u001b[0m \u001b[0mopen_textfile\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mfilepath\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mencoding\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;34m'utf-8'\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 40\u001b[0m \u001b[0;32mexcept\u001b[0m \u001b[0mUnicodeDecodeError\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", - "\u001b[0;32m/home/shared/nautilus_nlp/nautilus_nlp/utils/file_loader.py\u001b[0m in \u001b[0;36mopen_textfile\u001b[0;34m(filepath, encoding)\u001b[0m\n\u001b[1;32m 13\u001b[0m \u001b[0;32mwith\u001b[0m \u001b[0mio\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mopen\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mfilepath\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m'r'\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mencoding\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mencoding\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;32mas\u001b[0m \u001b[0mf\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m---> 14\u001b[0;31m \u001b[0mstring\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mf\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mread\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 15\u001b[0m \u001b[0;32mreturn\u001b[0m \u001b[0mstring\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", - "\u001b[0;32m/home/hugo/anaconda3/lib/python3.7/codecs.py\u001b[0m in \u001b[0;36mdecode\u001b[0;34m(self, input, final)\u001b[0m\n\u001b[1;32m 321\u001b[0m \u001b[0mdata\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mbuffer\u001b[0m \u001b[0;34m+\u001b[0m \u001b[0minput\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 322\u001b[0;31m \u001b[0;34m(\u001b[0m\u001b[0mresult\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mconsumed\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_buffer_decode\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mdata\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0merrors\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mfinal\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 323\u001b[0m \u001b[0;31m# keep undecoded input until the next call\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", - "\u001b[0;31mUnicodeDecodeError\u001b[0m: 'utf-8' codec can't decode byte 0xe9 in position 30: invalid continuation byte", - "\nDuring handling of the above exception, another exception occurred:\n", - "\u001b[0;31mTypeError\u001b[0m Traceback (most recent call last)", - "\u001b[0;32m<ipython-input-19-482c18687c00>\u001b[0m in \u001b[0;36m<module>\u001b[0;34m\u001b[0m\n\u001b[1;32m 1\u001b[0m \u001b[0;31m# You can prevent document loader from detecting the encoding if UTF-8 fails\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 2\u001b[0m \u001b[0;31m# In this case, it will raise an UnicodeDecodeError\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 3\u001b[0;31m \u001b[0mdocuments_loader\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m'somefile.txt'\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mdetectencoding\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;32mFalse\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", - "\u001b[0;32m/home/shared/nautilus_nlp/nautilus_nlp/utils/file_loader.py\u001b[0m in \u001b[0;36mdocuments_loader\u001b[0;34m(filepath, encoding, detectencoding, output_as)\u001b[0m\n\u001b[1;32m 90\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 91\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mnb_of_documents\u001b[0m \u001b[0;34m==\u001b[0m \u001b[0;36m1\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m---> 92\u001b[0;31m \u001b[0;32mreturn\u001b[0m \u001b[0mtext_loader\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mdocuments\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;36m0\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0mencoding\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mencoding\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mdetectencoding\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mdetectencoding\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 93\u001b[0m \u001b[0;32melif\u001b[0m \u001b[0mnb_of_documents\u001b[0m \u001b[0;34m>\u001b[0m \u001b[0;36m1\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 94\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0moutput_as\u001b[0m \u001b[0;34m==\u001b[0m \u001b[0;34m'list'\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", - "\u001b[0;32m/home/shared/nautilus_nlp/nautilus_nlp/utils/file_loader.py\u001b[0m in \u001b[0;36mtext_loader\u001b[0;34m(filepath, encoding, detectencoding)\u001b[0m\n\u001b[1;32m 47\u001b[0m \u001b[0;32mreturn\u001b[0m \u001b[0mopen_textfile\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mfilepath\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mencoding\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mdetected_encoding\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;34m'encoding'\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 48\u001b[0m \u001b[0;32melse\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m---> 49\u001b[0;31m \u001b[0;32mraise\u001b[0m \u001b[0mUnicodeDecodeError\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m'Cannot load document using utf-8. Try to detect encoding using detectencoding=True'\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 50\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 51\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n", - "\u001b[0;31mTypeError\u001b[0m: function takes exactly 5 arguments (1 given)" - ] - } - ], - "source": [ - "# You can prevent document loader from detecting the encoding if UTF-8 fails \n", - "# In this case, it will raise an UnicodeDecodeError\n", - "documents_loader('somefile.txt', detectencoding=False)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Open several files" - ] - }, - { - "cell_type": "code", - "execution_count": 9, - "metadata": {}, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "WARNING:root:Encoding for somefile.txt is not UTF-8.\n", - "WARNING:root:Trying to detect encoding for somefile.txt\n", - "INFO:root:somefile.txt: detected encoding is ISO-8859-1, with a confidence rate of 0.73\n" - ] - }, - { - "data": { - "text/plain": [ - "{'somefile.txt': \"J'aime les frites bien grasse étalon châpeau!\",\n", - " 'someadditionalfile.txt': 'Un deuxième exemple de texte en utf-8 cette fois!'}" - ] - }, - "execution_count": 9, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "# you can use wildcards to open several documents\n", - "documents_loader('*.txt')" - ] - }, - { - "cell_type": "code", - "execution_count": 10, - "metadata": {}, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "WARNING:root:Encoding for somefile.txt is not UTF-8.\n", - "WARNING:root:Trying to detect encoding for somefile.txt\n", - "INFO:root:somefile.txt: detected encoding is ISO-8859-1, with a confidence rate of 0.73\n" - ] - }, - { - "data": { - "text/plain": [ - "{'somefile.txt': \"J'aime les frites bien grasse étalon châpeau!\",\n", - " 'someadditionalfile.txt': 'Un deuxième exemple de texte en utf-8 cette fois!'}" - ] - }, - "execution_count": 10, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "# you can also pass a list of filepaths\n", - "documents_loader(['somefile.txt','someadditionalfile.txt'])" - ] - }, - { - "cell_type": "code", - "execution_count": 11, - "metadata": {}, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "WARNING:root:Encoding for somefile.txt is not UTF-8.\n", - "WARNING:root:Trying to detect encoding for somefile.txt\n", - "INFO:root:somefile.txt: detected encoding is ISO-8859-1, with a confidence rate of 0.73\n" - ] - }, - { - "data": { - "text/plain": [ - "[\"J'aime les frites bien grasse étalon châpeau!\",\n", - " 'Un deuxième exemple de texte en utf-8 cette fois!']" - ] - }, - "execution_count": 11, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "# you can specify the output format when you load multiple texts\n", - "documents_loader('*.txt', output_as='list')" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## List files in a folder" - ] - }, - { - "cell_type": "code", - "execution_count": 12, - "metadata": {}, - "outputs": [], - "source": [ - "from nautilus_nlp.utils.file_loader import list_files" - ] - }, - { - "cell_type": "code", - "execution_count": 13, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "['./Visualization tools.ipynb',\n", - " './Sentiment analysis using pre-trained models.ipynb',\n", - " './somefile.txt',\n", - " './Language_identification.ipynb',\n", - " './1. Text Preprocessing.ipynb',\n", - " './3. Text Vectorization - TF-IDF.ipynb',\n", - " './TopicModeling.ipynb',\n", - " './Sentiment_analysis_FT.ipynb',\n", - " './Benchmark text processing tools.ipynb',\n", - " './0. Text file loader.ipynb',\n", - " './someadditionalfile.txt',\n", - " './2. Text processing.ipynb',\n", - " './Spacy_model.ipynb']" - ] - }, - "execution_count": 13, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "list_files('.') # list files from current folders" - ] - }, - { - "cell_type": "code", - "execution_count": 14, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "[]" - ] - }, - "execution_count": 14, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "list_files('../tests/testfolder_fileloader/.')" - ] - }, - { - "cell_type": "code", - "execution_count": 15, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "['./Visualization tools.ipynb',\n", - " './Sentiment analysis using pre-trained models.ipynb',\n", - " './Language_identification.ipynb',\n", - " './1. Text Preprocessing.ipynb',\n", - " './3. Text Vectorization - TF-IDF.ipynb',\n", - " './TopicModeling.ipynb',\n", - " './Sentiment_analysis_FT.ipynb',\n", - " './Benchmark text processing tools.ipynb',\n", - " './0. Text file loader.ipynb',\n", - " './2. Text processing.ipynb',\n", - " './Spacy_model.ipynb']" - ] - }, - "execution_count": 15, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "list_files('./*.ipynb') # List files matching specific pattern" - ] - }, - { - "cell_type": "code", - "execution_count": 16, - "metadata": { - "scrolled": true - }, - "outputs": [ - { - "data": { - "text/plain": [ - "[]" - ] - }, - "execution_count": 16, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "# only files will be printed, not folders\n", - "list_files('/Users/hugo/Documents/NAUTILUS/nautilus-nlp/')" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Detect encoding \n", - "\n", - "If you just interested in detecting encoding, you can use this function, based on the Chardet library. " - ] - }, - { - "cell_type": "code", - "execution_count": 17, - "metadata": {}, - "outputs": [], - "source": [ - "from nautilus_nlp.utils.file_loader import detect_encoding" - ] - }, - { - "cell_type": "code", - "execution_count": 18, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "{'encoding': 'ISO-8859-1', 'confidence': 0.73, 'language': ''}" - ] - }, - "execution_count": 18, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "detect_encoding('somefile.txt')" - ] - }, - { - "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.7.3" - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} diff --git a/notebooks/1. Text Preprocessing.ipynb b/notebooks/1. Text Preprocessing.ipynb deleted file mode 100644 index b081db0..0000000 --- a/notebooks/1. Text Preprocessing.ipynb +++ /dev/null @@ -1,502 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Text Preprocessing \n", - "\n", - "This notebook will guide you through the common text preprocessing operations. \n", - "All the preprocessing functions are located in ** nautilus_nlp.preprocessing.preprocess ** " - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Load an example" - ] - }, - { - "cell_type": "code", - "execution_count": 1, - "metadata": {}, - "outputs": [], - "source": [ - "english_text = \"\"\"\n", - "The nautilus 🐚🐚 (from the Latin form of the original Ancient Greek: ναυτίλος, 'sailor') is a pelagic marine mollusc of the cephalopod family Nautilidae, the sole extant family of the superfamily Nautilaceae and of its smaller but near equal suborder, Nautilina.\n", - "\n", - "It comprises six living species in two genera, the type of which is the genus Nautilus. Though it more specifically refers to species Nautilus pompilius, the name chambered nautilus is also used for any of the Nautilidae. All are protected under CITES Appendix II.\n", - "\n", - "Nautilidae, both extant and extinct, are characterized by involute or more or less convolute shells that are generally smooth, with compressed or depressed whorl sections, straight to sinuous sutures, and a tubular, generally central siphuncle.[3] Having survived relatively unchanged for millions of years, nautiluses represent the only living members of the subclass nautiloidea, and are often considered \"living fossils\".\n", - "\n", - "The word nautilus is derived from the Greek ναυτίλος nautílos and originally referred to the paper nautiluses of the genus Argonauta, which are actually octopuses. The word nautílos literally means \"sailor\", as paper nautiluses were thought to use two of their arms as sails.[4]\n", - "\n", - "Here's how you can contact us:\n", - "\n", - "Source : https://en.wikipedia.org/wiki/Nautilus\n", - "Contact:\n", - "Email : Jules.vernes@nautilus.net\n", - "Phone : +33 6 24 24 24 24 \n", - "Cost : €45\n", - "\"\"\"" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Preprocess_text: Wrap-up function " - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "metadata": {}, - "outputs": [], - "source": [ - "from nautilus_nlp.preprocessing.preprocess import preprocess_text" - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "nautilus latin form original ancient greek ναυτιλος sailor pelagic marine mollusc cephalopod family nautilidae sole extant family superfamily nautilaceae smaller equal suborder nautilina comprises living species genera type genus nautilus specifically refers species nautilus pompilius chambered nautilus nautilidae protected cites appendix ii nautilidae extant extinct characterized involute convolute shells generally smooth compressed depressed whorl sections straight sinuous sutures tubular generally central siphuncle survived unchanged millions years nautiluses represent living members subclass nautiloidea considered living fossils word nautilus derived greek ναυτιλος nautilos originally referred paper nautiluses genus argonauta octopuses word nautilos literally means sailor paper nautiluses thought arms sails contact source https en wikipedia org wiki nautilus contact email phone cost\n" - ] - } - ], - "source": [ - "clean_txt = preprocess_text(english_text,\n", - " fix_unicode=False,\n", - " lowercase=True,\n", - " no_urls=False,\n", - " no_emails=True,\n", - " no_phone_numbers=True,\n", - " phone_method='detection', # if detection is specified, will use a phone lib \n", - " phone_countries_format=[None, 'US', 'FR'], # these phone format will be tested. None stands for international.\n", - " no_numbers=True,\n", - " no_currency_symbols=True,\n", - " no_punct=True,\n", - " no_contractions=True, #will unpack english contractions\n", - " no_accents=True,\n", - " no_emoji=True,\n", - " replace_with=' ',\n", - " no_stopwords='en' #will remove english stopwords\n", - " )\n", - "print(clean_txt)" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "collapsed": true - }, - "source": [ - "# Overview of the pre-processing functions\n", - "\n", - "If you prefer, you can use all the preprocessing functions one-by-one and create your own pre-processing pipeline. It is recommended, as there are many parameters that are not necessary included in the wrap-up function. \n", - "\n", - "For the sake of simplicity, we won't go through all the pre-processing function. Please report to the documentation if you want more details!" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Remove end-of-line characters" - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "metadata": {}, - "outputs": [], - "source": [ - "from nautilus_nlp.preprocessing.preprocess import remove_EOL_characters" - ] - }, - { - "cell_type": "code", - "execution_count": 5, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Before:\n", - "-------\n", - "hello words!\n", - "this is the second line.\n", - "\n", - "After:\n", - "-------\n", - "hello words! this is the second line.\n" - ] - } - ], - "source": [ - "text_with_eol = \"hello words!\\nthis is the second line.\"\n", - "\n", - "text_without_eol = remove_EOL_characters(text_with_eol)\n", - "\n", - "print('Before:\\n-------\\n{}\\n\\nAfter:\\n-------\\n{}'.format(text_with_eol,text_without_eol))" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Stop words" - ] - }, - { - "cell_type": "code", - "execution_count": 6, - "metadata": {}, - "outputs": [], - "source": [ - "from nautilus_nlp.preprocessing.preprocess import get_stopwords" - ] - }, - { - "cell_type": "code", - "execution_count": 7, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "['soi-même', 'prealable', 'ayez', 'fi', 'concernant', 'dedans', 'celles', 'tiennes', 'plutôt', 'bravo']\n" - ] - } - ], - "source": [ - "french_sw = get_stopwords('fr')\n", - "\n", - "print(french_sw[:10])" - ] - }, - { - "cell_type": "code", - "execution_count": 8, - "metadata": {}, - "outputs": [], - "source": [ - "from nautilus_nlp.preprocessing.preprocess import remove_stopwords" - ] - }, - { - "cell_type": "code", - "execution_count": 9, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Before:\n", - "-------\n", - "['je', 'suis', 'malade', 'et', 'toi', '?']\n", - "\n", - "After:\n", - "-------\n", - "['malade', '?']\n" - ] - } - ], - "source": [ - "tokens_with_sw = ['je','suis','malade','et','toi','?']\n", - "\n", - "tokens_without_sw = remove_stopwords(tokens_with_sw, stopwords=french_sw)\n", - "\n", - "print('Before:\\n-------\\n{}\\n\\nAfter:\\n-------\\n{}'.format(tokens_with_sw,tokens_without_sw))" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Fix bad unicode" - ] - }, - { - "cell_type": "code", - "execution_count": 10, - "metadata": {}, - "outputs": [], - "source": [ - "from nautilus_nlp.preprocessing.preprocess import fix_bad_unicode" - ] - }, - { - "cell_type": "code", - "execution_count": 11, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Before:\n", - "-------\n", - "Les augmentations de rémunérations\n", - "\n", - "After:\n", - "-------\n", - "Les augmentations de rémunérations\n" - ] - } - ], - "source": [ - "before = \"Les augmentations de rémunérations\"\n", - "\n", - "after = fix_bad_unicode(before)\n", - "\n", - "print('Before:\\n-------\\n{}\\n\\nAfter:\\n-------\\n{}'.format(before,after))" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Phone Numbers" - ] - }, - { - "cell_type": "code", - "execution_count": 12, - "metadata": {}, - "outputs": [], - "source": [ - "from nautilus_nlp.preprocessing.preprocess import replace_phone_numbers" - ] - }, - { - "cell_type": "code", - "execution_count": 13, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Before:\n", - "-------\n", - "(541) 754-3010 is a US. Phone\n", - "\n", - "After:\n", - "-------\n", - " is a US. Phone\n" - ] - } - ], - "source": [ - "before = '(541) 754-3010 is a US. Phone'\n", - "\n", - "after = replace_phone_numbers(before, replace_with=' ')\n", - "\n", - "print('Before:\\n-------\\n{}\\n\\nAfter:\\n-------\\n{}'.format(before,after))" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "There is also an util to detect phone numbers. Here we will provide a country list. It takes time because it will loop over the text with all the supported country codes." - ] - }, - { - "cell_type": "code", - "execution_count": 14, - "metadata": {}, - "outputs": [], - "source": [ - "import nautilus_nlp.utils.phone_number as phone" - ] - }, - { - "cell_type": "code", - "execution_count": 15, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "CPU times: user 296 ms, sys: 0 ns, total: 296 ms\n", - "Wall time: 294 ms\n" - ] - }, - { - "data": { - "text/plain": [ - "['(541) 754-3010', '754-3010']" - ] - }, - "execution_count": 15, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "%%time\n", - "phone.extract_phone_numbers(before, countrylist=phone.SUPPORTED_COUNTRY)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "There is also a **phone parser** class, that helps you to extract information from phone numbers. " - ] - }, - { - "cell_type": "code", - "execution_count": 16, - "metadata": {}, - "outputs": [], - "source": [ - "p = phone.phoneParser()" - ] - }, - { - "cell_type": "code", - "execution_count": 17, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "PhoneNumber(country_code=1, national_number=5417543010, extension=None, italian_leading_zero=None, number_of_leading_zeros=None, country_code_source=0, preferred_domestic_carrier_code=None)" - ] - }, - "execution_count": 17, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "p.parse_number('(541) 754-3010',region_code='US')" - ] - }, - { - "cell_type": "code", - "execution_count": 18, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "'541-754-3010'" - ] - }, - "execution_count": 18, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "p.format_number('INTERNATIONAL')" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Emojis" - ] - }, - { - "cell_type": "code", - "execution_count": 19, - "metadata": {}, - "outputs": [], - "source": [ - "from nautilus_nlp.preprocessing.preprocess import remove_emoji, convert_emoji_to_text" - ] - }, - { - "cell_type": "code", - "execution_count": 20, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Before:\n", - "-------\n", - "My favorite emojies are: 🎅🏿⌚\n", - "\n", - "After:\n", - "-------\n", - "My favorite emojies are: \n" - ] - } - ], - "source": [ - "before = 'My favorite emojies are: 🎅🏿⌚'\n", - "\n", - "after = remove_emoji(before)\n", - "\n", - "print('Before:\\n-------\\n{}\\n\\nAfter:\\n-------\\n{}'.format(before,after))" - ] - }, - { - "cell_type": "code", - "execution_count": 21, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Before:\n", - "-------\n", - "My favorite emojies are: 🎅🏿⌚\n", - "\n", - "After:\n", - "-------\n", - "My favorite emojies are: Santa_Claus_dark_skin_tonewatch\n" - ] - } - ], - "source": [ - "before = 'My favorite emojies are: 🎅🏿⌚'\n", - "\n", - "after = convert_emoji_to_text(before, code_delimiters=('', ''))\n", - "\n", - "print('Before:\\n-------\\n{}\\n\\nAfter:\\n-------\\n{}'.format(before,after))" - ] - } - ], - "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.7.3" - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} diff --git a/notebooks/2. Text processing.ipynb b/notebooks/2. Text processing.ipynb deleted file mode 100644 index d1c68ee..0000000 --- a/notebooks/2. Text processing.ipynb +++ /dev/null @@ -1,638 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Text processing" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Tokenization\n", - "\n", - "Several tokenizers are available. As you will see bellow, spaCy is much faster than the other implementations (Moses, NLTK) and often return better results. " - ] - }, - { - "cell_type": "code", - "execution_count": 1, - "metadata": {}, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "[nltk_data] Downloading package punkt to /root/nltk_data...\n", - "[nltk_data] Package punkt is already up-to-date!\n" - ] - } - ], - "source": [ - "from nautilus_nlp.preprocessing.tokenizer import tokenize, untokenize" - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "metadata": {}, - "outputs": [], - "source": [ - "fr_txt = \"Ceci est un texte français, j'adore 1 !\"\n", - "eng_txt = \"Let's play together!\"" - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "metadata": {}, - "outputs": [], - "source": [ - "str_ = \"\"\"Les moteurs de recherche tels Google, Exalead ou Yahoo! sont des applications très connues de fouille de textes sur de grandes masses de données. Cependant, les moteurs de recherche ne se basent pas uniquement sur le texte pour l'indexer, mais également sur la façon dont les pages sont mises en valeur les unes par rapport aux autres. L'algorithme utilisé par Google est PageRank, et il est courant de voir HITS dans le milieu académique\"\"\"" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### French spaCy" - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "metadata": { - "scrolled": true - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "CPU times: user 5.07 ms, sys: 130 µs, total: 5.2 ms\n", - "Wall time: 5.03 ms\n" - ] - } - ], - "source": [ - "%%time\n", - "\n", - "tokenized_fr_txt = tokenize(str_, lang_module=\"fr_spacy\")" - ] - }, - { - "cell_type": "code", - "execution_count": 5, - "metadata": {}, - "outputs": [], - "source": [ - "tokenized_fr_txt = tokenize(str_, lang_module=\"fr_spacy\")" - ] - }, - { - "cell_type": "code", - "execution_count": 6, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "['Les', 'moteurs', 'de', 'recherche', 'tels', 'Google', ',', 'Exalead', 'ou', 'Yahoo']\n" - ] - } - ], - "source": [ - "print(tokenized_fr_txt[:10])" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### French Moses" - ] - }, - { - "cell_type": "code", - "execution_count": 7, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "CPU times: user 13.2 s, sys: 6.59 ms, total: 13.2 s\n", - "Wall time: 13.2 s\n" - ] - } - ], - "source": [ - "%%time\n", - "tokenized_fr_txt = tokenize(str_, lang_module=\"fr_moses\")" - ] - }, - { - "cell_type": "code", - "execution_count": 8, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "['Les', 'moteurs', 'de', 'recherche', 'tels', 'Google', ',', 'Exalead', 'ou', 'Yahoo']\n" - ] - } - ], - "source": [ - "print(tokenized_fr_txt[:10])" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### English spaCy" - ] - }, - { - "cell_type": "code", - "execution_count": 9, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "CPU times: user 990 µs, sys: 0 ns, total: 990 µs\n", - "Wall time: 998 µs\n" - ] - } - ], - "source": [ - "%%time\n", - "tokenized_eng_txt = tokenize(eng_txt, lang_module=\"en_spacy\")" - ] - }, - { - "cell_type": "code", - "execution_count": 10, - "metadata": {}, - "outputs": [], - "source": [ - "tokenized_eng_txt = tokenize(eng_txt, lang_module=\"en_spacy\")" - ] - }, - { - "cell_type": "code", - "execution_count": 11, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "['Let', \"'s\", 'play', 'together', '!']" - ] - }, - "execution_count": 11, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "tokenized_eng_txt" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### English NLTK " - ] - }, - { - "cell_type": "code", - "execution_count": 12, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "CPU times: user 7.94 ms, sys: 122 µs, total: 8.06 ms\n", - "Wall time: 6.95 ms\n" - ] - } - ], - "source": [ - "%%time\n", - "tokenized_eng_txt = tokenize(eng_txt, lang_module=\"en_nltk\")\n", - "tokenized_eng_txt" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Un-tokenization" - ] - }, - { - "cell_type": "code", - "execution_count": 13, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "CPU times: user 1.46 s, sys: 35 µs, total: 1.46 s\n", - "Wall time: 1.46 s\n" - ] - }, - { - "data": { - "text/plain": [ - "\"Let's play together!\"" - ] - }, - "execution_count": 13, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "%%time\n", - "untokenize(tokenized_eng_txt,lang='en')" - ] - }, - { - "cell_type": "code", - "execution_count": 14, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "CPU times: user 3 s, sys: 351 µs, total: 3 s\n", - "Wall time: 3 s\n" - ] - }, - { - "data": { - "text/plain": [ - "\"Les moteurs de recherche tels Google, Exalead ou Yahoo ! sont des applications très connues de fouille de textes sur de grandes masses de données. Cependant, les moteurs de recherche ne se basent pas uniquement sur le texte pour l' indexer, mais également sur la façon dont les pages sont mises en valeur les unes par rapport aux autres. L' algorithme utilisé par Google est PageRank, et il est courant de voir HITS dans le milieu académique\"" - ] - }, - "execution_count": 14, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "%%time\n", - "untokenize(tokenized_fr_txt,lang='fr')" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Stemming " - ] - }, - { - "cell_type": "code", - "execution_count": 15, - "metadata": {}, - "outputs": [], - "source": [ - "from nautilus_nlp.preprocessing.stemming import stem_tokens" - ] - }, - { - "cell_type": "code", - "execution_count": 16, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "['i', 'surviv', 'these', 'dog']" - ] - }, - "execution_count": 16, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "stem_tokens(['I','survived','these', 'dogs'], lang='english')" - ] - }, - { - "cell_type": "code", - "execution_count": 17, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "['je', 'mang', 'dan', 'le', 'cuisin', 'du', 'château']" - ] - }, - "execution_count": 17, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "stem_tokens(['je', 'mangerai', 'dans', 'les', 'cuisines', 'du', 'château'],lang='french')" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Lemmatization" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## French " - ] - }, - { - "cell_type": "code", - "execution_count": 18, - "metadata": {}, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "[nltk_data] Downloading package wordnet to /root/nltk_data...\n", - "[nltk_data] Package wordnet is already up-to-date!\n", - "[nltk_data] Downloading package averaged_perceptron_tagger to\n", - "[nltk_data] /root/nltk_data...\n", - "[nltk_data] Package averaged_perceptron_tagger is already up-to-\n", - "[nltk_data] date!\n" - ] - } - ], - "source": [ - "from nautilus_nlp.preprocessing.lemmatization import lemmatize_french_tokens" - ] - }, - { - "cell_type": "code", - "execution_count": 19, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "['Ceci', 'est', 'un', 'texte', 'français', ',', \"j'\", 'adore', 'tes', 'frites', 'bien', 'grasses', 'YOLO', '!']\n" - ] - } - ], - "source": [ - "txt_to_tokenize=['Ceci', 'est', 'un', 'texte', 'français', ',', \"j'\", 'adore', 'tes', 'frites', 'bien', 'grasses', 'YOLO', '!']\n", - "print(txt_to_tokenize)" - ] - }, - { - "cell_type": "code", - "execution_count": 20, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "CPU times: user 17.3 ms, sys: 0 ns, total: 17.3 ms\n", - "Wall time: 15.8 ms\n" - ] - } - ], - "source": [ - "%%time\n", - "lemmatized_tokens = lemmatize_french_tokens(txt_to_tokenize, module='spacy')" - ] - }, - { - "cell_type": "code", - "execution_count": 21, - "metadata": {}, - "outputs": [], - "source": [ - "lemmatized_tokens = lemmatize_french_tokens(txt_to_tokenize, module='spacy')" - ] - }, - { - "cell_type": "code", - "execution_count": 22, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "['ceci', 'être', 'un', 'texte', 'français', ',', 'j', \"'\", 'adorer', 'ton', 'frit', 'bien', 'gras', 'yolo', '!']\n" - ] - } - ], - "source": [ - "print(lemmatized_tokens)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## English" - ] - }, - { - "cell_type": "code", - "execution_count": 23, - "metadata": { - "scrolled": true - }, - "outputs": [], - "source": [ - "from nautilus_nlp.preprocessing.lemmatization import lemmatize_english_tokens" - ] - }, - { - "cell_type": "code", - "execution_count": 24, - "metadata": {}, - "outputs": [], - "source": [ - "to_lemmatize = ['The', 'striped', 'bats', 'are', 'hanging', 'on', 'their', 'feet', 'for', 'best']" - ] - }, - { - "cell_type": "code", - "execution_count": 25, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "CPU times: user 13.7 ms, sys: 0 ns, total: 13.7 ms\n", - "Wall time: 12.5 ms\n" - ] - }, - { - "data": { - "text/plain": [ - "['the', 'strip', 'bat', 'be', 'hang', 'on', '-PRON-', 'foot', 'for', 'good']" - ] - }, - "execution_count": 25, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "%%time\n", - "lemmatize_english_tokens(to_lemmatize, module='spacy')" - ] - }, - { - "cell_type": "code", - "execution_count": 26, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "CPU times: user 1.72 s, sys: 125 ms, total: 1.85 s\n", - "Wall time: 1.82 s\n" - ] - }, - { - "data": { - "text/plain": [ - "['The', 'strip', 'bat', 'be', 'hang', 'on', 'their', 'foot', 'for', 'best']" - ] - }, - "execution_count": 26, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "%%time\n", - "lemmatize_english_tokens(to_lemmatize, module='nltk')" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Remove stop words" - ] - }, - { - "cell_type": "code", - "execution_count": 27, - "metadata": {}, - "outputs": [], - "source": [ - "from nautilus_nlp.preprocessing.preprocess import remove_stopwords\n", - "from nautilus_nlp.preprocessing.preprocess import get_stopwords" - ] - }, - { - "cell_type": "code", - "execution_count": 28, - "metadata": {}, - "outputs": [], - "source": [ - "FRENCH_SW = get_stopwords('fr')" - ] - }, - { - "cell_type": "code", - "execution_count": 29, - "metadata": {}, - "outputs": [], - "source": [ - "text = \"J'ai un beau cheval\"" - ] - }, - { - "cell_type": "code", - "execution_count": 30, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "[\"J'ai\", 'cheval']" - ] - }, - "execution_count": 30, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "remove_stopwords(text, FRENCH_SW)" - ] - }, - { - "cell_type": "code", - "execution_count": 31, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "[\"J'\", 'cheval']" - ] - }, - "execution_count": 31, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "remove_stopwords(tokenize(text, lang_module=\"fr_spacy\"),FRENCH_SW)" - ] - } - ], - "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.7.3" - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} diff --git a/notebooks/3. Text Vectorization - TF-IDF.ipynb b/notebooks/3. Text Vectorization - TF-IDF.ipynb deleted file mode 100644 index 1e0c112..0000000 --- a/notebooks/3. Text Vectorization - TF-IDF.ipynb +++ /dev/null @@ -1,713 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Text vectorization - TF-IDF" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Open files" - ] - }, - { - "cell_type": "code", - "execution_count": 1, - "metadata": { - "scrolled": false - }, - "outputs": [], - "source": [ - "import pandas as pd" - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "metadata": {}, - "outputs": [], - "source": [ - "df = pd.read_csv('https://storage.googleapis.com/dataset-uploader/bbc/bbc-text.csv')" - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "<div>\n", - "<style scoped>\n", - " .dataframe tbody tr th:only-of-type {\n", - " vertical-align: middle;\n", - " }\n", - "\n", - " .dataframe tbody tr th {\n", - " vertical-align: top;\n", - " }\n", - "\n", - " .dataframe thead th {\n", - " text-align: right;\n", - " }\n", - "</style>\n", - "<table border=\"1\" class=\"dataframe\">\n", - " <thead>\n", - " <tr style=\"text-align: right;\">\n", - " <th></th>\n", - " <th>category</th>\n", - " <th>text</th>\n", - " </tr>\n", - " </thead>\n", - " <tbody>\n", - " <tr>\n", - " <th>0</th>\n", - " <td>tech</td>\n", - " <td>tv future in the hands of viewers with home th...</td>\n", - " </tr>\n", - " <tr>\n", - " <th>1</th>\n", - " <td>business</td>\n", - " <td>worldcom boss left books alone former worldc...</td>\n", - " </tr>\n", - " <tr>\n", - " <th>2</th>\n", - " <td>sport</td>\n", - " <td>tigers wary of farrell gamble leicester say ...</td>\n", - " </tr>\n", - " <tr>\n", - " <th>3</th>\n", - " <td>sport</td>\n", - " <td>yeading face newcastle in fa cup premiership s...</td>\n", - " </tr>\n", - " <tr>\n", - " <th>4</th>\n", - " <td>entertainment</td>\n", - " <td>ocean s twelve raids box office ocean s twelve...</td>\n", - " </tr>\n", - " </tbody>\n", - "</table>\n", - "</div>" - ], - "text/plain": [ - " category text\n", - "0 tech tv future in the hands of viewers with home th...\n", - "1 business worldcom boss left books alone former worldc...\n", - "2 sport tigers wary of farrell gamble leicester say ...\n", - "3 sport yeading face newcastle in fa cup premiership s...\n", - "4 entertainment ocean s twelve raids box office ocean s twelve..." - ] - }, - "execution_count": 3, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "df.head()" - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "sport 511\n", - "business 510\n", - "politics 417\n", - "tech 401\n", - "entertainment 386\n", - "Name: category, dtype: int64" - ] - }, - "execution_count": 4, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "df.category.value_counts()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Preprocess" - ] - }, - { - "cell_type": "code", - "execution_count": 5, - "metadata": {}, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "[nltk_data] Downloading package punkt to /root/nltk_data...\n", - "[nltk_data] Package punkt is already up-to-date!\n", - "[nltk_data] Downloading package wordnet to /root/nltk_data...\n", - "[nltk_data] Package wordnet is already up-to-date!\n", - "[nltk_data] Downloading package averaged_perceptron_tagger to\n", - "[nltk_data] /root/nltk_data...\n", - "[nltk_data] Package averaged_perceptron_tagger is already up-to-\n", - "[nltk_data] date!\n" - ] - } - ], - "source": [ - "from nautilus_nlp.preprocessing.tokenizer import tokenize\n", - "from nautilus_nlp.preprocessing.lemmatization import lemmatize_english_tokens" - ] - }, - { - "cell_type": "code", - "execution_count": 6, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "CPU times: user 2min 47s, sys: 1.15 s, total: 2min 48s\n", - "Wall time: 2min 48s\n" - ] - } - ], - "source": [ - "%%time\n", - "df['tokens'] = df.text.apply(lambda row: tokenize(row))\n", - "df['tokens'] = df.tokens.apply(lambda row: lemmatize_english_tokens(row))\n", - "df['tokens'] = df.tokens.apply(lambda row: ' '.join(row))" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Split dataframe" - ] - }, - { - "cell_type": "code", - "execution_count": 7, - "metadata": {}, - "outputs": [], - "source": [ - "from sklearn.model_selection import train_test_split" - ] - }, - { - "cell_type": "code", - "execution_count": 8, - "metadata": {}, - "outputs": [], - "source": [ - "train, test = train_test_split(df, test_size=0.2)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Compute TF-IDF" - ] - }, - { - "cell_type": "code", - "execution_count": 9, - "metadata": {}, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "paramiko missing, opening SSH/SCP/SFTP paths will be disabled. `pip install paramiko` to suppress\n" - ] - } - ], - "source": [ - "from nautilus_nlp.preprocessing.text_vectorizers import TfidfTextVectorizer" - ] - }, - { - "cell_type": "code", - "execution_count": 15, - "metadata": {}, - "outputs": [], - "source": [ - "tfidf = TfidfTextVectorizer(max_df=0.95, #ignore terms that have a document frequency strictly higher \n", - " min_df=0.01,\n", - " max_features=10000,\n", - " encoding='utf-8',\n", - " #stop_words=SW,\n", - " norm=None,\n", - " #ngram_range=(1, 2))\n", - " )" - ] - }, - { - "cell_type": "code", - "execution_count": 16, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "TfidfVectorizer(analyzer='word', binary=False, decode_error='strict',\n", - " dtype=<class 'numpy.float64'>, encoding='utf-8', input='content',\n", - " lowercase=True, max_df=0.95, max_features=10000, min_df=0.01,\n", - " ngram_range=(1, 1), norm=None, preprocessor=None, smooth_idf=True,\n", - " stop_words=None, strip_accents=None, sublinear_tf=False,\n", - " token_pattern='(?u)\\\\b\\\\w\\\\w+\\\\b', tokenizer=None, use_idf=True,\n", - " vocabulary=None)" - ] - }, - "execution_count": 16, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "# uses Sci-kit learn TfidfVectorizer()\n", - "# You can pass all the arguments supported by sci-kit \n", - "# Doc : https://scikit-learn.org/stable/modules/generated/sklearn.feature_extraction.text.TfidfVectorizer.html\n", - "tfidf.tfidf_vectorizer" - ] - }, - { - "cell_type": "code", - "execution_count": 17, - "metadata": {}, - "outputs": [], - "source": [ - "list_of_docs = list(train.tokens)" - ] - }, - { - "cell_type": "code", - "execution_count": 18, - "metadata": { - "scrolled": true - }, - "outputs": [ - { - "data": { - "text/plain": [ - "['bid to cut court witness stress new target to reduce the stress to victim and witness give evidence in court in england and wale have be announce by the lord chancellor . lord falconer want all crown court and 90 % of magistrate court to have facility to keep witness separate from defendant within four year . more video link will also be make available so that witness do not have to enter courtroom . -PRON- be part of a five - year plan to help build confidence in the justice system . minister say the strategy be aim at re - balance the court system towards victim and increase the number of offender bring to justice . launch the department for constitutional affair plan lord falconer say : one of the top priority will be a well deal for victim . the need and safety of victim will be at the heart of the way trial be manage . court judge magistrate prosecutor police and victim support - all work together to ensure the right of victim be put first without compromise the right of the defendant . -PRON- go on : give evidence be a nerve - wracking experience especially when -PRON- re a victim . yet with a will and with support -PRON- can be do . lord falconer tell bbc radio 4 s today programme -PRON- be impossible for some elderly people to go to court to give evidence . other witness could be intimidate by sit alongside defendant outside court . -PRON- be never go to get rid of some element of the trauma of give evidence -PRON- say . but -PRON- can make people believe that the court understand the problem -PRON- s not some kind of alien place where -PRON- go where -PRON- be not think about -PRON- . the plan come as the lord chancellor also consider allow camera into court for the first time since 1925 as long as -PRON- be use for case that do not involve witness . another feature of the strategy be constitutional reform with a government bill to set up a supreme court and a judicial appointment commission return to the house of lord on tuesday . minister have propose get rid of the title of lord chancellor but the lord have over - rule this . lord falconer say -PRON- be right for the high court to be completely distinct from parliament . the person in charge of the court system should not also be speaker of the house of lord -PRON- say and should be the good person choose from either house of parliament . what -PRON- do not what -PRON- be call be the critical issue -PRON- add .',\n", - " 'market unfaze by aurora setback as the aurora limp back to -PRON- dock on 20 january a blizzard of photo and interview seem to add up to an unambiguous tale of woe . the ship have another slice of bad luck to add to -PRON- history of health scare and technical trouble . and -PRON- owner p&o cruise - now part of the huge -PRON- carnival corporation - be look at a significant slice chop off this year s profit and a potential pr fiasco . no - one however seem to have tell the stock market . the warning of a five - cent hit to 2005 earning come just 24 hour after one of the world s big investment bank have up -PRON- target for carnival s share price from £ 35 to £ 36.20 . other investor barely blink and by 1300 gmt carnival s share in london be down a single penny or 0.03 % at £ 32.26 . why the mismatch between the public perception and the market s response the aurora issue have be an ongoing one for some time say deutsche bank s simon champion . -PRON- be clearly a source of uncertainty for the company - -PRON- be a long cruise after all . but the stock market be very good at treat these issue as one - off event . despite -PRON- string of bad luck -PRON- point out aurora be just one vessel in a large carnival fleet the uk s p&o princess group have be merge into the much large -PRON- firm in 2003 . and generally speak carnival have a reputation for keep -PRON- ship pretty much on schedule . carnival have an incredibly strong track record mr champion . similarly analyst expect the impact on the rest of the cruise business to be limit . the hundred of disappointed passenger who have now have to give up the opportunity to spend the next three month on the aurora have get both a refund and a credit for another cruise . that should mitigate some of the pr risk both for carnival and -PRON- main competitor royal caribbean . while not common cancellation for technical reason be not entirely unusual in the industry write analyst from citigroup smith barney in a note to client on friday . moreover such event typically have a limited impact on booking and pricing for future cruise . after all the aurora incident may be big news in the uk - but for carnival customer elsewhere -PRON- s unlikely to make too much of a splash . assume that citigroup be right and demand stay solid the structure of the industry also work in carnival s favour . in the wake of p&o princess s takeover by carnival the business be now to a great extent a duopoly . give the expense of build outfitting and run a cruise ship slow supply growth be a certainty say david ander at merrill lynch on thursday . in other word if -PRON- do want a cruise -PRON- option be limited . and with carnival remain the market leader -PRON- look set to keep sell the ticket - no matter what happen to the ill - fat aurora in the future .']" - ] - }, - "execution_count": 18, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "list_of_docs[:2]" - ] - }, - { - "cell_type": "code", - "execution_count": 19, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "<1780x2638 sparse matrix of type '<class 'numpy.float64'>'\n", - "\twith 251758 stored elements in Compressed Sparse Row format>" - ] - }, - "execution_count": 19, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "# Compute the word count vector matrix.\n", - "# will apply \n", - "tfidf.compute_tfidf(list_of_docs)" - ] - }, - { - "cell_type": "code", - "execution_count": 20, - "metadata": { - "scrolled": true - }, - "outputs": [ - { - "data": { - "text/plain": [ - "{'song': 328.383,\n", - " 'wage': 314.316,\n", - " 'roddick': 293.646,\n", - " 'minimum': 260.403,\n", - " 'music': 75.21,\n", - " 'robbie': 157.772,\n", - " 'terrorist': 153.899,\n", - " 'good': 151.491,\n", - " 'game': 73.159,\n", - " 'increase': 129.725,\n", - " 'hunt': 93.316,\n", - " 'party': 126.188,\n", - " '25': 125.075,\n", - " 'pay': 121.356,\n", - " 'muslim': 114.249,\n", - " 'gadget': 113.934,\n", - " 'student': 108.451,\n", - " 'threat': 104.522,\n", - " 'black': 103.206,\n", - " 'liverpool': 101.794,\n", - " 'airline': 99.171,\n", - " 'stone': 96.591,\n", - " 'mini': 90.917,\n", - " 'mobile': 89.006,\n", - " 'play': 92.565,\n", - " 'cell': 92.487,\n", - " 'virus': 87.661,\n", - " 'jamie': 92.1,\n", - " 'spam': 91.696,\n", - " 'film': 82.501,\n", - " 'hour': 91.616,\n", - " 'camera': 91.062,\n", - " 'edward': 88.856,\n", - " 'search': 71.07,\n", - " 'passenger': 88.648,\n", - " 'lord': 87.43,\n", - " 'rugby': 86.836,\n", - " 'china': 86.425,\n", - " 'yuko': 75.514,\n", - " 'government': 86.077,\n", - " 'machine': 84.396,\n", - " 'ibm': 82.338,\n", - " 'online': 80.27,\n", - " 'asylum': 80.242,\n", - " 'musician': 79.603,\n", - " 'fraud': 79.531,\n", - " 'pension': 79.157,\n", - " 'that': 78.174,\n", - " 'gaming': 78.083,\n", - " 'bt': 77.836,\n", - " 'cash': 77.796,\n", - " 'argentina': 77.567,\n", - " 'site': 77.486,\n", - " 'lee': 77.291,\n", - " 'actress': 77.044,\n", - " 'hip': 76.849,\n", - " 'attack': 75.856,\n", - " 'broadband': 75.512,\n", - " 'actor': 74.891,\n", - " 'award': 74.741,\n", - " 'bank': 74.26,\n", - " 'document': 74.157,\n", - " 'mail': 73.852,\n", - " 'business': 73.69,\n", - " 'not': 73.596,\n", - " 'japan': 72.974,\n", - " 'chart': 72.764,\n", - " 'what': 72.65,\n", - " 'deutsche': 72.138,\n", - " 'police': 72.137,\n", - " 'soul': 72.026,\n", - " 'point': 71.795,\n", - " 'vote': 71.593,\n", - " 'card': 71.142,\n", - " 'file': 70.759,\n", - " 'dvd': 70.511,\n", - " 'poster': 70.121,\n", - " 'murder': 70.121}" - ] - }, - "execution_count": 20, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "# Get highest-weighted words\n", - "tfidf.get_top_tfidf(n=100)" - ] - }, - { - "cell_type": "code", - "execution_count": 21, - "metadata": { - "scrolled": false - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "['court', 'lord', 'witness', 'victim', 'evidence', 'chancellor', 'rid', 'constitutional', 'house', 'justice']\n", - "['ship', 'market', 'limited', 'for', 'technical', 'one', 'stock', 'impact', 'much', 'on']\n", - "['trust', 'politician', 'voter', 'election', 'poll', 'public', 'issue', 'lib', 'dem', 'lack']\n", - "['member', 'share', 'qualify', 'profit', '42', 'payment', 'society', 'than', 'building', 'worth']\n", - "['ireland', 'cardiff', 'slam', 'england', 'grand', 'year', 'wale', 'last', 'team', 'tournament']\n", - "['good', 'theatre', 'musical', 'mary', 'royal', 'producer', 'at', 'design', 'outstanding', 'award']\n", - "['virus', 'writer', 'phone', '2004', 'that', 'attack', 'number', 'spam', 'use', 'message']\n", - "['academy', 'award', 'oscar', 'war', 'ceremony', 'frank', 'winner', 'film', 'first', 'as']\n", - "['broadcaster', 'debate', 'lord', 'prime', 'campaign', 'election', 'say', 'minister', 'blair', 'ahead']\n", - "['parliament', 'record', 'prior', 'document', 'blow', 'page', 'act', 'room', 'by', 'history']\n" - ] - } - ], - "source": [ - "# Get highest-weighted words per document\n", - "for doc in list_of_docs[:10]:\n", - " print(tfidf.get_top_tfidf_per_doc(doc,n=10))" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Apply Tf-idf to new documents" - ] - }, - { - "cell_type": "code", - "execution_count": 22, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "<div>\n", - "<style scoped>\n", - " .dataframe tbody tr th:only-of-type {\n", - " vertical-align: middle;\n", - " }\n", - "\n", - " .dataframe tbody tr th {\n", - " vertical-align: top;\n", - " }\n", - "\n", - " .dataframe thead th {\n", - " text-align: right;\n", - " }\n", - "</style>\n", - "<table border=\"1\" class=\"dataframe\">\n", - " <thead>\n", - " <tr style=\"text-align: right;\">\n", - " <th></th>\n", - " <th>category</th>\n", - " <th>text</th>\n", - " <th>tokens</th>\n", - " </tr>\n", - " </thead>\n", - " <tbody>\n", - " <tr>\n", - " <th>1515</th>\n", - " <td>business</td>\n", - " <td>booming markets shed few tears the market for...</td>\n", - " <td>boom market shed few tear the market former...</td>\n", - " </tr>\n", - " <tr>\n", - " <th>980</th>\n", - " <td>sport</td>\n", - " <td>claxton hunting first major medal british hurd...</td>\n", - " <td>claxton hunt first major medal british hurdler...</td>\n", - " </tr>\n", - " <tr>\n", - " <th>1634</th>\n", - " <td>tech</td>\n", - " <td>sony psp handheld console hits us the latest h...</td>\n", - " <td>sony psp handheld console hit -PRON- the late ...</td>\n", - " </tr>\n", - " <tr>\n", - " <th>1053</th>\n", - " <td>entertainment</td>\n", - " <td>black sabbath top rock album poll black sabbat...</td>\n", - " <td>black sabbath top rock album poll black sabbat...</td>\n", - " </tr>\n", - " <tr>\n", - " <th>1870</th>\n", - " <td>sport</td>\n", - " <td>jones doping probe begins an investigation int...</td>\n", - " <td>jone dope probe begin an investigation into do...</td>\n", - " </tr>\n", - " </tbody>\n", - "</table>\n", - "</div>" - ], - "text/plain": [ - " category text \\\n", - "1515 business booming markets shed few tears the market for... \n", - "980 sport claxton hunting first major medal british hurd... \n", - "1634 tech sony psp handheld console hits us the latest h... \n", - "1053 entertainment black sabbath top rock album poll black sabbat... \n", - "1870 sport jones doping probe begins an investigation int... \n", - "\n", - " tokens \n", - "1515 boom market shed few tear the market former... \n", - "980 claxton hunt first major medal british hurdler... \n", - "1634 sony psp handheld console hit -PRON- the late ... \n", - "1053 black sabbath top rock album poll black sabbat... \n", - "1870 jone dope probe begin an investigation into do... " - ] - }, - "execution_count": 22, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "test.head()" - ] - }, - { - "cell_type": "code", - "execution_count": 23, - "metadata": { - "scrolled": true - }, - "outputs": [ - { - "data": { - "text/plain": [ - "1515 [disaster, market, stock, insurance, global, b...\n", - "980 [medal, hurdle, indoor, european, training, co...\n", - "1634 [sony, device, gaming, handheld, gadget, ninte...\n", - "1053 [band, rock, black, album, list, top, live, po...\n", - "1870 [olympic, jone, truth, medal, sydney, pound, a...\n", - "1135 [store, sale, retailer, december, same, rise, ...\n", - "1034 [jackson, ms, boy, prosecution, court, film, d...\n", - "1061 [festival, sell, event, day, organiser, act, j...\n", - "205 [engine, union, buy, six, motor, plant, italia...\n", - "1500 [program, phone, malicious, file, instal, work...\n", - "2100 [uk, trick, ban, will, super, industry, respon...\n", - "1046 [round, victory, title, really, first, capture...\n", - "1728 [cardiff, thomas, jone, morgan, france, italy,...\n", - "575 [file, server, operator, peer, network, site, ...\n", - "24 [sound, audio, mobile, technology, phone, hand...\n", - "1556 [eu, law, draft, computer, software, legal, im...\n", - "2058 [interactive, award, nomination, category, tv,...\n", - "750 [card, bank, economy, central, debt, consumer,...\n", - "876 [bill, committee, welfare, draft, government, ...\n", - "2149 [project, information, computer, community, lo...\n", - "1056 [ferguson, arsenal, game, football, saturday, ...\n", - "227 [zealand, wale, black, new, cardiff, game, rug...\n", - "1353 [bill, limit, small, government, culture, brit...\n", - "1397 [pension, election, age, vote, party, basic, o...\n", - "2028 [host, american, television, suffer, award, gl...\n", - "1181 [ipod, apple, job, computer, mini, new, mass, ...\n", - "2123 [ticket, green, band, fan, dublin, concert, se...\n", - "77 [break, hodgson, winter, league, premiership, ...\n", - "1075 [game, video, company, news, tag, as, art, eye...\n", - "1201 [bank, italian, institution, sue, company, fin...\n", - " ... \n", - "1301 [un, short, ms, authority, tsunami, only, indi...\n", - "2150 [spain, federation, player, henry, comment, in...\n", - "562 [video, offer, demand, sky, cable, tv, program...\n", - "1268 [shoot, texas, control, hunt, let, session, wi...\n", - "364 [festival, disaster, film, ticket, continue, e...\n", - "467 [million, show, audience, figure, 14, episode,...\n", - "2086 [sun, russian, voting, employ, buy, stake, aug...\n", - "235 [growth, rate, consumer, quarter, spending, bu...\n", - "1755 [offer, fresh, as, game, tough, title, level, ...\n", - "672 [microsoft, window, user, system, online, inte...\n", - "732 [jone, gb, championship, indoor, green, olympi...\n", - "455 [download, programme, episode, tv, net, uk, pe...\n", - "635 [digital, design, technology, people, ms, came...\n", - "795 [chelsea, 2000, play, milan, barcelona, leg, b...\n", - "535 [pc, 2010, pcs, china, million, market, local,...\n", - "1199 [film, india, hurt, community, refuse, anger, ...\n", - "264 [consumer, rule, mobile, firm, service, phone,...\n", - "701 [network, file, content, download, music, tech...\n", - "59 [drug, heart, risk, regulator, that, on, disea...\n", - "456 [lord, reform, chancellor, manifesto, house, c...\n", - "2091 [collin, athletic, sport, olympic, competitor,...\n", - "667 [dvd, copy, pirate, piracy, technology, progra...\n", - "164 [suspend, candidate, mr, view, say, party, new...\n", - "393 [policy, economic, inflation, rise, market, re...\n", - "117 [labour, chancellor, cut, conservative, party,...\n", - "207 [blair, question, answer, trust, thing, say, p...\n", - "343 [blair, peace, mr, conference, leader, iraq, v...\n", - "675 [party, election, mr, leadership, assembly, ro...\n", - "2141 [medium, traditional, information, web, mainst...\n", - "132 [wale, william, flanker, cardiff, fit, injury,...\n", - "Name: tokens, Length: 445, dtype: object" - ] - }, - "execution_count": 23, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "test.tokens.apply(lambda row: tfidf.get_top_tfidf_per_doc(row))" - ] - }, - { - "cell_type": "code", - "execution_count": 24, - "metadata": {}, - "outputs": [], - "source": [ - "test_tfidf_matrix = tfidf.apply_tfidf_to_documents(list(test.tokens))" - ] - }, - { - "cell_type": "code", - "execution_count": 25, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "{'zealand': 157.747,\n", - " 'gadget': 137.671,\n", - " 'child': 100.98,\n", - " 'camera': 91.062,\n", - " 'wale': 86.221,\n", - " 'mini': 85.866,\n", - " 'bt': 77.836,\n", - " 'soul': 77.567,\n", - " 'council': 76.619,\n", - " 'jackson': 74.892}" - ] - }, - "execution_count": 25, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "tfidf.get_top_tfidf(test_tfidf_matrix)" - ] - } - ], - "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.7.3" - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} diff --git a/notebooks/4. Topic Modeling.ipynb b/notebooks/4. Topic Modeling.ipynb deleted file mode 100644 index 7d040fd..0000000 --- a/notebooks/4. Topic Modeling.ipynb +++ /dev/null @@ -1,954 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Topic Modeling" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Step 1: Load the dataset" - ] - }, - { - "cell_type": "code", - "execution_count": 8, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "from sklearn.datasets import fetch_20newsgroups\n", - "newsgroups_train = fetch_20newsgroups(subset='train', shuffle = True)\n", - "newsgroups_test = fetch_20newsgroups(subset='test', shuffle = True)" - ] - }, - { - "cell_type": "code", - "execution_count": 9, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "['alt.atheism', 'comp.graphics', 'comp.os.ms-windows.misc', 'comp.sys.ibm.pc.hardware', 'comp.sys.mac.hardware', 'comp.windows.x', 'misc.forsale', 'rec.autos', 'rec.motorcycles', 'rec.sport.baseball', 'rec.sport.hockey', 'sci.crypt', 'sci.electronics', 'sci.med', 'sci.space', 'soc.religion.christian', 'talk.politics.guns', 'talk.politics.mideast', 'talk.politics.misc', 'talk.religion.misc']\n" - ] - } - ], - "source": [ - "print(list(newsgroups_train.target_names))" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Step 2: Data Preprocessing¶\n" - ] - }, - { - "cell_type": "code", - "execution_count": 10, - "metadata": {}, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "/Users/williamjaubert/anaconda2/envs/nautilus/lib/python3.7/site-packages/nltk/decorators.py:68: DeprecationWarning: `formatargspec` is deprecated since Python 3.5. Use `signature` and the `Signature` object directly\n", - " regargs, varargs, varkwargs, defaults, formatvalue=lambda value: \"\"\n" - ] - } - ], - "source": [ - "import gensim\n", - "from gensim.utils import simple_preprocess\n", - "from gensim.parsing.preprocessing import STOPWORDS\n", - "from nltk.stem import WordNetLemmatizer, SnowballStemmer\n", - "from nltk.stem.porter import *\n", - "import numpy as np\n", - "np.random.seed(400)\n", - "\n", - "import nltk\n", - "\n", - "import pandas as pd\n", - "stemmer = SnowballStemmer(\"english\")" - ] - }, - { - "cell_type": "code", - "execution_count": 11, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "def lemmatize_stemming(text):\n", - " return stemmer.stem(WordNetLemmatizer().lemmatize(text, pos='v'))\n", - "\n", - "# Tokenize and lemmatize\n", - "def preprocess(text):\n", - " result=[]\n", - " for token in gensim.utils.simple_preprocess(text) :\n", - " if token not in gensim.parsing.preprocessing.STOPWORDS and len(token) > 3:\n", - " result.append(lemmatize_stemming(token))\n", - " \n", - " return result" - ] - }, - { - "cell_type": "code", - "execution_count": 12, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "processed_docs = []\n", - "\n", - "for doc in newsgroups_train.data:\n", - " processed_docs.append(preprocess(doc))" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Step 3: Bag of words" - ] - }, - { - "cell_type": "code", - "execution_count": 13, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "# Create the dictionnary\n", - "from nautilus_nlp.models.topic_modeling import create_dictionary" - ] - }, - { - "cell_type": "code", - "execution_count": 14, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "dictionary = create_dictionary(processed_docs)" - ] - }, - { - "cell_type": "code", - "execution_count": 15, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "# Filter out tokens that appear in too few or too many documents\n", - "from nautilus_nlp.models.topic_modeling import filter_extremes" - ] - }, - { - "cell_type": "code", - "execution_count": 16, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "filter_extremes(dictionary)" - ] - }, - { - "cell_type": "code", - "execution_count": 17, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "# Create the bow \n", - "from nautilus_nlp.models.topic_modeling import create_bow_corpus" - ] - }, - { - "cell_type": "code", - "execution_count": 18, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "bow_corpus = create_bow_corpus(processed_docs, dictionary)" - ] - }, - { - "cell_type": "code", - "execution_count": 20, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "[(13, 1), (26, 1), (55, 1), (88, 1), (99, 1), (152, 1), (153, 2), (154, 1), (155, 1), (156, 1), (157, 2), (158, 1), (159, 2), (160, 4), (161, 1), (162, 2), (163, 1), (164, 2), (165, 1), (166, 1), (167, 1), (168, 1), (169, 1), (170, 1), (171, 1), (172, 1), (173, 1), (174, 1), (175, 1), (176, 1), (177, 1), (178, 2), (179, 1), (180, 1), (181, 1), (182, 1)]\n" - ] - } - ], - "source": [ - "print(bow_corpus[3])" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Step 4: Find optimal number of topics" - ] - }, - { - "cell_type": "code", - "execution_count": 13, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "# Compute coherence values for various number of topics in order to pick the optimal one\n", - "from nautilus_nlp.models.topic_modeling import compute_coherence_values" - ] - }, - { - "cell_type": "code", - "execution_count": 14, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "# Take a long time to run\n", - "model_list, coherence_values = compute_coherence_values(dictionary=dictionary, bow_corpus=bow_corpus, texts=processed_docs, start=2, limit=25, step=4)\n" - ] - }, - { - "cell_type": "code", - "execution_count": 17, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "[0.37900998646286865,\n", - " 0.42680154447577845,\n", - " 0.47716566398237525,\n", - " 0.5261650723885645,\n", - " 0.49607461078243215,\n", - " 0.4978727171365794]" - ] - }, - "execution_count": 17, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "coherence_values" - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "from nautilus_nlp.models.topic_modeling import plot_optimal_topic_number" - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "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\n", - "text/plain": [ - "<Figure size 432x288 with 1 Axes>" - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - } - ], - "source": [ - "plot_optimal_topic_number(coherence_values, start=2, limit=25, step=4)" - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "# Print the coherences scores for the number we tested\n", - "from nautilus_nlp.models.topic_modeling import print_coherence_scores" - ] - }, - { - "cell_type": "code", - "execution_count": 5, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Num Topics = 2 has Coherence Value of 0.379\n", - "Num Topics = 6 has Coherence Value of 0.4268\n", - "Num Topics = 10 has Coherence Value of 0.4772\n", - "Num Topics = 14 has Coherence Value of 0.5262\n", - "Num Topics = 18 has Coherence Value of 0.4961\n", - "Num Topics = 22 has Coherence Value of 0.4979\n" - ] - } - ], - "source": [ - "print_coherence_scores(coherence_values)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Step 5: Running LDA using Bag of Words" - ] - }, - { - "cell_type": "code", - "execution_count": 12, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "# Train the LDA model with gensim\n", - "from nautilus_nlp.models.topic_modeling import train_lda_model" - ] - }, - { - "cell_type": "code", - "execution_count": 13, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "model = train_lda_model(bow_corpus, dictionary, 10)" - ] - }, - { - "cell_type": "code", - "execution_count": 14, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "<gensim.models.ldamodel.LdaModel at 0x1a2af3e208>" - ] - }, - "execution_count": 14, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "model" - ] - }, - { - "cell_type": "code", - "execution_count": 15, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "# Save model\n", - "from nautilus_nlp.models.topic_modeling import save_model" - ] - }, - { - "cell_type": "code", - "execution_count": 16, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "save_model(model,'/Users/williamjaubert/Documents/Allianz_William/notebook', 'ldamodel_nautilus')" - ] - }, - { - "cell_type": "code", - "execution_count": 152, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "# Load model" - ] - }, - { - "cell_type": "code", - "execution_count": 17, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "from nautilus_nlp.models.topic_modeling import load_model" - ] - }, - { - "cell_type": "code", - "execution_count": 18, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "<gensim.models.ldamodel.LdaModel at 0x1a29985b38>" - ] - }, - "execution_count": 18, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "model_loaded = load_model('/Users/williamjaubert/Documents/Allianz_William/notebook', 'ldamodel_nautilus')\n", - "model_loaded" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Step 6: Visualize the top keywords per topic with Pyldavis interactive chart" - ] - }, - { - "cell_type": "code", - "execution_count": 19, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "# Display the top keywords per topic in a interactive chart\n", - "from nautilus_nlp.models.topic_modeling import visualize_topics" - ] - }, - { - "cell_type": "code", - "execution_count": 155, - "metadata": {}, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "/Users/williamjaubert/anaconda2/envs/nautilus/lib/python3.7/site-packages/pyLDAvis/_prepare.py:257: FutureWarning: Sorting because non-concatenation axis is not aligned. A future version\n", - "of pandas will change to not sort by default.\n", - "\n", - "To accept the future behavior, pass 'sort=False'.\n", - "\n", - "To retain the current behavior and silence the warning, pass 'sort=True'.\n", - "\n", - " return pd.concat([default_term_info] + list(topic_dfs))\n" - ] - }, - { - "data": { - "text/html": [ - "\n", - "<link rel=\"stylesheet\" type=\"text/css\" href=\"https://cdn.rawgit.com/bmabey/pyLDAvis/files/ldavis.v1.0.0.css\">\n", - "\n", - "\n", - "<div id=\"ldavis_el591011124095238088809029897\"></div>\n", - "<script type=\"text/javascript\">\n", - "\n", - "var ldavis_el591011124095238088809029897_data = {\"mdsDat\": {\"x\": [-0.07866945427665124, -0.01699948489792914, 0.20896689238873523, 0.14744605031212607, -0.008849073212760983, -0.04505413872814077, -0.08949897686453376, 0.10780299734830809, 0.004524270451044093, -0.22966908252019716], \"y\": [-0.15170611822961017, -0.1504468301902949, 0.08013685816591506, 0.13647834612774523, -0.009046128981188077, 0.003906923765221535, 0.14472746444813225, -0.07737607739594787, -0.1051004751701791, 0.1284260374602061], \"topics\": [1, 2, 3, 4, 5, 6, 7, 8, 9, 10], \"cluster\": [1, 1, 1, 1, 1, 1, 1, 1, 1, 1], \"Freq\": [13.182504653930664, 12.926197052001953, 12.463006973266602, 11.995771408081055, 9.55910873413086, 9.468682289123535, 8.927140235900879, 7.882134437561035, 7.024929523468018, 6.5705246925354]}, \"tinfo\": {\"Category\": [\"Default\", \"Default\", \"Default\", \"Default\", \"Default\", \"Default\", \"Default\", \"Default\", \"Default\", \"Default\", \"Default\", \"Default\", \"Default\", \"Default\", \"Default\", \"Default\", \"Default\", \"Default\", \"Default\", \"Default\", \"Default\", \"Default\", \"Default\", \"Default\", \"Default\", \"Default\", \"Default\", \"Default\", \"Default\", \"Default\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\"], \"Freq\": [2966.0, 1940.0, 1924.0, 1689.0, 2638.0, 2883.0, 1860.0, 1161.0, 1997.0, 1477.0, 1274.0, 1017.0, 1577.0, 1423.0, 1059.0, 1331.0, 1142.0, 2599.0, 837.0, 1391.0, 6052.0, 742.0, 990.0, 784.0, 1802.0, 1023.0, 4004.0, 867.0, 1191.0, 747.0, 1142.053466796875, 698.051025390625, 406.8222961425781, 375.23699951171875, 365.2066650390625, 324.94189453125, 317.34423828125, 293.73358154296875, 242.91064453125, 242.6265411376953, 238.57518005371094, 222.68365478515625, 219.24806213378906, 497.52392578125, 182.9066925048828, 189.0950927734375, 180.77523803710938, 167.61569213867188, 170.06529235839844, 162.4676055908203, 156.04241943359375, 152.99142456054688, 147.4279327392578, 144.96324157714844, 144.00845336914062, 142.54815673828125, 140.01528930664062, 137.27037048339844, 111.63591766357422, 111.36140441894531, 296.46563720703125, 234.76368713378906, 534.498779296875, 227.3394775390625, 733.4286499023438, 290.5852355957031, 1027.818603515625, 194.50514221191406, 462.2489929199219, 638.7830200195312, 383.04254150390625, 557.0740966796875, 270.9013671875, 346.3726501464844, 2339.714599609375, 353.4006042480469, 956.244140625, 1366.7689208984375, 489.0564880371094, 1502.89306640625, 432.21966552734375, 423.68536376953125, 946.1923828125, 647.3731689453125, 868.969970703125, 843.2189331054688, 679.2139892578125, 536.1270751953125, 452.23504638671875, 627.3469848632812, 723.7830200195312, 487.529541015625, 627.237060546875, 480.2855529785156, 485.9232482910156, 520.519287109375, 439.0638122558594, 1273.8934326171875, 843.1687622070312, 687.6259155273438, 378.13519287109375, 599.566650390625, 284.1808166503906, 264.9247131347656, 257.7122802734375, 233.3790283203125, 198.55160522460938, 196.56007385253906, 186.4253692626953, 185.77682495117188, 190.4823760986328, 160.68319702148438, 157.2107391357422, 147.51388549804688, 143.9427032470703, 141.29263305664062, 132.9550323486328, 132.7094268798828, 136.2650604248047, 134.08621215820312, 122.39493560791016, 117.66445922851562, 110.7325210571289, 103.35787200927734, 103.81564331054688, 102.61417388916016, 191.171142578125, 1897.55224609375, 734.2091674804688, 595.35400390625, 628.1231079101562, 206.7904815673828, 246.95516967773438, 800.1998901367188, 749.1170043945312, 336.15264892578125, 271.74371337890625, 265.7127990722656, 398.02044677734375, 574.3276977539062, 250.16622924804688, 378.8575744628906, 461.7618408203125, 1507.1781005859375, 256.8684997558594, 577.097900390625, 989.1630249023438, 369.29083251953125, 600.9321899414062, 735.2871704101562, 547.2880249023438, 671.5233154296875, 658.334716796875, 983.666259765625, 1571.5150146484375, 640.5947875976562, 527.5059204101562, 1109.0411376953125, 876.4497680664062, 725.8155517578125, 862.159912109375, 662.5055541992188, 745.251953125, 665.8281860351562, 603.2254028320312, 672.0674438476562, 613.41943359375, 579.7627563476562, 513.5291137695312, 478.60107421875, 261.23309326171875, 304.4447937011719, 182.0543975830078, 164.44281005859375, 158.4560546875, 152.0279083251953, 137.8629150390625, 135.1473846435547, 117.27381896972656, 101.5247573852539, 100.54000091552734, 94.55840301513672, 94.07215118408203, 92.82543182373047, 88.48568725585938, 85.05994415283203, 77.8740005493164, 76.19078063964844, 74.76761627197266, 76.91588592529297, 66.26870727539062, 65.83450317382812, 62.59058380126953, 61.630924224853516, 56.66929244995117, 56.645973205566406, 56.47174072265625, 56.24151611328125, 433.3631896972656, 57.639102935791016, 175.34927368164062, 811.6905517578125, 352.3057861328125, 460.812255859375, 1244.349853515625, 397.7268981933594, 319.0634765625, 364.1428527832031, 817.1531372070312, 179.1089630126953, 759.2709350585938, 353.8210754394531, 767.8507690429688, 704.0316772460938, 1031.0333251953125, 338.7200927734375, 853.117919921875, 1558.565673828125, 1291.274169921875, 922.3545532226562, 1345.4871826171875, 471.7730407714844, 490.044677734375, 677.4464111328125, 1059.08154296875, 853.1986083984375, 843.7091064453125, 1006.580078125, 803.4461669921875, 784.5733642578125, 584.6500854492188, 572.8038330078125, 507.68548583984375, 934.7852172851562, 496.4774169921875, 583.20458984375, 623.8618774414062, 588.018798828125, 614.8836059570312, 528.0966796875, 511.22735595703125, 511.70477294921875, 866.5625, 316.72491455078125, 249.29571533203125, 229.9024200439453, 228.7355194091797, 211.55052185058594, 183.0289764404297, 166.1912841796875, 164.7910919189453, 155.55848693847656, 157.89810180664062, 359.6870422363281, 133.46632385253906, 124.17170715332031, 122.31271362304688, 117.03710174560547, 111.25904083251953, 110.83535766601562, 109.16374969482422, 103.2101821899414, 98.91426849365234, 514.7677612304688, 89.62791442871094, 82.74832153320312, 81.71601104736328, 103.25068664550781, 75.25823974609375, 75.21469116210938, 70.78433990478516, 69.34544372558594, 281.78009033203125, 311.1195983886719, 971.2630004882812, 208.0179901123047, 697.1331787109375, 367.6048889160156, 1416.3004150390625, 441.63726806640625, 604.5337524414062, 578.8893432617188, 377.5198974609375, 192.00442504882812, 648.3333129882812, 1969.8912353515625, 938.5662841796875, 446.4165954589844, 632.349853515625, 658.6181030273438, 1989.853515625, 746.8209838867188, 677.7993774414062, 282.14984130859375, 467.3210144042969, 480.8096008300781, 1419.96630859375, 633.1287841796875, 1121.6055908203125, 955.2998046875, 821.8631591796875, 1269.9896240234375, 524.8942260742188, 1015.9119262695312, 611.8196411132812, 745.4178466796875, 688.518310546875, 667.1979370117188, 692.5172729492188, 593.0750732421875, 527.0308837890625, 546.2483520507812, 266.1346740722656, 171.08937072753906, 155.6071014404297, 226.88490295410156, 131.5532684326172, 110.63844299316406, 109.71115112304688, 476.2266540527344, 123.79460144042969, 96.52826690673828, 90.6929702758789, 86.91134643554688, 84.75259399414062, 84.67416381835938, 83.132080078125, 249.04006958007812, 73.44264221191406, 70.66631317138672, 70.3055419921875, 68.83519744873047, 66.711181640625, 65.8822250366211, 60.60839080810547, 60.293426513671875, 59.59612274169922, 59.43571472167969, 59.13909149169922, 58.31281661987305, 57.815277099609375, 57.416988372802734, 405.0425720214844, 341.4366455078125, 190.89840698242188, 246.23365783691406, 163.5123748779297, 257.450927734375, 138.4132537841797, 165.08370971679688, 521.0137939453125, 1046.2774658203125, 1400.850341796875, 228.16041564941406, 286.63897705078125, 343.24639892578125, 185.74090576171875, 229.64581298828125, 175.05548095703125, 332.4627990722656, 163.81402587890625, 539.6653442382812, 256.2196960449219, 439.739990234375, 517.5452270507812, 403.49468994140625, 229.62326049804688, 866.29833984375, 846.667236328125, 313.1244812011719, 322.8232727050781, 286.90380859375, 653.3579711914062, 749.8698120117188, 426.6073913574219, 380.0177307128906, 366.8009338378906, 372.0513000488281, 408.4660949707031, 415.6255187988281, 394.1338806152344, 394.38397216796875, 349.50030517578125, 362.36224365234375, 340.7713928222656, 296.1283264160156, 297.5120544433594, 494.6736145019531, 745.9381103515625, 324.6826171875, 301.4449157714844, 243.7447509765625, 158.0723114013672, 107.36814880371094, 95.01725769042969, 99.29867553710938, 90.99311828613281, 88.6338119506836, 79.3241195678711, 77.81040954589844, 76.27904510498047, 74.54589080810547, 68.68617248535156, 66.95494079589844, 65.45933532714844, 64.79324340820312, 62.89622497558594, 62.08100891113281, 61.05073547363281, 61.06211853027344, 58.696773529052734, 57.729122161865234, 57.52412796020508, 57.392601013183594, 53.51804733276367, 53.08519744873047, 81.03302001953125, 466.35260009765625, 629.77294921875, 272.4296569824219, 229.77696228027344, 524.4228515625, 169.0817413330078, 106.43704223632812, 468.2314453125, 321.1058044433594, 72.86363220214844, 215.64427185058594, 420.0905456542969, 254.936279296875, 238.94183349609375, 170.37852478027344, 161.82167053222656, 350.8217468261719, 510.25213623046875, 280.4100646972656, 479.9981384277344, 199.64524841308594, 294.40740966796875, 258.040771484375, 376.53106689453125, 509.9411315917969, 1114.2279052734375, 256.09857177734375, 426.6061096191406, 319.6000671386719, 739.0277099609375, 280.2876281738281, 489.2537536621094, 542.6870727539062, 517.612060546875, 617.3828125, 513.236083984375, 436.5743408203125, 490.99383544921875, 506.68548583984375, 460.2646179199219, 441.2579650878906, 394.2334899902344, 351.31146240234375, 347.7322082519531, 353.1181640625, 336.91925048828125, 275.0069580078125, 206.27684020996094, 205.90945434570312, 185.4871826171875, 142.34490966796875, 138.4669952392578, 125.22058868408203, 124.95114135742188, 113.3163070678711, 111.33777618408203, 109.3900375366211, 105.71350860595703, 106.33345794677734, 292.8968505859375, 101.52547454833984, 98.16709899902344, 98.09191131591797, 96.69923400878906, 95.24166107177734, 93.9153823852539, 90.94029998779297, 90.11663055419922, 204.05540466308594, 83.51455688476562, 83.17984008789062, 82.09905242919922, 80.06827545166016, 80.04055786132812, 78.980224609375, 77.4798812866211, 624.8594970703125, 218.5560302734375, 299.7873840332031, 218.3317108154297, 189.689208984375, 356.6500244140625, 202.47463989257812, 417.00213623046875, 238.63824462890625, 212.27218627929688, 149.84323120117188, 211.9496612548828, 303.9140319824219, 120.32109832763672, 237.6540069580078, 454.90960693359375, 334.02545166015625, 980.60107421875, 485.4506530761719, 911.4451293945312, 590.2950439453125, 261.2230529785156, 253.1405487060547, 366.6529846191406, 366.9601745605469, 261.4512939453125, 595.4712524414062, 534.0038452148438, 534.01806640625, 583.53955078125, 307.2271728515625, 439.3746337890625, 370.1558837890625, 337.7717590332031, 344.1768798828125, 325.05975341796875, 340.1703796386719, 337.7772521972656, 350.0632019042969, 294.64581298828125, 276.3277282714844, 278.6572570800781, 1160.9132080078125, 424.62060546875, 361.99005126953125, 388.82080078125, 255.19793701171875, 223.3960723876953, 186.81495666503906, 150.93563842773438, 148.38706970214844, 142.3661346435547, 778.7778930664062, 125.96311950683594, 122.38629150390625, 113.5186538696289, 111.00336456298828, 117.1114730834961, 97.79452514648438, 95.15584564208984, 154.03953552246094, 85.85616302490234, 85.81739044189453, 83.90367126464844, 83.07220458984375, 81.03001403808594, 86.70967102050781, 72.22313690185547, 70.94837188720703, 66.05683135986328, 65.33727264404297, 61.60311508178711, 632.0007934570312, 967.30859375, 392.4784851074219, 86.92008972167969, 116.71688079833984, 384.4781188964844, 955.042724609375, 325.5193786621094, 154.01246643066406, 168.04747009277344, 886.2265014648438, 877.4567260742188, 327.182373046875, 468.3438720703125, 329.43048095703125, 302.31689453125, 346.5965576171875, 350.2645568847656, 277.72235107421875, 424.45953369140625, 266.9029541015625, 332.0311279296875, 578.3032836914062, 328.37042236328125, 429.90313720703125, 517.5341796875, 400.9313049316406, 346.2950439453125, 433.3561706542969, 421.4360656738281, 338.9404296875, 347.58477783203125, 348.44537353515625, 336.6087646484375, 398.3597717285156, 299.83258056640625, 164.6500701904297, 151.26080322265625, 134.79344177246094, 134.80828857421875, 128.793701171875, 120.1890640258789, 119.80301666259766, 103.68548583984375, 93.05211639404297, 105.72232055664062, 91.11929321289062, 88.88138580322266, 86.48152923583984, 83.19112396240234, 82.55461120605469, 76.6363754272461, 73.92579650878906, 137.45323181152344, 73.58349609375, 73.43082427978516, 297.8049011230469, 71.5206298828125, 71.5206298828125, 71.3747329711914, 68.60582733154297, 70.64566802978516, 67.04659271240234, 64.61957550048828, 137.57745361328125, 329.9684753417969, 498.6695861816406, 418.2132568359375, 321.6349182128906, 192.26394653320312, 436.7302551269531, 120.439208984375, 101.71742248535156, 189.6542205810547, 107.88106536865234, 180.2874298095703, 406.497802734375, 219.2530975341797, 311.04937744140625, 276.8253479003906, 364.5852966308594, 122.61643981933594, 431.5494079589844, 148.8873748779297, 478.0677490234375, 448.4655456542969, 560.1489868164062, 235.38340759277344, 220.0799560546875, 236.9700927734375, 525.8984985351562, 310.49981689453125, 195.21343994140625, 465.0462341308594, 342.694091796875, 343.89752197265625, 252.4918212890625, 252.31494140625, 359.3658447265625, 365.0567932128906, 297.0661926269531, 278.8648681640625, 264.2499084472656, 271.7898864746094, 266.98651123046875, 258.7191467285156, 836.8704223632812, 741.7591552734375, 348.10552978515625, 262.6591491699219, 234.72032165527344, 225.7039337158203, 214.6396026611328, 197.21083068847656, 176.1952667236328, 163.72848510742188, 159.68936157226562, 156.55722045898438, 155.55181884765625, 147.1693572998047, 143.7874298095703, 151.92002868652344, 140.55010986328125, 133.0448760986328, 131.79173278808594, 122.37577819824219, 118.65946197509766, 115.63384246826172, 112.4041748046875, 112.22483825683594, 111.79792022705078, 119.11126708984375, 102.07164001464844, 93.44534301757812, 92.23983764648438, 89.7243881225586, 218.44508361816406, 151.80226135253906, 955.4397583007812, 178.94818115234375, 1384.116455078125, 160.98158264160156, 191.5667724609375, 221.75938415527344, 157.25833129882812, 1290.715576171875, 920.77001953125, 312.8064880371094, 623.1017456054688, 397.7396240234375, 455.4387512207031, 379.9434814453125, 351.7613220214844, 356.9765625, 374.8453063964844, 212.81954956054688, 346.64404296875, 312.8064270019531, 333.1448669433594, 336.0579528808594, 600.3089599609375, 295.4515380859375, 283.6612548828125, 250.14752197265625, 267.23590087890625, 330.6805114746094, 358.020263671875, 262.1649475097656, 242.10182189941406], \"Term\": [\"window\", \"game\", \"christian\", \"team\", \"drive\", \"file\", \"space\", \"encrypt\", \"govern\", \"chip\", \"jesus\", \"israel\", \"card\", \"play\", \"secur\", \"nasa\", \"armenian\", \"program\", \"isra\", \"imag\", \"peopl\", \"hockey\", \"player\", \"clipper\", \"public\", \"disk\", \"year\", \"scsi\", \"driver\", \"bike\", \"armenian\", \"turkish\", \"turk\", \"turkey\", \"armenia\", \"koresh\", \"nazi\", \"militia\", \"serdar\", \"argic\", \"genocid\", \"davidian\", \"troop\", \"murder\", \"mormon\", \"prison\", \"massacr\", \"azeri\", \"ethnic\", \"azerbaijani\", \"hitler\", \"iran\", \"zuma\", \"sdpa\", \"motto\", \"azerbaijan\", \"extermin\", \"sera\", \"urartu\", \"slaughter\", \"villag\", \"batf\", \"greek\", \"greec\", \"jew\", \"soldier\", \"kill\", \"waco\", \"arm\", \"countri\", \"muslim\", \"children\", \"armi\", \"popul\", \"peopl\", \"anti\", \"govern\", \"right\", \"attack\", \"say\", \"polit\", \"death\", \"state\", \"live\", \"go\", \"come\", \"tell\", \"happen\", \"forc\", \"world\", \"time\", \"nation\", \"want\", \"leav\", \"start\", \"year\", \"take\", \"jesus\", \"bibl\", \"atheist\", \"atheism\", \"christ\", \"scriptur\", \"cathol\", \"sandvik\", \"doctrin\", \"revel\", \"biblic\", \"satan\", \"atho\", \"livesey\", \"prophet\", \"divin\", \"vers\", \"gospel\", \"sabbath\", \"god\", \"sin\", \"resurrect\", \"solntz\", \"testament\", \"theolog\", \"propheci\", \"theist\", \"schneider\", \"jaeger\", \"marriag\", \"christian\", \"church\", \"belief\", \"faith\", \"worship\", \"contradict\", \"moral\", \"religion\", \"lord\", \"heaven\", \"holi\", \"rutger\", \"truth\", \"spirit\", \"teach\", \"islam\", \"believ\", \"etern\", \"argument\", \"exist\", \"religi\", \"evid\", \"word\", \"love\", \"life\", \"claim\", \"mean\", \"peopl\", \"true\", \"accept\", \"say\", \"question\", \"reason\", \"thing\", \"person\", \"come\", \"good\", \"read\", \"time\", \"point\", \"follow\", \"motif\", \"widget\", \"xterm\", \"visual\", \"xlib\", \"polygon\", \"baalk\", \"contrib\", \"toolkit\", \"kelvin\", \"pyron\", \"suno\", \"deskjet\", \"xpert\", \"plaintext\", \"skndiv\", \"openwindow\", \"xview\", \"ether\", \"quicktim\", \"magellan\", \"utah\", \"greenbelt\", \"reilli\", \"ualberta\", \"copper\", \"ciphertext\", \"autom\", \"gradi\", \"dillon\", \"font\", \"handbook\", \"binari\", \"server\", \"client\", \"librari\", \"imag\", \"anonym\", \"compil\", \"resourc\", \"graphic\", \"map\", \"applic\", \"archiv\", \"user\", \"code\", \"avail\", \"directori\", \"sourc\", \"file\", \"mail\", \"list\", \"program\", \"function\", \"format\", \"email\", \"inform\", \"version\", \"softwar\", \"includ\", \"send\", \"data\", \"internet\", \"address\", \"display\", \"window\", \"copi\", \"access\", \"distribut\", \"thank\", \"look\", \"book\", \"group\", \"need\", \"scsi\", \"simm\", \"motherboard\", \"cach\", \"bio\", \"quadra\", \"diamond\", \"vram\", \"vesa\", \"centri\", \"swap\", \"upgrad\", \"char\", \"eisa\", \"intercon\", \"nubus\", \"ethernet\", \"svga\", \"amanda\", \"meg\", \"cadr\", \"mous\", \"maxtor\", \"config\", \"cica\", \"tiff\", \"adaptec\", \"powerbook\", \"ctrl\", \"esdi\", \"jumper\", \"floppi\", \"disk\", \"umich\", \"video\", \"modem\", \"card\", \"output\", \"monitor\", \"mode\", \"printer\", \"spec\", \"entri\", \"drive\", \"driver\", \"port\", \"instal\", \"memori\", \"window\", \"color\", \"appl\", \"byte\", \"screen\", \"board\", \"problem\", \"machin\", \"file\", \"thank\", \"control\", \"work\", \"speed\", \"need\", \"hard\", \"help\", \"program\", \"want\", \"time\", \"repli\", \"softwar\", \"distribut\", \"alaska\", \"spencer\", \"oracl\", \"dseg\", \"aurora\", \"nsmca\", \"engr\", \"launch\", \"uoknor\", \"callison\", \"kaldi\", \"zoolog\", \"mccall\", \"ucsc\", \"hallam\", \"lunar\", \"automot\", \"raider\", \"theodor\", \"dock\", \"shafer\", \"mksol\", \"hydro\", \"ssto\", \"plymouth\", \"redesign\", \"laughter\", \"rockwel\", \"desi\", \"stimulus\", \"moon\", \"henri\", \"mar\", \"job\", \"wheel\", \"billion\", \"invest\", \"spacecraft\", \"orbit\", \"nasa\", \"space\", \"shuttl\", \"satellit\", \"fund\", \"probe\", \"flight\", \"helmet\", \"station\", \"solar\", \"presid\", \"mission\", \"earth\", \"cost\", \"money\", \"vehicl\", \"year\", \"work\", \"project\", \"toronto\", \"spend\", \"go\", \"time\", \"engin\", \"long\", \"high\", \"power\", \"thing\", \"say\", \"look\", \"peopl\", \"program\", \"want\", \"need\", \"design\", \"build\", \"firearm\", \"bike\", \"motorcycl\", \"magnus\", \"rider\", \"honda\", \"veal\", \"utkvm\", \"centerlin\", \"cactus\", \"rkba\", \"harley\", \"shotgun\", \"pistol\", \"ranck\", \"boyl\", \"husc\", \"ifa\", \"smuggl\", \"fischer\", \"counterst\", \"armori\", \"trunk\", \"thomasp\", \"imak\", \"photographi\", \"concordia\", \"tennesse\", \"yamaha\", \"frost\", \"car\", \"ohio\", \"uchicago\", \"rid\", \"gun\", \"brake\", \"shaft\", \"cwru\", \"auto\", \"wagon\", \"handgun\", \"cleveland\", \"ride\", \"tire\", \"urbana\", \"midway\", \"insur\", \"uiuc\", \"dealer\", \"weapon\", \"iastat\", \"owner\", \"illinoi\", \"crime\", \"price\", \"state\", \"freenet\", \"sell\", \"buy\", \"good\", \"road\", \"drive\", \"right\", \"look\", \"peopl\", \"want\", \"case\", \"thing\", \"time\", \"go\", \"distribut\", \"repli\", \"engin\", \"opinion\", \"problem\", \"need\", \"gatech\", \"cub\", \"fnal\", \"prism\", \"hitter\", \"pitcher\", \"alomar\", \"uicvm\", \"higgin\", \"inning\", \"revolv\", \"hulman\", \"yanke\", \"pitch\", \"catcher\", \"dodger\", \"blast\", \"starter\", \"tiger\", \"met\", \"bat\", \"nore\", \"outlet\", \"rocki\", \"jay\", \"sdsu\", \"volt\", \"lopez\", \"restaur\", \"lamp\", \"wire\", \"duke\", \"circuit\", \"batteri\", \"brave\", \"basebal\", \"hit\", \"berkeley\", \"jason\", \"ball\", \"metal\", \"jeff\", \"grind\", \"larc\", \"indiana\", \"netcom\", \"colorado\", \"year\", \"run\", \"good\", \"game\", \"smith\", \"scott\", \"player\", \"home\", \"stanford\", \"look\", \"distribut\", \"go\", \"time\", \"lose\", \"come\", \"start\", \"play\", \"david\", \"best\", \"better\", \"power\", \"thing\", \"john\", \"sale\", \"great\", \"encrypt\", \"escrow\", \"privaci\", \"ripem\", \"crypto\", \"wiretap\", \"cryptographi\", \"cipher\", \"decrypt\", \"hamburg\", \"clipper\", \"homicid\", \"bontchev\", \"gtoal\", \"crypt\", \"clarkson\", \"rwing\", \"surveil\", \"nist\", \"sternlight\", \"den\", \"ncsl\", \"qualcomm\", \"fbihh\", \"cryptograph\", \"tampa\", \"mime\", \"vesselin\", \"lyme\", \"strnlght\", \"key\", \"secur\", \"enforc\", \"recipi\", \"classifi\", \"secret\", \"chip\", \"agenc\", \"patent\", \"scheme\", \"public\", \"govern\", \"algorithm\", \"protect\", \"propos\", \"administr\", \"privat\", \"clinton\", \"feder\", \"phone\", \"court\", \"devic\", \"number\", \"communic\", \"technolog\", \"inform\", \"provid\", \"author\", \"state\", \"right\", \"messag\", \"data\", \"peopl\", \"need\", \"diseas\", \"stratus\", \"dyer\", \"diet\", \"robi\", \"infect\", \"syndrom\", \"methodolog\", \"physician\", \"cure\", \"intellect\", \"einstein\", \"chopin\", \"candida\", \"sphere\", \"yeast\", \"chastiti\", \"halat\", \"therapi\", \"clinic\", \"migrain\", \"steveh\", \"patient\", \"catbyt\", \"dtmedin\", \"blah\", \"carlo\", \"superstit\", \"baerga\", \"homeopathi\", \"skeptic\", \"gordon\", \"pitt\", \"medic\", \"doctor\", \"medicin\", \"food\", \"cancer\", \"sleev\", \"ingr\", \"genet\", \"aid\", \"bank\", \"treatment\", \"water\", \"pain\", \"health\", \"handheld\", \"studi\", \"princeton\", \"caus\", \"effect\", \"scienc\", \"scientif\", \"rochest\", \"theori\", \"point\", \"result\", \"risk\", \"problem\", \"research\", \"case\", \"steve\", \"test\", \"time\", \"peopl\", \"repli\", \"take\", \"differ\", \"year\", \"say\", \"thing\", \"isra\", \"hockey\", \"playoff\", \"palestinian\", \"detroit\", \"leaf\", \"cramer\", \"optilink\", \"pen\", \"cunixb\", \"lebanes\", \"penguin\", \"clayton\", \"jake\", \"maynard\", \"espn\", \"edmonton\", \"ericsson\", \"boni\", \"lemieux\", \"gaza\", \"puck\", \"bruin\", \"selann\", \"laurentian\", \"quebec\", \"ramsey\", \"canuck\", \"shark\", \"uvic\", \"montreal\", \"flyer\", \"israel\", \"stanley\", \"team\", \"jet\", \"coach\", \"ranger\", \"winnipeg\", \"game\", \"play\", \"wing\", \"player\", \"columbia\", \"season\", \"leagu\", \"pittsburgh\", \"score\", \"arab\", \"mcgill\", \"goal\", \"virginia\", \"toronto\", \"andrew\", \"year\", \"divis\", \"canada\", \"period\", \"final\", \"point\", \"time\", \"american\", \"go\"], \"Total\": [2966.0, 1940.0, 1924.0, 1689.0, 2638.0, 2883.0, 1860.0, 1161.0, 1997.0, 1477.0, 1274.0, 1017.0, 1577.0, 1423.0, 1059.0, 1331.0, 1142.0, 2599.0, 837.0, 1391.0, 6052.0, 742.0, 990.0, 784.0, 1802.0, 1023.0, 4004.0, 867.0, 1191.0, 747.0, 1142.9583740234375, 698.9558715820312, 407.7272644042969, 376.1419677734375, 366.1116027832031, 325.846923828125, 318.256103515625, 294.6385803222656, 243.81558227539062, 243.53146362304688, 239.4801788330078, 223.58860778808594, 220.15757751464844, 499.85150146484375, 183.81178283691406, 190.03121948242188, 181.68017578125, 168.52059936523438, 170.9886474609375, 163.3725128173828, 156.9473876953125, 153.92347717285156, 148.33285522460938, 145.86817932128906, 144.91348266601562, 143.45306396484375, 140.92027282714844, 138.17529296875, 112.54084014892578, 112.26637268066406, 299.7375183105469, 239.29400634765625, 575.2765502929688, 235.9622802734375, 846.9027709960938, 310.8525390625, 1292.4876708984375, 203.65432739257812, 568.353271484375, 904.962890625, 498.3378601074219, 821.7328491210938, 317.7273254394531, 442.4293212890625, 6052.71826171875, 470.1575927734375, 1997.7261962890625, 3614.68310546875, 771.352294921875, 4395.67724609375, 753.4012451171875, 729.086181640625, 3490.054931640625, 1666.260986328125, 3510.730712890625, 3362.533203125, 2458.84814453125, 1374.8798828125, 910.499755859375, 2752.30859375, 5183.146484375, 1404.34228515625, 3617.8427734375, 1561.9661865234375, 1909.119873046875, 4004.7578125, 1884.1258544921875, 1274.8072509765625, 844.0818481445312, 688.539794921875, 379.0483093261719, 601.0935668945312, 285.09393310546875, 265.8420715332031, 258.6253356933594, 234.29208374023438, 199.46600341796875, 197.48406982421875, 187.33848571777344, 186.6898651123047, 191.4882049560547, 161.5964813232422, 158.12852478027344, 148.4269561767578, 144.8557891845703, 142.2056884765625, 133.86817932128906, 133.62254333496094, 137.21395874023438, 135.0694580078125, 123.30796813964844, 118.57750701904297, 111.64559173583984, 104.27090454101562, 104.75077056884766, 103.53997039794922, 192.9781494140625, 1924.27099609375, 744.6122436523438, 604.4033203125, 642.59033203125, 209.4973907470703, 250.70823669433594, 845.6991577148438, 828.4187622070312, 355.5498962402344, 287.80279541015625, 282.96514892578125, 442.15399169921875, 692.941650390625, 269.9664001464844, 446.063232421875, 578.8197021484375, 2561.731689453125, 282.8346862792969, 815.131103515625, 1699.9537353515625, 474.3492126464844, 965.217041015625, 1333.0904541015625, 902.1407470703125, 1251.4853515625, 1317.3157958984375, 2641.86328125, 6052.71826171875, 1353.2069091796875, 1006.9673461914062, 4395.67724609375, 2872.182373046875, 1977.921142578125, 3329.212646484375, 2056.0078125, 3362.533203125, 3754.421630859375, 2277.20947265625, 5183.146484375, 2646.791748046875, 1892.4102783203125, 514.4351806640625, 479.50714111328125, 262.1397399902344, 305.83587646484375, 182.9683837890625, 165.35598754882812, 159.36215209960938, 152.93394470214844, 138.76898193359375, 136.0535125732422, 118.18011474609375, 102.43084716796875, 101.44613647460938, 95.46444702148438, 94.97850036621094, 93.73173522949219, 89.39283752441406, 85.96602630615234, 78.7806625366211, 77.0969467163086, 75.67371368408203, 77.94976806640625, 67.175048828125, 66.74057006835938, 63.496917724609375, 62.537330627441406, 57.57563018798828, 57.55217742919922, 57.37797546386719, 57.14778137207031, 448.4683532714844, 58.572509765625, 180.8592987060547, 872.3430786132812, 374.06121826171875, 495.9429626464844, 1391.43896484375, 440.9508361816406, 358.4921875, 426.1166076660156, 1054.60791015625, 199.59127807617188, 1032.4814453125, 440.00604248046875, 1078.350341796875, 1021.1267700195312, 1669.3359375, 441.453857421875, 1374.5584716796875, 2883.885009765625, 2375.208984375, 1560.8458251953125, 2599.861083984375, 691.8548583984375, 736.162841796875, 1159.2723388671875, 2169.24072265625, 1621.163818359375, 1630.7625732421875, 2103.295166015625, 1606.180419921875, 1650.9979248046875, 1085.847412109375, 1067.4688720703125, 839.1293334960938, 2966.575439453125, 872.5662231445312, 1443.37353515625, 3038.84619140625, 2288.467041015625, 3375.03759765625, 1421.1026611328125, 1956.768310546875, 3517.123046875, 867.474609375, 317.6370849609375, 250.2078857421875, 230.81463623046875, 229.64767456054688, 212.46270751953125, 183.9412384033203, 167.1034393310547, 165.70335388183594, 156.47067260742188, 158.83648681640625, 362.0737609863281, 134.3785400390625, 125.08387756347656, 123.22496032714844, 117.94927215576172, 112.17121124267578, 111.74752807617188, 110.07601928710938, 104.12238311767578, 99.82821655273438, 519.7879028320312, 90.54007720947266, 83.6605224609375, 82.62821197509766, 104.4683609008789, 76.17040252685547, 76.12688446044922, 71.69654846191406, 70.25760650634766, 287.13433837890625, 317.7306213378906, 1023.171630859375, 213.97854614257812, 736.9544067382812, 385.19146728515625, 1577.8919677734375, 487.7062683105469, 681.5418701171875, 651.6162719726562, 414.86236572265625, 202.35662841796875, 773.6254272460938, 2638.13232421875, 1191.0015869140625, 521.5247192382812, 771.9718017578125, 825.6636962890625, 2966.575439453125, 979.6791381835938, 877.6451416015625, 316.51470947265625, 603.8773803710938, 656.5188598632812, 3254.474609375, 1051.1627197265625, 2883.885009765625, 2288.467041015625, 1818.994384765625, 3998.2919921875, 901.1752319335938, 3517.123046875, 1391.7735595703125, 2348.58544921875, 2599.861083984375, 3617.8427734375, 5183.146484375, 2732.19384765625, 1630.7625732421875, 3038.84619140625, 267.0453796386719, 172.00009155273438, 156.51791381835938, 228.30894470214844, 132.46392822265625, 111.54907989501953, 110.62195587158203, 480.2484436035156, 124.94286346435547, 97.43895721435547, 91.60369873046875, 87.82199096679688, 85.66326904296875, 85.5849838256836, 84.04283142089844, 251.9351348876953, 74.35344696044922, 71.57764434814453, 71.21640014648438, 69.74593353271484, 67.621826171875, 66.79296875, 61.51911544799805, 61.20405960083008, 60.507171630859375, 60.3464469909668, 60.049827575683594, 59.223548889160156, 58.72600173950195, 58.32766342163086, 415.9969177246094, 351.1897888183594, 197.73948669433594, 259.179931640625, 170.87942504882812, 275.1635437011719, 144.31858825683594, 174.99098205566406, 592.9318237304688, 1331.52294921875, 1860.757080078125, 257.59454345703125, 337.9649353027344, 441.3335266113281, 216.22386169433594, 284.1152038574219, 205.7539520263672, 455.2716064453125, 191.22592163085938, 874.0577392578125, 344.72601318359375, 726.9236450195312, 1014.5396728515625, 862.5274658203125, 336.988525390625, 4004.7578125, 3998.2919921875, 641.9602661132812, 701.0911865234375, 556.97900390625, 3510.730712890625, 5183.146484375, 1432.9891357421875, 1579.425048828125, 1517.998779296875, 1785.55322265625, 3329.212646484375, 4395.67724609375, 3375.03759765625, 6052.71826171875, 2599.861083984375, 3617.8427734375, 3517.123046875, 1000.6277465820312, 1483.8935546875, 495.75604248046875, 747.6323852539062, 325.6590576171875, 302.3562316894531, 244.9889373779297, 158.984375, 108.27942657470703, 95.92851257324219, 100.2811050415039, 91.90436553955078, 89.54524993896484, 80.2354736328125, 78.72178649902344, 77.19053649902344, 75.45713806152344, 69.597412109375, 67.86634826660156, 66.37062072753906, 65.70732879638672, 63.8077507019043, 62.99225997924805, 61.962032318115234, 61.97679901123047, 59.60800552368164, 58.64104080200195, 58.435726165771484, 58.304039001464844, 54.42936325073242, 53.9964599609375, 82.42547607421875, 485.2928161621094, 668.453857421875, 284.9857482910156, 240.66868591308594, 577.3370971679688, 179.90098571777344, 111.21246337890625, 528.9305419921875, 357.5130920410156, 74.67018127441406, 242.34796142578125, 502.91082763671875, 297.4255065917969, 281.2111511230469, 192.33499145507812, 183.03675842285156, 466.62225341796875, 750.7398681640625, 366.5124206542969, 724.8843994140625, 250.30677795410156, 415.81964111328125, 353.0357971191406, 657.6669921875, 1070.5751953125, 3490.054931640625, 395.5933837890625, 983.7587890625, 606.9414672851562, 3754.421630859375, 598.3028564453125, 2638.13232421875, 3614.68310546875, 3375.03759765625, 6052.71826171875, 3617.8427734375, 2113.20703125, 3329.212646484375, 5183.146484375, 3510.730712890625, 3038.84619140625, 2732.19384765625, 1432.9891357421875, 1407.867431640625, 3254.474609375, 3517.123046875, 275.9194030761719, 207.18922424316406, 206.8258819580078, 186.39959716796875, 143.2572784423828, 139.37933349609375, 126.13304901123047, 125.86357116699219, 114.22874450683594, 112.2500991821289, 110.30248260498047, 106.6259765625, 107.28164672851562, 295.5258483886719, 102.43778991699219, 99.07945251464844, 99.00546264648438, 97.61188507080078, 96.15435791015625, 94.82772827148438, 91.85266876220703, 91.02910614013672, 206.18264770507812, 84.4303970336914, 84.09229278564453, 83.01145935058594, 80.98065185546875, 80.95291900634766, 79.89276885986328, 78.3923110961914, 639.2734985351562, 227.38116455078125, 323.03533935546875, 231.72528076171875, 201.03939819335938, 428.90643310546875, 227.24929809570312, 525.6275634765625, 277.0840148925781, 257.5661926269531, 175.59457397460938, 284.0149841308594, 476.76812744140625, 133.43386840820312, 365.1957092285156, 1031.8046875, 640.5604858398438, 4004.7578125, 1280.048828125, 3754.421630859375, 1940.664794921875, 488.3008117675781, 472.29498291015625, 990.5671997070312, 1023.2589111328125, 516.36962890625, 3375.03759765625, 3038.84619140625, 3510.730712890625, 5183.146484375, 818.5213623046875, 3362.533203125, 1909.119873046875, 1423.9302978515625, 1658.5966796875, 1346.392578125, 1717.5321044921875, 1785.55322265625, 3329.212646484375, 1491.183349609375, 990.2796630859375, 1542.3779296875, 1161.82763671875, 425.534912109375, 362.9170837402344, 390.07720947265625, 256.1122741699219, 224.3104248046875, 187.7305145263672, 151.85064697265625, 149.30140686035156, 143.2805633544922, 784.3641357421875, 126.87757873535156, 123.3006362915039, 114.4344482421875, 111.93732452392578, 118.14889526367188, 98.71028137207031, 96.07027435302734, 155.55857849121094, 86.7708511352539, 86.73173522949219, 84.81802368164062, 83.986572265625, 81.9443588256836, 87.70350646972656, 73.1382064819336, 71.86477661132812, 66.9711685180664, 66.25181579589844, 62.517635345458984, 659.2316284179688, 1059.598876953125, 429.4156188964844, 89.67327117919922, 124.43817138671875, 474.16644287109375, 1477.454345703125, 430.59686279296875, 178.9176788330078, 204.3567657470703, 1802.1553955078125, 1997.7261962890625, 534.6806030273438, 906.1632690429688, 556.0820922851562, 491.48968505859375, 613.686279296875, 662.98681640625, 470.2344665527344, 1022.1227416992188, 480.7737121582031, 730.9078369140625, 2365.543212890625, 763.0506591796875, 1372.5093994140625, 2169.24072265625, 1377.2835693359375, 1170.3818359375, 3490.054931640625, 3614.68310546875, 1280.4110107421875, 1650.9979248046875, 6052.71826171875, 3517.123046875, 399.2857971191406, 300.7450866699219, 165.56256103515625, 152.17401123046875, 135.70590209960938, 135.72186279296875, 129.70895385742188, 121.10151672363281, 120.7160415649414, 104.59820556640625, 93.9645767211914, 106.77874755859375, 92.03182983398438, 89.7938003540039, 87.39402770996094, 84.10354614257812, 83.46707916259766, 77.56388092041016, 74.8382339477539, 139.152099609375, 74.49637603759766, 74.3432388305664, 301.5867919921875, 72.43302154541016, 72.43302154541016, 72.28717041015625, 69.51831817626953, 71.5958480834961, 67.95915222167969, 65.53195190429688, 140.31385803222656, 354.61895751953125, 560.2183227539062, 467.14312744140625, 372.5074157714844, 214.2539520263672, 528.296142578125, 128.81614685058594, 106.81172180175781, 215.3028564453125, 114.34998321533203, 206.83787536621094, 542.55908203125, 263.95330810546875, 416.1339111328125, 361.6107177734375, 544.802734375, 136.71836853027344, 864.6985473632812, 185.2837677001953, 1192.0758056640625, 1098.331298828125, 1600.234375, 408.9527587890625, 366.5252685546875, 446.0223693847656, 2646.791748046875, 941.7721557617188, 342.3376159667969, 3254.474609375, 1469.76904296875, 2113.20703125, 866.40185546875, 975.51806640625, 5183.146484375, 6052.71826171875, 2732.19384765625, 1884.1258544921875, 2258.273681640625, 4004.7578125, 4395.67724609375, 3329.212646484375, 837.78271484375, 742.67138671875, 349.01776123046875, 263.5714416503906, 235.63259887695312, 226.6161651611328, 215.55186462402344, 198.12313842773438, 177.10752868652344, 164.64073181152344, 160.60159301757812, 157.46951293945312, 156.48275756835938, 148.0817413330078, 144.69972229003906, 152.8905792236328, 141.4651641845703, 133.9572296142578, 132.7042694091797, 123.28799438476562, 119.57171630859375, 116.54607391357422, 113.31639099121094, 113.13705444335938, 112.71014404296875, 120.09423065185547, 102.98385620117188, 94.35774230957031, 93.15208435058594, 90.63665008544922, 220.87405395507812, 153.73667907714844, 1017.056396484375, 185.59458923339844, 1689.568603515625, 167.19650268554688, 202.23321533203125, 240.0529327392578, 165.1607208251953, 1940.664794921875, 1423.9302978515625, 399.8851318359375, 990.5671997070312, 559.28369140625, 670.1260375976562, 536.8279418945312, 505.7823181152344, 528.27392578125, 572.500732421875, 254.3348388671875, 553.6993408203125, 544.2898559570312, 701.0911865234375, 868.338134765625, 4004.7578125, 693.4171142578125, 732.4398193359375, 584.5032348632812, 822.2951049804688, 2646.791748046875, 5183.146484375, 1242.2733154296875, 3510.730712890625], \"loglift\": [30.0, 29.0, 28.0, 27.0, 26.0, 25.0, 24.0, 23.0, 22.0, 21.0, 20.0, 19.0, 18.0, 17.0, 16.0, 15.0, 14.0, 13.0, 12.0, 11.0, 10.0, 9.0, 8.0, 7.0, 6.0, 5.0, 4.0, 3.0, 2.0, 1.0, 2.0255000591278076, 2.0250000953674316, 2.0241000652313232, 2.023900032043457, 2.0237998962402344, 2.0234999656677246, 2.023400068283081, 2.023200035095215, 2.022599935531616, 2.022599935531616, 2.0225000381469727, 2.022200107574463, 2.0220999717712402, 2.0216000080108643, 2.0213000774383545, 2.0213000774383545, 2.0213000774383545, 2.020900011062622, 2.020900011062622, 2.020699977874756, 2.0204999446868896, 2.02020001411438, 2.02020001411438, 2.0201001167297363, 2.0199999809265137, 2.0199999809265137, 2.0197999477386475, 2.019700050354004, 2.018199920654297, 2.018199920654297, 2.0153000354766846, 2.007200002670288, 1.9528000354766846, 1.9890999794006348, 1.8824000358581543, 1.958899974822998, 1.7970999479293823, 1.980299949645996, 1.819599986076355, 1.6779999732971191, 1.763100028038025, 1.6375999450683594, 1.8667999505996704, 1.781499981880188, 1.0757999420166016, 1.7408000230789185, 1.2894999980926514, 1.0536999702453613, 1.5706000328063965, 0.953000009059906, 1.4706000089645386, 1.4835000038146973, 0.7210999727249146, 1.080899953842163, 0.6299999952316284, 0.6431000232696533, 0.739799976348877, 1.0844999551773071, 1.3265000581741333, 0.5475999712944031, 0.0575999990105629, 0.9682999849319458, 0.27399998903274536, 0.847000002861023, 0.6578999757766724, -0.014100000262260437, 0.5697000026702881, 2.0452001094818115, 2.044800043106079, 2.044600009918213, 2.0434999465942383, 2.0434000492095947, 2.0427000522613525, 2.0425000190734863, 2.0423998832702637, 2.0420000553131104, 2.041300058364868, 2.0411999225616455, 2.0409998893737793, 2.0409998893737793, 2.040600061416626, 2.0401999950408936, 2.04010009765625, 2.0397000312805176, 2.039599895477295, 2.0394999980926514, 2.039099931716919, 2.039099931716919, 2.0390000343322754, 2.038599967956543, 2.0385000705718994, 2.0381999015808105, 2.0376999378204346, 2.037100076675415, 2.036900043487549, 2.036900043487549, 2.0364999771118164, 2.031899929046631, 2.0318000316619873, 2.0308001041412354, 2.023099899291992, 2.032900094985962, 2.0308001041412354, 1.9905999898910522, 1.9452999830245972, 1.989799976348877, 1.9884999990463257, 1.9830000400543213, 1.9407999515533447, 1.858199954032898, 1.9696999788284302, 1.882599949836731, 1.8200000524520874, 1.5154999494552612, 1.9495999813079834, 1.700600028038025, 1.5044000148773193, 1.7956000566482544, 1.5720000267028809, 1.4508999586105347, 1.5461000204086304, 1.4234000444412231, 1.3523000478744507, 1.0579999685287476, 0.6973999738693237, 1.2980999946594238, 1.399399995803833, 0.6687999963760376, 0.859000027179718, 1.0434000492095947, 0.6948999762535095, 0.9133999943733215, 0.5392000079154968, 0.31630000472068787, 0.7174999713897705, 0.003100000089034438, 0.583899974822998, 0.8629000186920166, 2.0806000232696533, 2.0804998874664307, 2.078900098800659, 2.0778000354766846, 2.077399969100952, 2.076900005340576, 2.07669997215271, 2.0764999389648438, 2.075900077819824, 2.075700044631958, 2.074700117111206, 2.073499917984009, 2.0734000205993652, 2.0729000568389893, 2.0727999210357666, 2.072700023651123, 2.072200059890747, 2.0717999935150146, 2.0708000659942627, 2.0706000328063965, 2.0703999996185303, 2.0690999031066895, 2.0687999725341797, 2.068700075149536, 2.068000078201294, 2.0678000450134277, 2.066499948501587, 2.066499948501587, 2.066499948501587, 2.0664000511169434, 2.048099994659424, 2.0662999153137207, 2.051500082015991, 2.0102999210357666, 2.0225000381469727, 2.0088999271392822, 1.9707000255584717, 1.979200005531311, 1.96589994430542, 1.9251999855041504, 1.827299952507019, 1.9740999937057495, 1.774999976158142, 1.864400029182434, 1.742799997329712, 1.7106000185012817, 1.6004999876022339, 1.8174999952316284, 1.6053999662399292, 1.4670000076293945, 1.4729000329971313, 1.556399941444397, 1.423699975013733, 1.6994999647140503, 1.6755000352859497, 1.545199990272522, 1.365399956703186, 1.440500020980835, 1.4234000444412231, 1.3454999923706055, 1.3897000551223755, 1.3384000062942505, 1.4632999897003174, 1.4599000215530396, 1.5799000263214111, 0.9276000261306763, 1.5184999704360962, 1.176200032234192, 0.499099999666214, 0.7235000133514404, 0.3797000050544739, 1.0924999713897705, 0.7401999831199646, 0.15479999780654907, 2.1196000576019287, 2.1177000999450684, 2.117000102996826, 2.1166999340057373, 2.1166000366210938, 2.116300106048584, 2.115600109100342, 2.1150999069213867, 2.1150999069213867, 2.114799976348877, 2.1147000789642334, 2.114000082015991, 2.113800048828125, 2.113300085067749, 2.1131999492645264, 2.1129000186920166, 2.112499952316284, 2.1124000549316406, 2.112299919128418, 2.111799955368042, 2.1113998889923096, 2.1108999252319336, 2.1105000972747803, 2.1096999645233154, 2.109499931335449, 2.1089000701904297, 2.108599901199341, 2.108599901199341, 2.107800006866455, 2.1075000762939453, 2.101799964904785, 2.099600076675415, 2.0685999393463135, 2.092400074005127, 2.0650999546051025, 2.073899984359741, 2.0125999450683594, 2.021399974822998, 2.000699996948242, 2.0023000240325928, 2.0262999534606934, 2.0680999755859375, 1.9438999891281128, 1.8285000324249268, 1.8824000358581543, 1.9651000499725342, 1.9211000204086304, 1.8946000337600708, 1.7213000059127808, 1.8492000102996826, 1.8622000217437744, 2.00570011138916, 1.864300012588501, 1.8091000318527222, 1.291200041770935, 1.6136000156402588, 1.176200032234192, 1.246999979019165, 1.326200008392334, 0.973800003528595, 1.5801000595092773, 0.8787999749183655, 1.298699975013733, 0.9729999899864197, 0.7918999791145325, 0.4300999939441681, 0.10779999941587448, 0.5931000113487244, 0.991100013256073, 0.40450000762939453, 2.3443000316619873, 2.342400074005127, 2.3417999744415283, 2.341399908065796, 2.3408000469207764, 2.3394999504089355, 2.339400053024292, 2.3392999172210693, 2.338399887084961, 2.3382999897003174, 2.3376998901367188, 2.3373000621795654, 2.3369998931884766, 2.3369998931884766, 2.3368000984191895, 2.3361001014709473, 2.335400104522705, 2.33489990234375, 2.3348000049591064, 2.3345000743865967, 2.3341000080108643, 2.333899974822998, 2.3327999114990234, 2.33270001411438, 2.3324999809265137, 2.3324999809265137, 2.33240008354187, 2.332200050354004, 2.3320000171661377, 2.331899881362915, 2.321000099182129, 2.319499969482422, 2.3125, 2.2964000701904297, 2.3036000728607178, 2.281100034713745, 2.3059000968933105, 2.289400100708008, 2.218400001525879, 2.106600046157837, 2.063800096511841, 2.226300001144409, 2.183000087738037, 2.096299886703491, 2.19569993019104, 2.1347999572753906, 2.1861000061035156, 2.0332999229431152, 2.193000078201294, 1.8654999732971191, 2.0510001182556152, 1.8450000286102295, 1.6746000051498413, 1.5880000591278076, 1.9641000032424927, 0.8166999816894531, 0.7954000234603882, 1.6297999620437622, 1.572100043296814, 1.6842999458312988, 0.6661999821662903, 0.41440001130104065, 1.1360000371932983, 0.9230999946594238, 0.927299976348877, 0.77920001745224, 0.24959999322891235, -0.010900000110268593, 0.20020000636577606, -0.3833000063896179, 0.3409999907016754, 0.04670000076293945, 0.013500000350177288, 1.1301000118255615, 0.7407000064849854, 2.3550000190734863, 2.3548998832702637, 2.3541998863220215, 2.3541998863220215, 2.352099895477295, 2.3513998985290527, 2.3487000465393066, 2.347599983215332, 2.3473000526428223, 2.3471999168395996, 2.34689998626709, 2.3457999229431152, 2.3454999923706055, 2.3452999591827393, 2.3450000286102295, 2.3440001010894775, 2.3436999320983887, 2.343400001525879, 2.3431999683380127, 2.3427999019622803, 2.342600107192993, 2.342400074005127, 2.3422999382019043, 2.3417999744415283, 2.3415000438690186, 2.3415000438690186, 2.341399908065796, 2.3403000831604004, 2.3401999473571777, 2.340100049972534, 2.3173999786376953, 2.297600030899048, 2.3120999336242676, 2.3108999729156494, 2.2611000537872314, 2.2952001094818115, 2.3132998943328857, 2.235300064086914, 2.249799966812134, 2.33270001411438, 2.2404000759124756, 2.1772000789642334, 2.203000068664551, 2.1942999362945557, 2.2360000610351562, 2.2339999675750732, 2.071899890899658, 1.9709999561309814, 2.089400053024292, 1.9450000524520874, 2.13100004196167, 2.011899948120117, 2.0436999797821045, 1.7994999885559082, 1.6154999732971191, 1.215399980545044, 1.9223999977111816, 1.5217000246047974, 1.7158000469207764, 0.7318000197410583, 1.5988999605178833, 0.6722000241279602, 0.460999995470047, 0.4821999967098236, 0.07440000027418137, 0.4043000042438507, 0.7802000045776367, 0.4431000053882599, 0.03189999982714653, 0.3253999948501587, 0.4275999963283539, 0.4212999939918518, 0.9513000249862671, 0.9588000178337097, 0.13619999587535858, 0.011599999852478504, 2.4128000736236572, 2.4117000102996826, 2.411600112915039, 2.4112000465393066, 2.4096999168395996, 2.4094998836517334, 2.408799886703491, 2.408799886703491, 2.408099889755249, 2.407900094985962, 2.4077999591827393, 2.4075000286102295, 2.4072000980377197, 2.407099962234497, 2.407099962234497, 2.4068000316619873, 2.4068000316619873, 2.4066998958587646, 2.4065001010894775, 2.406399965286255, 2.406100034713745, 2.4059998989105225, 2.4056999683380127, 2.4052000045776367, 2.4052000045776367, 2.4049999713897705, 2.4047000408172607, 2.4047000408172607, 2.404599905014038, 2.404400110244751, 2.3933000564575195, 2.376499891281128, 2.341399908065796, 2.3564999103546143, 2.3580000400543213, 2.231600046157837, 2.300600051879883, 2.1846001148223877, 2.266700029373169, 2.2227001190185547, 2.257499933242798, 2.1233999729156494, 1.9658000469207764, 2.3125998973846436, 1.9865000247955322, 1.597100019454956, 1.7648999691009521, 1.0089999437332153, 1.4464999437332153, 1.0003999471664429, 1.2259000539779663, 1.7905000448226929, 1.7924000024795532, 1.4221999645233154, 1.3905999660491943, 1.7354999780654907, 0.6812999844551086, 0.6772000193595886, 0.5328999757766724, 0.23199999332427979, 1.4362000226974487, 0.38100001215934753, 0.775600016117096, 0.9772999882698059, 0.843500018119812, 0.9948999881744385, 0.7968999743461609, 0.7509999871253967, 0.16369999945163727, 0.7944999933242798, 1.1397000551223755, 0.7049999833106995, 2.539799928665161, 2.5383999347686768, 2.5380001068115234, 2.5373001098632812, 2.5369999408721924, 2.5364999771118164, 2.5357000827789307, 2.5344998836517334, 2.53439998626709, 2.5341999530792236, 2.533400058746338, 2.5332999229431152, 2.533099889755249, 2.5325000286102295, 2.5322000980377197, 2.5318000316619873, 2.5313000679016113, 2.5309998989105225, 2.5308001041412354, 2.5299999713897705, 2.5299999713897705, 2.5297000408172607, 2.529599905014038, 2.529400110244751, 2.5292000770568848, 2.5280001163482666, 2.5276999473571777, 2.5267999172210693, 2.526700019836426, 2.5257999897003174, 2.4983999729156494, 2.449399948120117, 2.4505999088287354, 2.509399890899658, 2.4765000343322754, 2.330899953842163, 2.104300022125244, 2.2607998847961426, 2.390700101852417, 2.3450000286102295, 1.8308000564575195, 1.7178000211715698, 2.0494000911712646, 1.8805999755859375, 2.0169999599456787, 2.0546000003814697, 1.9692000150680542, 1.902500033378601, 2.0139999389648438, 1.6618000268936157, 1.9521000385284424, 1.7515000104904175, 1.1318999528884888, 1.6973999738693237, 1.379699945449829, 1.1074999570846558, 1.30649995803833, 1.3228000402450562, 0.4544999897480011, 0.39149999618530273, 1.2115000486373901, 0.9824000000953674, -0.3142000138759613, 0.1941000074148178, 2.65339994430542, 2.6526999473571777, 2.6501998901367188, 2.6496999263763428, 2.6489999294281006, 2.6489999294281006, 2.6486001014709473, 2.648099899291992, 2.648099899291992, 2.646899938583374, 2.645900011062622, 2.6458001136779785, 2.645699977874756, 2.6454999446868896, 2.64520001411438, 2.6447999477386475, 2.644700050354004, 2.643699884414673, 2.643399953842163, 2.643399953842163, 2.643399953842163, 2.643399953842163, 2.6431000232696533, 2.6429998874664307, 2.6429998874664307, 2.6429998874664307, 2.6424999237060547, 2.6422998905181885, 2.642199993133545, 2.641700029373169, 2.635999917984009, 2.583699941635132, 2.539299964904785, 2.545099973678589, 2.5088999271392822, 2.5473999977111816, 2.465399980545044, 2.5885000228881836, 2.606800079345703, 2.528899908065796, 2.5975000858306885, 2.5183000564575195, 2.367000102996826, 2.4702000617980957, 2.3645999431610107, 2.3884999752044678, 2.253999948501587, 2.546799898147583, 1.9607000350952148, 2.437000036239624, 1.7419999837875366, 1.7599999904632568, 1.6059999465942383, 2.103300094604492, 2.1456000804901123, 2.0232999324798584, 1.0397000312805176, 1.5461000204086304, 2.0940001010894775, 0.710099995136261, 1.1996999979019165, 0.8400999903678894, 1.422700047492981, 1.3034000396728516, -0.013100000098347664, -0.1525000035762787, 0.4368000030517578, 0.745199978351593, 0.510200023651123, -0.03449999913573265, -0.14550000429153442, 0.10100000351667404, 2.7214999198913574, 2.721299886703491, 2.7200000286102295, 2.719099998474121, 2.7186999320983887, 2.7184998989105225, 2.7183001041412354, 2.7179999351501465, 2.717400074005127, 2.7170000076293945, 2.716900110244751, 2.7167999744415283, 2.716599941253662, 2.716399908065796, 2.7163000106811523, 2.716200113296509, 2.716099977493286, 2.7156999111175537, 2.7156999111175537, 2.715100049972534, 2.714900016784668, 2.7146999835968018, 2.7144999504089355, 2.7144999504089355, 2.7144999504089355, 2.714400053024292, 2.71370005607605, 2.712899923324585, 2.7126998901367188, 2.7125000953674316, 2.7114999294281006, 2.70989990234375, 2.660099983215332, 2.6861000061035156, 2.523200035095215, 2.6847000122070312, 2.6684000492095947, 2.6433000564575195, 2.6735000610351562, 2.31469988822937, 2.286600112915039, 2.4769999980926514, 2.259000062942505, 2.381700038909912, 2.336400032043457, 2.3768999576568604, 2.3594000339508057, 2.3306000232696533, 2.299099922180176, 2.5443999767303467, 2.254300117492676, 2.1686999797821045, 1.9785000085830688, 1.773300051689148, 0.8248000144958496, 1.8694000244140625, 1.7740000486373901, 1.873900055885315, 1.5986000299453735, 0.6425999999046326, 0.05000000074505806, 1.1669000387191772, 0.04839999973773956], \"logprob\": [30.0, 29.0, 28.0, 27.0, 26.0, 25.0, 24.0, 23.0, 22.0, 21.0, 20.0, 19.0, 18.0, 17.0, 16.0, 15.0, 14.0, 13.0, 12.0, 11.0, 10.0, 9.0, 8.0, 7.0, 6.0, 5.0, 4.0, 3.0, 2.0, 1.0, -4.882199764251709, -5.374499797821045, -5.914400100708008, -5.995299816131592, -6.022299766540527, -6.139200210571289, -6.162799835205078, -6.240099906921387, -6.430099964141846, -6.431300163269043, -6.4481000900268555, -6.517099857330322, -6.532599925994873, -5.713200092315674, -6.713799953460693, -6.680600166320801, -6.725599765777588, -6.80109977722168, -6.786600112915039, -6.832300186157227, -6.872700214385986, -6.892399787902832, -6.929500102996826, -6.946300029754639, -6.952899932861328, -6.963099956512451, -6.981100082397461, -7.000899791717529, -7.207600116729736, -7.210000038146973, -6.230899810791016, -6.464200019836426, -5.641499996185303, -6.496399879455566, -5.325099945068359, -6.250899791717529, -4.987599849700928, -6.652400016784668, -5.7866997718811035, -5.463200092315674, -5.974699974060059, -5.600100040435791, -6.321100234985352, -6.075300216674805, -4.164999961853027, -6.055200099945068, -5.059800148010254, -4.702600002288818, -5.730299949645996, -4.607699871063232, -5.853899955749512, -5.873799800872803, -5.070400238037109, -5.449900150299072, -5.1554999351501465, -5.1855998039245605, -5.401899814605713, -5.638400077819824, -5.808599948883057, -5.481299877166748, -5.3383002281188965, -5.733500003814697, -5.481500148773193, -5.7484002113342285, -5.736800193786621, -5.668000221252441, -5.838200092315674, -4.753300189971924, -5.165999889373779, -5.369900226593018, -5.967899799346924, -5.506999969482422, -6.253600120544434, -6.323699951171875, -6.35129976272583, -6.450500011444092, -6.612100124359131, -6.622200012207031, -6.675099849700928, -6.678599834442139, -6.653600215911865, -6.823699951171875, -6.845600128173828, -6.909299850463867, -6.933800220489502, -6.952300071716309, -7.013199806213379, -7.014999866485596, -6.98859977722168, -7.004700183868408, -7.095900058746338, -7.135300159454346, -7.196100234985352, -7.264999866485596, -7.2606000900268555, -7.272200107574463, -6.650000095367432, -4.354899883270264, -5.3043999671936035, -5.513999938964844, -5.460400104522705, -6.571499824523926, -6.394000053405762, -5.218299865722656, -5.284299850463867, -6.085599899291992, -6.298299789428711, -6.320799827575684, -5.9166998863220215, -5.550000190734863, -6.38100004196167, -5.966000080108643, -5.768099784851074, -4.58519983291626, -6.354599952697754, -5.545199871063232, -5.00629997253418, -5.991600036621094, -5.504700183868408, -5.3028998374938965, -5.598199844360352, -5.393599987030029, -5.41349983215332, -5.011899948120117, -4.543399810791016, -5.440800189971924, -5.635000228881836, -4.891900062561035, -5.127299785614014, -5.315899848937988, -5.143700122833252, -5.407100200653076, -5.2895002365112305, -5.402100086212158, -5.500899791717529, -5.3927998542785645, -5.484099864959717, -5.540599822998047, -5.625400066375732, -5.695799827575684, -6.301300048828125, -6.148200035095215, -6.662399768829346, -6.764100074768066, -6.801199913024902, -6.842599868774414, -6.940400123596191, -6.960299968719482, -7.102200031280518, -7.246399879455566, -7.256100177764893, -7.317500114440918, -7.3225998878479, -7.335999965667725, -7.383800029754639, -7.423299789428711, -7.511600017547607, -7.533400058746338, -7.552299976348877, -7.52400016784668, -7.672999858856201, -7.679500102996826, -7.730100154876709, -7.745500087738037, -7.829500198364258, -7.829899787902832, -7.832900047302246, -7.836999893188477, -5.795100212097168, -7.8125, -6.699900150299072, -5.167600154876709, -6.002200126647949, -5.733699798583984, -4.740300178527832, -5.880899906158447, -6.10129976272583, -5.969099998474121, -5.160900115966797, -6.678699970245361, -5.234300136566162, -5.997900009155273, -5.223100185394287, -5.309899806976318, -4.928400039672852, -6.041500091552734, -5.117800235748291, -4.515200138092041, -4.7032999992370605, -5.03980016708374, -4.662199974060059, -5.71019983291626, -5.6722002029418945, -5.348400115966797, -4.901500225067139, -5.117700099945068, -5.128900051116943, -4.952400207519531, -5.177800178527832, -5.201499938964844, -5.495699882507324, -5.51609992980957, -5.6367998123168945, -5.026400089263916, -5.65910005569458, -5.4980998039245605, -5.430799961090088, -5.4899001121521, -5.445300102233887, -5.597400188446045, -5.629899978637695, -5.628900051116943, -5.063899993896484, -6.070400238037109, -6.309800148010254, -6.3907999992370605, -6.395899772644043, -6.473999977111816, -6.618800163269043, -6.7153000831604, -6.723800182342529, -6.781499862670898, -6.766499996185303, -5.94320011138916, -6.934599876403809, -7.006800174713135, -7.021900177001953, -7.065999984741211, -7.116600036621094, -7.1203999519348145, -7.1356000900268555, -7.191699981689453, -7.2342000007629395, -5.584799766540527, -7.332799911499023, -7.412700176239014, -7.42519998550415, -7.191299915313721, -7.507500171661377, -7.5081000328063965, -7.56879997253418, -7.589399814605713, -6.187300205230713, -6.0883002281188965, -4.949900150299072, -6.490799903869629, -5.281499862670898, -5.921500205993652, -4.572700023651123, -5.73799991607666, -5.423999786376953, -5.467400074005127, -5.894899845123291, -6.571000099182129, -5.354100227355957, -4.242700099945068, -4.984099864959717, -5.727200031280518, -5.379000186920166, -5.3383002281188965, -4.232699871063232, -5.212600231170654, -5.309599876403809, -6.185999870300293, -5.68149995803833, -5.6529998779296875, -4.570099830627441, -5.377799987792969, -4.806000232696533, -4.966400146484375, -5.1168999671936035, -4.681700229644775, -5.565299987792969, -4.904900074005127, -5.4120001792907715, -5.2144999504089355, -5.293900012969971, -5.325399875640869, -5.288099765777588, -5.44320011138916, -5.561200141906738, -5.525400161743164, -6.017399787902832, -6.459199905395508, -6.554100036621094, -6.177000045776367, -6.7220001220703125, -6.895100116729736, -6.903600215911865, -5.435500144958496, -6.782800197601318, -7.031599998474121, -7.093900203704834, -7.136499881744385, -7.1616997718811035, -7.162600040435791, -7.181000232696533, -6.083799839019775, -7.304900169372559, -7.343400001525879, -7.348599910736084, -7.369699954986572, -7.401000022888184, -7.41349983215332, -7.497000217437744, -7.502200126647949, -7.513800144195557, -7.516499996185303, -7.521500110626221, -7.535600185394287, -7.5441999435424805, -7.55109977722168, -5.597400188446045, -5.7683000564575195, -6.349699974060059, -6.095099925994873, -6.504499912261963, -6.050600051879883, -6.671199798583984, -6.494999885559082, -5.345600128173828, -4.648399829864502, -4.356599807739258, -6.17140007019043, -5.94320011138916, -5.763000011444092, -6.377099990844727, -6.164899826049805, -6.436299800872803, -5.794899940490723, -6.502699851989746, -5.310500144958496, -6.0553998947143555, -5.515200138092041, -5.35230016708374, -5.60129976272583, -6.164999961853027, -4.837200164794922, -4.860099792480469, -5.854800224304199, -5.8242998123168945, -5.942299842834473, -5.11929988861084, -4.981500148773193, -5.545599937438965, -5.661200046539307, -5.696599960327148, -5.682400226593018, -5.589000225067139, -5.571599960327148, -5.62470006942749, -5.624100208282471, -5.744900226593018, -5.708799839019775, -5.770199775695801, -5.910600185394287, -5.906000137329102, -5.388000011444092, -4.97730016708374, -5.809100151062012, -5.883299827575684, -6.095799922943115, -6.528900146484375, -6.915599822998047, -7.037899971008301, -6.993800163269043, -7.081099987030029, -7.107399940490723, -7.218400001525879, -7.237599849700928, -7.257500171661377, -7.2804999351501465, -7.362400054931641, -7.387899875640869, -7.4105000495910645, -7.4207000732421875, -7.450399875640869, -7.463500022888184, -7.480199813842773, -7.480000019073486, -7.519499778747559, -7.536099910736084, -7.539700031280518, -7.541999816894531, -7.6118998527526855, -7.619999885559082, -7.1971001625061035, -5.447000026702881, -5.146599769592285, -5.984499931335449, -6.154799938201904, -5.329599857330322, -6.46150016784668, -6.9243998527526855, -5.44290018081665, -5.820099830627441, -7.303299903869629, -6.218299865722656, -5.551400184631348, -6.050899982452393, -6.115699768066406, -6.45389986038208, -6.50540018081665, -5.731599807739258, -5.35699987411499, -5.955699920654297, -5.418099880218506, -6.295400142669678, -5.906899929046631, -6.03879976272583, -5.660900115966797, -5.357600212097168, -4.576000213623047, -6.046299934387207, -5.535999774932861, -5.82480001449585, -4.986599922180176, -5.956099987030029, -5.39900016784668, -5.295400142669678, -5.342700004577637, -5.166399955749512, -5.351200103759766, -5.513000011444092, -5.395500183105469, -5.363999843597412, -5.460100173950195, -5.502299785614014, -5.614999771118164, -5.730199813842773, -5.740499973297119, -5.725100040435791, -5.77209997177124, -5.916200160980225, -6.203800201416016, -6.205599784851074, -6.309999942779541, -6.57480001449585, -6.602399826049805, -6.702899932861328, -6.705100059509277, -6.802800178527832, -6.820400238037109, -6.838099956512451, -6.872300148010254, -6.866399765014648, -5.8531999588012695, -6.912700176239014, -6.946300029754639, -6.9471001625061035, -6.961400032043457, -6.976600170135498, -6.990600109100342, -7.022799968719482, -7.031899929046631, -6.214600086212158, -7.107999801635742, -7.111999988555908, -7.125100135803223, -7.150100231170654, -7.1504998207092285, -7.16379976272583, -7.183000087738037, -5.0954999923706055, -6.145999908447266, -5.829899787902832, -6.146999835968018, -6.287600040435791, -5.656300067901611, -6.222400188446045, -5.499899864196777, -6.05810022354126, -6.175099849700928, -6.523399829864502, -6.176700115203857, -5.816299915313721, -6.7428998947143555, -6.06220006942749, -5.412899971008301, -5.721799850463867, -4.644899845123291, -5.347899913787842, -4.7179999351501465, -5.152400016784668, -5.967599868774414, -5.999100208282471, -5.628600120544434, -5.627799987792969, -5.966800212860107, -5.143700122833252, -5.252600193023682, -5.252600193023682, -5.163899898529053, -5.8053998947143555, -5.447700023651123, -5.619100093841553, -5.710599899291992, -5.69189977645874, -5.749000072479248, -5.70359992980957, -5.710599899291992, -5.674900054931641, -5.8471999168396, -5.911399841308594, -5.9029998779296875, -4.351600170135498, -5.3572998046875, -5.516900062561035, -5.445400238037109, -5.866499900817871, -5.999599933624268, -6.178400039672852, -6.39169979095459, -6.408699989318848, -6.450099945068359, -4.750800132751465, -6.572500228881836, -6.60129976272583, -6.676599979400635, -6.698999881744385, -6.645400047302246, -6.8256001472473145, -6.853000164031982, -6.371300220489502, -6.9558000564575195, -6.956299781799316, -6.978799819946289, -6.988800048828125, -7.013700008392334, -6.946000099182129, -7.128799915313721, -7.146599769592285, -7.2179999351501465, -7.229000091552734, -7.287799835205078, -4.95959997177124, -4.533999919891357, -5.435999870300293, -6.94350004196167, -6.648799896240234, -5.456600189208984, -4.546800136566162, -5.6230998039245605, -6.371500015258789, -6.284299850463867, -4.621500015258789, -4.631499767303467, -5.618000030517578, -5.259300231933594, -5.611199855804443, -5.697000026702881, -5.560400009155273, -5.549799919128418, -5.781899929046631, -5.357699871063232, -5.821599960327148, -5.603300094604492, -5.048399925231934, -5.6143999099731445, -5.34499979019165, -5.15939998626709, -5.414700031280518, -5.561200141906738, -5.336999893188477, -5.3649001121521, -5.582699775695801, -5.557499885559082, -5.554999828338623, -5.589600086212158, -5.306000232696533, -5.590199947357178, -6.189599990844727, -6.274400234222412, -6.389599800109863, -6.389500141143799, -6.435200214385986, -6.504300117492676, -6.507500171661377, -6.6519999504089355, -6.760200023651123, -6.632599830627441, -6.781199932098389, -6.806099891662598, -6.833499908447266, -6.872200012207031, -6.879899978637695, -6.9542999267578125, -6.990300178527832, -6.370100021362305, -6.994999885559082, -6.997000217437744, -5.59689998626709, -7.023399829864502, -7.023399829864502, -7.025400161743164, -7.065000057220459, -7.035699844360352, -7.0879998207092285, -7.124899864196777, -6.369200229644775, -5.4944000244140625, -5.081399917602539, -5.257400035858154, -5.519999980926514, -6.0345001220703125, -5.214099884033203, -6.502200126647949, -6.671199798583984, -6.0482001304626465, -6.612400054931641, -6.098800182342529, -5.285799980163574, -5.903200149536133, -5.553400039672852, -5.670000076293945, -5.394599914550781, -6.484300136566162, -5.22599983215332, -6.290200233459473, -5.123600006103516, -5.187600135803223, -4.965199947357178, -5.832200050354004, -5.899400234222412, -5.825500011444092, -5.028299808502197, -5.555200099945068, -6.0192999839782715, -5.151199817657471, -5.456500053405762, -5.453000068664551, -5.76200008392334, -5.762700080871582, -5.408999919891357, -5.3933000564575195, -5.599400043487549, -5.662700176239014, -5.7164998054504395, -5.688399791717529, -5.706200122833252, -5.737599849700928, -4.496799945831299, -4.617499828338623, -5.374000072479248, -5.655700206756592, -5.768099784851074, -5.807300090789795, -5.857600212097168, -5.942200183868408, -6.054900169372559, -6.128300189971924, -6.153299808502197, -6.173099994659424, -6.179500102996826, -6.234899997711182, -6.258200168609619, -6.203199863433838, -6.280900001525879, -6.3358001708984375, -6.345300197601318, -6.419400215148926, -6.450300216674805, -6.476099967956543, -6.50439977645874, -6.50600004196167, -6.509799957275391, -6.446499824523926, -6.600800037384033, -6.6890997886657715, -6.702099800109863, -6.729800224304199, -5.840000152587891, -6.20389986038208, -4.364299774169922, -6.039400100708008, -3.9937000274658203, -6.145199775695801, -5.97130012512207, -5.824900150299072, -6.168600082397461, -4.063600063323975, -4.401299953460693, -5.480899810791016, -4.791800022125244, -5.240699768066406, -5.105299949645996, -5.286499977111816, -5.36359977722168, -5.348800182342529, -5.300000190734863, -5.866099834442139, -5.378200054168701, -5.480899810791016, -5.417900085449219, -5.409200191497803, -4.829100131988525, -5.538000106811523, -5.578700065612793, -5.704500198364258, -5.638400077819824, -5.4253997802734375, -5.345900058746338, -5.65749979019165, -5.737199783325195]}, \"token.table\": {\"Topic\": [1, 2, 3, 4, 5, 6, 8, 9, 10, 3, 4, 5, 6, 7, 8, 4, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 1, 3, 5, 8, 1, 2, 3, 5, 8, 1, 5, 8, 9, 5, 3, 8, 7, 4, 1, 2, 5, 6, 7, 8, 9, 10, 2, 3, 4, 5, 6, 7, 8, 10, 3, 8, 1, 6, 9, 2, 4, 5, 2, 3, 4, 5, 8, 1, 10, 1, 3, 4, 8, 1, 1, 2, 3, 5, 6, 7, 8, 9, 1, 6, 8, 9, 10, 1, 1, 1, 3, 5, 6, 6, 2, 2, 2, 1, 2, 6, 8, 9, 10, 5, 1, 2, 3, 4, 8, 2, 3, 4, 5, 6, 7, 3, 5, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 1, 1, 1, 3, 9, 4, 5, 7, 1, 3, 4, 5, 6, 7, 8, 9, 10, 7, 10, 7, 1, 8, 6, 7, 1, 2, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 1, 3, 7, 8, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 2, 2, 5, 6, 2, 5, 3, 4, 4, 9, 7, 1, 3, 4, 5, 7, 8, 9, 10, 10, 8, 1, 2, 3, 4, 5, 6, 7, 9, 6, 5, 6, 7, 10, 10, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 1, 4, 5, 6, 7, 3, 4, 8, 4, 6, 4, 5, 1, 3, 4, 5, 6, 7, 8, 9, 10, 8, 9, 9, 10, 5, 6, 4, 6, 7, 8, 10, 9, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 9, 7, 2, 1, 2, 3, 4, 5, 6, 7, 8, 9, 6, 4, 4, 9, 1, 2, 3, 5, 8, 9, 4, 7, 8, 9, 1, 2, 1, 2, 1, 2, 5, 4, 8, 3, 4, 7, 8, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 8, 1, 2, 3, 8, 10, 6, 7, 10, 3, 4, 4, 9, 1, 5, 6, 8, 7, 8, 7, 10, 2, 3, 4, 6, 7, 8, 1, 2, 3, 4, 7, 10, 2, 3, 4, 5, 6, 7, 8, 10, 1, 4, 6, 7, 10, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 2, 3, 4, 5, 6, 7, 8, 9, 3, 4, 7, 9, 6, 4, 2, 9, 10, 3, 1, 3, 4, 5, 6, 7, 8, 9, 10, 1, 2, 3, 4, 6, 7, 8, 3, 1, 3, 4, 5, 6, 7, 8, 9, 6, 1, 4, 5, 6, 8, 9, 10, 1, 2, 6, 8, 10, 1, 6, 8, 8, 8, 8, 8, 4, 7, 10, 9, 2, 6, 2, 3, 4, 6, 7, 8, 9, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 1, 4, 6, 8, 1, 2, 4, 6, 9, 10, 8, 8, 5, 1, 2, 3, 4, 5, 6, 7, 8, 9, 3, 10, 3, 4, 7, 8, 4, 9, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 3, 3, 4, 8, 9, 3, 4, 8, 1, 2, 3, 4, 5, 9, 10, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 2, 1, 3, 4, 5, 6, 7, 8, 9, 10, 5, 1, 6, 9, 2, 7, 1, 2, 4, 5, 6, 7, 9, 10, 4, 5, 6, 8, 10, 3, 5, 9, 1, 7, 9, 1, 2, 3, 5, 7, 9, 10, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 9, 4, 1, 2, 3, 4, 5, 6, 7, 10, 8, 1, 2, 6, 8, 10, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 5, 3, 4, 8, 10, 8, 4, 10, 1, 2, 9, 3, 4, 1, 1, 2, 6, 8, 9, 10, 1, 2, 3, 4, 5, 7, 8, 9, 10, 1, 2, 7, 8, 1, 5, 6, 8, 1, 3, 4, 8, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 6, 6, 1, 3, 5, 9, 3, 4, 5, 10, 7, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 3, 4, 1, 2, 5, 9, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 2, 3, 4, 8, 9, 2, 6, 10, 6, 9, 1, 2, 3, 4, 8, 9, 5, 6, 8, 9, 10, 2, 4, 7, 10, 7, 10, 7, 9, 1, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 1, 2, 3, 5, 8, 10, 2, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 4, 9, 2, 1, 5, 6, 8, 3, 3, 4, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 1, 3, 1, 2, 3, 1, 2, 5, 6, 7, 8, 9, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 8, 1, 6, 9, 5, 8, 3, 6, 8, 6, 7, 9, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 1, 2, 4, 5, 6, 7, 8, 9, 10, 6, 1, 5, 8, 9, 1, 2, 5, 7, 5, 6, 7, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 5, 10, 7, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 1, 5, 6, 7, 9, 1, 7, 10, 1, 2, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 9, 8, 6, 7, 6, 5, 1, 6, 6, 1, 2, 3, 4, 5, 6, 7, 9, 1, 2, 3, 4, 8, 6, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 2, 3, 4, 7, 8, 9, 9, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 7, 9, 10, 7, 3, 4, 5, 7, 8, 5, 6, 9, 10, 9, 4, 2, 3, 4, 6, 7, 8, 9, 10, 5, 8, 1, 1, 2, 10, 1, 2, 10, 2, 10, 2, 4, 7, 9, 7, 2, 4, 5, 6, 7, 9, 10, 2, 5, 10, 1, 2, 10, 3, 5, 6, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 4, 7, 5, 3, 3, 8, 1, 2, 3, 6, 7, 9, 10, 1, 7, 3, 7, 5, 3, 5, 10, 10, 7, 10, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 10, 10, 1, 2, 3, 4, 6, 7, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 1, 2, 5, 6, 7, 8, 9, 10, 2, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 7, 1, 2, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 1, 2, 4, 5, 6, 7, 9, 10, 3, 5, 8, 1, 3, 4, 5, 6, 8, 9, 10, 3, 6, 2, 3, 4, 6, 7, 8, 9, 10, 3, 4, 3, 5, 1, 2, 1, 4, 10, 5, 3, 4, 10, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 1, 3, 7, 8, 9, 1, 4, 8, 9, 4, 1, 2, 3, 4, 5, 7, 10, 1, 2, 3, 4, 5, 6, 7, 8, 10, 7, 1, 5, 7, 9, 9, 2, 4, 6, 9, 1, 8, 1, 2, 3, 5, 5, 2, 3, 4, 7, 8, 9, 3, 4, 8, 1, 2, 4, 5, 6, 8, 9, 10, 4, 5, 8, 4, 10, 2, 3, 5, 1, 2, 1, 4, 3, 6, 1, 3, 4, 1, 2, 6, 1, 2, 3, 5, 7, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 1, 8, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 2, 4, 6, 7, 8, 9, 3, 8, 7, 5, 4, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 3, 6, 8, 3, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 10, 5, 3, 5, 6, 7, 3, 4, 8, 1, 3, 4, 5, 6, 7, 10, 1, 2, 4, 7, 9, 10, 2, 8, 9, 2, 9, 10, 10, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 1, 2, 3, 5, 6, 7, 8, 9, 10, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 1, 2, 3, 4, 6, 7, 8, 9, 6, 9, 6, 5, 7, 7, 7, 9, 10, 8, 9, 10, 3, 1, 2, 4, 5, 6, 7, 8, 10, 7, 10, 10, 5, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 1, 2, 5, 6, 8, 10, 3, 1, 8, 9, 10, 3, 4, 8, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 4, 1, 5, 8, 10, 1, 2, 3, 4, 5, 6, 7, 1, 2, 3, 9, 3, 4, 7, 1, 8, 1, 2, 3, 4, 5, 6, 8, 3, 5, 6, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 2, 3, 4, 5, 8, 9, 3, 5, 7, 8, 9, 2, 2, 2, 3, 5, 8, 9, 10, 1, 3, 4, 5, 6, 7, 8, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 3, 4, 8, 10, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 3, 5, 10, 6, 5, 10, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 3, 8, 5, 3, 1, 2, 1, 2, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 1, 2, 3, 4, 5, 9, 7, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 2, 2, 7, 5, 6, 5, 6, 6, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 8, 1, 3, 5, 6, 7, 8, 9, 6, 1, 3, 5, 6, 7, 9, 10, 9, 1, 2, 4, 9, 10, 7, 5, 1, 2, 3, 4, 5, 6, 7, 10, 2, 7, 8, 2, 3, 4, 5, 6, 7, 2, 2, 3, 5, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 2, 3, 4, 8, 9, 2, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 2, 3, 5, 8, 9, 7, 10, 1, 2, 3, 4, 7, 9, 10, 3, 4, 8, 10, 2, 4, 1, 7, 7, 10, 1, 7, 8, 1, 6, 8, 10, 10, 1, 3, 4, 5, 6, 7, 8, 10, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 1, 1, 3, 4, 5, 1, 6, 10, 6, 3, 5, 4, 2, 2, 9, 3, 1, 1, 9, 10, 1, 2, 3, 4, 5, 6, 7, 10, 6, 2, 3, 4, 5, 6, 7, 8, 9, 10, 3, 5, 10, 1, 10, 2, 1, 2, 3, 4, 5, 7, 8, 9, 10, 1, 3, 4, 5, 8, 3, 5, 4, 5, 7, 4, 5, 6, 7, 8, 5, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 9, 1, 2, 5, 5, 1, 3, 4, 5, 6, 7, 8, 10, 3, 7, 10, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 7, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 1, 3, 4, 5, 6, 7, 8, 10, 8, 2, 3, 4, 6, 7, 8, 9, 10, 9, 5, 9, 8, 1, 2, 3, 5, 6, 8, 9, 10, 3, 9, 8, 4, 4, 9, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 8, 1, 2, 3, 5, 6, 3, 5, 7, 8, 10, 1, 2, 3, 4, 5, 6, 7, 8, 9, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 6, 2, 3, 4, 5, 6, 7, 8, 9, 2, 1, 2, 3, 4, 5, 6, 7, 9, 10, 2, 5, 2, 1, 2, 3, 6, 8, 9, 9, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 6, 4, 7, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 4, 5, 6, 7, 10, 3, 3, 4, 5, 7, 10, 1, 9, 1, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 6, 1, 2, 6, 9, 10, 1, 1, 1, 3, 2, 6, 7, 5, 7, 1, 2, 3, 4, 5, 6, 7, 9, 2, 4, 7, 5, 3, 4, 1, 4, 6, 7, 3, 4, 6, 8, 3, 6, 10, 6, 1, 5, 6, 8, 2, 1, 2, 3, 4, 5, 6, 7, 8, 10, 4, 8, 1, 3, 4, 8, 1, 10, 2, 3, 5, 6, 7, 8, 10, 3, 7, 7, 4, 1, 6, 6, 7, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 1, 2, 5, 7, 9, 1, 6, 7, 3, 5, 3, 1, 3, 4, 1, 5, 8, 9, 10, 5, 10, 3, 5, 7, 8, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 1, 2, 3, 3, 3, 3, 6, 7, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 9, 5, 1], \"Freq\": [0.14598289132118225, 0.5243467092514038, 0.1291005164384842, 0.0496540442109108, 0.00794464722275734, 0.02284085936844349, 0.06653641909360886, 0.0347578302025795, 0.01886853575706482, 0.40391483902931213, 0.1960684359073639, 0.17181970179080963, 0.03325542435050011, 0.0006928213406354189, 0.19329716265201569, 0.9846343994140625, 0.05246054753661156, 0.07400684058666229, 0.5367838144302368, 0.18267512321472168, 0.030914250761270523, 0.02623027376830578, 0.03278784081339836, 0.0496501587331295, 0.005620772950351238, 0.00843115895986557, 0.12411247193813324, 0.0630735531449318, 0.19735917448997498, 0.614458441734314, 0.07896016538143158, 0.02786829322576523, 0.006967073306441307, 0.12772968411445618, 0.7570886611938477, 0.0386776365339756, 0.08218997716903687, 0.00483470456674695, 0.8702468276023865, 0.9960854053497314, 0.3871470093727112, 0.6115800738334656, 0.9910170435905457, 0.9902247786521912, 0.33969980478286743, 0.014489565044641495, 0.09418217092752457, 0.09981700032949448, 0.004024879075586796, 0.20285390317440033, 0.03300400823354721, 0.21090367436408997, 0.12552714347839355, 0.12667876482009888, 0.06333938241004944, 0.012667876668274403, 0.17389538884162903, 0.03685200214385986, 0.07370400428771973, 0.38694602251052856, 0.9025949835777283, 0.09524871408939362, 0.7508120536804199, 0.05317366123199463, 0.19355212152004242, 0.2244642972946167, 0.7725217938423157, 0.002278825268149376, 0.025182049721479416, 0.7351221442222595, 0.18789683282375336, 0.011622484773397446, 0.0397101566195488, 0.3441043496131897, 0.6550210118293762, 0.04772661626338959, 0.8045344352722168, 0.03409044072031975, 0.11363480240106583, 0.9978176951408386, 0.06133982539176941, 0.707861602306366, 0.060113027691841125, 0.011041169054806232, 0.05643263831734657, 0.013494761660695076, 0.012267964892089367, 0.0772881805896759, 0.8128747344017029, 0.14955486357212067, 0.015835221856832504, 0.012316283769905567, 0.007037876173853874, 0.9969637393951416, 0.9991614818572998, 0.8529326319694519, 0.08812587708234787, 0.006294705905020237, 0.050357647240161896, 0.9844738245010376, 0.9972343444824219, 0.9992160201072693, 0.9963047504425049, 0.6339515447616577, 0.02203921601176262, 0.0427820086479187, 0.24113495647907257, 0.03241061046719551, 0.027224913239479065, 0.9964976906776428, 0.1443973183631897, 0.31100961565971375, 0.18626399338245392, 0.061518386006355286, 0.29563000798225403, 0.030768103897571564, 0.016782602295279503, 0.019579702988266945, 0.008391301147639751, 0.8978692293167114, 0.02517390251159668, 0.9904056191444397, 0.9817970991134644, 0.0017971218330785632, 0.02096642181277275, 0.6176108717918396, 0.11861003935337067, 0.02515970543026924, 0.02755586802959442, 0.004193284083157778, 0.14077454805374146, 0.03174915164709091, 0.01257985271513462, 0.9968417286872864, 0.991598904132843, 0.9969107508659363, 0.9914524555206299, 0.9858863353729248, 0.023294983431696892, 0.15141738951206207, 0.8230893611907959, 0.003686234587803483, 0.012901821173727512, 0.027646759524941444, 0.020274288952350616, 0.007372469175606966, 0.005529351532459259, 0.1032145693898201, 0.74830561876297, 0.06819533556699753, 0.8323493599891663, 0.1655372679233551, 0.9907169938087463, 0.9820555448532104, 0.016715839505195618, 0.056100912392139435, 0.9407691955566406, 0.013236194849014282, 0.9844419956207275, 0.09290590137243271, 0.5882739424705505, 0.0011710828403010964, 0.030838513746857643, 0.05074692144989967, 0.05933486297726631, 0.04801439493894577, 0.04333006590604782, 0.07065533101558685, 0.01405299361795187, 0.00951243843883276, 0.1598089635372162, 0.7933374047279358, 0.034244779497385025, 0.0074272542260587215, 0.13071967661380768, 0.06758801639080048, 0.18196773529052734, 0.039364445954561234, 0.10546701401472092, 0.24138575792312622, 0.019310861825942993, 0.07501526921987534, 0.13294784724712372, 0.04424953833222389, 0.11761061102151871, 0.023289229720830917, 0.1612779200077057, 0.10945937782526016, 0.1676824539899826, 0.19795845448970795, 0.022706998512148857, 0.06288091838359833, 0.09315691888332367, 0.9987183213233948, 0.9975488185882568, 0.0013375557027757168, 0.9978166222572327, 0.06178143993020058, 0.9339900016784668, 0.9676030278205872, 0.02764580026268959, 0.9971796870231628, 0.982193648815155, 0.9898443818092346, 0.03046371042728424, 0.08986794203519821, 0.7326522469520569, 0.048741936683654785, 0.016755040735006332, 0.00761592760682106, 0.012185484170913696, 0.05940423533320427, 0.9946929216384888, 0.98945152759552, 0.10203344374895096, 0.3764682412147522, 0.37154248356819153, 0.0049257525242865086, 0.0014073578640818596, 0.02392508275806904, 0.0731826052069664, 0.04644281044602394, 0.9914161562919617, 0.055586133152246475, 0.939405620098114, 0.9450883865356445, 0.05471564456820488, 0.9883830547332764, 0.18599717319011688, 0.01752147264778614, 0.2014969289302826, 0.27158281207084656, 0.20082302391529083, 0.013478055596351624, 0.06671637296676636, 0.03571684658527374, 0.0006739028031006455, 0.0074129304848611355, 0.018123658373951912, 0.4086061120033264, 0.023066474124789238, 0.5272337198257446, 0.023066474124789238, 0.04739116132259369, 0.8909538388252258, 0.056869395077228546, 0.9964706301689148, 0.9901596903800964, 0.9917035698890686, 0.995495080947876, 0.005461199674755335, 0.13243408501148224, 0.04505489766597748, 0.04642019420862198, 0.2047949880361557, 0.13789528608322144, 0.028671298176050186, 0.01092239934951067, 0.3877451717853546, 0.06210401654243469, 0.931560218334198, 0.9911597371101379, 0.9856107234954834, 0.03709100931882858, 0.9602450132369995, 0.8973998427391052, 0.039926689118146896, 0.0468980148434639, 0.005703812465071678, 0.008872597478330135, 0.9925441741943359, 0.09890180826187134, 0.14101789891719818, 0.0501607246696949, 0.13344645500183105, 0.028866078704595566, 0.20679469406604767, 0.028866078704595566, 0.12918752431869507, 0.16278575360774994, 0.01987500488758087, 0.9940217733383179, 0.9957262873649597, 0.9968324303627014, 0.12163656204938889, 0.1770021617412567, 0.04529913142323494, 0.08556503057479858, 0.024327311664819717, 0.09479262679815292, 0.041104767471551895, 0.009227600879967213, 0.40098121762275696, 0.9872248768806458, 0.9969919323921204, 0.9897413849830627, 0.9944040179252625, 0.6778358817100525, 0.13264651596546173, 0.023121869191527367, 0.0073016430251300335, 0.03772515431046486, 0.1204771101474762, 0.3485725224018097, 0.004737879149615765, 0.6463820934295654, 0.988788366317749, 0.0016636345535516739, 0.9981806874275208, 0.013511610217392445, 0.9863475561141968, 0.002685961779206991, 0.9857479333877563, 0.009400865994393826, 0.992397129535675, 0.9943981170654297, 0.9900022149085999, 0.049530185759067535, 0.9286909699440002, 0.021669454872608185, 0.23153142631053925, 0.499500572681427, 0.006072955206036568, 0.04630628600716591, 0.009109432809054852, 0.02429182082414627, 0.019737103953957558, 0.05237923935055733, 0.08198489993810654, 0.02960565686225891, 0.9902758598327637, 0.016072237864136696, 0.03214447572827339, 0.008036118932068348, 0.9402259588241577, 0.9969149231910706, 0.8351381421089172, 0.035791631788015366, 0.12725913524627686, 0.9410224556922913, 0.05614054203033447, 0.00718638114631176, 0.9845342040061951, 0.12217437475919724, 0.3212733566761017, 0.027149861678481102, 0.5279139876365662, 0.00637459009885788, 0.993161141872406, 0.049447860568761826, 0.949398934841156, 0.04700689762830734, 0.6894344687461853, 0.03917241469025612, 0.001958620734512806, 0.007834482938051224, 0.21348965167999268, 0.019394105300307274, 0.0030622270423918962, 0.16433952748775482, 0.7624945640563965, 0.04797489196062088, 0.0030622270423918962, 0.02497812546789646, 0.01405019499361515, 0.026539258658885956, 0.01405019499361515, 0.2700759768486023, 0.5214183926582336, 0.11708496510982513, 0.01248906273394823, 0.08582406491041183, 0.15019211173057556, 0.007152005564421415, 0.04470003396272659, 0.7116245627403259, 0.2507038414478302, 0.22155915200710297, 0.014572346583008766, 0.11628138273954391, 0.07137475907802582, 0.06988778710365295, 0.13055633008480072, 0.03211864084005356, 0.041040487587451935, 0.051449306309223175, 0.010484231635928154, 0.19526882469654083, 0.12318972498178482, 0.07863173633813858, 0.011794760823249817, 0.14677923917770386, 0.42985349893569946, 0.0013105289544910192, 0.8898380994796753, 0.08089437335729599, 0.008368383161723614, 0.019526228308677673, 0.9776338338851929, 0.992104709148407, 0.9852089285850525, 0.007977400906383991, 0.003988700453191996, 0.9938931465148926, 0.14128684997558594, 0.029136978089809418, 0.4518980383872986, 0.04947788640856743, 0.13359029591083527, 0.010995086282491684, 0.11489865183830261, 0.06212223693728447, 0.007696560118347406, 0.011460448615252972, 0.055010151118040085, 0.5684382319450378, 0.2177485227584839, 0.06990873068571091, 0.010314403101801872, 0.06532455235719681, 0.9914078712463379, 0.009856686927378178, 0.062097128480672836, 0.1419362872838974, 0.5105763673782349, 0.18234871327877045, 0.03154139965772629, 0.03055572882294655, 0.03154139965772629, 0.9842479228973389, 0.7061063051223755, 0.005525088403373957, 0.07514120638370514, 0.1193419098854065, 0.07514120638370514, 0.00110501772724092, 0.018785301595926285, 0.2932772636413574, 0.04783955588936806, 0.10399903357028961, 0.5553548336029053, 0.9974397420883179, 0.32539263367652893, 0.5732384324073792, 0.10035473853349686, 0.9916263222694397, 0.9956570863723755, 0.9919785857200623, 0.9961087107658386, 0.9902847409248352, 0.9942601919174194, 0.9961082935333252, 0.9942809343338013, 0.11343644559383392, 0.8848042488098145, 0.003028471488505602, 0.47547000646591187, 0.2640827000141144, 0.016353745013475418, 0.004239859990775585, 0.21078160405158997, 0.026044854894280434, 0.10129044950008392, 0.11214299499988556, 0.11756926774978638, 0.07717367261648178, 0.0012058386346325278, 0.1917283535003662, 0.2074042558670044, 0.08802622556686401, 0.06812988221645355, 0.03557224199175835, 0.9973674416542053, 0.11459366232156754, 0.7639577388763428, 0.12005050480365753, 0.581549882888794, 0.2825454771518707, 0.013715799897909164, 0.09326744079589844, 0.024688439443707466, 0.004114740062505007, 0.9912833571434021, 0.9915632605552673, 0.987637460231781, 0.006995608564466238, 0.002998118055984378, 0.24484629929065704, 0.12192346155643463, 0.29581430554389954, 0.11292910575866699, 0.0449717678129673, 0.1299184411764145, 0.03897553309798241, 0.9956022500991821, 0.9973152875900269, 0.009577130898833275, 0.4747520685195923, 0.0615672692656517, 0.4542296230792999, 0.9948829412460327, 0.9922850728034973, 0.04472442716360092, 0.25550490617752075, 0.08590632677078247, 0.18686839938163757, 0.07749281823635101, 0.13461610674858093, 0.031439945101737976, 0.04251034930348396, 0.11690345406532288, 0.023026438429951668, 0.9799155592918396, 0.7679171562194824, 0.20840230584144592, 0.02265242487192154, 0.99677973985672, 0.012705590575933456, 0.949009895324707, 0.037139419466257095, 0.0119171142578125, 0.01310882531106472, 0.605389416217804, 0.3467880189418793, 0.010725402273237705, 0.0011917114024981856, 0.010725402273237705, 0.051335275173187256, 0.014808251522481441, 0.20534110069274902, 0.1796734631061554, 0.05429692193865776, 0.14512087404727936, 0.175724595785141, 0.10299962013959885, 0.049360841512680054, 0.02138969674706459, 0.9928632378578186, 0.005768533796072006, 0.08797013759613037, 0.012979201041162014, 0.015863467007875443, 0.1543082743883133, 0.18603521585464478, 0.09518080949783325, 0.015863467007875443, 0.4254293739795685, 0.9893049597740173, 0.13154099881649017, 0.002684510312974453, 0.8644123077392578, 0.9944851398468018, 0.9891051650047302, 0.033735986799001694, 0.00606489647179842, 0.7467404007911682, 0.015162241645157337, 0.18535840511322021, 0.010992624796926975, 0.0007581120589748025, 0.0011371681466698647, 0.7884120345115662, 0.00419814744964242, 0.19731292128562927, 0.00419814744964242, 0.00587740633636713, 0.00438003009185195, 0.9942668080329895, 0.9940217733383179, 0.03518321365118027, 0.9631404876708984, 0.9966021180152893, 0.0027513206005096436, 0.29989394545555115, 0.09079357981681824, 0.6052905321121216, 0.0013756603002548218, 0.0013756603002548218, 0.996711790561676, 0.0427921898663044, 0.06828540563583374, 0.05462832748889923, 0.02276180312037468, 0.07192729413509369, 0.0783006027340889, 0.06464351713657379, 0.18118394911289215, 0.40789151191711426, 0.008194249123334885, 0.9927068948745728, 0.9913347959518433, 0.0025878301821649075, 0.007763490546494722, 0.5839869976043701, 0.26137086749076843, 0.0008626100607216358, 0.05520704388618469, 0.0733218565583229, 0.013801760971546173, 0.9992876648902893, 0.032602448016405106, 0.011643731035292149, 0.016301224008202553, 0.9128684997558594, 0.025616208091378212, 0.00628057774156332, 0.02791368030011654, 0.10188493132591248, 0.2023741751909256, 0.2979785203933716, 0.2449425458908081, 0.03768346831202507, 0.0397769920527935, 0.016748208552598953, 0.02512231096625328, 0.9943776726722717, 0.15899166464805603, 0.8376146554946899, 0.0025852303951978683, 0.9928542375564575, 0.998742938041687, 0.9821000695228577, 0.9941750764846802, 0.01414253655821085, 0.9086580276489258, 0.07424832135438919, 0.9900906682014465, 0.9895586967468262, 0.9942180514335632, 0.09427931159734726, 0.6226578950881958, 0.010360363870859146, 0.03833334892988205, 0.22896404564380646, 0.004144145641475916, 0.15294533967971802, 0.5817805528640747, 0.06882540136575699, 0.07235491275787354, 0.029412565752863884, 0.0011765025556087494, 0.0429423451423645, 0.04411884769797325, 0.007059015799313784, 0.9934695363044739, 0.9772945046424866, 0.021786820143461227, 0.9884756207466125, 0.21478646993637085, 0.08931714296340942, 0.10420333594083786, 0.5911944508552551, 0.007281843572854996, 0.540590226650238, 0.38905850052833557, 0.0627625584602356, 0.127691388130188, 0.08755980432033539, 0.05837320536375046, 0.11309808492660522, 0.13133971393108368, 0.012161084450781345, 0.08999202400445938, 0.025538276880979538, 0.030402710661292076, 0.3247009515762329, 0.9984749555587769, 0.9873408675193787, 0.03167729079723358, 0.09503187239170074, 0.8095307946205139, 0.059834882616996765, 0.018883921205997467, 0.978816568851471, 0.00650462880730629, 0.9887035489082336, 0.9960068464279175, 0.11995285004377365, 0.30648744106292725, 0.22458131611347198, 0.1421467661857605, 0.02906346507370472, 0.03117717243731022, 0.030648745596408844, 0.054427944123744965, 0.028535038232803345, 0.03381930664181709, 0.9655084609985352, 0.031217364594340324, 0.09275101125240326, 0.022714532911777496, 0.05489345267415047, 0.8271875381469727, 0.4964306652545929, 0.04393191635608673, 0.035145532339811325, 0.005491489544510841, 0.14717192947864532, 0.03953872621059418, 0.047226812690496445, 0.10214170813560486, 0.047226812690496445, 0.035145532339811325, 0.005433580372482538, 0.66561359167099, 0.2974885404109955, 0.008150370791554451, 0.021734321489930153, 0.11880886554718018, 0.6471291184425354, 0.23256203532218933, 0.9827058911323547, 0.012132171541452408, 0.037580136209726334, 0.037580136209726334, 0.6822240352630615, 0.1214127466082573, 0.06070637330412865, 0.06070637330412865, 0.7771899700164795, 0.01132929977029562, 0.18580052256584167, 0.02265859954059124, 0.00226586009375751, 0.010305746458470821, 0.020096207037568092, 0.3040195405483246, 0.6652359366416931, 0.9966678619384766, 0.9952186346054077, 0.05247049406170845, 0.9444688558578491, 0.9979948997497559, 0.24752682447433472, 0.07662222534418106, 0.0008545229793526232, 0.08630681782960892, 0.18600116670131683, 0.13102684915065765, 0.15210509300231934, 0.027059894055128098, 0.023356961086392403, 0.06893151998519897, 0.005418102722615004, 0.1661551594734192, 0.012642240151762962, 0.12461636960506439, 0.06140516698360443, 0.6266939043998718, 0.9935146570205688, 0.028499729931354523, 0.17739084362983704, 0.04954158514738083, 0.08203660696744919, 0.06525638699531555, 0.19683457911014557, 0.2426472306251526, 0.0492752343416214, 0.05486863851547241, 0.053803227841854095, 0.06767828017473221, 0.9305763244628906, 0.9940921068191528, 0.47854405641555786, 0.0675768256187439, 0.01401593443006277, 0.43899908661842346, 0.9759842157363892, 0.7746955156326294, 0.224728062748909, 0.07067009806632996, 0.13031825423240662, 0.06418660283088684, 0.13356000185012817, 0.0953073799610138, 0.14523029327392578, 0.18088951706886292, 0.022043883800506592, 0.0564064085483551, 0.1011425256729126, 0.9620181918144226, 0.03390372544527054, 0.928249180316925, 0.06953177601099014, 0.9825076460838318, 0.07760585844516754, 0.05453384667634964, 0.19925828278064728, 0.018877100199460983, 0.6376265287399292, 0.004194911103695631, 0.00629236688837409, 0.1507587730884552, 0.19675298035144806, 0.26114487648010254, 0.06490293145179749, 0.0741017758846283, 0.09812096506357193, 0.012265120632946491, 0.08841107785701752, 0.03219594433903694, 0.020952915772795677, 0.9962035417556763, 0.09006869792938232, 0.9076153039932251, 0.9927300810813904, 0.9875916838645935, 0.9910625219345093, 0.990225613117218, 0.891280472278595, 0.10728375613689423, 0.043885838240385056, 0.05120014399290085, 0.8996596336364746, 0.38985222578048706, 0.08291633427143097, 0.0029093450866639614, 0.09746305644512177, 0.06109624728560448, 0.12801118195056915, 0.09018969535827637, 0.05091353878378868, 0.06255091726779938, 0.03273013234138489, 0.06610270589590073, 0.11927227675914764, 0.43972671031951904, 0.06538420170545578, 0.14873109757900238, 0.01796269230544567, 0.021555230021476746, 0.05748061463236809, 0.06466569006443024, 0.9846019148826599, 0.016519740223884583, 0.2019079476594925, 0.11013160645961761, 0.6699672937393188, 0.024322209879755974, 0.9450916051864624, 0.003474601311609149, 0.024322209879755974, 0.8505304455757141, 0.10692382603883743, 0.038881391286849976, 0.12049806118011475, 0.047262489795684814, 0.20182360708713531, 0.31721222400665283, 0.054075103253126144, 0.05577825754880905, 0.0672745406627655, 0.03278569132089615, 0.09282182902097702, 0.010644705034792423, 0.970984935760498, 0.025627167895436287, 0.9892431497573853, 0.020421624183654785, 0.04413705691695213, 0.05138343945145607, 0.18708842992782593, 0.24176567792892456, 0.10869573801755905, 0.0955204963684082, 0.11067202687263489, 0.11001326143741608, 0.030961817130446434, 0.030803175643086433, 0.01760181412100792, 0.04400453716516495, 0.8888916373252869, 0.01320136059075594, 0.9939636588096619, 0.9912236332893372, 0.9990959763526917, 0.05654406547546387, 0.9400451183319092, 0.27265825867652893, 0.0039090788923203945, 0.06547707319259644, 0.0732952356338501, 0.01954539492726326, 0.10554513335227966, 0.3586580157279968, 0.02345447428524494, 0.0029318092856556177, 0.0742725059390068, 0.9918825626373291, 0.9930832386016846, 0.9938083291053772, 0.9941292405128479, 0.9872344732284546, 0.9915617108345032, 0.19975487887859344, 0.7990195155143738, 0.9793489575386047, 0.011330295354127884, 0.022660590708255768, 0.022660590708255768, 0.07931207120418549, 0.008497721515595913, 0.7308040857315063, 0.12180067598819733, 0.002832573838531971, 0.00934284646064043, 0.019404372200369835, 0.8940384984016418, 0.070430688560009, 0.005749443545937538, 0.9890683889389038, 0.0846291109919548, 0.0584796667098999, 0.4787725508213043, 0.1374034434556961, 0.0404127761721611, 0.0294775553047657, 0.0342320017516613, 0.0622832216322422, 0.0370846651494503, 0.0370846651494503, 0.005476515740156174, 0.021906062960624695, 0.1341746300458908, 0.6517053842544556, 0.1697719842195511, 0.013691289350390434, 0.9946812987327576, 0.05209195986390114, 0.029964402318000793, 0.4881892502307892, 0.07929041981697083, 0.000460990791907534, 0.02673746645450592, 0.014290714636445045, 0.23879322409629822, 0.06592168658971786, 0.005070898681879044, 0.041801583021879196, 0.8824778199195862, 0.0743139237165451, 0.9888632893562317, 0.012953841127455235, 0.8186827301979065, 0.056996900588274, 0.023316914215683937, 0.08679073303937912, 0.036432038992643356, 0.7522144317626953, 0.2014477401971817, 0.010715305805206299, 0.9897346496582031, 0.9900591373443604, 0.01565597578883171, 0.5387497544288635, 0.17774136364459991, 0.05709826201200485, 0.12893155217170715, 0.03960040584206581, 0.0018418794497847557, 0.04144228622317314, 0.9562177658081055, 0.03464557230472565, 0.9940004348754883, 0.20040783286094666, 0.7981759905815125, 0.9990657567977905, 0.02949688956141472, 0.030480118468403816, 0.9389843344688416, 0.9947848916053772, 0.9926949739456177, 0.05052619054913521, 0.05052619054913521, 0.8625542521476746, 0.03609013557434082, 0.9870107769966125, 0.024646587669849396, 0.10914917290210724, 0.08098164200782776, 0.017604704946279526, 0.746439516544342, 0.007041881792247295, 0.01408376358449459, 0.9993667602539062, 0.029904931783676147, 0.9629387855529785, 0.865506649017334, 0.10981189459562302, 0.023615460842847824, 0.0038583234418183565, 0.9491475820541382, 0.042441558092832565, 0.011400341987609863, 0.2233125865459442, 0.06974326819181442, 0.07644934952259064, 0.004023650195449591, 0.14887505769729614, 0.1978294551372528, 0.06303718686103821, 0.09522638469934464, 0.1099797710776329, 0.9821186661720276, 0.01741345226764679, 0.9934096932411194, 0.9922566413879395, 0.039439857006073, 0.9586918950080872, 0.7953653931617737, 0.0046422104351222515, 0.01005812268704176, 0.1493244469165802, 0.0007737017585895956, 0.01005812268704176, 0.029400667175650597, 0.9974008798599243, 0.9822391867637634, 0.08993218839168549, 0.8993219137191772, 0.982517421245575, 0.0062467665411531925, 0.9911536574363708, 0.9936993718147278, 0.997281014919281, 0.2905958890914917, 0.7078618407249451, 0.3073049783706665, 0.05825990438461304, 0.007682624738663435, 0.08770996332168579, 0.09987412393093109, 0.1280437409877777, 0.15557314455509186, 0.016645686700940132, 0.05313815549015999, 0.08578930795192719, 0.9962541460990906, 0.9895529747009277, 0.03024541400372982, 0.004032721742987633, 0.9295423626899719, 0.0020163608714938164, 0.006049082614481449, 0.02822905220091343, 0.143030047416687, 0.5369619131088257, 0.007990504615008831, 0.0031962019857019186, 0.13184332847595215, 0.093488909304142, 0.018378160893917084, 0.005593353416770697, 0.05753163620829582, 0.0015981009928509593, 0.03587798401713371, 0.05189494043588638, 0.5907053351402283, 0.04164408892393112, 0.0012813565554097295, 0.11147801578044891, 0.05381697416305542, 0.03203391283750534, 0.005125426221638918, 0.0756000354886055, 0.388294517993927, 0.25386178493499756, 0.09002191573381424, 0.15783841907978058, 0.027606720104813576, 0.0024005842860788107, 0.042610373347997665, 0.03660891205072403, 0.9922282099723816, 0.1063678190112114, 0.12472893297672272, 0.034822799265384674, 0.08104214817285538, 0.24059388041496277, 0.09623755514621735, 0.12282950431108475, 0.0930718407034874, 0.07344444841146469, 0.02659195475280285, 0.08148057013750076, 0.08059169352054596, 0.1822201907634735, 0.1339244395494461, 0.1167394369840622, 0.15347976982593536, 0.17629432678222656, 0.018073873594403267, 0.02844412811100483, 0.029036713764071465, 0.9882287383079529, 0.053438350558280945, 0.945015013217926, 0.1160629466176033, 0.09040692448616028, 0.04031660035252571, 0.054977186024188995, 0.04520346224308014, 0.03909488767385483, 0.3750665783882141, 0.02321258932352066, 0.053755469620227814, 0.16126640141010284, 0.057640671730041504, 0.6063355207443237, 0.031037285923957825, 0.024386439472436905, 0.19619998335838318, 0.056532200425863266, 0.011084744706749916, 0.01662711799144745, 0.007938551716506481, 0.9883496165275574, 0.9811052083969116, 0.04756637662649155, 0.2102433741092682, 0.6021903157234192, 0.0038053099997341633, 0.04756637662649155, 0.032345134764909744, 0.004756637383252382, 0.05327434092760086, 0.9910971522331238, 0.995514452457428, 0.016419608145952225, 0.5435311198234558, 0.1498815417289734, 0.06062624603509903, 0.11367420852184296, 0.05473202466964722, 0.009262342937290668, 0.05220593139529228, 0.8968327641487122, 0.10020478069782257, 0.03034295327961445, 0.9659173488616943, 0.005181933753192425, 0.9897493720054626, 0.9962561726570129, 0.9940349459648132, 0.9951643347740173, 0.9922572374343872, 0.12975022196769714, 0.027522772550582886, 0.8374786376953125, 0.10295763611793518, 0.3724643886089325, 0.030281657353043556, 0.07683970779180527, 0.06737668812274933, 0.10901396721601486, 0.06132035702466965, 0.10712136328220367, 0.04996473714709282, 0.022711243480443954, 0.05779813230037689, 0.03639141470193863, 0.002140671480447054, 0.006422014441341162, 0.8948007225990295, 0.004667358472943306, 0.03267151117324829, 0.06534302234649658, 0.8961328268051147, 0.9892205595970154, 0.031489819288253784, 0.02422293648123741, 0.03027867153286934, 0.7981457710266113, 0.027856377884745598, 0.029067525640130043, 0.05934619531035423, 0.0734139233827591, 0.09762490540742874, 0.3139616847038269, 0.13511286675930023, 0.03280196711421013, 0.06560393422842026, 0.001561998389661312, 0.26475873589515686, 0.016400983557105064, 0.9912712574005127, 0.034169621765613556, 0.09111899137496948, 0.8542405366897583, 0.017084810882806778, 0.9909042119979858, 0.08195075392723083, 0.02731691673398018, 0.8850681185722351, 0.9933369159698486, 0.9978326559066772, 0.9879665970802307, 0.008702563121914864, 0.04061196371912956, 0.20596066117286682, 0.74261873960495, 0.9881279468536377, 0.009207873605191708, 0.053712595254182816, 0.8885597586631775, 0.010742519050836563, 0.02915826439857483, 0.007673227693885565, 0.020768892019987106, 0.9553690552711487, 0.023365003988146782, 0.02318766713142395, 0.04289718344807625, 0.03246273472905159, 0.46723151206970215, 0.29448336362838745, 0.06028793379664421, 0.02782520093023777, 0.05101286992430687, 0.8876930475234985, 0.03227974846959114, 0.0792321115732193, 0.009054933674633503, 0.986987829208374, 0.019230911508202553, 0.004807727877050638, 0.9735649228096008, 0.053210411220788956, 0.9459628462791443, 0.9955835938453674, 0.9951725006103516, 0.9991540908813477, 0.9979762434959412, 0.9936963319778442, 0.007695446722209454, 0.9907887578010559, 0.9962958693504333, 0.0020005942787975073, 0.0020005942787975073, 0.7685548663139343, 0.2287604659795761, 0.20653042197227478, 0.7855666279792786, 0.006759177427738905, 0.34749361872673035, 0.034891776740550995, 0.11749272048473358, 0.017089851200580597, 0.17588303983211517, 0.010681157000362873, 0.04486085847020149, 0.18585212528705597, 0.012817388400435448, 0.05340578407049179, 0.996053159236908, 0.9903555512428284, 0.04634469747543335, 0.09325803816318512, 0.14557352662086487, 0.28887245059013367, 0.09695424139499664, 0.0958169475197792, 0.07705160975456238, 0.0958169475197792, 0.03866796940565109, 0.021892894059419632, 0.06008889153599739, 0.06687311828136444, 0.13083872199058533, 0.4409749209880829, 0.256831556558609, 0.04361290484666824, 0.0064284466207027435, 0.9899807572364807, 0.9886947870254517, 0.9950776696205139, 0.9919518828392029, 0.09934293478727341, 0.038046229630708694, 0.1631760448217392, 0.17163076996803284, 0.03381887078285217, 0.05241924896836281, 0.09257915616035461, 0.24434134364128113, 0.02536415308713913, 0.07905161380767822, 0.04936765506863594, 0.9424734115600586, 0.007479947991669178, 0.9844189286231995, 0.05895441398024559, 0.2187705934047699, 0.01633676514029503, 0.11222647875547409, 0.061795592308044434, 0.24718236923217773, 0.026280883699655533, 0.014205883257091045, 0.11293677240610123, 0.13069412112236023, 0.9943311214447021, 0.9966910481452942, 0.1197439506649971, 0.8786845207214355, 0.004850068595260382, 0.9894140362739563, 0.08816782385110855, 0.9062831997871399, 0.004100828897207975, 0.012024443596601486, 0.012024443596601486, 0.0745515525341034, 0.009619555436074734, 0.7070373296737671, 0.007214666344225407, 0.17555688321590424, 0.08572755008935928, 0.08572755008935928, 0.027654048055410385, 0.03318485617637634, 0.7660171389579773, 0.9978319406509399, 0.03353497385978699, 0.8607310652732849, 0.10060492902994156, 0.009947385638952255, 0.988106906414032, 0.9937465786933899, 0.9970183968544006, 0.38660314679145813, 0.25971803069114685, 0.01553021278232336, 0.02296488918364048, 0.0650947168469429, 0.1019376739859581, 0.014208491891622543, 0.05749483034014702, 0.06030348315834999, 0.016025857999920845, 0.07527759671211243, 0.05645819753408432, 0.135157510638237, 0.09580785036087036, 0.06843417882919312, 0.03763879835605621, 0.051325634121894836, 0.04961477965116501, 0.42771363258361816, 0.17850126326084137, 0.3224695920944214, 0.04134225472807884, 0.036964841187000275, 0.04669243097305298, 0.1381317675113678, 0.027723630890250206, 0.11770383268594742, 0.0753888189792633, 0.015077764168381691, 0.002935068216174841, 0.012718629091978073, 0.22795696556568146, 0.15262354910373688, 0.04304766654968262, 0.1330564320087433, 0.4148229658603668, 0.011740272864699364, 0.9925435185432434, 0.9940683841705322, 0.9845766425132751, 0.0067675975151360035, 0.9914530515670776, 0.9901037216186523, 0.021420219913125038, 0.8907241821289062, 0.08746589720249176, 0.013839946128427982, 0.2886617183685303, 0.6959515810012817, 0.9896976351737976, 0.015450194478034973, 0.035816360265016556, 0.02177072875201702, 0.01685475744307041, 0.013343350030481815, 0.23737117648124695, 0.013343350030481815, 0.6468012928962708, 0.3704948127269745, 0.6289325952529907, 0.9970839023590088, 0.9916179776191711, 0.06309525668621063, 0.23160114884376526, 0.09143144637346268, 0.03778158873319626, 0.05516112223267555, 0.10049902647733688, 0.04496009275317192, 0.051760777831077576, 0.1987311691045761, 0.12505705654621124, 0.5733996629714966, 0.11945825815200806, 0.09025734663009644, 0.11680363118648529, 0.0929119810461998, 0.006636569742113352, 0.9917995929718018, 0.782045841217041, 0.031643472611904144, 0.12431364506483078, 0.06102669611573219, 0.11312982439994812, 0.85518479347229, 0.028761819005012512, 0.1125701516866684, 0.05992540344595909, 0.0016801515594124794, 0.18145637214183807, 0.20833879709243774, 0.05376484990119934, 0.18929708003997803, 0.04480404034256935, 0.052084699273109436, 0.09632869064807892, 0.9851973056793213, 0.15788429975509644, 0.6178081631660461, 0.17962199449539185, 0.04461947828531265, 0.052308328449726105, 0.0018681546207517385, 0.0840669572353363, 0.32599297165870667, 0.043901633471250534, 0.4763794243335724, 0.014945236966013908, 0.021588508039712906, 0.053971268236637115, 0.11873678863048553, 0.8041719198226929, 0.08918620645999908, 0.9111455678939819, 0.9924914240837097, 0.9945734143257141, 0.9974730014801025, 0.014665473252534866, 0.12221228331327438, 0.017924467101693153, 0.027701450511813164, 0.23627707362174988, 0.016294971108436584, 0.5654354691505432, 0.09712156653404236, 0.8602195978164673, 0.0369986928999424, 0.05592300370335579, 0.0888008177280426, 0.05991750583052635, 0.4363223612308502, 0.06944285333156586, 0.10846605151891708, 0.01689980924129486, 0.006145385093986988, 0.14288020133972168, 0.015363463200628757, 0.007692718878388405, 0.5173353552818298, 0.2650141716003418, 0.13462257385253906, 0.07038837671279907, 0.005000267177820206, 0.3816435635089874, 0.487569123506546, 0.11059874296188354, 0.0077886441722512245, 0.012461830861866474, 0.9942175149917603, 0.9963088035583496, 0.05934375524520874, 0.025176139548420906, 0.23557673394680023, 0.5916392803192139, 0.05215057358145714, 0.03416761755943298, 0.18870770931243896, 0.0022071078419685364, 0.046349264681339264, 0.04303860291838646, 0.18098284304141998, 0.020967524498701096, 0.5164632201194763, 0.05881141871213913, 0.10455363243818283, 0.2860703468322754, 0.0609896183013916, 0.0762370228767395, 0.007986735552549362, 0.014521338045597076, 0.29115283489227295, 0.07986735552549362, 0.019603805616497993, 0.14538146555423737, 0.03939726948738098, 0.2041999250650406, 0.01609184220433235, 0.0016646733274683356, 0.07657497376203537, 0.0005548911285586655, 0.4916335344314575, 0.024970099329948425, 0.9953145384788513, 0.9900142550468445, 0.9978221654891968, 0.9882532358169556, 0.9908885955810547, 0.04804708808660507, 0.3049945533275604, 0.12394756078720093, 0.12046588957309723, 0.0936570018529892, 0.06649995595216751, 0.07102613151073456, 0.06336645036935806, 0.08495282381772995, 0.022979041561484337, 0.9857718348503113, 0.991929829120636, 0.9904465079307556, 0.9939417243003845, 0.07081771641969681, 0.9247960448265076, 0.05752654746174812, 0.26479777693748474, 0.13217931985855103, 0.19014500081539154, 0.040400322526693344, 0.10363561660051346, 0.04215686023235321, 0.07245710492134094, 0.07553104311227798, 0.020639296621084213, 0.08443208038806915, 0.3670520484447479, 0.031851623207330704, 0.05965859815478325, 0.05915301665663719, 0.11881161481142044, 0.05814185366034508, 0.08999347686767578, 0.10768882185220718, 0.022751159965991974, 0.02230319008231163, 0.9701887369155884, 0.9776880741119385, 0.9889037609100342, 0.2192477583885193, 0.7779079079627991, 0.09415528178215027, 0.9041321277618408, 0.06514911353588104, 0.08344942331314087, 0.1372523456811905, 0.21704170107841492, 0.03806464746594429, 0.1442064642906189, 0.09625963866710663, 0.03660062327980995, 0.1087038516998291, 0.0732012465596199, 0.04354425519704819, 0.0319778136909008, 0.24969910085201263, 0.04966766759753227, 0.20207256078720093, 0.0006803789874538779, 0.0319778136909008, 0.09865495562553406, 0.23337000608444214, 0.05851259455084801, 0.02581452950835228, 0.01173387747257948, 0.854226291179657, 0.002346775494515896, 0.08213713765144348, 0.021120978519320488, 0.9888254404067993, 0.06689516454935074, 0.09981182962656021, 0.13485215604305267, 0.13591398298740387, 0.06583333015441895, 0.006370967719703913, 0.024422042071819305, 0.060524191707372665, 0.3291666507720947, 0.07432795315980911, 0.991152822971344, 0.9976637363433838, 0.9881917238235474, 0.0415508970618248, 0.9556706547737122, 0.14121182262897491, 0.8573575615882874, 0.9959633350372314, 0.37817975878715515, 0.09959379583597183, 0.006086287554353476, 0.07109890133142471, 0.04454055801033974, 0.15022063255310059, 0.05947962775826454, 0.11646940559148788, 0.014662419445812702, 0.05975627526640892, 0.9972384572029114, 0.18402886390686035, 0.0029210930224508047, 0.09347497671842575, 0.049658581614494324, 0.02044765092432499, 0.07886950671672821, 0.5696130990982056, 0.9939109086990356, 0.2841370403766632, 0.05682740733027458, 0.07019855827093124, 0.4679903984069824, 0.09694086760282516, 0.00501418299973011, 0.01838533766567707, 0.9947983026504517, 0.10640466958284378, 0.03546822443604469, 0.03819654881954193, 0.6002314686775208, 0.22099430859088898, 0.9949023723602295, 0.979340136051178, 0.009374642744660378, 0.007030981592833996, 0.20858579874038696, 0.35779884457588196, 0.003124880837276578, 0.019530504941940308, 0.37889179587364197, 0.015624403953552246, 0.9001388549804688, 0.09725118428468704, 0.9928044080734253, 0.9915215373039246, 0.09694231301546097, 0.31304287910461426, 0.07068710029125214, 0.2393263280391693, 0.27870914340019226, 0.9975820779800415, 0.9928552508354187, 0.15090322494506836, 0.8492005467414856, 0.34192684292793274, 0.25229331851005554, 0.001819969853386283, 0.04618173465132713, 0.09463842958211899, 0.06574641168117523, 0.05596407130360603, 0.04049433022737503, 0.06074149161577225, 0.04026683419942856, 0.00978680606931448, 0.09786806255578995, 0.029360417276620865, 0.8220916986465454, 0.03914722427725792, 0.9928327798843384, 0.014372894540429115, 0.12560659646987915, 0.2262168675661087, 0.05811648815870285, 0.07061465829610825, 0.017497437074780464, 0.07561392337083817, 0.01562271174043417, 0.3499487340450287, 0.047493044286966324, 0.11003716289997101, 0.2054027020931244, 0.07580337673425674, 0.03178851306438446, 0.5746384859085083, 0.3218027353286743, 0.6757857799530029, 0.04022909700870514, 0.044463738799095154, 0.029642490670084953, 0.09104479849338531, 0.5356821417808533, 0.15879906713962555, 0.09951408207416534, 0.21030759811401367, 0.7733358144760132, 0.001655965344980359, 0.013247722759842873, 0.9961628913879395, 0.9994528889656067, 0.9940481781959534, 0.9878154397010803, 0.3193429112434387, 0.6789767742156982, 0.17293505370616913, 0.014762748964130878, 0.8098422288894653, 0.07927528023719788, 0.004718767013400793, 0.9126095175743103, 0.0018875066889449954, 0.9899497628211975, 0.009148583747446537, 0.04269339144229889, 0.21549998223781586, 0.07522169500589371, 0.43404948711395264, 0.14231130480766296, 0.05489150434732437, 0.027445752173662186, 0.12140603363513947, 0.029261967167258263, 0.4999438226222992, 0.12700939178466797, 0.03673310950398445, 0.023658612743020058, 0.0678628608584404, 0.04171387106180191, 0.006225950550287962, 0.04544943943619728, 0.9914941787719727, 0.9966549277305603, 0.9308264255523682, 0.06878028064966202, 0.9908043742179871, 0.03596719354391098, 0.9531306028366089, 0.9876322150230408, 0.990831196308136, 0.11258002370595932, 0.885111927986145, 0.9979943037033081, 0.9953410029411316, 0.014253759756684303, 0.9835094213485718, 0.9921932816505432, 0.9887199401855469, 0.02808680571615696, 0.9549513459205627, 0.009362268261611462, 0.012287507764995098, 0.03891044110059738, 0.043006278574466705, 0.13311466574668884, 0.06553337723016739, 0.08806046843528748, 0.5345065593719482, 0.08191671967506409, 0.9892351627349854, 0.0012264200486242771, 0.5175492763519287, 0.32316169142723083, 0.042311493307352066, 0.05212285369634628, 0.005518890451639891, 0.03556618466973305, 0.0042924704030156136, 0.017783092334866524, 0.05752358213067055, 0.8576242923736572, 0.08367066830396652, 0.9361351728439331, 0.06112222746014595, 0.9920821785926819, 0.113490991294384, 0.09021078795194626, 0.6205629110336304, 0.04365038126707077, 0.0065475571900606155, 0.01455012708902359, 0.038557834923267365, 0.06547556817531586, 0.007275063544511795, 0.0005374156753532588, 0.21496626734733582, 0.028483029454946518, 0.7529193162918091, 0.0032244939357042313, 0.05143122002482414, 0.9429057240486145, 0.9488199353218079, 0.04447593539953232, 0.00494177034124732, 0.5825725793838501, 0.09321161359548569, 0.2896218001842499, 0.015535268932580948, 0.018864255398511887, 0.9941855072975159, 0.07540678977966309, 0.09515619277954102, 0.007181599270552397, 0.025135597214102745, 0.5152797698974609, 0.15799517929553986, 0.014363198541104794, 0.021544797345995903, 0.07361139357089996, 0.014363198541104794, 0.9840489625930786, 0.044449977576732635, 0.9260411858558655, 0.02963331714272499, 0.9803271293640137, 0.036795347929000854, 0.08714687824249268, 0.21302570402622223, 0.023239167407155037, 0.07552729547023773, 0.5054518580436707, 0.013556180521845818, 0.04454173520207405, 0.0161642637103796, 0.010776176117360592, 0.9644677639007568, 0.25456756353378296, 0.05604676902294159, 0.09533188492059708, 0.08485585451126099, 0.07542742788791656, 0.0790940374135971, 0.19380658864974976, 0.029856689274311066, 0.056570570915937424, 0.07490362226963043, 0.9937314391136169, 0.2710559070110321, 0.05701915919780731, 0.04785025119781494, 0.04240620881319046, 0.06332278251647949, 0.31919267773628235, 0.004011398181319237, 0.12406681478023529, 0.014326422475278378, 0.05673263221979141, 0.08566314727067947, 0.059305258095264435, 0.024161402136087418, 0.7292349934577942, 0.026357892900705338, 0.013178946450352669, 0.008785963989794254, 0.050519295036792755, 0.9911162257194519, 0.006925193127244711, 0.14658324420452118, 0.027700772508978844, 0.14196646213531494, 0.19736799597740173, 0.08194811642169952, 0.29085808992385864, 0.10618629306554794, 0.9819319248199463, 0.9772378206253052, 0.9975225329399109, 0.9917201995849609, 0.1665320247411728, 0.1619061380624771, 0.025442393496632576, 0.11217781901359558, 0.01619061268866062, 0.011564724147319794, 0.49959608912467957, 0.005782362073659897, 0.9957937598228455, 0.9916776418685913, 0.9888594746589661, 0.9933105707168579, 0.9947336316108704, 0.9945342540740967, 0.2329992949962616, 0.1141112744808197, 0.013268752954900265, 0.05891326069831848, 0.11835727095603943, 0.13640277087688446, 0.05891326069831848, 0.05148275941610336, 0.1480792760848999, 0.067936010658741, 0.9844375848770142, 0.05380403250455856, 0.8496553301811218, 0.017934676259756088, 0.05604586750268936, 0.022418346256017685, 0.0005918670794926584, 0.02959335222840309, 0.1485586315393448, 0.0017756011802703142, 0.8191440105438232, 0.0007285924511961639, 0.08888828009366989, 0.1347896009683609, 0.17486219108104706, 0.1617475301027298, 0.0029143698047846556, 0.11657479405403137, 0.31329476833343506, 0.00655733235180378, 0.2761455476284027, 0.19480666518211365, 0.008133890107274055, 0.15861085057258606, 0.0662912055850029, 0.11224768310785294, 0.06303764879703522, 0.04026275500655174, 0.055717144161462784, 0.025215057656168938, 0.9921115636825562, 0.016401542350649834, 0.21937061846256256, 0.2183455228805542, 0.11891117691993713, 0.06970655173063278, 0.006150578148663044, 0.09225866943597794, 0.2583242654800415, 0.9893926978111267, 0.010924343019723892, 0.02490750327706337, 0.2569405734539032, 0.4173099100589752, 0.03189908340573311, 0.09263843297958374, 0.11973080784082413, 0.027529345825314522, 0.01791592314839363, 0.9878115057945251, 0.9829196333885193, 0.9951297044754028, 0.011210200376808643, 0.25335052609443665, 0.1322803646326065, 0.01793632097542286, 0.051566921174526215, 0.5313634872436523, 0.9887993931770325, 0.11263924837112427, 0.2589200735092163, 0.019223764538764954, 0.10693219304084778, 0.12255150079727173, 0.14748232066631317, 0.10512996464967728, 0.042352356016635895, 0.07779616862535477, 0.0069085401482880116, 0.9897999167442322, 0.9859444499015808, 0.9879947304725647, 0.13968348503112793, 0.12965098023414612, 0.05633643642067909, 0.1337025761604309, 0.14469975233078003, 0.09781703352928162, 0.11267287284135818, 0.0472685843706131, 0.06926294416189194, 0.0690700113773346, 0.010668139904737473, 0.06756488978862762, 0.849895179271698, 0.021336279809474945, 0.04978465288877487, 0.9944585561752319, 0.018542524427175522, 0.002852695994079113, 0.46071040630340576, 0.041364092379808426, 0.4749738872051239, 0.16669614613056183, 0.8296921849250793, 0.9947420358657837, 0.06429172307252884, 0.47368955612182617, 0.013301734812557697, 0.1337563395500183, 0.05172897130250931, 0.08128838241100311, 0.008128838613629341, 0.04951201379299164, 0.06133577972650528, 0.06355273723602295, 0.9842392802238464, 0.10246173292398453, 0.8283525705337524, 0.04906618222594261, 0.002886245958507061, 0.015874352306127548, 0.9982162714004517, 0.9969639778137207, 0.9986324310302734, 0.9921741485595703, 0.03859842196106911, 0.9544336795806885, 0.0035089473240077496, 0.9931648969650269, 0.99313884973526, 0.03596452251076698, 0.014652212150394917, 0.042624618858098984, 0.06393692642450333, 0.033300481736660004, 0.6793298721313477, 0.08391721546649933, 0.045288655906915665, 0.014020097441971302, 0.9720600843429565, 0.009346731007099152, 0.9924536347389221, 0.005523736588656902, 0.9942725300788879, 0.9951942563056946, 0.04679335653781891, 0.8838745355606079, 0.06759040802717209, 0.7121989727020264, 0.1270459145307541, 0.052858516573905945, 0.10664437711238861, 0.9878156185150146, 0.9903208017349243, 0.9929757714271545, 0.9881840348243713, 0.020772220566868782, 0.6825157999992371, 0.29377853870391846, 0.0029674600809812546, 0.9971234798431396, 0.003084203926846385, 0.05119778588414192, 0.5261651873588562, 0.3065698742866516, 0.0018505224725231528, 0.03639360889792442, 0.028374677523970604, 0.04317885637283325, 0.003084203926846385, 0.9957553148269653, 0.9854987263679504, 0.02171097695827484, 0.00542774423956871, 0.9457844495773315, 0.0257817842066288, 0.9875307083129883, 0.00667250482365489, 0.007349025458097458, 0.07349025458097458, 0.012860794551670551, 0.22230802476406097, 0.09553732722997665, 0.014698050916194916, 0.5750612616539001, 0.9939971566200256, 0.003269727574661374, 0.9878903031349182, 0.9933966398239136, 0.9575048089027405, 0.03928224742412567, 0.9776325821876526, 0.01339222677052021, 0.17330770194530487, 0.11415642499923706, 0.09121457487344742, 0.18436400592327118, 0.1000596284866333, 0.14179719984531403, 0.06937836110591888, 0.0420139878988266, 0.05279389023780823, 0.03040485829114914, 0.08410754054784775, 0.021627653390169144, 0.07689832150936127, 0.06728602945804596, 0.747355580329895, 0.3352258801460266, 0.6621745228767395, 0.002759060589596629, 0.040964558720588684, 0.9597410559654236, 0.9989423751831055, 0.013820650056004524, 0.315178245306015, 0.6708071231842041, 0.05501579865813255, 0.14754237234592438, 0.01000287290662527, 0.005001436453312635, 0.7827247977256775, 0.04238295927643776, 0.9505892395973206, 0.012514205649495125, 0.00782137829810381, 0.9776723384857178, 0.9941579699516296, 0.1177714541554451, 0.5513504147529602, 0.10501912981271744, 0.062261343002319336, 0.027004919946193695, 0.04050737991929054, 0.015752868726849556, 0.028505193069577217, 0.015752868726849556, 0.03600655868649483, 0.10179346799850464, 0.06227659061551094, 0.09353993833065033, 0.3176356256008148, 0.2118404507637024, 0.047520291060209274, 0.05627403035759926, 0.05527360364794731, 0.05027146637439728, 0.004001708701252937, 0.22780875861644745, 0.16640575230121613, 0.09737280011177063, 0.15005584061145782, 0.10609275102615356, 0.05122971907258034, 0.08029622584581375, 0.011989934369921684, 0.05340970680117607, 0.054863035678863525, 0.009546658024191856, 0.9880791306495667, 0.9947073459625244, 0.9951348900794983, 0.9956521391868591, 0.9887626767158508, 0.9815458059310913, 0.9880534410476685, 0.13009525835514069, 0.03196198120713234, 0.015481585636734962, 0.038953665643930435, 0.21624279022216797, 0.06367426365613937, 0.24495863914489746, 0.04095128923654556, 0.06791920959949493, 0.14982178807258606, 0.9868786931037903, 0.9906402826309204, 0.9910144209861755], \"Term\": [\"accept\", \"accept\", \"accept\", \"accept\", \"accept\", \"accept\", \"accept\", \"accept\", \"accept\", \"access\", \"access\", \"access\", \"access\", \"access\", \"access\", \"adaptec\", \"address\", \"address\", \"address\", \"address\", \"address\", \"address\", \"address\", \"address\", \"address\", \"address\", \"administr\", \"administr\", \"administr\", \"administr\", \"agenc\", \"agenc\", \"agenc\", \"agenc\", \"agenc\", \"aid\", \"aid\", \"aid\", \"aid\", \"alaska\", \"algorithm\", \"algorithm\", \"alomar\", \"amanda\", \"american\", \"american\", \"american\", \"american\", \"american\", \"american\", \"american\", \"american\", \"andrew\", \"andrew\", \"andrew\", \"andrew\", \"andrew\", \"andrew\", \"andrew\", \"andrew\", \"anonym\", \"anonym\", \"anti\", \"anti\", \"anti\", \"appl\", \"appl\", \"appl\", \"applic\", \"applic\", \"applic\", \"applic\", \"applic\", \"arab\", \"arab\", \"archiv\", \"archiv\", \"archiv\", \"archiv\", \"argic\", \"argument\", \"argument\", \"argument\", \"argument\", \"argument\", \"argument\", \"argument\", \"argument\", \"arm\", \"arm\", \"arm\", \"arm\", \"arm\", \"armenia\", \"armenian\", \"armi\", \"armi\", \"armi\", \"armi\", \"armori\", \"atheism\", \"atheist\", \"atho\", \"attack\", \"attack\", \"attack\", \"attack\", \"attack\", \"attack\", \"aurora\", \"author\", \"author\", \"author\", \"author\", \"author\", \"auto\", \"auto\", \"auto\", \"auto\", \"auto\", \"auto\", \"autom\", \"automot\", \"avail\", \"avail\", \"avail\", \"avail\", \"avail\", \"avail\", \"avail\", \"avail\", \"avail\", \"avail\", \"azerbaijan\", \"azerbaijani\", \"azeri\", \"baalk\", \"baerga\", \"ball\", \"ball\", \"ball\", \"bank\", \"bank\", \"bank\", \"bank\", \"bank\", \"bank\", \"bank\", \"bank\", \"bank\", \"basebal\", \"basebal\", \"bat\", \"batf\", \"batf\", \"batteri\", \"batteri\", \"belief\", \"belief\", \"believ\", \"believ\", \"believ\", \"believ\", \"believ\", \"believ\", \"believ\", \"believ\", \"believ\", \"believ\", \"berkeley\", \"berkeley\", \"berkeley\", \"berkeley\", \"best\", \"best\", \"best\", \"best\", \"best\", \"best\", \"best\", \"best\", \"best\", \"best\", \"better\", \"better\", \"better\", \"better\", \"better\", \"better\", \"better\", \"better\", \"better\", \"better\", \"bibl\", \"biblic\", \"bike\", \"bike\", \"billion\", \"billion\", \"binari\", \"binari\", \"bio\", \"blah\", \"blast\", \"board\", \"board\", \"board\", \"board\", \"board\", \"board\", \"board\", \"board\", \"boni\", \"bontchev\", \"book\", \"book\", \"book\", \"book\", \"book\", \"book\", \"book\", \"book\", \"boyl\", \"brake\", \"brake\", \"brave\", \"brave\", \"bruin\", \"build\", \"build\", \"build\", \"build\", \"build\", \"build\", \"build\", \"build\", \"build\", \"build\", \"buy\", \"buy\", \"buy\", \"buy\", \"buy\", \"byte\", \"byte\", \"byte\", \"cach\", \"cactus\", \"cadr\", \"callison\", \"canada\", \"canada\", \"canada\", \"canada\", \"canada\", \"canada\", \"canada\", \"canada\", \"canada\", \"cancer\", \"cancer\", \"candida\", \"canuck\", \"car\", \"car\", \"card\", \"card\", \"card\", \"card\", \"card\", \"carlo\", \"case\", \"case\", \"case\", \"case\", \"case\", \"case\", \"case\", \"case\", \"case\", \"case\", \"catbyt\", \"catcher\", \"cathol\", \"caus\", \"caus\", \"caus\", \"caus\", \"caus\", \"caus\", \"caus\", \"caus\", \"caus\", \"centerlin\", \"centri\", \"char\", \"chastiti\", \"children\", \"children\", \"children\", \"children\", \"children\", \"children\", \"chip\", \"chip\", \"chip\", \"chopin\", \"christ\", \"christ\", \"christian\", \"christian\", \"church\", \"church\", \"church\", \"cica\", \"cipher\", \"ciphertext\", \"circuit\", \"circuit\", \"circuit\", \"claim\", \"claim\", \"claim\", \"claim\", \"claim\", \"claim\", \"claim\", \"claim\", \"claim\", \"claim\", \"clarkson\", \"classifi\", \"classifi\", \"classifi\", \"classifi\", \"clayton\", \"cleveland\", \"cleveland\", \"cleveland\", \"client\", \"client\", \"clinic\", \"clinic\", \"clinton\", \"clinton\", \"clinton\", \"clinton\", \"clipper\", \"clipper\", \"coach\", \"coach\", \"code\", \"code\", \"code\", \"code\", \"code\", \"code\", \"color\", \"color\", \"color\", \"color\", \"color\", \"color\", \"colorado\", \"colorado\", \"colorado\", \"colorado\", \"colorado\", \"colorado\", \"colorado\", \"colorado\", \"columbia\", \"columbia\", \"columbia\", \"columbia\", \"columbia\", \"come\", \"come\", \"come\", \"come\", \"come\", \"come\", \"come\", \"come\", \"come\", \"come\", \"communic\", \"communic\", \"communic\", \"communic\", \"communic\", \"communic\", \"communic\", \"communic\", \"compil\", \"compil\", \"compil\", \"compil\", \"concordia\", \"config\", \"contradict\", \"contradict\", \"contradict\", \"contrib\", \"control\", \"control\", \"control\", \"control\", \"control\", \"control\", \"control\", \"control\", \"control\", \"copi\", \"copi\", \"copi\", \"copi\", \"copi\", \"copi\", \"copi\", \"copper\", \"cost\", \"cost\", \"cost\", \"cost\", \"cost\", \"cost\", \"cost\", \"cost\", \"counterst\", \"countri\", \"countri\", \"countri\", \"countri\", \"countri\", \"countri\", \"countri\", \"court\", \"court\", \"court\", \"court\", \"cramer\", \"crime\", \"crime\", \"crime\", \"crypt\", \"crypto\", \"cryptograph\", \"cryptographi\", \"ctrl\", \"cub\", \"cunixb\", \"cure\", \"cwru\", \"cwru\", \"data\", \"data\", \"data\", \"data\", \"data\", \"data\", \"data\", \"david\", \"david\", \"david\", \"david\", \"david\", \"david\", \"david\", \"david\", \"david\", \"david\", \"davidian\", \"dealer\", \"dealer\", \"dealer\", \"death\", \"death\", \"death\", \"death\", \"death\", \"death\", \"decrypt\", \"den\", \"desi\", \"design\", \"design\", \"design\", \"design\", \"design\", \"design\", \"design\", \"design\", \"design\", \"deskjet\", \"detroit\", \"devic\", \"devic\", \"devic\", \"devic\", \"diamond\", \"diet\", \"differ\", \"differ\", \"differ\", \"differ\", \"differ\", \"differ\", \"differ\", \"differ\", \"differ\", \"differ\", \"dillon\", \"directori\", \"directori\", \"directori\", \"diseas\", \"disk\", \"disk\", \"disk\", \"display\", \"display\", \"display\", \"display\", \"display\", \"display\", \"display\", \"distribut\", \"distribut\", \"distribut\", \"distribut\", \"distribut\", \"distribut\", \"distribut\", \"distribut\", \"distribut\", \"distribut\", \"divin\", \"divis\", \"divis\", \"divis\", \"divis\", \"divis\", \"divis\", \"divis\", \"divis\", \"divis\", \"dock\", \"doctor\", \"doctor\", \"doctor\", \"doctrin\", \"dodger\", \"drive\", \"drive\", \"drive\", \"drive\", \"drive\", \"drive\", \"drive\", \"drive\", \"driver\", \"driver\", \"driver\", \"driver\", \"driver\", \"dseg\", \"dseg\", \"dtmedin\", \"duke\", \"duke\", \"dyer\", \"earth\", \"earth\", \"earth\", \"earth\", \"earth\", \"earth\", \"edmonton\", \"effect\", \"effect\", \"effect\", \"effect\", \"effect\", \"effect\", \"effect\", \"effect\", \"effect\", \"effect\", \"einstein\", \"eisa\", \"email\", \"email\", \"email\", \"email\", \"email\", \"email\", \"email\", \"email\", \"encrypt\", \"enforc\", \"enforc\", \"enforc\", \"enforc\", \"enforc\", \"engin\", \"engin\", \"engin\", \"engin\", \"engin\", \"engin\", \"engin\", \"engin\", \"engin\", \"engin\", \"engr\", \"entri\", \"entri\", \"entri\", \"ericsson\", \"escrow\", \"esdi\", \"espn\", \"etern\", \"etern\", \"etern\", \"ether\", \"ethernet\", \"ethnic\", \"evid\", \"evid\", \"evid\", \"evid\", \"evid\", \"evid\", \"exist\", \"exist\", \"exist\", \"exist\", \"exist\", \"exist\", \"exist\", \"exist\", \"exist\", \"extermin\", \"faith\", \"faith\", \"fbihh\", \"feder\", \"feder\", \"feder\", \"feder\", \"file\", \"file\", \"file\", \"file\", \"final\", \"final\", \"final\", \"final\", \"final\", \"final\", \"final\", \"final\", \"final\", \"final\", \"firearm\", \"fischer\", \"flight\", \"flight\", \"flight\", \"flight\", \"floppi\", \"floppi\", \"flyer\", \"flyer\", \"fnal\", \"follow\", \"follow\", \"follow\", \"follow\", \"follow\", \"follow\", \"follow\", \"follow\", \"follow\", \"follow\", \"font\", \"font\", \"food\", \"food\", \"food\", \"food\", \"forc\", \"forc\", \"forc\", \"forc\", \"forc\", \"forc\", \"forc\", \"forc\", \"forc\", \"forc\", \"format\", \"format\", \"format\", \"format\", \"format\", \"freenet\", \"freenet\", \"freenet\", \"frost\", \"frost\", \"function\", \"function\", \"function\", \"function\", \"function\", \"function\", \"fund\", \"fund\", \"fund\", \"fund\", \"fund\", \"game\", \"game\", \"game\", \"game\", \"gatech\", \"gaza\", \"genet\", \"genet\", \"genocid\", \"go\", \"go\", \"go\", \"go\", \"go\", \"go\", \"go\", \"go\", \"go\", \"go\", \"goal\", \"goal\", \"goal\", \"goal\", \"goal\", \"goal\", \"god\", \"good\", \"good\", \"good\", \"good\", \"good\", \"good\", \"good\", \"good\", \"good\", \"good\", \"gordon\", \"gordon\", \"gospel\", \"govern\", \"govern\", \"govern\", \"govern\", \"gradi\", \"graphic\", \"graphic\", \"great\", \"great\", \"great\", \"great\", \"great\", \"great\", \"great\", \"great\", \"great\", \"great\", \"greec\", \"greec\", \"greek\", \"greek\", \"greenbelt\", \"grind\", \"grind\", \"grind\", \"grind\", \"grind\", \"grind\", \"grind\", \"group\", \"group\", \"group\", \"group\", \"group\", \"group\", \"group\", \"group\", \"group\", \"group\", \"gtoal\", \"gun\", \"gun\", \"halat\", \"hallam\", \"hamburg\", \"handbook\", \"handgun\", \"handgun\", \"handheld\", \"handheld\", \"handheld\", \"happen\", \"happen\", \"happen\", \"happen\", \"happen\", \"happen\", \"happen\", \"happen\", \"happen\", \"happen\", \"hard\", \"hard\", \"hard\", \"hard\", \"hard\", \"hard\", \"hard\", \"hard\", \"hard\", \"harley\", \"health\", \"health\", \"health\", \"health\", \"heaven\", \"heaven\", \"heaven\", \"heaven\", \"helmet\", \"helmet\", \"helmet\", \"help\", \"help\", \"help\", \"help\", \"help\", \"help\", \"help\", \"help\", \"help\", \"help\", \"henri\", \"henri\", \"higgin\", \"high\", \"high\", \"high\", \"high\", \"high\", \"high\", \"high\", \"high\", \"high\", \"high\", \"hit\", \"hit\", \"hit\", \"hit\", \"hit\", \"hitler\", \"hitter\", \"hockey\", \"holi\", \"holi\", \"home\", \"home\", \"home\", \"home\", \"home\", \"home\", \"home\", \"home\", \"home\", \"home\", \"homeopathi\", \"homicid\", \"honda\", \"hulman\", \"husc\", \"hydro\", \"iastat\", \"iastat\", \"ifa\", \"illinoi\", \"illinoi\", \"illinoi\", \"illinoi\", \"illinoi\", \"illinoi\", \"illinoi\", \"illinoi\", \"imag\", \"imag\", \"imag\", \"imag\", \"imag\", \"imak\", \"includ\", \"includ\", \"includ\", \"includ\", \"includ\", \"includ\", \"includ\", \"includ\", \"includ\", \"includ\", \"indiana\", \"indiana\", \"indiana\", \"indiana\", \"indiana\", \"indiana\", \"infect\", \"inform\", \"inform\", \"inform\", \"inform\", \"inform\", \"inform\", \"inform\", \"inform\", \"inform\", \"inform\", \"ingr\", \"ingr\", \"ingr\", \"inning\", \"instal\", \"instal\", \"instal\", \"instal\", \"instal\", \"insur\", \"insur\", \"insur\", \"insur\", \"intellect\", \"intercon\", \"internet\", \"internet\", \"internet\", \"internet\", \"internet\", \"internet\", \"internet\", \"internet\", \"invest\", \"invest\", \"iran\", \"islam\", \"islam\", \"isra\", \"israel\", \"israel\", \"israel\", \"jaeger\", \"jake\", \"jason\", \"jason\", \"jason\", \"jason\", \"jay\", \"jeff\", \"jeff\", \"jeff\", \"jeff\", \"jeff\", \"jeff\", \"jeff\", \"jesus\", \"jet\", \"jet\", \"jew\", \"jew\", \"jew\", \"job\", \"job\", \"job\", \"john\", \"john\", \"john\", \"john\", \"john\", \"john\", \"john\", \"john\", \"john\", \"john\", \"jumper\", \"jumper\", \"kaldi\", \"kelvin\", \"key\", \"key\", \"kill\", \"kill\", \"kill\", \"kill\", \"kill\", \"kill\", \"kill\", \"koresh\", \"lamp\", \"larc\", \"larc\", \"laughter\", \"launch\", \"launch\", \"laurentian\", \"leaf\", \"leagu\", \"leagu\", \"leav\", \"leav\", \"leav\", \"leav\", \"leav\", \"leav\", \"leav\", \"leav\", \"leav\", \"leav\", \"lebanes\", \"lemieux\", \"librari\", \"librari\", \"librari\", \"librari\", \"librari\", \"librari\", \"life\", \"life\", \"life\", \"life\", \"life\", \"life\", \"life\", \"life\", \"life\", \"life\", \"list\", \"list\", \"list\", \"list\", \"list\", \"list\", \"list\", \"list\", \"list\", \"list\", \"live\", \"live\", \"live\", \"live\", \"live\", \"live\", \"live\", \"live\", \"livesey\", \"long\", \"long\", \"long\", \"long\", \"long\", \"long\", \"long\", \"long\", \"long\", \"long\", \"look\", \"look\", \"look\", \"look\", \"look\", \"look\", \"look\", \"look\", \"look\", \"look\", \"lopez\", \"lord\", \"lord\", \"lose\", \"lose\", \"lose\", \"lose\", \"lose\", \"lose\", \"lose\", \"lose\", \"lose\", \"lose\", \"love\", \"love\", \"love\", \"love\", \"love\", \"love\", \"love\", \"love\", \"lunar\", \"lunar\", \"lyme\", \"machin\", \"machin\", \"machin\", \"machin\", \"machin\", \"machin\", \"machin\", \"machin\", \"magellan\", \"magnus\", \"mail\", \"mail\", \"mail\", \"mail\", \"mail\", \"mail\", \"mail\", \"mail\", \"map\", \"map\", \"mar\", \"mar\", \"marriag\", \"marriag\", \"massacr\", \"maxtor\", \"maynard\", \"mccall\", \"mcgill\", \"mcgill\", \"mcgill\", \"mean\", \"mean\", \"mean\", \"mean\", \"mean\", \"mean\", \"mean\", \"mean\", \"mean\", \"mean\", \"medic\", \"medic\", \"medic\", \"medic\", \"medic\", \"medicin\", \"medicin\", \"medicin\", \"medicin\", \"meg\", \"memori\", \"memori\", \"memori\", \"memori\", \"memori\", \"memori\", \"memori\", \"messag\", \"messag\", \"messag\", \"messag\", \"messag\", \"messag\", \"messag\", \"messag\", \"messag\", \"met\", \"metal\", \"metal\", \"metal\", \"metal\", \"methodolog\", \"midway\", \"midway\", \"midway\", \"migrain\", \"militia\", \"mime\", \"mission\", \"mission\", \"mission\", \"mission\", \"mksol\", \"mode\", \"mode\", \"mode\", \"mode\", \"mode\", \"mode\", \"modem\", \"modem\", \"modem\", \"money\", \"money\", \"money\", \"money\", \"money\", \"money\", \"money\", \"money\", \"monitor\", \"monitor\", \"monitor\", \"montreal\", \"montreal\", \"moon\", \"moon\", \"moon\", \"moral\", \"moral\", \"mormon\", \"motherboard\", \"motif\", \"motorcycl\", \"motto\", \"mous\", \"mous\", \"murder\", \"murder\", \"murder\", \"muslim\", \"muslim\", \"nasa\", \"nasa\", \"nasa\", \"nation\", \"nation\", \"nation\", \"nation\", \"nation\", \"nation\", \"nation\", \"nation\", \"nation\", \"nation\", \"nazi\", \"ncsl\", \"need\", \"need\", \"need\", \"need\", \"need\", \"need\", \"need\", \"need\", \"need\", \"need\", \"netcom\", \"netcom\", \"netcom\", \"netcom\", \"netcom\", \"netcom\", \"nist\", \"nist\", \"nore\", \"nsmca\", \"nubus\", \"number\", \"number\", \"number\", \"number\", \"number\", \"number\", \"number\", \"number\", \"number\", \"number\", \"ohio\", \"ohio\", \"ohio\", \"openwindow\", \"opinion\", \"opinion\", \"opinion\", \"opinion\", \"opinion\", \"opinion\", \"opinion\", \"opinion\", \"opinion\", \"opinion\", \"optilink\", \"oracl\", \"orbit\", \"orbit\", \"outlet\", \"outlet\", \"output\", \"output\", \"output\", \"owner\", \"owner\", \"owner\", \"owner\", \"owner\", \"owner\", \"owner\", \"pain\", \"pain\", \"pain\", \"pain\", \"pain\", \"palestinian\", \"patent\", \"patent\", \"patent\", \"patient\", \"patient\", \"pen\", \"penguin\", \"peopl\", \"peopl\", \"peopl\", \"peopl\", \"peopl\", \"peopl\", \"peopl\", \"peopl\", \"peopl\", \"peopl\", \"period\", \"period\", \"period\", \"period\", \"period\", \"period\", \"period\", \"period\", \"period\", \"person\", \"person\", \"person\", \"person\", \"person\", \"person\", \"person\", \"person\", \"person\", \"person\", \"phone\", \"phone\", \"phone\", \"phone\", \"phone\", \"phone\", \"phone\", \"phone\", \"photographi\", \"physician\", \"pistol\", \"pitch\", \"pitch\", \"pitcher\", \"pitt\", \"pitt\", \"pitt\", \"pittsburgh\", \"pittsburgh\", \"pittsburgh\", \"plaintext\", \"play\", \"play\", \"play\", \"play\", \"play\", \"play\", \"play\", \"play\", \"player\", \"player\", \"playoff\", \"plymouth\", \"point\", \"point\", \"point\", \"point\", \"point\", \"point\", \"point\", \"point\", \"point\", \"point\", \"polit\", \"polit\", \"polit\", \"polit\", \"polit\", \"polit\", \"polygon\", \"popul\", \"popul\", \"popul\", \"popul\", \"port\", \"port\", \"port\", \"power\", \"power\", \"power\", \"power\", \"power\", \"power\", \"power\", \"power\", \"power\", \"power\", \"powerbook\", \"presid\", \"presid\", \"presid\", \"presid\", \"price\", \"price\", \"price\", \"price\", \"price\", \"price\", \"price\", \"princeton\", \"princeton\", \"princeton\", \"princeton\", \"printer\", \"printer\", \"prism\", \"prison\", \"privaci\", \"privat\", \"privat\", \"privat\", \"privat\", \"privat\", \"privat\", \"privat\", \"probe\", \"probe\", \"probe\", \"problem\", \"problem\", \"problem\", \"problem\", \"problem\", \"problem\", \"problem\", \"problem\", \"problem\", \"problem\", \"program\", \"program\", \"program\", \"program\", \"program\", \"program\", \"project\", \"project\", \"project\", \"project\", \"project\", \"propheci\", \"prophet\", \"propos\", \"propos\", \"propos\", \"propos\", \"propos\", \"propos\", \"protect\", \"protect\", \"protect\", \"protect\", \"protect\", \"protect\", \"protect\", \"provid\", \"provid\", \"provid\", \"provid\", \"provid\", \"provid\", \"provid\", \"provid\", \"provid\", \"provid\", \"public\", \"public\", \"public\", \"public\", \"public\", \"public\", \"public\", \"public\", \"public\", \"puck\", \"pyron\", \"quadra\", \"qualcomm\", \"quebec\", \"question\", \"question\", \"question\", \"question\", \"question\", \"question\", \"question\", \"question\", \"question\", \"question\", \"quicktim\", \"raider\", \"ramsey\", \"ranck\", \"ranger\", \"ranger\", \"read\", \"read\", \"read\", \"read\", \"read\", \"read\", \"read\", \"read\", \"read\", \"read\", \"reason\", \"reason\", \"reason\", \"reason\", \"reason\", \"reason\", \"reason\", \"reason\", \"reason\", \"reason\", \"recipi\", \"recipi\", \"redesign\", \"reilli\", \"religi\", \"religi\", \"religion\", \"religion\", \"repli\", \"repli\", \"repli\", \"repli\", \"repli\", \"repli\", \"repli\", \"repli\", \"repli\", \"repli\", \"research\", \"research\", \"research\", \"research\", \"research\", \"research\", \"research\", \"research\", \"research\", \"research\", \"resourc\", \"resourc\", \"resourc\", \"resourc\", \"resourc\", \"resourc\", \"restaur\", \"result\", \"result\", \"result\", \"result\", \"result\", \"result\", \"result\", \"result\", \"result\", \"result\", \"resurrect\", \"revel\", \"revolv\", \"rid\", \"rid\", \"ride\", \"ride\", \"rider\", \"right\", \"right\", \"right\", \"right\", \"right\", \"right\", \"right\", \"right\", \"right\", \"right\", \"ripem\", \"risk\", \"risk\", \"risk\", \"risk\", \"risk\", \"risk\", \"risk\", \"rkba\", \"road\", \"road\", \"road\", \"road\", \"road\", \"road\", \"road\", \"robi\", \"rochest\", \"rochest\", \"rochest\", \"rochest\", \"rochest\", \"rocki\", \"rockwel\", \"run\", \"run\", \"run\", \"run\", \"run\", \"run\", \"run\", \"run\", \"rutger\", \"rutger\", \"rwing\", \"sabbath\", \"sale\", \"sale\", \"sale\", \"sale\", \"sale\", \"sandvik\", \"satan\", \"satellit\", \"satellit\", \"say\", \"say\", \"say\", \"say\", \"say\", \"say\", \"say\", \"say\", \"say\", \"say\", \"scheme\", \"scheme\", \"scheme\", \"scheme\", \"scheme\", \"schneider\", \"scienc\", \"scienc\", \"scienc\", \"scienc\", \"scienc\", \"scienc\", \"scienc\", \"scienc\", \"scienc\", \"scienc\", \"scientif\", \"scientif\", \"scientif\", \"scientif\", \"scientif\", \"score\", \"score\", \"scott\", \"scott\", \"scott\", \"scott\", \"scott\", \"scott\", \"scott\", \"screen\", \"screen\", \"screen\", \"screen\", \"scriptur\", \"scsi\", \"sdpa\", \"sdsu\", \"season\", \"season\", \"secret\", \"secret\", \"secret\", \"secur\", \"secur\", \"secur\", \"secur\", \"selann\", \"sell\", \"sell\", \"sell\", \"sell\", \"sell\", \"sell\", \"sell\", \"sell\", \"send\", \"send\", \"send\", \"send\", \"send\", \"send\", \"send\", \"send\", \"send\", \"send\", \"sera\", \"serdar\", \"server\", \"server\", \"shafer\", \"shaft\", \"shaft\", \"shark\", \"shotgun\", \"shuttl\", \"shuttl\", \"simm\", \"sin\", \"skeptic\", \"skeptic\", \"skndiv\", \"slaughter\", \"sleev\", \"sleev\", \"sleev\", \"smith\", \"smith\", \"smith\", \"smith\", \"smith\", \"smith\", \"smith\", \"smith\", \"smuggl\", \"softwar\", \"softwar\", \"softwar\", \"softwar\", \"softwar\", \"softwar\", \"softwar\", \"softwar\", \"softwar\", \"solar\", \"solar\", \"solar\", \"soldier\", \"soldier\", \"solntz\", \"sourc\", \"sourc\", \"sourc\", \"sourc\", \"sourc\", \"sourc\", \"sourc\", \"sourc\", \"sourc\", \"space\", \"space\", \"space\", \"space\", \"space\", \"spacecraft\", \"spacecraft\", \"spec\", \"spec\", \"spec\", \"speed\", \"speed\", \"speed\", \"speed\", \"speed\", \"spencer\", \"spend\", \"spend\", \"spend\", \"spend\", \"spend\", \"spend\", \"spend\", \"spend\", \"spend\", \"spend\", \"sphere\", \"spirit\", \"spirit\", \"spirit\", \"ssto\", \"stanford\", \"stanford\", \"stanford\", \"stanford\", \"stanford\", \"stanford\", \"stanford\", \"stanford\", \"stanley\", \"stanley\", \"stanley\", \"start\", \"start\", \"start\", \"start\", \"start\", \"start\", \"start\", \"start\", \"start\", \"start\", \"starter\", \"state\", \"state\", \"state\", \"state\", \"state\", \"state\", \"state\", \"state\", \"state\", \"state\", \"station\", \"station\", \"station\", \"station\", \"station\", \"station\", \"station\", \"station\", \"sternlight\", \"steve\", \"steve\", \"steve\", \"steve\", \"steve\", \"steve\", \"steve\", \"steve\", \"steveh\", \"stimulus\", \"stratus\", \"strnlght\", \"studi\", \"studi\", \"studi\", \"studi\", \"studi\", \"studi\", \"studi\", \"studi\", \"suno\", \"superstit\", \"surveil\", \"svga\", \"swap\", \"syndrom\", \"take\", \"take\", \"take\", \"take\", \"take\", \"take\", \"take\", \"take\", \"take\", \"take\", \"tampa\", \"teach\", \"teach\", \"teach\", \"teach\", \"teach\", \"team\", \"team\", \"team\", \"team\", \"team\", \"technolog\", \"technolog\", \"technolog\", \"technolog\", \"technolog\", \"technolog\", \"technolog\", \"technolog\", \"technolog\", \"tell\", \"tell\", \"tell\", \"tell\", \"tell\", \"tell\", \"tell\", \"tell\", \"tell\", \"tell\", \"tennesse\", \"test\", \"test\", \"test\", \"test\", \"test\", \"test\", \"test\", \"test\", \"testament\", \"thank\", \"thank\", \"thank\", \"thank\", \"thank\", \"thank\", \"thank\", \"thank\", \"thank\", \"theist\", \"theodor\", \"theolog\", \"theori\", \"theori\", \"theori\", \"theori\", \"theori\", \"theori\", \"therapi\", \"thing\", \"thing\", \"thing\", \"thing\", \"thing\", \"thing\", \"thing\", \"thing\", \"thing\", \"thing\", \"thomasp\", \"tiff\", \"tiger\", \"time\", \"time\", \"time\", \"time\", \"time\", \"time\", \"time\", \"time\", \"time\", \"time\", \"tire\", \"tire\", \"tire\", \"tire\", \"tire\", \"toolkit\", \"toronto\", \"toronto\", \"toronto\", \"toronto\", \"toronto\", \"treatment\", \"treatment\", \"troop\", \"true\", \"true\", \"true\", \"true\", \"true\", \"true\", \"true\", \"true\", \"true\", \"true\", \"trunk\", \"truth\", \"truth\", \"truth\", \"truth\", \"truth\", \"turk\", \"turkey\", \"turkish\", \"ualberta\", \"uchicago\", \"uchicago\", \"uchicago\", \"ucsc\", \"uicvm\", \"uiuc\", \"uiuc\", \"uiuc\", \"uiuc\", \"uiuc\", \"uiuc\", \"uiuc\", \"uiuc\", \"umich\", \"umich\", \"umich\", \"uoknor\", \"upgrad\", \"upgrad\", \"urartu\", \"urbana\", \"urbana\", \"urbana\", \"user\", \"user\", \"user\", \"user\", \"utah\", \"utkvm\", \"uvic\", \"veal\", \"vehicl\", \"vehicl\", \"vehicl\", \"vehicl\", \"vers\", \"version\", \"version\", \"version\", \"version\", \"version\", \"version\", \"version\", \"version\", \"version\", \"vesa\", \"vesselin\", \"video\", \"video\", \"video\", \"video\", \"villag\", \"villag\", \"virginia\", \"virginia\", \"virginia\", \"virginia\", \"virginia\", \"virginia\", \"virginia\", \"visual\", \"visual\", \"volt\", \"vram\", \"waco\", \"waco\", \"wagon\", \"wagon\", \"want\", \"want\", \"want\", \"want\", \"want\", \"want\", \"want\", \"want\", \"want\", \"want\", \"water\", \"water\", \"water\", \"water\", \"water\", \"weapon\", \"weapon\", \"weapon\", \"wheel\", \"wheel\", \"widget\", \"window\", \"window\", \"window\", \"wing\", \"wing\", \"wing\", \"wing\", \"wing\", \"winnipeg\", \"winnipeg\", \"wire\", \"wire\", \"wire\", \"wiretap\", \"word\", \"word\", \"word\", \"word\", \"word\", \"word\", \"word\", \"word\", \"word\", \"word\", \"work\", \"work\", \"work\", \"work\", \"work\", \"work\", \"work\", \"work\", \"work\", \"work\", \"world\", \"world\", \"world\", \"world\", \"world\", \"world\", \"world\", \"world\", \"world\", \"world\", \"worship\", \"worship\", \"xlib\", \"xpert\", \"xterm\", \"xview\", \"yamaha\", \"yanke\", \"year\", \"year\", \"year\", \"year\", \"year\", \"year\", \"year\", \"year\", \"year\", \"year\", \"yeast\", \"zoolog\", \"zuma\"]}, \"R\": 30, \"lambda.step\": 0.01, \"plot.opts\": {\"xlab\": \"PC1\", \"ylab\": \"PC2\"}, \"topic.order\": [3, 1, 8, 9, 2, 4, 7, 10, 5, 6]};\n", - "\n", - "function LDAvis_load_lib(url, callback){\n", - " var s = document.createElement('script');\n", - " s.src = url;\n", - " s.async = true;\n", - " s.onreadystatechange = s.onload = callback;\n", - " s.onerror = function(){console.warn(\"failed to load library \" + url);};\n", - " document.getElementsByTagName(\"head\")[0].appendChild(s);\n", - "}\n", - "\n", - "if(typeof(LDAvis) !== \"undefined\"){\n", - " // already loaded: just create the visualization\n", - " !function(LDAvis){\n", - " new LDAvis(\"#\" + \"ldavis_el591011124095238088809029897\", ldavis_el591011124095238088809029897_data);\n", - " }(LDAvis);\n", - "}else if(typeof define === \"function\" && define.amd){\n", - " // require.js is available: use it to load d3/LDAvis\n", - " require.config({paths: {d3: \"https://cdnjs.cloudflare.com/ajax/libs/d3/3.5.5/d3.min\"}});\n", - " require([\"d3\"], function(d3){\n", - " window.d3 = d3;\n", - " LDAvis_load_lib(\"https://cdn.rawgit.com/bmabey/pyLDAvis/files/ldavis.v1.0.0.js\", function(){\n", - " new LDAvis(\"#\" + \"ldavis_el591011124095238088809029897\", ldavis_el591011124095238088809029897_data);\n", - " });\n", - " });\n", - "}else{\n", - " // require.js not available: dynamically load d3 & LDAvis\n", - " LDAvis_load_lib(\"https://cdnjs.cloudflare.com/ajax/libs/d3/3.5.5/d3.min.js\", function(){\n", - " LDAvis_load_lib(\"https://cdn.rawgit.com/bmabey/pyLDAvis/files/ldavis.v1.0.0.js\", function(){\n", - " new LDAvis(\"#\" + \"ldavis_el591011124095238088809029897\", ldavis_el591011124095238088809029897_data);\n", - " })\n", - " });\n", - "}\n", - "</script>" - ], - "text/plain": [ - "PreparedData(topic_coordinates= x y topics cluster Freq\n", - "topic \n", - "2 -0.078669 -0.151706 1 1 13.182505\n", - "0 -0.016999 -0.150447 2 1 12.926197\n", - "7 0.208967 0.080137 3 1 12.463007\n", - "8 0.147446 0.136478 4 1 11.995771\n", - "1 -0.008849 -0.009046 5 1 9.559109\n", - "3 -0.045054 0.003907 6 1 9.468682\n", - "6 -0.089499 0.144727 7 1 8.927140\n", - "9 0.107803 -0.077376 8 1 7.882134\n", - "4 0.004524 -0.105100 9 1 7.024930\n", - "5 -0.229669 0.128426 10 1 6.570525, topic_info= Category Freq Term Total loglift logprob\n", - "1037 Default 2966.000000 window 2966.000000 30.0000 30.0000\n", - "1193 Default 1940.000000 game 1940.000000 29.0000 29.0000\n", - "482 Default 1924.000000 christian 1924.000000 28.0000 28.0000\n", - "702 Default 1689.000000 team 1689.000000 27.0000 27.0000\n", - "352 Default 2638.000000 drive 2638.000000 26.0000 26.0000\n", - "320 Default 2883.000000 file 2883.000000 25.0000 25.0000\n", - "696 Default 1860.000000 space 1860.000000 24.0000 24.0000\n", - "1467 Default 1161.000000 encrypt 1161.000000 23.0000 23.0000\n", - "256 Default 1997.000000 govern 1997.000000 22.0000 22.0000\n", - "153 Default 1477.000000 chip 1477.000000 21.0000 21.0000\n", - "522 Default 1274.000000 jesus 1274.000000 20.0000 20.0000\n", - "1347 Default 1017.000000 israel 1017.000000 19.0000 19.0000\n", - "36 Default 1577.000000 card 1577.000000 18.0000 18.0000\n", - "120 Default 1423.000000 play 1423.000000 17.0000 17.0000\n", - "964 Default 1059.000000 secur 1059.000000 16.0000 16.0000\n", - "657 Default 1331.000000 nasa 1331.000000 15.0000 15.0000\n", - "1821 Default 1142.000000 armenian 1142.000000 14.0000 14.0000\n", - "822 Default 2599.000000 program 2599.000000 13.0000 13.0000\n", - "1346 Default 837.000000 isra 837.000000 12.0000 12.0000\n", - "513 Default 1391.000000 imag 1391.000000 11.0000 11.0000\n", - "117 Default 6052.000000 peopl 6052.000000 10.0000 10.0000\n", - "3565 Default 742.000000 hockey 742.000000 9.0000 9.0000\n", - "739 Default 990.000000 player 990.000000 8.0000 8.0000\n", - "1457 Default 784.000000 clipper 784.000000 7.0000 7.0000\n", - "326 Default 1802.000000 public 1802.000000 6.0000 6.0000\n", - "41 Default 1023.000000 disk 1023.000000 5.0000 5.0000\n", - "28 Default 4004.000000 year 4004.000000 4.0000 4.0000\n", - "380 Default 867.000000 scsi 867.000000 3.0000 3.0000\n", - "879 Default 1191.000000 driver 1191.000000 2.0000 2.0000\n", - "444 Default 747.000000 bike 747.000000 1.0000 1.0000\n", - "... ... ... ... ... ... ...\n", - "5004 Topic10 178.948181 stanley 185.594589 2.6861 -6.0394\n", - "702 Topic10 1384.116455 team 1689.568604 2.5232 -3.9937\n", - "4840 Topic10 160.981583 jet 167.196503 2.6847 -6.1452\n", - "3815 Topic10 191.566772 coach 202.233215 2.6684 -5.9713\n", - "3537 Topic10 221.759384 ranger 240.052933 2.6433 -5.8249\n", - "4877 Topic10 157.258331 winnipeg 165.160721 2.6735 -6.1686\n", - "1193 Topic10 1290.715576 game 1940.664795 2.3147 -4.0636\n", - "120 Topic10 920.770020 play 1423.930298 2.2866 -4.4013\n", - "711 Topic10 312.806488 wing 399.885132 2.4770 -5.4809\n", - "739 Topic10 623.101746 player 990.567200 2.2590 -4.7918\n", - "1311 Topic10 397.739624 columbia 559.283691 2.3817 -5.2407\n", - "1080 Topic10 455.438751 season 670.126038 2.3364 -5.1053\n", - "3252 Topic10 379.943481 leagu 536.827942 2.3769 -5.2865\n", - "1073 Topic10 351.761322 pittsburgh 505.782318 2.3594 -5.3636\n", - "1679 Topic10 356.976562 score 528.273926 2.3306 -5.3488\n", - "1321 Topic10 374.845306 arab 572.500732 2.2991 -5.3000\n", - "3488 Topic10 212.819550 mcgill 254.334839 2.5444 -5.8661\n", - "1475 Topic10 346.644043 goal 553.699341 2.2543 -5.3782\n", - "1150 Topic10 312.806427 virginia 544.289856 2.1687 -5.4809\n", - "1082 Topic10 333.144867 toronto 701.091187 1.9785 -5.4179\n", - "1155 Topic10 336.057953 andrew 868.338135 1.7733 -5.4092\n", - "28 Topic10 600.308960 year 4004.757812 0.8248 -4.8291\n", - "157 Topic10 295.451538 divis 693.417114 1.8694 -5.5380\n", - "2117 Topic10 283.661255 canada 732.439819 1.7740 -5.5787\n", - "2549 Topic10 250.147522 period 584.503235 1.8739 -5.7045\n", - "45 Topic10 267.235901 final 822.295105 1.5986 -5.6384\n", - "171 Topic10 330.680511 point 2646.791748 0.6426 -5.4254\n", - "146 Topic10 358.020264 time 5183.146484 0.0500 -5.3459\n", - "1545 Topic10 262.164948 american 1242.273315 1.1669 -5.6575\n", - "99 Topic10 242.101822 go 3510.730713 0.0484 -5.7372\n", - "\n", - "[734 rows x 6 columns], token_table= Topic Freq Term\n", - "term \n", - "338 1 0.145983 accept\n", - "338 2 0.524347 accept\n", - "338 3 0.129101 accept\n", - "338 4 0.049654 accept\n", - "338 5 0.007945 accept\n", - "338 6 0.022841 accept\n", - "338 8 0.066536 accept\n", - "338 9 0.034758 accept\n", - "338 10 0.018869 accept\n", - "73 3 0.403915 access\n", - "73 4 0.196068 access\n", - "73 5 0.171820 access\n", - "73 6 0.033255 access\n", - "73 7 0.000693 access\n", - "73 8 0.193297 access\n", - "2940 4 0.984634 adaptec\n", - "152 1 0.052461 address\n", - "152 2 0.074007 address\n", - "152 3 0.536784 address\n", - "152 4 0.182675 address\n", - "152 5 0.030914 address\n", - "152 6 0.026230 address\n", - "152 7 0.032788 address\n", - "152 8 0.049650 address\n", - "152 9 0.005621 address\n", - "152 10 0.008431 address\n", - "1444 1 0.124112 administr\n", - "1444 3 0.063074 administr\n", - "1444 5 0.197359 administr\n", - "1444 8 0.614458 administr\n", - "... ... ... ...\n", - "182 2 0.166406 world\n", - "182 3 0.097373 world\n", - "182 4 0.150056 world\n", - "182 5 0.106093 world\n", - "182 6 0.051230 world\n", - "182 7 0.080296 world\n", - "182 8 0.011990 world\n", - "182 9 0.053410 world\n", - "182 10 0.054863 world\n", - "4238 1 0.009547 worship\n", - "4238 2 0.988079 worship\n", - "4809 3 0.994707 xlib\n", - "3868 3 0.995135 xpert\n", - "3581 3 0.995652 xterm\n", - "2827 3 0.988763 xview\n", - "6047 6 0.981546 yamaha\n", - "1701 7 0.988053 yanke\n", - "28 1 0.130095 year\n", - "28 2 0.031962 year\n", - "28 3 0.015482 year\n", - "28 4 0.038954 year\n", - "28 5 0.216243 year\n", - "28 6 0.063674 year\n", - "28 7 0.244959 year\n", - "28 8 0.040951 year\n", - "28 9 0.067919 year\n", - "28 10 0.149822 year\n", - "3309 9 0.986879 yeast\n", - "3190 5 0.990640 zoolog\n", - "1894 1 0.991014 zuma\n", - "\n", - "[2168 rows x 3 columns], R=30, lambda_step=0.01, plot_opts={'xlab': 'PC1', 'ylab': 'PC2'}, topic_order=[3, 1, 8, 9, 2, 4, 7, 10, 5, 6])" - ] - }, - "execution_count": 155, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "p = visualize_topics(model, bow_corpus, dictionary)\n", - "p" - ] - }, - { - "cell_type": "code", - "execution_count": 23, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "# Save the pyldavis as HTML\n", - "from nautilus_nlp.models.topic_modeling import save_pyldavis" - ] - }, - { - "cell_type": "code", - "execution_count": 24, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "save_pyldavis(p, '/Users/williamjaubert/Documents/Allianz_William/', 'pyldavis_test_func')" - ] - }, - { - "cell_type": "code", - "execution_count": 27, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "# Load the pyldavis HTML\n", - "from nautilus_nlp.models.topic_modeling import show_pyldavis" - ] - }, - { - "cell_type": "code", - "execution_count": 26, - "metadata": { - "collapsed": true - }, - "outputs": [ - { - "data": { - "text/html": [ - "\n", - "<link rel=\"stylesheet\" type=\"text/css\" href=\"https://cdn.rawgit.com/bmabey/pyLDAvis/files/ldavis.v1.0.0.css\">\n", - "\n", - "\n", - "<div id=\"ldavis_el591011124069819927707340541\"></div>\n", - "<script type=\"text/javascript\">\n", - "\n", - "var ldavis_el591011124069819927707340541_data = {\"mdsDat\": {\"x\": [-0.07866945427665124, -0.01699948489792914, 0.20896689238873523, 0.14744605031212607, -0.008849073212760983, -0.04505413872814077, -0.08949897686453376, 0.10780299734830809, 0.004524270451044093, -0.22966908252019716], \"y\": [-0.15170611822961017, -0.1504468301902949, 0.08013685816591506, 0.13647834612774523, -0.009046128981188077, 0.003906923765221535, 0.14472746444813225, -0.07737607739594787, -0.1051004751701791, 0.1284260374602061], \"topics\": [1, 2, 3, 4, 5, 6, 7, 8, 9, 10], \"cluster\": [1, 1, 1, 1, 1, 1, 1, 1, 1, 1], \"Freq\": [13.179347038269043, 12.924742698669434, 12.465522766113281, 11.996149063110352, 9.560138702392578, 9.471930503845215, 8.926163673400879, 7.8803582191467285, 7.02661657333374, 6.569023609161377]}, \"tinfo\": {\"Category\": [\"Default\", \"Default\", \"Default\", \"Default\", \"Default\", \"Default\", \"Default\", \"Default\", \"Default\", \"Default\", \"Default\", \"Default\", \"Default\", \"Default\", \"Default\", \"Default\", \"Default\", \"Default\", \"Default\", \"Default\", \"Default\", \"Default\", \"Default\", \"Default\", \"Default\", \"Default\", \"Default\", \"Default\", \"Default\", \"Default\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic4\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic5\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic6\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic7\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic8\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic9\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\", \"Topic10\"], \"Freq\": [2966.0, 1940.0, 1924.0, 1689.0, 2638.0, 2884.0, 1860.0, 1161.0, 1997.0, 1477.0, 1274.0, 1016.0, 1577.0, 1423.0, 1059.0, 1331.0, 1142.0, 2600.0, 837.0, 1391.0, 6052.0, 742.0, 990.0, 784.0, 1802.0, 1023.0, 4004.0, 867.0, 1191.0, 747.0, 1141.7806396484375, 697.88427734375, 406.7251281738281, 375.1473693847656, 365.11944580078125, 324.8642883300781, 317.2684326171875, 293.6634521484375, 242.85263061523438, 242.56858825683594, 238.5181884765625, 222.63047790527344, 219.19569396972656, 497.40509033203125, 182.86300659179688, 189.0499267578125, 180.7320556640625, 167.57565307617188, 170.02467346191406, 162.42880249023438, 156.00514221191406, 152.95489501953125, 147.39271545410156, 144.92861938476562, 143.97406005859375, 142.5141143798828, 139.98184204101562, 137.23757934570312, 111.6092529296875, 111.33480834960938, 296.39483642578125, 234.70761108398438, 534.3711547851562, 227.28517150878906, 733.2534790039062, 290.5158386230469, 1027.5731201171875, 194.4586944580078, 462.1385803222656, 638.6304321289062, 382.9510498046875, 556.9410400390625, 270.836669921875, 346.2899169921875, 2339.156005859375, 353.3161926269531, 956.0157470703125, 1366.4423828125, 488.9396667480469, 1502.5341796875, 432.1164245605469, 423.58416748046875, 945.9664306640625, 647.218505859375, 868.762451171875, 843.017578125, 679.0517578125, 535.9990234375, 452.12701416015625, 627.1972045898438, 723.6101684570312, 487.4131164550781, 627.0872802734375, 480.17083740234375, 485.80718994140625, 520.3949584960938, 438.9589538574219, 1273.7509765625, 843.0744018554688, 687.5490112304688, 378.0928649902344, 599.49951171875, 284.1490173339844, 264.89508056640625, 257.6834716796875, 233.3529052734375, 198.52938842773438, 196.5380859375, 186.40451049804688, 185.75604248046875, 190.4610595703125, 160.6652069091797, 157.19314575195312, 147.49737548828125, 143.9265899658203, 141.27682495117188, 132.94015502929688, 132.69456481933594, 136.24981689453125, 134.07119750976562, 122.38124084472656, 117.65129089355469, 110.72013092041016, 103.34630584716797, 103.80403137207031, 102.60269165039062, 191.14974975585938, 1897.33984375, 734.1270141601562, 595.287353515625, 628.0527954101562, 206.76734924316406, 246.9275360107422, 800.1103515625, 749.0331420898438, 336.11505126953125, 271.7132873535156, 265.6830749511719, 397.9759216308594, 574.263427734375, 250.1382293701172, 378.815185546875, 461.7101745605469, 1507.0093994140625, 256.83978271484375, 577.0333251953125, 989.0523071289062, 369.24951171875, 600.8649291992188, 735.2048950195312, 547.226806640625, 671.4481811523438, 658.2610473632812, 983.5562133789062, 1571.339111328125, 640.5230712890625, 527.4468994140625, 1108.9169921875, 876.3516845703125, 725.7343139648438, 862.0634155273438, 662.431396484375, 745.1685791015625, 665.753662109375, 603.1578979492188, 671.9922485351562, 613.3507690429688, 579.6978759765625, 513.6331176757812, 478.697998046875, 261.2860107421875, 304.5064392089844, 182.0912628173828, 164.47610473632812, 158.48814392089844, 152.05868530273438, 137.89083862304688, 135.1747589111328, 117.29756927490234, 101.5453109741211, 100.56036376953125, 94.57755279541016, 94.09120178222656, 92.84423065185547, 88.50360870361328, 85.07716369628906, 77.8897705078125, 76.20620727539062, 74.78276062011719, 76.93145751953125, 66.28211975097656, 65.84783172607422, 62.6032600402832, 61.643402099609375, 56.68076705932617, 56.65744400024414, 56.483177185058594, 56.252906799316406, 433.4509582519531, 57.65077209472656, 175.38478088378906, 811.8549194335938, 352.3771057128906, 460.9055480957031, 1244.601806640625, 397.80743408203125, 319.1280822753906, 364.2165832519531, 817.3186645507812, 179.1452178955078, 759.4246826171875, 353.8927307128906, 768.0062255859375, 704.1742553710938, 1031.2420654296875, 338.7886962890625, 853.2907104492188, 1558.8812255859375, 1291.53564453125, 922.5413208007812, 1345.7596435546875, 471.8685607910156, 490.1439208984375, 677.5836181640625, 1059.2960205078125, 853.371337890625, 843.8799438476562, 1006.7838745117188, 803.6088256835938, 784.7322387695312, 584.7684936523438, 572.9198608398438, 507.78826904296875, 934.9744873046875, 496.57794189453125, 583.3226318359375, 623.9882202148438, 588.1378784179688, 615.0081176757812, 528.20361328125, 511.33087158203125, 511.8083801269531, 866.59033203125, 316.7350769042969, 249.30372619628906, 229.90980529785156, 228.7428741455078, 211.5573272705078, 183.0348663330078, 166.19662475585938, 164.79638671875, 155.5634765625, 157.90318298339844, 359.6986083984375, 133.47061157226562, 124.17569732666016, 122.316650390625, 117.04086303710938, 111.26261901855469, 110.83892059326172, 109.1672592163086, 103.2135009765625, 98.91744995117188, 514.7843017578125, 89.63079833984375, 82.75098419189453, 81.71863555908203, 103.2540054321289, 75.26065826416016, 75.21710205078125, 70.78661346435547, 69.3476791381836, 281.7891540527344, 311.1296081542969, 971.294189453125, 208.02467346191406, 697.1555786132812, 367.6167297363281, 1416.345947265625, 441.6514587402344, 604.5531616210938, 578.907958984375, 377.5320129394531, 192.01060485839844, 648.3541870117188, 1969.95458984375, 938.596435546875, 446.4309387207031, 632.3701782226562, 658.6392822265625, 1989.91748046875, 746.844970703125, 677.8211669921875, 282.1589050292969, 467.3360290527344, 480.8250427246094, 1420.011962890625, 633.149169921875, 1121.6416015625, 955.3305053710938, 821.8895874023438, 1270.0303955078125, 524.9111328125, 1015.944580078125, 611.8392944335938, 745.4418334960938, 688.5404663085938, 667.2193603515625, 692.5394897460938, 593.0941162109375, 527.0477905273438, 546.2659301757812, 266.1635437011719, 171.10794067382812, 155.6239776611328, 226.90951538085938, 131.5675506591797, 110.65044403076172, 109.72305297851562, 476.2783203125, 123.80803680419922, 96.53874206542969, 90.70281219482422, 86.92076873779297, 84.76178741455078, 84.683349609375, 83.14109802246094, 249.0670928955078, 73.45060729980469, 70.67398071289062, 70.31317138671875, 68.84266662597656, 66.71842193603516, 65.88937377929688, 60.61496353149414, 60.299964904785156, 59.60258483886719, 59.442161560058594, 59.145503997802734, 58.31914138793945, 57.82154846191406, 57.423213958740234, 405.08648681640625, 341.47369384765625, 190.9191131591797, 246.2603759765625, 163.53012084960938, 257.4788513183594, 138.4282684326172, 165.1016082763672, 521.0703125, 1046.3909912109375, 1401.0023193359375, 228.18516540527344, 286.6700439453125, 343.28363037109375, 185.7610626220703, 229.6707305908203, 175.074462890625, 332.49884033203125, 163.83180236816406, 539.723876953125, 256.24749755859375, 439.7876892089844, 517.6013793945312, 403.5384826660156, 229.64816284179688, 866.3922729492188, 846.759033203125, 313.158447265625, 322.8583068847656, 286.9349365234375, 653.4288330078125, 749.9511108398438, 426.6536560058594, 380.0589294433594, 366.8407287597656, 372.0916748046875, 408.5104064941406, 415.6706237792969, 394.1766357421875, 394.4267578125, 349.5382080078125, 362.40155029296875, 340.808349609375, 296.16046142578125, 297.5443420410156, 494.8436584472656, 746.194580078125, 324.79425048828125, 301.5485534667969, 243.8285369873047, 158.12664794921875, 107.40505981445312, 95.04991912841797, 99.33280944824219, 91.02439880371094, 88.6642837524414, 79.35138702392578, 77.837158203125, 76.30526733398438, 74.57151794433594, 68.70978546142578, 66.97795867919922, 65.4818344116211, 64.81551361083984, 62.9178466796875, 62.10234832763672, 61.07172393798828, 61.08311080932617, 58.716949462890625, 57.748966217041016, 57.54390335083008, 57.412330627441406, 53.53644561767578, 53.10344696044922, 81.06087493896484, 466.5129089355469, 629.9894409179688, 272.5233154296875, 229.85595703125, 524.6031494140625, 169.13986206054688, 106.4736328125, 468.3924255371094, 321.2161865234375, 72.88867950439453, 215.71841430664062, 420.2349548339844, 255.02392578125, 239.02398681640625, 170.43710327148438, 161.87730407714844, 350.9423522949219, 510.4275207519531, 280.5064697265625, 480.16314697265625, 199.71388244628906, 294.50860595703125, 258.12945556640625, 376.6604919433594, 510.116455078125, 1114.61083984375, 256.1866149902344, 426.7527770996094, 319.7099304199219, 739.28173828125, 280.38397216796875, 489.42193603515625, 542.8736572265625, 517.7899780273438, 617.5950317382812, 513.4124755859375, 436.72442626953125, 491.1626281738281, 506.85968017578125, 460.4228515625, 441.4096374511719, 394.3690185546875, 351.4322509765625, 347.85174560546875, 353.2395324707031, 337.03509521484375, 274.97705078125, 206.25440979003906, 205.88706970214844, 185.46702575683594, 142.32943725585938, 138.4519500732422, 125.20697021484375, 124.93755340576172, 113.30398559570312, 111.32567596435547, 109.37814331054688, 105.70201110839844, 106.32189178466797, 292.8650207519531, 101.51443481445312, 98.15642547607422, 98.08124542236328, 96.688720703125, 95.23130798339844, 93.90516662597656, 90.93041229248047, 90.10682678222656, 204.03321838378906, 83.50547790527344, 83.1707992553711, 82.09012603759766, 80.0595703125, 80.03185272216797, 78.97164154052734, 77.4714584350586, 624.7915649414062, 218.5322723388672, 299.7547607421875, 218.30796813964844, 189.66859436035156, 356.61126708984375, 202.45262145996094, 416.956787109375, 238.6123046875, 212.24911499023438, 149.82693481445312, 211.92662048339844, 303.8810119628906, 120.30801391601562, 237.628173828125, 454.8601379394531, 333.9891357421875, 980.4944458007812, 485.3978576660156, 911.3460083007812, 590.2308959960938, 261.1946716308594, 253.11302185058594, 366.61309814453125, 366.9202880859375, 261.4228515625, 595.406494140625, 533.9457397460938, 533.9599609375, 583.47607421875, 307.19378662109375, 439.3268737792969, 370.1156311035156, 337.7350158691406, 344.1394348144531, 325.0244140625, 340.1333923339844, 337.7405090332031, 350.025146484375, 294.61376953125, 276.2976989746094, 278.626953125, 1160.65234375, 424.52520751953125, 361.9087219238281, 388.7334289550781, 255.14059448242188, 223.3458709716797, 186.77297973632812, 150.9017333984375, 148.35372924804688, 142.3341522216797, 778.6029052734375, 125.934814453125, 122.35879516601562, 113.49314880371094, 110.9784164428711, 117.08515930175781, 97.77255249023438, 95.13446807861328, 154.00491333007812, 85.83687591552734, 85.79811096191406, 83.88481903076172, 83.05354309082031, 81.01181030273438, 86.69019317626953, 72.2069091796875, 70.93242645263672, 66.0419921875, 65.32259368896484, 61.589271545410156, 631.8587646484375, 967.0912475585938, 392.3902893066406, 86.90055847167969, 116.69065856933594, 384.3917541503906, 954.828125, 325.44622802734375, 153.9778594970703, 168.00970458984375, 886.02734375, 877.259521484375, 327.1088562011719, 468.2386169433594, 329.3564758300781, 302.24896240234375, 346.5186767578125, 350.18585205078125, 277.6599426269531, 424.3641662597656, 266.8429870605469, 331.9565124511719, 578.17333984375, 328.296630859375, 429.8065490722656, 517.4179077148438, 400.8412170410156, 346.21722412109375, 433.2587890625, 421.34136962890625, 338.8642883300781, 347.50665283203125, 348.3670654296875, 336.53314208984375, 398.4556579589844, 299.90478515625, 164.68971252441406, 151.29721069335938, 134.82589721679688, 134.8407440185547, 128.82469177246094, 120.21800231933594, 119.83185577392578, 103.71044921875, 93.07451629638672, 105.74777221679688, 91.14122772216797, 88.90278625488281, 86.50234985351562, 83.21115112304688, 82.5744857788086, 76.65482330322266, 73.94358825683594, 137.486328125, 73.60121154785156, 73.44850158691406, 297.8765869140625, 71.537841796875, 71.537841796875, 71.39191436767578, 68.6223373413086, 70.66267395019531, 67.06273651123047, 64.6351318359375, 137.61058044433594, 330.04791259765625, 498.7896423339844, 418.3139343261719, 321.71234130859375, 192.31024169921875, 436.83538818359375, 120.46820068359375, 101.74191284179688, 189.6998748779297, 107.90703582763672, 180.33082580566406, 406.5956726074219, 219.30587768554688, 311.1242370605469, 276.8919677734375, 364.6730651855469, 122.64595794677734, 431.6532897949219, 148.9232177734375, 478.1828308105469, 448.573486328125, 560.2838134765625, 235.4400634765625, 220.1329345703125, 237.02713012695312, 526.0250854492188, 310.5745544433594, 195.26043701171875, 465.158203125, 342.7765808105469, 343.9803161621094, 252.5526123046875, 252.3756866455078, 359.45233154296875, 365.1446533203125, 297.1376953125, 278.9319763183594, 264.31353759765625, 271.8553161621094, 267.05078125, 258.78143310546875, 836.6797485351562, 741.5901489257812, 348.0262145996094, 262.59930419921875, 234.66685485839844, 225.6525115966797, 214.5906982421875, 197.1658935546875, 176.15512084960938, 163.69117736816406, 159.65298461914062, 156.5215606689453, 155.51637268066406, 147.13583374023438, 143.75466918945312, 151.88540649414062, 140.51809692382812, 133.0145721435547, 131.76170349121094, 122.347900390625, 118.6324234008789, 115.60749816894531, 112.3785629272461, 112.19926452636719, 111.77244567871094, 119.0841293334961, 102.04837799072266, 93.4240493774414, 92.21881866455078, 89.70394897460938, 218.3953094482422, 151.76768493652344, 955.2220458984375, 178.90740966796875, 1383.801025390625, 160.94491577148438, 191.5231170654297, 221.7088623046875, 157.22250366210938, 1290.4215087890625, 920.5602416992188, 312.7351989746094, 622.9597778320312, 397.6490173339844, 455.3349914550781, 379.85693359375, 351.6811828613281, 356.8952331542969, 374.7598876953125, 212.77105712890625, 346.5650634765625, 312.73516845703125, 333.0689392089844, 335.98138427734375, 600.1721801757812, 295.3842468261719, 283.5966491699219, 250.0905303955078, 267.1750183105469, 330.6051940917969, 357.9386901855469, 262.105224609375, 242.04666137695312], \"Term\": [\"window\", \"game\", \"christian\", \"team\", \"drive\", \"file\", \"space\", \"encrypt\", \"govern\", \"chip\", \"jesus\", \"israel\", \"card\", \"play\", \"secur\", \"nasa\", \"armenian\", \"program\", \"isra\", \"imag\", \"peopl\", \"hockey\", \"player\", \"clipper\", \"public\", \"disk\", \"year\", \"scsi\", \"driver\", \"bike\", \"armenian\", \"turkish\", \"turk\", \"turkey\", \"armenia\", \"koresh\", \"nazi\", \"militia\", \"serdar\", \"argic\", \"genocid\", \"davidian\", \"troop\", \"murder\", \"mormon\", \"prison\", \"massacr\", \"azeri\", \"ethnic\", \"azerbaijani\", \"hitler\", \"iran\", \"zuma\", \"sdpa\", \"motto\", \"azerbaijan\", \"extermin\", \"sera\", \"urartu\", \"slaughter\", \"villag\", \"batf\", \"greek\", \"greec\", \"jew\", \"soldier\", \"kill\", \"waco\", \"arm\", \"countri\", \"muslim\", \"children\", \"armi\", \"popul\", \"peopl\", \"anti\", \"govern\", \"right\", \"attack\", \"say\", \"polit\", \"death\", \"state\", \"live\", \"go\", \"come\", \"tell\", \"happen\", \"forc\", \"world\", \"time\", \"nation\", \"want\", \"leav\", \"start\", \"year\", \"take\", \"jesus\", \"bibl\", \"atheist\", \"atheism\", \"christ\", \"scriptur\", \"cathol\", \"sandvik\", \"doctrin\", \"revel\", \"biblic\", \"satan\", \"atho\", \"livesey\", \"prophet\", \"divin\", \"vers\", \"gospel\", \"sabbath\", \"god\", \"sin\", \"resurrect\", \"solntz\", \"testament\", \"theolog\", \"propheci\", \"theist\", \"schneider\", \"jaeger\", \"marriag\", \"christian\", \"church\", \"belief\", \"faith\", \"worship\", \"contradict\", \"moral\", \"religion\", \"lord\", \"heaven\", \"holi\", \"rutger\", \"truth\", \"spirit\", \"teach\", \"islam\", \"believ\", \"etern\", \"argument\", \"exist\", \"religi\", \"evid\", \"word\", \"love\", \"life\", \"claim\", \"mean\", \"peopl\", \"true\", \"accept\", \"say\", \"question\", \"reason\", \"thing\", \"person\", \"come\", \"good\", \"read\", \"time\", \"point\", \"follow\", \"motif\", \"widget\", \"xterm\", \"visual\", \"xlib\", \"polygon\", \"baalk\", \"contrib\", \"toolkit\", \"kelvin\", \"pyron\", \"suno\", \"deskjet\", \"xpert\", \"plaintext\", \"skndiv\", \"openwindow\", \"xview\", \"ether\", \"quicktim\", \"magellan\", \"utah\", \"greenbelt\", \"reilli\", \"ualberta\", \"copper\", \"ciphertext\", \"autom\", \"gradi\", \"dillon\", \"font\", \"handbook\", \"binari\", \"server\", \"client\", \"librari\", \"imag\", \"anonym\", \"compil\", \"resourc\", \"graphic\", \"map\", \"applic\", \"archiv\", \"user\", \"code\", \"avail\", \"directori\", \"sourc\", \"file\", \"mail\", \"list\", \"program\", \"function\", \"format\", \"email\", \"inform\", \"version\", \"softwar\", \"includ\", \"send\", \"data\", \"internet\", \"address\", \"display\", \"window\", \"copi\", \"access\", \"distribut\", \"thank\", \"look\", \"book\", \"group\", \"need\", \"scsi\", \"simm\", \"motherboard\", \"cach\", \"bio\", \"quadra\", \"diamond\", \"vram\", \"vesa\", \"centri\", \"swap\", \"upgrad\", \"char\", \"eisa\", \"intercon\", \"nubus\", \"ethernet\", \"svga\", \"amanda\", \"meg\", \"cadr\", \"mous\", \"maxtor\", \"config\", \"cica\", \"tiff\", \"adaptec\", \"powerbook\", \"ctrl\", \"esdi\", \"jumper\", \"floppi\", \"disk\", \"umich\", \"video\", \"modem\", \"card\", \"output\", \"monitor\", \"mode\", \"printer\", \"spec\", \"entri\", \"drive\", \"driver\", \"port\", \"instal\", \"memori\", \"window\", \"color\", \"appl\", \"byte\", \"screen\", \"board\", \"problem\", \"machin\", \"file\", \"thank\", \"control\", \"work\", \"speed\", \"need\", \"hard\", \"help\", \"program\", \"want\", \"time\", \"repli\", \"softwar\", \"distribut\", \"alaska\", \"spencer\", \"oracl\", \"dseg\", \"aurora\", \"nsmca\", \"engr\", \"launch\", \"uoknor\", \"callison\", \"kaldi\", \"zoolog\", \"mccall\", \"ucsc\", \"hallam\", \"lunar\", \"automot\", \"raider\", \"theodor\", \"dock\", \"shafer\", \"mksol\", \"hydro\", \"ssto\", \"plymouth\", \"redesign\", \"laughter\", \"rockwel\", \"desi\", \"stimulus\", \"moon\", \"henri\", \"mar\", \"job\", \"wheel\", \"billion\", \"invest\", \"spacecraft\", \"orbit\", \"nasa\", \"space\", \"shuttl\", \"satellit\", \"fund\", \"probe\", \"flight\", \"helmet\", \"station\", \"solar\", \"presid\", \"mission\", \"earth\", \"cost\", \"money\", \"vehicl\", \"year\", \"work\", \"project\", \"toronto\", \"spend\", \"go\", \"time\", \"engin\", \"long\", \"high\", \"power\", \"thing\", \"say\", \"look\", \"peopl\", \"program\", \"want\", \"need\", \"design\", \"build\", \"firearm\", \"bike\", \"motorcycl\", \"magnus\", \"rider\", \"honda\", \"veal\", \"utkvm\", \"centerlin\", \"cactus\", \"rkba\", \"harley\", \"shotgun\", \"pistol\", \"ranck\", \"boyl\", \"husc\", \"ifa\", \"smuggl\", \"fischer\", \"counterst\", \"armori\", \"trunk\", \"thomasp\", \"imak\", \"photographi\", \"concordia\", \"tennesse\", \"yamaha\", \"frost\", \"car\", \"ohio\", \"uchicago\", \"rid\", \"gun\", \"brake\", \"shaft\", \"cwru\", \"auto\", \"wagon\", \"handgun\", \"cleveland\", \"ride\", \"tire\", \"urbana\", \"midway\", \"insur\", \"uiuc\", \"dealer\", \"weapon\", \"iastat\", \"owner\", \"illinoi\", \"crime\", \"price\", \"state\", \"freenet\", \"sell\", \"buy\", \"good\", \"road\", \"drive\", \"right\", \"look\", \"peopl\", \"want\", \"case\", \"thing\", \"time\", \"go\", \"distribut\", \"repli\", \"engin\", \"opinion\", \"problem\", \"need\", \"gatech\", \"cub\", \"fnal\", \"prism\", \"hitter\", \"pitcher\", \"alomar\", \"uicvm\", \"higgin\", \"inning\", \"revolv\", \"hulman\", \"yanke\", \"pitch\", \"catcher\", \"dodger\", \"blast\", \"starter\", \"tiger\", \"met\", \"bat\", \"nore\", \"outlet\", \"rocki\", \"jay\", \"sdsu\", \"volt\", \"lopez\", \"restaur\", \"lamp\", \"wire\", \"duke\", \"circuit\", \"batteri\", \"brave\", \"basebal\", \"hit\", \"berkeley\", \"jason\", \"ball\", \"metal\", \"jeff\", \"grind\", \"larc\", \"indiana\", \"netcom\", \"colorado\", \"year\", \"run\", \"good\", \"game\", \"smith\", \"scott\", \"player\", \"home\", \"stanford\", \"look\", \"distribut\", \"go\", \"time\", \"lose\", \"come\", \"start\", \"play\", \"david\", \"best\", \"better\", \"power\", \"thing\", \"john\", \"sale\", \"great\", \"encrypt\", \"escrow\", \"privaci\", \"ripem\", \"crypto\", \"wiretap\", \"cryptographi\", \"cipher\", \"decrypt\", \"hamburg\", \"clipper\", \"homicid\", \"bontchev\", \"gtoal\", \"crypt\", \"clarkson\", \"rwing\", \"surveil\", \"nist\", \"sternlight\", \"den\", \"ncsl\", \"qualcomm\", \"fbihh\", \"cryptograph\", \"tampa\", \"mime\", \"vesselin\", \"lyme\", \"strnlght\", \"key\", \"secur\", \"enforc\", \"recipi\", \"classifi\", \"secret\", \"chip\", \"agenc\", \"patent\", \"scheme\", \"public\", \"govern\", \"algorithm\", \"protect\", \"propos\", \"administr\", \"privat\", \"clinton\", \"feder\", \"phone\", \"court\", \"devic\", \"number\", \"communic\", \"technolog\", \"inform\", \"provid\", \"author\", \"state\", \"right\", \"messag\", \"data\", \"peopl\", \"need\", \"diseas\", \"stratus\", \"dyer\", \"diet\", \"robi\", \"infect\", \"syndrom\", \"methodolog\", \"physician\", \"cure\", \"intellect\", \"einstein\", \"chopin\", \"candida\", \"sphere\", \"yeast\", \"chastiti\", \"halat\", \"therapi\", \"clinic\", \"migrain\", \"steveh\", \"patient\", \"catbyt\", \"dtmedin\", \"blah\", \"carlo\", \"superstit\", \"baerga\", \"homeopathi\", \"skeptic\", \"gordon\", \"pitt\", \"medic\", \"doctor\", \"medicin\", \"food\", \"cancer\", \"sleev\", \"ingr\", \"genet\", \"aid\", \"bank\", \"treatment\", \"water\", \"pain\", \"health\", \"handheld\", \"studi\", \"princeton\", \"caus\", \"effect\", \"scienc\", \"scientif\", \"rochest\", \"theori\", \"point\", \"result\", \"risk\", \"problem\", \"research\", \"case\", \"steve\", \"test\", \"time\", \"peopl\", \"repli\", \"take\", \"differ\", \"year\", \"say\", \"thing\", \"isra\", \"hockey\", \"playoff\", \"palestinian\", \"detroit\", \"leaf\", \"cramer\", \"optilink\", \"pen\", \"cunixb\", \"lebanes\", \"penguin\", \"clayton\", \"jake\", \"maynard\", \"espn\", \"edmonton\", \"ericsson\", \"boni\", \"lemieux\", \"gaza\", \"puck\", \"bruin\", \"selann\", \"laurentian\", \"quebec\", \"ramsey\", \"canuck\", \"shark\", \"uvic\", \"montreal\", \"flyer\", \"israel\", \"stanley\", \"team\", \"jet\", \"coach\", \"ranger\", \"winnipeg\", \"game\", \"play\", \"wing\", \"player\", \"columbia\", \"season\", \"leagu\", \"pittsburgh\", \"score\", \"arab\", \"mcgill\", \"goal\", \"virginia\", \"toronto\", \"andrew\", \"year\", \"divis\", \"canada\", \"period\", \"final\", \"point\", \"time\", \"american\", \"go\"], \"Total\": [2966.0, 1940.0, 1924.0, 1689.0, 2638.0, 2884.0, 1860.0, 1161.0, 1997.0, 1477.0, 1274.0, 1016.0, 1577.0, 1423.0, 1059.0, 1331.0, 1142.0, 2600.0, 837.0, 1391.0, 6052.0, 742.0, 990.0, 784.0, 1802.0, 1023.0, 4004.0, 867.0, 1191.0, 747.0, 1142.6856689453125, 698.7892456054688, 407.6301574707031, 376.0523376464844, 366.0244140625, 325.7693176269531, 318.1803283691406, 294.5684509277344, 243.75758361816406, 243.47354125976562, 239.42320251464844, 223.5354461669922, 220.10520935058594, 499.7329406738281, 183.76812744140625, 189.986083984375, 181.63705444335938, 168.4805908203125, 170.9480438232422, 163.333740234375, 156.91017150878906, 153.886962890625, 148.2976531982422, 145.83355712890625, 144.879150390625, 143.41905212402344, 140.88682556152344, 138.14251708984375, 112.51419830322266, 112.23980712890625, 299.66619873046875, 239.2371826171875, 575.1444702148438, 235.90956115722656, 846.7127075195312, 310.77874755859375, 1292.3048095703125, 203.61073303222656, 568.2711791992188, 904.836181640625, 498.23358154296875, 821.609130859375, 317.67413330078125, 442.3506164550781, 6052.24072265625, 470.10357666015625, 1997.324951171875, 3614.37890625, 771.2041015625, 4395.30419921875, 753.3086547851562, 728.9891967773438, 3490.1201171875, 1666.1630859375, 3510.617431640625, 3362.2998046875, 2458.740966796875, 1374.794921875, 910.3983154296875, 2752.224853515625, 5183.12158203125, 1404.2081298828125, 3617.91015625, 1561.89111328125, 1909.0416259765625, 4004.603515625, 1884.1224365234375, 1274.664794921875, 843.9874877929688, 688.462890625, 379.0060119628906, 601.0263671875, 285.0621643066406, 265.8124694824219, 258.5965270996094, 234.26597595214844, 199.44381713867188, 197.4620819091797, 187.31765747070312, 186.6690673828125, 191.4668731689453, 161.5784912109375, 158.11094665527344, 148.4104766845703, 144.83966064453125, 142.1898956298828, 133.85328674316406, 133.607666015625, 137.19871520996094, 135.05442810058594, 123.29427337646484, 118.56434631347656, 111.63320922851562, 104.25935363769531, 104.73915100097656, 103.52851104736328, 192.95652770996094, 1924.052490234375, 744.5303955078125, 604.3348999023438, 642.5186767578125, 209.473876953125, 250.68084716796875, 845.5989379882812, 828.3161010742188, 355.5079040527344, 287.7699890136719, 282.9315490722656, 442.10467529296875, 692.8697509765625, 269.93646240234375, 446.02288818359375, 578.7404174804688, 2561.57275390625, 282.8100891113281, 815.093017578125, 1699.812744140625, 474.28302001953125, 965.1755981445312, 1333.0074462890625, 902.1245727539062, 1251.440673828125, 1317.1837158203125, 2641.765625, 6052.24072265625, 1353.1533203125, 1006.899169921875, 4395.30419921875, 2872.2099609375, 1977.8988037109375, 3329.251220703125, 2055.943359375, 3362.2998046875, 3754.512451171875, 2277.26025390625, 5183.12158203125, 2646.850830078125, 1892.380859375, 514.5391235351562, 479.60406494140625, 262.1926574707031, 305.8974609375, 183.00523376464844, 165.38929748535156, 159.3942108154297, 152.96470642089844, 138.79685974121094, 136.08087158203125, 118.2038345336914, 102.45138549804688, 101.46646881103516, 95.48358917236328, 94.9975357055664, 93.75051879882812, 89.41075134277344, 85.98323059082031, 78.79640197753906, 77.11235046386719, 75.6888427734375, 77.9653091430664, 67.1884536743164, 66.7538833618164, 63.509578704833984, 62.54978561401367, 57.58708572387695, 57.563636779785156, 57.3893928527832, 57.15915298461914, 448.55657958984375, 58.58415985107422, 180.8949432373047, 872.5092163085938, 374.1332092285156, 496.03216552734375, 1391.68603515625, 441.02191162109375, 358.5589599609375, 426.19305419921875, 1054.7808837890625, 199.62811279296875, 1032.63037109375, 440.0619812011719, 1078.5040283203125, 1021.21630859375, 1669.5213623046875, 441.5232238769531, 1374.6883544921875, 2884.190673828125, 2375.445556640625, 1561.026611328125, 2600.153564453125, 691.944580078125, 736.2711791992188, 1159.4267578125, 2169.358642578125, 1621.3409423828125, 1630.9676513671875, 2103.4462890625, 1606.2760009765625, 1651.1109619140625, 1085.956787109375, 1067.5660400390625, 839.23681640625, 2966.81884765625, 872.6724853515625, 1443.4810791015625, 3039.01025390625, 2288.6611328125, 3375.223876953125, 1421.1317138671875, 1956.808349609375, 3517.246337890625, 867.5025024414062, 317.6472473144531, 250.21588134765625, 230.822021484375, 229.65501403808594, 212.469482421875, 183.94711303710938, 167.1087646484375, 165.7086639404297, 156.47564697265625, 158.841552734375, 362.0856628417969, 134.38279724121094, 125.08786010742188, 123.22889709472656, 117.95303344726562, 112.17479705810547, 111.7510986328125, 110.07952880859375, 104.12570190429688, 99.83139038085938, 519.8053588867188, 90.54296112060547, 83.66317749023438, 82.6308364868164, 104.47161102294922, 76.17282104492188, 76.12928771972656, 71.69883728027344, 70.25984191894531, 287.1429138183594, 317.7418212890625, 1023.19677734375, 213.9846954345703, 736.9693603515625, 385.20306396484375, 1577.9459228515625, 487.7285461425781, 681.551513671875, 651.6373901367188, 414.8818359375, 202.3636016845703, 773.6707763671875, 2638.341552734375, 1191.1107177734375, 521.547607421875, 771.9820556640625, 825.6704711914062, 2966.81884765625, 979.7251586914062, 877.64501953125, 316.5227966308594, 603.9163208007812, 656.5357666015625, 3254.719970703125, 1051.2142333984375, 2884.190673828125, 2288.6611328125, 1819.038330078125, 3998.41064453125, 901.28564453125, 3517.246337890625, 1391.8231201171875, 2348.69677734375, 2600.153564453125, 3617.91015625, 5183.12158203125, 2732.342529296875, 1630.9676513671875, 3039.01025390625, 267.0742492675781, 172.0186767578125, 156.53477478027344, 228.3336181640625, 132.47816467285156, 111.56108093261719, 110.63384246826172, 480.3006896972656, 124.95624542236328, 97.44942474365234, 91.61353302001953, 87.83140563964844, 85.67245483398438, 85.59416961669922, 84.05184936523438, 251.9625244140625, 74.36140441894531, 71.5853042602539, 71.22400665283203, 69.75337982177734, 67.62906646728516, 66.80011749267578, 61.52567672729492, 61.210594177246094, 60.51362609863281, 60.35288619995117, 60.056236267089844, 59.229862213134766, 58.732261657714844, 58.3338737487793, 416.04022216796875, 351.22491455078125, 197.7613983154297, 259.21063232421875, 170.8984832763672, 275.1896057128906, 144.3324737548828, 175.0106658935547, 593.0027465820312, 1331.6910400390625, 1860.989990234375, 257.6250915527344, 338.0062255859375, 441.3564453125, 216.25115966796875, 284.1476135253906, 205.7794952392578, 455.3014831542969, 191.24240112304688, 874.0391845703125, 344.76593017578125, 726.9601440429688, 1014.6715698242188, 862.6346435546875, 337.0456848144531, 4004.603515625, 3998.41064453125, 642.0369873046875, 701.0498657226562, 557.0301513671875, 3510.617431640625, 5183.12158203125, 1433.1673583984375, 1579.4356689453125, 1518.08154296875, 1785.505859375, 3329.251220703125, 4395.30419921875, 3375.223876953125, 6052.24072265625, 2600.153564453125, 3617.91015625, 3517.246337890625, 1000.7255249023438, 1483.91259765625, 495.9259948730469, 747.8888549804688, 325.7707214355469, 302.4598388671875, 245.07272338867188, 159.03866577148438, 108.3163070678711, 95.96115112304688, 100.31522369384766, 91.93561553955078, 89.57569122314453, 80.2626953125, 78.74849700927734, 77.21672058105469, 75.48271942138672, 69.6209945678711, 67.88932800292969, 66.39307403564453, 65.72957611083984, 63.82933807373047, 63.01356506347656, 61.98298645019531, 61.99775695800781, 59.62815475463867, 58.660850524902344, 58.45547103881836, 58.323734283447266, 54.44773483276367, 54.01467514038086, 82.45339965820312, 485.455078125, 668.6755981445312, 285.07806396484375, 240.7487335205078, 577.5048828125, 179.9601593017578, 111.24809265136719, 529.0847778320312, 357.6230773925781, 74.69509887695312, 242.41627502441406, 503.03863525390625, 297.51763916015625, 281.2916564941406, 192.39242553710938, 183.0908203125, 466.7659912109375, 750.9197387695312, 366.600341796875, 724.9913330078125, 250.3634796142578, 415.90521240234375, 353.12091064453125, 657.73046875, 1070.769775390625, 3490.1201171875, 395.6552429199219, 983.89306640625, 607.056640625, 3754.512451171875, 598.3618774414062, 2638.341552734375, 3614.37890625, 3375.223876953125, 6052.24072265625, 3617.91015625, 2113.316162109375, 3329.251220703125, 5183.12158203125, 3510.617431640625, 3039.01025390625, 2732.342529296875, 1433.1673583984375, 1407.93994140625, 3254.719970703125, 3517.246337890625, 275.8894958496094, 207.16677856445312, 206.80348205566406, 186.3794403076172, 143.24180603027344, 139.36428833007812, 126.11944580078125, 125.8499984741211, 114.2164306640625, 112.23802185058594, 110.29060363769531, 106.61448669433594, 107.27007293701172, 295.4941711425781, 102.42676544189453, 99.06878662109375, 98.99481201171875, 97.60137939453125, 96.14401245117188, 94.8175277709961, 91.84278869628906, 91.01932525634766, 206.16087341308594, 84.42133331298828, 84.08326721191406, 83.0025405883789, 80.97196197509766, 80.94422149658203, 79.88419342041016, 78.38389587402344, 639.207763671875, 227.35552978515625, 323.0017395019531, 231.70584106445312, 201.0164031982422, 428.85137939453125, 227.23008728027344, 525.593994140625, 277.059326171875, 257.5475158691406, 175.57948303222656, 283.9958801269531, 476.73712158203125, 133.42327880859375, 365.1600646972656, 1031.7481689453125, 640.5665283203125, 4004.603515625, 1280.0654296875, 3754.512451171875, 1940.3056640625, 488.2843322753906, 472.27227783203125, 990.3853759765625, 1023.18505859375, 516.35693359375, 3375.223876953125, 3039.01025390625, 3510.617431640625, 5183.12158203125, 818.4566650390625, 3362.2998046875, 1909.0416259765625, 1423.678955078125, 1658.632080078125, 1346.393798828125, 1717.5716552734375, 1785.505859375, 3329.251220703125, 1491.1873779296875, 990.3681030273438, 1542.396728515625, 1161.5667724609375, 425.4395751953125, 362.8358154296875, 389.9899597167969, 256.05499267578125, 224.26022338867188, 187.68853759765625, 151.81675720214844, 149.26809692382812, 143.24859619140625, 784.1885986328125, 126.84929656982422, 123.27316284179688, 114.40896606445312, 111.91240692138672, 118.12262725830078, 98.6883316040039, 96.04891967773438, 155.52407836914062, 86.7515869140625, 86.71247863769531, 84.7991943359375, 83.96793365478516, 81.92617797851562, 87.68406677246094, 73.12200164794922, 71.84886169433594, 66.95635223388672, 66.2371597290039, 62.503814697265625, 659.0949096679688, 1059.3629150390625, 429.3234558105469, 89.65412902832031, 124.41126251220703, 474.0597839355469, 1477.2554931640625, 430.520751953125, 178.88685607910156, 204.3247528076172, 1802.019287109375, 1997.324951171875, 534.64892578125, 906.0775756835938, 556.024169921875, 491.4239501953125, 613.6195678710938, 662.9179077148438, 470.1695251464844, 1022.0805053710938, 480.69464111328125, 730.8409423828125, 2365.4375, 763.007080078125, 1372.454345703125, 2169.358642578125, 1377.273681640625, 1170.2694091796875, 3490.1201171875, 3614.37890625, 1280.413818359375, 1651.1109619140625, 6052.24072265625, 3517.246337890625, 399.3816833496094, 300.8172912597656, 165.6021728515625, 152.21038818359375, 135.7383270263672, 135.75428771972656, 129.73992919921875, 121.13043975830078, 120.74485778808594, 104.6231460571289, 93.98695373535156, 106.80420684814453, 92.05374145507812, 89.81517791748047, 87.41483306884766, 84.12355041503906, 83.48693084716797, 77.58230590820312, 74.85601043701172, 139.18516540527344, 74.51407623291016, 74.36089324951172, 301.65814208984375, 72.4502182006836, 72.4502182006836, 72.30432891845703, 69.5348129272461, 71.61282348632812, 67.97527313232422, 65.5474853515625, 140.34677124023438, 354.6991271972656, 560.325927734375, 467.2398986816406, 372.57330322265625, 214.29714965820312, 528.391357421875, 128.8434295654297, 106.83519744873047, 215.34388732910156, 114.37532806396484, 206.88092041015625, 542.6390380859375, 263.99560546875, 416.1996765136719, 361.66558837890625, 544.8867797851562, 136.74913024902344, 864.7689819335938, 185.32183837890625, 1192.1806640625, 1098.416259765625, 1600.403076171875, 409.02203369140625, 366.54962158203125, 446.0751953125, 2646.850830078125, 941.828857421875, 342.37249755859375, 3254.719970703125, 1469.8829345703125, 2113.316162109375, 866.4751586914062, 975.6422729492188, 5183.12158203125, 6052.24072265625, 2732.342529296875, 1884.1224365234375, 2258.383544921875, 4004.603515625, 4395.30419921875, 3329.251220703125, 837.592041015625, 742.5023803710938, 348.9384460449219, 263.5115966796875, 235.57916259765625, 226.56475830078125, 215.50299072265625, 198.07823181152344, 177.06741333007812, 164.60345458984375, 160.56524658203125, 157.4338836669922, 156.4473419189453, 148.04823303222656, 144.6669921875, 152.85597229003906, 141.4331817626953, 133.9269561767578, 132.6742706298828, 123.26013946533203, 119.5447006225586, 116.5197525024414, 113.29080200195312, 113.11150360107422, 112.6846923828125, 120.06710052490234, 102.96061706542969, 94.33647918701172, 93.13108825683594, 90.6162338256836, 220.8243408203125, 153.70223999023438, 1016.828125, 185.55426025390625, 1689.23095703125, 167.16043090820312, 202.18853759765625, 240.0043182373047, 165.12567138671875, 1940.3056640625, 1423.678955078125, 399.81451416015625, 990.3853759765625, 559.1829833984375, 669.9990234375, 536.7244873046875, 505.73583984375, 528.174072265625, 572.368408203125, 254.2933349609375, 553.6107788085938, 544.26123046875, 701.0498657226562, 868.3087768554688, 4004.603515625, 693.3735961914062, 732.436279296875, 584.4656982421875, 822.2222900390625, 2646.850830078125, 5183.12158203125, 1242.119140625, 3510.617431640625], \"loglift\": [30.0, 29.0, 28.0, 27.0, 26.0, 25.0, 24.0, 23.0, 22.0, 21.0, 20.0, 19.0, 18.0, 17.0, 16.0, 15.0, 14.0, 13.0, 12.0, 11.0, 10.0, 9.0, 8.0, 7.0, 6.0, 5.0, 4.0, 3.0, 2.0, 1.0, 2.025700092315674, 2.0251998901367188, 2.0243000984191895, 2.0241000652313232, 2.0239999294281006, 2.023699998855591, 2.0236001014709473, 2.023400068283081, 2.0227999687194824, 2.0227999687194824, 2.022700071334839, 2.0225000381469727, 2.02239990234375, 2.021899938583374, 2.0216000080108643, 2.0216000080108643, 2.0215001106262207, 2.0211000442504883, 2.0211000442504883, 2.0209999084472656, 2.020699977874756, 2.020400047302246, 2.020400047302246, 2.0202999114990234, 2.0202999114990234, 2.02020001411438, 2.0201001167297363, 2.01990008354187, 2.018399953842163, 2.018399953842163, 2.015500068664551, 2.0074000358581543, 1.9529999494552612, 1.989300012588501, 1.882599949836731, 1.9591000080108643, 1.7972999811172485, 1.9804999828338623, 1.8198000192642212, 1.6780999898910522, 1.7633999586105347, 1.6376999616622925, 1.8669999837875366, 1.7817000150680542, 1.0758999586105347, 1.7409000396728516, 1.2897000312805176, 1.0537999868392944, 1.5707999467849731, 0.9531000256538391, 1.4707000255584717, 1.4836000204086304, 0.7210000157356262, 1.080899953842163, 0.6299999952316284, 0.6431000232696533, 0.739799976348877, 1.0845999717712402, 1.3265999555587769, 0.5475999712944031, 0.0575999990105629, 0.9684000015258789, 0.27399998903274536, 0.847000002861023, 0.6579999923706055, -0.014100000262260437, 0.5697000026702881, 2.045300006866455, 2.0448999404907227, 2.0446999073028564, 2.043600082397461, 2.0434999465942383, 2.042799949645996, 2.04259991645813, 2.0425000190734863, 2.042099952697754, 2.0413999557495117, 2.041300058364868, 2.041100025177002, 2.041100025177002, 2.040800094604492, 2.0404000282287598, 2.0401999950408936, 2.039900064468384, 2.0397000312805176, 2.039599895477295, 2.0392000675201416, 2.0392000675201416, 2.039099931716919, 2.0387001037597656, 2.038599967956543, 2.038300037384033, 2.0378000736236572, 2.0371999740600586, 2.037100076675415, 2.0369999408721924, 2.036600112915039, 2.0320000648498535, 2.0320000648498535, 2.030900001525879, 2.0232999324798584, 2.0329999923706055, 2.030900001525879, 1.9907000064849854, 1.9453999996185303, 1.98989999294281, 1.9886000156402588, 1.9831000566482544, 1.9408999681472778, 1.858299970626831, 1.9699000120162964, 1.882699966430664, 1.820099949836731, 1.5154999494552612, 1.9496999979019165, 1.700600028038025, 1.5045000314712524, 1.795699954032898, 1.572100043296814, 1.4509999752044678, 1.5461000204086304, 1.4234000444412231, 1.3523999452590942, 1.0579999685287476, 0.6974999904632568, 1.2980999946594238, 1.399399995803833, 0.6689000129699707, 0.859000027179718, 1.0434000492095947, 0.6948999762535095, 0.9135000109672546, 0.5393000245094299, 0.31619998812675476, 0.7174999713897705, 0.003100000089034438, 0.5838000178337097, 0.8629000186920166, 2.080399990081787, 2.0803000926971436, 2.078700065612793, 2.0776000022888184, 2.077199935913086, 2.07669997215271, 2.0764999389648438, 2.0762999057769775, 2.075700044631958, 2.075500011444092, 2.07450008392334, 2.0732998847961426, 2.073199987411499, 2.072700023651123, 2.0725998878479004, 2.072499990463257, 2.072000026702881, 2.0715999603271484, 2.0706000328063965, 2.0703999996185303, 2.070199966430664, 2.0689001083374023, 2.0685999393463135, 2.06850004196167, 2.0678000450134277, 2.0676000118255615, 2.0662999153137207, 2.0662999153137207, 2.0662999153137207, 2.066200017929077, 2.0478999614715576, 2.0660998821258545, 2.051300048828125, 2.010200023651123, 2.0223000049591064, 2.0088000297546387, 1.9704999923706055, 1.979099988937378, 1.9657000303268433, 1.9250999689102173, 1.8271000385284424, 1.9738999605178833, 1.774899959564209, 1.864300012588501, 1.7426999807357788, 1.7105000019073486, 1.6003999710083008, 1.8172999620437622, 1.605299949645996, 1.4668999910354614, 1.4729000329971313, 1.5562000274658203, 1.4235999584197998, 1.6993999481201172, 1.6753000020980835, 1.5450999736785889, 1.365399956703186, 1.4404000043869019, 1.42330002784729, 1.3453999757766724, 1.3896000385284424, 1.3382999897003174, 1.4631999731063843, 1.4598000049591064, 1.579800009727478, 0.9275000095367432, 1.518399953842163, 1.1761000156402588, 0.49900001287460327, 0.7233999967575073, 0.37959998846054077, 1.0924999713897705, 0.7401999831199646, 0.15469999611377716, 2.119499921798706, 2.1177000999450684, 2.1168999671936035, 2.1166000366210938, 2.1166000366210938, 2.116300106048584, 2.115600109100342, 2.1150999069213867, 2.1150999069213867, 2.1147000789642334, 2.1147000789642334, 2.114000082015991, 2.113800048828125, 2.113300085067749, 2.1131999492645264, 2.112799882888794, 2.1124000549316406, 2.1124000549316406, 2.112299919128418, 2.111799955368042, 2.1113998889923096, 2.1108999252319336, 2.1105000972747803, 2.109600067138672, 2.109499931335449, 2.1089000701904297, 2.1085000038146973, 2.1085000038146973, 2.107800006866455, 2.1075000762939453, 2.101799964904785, 2.099600076675415, 2.06850004196167, 2.0922999382019043, 2.065000057220459, 2.073899984359741, 2.012500047683716, 2.0213000774383545, 2.000699996948242, 2.00219988822937, 2.02620005607605, 2.0680999755859375, 1.9438999891281128, 1.8284000158309937, 1.8823000192642212, 1.9651000499725342, 1.9211000204086304, 1.8946000337600708, 1.7211999893188477, 1.8492000102996826, 1.8622000217437744, 2.00570011138916, 1.8641999959945679, 1.8091000318527222, 1.291100025177002, 1.6136000156402588, 1.1761000156402588, 1.246899962425232, 1.3260999917984009, 0.9736999869346619, 1.5800000429153442, 0.8787000179290771, 1.298699975013733, 0.9728999733924866, 0.7918000221252441, 0.4300999939441681, 0.10779999941587448, 0.5929999947547913, 0.9908999800682068, 0.4043999910354614, 2.3441998958587646, 2.3422999382019043, 2.3417000770568848, 2.3413000106811523, 2.3406999111175537, 2.339400053024292, 2.3392999172210693, 2.339200019836426, 2.3382999897003174, 2.338200092315674, 2.337599992752075, 2.337100028991699, 2.336899995803833, 2.336899995803833, 2.336699962615967, 2.3359999656677246, 2.335200071334839, 2.3348000049591064, 2.334700107574463, 2.334399938583374, 2.3340001106262207, 2.3338000774383545, 2.33270001411438, 2.3326001167297363, 2.33240008354187, 2.33240008354187, 2.3322999477386475, 2.3320999145507812, 2.331899881362915, 2.3317999839782715, 2.3208999633789062, 2.3194000720977783, 2.3124001026153564, 2.296299934387207, 2.303499937057495, 2.2809998989105225, 2.305799961090088, 2.289299964904785, 2.2183001041412354, 2.1064999103546143, 2.0636000633239746, 2.2262001037597656, 2.182800054550171, 2.096299886703491, 2.1956000328063965, 2.134700059890747, 2.186000108718872, 2.0332000255584717, 2.1928999423980713, 1.8654999732971191, 2.050800085067749, 1.8450000286102295, 1.6744999885559082, 1.5878000259399414, 1.9638999700546265, 0.8166999816894531, 0.7953000068664551, 1.6296000480651855, 1.5721999406814575, 1.6842000484466553, 0.6662999987602234, 0.41440001130104065, 1.1359000205993652, 0.9230999946594238, 0.927299976348877, 0.7792999744415283, 0.24959999322891235, -0.01080000028014183, 0.20020000636577606, -0.3831999897956848, 0.3409000039100647, 0.04670000076293945, 0.013500000350177288, 1.1299999952316284, 0.7407000064849854, 2.3547000885009766, 2.354599952697754, 2.353800058364868, 2.353800058364868, 2.3517000675201416, 2.351099967956543, 2.348400115966797, 2.3473000526428223, 2.3469998836517334, 2.34689998626709, 2.34660005569458, 2.345400094985962, 2.3452000617980957, 2.3450000286102295, 2.3447000980377197, 2.3436999320983887, 2.3433001041412354, 2.3429999351501465, 2.3427999019622803, 2.3424999713897705, 2.3422999382019043, 2.3420000076293945, 2.3420000076293945, 2.341399908065796, 2.341200113296509, 2.341099977493286, 2.341099977493286, 2.3399999141693115, 2.3397998809814453, 2.3397998809814453, 2.316999912261963, 2.2971999645233154, 2.311800003051758, 2.310499906539917, 2.2607998847961426, 2.294800043106079, 2.312999963760376, 2.234999895095825, 2.249500036239624, 2.33240008354187, 2.2402000427246094, 2.177000045776367, 2.202699899673462, 2.194000005722046, 2.2356998920440674, 2.2337000370025635, 2.0715999603271484, 1.9708000421524048, 2.089200019836426, 1.9448000192642212, 2.1308000087738037, 2.011699914932251, 2.0434999465942383, 1.799399971961975, 1.6153000593185425, 1.215399980545044, 1.9221999645233154, 1.5214999914169312, 1.7156000137329102, 0.7318000197410583, 1.5987999439239502, 0.6722000241279602, 0.460999995470047, 0.4821999967098236, 0.07450000196695328, 0.4043000042438507, 0.7800999879837036, 0.4431000053882599, 0.03189999982714653, 0.3253999948501587, 0.42750000953674316, 0.4212000072002411, 0.951200008392334, 0.9587000012397766, 0.13609999418258667, 0.011599999852478504, 2.412899971008301, 2.411799907684326, 2.4117000102996826, 2.41129994392395, 2.4098000526428223, 2.409600019454956, 2.408900022506714, 2.408900022506714, 2.4082000255584717, 2.4079999923706055, 2.407900094985962, 2.407599925994873, 2.4072999954223633, 2.4072000980377197, 2.4072000980377197, 2.406899929046631, 2.406899929046631, 2.4068000316619873, 2.406599998474121, 2.4065001010894775, 2.4061999320983887, 2.406100034713745, 2.4058001041412354, 2.4052999019622803, 2.4052999019622803, 2.405100107192993, 2.404900074005127, 2.4047999382019043, 2.4047000408172607, 2.4045000076293945, 2.393399953842163, 2.3766000270843506, 2.3415000438690186, 2.356600046157837, 2.358099937438965, 2.2316999435424805, 2.3006999492645264, 2.1846001148223877, 2.2667999267578125, 2.2227001190185547, 2.2576000690460205, 2.123500108718872, 1.96589994430542, 2.312700033187866, 1.9866000413894653, 1.5972000360488892, 1.7648999691009521, 1.0089999437332153, 1.4464999437332153, 1.0003999471664429, 1.226099967956543, 1.7905999422073364, 1.7925000190734863, 1.4223999977111816, 1.3906999826431274, 1.7354999780654907, 0.6812000274658203, 0.6772000193595886, 0.5329999923706055, 0.23199999332427979, 1.4362000226974487, 0.38100001215934753, 0.775600016117096, 0.977400004863739, 0.843500018119812, 0.9948999881744385, 0.7968999743461609, 0.7509999871253967, 0.16369999945163727, 0.7944999933242798, 1.1396000385284424, 0.7049999833106995, 2.5399999618530273, 2.538599967956543, 2.5381999015808105, 2.537600040435791, 2.5371999740600586, 2.5367000102996826, 2.535900115966797, 2.5348000526428223, 2.5346999168395996, 2.53439998626709, 2.533600091934204, 2.533600091934204, 2.533400058746338, 2.5327999591827393, 2.532399892807007, 2.5320000648498535, 2.5315001010894775, 2.5311999320983887, 2.5309998989105225, 2.5302000045776367, 2.5302000045776367, 2.5299999713897705, 2.5297999382019043, 2.529599905014038, 2.529400110244751, 2.5281999111175537, 2.5280001163482666, 2.5269999504089355, 2.526900053024292, 2.526099920272827, 2.4986000061035156, 2.449700117111206, 2.4507999420166016, 2.5095999240875244, 2.4767000675201416, 2.3310999870300293, 2.1043999195098877, 2.260999917984009, 2.390899896621704, 2.345099925994873, 1.830899953842163, 1.718000054359436, 2.049499988555908, 1.8805999755859375, 2.0171000957489014, 2.0546998977661133, 1.9694000482559204, 1.9026000499725342, 2.0141000747680664, 1.6618000268936157, 1.9522000551223755, 1.7516000270843506, 1.1319999694824219, 1.6973999738693237, 1.3797999620437622, 1.1074999570846558, 1.30649995803833, 1.3229000568389893, 0.4544000029563904, 0.39160001277923584, 1.2115000486373901, 0.9824000000953674, -0.3140999972820282, 0.1941000074148178, 2.65310001373291, 2.652400016784668, 2.649899959564209, 2.649399995803833, 2.648699998855591, 2.648699998855591, 2.648400068283081, 2.647900104522705, 2.647900104522705, 2.646699905395508, 2.645699977874756, 2.6454999446868896, 2.6454999446868896, 2.6452999114990234, 2.6449999809265137, 2.6445999145507812, 2.6445000171661377, 2.643399953842163, 2.643199920654297, 2.643199920654297, 2.6431000232696533, 2.6431000232696533, 2.6428000926971436, 2.6428000926971436, 2.6428000926971436, 2.6428000926971436, 2.6422998905181885, 2.6421000957489014, 2.641900062561035, 2.641400098800659, 2.6357998847961426, 2.583400011062622, 2.539099931716919, 2.5448999404907227, 2.508699893951416, 2.5471999645233154, 2.4651999473571777, 2.5882999897003174, 2.606600046157837, 2.528700113296509, 2.5971999168395996, 2.5181000232696533, 2.36680006980896, 2.4700000286102295, 2.364500045776367, 2.388400077819824, 2.2539000511169434, 2.546600103378296, 1.9606000185012817, 2.436800003051758, 1.7418999671936035, 1.7598999738693237, 1.6059000492095947, 2.1031999588012695, 2.1456000804901123, 2.023200035095215, 1.0397000312805176, 1.5461000204086304, 2.093899965286255, 0.7099999785423279, 1.1995999813079834, 0.8399999737739563, 1.422700047492981, 1.3033000230789185, -0.013100000098347664, -0.15240000188350677, 0.4366999864578247, 0.745199978351593, 0.510200023651123, -0.03449999913573265, -0.1454000025987625, 0.10090000182390213, 2.7216999530792236, 2.72160005569458, 2.7202000617980957, 2.7193000316619873, 2.718899965286255, 2.7188000679016113, 2.718600034713745, 2.7181999683380127, 2.717600107192993, 2.7172000408172607, 2.717099905014038, 2.7170000076293945, 2.7167999744415283, 2.716599941253662, 2.7165000438690186, 2.716399908065796, 2.7163000106811523, 2.7160000801086426, 2.71589994430542, 2.715399980545044, 2.715100049972534, 2.714900016784668, 2.7146999835968018, 2.7146999835968018, 2.7146999835968018, 2.714600086212158, 2.713900089263916, 2.713099956512451, 2.7130000591278076, 2.7126998901367188, 2.711699962615967, 2.710099935531616, 2.6603000164031982, 2.686300039291382, 2.523400068283081, 2.6849000453948975, 2.668600082397461, 2.6435000896453857, 2.673799991607666, 2.3148999214172363, 2.286799907684326, 2.4772000312805176, 2.259200096130371, 2.3819000720977783, 2.3366000652313232, 2.3770999908447266, 2.359499931335449, 2.3308000564575195, 2.299299955368042, 2.5445001125335693, 2.2544000148773193, 2.1686999797821045, 1.978600025177002, 1.773300051689148, 0.8248000144958496, 1.8695000410079956, 1.7740000486373901, 1.873900055885315, 1.5987000465393066, 0.6425999999046326, 0.05000000074505806, 1.1670000553131104, 0.04839999973773956], \"logprob\": [30.0, 29.0, 28.0, 27.0, 26.0, 25.0, 24.0, 23.0, 22.0, 21.0, 20.0, 19.0, 18.0, 17.0, 16.0, 15.0, 14.0, 13.0, 12.0, 11.0, 10.0, 9.0, 8.0, 7.0, 6.0, 5.0, 4.0, 3.0, 2.0, 1.0, -4.882199764251709, -5.374499797821045, -5.914400100708008, -5.995299816131592, -6.022299766540527, -6.139200210571289, -6.162799835205078, -6.240099906921387, -6.430099964141846, -6.431300163269043, -6.4481000900268555, -6.517099857330322, -6.532599925994873, -5.713200092315674, -6.713799953460693, -6.680600166320801, -6.725599765777588, -6.80109977722168, -6.786600112915039, -6.832300186157227, -6.872700214385986, -6.892399787902832, -6.929500102996826, -6.946300029754639, -6.952899932861328, -6.963099956512451, -6.981100082397461, -7.000899791717529, -7.207600116729736, -7.210000038146973, -6.230899810791016, -6.464200019836426, -5.641499996185303, -6.496399879455566, -5.325099945068359, -6.250899791717529, -4.987599849700928, -6.652400016784668, -5.7866997718811035, -5.463200092315674, -5.974699974060059, -5.600100040435791, -6.321100234985352, -6.075300216674805, -4.164999961853027, -6.055200099945068, -5.059800148010254, -4.702600002288818, -5.730299949645996, -4.607699871063232, -5.853899955749512, -5.873799800872803, -5.070400238037109, -5.449900150299072, -5.1554999351501465, -5.1855998039245605, -5.401899814605713, -5.638400077819824, -5.808599948883057, -5.481299877166748, -5.3383002281188965, -5.733500003814697, -5.481500148773193, -5.7484002113342285, -5.736800193786621, -5.668000221252441, -5.838200092315674, -4.753300189971924, -5.165999889373779, -5.369900226593018, -5.967899799346924, -5.506999969482422, -6.253600120544434, -6.323699951171875, -6.35129976272583, -6.450500011444092, -6.612100124359131, -6.622200012207031, -6.675099849700928, -6.678599834442139, -6.653600215911865, -6.823699951171875, -6.845600128173828, -6.909299850463867, -6.933800220489502, -6.952300071716309, -7.013199806213379, -7.014999866485596, -6.98859977722168, -7.004700183868408, -7.095900058746338, -7.135300159454346, -7.196100234985352, -7.264999866485596, -7.2606000900268555, -7.272200107574463, -6.650000095367432, -4.354899883270264, -5.3043999671936035, -5.513999938964844, -5.460400104522705, -6.571499824523926, -6.394000053405762, -5.218299865722656, -5.284299850463867, -6.085599899291992, -6.298299789428711, -6.320799827575684, -5.9166998863220215, -5.550000190734863, -6.38100004196167, -5.966000080108643, -5.768099784851074, -4.58519983291626, -6.354599952697754, -5.545199871063232, -5.00629997253418, -5.991600036621094, -5.504700183868408, -5.3028998374938965, -5.598199844360352, -5.393599987030029, -5.41349983215332, -5.011899948120117, -4.543399810791016, -5.440800189971924, -5.635000228881836, -4.891900062561035, -5.127299785614014, -5.315899848937988, -5.143700122833252, -5.407100200653076, -5.2895002365112305, -5.402100086212158, -5.500899791717529, -5.3927998542785645, -5.484099864959717, -5.540599822998047, -5.625400066375732, -5.695799827575684, -6.301300048828125, -6.148200035095215, -6.662399768829346, -6.764100074768066, -6.801199913024902, -6.842599868774414, -6.940400123596191, -6.960299968719482, -7.102200031280518, -7.246399879455566, -7.256100177764893, -7.317500114440918, -7.3225998878479, -7.335999965667725, -7.383800029754639, -7.423299789428711, -7.511600017547607, -7.533400058746338, -7.552299976348877, -7.52400016784668, -7.672999858856201, -7.679500102996826, -7.730100154876709, -7.745500087738037, -7.829500198364258, -7.829899787902832, -7.832900047302246, -7.836999893188477, -5.795100212097168, -7.8125, -6.699900150299072, -5.167600154876709, -6.002200126647949, -5.733699798583984, -4.740300178527832, -5.880899906158447, -6.10129976272583, -5.969099998474121, -5.160900115966797, -6.678699970245361, -5.234300136566162, -5.997900009155273, -5.223100185394287, -5.309899806976318, -4.928400039672852, -6.041500091552734, -5.117800235748291, -4.515200138092041, -4.7032999992370605, -5.03980016708374, -4.662199974060059, -5.71019983291626, -5.6722002029418945, -5.348400115966797, -4.901500225067139, -5.117700099945068, -5.128900051116943, -4.952400207519531, -5.177800178527832, -5.201499938964844, -5.495699882507324, -5.51609992980957, -5.6367998123168945, -5.026400089263916, -5.65910005569458, -5.4980998039245605, -5.430799961090088, -5.4899001121521, -5.445300102233887, -5.597400188446045, -5.629899978637695, -5.628900051116943, -5.063899993896484, -6.070400238037109, -6.309800148010254, -6.3907999992370605, -6.395899772644043, -6.473999977111816, -6.618800163269043, -6.7153000831604, -6.723800182342529, -6.781499862670898, -6.766499996185303, -5.94320011138916, -6.934599876403809, -7.006800174713135, -7.021900177001953, -7.065999984741211, -7.116600036621094, -7.1203999519348145, -7.1356000900268555, -7.191699981689453, -7.2342000007629395, -5.584799766540527, -7.332799911499023, -7.412700176239014, -7.42519998550415, -7.191299915313721, -7.507500171661377, -7.5081000328063965, -7.56879997253418, -7.589399814605713, -6.187300205230713, -6.0883002281188965, -4.949900150299072, -6.490799903869629, -5.281499862670898, -5.921500205993652, -4.572700023651123, -5.73799991607666, -5.423999786376953, -5.467400074005127, -5.894899845123291, -6.571000099182129, -5.354100227355957, -4.242700099945068, -4.984099864959717, -5.727200031280518, -5.379000186920166, -5.3383002281188965, -4.232699871063232, -5.212600231170654, -5.309599876403809, -6.185999870300293, -5.68149995803833, -5.6529998779296875, -4.570099830627441, -5.377799987792969, -4.806000232696533, -4.966400146484375, -5.1168999671936035, -4.681700229644775, -5.565299987792969, -4.904900074005127, -5.4120001792907715, -5.2144999504089355, -5.293900012969971, -5.325399875640869, -5.288099765777588, -5.44320011138916, -5.561200141906738, -5.525400161743164, -6.017399787902832, -6.459199905395508, -6.554100036621094, -6.177000045776367, -6.7220001220703125, -6.895100116729736, -6.903600215911865, -5.435500144958496, -6.782800197601318, -7.031599998474121, -7.093900203704834, -7.136499881744385, -7.1616997718811035, -7.162600040435791, -7.181000232696533, -6.083799839019775, -7.304900169372559, -7.343400001525879, -7.348599910736084, -7.369699954986572, -7.401000022888184, -7.41349983215332, -7.497000217437744, -7.502200126647949, -7.513800144195557, -7.516499996185303, -7.521500110626221, -7.535600185394287, -7.5441999435424805, -7.55109977722168, -5.597400188446045, -5.7683000564575195, -6.349699974060059, -6.095099925994873, -6.504499912261963, -6.050600051879883, -6.671199798583984, -6.494999885559082, -5.345600128173828, -4.648399829864502, -4.356599807739258, -6.17140007019043, -5.94320011138916, -5.763000011444092, -6.377099990844727, -6.164899826049805, -6.436299800872803, -5.794899940490723, -6.502699851989746, -5.310500144958496, -6.0553998947143555, -5.515200138092041, -5.35230016708374, -5.60129976272583, -6.164999961853027, -4.837200164794922, -4.860099792480469, -5.854800224304199, -5.8242998123168945, -5.942299842834473, -5.11929988861084, -4.981500148773193, -5.545599937438965, -5.661200046539307, -5.696599960327148, -5.682400226593018, -5.589000225067139, -5.571599960327148, -5.62470006942749, -5.624100208282471, -5.744900226593018, -5.708799839019775, -5.770199775695801, -5.910600185394287, -5.906000137329102, -5.388000011444092, -4.97730016708374, -5.809100151062012, -5.883299827575684, -6.095799922943115, -6.528900146484375, -6.915599822998047, -7.037899971008301, -6.993800163269043, -7.081099987030029, -7.107399940490723, -7.218400001525879, -7.237599849700928, -7.257500171661377, -7.2804999351501465, -7.362400054931641, -7.387899875640869, -7.4105000495910645, -7.4207000732421875, -7.450399875640869, -7.463500022888184, -7.480199813842773, -7.480000019073486, -7.519499778747559, -7.536099910736084, -7.539700031280518, -7.541999816894531, -7.6118998527526855, -7.619999885559082, -7.1971001625061035, -5.447000026702881, -5.146599769592285, -5.984499931335449, -6.154799938201904, -5.329599857330322, -6.46150016784668, -6.9243998527526855, -5.44290018081665, -5.820099830627441, -7.303299903869629, -6.218299865722656, -5.551400184631348, -6.050899982452393, -6.115699768066406, -6.45389986038208, -6.50540018081665, -5.731599807739258, -5.35699987411499, -5.955699920654297, -5.418099880218506, -6.295400142669678, -5.906899929046631, -6.03879976272583, -5.660900115966797, -5.357600212097168, -4.576000213623047, -6.046299934387207, -5.535999774932861, -5.82480001449585, -4.986599922180176, -5.956099987030029, -5.39900016784668, -5.295400142669678, -5.342700004577637, -5.166399955749512, -5.351200103759766, -5.513000011444092, -5.395500183105469, -5.363999843597412, -5.460100173950195, -5.502299785614014, -5.614999771118164, -5.730199813842773, -5.740499973297119, -5.725100040435791, -5.77209997177124, -5.916200160980225, -6.203800201416016, -6.205599784851074, -6.309999942779541, -6.57480001449585, -6.602399826049805, -6.702899932861328, -6.705100059509277, -6.802800178527832, -6.820400238037109, -6.838099956512451, -6.872300148010254, -6.866399765014648, -5.8531999588012695, -6.912700176239014, -6.946300029754639, -6.9471001625061035, -6.961400032043457, -6.976600170135498, -6.990600109100342, -7.022799968719482, -7.031899929046631, -6.214600086212158, -7.107999801635742, -7.111999988555908, -7.125100135803223, -7.150100231170654, -7.1504998207092285, -7.16379976272583, -7.183000087738037, -5.0954999923706055, -6.145999908447266, -5.829899787902832, -6.146999835968018, -6.287600040435791, -5.656300067901611, -6.222400188446045, -5.499899864196777, -6.05810022354126, -6.175099849700928, -6.523399829864502, -6.176700115203857, -5.816299915313721, -6.7428998947143555, -6.06220006942749, -5.412899971008301, -5.721799850463867, -4.644899845123291, -5.347899913787842, -4.7179999351501465, -5.152400016784668, -5.967599868774414, -5.999100208282471, -5.628600120544434, -5.627799987792969, -5.966800212860107, -5.143700122833252, -5.252600193023682, -5.252600193023682, -5.163899898529053, -5.8053998947143555, -5.447700023651123, -5.619100093841553, -5.710599899291992, -5.69189977645874, -5.749000072479248, -5.70359992980957, -5.710599899291992, -5.674900054931641, -5.8471999168396, -5.911399841308594, -5.9029998779296875, -4.351600170135498, -5.3572998046875, -5.516900062561035, -5.445400238037109, -5.866499900817871, -5.999599933624268, -6.178400039672852, -6.39169979095459, -6.408699989318848, -6.450099945068359, -4.750800132751465, -6.572500228881836, -6.60129976272583, -6.676599979400635, -6.698999881744385, -6.645400047302246, -6.8256001472473145, -6.853000164031982, -6.371300220489502, -6.9558000564575195, -6.956299781799316, -6.978799819946289, -6.988800048828125, -7.013700008392334, -6.946000099182129, -7.128799915313721, -7.146599769592285, -7.2179999351501465, -7.229000091552734, -7.287799835205078, -4.95959997177124, -4.533999919891357, -5.435999870300293, -6.94350004196167, -6.648799896240234, -5.456600189208984, -4.546800136566162, -5.6230998039245605, -6.371500015258789, -6.284299850463867, -4.621500015258789, -4.631499767303467, -5.618000030517578, -5.259300231933594, -5.611199855804443, -5.697000026702881, -5.560400009155273, -5.549799919128418, -5.781899929046631, -5.357699871063232, -5.821599960327148, -5.603300094604492, -5.048399925231934, -5.6143999099731445, -5.34499979019165, -5.15939998626709, -5.414700031280518, -5.561200141906738, -5.336999893188477, -5.3649001121521, -5.582699775695801, -5.557499885559082, -5.554999828338623, -5.589600086212158, -5.306000232696533, -5.590199947357178, -6.189599990844727, -6.274400234222412, -6.389599800109863, -6.389500141143799, -6.435200214385986, -6.504300117492676, -6.507500171661377, -6.6519999504089355, -6.760200023651123, -6.632599830627441, -6.781199932098389, -6.806099891662598, -6.833499908447266, -6.872200012207031, -6.879899978637695, -6.9542999267578125, -6.990300178527832, -6.370100021362305, -6.994999885559082, -6.997000217437744, -5.59689998626709, -7.023399829864502, -7.023399829864502, -7.025400161743164, -7.065000057220459, -7.035699844360352, -7.0879998207092285, -7.124899864196777, -6.369200229644775, -5.4944000244140625, -5.081399917602539, -5.257400035858154, -5.519999980926514, -6.0345001220703125, -5.214099884033203, -6.502200126647949, -6.671199798583984, -6.0482001304626465, -6.612400054931641, -6.098800182342529, -5.285799980163574, -5.903200149536133, -5.553400039672852, -5.670000076293945, -5.394599914550781, -6.484300136566162, -5.22599983215332, -6.290200233459473, -5.123600006103516, -5.187600135803223, -4.965199947357178, -5.832200050354004, -5.899400234222412, -5.825500011444092, -5.028299808502197, -5.555200099945068, -6.0192999839782715, -5.151199817657471, -5.456500053405762, -5.453000068664551, -5.76200008392334, -5.762700080871582, -5.408999919891357, -5.3933000564575195, -5.599400043487549, -5.662700176239014, -5.7164998054504395, -5.688399791717529, -5.706200122833252, -5.737599849700928, -4.496799945831299, -4.617499828338623, -5.374000072479248, -5.655700206756592, -5.768099784851074, -5.807300090789795, -5.857600212097168, -5.942200183868408, -6.054900169372559, -6.128300189971924, -6.153299808502197, -6.173099994659424, -6.179500102996826, -6.234899997711182, -6.258200168609619, -6.203199863433838, -6.280900001525879, -6.3358001708984375, -6.345300197601318, -6.419400215148926, -6.450300216674805, -6.476099967956543, -6.50439977645874, -6.50600004196167, -6.509799957275391, -6.446499824523926, -6.600800037384033, -6.6890997886657715, -6.702099800109863, -6.729800224304199, -5.840000152587891, -6.20389986038208, -4.364299774169922, -6.039400100708008, -3.9937000274658203, -6.145199775695801, -5.97130012512207, -5.824900150299072, -6.168600082397461, -4.063600063323975, -4.401299953460693, -5.480899810791016, -4.791800022125244, -5.240699768066406, -5.105299949645996, -5.286499977111816, -5.36359977722168, -5.348800182342529, -5.300000190734863, -5.866099834442139, -5.378200054168701, -5.480899810791016, -5.417900085449219, -5.409200191497803, -4.829100131988525, -5.538000106811523, -5.578700065612793, -5.704500198364258, -5.638400077819824, -5.4253997802734375, -5.345900058746338, -5.65749979019165, -5.737199783325195]}, \"token.table\": {\"Topic\": [1, 2, 3, 4, 5, 6, 8, 9, 10, 3, 4, 5, 6, 7, 8, 4, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 1, 3, 5, 8, 1, 2, 3, 5, 8, 1, 5, 8, 9, 5, 3, 8, 7, 4, 1, 2, 5, 6, 7, 8, 9, 10, 2, 3, 4, 5, 6, 7, 8, 10, 3, 8, 1, 6, 9, 2, 4, 5, 2, 3, 4, 5, 8, 1, 10, 1, 3, 4, 8, 1, 1, 2, 3, 5, 6, 7, 8, 9, 1, 6, 8, 9, 10, 1, 1, 1, 3, 5, 6, 6, 2, 2, 2, 1, 2, 6, 8, 9, 10, 5, 1, 2, 3, 4, 8, 2, 3, 4, 5, 6, 7, 3, 5, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 1, 1, 1, 3, 9, 4, 5, 7, 1, 3, 4, 5, 6, 7, 8, 9, 10, 7, 10, 7, 1, 8, 6, 7, 1, 2, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 1, 3, 7, 8, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 2, 2, 5, 6, 2, 5, 3, 4, 4, 9, 7, 1, 3, 4, 5, 7, 8, 9, 10, 10, 8, 1, 2, 3, 4, 5, 6, 7, 9, 6, 5, 6, 7, 10, 10, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 1, 4, 5, 6, 7, 3, 4, 8, 4, 6, 4, 5, 1, 3, 4, 5, 6, 7, 8, 9, 10, 8, 9, 9, 10, 5, 6, 4, 6, 7, 8, 10, 9, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 9, 7, 2, 1, 2, 3, 4, 5, 6, 7, 8, 9, 6, 4, 4, 9, 1, 2, 3, 5, 8, 9, 4, 7, 8, 9, 1, 2, 1, 2, 1, 2, 5, 4, 8, 3, 4, 7, 8, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 8, 1, 2, 3, 8, 10, 6, 7, 10, 3, 4, 4, 9, 1, 5, 6, 8, 7, 8, 7, 10, 2, 3, 4, 6, 7, 8, 1, 2, 3, 4, 7, 10, 2, 3, 4, 5, 6, 7, 8, 10, 1, 4, 6, 7, 10, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 2, 3, 4, 5, 6, 7, 8, 9, 3, 4, 7, 9, 6, 4, 2, 9, 10, 3, 1, 3, 4, 5, 6, 7, 8, 9, 10, 1, 2, 3, 4, 6, 7, 8, 3, 1, 3, 4, 5, 6, 7, 8, 9, 6, 1, 4, 5, 6, 8, 9, 10, 1, 2, 6, 8, 10, 1, 6, 8, 8, 8, 8, 8, 4, 7, 10, 9, 2, 6, 2, 3, 4, 6, 7, 8, 9, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 1, 4, 6, 8, 1, 2, 4, 6, 9, 10, 8, 8, 5, 1, 2, 3, 4, 5, 6, 7, 8, 9, 3, 10, 3, 4, 7, 8, 4, 9, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 3, 3, 4, 8, 9, 3, 4, 8, 1, 2, 3, 4, 5, 9, 10, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 2, 1, 3, 4, 5, 6, 7, 8, 9, 10, 5, 1, 6, 9, 2, 7, 1, 2, 4, 5, 6, 7, 9, 10, 4, 5, 6, 8, 10, 3, 5, 9, 1, 7, 9, 1, 2, 3, 5, 7, 9, 10, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 9, 4, 1, 2, 3, 4, 5, 6, 7, 10, 8, 1, 2, 6, 8, 10, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 5, 3, 4, 8, 10, 8, 4, 10, 1, 2, 9, 3, 4, 1, 1, 2, 6, 8, 9, 10, 1, 2, 3, 4, 5, 7, 8, 9, 10, 1, 2, 7, 8, 1, 5, 6, 8, 1, 3, 4, 8, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 6, 6, 1, 3, 5, 9, 3, 4, 5, 10, 7, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 3, 4, 1, 2, 5, 9, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 2, 3, 4, 8, 9, 2, 6, 10, 6, 9, 1, 2, 3, 4, 8, 9, 5, 6, 8, 9, 10, 2, 4, 7, 10, 7, 10, 7, 9, 1, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 1, 2, 3, 5, 8, 10, 2, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 4, 9, 2, 1, 5, 6, 8, 3, 3, 4, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 1, 3, 1, 2, 3, 1, 2, 5, 6, 7, 8, 9, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 8, 1, 6, 9, 5, 8, 3, 6, 8, 6, 7, 9, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 1, 2, 4, 5, 6, 7, 8, 9, 10, 6, 1, 5, 8, 9, 1, 2, 5, 7, 5, 6, 7, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 5, 10, 7, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 1, 5, 6, 7, 9, 1, 7, 10, 1, 2, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 9, 8, 6, 7, 6, 5, 1, 6, 6, 1, 2, 3, 4, 5, 6, 7, 9, 1, 2, 3, 4, 8, 6, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 2, 3, 4, 7, 8, 9, 9, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 7, 9, 10, 7, 3, 4, 5, 7, 8, 5, 6, 9, 10, 9, 4, 2, 3, 4, 6, 7, 8, 9, 10, 5, 8, 1, 1, 2, 10, 1, 2, 10, 2, 10, 2, 4, 7, 9, 7, 2, 4, 5, 6, 7, 9, 10, 2, 5, 10, 1, 2, 10, 3, 5, 6, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 4, 7, 5, 3, 3, 8, 1, 2, 3, 6, 7, 9, 10, 1, 7, 3, 7, 5, 3, 5, 10, 10, 7, 10, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 10, 10, 1, 2, 3, 4, 6, 7, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 1, 2, 5, 6, 7, 8, 9, 10, 2, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 7, 1, 2, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 1, 2, 4, 5, 6, 7, 9, 10, 3, 5, 8, 1, 3, 4, 5, 6, 8, 9, 10, 3, 6, 2, 3, 4, 6, 7, 8, 9, 10, 3, 4, 3, 5, 1, 2, 1, 4, 10, 5, 3, 4, 10, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 1, 3, 7, 8, 9, 1, 4, 8, 9, 4, 1, 2, 3, 4, 5, 7, 10, 1, 2, 3, 4, 5, 6, 7, 8, 10, 7, 1, 5, 7, 9, 9, 2, 4, 6, 9, 1, 8, 1, 2, 3, 5, 5, 2, 3, 4, 7, 8, 9, 3, 4, 8, 1, 2, 4, 5, 6, 8, 9, 10, 4, 5, 8, 4, 10, 2, 3, 5, 1, 2, 1, 4, 3, 6, 1, 3, 4, 1, 2, 6, 1, 2, 3, 5, 7, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 1, 8, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 2, 4, 6, 7, 8, 9, 3, 8, 7, 5, 4, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 3, 6, 8, 3, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 10, 5, 3, 5, 6, 7, 3, 4, 8, 1, 3, 4, 5, 6, 7, 10, 1, 2, 4, 7, 9, 10, 2, 8, 9, 2, 9, 10, 10, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 1, 2, 3, 5, 6, 7, 8, 9, 10, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 1, 2, 3, 4, 6, 7, 8, 9, 6, 9, 6, 5, 7, 7, 7, 9, 10, 8, 9, 10, 3, 1, 2, 4, 5, 6, 7, 8, 10, 7, 10, 10, 5, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 1, 2, 5, 6, 8, 10, 3, 1, 8, 9, 10, 3, 4, 8, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 4, 1, 5, 8, 10, 1, 2, 3, 4, 5, 6, 7, 1, 2, 3, 9, 3, 4, 7, 1, 8, 1, 2, 3, 4, 5, 6, 8, 3, 5, 6, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 2, 3, 4, 5, 8, 9, 3, 5, 7, 8, 9, 2, 2, 2, 3, 5, 8, 9, 10, 1, 3, 4, 5, 6, 7, 8, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 3, 4, 8, 10, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 3, 5, 10, 6, 5, 10, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 3, 8, 5, 3, 1, 2, 1, 2, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 1, 2, 3, 4, 5, 9, 7, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 2, 2, 7, 5, 6, 5, 6, 6, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 8, 1, 3, 5, 6, 7, 8, 9, 6, 1, 3, 5, 6, 7, 9, 10, 9, 1, 2, 4, 9, 10, 7, 5, 1, 2, 3, 4, 5, 6, 7, 10, 2, 7, 8, 2, 3, 4, 5, 6, 7, 2, 2, 3, 5, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 2, 3, 4, 8, 9, 2, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 2, 3, 5, 8, 9, 7, 10, 1, 2, 3, 4, 7, 9, 10, 3, 4, 8, 10, 2, 4, 1, 7, 7, 10, 1, 7, 8, 1, 6, 8, 10, 10, 1, 3, 4, 5, 6, 7, 8, 10, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 1, 1, 3, 4, 5, 1, 6, 10, 6, 3, 5, 4, 2, 2, 9, 3, 1, 1, 9, 10, 1, 2, 3, 4, 5, 6, 7, 10, 6, 2, 3, 4, 5, 6, 7, 8, 9, 10, 3, 5, 10, 1, 10, 2, 1, 2, 3, 4, 5, 7, 8, 9, 10, 1, 3, 4, 5, 8, 3, 5, 4, 5, 7, 4, 5, 6, 7, 8, 5, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 9, 1, 2, 5, 5, 1, 3, 4, 5, 6, 7, 8, 10, 3, 7, 10, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 7, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 1, 3, 4, 5, 6, 7, 8, 10, 8, 2, 3, 4, 6, 7, 8, 9, 10, 9, 5, 9, 8, 1, 2, 3, 5, 6, 8, 9, 10, 3, 9, 8, 4, 4, 9, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 8, 1, 2, 3, 5, 6, 3, 5, 7, 8, 10, 1, 2, 3, 4, 5, 6, 7, 8, 9, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 6, 2, 3, 4, 5, 6, 7, 8, 9, 2, 1, 2, 3, 4, 5, 6, 7, 9, 10, 2, 5, 2, 1, 2, 3, 6, 8, 9, 9, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 6, 4, 7, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 4, 5, 6, 7, 10, 3, 3, 4, 5, 7, 10, 1, 9, 1, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 6, 1, 2, 6, 9, 10, 1, 1, 1, 3, 2, 6, 7, 5, 7, 1, 2, 3, 4, 5, 6, 7, 9, 2, 4, 7, 5, 3, 4, 1, 4, 6, 7, 3, 4, 6, 8, 3, 6, 10, 6, 1, 5, 6, 8, 2, 1, 2, 3, 4, 5, 6, 7, 8, 10, 4, 8, 1, 3, 4, 8, 1, 10, 2, 3, 5, 6, 7, 8, 10, 3, 7, 7, 4, 1, 6, 6, 7, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 1, 2, 5, 7, 9, 1, 6, 7, 3, 5, 3, 1, 3, 4, 1, 5, 8, 9, 10, 5, 10, 3, 5, 7, 8, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 1, 2, 3, 3, 3, 3, 6, 7, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 9, 5, 1], \"Freq\": [0.14599277079105377, 0.5233890414237976, 0.1291092485189438, 0.04965740442276001, 0.007945184595882893, 0.0228424072265625, 0.06554777175188065, 0.034760184586048126, 0.018869813531637192, 0.40388476848602295, 0.19605383276939392, 0.17180688679218292, 0.03325294703245163, 0.0006927697104401886, 0.19328275322914124, 0.9846031665802002, 0.05245577171444893, 0.07400010526180267, 0.536734938621521, 0.18265849351882935, 0.030911436304450035, 0.026227885857224464, 0.03278485685586929, 0.04964563995599747, 0.005620261188596487, 0.008430391550064087, 0.12412907183170319, 0.06308198720216751, 0.19738557934761047, 0.6145406365394592, 0.07897412776947021, 0.027873219922184944, 0.006968304980546236, 0.12775225937366486, 0.7548997402191162, 0.03866958990693092, 0.08217287808656693, 0.004833698738366365, 0.8700657486915588, 0.9959776997566223, 0.3871699571609497, 0.611616313457489, 0.9911239147186279, 0.9901931881904602, 0.339741975069046, 0.014491363428533077, 0.09419386088848114, 0.10063447058200836, 0.004025378730148077, 0.20287908613681793, 0.03300810605287552, 0.21092984080314636, 0.1255313754081726, 0.1266830414533615, 0.06334152072668076, 0.012668304145336151, 0.1739012748003006, 0.03685325011610985, 0.0737065002322197, 0.38695910573005676, 0.9024494886398315, 0.09523336589336395, 0.7508983612060547, 0.053179770708084106, 0.19357436895370483, 0.2244643270969391, 0.7725219130516052, 0.0022788257338106632, 0.025178419426083565, 0.7350161671638489, 0.18786974251270294, 0.011620808392763138, 0.03970443084836006, 0.34418392181396484, 0.6551724076271057, 0.04772055149078369, 0.8044321537017822, 0.03408610820770264, 0.11362035572528839, 0.9980550408363342, 0.061342693865299225, 0.7078946828842163, 0.060115836560726166, 0.01104168500751257, 0.056435275822877884, 0.01349539216607809, 0.01226853858679533, 0.07729179412126541, 0.8129921555519104, 0.14957647025585175, 0.01583750918507576, 0.012318062596023083, 0.007038893178105354, 0.9972012639045715, 0.9993999600410461, 0.8530754446983337, 0.08814063668251038, 0.006295759696513414, 0.050366077572107315, 0.9841410517692566, 0.9973456859588623, 0.9993276596069336, 0.9964157342910767, 0.6340733766555786, 0.02204345166683197, 0.04279023036360741, 0.24118128418922424, 0.03241683915257454, 0.027230145409703255, 0.9963906407356262, 0.14441119134426117, 0.3110394775867462, 0.18713639676570892, 0.061524294316768646, 0.2956584095954895, 0.03075864166021347, 0.016777440905570984, 0.01957368105649948, 0.008388720452785492, 0.897593080997467, 0.025166161358356476, 0.9902084469795227, 0.9816920757293701, 0.00179692218080163, 0.020964091643691063, 0.6175422668457031, 0.1185968667268753, 0.025156911462545395, 0.027552807703614235, 0.00419281842187047, 0.14075890183448792, 0.03174562379717827, 0.012578455731272697, 0.9970781207084656, 0.991834282875061, 0.9971475005149841, 0.9912530779838562, 0.985652506351471, 0.023296672850847244, 0.15142837166786194, 0.8231490850448608, 0.0036856913939118385, 0.012899919413030148, 0.027642685920000076, 0.0202713031321764, 0.007371382787823677, 0.005528537090867758, 0.10319935530424118, 0.750038206577301, 0.06818529218435287, 0.8324562311172485, 0.16555851697921753, 0.9908235669136047, 0.9822887778282166, 0.01671980880200863, 0.05610562115907669, 0.9408481121063232, 0.013237693347036839, 0.9845534563064575, 0.09291166812181473, 0.5883104205131531, 0.0011711554834619164, 0.030840428546071053, 0.05075007304549217, 0.05933854356408119, 0.04801737517118454, 0.04333275184035301, 0.07065971195697784, 0.014053866267204285, 0.009513046592473984, 0.16172178089618683, 0.7933880686759949, 0.03424696624279022, 0.007427247706800699, 0.13071955740451813, 0.0675879493355751, 0.1819675713777542, 0.03936441242694855, 0.10546691715717316, 0.2413855493068695, 0.0193108431994915, 0.07501520216464996, 0.13294772803783417, 0.044248517602682114, 0.11702568829059601, 0.02328869327902794, 0.16127420961856842, 0.1094568595290184, 0.1676785945892334, 0.19795389473438263, 0.022706476971507072, 0.06287947297096252, 0.09315477311611176, 0.9988299608230591, 0.9976599216461182, 0.0013370970264077187, 0.9974744319915771, 0.06177558749914169, 0.9339015483856201, 0.9674123525619507, 0.02764035202562809, 0.9971478581428528, 0.9819605946540833, 0.9899508953094482, 0.030462924391031265, 0.0913887768983841, 0.7326333522796631, 0.048740681260824203, 0.01675460860133171, 0.007615731097757816, 0.012185170315206051, 0.0594027042388916, 0.9949178695678711, 0.9896720051765442, 0.10203135758638382, 0.3764605224132538, 0.37153488397598267, 0.00492565194144845, 0.0014073291094973683, 0.024628259241580963, 0.07318111509084702, 0.04644186049699783, 0.9910803437232971, 0.05556785315275192, 0.9390967488288879, 0.9451965093612671, 0.054721903055906296, 0.9886062741279602, 0.18599478900432587, 0.017521247267723083, 0.20149435102939606, 0.2715793251991272, 0.2008204460144043, 0.013477882370352745, 0.06671551614999771, 0.03571638837456703, 0.0006738941301591694, 0.007412835489958525, 0.01812021993100643, 0.408528596162796, 0.023062098771333694, 0.5271337032318115, 0.023062098771333694, 0.04738995060324669, 0.8909310698509216, 0.056867942214012146, 0.99643874168396, 0.9898231625556946, 0.9916720390319824, 0.9953881502151489, 0.005461225751787424, 0.13243472576141357, 0.04505511373281479, 0.046420421451330185, 0.2047959715127945, 0.13789595663547516, 0.02867143601179123, 0.010922451503574848, 0.38774704933166504, 0.06209086626768112, 0.9313629865646362, 0.9909238219261169, 0.9858328700065613, 0.0370786115527153, 0.9619839787483215, 0.8973691463470459, 0.03992532193660736, 0.04689640924334526, 0.005703617352992296, 0.00887229386717081, 0.9923086762428284, 0.09889670461416245, 0.1410106122493744, 0.05015813559293747, 0.1334395706653595, 0.02886458858847618, 0.20678400993347168, 0.02886458858847618, 0.12918086349964142, 0.1627773493528366, 0.019873978570103645, 0.9937857985496521, 0.9958334565162659, 0.996943473815918, 0.1216258630156517, 0.17698660492897034, 0.045295149087905884, 0.08555750548839569, 0.02432517148554325, 0.09478428959846497, 0.04110115393996239, 0.009226789698004723, 0.4009459316730499, 0.9868890643119812, 0.9969602227210999, 0.9897100329399109, 0.9941675662994385, 0.677937924861908, 0.1326664835214615, 0.02312535233795643, 0.007302742451429367, 0.03773083537817001, 0.1204952523112297, 0.3486194610595703, 0.004738516639918089, 0.6464690566062927, 0.988552987575531, 0.0016638204688206315, 0.99662846326828, 0.013513145036995411, 0.9859398603439331, 0.0026862570084631443, 0.9858563542366028, 0.009401899762451649, 0.9923655986785889, 0.9946200847625732, 0.989805281162262, 0.04953533783555031, 0.9287875890731812, 0.021671710535883904, 0.23079544305801392, 0.4995506703853607, 0.006073564291000366, 0.04631092771887779, 0.00911034643650055, 0.024294257164001465, 0.01973908394575119, 0.05238449200987816, 0.08199311792850494, 0.029608625918626785, 0.9904960989952087, 0.01607571542263031, 0.03215143084526062, 0.008037857711315155, 0.9404293298721313, 0.997140645980835, 0.8349259495735168, 0.03578253835439682, 0.1272268146276474, 0.9408413767814636, 0.05612974241375923, 0.0071846735663712025, 0.9843003153800964, 0.12218707799911499, 0.3213067650794983, 0.027152683585882187, 0.5279688239097595, 0.006376017350703478, 0.9933834671974182, 0.049458786845207214, 0.9496087431907654, 0.047002773731946945, 0.6893740296363831, 0.03916897997260094, 0.0019584489054977894, 0.007833795621991158, 0.2134709358215332, 0.0193931944668293, 0.003062083153054118, 0.16433179378509521, 0.7624587416648865, 0.04797263815999031, 0.003062083153054118, 0.02497788891196251, 0.014050062745809555, 0.02653900720179081, 0.014050062745809555, 0.27007344365119934, 0.5214134454727173, 0.11708385497331619, 0.012488944455981255, 0.08583952486515045, 0.1502191573381424, 0.0071532935835421085, 0.04470808431506157, 0.711752712726593, 0.2507212460041046, 0.22157453000545502, 0.014573357999324799, 0.11628945171833038, 0.07137971371412277, 0.06989263743162155, 0.13056538999080658, 0.03212087228894234, 0.04104333743453026, 0.0514528788626194, 0.010484830476343632, 0.19527997076511383, 0.12319675832986832, 0.07863622903823853, 0.011795434169471264, 0.146787628531456, 0.4298780560493469, 0.001310603809542954, 0.8896723985671997, 0.08087930828332901, 0.008366825059056282, 0.019522590562701225, 0.977303683757782, 0.9920732378959656, 0.9853165745735168, 0.007978271692991257, 0.003989135846495628, 0.9936932921409607, 0.14128343760967255, 0.02913627400994301, 0.4518871307373047, 0.04947669059038162, 0.1335870623588562, 0.010994820855557919, 0.11489587277173996, 0.06212073564529419, 0.007696374319493771, 0.011459052562713623, 0.05500345304608345, 0.5695149302482605, 0.21772199869155884, 0.06990022212266922, 0.01031314767897129, 0.06531660258769989, 0.9912104606628418, 0.009855405427515507, 0.06208905577659607, 0.14191783964633942, 0.5105100274085999, 0.18232500553131104, 0.03153729811310768, 0.030551757663488388, 0.03153729811310768, 0.9839151501655579, 0.7062051892280579, 0.005525862332433462, 0.075151726603508, 0.1193586215376854, 0.075151726603508, 0.001105172443203628, 0.018787931650877, 0.2933255136013031, 0.04784742370247841, 0.10401614010334015, 0.5554461479187012, 0.9976659417152405, 0.3253612518310547, 0.5731831192970276, 0.10034505277872086, 0.9918471574783325, 0.9958798289299011, 0.9921985268592834, 0.996331512928009, 0.9902531504631042, 0.9943678975105286, 0.9963338971138, 0.9940438866615295, 0.11340337246656418, 0.8845463395118713, 0.0030282640364021063, 0.4754374623298645, 0.26406463980674744, 0.01635262556374073, 0.0042395698837935925, 0.21076717972755432, 0.02604307048022747, 0.10128828883171082, 0.11214060336351395, 0.11756675690412521, 0.07717202603816986, 0.001205812906846404, 0.1917242556810379, 0.20739983022212982, 0.08802434056997299, 0.06812842935323715, 0.03557148203253746, 0.9976046681404114, 0.11456617712974548, 0.7665022611618042, 0.12002170830965042, 0.5816272497177124, 0.2825830578804016, 0.013717624358832836, 0.09327984601259232, 0.02469172328710556, 0.004115287214517593, 0.9915045499801636, 0.9917834401130676, 0.9875321984291077, 0.00699492497369647, 0.0029978249222040176, 0.24482236802577972, 0.12191154807806015, 0.29578539729118347, 0.11291807144880295, 0.044967375695705414, 0.12990574538707733, 0.03897172585129738, 0.9954027533531189, 0.9975415468215942, 0.009578007273375988, 0.47479552030563354, 0.061572905629873276, 0.45427119731903076, 0.9948511719703674, 0.992047905921936, 0.04472225159406662, 0.2554924786090851, 0.0859021469950676, 0.18685930967330933, 0.07793184369802475, 0.13460955023765564, 0.03143841400742531, 0.04250828176736832, 0.11689776927232742, 0.02302531898021698, 0.9797205924987793, 0.767796516418457, 0.20836955308914185, 0.02264886535704136, 0.9965404272079468, 0.01270527858287096, 0.9489865899085999, 0.03713850677013397, 0.011915587820112705, 0.013107147067785263, 0.6053118705749512, 0.3467436134815216, 0.010724029503762722, 0.0011915587820112705, 0.010724029503762722, 0.0513325035572052, 0.014807452447712421, 0.2053300142288208, 0.1796637624502182, 0.05429399386048317, 0.1451130360364914, 0.1757151037454605, 0.10299406200647354, 0.049358174204826355, 0.021388541907072067, 0.9929736256599426, 0.005768895614892244, 0.08797565847635269, 0.012980015017092228, 0.01586446352303028, 0.1543179601430893, 0.18604688346385956, 0.09518677741289139, 0.01586446352303028, 0.42545607686042786, 0.9891993999481201, 0.13151773810386658, 0.0026840355712920427, 0.8642594814300537, 0.994596004486084, 0.9892116785049438, 0.0337333120405674, 0.006064415909349918, 0.7466812133789062, 0.015161039307713509, 0.18534371256828308, 0.010991753078997135, 0.0007580519886687398, 0.0011370779247954488, 0.7883397936820984, 0.004197762347757816, 0.19729484617710114, 0.004197762347757816, 0.005876867566257715, 0.004379556514322758, 0.9941593408584595, 0.9937857985496521, 0.03518718108534813, 0.9632490873336792, 0.9963637590408325, 0.002751182531937957, 0.29987889528274536, 0.09078902006149292, 0.6052601337432861, 0.0013755912659689784, 0.0013755912659689784, 0.9969372153282166, 0.042788878083229065, 0.06828012317419052, 0.05462409928441048, 0.022760041058063507, 0.07192172855138779, 0.0782945454120636, 0.06463851779699326, 0.18116992712020874, 0.408770352602005, 0.008193614892661572, 0.9924702644348145, 0.9913032054901123, 0.0025874855928122997, 0.007762456778436899, 0.5847717523574829, 0.2613360285758972, 0.0008624952170066535, 0.05519969388842583, 0.07331208884716034, 0.013799923472106457, 0.9995120763778687, 0.03260944411158562, 0.011646230705082417, 0.01630472205579281, 0.9130644798278809, 0.025621706619858742, 0.006279796827584505, 0.027910208329558372, 0.10187225788831711, 0.2023490071296692, 0.2979414761066437, 0.24491208791732788, 0.037678781896829605, 0.039772048592567444, 0.016746126115322113, 0.02511918731033802, 0.9942708015441895, 0.15898235142230988, 0.837565541267395, 0.0025850788224488497, 0.9930786490440369, 0.9989667534828186, 0.9820688366889954, 0.994400143623352, 0.014143766835331917, 0.9087370038032532, 0.07425477355718613, 0.9898928999900818, 0.9895271062850952, 0.9944542050361633, 0.09428336471319199, 0.6226845979690552, 0.010360809043049812, 0.03833499178290367, 0.2289738804101944, 0.0041443235240876675, 0.15295802056789398, 0.581828773021698, 0.06883110851049423, 0.07236091047525406, 0.029415003955364227, 0.0011766002280637622, 0.04294590651988983, 0.04412250593304634, 0.0070596011355519295, 0.9937053918838501, 0.9774035215377808, 0.021789249032735825, 0.988694965839386, 0.2148161381483078, 0.08932948112487793, 0.10421773046255112, 0.5912761092185974, 0.007281071972101927, 0.5405329465866089, 0.3890172839164734, 0.06275590509176254, 0.12770269811153412, 0.08756756037473679, 0.058378372341394424, 0.11310809850692749, 0.13135133683681488, 0.0121621610596776, 0.08999999612569809, 0.025540538132190704, 0.030405402183532715, 0.32472971081733704, 0.9981328248977661, 0.9870069622993469, 0.031673677265644073, 0.09502103179693222, 0.8094384074211121, 0.05982805788516998, 0.01888325624167919, 0.978782057762146, 0.006506085861474276, 0.9889250993728638, 0.9961147308349609, 0.11995471268892288, 0.3064922094345093, 0.22458481788635254, 0.1421489715576172, 0.029063917696475983, 0.03117765672504902, 0.030649220570921898, 0.054428789764642715, 0.02853548154234886, 0.033819831907749176, 0.9653185606002808, 0.03121122345328331, 0.09273429214954376, 0.022710438817739487, 0.05488356202840805, 0.8270385265350342, 0.49648597836494446, 0.04393681138753891, 0.03514945134520531, 0.005492101423442364, 0.14718832075595856, 0.03954312950372696, 0.04723207280039787, 0.10215308517217636, 0.04723207280039787, 0.03514945134520531, 0.005432780832052231, 0.665515661239624, 0.29744476079940796, 0.008149171248078346, 0.021731123328208923, 0.11879028379917145, 0.6470279693603516, 0.23252566158771515, 0.982373058795929, 0.012128062546253204, 0.037575263530015945, 0.037575263530015945, 0.6821355819702148, 0.121397003531456, 0.060698501765728, 0.060698501765728, 0.7771496176719666, 0.011328712105751038, 0.18579088151454926, 0.022657424211502075, 0.0022657422814518213, 0.010307654738426208, 0.020099926739931107, 0.30407580733299255, 0.6648436784744263, 0.9967759251594543, 0.9954435229301453, 0.05245886743068695, 0.9442595839500427, 0.9982324242591858, 0.24753481149673462, 0.07662469893693924, 0.0008545505115762353, 0.08630960434675217, 0.18600717186927795, 0.1310310810804367, 0.1521099954843521, 0.027060767635703087, 0.02335771545767784, 0.06893374025821686, 0.005418969783931971, 0.16618172824382782, 0.012644262053072453, 0.12463629990816116, 0.061414990574121475, 0.626794159412384, 0.9936252236366272, 0.028499040752649307, 0.1773865520954132, 0.049540385603904724, 0.08203461766242981, 0.065254807472229, 0.19682981073856354, 0.2426413595676422, 0.04927404224872589, 0.05486730858683586, 0.053801923990249634, 0.06766297668218613, 0.9303659796714783, 0.9942028522491455, 0.47864019870758057, 0.06759040057659149, 0.014018750749528408, 0.43908730149269104, 0.9757900834083557, 0.7745684385299683, 0.2246912121772766, 0.07066923379898071, 0.13031665980815887, 0.06418582051992416, 0.13355837762355804, 0.09530621767044067, 0.1452285200357437, 0.18088731169700623, 0.022043615579605103, 0.056405723094940186, 0.1011412963271141, 0.9622331261634827, 0.03391129896044731, 0.9284623861312866, 0.06954774260520935, 0.9823116660118103, 0.07761090248823166, 0.054537393152713776, 0.19927124679088593, 0.018878327682614326, 0.6376680135726929, 0.004195183981209993, 0.006292776204645634, 0.15075568854808807, 0.19674895703792572, 0.26113951206207275, 0.06490160524845123, 0.07410025596618652, 0.09811896085739136, 0.01226487010717392, 0.08840927481651306, 0.032195284962654114, 0.020952485501766205, 0.9876848459243774, 0.09004253149032593, 0.9090832471847534, 0.9924943447113037, 0.9874857068061829, 0.9912837147712708, 0.9900286793708801, 0.8910292983055115, 0.10725352168083191, 0.04387596622109413, 0.051188625395298004, 0.8994572758674622, 0.3898763358592987, 0.08292146027088165, 0.002909524831920862, 0.09746908396482468, 0.06110002100467682, 0.12801909446716309, 0.09019526839256287, 0.05091668665409088, 0.06255478411912918, 0.03273215517401695, 0.0661003515124321, 0.1192680299282074, 0.4397110342979431, 0.06538186967372894, 0.14944428205490112, 0.017962053418159485, 0.021554462611675262, 0.05747856944799423, 0.06466338783502579, 0.9842679500579834, 0.016517192125320435, 0.20187680423259735, 0.11011461913585663, 0.6698639392852783, 0.02432498335838318, 0.9451993107795715, 0.003474997589364648, 0.02432498335838318, 0.8504248857498169, 0.10691055655479431, 0.03887656703591347, 0.1204923540353775, 0.04726025089621544, 0.20181404054164886, 0.31719717383384705, 0.0540725402534008, 0.055775612592697144, 0.06727135181427002, 0.03278413787484169, 0.09281743317842484, 0.010644201189279556, 0.9708878397941589, 0.025624606758356094, 0.9893497824668884, 0.020420510321855545, 0.04413465037941933, 0.05138063803315163, 0.18707822263240814, 0.241752490401268, 0.1086898148059845, 0.09551528841257095, 0.11066599190235138, 0.11000726372003555, 0.03096012957394123, 0.03080577962100506, 0.017603302374482155, 0.04400825500488281, 0.8889667987823486, 0.013202477246522903, 0.9941993951797485, 0.9913306832313538, 0.9993233680725098, 0.056550782173871994, 0.9401567578315735, 0.2726779580116272, 0.003909361083060503, 0.06548180431127548, 0.07330052554607391, 0.019546806812286377, 0.10555275529623032, 0.35868388414382935, 0.023456167429685593, 0.002932020928710699, 0.074277862906456, 0.991647481918335, 0.9933046698570251, 0.9934691190719604, 0.9942363500595093, 0.9869003295898438, 0.9914559721946716, 0.19970963895320892, 0.7988385558128357, 0.9790177941322327, 0.011327564716339111, 0.022655129432678223, 0.022655129432678223, 0.07929295301437378, 0.008495673537254333, 0.7306279540061951, 0.12177132070064545, 0.002831891179084778, 0.00934118777513504, 0.019400928169488907, 0.8945983052253723, 0.07041817903518677, 0.00574842281639576, 0.9887343645095825, 0.08462303131818771, 0.05847546458244324, 0.4787381589412689, 0.13739357888698578, 0.0404098741710186, 0.029475437477231026, 0.03422953933477402, 0.06227874755859375, 0.0370820015668869, 0.0370820015668869, 0.005477050319314003, 0.021908201277256012, 0.1341877281665802, 0.6517689824104309, 0.16978855431079865, 0.013692625798285007, 0.9944437146186829, 0.05208912864327431, 0.029962772503495216, 0.48816272616386414, 0.0792861059308052, 0.00046096573350951076, 0.02673601172864437, 0.014289937913417816, 0.2383192777633667, 0.06591810286045074, 0.005070623010396957, 0.041793618351221085, 0.8823096752166748, 0.07429976761341095, 0.9889696836471558, 0.01295366883277893, 0.8186718821525574, 0.056996144354343414, 0.023316605016589165, 0.0867895856499672, 0.03642081841826439, 0.7519828081130981, 0.2013857066631317, 0.010712006129324436, 0.989499032497406, 0.9900275468826294, 0.015654398128390312, 0.5386954545974731, 0.1777234673500061, 0.05709251016378403, 0.1289185732603073, 0.03959641978144646, 0.0018416938837617636, 0.041438113898038864, 0.956125795841217, 0.034642238169908524, 0.9942362904548645, 0.20043528079986572, 0.7982853651046753, 0.9992931485176086, 0.029503511264920235, 0.03048696182668209, 0.9391950964927673, 0.9948950409889221, 0.9929196238517761, 0.05053069442510605, 0.05053069442510605, 0.8626311421394348, 0.03609335422515869, 0.9871167540550232, 0.02464824542403221, 0.10915651172399521, 0.08098708838224411, 0.017605889588594437, 0.7464897036552429, 0.007042355835437775, 0.01408471167087555, 0.9994784593582153, 0.029911385849118233, 0.9631465673446655, 0.8657009601593018, 0.10983654856681824, 0.023620761930942535, 0.003857866395264864, 0.9490351676940918, 0.04243653267621994, 0.011400311253964901, 0.22331197559833527, 0.0697430819272995, 0.07644914835691452, 0.004023639019578695, 0.1488746553659439, 0.19782893359661102, 0.06303701549768448, 0.09522613137960434, 0.10997947305440903, 0.9820893406867981, 0.017412932589650154, 0.9933030009269714, 0.9920571446418762, 0.03944803774356842, 0.9588907361030579, 0.7954779863357544, 0.004642867483198643, 0.010059546679258347, 0.14934557676315308, 0.0007738112471997738, 0.010059546679258347, 0.02940482832491398, 0.997638463973999, 0.9823446273803711, 0.08993932604789734, 0.8993932604789734, 0.9824125170707703, 0.0062460871413350105, 0.9910458326339722, 0.9939238429069519, 0.9975072741508484, 0.29065191745758057, 0.7079982757568359, 0.3073197603225708, 0.05826270580291748, 0.00768299400806427, 0.08771418035030365, 0.09987892210483551, 0.12804989516735077, 0.15558062493801117, 0.0166464876383543, 0.053140707314014435, 0.08579343557357788, 0.9964796304702759, 0.989776611328125, 0.030239975079894066, 0.004031996708363295, 0.9293752312660217, 0.0020159983541816473, 0.006047994829714298, 0.028223976492881775, 0.1430351436138153, 0.5361820459365845, 0.007990790531039238, 0.003196316072717309, 0.1318480372428894, 0.09349224716424942, 0.018378818407654762, 0.005593553185462952, 0.057533688843250275, 0.0015981580363586545, 0.03587382659316063, 0.051888927817344666, 0.591277539730072, 0.041639264672994614, 0.0012812081258744001, 0.11146511137485504, 0.05381074175238609, 0.03203020244836807, 0.0051248325034976006, 0.07559128105640411, 0.3883173167705536, 0.2538767158985138, 0.09002719819545746, 0.15784768760204315, 0.027608342468738556, 0.002400725381448865, 0.04261287674307823, 0.03661106154322624, 0.9923387765884399, 0.10636710375547409, 0.12472809106111526, 0.03482256457209587, 0.0810416042804718, 0.24059225618839264, 0.09623690694570541, 0.12282868474721909, 0.09307121485471725, 0.0734439566731453, 0.026591775938868523, 0.08147607743740082, 0.0805872455239296, 0.18221013247966766, 0.13391704857349396, 0.11673299968242645, 0.15347130596637726, 0.17628459632396698, 0.01807287521660328, 0.028442557901144028, 0.029035111889243126, 0.9883348941802979, 0.05344466120004654, 0.9451266527175903, 0.11607211828231812, 0.09041406959295273, 0.040319789201021194, 0.054981529712677, 0.045207034796476364, 0.03909797593951225, 0.37509623169898987, 0.023214424028992653, 0.05375972017645836, 0.16127915680408478, 0.057641707360744476, 0.6063464283943176, 0.031037842854857445, 0.024386875331401825, 0.19620350003242493, 0.05653321370482445, 0.011084944009780884, 0.016627416014671326, 0.007937688380479813, 0.9882422089576721, 0.9813222885131836, 0.04756404459476471, 0.21023307740688324, 0.6021608114242554, 0.0038051235023885965, 0.04756404459476471, 0.0323435515165329, 0.004756404552608728, 0.05327172949910164, 0.9908990263938904, 0.9984796643257141, 0.0164179727435112, 0.5438979864120483, 0.14986662566661835, 0.06062020733952522, 0.11366288363933563, 0.05472657456994057, 0.009261419996619225, 0.05220073461532593, 0.8966673016548157, 0.100186288356781, 0.030339591205120087, 0.9658102989196777, 0.0051825144328176975, 0.9898602962493896, 0.9964926838874817, 0.9940032958984375, 0.995389461517334, 0.9921508431434631, 0.1297713965177536, 0.02752726525068283, 0.8376153707504272, 0.10296144336462021, 0.3724781572818756, 0.030282776802778244, 0.0768425464630127, 0.0673791766166687, 0.1090179979801178, 0.06132262572646141, 0.10712532699108124, 0.04996658116579056, 0.022712083533406258, 0.057786159217357635, 0.03638387843966484, 0.002140228170901537, 0.006420684512704611, 0.8946153521537781, 0.004666417837142944, 0.03266492486000061, 0.06532984972000122, 0.8959521651268005, 0.9891890287399292, 0.03148955851793289, 0.024222739040851593, 0.03027842380106449, 0.798139214515686, 0.027856148779392242, 0.02906728722155094, 0.05934571102261543, 0.07341376692056656, 0.09762468934059143, 0.313960999250412, 0.13511256873607635, 0.03280189633369446, 0.06560379266738892, 0.0015619950136169791, 0.2647581696510315, 0.01640094816684723, 0.9913778901100159, 0.034172557294368744, 0.09112682193517685, 0.8543139696121216, 0.017086278647184372, 0.9906675815582275, 0.08192655444145203, 0.02730885148048401, 0.8848068118095398, 0.9931009411811829, 0.998070240020752, 0.988185465335846, 0.00870155543088913, 0.0406072624027729, 0.20593681931495667, 0.7425327897071838, 0.9880222082138062, 0.009207574650645256, 0.053710851818323135, 0.888530969619751, 0.010742170736193657, 0.02915732003748417, 0.0076729790307581425, 0.020768266171216965, 0.9553402662277222, 0.023364299908280373, 0.02318478561937809, 0.04289185628294945, 0.032458700239658356, 0.4683326780796051, 0.29444679617881775, 0.0602804459631443, 0.027821743860840797, 0.05100652948021889, 0.8876805305480957, 0.03227929025888443, 0.07923098653554916, 0.009056972339749336, 0.9872100353240967, 0.01922890916466713, 0.004807227291166782, 0.9734635949134827, 0.05321671813726425, 0.9460749626159668, 0.9958201050758362, 0.9951406717300415, 0.9989522099494934, 0.9976341724395752, 0.9939318299293518, 0.007695188280194998, 0.9907554388046265, 0.9945312142372131, 0.002001068787649274, 0.002001068787649274, 0.7687157392501831, 0.22880834341049194, 0.20650435984134674, 0.7854675054550171, 0.006758324336260557, 0.34681469202041626, 0.03489511087536812, 0.11750394850969315, 0.017091482877731323, 0.17589984834194183, 0.010682176798582077, 0.044865142554044724, 0.18586988747119904, 0.012818612158298492, 0.053410883992910385, 0.996290385723114, 0.9905754327774048, 0.04634307324886322, 0.09325476735830307, 0.14556841552257538, 0.28886234760284424, 0.09695084393024445, 0.09581358730792999, 0.07704891264438629, 0.09581358730792999, 0.03866661339998245, 0.02189212664961815, 0.06009218469262123, 0.06687678396701813, 0.13084588944911957, 0.4409990906715393, 0.256845623254776, 0.04361529275774956, 0.00642987247556448, 0.9902003407478333, 0.9888010025024414, 0.9949706196784973, 0.9919202327728271, 0.09934737533330917, 0.03804792836308479, 0.16318334639072418, 0.17163844406604767, 0.03382038325071335, 0.05242159217596054, 0.0925832986831665, 0.24435226619243622, 0.02536528743803501, 0.07905514538288116, 0.0493512861430645, 0.9421609044075012, 0.00747746741399169, 0.9954060316085815, 0.058951377868652344, 0.21875932812690735, 0.016335923224687576, 0.11222069710493088, 0.06179240718483925, 0.247169628739357, 0.026279529556632042, 0.014205151237547398, 0.11293095350265503, 0.1306873857975006, 0.9945565462112427, 0.9965836405754089, 0.11972963064908981, 0.8785793781280518, 0.00485058082267642, 0.9895185232162476, 0.08816379308700562, 0.9062418341636658, 0.004100641701370478, 0.012021970003843307, 0.012021970003843307, 0.07453621178865433, 0.009617576375603676, 0.7092962265014648, 0.00721318181604147, 0.17552076280117035, 0.08571454137563705, 0.08571454137563705, 0.027649851515889168, 0.03317982330918312, 0.7659009099006653, 0.998058557510376, 0.0335407555103302, 0.8608793616294861, 0.10062225908041, 0.009945032186806202, 0.9878731966018677, 0.9939717054367065, 0.9972440004348755, 0.38646844029426575, 0.2595732808113098, 0.01553143747150898, 0.022966699674725533, 0.06509985774755478, 0.10211094468832016, 0.01420961320400238, 0.05749936401844025, 0.060308244079351425, 0.016027122735977173, 0.07528243213891983, 0.05646182596683502, 0.13516618311405182, 0.09581400454044342, 0.0684385746717453, 0.037641216069459915, 0.051328931003808975, 0.04961796849966049, 0.4277411103248596, 0.17850686609745026, 0.32199332118034363, 0.04134355112910271, 0.036965999752283096, 0.046693895012140274, 0.1381361037492752, 0.027724498882889748, 0.1177075207233429, 0.07539118081331253, 0.015078236348927021, 0.0029351895209401846, 0.012719154357910156, 0.22796638309955597, 0.15262985229492188, 0.04304944723844528, 0.13306193053722382, 0.41484013199806213, 0.011740758083760738, 0.9922082424163818, 0.9938311576843262, 0.9842427968978882, 0.006768323015421629, 0.9915593266487122, 0.9902106523513794, 0.021416107192635536, 0.8905531167984009, 0.0874491035938263, 0.013841218315064907, 0.2886882722377777, 0.6960155367851257, 0.9894993305206299, 0.015452922321856022, 0.035822682082653046, 0.021774571388959885, 0.016857733950018883, 0.013345705345273018, 0.23741307854652405, 0.013345705345273018, 0.6469154953956604, 0.3705628216266632, 0.6290480494499207, 0.9973105788230896, 0.9915122389793396, 0.06309384852647781, 0.231595978140831, 0.09142940491437912, 0.037780746817588806, 0.05515988916158676, 0.10087459534406662, 0.044959086924791336, 0.05175962299108505, 0.19872672855854034, 0.125054270029068, 0.5734701156616211, 0.1194729432463646, 0.09026844054460526, 0.11681798845529556, 0.09292339533567429, 0.006637385580688715, 0.9915998578071594, 0.7821849584579468, 0.03164910152554512, 0.12433575838804245, 0.06103755533695221, 0.11312486231327057, 0.8551472425460815, 0.028760557994246483, 0.11257313936948776, 0.059926994144916534, 0.0016801961464807391, 0.1814611852169037, 0.20834431052207947, 0.05376627668738365, 0.18930210173130035, 0.04480522871017456, 0.05208607763051987, 0.09633124619722366, 0.9851661920547485, 0.15788765251636505, 0.6178212761878967, 0.17962580919265747, 0.04462042450904846, 0.05229882523417473, 0.0018678151536732912, 0.08405168354511261, 0.3259337544441223, 0.04389365762472153, 0.47629284858703613, 0.01494252122938633, 0.021584073081612587, 0.05396018177270889, 0.1187123954296112, 0.8040066957473755, 0.08918201923370361, 0.9111027717590332, 0.9925987720489502, 0.9948096871376038, 0.9976964592933655, 0.014667067676782608, 0.1222255676984787, 0.017926417291164398, 0.02770446240901947, 0.23630276322364807, 0.016296742483973503, 0.5654969811439514, 0.09710930287837982, 0.8601109981536865, 0.03699402138590813, 0.05591879040002823, 0.08879411965608597, 0.05991298705339432, 0.4362894594669342, 0.06943761557340622, 0.10845787078142166, 0.016898535192012787, 0.006144921761006117, 0.14286942780017853, 0.015362304635345936, 0.0076918532140553, 0.5176617503166199, 0.2649843394756317, 0.1346074342727661, 0.07038045674562454, 0.004999704658985138, 0.38159796595573425, 0.4875108599662781, 0.1105855256319046, 0.007787713315337896, 0.012460341677069664, 0.9943277835845947, 0.9964197278022766, 0.05934993922710419, 0.025178762152791023, 0.2356012761592865, 0.5917009115219116, 0.052156005054712296, 0.034171175211668015, 0.1887255609035492, 0.0022073164582252502, 0.046353645622730255, 0.04304267093539238, 0.18210361897945404, 0.020969506353139877, 0.5165120363235474, 0.058811839669942856, 0.10455438494682312, 0.28679847717285156, 0.06099005788564682, 0.07623757421970367, 0.007986793294548988, 0.014521442353725433, 0.2911549210548401, 0.07986792922019958, 0.019603947177529335, 0.14539244771003723, 0.03940024599432945, 0.2047702819108963, 0.01609305664896965, 0.0016647990560159087, 0.07658075541257858, 0.0005549330380745232, 0.4916706383228302, 0.024971986189484596, 0.9955393671989441, 0.9898155927658081, 0.9977903366088867, 0.988472580909729, 0.991112470626831, 0.04804662615060806, 0.30499163269996643, 0.12394636869430542, 0.12046472728252411, 0.09400427341461182, 0.06649931520223618, 0.07102544605731964, 0.06336583942174911, 0.08495200425386429, 0.022978821769356728, 0.9855749607086182, 0.991823673248291, 0.9906700253486633, 0.9936048984527588, 0.07083205878734589, 0.9249833822250366, 0.05752526596188545, 0.264791876077652, 0.13217636942863464, 0.1901407688856125, 0.040399424731731415, 0.10363329946994781, 0.0421559177339077, 0.07245548814535141, 0.07552935928106308, 0.020638834685087204, 0.08443303406238556, 0.3670561909675598, 0.031851984560489655, 0.05965927243232727, 0.059153683483600616, 0.11881295591592789, 0.05814250931143761, 0.0894889086484909, 0.10769003629684448, 0.022751417011022568, 0.022307951003313065, 0.9703959226608276, 0.9775837659835815, 0.9887065291404724, 0.21927835047245026, 0.7780164480209351, 0.09416694939136505, 0.9042441844940186, 0.0651455670595169, 0.08344487845897675, 0.13724486529827118, 0.2170298844575882, 0.038062576204538345, 0.14419861137866974, 0.09625440090894699, 0.03659863397479057, 0.10869793593883514, 0.07319726794958115, 0.04354088380932808, 0.031975336372852325, 0.24967974424362183, 0.04966381937265396, 0.2020569145679474, 0.0006803263095207512, 0.031975336372852325, 0.09864731132984161, 0.2333519160747528, 0.05850806087255478, 0.02580989897251129, 0.011731772683560848, 0.8540730476379395, 0.0023463545367121696, 0.08212240785360336, 0.021117189899086952, 0.9889315366744995, 0.0668911337852478, 0.0998058170080185, 0.13484403491020203, 0.13590580224990845, 0.06582936644554138, 0.006370584014803171, 0.024420572444796562, 0.06052054837346077, 0.33020859956741333, 0.07432348281145096, 0.9912629127502441, 0.9977747201919556, 0.9882981777191162, 0.0415370836853981, 0.9553529024124146, 0.14116810262203217, 0.857092022895813, 0.9956228137016296, 0.37793493270874023, 0.09960217773914337, 0.006086799781769514, 0.07110488414764404, 0.04454430565237999, 0.15023328363895416, 0.059484630823135376, 0.11647921055555344, 0.014663653448224068, 0.059761304408311844, 0.9974615573883057, 0.1840101033449173, 0.002920795464888215, 0.09346545487642288, 0.04965352267026901, 0.020445566624403, 0.07886147499084473, 0.5695551037788391, 0.9935731291770935, 0.2841089963912964, 0.0568218007683754, 0.0701916366815567, 0.46794426441192627, 0.09693130850791931, 0.005013688467442989, 0.01838352344930172, 0.9945606589317322, 0.1063975989818573, 0.03546586632728577, 0.03819401189684868, 0.600191593170166, 0.22097963094711304, 0.995009183883667, 0.9792357683181763, 0.009374520741403103, 0.007030890788882971, 0.20858308672904968, 0.35779422521591187, 0.003124840324744582, 0.019530251622200012, 0.378886878490448, 0.01562420092523098, 0.9002392888069153, 0.09726203233003616, 0.9930251836776733, 0.9916316270828247, 0.09693365544080734, 0.3130149245262146, 0.07068078964948654, 0.23930495977401733, 0.27868425846099854, 0.9976932406425476, 0.9929656386375427, 0.15088479220867157, 0.8490967750549316, 0.34195584058761597, 0.2523147463798523, 0.0018201243365183473, 0.046185653656721115, 0.09464646130800247, 0.06575199216604233, 0.05596882104873657, 0.04049776494503021, 0.06074664741754532, 0.04027025029063225, 0.009788339026272297, 0.09788339585065842, 0.029365018010139465, 0.822220504283905, 0.03915335610508919, 0.9929429292678833, 0.014371379278600216, 0.124968521296978, 0.22619301080703735, 0.05811036005616188, 0.07060721516609192, 0.017495593056082726, 0.07560595124959946, 0.01562106516212225, 0.3499118387699127, 0.04748803749680519, 0.1100185215473175, 0.20536790788173676, 0.07579053938388824, 0.03178313001990318, 0.5745411515235901, 0.32186359167099, 0.6759135127067566, 0.04023103043437004, 0.04446587339043617, 0.029643917456269264, 0.09104917198419571, 0.5357078909873962, 0.1588066965341568, 0.09951886534690857, 0.21029403805732727, 0.7732859253883362, 0.0016558585921302438, 0.01324686873704195, 0.996273934841156, 0.9994207620620728, 0.9942842125892639, 0.9879215955734253, 0.31940343976020813, 0.6791054606437683, 0.17297396063804626, 0.014766070060431957, 0.8100244402885437, 0.07929293811321259, 0.004719818010926247, 0.9128127694129944, 0.0018879271810874343, 0.9901733994483948, 0.009147335775196552, 0.042687565088272095, 0.2154705673456192, 0.07521142810583115, 0.4339902400970459, 0.14229188859462738, 0.054884012788534164, 0.027442006394267082, 0.12139881402254105, 0.02926022745668888, 0.5005366206169128, 0.1270018368959427, 0.036730922758579254, 0.02365720458328724, 0.06785882264375687, 0.041711386293172836, 0.006225580349564552, 0.0454467348754406, 0.9917294383049011, 0.9968920350074768, 0.9306492209434509, 0.06876718252897263, 0.9906982779502869, 0.03595567122101784, 0.9528253078460693, 0.9878548979759216, 0.9904950857162476, 0.11256667226552963, 0.8850069642066956, 0.9979623556137085, 0.9954518675804138, 0.014250417239964008, 0.983278751373291, 0.9919945001602173, 0.9889539480209351, 0.028080632910132408, 0.9547415375709534, 0.009360210970044136, 0.012287922203540802, 0.03891175612807274, 0.04300772771239281, 0.13311916589736938, 0.06553558260202408, 0.08806344121694565, 0.5345246195793152, 0.08191948384046555, 0.988900363445282, 0.0012262659147381783, 0.517484188079834, 0.3231210708618164, 0.04230617359280586, 0.05211630091071129, 0.005518196616321802, 0.035561710596084595, 0.004291930701583624, 0.017780855298042297, 0.057518623769283295, 0.8575504422187805, 0.0836634561419487, 0.9363574385643005, 0.06113674119114876, 0.9921925663948059, 0.11348026245832443, 0.09020226448774338, 0.6205042600631714, 0.04364625737071037, 0.0065469383262097836, 0.014548752456903458, 0.03855419158935547, 0.06546938419342041, 0.007274376228451729, 0.0005373483872972429, 0.21493935585021973, 0.02847946621477604, 0.752825140953064, 0.003224090440198779, 0.05142543837428093, 0.9427996873855591, 0.9487872123718262, 0.04447440057992935, 0.0049415999092161655, 0.582501232624054, 0.0932001993060112, 0.2895863354206085, 0.015533366240561008, 0.01886194385588169, 0.9940780997276306, 0.07539986819028854, 0.09514745324850082, 0.007180939894169569, 0.025133289396762848, 0.5152324438095093, 0.15798068046569824, 0.014361879788339138, 0.02154281921684742, 0.07360463589429855, 0.014361879788339138, 0.9952544569969177, 0.0444549061357975, 0.9261438846588135, 0.029636604711413383, 0.9802224636077881, 0.03679625317454338, 0.08714901655912399, 0.21303093433380127, 0.0232397373765707, 0.07552915066480637, 0.5054643154144287, 0.01355651393532753, 0.0445428304374218, 0.01616777665913105, 0.01077851839363575, 0.9646773934364319, 0.25457799434661865, 0.05604906752705574, 0.09533579647541046, 0.08485933393239975, 0.07543051987886429, 0.07909727841615677, 0.19381453096866608, 0.02985791303217411, 0.05657288804650307, 0.07490669190883636, 0.9938384294509888, 0.2710508406162262, 0.05701809376478195, 0.04784935712814331, 0.042405419051647186, 0.06332160532474518, 0.3194732367992401, 0.00401132320985198, 0.12406449764966965, 0.014326154254376888, 0.05673157051205635, 0.0856575295329094, 0.05930136516690254, 0.024159815162420273, 0.7291871905326843, 0.026356162503361702, 0.013178081251680851, 0.008785387501120567, 0.050515979528427124, 0.9913363456726074, 0.0069246068596839905, 0.1465708464384079, 0.027698427438735962, 0.1419544517993927, 0.19735130667686462, 0.08194117993116379, 0.2919875979423523, 0.10617730766534805, 0.9816988110542297, 0.9771338105201721, 0.9972831010818481, 0.9919394850730896, 0.1665184646844864, 0.16189295053482056, 0.025440320372581482, 0.11216868460178375, 0.016189293935894966, 0.011563781648874283, 0.499555379152298, 0.005781890824437141, 0.9955941438674927, 0.9914425611495972, 0.9890792965888977, 0.9932788014411926, 0.9947019219398499, 0.9942968487739563, 0.23299972712993622, 0.11411148309707642, 0.013268777169287205, 0.05891336873173714, 0.11835748702287674, 0.13640302419662476, 0.05891336873173714, 0.051482852548360825, 0.1480795443058014, 0.06793613731861115, 0.9846557378768921, 0.053808897733688354, 0.8497321605682373, 0.01793629862368107, 0.05605093389749527, 0.022420374676585197, 0.0005919853574596345, 0.02959926798939705, 0.14858832955360413, 0.0017759561305865645, 0.8193077445030212, 0.0007286216714419425, 0.08889184892177582, 0.13552363216876984, 0.17486920952796936, 0.16175401210784912, 0.00291448668576777, 0.11657947301864624, 0.3133073151111603, 0.006557594984769821, 0.27615758776664734, 0.19481515884399414, 0.00813424400985241, 0.15861776471138, 0.06629408895969391, 0.11225257068872452, 0.06304039061069489, 0.04026450961828232, 0.05571957305073738, 0.025216158479452133, 0.9917768239974976, 0.016399454325437546, 0.2193426936864853, 0.21831771731376648, 0.11889603734016418, 0.06969767808914185, 0.006149794906377792, 0.09224692732095718, 0.2582913935184479, 0.9895025491714478, 0.010923417285084724, 0.024905391037464142, 0.2569187581539154, 0.417274534702301, 0.031896378844976425, 0.09263058006763458, 0.11972065269947052, 0.027527010068297386, 0.01791440322995186, 0.9879209399223328, 0.9828146696090698, 0.9952401518821716, 0.011208872310817242, 0.25332051515579224, 0.13226468861103058, 0.017934195697307587, 0.051560815423727036, 0.5313005447387695, 0.9885645508766174, 0.11263793706893921, 0.25891709327697754, 0.019223541021347046, 0.10693094879388809, 0.1228504478931427, 0.14748060703277588, 0.10512874275445938, 0.0423518642783165, 0.07779526710510254, 0.006908460520207882, 0.9894654750823975, 0.9859137535095215, 0.988101065158844, 0.13968415558338165, 0.12965160608291626, 0.05652964115142822, 0.13370321691036224, 0.14470043778419495, 0.09781750291585922, 0.11248047649860382, 0.047268811613321304, 0.0692632794380188, 0.06907034665346146, 0.010665087029337883, 0.06754554808139801, 0.8496519327163696, 0.021330174058675766, 0.04977040737867355, 0.9942588210105896, 0.01854361593723297, 0.002852864097803831, 0.46073755621910095, 0.04136652871966362, 0.47500187158584595, 0.16666944324970245, 0.8295592665672302, 0.9949787259101868, 0.06429426372051239, 0.4737083315849304, 0.01330226194113493, 0.13376162946224213, 0.05173102021217346, 0.08129160106182098, 0.008129159919917583, 0.04951397702097893, 0.06133820861577988, 0.06355524808168411, 0.9839065670967102, 0.10247236490249634, 0.8284385204315186, 0.04907127097249031, 0.0028865453787148, 0.01587599888443947, 0.9984540939331055, 0.9972016215324402, 0.9988705515861511, 0.9919763207435608, 0.03858592361211777, 0.9576324224472046, 0.0035078111104667187, 0.9930582642555237, 0.9932459592819214, 0.03595590591430664, 0.014648702926933765, 0.0426144078373909, 0.06392160803079605, 0.033292505890131, 0.6791671514511108, 0.08389711380004883, 0.045277807861566544, 0.014019694179296494, 0.9720321297645569, 0.009346462786197662, 0.9923473596572876, 0.005523554980754852, 0.994239866733551, 0.9954299330711365, 0.046779386699199677, 0.8836106657981873, 0.06757022440433502, 0.7120974659919739, 0.12702780961990356, 0.052850984036922455, 0.10662917792797089, 0.9876187443733215, 0.9899839758872986, 0.9931995272636414, 0.9878475666046143, 0.020768698304891586, 0.6824000477790833, 0.2937287390232086, 0.0029669569339603186, 0.9904960989952087, 0.003083867020905018, 0.05119219422340393, 0.5261077284812927, 0.30653637647628784, 0.0018503202591091394, 0.036389630287885666, 0.028371578082442284, 0.0431741401553154, 0.003083867020905018, 0.9957234263420105, 0.9857167601585388, 0.021710535511374474, 0.005427633877843618, 0.9457652568817139, 0.025781262665987015, 0.9877657294273376, 0.0066740927286446095, 0.007349411956965923, 0.07349412143230438, 0.012861470691859722, 0.22231970727443695, 0.09554235637187958, 0.014698823913931847, 0.5750914812088013, 0.9970661401748657, 0.0032690693624317646, 0.9879963397979736, 0.9933649897575378, 0.9527984857559204, 0.0392906591296196, 0.9773064255714417, 0.01338775921612978, 0.1733044683933258, 0.11415430158376694, 0.09121287614107132, 0.1843605786561966, 0.10005776584148407, 0.14179456233978271, 0.06937706470489502, 0.04201320558786392, 0.052792906761169434, 0.030404292047023773, 0.08409424871206284, 0.021624235436320305, 0.07688616961240768, 0.06727539747953415, 0.747237503528595, 0.33517640829086304, 0.6620768904685974, 0.002758653601631522, 0.04095998778939247, 0.959634006023407, 0.9987404942512512, 0.013819515705108643, 0.3151523768901825, 0.6707521080970764, 0.05502551794052124, 0.14756843447685242, 0.010004639625549316, 0.005002319812774658, 0.7828630208969116, 0.042391955852508545, 0.9507910013198853, 0.012515492737293243, 0.007822182960808277, 0.9777728319168091, 0.994380533695221, 0.11777878552675247, 0.5513847470283508, 0.10502567142248154, 0.062265217304229736, 0.0270066000521183, 0.0405099019408226, 0.0157538503408432, 0.028506968170404434, 0.0157538503408432, 0.0360088013112545, 0.10179044306278229, 0.0622747428715229, 0.09353716671466827, 0.3176262080669403, 0.21183417737483978, 0.047518882900476456, 0.05627235770225525, 0.05527196079492569, 0.050269972532987595, 0.004001589957624674, 0.2278156876564026, 0.16641081869602203, 0.0973757654428482, 0.15006041526794434, 0.10609598457813263, 0.05123127996921539, 0.08029866963624954, 0.011990299448370934, 0.0534113347530365, 0.054864704608917236, 0.009547729976475239, 0.9881900548934937, 0.9945070743560791, 0.9949353933334351, 0.9954512119293213, 0.9885648488998413, 0.9812148213386536, 0.9881600737571716, 0.12985055148601532, 0.03196321427822113, 0.015482181683182716, 0.038955166935920715, 0.21625111997127533, 0.06367671489715576, 0.24471835792064667, 0.04095286875963211, 0.06792183220386505, 0.14982756972312927, 0.9866440296173096, 0.9905340671539307, 0.991249680519104], \"Term\": [\"accept\", \"accept\", \"accept\", \"accept\", \"accept\", \"accept\", \"accept\", \"accept\", \"accept\", \"access\", \"access\", \"access\", \"access\", \"access\", \"access\", \"adaptec\", \"address\", \"address\", \"address\", \"address\", \"address\", \"address\", \"address\", \"address\", \"address\", \"address\", \"administr\", \"administr\", \"administr\", \"administr\", \"agenc\", \"agenc\", \"agenc\", \"agenc\", \"agenc\", \"aid\", \"aid\", \"aid\", \"aid\", \"alaska\", \"algorithm\", \"algorithm\", \"alomar\", \"amanda\", \"american\", \"american\", \"american\", \"american\", \"american\", \"american\", \"american\", \"american\", \"andrew\", \"andrew\", \"andrew\", \"andrew\", \"andrew\", \"andrew\", \"andrew\", \"andrew\", \"anonym\", \"anonym\", \"anti\", \"anti\", \"anti\", \"appl\", \"appl\", \"appl\", \"applic\", \"applic\", \"applic\", \"applic\", \"applic\", \"arab\", \"arab\", \"archiv\", \"archiv\", \"archiv\", \"archiv\", \"argic\", \"argument\", \"argument\", \"argument\", \"argument\", \"argument\", \"argument\", \"argument\", \"argument\", \"arm\", \"arm\", \"arm\", \"arm\", \"arm\", \"armenia\", \"armenian\", \"armi\", \"armi\", \"armi\", \"armi\", \"armori\", \"atheism\", \"atheist\", \"atho\", \"attack\", \"attack\", \"attack\", \"attack\", \"attack\", \"attack\", \"aurora\", \"author\", \"author\", \"author\", \"author\", \"author\", \"auto\", \"auto\", \"auto\", \"auto\", \"auto\", \"auto\", \"autom\", \"automot\", \"avail\", \"avail\", \"avail\", \"avail\", \"avail\", \"avail\", \"avail\", \"avail\", \"avail\", \"avail\", \"azerbaijan\", \"azerbaijani\", \"azeri\", \"baalk\", \"baerga\", \"ball\", \"ball\", \"ball\", \"bank\", \"bank\", \"bank\", \"bank\", \"bank\", \"bank\", \"bank\", \"bank\", \"bank\", \"basebal\", \"basebal\", \"bat\", \"batf\", \"batf\", \"batteri\", \"batteri\", \"belief\", \"belief\", \"believ\", \"believ\", \"believ\", \"believ\", \"believ\", \"believ\", \"believ\", \"believ\", \"believ\", \"believ\", \"berkeley\", \"berkeley\", \"berkeley\", \"berkeley\", \"best\", \"best\", \"best\", \"best\", \"best\", \"best\", \"best\", \"best\", \"best\", \"best\", \"better\", \"better\", \"better\", \"better\", \"better\", \"better\", \"better\", \"better\", \"better\", \"better\", \"bibl\", \"biblic\", \"bike\", \"bike\", \"billion\", \"billion\", \"binari\", \"binari\", \"bio\", \"blah\", \"blast\", \"board\", \"board\", \"board\", \"board\", \"board\", \"board\", \"board\", \"board\", \"boni\", \"bontchev\", \"book\", \"book\", \"book\", \"book\", \"book\", \"book\", \"book\", \"book\", \"boyl\", \"brake\", \"brake\", \"brave\", \"brave\", \"bruin\", \"build\", \"build\", \"build\", \"build\", \"build\", \"build\", \"build\", \"build\", \"build\", \"build\", \"buy\", \"buy\", \"buy\", \"buy\", \"buy\", \"byte\", \"byte\", \"byte\", \"cach\", \"cactus\", \"cadr\", \"callison\", \"canada\", \"canada\", \"canada\", \"canada\", \"canada\", \"canada\", \"canada\", \"canada\", \"canada\", \"cancer\", \"cancer\", \"candida\", \"canuck\", \"car\", \"car\", \"card\", \"card\", \"card\", \"card\", \"card\", \"carlo\", \"case\", \"case\", \"case\", \"case\", \"case\", \"case\", \"case\", \"case\", \"case\", \"case\", \"catbyt\", \"catcher\", \"cathol\", \"caus\", \"caus\", \"caus\", \"caus\", \"caus\", \"caus\", \"caus\", \"caus\", \"caus\", \"centerlin\", \"centri\", \"char\", \"chastiti\", \"children\", \"children\", \"children\", \"children\", \"children\", \"children\", \"chip\", \"chip\", \"chip\", \"chopin\", \"christ\", \"christ\", \"christian\", \"christian\", \"church\", \"church\", \"church\", \"cica\", \"cipher\", \"ciphertext\", \"circuit\", \"circuit\", \"circuit\", \"claim\", \"claim\", \"claim\", \"claim\", \"claim\", \"claim\", \"claim\", \"claim\", \"claim\", \"claim\", \"clarkson\", \"classifi\", \"classifi\", \"classifi\", \"classifi\", \"clayton\", \"cleveland\", \"cleveland\", \"cleveland\", \"client\", \"client\", \"clinic\", \"clinic\", \"clinton\", \"clinton\", \"clinton\", \"clinton\", \"clipper\", \"clipper\", \"coach\", \"coach\", \"code\", \"code\", \"code\", \"code\", \"code\", \"code\", \"color\", \"color\", \"color\", \"color\", \"color\", \"color\", \"colorado\", \"colorado\", \"colorado\", \"colorado\", \"colorado\", \"colorado\", \"colorado\", \"colorado\", \"columbia\", \"columbia\", \"columbia\", \"columbia\", \"columbia\", \"come\", \"come\", \"come\", \"come\", \"come\", \"come\", \"come\", \"come\", \"come\", \"come\", \"communic\", \"communic\", \"communic\", \"communic\", \"communic\", \"communic\", \"communic\", \"communic\", \"compil\", \"compil\", \"compil\", \"compil\", \"concordia\", \"config\", \"contradict\", \"contradict\", \"contradict\", \"contrib\", \"control\", \"control\", \"control\", \"control\", \"control\", \"control\", \"control\", \"control\", \"control\", \"copi\", \"copi\", \"copi\", \"copi\", \"copi\", \"copi\", \"copi\", \"copper\", \"cost\", \"cost\", \"cost\", \"cost\", \"cost\", \"cost\", \"cost\", \"cost\", \"counterst\", \"countri\", \"countri\", \"countri\", \"countri\", \"countri\", \"countri\", \"countri\", \"court\", \"court\", \"court\", \"court\", \"cramer\", \"crime\", \"crime\", \"crime\", \"crypt\", \"crypto\", \"cryptograph\", \"cryptographi\", \"ctrl\", \"cub\", \"cunixb\", \"cure\", \"cwru\", \"cwru\", \"data\", \"data\", \"data\", \"data\", \"data\", \"data\", \"data\", \"david\", \"david\", \"david\", \"david\", \"david\", \"david\", \"david\", \"david\", \"david\", \"david\", \"davidian\", \"dealer\", \"dealer\", \"dealer\", \"death\", \"death\", \"death\", \"death\", \"death\", \"death\", \"decrypt\", \"den\", \"desi\", \"design\", \"design\", \"design\", \"design\", \"design\", \"design\", \"design\", \"design\", \"design\", \"deskjet\", \"detroit\", \"devic\", \"devic\", \"devic\", \"devic\", \"diamond\", \"diet\", \"differ\", \"differ\", \"differ\", \"differ\", \"differ\", \"differ\", \"differ\", \"differ\", \"differ\", \"differ\", \"dillon\", \"directori\", \"directori\", \"directori\", \"diseas\", \"disk\", \"disk\", \"disk\", \"display\", \"display\", \"display\", \"display\", \"display\", \"display\", \"display\", \"distribut\", \"distribut\", \"distribut\", \"distribut\", \"distribut\", \"distribut\", \"distribut\", \"distribut\", \"distribut\", \"distribut\", \"divin\", \"divis\", \"divis\", \"divis\", \"divis\", \"divis\", \"divis\", \"divis\", \"divis\", \"divis\", \"dock\", \"doctor\", \"doctor\", \"doctor\", \"doctrin\", \"dodger\", \"drive\", \"drive\", \"drive\", \"drive\", \"drive\", \"drive\", \"drive\", \"drive\", \"driver\", \"driver\", \"driver\", \"driver\", \"driver\", \"dseg\", \"dseg\", \"dtmedin\", \"duke\", \"duke\", \"dyer\", \"earth\", \"earth\", \"earth\", \"earth\", \"earth\", \"earth\", \"edmonton\", \"effect\", \"effect\", \"effect\", \"effect\", \"effect\", \"effect\", \"effect\", \"effect\", \"effect\", \"effect\", \"einstein\", \"eisa\", \"email\", \"email\", \"email\", \"email\", \"email\", \"email\", \"email\", \"email\", \"encrypt\", \"enforc\", \"enforc\", \"enforc\", \"enforc\", \"enforc\", \"engin\", \"engin\", \"engin\", \"engin\", \"engin\", \"engin\", \"engin\", \"engin\", \"engin\", \"engin\", \"engr\", \"entri\", \"entri\", \"entri\", \"ericsson\", \"escrow\", \"esdi\", \"espn\", \"etern\", \"etern\", \"etern\", \"ether\", \"ethernet\", \"ethnic\", \"evid\", \"evid\", \"evid\", \"evid\", \"evid\", \"evid\", \"exist\", \"exist\", \"exist\", \"exist\", \"exist\", \"exist\", \"exist\", \"exist\", \"exist\", \"extermin\", \"faith\", \"faith\", \"fbihh\", \"feder\", \"feder\", \"feder\", \"feder\", \"file\", \"file\", \"file\", \"file\", \"final\", \"final\", \"final\", \"final\", \"final\", \"final\", \"final\", \"final\", \"final\", \"final\", \"firearm\", \"fischer\", \"flight\", \"flight\", \"flight\", \"flight\", \"floppi\", \"floppi\", \"flyer\", \"flyer\", \"fnal\", \"follow\", \"follow\", \"follow\", \"follow\", \"follow\", \"follow\", \"follow\", \"follow\", \"follow\", \"follow\", \"font\", \"font\", \"food\", \"food\", \"food\", \"food\", \"forc\", \"forc\", \"forc\", \"forc\", \"forc\", \"forc\", \"forc\", \"forc\", \"forc\", \"forc\", \"format\", \"format\", \"format\", \"format\", \"format\", \"freenet\", \"freenet\", \"freenet\", \"frost\", \"frost\", \"function\", \"function\", \"function\", \"function\", \"function\", \"function\", \"fund\", \"fund\", \"fund\", \"fund\", \"fund\", \"game\", \"game\", \"game\", \"game\", \"gatech\", \"gaza\", \"genet\", \"genet\", \"genocid\", \"go\", \"go\", \"go\", \"go\", \"go\", \"go\", \"go\", \"go\", \"go\", \"go\", \"goal\", \"goal\", \"goal\", \"goal\", \"goal\", \"goal\", \"god\", \"good\", \"good\", \"good\", \"good\", \"good\", \"good\", \"good\", \"good\", \"good\", \"good\", \"gordon\", \"gordon\", \"gospel\", \"govern\", \"govern\", \"govern\", \"govern\", \"gradi\", \"graphic\", \"graphic\", \"great\", \"great\", \"great\", \"great\", \"great\", \"great\", \"great\", \"great\", \"great\", \"great\", \"greec\", \"greec\", \"greek\", \"greek\", \"greenbelt\", \"grind\", \"grind\", \"grind\", \"grind\", \"grind\", \"grind\", \"grind\", \"group\", \"group\", \"group\", \"group\", \"group\", \"group\", \"group\", \"group\", \"group\", \"group\", \"gtoal\", \"gun\", \"gun\", \"halat\", \"hallam\", \"hamburg\", \"handbook\", \"handgun\", \"handgun\", \"handheld\", \"handheld\", \"handheld\", \"happen\", \"happen\", \"happen\", \"happen\", \"happen\", \"happen\", \"happen\", \"happen\", \"happen\", \"happen\", \"hard\", \"hard\", \"hard\", \"hard\", \"hard\", \"hard\", \"hard\", \"hard\", \"hard\", \"harley\", \"health\", \"health\", \"health\", \"health\", \"heaven\", \"heaven\", \"heaven\", \"heaven\", \"helmet\", \"helmet\", \"helmet\", \"help\", \"help\", \"help\", \"help\", \"help\", \"help\", \"help\", \"help\", \"help\", \"help\", \"henri\", \"henri\", \"higgin\", \"high\", \"high\", \"high\", \"high\", \"high\", \"high\", \"high\", \"high\", \"high\", \"high\", \"hit\", \"hit\", \"hit\", \"hit\", \"hit\", \"hitler\", \"hitter\", \"hockey\", \"holi\", \"holi\", \"home\", \"home\", \"home\", \"home\", \"home\", \"home\", \"home\", \"home\", \"home\", \"home\", \"homeopathi\", \"homicid\", \"honda\", \"hulman\", \"husc\", \"hydro\", \"iastat\", \"iastat\", \"ifa\", \"illinoi\", \"illinoi\", \"illinoi\", \"illinoi\", \"illinoi\", \"illinoi\", \"illinoi\", \"illinoi\", \"imag\", \"imag\", \"imag\", \"imag\", \"imag\", \"imak\", \"includ\", \"includ\", \"includ\", \"includ\", \"includ\", \"includ\", \"includ\", \"includ\", \"includ\", \"includ\", \"indiana\", \"indiana\", \"indiana\", \"indiana\", \"indiana\", \"indiana\", \"infect\", \"inform\", \"inform\", \"inform\", \"inform\", \"inform\", \"inform\", \"inform\", \"inform\", \"inform\", \"inform\", \"ingr\", \"ingr\", \"ingr\", \"inning\", \"instal\", \"instal\", \"instal\", \"instal\", \"instal\", \"insur\", \"insur\", \"insur\", \"insur\", \"intellect\", \"intercon\", \"internet\", \"internet\", \"internet\", \"internet\", \"internet\", \"internet\", \"internet\", \"internet\", \"invest\", \"invest\", \"iran\", \"islam\", \"islam\", \"isra\", \"israel\", \"israel\", \"israel\", \"jaeger\", \"jake\", \"jason\", \"jason\", \"jason\", \"jason\", \"jay\", \"jeff\", \"jeff\", \"jeff\", \"jeff\", \"jeff\", \"jeff\", \"jeff\", \"jesus\", \"jet\", \"jet\", \"jew\", \"jew\", \"jew\", \"job\", \"job\", \"job\", \"john\", \"john\", \"john\", \"john\", \"john\", \"john\", \"john\", \"john\", \"john\", \"john\", \"jumper\", \"jumper\", \"kaldi\", \"kelvin\", \"key\", \"key\", \"kill\", \"kill\", \"kill\", \"kill\", \"kill\", \"kill\", \"kill\", \"koresh\", \"lamp\", \"larc\", \"larc\", \"laughter\", \"launch\", \"launch\", \"laurentian\", \"leaf\", \"leagu\", \"leagu\", \"leav\", \"leav\", \"leav\", \"leav\", \"leav\", \"leav\", \"leav\", \"leav\", \"leav\", \"leav\", \"lebanes\", \"lemieux\", \"librari\", \"librari\", \"librari\", \"librari\", \"librari\", \"librari\", \"life\", \"life\", \"life\", \"life\", \"life\", \"life\", \"life\", \"life\", \"life\", \"life\", \"list\", \"list\", \"list\", \"list\", \"list\", \"list\", \"list\", \"list\", \"list\", \"list\", \"live\", \"live\", \"live\", \"live\", \"live\", \"live\", \"live\", \"live\", \"livesey\", \"long\", \"long\", \"long\", \"long\", \"long\", \"long\", \"long\", \"long\", \"long\", \"long\", \"look\", \"look\", \"look\", \"look\", \"look\", \"look\", \"look\", \"look\", \"look\", \"look\", \"lopez\", \"lord\", \"lord\", \"lose\", \"lose\", \"lose\", \"lose\", \"lose\", \"lose\", \"lose\", \"lose\", \"lose\", \"lose\", \"love\", \"love\", \"love\", \"love\", \"love\", \"love\", \"love\", \"love\", \"lunar\", \"lunar\", \"lyme\", \"machin\", \"machin\", \"machin\", \"machin\", \"machin\", \"machin\", \"machin\", \"machin\", \"magellan\", \"magnus\", \"mail\", \"mail\", \"mail\", \"mail\", \"mail\", \"mail\", \"mail\", \"mail\", \"map\", \"map\", \"mar\", \"mar\", \"marriag\", \"marriag\", \"massacr\", \"maxtor\", \"maynard\", \"mccall\", \"mcgill\", \"mcgill\", \"mcgill\", \"mean\", \"mean\", \"mean\", \"mean\", \"mean\", \"mean\", \"mean\", \"mean\", \"mean\", \"mean\", \"medic\", \"medic\", \"medic\", \"medic\", \"medic\", \"medicin\", \"medicin\", \"medicin\", \"medicin\", \"meg\", \"memori\", \"memori\", \"memori\", \"memori\", \"memori\", \"memori\", \"memori\", \"messag\", \"messag\", \"messag\", \"messag\", \"messag\", \"messag\", \"messag\", \"messag\", \"messag\", \"met\", \"metal\", \"metal\", \"metal\", \"metal\", \"methodolog\", \"midway\", \"midway\", \"midway\", \"migrain\", \"militia\", \"mime\", \"mission\", \"mission\", \"mission\", \"mission\", \"mksol\", \"mode\", \"mode\", \"mode\", \"mode\", \"mode\", \"mode\", \"modem\", \"modem\", \"modem\", \"money\", \"money\", \"money\", \"money\", \"money\", \"money\", \"money\", \"money\", \"monitor\", \"monitor\", \"monitor\", \"montreal\", \"montreal\", \"moon\", \"moon\", \"moon\", \"moral\", \"moral\", \"mormon\", \"motherboard\", \"motif\", \"motorcycl\", \"motto\", \"mous\", \"mous\", \"murder\", \"murder\", \"murder\", \"muslim\", \"muslim\", \"nasa\", \"nasa\", \"nasa\", \"nation\", \"nation\", \"nation\", \"nation\", \"nation\", \"nation\", \"nation\", \"nation\", \"nation\", \"nation\", \"nazi\", \"ncsl\", \"need\", \"need\", \"need\", \"need\", \"need\", \"need\", \"need\", \"need\", \"need\", \"need\", \"netcom\", \"netcom\", \"netcom\", \"netcom\", \"netcom\", \"netcom\", \"nist\", \"nist\", \"nore\", \"nsmca\", \"nubus\", \"number\", \"number\", \"number\", \"number\", \"number\", \"number\", \"number\", \"number\", \"number\", \"number\", \"ohio\", \"ohio\", \"ohio\", \"openwindow\", \"opinion\", \"opinion\", \"opinion\", \"opinion\", \"opinion\", \"opinion\", \"opinion\", \"opinion\", \"opinion\", \"opinion\", \"optilink\", \"oracl\", \"orbit\", \"orbit\", \"outlet\", \"outlet\", \"output\", \"output\", \"output\", \"owner\", \"owner\", \"owner\", \"owner\", \"owner\", \"owner\", \"owner\", \"pain\", \"pain\", \"pain\", \"pain\", \"pain\", \"palestinian\", \"patent\", \"patent\", \"patent\", \"patient\", \"patient\", \"pen\", \"penguin\", \"peopl\", \"peopl\", \"peopl\", \"peopl\", \"peopl\", \"peopl\", \"peopl\", \"peopl\", \"peopl\", \"peopl\", \"period\", \"period\", \"period\", \"period\", \"period\", \"period\", \"period\", \"period\", \"period\", \"person\", \"person\", \"person\", \"person\", \"person\", \"person\", \"person\", \"person\", \"person\", \"person\", \"phone\", \"phone\", \"phone\", \"phone\", \"phone\", \"phone\", \"phone\", \"phone\", \"photographi\", \"physician\", \"pistol\", \"pitch\", \"pitch\", \"pitcher\", \"pitt\", \"pitt\", \"pitt\", \"pittsburgh\", \"pittsburgh\", \"pittsburgh\", \"plaintext\", \"play\", \"play\", \"play\", \"play\", \"play\", \"play\", \"play\", \"play\", \"player\", \"player\", \"playoff\", \"plymouth\", \"point\", \"point\", \"point\", \"point\", \"point\", \"point\", \"point\", \"point\", \"point\", \"point\", \"polit\", \"polit\", \"polit\", \"polit\", \"polit\", \"polit\", \"polygon\", \"popul\", \"popul\", \"popul\", \"popul\", \"port\", \"port\", \"port\", \"power\", \"power\", \"power\", \"power\", \"power\", \"power\", \"power\", \"power\", \"power\", \"power\", \"powerbook\", \"presid\", \"presid\", \"presid\", \"presid\", \"price\", \"price\", \"price\", \"price\", \"price\", \"price\", \"price\", \"princeton\", \"princeton\", \"princeton\", \"princeton\", \"printer\", \"printer\", \"prism\", \"prison\", \"privaci\", \"privat\", \"privat\", \"privat\", \"privat\", \"privat\", \"privat\", \"privat\", \"probe\", \"probe\", \"probe\", \"problem\", \"problem\", \"problem\", \"problem\", \"problem\", \"problem\", \"problem\", \"problem\", \"problem\", \"problem\", \"program\", \"program\", \"program\", \"program\", \"program\", \"program\", \"project\", \"project\", \"project\", \"project\", \"project\", \"propheci\", \"prophet\", \"propos\", \"propos\", \"propos\", \"propos\", \"propos\", \"propos\", \"protect\", \"protect\", \"protect\", \"protect\", \"protect\", \"protect\", \"protect\", \"provid\", \"provid\", \"provid\", \"provid\", \"provid\", \"provid\", \"provid\", \"provid\", \"provid\", \"provid\", \"public\", \"public\", \"public\", \"public\", \"public\", \"public\", \"public\", \"public\", \"public\", \"puck\", \"pyron\", \"quadra\", \"qualcomm\", \"quebec\", \"question\", \"question\", \"question\", \"question\", \"question\", \"question\", \"question\", \"question\", \"question\", \"question\", \"quicktim\", \"raider\", \"ramsey\", \"ranck\", \"ranger\", \"ranger\", \"read\", \"read\", \"read\", \"read\", \"read\", \"read\", \"read\", \"read\", \"read\", \"read\", \"reason\", \"reason\", \"reason\", \"reason\", \"reason\", \"reason\", \"reason\", \"reason\", \"reason\", \"reason\", \"recipi\", \"recipi\", \"redesign\", \"reilli\", \"religi\", \"religi\", \"religion\", \"religion\", \"repli\", \"repli\", \"repli\", \"repli\", \"repli\", \"repli\", \"repli\", \"repli\", \"repli\", \"repli\", \"research\", \"research\", \"research\", \"research\", \"research\", \"research\", \"research\", \"research\", \"research\", \"research\", \"resourc\", \"resourc\", \"resourc\", \"resourc\", \"resourc\", \"resourc\", \"restaur\", \"result\", \"result\", \"result\", \"result\", \"result\", \"result\", \"result\", \"result\", \"result\", \"result\", \"resurrect\", \"revel\", \"revolv\", \"rid\", \"rid\", \"ride\", \"ride\", \"rider\", \"right\", \"right\", \"right\", \"right\", \"right\", \"right\", \"right\", \"right\", \"right\", \"right\", \"ripem\", \"risk\", \"risk\", \"risk\", \"risk\", \"risk\", \"risk\", \"risk\", \"rkba\", \"road\", \"road\", \"road\", \"road\", \"road\", \"road\", \"road\", \"robi\", \"rochest\", \"rochest\", \"rochest\", \"rochest\", \"rochest\", \"rocki\", \"rockwel\", \"run\", \"run\", \"run\", \"run\", \"run\", \"run\", \"run\", \"run\", \"rutger\", \"rutger\", \"rwing\", \"sabbath\", \"sale\", \"sale\", \"sale\", \"sale\", \"sale\", \"sandvik\", \"satan\", \"satellit\", \"satellit\", \"say\", \"say\", \"say\", \"say\", \"say\", \"say\", \"say\", \"say\", \"say\", \"say\", \"scheme\", \"scheme\", \"scheme\", \"scheme\", \"scheme\", \"schneider\", \"scienc\", \"scienc\", \"scienc\", \"scienc\", \"scienc\", \"scienc\", \"scienc\", \"scienc\", \"scienc\", \"scienc\", \"scientif\", \"scientif\", \"scientif\", \"scientif\", \"scientif\", \"score\", \"score\", \"scott\", \"scott\", \"scott\", \"scott\", \"scott\", \"scott\", \"scott\", \"screen\", \"screen\", \"screen\", \"screen\", \"scriptur\", \"scsi\", \"sdpa\", \"sdsu\", \"season\", \"season\", \"secret\", \"secret\", \"secret\", \"secur\", \"secur\", \"secur\", \"secur\", \"selann\", \"sell\", \"sell\", \"sell\", \"sell\", \"sell\", \"sell\", \"sell\", \"sell\", \"send\", \"send\", \"send\", \"send\", \"send\", \"send\", \"send\", \"send\", \"send\", \"send\", \"sera\", \"serdar\", \"server\", \"server\", \"shafer\", \"shaft\", \"shaft\", \"shark\", \"shotgun\", \"shuttl\", \"shuttl\", \"simm\", \"sin\", \"skeptic\", \"skeptic\", \"skndiv\", \"slaughter\", \"sleev\", \"sleev\", \"sleev\", \"smith\", \"smith\", \"smith\", \"smith\", \"smith\", \"smith\", \"smith\", \"smith\", \"smuggl\", \"softwar\", \"softwar\", \"softwar\", \"softwar\", \"softwar\", \"softwar\", \"softwar\", \"softwar\", \"softwar\", \"solar\", \"solar\", \"solar\", \"soldier\", \"soldier\", \"solntz\", \"sourc\", \"sourc\", \"sourc\", \"sourc\", \"sourc\", \"sourc\", \"sourc\", \"sourc\", \"sourc\", \"space\", \"space\", \"space\", \"space\", \"space\", \"spacecraft\", \"spacecraft\", \"spec\", \"spec\", \"spec\", \"speed\", \"speed\", \"speed\", \"speed\", \"speed\", \"spencer\", \"spend\", \"spend\", \"spend\", \"spend\", \"spend\", \"spend\", \"spend\", \"spend\", \"spend\", \"spend\", \"sphere\", \"spirit\", \"spirit\", \"spirit\", \"ssto\", \"stanford\", \"stanford\", \"stanford\", \"stanford\", \"stanford\", \"stanford\", \"stanford\", \"stanford\", \"stanley\", \"stanley\", \"stanley\", \"start\", \"start\", \"start\", \"start\", \"start\", \"start\", \"start\", \"start\", \"start\", \"start\", \"starter\", \"state\", \"state\", \"state\", \"state\", \"state\", \"state\", \"state\", \"state\", \"state\", \"state\", \"station\", \"station\", \"station\", \"station\", \"station\", \"station\", \"station\", \"station\", \"sternlight\", \"steve\", \"steve\", \"steve\", \"steve\", \"steve\", \"steve\", \"steve\", \"steve\", \"steveh\", \"stimulus\", \"stratus\", \"strnlght\", \"studi\", \"studi\", \"studi\", \"studi\", \"studi\", \"studi\", \"studi\", \"studi\", \"suno\", \"superstit\", \"surveil\", \"svga\", \"swap\", \"syndrom\", \"take\", \"take\", \"take\", \"take\", \"take\", \"take\", \"take\", \"take\", \"take\", \"take\", \"tampa\", \"teach\", \"teach\", \"teach\", \"teach\", \"teach\", \"team\", \"team\", \"team\", \"team\", \"team\", \"technolog\", \"technolog\", \"technolog\", \"technolog\", \"technolog\", \"technolog\", \"technolog\", \"technolog\", \"technolog\", \"tell\", \"tell\", \"tell\", \"tell\", \"tell\", \"tell\", \"tell\", \"tell\", \"tell\", \"tell\", \"tennesse\", \"test\", \"test\", \"test\", \"test\", \"test\", \"test\", \"test\", \"test\", \"testament\", \"thank\", \"thank\", \"thank\", \"thank\", \"thank\", \"thank\", \"thank\", \"thank\", \"thank\", \"theist\", \"theodor\", \"theolog\", \"theori\", \"theori\", \"theori\", \"theori\", \"theori\", \"theori\", \"therapi\", \"thing\", \"thing\", \"thing\", \"thing\", \"thing\", \"thing\", \"thing\", \"thing\", \"thing\", \"thing\", \"thomasp\", \"tiff\", \"tiger\", \"time\", \"time\", \"time\", \"time\", \"time\", \"time\", \"time\", \"time\", \"time\", \"time\", \"tire\", \"tire\", \"tire\", \"tire\", \"tire\", \"toolkit\", \"toronto\", \"toronto\", \"toronto\", \"toronto\", \"toronto\", \"treatment\", \"treatment\", \"troop\", \"true\", \"true\", \"true\", \"true\", \"true\", \"true\", \"true\", \"true\", \"true\", \"true\", \"trunk\", \"truth\", \"truth\", \"truth\", \"truth\", \"truth\", \"turk\", \"turkey\", \"turkish\", \"ualberta\", \"uchicago\", \"uchicago\", \"uchicago\", \"ucsc\", \"uicvm\", \"uiuc\", \"uiuc\", \"uiuc\", \"uiuc\", \"uiuc\", \"uiuc\", \"uiuc\", \"uiuc\", \"umich\", \"umich\", \"umich\", \"uoknor\", \"upgrad\", \"upgrad\", \"urartu\", \"urbana\", \"urbana\", \"urbana\", \"user\", \"user\", \"user\", \"user\", \"utah\", \"utkvm\", \"uvic\", \"veal\", \"vehicl\", \"vehicl\", \"vehicl\", \"vehicl\", \"vers\", \"version\", \"version\", \"version\", \"version\", \"version\", \"version\", \"version\", \"version\", \"version\", \"vesa\", \"vesselin\", \"video\", \"video\", \"video\", \"video\", \"villag\", \"villag\", \"virginia\", \"virginia\", \"virginia\", \"virginia\", \"virginia\", \"virginia\", \"virginia\", \"visual\", \"visual\", \"volt\", \"vram\", \"waco\", \"waco\", \"wagon\", \"wagon\", \"want\", \"want\", \"want\", \"want\", \"want\", \"want\", \"want\", \"want\", \"want\", \"want\", \"water\", \"water\", \"water\", \"water\", \"water\", \"weapon\", \"weapon\", \"weapon\", \"wheel\", \"wheel\", \"widget\", \"window\", \"window\", \"window\", \"wing\", \"wing\", \"wing\", \"wing\", \"wing\", \"winnipeg\", \"winnipeg\", \"wire\", \"wire\", \"wire\", \"wiretap\", \"word\", \"word\", \"word\", \"word\", \"word\", \"word\", \"word\", \"word\", \"word\", \"word\", \"work\", \"work\", \"work\", \"work\", \"work\", \"work\", \"work\", \"work\", \"work\", \"work\", \"world\", \"world\", \"world\", \"world\", \"world\", \"world\", \"world\", \"world\", \"world\", \"world\", \"worship\", \"worship\", \"xlib\", \"xpert\", \"xterm\", \"xview\", \"yamaha\", \"yanke\", \"year\", \"year\", \"year\", \"year\", \"year\", \"year\", \"year\", \"year\", \"year\", \"year\", \"yeast\", \"zoolog\", \"zuma\"]}, \"R\": 30, \"lambda.step\": 0.01, \"plot.opts\": {\"xlab\": \"PC1\", \"ylab\": \"PC2\"}, \"topic.order\": [3, 1, 8, 9, 2, 4, 7, 10, 5, 6]};\n", - "\n", - "function LDAvis_load_lib(url, callback){\n", - " var s = document.createElement('script');\n", - " s.src = url;\n", - " s.async = true;\n", - " s.onreadystatechange = s.onload = callback;\n", - " s.onerror = function(){console.warn(\"failed to load library \" + url);};\n", - " document.getElementsByTagName(\"head\")[0].appendChild(s);\n", - "}\n", - "\n", - "if(typeof(LDAvis) !== \"undefined\"){\n", - " // already loaded: just create the visualization\n", - " !function(LDAvis){\n", - " new LDAvis(\"#\" + \"ldavis_el591011124069819927707340541\", ldavis_el591011124069819927707340541_data);\n", - " }(LDAvis);\n", - "}else if(typeof define === \"function\" && define.amd){\n", - " // require.js is available: use it to load d3/LDAvis\n", - " require.config({paths: {d3: \"https://cdnjs.cloudflare.com/ajax/libs/d3/3.5.5/d3.min\"}});\n", - " require([\"d3\"], function(d3){\n", - " window.d3 = d3;\n", - " LDAvis_load_lib(\"https://cdn.rawgit.com/bmabey/pyLDAvis/files/ldavis.v1.0.0.js\", function(){\n", - " new LDAvis(\"#\" + \"ldavis_el591011124069819927707340541\", ldavis_el591011124069819927707340541_data);\n", - " });\n", - " });\n", - "}else{\n", - " // require.js not available: dynamically load d3 & LDAvis\n", - " LDAvis_load_lib(\"https://cdnjs.cloudflare.com/ajax/libs/d3/3.5.5/d3.min.js\", function(){\n", - " LDAvis_load_lib(\"https://cdn.rawgit.com/bmabey/pyLDAvis/files/ldavis.v1.0.0.js\", function(){\n", - " new LDAvis(\"#\" + \"ldavis_el591011124069819927707340541\", ldavis_el591011124069819927707340541_data);\n", - " })\n", - " });\n", - "}\n", - "</script>" - ], - "text/plain": [ - "<IPython.core.display.HTML object>" - ] - }, - "execution_count": 26, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "show_pyldavis('/Users/williamjaubert/Documents/Allianz_William/', 'pyldavis_test_func')" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Step 7: Testing model on unseen document" - ] - }, - { - "cell_type": "code", - "execution_count": 74, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Subject: help\n", - "From: C..Doelle@p26.f3333.n106.z1.fidonet.org (C. Doelle)\n", - "Lines: 13\n", - "\n", - "Hello All!\n", - "\n", - " It is my understanding that all True-Type fonts in Windows are loaded in\n", - "prior to starting Windows - this makes getting into Windows quite slow if you\n", - "have hundreds of them as I do. First off, am I correct in this thinking -\n", - "secondly, if that is the case - can you get Windows to ignore them on boot and\n", - "maybe make something like a PIF file to load them only when you enter the\n", - "applications that need fonts? Any ideas?\n", - "\n", - "\n", - "Chris\n", - "\n", - " * Origin: chris.doelle.@f3333.n106.z1.fidonet.org (1:106/3333.26)\n", - "\n" - ] - } - ], - "source": [ - "unseen_document = newsgroups_test.data[100]\n", - "print(unseen_document)" - ] - }, - { - "cell_type": "code", - "execution_count": 75, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "# Data preprocessing step for the unseen document\n", - "bow_new = dictionary.doc2bow(preprocess(unseen_document))" - ] - }, - { - "cell_type": "code", - "execution_count": 48, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "from nautilus_nlp.models.topic_modeling import fit_data" - ] - }, - { - "cell_type": "code", - "execution_count": 31, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "[(0, 0.0027796067),\n", - " (1, 0.002779247),\n", - " (2, 0.0027795879),\n", - " (3, 0.0027795406),\n", - " (4, 0.0027792477),\n", - " (5, 0.002779096),\n", - " (6, 0.0027791534),\n", - " (7, 0.20895894),\n", - " (8, 0.76880664),\n", - " (9, 0.0027789928)]" - ] - }, - "execution_count": 31, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "fit_data(model, bow_new)" - ] - }, - { - "cell_type": "code", - "execution_count": 1, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "# Show the dominant topics of the new document and their keywords \n", - "from nautilus_nlp.models.topic_modeling import show_dominant_topic" - ] - }, - { - "cell_type": "code", - "execution_count": 147, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Score: 0.7688832879066467\t Topic: ['window', 'drive', 'problem', 'card', 'work']\n", - "Score: 0.2088821828365326\t Topic: ['file', 'program', 'mail', 'imag', 'inform']\n", - "Score: 0.0027796069625765085\t Topic: ['christian', 'peopl', 'believ', 'jesus', 'say']\n" - ] - } - ], - "source": [ - "show_dominant_topic(model, bow_new, 3)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "collapsed": true - }, - "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.7.1" - }, - "toc": { - "base_numbering": 1, - "nav_menu": {}, - "number_sections": true, - "sideBar": true, - "skip_h1_title": false, - "title_cell": "Table of Contents", - "title_sidebar": "Contents", - "toc_cell": false, - "toc_position": {}, - "toc_section_display": true, - "toc_window_display": false - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} diff --git a/notebooks/5. Topic Modeling - Biterm.ipynb b/notebooks/5. Topic Modeling - Biterm.ipynb deleted file mode 100644 index 243d4a5..0000000 --- a/notebooks/5. Topic Modeling - Biterm.ipynb +++ /dev/null @@ -1,266 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# 5. Topic Modeling - Biterm Model" - ] - }, - { - "cell_type": "code", - "execution_count": 1, - "metadata": {}, - "outputs": [], - "source": [ - "from nautilus_nlp.models.biterm_model import BitermModel\n", - "import pandas as pd" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Step 1: Load the dataset" - ] - }, - { - "cell_type": "code", - "execution_count": 7, - "metadata": {}, - "outputs": [], - "source": [ - "# Input of the model has to be a list of string/documents\n", - "text = ['Cola 1.5L Carrefour',\n", - " 'Pepsi Cola Light 1.5L',\n", - " 'Pepsi Cola Twist Light',\n", - " 'Cola 1.5L CRF DISC',\n", - " 'Coca-Cola Light 1.5L',\n", - " 'Coca-Cola Light 4x0.5L',\n", - " 'Coca-Cola Light 6x0.3L',\n", - " 'Panzani 200g x 4 bio',\n", - " 'Rustichella 150g bio',\n", - " 'De Cecco - Fusilli bio',\n", - " 'Gerblé sans Gluten50g',\n", - " 'Penne de riz 100g sans gluten',\n", - " 'Spaghetti de maïs 50g sans Glute']" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Step 2: Topic Modelling" - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "metadata": {}, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "100%|██████████| 100/100 [00:00<00:00, 123.16it/s]\n" - ] - } - ], - "source": [ - "nb_topics = 5\n", - "nb_word_per_cluster = 5\n", - "nb_iteration = 100\n", - "# Based on sklearn to remove the stop words, can be set up to None\n", - "language = 'english'\n", - "\n", - "biterm_model = BitermModel(data=text\n", - " , nb_topics=nb_topics\n", - " , nb_iteration=nb_iteration\n", - " , lang=language)\n", - "\n", - "clusters = biterm_model.get_clusters(nb_word_per_cluster)" - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "<div>\n", - "<style scoped>\n", - " .dataframe tbody tr th:only-of-type {\n", - " vertical-align: middle;\n", - " }\n", - "\n", - " .dataframe tbody tr th {\n", - " vertical-align: top;\n", - " }\n", - "\n", - " .dataframe thead th {\n", - " text-align: right;\n", - " }\n", - "</style>\n", - "<table border=\"1\" class=\"dataframe\">\n", - " <thead>\n", - " <tr style=\"text-align: right;\">\n", - " <th></th>\n", - " <th>coherence</th>\n", - " <th>top_words</th>\n", - " </tr>\n", - " </thead>\n", - " <tbody>\n", - " <tr>\n", - " <th>0</th>\n", - " <td>3.635635</td>\n", - " <td>[100g, sans, riz, penne, gluten]</td>\n", - " </tr>\n", - " <tr>\n", - " <th>1</th>\n", - " <td>-2.076344</td>\n", - " <td>[disc, 5l, cola, crf, carrefour]</td>\n", - " </tr>\n", - " <tr>\n", - " <th>2</th>\n", - " <td>-0.235566</td>\n", - " <td>[bio, 150g, rustichella, 200g, panzani]</td>\n", - " </tr>\n", - " <tr>\n", - " <th>3</th>\n", - " <td>2.537023</td>\n", - " <td>[sans, spaghetti, 50g, maïs, glute]</td>\n", - " </tr>\n", - " <tr>\n", - " <th>4</th>\n", - " <td>-5.198056</td>\n", - " <td>[cola, light, 5l, coca, pepsi]</td>\n", - " </tr>\n", - " </tbody>\n", - "</table>\n", - "</div>" - ], - "text/plain": [ - " coherence top_words\n", - "0 3.635635 [100g, sans, riz, penne, gluten]\n", - "1 -2.076344 [disc, 5l, cola, crf, carrefour]\n", - "2 -0.235566 [bio, 150g, rustichella, 200g, panzani]\n", - "3 2.537023 [sans, spaghetti, 50g, maïs, glute]\n", - "4 -5.198056 [cola, light, 5l, coca, pepsi]" - ] - }, - "execution_count": 4, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "pd.DataFrame(clusters)" - ] - }, - { - "cell_type": "code", - "execution_count": 5, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "text: Cola 1.5L Carrefour\n", - "cluster indice: 1\n" - ] - } - ], - "source": [ - "# To get the cluster index of one document\n", - "index = 0\n", - "cluster_index = biterm_model.get_document_topic(index=index)\n", - "\n", - "print(\"text:\", text[index])\n", - "print(\"cluster index:\", cluster_index)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Step 3: Viz" - ] - }, - { - "cell_type": "code", - "execution_count": 6, - "metadata": {}, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "/anaconda3/lib/python3.7/site-packages/pyLDAvis/_prepare.py:257: FutureWarning: Sorting because non-concatenation axis is not aligned. A future version\n", - "of pandas will change to not sort by default.\n", - "\n", - "To accept the future behavior, pass 'sort=False'.\n", - "\n", - "To retain the current behavior and silence the warning, pass 'sort=True'.\n", - "\n", - " return pd.concat([default_term_info] + list(topic_dfs))\n" - ] - } - ], - "source": [ - "output_path = './biterm_pyLDAavis_plot.html'\n", - "biterm_model.save_pyLDAvis_plot_as_html(output_path)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [] - }, - { - "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.7.1" - }, - "toc": { - "base_numbering": 1, - "nav_menu": {}, - "number_sections": true, - "sideBar": true, - "skip_h1_title": false, - "title_cell": "Table of Contents", - "title_sidebar": "Contents", - "toc_cell": false, - "toc_position": {}, - "toc_section_display": true, - "toc_window_display": false - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} diff --git a/notebooks/6. Topic Modeling - short text.ipynb b/notebooks/6. Topic Modeling - short text.ipynb deleted file mode 100644 index e6b7417..0000000 --- a/notebooks/6. Topic Modeling - short text.ipynb +++ /dev/null @@ -1,312 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Topic modeling for short text\n" - ] - }, - { - "cell_type": "code", - "execution_count": 1, - "metadata": {}, - "outputs": [], - "source": [ - "from nautilus_nlp.models.topic_modeling_short_text import *\n" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Data Preparation " - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "It is possible to use Nautilus functions to clean and preprocess raw text. The ouput of the cleaning process should be a list of sentences (strings). " - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "metadata": {}, - "outputs": [], - "source": [ - "text = ['Cola 1.5L Carrefour',\n", - " 'Pepsi Cola Light 1.5L',\n", - " 'Pepsi Cola Twist Light',\n", - " 'Cola 1.5L CRF DISC',\n", - " 'Coca-Cola Light 1.5L',\n", - " 'Coca-Cola Light 4x0.5L',\n", - " 'Coca-Cola Light 6x0.3L',\n", - " 'Panzani 200g x 4 bio',\n", - " 'Rustichella 150g bio',\n", - " 'De Cecco - Fusilli bio',\n", - " 'Gerblé sans Gluten50g',\n", - " 'Penne de riz 100g sans gluten',\n", - " 'Spaghetti de maïs 50g sans Glute']\n", - "\n", - "encoded_text_id, vocab_list, vocab_arr = prepare_data(text)" - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "[['1.5L', 4],\n", - " ['Coca-Cola', 3],\n", - " ['Cola', 4],\n", - " ['Light', 5],\n", - " ['Pepsi', 2],\n", - " ['bio', 3],\n", - " ['de', 2],\n", - " ['sans', 3]]" - ] - }, - "execution_count": 3, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "vocab_arr" - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "[[2, 0], [4, 2, 3, 0], [4, 2, 3], [2, 0], [1, 3, 0], [1, 3], [1, 3], [5], [5], [5], [7], [6, 7], [6, 7]]\n", - "[[2, 0], [4, 2, 3, 0], [4, 2, 3], [2, 0], [1, 3, 0], [1, 3], [1, 3], [5], [5], [5], [7], [6, 7], [6, 7]]\n", - "[['1.5L', 4], ['Coca-Cola', 3], ['Cola', 4], ['Light', 5], ['Pepsi', 2], ['bio', 3], ['de', 2], ['sans', 3]]\n" - ] - } - ], - "source": [ - "print(encoded_text_id)\n", - "print(encoded_text_id)\n", - "print(vocab_arr)\n" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Train the NMF model" - ] - }, - { - "cell_type": "code", - "execution_count": 9, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "loop begin\n", - "Step=0, Loss=5.91164999713721, Time=0.0003788471221923828s\n", - "Step=1, Loss=4.985359112354993, Time=0.0023560523986816406s\n", - "Step=2, Loss=4.323260756623319, Time=0.0044097900390625s\n", - "Step=3, Loss=4.021169618891115, Time=0.005792856216430664s\n", - "Step=4, Loss=3.9201702703506403, Time=0.006429910659790039s\n", - "loop end\n" - ] - } - ], - "source": [ - "x = train_nmf_model(encoded_text_id, vocab_list, n_topics= 3)\n" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Get keywords description of the topics\n" - ] - }, - { - "cell_type": "code", - "execution_count": 6, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "topic 2 : Pmi: 0.22768662780017118 ['1.5L', 'Cola', 'Pepsi', 'Light', 'bio']\n", - "topic 0 : Pmi: 0.42152248372930645 ['Light', 'Pepsi', 'sans', 'Cola', 'de']\n", - "topic 1 : Pmi: 0.4373829867469703 ['Coca-Cola', 'Light', '1.5L', 'sans', 'de']\n" - ] - } - ], - "source": [ - "topics, pmi_score = show_dominant_topic(x, encoded_text_id, vocab_list, n_topKeyword =5)\n", - "\n", - "\n", - "for t in topics.keys():\n", - " print('topic', t,': Pmi:', pmi_score[t], topics[t])\n", - " \n" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Assign topics to sentences" - ] - }, - { - "cell_type": "code", - "execution_count": 7, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "[3, 3, 1, 3, 2, 2, 2, 3, 3, 3, 1, 1, 1]\n", - "topic 3 ---> Cola 1.5L Carrefour\n", - "topic 3 ---> Pepsi Cola Light 1.5L\n", - "topic 1 ---> Pepsi Cola Twist Light\n", - "topic 3 ---> Cola 1.5L CRF DISC\n", - "topic 2 ---> Coca-Cola Light 1.5L\n", - "topic 2 ---> Coca-Cola Light 4x0.5L\n", - "topic 2 ---> Coca-Cola Light 6x0.3L\n", - "topic 3 ---> Panzani 200g x 4 bio\n", - "topic 3 ---> Rustichella 150g bio\n", - "topic 3 ---> De Cecco - Fusilli bio\n", - "topic 1 ---> Gerblé sans Gluten50g\n", - "topic 1 ---> Penne de riz 100g sans gluten\n", - "topic 1 ---> Spaghetti de maïs 50g sans Glute\n" - ] - } - ], - "source": [ - "list_of_topics= get_assigned_topics(x)\n", - "print(list_of_topics)\n", - "\n", - "for i in range(len(list_of_topics)) : \n", - " print('topic ', list_of_topics[i],'--->',text[i])" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Plot topics with pyldavis" - ] - }, - { - "cell_type": "code", - "execution_count": 8, - "metadata": {}, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "/Users/kaislaribi/anaconda3/envs/DataScience/lib/python3.7/site-packages/pyLDAvis/_prepare.py:257: FutureWarning: Sorting because non-concatenation axis is not aligned. A future version\n", - "of pandas will change to not sort by default.\n", - "\n", - "To accept the future behavior, pass 'sort=False'.\n", - "\n", - "To retain the current behavior and silence the warning, pass 'sort=True'.\n", - "\n", - " return pd.concat([default_term_info] + list(topic_dfs))\n" - ] - }, - { - "data": { - "text/html": [ - "\n", - "<link rel=\"stylesheet\" type=\"text/css\" href=\"https://cdn.rawgit.com/bmabey/pyLDAvis/files/ldavis.v1.0.0.css\">\n", - "\n", - "\n", - "<div id=\"ldavis_el973044658186304304441590\"></div>\n", - "<script type=\"text/javascript\">\n", - "\n", - "var ldavis_el973044658186304304441590_data = {\"mdsDat\": {\"x\": [-0.07207828005578075, -0.27085879991560496, 0.3429370799713856], \"y\": [-0.28854072014416055, 0.19509552731956145, 0.09344519282459897], \"topics\": [1, 2, 3], \"cluster\": [1, 1, 1], \"Freq\": [40.10719756781703, 35.155302123790236, 24.73750030839274]}, \"tinfo\": {\"Category\": [\"Default\", \"Default\", \"Default\", \"Default\", \"Default\", \"Default\", \"Default\", \"Default\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic1\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic2\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\", \"Topic3\"], \"Freq\": [9.0, 9.0, 10.0, 6.0, 9.0, 9.0, 10.0, 7.0, 10.427871367632429, 8.486483566091643, 7.272729095695264, 1.2006516108182672, 0.41204790158952415, 6.421558091596925e-20, 5.013797446678124e-20, 2.4883131435107527e-20, 9.14037855218546, 9.14037855218546, 8.087967197531219, 4.1120406489053, 2.76558788795799, 1.253310853243789e-18, 3.2243865698780584e-20, 2.5201191342509088e-20, 6.431750080182113, 3.2841126876287086, 1.1974180259819893, 5.98670235584042e-19, 3.97476403756747e-20, 3.103399751032683e-20, 1.6274775761634947e-20, 1.153801355593048e-20], \"Term\": [\"de\", \"sans\", \"bio\", \"Coca-Cola\", \"Pepsi\", \"1.5L\", \"Cola\", \"Light\", \"bio\", \"1.5L\", \"Cola\", \"Pepsi\", \"Light\", \"de\", \"sans\", \"Coca-Cola\", \"sans\", \"de\", \"Pepsi\", \"Light\", \"Cola\", \"bio\", \"Coca-Cola\", \"1.5L\", \"Coca-Cola\", \"Light\", \"1.5L\", \"bio\", \"de\", \"sans\", \"Pepsi\", \"Cola\"], \"Total\": [9.0, 9.0, 10.0, 6.0, 9.0, 9.0, 10.0, 7.0, 10.427871367632429, 9.683901592073632, 10.038316983653253, 9.288618808349486, 7.808201238123532, 9.14037855218546, 9.14037855218546, 6.431750080182113, 9.14037855218546, 9.14037855218546, 9.288618808349486, 7.808201238123532, 10.038316983653253, 10.427871367632429, 6.431750080182113, 9.683901592073632, 6.431750080182113, 7.808201238123532, 9.683901592073632, 10.427871367632429, 9.14037855218546, 9.14037855218546, 9.288618808349486, 10.038316983653253], \"loglift\": [8.0, 7.0, 6.0, 5.0, 4.0, 3.0, 2.0, 1.0, 1.9316, 1.7996, 1.6093, -0.1143, -1.0102, -44.4731, -44.7206, -45.0697, 2.0634, 2.0634, 1.925, 1.4221, 0.7742, -41.5018, -44.6788, -45.3345, 2.4149, 1.5488, 0.3246, -41.8892, -44.4696, -44.717, -45.3786, -45.8002], \"logprob\": [8.0, 7.0, 6.0, 5.0, 4.0, 3.0, 2.0, 1.0, 0.0, -0.206, -0.3604, -2.1616, -3.2311, -46.5365, -46.784, -47.4846, 0.0, 0.0, -0.1223, -0.7988, -1.1954, -43.4334, -47.0937, -47.3401, 0.0, -0.6722, -1.6811, -43.8208, -46.533, -46.7805, -47.4259, -47.7699]}, \"token.table\": {\"Topic\": [1, 3, 3, 1, 2, 2, 3, 1, 2, 1, 2, 2], \"Freq\": [0.8261133102124952, 0.1032641637765619, 0.9328720682862902, 0.6973280492535796, 0.2988548782515341, 0.5122818787597335, 0.3842114090698001, 0.10765863263772928, 0.8612690611018342, 0.9589684843101806, 0.984641932346238, 0.984641932346238], \"Term\": [\"1.5L\", \"1.5L\", \"Coca-Cola\", \"Cola\", \"Cola\", \"Light\", \"Light\", \"Pepsi\", \"Pepsi\", \"bio\", \"de\", \"sans\"]}, \"R\": 8, \"lambda.step\": 0.01, \"plot.opts\": {\"xlab\": \"PC1\", \"ylab\": \"PC2\"}, \"topic.order\": [3, 1, 2]};\n", - "\n", - "function LDAvis_load_lib(url, callback){\n", - " var s = document.createElement('script');\n", - " s.src = url;\n", - " s.async = true;\n", - " s.onreadystatechange = s.onload = callback;\n", - " s.onerror = function(){console.warn(\"failed to load library \" + url);};\n", - " document.getElementsByTagName(\"head\")[0].appendChild(s);\n", - "}\n", - "\n", - "if(typeof(LDAvis) !== \"undefined\"){\n", - " // already loaded: just create the visualization\n", - " !function(LDAvis){\n", - " new LDAvis(\"#\" + \"ldavis_el973044658186304304441590\", ldavis_el973044658186304304441590_data);\n", - " }(LDAvis);\n", - "}else if(typeof define === \"function\" && define.amd){\n", - " // require.js is available: use it to load d3/LDAvis\n", - " require.config({paths: {d3: \"https://cdnjs.cloudflare.com/ajax/libs/d3/3.5.5/d3.min\"}});\n", - " require([\"d3\"], function(d3){\n", - " window.d3 = d3;\n", - " LDAvis_load_lib(\"https://cdn.rawgit.com/bmabey/pyLDAvis/files/ldavis.v1.0.0.js\", function(){\n", - " new LDAvis(\"#\" + \"ldavis_el973044658186304304441590\", ldavis_el973044658186304304441590_data);\n", - " });\n", - " });\n", - "}else{\n", - " // require.js not available: dynamically load d3 & LDAvis\n", - " LDAvis_load_lib(\"https://cdnjs.cloudflare.com/ajax/libs/d3/3.5.5/d3.min.js\", function(){\n", - " LDAvis_load_lib(\"https://cdn.rawgit.com/bmabey/pyLDAvis/files/ldavis.v1.0.0.js\", function(){\n", - " new LDAvis(\"#\" + \"ldavis_el973044658186304304441590\", ldavis_el973044658186304304441590_data);\n", - " })\n", - " });\n", - "}\n", - "</script>" - ], - "text/plain": [ - "<IPython.core.display.HTML object>" - ] - }, - "execution_count": 8, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "show_pyldavis(x, encoded_text_id, vocab_arr)\n" - ] - } - ], - "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.7.3" - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} diff --git a/notebooks/Benchmark text processing tools.ipynb b/notebooks/Benchmark text processing tools.ipynb deleted file mode 100644 index 14b08ff..0000000 --- a/notebooks/Benchmark text processing tools.ipynb +++ /dev/null @@ -1,876 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Text processing tools benchmark" - ] - }, - { - "cell_type": "code", - "execution_count": 1, - "metadata": {}, - "outputs": [], - "source": [ - "from urllib import request" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Load french text" - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "metadata": {}, - "outputs": [], - "source": [ - "url = \"https://www.gutenberg.org/cache/epub/5711/pg5711.txt\"" - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "metadata": {}, - "outputs": [], - "source": [ - "response = request.urlopen(url)\n", - "rawfr = response.read().decode('utf8')" - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "The Project Gutenberg EBook of Germinal, by Emile Zola\r\n", - "(#8 in our series by Emile Zola)\r\n", - "\r\n", - "Copyright laws are changing all over the world. Be sure to check the\r\n", - "copyright laws for your country before downloading or redistributing\r\n", - "this or any other Project Gutenberg eBook.\r\n", - "\r\n", - "This header should be the first thing seen when viewing this Project\r\n", - "Gutenberg file. Please do not remove it. Do not change or edit the\r\n", - "header without written permission.\r\n", - "\r\n", - "Please read the \"legal small print,\" and ot\n" - ] - } - ], - "source": [ - "print(rawfr[:500])" - ] - }, - { - "cell_type": "code", - "execution_count": 5, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "str" - ] - }, - "execution_count": 5, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "type(rawfr)" - ] - }, - { - "cell_type": "code", - "execution_count": 6, - "metadata": { - "scrolled": true - }, - "outputs": [ - { - "data": { - "text/plain": [ - "1046377" - ] - }, - "execution_count": 6, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "len(rawfr)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Load english text" - ] - }, - { - "cell_type": "code", - "execution_count": 7, - "metadata": {}, - "outputs": [], - "source": [ - "url = \"http://www.gutenberg.org/files/2554/2554-0.txt\"" - ] - }, - { - "cell_type": "code", - "execution_count": 8, - "metadata": {}, - "outputs": [], - "source": [ - "response = request.urlopen(url)\n", - "raw = response.read().decode('utf8')" - ] - }, - { - "cell_type": "code", - "execution_count": 9, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "The Project Gutenberg EBook of Crime and Punishment, by Fyodor Dostoevsky\r\n", - "\r\n", - "This eBook is for the use of anyone anywhere at no cost and with\r\n", - "almost no restrictions whatsoever. You may copy it, give it away or\r\n", - "re-use it under the terms of the Project Gutenberg License included\r\n", - "with this eBook or online at www.gutenberg.org\r\n", - "\r\n", - "\r\n", - "Title: Crime and Punishment\r\n", - "\r\n", - "Author: Fyodor Dostoevsky\r\n", - "\r\n", - "Release Date: March 28, 2006 [EBook #2554]\r\n", - "Last Updated: October 27, 2016\r\n", - "\r\n", - "Language: English\r\n", - "\r\n", - "Charac\n" - ] - } - ], - "source": [ - "print(raw[:500])" - ] - }, - { - "cell_type": "code", - "execution_count": 10, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "str" - ] - }, - "execution_count": 10, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "type(raw)" - ] - }, - { - "cell_type": "code", - "execution_count": 11, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "1176967" - ] - }, - "execution_count": 11, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "len(raw)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Tokenization\n", - "\n", - "Several tokenizers are available. As you will see bellow, spaCy is much faster than the other implementations (Moses, NLTK) and often return better results. " - ] - }, - { - "cell_type": "code", - "execution_count": 12, - "metadata": {}, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "[nltk_data] Downloading package punkt to /root/nltk_data...\n", - "[nltk_data] Package punkt is already up-to-date!\n" - ] - } - ], - "source": [ - "from nautilus_nlp.preprocessing.tokenizer import tokenize, untokenize" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### French spaCy" - ] - }, - { - "cell_type": "code", - "execution_count": 13, - "metadata": { - "scrolled": true - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "CPU times: user 1.84 s, sys: 84.1 ms, total: 1.93 s\n", - "Wall time: 1.93 s\n" - ] - } - ], - "source": [ - "%%time\n", - "tokenized = tokenize(rawfr[:1000000], lang_module=\"fr_spacy\")" - ] - }, - { - "cell_type": "code", - "execution_count": 14, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "768 ms ± 12.7 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)\n" - ] - } - ], - "source": [ - "%%timeit\n", - "tokenized = tokenize(rawfr[:1000000], lang_module=\"fr_spacy\")" - ] - }, - { - "cell_type": "code", - "execution_count": 18, - "metadata": {}, - "outputs": [], - "source": [ - "tokenized = tokenize(rawfr[:1000000], lang_module=\"fr_spacy\")" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### French Moses" - ] - }, - { - "cell_type": "code", - "execution_count": 15, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "CPU times: user 15.6 s, sys: 18.9 ms, total: 15.6 s\n", - "Wall time: 15.6 s\n" - ] - } - ], - "source": [ - "%%time\n", - "tokenized_moses = tokenize(rawfr[:1000000], lang_module=\"fr_moses\")" - ] - }, - { - "cell_type": "code", - "execution_count": 19, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "1.78 s ± 45.2 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)\n" - ] - } - ], - "source": [ - "%%timeit\n", - "tokenized_moses = tokenize(rawfr[:1000000], lang_module=\"fr_moses\")" - ] - }, - { - "cell_type": "code", - "execution_count": 22, - "metadata": {}, - "outputs": [], - "source": [ - "tokenized_moses = tokenize(rawfr[:1000000], lang_module=\"fr_moses\")" - ] - }, - { - "cell_type": "code", - "execution_count": 23, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "spacy: 227009 tokens\n", - "moses: 202475 tokens\n" - ] - } - ], - "source": [ - "print('spacy: {} tokens\\nmoses: {} tokens'.format(len(tokenized),len(tokenized_moses)))" - ] - }, - { - "cell_type": "code", - "execution_count": 24, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "['se', 'diriger', 'vers', 'les', '\\r\\n', 'bâtiments', ',', 'il', 'se', 'risqua', 'enfin', 'à', 'gravir', 'le', 'terri', 'sur', 'lequel', 'brûlaient', '\\r\\n', 'les', 'trois', 'feux', 'de', 'houille', ',', 'dans', 'des', 'corbeilles', 'de', 'fonte', ',', 'pour', 'éclairer', '\\r\\n', 'et', 'réchauffer', 'la', 'besogne', '.', ' ', 'Les', 'ouvriers', 'de', 'la', 'coupe', 'à', 'terre', 'avaient', 'dû', '\\r\\n', 'travailler', 'tard', ',', 'on', 'sortait', 'encore', 'les', 'débris', 'inutiles', '.', ' ', 'Maintenant', ',', '\\r\\n', 'il', 'entendait', 'les', 'moulineurs', 'pousser', 'les', 'trains', 'sur', 'les', 'tréteaux', ',', 'il', '\\r\\n', 'distinguait', 'des', 'ombres', 'vivantes', 'culbutant', 'les', 'berlines', ',', 'près', 'de', 'chaque', '\\r\\n', 'feu', '.', '\\r\\n\\r\\n', '--Bonjour', ',', 'dit', '-', 'il', 'en', \"s'\", 'approchant', \"d'\", 'une', 'des', 'corbeilles', '.', '\\r\\n\\r\\n', 'Tournant', 'le', 'dos', 'au', 'brasier', ',', 'le', 'charretier', 'était', 'debout', ',', 'un', 'vieillard', '\\r\\n', 'vêtu', \"d'\", 'un', 'tricot', 'de', 'laine', 'violette', ',', 'coiffé', \"d'\", 'une', 'casquette', 'en', 'poil', 'de', '\\r\\n', 'lapin', ';', 'pendant', 'que', 'son', 'cheval', ',', 'un', 'gros', 'cheval', 'jaune', ',', 'attendait', ',', 'dans', '\\r\\n', 'une', 'immobilité', 'de', 'pierre', ',', \"qu'\", 'on', 'eût', 'vidé', 'les', 'six', 'berlines', 'montées', 'par', '\\r\\n', 'lui', '.', ' ', 'Le', 'manoeuvre', 'employé', 'au', 'culbuteur', ',', 'un', 'gaillard', 'roux', 'et', '\\r\\n', 'efflanqué', ',', 'ne', 'se', 'pressait', 'guère', ',', 'pesait', 'sur', 'le', 'levier', \"d'\", 'une', 'main', '\\r\\n', 'endormie', '.', ' ', 'Et']\n" - ] - } - ], - "source": [ - "print(tokenized[1000:1200])" - ] - }, - { - "cell_type": "code", - "execution_count": 25, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "['le', 'dos', 'au', 'brasier', ',', 'le', 'charretier', 'était', 'debout', ',', 'un', 'vieillard', 'vêtu', \"d'\", 'un', 'tricot', 'de', 'laine', 'violette', ',', 'coiffé', \"d'\", 'une', 'casquette', 'en', 'poil', 'de', 'lapin', ';', 'pendant', 'que', 'son', 'cheval', ',', 'un', 'gros', 'cheval', 'jaune', ',', 'attendait', ',', 'dans', 'une', 'immobilité', 'de', 'pierre', ',', \"qu'\", 'on', 'eût', 'vidé', 'les', 'six', 'berlines', 'montées', 'par', 'lui', '.', 'Le', 'manoeuvre', 'employé', 'au', 'culbuteur', ',', 'un', 'gaillard', 'roux', 'et', 'efflanqué', ',', 'ne', 'se', 'pressait', 'guère', ',', 'pesait', 'sur', 'le', 'levier', \"d'\", 'une', 'main', 'endormie', '.', 'Et', ',', 'là-haut', ',', 'le', 'vent', 'redoublait', ',', 'une', 'bise', 'glaciale', ',', 'dont', 'les', 'grandes', 'haleines', 'régulières', 'passaient', 'comme', 'des', 'coups', 'de', 'faux', '.', '--Bonjour', ',', 'répondit', 'le', 'vieux', '.', 'Un', 'silence', 'se', 'fit', '.', \"L'\", 'homme', ',', 'qui', 'se', 'sentait', 'regardé', \"d'\", 'un', 'oeil', 'méfiant', ',', 'dit', 'son', 'nom', 'tout', 'de', 'suite', '.', '--Je', 'me', 'nomme', 'Étienne', 'Lantier', ',', 'je', 'suis', 'machineur', '...', 'Il', \"n'\", 'y', 'a', 'pas', 'de', 'travail', 'ici', '?', 'Les', 'flammes', \"l'\", 'éclairaient', ',', 'il', 'devait', 'avoir', 'vingt', 'et', 'un', 'ans', ',', 'très', 'brun', ',', 'joli', 'homme', ',', \"l'\", 'air', 'fort', 'malgré', 'ses', 'membres', 'menus', '.', 'Rassuré', ',', 'le', 'charretier', 'hochait', 'la', 'tête', '.', '--Du', 'travail', 'pour', 'un', 'machineur', ',', 'non', ',']\n" - ] - } - ], - "source": [ - "print(tokenized_moses[1000:1200])" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### English spaCy" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "%%time\n", - "tokenized_eng = tokenize(raw[:1000000], lang_module=\"en_spacy\")" - ] - }, - { - "cell_type": "code", - "execution_count": 33, - "metadata": {}, - "outputs": [], - "source": [ - "tokenized_eng = tokenize(raw[:1000000], lang_module=\"en_spacy\")" - ] - }, - { - "cell_type": "code", - "execution_count": 34, - "metadata": { - "scrolled": true - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "260 ms ± 1.28 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)\n" - ] - } - ], - "source": [ - "%%timeit\n", - "tokenize(raw[:1000000], lang_module=\"en_spacy\")" - ] - }, - { - "cell_type": "code", - "execution_count": 35, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "['\\ufeffThe',\n", - " 'Project',\n", - " 'Gutenberg',\n", - " 'EBook',\n", - " 'of',\n", - " 'Crime',\n", - " 'and',\n", - " 'Punishment',\n", - " ',',\n", - " 'by']" - ] - }, - "execution_count": 35, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "tokenized_eng[:10]" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### English NLTK " - ] - }, - { - "cell_type": "code", - "execution_count": 30, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "CPU times: user 1.56 s, sys: 28 ms, total: 1.58 s\n", - "Wall time: 1.58 s\n" - ] - } - ], - "source": [ - "%%time\n", - "tokenized_eng_nltk = tokenize(raw[:1000000], lang_module=\"en_nltk\")" - ] - }, - { - "cell_type": "code", - "execution_count": 36, - "metadata": {}, - "outputs": [], - "source": [ - "tokenized_eng_nltk = tokenize(raw[:1000000], lang_module=\"en_nltk\")" - ] - }, - { - "cell_type": "code", - "execution_count": 31, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "1.54 s ± 27.9 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)\n" - ] - } - ], - "source": [ - "%%timeit\n", - "tokenize(raw[:1000000], lang_module=\"en_nltk\")" - ] - }, - { - "cell_type": "code", - "execution_count": 37, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "['\\ufeffThe',\n", - " 'Project',\n", - " 'Gutenberg',\n", - " 'EBook',\n", - " 'of',\n", - " 'Crime',\n", - " 'and',\n", - " 'Punishment',\n", - " ',',\n", - " 'by']" - ] - }, - "execution_count": 37, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "tokenized_eng_nltk[:10]" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Stemming " - ] - }, - { - "cell_type": "code", - "execution_count": 38, - "metadata": {}, - "outputs": [], - "source": [ - "from nautilus_nlp.preprocessing.stemming import stem_tokens" - ] - }, - { - "cell_type": "code", - "execution_count": 39, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "CPU times: user 4.19 s, sys: 20 ms, total: 4.21 s\n", - "Wall time: 4.21 s\n" - ] - } - ], - "source": [ - "%%time\n", - "stem = stem_tokens(tokenized,lang='french')" - ] - }, - { - "cell_type": "code", - "execution_count": 40, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "4.25 s ± 61.5 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)\n" - ] - } - ], - "source": [ - "%%timeit\n", - "stem_tokens(tokenized,lang='french')" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Lemmatization" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## French " - ] - }, - { - "cell_type": "code", - "execution_count": 41, - "metadata": {}, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "[nltk_data] Downloading package wordnet to /root/nltk_data...\n", - "[nltk_data] Package wordnet is already up-to-date!\n", - "[nltk_data] Downloading package averaged_perceptron_tagger to\n", - "[nltk_data] /root/nltk_data...\n", - "[nltk_data] Package averaged_perceptron_tagger is already up-to-\n", - "[nltk_data] date!\n" - ] - } - ], - "source": [ - "from nautilus_nlp.preprocessing.lemmatization import lemmatize_french_tokens" - ] - }, - { - "cell_type": "code", - "execution_count": 42, - "metadata": {}, - "outputs": [], - "source": [ - "from nautilus_nlp.preprocessing.preprocess import remove_tokens_with_nonletters" - ] - }, - { - "cell_type": "code", - "execution_count": 43, - "metadata": { - "scrolled": true - }, - "outputs": [], - "source": [ - "tokenized = remove_tokens_with_nonletters(tokenized)" - ] - }, - { - "cell_type": "code", - "execution_count": 46, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "CPU times: user 21.9 s, sys: 8.62 s, total: 30.6 s\n", - "Wall time: 30.6 s\n" - ] - } - ], - "source": [ - "%%time\n", - "lemmatized_tokens = lemmatize_french_tokens(tokenized, module='spacy')" - ] - }, - { - "cell_type": "code", - "execution_count": 47, - "metadata": {}, - "outputs": [], - "source": [ - "lemmatized_tokens = lemmatize_french_tokens(tokenized, module='spacy')" - ] - }, - { - "cell_type": "code", - "execution_count": 48, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "['de', 'puits', 'le', 'vaste', 'chambre', 'de', 'le', 'machine', 'extraction', 'le', 'tourelle', 'de', 'le', 'pompe', 'ce', 'fosse', 'au', 'fondre', 'un', 'creux', 'avec', 'son', 'construction', 'trapu', 'de', 'brique', 'dresser', 'son', 'comme', 'un', 'corne', 'luire', 'sembler', 'avoir', 'un', 'air', 'mauver', 'de', 'goulu', 'accroupie', 'pour', 'manger', 'le', 'monde', 'tout', 'en', 'examiner', 'il', 'songer', 'luire', 'son', 'existence', 'de', 'vagabond', 'depuis', 'huit', 'jour', 'il', 'chercher', 'un', 'place', 'il', 'se', 'revoir', 'dans', 'son', 'atelier', 'de', 'chemin', 'de', 'fer', 'gifler', 'son', 'chef', 'de', 'Lille', 'de', 'partout', 'le', 'samedi', 'il', 'Marchiennes', 'on', 'dire', 'il', 'y', 'avoir', 'de', 'travail', 'aux', 'Forges', 'et', 'rien', 'ni', 'aux', 'Forges', 'ni', 'chez', 'Sonneville', 'il', 'avoir', 'passer', 'le', 'dimanche', 'sou', 'le', 'bois', 'un', 'chantier', 'de', 'charronnage', 'dont', 'le', 'surveillant', 'venir', 'de', 'expulser', 'deux', 'heure', 'de', 'le', 'nuit', 'Rien', 'plus', 'un', 'sou', 'pas', 'un', 'aller', 'il', 'faire', 'ainsi', 'par', 'le', 'chemin', 'sans', 'but', 'ne', 'savoir', 'seulement', 'abriter', 'contre', 'le', 'bise', 'oui', 'bien', 'un', 'fosse', 'le', 'rare', 'lanterne', 'le', 'carreau', 'un', 'porte', 'brusquement', 'ouvrir', 'luire', 'avoir', 'permettre', 'entrevoir', 'le', 'foyer', 'un', 'dans', 'un', 'vive', 'il', 'expliquer', 'de', 'le', 'pompe', 'ce', 'respiration', 'gros', 'et', 'long', 'souffler', 'sans', 'qui', 'comme', 'halein', 'de', 'monstre', 'le', 'manoeuvre', 'de', 'culbuteur', 'gonfler', 'le', 'dos', 'avoir', 'pas', 'le', 'oeil', 'sur', 'et', 'celui', 'ci', 'aller']\n" - ] - } - ], - "source": [ - "print(lemmatized_tokens[1000:1200])" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## English" - ] - }, - { - "cell_type": "code", - "execution_count": 49, - "metadata": { - "scrolled": true - }, - "outputs": [], - "source": [ - "from nautilus_nlp.preprocessing.lemmatization import lemmatize_english_tokens" - ] - }, - { - "cell_type": "code", - "execution_count": 50, - "metadata": {}, - "outputs": [], - "source": [ - "tokenized_eng = remove_tokens_with_nonletters(tokenized_eng)" - ] - }, - { - "cell_type": "code", - "execution_count": 51, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "CPU times: user 24.3 s, sys: 11.3 s, total: 35.6 s\n", - "Wall time: 35.6 s\n" - ] - } - ], - "source": [ - "%%time\n", - "lemmatized_eng = lemmatize_english_tokens(tokenized_eng, module='spacy')" - ] - }, - { - "cell_type": "code", - "execution_count": 52, - "metadata": {}, - "outputs": [], - "source": [ - "lemmatized_eng = lemmatize_english_tokens(tokenized_eng, module='spacy')" - ] - }, - { - "cell_type": "code", - "execution_count": 53, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "CPU times: user 20.5 s, sys: 706 ms, total: 21.2 s\n", - "Wall time: 21.1 s\n" - ] - } - ], - "source": [ - "%%time\n", - "lemmatized_eng_nltk = lemmatize_english_tokens(tokenized_eng, module='nltk')" - ] - }, - { - "cell_type": "code", - "execution_count": 54, - "metadata": {}, - "outputs": [], - "source": [ - "lemmatized_eng_nltk = lemmatize_english_tokens(tokenized_eng, module='nltk')" - ] - }, - { - "cell_type": "code", - "execution_count": 55, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "['feel', 'ashamed', 'He', 'was', 'hopelessly', 'in', 'debt', 'to', 'his', 'landlady', 'and', 'was', 'afraid', 'of', 'meeting', 'her', 'This', 'was', 'not', 'because', 'he', 'was', 'cowardly', 'and', 'abject', 'quite', 'the', 'contrary', 'but', 'for', 'some', 'time', 'past', 'he', 'had', 'been', 'in', 'an', 'overstrained', 'irritable', 'condition', 'verging', 'on', 'hypochondria', 'He', 'had', 'become', 'so', 'completely', 'absorbed', 'in', 'himself', 'and', 'isolated', 'from', 'his', 'fellows', 'that', 'he', 'dreaded', 'meeting', 'not', 'only', 'his', 'landlady', 'but', 'anyone', 'at', 'all', 'He', 'was', 'crushed', 'by', 'poverty', 'but', 'the', 'anxieties', 'of', 'his', 'position', 'had', 'of', 'late', 'ceased', 'to', 'weigh', 'upon', 'him', 'He', 'had', 'given', 'up', 'attending', 'to', 'matters', 'of', 'practical', 'importance', 'he', 'had', 'lost', 'all', 'desire', 'to', 'do', 'so', 'Nothing', 'that', 'any', 'landlady', 'could', 'do', 'had', 'a', 'real', 'terror', 'for', 'him', 'But', 'to', 'be', 'stopped', 'on', 'the', 'stairs', 'to', 'be', 'forced', 'to', 'listen', 'to', 'her', 'trivial', 'irrelevant', 'gossip', 'to', 'pestering', 'demands', 'for', 'payment', 'threats', 'and', 'complaints', 'and', 'to', 'rack', 'his', 'brains', 'for', 'excuses', 'to', 'prevaricate', 'to', 'lie', 'no', 'rather', 'than', 'that', 'he', 'would', 'creep', 'down', 'the', 'stairs', 'like', 'a', 'cat', 'and', 'slip', 'out', 'unseen', 'This', 'evening', 'however', 'on', 'coming', 'out', 'into', 'the', 'street', 'he', 'became', 'acutely', 'aware', 'of', 'his', 'fears', 'I', 'want', 'to', 'attempt', 'a', 'thing', 'like', 'that', 'and', 'am', 'frightened', 'by', 'these']\n" - ] - } - ], - "source": [ - "print(tokenized_eng[1000:1200])" - ] - }, - { - "cell_type": "code", - "execution_count": 56, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "['feel', 'ashamed', '-PRON-', 'be', 'hopelessly', 'in', 'debt', 'to', '-PRON-', 'landlady', 'and', 'be', 'afraid', 'of', 'meet', '-PRON-', 'This', 'be', 'not', 'because', '-PRON-', 'be', 'cowardly', 'and', 'abject', 'quite', 'the', 'contrary', 'but', 'for', 'some', 'time', 'past', '-PRON-', 'have', 'be', 'in', 'an', 'overstrained', 'irritable', 'condition', 'verge', 'on', 'hypochondria', '-PRON-', 'have', 'become', 'so', 'completely', 'absorb', 'in', '-PRON-', 'and', 'isolate', 'from', '-PRON-', 'fellow', 'that', '-PRON-', 'dread', 'meeting', 'not', 'only', '-PRON-', 'landlady', 'but', 'anyone', 'at', 'all', '-PRON-', 'be', 'crush', 'by', 'poverty', 'but', 'the', 'anxiety', 'of', '-PRON-', 'position', 'have', 'of', 'late', 'cease', 'to', 'weigh', 'upon', '-PRON-', '-PRON-', 'have', 'give', 'up', 'attend', 'to', 'matter', 'of', 'practical', 'importance', '-PRON-', 'have', 'lose', 'all', 'desire', 'to', 'do', 'so', 'Nothing', 'that', 'any', 'landlady', 'could', 'do', 'have', 'a', 'real', 'terror', 'for', '-PRON-', 'but', 'to', 'be', 'stop', 'on', 'the', 'stair', 'to', 'be', 'force', 'to', 'listen', 'to', '-PRON-', 'trivial', 'irrelevant', 'gossip', 'to', 'pester', 'demand', 'for', 'payment', 'threat', 'and', 'complaint', 'and', 'to', 'rack', '-PRON-', 'brain', 'for', 'excuse', 'to', 'prevaricate', 'to', 'lie', 'no', 'rather', 'than', 'that', '-PRON-', 'would', 'creep', 'down', 'the', 'stair', 'like', 'a', 'cat', 'and', 'slip', 'out', 'unseen', 'This', 'evening', 'however', 'on', 'come', 'out', 'into', 'the', 'street', '-PRON-', 'become', 'acutely', 'aware', 'of', '-PRON-', 'fear', '-PRON-', 'want', 'to', 'attempt', 'a', 'thing', 'like', 'that', 'and', 'be', 'frighten', 'by', 'these']\n" - ] - } - ], - "source": [ - "print(lemmatized_eng[1000:1200])" - ] - }, - { - "cell_type": "code", - "execution_count": 57, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "['feel', 'ashamed', 'He', 'be', 'hopelessly', 'in', 'debt', 'to', 'his', 'landlady', 'and', 'be', 'afraid', 'of', 'meeting', 'her', 'This', 'be', 'not', 'because', 'he', 'be', 'cowardly', 'and', 'abject', 'quite', 'the', 'contrary', 'but', 'for', 'some', 'time', 'past', 'he', 'have', 'be', 'in', 'an', 'overstrain', 'irritable', 'condition', 'verge', 'on', 'hypochondria', 'He', 'have', 'become', 'so', 'completely', 'absorbed', 'in', 'himself', 'and', 'isolated', 'from', 'his', 'fellow', 'that', 'he', 'dread', 'meeting', 'not', 'only', 'his', 'landlady', 'but', 'anyone', 'at', 'all', 'He', 'be', 'crush', 'by', 'poverty', 'but', 'the', 'anxiety', 'of', 'his', 'position', 'have', 'of', 'late', 'cease', 'to', 'weigh', 'upon', 'him', 'He', 'have', 'give', 'up', 'attend', 'to', 'matter', 'of', 'practical', 'importance', 'he', 'have', 'lose', 'all', 'desire', 'to', 'do', 'so', 'Nothing', 'that', 'any', 'landlady', 'could', 'do', 'have', 'a', 'real', 'terror', 'for', 'him', 'But', 'to', 'be', 'stop', 'on', 'the', 'stair', 'to', 'be', 'force', 'to', 'listen', 'to', 'her', 'trivial', 'irrelevant', 'gossip', 'to', 'pester', 'demand', 'for', 'payment', 'threat', 'and', 'complaint', 'and', 'to', 'rack', 'his', 'brain', 'for', 'excuse', 'to', 'prevaricate', 'to', 'lie', 'no', 'rather', 'than', 'that', 'he', 'would', 'creep', 'down', 'the', 'stair', 'like', 'a', 'cat', 'and', 'slip', 'out', 'unseen', 'This', 'even', 'however', 'on', 'come', 'out', 'into', 'the', 'street', 'he', 'become', 'acutely', 'aware', 'of', 'his', 'fear', 'I', 'want', 'to', 'attempt', 'a', 'thing', 'like', 'that', 'and', 'be', 'frighten', 'by', 'these']\n" - ] - } - ], - "source": [ - "print(lemmatized_eng_nltk[1000:1200])" - ] - }, - { - "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.7.3" - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} diff --git a/notebooks/Language_identification.ipynb b/notebooks/Language_identification.ipynb deleted file mode 100644 index bd7b852..0000000 --- a/notebooks/Language_identification.ipynb +++ /dev/null @@ -1,201 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Data Cleaning:\n", - "Pour télécharger les datas pour ce notebook, vous pouvez utilisez le [script associé](/nautilus_nlp/data/external/get_language_dataset.sh)" - ] - }, - { - "cell_type": "code", - "execution_count": 1, - "metadata": {}, - "outputs": [], - "source": [ - "with open('../data/external/wili/x_test.txt') as fp:\n", - " test=fp.readlines()\n", - " test=[doc.strip('\\n') for doc in test]" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Le Dataset Wili est un dataset d'identification de langue basé sur Wikipedia.\n" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Language identification" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Two types of detector can be implemented: THe Compact language detector (CLD2) and the Fasttext language identification one" - ] - }, - { - "cell_type": "code", - "execution_count": 6, - "metadata": {}, - "outputs": [ - { - "ename": "TypeError", - "evalue": "__init__() got an unexpected keyword argument 'typemodel'", - "output_type": "error", - "traceback": [ - "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", - "\u001b[0;31mTypeError\u001b[0m Traceback (most recent call last)", - "\u001b[0;32m<ipython-input-6-1929b26ba9a1>\u001b[0m in \u001b[0;36m<module>\u001b[0;34m\u001b[0m\n\u001b[1;32m 1\u001b[0m \u001b[0;32mfrom\u001b[0m \u001b[0mnautilus_nlp\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mmodels\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mlanguage_detector\u001b[0m \u001b[0;32mimport\u001b[0m \u001b[0mLangDetector\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 2\u001b[0;31m \u001b[0mdetector\u001b[0m\u001b[0;34m=\u001b[0m \u001b[0mLangDetector\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mtypemodel\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;34m'fasttext'\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 3\u001b[0m \u001b[0mdetector2\u001b[0m\u001b[0;34m=\u001b[0m \u001b[0mLangDetector\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mtypemodel\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;34m'cld2'\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", - "\u001b[0;31mTypeError\u001b[0m: __init__() got an unexpected keyword argument 'typemodel'" - ] - } - ], - "source": [ - "from nautilus_nlp.models.language_detector import LangDetector\n", - "detector= LangDetector(typemodel='fasttext')\n", - "detector2= LangDetector(typemodel='cld2')" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "The language identification part is simply done by calling the detect language method of the detector" - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Ne l fin de l seclo XIX l Japon era inda çconhecido i sótico pa l mundo oucidental. Cula antroduçon de la stética japonesa, particularmente na Sposiçon Ounibersal de 1900, an Paris, l Oucidente adquiriu un apetite ansaciable pul Japon i Heiarn se tornou mundialmente coincido pula perfundidade, ouriginalidade i sinceridade de ls sous cuntos. An sous radadeiros anhos, alguns críticos, cumo George Orwell, acusórun Heiarn de trasferir sou nacionalismo i fazer l Japon parecer mais sótico, mas, cumo l'home qu'oufereciu al Oucidente alguns de sous purmeiros lampeijos de l Japon pré-andustrial i de l Período Meiji, sou trabalho inda ye balioso até hoije.\n" - ] - }, - { - "ename": "NameError", - "evalue": "name 'detector' is not defined", - "output_type": "error", - "traceback": [ - "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", - "\u001b[0;31mNameError\u001b[0m Traceback (most recent call last)", - "\u001b[0;32m<ipython-input-3-f1145461d744>\u001b[0m in \u001b[0;36m<module>\u001b[0;34m\u001b[0m\n\u001b[1;32m 1\u001b[0m \u001b[0;32mfor\u001b[0m \u001b[0mi\u001b[0m \u001b[0;32min\u001b[0m \u001b[0mrange\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;36m0\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;36m5\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 2\u001b[0m \u001b[0mprint\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mtest\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mi\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 3\u001b[0;31m \u001b[0mprint\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mdetector\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mdetect_language\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mtest\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mi\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 4\u001b[0m \u001b[0mprint\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mdetector2\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mdetect_language\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mtest\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mi\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 5\u001b[0m \u001b[0mprint\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m'\\n'\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", - "\u001b[0;31mNameError\u001b[0m: name 'detector' is not defined" - ] - } - ], - "source": [ - "for i in range(0,5):\n", - " print(test[i])\n", - " print(detector.detect_language(test[i]))\n", - " print(detector2.detect_language(test[i]))\n", - " print('\\n')" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "We can see that the results are pretty similar, the value of the confidence is changing though" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Performance" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Inference time:\n" - ] - }, - { - "cell_type": "code", - "execution_count": 30, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "87.5 ms ± 3.43 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)\n" - ] - } - ], - "source": [ - "%%timeit\n", - "for i in range(0,1000):\n", - " detector.detect_language(test[i])" - ] - }, - { - "cell_type": "code", - "execution_count": 31, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "32 ms ± 1.19 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)\n" - ] - } - ], - "source": [ - "%%timeit\n", - "for i in range(0,1000):\n", - " detector2.detect_language(test[i])" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Accuracy\n", - "To do" - ] - }, - { - "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.7.3" - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} diff --git a/notebooks/Sentiment analysis using pre-trained models.ipynb b/notebooks/Sentiment analysis using pre-trained models.ipynb deleted file mode 100644 index 35c57d4..0000000 --- a/notebooks/Sentiment analysis using pre-trained models.ipynb +++ /dev/null @@ -1,161 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Calculer un score de sentiment avec un modèle pré-entrainé" - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "metadata": {}, - "outputs": [], - "source": [ - "from nautilus_nlp.models.sentiment_detector import compute_sentiment_score" - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "-0.4234" - ] - }, - "execution_count": 3, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "compute_sentiment_score(\"I don't like this. It's weird af\",lang_module=\"en_vader\")" - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "0.6369" - ] - }, - "execution_count": 4, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "compute_sentiment_score(\"I love your haircut\",lang_module=\"en_vader\")" - ] - }, - { - "cell_type": "code", - "execution_count": 5, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "0.5" - ] - }, - "execution_count": 5, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "compute_sentiment_score(\"I love your haircut\",lang_module=\"en_textblob\")" - ] - }, - { - "cell_type": "code", - "execution_count": 6, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "-1.0" - ] - }, - "execution_count": 6, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "compute_sentiment_score(\"It's mainly disgusting\",lang_module=\"en_textblob\")" - ] - }, - { - "cell_type": "code", - "execution_count": 7, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "-0.5" - ] - }, - "execution_count": 7, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "compute_sentiment_score(\"C'est bien horrible\",lang_module=\"fr_textblob\")" - ] - }, - { - "cell_type": "code", - "execution_count": 8, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "-1.0" - ] - }, - "execution_count": 8, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "compute_sentiment_score(\"C'est horrible\",lang_module=\"fr_textblob\")" - ] - } - ], - "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.7.3" - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} diff --git a/notebooks/Sentiment_analysis_FT.ipynb b/notebooks/Sentiment_analysis_FT.ipynb deleted file mode 100644 index e8ba22e..0000000 --- a/notebooks/Sentiment_analysis_FT.ipynb +++ /dev/null @@ -1,259 +0,0 @@ -{ - "cells": [ - { - "cell_type": "code", - "execution_count": 1, - "metadata": {}, - "outputs": [], - "source": [ - "import csv \n", - "import re\n" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Data Cleaning:\n", - "Pour télécharger les datas pour ce notebook, vous pouvez utilisez le [script associé](/nautilus_nlp/data/external/get_stanfordtweets.sh)" - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "total 86M\n", - "-rw-rw-r-- 1 robin robin 81M juin 5 15:31 tweets.train\n", - "-rw-rw-r-- 1 robin robin 5,4M juin 5 15:31 tweets.valid\n" - ] - } - ], - "source": [ - "ls -lh ../data/processed" - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "metadata": {}, - "outputs": [], - "source": [ - "\n", - "train = open('../data/processed/tweets.train','w',encoding='utf-8') \n", - "test = open('../data/processed/tweets.valid','w',encoding='utf-8') \n", - "with open('../data/external/tweets_sentiment/training.1600000.processed.noemoticon.csv', mode='r', encoding = \"ISO-8859-1\") as csv_file: \n", - " csv_reader = csv.DictReader(csv_file, fieldnames=['target', 'id', 'date', 'flag', 'user', 'text'])\n", - " line = 0\n", - " for row in csv_reader:\n", - " # Clean the training data\n", - " # First we lower case the text\n", - " text = row[\"text\"].lower()\n", - " # remove links\n", - " text = re.sub('((www\\.[^\\s]+)|(https?://[^\\s]+))','',text)\n", - " #Remove usernames\n", - " text = re.sub('@[^\\s]+','', text)\n", - " # replace hashtags by just words\n", - " text = re.sub(r'#([^\\s]+)', r'\\1', text)\n", - " #correct all multiple white spaces to a single white space\n", - " text = re.sub('[\\s]+', ' ', text)\n", - " # Additional clean up : removing words less than 3 chars, and remove space at the beginning and teh end\n", - " text = re.sub(r'\\W*\\b\\w{1,3}\\b', '', text)\n", - " text = text.strip()\n", - " line = line + 1\n", - " # Split data into train and validation\n", - " if line%16 == 0:\n", - " print(f'__label__{row[\"target\"]} {text}', file=test)\n", - " else:\n", - " print(f'__label__{row[\"target\"]} {text}', file=train)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Model Training" - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "metadata": {}, - "outputs": [], - "source": [ - "from nautilus_nlp.models import fasttext_classifier " - ] - }, - { - "cell_type": "code", - "execution_count": 5, - "metadata": {}, - "outputs": [], - "source": [ - "def print_results(N, p, r):\n", - " print(\"N\\t\" + str(N))\n", - " print(\"P@{}\\t{:.3f}\".format(1, p))\n", - " print(\"R@{}\\t{:.3f}\".format(1, r))\n", - " \n", - "train_data = '../data/processed/tweets.train'\n", - "valid_data = '../data/processed/tweets.valid'\n", - "\n", - "model = fasttext_classifier.Fasttext_clf()\n" - ] - }, - { - "cell_type": "code", - "execution_count": 6, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "12.3 s ± 944 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)\n" - ] - } - ], - "source": [ - "%%timeit\n", - "model.train(train_data)\n" - ] - }, - { - "cell_type": "code", - "execution_count": 7, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "N\t99880\n", - "P@1\t0.755\n", - "R@1\t0.755\n" - ] - } - ], - "source": [ - "print_results(*model.test(valid_data))\n" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Il faut donc 13 secondes pour entrainer un modèle sur 1.5 Millions de tweets, avec une précision de 0.75. Not bad" - ] - }, - { - "cell_type": "code", - "execution_count": 8, - "metadata": {}, - "outputs": [], - "source": [ - "model.save_model('sentiments.bin')" - ] - }, - { - "cell_type": "code", - "execution_count": 9, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "-rw-rw-r-- 1 robin robin 232M juin 5 15:55 sentiments.bin\n" - ] - } - ], - "source": [ - "!ls -lh 'sentiments.bin'" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Ce modèle fait environ 230Mo" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Maintenant si on quantize ce modèle" - ] - }, - { - "cell_type": "code", - "execution_count": 10, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "N\t99880\n", - "P@1\t0.755\n", - "R@1\t0.755\n" - ] - } - ], - "source": [ - "model.quantize(input=train_data, qnorm=True, retrain=True, cutoff=100000)\n", - "print_results(*model.test(valid_data))\n", - "model.save_model('sentiments.ftz')" - ] - }, - { - "cell_type": "code", - "execution_count": 11, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "-rw-rw-r-- 1 robin robin 6,8M juin 5 15:56 sentiments.ftz\n" - ] - } - ], - "source": [ - "!ls -lh 'sentiments.ftz'" - ] - }, - { - "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.7.2" - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} diff --git a/notebooks/Spacy_model.ipynb b/notebooks/Spacy_model.ipynb deleted file mode 100644 index 0c4f587..0000000 --- a/notebooks/Spacy_model.ipynb +++ /dev/null @@ -1,126 +0,0 @@ -{ - "cells": [ - { - "cell_type": "code", - "execution_count": 1, - "metadata": {}, - "outputs": [], - "source": [ - "%load_ext autoreload\n", - "\n", - "%autoreload 2" - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "metadata": {}, - "outputs": [], - "source": [ - "str_=\"Ceci est une longue phrase qu il va falloir lemmatizer. A toi de jouer spacy\"" - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "metadata": {}, - "outputs": [], - "source": [ - "from nautilus_nlp.models.Spacy_model import spacy_model" - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "metadata": {}, - "outputs": [], - "source": [ - "model= spacy_model(lang='fr')" - ] - }, - { - "cell_type": "code", - "execution_count": 5, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "['ceci',\n", - " 'être',\n", - " 'un',\n", - " 'long',\n", - " 'phrase',\n", - " 'que',\n", - " 'il',\n", - " 'aller',\n", - " 'falloir',\n", - " 'lemmatizer',\n", - " '.',\n", - " 'a',\n", - " 'toi',\n", - " 'de',\n", - " 'jouer',\n", - " 'spacy']" - ] - }, - "execution_count": 5, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "model.get_lemma_from_str(str_)" - ] - }, - { - "cell_type": "code", - "execution_count": 6, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "[[Ceci, est, une, longue, phrase, qu, il, va, falloir, lemmatizer, .],\n", - " [A, toi, de, jouer, spacy]]" - ] - }, - "execution_count": 6, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "model.get_tokenized_sentence_from_str(str_)" - ] - }, - { - "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.7.3" - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} diff --git a/notebooks/Visualization tools.ipynb b/notebooks/Visualization tools.ipynb deleted file mode 100644 index 50c582b..0000000 --- a/notebooks/Visualization tools.ipynb +++ /dev/null @@ -1,100 +0,0 @@ -{ - "cells": [ - { - "cell_type": "code", - "execution_count": 3, - "metadata": {}, - "outputs": [ - { - "ename": "ModuleNotFoundError", - "evalue": "No module named 'nautilus_nlp.visualization'", - "output_type": "error", - "traceback": [ - "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", - "\u001b[0;31mModuleNotFoundError\u001b[0m Traceback (most recent call last)", - "\u001b[0;32m<ipython-input-3-6aa84683348e>\u001b[0m in \u001b[0;36m<module>\u001b[0;34m\u001b[0m\n\u001b[0;32m----> 1\u001b[0;31m \u001b[0;32mfrom\u001b[0m \u001b[0mnautilus_nlp\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mvisualization\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mvisualize\u001b[0m \u001b[0;32mimport\u001b[0m \u001b[0mprint_concordance\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 2\u001b[0m \u001b[0;32mfrom\u001b[0m \u001b[0mnautilus_nlp\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mvisualization\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mvisualize\u001b[0m \u001b[0;32mimport\u001b[0m \u001b[0mmake_word_cloud\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 3\u001b[0m \u001b[0;32mfrom\u001b[0m \u001b[0mcollections\u001b[0m \u001b[0;32mimport\u001b[0m \u001b[0mCounter\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", - "\u001b[0;31mModuleNotFoundError\u001b[0m: No module named 'nautilus_nlp.visualization'" - ] - } - ], - "source": [ - "from nautilus_nlp.visualization.visualize import print_concordance\n", - "from nautilus_nlp.visualization.visualize import make_word_cloud\n", - "from collections import Counter" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "import sys" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "some_tokenized_texts = ['mise','au','contentieux','chez','XXX','le','client','est','en','relation','avec','un','prestataire','de','recouvrement','il','demande','les','coordonnées','téléphoniques','du','prestataire','de','recouvrement','souhaite','des','renseignements','sur','son','plan','d','apurement','mise','au','contentieux','chez','XXX','le','client','est','en','relation','avec','un','prestataire','de','recouvrement','ok','maj','ok','fel','kole','bp','appel','popur','régler','sa','facture','de','euros','n','facture','régler','car','il','avait','un','report','de','sol','desur','cette','facture','de','euros','somme','payé','au','recouvrement','solde','a','se','jour','a','zéro','appel','d','un','tiers','oui','nom','prénom','mme','dor','au','titre','de','epouse','signale','qu','elle','n','arrive','pas','a','joindre','le','recouvrement','pour','leurs','signaléun','paiement','qu','elle','a','faite','ce','matin','informe','que','coupure','prévue','pour','le','et','invite','retenté','de','joindre','lerec','ouvrement','assistance','sociale','madame','rodrigez','est','avec','la','cliente','et','se','renseigne','sur','les','sommes','dues','au','recouvrement','ainsi','que','les','prelevement','s','avenirs','conversation','coupée','le','client','a','raccroché','pendant','que','je','me','renseignaissur','la','démarche','a','tenir','pour','son','rétablissement','savoir','siil','avait','réglé','au','recouvrement','cliente','appel','pour','nous','dire','que','elle','payera','sa','facture','de','le','octobre','la','recouvrement','n','arrete','pas','de','l','appeler','facture','en','recouvrement','donné','n','retrouve','pour','délai','de','paiement','en','juillet','lieu','de','traitement','acticall','casa','demande','du','client','plan','dapurement','analyse','du','dossier','créance','transféré','actions','réalisées','numéros','du','service','de','recouvrement','réponse','apportée','ras','miseau','contentieux','chez','XXX','le','client','est','en','relation','avec','unpre','stataire','de','recouvrement','il','demande','les','coordonnées','téléphoniques','du','prestataire','de','recouvrement','souhaite','des','ren','mise','au','contentieux','chez','XXX','le','client','est','en','relation','avec','un','prestataire','de','recouvrement','il','demande','les','coordonnées','téléphoniqu','esdu','prestataire','de','recouvrement','num','contentia','donner']" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "print_concordance(some_tokenized_texts, query_word='recouvrement')" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "c = Counter(some_tokenized_texts)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "make_word_cloud(c)" - ] - }, - { - "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.7.3" - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} diff --git a/notebooks/someadditionalfile.txt b/notebooks/someadditionalfile.txt deleted file mode 100644 index c7de724..0000000 --- a/notebooks/someadditionalfile.txt +++ /dev/null @@ -1 +0,0 @@ -Un deuxième exemple de texte en utf-8 cette fois! \ No newline at end of file diff --git a/notebooks/somefile.txt b/notebooks/somefile.txt deleted file mode 100644 index b9855bf..0000000 --- a/notebooks/somefile.txt +++ /dev/null @@ -1 +0,0 @@ -J'aime les frites bien grasse �talon ch�peau! \ No newline at end of file From 7eff5f23efb4c564570b1df83c87e9d8976d071d Mon Sep 17 00:00:00 2001 From: Citronelol <> Date: Sat, 14 Nov 2020 18:54:46 +0100 Subject: [PATCH 391/496] [Cleaning] Removing topic modeling and visualization files --- nautilus_nlp/analysis/keyword_extractor.py | 88 ----- nautilus_nlp/analysis/text_summary.py | 61 --- nautilus_nlp/analysis/visualize.py | 89 ----- nautilus_nlp/topic_modeling/biterm_model.py | 170 --------- nautilus_nlp/topic_modeling/lda.py | 347 ----------------- nautilus_nlp/topic_modeling/nmf_model.py | 133 ------- nautilus_nlp/topic_modeling/seanmf_model.py | 166 --------- .../topic_modeling_short_text.py | 350 ------------------ tests/test_biterm.py | 85 ----- tests/test_topic_modeling_short_text.py | 175 --------- 10 files changed, 1664 deletions(-) delete mode 100644 nautilus_nlp/analysis/keyword_extractor.py delete mode 100644 nautilus_nlp/analysis/text_summary.py delete mode 100644 nautilus_nlp/analysis/visualize.py delete mode 100644 nautilus_nlp/topic_modeling/biterm_model.py delete mode 100644 nautilus_nlp/topic_modeling/lda.py delete mode 100644 nautilus_nlp/topic_modeling/nmf_model.py delete mode 100644 nautilus_nlp/topic_modeling/seanmf_model.py delete mode 100644 nautilus_nlp/topic_modeling/topic_modeling_short_text.py delete mode 100644 tests/test_biterm.py delete mode 100644 tests/test_topic_modeling_short_text.py diff --git a/nautilus_nlp/analysis/keyword_extractor.py b/nautilus_nlp/analysis/keyword_extractor.py deleted file mode 100644 index a615f45..0000000 --- a/nautilus_nlp/analysis/keyword_extractor.py +++ /dev/null @@ -1,88 +0,0 @@ -# GNU Lesser General Public License v3.0 only -# Copyright (C) 2020 Artefact -# licence-information@artefact.com -# -# This program is free software; you can redistribute it and/or -# modify it under the terms of the GNU Lesser General Public -# License as published by the Free Software Foundation; either -# version 3 of the License, or (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public License -# along with this program; if not, write to the Free Software Foundation, -# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. -from typing import Union, List, Tuple, Dict -from collections import Counter - -from flashtext import KeywordProcessor -from nautilus_nlp.analysis.ngrams import create_ngrams - - -def extract_keywords( - text: str, keyword: Union[str, List[str], Dict[str, List[str]]], case_sensitive: bool = True - ) -> List[str]: - """ - Extract Keywords from a document, using FlashText - - Parameters - ---------- - text : str - Text to extract keywords from. - keyword : Union[str, list[str], dict[str, list[str]]] - Single keyword (str), list of keywords (list), or keyword dict. - Example of keyword dict: keyword_dict = { - "java": ["java_2e", "java programing"], - "product management": ["PM", "product manager"] - } - case_sensitive : bool - If False, will be case insensitive. - - Returns - ------- - list - Return list of extracted keywords - """ - - processor = KeywordProcessor(case_sensitive=case_sensitive) - if isinstance(keyword, list): - processor.add_keywords_from_list(keyword) - elif isinstance(keyword, str): - processor.add_keyword(keyword) - elif isinstance(keyword, dict): - processor.add_keywords_from_dict(keyword) - - return processor.extract_keywords(text) - - -def get_frequent_words( - tokens: List[str], ngrams_number: int = 1, number_top_words: int = 10) -> List[Tuple[str, int]]: - """ - Create n-grams for a list of tokens - - Parameters - ---------- - tokens : list - list of tokens - ngrams_number : int - number_top_words : int - number of top keywords to return - - Returns - ------- - list[tuple[str, int]] - Returns a list of the top n words (). - """ - frequent = [] - if ngrams_number == 1: - pass - elif ngrams_number >= 2: - tokens = create_ngrams(tokens, ngrams_number) - else: - raise ValueError("number of n-grams should be >= 1") - counter = Counter(tokens) - frequent = counter.most_common(number_top_words) - return frequent diff --git a/nautilus_nlp/analysis/text_summary.py b/nautilus_nlp/analysis/text_summary.py deleted file mode 100644 index 8fb6ff4..0000000 --- a/nautilus_nlp/analysis/text_summary.py +++ /dev/null @@ -1,61 +0,0 @@ -# GNU Lesser General Public License v3.0 only -# Copyright (C) 2020 Artefact -# licence-information@artefact.com -# -# This program is free software; you can redistribute it and/or -# modify it under the terms of the GNU Lesser General Public -# License as published by the Free Software Foundation; either -# version 3 of the License, or (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public License -# along with this program; if not, write to the Free Software Foundation, -# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. -from typing import Optional, Any -from summa.summarizer import summarize - - -def is_list_of_strings(lst: Any) -> bool: - """ - Parameters - ---------- - lst : list - - Returns - ------- - book : bool - True if is a list of strings, else returns False - """ - return bool(lst) and isinstance(lst, list) and all(isinstance(elem, str) for elem in lst) - - -def summarize_text( - txt: str, ratio: float = 0.2, language: str = "english", nb_words: Optional[int] = None) -> str: - """ - This function uses the summa library to summazize text - - Parameters - ---------- - txt : str - Sting or list of strings containing text to summarize - ratio : float - Percentage giving the output text length in reference to the input length. - language : str - text language. eg. "english" - nb_words : int, optional - number of words of the output text or None - - Returns - ------- - string - string containing the summarized text - """ - if is_list_of_strings(txt): - txt = ' '.join(txt) - elif not isinstance(txt, str): - raise TypeError("Text parameter must be a Unicode object (str) or list of str!") - return summarize(txt, ratio, nb_words, language) diff --git a/nautilus_nlp/analysis/visualize.py b/nautilus_nlp/analysis/visualize.py deleted file mode 100644 index 0dc31e5..0000000 --- a/nautilus_nlp/analysis/visualize.py +++ /dev/null @@ -1,89 +0,0 @@ -# GNU Lesser General Public License v3.0 only -# Copyright (C) 2020 Artefact -# licence-information@artefact.com -# -# This program is free software; you can redistribute it and/or -# modify it under the terms of the GNU Lesser General Public -# License as published by the Free Software Foundation; either -# version 3 of the License, or (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public License -# along with this program; if not, write to the Free Software Foundation, -# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. -from typing import List, Optional, Union -from collections import Counter - -import matplotlib.pyplot as plt -import wordcloud -import warnings - -plt.rcParams["figure.figsize"] = [16, 9] - - -def make_word_cloud(text_or_counter: Union[str, list], stop_words: Optional[List[str]] = None): - ''' - Prints a word cloud from a text, or a word count. - - Parameters - ---------- - text_or_counter : Union[str, list] - The text or the Counter to be ploted as wordcloud. - Example of counter: [('cat', 2), ('dog', 1)] - stop_words: List[str], optional - List of words to be ignored - ''' - if isinstance(text_or_counter, str): - word_cloud = wordcloud.WordCloud(stopwords=stop_words).generate(text_or_counter) - else: - if stop_words is not None: - text_or_counter = Counter(word for word in text_or_counter if word not in stop_words) - word_cloud = wordcloud.WordCloud(stopwords=stop_words).generate_from_frequencies(text_or_counter) - plt.imshow(word_cloud) - plt.axis("off") - plt.show() - - -def print_concordance( - tokens: List[str], query_word: str, width: int = 110, n_results: Optional[int] = None): - ''' - Inputs a list of token and a query word, and print all the sentences that contains the query\ - word, display in a nice way. This function is an adaptation of NLTK's print_concordance\ - function. Source: http://www.nltk.org/_modules/nltk/text.html - - Parameters - ---------- - tokens : list - list of words - query_word : str - the word to be searched for in the list of tokens - width : int - Number of caracters to be display per text chunk - n_results : int, optional - If specified, will print only the N results - ''' - half_width = (width - len(query_word) - 2) // 2 - context = width // 4 # approx number of words of context - - results = [i for i, j in enumerate(tokens) if j == query_word] - nb_results = len(results) - if nb_results > 0: - if n_results is None: - n_results = nb_results - print(f'{nb_results} matches for "{query_word}":') - for i in results[:n_results]: - # Find the context of query word. - left_context = tokens[max(0, i - context): i] - right_context = tokens[i + 1: i + context] - # Create the pretty lines with the query_word in the middle. - left_print = ' '.join(left_context)[-half_width:] - right_print = ' '.join(right_context)[:half_width] - # The WYSIWYG line of the concordance. - line_print = ' '.join([left_print, query_word, right_print]) - print(line_print) - else: - warnings.warn(f'No match for "{query_word}"') diff --git a/nautilus_nlp/topic_modeling/biterm_model.py b/nautilus_nlp/topic_modeling/biterm_model.py deleted file mode 100644 index 83c4eff..0000000 --- a/nautilus_nlp/topic_modeling/biterm_model.py +++ /dev/null @@ -1,170 +0,0 @@ -# GNU Lesser General Public License v3.0 only -# Copyright (C) 2020 Artefact -# licence-information@artefact.com -# -# This program is free software; you can redistribute it and/or -# modify it under the terms of the GNU Lesser General Public -# License as published by the Free Software Foundation; either -# version 3 of the License, or (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public License -# along with this program; if not, write to the Free Software Foundation, -# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. -from typing import List, Any -import numpy as np -from pyLDAvis import prepare, save_html -from biterm.btm import oBTM -from biterm.utility import topic_summuary, vec_to_biterms -from sklearn.feature_extraction.text import CountVectorizer - - -class BitermModel: - - # pylint: disable=too-many-instance-attributes - - def __init__(self, data: List[str], nb_topics: int, nb_iteration: int, lang: str): - """ - Model for topic modelling. Particularly useful for short texts. - - Parameters - ---------- - data : list - a list of string, each string can be a document - nb_topics : positive int - - nb_iteration : positive int - - lang : str - _language to remove the stop words, can be setup to None - - Returns - ------- - string - the text with removed multiple spaces and strip text - """ - self.is_int_positive(nb_topics) - self.is_int_positive(nb_iteration) - self.is_list_of_string(data) - - self.data = data - self.nb_topics = nb_topics - self.nb_iteration = nb_iteration - self.lang = lang - self._topics = None - self._btm = None - self._vectorize_text = None - self._vocabulary = None - - @staticmethod - def is_int_positive(number: Any): - """ - Function to check if the input parameter is a integer and positive - otherwise raise an error - - Parameters - ---------- - number : Any - - Raises - ------ - ValueError - If the input is not a positive integer - """ - if not isinstance(number, int): - raise ValueError(f"Parameter {number} has to be an integer") - if number < 1: - raise ValueError(f"Parameter {number} has to be positive") - - @staticmethod - def is_list_of_string(data: Any): - """ - Function to check if the input parameter is a list of strings otherwise raise an error - - Parameters - ---------- - data: Any - - Raises - ------ - ValueError - if data is not a list of string, or if is emply - """ - if not isinstance(data, list): - raise ValueError(f"{data} has to be a list") - if len(data) == 0: - raise ValueError(f"{data} is empty") - for document in data: - if not isinstance(document, str): - raise ValueError(f"All elements of {data} have to be a string, problem with {document}") - - def compute_topics(self, nb_word_per_cluster: int) -> dict: - """ - Main function computing the topic modeling, topics - - Parameters - ---------- - nb_word_per_cluster : int - - Returns - ------- - dict - A dictionary containing the the different topics with the top words - and coherence associated - """ - vec = CountVectorizer(stop_words=self.lang) - self._vectorize_text = vec.fit_transform(self.data).toarray() - self._vocabulary = np.array(vec.get_feature_names()) - - biterms = vec_to_biterms(self._vectorize_text) - self._btm = oBTM(num_topics=self.nb_topics, V=self._vocabulary) - self._topics = self._btm.fit_transform(biterms, iterations=self.nb_iteration) - - results = topic_summuary( - self._btm.phi_wz.T, self._vectorize_text, - self._vocabulary, nb_word_per_cluster, verbose=False - ) - - return results - - def get_document_topic(self, index: int) -> int: - """ - Get the cluster associated to the specified document - - Parameters - ---------- - index : int - The document index - - Returns - ------- - int - the cluster index - """ - if self._topics is None: - raise ValueError("Model needs to be trained first") - - return self._topics[index].argmax() - - def save_pyldavis_plot_as_html(self, path_to_output: str = './biterm_pyLDAavis_plot.html'): - """ - Function saving the pyLDAvis plot associated with the compute_topics function - - Parameters - ---------- - path_to_output : str - path to save the plut, must be a html file - """ - if self._topics is None or self._btm is None or self._vectorize_text is None or self._vocabulary is None: - raise ValueError("Model needs to be trained first") - - vis = prepare( - self._btm.phi_wz.T, self._topics, - np.count_nonzero(self._vectorize_text, axis=1), self._vocabulary, - np.sum(self._vectorize_text, axis=0) - ) - save_html(vis, path_to_output) diff --git a/nautilus_nlp/topic_modeling/lda.py b/nautilus_nlp/topic_modeling/lda.py deleted file mode 100644 index 0b5b257..0000000 --- a/nautilus_nlp/topic_modeling/lda.py +++ /dev/null @@ -1,347 +0,0 @@ -# GNU Lesser General Public License v3.0 only -# Copyright (C) 2020 Artefact -# licence-information@artefact.com -# -# This program is free software; you can redistribute it and/or -# modify it under the terms of the GNU Lesser General Public -# License as published by the Free Software Foundation; either -# version 3 of the License, or (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public License -# along with this program; if not, write to the Free Software Foundation, -# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. -from typing import List, Optional -import logging -import os - -import gensim -import matplotlib.pyplot as plt -import pyLDAvis -import pyLDAvis.gensim -from gensim.models import CoherenceModel -from gensim.models.wrappers import LdaMallet -from IPython.display import HTML - -logging.getLogger("gensim").setLevel(logging.WARNING) - - -def create_dictionary(data: List[List[str]]) -> List[List[tuple]]: - """ - Create a Dictionary encapsulates the mapping between normalized words and their integer ids. - - Parameters - ---------- - data : list - list of list of tokens - - Returns - ------- - list - List of list of tuples - """ - return gensim.corpora.Dictionary(data) - -def filter_extremes( - dictionary: gensim.corpora.Dictionary, no_below: Optional[int]=15, no_above: Optional[float]=0.3, **kwargs) -> gensim.corpora.Dictionary: - """ - Remove very rare and very common words - - Parameters - ---------- - dictionary : dict - dictionary containing the number of times a word appears in the dataset set - no_below : int, optional - Keep tokens which are contained in at least `no_below` documents. - no_above : float, optional - Keep tokens which are contained in no more than `no_above` documents. (fraction\ - of total corpus size, not an absolute number). - - Returns - ------- - gensim.corpora.Dictionary - """ - return dictionary.filter_extremes(no_below=no_below, no_above=no_above, **kwargs) - - -def create_bow_corpus(data, dictionary): - """ - Create the corpus: one of the two main inputs to the LDA topic model with the dictionary (id2word) - The produced corpus is a mapping of (token_id, token_count). - - Parameters - ---------- - data : list - list of list of tokens - - Returns - ------- - list - list of list of tuples - """ - corpus = [dictionary.doc2bow(text) for text in data] - return corpus - -### Find Number of topics - -def compute_coherence_values(dictionary, bow_corpus, texts, limit=25, start=2, step=4): - """ - Compute c_v coherence for various number of topics - - WARNING: It takes a really long time. - - Parameters: - ---------- - dictionary : gensim.corpora.Dictionary - Gensim dictionary - bow_corpus : Gensim bow corpus - texts : list - List of input texts - limit : int - Max number of topics - start : int - step : int - - Returns: - ------- - model_list : list - List of LDA topic models - coherence_values : - Coherence values corresponding to the LDA model with respective number of topics - """ - coherence_values = [] - model_list = [] - for num_topics in range(start, limit, step): - model = gensim.models.ldamodel.LdaModel( - corpus=bow_corpus, - id2word=dictionary, - num_topics=num_topics, - random_state=0, - update_every=5, - chunksize=1000, - passes=10 - ) - model_list.append(model) - coherencemodel = CoherenceModel(model=model, texts=texts, dictionary=dictionary, coherence='c_v') - coherence_values.append(coherencemodel.get_coherence()) - - return model_list, coherence_values - -def plot_optimal_topic_number(coherence_values, start=2, limit=25, step=4): - """ - Plot the coherence scores per number of topics - - Parameters: - ---------- - coherence_values : list - list of coherence scores for various number of topics - start : int - Min num of topics - limit : int - Max num of topics - step: int - - Returns - ------- - Lineplot - """ - x = range(start, limit, step) - plt.plot(x, coherence_values) - plt.xlabel("Num Topics") - plt.ylabel("Coherence score") - plt.legend(("coherence_values"), loc='best') - return plt.show() - -def print_coherence_scores(coherence_values, start=2, limit=25, step=4): - """ - Print the coherences scores for the ldamodels that had been tested with different number of topics - """ - x = range(start, limit, step) - for m, c_value in zip(x, coherence_values): - print("Num Topics =", m, " has Coherence Value of", round(c_value, 4)) - - -### LdaModel: Gensim & Mallet - -def train_lda_model(bow_corpus, dictionary: gensim.corpora.Dictionary, num_topics, model='gensim', mallet_path=None, **kwargs): - """ Train the lda model on the corpus - - Parameters - ---------- - bow_corpus : list - iterable of list of tokens. Stream of document vectors or sparse matrix of shape \ - (num_terms, num_documents). - dictionary: gensim.corpora.Dictionary - Mapping from word IDs to words - num_topics: int - model : str - Precise the topic modeling model wanted, must be "gensim" or "mallet" - mallet_path: Optional[str] - If model='gensim', required if model='mallet'. Path to the mallet-2.0.8 file - - Returns - ------- - gensim.ldamodel - - Raises - ------ - ValueError - """ - if model == 'gensim': - model = train_lda_gensim(bow_corpus, dictionary, num_topics, **kwargs) - elif model == 'mallet': - if mallet_path is None: - raise ValueError('You must precise the path to the mallet-2.0.8 file that has been downloaded before') - model = train_lda_mallet(bow_corpus, dictionary, num_topics, mallet_path, **kwargs) - else: - raise ValueError('Please enter a valid model name: gensim or mallet') - return model - -def train_lda_gensim(bow_corpus, dictionary, num_topics, **kwargs): - model = gensim.models.ldamodel.LdaModel( - corpus=bow_corpus, id2word=dictionary, num_topics=num_topics, - passes=10, minimum_probability=0.001, random_state=0, **kwargs - ) - return model - -def train_lda_mallet(bow_corpus, dictionary, num_topics, mallet_path, **kwargs): - os.environ['MALLET_PATH'] = mallet_path - mallet = '$MALLET_PATH/mallet-2.0.8/bin/mallet' - model = gensim.models.wrappers.LdaMallet( - mallet, corpus=bow_corpus, id2word=dictionary, num_topics=num_topics, - prefix='composant', random_seed=0, **kwargs - ) - return model - - -def save_model(model, model_name): - """ - Save the model that has been trained. The model will be saved on your current emplacement. - - Parameters - ---------- - model: ldamodel - model_name: str - Name the model that will be saved - """ - return model.save(os.path.join(model_name)) - - -def load_model(model_path, model_name, model='gensim', model_prefix='composant'): - """ - Detected the language of a text - - Parameters - ---------- - model_path: str - path where the model has been saved - model_name: str - name of the saved model - model : str - Precise the topic modeling model wanted, must be "gensim" or "mallet" - model_prefix : str - By default, 'composant' default prefix used while saving the mallet model with train_lda_model function. - """ - if model == 'gensim': - ldamodel = gensim.models.LdaModel.load(os.path.join(model_path, model_name)) - elif model == 'mallet': - ldamodel = LdaMallet.load(os.path.join(model_path, model_name)) - if model_prefix is not None: - ldamodel.prefix = model_path+'/'+ model_prefix - else: - raise ValueError('Please enter a valid model name: gensim or mallet') - return ldamodel - -def fit_data(model, bow): - """Test the model on new, unseen documents""" - return model.get_document_topics(bow, minimum_probability=0) - - -# Visualization - - -def visualize_topics(model, bow_corpus, dictionary, model_type=None): - """ - Visualize the topics-keywords with the pyLDAvis interactive chart. - (Work well in notebook) - - Parameters - ---------- - model: - LDA model: gensim or mallet - bow_corpus : list - iterable of list of tokens. - dictionary: corpora.Dictionary - Dictionary encapsulates the mapping between normalized words and their integer ids. - model : str - Precise the topic modeling model used, must be "gensim" or "mallet" - - Returns - ------- - pyLDAvis - 3D interactive chart - """ - if model_type == 'mallet': - model_vis = gensim.models.wrappers.ldamallet.malletmodel2ldamodel(model) - elif model_type == 'gensim': - model_vis = model - elif model_type is None: - raise ValueError('You forgot to precise your model type, it must be: gensim or mallet') - else: - raise ValueError('Please enter a valid model name: gensim or mallet') - return pyLDAvis.gensim.prepare(model_vis, bow_corpus, dictionary) - -def save_pyldavis(pyldavis, vis_path, vis_name): - """ - Save the pyldavis interactive chart - - Parameters - ---------- - pyldavis: pyLDAvis._prepare.PreparedData - vis_path: str - vis_name: str - """ - return pyLDAvis.save_html(pyldavis, os.path.join(vis_path, vis_name + '{}'.format('.html'))) - - - -def show_pyldavis(vis_path, vis_name): - """ - Display the HTML of the saved pyldavis interactive chart - - Parameters - ---------- - vis_path: str - vis_name: str - """ - return HTML(filename=os.path.join(vis_path, vis_name + '{}'.format('.html'))) - -def show_dominant_topic(model, bow_corpus, topic_number=1, topn=5): - """ Print the dominant topics in the document, its score and the topics' top keywords. - - Quick way to interpret the topics - - Parameters - ---------- - model - gensim.ldamodel - bow_corpus : list - iterable of list of tokens. - topic_number: int - Pick the number of topics displayed - topn : int - Number of topics' top keyword displayed - - """ - i = 0 - for index, score in sorted(model[bow_corpus], key=lambda tup: -1*tup[1]): - weight = model.show_topic(index, topn=topn) - keywords = [i[0] for i in weight] - print("Score: {}\t Topic: {}".format(score, keywords)) - i += 1 - if i == topic_number: - break diff --git a/nautilus_nlp/topic_modeling/nmf_model.py b/nautilus_nlp/topic_modeling/nmf_model.py deleted file mode 100644 index 3bb3ac1..0000000 --- a/nautilus_nlp/topic_modeling/nmf_model.py +++ /dev/null @@ -1,133 +0,0 @@ -# GNU Lesser General Public License v3.0 only -# Copyright (C) 2020 Artefact -# licence-information@artefact.com -# -# This program is free software; you can redistribute it and/or -# modify it under the terms of the GNU Lesser General Public -# License as published by the Free Software Foundation; either -# version 3 of the License, or (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public License -# along with this program; if not, write to the Free Software Foundation, -# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. -import time -import numpy as np -from numpy.linalg import norm -from tqdm import tqdm - - -class NMF: - - # pylint: disable=too-many-instance-attributes - - def __init__( - self, mat_a, mat_iw, mat_ih, n_topic=10, - max_iter=100, max_err=1e-3, rand_init=True): - """ - The objective of the NMF model is to approximate the term-document matrix A by two \ - lower-rank matrices W and H. - The process is iterative and we denote IW and IH the the matrix W and H that are \ - updated at each step. - - Parameters - ---------- - mat_a - The term-document matrix - mat_iw - topics Matrix, each column vector W(:,k) represents the k-th topic in terms of M keywords - and its elements are the weights of the corresponding keywords. - mat_ih - The row vector H(j,:) is the latent representation for document j in terms of K topics - n_topic - Number of selected topics - max_iter - Maximum number of iterations to update W and H - max_err - maximum error under which we consider that the loop converged - rand_init : bool - random init boolean - """ - self.mat_a = mat_a - self.mat_iw = mat_iw - self.mat_ih = mat_ih - self.n_row = mat_a.shape[0] - self.n_col = mat_a.shape[1] - - self.n_topic = n_topic - self.max_iter = max_iter - self.max_err = max_err - - self.loss_hist = [] - self.nmf_mat_init(rand_init) - self.nmf_iter() - - def nmf_mat_init(self, rand_init): - """ - Init Matrices W and H initially either randomly or using existing IW, IH matrices taken when iterating. - - Parameters - ---------- - rand_init : Boolean - Indicating initial random init - """ - if rand_init: - self.mat_w = np.random.random((self.n_row, self.n_topic)) - self.mat_h = np.random.random((self.n_col, self.n_topic)) - else: - self.mat_w = self.mat_iw - self.mat_h = self.mat_ih - for k in range(self.n_topic): - self.mat_w[:, k] /= norm(self.mat_w[:, k]) - - def nmf_iter(self): - """ - Main iterative loop for matrix decomposition - """ - loss_old = 1e20 - start_time = time.time() - for i in tqdm(range(self.max_iter)): - self.nmf_solver() - loss = self.nmf_loss() - self.loss_hist.append(loss) - - if loss_old - loss < self.max_err: - print('Matrix decomposition loop converged!') - break - loss_old = loss - end_time = time.time() - print('Step={}, Loss={}, Time={}s'.format(i, loss, end_time - start_time)) - - def nmf_solver(self): - ''' - regular NMF without constraint. - Block Coordinate Decent - ''' - epss = 1e-20 - - mat_hth = self.mat_h.T.dot(self.mat_h) - mat_ah = self.mat_a.dot(self.mat_h) - for k in range(self.n_topic): - tmp_w = self.mat_w[:, k] * mat_hth[k, k] + mat_ah[:, k] - np.dot(self.mat_w, mat_hth[:, k]) - self.mat_w[:, k] = np.maximum(tmp_w, epss) - self.mat_w[:, k] /= norm(self.mat_w[:, k]) + epss - - mat_wtw = self.mat_w.T.dot(self.mat_w) - mat_atw = self.mat_a.T.dot(self.mat_w) - for k in range(self.n_topic): - self.mat_h[:, k] = self.mat_h[:, k] * mat_wtw[k, k] + mat_atw[:, k] - np.dot(self.mat_h, mat_wtw[:, k]) - self.mat_h[:, k] = np.maximum(self.mat_h[:, k], epss) - - def nmf_loss(self): - loss = norm(self.mat_a - np.dot(self.mat_w, np.transpose(self.mat_h)), 'fro') ** 2 / 2.0 - return loss - - def get_loss(self): - return np.array(self.loss_hist) - - def get_decomposition_matrix(self): - return self.mat_w, self.mat_h diff --git a/nautilus_nlp/topic_modeling/seanmf_model.py b/nautilus_nlp/topic_modeling/seanmf_model.py deleted file mode 100644 index 0fbb584..0000000 --- a/nautilus_nlp/topic_modeling/seanmf_model.py +++ /dev/null @@ -1,166 +0,0 @@ -# GNU Lesser General Public License v3.0 only -# Copyright (C) 2020 Artefact -# licence-information@artefact.com -# -# This program is free software; you can redistribute it and/or -# modify it under the terms of the GNU Lesser General Public -# License as published by the Free Software Foundation; either -# version 3 of the License, or (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public License -# along with this program; if not, write to the Free Software Foundation, -# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - -import time -import numpy as np -from numpy.linalg import norm -from tqdm import tqdm - - -class SeaNMF: - - # pylint: disable=too-many-instance-attributes - - def __init__( - self, mat_a, mat_s, mat_iw, mat_iwc, mat_ih, alpha=1.0, beta=0.1, n_topic=10, - max_iter=100, max_err=1e-3, rand_init=True, fix_seed=False): - """ - Seanmf is a topic modeling algorithm, paper: http://dmkd.cs.vt.edu/papers/WWW18.pdf. - It finds an approximation to the term-document matrix A by two lower-rank matrices W and H, - at each iteration a context matrix Wc are computed and used to update W. - - Parameters - ---------- - mat_a - document term matrix - mat_s - Word-context (semantic) correlation matrix - mat_iw - topics Matrix, each column vector W(:,k) represents the k-th topic in terms of M keywords - and its elements are the weights of the corresponding keywords. - mat_iwc - Latent factor matrix of contexts. - mat_ih - The row vector H(j,:) is the latent representation for document j in terms of K topics - alpha - Seanmf algorithm parameter - beta - Seanmf algorithm parameter - n_topic - Number of selected topics - max_iter - Maximum number of iterations to update W and H - max_err - maximum error under which we consider that the loop converged - rand_init - random init boolean - fix_seed - int number to fix random seed. - """ - if fix_seed: - np.random.seed(0) - - self.mat_a = mat_a - self.mat_s = mat_s - - self.n_row = mat_a.shape[0] - self.n_col = mat_a.shape[1] - - self.n_topic = n_topic - self.max_iter = max_iter - self.alpha = alpha - self.beta = beta - self.mat_b = np.ones([self.n_topic, 1]) - self.max_err = max_err - self.snmf_mat_init(rand_init, mat_iw, mat_iwc, mat_ih) - self.snmf_iter() - - def snmf_mat_init(self, rand_init, mat_iw, mat_iwc, mat_ih): - """ - Init Matrices W,Wc and H initially either randomly or using existing IW,IWc IH matrices taken when iterating. - - Parameters - ---------- - rand_init : bool - Boolean indicating initial random init - """ - if rand_init: - self.mat_w = np.random.random((self.n_row, self.n_topic)) - self.mat_wc = np.random.random((self.n_row, self.n_topic)) - self.mat_h = np.random.random((self.n_col, self.n_topic)) - else: - self.mat_w = mat_iw - self.mat_wc = mat_iwc - self.mat_h = mat_ih - for k in range(self.n_topic): - self.mat_w[:, k] /= norm(self.mat_w[:, k]) - self.mat_wc[:, k] /= norm(self.mat_wc[:, k]) - - def snmf_iter(self): - """ - Main iterative loop for matrix decomposition - """ - loss_old = 1e20 - start_time = time.time() - for i in tqdm(range(self.max_iter)): - self.snmf_solver() - loss = self.snmf_loss() - if loss_old - loss < self.max_err: - print('Matrix decomposition loop converged!') - break - loss_old = loss - end_time = time.time() - print('Step={}, Loss={}, Time={}s'.format(i, loss, end_time - start_time)) - - def snmf_solver(self): - ''' - using BCD framework - Alogorithm 1: Equations to update W, wc, H matrices are described in the paper - http://dmkd.cs.vt.edu/papers/WWW18.pdf - ''' - - epss = 1e-20 - # Update W - mat_ah = np.dot(self.mat_a, self.mat_h) - mat_swc = np.dot(self.mat_s, self.mat_wc) - mat_hth = np.dot(self.mat_h.T, self.mat_h) - mat_wctwc = np.dot(self.mat_wc.T, self.mat_wc) - mat_w1 = self.mat_w.dot(self.mat_b) - - for k in range(self.n_topic): - num0 = mat_hth[k, k] * self.mat_w[:, k] + self.alpha * mat_wctwc[k, k] * self.mat_w[:, k] - num1 = mat_ah[:, k] + self.alpha * mat_swc[:, k] - num2 = np.dot(self.mat_w, mat_hth[:, k]) + self.alpha * np.dot( - self.mat_w, mat_wctwc[:, k]) + self.beta * mat_w1[0] - self.mat_w[:, k] = num0 + num1 - num2 - self.mat_w[:, k] = np.maximum(self.mat_w[:, k], epss) # project > 0 - self.mat_w[:, k] /= norm(self.mat_w[:, k]) + epss # normalize - # Update Wc - mat_wtw = self.mat_w.T.dot(self.mat_w) - mat_stw = np.dot(self.mat_s, self.mat_w) - for k in range(self.n_topic): - self.mat_wc[:, k] = self.mat_wc[:, k] + mat_stw[:, k] - np.dot(self.mat_wc, mat_wtw[:, k]) - self.mat_wc[:, k] = np.maximum(self.mat_wc[:, k], epss) - # Update H - mat_atw = np.dot(self.mat_a.T, self.mat_w) - for k in range(self.n_topic): - self.mat_h[:, k] = self.mat_h[:, k] + mat_atw[:, k] - np.dot(self.mat_h, mat_wtw[:, k]) - self.mat_h[:, k] = np.maximum(self.mat_h[:, k], epss) - - def snmf_loss(self): - loss = norm(self.mat_a - np.dot(self.mat_w, np.transpose(self.mat_h)), 'fro') ** 2 / 2.0 - if self.alpha > 0: - loss += self.alpha * norm(np.dot(self.mat_w, np.transpose(self.mat_wc)) - self.mat_s, 'fro') ** 2 / 2.0 - if self.beta > 0: - loss += self.beta * norm(self.mat_w, 1) ** 2 / 2.0 - - return loss - - def get_decomposition_matrix(self): - # Wc was not considered to keep same structure as NMF - return self.mat_w, self.mat_h diff --git a/nautilus_nlp/topic_modeling/topic_modeling_short_text.py b/nautilus_nlp/topic_modeling/topic_modeling_short_text.py deleted file mode 100644 index cc8f6f5..0000000 --- a/nautilus_nlp/topic_modeling/topic_modeling_short_text.py +++ /dev/null @@ -1,350 +0,0 @@ -# GNU Lesser General Public License v3.0 only -# Copyright (C) 2020 Artefact -# licence-information@artefact.com -# -# This program is free software; you can redistribute it and/or -# modify it under the terms of the GNU Lesser General Public -# License as published by the Free Software Foundation; either -# version 3 of the License, or (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public License -# along with this program; if not, write to the Free Software Foundation, -# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. -import re -from collections import Counter -from itertools import product -from typing import List - -import numpy as np -import pyLDAvis -from nautilus_nlp.topic_modeling.nmf_model import NMF -from nautilus_nlp.topic_modeling.seanmf_model import SeaNMF - - -def prepare_data( - docs: List[str], vocab_min_count: int = 1, vocab_max_size: int = 10000 -): - """ - Parameters - ---------- - docs : list - list of sentences on which the topic modeling will be performed - vocab_min_count : int - minimum number of occurrences of a word to be considered in the vocabulary - vocab_max_size : int - maximum number of word in the vocabulary - - Returns - ------- - list - list of encoded sentences using vocab IDs - list - list of vocabulary - Array - array with vocab frequency counts - """ - vocab = {} - - # Tokens_list is a list of sub-lists where each sub-list contains a sentences' tokens. - tokens_list = [] - for sentence in docs: - sentence = re.split(r"\s", sentence) - tokens_list.append(sentence) - vocab = dict(Counter(x for xs in tokens_list for x in xs)) - - # Create Vocab array ( list of sorted vocab + counts ) - vocab_arr = [[wd, vocab[wd]] for wd in vocab if vocab[wd] > vocab_min_count] - vocab_arr = sorted(vocab_arr, key=lambda k: k[1])[::-1] - vocab_arr = vocab_arr[:vocab_max_size] - vocab_arr = sorted(vocab_arr) - - vocab_list = list(map(lambda x: x[0], vocab_arr)) - # Create Vocab to ID dictionnary - vocab2id = {itm[1][0]: itm[0] for itm in enumerate(vocab_arr)} - - # Create ID representation of text (ie: each sentence is a list of vocabId ) - encoded_text_id = [] - for sentence in docs: - sentence = re.split(r"\s", sentence) - sentence = [int(vocab2id[wd]) for wd in sentence if wd in vocab2id] - encoded_text_id.append(sentence) - - return encoded_text_id, vocab_list, vocab_arr - - -def train_shorttext_model( - model_name: str, - encoded_text_id: list, - vocab_list: list, - n_topics: int = 20, - max_iter: int = 20, - max_err: float = 0.1, - alpha: float = 0, - beta: float = 0, -): - """ - Parameters - ---------- - model_name : str {'nmf','seanmf'} - encoded_text_id : list - list of encoded sentences - vocab_list : list - list of vocabulary - n_topics : int - number of topics - max_iter : int - maximum number of iterations while training - max_err : float - training error - alpha : float - regularization param for the NMF model - beta : float - regularization param for the NMF model - - Returns - ------- - Trained NMF model - - Raises - ------ - ValueError - If model_name is not valid - """ - - n_docs = len(encoded_text_id) - n_terms = len(vocab_list) - - if model_name == "nmf": - dt_mat = __build_doc_term_matrix(n_terms, n_docs, encoded_text_id) - return NMF( - dt_mat, - mat_iw=[], - mat_ih=[], - n_topic=n_topics, - max_iter=max_iter, - max_err=max_err, - ) - - if model_name == "seanmf": - # Calculate co-occurence matrix - cooc_mat = __build_cooccurence_matrix(n_terms, encoded_text_id) - # Calculate PPMI - mat_ss = __calculate_ppmi(cooc_mat, n_terms) - # Build doc-term matrix - dt_mat = __build_doc_term_matrix(n_terms, n_docs, encoded_text_id) - return SeaNMF( - dt_mat, - mat_ss, - mat_iw=[], - mat_iwc=[], - mat_ih=[], - alpha=alpha, - beta=beta, - n_topic=n_topics, - max_iter=max_iter, - max_err=max_err, - fix_seed=1024, - ) - raise ValueError("Invalid model name: Use nmf or seanmf") - - -def show_dominant_topic( - model, encoded_text_id: list, vocab_list: list, n_top_keyword: int = 10 -): - """ - Computes the PMi score for each topic and the topKeywords describing each of them. - - Parameters - ---------- - - model - trained NMF model - - encoded_text_id : list - list of encoded sentences - - vocab_list : list - list of vocabulary - - n_top_keyword : list - the number of keywords to be returned - - Returns - ------- - dict - A dictionnary with the topic number and its top keywords - dict - A ictionnary with the topic number and its PMI score - """ - dt_mat = __build_cooccurence_matrix( - n_terms=len(vocab_list), encoded_text_id=encoded_text_id - ) - np.fill_diagonal(dt_mat, 0) - mat_w, _ = model.get_decomposition_matrix() - n_topic = mat_w.shape[1] - pmi_arr = [] - for k in range(n_topic): - top_keywords_index = mat_w[:, k].argsort()[::-1][:n_top_keyword] - pmi_arr.append(__calculate_pmi(dt_mat, top_keywords_index)) - - index = np.argsort(pmi_arr) - topics = {} - pmi_score = {} - for k in index: - words = [] - for w in np.argsort(mat_w[:, k])[::-1][:n_top_keyword]: - words.append(vocab_list[w]) - # Complete the topic and the score dicts. Format {Topic_number: words or score} - topics[k] = words - pmi_score[k] = pmi_arr[k] - - return topics, pmi_score - - -def get_assigned_topics(model): - """ - Assign the topic number to the sentences used when training the model - - Parameters - ---------- - model - trained model for short text - - Returns - ------- - list - list of topics. Having the same length as the training text containing topics assigned \ - to each sentence. - """ - _, mat_h = model.get_decomposition_matrix() - # The weights of the H matrix are converted into probabilities - h_probs = mat_h / mat_h.sum(axis=1, keepdims=True) - topics_list = list(np.argmax(h_probs, axis=1)) - - return topics_list - - -def show_pyldavis(model, encoded_text_id, vocab_arr): - """ - Parameters - ---------- - model - trained model - encoded_text_id - encoded_text_id: list of encoded sentences - vocab_arr - array of vocabulary frequency - - Returns - ------- - pyldavis topics plot - """ - - data = prepare_data_pyldavis(model, encoded_text_id, vocab_arr) - vis_data = pyLDAvis.prepare(**data) - - return pyLDAvis.display(vis_data) - - -def prepare_data_pyldavis(model, encoded_text_id, vocab_arr) -> dict: - """ - Transform the model decomposed matrix to create topic term and document topics matrices - and prepare data to feed pyldavis. - link : http://jeriwieringa.com/2018/07/17/pyLDAviz-and-Mallet/ - - Returns - ------- - dict - dict of data needed by pyldavis - """ - doc_length_values = [len(doc) for doc in encoded_text_id] - list_vocab = list(map(lambda x: x[0], vocab_arr)) - freq_vocab = list(map(lambda x: x[1], vocab_arr)) - mat_w, mat_h = model.get_decomposition_matrix() - # Normlize the decomposition to get probabilities - w_probs = mat_w / mat_w.sum(axis=1, keepdims=True) - # Topic-term matrix phi - phi = w_probs.T - # Document-term matrix theta - theta = mat_h / mat_h.sum(axis=1, keepdims=True) - return { - "topic_term_dists": phi, - "doc_topic_dists": theta, - "doc_lengths": doc_length_values, - "vocab": list_vocab, - "term_frequency": freq_vocab, - } - - -def __build_cooccurence_matrix(n_terms: int, encoded_text_id: list): - """ - The cooccurence matrix represents the number of times each word - appeared in the same context as another word from the vocabulary. - The matrix has n_terms x n_terms size, columns and rows denote the vocab. - Cell values represent the number of times words occured together in the same sentence. - - Parameters - ---------- - n_terms : int - encoded_text_id : list - list of encoded sentences - - Returns - ------- - co-occurence matrix - """ - res = np.zeros([n_terms, n_terms]) - for row in encoded_text_id: - counts = Counter(row) - for key_from, key_to in product(counts, repeat=2): - res[key_from, key_to] += counts[key_from] * counts[key_to] - return res - - -def __calculate_ppmi(cooc_mat, n_terms): - mat_d1 = np.sum(cooc_mat) - print("D1= ", mat_d1) - mat_ss = mat_d1 * cooc_mat - print("SS= ", mat_ss) - for k in range(n_terms): - mat_ss[k] /= np.sum(cooc_mat[k]) - for k in range(n_terms): - mat_ss[:, k] /= np.sum(cooc_mat[:, k]) - print("SS = ", mat_ss) - cooc_mat = [] # release memory - mat_ss[mat_ss == 0] = 1.0 - mat_ss = np.log(mat_ss) - mat_ss[mat_ss < 0.0] = 0.0 - return mat_ss - - -def __build_doc_term_matrix(n_terms, n_docs, encoded_text_id): - dt_mat = np.zeros([n_terms, n_docs]) - for k in range(n_docs): - for j in encoded_text_id[k]: - dt_mat[j, k] += 1.0 - return dt_mat - - -def __calculate_pmi(mat_aa, top_keywords_index): - """ - Method to compute PMi score - Reference: Short and Sparse Text Topic Modeling via Self-Aggregation - """ - mat_d1 = np.sum(mat_aa) - n_tp = len(top_keywords_index) - mat_pmi = [] - for index1 in top_keywords_index: - for index2 in top_keywords_index: - if index2 < index1: - if mat_aa[index1, index2] == 0: - mat_pmi.append(0.0) - else: - mat_c1 = np.sum(mat_aa[index1]) - mat_c2 = np.sum(mat_aa[index2]) - mat_pmi.append( - np.log(mat_aa[index1, index2] * mat_d1 / mat_c1 / mat_c2) - ) - avg_pmi = 2.0 * np.sum(mat_pmi) / float(n_tp) / (float(n_tp) - 1.0) - return avg_pmi diff --git a/tests/test_biterm.py b/tests/test_biterm.py deleted file mode 100644 index b7fc830..0000000 --- a/tests/test_biterm.py +++ /dev/null @@ -1,85 +0,0 @@ -# GNU Lesser General Public License v3.0 only -# Copyright (C) 2020 Artefact -# licence-information@artefact.com -# -# This program is free software; you can redistribute it and/or -# modify it under the terms of the GNU Lesser General Public -# License as published by the Free Software Foundation; either -# version 3 of the License, or (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public License -# along with this program; if not, write to the Free Software Foundation, -# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. -import pandas as pd -import pytest -from nautilus_nlp.topic_modeling.biterm_model import BitermModel - -TEXT = ['Cola 1.5L Carrefour', - 'Pepsi Cola Light 1.5L', - 'Pepsi Cola Twist Light', - 'Cola 1.5L CRF DISC', - 'Coca-Cola Light 1.5L', - 'Coca-Cola Light 4x0.5L', - 'Coca-Cola Light 6x0.3L', - 'Panzani 200g x 4 bio', - 'Rustichella 150g bio', - 'De Cecco - Fusilli bio', - 'Gerblé sans Gluten50g', - 'Penne de riz 100g sans gluten', - 'Spaghetti de maïs 50g sans Glute'] - -NB_TOPICS = 5 -NB_WORD_PER_CLUSTER = 5 -NB_ITERATION = 100 -LANGUAGE = 'english' - - -@pytest.mark.parametrize( - "input_text, input_nb_topic , input_nb_iteration , input_language", - [ - (TEXT, -1, NB_ITERATION, LANGUAGE), - (TEXT, "Panzani", NB_ITERATION, LANGUAGE), - (TEXT, 3.4, NB_ITERATION, LANGUAGE), - (TEXT, (3, 5), NB_ITERATION, LANGUAGE), - (TEXT, [3, 5], NB_ITERATION, LANGUAGE), - (TEXT, NB_TOPICS, (2, 4), LANGUAGE), - (TEXT, NB_TOPICS, [1, 3], LANGUAGE), - (TEXT, NB_TOPICS, -1, LANGUAGE), - (TEXT, NB_TOPICS, "Panzani", LANGUAGE), - (TEXT, NB_TOPICS, 2.4, LANGUAGE), - (3, NB_TOPICS, NB_ITERATION, LANGUAGE), - ("Panzani", NB_TOPICS, NB_ITERATION, LANGUAGE), - (("Panzani", "Rustichella"), NB_TOPICS, NB_ITERATION, LANGUAGE), - ([], NB_TOPICS, NB_ITERATION, LANGUAGE), - (["Panzani", "Rustichella", 3], NB_TOPICS, NB_ITERATION, LANGUAGE) - ] -) -def text_input_parameter_error_handling(input_text - , input_nb_topic - , input_nb_iteration - , input_language): - with pytest.raises(TypeError): - BitermModel(data=input_text, nb_topics=input_nb_topic, nb_iteration=input_nb_iteration, lang=input_language) - - -def test_number_topic_correct(): - biterm_model = BitermModel(data=TEXT - , nb_topics=NB_TOPICS - , nb_iteration=NB_ITERATION - , lang=LANGUAGE) - clusters = biterm_model.compute_topics(nb_word_per_cluster=NB_WORD_PER_CLUSTER) - assert len(pd.DataFrame(clusters)) == NB_TOPICS - - -def test_no_initialisation(): - with pytest.raises(ValueError): - biter_model = BitermModel(data=TEXT, - nb_topics=NB_TOPICS, - nb_iteration=NB_ITERATION, - lang=LANGUAGE) - biter_model.get_document_topic(2) diff --git a/tests/test_topic_modeling_short_text.py b/tests/test_topic_modeling_short_text.py deleted file mode 100644 index 0103d4a..0000000 --- a/tests/test_topic_modeling_short_text.py +++ /dev/null @@ -1,175 +0,0 @@ -# GNU Lesser General Public License v3.0 only -# Copyright (C) 2020 Artefact -# licence-information@artefact.com -# -# This program is free software; you can redistribute it and/or -# modify it under the terms of the GNU Lesser General Public -# License as published by the Free Software Foundation; either -# version 3 of the License, or (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public License -# along with this program; if not, write to the Free Software Foundation, -# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. -import numpy as np -import pytest -from nautilus_nlp.topic_modeling.topic_modeling_short_text import ( - __build_cooccurence_matrix, - get_assigned_topics, - prepare_data, - prepare_data_pyldavis, - show_dominant_topic, - train_shorttext_model, -) - -TEXT = [ - "Cola 1.5L Carrefour", - "Pepsi Cola Light 1.5L", - "Pepsi Cola Twist Light", - "Cola 1.5L CRF DISC", - "Coca-Cola Light 1.5L", - "Coca-Cola Light 4x0.5L", - "Coca-Cola Light 6x0.3L", - "Panzani 200g x 4 bio", - "Rustichella 150g bio", - "De Cecco - Fusilli bio", - "Gerblé sans Gluten50g", - "Penne de riz 100g sans gluten", - "Spaghetti de maïs 50g sans Glute", -] - - -@pytest.mark.parametrize( - "input_text, expected_output", - [ - ( - TEXT, - ( - [ - [2, 0], - [4, 2, 3, 0], - [4, 2, 3], - [2, 0], - [1, 3, 0], - [1, 3], - [1, 3], - [5], - [5], - [5], - [7], - [6, 7], - [6, 7], - ], - ["1.5L", "Coca-Cola", "Cola", "Light", "Pepsi", "bio", "de", "sans"], - [ - ["1.5L", 4], - ["Coca-Cola", 3], - ["Cola", 4], - ["Light", 5], - ["Pepsi", 2], - ["bio", 3], - ["de", 2], - ["sans", 3], - ], - ), - ) - ], -) -def test_prepare_data(input_text, expected_output): - assert prepare_data(input_text) == expected_output - - -@pytest.mark.parametrize("model_name", ["nmf", "seanmf"]) -@pytest.mark.parametrize("n_topics", [3, 0]) -@pytest.mark.parametrize("n_keywords", [2, 0]) -def test_show_dominant_topic(model_name, n_topics, n_keywords): - - encoded_text_id, vocab_list, _ = prepare_data(TEXT) - - model = train_shorttext_model( - model_name, encoded_text_id, vocab_list, n_topics=n_topics - ) - topics, pmi_score = show_dominant_topic( - model, encoded_text_id, vocab_list, n_top_keyword=n_keywords - ) - - assert len(pmi_score) == n_topics - assert len(topics) == n_topics - for i in topics.values(): - assert len(i) == n_keywords - - -@pytest.mark.parametrize("model_name", ["nmf", "seanmf"]) -@pytest.mark.parametrize("n_topics", [3]) -def test_get_assigned_topics(model_name, n_topics): - encoded_text_id, vocab_list, _ = prepare_data(TEXT) - model = train_shorttext_model( - model_name, encoded_text_id, vocab_list, n_topics=n_topics - ) - topics_list = get_assigned_topics(model) - - assert len(topics_list) == len(TEXT) - for topic_num in topics_list: - assert topic_num < n_topics - - -@pytest.mark.parametrize("model_name", ["nmf", "seanmf"]) -@pytest.mark.parametrize("n_topics", [0, 3]) -def test_prepare_data_pyldavis(model_name, n_topics): - encoded_text_id, vocab_list, vocab_arr = prepare_data(TEXT) - model = train_shorttext_model( - model_name, encoded_text_id, vocab_list, n_topics=n_topics - ) - - data = prepare_data_pyldavis(model, encoded_text_id, vocab_arr) - phi = data["topic_term_dists"] - theta = data["doc_topic_dists"] - doc_length_values = data["doc_lengths"] - list_vocab = data["vocab"] - freq_vocab = data["term_frequency"] - - assert phi.shape == (n_topics, len(list_vocab)) - assert theta.shape == (len(TEXT), n_topics) - assert len(doc_length_values) == len(TEXT) - assert len(list_vocab) == len(freq_vocab) - - -@pytest.mark.parametrize( - "input_coded, expected_output", - [ - ( - [[1, 3, 3, 2, 2, 0], [1, 3], [3, 0, 0]], - [ - [5.0, 1.0, 2.0, 4.0], - [1.0, 2.0, 2.0, 3.0], - [2.0, 2.0, 4.0, 4.0], - [4.0, 3.0, 4.0, 6.0], - ], - ), - ( - [[0, 1, 2, 3, 4], [5, 6], [1]], - [ - [1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0], - [1.0, 2.0, 1.0, 1.0, 1.0, 0.0, 0.0], - [1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0], - [1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0], - [1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0], - [0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0], - [0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0], - ], - ), - ], -) -def test_build_cooccurence_matrix(input_coded, expected_output): - # The co-occurence matrix is an array with the list of vocab in rows and in columns - # The weights denote the occurrences of a word i with a word j in same sentence. - - flat_list = [item for sublist in input_coded for item in sublist] - nb_vocab = len(set(flat_list)) # number of distinct words - mat = __build_cooccurence_matrix(nb_vocab, input_coded) - - assert np.array_equal(mat, np.array(expected_output)) From c08024c5e8f0d778dc971fe1e2c4ae7c35875f13 Mon Sep 17 00:00:00 2001 From: Citronelol <> Date: Sat, 14 Nov 2020 18:55:13 +0100 Subject: [PATCH 392/496] [Cleaning] Cleaning travis yaml and upgrading requirements --- .travis.yml | 8 -------- requirements.txt | 50 +++++++++++++++++++----------------------------- 2 files changed, 20 insertions(+), 38 deletions(-) diff --git a/.travis.yml b/.travis.yml index e99a71f..ed82e0b 100644 --- a/.travis.yml +++ b/.travis.yml @@ -21,14 +21,6 @@ os: - linux services: - docker - -before_script: - - wget https://github.com/facebookresearch/fastText/archive/v0.2.0.zip && unzip v0.2.0.zip && cd fastText-0.2.0 && make && pip install . && cd .. - - python3 -m spacy download fr && python3 -m spacy download en && python3 -m spacy download de && python3 -m spacy download nl && python3 -m spacy download it && python3 -m spacy download xx && python3 -m spacy validate - - - wget http://mallet.cs.umass.edu/dist/mallet-2.0.8.zip && unzip mallet-2.0.8.zip && rm mallet-2.0.8.zip - - sudo add-apt-repository -y ppa:openjdk-r/ppa && sudo apt update && apt search openjdk && sudo apt install openjdk-8-jdk - install: - pip install -r requirements.txt - pip install -e . diff --git a/requirements.txt b/requirements.txt index 872256a..42d99c8 100644 --- a/requirements.txt +++ b/requirements.txt @@ -2,43 +2,33 @@ #-e . # external requirements -Sphinx -sphinx_rtd_theme coverage -python-dotenv>=0.5.1 pillow +python-dotenv>=0.5.1 pytest +Sphinx +sphinx_rtd_theme #library requirements -pyLDAvis==2.1.2 -gensim==3.7.1 -sacremoses==0.0.13 -stop-words==2018.7.23 -spacy==2.1.3 +chardet==3.0.4 +emoji>=0.5.2 ftfy<5.0.0,>=4.2.0 -wordcloud>=1.5.0 -matplotlib>=3.0.3 mosestokenizer -numpy>1.15.4 -stop_words==2018.7.23 +nlpaug==1.0.1 nltk>=3.4.5 -textblob==0.15.3 -textblob_fr==0.2.0 -pandas>=0.23.4 -chardet==3.0.4 -setuptools==40.8.0 -textacy==0.6.3 -#fastText==0.8.3 -gensim==3.7.1 -scikit-learn==0.23.2 -vaderSentiment==3.2.1 -google-compute-engine==2.8.13 -flashtext==2.7 +numpy>1.15.4 phonenumbers==8.10.12 -regex==2019.8.19 -emoji>=0.5.2 -summa==1.2.0 -biterm==0.1.5 -nlpaug==1.0.1 -ipython==7.16.1 pylint==2.4.4 +regex==2019.8.19 +sacremoses==0.0.13 +scikit_learn==0.20.3 +setuptools==40.8.0 +spacy==2.1.3 +https://github.com/explosion/spacy-models/releases/download/fr_core_news_sm-2.3.0/fr_core_news_sm-2.3.0.tar.gz#egg=fr_core_news_sm +https://github.com/explosion/spacy-models/releases/download/en_core_web_sm-2.3.1/en_core_web_sm-2.3.1.tar.gz#egg=en_core_web_sm +https://github.com/explosion/spacy-models/releases/download/de_core_news_sm-2.3.0/de_core_news_sm-2.3.0.tar.gz#egg=de_core_news_sm +https://github.com/explosion/spacy-models/releases/download/it_core_news_sm-2.3.0/it_core_news_sm-2.3.0.tar.gz#egg=it_core_news_sm +https://github.com/explosion/spacy-models/releases/download/nl_core_news_sm-2.3.0/nl_core_news_sm-2.3.0.tar.gz#egg=nl_core_news_sm +https://github.com/explosion/spacy-models/releases/download/xx_ent_wiki_sm-2.3.0/xx_ent_wiki_sm-2.3.0.tar.gz#egg=xx_ent_wiki_sm +stop-words==2018.7.23 +stop_words==2018.7.23 \ No newline at end of file From 3053e4d974a2ad7df39acdf099b69f9d4679a9a0 Mon Sep 17 00:00:00 2001 From: Citronelol <> Date: Sat, 14 Nov 2020 18:58:47 +0100 Subject: [PATCH 393/496] [Cleaning] Removing lang_id files and updating readme --- .gitignore | 6 -- README.md | 97 ---------------------- nautilus_nlp/data/lang_identification.ftz | Bin 938013 -> 0 bytes requirements.txt | 2 +- 4 files changed, 1 insertion(+), 104 deletions(-) delete mode 100644 nautilus_nlp/data/lang_identification.ftz diff --git a/.gitignore b/.gitignore index 183f817..99cffa8 100644 --- a/.gitignore +++ b/.gitignore @@ -89,12 +89,6 @@ venv/ # Mypy cache .mypy_cache/ -# Fasttext Word_vector -*.bin -*.vec -*.gz -*.ftz -!/nautilus_nlp/data/lang_identification.ftz # PyTest cache .pytest_cache/ diff --git a/README.md b/README.md index bed36ab..a9d774a 100644 --- a/README.md +++ b/README.md @@ -45,103 +45,6 @@ then you can install it via pip: pip install -e . ``` -Once it's done, please install the additional required libraries: - -## Installation of the additional required libraries - -If you want to leverage all the features of nautilus-nlp, you need to **install others required libraries** (such as FastText). - -### Install spaCy language models (highly recommanded) - -Installing additional spaCy models will give you the possibility to handle a lot of new language for text processing feature (such as lemmatization or tokenization). - -To do so, run: *(on your virtual environment if you are using one)* - -``` -bash nautilus_nlp/scripts/download_spacy_models.sh -``` - -### Install FastText - -run: - -``` -bash nautilus_nlp/scripts/install_fasttext.sh -``` - -### Install Lang Detect - -run: - -``` -bash nautilus_nlp/scripts/download_ft_langdetect.sh -``` - -### Install Mallet - -Mallet is an implementation of the LDA algorithm (used for **topic modeling**). - -1) Install Mallet file -run: - -``` -bash nautilus_nlp/scripts/install_mallet.sh -``` - -2) Install Java JDK (required to implement mallet) -run: - -``` -bash nautilus_nlp/scripts/install_java.sh -``` - -## Handling installation errors - -### Problem when building FastText on MACOS: - -If you see this errorwhen building Fasttext: - - clang: warning: libstdc++ is deprecated; move to libc++ with a minimum deployment target of OS X 10.9 [-Wdeprecated] - ld: library not found for -lstdc++ - clang: error: linker command failed with exit code 1 (use -v to see invocation) - error: command 'g++' failed with exit status 1 -Then you should type this command in your terminal: - - export MACOSX_DEPLOYMENT_TARGET=10.9 - -### command 'gcc' failed with exit status 1 - -While runing `pip install -r requirements.txt` you might get the following error message: - -`command 'gcc' failed with exit status 1` - -To solve it, run the following command before installing requirements.txt: - -``` -conda install pyemd -``` - -### Cannot uninstall 'package_name' - -You might get the following error message while installing the library: -`Cannot uninstall 'PACKAGE_NAME'. It is a distutils installed project and thus we cannot accurately determine which files belong to it which would lead to only a partial uninstall.` - -To fix this, just type `pip install -e . --ignore-installed PACKAGE_NAME` instead. - -### Installing nautilus-nlp on a linux-based VM - -If you are installing nautilus on a linux-powered Virtual Machine (VM), you might want to install essentials first. If you don't, you might experience some issues to install Cython-based libraries, such as spaCy, becode the C compiler will be missing. - -On a Ubuntu VM (tested on 16.04), you can run the following command before following the classic installation process above: - -``` -# install compilators and required softwares -sudo apt-get update && sudo apt-get install -y build-essential unzip git wget -# install conda -wget https://repo.anaconda.com/archive/Anaconda3-2019.03-Linux-x86_64.sh -bash Anaconda3-2019.03-Linux-x86_64.sh -``` - # Quick start The [notebook](notebooks/) folder contains various notebook on how to use this library. diff --git a/nautilus_nlp/data/lang_identification.ftz b/nautilus_nlp/data/lang_identification.ftz deleted file mode 100644 index 1fb85b357b22f67f019567f0e7003f4d49bda7a0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 938013 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�Qt)x~aH9#esu*Vow2g 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®yWPvf6Msj-kjKzZk#_hoc)OtW?e<EemY7W2ju<1w#dg+_^xW0qL9Oxi+ZUX z&%^8Cr-cvelRtWg`7F4OPC&o@vyu9Z^p}@9ju)WUw)ihU^hO^wvTGIe-H!E2{vOER z5%^=7?=tGb^(YFyfp0$G^a}gx1Oq?%heHFn)+0#z=~&h))R}1mJTApKiEU?GBvUm8 zj}bpvkI}C1Tcbt*@Nw742jKUg4e|44WBs`i{~U0-25~3zor00<51<cUR3=^?xXpD5 z*G%{^(`e`dxQ-=Gfvpfl5H}UdHS{d`0n>nguRz_XoY8NvCL%x9?DEx=K0HsQzOj?} zdT<^`ckHvaoD0r4kD~m;d4EbFn<_%@JrDcpVIuZ!F!f$}UK{@2+Y!BZ->mT3%rASO z2wBqt;%KV^&*$yER5k)TB#l0hBYqVFb%cHwAIA?jl<yYjJS*Ot=EeFP`d?bqPdjbc z5BOES^8TBl`0Xvsdy-Ar=(h@WiK0uQ7qS?2W-#m0B_5(Qs6q(VJRJ>vJcnLr_c9K- z$~>#$Z+!)Q?;@CFs}J{OoSFo^e9z7KXW+Slt4Zb2FaP>E^bPvIME=qP^la~R<SP8T zaTEE8^p{YPc*<qS<F7#?MNS_wTNK8)R%3r0ECYew1xGxue=S%>^ik+>&X<D@FTUb@ zV(@DpY*)iJ%wO2G%<Fe;>b%f?V38pG=KIy&8PtmY8$a;ZN$~izil3@SGT)3O1N6&M z^5QeYuepcXg^1A_U;H*RkP}6GbT5ka#cBL4^gD1Ic3)P;!~Rhj+ND15z-B^@u&+1* zxqkc)&P4|vjpt$y(EbZW#!uB@yo|FzCj6`T-^w(Eo)1}70X)}cU$p}LoWyC<fp(+Z zgB6p2ABegR{b~PnpR20#`=e48jcSV?pToHU;34=T{xIn2#%1a^Ok{nZ*-b|1cpG`; zjcDI^DDf-6sXxIQCz;pz_4poWf2JOF5sM;kq4OrRb8E|f*mUIMDe8Sz;QcZ-EkIBG zLXJE|4m~GGYeswe+sV14yzh>`wCObL%xX5_5>Vt0Zza$^exXh6xv#}~VZk`|1)|7b zW&XW(G9T>EwfN6d{jpov#O+cFJd(Fw0=#~xXIColk0HOY8}HYd8>a4D1Mvr+f{t^M zOv{lQ>c!#=m!CG1&(n+Fcerql&>Z-geC)-Ak-yeZ&YZyh+=Cw`5BfR}=lszwj3QC_ zlF?^J%<2xkPHXF_Rr!%KLBy5w`_zaKeM^G8mIvx6_Em%J)Y}D~x$$dK%0tWS?5}{& zkKhRtPA;6kNhpj`=Xfg$`W%FPcw;H+>kv;Rp${s=hHHIe{7^WJg40=#H}KL(+DB#z z*Au?en|1C)?!(V}D4RF&DT9r2gFhb)_R)v>@bGWWi-qpWXUBg?yGpF<-$Pf?yKTbd zr9)FW_aX*++W_A;fZnl_T7|K%HH-Xo`1%@gk^7*VlWeZeqJ28?HXg{YK=SEwjby(R zdavOI{;}V;gSX|xr5J!~BleZ%&_3<4U45X-IP~7$deARU?(WFJ;_QbPk6?ad{nRc9 zJhn4wE_mtP2ES%4?C#}0$VljUA@l`44dti{$9<NSA^Ks!el0*fGT>jb9eK8}T*_JK zm+yHuXAC2tJ41+8aDSP7>^#7451T$Mkk_qTsJmH=?>ML<!1GZC{KL>iU8k$e^q<|& zTSK6)@?*?8Gy%F>>dIar^6(h-)#>kp6aHX+vyJ4}w?MCelQlel#rl<$S6wa>tY*yP z#W8d#`Ys;fakM3J<%pNAg<yw5Y~7&a{L?sJq7Hf>g>yG!kYjgTwSj)V$xSoBSHnbK z6&{S;N8OZb@LfrY-?#(EIhBI+2tE1FBK&C3{i|$l@&a#Ph*PSW2R$>;RSDqh82ZN> zxs<t+Q$@k|$wekP7;D}x7Og-Y{K<I+tNGqZ&UM(q)!Z#ylmM5Nb3j@_M@I5ie!`!N zI1HJkoxJLMX$SVzp;DZ4+7rF<*k8MV^@A43)0OZO&W(M%pY<Qk@q`Wrn!;EsGM*!x z2gLLIS;DjsxYwA;x*s^*y-R*UUF@^(%+(9N#1R+=9=m$ur)q*;eCwkVgMc@3EE4_y zWK4+4^Syc9Y+4T;b%!_q0dKo@yX!pv52@{=>&)M8l<)t~%sE-qp!)vs-5ImaGLH45 z%*2c%-<DB7ehB)#wFfmHpub7@C36B7`uux5a2e&rSv1hoKW_R8o|BNzGieuyA9CnC z#$THK$9U+mj#;EMah|AIA4I?C|HmcZQ<Fufm~Vp#p*qd={Zf+}KqsF*6OXr;?=<(( zS)NySGb;kQc89t(=eSQ>MLpe~=>P2j+6SH+I?0D++`9+6E4@7O^E&H^Lg1%Xh%V9o zRS(YDY{&Wye3Ck%!KH$<!HFLJgdYR?$T!kW&(Pl$`=JNWx5a)_ACmVP-gVXOF3@H- z>as6o-TTc)#n4A3(5Kh<z3q77AA#Gs>BNP>AH~>DxCY*9?B+Zg=DCWz;BR%Hx4)qM zwyfK?xafL0?1&P?Pw@UMf>%ugkgK!Jy3KvDuf)MJ|3Ei4-R0gIz&;B7_j_s6J?<_2 zu)%@<ZQ`0oBL}*VN6+xQORSq-0f%p^ta9T%CX#(M=yo2P8)Kk{g4f7zVBW)V3c13! zw^+|wfzOBk-1VCFg^8#7-U_*NoV*S0f8j6PmX&@M+tiDG!k~lpb6GdPHK_Xx#=v^+ zLS^QEAO8q)w{t7jLvifKLL?36FmB=kKhsZi3j4Ee$glR{dWGF_H<WWPn9q&n<o|Vt z&J#JWbvDmg1kBBW9PVXSZQy?|(pBTCf;Z}k8lkHRz-$Hdy=#q4ouPl@aJwi;pp$dh z58=E2VBd##WFNAkpZ<-d-*O>3&U{8!GEw`E`Hb?>H~1*qFQeXrhy8zWzAWST%6?l) zQRE%UZ5aKm*~2=cHT+0^*H!e(zAzW<fKLqgwe~Zve%nK31pdo%8D!`C4)W#$7UCBs z&U9gW^w58ttC<bI-3o&;6<|L9Veiw=P~wSd@m|SNPI(N2Fgm)bD{{&Oe-WWP%51VL z8vNx*W4!{s_)%|zEo>Dan9_&uEGG^n2XuHY-L5Y^ng0)TcrWaxzrFRXAoHOpeR=SC zy$t7jCu6JSM~2dWwwIx*RT{s-6mMOGAmjd_(?;m|N#qYshriak>H%=I{1K=?zH=SF z=E7>&Yhiv$LyyGZPk%cEIy&P}GWVm1KRmMlIxZfl?CIzMcc+%}-PwGzMis`?gMD}U znMD431IByvkdI(5z5m0PJs;%MUtwxU`>(`zVv^|Kb?TrZC&ogj@$i-Tekf;RW6vd$ z$Hh3ivWS_L9Xj1?(FW+f(ixk~$lLKGaYoSY$V;oTa81Py8^-sVw(wJT`24*igj_WC zBTUrEMjme`h%W_t-uop`@xWn?*-yjK*XRH7QV!ZxU%~mb40QU>P`zU={VA$iEf)Rs z(of&%cLO-YMXPMA@7ZG2$|d9*fFc+C1!aM?n?L7&Gynh6LPUzL#^an!ZH%0r;I87d zt4(|frA>6NCwb?*KQbj$+qsX9wh9rd^{+j(h4~#KZmALYnnHZxX6W^g1gn<xfZs=1 zbUG3GXaBToZ|rO8<9`D#wJF*VLw|+Wgz6RJp7PU6Q--s?N()vz&%c*up9cD#`jLFt z;;b8XxvLZK-pF}H+4F&C^5ueo!vXZ$LFhZRhr2%H1`i}DR*y#B<1de7Uj2^RwF$aC znaQF;^xOUb`w!5~);V@Pi=f{bUW$P4$DFjOK_Bo>utx&zqS#+Ln!zutsGA2|)?z%Q zjK*HdO}$s({m6&956q{jjrt78hZFNzH}GDMo@Tj?f-c%{j#(M#m2-ev&u2WtjjDq@ zir8otTjW}p;?xo7<{FFJR={b}em@mqJgc_&s|3F{Z;bHcy>rAn3%Jf0?4|j6@avTH z)Stb;-zrxfMQ$8_&-nt(dntaB(!3YWI-(rcWebS2tx5b3ai$fxKfS}LbMVKRo36?O z{KgV&bGIx0Md}+|9{?X@CqJKd$rHVmJ_3GfL_JjQ+ux+_M<wjl4+h-?K7XDH)MoHK zl`$Py$$MME#L*p^?B`UABCOZg^drTHv*Xyu<NIB2!qZE!Fa9FG0K5c~wD%r87wQbq zj79J|`2a_u`_l)gKhqpO#a^z@`@dcwpKBvZh%0JZ0sbs&QbV3EpibL3@D=gOqLTxm zqs#8f##p+ncIONb#?Pi<A|T6x{po=I?Z=(^y@c_a1OH$9`ZIAg1EHIwq40G9_7|v6 z+M4&u5J$P4??>nJR$K04cDPVm82|HO;x^l`-dkhjtaU`tBhC%udKtf25_q1`iF{7v z@s*|2ab;eA6$#|b5A3(GM)iTNlZpH3M*GSnjcw}0ck@%f%8I@&9x6hc6$C$x0uIHy zxa$t`JqLW+yghRBSePExVcrJ=m1QP+xDWMRfctXtK(@J|FK&?^RTp|737f5dH91e+ zMy^RKeMO07&a~q^uEFeWR}a#81M4n~z$D&_COB*mbatn5fYNB^``V;OE3k>E?>mV5 zIe(bd#25aZVI>C{`R+;n9rStnx>F~!qsu<HX%cu%pI}ihKkTl&)DwfQ2R8N6MBZ<7 z#lfBscEKk6dE7r*ZPzW}_-h_@ZRsbM!Kt6nUD1Iq%7%Q|J0nP)hhmppqaGu0>x(~c zEZ;qI!k};2uqUX4I+cE$u}0-6hWwz;)6442x2da!!w<Vxv5yzWdf=o*OPFt&P422) z3j3lB@v+c#P5h2*8E}>@ao5PJk*~>b1CAqRbG~~l^KR;)z0=W`PyMu>@l6?S)pXij zVIANK|0hfjR%A)!XJ+ICeBNV-Nn7hPUKTAs;oqusPAIaP?}auQ=eI1Z&!MZ72b>F@ z8Tj@?=h5ydcF#h7Z!w>EYv7eK-JwO?xBA7t9DH%8WC*qWdEPEi-GR@N!eP{YMy|2$ zW{E`XkegO;U4O`5$DxbU#6^WMkDC=uTFLW-nbhmzdVZowACr*l#P63vUtK2;WgX9F zS9Q@x^pZbu86%ljY8UF$Ax~cvAwGxs`nnn9K;*2<!Tu!ju{U*oHuGK*%<uyI4ZdmB zA^2&D-J#8Sp;yjb+yR}qWDV7Gu6fCiNr4X*UJlhX7vSwj9un`*X&R{I*i+37-rCy% z`(}ZQ=0hJ#Sm);{2Ypv3j;S7U>k;vM(3LlK?I`So^b%%G$%P%UihXVRt(CyJh`{3< zK|33Q(Ze!m5%gnx1&uS$87aXU248Qz5vbjKw`E)S0C_Z;_=G*&Z`$mo{aowLw(1YQ zoA%fuQmNG7T?l7lVYhDz5nJ*4UN1yLpr6+ic{xb?ZR{@{<~j^NdNB01leqY!+<Oi5 z5TQ|=>uO>U=-n6O=`z00Ywaq?_!6d(S2zVaVIS=Pa$%s4w+@!&`5xBoz-OkbLu;Yu zegsjTrJq*VtqqvRUuOKg&|7cvW6$y2%zhSIow`Tded`qT6#EcS)zDku=>orx8BSb} z6F5DjZv7JQ@e{uA#%^FAv@q~VBrhNUJ<^Y0;(E|cUg{uCfFGjLiDv{pxj28xr!@W< z>XPI$pcnGvpQYb?)K3^NhWR#RJjl5tl|xmm8TeZ7rs|onJNvn7cMI%c@R1Ar+{Vej zd?fFY54;S#Sxb@6-J5j*LggCwEw1?~D{}38ee!AG?+LR#)c`t5_(EO&MD*VR_6hjz zoB~Fbg3gNX<lH6r<oN=pp71>7fLV<^SdZdl+YNtJCMdZf^!gq<A(Z=thpCqW{M(WL zT&E0XD*o4(F^qE={>hH4zu|XE$LQ;MBQZzFje&OEqyLU4$#dZO%*8I8-HaR<5h$N9 z_It_qi%LfCcOp&>xVXfJ>USUX4(rRz{9a-_x^6anNf6*m-aplm_*vk6p{%R?#?hYr zw_z30!|xp$$oJZI2-YjwX)yKXJF#zx9a|_Kd564NlZIb@Cw>9svpIseZsbg%{OtcD z7iOgTXb{h5Y&Yo|@bl@7uyKVxOw_$Bj(m-#z9RhhS74a#0q==1PUVJvbM5s|Nxs+h zotr*!{e}NBGyS!hW>fRJ_zj3N8UXxvP_*ekes7bLbAlqVg(;RpsXTmPL3-GLeJk>= zKP{&{&c-j$Ng#fLw$O2#pB{=so*XXVB5%I?%m=vw|1>SaIneOo%g*FgH-ygavOc5# zC4BP-*LPO~)SBmi^4{xq==-V$wdA`ulRTAuA^4)M@eBG(pbke@3w|1mO<doKKS11b zAbRCG=TDY^-=O86^yf8_Joq-)#nb^xg&yiW^-)Fe(**tM3S7Rf_g5<YCHoRj&bW@0 zA#R%I<H&o=LjRsQZQ9GY%^lq|68_s^C$0{Di;D`=9r*Y4Id9#oh5V@Lrme`y6J^<V z<onqt`)NCLRbnggi10_V?97k%R@*smC=NN$(JE5>b^VirTq@w-g?&rfXT1`l-MN|X zH|mrzj&tlY?FPR^siWiv-M>hru0PK!twGm-=g94>6S?m+(x5P|>GhD0Md9b`z^5~G zGRCQ%h2fvpHdTh7hd(##K^*qhgFyZ0g}fua;(S)@q3SkjF(ayO5id<Y=aak?#kI)` zyC^B864d?lVO*=xx1Z`G4~R?4!|w%;Q*US~bg{=v&4I@T{9kW#0JjDBxq;`uL%cM2 zEbEYSR^_Gr%Y8wrGzWRvJzRz0`zqwMw16+3kze4!{X&Xh?PR_t;t>whKER!Gl7Mg8 zd0*w{e)kvhwV6+`!ghTvz`EpUu-=Y<PAvFm;p=b2#l_O@5l+r($b)g@wVoIZ{#Q`H z2fTas@=-YBOT31iHJts2w@zhshn^o;l?Gj3#JT%7`lTB|Y~jd@wL_>6Hys<5^8yRf zZ%>?CmEm`<fAN1pPtRhBmu?GPv+28+ar9xm{iFl(YpYSFcF2QJ@(wci2<J|Q$-Z^9 ztF~o>FWiFlpf>Vrpt~+3x3k(Ta%X(Mse`f!ymgIr*AC!O2|CRa3w+;V<BdW;rjdur z@6}6E4{Ip%UdeeLZLq^*9l|6cr^K$S%zJz}z6)N~?lP)wMfTyYyJ$ox_WpoSRnCc> z_`{~u2>4;CkH%ES{_qLckzv4zpr3Qdv7pQT8tPy@1^=*xqU8ktkIjyq!+yjo__NA_ z5LE{c;R)1D1AlGrhAEDDH6%~%b3yzjNzh3R`ll`zscs6lc<KnhdscMS`8e#T(a3!G zv+fJdgE#Vh?BSyI;D={URc?>1R4qWB@bf1R=(Zbjo4AR}e5dF<7hReG-ebZvgz?p# zWK=EsA9;<u75HN`{K=9=@0ytP7<~S&YEg-5tfQ8Asyg572knxIsA|>7)8PM3`)%@^ z3!jbilK=FKJw)PE{gJ08&V`~~E;}>_e}tpob0AN*U?k-1$Gno+uPVoLfSwwUo_iCf zlk~rm{enq#f%`G`E9k#L8uc;2OG1E2l=MOFk^e)#XS#9@5aRwg!Ht>0@8ok~dfW_s z-JCJd?i2Z9BjKMZ$?X3Chl|uV=~aYv@_iS5W`6g>42ob}!O&{kEa)fn!I*sT73-ji z;P+>koBjkobI3R8$oJ~Azi}KmE}iMAp4|Vtnz$&g(d(!O2;H5vvp>oG1N>r%1Mv%S zu18<)@B6b)34MNE?4_3Ib+2@9twG)vK%dkBAH!V14dc7{9=XZ2_Fn1=fY*Y58?>no z^2TV^73j5AlW;A7{u=mO)GUE{rMhSs{ZFm#t`O+_QwaNG!2Q5B;(6hp>K`0>Sp|RY zP0mZ@8{5hfzg8N5Q#0xj1GkYQ+|<_vJCeM^(e%^uEWhP}Ph&aX5ID4mvgwiu`wN`K zGR_D2{4|bsl`9c{#5^wV=Nwwb+kJlswTF0q%T?p~{lq@}fw{4BNKzQx5xc7sIwui3 zg7rxi;91CpItJdn&!K}8Y5xg(at7D5Ljg*M@Agnk^%{11t7FuYXTJ9edT3)Y<mw-x zY7K5v3XmrR-yQPwk`HpVcXNkk@xJ3DG_w-bjW90;%@t&wI1j#b9(Tt_f>|)#u6B&; zYxWQ=qJ3+#kNQL3CYwQ5A*4qX<!I3w{r)&ui~0T1RQB8QV-GZTC<}C&uLyN9o3I{p zrCuWal>U!%*10bJ5}?uOt8E<KJDC2O4)RqO=;{keJ1gkN{WkUW&CoS@jkUSHs7l-i z&tIJk(TG{-gPwMkf-ZkVQtyK2zsQ%3sEHl$lk>H?@64uOF23_$PfzWxh1_O8a1+n3 zWaqpSuBFgl!@$pmj$S&8otlnuwVmf5FJO<u7biNKgo{m;vjpn{bUv3w>EFQZXIpgj zVtDfh^>pCB0qie$K_4{|O`5>?v*XuX4&F-AFCk>AF)diT>Boijc%e$*1=u`;Pa6<N zv6tuBK2l#Cy>MlYyP~1Dy(>AtmFH*J>?z6ncXFdg2e7Z6KpjP%e~9wX5%{~+L8or4 zV7^a-6bh})sT3eeb*a+pP#vOO{v;!3rLZsZE=U!ThpmRV=~5bWewsJ~e)qzExwsJf zhZk((k*fS_RpW)oUE-@8;AJFr{)WtD+$HRK+ZVZmKYe3o{29a_bF_#KQCIOnQ{cMH zO)ro?kB$>(#_vlw+@wTY2HzXh6@D9hfcThp;QdC3=0V4|ZTLmqpo==3KMkE`VSoQH zd^LtVksL$d>vDGO0pEpxQ*RwUxwaC2+9LWn&ABR!a~|v3%fK%^j(R}w$Yk=8Q)7VV zBlh9>{daa(ks7Ow#1k$lg@5gYMNP*7hgU(W3Ev*B=%WMGv0=*FG#fmYV3E9}4fObi z{l~80_MxZR!)Jc89lAt6rP+j<TORlalNZi-1Bt)d#CRVDo3yPra{P)}Z)xYX&!Fj5 z`40QEFX8iy#o#*R>48G5d!UP$PoXMQ4|z<y=O@~yEG0gJ@8#WqUS*#332L7`6n?yH zR36~lf&8EceKK?v=T9^LMl>SCjkR)snt;bP_}|X*y_tJ_RX!a%kf4=Hj4yL8>cq4H zuTQXNxS!OOeU^sEAvc?zhhu-#b=6mBa3gse%d62Ja<E)u_+=t-1-w_>>Z?M~_<_pQ zU88?nB=NR<_tvfu8T{Zo?EXU7Q6=&PX(@Elj3huryxJb4egycwN*qK1?9o8##JSS` z4syLl5NqK9c4{)CuMmnSkq0kZVP_(L@AhQfNxNU1=kc~V<LVzQPrg?a++?Z<pAy&j z6!}((eQeJn_<6hyVhOKV_&wKyr>M2$1JX~77w6P3fsTo5iS5Py1$brYt@znCeS|*t zET?`r-`VuWsK4f8KVw%ugDxBT`RO?FF0Egn%ysc&U>_%fk4~dGA0-cRaiLM+6|nEK z5N~BgU;pW^ZQ%FG<^XL1Pg)*G>_6WlF1u4U<V2jWMn$66dWPsa<9gqYxDUP?6cj2m z{iM`zC@1`zZN8^4@pSG0dBec5?`JoW3aZZK9O}OiJJ{P_w~!aFM|dcl_ut*d9*0i7 z+fkQv1oAeUU8M&hAA`J<iQm^gHEDEq-rtPQE{<OXxt${dy1YcbMr-uw7zcZ>JTGoi zo-X(wukbtXovR<HaTCzz`B@(@j|7||x51<Lj{seZgP({eu8^BPaW?#_!oDR;c^moo zi*KBPZVt9L$^zZ)eN26UB<$v2=#3QY!iFX_rQN^8pVa`Kw-;H|89A~P<G3{a{_$6U z@)m_o+xyA0By>5RI;YHcT(V7s3aH^ktIXipzhHp=W&90#Tl6U}b_01Oxf!>)mqTow zYur{3#Y3lm*nET-)j;a9Z{@u;Nz51ccfCYgPwd^P<R8Ni^*@AZ6ml^v+Nsvi?Z;@& z&xW4ow>4;aDfk`xs%0bADcD<?xXyI<*IPI2dx~LBX1;y-XeZ#9n>?gbIg#h&`{iXk z#g~~>e=dGKf6jBSfn9P9-2j}6wkJLn{ZV)X=ZDRJKXwxT4gS}U@>VqORk$9a`@rX4 z;>vv5<3A(#A&q`_vA(f3#4auBCf5+`A@b_y7er59!tSs^XT+!AdQvXpx$i+2)@X;? zjKWV#y@I*)w-(sv;#%giLEXTouND5UiC*d!pd!3C{u1>z<{{^6k;gI#`SQ|RISL_f zx|&s_1NO|nChY{CnZ|giEbZT&;T(79I^dA)|9fFuST8r4g$?$@S7pKDW$IgO2ain$ zoAhBKcK-yU2uadvf`1?J{5o|{S3*Zg(0HzP>~}4s&H>{&a)UgVa@e=+sDs;)@ew!I z0z|%J({-~y`0LA>dN}Ksa~|3Re1cDgiIQpB`<6PnTz^r2^;%c#+3UV~lMcTgaM4iY z=D{s~`Vx-4($1_O%xexsFq+eT1bLF5=<nndAH|#aevCyd8K_N8o;q|Bn-->xW6>)& zjLP1Ebr(sYx6oU^E(fY8a^uV^e>G<gNBj6IUp?eRaX+n&V4m5G!eywwB@Jp#e{1hi zucjq_yF+10DuDbwPyHh1^_lolLh4kMVxRHQub&HkdH81#av>!N{`lpoHoSl0e3&wo zMc<cqQ8;{AH7EQ%06YT!(OIF#bM88ayxEUmZVmnQU|$iFTfJ(8$cyic-btMv@VF8G zUpxBS^(It~74RGDy>ifB<Z3_V0sf<V2kAe)yQLg)vnj0Okk?n?7vlzZa><da#4{X^ zLeKx>r*P=7Yt|s8*1@i^`D$H0^h?=5Jp`ZDVdPVThjv5Ubaf_vC-$M8nW1|p^~u2d zz9z&K6a;Rpr-#zduE}2dIT=2i&pJLDIrPY^>wGWnaj1?0$7KZbu(hOIW8D<840=j4 zYXb7N=X1M8Kwsts>^Ig1p2T0I@ZOmzZfZ^Ybo`B9X@7U0J3b}W#l!_ZNJbxJrEZ)n z_6hsS&AFBxYuDgv;ANPnNCnYC>hh2}s_Y}Y<OyA@#y@(e4dY02(;%J~tcM@56ZjlJ zeDf6Wwbw^=#=$QYof^XLohiO{iE%Ytz<DOjuN?cQ-<Ly|^iw)N_V6p}f<V6utNCgH z*FyN~s=?>ScLr!E@AoA><1OQw%({Fk^E&Be)i9n1<Hx-Voy5jMzu?!>io7xO=vIVR zyZ+dt#T*KO9->0o4?vzd$X8kioEN*3=fV5O_7cy;_j+cv=mj#n^D>790}slQ=q!Ji z-??Za?c#@7bsu{3{M(^Sz<**dtB!fo-yDO!q+tgH*|Y;XD|6FR2NvU>p$HkSCJj4i zQU2zvN2ovF4tzGEcu_3!F8nIz=P|zD)H|C;yO?1n{bXGCqHMYapMS)kKA-2A8?*n! zcmKg3cMSTeULsh_cs{W&_2!_*c=(afD|r!Ty`vS+i~49W<3IGyU-OD!M;zolm<Gs4 zlBfxlRZ2sv27#BJ*L~CsxpRDjD>ZlEk4yf7<TZ=^<3`M@$x*Y`aPQm$OrT@GGVDDh zA|EnyzASR*cY;w}DkAR=d#lk*WI2;<Iv%}7oV`Eot|p_0kP{Eugy<^x9T80a75zn( zCLRhnUua7{Jo;w5C;k+k*QrLm+Gf!0Fb6pfj6bKVq6_11C=jTf{C@p_MYDl#*l!=@ zDTF;eD}=pq<oP((5B#2$c$j?Ck#Ct;hal(c_qVAw?LCJ0Yh5(*y1QBCrubRTaZWJb zxiizCJ-m0SgM+<m=nnrgN6Kg?c7`nzcGQyqh4#j7%jv6LV^}{E54n%_9DB`K-N>)5 z;l!}g4t<)y{7%g=D=YMReVkK&((YG3i?SA=E&BwGu&>g0hNy8i{8yJ<)r3A$bA{+R z^FNoLbGWz;V&Cf^@8#_qq(fYDm-5gO#{IPs=WlW!5EGy-1CT%H^LgOekifohJaj)Q zL|2%nD{-R7Xm@*w2e~is-6P_8xz<nd&|~mZmLQz>$h$x5Qx^*PUwM;5wcwkf-TjHF zN1j#*Lg!*fz@ry<Z|PrlHRt=2tC{qI`^m(M_X0kD{0h{{PUxZLHXZE;KlHN-^3&~w zZn_QKf1YYqA#`h#n}HgXK@Wd(P8#orW%rbI9P8AQHr?QUB1uD0T$>#5(MR+^(V0fY z^~KJ#+q4+D_;v&5c=lwx56rqnJ5M%!f}+@ey=&LL75F*2niS7?f4F*3Qw=}yFY5R) zo`g7)I!0uyJA;)3AM_)hC5AcGA?~~iaDKPnOJP;P=Mm}wfRA61)G+{W_saQ-&{R#s z-tb*Xdz|&=1p3d)c_}sMpSnjC;J;}<v9}mc`Ku1);Q7yd)E_foKkc(AQ*YMmwJmzY z?<F3y4~Trr-P>2&fSU(?hfi~WADeDZ_}$w`UD5{dTXpg-_}zBdS5J9fXpy&`bDh)P zEJ8ul@Ei4|utT!@S!98KukL2O$@3+*{q+I-9H5Rs@g(Hk2&Z-f?|78MJAVI+6Jj=e zRPhS?zQ~X0BIE@pqE9RaCE38s5{tgjZficHjupe-QNd3?xSzzncB?e{Z5FOt*aye% zaGoX4uSA>lAMg26M5aOs`1*#6hPZ&Ahx~{<m<C)8Tw{@shmd!PZg#ClZseU7K<p** zW0Aj%{9bdAMW34hk7^D@^M1c)o;o@Lx!8w%<u1rO=2Rg&@+^XLtH9r9&cT|FzL>Qu zOt0!9w=o`0fZvU!*<Yi-6(_<J#Qj3zZw@!aFLljF>v(?{Nw<Mc@M1t80EhL#oC8^o z@kd+a!+UiIf=LTN?&4SQN8V*4&bJeM6@*Y)7sonmXpr*2AH}HO(UEq+IsNs>3clas ze?@+s;oO%kQ_-W5)MNF+4g~(gN8?ZH6sC2^-79N3&m|b!Y?==>m!LBay_*96Wqm@O zS>O>rGe8lHBl9Tg0*+<9;YS`b{j|FitQuv&+X^?e>BzY28}y#`pQ&G7ts?WCL%r%; zET7qzD1;pR!RF^??63VF$+w}uVXRNCGoMdwsGAoAogL&nPo9V1XGw!kdN+2LsWEX! z$U$H5RFHG%PIL9G1Fh0-1Mw5}q0{0|v8RWl|1g#p(oZ_^6r|E=>+(=loW=MbVej?A z-bo~$o!`Up=idf*H->;O;JnG|)cNY{XS2T?O~2odV#jj*(#5P@%wrl(&=%m+fL-`I z4|;*PpBR3hm6yFe<e9IlK?&SXA84YMKK`_#)Df(S-1y<CLCD)8$6a-{K7JDV-Bt}g znc>vr6zHk3T{|PuZ{(#F<^BKI{P}A-<0=uP65M<Lc4~EbblN5Ik)V^iJ*oH2{5zht zi6wyg)pV*X?FN76Tq*G0e}FeNsEO~HWX>qrr8oHTwl>9%jPh3v+PyDe)nW9*S@H@e z00)=qE}8+{yh;YBBJ$?cW2>ydV=u{rl%~^7;(YF*UtUIeDk_R`dI!jl`R%SlUKxDw zXcu)QY1jQ8aXG+cK#EN>D`9UEH~yMy_UoJv(T4TguyB>*{e+|Jo6`OT>#j_U|Ij7s ztnl86UF6?n@Gbk+`5Bi7NnPEM6Zw`nRUf*on9jLN+_&zDoJM}7ov>;*^P8IArqWf| zzbNfc2l%rjd2DM7;&*kh-%}O(UTc9Vux|$uf0l)H0m_-u3e;Z?mVx^lBdHJE8hWAK z6x#QC9i}FX?-{|X@A=N`G|rvQ81HYZiVeoTj>BI}`+mJRcLaHVp%`^(xqe?ooDS`_ zZSc@E#`VQDSU=!%j}O7R2>h%cLo|LF@C|iUSUB{v&8Yj}snkl7TJc`MHG_t>M6Orj zJmMVKm(loZV&DUB&S!w%O1e@P#S{O4iMmx2SYKuoaqEJ9XMNC-_y3-0*L=pG3;X>W z`s__k;&h-}$9PZe2Lz|8P<NMhh1o>-0-n421gJ(beDfGR=7XK#?k7wr)xSx+FYS8n zXT6n^?`1P<J@Cynlk?%mvrZ-6>@IjbGnu$Z;Ma#d{wEGV%)WPT;PY<3O@0IL4`nwg z2z<O?6Qn==eaBf>9sI@|VjZ@K?>z-J@#xVk<VW%Qk-?$Z64=Af3>w7!!Vv0vR>r=m zz&>?9@WDQD9pEyO#a&P6;~@T~6hN^1o>^7q!*6@Y2V?wy;!oa*ePCG@CXN75rEvDg zkT3c1vra;;dAxK{zc~B~YeI-cL*8ESRucBrIo6*iJ7K?|fAb-S^B<tDn+Nm7zrL*m z_ANmJbLj7sySK&yzs{G@yNu7wrbjB{C{Qz0g}IKWuE0?%{>10V(6Slv5v*h2mnPY$ zf6n`r1N>$0j9enm>z{hq$63*FJU<#roqy;%Wf*o8_piyH-5Jk&{oS;TamP@cVkysu zZ1C1Ht~p*)9|JkEcs+H<cyG-OlU$KsBZ)tnS_b@gr|yT~bL_o!w4V~sxd^~<CiyUL z>%oTveQxCW>-(&0<N59~vjR&qk3>JE!mqif1gZh_IWZz!Clk?&U+qd^+!bEpUx$D8 zbqUs%{?N(v07b(Oh4X~#62E&MXFtJ+KK&h_WaL{5l$EhCa+3Wkwp^*@!oD5-R$!dP zkyk-+VIovS+xXZ%#xt!H^|g?v%_y?O5eM4m?W!m6Z_sh}1EHVC;JX%ZUyJg7+ZOpm z-t&9<Px>=Z*`SY{NpAX!e$KIOJHWLA^()Ja#BSW{rAN@EJ9W8=)8Cwep-M!rzuFwA zq08A{Y8|E`@bTof)bDM_cj~xl!EE;LzIv$rD8@4l{-D1#olMk90RL?Ev_#M4O$gQf zc%HwuYw0}r@QSzgp;vs1S#_NDtC71Op~riZsLRYeBOl|N>Ve(Fe*Rth`O@E{-N<u~ z$;3UbVB7>*o#4G|)!lTFYXFPYV<oYp$zwiGKMhA&HJkC8^LWc=0eF37&^6liMmF@| zcda&PUOv80-S>5k!7uyaZ-H|k?B0XOg_^^ix*rMO5GPgy{taLex&wK&-rFLUgsf@( zR3jJP`!kfi3gmAJ=XTTok15or=DH}EydCh<eU*o@qTgP&b7)XD^!F{h2&vS6cm0HG zSqEm3S3>(WI2}ms(9d}W{R{m?4x!#Fa4__tuI(V!ORK4)ScLJ6v1$VS)tQc-NrTTW zI`s)W+{xJYj7N@i#STFpPVZt@MerSfpZx{>mS8<eD2M9a_Y|g%GJPkG3i=#di8VwE z)&<nT+e&}G$**k-yzgXjQxN*$#uDg(dDOsOm=Ao7k)C1+ss<N=^q%X2Az^A)5pWV` z_PaiI${Xr7VUL_dE`Q>8uQj3S;D-Fa=%y&>@kc=)rRQPYuryQ+a-t`C7*qrJK1?$z z6YupWj=4C`k2N4pxI1)7-Ma<I!FRr%#MHs(Es5V63;m|L>NEXktbuv~|F9~Yr@`}j zTP*6rc<<#y@4@#mV_o!$t1Zy3ZQyxGhj5L@9-H<8{3Ey0-x5DUKOt@0)n_<y1GA`` z4L=pWVbH8Ptlv-yf1rmJJ_`{`WL3ySd>`X&9>6{y_!;EyqQ}@fHTPNcE&;cADgI_K zPm<0uH-#?PhcX7B-%D_w{QQh{Ch^GJPbtf}^zivr*70qbuV+q&?m_Rbw+E{^?=8DP zop{=P3?wfc`1(f>=U)ImEYEpVJikC)Y(rV-a31I9g2z#7ycNLnp6xso$aQ=-cg+O< zi?7*qg7*gz9|;Imfw;1M%+Fbcdc)9noh|4|+BY5<EJA=)qOeVbJZa%^>T>{>F8A%q z%Kf>X{-X4woO8*m125s|kttKLFI<B(%Y+^|f`4}*_S;&!x`Pjoy`h>29*&cTX~~Km z{4hXAf%~8>_^If3{8FbbRYjhcC6COG{u$vADX^NcK0uj(>lXYNvB2H3je5v@f5ahh zHVu0F!yuMs>i3sTci`(rRsED{68l@|)y44hc-GU)!P}G0c2$8tyX;{c^go0BMwZaJ zVGmLh=>44`SbJK+AOE?j0R0_a8KC{}jRAeVvOMiRkzd;gK3YJYXMXsR_|QVM+fCgz zN~vjC6(5~MPNY0?Bc>a9Qk42bQ{V$|=#G3W5$VR6#n{uEEcyYxL>~7PszvMPnY1s8 z{bK4SAFWOMP54Xr4po~~g#Pz=JJl?V^;VLLN^$SbJXhp}AFbF&bD)3xz^HniM_%;d zyW?+Ary)CXa)z%?#j}1S&eh5Md!o;7WrFTb2T<D`yt98rh_U`S;UYWmFG(CyBKP+n zgy;-%Wi6X*#~I(|{_dLG5jdNnE&4sYi+;;64)Rwp)%6|S9WWkw{*?2=nMXe25dHx# z4}<JVs|mdkq{EiB8aH+5H*}Y_#7~nGkt@|WpNanK=QL{rzdt58XA$(VW+!$1`IhOC zU3D4HLh=Vn(r;#~kLq(j4cckVHJQ9XLX$W@h;!}0=QN6?R!5KZpJC^0a^mfX&n2`{ z6Nw|}%>DBoX7!4Iu5j+mr2lCx-PD!mlW=wi^+&Eu<-Fa#)TtmI;W2zW?KAdkJ?!T& z=z#BpEhevu?@Ve&zB=zM?&6^c@VeEVe4xb{@$BwO=6NFaS{>-j@0nG<i__md{EF?- zv*Z)^<@Yj6gEg3I%AP<W(zPGHFTV^sH;nyJ?z@JQf5G?vo=*NCa&pXo0FC7N)dxoH z0S=cq539gH{J6b?$@M~a^<!`oS%2jw|E)9r);rYGEd;-@o@n5}-f7^ea~)VObYh<Z zc^FInalSF=(oxupF06Mexbbc5^>+?rH~e+LMU(hmON850t|?79&lEXa6`?Yhdvg{K zE#mqWKj(qU@MS@#7IWWhroZ-dB95p{p!x&n?AUK>c)qeE@*Vy^jjXy*4SU5uKnvjG zN8hQl1wEbqZ4$%Kef;zR;49N&cRhr@>Xi2SA4g{y(B`s);Wv;334}lrAXtI6)Lp4l zrLNSeySux)yHKI-M&0Gq-Q8Wzse5}L?vHlZ{UrPCj_vG-Jn26*82kp$X5I7D?H0&Q z@)zypz4dXbtT7ZnFO=l%;O_y>i4V{}#Y|l~a3tlYr{47BzAU~vLjU;gHkrY%F+beo z2VEzUhizy#=#Q6Wg)ThshkXm)7GLQQM=ARL#ZQ?^Apd{bwF^GhY^;|yMq}smw2Q5; zlCJnrlZpK!n->T4l)yPkTi}DHRz1!QjxHr{EZ_V0s!6y;=yEyogaL=+l)VakKS?~n z4fLQpY~Hf*zGoN*t0E7A?Ge<%WgUH7dcxA?nrBsqIPegs-!t_8I1r%yjB|BM>XE}+ z){nL+-C*QnKYwjw-g`y{>m2u8WBtxR4_i-qsX6?l8}VCt`m=w6mVY+EF63b(XCM3G zIP3{|&|i0u&to=xp^!mW=s*0^U*4IpUy>h`BQAL+g(wH>6*ZOkckpUFMx+_gaT)9a zyL&@FIAfpZduo0n-yYDq0DlU8r(RF1{xToy^SQLO5%biZe8!>R^8);IXQjp?JG2zO zxOcT#Pnh?ZugFsH!#U8dtl&)~_L5meu+KtA@ymEGPNQS_y}3*d)1zlT9@NHRJyY<D zg)bJk=%HwyZ_|xDF|-%oB(Fm=^e^_KY;kn|i?70L@SS|<A$*68d@Qg=<;O{S7V@*v zdN<_`LJwKzrSri&_mli2tn-taF4Z!!o{y>PI*4_~Z>3O6_ESHp-@*GY1cs<@ch)nQ zymqX^5Y8u7&4xb^Cs?@x^NSNtOAtEyC7TLa(673B=pplRcOP{c2C!edNqy?#{0@Gs z+kMeX(UX%)f@d|T^UL=REN#=mDabMMojzhcPBeF^+#KkbbF!8r;RED%J5Y>$i=8}O z%-eD7Ktt*>Z*F$YXb!)AMV-7J>?h{3p2_GpxA514e%eEqVN9g;hD(LBVt;zzqh;{9 z!8qO8E26Kx4b+ur_K}4-|EFDknuqH4fe&Kee8M;elGp8Jb$)k&x6VL^LwcC>8agmt zBfr`N=!ST&O7O$5ntmF?ygov{{4Rh#PQPbY_;`d<Z+K5j{KG0oq1T%u^sp8CNAjTb zV!W+$Td6S#&K@@C{V2v!JVG_#18b-cz|a&<-QIWk!IQNC`iJ`m=B17S^F{%5^(u{> z1G!&{`98wF@Omu#^9+6-%aQjb+;rGXySYsfjB7M?H!!_v+zhimy2A(Xqx(cV*J(FZ zFNJ;OQn-FGuldRUuzPCi`gp6>c;xVT&ZVH=OJ~U^0A5E-cT=a)JZB>RH0!&yWw0Wd z&)@w5w2bu|RRljo-q#_0fIjp7fL>nY2*Lgn6{4MdXC90jn4UG2b2U=;%7xxniFLUN zjv3$^9})~I4qm>--Xz97jQoNg@Zo_`PUU7iS&x$+y)Sk-;;DA94y}#E`GfDLms4+> z`;TS|(N^Zyg#Gp)^AKD)Ot)*X-yVWq%Job}{F&feL+;~`#rl*uV9*2b%vnBM^_dqx zkk`b0k!3kQoz1!>p?5HkBZxEm+z<L~MIDm__Kj}DQ*vMDkK~o$dsA@o4d!~9Zbl_^ zfDaOc{Fw1=EKS`8)~%q~PiDUB>I#GI@ZL&K{d9-*nv~+LFU&`J&TDZk))kzR8}NML z@)2_I{y6lb9zJ|mHSDGhc@C$Qv+1DgmnH?U4x>4Is5OM|x?@&7=r;<!xemN{fTyLP z*W<<6zww^>BoCOL6Zsn&CKr6uG9LeF^r^06T{<)kydeIPEvrH~*UH87n?G7K6ZtYX zjhC*$Z|)IXgUOk*RrF=vXS?LBMf1Q5{At?^WE?i~#xO6tzJ%!CO3-65?3Fy<`;CvH zxWAF7Nq68++b@xaG(GtG%B+lO!S{2-^=3!DM;YYFdp4HwS3|yIRt@4;ke69afy%{m zEsjw~t`qtNJi8m~+o+VMGV)&UocN6`1P=)U%v}!p^`K5B{mDl>mBhT+;VTompyy$S z$iuTEutRhP?}}zOt2VzI92=~wwc%rbvG+{I?vjW47tD{XVuV)5@LL#H&a%EI2NJhf z1bo<xUlM#MB|J#e;A4M|y5XzJ^+cOaLYFH{<ne1xe=eKy(eKvVOMRe^CirjW0N)<I zfHxzLGOQzhocX?1-Ct>&AV0kWl%M;nv##}>;6WzpGPK6tnje`1U8JOVDTMjjLXl}w zx+q&4rzY{e+sYeNkaoBC2DJsBnh@0fx*l|O64}7-w#DvTi0kE1Qdd=EKVIFSakJ51 z@dqB$fc=#Zb#S@<YI3jw@*x-Bd8+(4_`?QYWpsg;`H}C;cWur)<};oP$Ng1;`(xP; zZ;of(BH2&Vp0Y4Vq`Fepi`1oOzW=mAAN1mP=6dP<49>yEalXradtZ_#wmf)W1p5wr zv+V8w4TQcnd61tX^}T-7d*eHLmLbk4FZ4-Xnc{8XkK`4d1fOo&l)C85^WzU;dcu3h zXEf_?Ch*lKRM95x<9wnz@5wq3J8D73vBqDM%YX+*t=ho#=Z)MI&3jrmCw~KYwJ2?n z_OTvKUbA1Q&wJ*ZRRn!0_j{AP`UyfYs&6Cw;w}Vf8}!?jwa5kj_91BPE_4`FJ3@=x zk^9BSV_1Q`aEe2VT4HCL6r|bRq4)6?8JUL>1RD<muZt7^x&(Uq`o>+=pqB=_kVCcL z8#qbUW!&#h5nsmhZw^z}G6QSKKEuxM^eIN3Z?11>>p|{P#zSycZ}^xyhx^IP(C7WA z^TK@AJM5`Te8;^K-q?zHKc|}Cd9LO+^1BYg4q7HaHpZU@Kc~WR=<kU^YQXh0zkPM0 z8hqMG{#VvJfpe!>%+uGSHa+A$H>$am8+-^F8?H~_U4*~4I$F@f$p^+OltA*!LbKo( zMcftH9=wmi&y;cfB6tusD0hdqMuG2*uusK89|!Q)ZNzhb;7ik>zk~IlN1pFFg!rgJ z$e&DMYQpt<=uH!o*-s+p2}x7c6!anF$SybR*x<p|p%z`{eJwma6$alqamAvhJU1aL zdtlyk+C5MUSTpydE`@-1&dXj3<U1!AkhccT6OkJ&x&Oi{>e^>v{qqLs3wp}CoW%1j z;(Qe+>v_<V^Bg)C_qiXiX)e!)J$F+(+7Xj&dODJQ=y{78HpKpIp?*y%<U?-!8CmCA z=xZxj$GMpt>d5_TXS=Hh^YE&ZOPy&O+k{fX6MmD&U;lPOE^*G+iuum568jd{|9eRM zLOA=EAoLFK^c?%oGK}kCi%<>V`k^acGBCkOpFQyfLC^n#KXPegDd!r?_}#`Rg}g#t z`g^KwF6>zBD~Ix2x=*YJuz7?<q{2|Pi@rM38UDtmYy#~oFI*}*n0>-s4}r?sJPCi2 z4(vaPn;Z#$%3g)~J=u`Y*qeX$<U5X$Zx}gJH3|P(_(GAaobT|Qv4epcb$mxJ4|2D% zADm)RtGVn4+j(-fz`V>4(hTl9b=(fmWWI9v$-gP@ZyPMOD4K#WhP7z_4f3Icpii>K zOK5+_c{Ce%+WH;&arpgwp2k!cO|3wWdkG%pd_z7@+GEz*bgLV581E7(lhiEMtTpt{ z`;Og{b*|IOq_wn<ob}W(@TyyP;*)z|@4ZYOlrik*oBAja{#2|l^;Pooe0jUpasN#G z73M?l!5DMb)1Lputab1!7e<{k&{enV`1!N`|IYH!HO5)9l$S91Y7^(fJGsAqFz1HQ z@o?;$eVFHsZ^=VxL@v4G|CK$}Hv>Nn?rVF_Pd@Ou+Qb`IjKS}<K6Pao-_X5gZGayc ze;bqox_m;i;Sa3)-ZXC7$8*UwEUG^TJ$NehVjF?SkF6>OK3v6rFAMa)2wdF?ecD2T zl_deYR0*f{^IVm9Up)iA;|R`poBF-jRcA1tRe!jX;{_UcYt-tF(CbO^-c3QD%}M?u zo(s5YQI+}lH(@{BRhad->ZaKa@bMYv-^HLG&dp}mXPy)AyJx(+;~YxM{5E9XP^DzS zPxdJ9@$M9;*6@$%C>zh9M}I?r#>FD1a)#*y*E8At)QtDVBDY-N(d~nNTG$nRjiiO7 z+R%YJZo0^QrisLBLWkWV0(6!3B>XB2d~=aCK3c#$-ni?jTl8Ptf*#9wTNAH)fc_!y z<=^l(YtaA|Wt^|a8#S>lbCnK%736ew>^!4JBQHwYMF^pc--){bZ!^8~Rw3^9`j>rc zJ@BQrQ%e}<9%qO~vQ9O?*Wq2jE0P}G=XdLHUfTz}995BeP=mm0_~iroLq7WG0DNu? z%JFXa-jYgT!o^EFiU;XcKjfjoOSnkt+E%MZ)`tEo`f3gMFqZS;XW(;b_~K*U)0fR0 zDR>n7i99awrx9m~SE7Gs20yjpy>T!3HriVb!8=*U-^j}&1NaW)MXGPmSNxo&*Fayd zf*i`ox(#;dE%!ehWYHI3k++=Nfe)kqG3hJqY>nNO54v9yfqw`1f15bHe;H5KCV?_# zW*?W`Lsj4(gW89v6>{<XF}oILMQ;3{?r2$lZ-Yg+<fvv#n+o(tjy<Dpcy9Dr^5eOf z$JROQ>Qo&*QJ(YicJLGQ{43!5mks3g=Dylx$s+`PA11$pUn-xpd+EC;d|;D@49tIl zx9|b@NwppZCGq@=yarvK&NvvW8`rZ&lBW#5TmvKb2<Rh*`T~^9!A|8P8`smJzZ`@2 z^kh@`p*MO6``d8vV9RO#@!X98Wbk7hk_q0~R1kfdhetPp4)C*e@qFVBUh2vB&&E$T zjP_}qS0aGZNfw7mLteAsqsy^_4DzPtGWhz)s@3D!Uvwh>0_|m2y>u5ocOach>1p>a zi$5vwa;soLp4!vdqRh0vwI<$#`6_?dLw*+UqnfYs)4zF#m%<{z-`-YP;V(bIyIVOJ z4~L;$D)N2zsaMN-&nL*U5clV&?$hAb(C-8v-K1^J5+V1AwD*8(K77we>|6BL!w%3I zIk3MX`KvlZzZcwf3p{;#%Smld_*)rtHGa1ihYs83fbUO&R6CY^)(S6`Z;bqS8lvK6 z<mNaZYCEuB*=1KXVB&5!MKK?BV$macM-t3DOJ9DEIMV7|M_pC#$=De{R!j(LNxd^% ztF>>mzg|^l|C`yUdh};KP8<~DT`-exD1!b$^0RT^$D6(En|a@o$K)XePyBJ>N#y<r z^sdhZ7&Ad=4<dOlek2h~!0)Q$f8lyN4u1zuLtko4{S^2_#1;5aUe@6U@-Gd1teHuE z$nn3_V?GSOh#O^6C!QORUqnzk@T9+=9v}}LRjI$(jeW3{JgWJS*LS`24*dU%vbLJB z&d1sO74x~HK(IRV{JN5yzs+U;^BKPlo^!_^Je23sU<BP(ka;5BEMp+@GA(td82>=x zt4Ou0s*}C+*`0kF`}i)rXJZF9)%8VABnHaNy!70IpUx2Y*dK#%5mw6%A&NoY*tpG2 zqbfk}^Nd>P&3HzDqdeD(WJEUJ_u~t+%>4`71Zp_2)g$CKeCiZIS;uR!-#v<~V|`rJ zyfl{U7W`HtnV;}1<hkbkPB)XLA^+x}!&QWjjd5UC=e}KuMx9}vYHqN~!aP1M;`9Ht zF8m7|Yr*dl1h)}7uXBxaPkyg7eWiIvk0|n!@Er;3@pq?hGRdQ=y6~$eKDKp7=nNuk zo|}DjRfDGSJCkF`d*;Rb?qt2&z|ZeGHJ$!7>`UhYr(plS%ewn!rJms&=$S*s9`Ns3 zXUN;je7q(<#K>%XPkJwvVIBH+3Dk4O^M^R}W8h7x_I8mPU9liF=&RPjoJT{KwN}`) zfcJlDK|K)0S)6_HMaK7iqPN}yjpUV@n-=+sb6x&n&;@=ECgjq^2$TL<0iPajV^6@o zc{F|+8KLitPA#YXVi9ra@Y@BPYYw$zFPIXjzRX9`I)jG5pS;P_)O0EQ<FqfevZ3Sd zF5RxedQ(rMLVo7wL5PY$hxc|-51s3w6&xy=gdJxY^~u1;43&7#2-b^pnQisJJA$}( zGfr(HKQHg!oX4Uf&_Q0}N`Gb|{uRH!1H8uzJN2a|w0q&t1>IRW|DA1M-}i^{(0}B8 zxMmi_Zr0MN@!bCsyYn&N%Ir>bA^7@9^5Y@b%e;eU(x2x(c5d+HF8R1q>N20ZoI*8F zk#G2g_Dnth^_3OA@d_jNIquIignGTqYv^#hZbUN<oMP7HWZvFdb&>07Us^?KLUn&l z{utK#Zb9;JSA&nlQYWM(`T+J4U-0dI4dSa?@wq4QD@zamTx!x~o{z0&)0Y6`b}I5R zpCuEi8$6DE)KR{-IdY9d4>z7$0N)=AJx*IdU6y&ATU7Pb6&`uh*{Rh<S-%i3bz*&w zqz~0`^obIwdJEToHOD`+ApG*072gfM>ybm(=?{r^*E#Sn1Icmk(@sYa>&JNJ<1lq) z{WxbEf`1GBGh5-`)CoTOiE~@p!@dW~%KNVdnDr<I{5wKkHt^Jg|6=MezvHX|6|`Xq z@pU|R=0d2p_W>^nLaE00z0OPBFWz$r{<N_m{0cevI`zGe$+JEIeeN&*^fvU?|3dYa z{td5es>`~6%@MBd@SB9g)LEh5n{)Iz&_mkp5qeVy`s!<yuM>XKnEayPo5y;y#!O}3 z+b%+1_^#a}sZY(g(-AkvkrB0~P1?r1Hm;3)ZO?vy_-~GI6$P{9XiJHeiBE0B{^D++ zP%#u3;iGn}%jwe04{d8D>h=Nqp_eva#`tCiiX&3BEAA2@07@Z_%Z+wX|4?#ZW0!;v z_u~FE1K7{gzpyfLkN2HKf7}Hf-XUHhsRqx(ze~VZ3fkeXsq@;9dh1*-mDVCp+G)zV ziK7oaPn}N_^6LTh6KNmDel=?n^hDm{mB@j~UpOx=gZ_};r5UrqOU@M#9SVZJuQWuj z*%&G#&xaSK4g&aJ4C9MG@5xW_>(jo-Kj!6oTlSkP+_W70PkY{=V$0DBwgxJI`#fWv zashLZk0=zF&l#aJId~s=x$}XK{WrM_m0rK@d+RCugl&;t@*UABW^`@#&%~*sifH0H zAC*g8*U{ADLXRGI*-zs$qgQ1K)82x}=%&Q6bDux{i_fdWKRHMBVSZycWa$fibi!_! zo$EQX`719l2_xnQ<ZAsSUmXSyyZd?Sr!V7U-x<w!mTF0!kZH)<S>&B%oXZn}RRKD9 zx7}MV_}C`wiG&vD{#JN@di1wW)O+rZ-H~|167)xsA0Qwn`~>B`Iqz}Z@YOr|^X~~! zDPS&~iP<XZR=GeG<-4tie1)o{$~W;B08c!J`l@;!^sT!1NyK5dE<iqJu6J!0s;c~+ zF~OzlX~Fw4-rCs```kasGOoYf=%d=e^j)Y|QxSW^5)Yv+>S@jh&1GJnm-Sc8!R)*7 zbN+=~NY7f_Vm|YiL2m}1Vw1?D6%W30PFHa;b{*p8DZ!-Pzwm1V@AmLpvHX4?@)P{z z{p&N3-=G8Q$^PnmSMbJcR3i`eF|q7vS=T=V(Hp}#2dPh-Y9-_!%mLFeh-cHme9)8A zmz?^@<#*&UW<0(Putg!ipY9CR7RI~v682c$x3h#%_eLS#*vyABzO&HoB>09QtGCR2 zU@YeaAE8@UH|h&4K<*82>U0*K$3NudaQ3lv4eG`3X2%bBLn-#9nL<^W^-PYZu3&rQ zQ38JB{>*<D{E4`)E<rp?+Q7dGx-^>hthsiTgbuF^b<-Hy^~%}AmRIA3geWuL@fAO^ z@5`Atl$&CMkViY91?a*uJY4x1S8x1nrXr7W|A7A_FkX@;Ol4j?`eHBVJ=2oW*ZUw( z$sh5ZdFr0STYICBb6-u$$vl6^>Y<t3HxYS7st$RBOtz-1-GDIt>p-p(G(4Mid6>hX zn#|+0^PF=IVBQn)Z{@i{$k(Ruu@VG<gff3OI>5hJuVX*(CvONp!ETe8IeoY*P@s$^ zpkMu9-u9D}st<HFXA@_2iO2=`F<T<dpX#YQtk2^pvszE&cM>?SpMZYW%%D8!pey_& z=kU8ZIrmit*1L$W7SQhYAN~oznH+Lq;-Cg*m?A=v!`sj|=+78KUUb%fh&%CWD~J!d z=c7lg@3c8V$_YJOCvL8B4ERp6?7k&a_u<}J&T~t!(-(#=k75UzUXJ<y7e8G3D>ftF zFY+dLXEQPnyck8@#R{y)ck-cd{fgCy?<D#<`OVkSUJc)`JtEbf5lW6I<kl$m%ji3A z;v;l`@3?u*t_s|Le^HnUb6@`cKB^C%_s>hdfU)SgTWuQDlYMYzZyn)%cgQ33mgnkk z_L6Nre1!c+7Ur+^5*BeK=dPE6Wdd(5H?e9b_ir#d1uE$*@yNSqcO7Ati}f18`RsYd zpInCchbHLr<7^n4;bX(YbOk<;?H{8~a{qHD`zG*i6iI@n@Dthj&Iib`yGhhZfX=4$ zB5yw5zw3L5O6EqsV!vAE&AN@p?ot;%*2E=J8)#29s|e*(ud4<P<EQ#&x2qt}1!VKo z4X*F{?GUU=9f)V_Se<qL!uc04V`cof;m6Nz+4LZo?_6!rJ?^V94n6?AZYHn6dA`3W z`cv_C`1Nk2J~DWjj&n;_UhIUeg0-VN>*eFF8rh+%2G}v6PkRb>v#jt1&VlxV7eSoo z{o%XMa1QjC_YX`%ya6!RDu;&ho;SldPZ|&XeMP6KiM@6aavQo>1P_}N3%zFw)Gp|< zD|*4HG2lIZ60do_+<WK)eA`FfzF*Ac+*$Zh7@_NEyT*93pXwg2tI)wJ@-Uv8%)WDL zn94BT#Pc5d#`+X%V8f;X{(TD9hi<9kH|sFt9X-*hNbtY|`TNzucdsK4D)TjP1Lq0J z?1N^6t5-evSs7@V=j*h<Po@BLi9U9P-yfchJc0CINHA*{-;lA7S%uO;7st>M>91PY zTZA-`vw-|#&5$S5!JE;BeaEv9b>R6v8v^yGH~4sn{49&mD_(i%FVFSQgU-)$4{s9Z zz`8u&O&v#IUr!$u$ihCWnMqUlok{TV;qaw{&8bgS6g%%3@_I~x$DcE5IrN&yZ{-Mr z-t6Am7lWR`=GmWbN#Hz5Ja^_JbsuW6ZfB{_!TbLb_fdiMDR9XtPw=p0cJeN;4)2NU zp+uQR<D`k}x%w=!st<Cg8%B(SyeG1sU2PV?ck%o3$P7Ib=VRx-#~g}Bu^yg-$V)~$ zH{Zb)O|IiXs#KQW-wS_dd^JBgbZa?u!#Q(AL)M>sK-J+t=M|#8MX>88P@jY6fB&Mc z3~<{={3UuI2X+SNBJWF1^*f;d;vqL31rOFV@YhY~dMeJRh3W57$)b<5Ij<Pvp<*qe zrvgTG>cIRFq}$scJtrsmXpsX!;6ohuw`vothrDN5HS%`T4#%Eai}%g*CodB7aKCMs zYV!ON{PJgwf-hhM9tj?Ps~D_z>@!l(r(&4ms#l0#nuok2e^cuT$cF*sIfR~T_J?1% zfg|Wy*|_fydgs@v=+|e-XKaDrWM;m{p;sUC(4lzzuD`%LSnmLLWE|sJf*v>@d@Dt< znM@7Xzp>fOhTPe>E>s(smrQjms#%Elbs|p)^gg={{{8uoGZWdz@chgM_?IHb0!rHS z5qf`~5~^nOhaPk4BHy`;xYeHg-Zku2;q6(!gVd$vdH33^Gxz15iGS!^=xR3cB;}aj zfy9T@11~YIx8wRd6M0Q%rtUKw8j%(M^F}t2ibQ74e=sqq#SM#|GVU@h$X^MZgA-F1 z`hOE=MM?!l?G0AFLj3+C{8o@3WjCAk06OUw7$8zP=p=_X`T5SSxqVfkC-%N!;12Wn zt%kciz!&>|WC`!-R@Sb8!1C;ypGGnt1;|4~yZ0O)rIcV?V|;ZTdU!X*q1F`{4@GjS zRTIh%asGUdV~a~|Gr}JZnH0k~_I<PHIl5VgqyQCypRU9|bqe3Pdxx+7HFF-|PW%k- zFFXaiF6&tKpAe;tME{&&QDOn!^RH2xnD6WFsM`%5oek%_47yFa9;h)!<~coh3qF@c z=Osm-4wC<>Ki}63f9{Z0tUHGkdz`89XVhDYL%+w5D0>q820lK6`|F>w>TW~yxl8Wa z41U~2AHX$9-Am)|&U#yLrtF-X_jVvZ48L2u3vshU(Hl<qYc+aT^QN3j*}0BWNmuYc z0z=zuzB3QZvljDI06lLmzq9xqatnU8hx5iI%*(?S;d<`_U)<o-80LTMJ^YQiZ*`!X z?iGd~@ZD3Ov+W*%)cnJq^~)@eh2ZI4@=u%4gG}V}C{6znhZgYM9_$RH0Mnl)KDx~N z4)PnzSl@qZMCem3=mC4{2Ci?a?od1EC|v^wXZnn50QHV1!QYaD_!!nX-l7Aek#jYP zW90sF>~{%a)oEX&YJr!px_fFj?Ui9p?O{IljtJCi=xrKFg7!0yv&T6!r4s!AhE?aA zpnnvLP*ZQ(6^UDBot6cYSCi+Xcz-POx}~5~nZwaf90p~8?jDM~B+Pq%oY6)w&uKka z8|Y=gW?$htr`f({o#y!hoO5M`e^ld~c0+phM=tbo<mjvFzJfI?C-oR&G9ce^`pg7= zmK$!+FDv$8oasukz8CL?DJRb_Lx{~~u68vJ)V#{*@5_iY%*=U63zzQko*OOMzcF8< zExvj}dsa*8*^PxB2L}jKfqJzjuP=C9h&l*az@Mn{_z#Ds>iNVoS7Ch*;uppHD{?L| zmibEGhV$6YjH6nB5MRo}VMT7}xyxMgw(|bMX+l*e3*YSU(naRs7yGX?k?67L@u3~~ zKK!fSa$k<ofm)8dc8_MgN+EX^JN0cAa;Hp~Fm38|Q}Ti`Z!s|6e(=EbH@x(LC0-S5 z5+PLo_r;B7Tr)oh={4}p1?oAle(f*9yOBRHrkKd_0Y8X~5Gs~hR1eow@OK-|;j37a zi#M?o(0??Gn|=Z(<f4uNa&&Gqc{ur<=qH|f!S^{*g)sAB^!3)MjPM(8;tar}KM(yC zHk@@L>5_r#>Dfmnq=O%L7&L=<Jm`=9%=Z+i=BE|#k7oo6a0IE|w|(Wt{cT_4cM8AB zI|6wJebi)~U?m!bzx#LAeHupCPRviqrEbCnR0YV(a0b5c<94W)AU75ehcSlnv_O9< z%KEPO>?cZDYV^=xIiTB9#C2MDu9E|QkC9wQPw&BcJi)$H8vM?**QSuB=tW-CVT@<K zQ9g(8yBE{5Ur&8*K7Kld(Gx#V7p^06WD9l+`b&G8sf~i)3d)XebM7~=FPN8VXEiIn z0rSSWrH%Wx{Pxg(=wW_6@}l)c&q(j9_3-b01O*)ePrnu<4ha4bk6v(&b=zHmI!o}& z=r1lInsl`l=Pjx4v6{FB{^J}MNjtC-cHTnhjZgfPu0Hzf0x!Mc_X~uAr{H~v&8`h2 zphw~`y`td*_ziOeOD->eW#;*E#0%Mbv#|J=c4pp75|2wNE?s4F9L>5Vvk6LO9+$rI z(ztx=<B#|#E7vQ95%&xHNDy-}>$zsFr`mxBhH}`KBe))k-Hz)m9x_hWt=wJq!N`MY z3*D50Ue*o0zY_Gc94DcW!R*sW>am3Of7TGiHG#jOzZT{Bqxc_|f*;rEXVIZz=u-rd zdow?mt564q`3l<Urjpz@yIq(DWrKgjqaTA8u3KU1JRiA;{<JtJ`*(hykXwxi_19FM zD;V#Tk##OzfqHwaizme)R`L61n}my07qacN>27i8nfbGEUzyDAYRi0<dO_Z<<;bBt zVZ<CFSKCsThwpdbpV5VNJiXCNS(t|g4}(>ibxGp9<QCu4sy_a|yf@tzCq7otO(pX3 zMS}koJXDSTd{e1k!MJLjBHtQxFbI48e|(1lJ@*3d3p{1kS@>QHj6#@@bfYPCxoF36 zDC5ccC5;GDfiTYUh_fpN-Z&Q$XTf{@Ilrq56mfQ#!qk#D<_PdVvJmli^k>iPp(OZN z_6fxC!T0W#j?gZCzYBJkDCTo1=N0eT0I3(#lKbymBJKm20#iH(zPztYJ<2)AosTYR zyfV*S{IoJJ`?*ct>dJlN>yXbXJ?Hip?26>OcPAOisSm%xse62B=-`V@UEyn;YhwrD z{@wWbADo6f3N$IM4*MhWz@CK;ufX$K#=w8Ko3x1MPNgAUl==NK0zWy{WiWQdyFS<j z!h@CDGj%WJuHL*aLo0*&0`r8JIFkZTo_T5{@9qB>yyZQ)D|=C6kbU+R;uhdX73Mkq zpWAi=`@MlY=Yu_ONa}k!;g9YIzSJ>mH0{VjZdz;PeSK^o5A*gTR5O|1w|}VL$@SyA z$j_de_u)6Nx&!*`Kg2PWfX|u0n+AOEr~qA#=69L<obkvj_D@Y~@|`i%yR<@A^Zd2a zgWpHL_Tip(7-P0EPqTUx-`<(^neM3~F7%4DE=`+=-h0|doxq1y57CAB{e%NfrA$EI zeiooP{LTlG?ys1RT)?l}o)fv4(_hJ**zY~1E>TzP?uqVtJOka@hCc@HEpV7~1@Pnz z`Fu_28;K$0A>q9fs9&-e7=>SDMy~I}-!pF__&(O3nm(LEkw0)5*K?$!E^2n{AScPY z3f+b~!N;oLF~Oeq!LMeo3|hsSR>MhTHT0w6b{&GQ3$CyzLrL^rr%90&kSnuH;z(Fq z_u;n<eR(wU)DP&iQ%3TX!e=b_HR3|1<stAJzU$I5vp!A5Pos{HMnfn5*rDQEK(|Gm zD#tpv$xZwO<15oTKnH<gQ$qEE`MX}gPlss#Z6BuZX|dz~wky;G9=Z8z2lM}he5P&V zpxXw1)M`YoPH@N#I$Pbto!W}nwg0%OKsa=W|3h?H`1wI}5$JI%M3|B9h<@#>n>=@= zD0vL&AN|LNT7t~mT!Ze?f9yLn!T7yvP>-4Usfd5TefsUS-BgPA?i=AIj>hDJQ~N6V z4^85n0(jyr>jqqU(xD-~*csNC6-B#$Bz4x%JGK)iv!fgHwtzTZzN>O2yBhHwyStNr zu^Ievu!r`xXTMLLwfgY+xh9)h^+x~fMP3u$Q=h{QOfm9@rr#!kM+c~9haA|5|K;57 z;5X;8Ke#p@|CNy;@NEv!0tR3!sACkV4fQr5NN;(*bVc$AAa^De3|1}pKzM)DQ|RWY z-BbT^JsiI^8~FXWRHz=q_p%cVeh<3%$-bcy^HOA!K|9dX77s9KVh`dWDsoN%pIF@5 zsQ-BW5OLn^c<u^^3{yIyqWF>z+=;wKU$xTj`O!=H)1z0M@lhql*^6MeLah5=;%a8I zKGlz#^_BOmz-TsTB>SW-LHZ6|3~d>%pY-=JQcr|+i}AOs1boP2VW_-lmmU?apw@iv zI_i}(kK^hDan_5Rc}9I7U<>#~9p=?F2){ns$A^>8bO7|nx#X_g=-a+tN=N_0A9kG` z0biX7e#4*ovYA>n1HJK=NpBeMbo?vtfY+y&o0N_F<FKd1qvts{c<KP-i^lGE6ugNE z3eq#^?&@CjbLgwlAV2--#(n62xp*!a`{9UW_;VV69WBVdw<LLhxIbH7;>d%LV{t*s z&wbGy0#zgzb}5vBqM4yL?1R0b!~AK9TZNBpA4vW*?kkKx_(guVGeLd9=y%&VoGwED z-T~-uGZ{x`5Bb+Zp5f&7j_>U^&Z44R|NPFvGw6X6?ApQjgY3{w6ui)E&=m0fIL<&{ zSg-oTe+5oMZzx3k8qekG<fmif;YY-okEjM+5Ae~%Z0G~)Lv^?<eA0tF6vNR6@zaX7 zg5Q_T`jZZM-ZD&{;OigqcO~$i{U+k#9oVaCQb!&9II)8LCHyIteL`)n7ijISxkkPx zhCC;2n4g{O6Zwv^YpG+*^}PA0-vORnd+DjhwC_&y)5oRE^A8XG<h_-fVw2@NOc~e@ zGTxhqyp*p6`|b7AN98@Wm)P*FhMqX@HPi>sF1V<nj(zMab6y?2U@p9&0QRsB_-T$t zex-rQWn|uPW;qA_bUx~(ehty9u|r#-qh@7@!$Z#GY)oGCBJ3;nA>aJ4{|qC}fcw|< zwCf||dB4D-1n{OvFXB97;eW|yU26y3H?t@ddU>_isNL{m5BwZF(bH-`=crcNhY_zO zc(8^fQ=5yztLg@-BmE0FjNfg;4w7I|FnH?4;pPB-zi{mURb*Y-mLYEt{BR!rXtAwW z|69~E0pAXeqiz~>y863QuxQP>5G*U}v#2zAX~56@JFyqp;k#+Pb-e=ZMj`skdbVkV zot|;`Dq@m9bU6Ab{$)I$6}#ouM82mqbzPYIChHCQ1mCzx{+t!i=jCsK$S~x6PV_O> zVUNLE<9O~>HsaYC&&clXda)3Fvw};p^Em4(?x7QWf4zfN{ZobYp5_!Jrk5^*^05xx zF-Gs}jNLOTP=}e{&7U|2oevHVqi*@&R6P~HMd-`#0Cnb}qsx(D>cu+FD9`V4zduPz zDnM^J2fC><blNMMhXVMW71&$fcft;UAMzT0FOv9(h#v6s#%67#Ju+vo7Bi3Yds6=u zx~_npzZE%H9Y3JWTz}|=e{FH(u6Kksq0jW&;x9s{^f@L%E#SwM+^FXkjh>h%MA1#q z6UZ-cvoF89*+(;xk2hvpb%6VmDQ<yjTQxYGYQ=cpt#;}l{d?Hwm(B-X^#HFkVZY=Y zq9Wf_>KJ@JEqX~s{1=&@H1EkHP>6NjVA2feA-FI6sW5z!O?df9=oN3xLggR_E_L5n zw~Q_E+u{8`?bKahz9Prs2S7U?@xGZE$CLla6Ox7XM2|a1f1PJ`ag?Mn)4WuUb>1Bm zF89gk<MmBC03V)=e{*)$TOZ(Yj4SX7d9rzKTTO%hf_D!qqen8ntJo`Fuuiw}YdM-7 z{grc)UcT@jHy^Doja=;-q3#1XW2)z?7tmvYf%r}Go)~cZHn7C-P#p`0Z${X(3ch%7 zptmws0x!F`DVE=z#wNX1Uhn`Xxs~ZSC&Q1>h8&zT9Ua2X{?-;QOc&ZdkGk}%>+F~? zeFWc&y~n?!0prIGl)`T<-DlBZ_}#{}&@l5}m;4-*mQf$hwIkxOQ{gZ4gm%#mVR{Pu zzSE+w{*3#Ww<_^H(SqOeTw(Hl|I77375IMm#i<TX{k9+<scXQJDFHj?kQ(gQ$PY2C zEx*UP(qg_V>#SgX;`(;<*ea~sqcu)_q5Y?pOSt%H-WaET(w@G|s4OeM-`OV3uaCZ3 zG)QAu_Y>%;m<XtU;;uj3SMwVAIpKq~j3F{Je{FFJc(V+7a2h}QLF|*Z`6!wBYlsr& z$@Q7#+3S0wPo(;LfFC}@Ir!3V{}8JD&`YNi)Mw1VxCwr6HUU3~Zzk23GXF>Zl-#WM z8sflc&t}mQ+JHwGaf|X@PuqFu8tYnQhgqe2Lysxs8-t!o?Xj!r2=J+hx4w4A-U$vq z7=S#2*))J2->_L2!}z}9cM;=;y@=m@&%dE0`HtjwGX6yV04Go<DsMUTOYo{b>zT7~ zu+q~X+|Q)Oy`ZP`PSpo5nxSuIqQ4vYeNVyH+OPE%sn%7dafC8w<=Y+988;)xJg8Sn ze{S{*_ByHhf<d7f(cj2_V66;)WPL_8XWw--Oe~{9f=x2>eNEdt^_F=n*O@w!q3|aT z5k@j^mC2(~g7;m^f*oxb>*HZo9PPqi$>UcS`oL};PkU*)AZ=$JjVa;E-5U7={a5Av zmR0`B4gGwEPq8Ie9+=Q?paG*^W#mak;#(axk!8CqDmEJY!aiuL$GjIIPTR`-dU4(h zOt6@QNlKG$7*qzjxSW&taN2?O+{Mv{s^FK=mFF)KzgLI$($Y>f08ZrHWx%iBK5i-t zEEp4{s->7e*3)wVde|Bdm8X9{=aW^yyU?Z3E_mOC^W$np-qSBg6}Y~pfJHmNixT+j zoC7Z}HOAJGfpK2+*5O1T@sQ)=;gjS^$pXFPgt=7axn>D`H}GJRMIGTMlXj8^nD!vf zNvi?9Z?X@o!teXJw73!TO+2FmT+Vx%yxrBAw`$nQxbJxryKcj`dq1$KVgu;oA79m@ zzu+P2U3G!)AMnzA#&ar&yx8<VP9lDc_1|>RLk(#ciSoy%2mbWbSL?vr%faM*=!%@! z=up`t_+(LUHR8UDHymmLeAhitEr9zAP|p**?~ZdsYucCa+iC+0o<ja4U^DDk?SUbE z$P)?7lP^LYfx`xIE;AqdBZp#TS^wtVHg%%Ev747>55-QMCs;jbzqw^r2gczB59|*9 zRz@%HN&mS`0mKxr4lRjy0&mYB36dx4(!?i1eYl>ry_Xh&U|EN7?!<TZu4h$W`g3N) zj#?Xj(-S`^+I8{M?ho8STz<L)_QNSb8b~{F59i&$kf+!|`-2C>qsF#mo;g$;O#jt+ zP91|U{+R5pA+&9m$WIE)6hr=a#$VMNJ(>B<d6B$q;Dv#B_z_$$%XvsT=CfstzedtN zzMVK!_+%uT%F(npk@WQ&>l|CkN5A14@uS={j{XGl^0k`<kLb&J+<5GD(Am*3@X08n zBH<gCOvEWPBR-K}-Ttgc)LS1-;JLvhaY>%Ty!446Cn)PzKS&9@=V)7ZO``4KaQJ93 z@Fi^owO7#Nh_@U7ow`p8(qyiWv``NleiBvOqWSL3(|gXL=wH(=RMUXJW>V*J9?y5B zz7gYX|2Ra`>93FT?0M$1(juE?($0+^=PY2|74T5tbnFWb@HZ22#0zM@*n*u8{*h+_ zb!?!Q_aqZoNdMAB_?rWlf1@50^Z5+Futl_2t|4y|Fupr}(k+-D{I`;6kEd>YFL31o z=Y`8?S8huj*;wd=IbTkD+H&&U&V`@;rmiyWuFV(+_>mkRq_wo0?l7nt{IB~<>dDcb z{(}6Y$kR)C{8Xbq{26-O(HeWlOPkhnJ@%QKHUcM(^3)mdt?LT2>hWET@MGIJfql|_ zm)65bgO>#AC-SH5Pd{zu{wn#xwFS644f2fj%yKtGgITviQ+>3R{<kEZNddNhNuE>Y zWp<SaHID^PY^*=?uowL32_Lw;%%+{(H+QDDO3dKBdp%UDEc)DXqxR76{KsFP;KO$x zVHc;Jk$f%tfs<Y^Hojv<bLzZ>@?GzJb&&pA+YB=H$NoYQg~POmSp#(hXkn9l99ZhC zzkF7r7ImXeP#@%X50g&NpYR|46~GAgKUd%%>)8*Tq1`Fcp*Y5Kpr5ZERs?U~;a83x zk~vSH&ZfR^H~TAKAc29-{NUYJPX%Q~-)N5x6wP<7W?$|?e;Y>LZs>gMK<cqa!q?IU zDVXmXj=p=2=NokNR(aOh+wQN6wA;Nfs`^y!b90w_L-1vRr>@d}@gR8>Mxz#Gbk{Z7 z={X;GJp{ZuLSALsO;-f!W-7$5tlA{>$I}7og`C=HvFbMcQ4WMs8T6~^K-MdGBi~jI z{j3)G2BEW#i$Zm)Am@ssy>$|Pv1ePD?(<wr{P%nqNBcbZy}+mPr^ZdwA8?=eSNKTE zF!Ei|-d8<BkAcy1$e-tiztH0VJ*B-euT3KwAXCy=G+`<G4*XiaHp4D>%SS(0hhjcq zs%^t>s(7%TbN~7Q=%v6b*e$L%#g@eW?IrDpqx^LYIdj_-s#mnfbR*ssc)cs};FH1o z<#s(Ah@2SWt~d05gUP)Gp7ILU?UKAFJ#}-S>uwv&@&?~Ozaze$>m8osmtGq>0FO`i zV|=mH_4a|j{i);2^<bQOCL%A-#@O_pc6#g^nd)H|y&I&Dv;#O)7>%5BuS`8<zWcvh z0Xl>Xz5d)^U$~wHKZp(Rsg3OKo=!n8tnN}|59}pb$REM=AytWAF9JQx^py!%D$uD3 z&|Sx8K`O-W#3lO5lm3DHTLV7M=A7M|zf0hUW&!4zgnuLBy^1}<hxTL6#eX9=4F`x1 z3grH-cKOktoqYXi1~4Dctc~`>)9{6b;41q*JMFp-_$+w2nz)lx)9!8bTL=AbZuqG! z_<gno@d)6{w4=TXq`y#K{4Rl`iTf&2pZ#hD&XH(WeHx;Kp6I;?IParvs1l?|pnV_l zEx=^rMCY}FKdvz<E$xba_+RzscX4V=N4w?=Ph|o|FDB102;5)_`ykpK<EbwPTylYY zXW(m5qght;lC$~9(@uYuvjNHpEQgZUXBpr7gm{KZ;AM=va?xMu0r{h9fd`8M)S@Bt z#vy%f`Wv&kyaitEwYaM#^L85jIg;_m6{7wy*XQJkP$}+z_LBSnTrbU`dI9<yyzrK% znRz5At03*k*bO@~PXRle)b<7+$qQDP{$qtKY6sm<ujQqC%<p@W%v6j+ZrotsGYUJ$ zU-nPXTaOm_r*QuX_N|@;;ScQRiqlS)mc0GEZ>H6u^D*c-N6acgzkg<5#R2=Kv#BI- z6!!fxz~yPk7g7y9=WwXvX|MGpZ<{~&MTaO&5b`vK3*A07FRoQltY_^K_|MT!%Hd0{ zAnfQT9I8nBNx^XagO2$nK1_X)Q&9()L;9<b*Q71{tPuA2S&QKh_$OqT4n8t(AL-u# zzr6~dIQk9yFZ7V)AP+jvwdzTnAaL?Z>bWh#Zizoi73SgTMSoSLKO8%QwKjY+otvuB zj>0H320ZyW)?3wSpC*oA3vy_uk@F(j5g*Avf?VmfFH|*YhfX6u2=m<GjhAM0X5GQB z(ahWGL0+oO^{2Po^?ojLV~Drv(w>1l{4$Syd<m;2fJg1g7q**m<vBy0dgjTaHTEv< zt54GChQPzop^9a_2jXY(8#&hN0O#Y`SeHEb^>Tera-f<3|8-cEyc9lz|7ug(Kdy)9 zHvHXHDL~C>AL{DT82Cf4Iq0FZQ}WsLj_>#}F-$FK7bQPL3iMQ@HuYeT{SElN9E^K0 zzu$`M4cFp-4%}RdxPRcCmtOi8zFrw8n2+h0Z{i_vrRRJrK<&Anjd+YsKw~xh@WF#) zeLU2ac9m;k+66w1;(VYR?Ws7mwP(J+;{4p5_KbGO$F%UJIPy@?ezP@DA*}cMJNQ)6 z_Q&tEH*oQ|5Pbx%FLeP=XdAwUAnc&0B=X33F>jn#rSh(MPnj3yyA%AmSv2Q9^~@Sf z{~_|L4F#q!o?*ZNmGNr>*2Ug90{9yLouS}q_DaDTNxOfKaNTLZJ|CyWdf-Er?O_^E z|Gvvk)q-vu8%>%(d(|1c+Gc`oiD#Nbd-p0gP3HR|da{2g4W8DwtNar5uFoEN0NyS1 z!_GDv5s6>V4ET<}XRxO6+=52n6R`9;;#Gj@>X9!G_~VpG$?%igwXK>%yBX_mPJ@0> zBtjM8>uJw`%k)ow!(Ief){DG?!0UG68Tvq1qtQ{?q8Cx;Y9aj@h)0<NUi9!MuVhE~ z(&_;1gWoL7X44|Bhr2v92Rvv7KVMAy!NX7;Lcc4WNWO`2e5XHo-{`N@Ib2JDIVTgp zft>qNE(D$npCvEh+l-7GBhPZ$NfbwX&vR2dnbo8b`;xAK=<LYj62z@@Jy#{pserrp z7_}Z4h11JM;FHl#O`OknWy2mYjqjO-pF<$>@0X7@aos)Hpustz*TU2nKz^4cUU)P8 z!+V8kD{$~4lePnQlN9n~8|de&MK7VhE^ZOjxW&J2WPo-8YxHwy7w~Wz?6Sb2Z^N_? z_#VHc{lG%R>BjOspPyj&qHWGj{U`WNSNvNRk756lGh8#khpb!KqjG&%im!s1^X74Z z#H4^{B=5*o9({ONh-M-Or!JuG1-e_xG0ro<&%~eZdH^1bu8LnF&&Q82>KO3Bd*UYe z?zUTvBIS*qQAgnf{V#(2bQt{JyTx6zb0K&4vCjg}_Bi}?itE#QpkDxgvER<a?}e^& z(;3=U_)w*pJpTzi$qfB)$Za;mKb8}R&;0FSJ-5_DA8Hn%^W6VznI}1h;S1~ibp=@a z4*7ujJ&QZ}Olap_NBtkx{Zu1wU87y(330>|@zbwQzD@31kt;~o>A#<rdfv$0%oxG8 zR6-u$MC9HTeqkqHG}r$vN&Htg@N$hww`kW%GU+z(+;Hl=FfVEF^Ad8a9KoRV2P0oH zg$VUat#**#hWnl@hOU6_mDxW}MK9lCRp?OkSk9#%(O*2Dhn@ia%Q{uEJM<jnqptAH zrA4sg(Z8Rd)p8}^&lA0Lau$5Y6`<?zf&90r=hzJUAN$ys+?Q{vMHjQf*YFQ`fFAZd zj{O$>o3D|N1$bjah~5GB?F!PrK;MO-`WV4JgY%aEXlE_Xp!t;T_@`HeubkOq&<*xc z2X{I2p6drIlm8byx>>@cw$S^!;ZBWc2R`f|A2ioJ$s6gD2Ye(5=@@)_$U*XC(4P}K z`h=q3Jx*MNs_S@uZ1m9e0|Rly%yX98*nhaMVc|f11Affz&`)5(fe_t*F9ca_)cycp zz=J=)<={(W=E)boQUmW@cG|4RyyyKS^herP(|X7Vte?T4feYd5#P6DD7sa2tkAr;^ z{<Yq;%Pi-76F&0ebdY>$=gAqS?0uoPW%zOQKtE-(XQO}KhY+1h#;%5a@>q5BnZE(L z*%|$oWB~)2vnCTg<<ET+PmzZmm>uWED&X-B;zkQ3B9}IxCoe#sdmA7p*N@!fTj9Tz z$GH?p``=(U-L8PW=n{2v_}zaPR}lSY!$b9n`OW(%OdI*#(0@baqTjWPx~afYV~HPt z9_};@RvOxY6VM}pu}>fxp1U7sSJ@%p3I3Jo=|5}sR17f6X;gpK^#bxH1MPJeLc~@~ z_qK;A3+>Xa0_4kk=VwDd9K?D%4JysLr=y-&R<7@?YgZ0nToa3;;g?si=PiXkXTP>< zGQT$!|LL4ux8^qK)gtu9N8xJDcSTSq?b$f+f&E5qt{>psIX|!j#>`ltrB#Sx3#7`G zP_5>DIVN)+$~?DZ|5=#pSvh|+=0h*shu;J3^?i&g3jAAwyyfVr$2nXtPJ3upH<bV; zf<JM<$R^~00#=;Jxdrgl5qIrpKF8#D5Cet0#y_Vlus-p(<$?Eq;Xl#@{JM|d81yzS zDO{E5@5}ktFxF{bx^UHIJ}R{~i4>d4&@D(+xISzg`51Vw&j9jd(5^{6$725Q1#7r! z(5}jPX=CJSICk+u1CZzVJ=dgv<3;TF(2Eg%Q;T*uc7b}p>)2@r=fDnI#H{+XJF_pF z&$`SC#okA|Q3H2XWu6A(e}jvd<}eS5^bfxgpb`n-fyJ!Gv<KUemB2M!ymh5Dc3$e$ zG^bq<y)qMg;tla>?c7<Pcn`IpUspKq0oK@TQfpup{E_c9#(qcMoVK*v6IZkr`B7#8 zc4g)xBCA3FFwXD!?P|~UDflh^g2vC`%<J2N@9^?hcl3{1C!OkC1G@R;ua4Z8o;ZSE zjNi{j{pcy+xrw?wBj8u;t8T&9D(xmOY!q^zbul21O5y~U2%mPpXHsXLuRb_f<>3Rf zi0kRg?=>RMb{oSV*TkV7TwhUwJll*fg+t)*x#+7n4fh8B7NFnv;`)<JX7vSD97bJ; zVep+DCM7|ahc3EPtBv{o!n!TSe}lXZ{kbm)dHk#|>&7|k`rgPT@;`Hgq4DjgFV6K1 zZSliH9|+#zrlz&gYu#*m+m-bkOx|zg-+T0y7s!ztjeJycAawT~n&-I*&%L!~684=q zqq;NC_i*MPOn;N-zWSAw`AZ+B)is&7;BfwCA9K*AAzYse{~r$ghTUic(1ZB<kwE)K zKXh5n1>ZR}8W=!cy{Sv!vnlK+%7WK79oT}I-@5@Sg`8ekz(?a~|BbZhCga$Ey=h|V zbA{L+EaW@P<aOq``@3DLmKQu`A2ONi)ye-e1vuIms7v5O{xxBmO8XWvb{g;^Nx!B8 zvqDefm&3QlSvd<rK5<@tsvYZ{K3tdL(7&Lcap)_b5>494_l1-U(QNLk8_GFmH1zKi zL@ht;IVo1n1O7C*)D^s{V`G0;3^{TUzZ&SQLK;sk;JUD<Z|Ma7k|gII{KSKO+)MaR z&~W^wyx}`LIe+E8NBB7{D#85rb?FT2WjjWl!*uYSSgT$$zA>l#w21pcllgA0pFuBP zOuOPK_TIn<{N)<E!6z#QDX|*+guQ-Brav$j{zD9-^?0Y2(M~%sK#&JHxkI#^_IK<y zlfnCI=m#rlcYJ5lw1JGHutjTWFC{3tH+-Z{A9P>7&m7^Q81Q^kfIBrbn2%U^ANP%` z<CHh^b$Gw8;&VX<_1v_9{%+_!Ygq3K9R6*jotpw!4dM46h>OH^hPv|xZK6M2dz%hS z!$09G@o0=^OeA&$@cQr>4+T1yf6lSCbDyi6m)0?k=~)BR0J>P0#;$LS?|ZaE*TA0v z6eH{D3m;(&d$~WpeXyFXU>^IBuZ6yT)$wPe-=h!t*m*8(UHBg3`2^jBBR@`0#7@NZ zg9E5H1N>IrO-F#sWYbY#^*_|#PQ;#?i#!Ek=v%=aO0Eol{p+q{TwjFW1X~5|Ji_@g z?f-^H=o|O{HJh{?{X4NnfKJmtr2uuJ3d6t1Thpp4dO{kr&e31UD?(Ml!%E~C%U%I} z_Hwu`(BJG-kS+n8O9S)-{e0sC;<zK(=aeC?js9}vD=aevd+coVMB2X#h3O_R>OA#_ zpn-b%eRP|4WbaVb;yaUfkguQ&^f`*UDd;s@k$3mG9t<Dy<-MiJFVzfuT2<evhxGs9 zyv#fny)Y|zw1=|S{N~d4UhHG)lUI@JD+&i_CAhG7cc`Aw-apV!515DO3Y=RaPtK$v zE)e~sDsgj9x!&u#xBTI6If@de0iLge55J`U-DvW+^W64G>WtI=?Q7Q?;2on~^Ohms z?m5+|9)3)(0`!*t6Y#}%zz6<enwcMdLD1l8<cI@3%6$nuEjU2`as9Xt{=vw{VcU$# z?9aLTJTo;}xgWp&4_r6jH0ls|-F2TYdu{0VCUKSU;YlUk#Zd`94*~i?|26z6{s4a$ zMUa7qgE|Jw0K9o0zeM1b_C}e3T{79_0X)%^eEH1h-p2U*(Ec1w9WbDGI`qep%o}v$ zL;Eo2628Fo@Q8=-pPN-YWTia;|JZB>^t?s>_(mXqDI()Xe;Ur6TEiE*Voy4p9r=cl zGl2e&$IO}s-!8VuOXK11o5^=-r{8I{$_cEOFGQynBPT+`6iEB8mr-wKGk-Jj(}iyg zI7xm=`j3~i5?cX(o<)6F?q7Y9{Z;Do4WSd@WJ|CjfLs3y#-;(k%|#w`+Q*{8l@_?a zuwChZU1RJT0zZyCLq6V;@NN7Owu1-hdWR`J*HdEvGXTRYg)1ZQ5zey5>cW5KlW!3G zx^x|TTsH1IV^AipM=dmBb3z`0Pnl_#0!gbPhpW{juQF}xVR#$-c6W7)veAB(i9EN! zeyf@5O6c*O$Q#A`-!Ji0$7a}NYmnz59J*OcK27d>9qmS}9Qcht*Zj`Nckuh%^we_< zZxuI!uLr`Ei~BD1vMD$47x7FlS(kV_^#l5W$M^Ba4MG3Le>*SNJ%>~G5<b%fn#o6d zMKJzG=!a(rn#@nT)*R}W0PT&PIs*UFTW`hEZq+nQCg^75RlEK+g#ModsVM#5+L%-f zxV8j;!~d#pAny+h{anW|m7sqkb%SQMKpuahPA%;Qv$+oRC&;wmWagiI6Qya-xJO+J z=;S_rW$6<6-Wov)&C0m&`>DY7rCm6`hd)&hwCOK=VnK#r)d63}vR|*r^}5{*Iyx6S z!oTE;r9GrD=h?ucYlw5=JNjPaS=x_olJAN6`LU09>(uA4a}I=lUy@JAu!#Lr^>Edq zKZg9a3BZx>(3eZ07nk)@-PHcO=)%BxnW&Gz99AX%uL131I7#P&9}Nh>kH*CQyR|_L z>HkaKzeJ$5XoQ*oO~=_c0KM@uSpuKw#5rM0+H<g1Y)i#=^4|wS_sdRD2PYHjg}-Af zuD>3Ez6soE3RD~5%=LCns>wd~T#$Y-eiwcjZRxL<9s3+Gu$@EcgP8X<<XeC)z4~JF zOnrWuQMeZBw9!wUXb-yMrL3&~&6nsQx!4D?&#A;ZTiEw>=6VCp*T*3z@}D98j&@pb zwkvS!3WvG@Pms56p&xP|yGM80`K<mrj%+@CFi<^cXW2xZi?pB-aT~p8o2!JXH*jDH z^7i&ieHZcIw4;-J)em@a7yAa_*V5#}jbi-Y4QkYt?@7ULj{dvEt(0+t|EywP1s|F) zKTu<Vr-oxcOnq*hOG}uSS(C}rM|);8^+SR7K#PU|>k;=o47mIec}9WrDl%`-e_MC* z?1QIqU%b?{5&BV8m(Dl9{&1H(YTP%Yw!20FhcD**z=!pYC;tfTRTQTk3tWyruND07 zh2Q8n+Nt02t2c6ED)y@y&>=}$C(-BX@1<Md@9t6#t%cwBI`2d6H1tV#FO6=Bo`Li2 zCgy+AS(_$v|EMpli#Ov+A|E~N#3#fTnAt~-Bd;~>MMdn2K<>xA$A6XQayLMaq`%!3 zqh<q_zC|wt7HjRVv*X!U^sp&%FzfQ!tRdjVWqxx3*9Q{Ewh%b%T%cCYz+TkWBKJJ( z#qmQ=qW>Mi&5MCoiPK948Vux*1eS=U4n%3>*FL*e(B9m_O(xzMJ26PBXdBP*oxuCV z6Kw%{ek4x;{P(B9T`9D?EOOU{`N&V=G0wBD&+p<-PJhjI<m*O$MvcH<tUUbvuR;6i zkE=u;I`pS#;zKu~=bS5G*6!NuM>tnJ%=OMySzquW;&XtG(@t9Fp{28+{~a!!q@6O$ zM~Au~*T~Q60<Tv(IoGA%eA}$4=p_p#`e<H9=FLi7N&3^jAsz$h=1H952y}P8_ag1w zWlaCCt!ziXwlj{6MsHoBKT{K@t^pTVX@~G0c-(c`iQwl=VD--yeSnWu#6PGT<32_l z@ooC2wRBVDLgWZ*<H!Eg(b!XW>2IC`|1IA0tTX4ysdC6cTt5BoivzWGDfBjq`VHmS z$0qn_FtqudbB}IAko$fv!7^2$F+7j^Z*N7P0eU67D;z$vpuevQw?uC!?62LkId^Sl z)hn)VUKOS{srT_d8~ydMlV2(e|KAP{(BBn5fC^L56HNhn0Ka%w27QTscl_%*!ncnG zhU-7tGYI;a!S(*WoR5K*XYtdXja&%6MqL=LPkW9(Ffh}7PbIhIyB&6If#1*RZ_z*W z$1M(3_YUX}>{~z4p8U&QuaG;g^<k=95<6&%2z{pC%SoQze$dI4AjQ{#&xD5P3;kWO zM?V9PYm`HOqFrORRg2-bSATfv8}0v)!#A0)?riR>H^bh9GvyEZbKbS65qeqw?bOvp zuYK|}Tn6|<<Gfb60SEQ;(uy?Lsm@a8k@g7o@i~~s_A}jOqJ8OspT;`jm+)sZ?fyrp zuL*1xi60Sg^iAw(zR3HS0D041gulcE=(qbUquTMiUgf>zLw~5Zzjk_}7vb+!8GH@d zO&lh4;)sn<7NCKAs8;T4dIo<$zQ1*42etS(zuIO}k41dPB<yaq$L)720N9Ux_UvGO zuLrU^J$#jO^M}A3EBy3`?@Yu`ZV|uZ#Ub{nitz7c#Q(8=bNAb|(*wPr6?uqx&v!d< z#H_>anbceCir)0tKrSuL0j`i|3_WMqR)hY;vOg;tu3_1*7mUN-kmnk(7Ax~%f9m7Z z?OyO*ijv@JtzGwhwFf@r%{giy_YFN}QT`<6tGYu$v{REV=0Tn;jrUV9?Q%J(>kEHL z$j#V>a+!EU7yY^W`l()H_A5EUHFrAuz~%U>(_a+(?;^g(=nPdDZ3Fg<SIqzRRW60o z9{Gs+?!exCycG%TyBR+z;Iuv7+Ru3B6hY4m1h1EncZ&Z0#G}OkzmX*G7VFS?HuWHQ zU+rZf%0Ryhdk-$`TFrS&M%uFikw@Hj;urC<v?o3`sb?Jg7Jsr-oAM3LSxy1(*KpHQ z=yuzka4n8NPbd(iZ1iW_XvId%^{@!#0*)+i(ccW<2T6g)vQIpN6MIMKX6q)a@^k(0 zY?tD|n-jtK?{r26MLAS}{$Mxq!*^s|K6tC;FzCNRkYedyT!}aZU?uWT&Ea<&&vdFV z?F!S~RTS9UZcz!~Y0jD3WM-fH(MMyT*RfrUile_Be554sjkigs!6Ogot2FI9b=fbZ z!H$s@Ka<9+L&s3n2M4z9b(5twcF=Cbt#Drl{6O~fWL=Y?3;5Cy&L?|<Z=-m&GS>@U zGpPzNKBHBS9N4*5Qa2_ZyFUJQRq0Q{PqNBz<j{NSL(<NN|5x$G;87rc$H=eO&7Df1 zfAA@n>HrT%`6_^U8M}l1D(w#J^BMrnmBUo9D*SA`mnOq^)_tYEJN;=Z_-Y3G!g*t; zQ%U>KUmrE+_rE+2(?R$~_KHq5q5lAJcPY?T0&=q{?SeO)x-paa#<{pT?XcVEeZc6; zVH!9Q{zK48YufeLSG56#1iC9fe6r`tKyr-1{|eca0^YPDFHncn`_K=Pmat#TZ_?6{ z;6WRQ>NG*`aE0j;>*9RjqY}*j3hXo;x!-4)OPzpToynWdJaorzsx$2?H9ge@sJqnD zX^*^p>87r<<DLho8_>Ni{@lPW%txp3>__tv4@<iOn~kpp(NEKxwE(_Q2S58>^xJD% z)Eihm6XyrO)|aiy+!Wf}Wm8|;*((x<0d%BylWz=i{a29s(=I)MxCUU`weVD6L-=7& z=&e*9@<`L(x;0qg;P<L3CJmuo=F<O<i<PHpxJJ^RM10>yzQ5;U{CR2b!=J@A6g?g$ zSI`3ft>9dr{yfN$#5nM69=dxFa=dP^j<$ww#v3$->ucZn>oU)6?(C_S;N{&bcJ*(B zT^BoXI=(-UWD_6w?%xAl8q57ThN9mAhn&EFiT%o?T+~ma9skx-E+hAQaGpcEd;+u% zjO`z;X~37?sjJnE^`c(HblPQ_;@3C_IcAK|OxpK$duSKqX!_GlvuGDvLLMey8~m2O zz+cS|ZOU8$e%HXIMCkv1Uh<A}eZw2#Tfw`s%RRJ^whKP(o0EMF{5L=M$Gcgzi2k#$ zh{plH`|_Tpv>Rj(R5I{`FLC`-dEb1_b7{X6e%lL}r%(7hf%hM=>n1RF6`B$U%=K}J z!~upQ?_LJU2HtJwJS|&y_(FBoitEQeICKR1I+fX|x`m*->ISW$KLnn$7MLXmdNcg| zZP_5Lr#;~WdQV2ayGDe17#MG3;^pB}x7PY-1J_5K3(;8k>D7$n6Qo@)gt)(D;L+SL zMM8(q$<uO`xo)=Ap-o&*GP!9pa2T@9iJXeUZm@-Rokro>3cNPMU9qg&$=3K!(B4MA ztR2A8*?rUxd`i5F{l<=7On&k`^tUqk$=H<nYK?y(?S9@7YK<Ovx&`$eia{@D$X8AO zHT)$H10VgtjtoB<xfFXwUHDk{Kt(TSKaYLn2-mx@IXnt<;V0GzKKhVzvXiuDWFgN3 zaNY@v`ix24_mjt%c7tU6hFZX9+lT2K?em9ST9gewi{Hk1cjo71AU;K`OFLiHKz^I* zx)jCpJ!8D(i(YXMes!Mb#^Mj|KZW;Pz<x*jUT5sw@VUaaa9yOG@UKDReb5_z*marq zRDzbS0G}p0be6s2Vw0z?(bgI2uEY0S_>EnsUG7A%ZUQq-Cf>Lfd~PQ3evEg~)nI(} z;6vES?*Q-KH|ZYmWnJ_R;7!iA9|N0>p?(f<3&FZ6@Tm#-pZSz$ULrm8ivIW^X1xK9 zYUk2hU=iff2cX~JKz*LZ?>{5Yc<Oze6Mq8^xJLa)=6zj?kG|7>ncq((!G#^<IsQSr z5$p34Sa=0zKBdsZi`(>zwu8Kw{)0HDb2E`^hxNoMWfJ^gV`I)&O0X_pty+;vzwH0q zXqT8AsvXR?bv5~xn?Mf>1LRJB?_2oaWQ8A+SI<QIWPF&+zzNwy<N+Lmzv1*z>`(d- zr{G|{pf6AQ<L{XCyC!sW0(~fkee4W>4Q&klm-f_HEB2`N)SKWw;}eH!(?Q(9<G zE<pSy&^t|-2E+F<Q5Vebe-xc%Ser`|h943_LLdYSgpg3B?n2#LO5NR+x(n^8yHa<h zrS9(T?Ww!_SJzY5@8(CZr?dMe<lUW}ot+(lE|4c&L14a{<fTC`ztx@dRu$F($&7v4 zv7TLFx;rH0UeKjro_qB(P$A%T;ux|qUY)PI<$!LFJ>enp=gKAO=s{P@6CyV_rlf~6 zEc4gcA`kS~LKa1V|5U(!TNC|*<R$OS@aeiprJ_Bty;Zx4v91n<DGhY!LFz?<T^kuR zo_T*ja9n!ma@Y%^!JVfa$^aH_Xd{<0y5k4#VRFFNe#Af1o(jK%r3-nl7mO|IGtbs= z4PZXTAB<2I`ll9jX-Q?|L%T?2gWflryioAPurK5l<nJ}%emy(w1?Tu_dwTpQZj$db z9=SyPZZ6t)SH-Tx{G2@)t~1@4@8SVU=Y?Iy8m!#(f6RqE2m9dMcMCpzgHbj=^kr}I zX@gTwQpW<U&3(dM<k!yLCKZL=Fh2<28T485BK%trd%|b@^PtP_BTfw5oh3wPVpz9p zd{r9y%@vRSEsNaCMcoAGuCWn1GYfsHdARcO9^nHFDogue&K2dr9`!jVGY+eln^bZ! z`r|Y92HM?40`&*EckU~G%OkLBU@xjnd!fa?ssav<AT9%ZP=mPM`P|!lCqE<4JC=m0 zI_(dM@49VZ-IM1ine~5f4f`_s$u9i+YttWbDM)Lg&>Pm_SHOHcz|K6s5PUI;eE0M_ z2N=}|JVM+=OYncs$sgDoJ`WC2y2b3P<gXaVdw-ZhzI^&WZ}ii<rs(l4Lev_%A2OjW zIE(m>H|$qSBaAY%VI8kAssruyin+CQIsA-YPZ9K}aswP1#=Lze7^@@wA39O*5KK#* zscaL`i*k_Pyfb>r3%k0~zHS)#V|ec|6FE0Sk9goOQZ}lPnLG{9AHNxOqXFaMAwGhA zFKMAwxPa+@6ldy9f3x{!^#R*Hq>eDZb;2>?pV@zF|L4)VTF8wm<PoEPz%KHX6=j|| zPb5IcqL*hYkGx^t_xd2Ga8~cY`s~yddlvl-u!{@=ldgMd6a06Ue2h)nA}1D7N0Iib z@WpfZ;~?<?(ft0`*ky<0WBu=UX*m7;9Ra#miE(U2ej(^`KkN$cFBp*dXwNv7BaaEc zw?lq!r7z8WBtc0N>LSM~qv!K{v+CSS^LGawrJf#tH?X5w0|xN-@h==lf9s7FjRzaD ze{z+k9H-EGpj&OR%QcqqZ$lj-=ru0te1Su`2bcoxz^;5XkahCSt!dEDnClOH(ZkM$ z$~6wTg<nhV;q3Fw%XIoTk#uAx_&bvqcln$RR#R_`-x>POrMb}gvbZ%LOv1ju0DM0n zN;BcdqXbSbfo`%sm^*LmAji>TzyX}=TP7jj#)hbJBImbo^d9D^l?6Qkc{A#*x2n6) z=Te8NkBR;4p-HRwTqJgIe=G9DVb?Sp`UU65)wItiSx>Hd>}%w0UITq*4gRit@2*Ty zS_{2_d<(CuV;4wA{gyEFL+&@$(O&s2^@4f#1Lz^^p=;c8Y6G~RbH(AA>~Gjl4!}qK zUlY%7N5AfGS5M}%(0KN3@Gs}>wL$2C4J_Kk=eAv>t`+O*soAZ~&>xXUpOG_TcHrlq znRDw%qqflgXs}UZmvGmC-*%5+#<4B=PxyU*iIbhr-`l#$tQ|b(!EW-n2ET8gzhW|R zUfpQZPTD&h<GdM)p4y!I{}$YnhXv>Y{G0bwh^n?i9!#e0J#wl<FY;lr&YC_ajxrj) zx*evyeEt)2vkx3sJyLthG0)@;*bi-OL7kpXobyh?OU%bi?#-vShFz&gc!>Vr=`HFr z0llaj_Y=^U+Ii%UoI3NKb5$?KwGeh(#;ptc)=~QX%;XCPFD`MBi;(a9%N~#cdAuP) zCuna${{A_PS2=I;a6&h4;IAQ!iyc3vO~|iOPeYZ5`B_2Tp40TNZXKzK75IB??fN<u z`IDdj(>{0-`NY988>z3;2tFtnsteFV=LBjT^YfHES{I>ba~W(-4gb!^J_w!edbqBF z?VpkNgLQd!ON6dLXFM4sN|&k4M)qXr^n19+2fq<taT{#NdThe)m_e{zuG!cro4AzJ z7W>jIx3UaFpD>zrhv!CfZ|-c!_+}+<S^(dBoO>49cdvEo0hpspm?GgLgRh?+LO)#S z)+6v;B7RAwvFlhPwQB+U8u#db(!w9asXn2<&u?En1&bH+(U;2TBb~`>zLfXrPrgUi z@#t9c3dXbkvynf9=XT69X+#h7$l2U`Lyw>9uUFvI=5}oy!+5jK-aywPFZVY1Cg05v z74c=g{g1k5vFy7my!DR$wo`mmAPv9w7=9#f^vd(0dQbbc9})Tp9-f3g2)^4v9TM;j z{vKb!1LPyXl%>GQc721M&pqK^=BZ)EP~jS;<}0oGMZ4t%by>Qgx0E6u4)n10<S{A5 z{xUOCS0dS8TH|L0U4pSTf#U-3KOTwy0e)~k(ADvmH-jIe(3>*BH|4x!g|?iF)WGz} z(^Y;7Na;Vx{UYPpIE=cSKJaa_O+mCjjWsCUaLxm-E##VDAGq#REb?~YKI}*3*}wW& zbuXOp;y3@U$vVM5_CXTzDh+!z&ksbOT38La+|EnR6#5<cS;2kiJ(1waK=k3P$O-Zc zxuFYA3DcZ`@J}j#nfd-{<l!7P4q43oYHs9>CufvW@tnUqNRyEZyI<M0dNO(#dU#se zC+!JV?V|84{=Dg+XP5I)dhj9sInHI=v)u|HMuvIe9F&>%OkYBj75qlt@a*7K?w@ml zLHR<I3tWO-E(w0_Qzk(9pcj)jD?eDHI`I@>1^g(Td0A)8oiew;4#PRaoAEi_jeM2# zm)(WV2%cTx($%Tx9Ye|IYG%BNk19%g75rpg_k<5Fm{bh<_<Qo6r?hV(z6|um9{^K; zHj%7otrvQ5HV-+!&^w5quFbgQ{pC%q9`vez0?6UcdioKr3iMA5$3J@>>+XP;DndtY z<$kOi`q(7u>%l9>$$wn080V`r!Kz7r1^mqOv2OgChg#6%eqvvZW`C+fyb<d)q=rRx zX&;UsV>8xGDE!b2x?&%H`8aq_^24=&esR?cUuF1fkW+2JB}b5Ha~XH;U!uyPC!Zp2 zH<<64VJB7){d^X2=zP9f9;@Pce#{h)+JUd0c_~*J^y$~(>I~iNXt=t8X&!~EJGi@< zO<9VtKaTK_BM-eMw?TW+hvGS(7U_)~{2ieCyyt{^)ZwDvzSg2%V27gtI*5GPo!(!k z^YQ!Za{ovBeeTWHuz!DB8m0#^jEkRL3ADd#h@5SKUfa~Je$WGL#65Rl+}HWRq$zf9 zUq$5S{)iyx0rbbWHfkVPs5kL2tmjEAjte8uKMMvaTSUtE63<Tm*30Bc0;}T(F$A1| z-kzp5av)uZmd)qA{R|pL`?hh|li=Hv*ab%;$EF_So{;us<b%jD3OPYOz7f#zweZ7F zS!ayNDCqrM(iy8@e>_cG8uQ#aH=n0Ht5>MTg83TzXk;qZM<(j8!WZeX;0L`BzUdpP zar8f$g<nqw&Wp*M!=b-$zp$cuiapz@_pHNrb*M9mT>8p=#zgvOq8}uJv1KAO34F2{ zIoT3<-G(~!&^3rRn+jgHTQv>**F}Cqup;?EW`n+!jOq@btbOa&#`?$->eK`_N1kNI zu0(%q<tWVqQ_r)?!1rE5{v<&ksT8P%U|1#U6~pg=_<_}CeNVIcX$kFXQyH}soJ(G~ z2k>!^0XF5y#yNQ-^>E;i(!}#5)1R7gjf3Axz!Q<Y=YwD9)948mBAu$kdY;RCF5|iL zE6E24ewasHF>uAdf!ffR^Y$B$GP90*4hqz2+L!glzTsgmyrQ%QdUUP`?${WwKfYQI zJ*F_91Fzo1zYDDP3P0+0$lC=jZGtZDjhzUb`NCf}GNPa4b17de`&wS&4QS7`-(OKV z8OIOg1BG^8^iWHR{ek?(d!YO6ByQWlyl>|ovk&v_3gzw&Idapfz4V`M&U^6pdXa~F z6LRTNf<uLP&bwK-4$!~-gP#VlKXi2Z>LB!_O946tp7<23#qeEL&dn#F3ud9d2!FQ* ze#@tzuMz)q8mv^+M;92!$;<IutOZ{W;r@%UZ93bbT3+xo@j_>LZg)V0W+Go(mPKEI zjwMgVd=va<q`o6^Ci`8xYM}4fS_Y^Ke77OYOBZ=A2K(n_(7?GCv8RPU{dE<3+p_>& z0}p2)t`Pn%7tehH>pCs|{*9->XVvjvtjG97F>YBHA9tj#^L(Ej<Qtp9z4xmiYPF{5 zG3Yn6`?YZB7FfM!r0jftSObspwqZZ+Z`N(vM-u0kX$kV~qFuLg^Zs1s+@ZZ9@g@&a zJ|7=IPH_C2?osD+2zqD{1A7~Cgn05twCDYZJsbJAIv0Mre6R1rP(7x-$1&>OgUb`K zJAvPJTeP3wdoz~!QRqA5hjzm60n~p@VqAY7H0U+$9e)~ivLN3_y@T$l8OK7{bC`!7 zyR5nx&pw3z@-F1=oy`84&bT(~fL}U%Iga8hANl-)uTK33&h1aWE%ujQGnspS*DLO; zKhZv)^TAi}(kt?hf)}ciSDg3W(Fp%n=rr69{RUIHxOW3rwe@0=p^ra+XIKw+@T>EJ zZZ?^^UH;5Bb}Db^=Y>r&f!jxL4++*KPHHTA*Osi@cOkDImvyRUInJNtX$hjg?O*Oq zz`U8MHwsqG<*lK^*=v^I#|1qUxx6?OxgH#@pB34!S_dkO_PN9#oIoB|=x$Ru^hn00 zBI|r6e%Vgw`kl=h!Tzz}Scp!e$G;n6#>bWCR~t1RKC4Up$DHtcnanozYfeLI@({6~ zO|C)y9oA1E_iw&6u^(0<ZiLS@eTjVvY&3=QX)E{xKQ9k-MK-}GaAkF0&FqJ~kMUC} z#`#%FzFFEIMN$thka-O-DK&J}@qXBj;m>40U1Ge~Q?D@^dd7+X4P*g)?-{Jj&`FOO z^X}-yIRcaox}^{Ha4;bs^|AQ5vAomfNch9WJu&V1{Ky*!=Gp3}iHn$DFX|~nyN}tG z2P}YpR$j2$Sn^b5K#sllS3c-HRaq}(IoDt}UW#1m*xDto=2dQpNip;n=6<UHI3XRj zHs&Rcq{Sb3?pr>y3es*{V9^TZwIlbV52E3}rJ*WBd#i{jVv5-xdlE;8{`YMW@x-+M z+V7)6=qFiPTgerO-mu@OqO_+%pS(7K^?TY|C7`eO@zJ+A*un1vY4H&3IHf$AH<<eo z{Bl<F?!9_PswB^?x<j2IzR&w}h%zy6iBq|!q<zjx>{?*smgKQzeZ>s2C>FZV^$2Q~ z^S;IX)syk<%0114Y@Cz0M=Vc&-VylgN5R+V>x5D$_6zymX#e=hTNS{3|4=s#ygQV- zILI|${ABL=pnsBgvoh^NIz*}}IH+lWs)OIo5I4{SJ?$y_MoNDRf7Jxr=C^9yQqF-T z(IcRLP72qRI_xX>xi#eXuDu$ny0i~6`{_*re2?9HK@jsliu*a*2mFP{!6fW)X$xSV z8EnzIPO$L~Z;k25{??c}ob=ZSk5D7<#W4J=n77hdJn~^ZKDlRC>=@4fQykh^jrEj1 zh}x3u*VMOZ4elqdqYZfKDf(YZdkbVT@+oJWLG7R)2bt9#yheQR-rSr6a@o}Zddw-} zd6?G+K7R5;?)>d<!1tH_6Zi|Dzx>=l{(I=-Ss8n9#}TWxv#!g3MnA5Fy^QzmMtk|W zk?H}qsuLhw>d9|M-5TgUk;tQ|=&{77$D&W4o9L%Lw4dXit3Nom4siisea`jQ8*x8$ zl)7Zl@2(*8!GDM&8x9_>NFE+={v7P-{M|Pmo5nyl#P~KA`C7IO@*nwoWu{x5`l5&6 zZ~rgz@D;!3u{>AvrBma;!H?iM)?q)Ab9>O!iVY)A68g!eGyyuxn2jdi#sr@8Uf{;Z zmiM_5q*KW2Vymdf0p0YxQ^{uj4m|gc_3vXcXd3NRI=VC+e6+)&tnhvE`3MoZp()&x z%}n_o?zbxyW}NF;H4FNH#ap|Qc>fU2L(`F)sU12%dnC^CbHF+0iI?ZSrXR*{E9LXp zMdy`4zh)ltGk;%6CO(gL;{m%)@;*Zbg{mmy`|?bH=F|R9DdHfJhX=7cEP!t6YgI$u zWB>b5EribMM6SWVF)fIzcCz2)G$>Pj)`yimj_AQ@e|uDa7-vb0T#I;q8u?0F!KXKT zh{MUudS(+j%NSVS1gQ)9%pOCqK2Jf8#(R{+^Y*nyjm(67g?zT<O7VAVkjI4f-&|rO zw#JVB&`b4rKRxp(nRX>opMm!{nZc#4tr&*}URp-`bNF#N_++M!R)E#(7({9rHHjs! z3G}ZxmsW$#>jh~*IruE6zYaEo&+%Ws!yek{Gj$~B&vPSEWv8(woa9%4UV>fXBIAB& zH~!naS32@vE)C%Kk#~A4{jKrq*antufIkrHZ8rCEJD@LJa%v|y_LPCzS*$nWRd+*g zBo1*8n6T8M*{ONIqJb*zg&er<t-Z9rJ7Lp)u)zTQ4|)Hb#awDPmic-@{VLk;{^Qnh z@Oz^u^{a&5FK>LE(I1@TWd}E9H|h-7v_z!-1@F8hU(a&ZDgM6CSr69F7R^8|_9~4Z z9sL!Nb!V9WDetLs3vHTDygT@vco2?2G7(pN1$uP6TNm;(|F=U_m;JbPChYgft!M41 zM@+v9zomNr@IEVDx(@wfy;0uiF(sc^)Briz7W>6b+B=tw(lf?Ak~+Y5peOA2)dMiq zEaKhJ)0@w+Xqg-SBDwcN+8dIrZZQ0kAHVNM&`Y?V`X6|v4foqUnTJZj<lIF6j_}h_ z-Y+%xe9xhu??(?t{`_r89&SJE@H5Fz&+mBL1OFrXJCCsFRU!D7dx@N^m!^NAX<xJs zKOFX_Gr?}Xfxi6Jt+r`6U$!t1yUINLYt(zNdmrkB!~caiFCAr{IDZH`9_@8FC$EQ} zx<vaa7Cvj29IB7B2Yw(A9r*bP^)HqoAMx)QiySIkEKH+Hvfule^@;vP_+#W^e%_}d zUqAHy3gI%dpX5rWE+F)$sb(Ev9gf3~?kn`uChSvXku#xQn!~z1{wr8X>1ZcD?Hm2+ zR|TjZ@0~9sRF#p_o8ZeIwC^V_^B4HN1obPDkx#_$mM_8if%Wv4_Mex7QKC3Ukq>YP zdVRZ##3MjwsKvbn<8$>J`W1BUBKRXMh5y%)Cv^eij6P<f{qbOrT)bDOQg&IO&4b88 zN`D*Hfj7UiXsD0c)4!!=sC?<aQYKJ-AjdV?z-suD1%O?rhbsj9P{5{8&{Hp1W#Q+! zVc|MBkGPIUE`3VN@5|*-%Q)Vj-yX(udw)0;4t73`9uBrKQP&TA%YBj?oQr%bh+NtK zKZmySHzz1m`MRKwk;gezclNt&>?O?K`Z*3_2(bs>BECZ0moAG`I_Qb)w>PFDw-$RT z19Yp~fyxL@TTVTNl;`nlT0fqBIF(DY`8z`zV~?ZV`p!=U_*~{z=&P*n-pq4$+Q&5E z+yZ7V7p{OBoZA-hd!Q$AelE}co&mc_Vdw<>bJkAcTpdT=Bj~M@Eh+}aM*3-`H+E9= zvJ%iA@&~J6UhHAS1FvSi#-PWPqP^y1f4O<jvj1}{9{s{(CqEMHv!4a31A2xdpTF{> z4?M1d-GTP^Ar6%TOQUa%hEMtvci1~+eWW9AQwaX3ORzW6Km0a%-oczjoa)bhSph%3 z3ea0ul2;u$@^La}N%oNu_q|kb0Q`O=O!;83=d8bB9e5w^1uOD=uPsJZn!tLi=h1@Z z{NB4}wPKxjZD-UH*7JY{;i}1V=7v$K4PGWcTsp?F+Cz_?O=G_cGpi2mr!qQJ5xzgp zzq-&F(4%j%uO23d^ky66|0t6(cS|`ZvER{O{-aS%z|Y&<Y6j-U{#66{wK5xZ*Ou^i zPf%Z!_FfUxL2HQ|{LAlxelfr#j{NvF1nVVoEi?X7xKgUl&JZQ={ReV*)SBmh``|YN z*1#X_L<98K4o<~Gce)*+j$raUkJd0xv$o@h1?_9Fs~eabzoZ<@zmsw44n1&wq@1nz zdrPe90eyX9h$2`=M<ac;fqiEG++ZE6!1pf;RonFJ>)pv4$8(Lwpo8&uFI=^$FZ9N1 z<nvE?{y6oS;D;Gc4N9Or{tI~@;QRWOLew9+Ne(~V<NL=>3)2k7GXH;pYSRmTp5oM# zrPxtM`DhT&4Q?Ky!C>N_P}N6X-mf2^A<&Tx-5LtM@x#v={PWx<_b`4-BK3!JFwb`a zREWR-s#ds$)1NJ~Rpw~y!PW3TL*H68$*6ZNm?!)dhxTXv5U=*!jQk*uZ8Xm(UNLG6 zSR+f6CV<mE`Dh|IgZvpkim-mJk{`Mceo4c~Url?qNa_`UD~Qt>%RIhpPd>px?4unG znnC-=${{+3eiNOH|0{ItA@b(Nu#c6D)EwvzoC~iHL|(q4erhrF1up%*@_ZEMJ6sZV z)`{Oc`(&|a`0aOvpMLvm0iXMt8#@@d^i8PV=0<*A4$~6oGnt5UME}X$%dLgX$A{$s zT1I=G_+YIB2Q<chG6el&E1P0t&Y>&FJB2*Ce8gXWk;|{Q+mx5}(XWw5t9ZTv`}10G zG<if?vY!9TN_`Ues_Z}yxn0<|&Jpj*?_0VR|C1h!-%#?arF?EEeobJz1LVm7yDY@N z49uI$tUaJ>Q-Ee6FGeu#d!a|wBHjvqitFgnKIlFT?aI~){j?f+G@wWKCC?<|Q(+SK zEv%#4Q;j-I`?=ZVPXj;OEehm!?|y98blzjkZ<~(O{+)aFuOs<B>=;j2*Ijl86Eng( z+JW7Rd5nL<+J>Id0zU^ZBXa5@*!gKBKNh|BZ-g#E@9O2F%iwLJmsS;Lyot}b0-X*0 z_bM2ZfqZA+Q|@1yvQ8J`_j4WkRnt&SMSd;9zcC~7&dqvF-xU55`POSOo?C4~H0aPd zKi%N@m*n@k9tPjlcj+ed(ZwD$WPXm2|8^8VDI;}jZl(O4Qc?Pu75Op3M|YsdE$~wn z(2U>jU)F2B4-Vaf9{n;<-x;^%O}Tf2o`2k^M_|LA)MG)0j=I5p8uaz}F#QjlK_0Ls ztRoY4^kS^rQ^=7<{O;6!vHLohuQEY;#&dOYQf~%q%sy8N`8_?JI@s(p{zu98)(<;E zVf<|2<FZ-9w3+9e$Ekk}9+(uQ?m_G$_{o2OUV1M=|ACuKK5{HZe>y^53g~93P5KH7 z|A<VDkUK|0)SdUekKa~X)?p%X8sF%ji$CoT__9na=XdBjl_T{7JaW#gU*MGYA^Hu@ zr2f)h@E!Ht3}x9@?&8Ni7Wu<m_&`U$Gs*%w60l=rN6vi5KaX+Sw1zld+K&a=<OhDo zzBGR><AeXx#&nz&uUHh2@_Fv3?co3J<HrS_T5Hv_QOwsj`~;wru-iF6Z<5A3!7JPo zM}WmS$GgCpo&9x(c`Fb@KDX-3V`_uGFyA%5lV3CtJtLc!9wN88;+K(%=eLn}djspR z*l2&Hfljzh9xnEyYxo~<WLE?1kY9M-dmHy+^sh#r#HC#uOB1hxUiK)HMbWfx<#)uk zh2PoVGDEM3As-L>=|_8%jw3&IpbuxEz1w`Zt}kT&IL3V$w3~SF-~8U!eVxh;{i=*X zl^M4`_`Qulo*q2wQ9jze(3|svnRdGs0}kX}3W7y=&qCn25b`g9kJtLC2>9TDRmX>- zH~#CZ_wY~MTRtjE`~BG-6$i&`_ER+PSD=2dCUr$mLNCgbf%{SXI7-leW1OF|BHAWy zvZyq4+*sm(!I;Y)b>g|Wx?YNfet~|RiqEIqjVS>;Q<^YUq&@RR&U*0ktLH&F&blki zepQ+FU3_U(Fr_$Vd-lFh6Wuyekazh?K1<r8r<rtqKKoiTU)6v%3^6H9dgQ<sFV%$p z%zgLh=FDS0ryQ-Ym&c-4(BAI{cB4G#OT=NGW8aFIXVCG~Df5PG^1$EZ_o~|ty|$rQ z^?1JOl1SC>$b5x`;A6`@Sh`@DS$7j2W4}dTnDm-B1fJWA{h}ebY+ZmFfzO-R^q2SA z`;E9-1MB&iN%#5QrEkegLH{}II88x6;*eW_5vzQ$(KDX?$rF$b{<o0t5_#E|y;^?g zKQ7J}?5CxFSk#HXd-W22y6k^e^1QU+bFE+DFX_X%dI$a`&~e1aW`VEQlJ~9``%b-O z4z(Y_el*vpc>0$Rr(Yg@tPA(5?Vzg=@6sNOIq1+M-gB3N)B$?;ML%+y!1uxA3xobJ z*Q7jy_#F3kRhX|o9{k8tK2ILA(afvkDfb5a{(UYZHRiBSP^`FEBIA0P-^6}Zd=m8z z7a;@ikKKses^R6Y^o+}f$`R_#^Iyon&=(9xt|WkaP7-$-1Ak(F?9>E%GIs0!wEr%G zoe#X5Jwj`Y%;#0=9+aoQl|ch&4<sM;K(N~f@*A<fI&`Cs1@y5o<N@Hh<5#?tn3MJW zJxJTrAm2LsYB2pZ6T|eFbyjzsNp1OirDmEmg!TvN{52FDv@}S=!K`sk-Jiui^24JM z&^ynOPaze0T@d$v&;j^e<Oo6j)d*7WHtdHlLNto@;+X?gvl9DBGW-eMxgO)W1UWp2 zdd1NF@ZVU%KDcQKdXYcxwE?>}?Z4`A_Z5X+Ss_%T7>`9iBV<Ls_6sMk8U6W-L@5!x zUx0HsSZO`}7wjwN-tsy4p#E)#Cet2@y=e-#c8pcG`(h6{K|V9+v3&ycJPy4C`7#4~ zIDc;@IJ6t*AMorN&Zl4q_nKR4Vu$A3;l=MLWOL~d`-Q0!@m{^rBQIGrkLMB^68BYy z^XqQ%VzA~1kuPQ?{cDDLDUkKI45nVlbAvCCZ_o=px~aF4pf3-P(BDGL3-?7f&J{a} zm-;ggJK1QbiXcDYn_<7>`6p2!TEp`zS^sOnPkXVmg8h~SX##v*ka+y{&^fA@$g#=# z9!S0}e$Q|09-E-O$Ya~uhCa2<s?E?=lE!QS&DhPmR>7_nfWI&F#|A;#1r}IIejWJq z1b!-ep%3Dx*b+WkUm-&Kp*OOw4uGfcM(QBgoPFsqn6MbTOLz3BbJ!W6dlL8hB}IOm z2-Alk{*EPB$7#=H#0~_;k-y*s`-ZWlU8kWP*o)7AGpce=k6yjI40(j=qt8zD(^=Yy z2Gu!m#W(7KgGX+-^d5OPn*0wJpf8RkuLu}h3%`{l_Q(4H)LP)VU_V`^y+8RmuY$SA zH+BQe_ufypz<Z~>bsOw`Czu*ooa@_1D3)<~$~ic&J^R24<ZUqg|1nsP=zsXZs5PvY zJk<Gm0-d$JQ$3J7$z_9efqgPys=uBfXDvZt>d$(}k<+dr4)}Y3ul~pLf4c@LW-{xp zk{7xC;HMANW2SvIajtK{(Q}Nl)n$Hf`zjxLNptdn{zv<C-tSL2`1g<(If&u+hyXQX zUmRYNx*qU%+XqH{;yF`i@^Z00U-zSq8S~!0kVCJKpFfF%j#!L-+!Xr^&#l=_9$N4c za{ty0#^;8&;#jYZV3r@W-@y;>57_N+u>OK;lT5nITA5NiP$qsySg{EC_C~%kR<+o_ z-=L@Z(q0Tdm#x(pU*b42&E)yX#K+Kn9RHrGtmDSWh3-|6r~i7%PWzTG*dyWNS53$d z58Z~}69VS19j<&skdp(v<bd|Y-#-kTgCEcSSor1^{((!;XZ?Z{PW!(dqZ9!KF85a? zn2G#CZg5;)>{wtW?&YFE|1<bGEa$u!O}!T6*7y2GWupC6JA*QV8Tef+4Lxe<RyJrW z#@RgJ6yhI?p&#xm7pc6^-O)qyf&H%=RREl~AOPQB)(P>cMWA~%wyGukXSD~aDD>pE zMwI}sb_`ZYuuUiK14l3))4Ww0I@5nPl>vi;gH#^$tYXitgB&Gq)^Oy)v*2J=pnYB~ z>R~WnA9Gk$2|E26A2oHbE?yB&34P>@Q5o2;+~s{$6?$3;<N)8(-^Z%{$Qx_H2vtSC ze3%-dKFHbrwYeAKIrR(H)?w^Jsfjm(zDeGbI$+^}<RbvTur7zqLVqnwoetz||6!b; zX>b0)uEyY%XkRr2JK(?43~YsbZvoc&<3)`c^w(=_?#y$0H+u*2C3*|{Iql<;@Yew^ z&$Fu?m~@*uC19~F<YhvB=HBE~7wF1^s2c?O{9wO;e|&2>G#`E(`kA;;+N1xv)wuv; zR+;?0&?DV$9YDSu@%B?c=!`e;_x7O2a=z>jJ^8FtZ<w!KdC1oYos)cbL%_kki90Nc ze5)F)aIm=->l-<=INDnYtfxQS@W*M2{q0$}OoLdLXCpL}&!zdqnWO>yN&L+)=vuSf z8V<JINxoBXX|z>i!SG|O%{Iuh<>(#EQ(_0~DOu1H@q5mK4s_u-_sYy~d6Pr?)1go9 zGHX1aYunXDZCK>tc=kc)f0C)A&F_C!&07<pGe3my`1{kjS9!zlD@HzRU*z^?U+RRj z{wp{1P%9A~)EOlwd>mAYy4f9(@4U|{JLCQ<LO!gA@XB7A!S@xhlTV!S&uQa6mG7+^ zh8?CqzjITdX43zP``n?(3-7+v(Sj~c{LE}{O&+u6rSz|eREvS|$xG}aoTK7$JGGeh zIeWb{WEA!U_WdQ$O?D9Ph<xd=G8~_6K4<sWTlNv_2&0mrzjh4QWixtrlt;^;?dwB1 zQ**D`3wt5-sAd+u=mWn82k2iX?|YQ^!Y=SFc@Xb<!LQ^W^n>5aE#TbH7rUh?SZny) zzDM{eg9ATvpUFB%wc4!p&|_wLv;o{i9i$mK;1|~DmCnfb3E`@aT-`_hvCZ@^EX=+W zK>MCRZGoP8gnWzWt-c12wnCo_HmTDD^eoPu+o4O{j?hkU+E;It^g+&I-`ofNm3?Xt zd^{ux8yED#M3c56_XfMD#{*q%4zd%hiJ#I*u<wOXWney9HziLw^oy4+Rm#tMUUchD zH{P!{dpLU4l+@ljP5+J5Q3^*6hxy{S$b9E|K%T#m=(Q)kG`~0dyvL;KjEm1_>Y($z z-|??K!{-*YH);?2S-indsWYID+dS&dy1kl(`hm;P^S#Nx2cJc}V_uP$dzSj?9G}bX zAwMVh;FCe&jo{}=PF;phP7|TwG3aIQeO0Fd`r;4rB-0+hi?|K=vMByDH=#?#U}t50 zcb*rha&6(8!T8f7|Azd}pxUE3hj)w8{pOta_c?Wk=QoW<Z(+Y#7(sr3oSZBDEqX}% zx?Uz-ErA}<hWw4lzrcYuJ)*r`QT!iSXIaTl_ZZqMy_b5xr|+<bJcXY3CRlN^S)=9s zRU3J=BRlp|+8v41*9F^n6SrEL{o#m7ElOff7;e>P+MkazaMy!fv=QfPXlJxrlWXBe z(#fMADW4+<ZA5$4-76ophM(e@zn`?P|Bk;4xFd&Mzd?5+Z<HAJkAK5t`3HU>KeHEf zz)^=tsj1J*e-QF_xDh)m{CVz<Ne23D4y*j)*az^(_G5etJoQ&2_;FmyI-ZJN$~rc% z4kyk+Zt;9<wkY|6-Ah}j5rKTde{VJGFfVz?t+c-wY}9GiMJev7v+zB;x%~H|-RBZ^ zl+@VwIt9xgI`09-2GO3Ts7H3_9}WC89$sELC{hP9;Rm;wcuLx{Q&%zw?0em=3CNob z#mU=;KA<^XI)pye+Cm*H`m4<FQZv>=r^^myTF7}9<5Vc^wTT<rHx4`hJ(C>J_i&P~ zioE(-8@mT|p6Y%okrg{yuSm^ezE@mEKEa=D&)|;+-)-U?@`ZUnaL^ms#yRZ_b`n0< zb9SJ9mO|e5WbC0=lV639DxG2-q=qhXk$TI#fBx#^S%Qu`fPDk3TOmLh!2RT1$q0^b zY1P4E%+Ch$UO^|0rydeG<q7^RtjQ6?OGmPwoJx*RM)s3G-+Yvf{^waam*$2KQ&Gnr zy3laD-Z3n*&bgHnx?Ex6<iSfdJ<1I(%j~PhtizCP+<U`+9VSzEn)X)>qVyl@KWq_o z%Ak8<PcJ?Zy|b;43a0em=iX)s@}M*R=g?#R#b!4K`CHemHEo$U{5cyBLT*I{>nH1| z?;)p(@?77u{)%6~eFXUwia{SDh%`I%m9=PqibEGJK>muw?34I6mVh3en>vo!7^jBR zKjyvLkr%fl?JoBB(x7cwu*!jR+2?NMVx8j88VfzIj71f|+T=|l<WG*YUf42_8(#xe z6)c)ey<O0go%#@9!TIEA1RLR(Uke;^l{n$d%+oLGn?vUq;jICzhoZ=V?5wv9?0+>1 zBJbgkI`kjU5~`-G<AbZn>j}LW|FQ+l`#<EDt_MA@o3|D+?}_=1st-LJ`P2|hL;cSv z_L~=H0+j=~S>;}!8qq%TAL1UO`MvM(TZSH=4u4_v(+0#5w1%FC|LIG9-$x7ebfJeN zIn-bz_R@Xu0(@$GMEy<L<GyhpJA-}m9{K2@FLuMv1#HqTShc1gFAkGWAG)qFoEp%a zTYfv#8M@~|{2IXpvx)lxS5|SUG3&$MMgA`MvZBGJ?zG>j=cQf)`CZ{Y>H*z_e5~H^ z{^c{|2gr-v<b8yC(!TdA{<J-iOBwJN$;UinhwV%IL|>B<z|-WB$i#Yz>OuZ;=o$Nb zGz?68KS)!1qX#TD>LBa5`3c63_Vf5LjRI@C4C*wO_aAK2DflBl_mF8@(2oDd82aa} zkJLDDWVJvI=67~#Og<adbMg_h?2O+#;!Adgvp=4TP_~-rIpp0-wFtduwNVrJT!H@n zddNEXcs@{R4ZK&Q2*pRD&)%^sk^YGvT<Dst^?XLH<@XJ`j(;8NVs%lM8YOT}nn}D4 z`bTWHFcn~)vk!D=U3=sUdF&_g`4Z=xnhZuxHRzcOy?r?T$j}4Qxz(Kc*iF1iQO2=V zj!2DSUX#M`Q>NebF;LUN!uZ9^05et#R^3s^^~OP(1-)-iknHGFBdI&_zvis}OMxnZ z{4^&K7e@bM&I@zEH^azJH;r{je8F7k!^92DV171q^%htEdK>G~6vnG9b(7}PU)ae0 zl#%bfLtUy`@Hb9N3uzy13sPx+*5P3M&dQ@-JT%CA8RHQfpkm0!fCS<L;u(kgoXZ%e zV4OduvW`B^2-hM$f0B5^v2FQ1VHPchHeM$WdUp7ix(^?l@q9Id(lURCK3VjW_lQ2^ zuOyy}*&3u_1=z>2izP!JUh1tC;3f-oAi!<esq@0$OLTJ1hMt%wSZhJgX7VyKFE8JP zX&v-_@>i_~JI~~tUJd@shy4TkQx>N-g0=1wFAo-pB<>ANRfM`J?B~BbQ1=+Rhn0Fj z;D*}d;Xr;Zt?AT@M$8v-ZYS+~@P{tLyg#cOs_x*=Q0(vvm?z>UcF}(~Yk+RFVI6ez zQfcIdqa6N8w4bo~s3zmkEl-&CK!5Tw=<q`1{NGURg$}iQYaci@99h%_J(l~#81}&x z-#xm*zFs*A|7-fwe6Z;V*tbfQj)KLu5eJ`+^}+qlap>`}PMrWh6bY3(74qUYd7E0M z*gqLJ@OU`)r2LM?r_K6`oGn&2P$zlb9v`Jg=vzBUMsgZDPYd#(f;DFtbsjv-X1<{n zdg7BXU4%X#;L;WF&on<>2k#qsZ!pfEd^hm-C-Uz-@5y|i|J|m2_(sMQ`IU_z$hTqG zOMVhJ%=}#Vf<GJmIXQP^7|phyXiz-|`#5p#)oQ?JIimE7b@LoKc$eq8;Fo$ITt3TB zOZj{ckH2b+LT+X8(=_zdG)IE<fc^yHL!W>F&+)ebH@A1`8ThB9kJ1gnF3`|hZ`cQl zIo*0r`|(tv^5XMZBZ!xVZdnvR8}M&^AH4!k)+X+g`O;o=K<LS%sT%-pxo^StfgIh# zJv+3g9`{V3jr+m>!2Z}_>oGr@zfdQRbrbm)e|Y53wjk<K)4!Da>@VO2>}gw=7ekyw zU!e<fFZ2y8WW<k|byB~tRe#Deo-af7tR(zBIa1&0k6l8YcW`?*;$=#sf0D28H?*1i z)<56~Wa#VJ^p`iN2>k)U5i;^UJO6sC;3)Lp(~<Iq-o-tD35@=YpILMCfM3MlBM<); z4%HX*xb+W+_oDyh0h?yQ-{0>N@4$NxTSPrZ+E<h!pFY^%X;D0SdKOQFQe{N0^bOXj zy4?4rB~L?QicV-zP57?%Badu6|IW`(6_%r?ZwkT}h;@XXQ#?2N5`JHH`WF_(Ki-0z z-{+@b=(8hzb&2)*opA_(zSxksKKkAH&<CN%HbP$V`=+h4X;E6nJq>w;k#E0$m~|2U z9?_0{6#2ZM5q2Y<?;Pk*IH*eG$(oG*v@b*j8Y36bU){9VuV|MC?6NjeX^>lAJKGcm zePfDQuaU1YcSDsLddfpz4QHNubS94qbhnoH)qoYo8?=ni`7I4mM(C1f{gesZI4(k& z!3Qhx`>4*jATUfhpyMZ+bqrPi9{Oo6=osQ`TGYq>-HY=he3ZNze`(rl?D1C1!sz+^ zeYF|+)UpBf&S{@yqn^uR#$f{StIz{)STu)ujPNJVU=`%XK=OQd<@`b3ym3Xb4}5Z{ z0MEVf=R6O-FJn_-a2e;1^1R>0rq~alGuHM|2`~Y_#Zut!^sHYy@_o5cWuRY?hcyoT ze1iPv$aydBD=I=i%FB3zKZ%#93C`ws)CK<}Q~w=&K8gBaV5#XrY7D+Jd8-+?khsY! z`Qh(#oROe!q7Rg7&AjpbZ<t^IZ{!c~;r;F8(?t%aqb^=N&#mB`HVye%cUpuxKxe}a z*b(%Ed$iKVdk-;abQboHr^GcNrvfwhst5fWu{ZVvQxoUf3(TH{dJIcB#|0AS0=?{@ zS;LS=2Z$?Q%eZasVNmvBoPU#pbfYcvdO1WK8I-1(TmSHU`8$j~*gOE82K*a|ewxgD zukcs)S?qs#9U4yi5bESrM6SeDiqc5v3Ja*87s<LA?yFJInQUfk!mPXWPK`<Vo(Zg9 z^pU*>$-4$U!DbOAGx?&AkAuELKK4oAWc(y2gXK$Nr!t{;`IC<ux)XWhvZIeoxNOlZ z_~46`dKZjm4*UwI(tp!0N_!j9&%Ndt&OZ&4sVhbM0z38HLE|g(Wh`O8c;l^k(B1L{ zX+F4%x-xO_T^Iaos*gm!@8P0$H}bKPM+@n%ea@t$6wF9IA?9mBBJs`0@6TJQE6zM; zciXju{=TmaDoOjV2;#SqJ0ou!^?>=zv6K4M^p`y0tv={qH}+bU4BaQaua<$+{|(i4 zesAyk9xaF7Q3d}K@S(?{tmvy(H{o9boqa^O9?xZ*$lvr0x%6hOkD^Ai-pQ|oX<Ie= zS@j?5Y0q(Qt>O8jZv(Uz%pJyg0lhMn*`Xi3c#cI{+lzg&hE40}--n%PJ=p0?gxax> z48LsEG3K!w@^>TcPJ(f_fy2Em+5vV%KL3S}LSCA55c=>E>?i!)Un6~V7`na}b=|-+ z|Apu{*eO@IHo{9ge95l~-F!u`PJ^bI<g*3;8x^Fyajd5-)U6HSJh`1bo_!f_uRz^l zKaKC{(pjFnhre|B!PpVVcjS|v^GySX&ePth2k}(k&vf3p1J?9J>Kfk{N8Qq0<yc?C zqjZ<{?c|eu@eg`vTJp)W9%H6@$uI%EjJgxGn5Sbm9D2ZWR`kF};I+XfedBi&4-3`0 z%<OCA%Xv(D!aZMNQFwpyCr?BEN0bTH3+V0!>iNJQu?M{L26}U9mxjTwP0@$4_UBG+ zw_R^(59NG(3jUqm)uDILXN7$tEAt;iz8ik`AN&XH=u-cD4pVC6o^N2dKJc7h1?Crw zZ|>203w%72{J_vFv0twrfUP#cOWjz<vb%{rWWSB^*FE^B2!3VRStr+t%V`9kU0g~1 zNBYMG5VyeJTMhqq8H8S4HA-gacZZ1=f`3n+<-7zx%<M^BG}`B2k1kM#b6KQC-Qn}5 znN9pr#-X}FzVyE;L_HEPJND|)tfN_Tg2*ugKN>=0qrKf6m+W9E>@`7P_y5TAF_C?( zO^|}2%hVx1S2X9_r|h-RHQ1+};J5VnAAmj%i<-mtM~o&-MIPPx!aWx4%W61u0)4UH zYhR^>K3P0W>A+_@xt|7u@fR7_jo&ea`y1$0*dP83VZGM&S7zvT{vnzl44-U8uVKE@ z5dYX2ITe|c_-FbTZKLibI2`>i<!-e%@p;>tBTw-&d&TbvEN#?K<UpfHA7$scHFquA zLwjf9FZRyDp8MRT+_aa+uOJVYhkJ*13|)t9<h@0XXN#sTOcLw8l1+u^e}ljGyWy-q z?8kL8@ZR{B6`{Qz>#PUzZ8z~dC7@SzaH}l16hDi_$c36Qfohk?`XP_Q-_a>@kGd)J z=X`~KC>ZVX*A?VIz047cOQHV>)54+LW3X3LhHej^VnS0fk`7mg-uk}~E$Ym<bT57y z&<PFwRR_H1YtUQPdzSi9ss|l!a40)^?#{*mst=vBf?W;4Ijoz;;4S=F+JK3{_#J~= z(N{Zww;Pbhq7~;)_OXu88D2Vcoc-u_ApT3xr@p|0tgkeO!Zigws5gFRe_1!nTT#!9 z{?O0(!-5lG)-U}1d$*CV&^J>Nw=gv&ZxeNgeYlUlMBQF~Z!6+V`qJ;kz4)@l=(#<J zZ-E}m{xuX#OI+44F#ja(IlyZx*k3H%`~62g7U<5K&DsjT_g@;R%(c-w`WtktC+i_= zq*}rc_YUG8PJg<HP>tmIQJ+j24K|85Xd-wmE%s96P04OPI$s>Qbu~zdv=?Ju|BYmQ z@3m`W3*Osgl>@!EL4gQOqkq4_s<pnz0nWS0$nW@!*#FsAt>k6;h@NwR^TtEQr^_Oj z3bWn^oeH8>HhT1U>Ynj=bBQo*f*&$$!G8|Abw%V9*ms>#bHEVt49^1({^!yHut*wz zEd*~)HmOT}&iS<rS_GZQWlcT!VNQ4Iq(N^#ZBQ~;p=zL(fj#R)Xa$&Nx=|ru`2?qG zAiw5uKQkFQQnkEGX?X9>*acS6KV*}iR)f{E*mM^;|DX|eJLo<pA0@arXWWU@I_O%J z9jXN1UX3H3ZyfWs(MKC-|G;^83s^4|`X!itNvO7g?fP1@9bEs=M<qkybL<nV+o5+H zb1R@6^5KN9cF{j}l1aPjaIPS3H;%tIeoMG^({6O&cL^5$?ACrG`-;b`z0lEbebuiq z>#A(H_Cc3j%>5bf(_ut}4nR-n=cRF@ko!%rbLT*Ayz)~6=E?NNqJqqOQfl(a@tkWK zaUOi{_T%I`f$mH`faBnZvPNyqM*mlf_A%cX$-8ud_Mf!_bP{}*#;yPHJ#D%hwPP6j z%x^z(mNB2iUz~z}RK=`X$mOtkZZ#+Y|FtJRfc{nF!8qs5d=Ikf40ICtvVQTqnr^V@ zHXr-($XjP=zkrN9!tXZJBOV3%IPrwh?6=_uxHn<_<Yk|_M0<Yjk1vC-szhon@}diV zH`k$Cca2m@_$<%Z2z7=}t`zgvUi41aTi&-5{51nV$6VO6u25%!=O+&_>LyrfHNOKa zYjkM<`={eO@_iZGSORs&Xz!ZCt-D}IZ>t`HOSy-MY0duaZB|M6rVRHyk7$p75UyM3 z$EAK5^grnS*lXwVJ#oE^n$iycg>e==qrGhr@)m-xrknL1oHQm_AHZh(-DT{1*9wH{ z6SN7t#Ak5WQk$kCUmv{1-x#`cN$NR(qmCH$8$6m6u0LR{j*;?Wzq?w7{2XPFV@C}# zLQe|z5W|WdbtOQ3*mtwWMrbo~<Io)Plh7Y_pSllV`URXv!RO>{@dZ8O{kRik{)p2E z=I@WYM}9gJ$33%IR{BHA<F|s`dB4Xd8}!JY7UfQ6{jDIsIkYvcQ+5!xQXrUh0QrNN zmns#A6NbLed<KJ+iGK?N-^7s*Fa-n6a)P<v8x;WtmI_njDU9Pv?26Dy_<`e+t`ong zAAueiMSkz5$e(I|xaYERo<j+7^V|{c9X;Snn_VHu_0@;`6bWAjB-#~4d%tJoNz94f zNPU37)XYn7&f9#SVO4-q(cg7}QI{7oZihqEun6|Bp~R^-MK5?6AUpDLPXS*&fIsIS z2@+S38e7AxG<+_Q%b0ZFFzQHHSSJ;)P!|k-uTC6edfJO{zg-zQ^6RrvnW3$mZ!b(@ zU%7_gXJzEaORI9w-Y>65+2FHZRRUC$wGnxkcw^+N%_mAHN3d@b2VNQZ@`?F9(gwcc zyqky5<)gl5UNCvJUHQTE++P&{A7w-*S&AOKi9AXH$d`{{DnffU@(#W(hrII*PzByk z>&VAMdo*?Br=V9%!jJtA`u+Ou_%YF*wAEk5!CG%EYSo8%zhYG%<m_9<p(O1a$(P_~ z;qP4xQz_`vf!?}-96!SSTjues$CW+`4`QF_WmReVZ!8Q`Zsws&4fF}<A<g~uu?fFt zDs{3LSD!b2Do=asMF9$A{ccDIQU&POwaABSXIxYJsUmbl1E=Pv=XvtURED1Ok$Y6; zyJrA(e5#=rFz(f8k16L;?^c|1BO-K?=XXDK>sKc9VK4H>xY=ih1gSdD?d<ETnqVE0 zaMc2zkdJq`7w5`i1~q3s-=%k{HtmO=N9b8u_&X+44WM6*iIB59_JQsel|qj`mh7#@ zv|qm%sRI2tkFE1lXFi`XKYYu)T^U7w2F}Ajhzog%zR-GSu$uDx-oDszTB5()rA{C8 z@BEwt8OJy4kpZmlf%wlfr~PE9P#rJK_muHc3+Pi1BGn3<)Pj4G6uOj;TJZhjiJxf$ z?X+8T3Axp$p+jw<EyE%;C}saS9Hx`)INxkFs9!SgjUQBb*295`<a6e^R`?ay<o9p= zg8iD`e|TEBjv-ejufuO75BhYWD0N7A?gf71U>5Q@Jg?0<?-Qz?(BTD~^63hn%*0Lr z{oaYc41ez>ejQHO&Jo}xf4+Avbrp(rL9ZTTR3DxzaMq~4VD|w|C4lQ1`6)N+A$dA+ zD$uX{Su_wF)GJhjz%$g97z}p9pQT$fzPBHBoB7_^yBy@iMh{p{9R~0;d1tzoV%@w7 z(>Un<-Kc*7Mt3GJ3YhyoGItv9bBy|N|1iG8xCfxUPZ0NW$gv(nv6Vqz_!zE9ty%B8 zsIvgwb2)s;`z)J4Jrn3^J-wBNzw;D-m08fGsE_a)zKnF3GzZ!}(p$;P(ck8ie|k9b znEWDhX)lbwLwoprAG*hU=$tKWsy>AMeF=5Pp^KQjbQ%87Y2@BA<$D^#AK**)^(6e* zFhBkm1vw8)VytMN+ZQ`Ed=hwqeFl1R7V4VAry1^2e-k?3H2P6R*5|)wt%N?kkaYvD zd&7RmIJ769&vn+xx8o*t<o!+f;jD*$E3fd;8lIb8${?1Ux+0WtU6hG<j19DJX&0hR z;5OoJw}8Q%C$@rR)}Zf=;Qs!YQ+`?Dk6635(|)_ERZXkH|F?)ofzE}Ut`vN<mm(#* zpik`eQCEKVh=5S-hOSsYLM;>F6ZFt+%tLVbD7DFlT%bPP9{Rh4*t8c+_0^;O;O`i3 z9RaU(4%f*s*ipFeISTz?K7Qz_IB%1G?l^S&ZBCs8%Lbxn=4Krp#=Z}ouqjN%;u){j zZk0xVd-h+1&c&j4oONq=an5NO!*qt{hM@HH<vHype+qP^U3NL9p!ZPc>0ocxaY^ns zY0o#pqRU{G3;vqP{#@pWP1m5m^Sue|Yv-{WZ3my<bLu+nem*X3NyE7O#J&Y@e49po z6WR-OWq!e8<Z<~Qn4SIT$|B}|l0(m+)8g+rvl;6Mzq;qpACi6b5^NDoTy$Oby|>gu zZ^8QCX3}fg)1U<VEkM4PjZy~qGJv@5YJ9$PF_YG|XWy`d>K)Iu55*r99Q%}b2!4Mz z_LYy&`OjJO8FZH??w}XHCoEWR+23M4-ugj%Pwra^u`Zj&+H@W{H*+2NbZMWvAY3ot z({}jr8sSGfewE(f>0dTwnv4A8e1R*LHu+NDp7sfCs1E~f`5rC{I2r$X|7iGVuTxg& z4GXA8UIMv#G*F{DGCsM;KR*CFy{|<!`rk|;9to_FM4mVJrdnF|P2|-1chvc!ebs?T z1%s!WM9IoIV%#Y5)6oA3zm;~#$L>d2$NW8WUq6NNTyOGEJHP{9&B|CE{%P!1IP~J> zfqH;GF?x$#?hfojoujnf%)XEFgp>Z9Wz6~lKP6Nqj|=m0vKsfd)3MW%cPE1WWCc*` z5q^mekqi3TZ=2eVXJ6%<6$u@<)uJr5k+&U9DvzBYk^B$k7}qr1OZ-A0oo(#UT;{>~ z+NSh8pJhLBF|6OZ<a@{f9e&@gtYFM9<`x{tJxVUHP}U&j25;Wx99J5Cs}`U<&|zr; zbsfFxCH8bm@M%aFtMby`5BdEb%zqob5ZU9~$DseJAy?}X&j`Qn*o1#4{SUj5|7jxj zx(z`p44spEvV+-E{14DepsS2?Xb{*eeXxpxyL_2Duufc*u7tq9|G3mS0{*S&$614Q zcgmz=%(IV`I;%W)I!l0Rf@=~ZR1WM^jeI)bH}1tkSg#)Pj8%Y6pVdLm57rfV7%M~j zUn4#azQ6S@Pywt5dp+WfSjWq!kpF{z`&@@cvH!HZPu?KtZs*<l+z@$m#i(=q##yle zYRS0&$nQ}t`YRVVa~FcWJ0V<qdB3m_e`PW;ZtGIkDEkxp#%uP~ej~{f!gJ^UwW%?< z*5%L>*4?7a)CX_Hd*XlBl=epGjVwvk>19(h=$OVnY6;FB8?IL1xH;78L|$~9iQoHB z^mP1hThs2F78~MZ>~Fix!nH`oBww|qy(fA>Jb1PVely_z-lBJbEpwUG3EV%DxKyxP zTl_6qA03`jzlZruc<3kpnVb*PnAMGb!zSu2gH0Py&k3A~A5;nWt=#hf^@jEx;jf#V z!y4jm)Cc<ae)1CVd-7+%4$be)oZhXvw6ASV{#(!o|Czj{kSoNICqTzz|K2x)&)uZ{ zAADamUm!l{?Eg!BRT4Q;X0DZ*8?4^~<o5)9N2Bk+-%aMgo6x1W-|xn}?I#X+By^{* z?BiDK_$%Bp!<X+`au1!Cbv}r?n$6*hWRFhF=f3l%j}m$Qb5x*)WMkc}Cf^ZqAU$@0 zNwmlNlfMZ4APy&|DbR8FQSWA~FO4JL2XqV0b2Gp@*xP1;t@j2iHT-mP4E9avi~j~` zE*QNUe;F_xd4v{%naNYQa{zpw<W>@N&LEdcz>gC;qgy~vdx~tU!uR#?*K+70<P}^2 zt}N~?5Buj*{4G~P4`O^)fsUgQS_dAg>(KK;*hPA<=2<u8ko)Ut53NGnTpIMi@sYAx z_`Od<^^Nb(x6D`Op76<Co6_|`&S9_G!1I%9hRMcw=2=RfH0VNkeY6QYeGI?taoE`t zLiGoEyQ7x3w$i?KZz#4J)_oH3o=rH%n91W#`_)+dcHoP<?_D}jjP+`b&<@(G=Zn%4 zo-b3zs-4iO`?EKL=Tl)H0bl*K=sM?><YwHnqv!0a>8*pb#~+UrAv@|^KA4;^Dd#2P zzraqXh%4p&2H}r;pM7Z1+z=h5-8dY*wh{VX5AwPpU-dt`j?sQU)TqSK_`3v?PYpWS zjolo~i$B$A@MCW71;E5cE-jvpJXvUv0sZLywh-OQfgkT0FNGqHZszmoJkKpLhieSD za*Rz^z^@^ki@?C<_~jt4b6zp47<~99r%QKezq1Xy1K8j<@jvjRWvNT|ptr$$_rbPl zqO=~qn=;Fw?Z|_7kL-F#`^tOV#}q(+C}_|l=y_YsdJMiWoAeZPJhAC#9_(YM?V1&b z9}IS!XS7G|x9b)1sDA4p4MF~GDB-28>_=rP2B?TP@{xV@1<&mtKzs$5u{e1#z@^p6 za{&g;2+=3-a~D57$;o)Hi_k{Kb#HaEKBu%#aBD?I&WEhqFVGXo^E9(MdULrb&4(W@ z;6FQ&{rz-#KYgYD=v(qwfRl*dnFr6OGLsLm3;P-O$lqyC&Tp52b^j81l#TT?AUkV` z>AQlTm67(~>fZ7OGa2lPiQzsc-X#lk&8AU$2_H{J@7RTW%INfwmG=5BqvA@!U-g6J zMt*xe=iY$!vcripup*D<g(`Ot@}v*;4cd(aNIJmU+-trW#kfvjEy7m?h<CQ<;`h8{ zU#CAQ7CSHUU_gxsO+lW0T+CUO_IoF(H^w-1`4J{J^jG|QQh@{hcq=uye-e4_;Rm-r z@$kG?>GzRJPy0>c0i(gC!%eD^fc&lERz_&^Y~B@ofS$f*BI}2|lWRw!elF&`kRfH? zcPI<}V|}O(3tu-$GAS$c9PD(R2J?5YgMDEf58P(&<M%$L-e3;;%U5@6BI|5VZhz&3 zzCd#1+~7lR^2&n+iIa>0H^-507hH3JcwojMa5s5CkTEy#M=e2n;XtdBkjL+0%qj(4 zwysV2OEXU_*3!`VPui5oKKi<!TV<d}O$k?x?(B<;8PEF2mjU5=Jqf#I5x15PM8C^r zRa^SMdyyA}=L>RA+G{HInM3$-v7WLqSylNR<H+w_j{XbFO^O9~rM4(<7<QL`yi^|g zNh0xri7ES&uPQ=MZ)R2%Fux1?H~ViqcDTnpzyG#X)o8c1_u`J3eZ3^V4?5#n{KZ&@ z2^lTwkDLr`M4ndKV>5;55c*MrxgOPl?t6>;spXmbNz@a9_Q}b956<y+s}Xqkl1Yuh zdBi_&u7+LtnZF)Ha6jqtRb}K-jV<`=EJ2Ro57m_Cj<vDqb#rtg>Ta}#K3&0EZNNV8 zQ7P7M#D9_MkKUIX|ENjh;j8C-u6T;yBIkLYi?)R5FzfrjG{j9n=fNH@nepG-JzSlj zD_4xvQ}|}YCgPNl^EnrB??(G{H~9>ZYwPSmitE5U-#4iT?Z2itRo99CK`j21tWV2y z=7aXQ(r)zz_spSgIGEy7Fuot-Q!`iz(7(I*XdUam^od~ghcClga?WDD8<BVEU--Xl zd&ZULy7h8vmk~YXf<c3z<B2CvKrgyVUd<uUrO#S541C4jH4?1eh5f4n{Ex9~G;~zF zQ`r~syI0{WX6M{eGE!q`?>djX1<TP38>8PqSDfXmiJ*h?X9gekzp7RxLKk<FM*<v; z9y??X`}8=z2f7aaIfGd*)7Ug0!EYV0!~9}D$leG&ir*JQU5P65;5TES5}_A1_tr|r zDF^XF)A{_C{>XXOiK#dD4u!C<xR8sq*CZ}w7Wm<XkFu0wf5E?T9<+s|ybHjp*zuCV zvo`7!vhQSV5TTmvmzhLfc`y%kX4)fb3U;7g56^Aff*t^l#qX(85_~knsmuoW;2QCe zw1<;FyJcU_FW5cTLO1AyoF2>H3nmXj0(>3nt#!12nd_qr>^BYL$#(>ujGtB;#`O+< zT2mUc|77D_L3?KIMK^)}P#j@1_|rljG~{QRH(~fTU=QPdX)AbjoR7vaUZ=2|ZG$d1 zBudfCSiciJn!^4t^A_h{+RYPfI>x#$)YDGRI_yZ;ud}glY+K1a3jIYmw>LqaA6><L z33Q3<*mH_t-{8J=L<8ohm#?g>hte+cm^8wUaL`Blc<%QpUmXCC7~FcmJT8dBPn~&e z7UR@0+Lw@@uMO{CoP2%f*;h~eW6%lO8*+b}1$o)1wp%BmPbXW|&y2p4hcjVq<Q?{{ zQ?$RE?kf{|Wsj@g`WJdGegbhVkmKYbuf^}{odbIf@A0;%zeZ0$zTt;<p67xdm~;W0 zNS!jT9N4Fx`>Rl0?(c|uh~w|1?BQ4F|5Mnel4a3DI=OWXIzN5~X;`nLkS8~weL7ln z3p~g<`U3i1!ixxv3gLYZ6W>Dn-iqXDfnS<+cj+#4R^<0D<b6xlbzRo^Q|>cMv0t_r z=C4Qehh?|vF_>_i^9i`e!}u}2w}(>Co8P}`o=Z<to*PAc9ls;c#Jv%;EhJ12nCGQ9 zcRYiR#h?BZ>u@#oIJP4<-w&k@7<_ruZBkG8-M2UQh`q6!tnuhM&##(7o<8`j1Ml$? zdIkRE)j1Cg;~u#^a<KlwNWG=~a3^@2?~7|}RuKGOhkK%Tw6{F()Ccf#Z*P4BU-ZYW zR)hVyUWmRzd;W84ENl8wgiGI2o-5{~@1TQtn;+l}d8o;X+$lr8cj!e%Uxg#5_dK@h zM_1PA7k~W^K53Vqdl>lVS8d`iX7V1f<h4&kR+w$NhdljqIZy`r<58;G4r3k18D)h2 z-wB6irQ-K=g<qhfS5SYm7;{{i`YO;h4_Xz%dhDJLdk1tZepHAey>L*U8+!8{>^0!8 zHRLU49gfY&xo<q@&?ip$)1K-k_ASPv!)8C(pzVCuMSjl{@|^`jNB0R)2sommiI_Fc zH!ZpEWxQ7`F_ZHQzgP4ae+P6btDN-Lx*x3jnVCQATM^Ki1N`LzE1Ias2L3HZ9#!y6 zB>s%xBoFaBQ`wKmSG-~f{jcCt+D8%Zkg72H6!wyI(4kj+Ia^_e>_Yu$=5bKraAkq+ z937zCV9~o)-9?YscP&i$p|{obRSY;O+NPJ&&|Uu670mjox1W0t+BZx_{ukw38sktX ze7>(U^{$xrxDipB?#K7`qiz<@oqgd_QLx-7?9X5p?mdfx`={W)2hJGmQc19vzdyBQ zu?P4Dt2B6bV}#12(D?n81Mj7?kz<bE+0~^u=y#lNO7VA}p9@vmPUs8VJ653GjsI6A zaM(udNA#Z{p8Kx}`8nOCkPhrqtMLn4!gyyUF9Y&D3-<#<k=N~NnpK(4ZTJ+V2ejwO zZzG2SdgL^RCh|Vs@LSeeyjN_HaFNoSHEva-|6MQc50QI!4Co*Hy<MwqTFCw%eKJ^w zma*<D`0612y@)TZ%kz#C{`!f$I5*O!hR~C$5I+rHJz0pKeQxAI({TAC|NLACqk_n@ zye3s>%l=h7T#b2tHbJyc=r72cXa=3F6!osaT+OX2$v!iiIH-2ej~}|!APxMq(NF*9 z=q$t9T$(WakU&Bp#0U_A)Tj$}_fmIvcUS5Hb$54ncR6);@2R`H>uLMld_TCJYi3`P zyel)av$HcDpq-Ch8V3DjpjjQEE9WNe2|YY6+Nw^_ZTDF5F*837do?JM^Jwm^G)6Aw zDn<TCH+E4k@+;GR=4ycU@Lq}knbjTIV>W3l@+Yo?Q?Jv~-)pTJ)`4|f$)rfu!tCy$ z>dA9=`voaE^Qe9Sm)xxDz?pv3xWTR<KSFPCUPkJYg|q&ugsT<bJFv39`oRCwhdNN$ zF$=R`1JfUEj#K{z{>qvrP2_vG5j;Bp`rXa|_MnVY3gW}+v3`An^$fc#q+PUPJFxya zCmc%q>EQ<59!r1sF={q)DWH)@!R&)>9KgOwY9}w=aB%xhY!cAknYur@kpr#>je>44 z)JHDXdzHa%S^1v6)zITz(Kj(+Dvn$@^Ot<Q3|$m$qj`Q&4U5KrV_%!~xCZ;so!tL` z9znjfao_;rY$t&el9}{^eo18iHwF5|$^f-vy+ur*t}yfJ0&$)9a$@6E@YA%U_Pvoh z&;z?3`+Wv<j*ott3HH71s}jrEZ?Fz#LtmajzEW_~n;<Qx4_l5jP;-=ZH;(#)V4Z4K zEd$f}8?^#-kk7Nh48|#|TdSb^lQ&?4gZc3-NUNcbA0baAIC5-|4A{@@t3|4r4S6`# zS8L(_Brf~kNyy1mMoq)6$aI`_!n_Wz>C!sdM_mn9hdP}99HG7-^wtC1hXB7;r7i*M zCQAwK+d+S5&bdhd<5N3A+o1c+qmNlPNt0wd^u_7Ex{KX$mwoI`=*#%W2ViH^%HdM$ zPOM*NBxkqi5$dK5$F9oDx#zy5|C{Hd{b2YoqYi=x@v9`Sjeqhe`9PCCrzU<4u-vh5 z9RVxfCXNF<U4*<`^h-i3FR{yvXB)H5z+e5Iy3p`5XCq%3^Qcu7;-OsV3j=vtX}>(0 z`>WMhCy&U#3~pqfy}{1>dTYeTguQStOy_uR!6B#4gIV%(pA7v}0RQO)=#RIFdkRCY zpAFGP==AeFy2AejG&kxJbd#;bsUsgsA0!?F`X=`SB3XxV%mJ3SYI_2875=;vc9rG( zE3|g#8uV?>H~$4)YstF>{>C3<WS-?Ugp+HXZYG}S4%jJ+Nq502dyTpeUR`EY<0j}$ zvsc5BqwRlsWt)lq?B~=2+7DMDzYFNY{=E<D{hxpU&1z47k0ZZ3{6lp@RcAQ%V`}s& z{eFwQHz`@C(?5|fiuT(}utRyDJ|V=X@(wdc1?V~a8j&syDu+B;>D3G9a;pOM5;VOb zKLvOzihV4Y;O8V~Hv6efCVhbZT8#Q`*h{nPdX>5?<CzdfPCE29{<zJ>u|NM3_W?a9 z$f0A*uM4d$%9x!0!yoq>{?V$wI>GO#IV4!wn4f3*MQB80_BGg@w^{d97DnhIpBqzv zIzxPK=$at)z|Ol^jr_~}e|r33f5Dja_<QiBjPL0$pNj0S$rKWwpZ(KU<_i6@?+f+g z`JTvPoWBOMFWeHPe#qgM^_=qM`9ZbaGK0;zzu;3DJv4>77Ob<2jj01$ivP>UJ$l-= zUh`F7=KGH<+=GQ~R6aru@XlxIQG-i~2U(OAIs2RY|NPEO8L_9}|9VJ1561Plp8=mG z^zu-BZOD4!UO*W1<bt8{fV(4%+y&w{lh3I->+cKoWIN_U4+r`xg7(403synj#oeX8 z4fLc=)NKH3W%g+CSo)zf<KGfJyUZz$mUSpBQYmQPh`)ab^b-7RnYuIY$;;m<2lAiz zom8|p<Xo}TBJ8;=)cJ~He@%Q?2KXK)`!Du?&0hv;L}`BicFtSi7b2ejTPl2dbu83W z<8#Im9}jkI#l1Z+cSVyL*5G^o`0F@&=k);cbag;)myRMw4fYfJniKG65iePQez>@t z`~9rDB{f48OMBJk#EZqT-eN4u2JP8zQ-xtk@f^e}@cYXxb7(i8*Wexg9NHV^3{=a$ z{O+fmJGEmTlh<KQB6jM5aDEH&<*Zpp{E=rxTzbRzoG1Tu9{3@D$sZ5Ct837ng{<?K zaNV7b{J$QkeDG`EAde|HZxnfrSihx+V=2b(9o?Dw(eS4dOy!4O>A9QyXwYx}iPU-K z&yq*f*`wbMHsib%{+4bL>cDzD_u5BO#v{jxBj>6(IZkYfqdopA_imUUr`8)(652Hf z|3^{Y_Z)o>J$sNr*D^D{S-GbNU2h|H8rWe!@m;K!s3y@W3*CQ4ur?xxj+n{MG>>`I zDMUpF;}5uoo~Qi?di@l-^K(ugJq;z^g*f?2@Yg%2$Jhyb0o$V*bVKZ$rd80J=$BE< z$GLVtYFF_)ig?s=1a^*xy2BmOXUz2)@Vl`u?OT=K6;C_>v<Z1q7hI0<ccBD!+b65) zF)uf*BQFtj4dQ0%(|*I@QvdSo^P-$;41F-xC=+rcoPB0I&kZ2oXFvM=^FW)Tkb@I9 z2k3n<^eTDdn(=&(jO0h`MIW8#J|Vwl+O}ZjqMsX9!fvB|ae0ICWx$Tv%l&2O70djT zh#bi9lsyG>o1Wx{U>)qQ%6(Mm^l1&cg}u1{26i0uee`=Lu-#(fYr!YG@auOZ&JTZC z>{8}8_cD6GKd{oMb$rg?18((!ZZn9n06Tx<45u~gae$8!p~sN7Duj7k>XB1vk++%O zJ2V*no{Pj6PGJ7#HEBrF|KE;M#^Kl-jeRr}x*q=a@LKHWE_m4UvhEN2X&C&AO(Qh| z%#tTSPxCR(*j4deu%}W5$(Q+K9B5L%Ost0%{u;@17WO@(z^Z?vG!}gO1sfGykQsej z27d$R{1c#C-V9ehKCgX!hbBVDZz5mP667oEesy~6h3r;Mf<KD;>PHsvyE_DH3UqJu z`-fK056#rTK%NvQ{w^JIlRQet=+~Hx<j-SXZ5%@#W#;LMRNSNCxy;;0@F|J^0lOr3 z5c9fhr0%i)_b%Zc3hmu<Su_W9|DpaN_DxPJ`A)OYPMpnYE9;j$G4p6I`-6O9V8%P# zKjM2QtRf#V>*K(4yOzU$&OPlF;Lt+8x`4b(`yfiIp=T!8)I25n=^6RZkssM>;E#g8 z<eN>c>4%BLyR3t*@FGg7Xy1;XB{y=U&3)Dm{Ltl5I*5E)(3(8M(5pKUU%|Ytwv@c? z&`$DGcnb2qg~GHIdR8X<XdTg~`CQyx;eDr2XG++}!-KRN`T>5)+H;u~#2e4d#<|;k z^eS?u7l){OXb-&X(O&S{0M4JmGcm*&cv-(Qi4%d&+}l^9n1gAtD~~|;C`R37#_iHr z{6k64^IZ?7GM*mtP+`wxs1QW%LhLCamuZjiaGnTO!9Hv{4n5j6T(g_7ze`PiUgU}M zV}wrA{uKNDELayme9O#?Uv8%uBF#*URw{mPn(tnvrT@3(H*#l{vxfV`7twF7k>si8 z|6*2<7X%C_V%O*h=6eu(TIRtel9Z;2M1FL`zM{QrV7MZf*BL*XbPaj|`^JC4x);g& zS{S=1+MpZI_c&idH0TMNsulG2!gBbL;16ZreVh5)p7WsU%)4jUskh))T1DMvu*WHr z2>GJ+oR989zaB_FcQDTgE4if^cl`8Ez)U8yo`I?RasG!rVlqeT1@xzMoVTFwO>=^j z$ox+>p1hOT9fO+U@234ybGz;`Uwz9tiIF3&WxP>u;b*83p+d754}bFWLT4;$)HCGs z?ey5wcIGv4$rq5D4e`r=pnU-Q)FH|6FV$gPFrFLGS0CZ$2(ZhqId&oQ;0tt7?vqz% zp8ic8uAk6nx^qtk{4tmPP+jzMS2HoCjOT_BVm0wQ9`fop*x<26=d&{|0~kl>EN|`l z3r;1@b{wDI^o>~t<Z(hyyC_Ad_Xd2N&~uDt1%h86QTJ*zc5^o3l+hdic6KTVe#c1x zvV&)bTIB$v_Ju11OnZ#{Bqr>fdjSfCzVLuOGPt9jLu2SCliOd(pey&pP63B>;=XWx z?5;j;#XxU3;E!(=eSC}im(cINdXx_Q#eLLF;7aaMGBjHMg*vFnjpo+^R092;n)BmY z{9hsN4`k-K_|!ql0^W?^+-L^=o^OHFro+EI8Q&}Nx=MSaVrh?^gI_!vd-9G^S)r$4 zpJxMqehuc13UYvR*;3ezV=oz%1A6<mK>c7|wZyO91U)c*D|MCOZ?bqae<b}&osvAz ze>i75g1lNj!k}`D&xrh1c~Y>RiC>CgygQX9e<{yBE90Yr;P_?4yY*#$p5opl_Q=qW zk#aLWou4~Yi1sJ3Au^>#J`q>^m-Z**Imtf;8o61R_Mxw-577qw*eYB_pevK#%ZR*b z(<NL>#<M@n7O0}|JEQm7v_<dFpw0wzLx1ub@VnmR^Qt6tt1`aoiat8UIJpCff2nEw ze@&o?FD>djj`b34QfZzm*^_+fVEY6swY=ExlCQcC^ZsK?;!OL|kCtd1%!yp9%lRPf z$JRxuGMKHUOP`QagZBrj26XaR>Nc>hs&bxQ6MACpK(*yP&b;?kE$FQ1f!g3A&LJ>) z^%OnZf_YTH#JvLegUV2k2E2j&+ZgQHmpnD-@riE@`oeo2iVIc~_*)uM2cjeEgL^|2 z;u&B3Le1evt%$<6g*}6QYytf|wVzsoFOd@;7>~y$?w|2}XTJET75qV+yef>`+Ka!h z4Rp(VQHq&J|F3haE%b3;f2~69PCzcTM;}=^FXu=?RnTeOd(iLMx#z=knFHA$F@HAo zATJrT(aOEh`q&nq$?J}M=!3tqGyIvCJi1<l@!08A59l4-+dRO0ocx_Ss61CN7F!km z{FG+(0{67!o?~w0GI2}2q2Cdoo1Fg4zuTp&O_}?*87KH7&pPpqGw&+-%Y%Hqx6(&_ z;lG(_kOO&I>1C+;L;DebGYrgxUurlQzXN{;`u=xio5nz|9u~o8us(t!g{sx5FXZQh z4nBdN?#bGJ7^&&deaG1~8ysn2EwD}}^r7w&wBPDb%>|9b2Yige{yB@@hhFiU{DPJF z{910+W4-ooLf$y|$D=K(haCLG=4T;v6z7Spc(2^IxF3#u8vdTR2Ht1EBb)y6-dBbM zXbI1)-c3Cm&@j%$-C+7XJL66N2e6-72EWTh?wx`M|8)|Rj6R%W(F*7{FKygaLGF+j zWHalr;e$YtDp2={H@b<eT)Eq(bv&1RRk${RkBP(G48GzLz!tDqE9zo_hV#Uwv7RQ2 z^Nj-7?N7<i2|xdGn|6VI%*UUZ`Q9c5YPq9tHrllh%<-H3iZ8#PJQw?+KlG$-Z5Vd? zEAq-9|N1_(=@9(iGXixOy!OzkImyxY*ri9H!-(fSNq_Wf6RwlcFIz<FG}y>YzK~() zi75_s#$HIX(5^G^O~k3SL7wj6Uhf9<U+w4I$F7NfFUMZCJo_E|RejL^lbdm$hUe|b zo07%xpUS37&;<?{xNC!b!@9fzJ(GM<bNRikW|C(#2m9#+e_e$iLH*Pl3)pAajrte* zJ#j1}=dh0;$o~d(y9~sa^1BvKa%p23#`{&EZo_|f20tF_IwjAg$BqgK3Q#iEb(5!@ zOJ(ABow4aD{agA|pziSeP2wl+CShgji|0XKH8SY|wD-EN_VKwz{|VO<XoH>nRc6iw zhnN)4{Lk9VSI^+r%g;UF1pIy2j~iIS3no+F1^(rq#A~EP&bd7Lfjr*V)S~0ay9DCA zU()`^X;6G2KIgkp9{Qsc@u|)b?2c*F5vD!+E3e*xnV0kKV4i|De88ON?y=|`&y5%n zq)*VF*Bh0(D)XhOLD!KpUrYPyJN$r6?AwMi?)!aJxf^!v4f4S_uotlBe$bxmd7vin zzC*U!wWkyQ$&S=fh5w=y{y^kVL}n&2>+3@U?xnMSo{ceS8U4E3MqP_VtkZPdpGu8f z9ULM9&uz@>BVJc0Gm=jRy7qMP-ZMYqVwk(oou3<(aRPE0yJ}xQ?5!34GQqFo;vNua zVgH+&@7YJ5(}BFt(4SUW;9pOq-pG9HHTHRd&~rHdwSw<m(Q3f={f80?hF(84NN>xc zXUOZ3jCp@Lb+8VnLT+%_P>1)spA)|^=o#czD9<;FWxtMI`R@StXQ2&#K?(=M|8c0| z668X2@)q#<Ev5x)HS79td-8s;&cCpaz1fQ2hkte(^1~myKZ5_eM1H+rjQ_ZiCeFa| zx4$9(MGgE8rSZo>*O^GZFmM`vy7b`q(yZlC^auOP)I-pF<hRZMKYq5KnnUmY=u|c4 ztv4F~3;c^W+)B%M*5F*Y&p_V4qE+|0qqpXAZ<+Sd{7)=clk=D-{_N|JN7<q0ak0s7 zHg-uK?uFA~=QH>zZAs#!4dgSWJtg<wbAn^rTa^b~T*pWGz*2pqR2MzvFq2mVx;6Kp z+|2tyr2<t5+RgpeTj|krnO!OdeXlomRu}Y7w@96t!T)dbRY~}HYx?L~fBcE;3+f{$ zKEH}kS@<0eT2v8xpwH$gRYZQzU%~wt_>0$*-xS=7pQsX8Bbt89&bl>ORT(<THm}Wl zS0+xTDzvp3_r959PY00qAwO~n`+Q~#=AE5<L5y$b%E82pvVNX>RgLGX^|9*Ac<g{T zMwzqFA9<as0e{18>gc6o{Qdp(n1RoP(N`1xfR5xNwzGH2XHhNa<LJ*iU@P>96M40! z4EY(o%p>fky6{`BA&!~%oW}jldeA=e-NXW72fgBcBIB9m19?;751^h|BXCJ1e$y0u zZwKzrK+m`xph3*5%J_vE26KMFJZlR7<WK6XVc%>t`)XJT<Phi6&EbEjX;({dZ6@wZ zgT<c_*8=+Q3?-JBIE2gGGX!5eBX1M(Z?%K_s?dk2%feM*6|Lx@kJyJi2~}KY?Bljp zHR1Qi^bAx=-tTV$^^s{`wgVZ7{OVZ6U+<8svFM9p%=gy#Vb&nurw~8bo#%EMxJQHC zkbvFX6M95bKlye=&){F(S`YnLB3$_yA5%H*8^GWBFL5(GH?SV{^1!rBjd~J~--P@` zgQ2~nxK9o~o`nAce1_d|i+0N)i)N#zPv5|A4*%CJlSYBNUIc11SokJ$z8CXpxv$1R zAHlw9%>2#bAEdF+`H5qhjUI^bAwL*&9`YSc1m7YjCV^FnYn}?)Zj!eP9JwG|v%rF# zqV+YFetzdx0-v9z9r>MRGM*)UHIMf3-1A(;`0a{zX(9Cfr4hQvTK_N_KQZ)$+~hX} zTN)!&CKP}EUE=qdZ$bHdwG94xeouM&rPV3&Ch~t-nqz;$k0X!hTJQ;aaU*!<IQkE4 z#yzGT;2{U~tHF!+!WD}w=o4bpKIq(!B9#w$(6@p?`=NJ5VRtX&_Y4iy0qDD%O*#zj zZcRS_tjJIDMIM1R4+zo_<eUq?_fhEKf5|%qR?N+LQbzn1^U$H_uQiDwIt|~+{vmHO z?B{IZItzVh5Hd9B`B3aiF#9E6eeO*E-M}Bh_w1U<eKvmA!e!*4racpJ{KNQN6XU2K z1HH7NML*FK{uzh^Wt{RmxaSIg5qWy<fcdzWgh<mr%+&|bKZtLRVLoi#YE*PF^u$4f z9>ZUJ+OGMjSYH9rdIBAJnY^)}?U7jxn_zdBCjTAd@brgGFX8VYX<WiIetW%0HS)o( zoX9<sB>oADzV<|~ySc9u&c3o#q~5|`9_OpKndxWZ5>^!EeGUf+5vfjh0`&>KdvI=` z470Hxi*pXo_r={Y=^g*~X_}utfCZ8}mCMQc>KLex(8o{v=`*-8+NNUYhxH45_1KT! zvCE(z@VllArq&yBjk;U^L6@CxRt$Q5Q5()zpfmR%pFDUpK1`1pkG^xMUxvIq@yn#Y z@bk8{Xgl&_)M4fe@~EzVxT@Otza>E;g^V7a44_l6<K!zNxRJOo3s|Z-{sVCNA9Mm( zBvqi&j%MB#qJBAa8RD>7rodm&nEGVU533M=fqmf4W0jkEv?Cq)2^q(w+kKU;9rnE; zKq+|cZY;ii^hK08R4JinMhEFRdZ*b=Kc#`b{mZ8E$p1+xsT=FybNl-#9sFFx0c8d+ z{Rq<bqVz*v>VHCK<5GVt*nEXe8?(}nf5}tBc>SnLU1Y{@7547l2=ryTXl3QOHN?@! zGhPe&v)>ItzD*C;sv_7S?_J84)IN**s^I?Q2IWtpyK=vUb=f_D`ybFd$@ftVd@+T4 zqTt)A+%xaX@2niHGSHFU0F?#XjVBLjCHkMdA{C+EH#4X*n4*4|)-m4>+XGY$y2?nS z9w2uIcOtF{I(~4ZYJ+*7Ave%htB@x@`JKTZiGxI+KZ*%aW7;!caH<*D;tqdcj#|{y zL08`Hiya94#mA!LRgtsb+`2gqeKd?ZxbV-D9J?FOJukt%Na*q0KWGmgVjs`}Oif&O zhBEXg^|v}gkKs~F9}K-ODQxNtJ&U-TE?^#)kLoo>pH;N0D|Fd?26Y2BEs9bPFn2SL z;=zP$R(-08-d=4{Pw2oDE@C&ZgIR;Upl{7#{|Ron5~x{YSWo2H!emzb>qxc1PWU*N zy$bD*LcD4;2mAg%?uA0nCI9Cj@M>C<TINPy;s-0!i0|zerUdv4$Zs=+@gH4)ye-f( zGy3UvJ?7Q8aB9laU&X2a1%Ll?f1T(3E)f?u0{Y2j@;rjwIiH&XJ}XcDGS*f7SAHsq zobU9OIQ;s|vt&lipgj!dPZoaHt0@*uW?uP@2+&OUGa9?qli%MC|HfSClXJ~FgnYQz zi~THg{dj|}u_xOJWR)#({|6XEaA;-gVKH{NI>h8?>Z|5i=b)2G)_$_hV{#eawK zOu5XY$@JH<Cq7!rbJdzTGy}af@OXqeGyk_|aVwxb<9EQNC(+nf%UKWTukPdpT*mXG zNBB`ontmaU$AaBz>w}-ijQsr`q^h0K^Ca6jJC*O*5ulpL({$MTtCIeY`0(BFtgk-d zS`FRcE9W9$$ashLGY%1UvvMGpXP(2K6@$*`;nI5A$L6&tq#&P%U9=Ip%1!1t?_;TC z)F$Zo4V=HyUklm)Zh?*<es3H2C%r|n*d1X})bE8Zec7QMpery$hteVU&zQ6@4eRFy z@s{xW5f3?OEcWSe?oBbzx1=Di80(-Qmy2#@L=QIeick^FnrYN-o^KK!q80Ri&aD>h zfj)KDqJ7}C)zo_(fIfQ>sg%f%rNmq8hhGmT{2$i)oi-ubf*#KqM?ONvaV>uK!?b5i zOMZa~^iR=Hb)&yy{_$!PpC5MGq@%R&yvRMPe)tiiI4^-tG1IQ&U^Vs=S(u+^@Kc<E zuKtU2aqz9vR~2g|`4`w1H$>kajL^4S%(qnm!gP@Dyg+S3zSrcke>T1+06+OP{%^oH z_LChM?@wlJ#%`bWZ=^OcZhmF?9NNdQ|Go~U4foMS=Ch4H?8y5JO~!dZa@J-R@<1?u zF5%zEKz}BV;2e$T?M}B|pr`(uPh3_P#{HyS<IsZ<<%n~jJv-<5>5yADIp5#pz%Jun z@MP9ag?%oK8l1GxCeFf#_bp=4Bc7jxz3~`qG{Z+vz_sbEsz^UHtwJ6l=z8Vwr|^Eu zQaSYox>TD;k>Wz5FZ$>mbmP9%J7fN)m>i)G&}A9~=`$Ep-K^}>@f%Gc4<h<!8}}vV zb;2IQkN%bR=#wTHm*Xp&!o5c5WW*0Iug?6q%>54NG-spq8$7+ytiRw}PZUNX^N&0{ zKHw4b{D|?`YXq|ypc9Lb*8=QEeh6Q1B>vm$tj}_LJ@SJtdpB4=um}1bVczooi6yP_ zhyRNC9thrhfPKXHl_mb(3jLJ2pDxfBe{3jtoBXULhVs7H55tj1d*o0U{B;G%tCpS5 ziSdyK+Kb=L3zmICT#NAc*0m@SdNb!4QQ-c!<fop;dtR|C8Fa4}=+?^opFjB^pc^5? zaxP{ZGt-CAhG%xA0SEjc4_R~Un{GDsjzv#!&YqM@d(l~crKP<=M(W9fF-?gJPoi5p zu(6S+=?r?w`WSnGcuQ==EW^03L3{nv#3kor-^2Z<9MHpF8Sv?{o+c4D3EfuQALe&X zYw0C+m;UU*Jr4K*og8vjz@7{aQ(owncH}d7G$dL@z$T}OI|j>h-;xv)3SNT!$~sIQ zi+*Mu_X@CS6>?|Qtx%ntk6kmK`o-wqI*C#GN<a4c;#M60U$8EDEWvGskq7)=qvq6O zhkky?p$cF<{2|lOH^qpntq6T_D|w}uKcB7aLz(Zjc3V{melaumMx4A?sK2T}?_=^- z1s^`=ymJzAnfnkwnZK(O+5f|T7wuJb@bLzV-ZJk)r&AXPJzM8nFlXx6i{E^-2f4fw zKV}_%Z`=-(YQitoEnKz^oX^&YP#e~LE9{zD@Y64}sy4W*Bz7VgHVJvgxV6gdQa$Jq z#6Me+SFhMdI9lO%S;TvzKQ6uYs6Oo(2o`zIJm2zx{cJhr)l%|T!Jm_kJSp^B2J+&b z=X<ThK|SGf4qo!tltk>!_S6mJ_hn4Zc^7geSu}p#IPCLAPBrEKcN}x+7W26AbMiz% z`|P)B(>U}baXKxa-IKY$(I2_ww5wYg^wLD~XmqBZqJ7kf@iaMz)8x7I$b(7z?rp<@ ziBVymMn|YE{Ff!UAIyBMN?d2=F8IAlS=A1HgY)FmK^~-8YtWPYeD4mozVLZ>4{?T^ z5;=-c?Z9)E>>hOmA0-f%L;t%^nw6RF-`<1xB=`$ghwCBo_|io7z0j4o|J)m#KgXco z%;O#7jp_sKOWvAe=*3sD#B1|>kqgL`9>~4M!Kyl&eeBvG_2apfoTm=}TXR2!P<-9J z6s!d39PORrsFhsV#1}v}>xKU#E%tM=Ky~H4qS<_WUV?sT7^$JOZ@ceM{BZ0R`gaxf zc;Uqcwc!7QNn&=QFy|b3qcn`?{$0qrWgR3O^~lY7O369NaQMgad*x&vzltTE0D43S z=P$^mT{yc&LBHYq$ADM6a?Zl%)?q(64!Q((Sp>G)mQz+WU_RVWAPy6Lnt!7-6&#Qy zK!n=p=Np@*Lz~I#J2R<$9{X%?m4|!a;IZ?}E%3_95FIFmo}a`%8#*>+fR3Bc4-af= z*cQ8JkxldA-)=|TAXw#|Ma#jV)rjK;Yc;1om|wPQ+&6{x_483p=EJv?<n<Yh9Nfdc zJ?a0B`D;J=uQPMuF@D6ioIhj^#9nSk9w*v8_*-IUpeINkVVQ{Ci{5Bg58I`+pVlB> zO^M{0My{{NFS?26r@F{HhkU<>e|ih_G8gqNCbRE5N?m8@ibaS&0DnECE-Le`{U-8G z8rTo?i_lK^xA5mB&qzEU@zg2W<DZH5Xj>{iFMXgcRmT6ilKc`p*PWpE{ouGJW}Pp| zJlx5>F6hu5<R1bTbHBwW68XTs_ZakS@_yu=#r$7NToLo|LO+L2!jG_{4_FUJ$m`P` z`=H_%oBm^+mZt8?QNDj2<8_ATY7tj<rYQO}FY!Lm3&&GWh2Ov5VAWOVV>gk{!94%W zPya$U!`}RaydS}O7#T==H;-<>Ph`KAA9=oobB~+Q$<sOX68R91U33S!8~r$93gdd7 z^K|ILEyHvVbno!j^sLBx{OAdcYwscCe}`ZGmal>qF^>p#awGRj*0bp${B~KX+Xb#D z8Nwc(&u6_ofwpgq(o&vl-_fh*(4VnS8)9Dt77fsA=qC+Lnn8b0H3sPo^aJ!-2G)P| z1kSIpJ1!I<KP7z6aqOd{=gV644P5Tz9vbsL&3f)<K&M=3*MDI8<PKTs$Niks{f543 z3Q#Qe*t`YQhfISVbd2)}*5L%st9_~=Kbm@F0EgEKQepI8y$?PzLN_cItd=#IH(dhc z2Yr%r@N-qrBix($#Cly{20MiLyD67Rk6Ev$(wP;;JgxRSRLzky$-_eA&;QjVe*He5 zQ}T6?0-y_iCjVb{^l=;F9iclm3zoGH{@2>vCqxbv=<k#j{)PyD{pItPCJU7f`rIOy zLPF@D;3zqv6Q+<yB#D0-e>?d5fl>9?=iTi{eHHYlqXy?@@Jl=}D*{~BB~oRO_y5+4 zRto5CSGhk58vEOo9{hnl)F(Ug?O)DYVzD#AOe)FymLraG2=DnK19`gbjHjJ_5zoi< zwCi*OkbJt!*%z#*uHBqYtXtypve91P5PsA#*p<sUhtI`+{JD>^!~eA?RJp+)5!Bt~ zeGhI8QC{dk?p@|$p7}h%pEw%73Hy^?U3k7Z^`U8x{mJ5wVSXP8!?(zKH2En%{QM-D zDggH4oTkS}_Q%1Tx3*+I)Xa~XS@bLNt03)#mRMB;JW|W05@52<9;M~?S7aYs61w_a z{7T@dt*k|G)PA>apnr!Hj;5w3b~{P<f~K)gX&#_5v>T?Qmzgiau8}{}nRHGPt;&2} z+P0ypKzsV)CV7!_on})n8o6CRoxk#9mn~%fS&{ZE3Ft5|tv_qDC-Rm3XVr<!yMvt5 z!(aQ;tSX>wj7`T`FQrQwRRem9nR@3Q{DIX&RTH|@B;r%Sn?vow)KJ5t0jdxEr<6na z3!zu8_~{gKEO7*Rrr@93;82S0tj_@AjQx-^)5(vNjrd^VdYaHabd6KtwfVi|&uI#M zjdRg%yvOth<Yhyi3B4N9nSIq}vzpP~y@#K2v#t_aQV#<9<FNp>1;^eCQuVaVyGu5; zgU*F~9S0t$MLucp*Kg`^f{i#Q&0L;&-H-ed(3z-T)PdhUow(a7jNjZ7R&{~@6rGTf z`E~BOTffk&pU8*R1HL75khTtIT(7X!`tf~DEZPyo{9_*Uq&-X8VD$paKM0U*D*m(| z5z5Mbs$>(ldc&`Dlk-$CnVb9v%)2;?MNiOo?RJK6R|4JWbtxy~R_=gD{h-(Eb!*>3 z>`d}^_J=-FJXq<GSKkhjR|-0M1O9Tb2XU<<!RjxKBE`8TALQN|bix1l{k-3le|<F` z+KF>)0{Eb!nOq92GuG8K@OuiYW`H}f#b$vi^LjNKEMO!r4VY`NNAtkT1EQ6TdHF;J z?QDhKPm=2c=r{c33u%ALc|s}HQG3pj7DIpHd~+GNbfZgMk>l@1g@}+p6@6@ziT7-B z)U3%Z_`F2&QD#DqAy-%M{MYJkHD$e)ULT~D(9sjUS_=+uZxNv|Dl^2Z4bVUC+hm@= zxd!JFTcG#W@mFvg`onG0LFVn0k$$Sd`dwJct@XK}Yw`@wZ6fc*KCu2k>UyNaPcw>h zX6U6&$&bOjPLTqAja)AgMBNAYTgFkhh;a%giP;h8M(iVwfr~2m%b)jcMSgtO5bWJ< z_-5g++UM0duwf3fE`Xy3xOI*B^`pEWvG2^SpfLT1o;Y4Kn3_PGKg?&HEM-61*uWl) z=kB?68UCQX{)(QQbbesgHR$iY!R+C%%U=<vik$4k`F!)4^auI>H;3?kSIH~Ma|iyg zkM6<ea_>DWdTGS?VBLn_;X3EW5y%hnQs0G6KQ>rP>37F0mmWa>P7|SF==B<gK!q{C zH*=o!2>yeezIp;~Yvrq_;L*L*<6w=1dcyP!dO;eeo`ZFJ5+}@f=1YiF)pXdyKEZkc z|Ks%_eMGLb<^KL>KKI5Y;&ZVVOW=n+!#cZ>p1L|b_qDH0uR!-Kw_bzSKl^D4`g&J_ zO+Wbmt1ZZ%kDh+c{oyyX7oF}eEB(Kcyv`>V)1TZsx`5uvSlOd@wAY(%P)5dO0q3G= zku!CE2I~|2#xa}|vo6x^_3AV9qWAn51M4n?yu;|*U+nL`!Jm7<N8dqfRqpX3$IAA$ z>nHR8?)zS4trTIB{eoW2xtTBh*!U}XmZ1+F_3AIUdm+Ms&l__oRCkusKd-6Z1wE3u z;MODXZx40K2z{wSq{gtG3P*BJlJ~uG&LLm;pTFAWWj*)GgCCml&f7jrwezv>;a=9^ zg2<8Hq4G_d-y6w8#q&QR$QQu8%81?83ON_|#i~H~CrLK@ZxhD7h*9s+55vjpV1?g^ z`iiqgqIaC!PlTS!d7cgY7RP=O+?or&0~nhtT;X8%ErE&x&mIa><D&FiL+&p?S7{Zc z6kvfr5&F&=JI1}Al+f?--=qRxa6WLmCH|=vL2A$Mi>__Mhr@gR4NzL}J8|wAz(u>U z!5E7B=$XvW$Fc`2EBMeALM$2QCKlu)ba(tCE`Q|jQ_fqU>+G|tA^k9e^Htwctm9$i z`GUXwK6zUhhhOAb$`Abj|62Dp=#|{TDrRIpHz3{)ev<;+w**s@fBzw$+i-<L`LI9w zV;4Q^hCE4YS5ex#eDqZ@aQ!$Rl>zTw<NiV}`~y#nD&7%!yUeO!zHebyhsx4^YEqEO zfqlc>O5}4}ufSgkoq3d3IT*izkBDo8p1{5KBIwO7pImB(d>^$My$ru;Jm<6g&TnaL zstO%yb<18HJ8Cw0BB5>Dsjtes^0Gc_KqsCe-%TuXp$_*|kyp+h5lY=0KMZ*WYSX@! zc;q@@Pp?UJ!ROaast4|vXw(Si*YbKEB@afP*aOu7{@V$GY6w<I&ix|Rb-URvHHXex zIDk8M*x&s<$}<P~I1s&`13BJ;JS}P1AH+}}i{~<KqCOPQt?c4bt0Y?FGYDf|exj~7 z^vTIya&V(>xgXOWyv3!LG4x}=O5*mR$NVI(5%R5~D_CEc&;RWR*EHnv@O=()Eg}aO zg{dnztYVN>vF_&=<vvDN#(BJ5Q^PqY{7OAR+B-7mdVqV`{|(2!diyb4pL?>752Cl> zx69#@VKDu_)nDxs_`e$-^@6|lSroY$nJ%-)<C&Lz`Erj2!Ou%vQf}7o8$KriI{uzP z)p_r&+qo|b{UIIa58%h_?AIo<-*`sd9OmZ=@`Z+hMGFOLP!`6oHs{{Rv&NeYBJ@}O z*IXLP|7|pe>p$e{=w#G?L_Yd7a`7cRp9#HB`<Yq6oT0OC42;%r=qBukdN2<shkCW3 zG;%&Wc^nx32NUsQ(tcw<_f<geTk`ZQVBh5mS3lk}bCY0V?a<TYO&v#j+FmYA0CzNV zYcja$gIiO;mAQ=igT6MTVZVib9M;OAY4CetKisFke>w3FVo%<lN1js~pO61!7VSY5 zsN2B$39l5W+0dWJJMd;G``0Ux)WGHYnsXljEVY?61Ky6MZY=$gVx(6~pzq=rEIb|g z*o{2f&~rv`t^wBNe)gX!%pZU1&C$Q^htxfU-;I6CdT?9`e+|ijJ&`j~8=;dwGUx>3 zJr(<QGjzR0!MdIs`wG8@5xGBTx{m_sw<h=@w$R?97Wwpf-#20S7onSlQwIV(hVen_ z4oxLb)h_4{#DzW|$=sU3{Q?Vm>K*r*;IBL6(LZ1)e%<}x&#UZr%Hr3>&w2nl&jDW@ z1TWoYet<c~ai0Qo#Ta!I%*DBAu11`P7x$G9^12jx0#3kRaKy+NBl2K8@pCn>U+PC| zMlIg^d>}bbk)7Ufo#wgy7ftF>6F*cLyUs!vT1nk%=+2fPorAWJ-(dyvbkBM6V6r|N z4#h8weP&t}p-Z%%@F(9Lxb7V17G>}=_vE~)1a?02`d|1vxqo{d^v07%1niQ`%3V(M zSH1w<gRWi-84iBl<I>c{%)_$&dJJ7-DRtG^ukQQcr+RJZ-#rlu%Z7f<%6(+oza1wp z40g-xWMOK?dQZxA`3nBe>f9s3Zb*H~M{BCFZl`+4#f!Zn`~*v|tLytI7XE3@XWzij z&=`MXYQ}4_zurUtca3~k^H>+leDo1|z}sNu<g*u_Ag^~S?1sH&wZuN?-vYTnd!APT z*r4=hFRN10PfIxu?ZN(daXOd2!Qa2!MGi&g*#U<>b!PnPbB_^zj&}xy<l;Pp`+}2O zu^%Xo5MrF-*kAa7JBeEy$a|0G{ANlo_8&RTGQuCzCP*f*=`r%PgHP*|hZoF)e*5CY zZaNbz7xeSIp$Y+eWe!ouT=d?qD0OVXyg=sH?}qJuo;pdiA6{Trv3AI<K>8Qj?{Jv% zfiH;vJw6J%dN%iGqv)3dE``INH;Q{?{N8Btq&%TN7G-wH3%^$*yCT4~N6EK_Ug{V} zy^W06e>RUI;peGjkvD77IVN>kpvyhQ|3W|Jj&mvt@^rtSQOV&iZS1F%;QG;Sr2+?% zHzy7IJFgFQ5wV-*72{qL^SFD4aNVLGvs@yNI&$eT_Fc9x#(9)Qjge<7k9*W`KKkgl zk5cnFz0-y(4Y($b`rqL958O`$?N!P5=w+T`Ok{(;w#%tHJy=KF@6G|8%t`&d2J9nw zk4y24e;<G4hQDAJ`V4HC&ZtL>(?$dS0_Y1qCf(=#M`VxGX6D&ZFL875CuK6IaMJ&g zr{^pB^YVL(j5E*!{ayGpk^e2oLq+>(@`o(R&wRP$R#E7u=gEr!zFOn2IM9Q9NW_j! zo5`$_(2dD|R|>qdg7X9VaZ_=J%0O4^h`a;;adQtE{c+MSM3tZim-kWOWSpn$4OC(| z?6VkO4XMlidWchg4VjOT=&z*z>lvyY$e~8$6KK!;e;FL2D)9HdM0YkP&L{)<z@b}g zAdg~p>?7g=(=tyhrloEZ{AX9~Drm<}{ExaA(1W>GTOX`V9*dWJ|0sg?8$h?4PX4Iw z?3YGbwUXceU{QdUGaiRB6Q57}W%dKj!0|EcZ|SG+#9_36?o1q0OK@g8>;*8Ic$lGu zk^9)0t)X-83syVuzwN})gEhI2xs-V_JI<zgrI1e!mpZ}sdrloFaP$w4nvEb1sV{mS zy5l^L;+S`R7Ld2N1bQH&O&3@@#wyX&MnSKV7wy;>#wnE#x!JIXLdi=F|KTX|0x%ys z<R`xsbha*T^#dnj&rL%=*L>}ZY~cShpiki|GD>Zk4|R#_9SEJhO|Y)eA61D5OoVQH zCQzsOzgz@O#UZ!DRuKQ4ocYCEoLU7{|1na7d2Y-=tA>DWiEBzeoAq^>Jd)6@-*L|x z+}SWnFFUYq{G8gz`nkw^jDo*$lfOoTrB{(32{|z3Wq>9_zd8`6so*WYa7_m@@jHey z9|okMt_<Vv!VfVEetZ~t5x}`+ESd|3bFT0TxltJB`F!Y!qdnwqz`lGEp~c|OXHFe2 zf`7DPlm;S?8lt0)FJT^?Mjp_<h<Mv&V0Z>>K-x~8wP-!GPu&n|H-Z6fZ3H{vPuT>T zE=6h!_$3Q<rqF}=N08?L`sgW#_Fy+R{X<<N-h0s!k9NR!5zKA#L!WRiwiCK>b;gr< z^=mlwuz7!<M1yw0Kk^X&I+##CM0>y-sT?vj<NSbliaN-x*(5*v2ma89e%cG3$!k}s zh3M&Be%i=9{u7OU@?ngym-f+qc_8^7!GF1r_5u0S{wM1Vz3?_absyoEyk;Z!J8@nG zygCA1fcxOZD`RJ%|4u-+m_YuJ;rI)lh3Yf!^Rt*kap;@k#ATeKJu7x_Z`Ns}wfH}w zcN4Fgi2ZSyJO*c=JJ%(?n*RL3etrdbg}g?Oc%L_g$t#i>eaZRr1)f`cf&Bg^)^qU? zwMDP4tV&z}{2x1fbrt;7#GziyzuKAcQ$R<x#b3qvRjwSW8_>(H1?eW}S{klWtpBZb z@cTdyxr1K<`9Gk6Q)BqtRR<$guO9MpVSw(^UX=T=2JG^szI=ZU&Pj7~t_DA_jZHhS z^J41T^#pouJzuRt{|rDsZo=L^SCl%A@Q>K2696_U7OaxkCnYPn^d8#Ax$Z|W#_ZBR zjPIgjq51;-)gK!Iys*_*Kfs&?$R`6X-4>uBtg}fakR8y*isT6euW;Tc`uFF)Fd4u! zRmsB(b{b2)Z7|1g>Mme^wS2@pfxb|RIw#15rTF)9N3icFo+$wSg43MivEKWQwQDK% zaE9!mI!}K)IZv?Ce($SO<x=DCI2@vI=5wd#{`xi$d6vj|H|@8ccvYnW{lFv+hOSn` zsS)(UH1gAgLi?N{o<9^hRGT{R(3`M_JYWLnVqWmZZ_atZ^!Lec0UjD`Rus4=z^st= z$Pe<MEbGhf*^KUk|LBlS#p&<e$4p8Nz4tSH&+nf3*QM0Z)wu7o4s0GBtX-`8t-Y=K z!n(_|%d9l;x0E9OiuG2xuUD4F_?z%=Wy{C;6G0*AX-|HMyyx-kYjYS?D>r`ka6e^$ zKLz=i9=R7t9A<U&)7cfF$^`%3c9Z7vJDUa)H-kNxFbH|ZdPw=rqC?2t1>0@P%yavL z@lQDLOQpo#gLXvtC@UD#0e?~qzwfS7*`dvgs29J0cY2SEg+509RNvOTPY`*Rpl{fy zdyM^anYigZe9sWRKR^8L`%IeCkMGB?S`hl=K|d{I-8b%mzK6EAr><u>>-Ylk8cFm{ zA5~$U7`MBXvk&~JAZ<g&4aaX&lJ?}Ky^3UB)Lc*e7kc;)=iFuBHzl5{$N>H?%*a_B z{ZhuIa`5BvgSFxF${um3JaoC#)M;RzH209d96jtIKWYW|JvL$g=jGjQ`l=FiiBo<` zkKDb~AyAc}3#~P(I(RIbk4P!66?>^;1by&3_fhEI<K*|L1Kk}vtu8ob2yN({keuYR zsD!*tZ&p3{O$!C90l3BMuclzR7?YZVdmjg>1=u#uUoPy<N294*!vBB$k9ybexBth! z9#p)q+JPy@`KuZ4TaS5mf%UWR0QYTppPXyl>PY*S4V>>YUcKK_{~G#vt3Y)I+a)Ld z5WJi&RHMKFgWM`(WL~#6Y8dvL!<TxH@RPkFZx!<E(=hHEH9_umAm39h=Gk!W6HVd& ziMy!6o@D&7AZj+@k7-5xB6xGKL;b*02e|(R&i@&yz09vMBgyZ{yeQbhSI3ZdHEa86 zK+^Nusk_6vj`Jl?IP~@!oJ*%b?)NjPHu~daV~f%-ev`gCw0%DMpL^hgd9GL6Kw&EC zpMzl<3cZ5(uVLT}{N-U*<V!n~LYe28;{wzrE%X|LhSP3hUo!$sIf47tV1vn4jRkY= zq`nsG@livI#zP;*A6TC6zkZDTp}hatW)Ygedl)tw^t}teyM$S-XCdznIkcrGaw<cZ zCi8!;O_7=kPM<`+Xs{LWKtK8ZoIW;9<hfLDqx5qS^WYkF0%(7l+OC=4LC$4nfh__p zdV_vDSI4L=75JPF0h$Z{&<*NmfeW&7E&wKQ|Gg>eBHb0<r7H9GsGFQq*jXpAi@_Z; ziPvJCbjOZdjDE~A$tE}J_1M4I1DP1NE>5lBxmz>ITM|$IAGfL7SZs+a<XwXAc;e6+ zFx6_#0l;|9dA5Pow-R688#~~IuVUzzp^K^a0RKJ7L@vx=U$HGxgvhAC{J{Umo?kVX z<jlo5azAEyJo6#Zq<uUe>Iu?C-t#eW@!OG`SL=l+7CG^tfk6joe}o@zEA;#^<T+;? zqwo3XI`q?C77fdfoxFy76UeuD&lpqYM=7gQeTSkS#~|<c|B_4bLr$h2TaxDy+RQz` zQ=rj;uI8_4jUb(dPO&UNXTb6MiOUB=rupj}xVCDPI;UixLBC$=z&gAZsC|t0n&1Aq zNc;Yq4q|-qv9v;ex1}G+*Lo9v^X6{d0c&Az+ykB21N0Cy=A%wZOU7zlfF40d5MS~b zY{Y(IB=hX?Sp5CaEx6y5A~k;SWnpTBeLKV-yA1x2wr0Hqrx54nVIT2(0P(+td5?0$ z6PCh`3k}vQ+P6HRE;GNY>`e4N^DXKr^`_w;;#|Et<3BM!b;zO3ImoXQkAJ9`kG??P zWt_h<FUD2DPY?YpJ8{40ue{@2`T@OThEqR5FXyel!HF{%<XZgRG1Rp~&YY<2)tBbT zk>Va*n}{8h!7LxzeUF&s3+`^g{sMjJ*%+x@<yf!yeP1v?pPux}kM?%dof}vjxpOQ` zX6W^~&<m`SzY{n&jl-Y8JvV>&W8_CJYvh2}C=2ut{A0V&6Rt@S+E5p}<+4#f7`Nt} z=d?k7XKO`1cINeB;)<^FKFuzKD1iSvnAWMM3CwrS@9fZ9<Gi{z8@(6IeFWB3i4g`3 z&ceK#?3RP}qND9{f`2}G<O0V(Wo=|e4i*j~w@Q*fka~6Sw{ZR#0-l{8sZh|>nmS2f z$4K@M{O(xvfd~3Z1o3HL0qhYkSh)}N#hG8J-0ZE<qy6r3KN)_BhQw<iZ_fsCzc!Tb zAr3xQ6@KRnt0HOley3hg4dfniZBfwILc<je<{liPWZ?Hj#GPhEfBj@%!27>?WLFKw zt5Zy%=JB2Zb<BFs?@HtxIXTZexo0wt^|-ivq*5bqYvU(O3IA|JD77Dux2%V|Ik9JY zlg9%3^)~7upodCKGAjf0u~$ZFkMX@1{d6vZcKl(P;BQzQsii*XlR)w!LC@b8s4Sp2 zUzoCj75;Fa4Rmv_erk2>ed46DK{q@@UO6#O#u=3z`qo#@nfQIlp9ZUVWA<CmUCIOB zl8buYV6iXcU8u)CbFo7omLX@l`sfnBw@hvF6VYB~oLj{}a|ZJJfLG_bWLe01dr90y zL-yq}m|yVQl=Y|-I3a~w>G{0-{ip{G9a4k5Xh!zC$%$`--eIE-+8p@x?5Y5*kJLwG zJzIJiRT+9;o@iAEHy$)9Aw6=FxLE`9yfNn!HQ{HB<$hHT{A8p2RSUWR@qiq$XeZ|! zwV?y+1nV4nDJeFk9`y082Gs{!U3cjV>*CZ>>Z(D%LC!Y=2atEE1$e{|qP57ICb^wz z3msQKQtiM@u`aa-3ypIqVmkXSWNQ)D!Ldr@`+?t%yuaPBk3Qd~PB!BZeknkm;Fmi{ zyfSp^GaijC%{V>@Raf}Kv-#>D=Kssz<Y$D=f!vM<n~<-kCph*caUfvT0uJ>CFaBhm zBcCF#L}@?v#!X~dANa3`bLtCbGl!_433+jXJU!6&b_Z$zxFxr*27&=xM)(&!uy9m} zuCfj;bq>?M`p7%#RwdAWrZIWOz>{aa>N=PE8<m_I0=@Kiqy~*f-nF3a2lO7kcLdmW zbC?D$MjkOP<Df4k_t(a8_-Qi|5AMZY>15C(_=k78G&&>eD?^mBp>Ox*iPU1`&G+<9 zMP;Ku2S;fd&qc2xUJq=a-k_P_W%SG(FwIqi=7MLsP?sG{RVZ4E!S|d;ECJPy_zdJ! z-iskx2A!LAzZ_hZJ4($vF|9aU3ufJ3K1;p{en&Yg`%~KI9JgyF*t0)%Fu}(M+*%7Z ze?-18=2<z;4L3oTDaQFSnBG4?UVgV7Ihel`=Nk^EN_FRV)$-F;+AY<IM~p;XC3DCp z9)DAyL)n+}`)2u(qZPS#->IG8^$mWy%KBUQj&oP!Z27Ly+68~?m`Lpb?><M5gH^cS zIyIQ}Gu%PV3iLaE!fW(b$-8bHf==||{v3!|q!VD;EaAF03VV(C-|Vc%=YGCA4}a)h z^7k+<5B*)b41N8uzfv&o3QnXREwrn(SJ%KB{vK6q!n%1Et}&glfBC-~@Mqp6?+uu$ z5&5NtBOkC&Zb1iB3D$o4;d)!A?m+u(@zKqx^xq$w?m-8!AKIFm-;o-BF?zXL_aHrl zf8u(u;*fJy(btcmk8)0#a|w3SAiMlSuph|J+pZn^r*~m`Li>j?=u~jMBUCTJxtpAN z1zy-=*K6?JONZWo`6q>|WdP?7-<^63on|C?a6r2yP|>XSV(+Ya4{dpcO#=44L!2y_ zuCQ7Efw9}o`rHdW_y$|Sz<OdFf5YFshq_GQb%GU6pl5!Qk7U?L?8a)06Kf%qdzQ74 z7i%XvWJG?=I_=VJ^h(E8X8A$CoE9t-nC}gFi@_tlzVZi$_Xw92Y{Px<cF2dRC+u=V zPs5(-ja->i)S(eQ=^ws(1pTs{!(b2Xl_ybuwLI(XqK_h>*VLmf75L;%kX{G!>||tr zHP&HI;_%^b9L&9Xes7vf#QS1@%yYOo^X7LX7}bb%osRgM%NgjCR`|u?*9izw3>a6G z^A^^3>NC{in8!Lv<5n}!#rHi$_PNaDLEyPsImz=g2s>a<s4_y|EbAwZ9+f(kzha>$ z;<sFl+?i(%RSxJM4I*?o3-dcK=RDANIFHZD``TX+51x{KL(k`i|C~Gw7Ua{ss$t3l z{gS!}!&z_Fu-ytm|H7|U1ax!HE)M)od~adaONODu$(K#?i-o9AEA&BWf8EW;`d%BX zvOHJyibW3AU7?;~+QfK%oa@#Z^!uFR%+oo%M=tc%Y{miqQ8}J}(<4k}CSfbL@u&iH zkp#068Ta;2T&f6Ng?;m4KF7K~N^hCBEnm4*34V*8#9f0)XVcZd*4+YB9eneWd*R^i ze$>?jTg?queK3_Ddnz!I-_^ed>uV|bl3DN9_YyY>za{y<3bAem&M<0ldu(yyG8!|U z*(Ms)l=jNRzcd4va}L%5%=q4{R^Xs{)Jx*|-X7|LGB1ABVST~RN8X#qh^M#2OSOl# z%(3clG4@B?dtShNe3^#&7xYs?b$@lFeO>=ZU8bKZV2iv)&YWc5+zI|J{K#Fv0l&jk zqa$)HeYpBUpChl$KyXJQ=f6`JU*bv<p{t$_)L?Krc|*=k<GDZh2hi_D{)y0^w%83O zr&c4cYA^7p8{c=lBl#70o~Ra$1wFleb+i$7Xf2y+p${i?v1$+FT#tKg<7oG(V9<K{ zWi{vg<DpZK&*mWWJU{oaarMcz%BBhM?_DGxH#i+X-X!pTltT`G?4|kGgC^!N<1!h3 z;w{!YW4Nn0apuq=+{2g(j_T^xbZ|s=;)P?-1EbxV0X?`0a*Ov`bj2p0T+ENY__5*N z=RWBj)^pJV#J!_m)1D32?hx$pEfHEs`-#dy<YH&uH$=aIA20an#ZcaN8{@&8kH#KZ zRf^BYK3Pe-r)#iQfz3K|&m;%(dmZ(gq30y?qxKfx*UPDi{9jyLh}OY(6704COk9j! z1D6wzuo)~ILmg+Z&S2Ia>oy1bmJjrA+}jY{%1l46^J*LI4If2mJLsLpxeeH#`*1tK zTcty_3;f0Sjj4&ec|<-rXghJP)~4v;_8z5R|CFf<emMADn-O1cWlg+w=_qvCvYZ=C zV18$_>KOFylla+?S8Y2x)Qo+OCxrbApSzy?ktb;P+ZM*%4eYMczDmzrEJ0l88R+CQ zxxWIgDNVdH_Q2QV#If@KO*+}+iyfbZ^B)`Z_jSHH$8(L(QqKS^LEQOm)<@@aR$ah; zygb{X#o@@cTY<Vjdyp)$m%y&G`YR>#`=4cYU4*|n74fZL{G4z-$KGj{-mV+a0pyKd zFg?jGq#ofg{P-_is)k&6@X4zF%g|rQn481V<DA#-$j$z8P>62xf9E@qZ*UCnane_J zp#N}R`W~1NP22*%XTjtUrC@y|uNkWQ@IM|3)dO&TO6)ZB_4c~dCxG^l5BD*+wuM_y z!B2yzGsgN_pB6tC^pgAB-%V=2>JcWnj&kn&68d$KKt1h1|J|@?CH7KEk4JCdH>Li~ z@@Cjodx*1#&KN~K$b86ge)}~(_uzT6e!#!+AWX{{r!(A3`vpCAGI8<9<4q$>`UAbl z!98*GK$Y!Q`6P|QT>PM5<uzuNtAIY^URLquyk`Zwtnf>ZBYp!rX0tUyLC~q5MyhNs z{EbCJ<$z8WN_-PI{ugoczR1oHr`*uTm}eoN-zkfB*JU4EhI{SMy~Yynml}OE2)&OS zJ;DAy9Db2|9<5-$o00!%lOsQn`+Iqhk{Jy0(w^ffb&JpkM4u@F`V{-&d+5s))Zfa| z34a{^))erIHu2R6-mk+^yHY|Qc<NFNSm+*cJK$pCfYX4FlDXx__rFWwqa3}EkGqNI z=X1g~+m)5|Qg$YJks0qcR*TZ}{3)leGJsbehRD_gdvvf>C&92^)O~`VdW%_4%HZet z<5p(qTliP&^LZs++m#)9?Pv1f#v||72P-#p-Wlxszzd~q$_ws0M&4ZTb2F#DGB>lA z=Ql$ip$=nFu*GIp0Pou?hI>lgQ5f8>jf=%5!{1tr_QJ@iIPf{=y2X(fL#u?SB(!f9 z?xmnN*Hw!UE(TRL+f)kvj9(@#MvnbDPCPmE`7Y!=Mn050z<mqW*Q&85YMRoouaS9- zf37#g`}00uTw&xYWZn>Ow6Fm4ET_LtRz%OAwW}ihCMk?+jQ#oYVuWs)kUz&QstkW^ z4~wdR=|20YDp&x0R}GxCJworhAkPjV%aF5;y~J(956x;&4X{IYyEbCiv?AZpK7Ln5 z{1kQI_v_Am9prt@2_~K8|FgCu?iKkvdk6W1X+K@jM<ZBA^;vi8(O+3V5-&In`EWf< z^=U7(->!z>&_xDv%40{Y$8KgG#I_}mK^*%$)>mWN@6cy`6OqZ>dv5~0_bc@>SaUlF zYI0&Lyt{2uH|ERFZZ5T;{XFuZC3rBUSFJ(6=HwY>oW{o(b&Yk{8Gp&kP}VtewH@u1 zr;-mE%({{KmHfW%WvD9vy>L{RJjj`%oYxjb4xFls{~Y=9psz_?X@7zrq&rx<5%zBb zrUU1>@z9oaKI#cZ9=0e;3ieA|qcn<nJlsK^s60vYkT^ElD}@B8FZeVK@mI{Zk+=NS z54r{4@9ob#{>P~P(7T5@H2_R`JyMm5BG0=yH4yrm6PpGcnJP+=y#EUH_y_Eo14p9N z0r~M{7xo419ddD>$d%+@ATABM(KEM3f~k83Y81G-5$8m_XYRk`dF+eao*kqy@SC%b zNWmKTdn82Zn3tU|1Zxs}V*%>BE=C>`r#}^X6n=*pN%HSKwj%T)>S?u%W*j<D#{@c7 z<VT^u$Kscr3B5MPtXbfvF%H#4ey(I)&4zwCz^)-7>?_!JEl6s|zdMWdz5W1W0sT)i zk0zExe`d3&KfmYhb_=<b@az9{>o4o5x0$-ntjlvt$iL7Je^G3dme8K{9p~NPp|L?) z297Ket>xfk?t$;2-<Aci4~BkRJX$3f-xZ~i{m{jRc(fku!a2((Fh?Qk6@g``r~GFe zcEmZG?xLp_k@t5i{Ddqa+5x_rMjjzBSy!v3mf(CB{kQ_Te_|SSf#Dxd2vyGc$p7O0 z+5=rRjlW(6F@K0l-wQqFwn5ogXT$1qo?DOkHaSvJ$jNP)o!UqHkd<cb2bY&3FFyQO ze}k6sT=;#)0RG;)He%bE9~bFQ3w9pKX%4{`d0&4n;klMprD}uRBF?^EPCj?0zmCw} zXMjt4Sa*-OPj~`)LluusgNgWSFM(BwXSf3HC121<Gj==vnyb)O;*=Nk;q$o{bPamr zIOH1Rv$+s57&@jXd1b&p1B3N5Kl%*0{(^q*-OsFSj8g}aPu!zDeLjOuBY&dugy=4E z_Rpax-G@In)TReX?Q30n2tH~>-63$za*Mjx=X{2E%V*F<s5AH)e16YQ9`v-kB>P|J zzqiQ;1-;@ZamK8Jvc$80hu>x|`Ch=iHN6_k_h!bQS(5oRaG<YJG6#MYvam<s`?{I* zALyRr(r<9me&Wi&gq}WX#C#b`Jcc(f=Oi`#WvI)zEH`T)^03W5j}|t;uEt;gs~u<H ziz0QdIC3@AEhEph|LT!1II~xj{J_1vB4h&hjG|6p0{uV2s|);}r#$|059=|8`lPh) z9%7IUeB6h9az5e`jz+3Iax*=3Htg`@Yf<+GJlc)l3~t9R3k7?*qqGzGGZ#NV6!f~h zp^64iJA#!tjQ!z!>Xw0P=Te`Z{(5XAA1v)ziiML)3%x?TQEKR1+z(C*CUXZU1DJ_@ zXC`oeE%IKp#E(-VSh3JUu`{xQnc3&%0za(?(A3fB$wczcAn(s@j+7DoP$}H49gFEl zAER>fT(wK+pz+MF!Qr~bJEZAH{T}!s-U#IdFFx{DJNmn0n4bzkXE@;0BJ}$GK=KD7 zKjv(qeqv?5r*@=@&>rzOTnCynFFB_!23>RtbsyMQKI}%FN9YvTT|1E*kGZGXKZ?&s z50r&JFNi#KV1daIss!H7N*q5}yIi2Ef_)OG$7IJos2il%TFB>RUe$n~udGRRz(nR$ zU2v5T^~}Hq`3;)Dd#woe)5t`Ar;|GNe6R7UP34yIJq59g7@x7z*<<j0`&?cXV4a@8 zc4!2>DS>-+qc}gj<yIHw>4ncOHG#jgT7X)BIb)*K8XRD!zWQXwdwhs;CG{Wiw#VD^ zdtal!XfM0csCHm+{1uyHk^9*r6<3}4Q_P>(73{_%;X2Q6XhR;itmw606NA+SeyO>{ zx1p!Te5Ni4bd5ILdj`X~2i1js?@~TMy`Ue=z-NWrnOMlI-q6LpZuJG5l_Ne2ocNNu zec+yD#9M>YZ0vtWFu&7T^k+Ed6!AtS!v9v%qzjGcuelDj2xnd=#T)QG9V?J`gTA$} zM!IK7^3S_9jOS0Lk5((h(2|lCjesutuSp}pDagxFU^b7B!g!y7MNKM5e?-lo{>Bva z|A26froH+s{DG{ucW1bl1-<OIL-+Z>w#@JEamZ`V5huX^PF&4oa4vOD&Sql2*qwar z85rlY=sWnYy8CHoG0sP}B7>m^A4l#W3mZHlK8SJi^AFQ3_yf)4r2*@2;2s;_Gh-g{ zhdj5GIGXwJtL6w$N9N<RC!900uB^nxeMa83>lvXfZe%@qke2Y=g!4h_GL?Pm*8sI= z{_M#~p5_|Z*~O?6kDPkLx>?3^6{nDI15B0=9m^O!yGXucXm2XBwql>%&hOEA=+U9% z$#0AuN<9B6=$m`O^<y@A7(c_bFuwPMN2}pC&0*7e@a<+F_FT;M^8VThF56($UT}Ck z_dn4CH6~ymLHAz6J-x!bpM!cy^z*2yewrJNd@PP%g7$7@BXkU$JD9o4_e@L(#^yp! zkRPga6?oj=It{(MgHvZfGyCr@tovDOojM1dVm|T`%!qw`3CvNBJm}znaI4nQzt^)- z$Eg?NFqQgr@N3i{4>}kyEKDW&J-dE{>jv~j8}%nAVi%1gz7l)ehd6;-@Ta8-({0fG zk4N{xl=r+!gB<$r=l?i5>$s@4E)2iJFbpxk05byvGuYjV-PqlMUR$xd0~=ehTT!vQ zyF0Gk-R-rz_#VDL?(e<tKF8slv-e(m?X_2!GzfV)ZUS*Cw3ka`RuOO3zRMQnXB~G> zHs~?!yOZpC3Yv+(cm_6m8lo3qQ~Vi%W^j(QBv>!uFYEZ|4H!8uRR4i1vf8zn{+_<m zS8w5Y$v0YQKJ)HhBQ-X7zWc-vfn!@3H6Rb)YgeE?z#DxJ(MRy<6qi1MCyo&3jlL3z zpXE1rm((r|U_MoNWK<mb+pBoDzSI8dH}UtZYb`jh{|R@Q$YT!fI72=QaIzy*$>6ym z$S>Y6VWo$>&_8Tb{FICNb?yOmAsMf6b*Pt4``;^^mx4Zip&E$%IGxWR1K)LcNtg2R zyj{-*sa8GgP{ge-<L^$-?ysxJ#~N3#Iq>fW6Cbn>dGt1c^JwIZ!6Q^bv{#_c^s9m? z`T%)e83&t?2SQ%9xMWjF^qkGv0~Er2OJkjCznp$;=Or6F&oA;WgNqkO$O$HmH0vwx z|M?zs0bXN2b~fbU+*y|Y*TnMRd}A*%I4AbR^QDjv3-Hh4zJ={Wb)ygS3TLz+#`z-R z(!QnTJywJ&4cFfeq~7yv#zO;t#kQt@H)B_(J;4LNb>`Ox_5<nQsnU_}1UWPUyZl2> z*8RF+%1C>YX5?+^$$E1yRGHw{Sa&jmBX<WV8+fLLTf;N4UOi$Q@%taU`zQzPeORY* zftL!A?-;Cm(x5Gj`*U6KqlPCGB%dO3<h*~V#-?VS%VbvtzI&;I)Gb_yeiKeUb)M(T zGyJyscdc&`m&&^3G?;X(4DS<592URR{5A2+VBh2D<BO5|)Ugg`eYzSHs$3!HW6gr( z&A5%Lz+R90dOab34!_d^eQLW0^KO<yC205k8ljS4vo#L=<#!67Fes=ff1mssrD&f_ ze19~Un8#mbz&r)XdkPk*Vpn-EePv`NzdL*e=d19)_XD&zoS~3|I==8-hxz@I^w0Tl z)kxt(jH(H~M!tPxK71%?*1_i3Z3u3yMSB_IgKLAg-rKZ*aWxA0a+?0_yo>z`?W>+! zRUh=q5vY+>kfS?^|AQOnklz{Xc+p=C!NbeRcMjG%=B<CgpAT$W3eKNFUPN%wP9KeB z+>PdXGx(;f_%YKT-kbc?9KLQgen!Y;%kxmRhIb}UU<<zG>1!Tp1ONS#dO+zI|7PM> z9L)FfHpSBJ7!#<rV0>ZnNQ1lV)aPOUI+u^)!F%Rz;H{@-?0QAr!lg<7><v*v#$EA> zF16?Wq}SAq=ee#DuhJ1-WJG`>@-gmL`RP4!wAz<2b)r4%0*9Wp;yu#@sWbcs_WI`2 zS^JwYeyXv~k>4x^`O@GRaot>BxS4#w;Mp4{jm$wm;!oclzGp+A24rS@{h~fFJaHBI z$$0O*6~lBd0ezA_>Pvg$_I9muaemOzLod;<o3RhW#X#43+SQ-y<F5J0ZK8iFlXnF9 z^9y_FAlhq?=Wk6N-m{rgLDgBmu^$enz0qK!Mt}{;ixpKEJt+pic6bMm5XFO&`OX`s zvX1cG8^<GyW}3B@_4)j|Fpc7R+FaD}0q1rL(Kt{;oa&K=`TWVM3GkZ8t;l8UH#6I) z-O6(l&p!oh5*4Pk$UzfM%bnZvyLJ3z<GGXAUrpuu7jNQy_;+otlkX*o{o8Ny-7p`1 zjSbRtu9x{kzEp6mDN-{*j}76vfjo&BM}A%I>-5{ExwKE~$v&(N-*pdlQ(2F)mB5dM z_6=7YN(2YyqfUJj_6KvBqf5~5{tcA5Dc{9l(IT$zilt6Bc#=572DQ;6kiALp*(=!N zfY(N|zeT=H$%QO#$#}vq{1NivS+hu;ErvX5L0l2{Ri5FeRVn`tyHaN4@YgosS_iL= z-FgF<AtQZ04t<@xXfNrXZpj|nMEkmZoFkUSo{=j;+u@n6Q^z$c{a%9qkn=q@`cl(^ z-(w%V2i)D3^KZsupZS5>(Tnj#{K<aW2UNrVj`uvc&{GHC^*!DC%y|1Jp8PHF-~giz zgN=zhtcILFh9Bw?`0W<#i@^eg&5B}P4h#0xad-^*(f%F9^R#B444<FfPjxCX&p97D z15X^qJ`OqBGY#jKgRr+%B!5v6zR_M!J>>h?8CU1I?=pTqfBEiVE$wQNiSHH1x97Q+ zm*n}-D|Q}6$LGF5kBL{MUta$SR3rLf`7)y}(*BmYaT)BH5q~1qp=F%sPvJQxIGyBH zMgD#W(Ioo6^Oi7t<LJjYhpvOuXM_nCH4R+C`UUU*DO|1DkL}=m=N7zstw42SoR{qA zuh}W{n|PRu$er`^U8;>d^czI{Gw)G~d2pNi2W<7zJ<y1~sukb4@nWlf6-2IA2-QQ{ zC-<h_3s{Ep)i(TImc3>jNzZyPgZ!Axb8~U>vE*mGkBQI|?yHtPTyMbM-LNx(XSYz- z4U92c^c~DsDO|@G1KqI${e*XCfBFjy$?K;-V2>xE>XVkWJRCivG4cTWjRzQ)pZZPU z_~U*ufrB_F@dZ<RxMcx1=H)zU2<LjS4lxz=VotF9X<zU;NSA6MC+3?J0I#$he=jh> zJ3yJE8Mo_gde3`%RiJ(@?KcMoD+u&$LtSm;Zm}xiLbU72P@{rrA00-0U9iGchhCRN zo+F=a@O#C{?*fJwBcBV{FCs|R;k@q=_B-v+d$1!kWB%Au+2!K8S1!(V_?{Lk`+0aw z3G8bb=*O{vii9^FPn{Pq&3p1VX5+h5_Ec*43H0)`VEjK}%D;%;;~CSz!yo!7BRF}! zw@`^Sa&Ck&!ISTWC?PZRq*kQnA$QxOS4Bl3-wIP-i*a|EIISGqx1oEua)Iga&v?x^ z`9|DGH0Zd>oMatH^N*95JY+d`u9H0X$%*V);dS4VuLC(4-O8=}@bttTJ)6UP7-vyy z*7f5V3@SkT%6RgpgLCVd^q%qMM;@F)@OyhKik^XfU&Nsgsn9Q|^IDj8+Z7L8Vw_GV z0HFwcH2w)i!3)Hv4lRPY>VaFu;TDWpCBZ%9bKaYu^9676xOZgT+D<-U+Q)^5s{&Y! zb#m2Q^hwU0E5V;-c4{;4-{~27@wwjvdwgZu=ipB=mUZ@e)?oRDF^}<2{!|zJH;DWR z9nja>Su|%LdUZ7QvzT|AKa&rJe|MNXyw$-iZ#^}Qzq770@c_uXr&q`eLwjZP_6FdX z1I%-<Oxpm(fK@ViX)WU-W8N^GoKOD^A?}xP^YA8l#Q1yuB}4xo`xCX@TPt|pKfy+| z;NN}2AB~};(VUmIgtx^W+7?_zoI^Ws*HP-mgV|U|D$hh8!XCSr@#Qr*OdV(+iyh;t zFM4IiAa#X1?z_|te7OyKBmG+e|E#42;A5=nPWwi_!$kCm&-Bs1jOPJUBGilal-S<h zU_EEB`ho8&`D*|;XthJ5kzY^oABls{T8T_zo%W6;-W&d7DD|Ov-{4-<uS1@A^>Aw_ z?WvH950<bVNBC$syi+;y)`KIx><Vd#-d~q`@G0#L9hwAwXC0Xg?)GE-1vgS>d^$K` zlDC$j2eq9OuKe}s*CFH|q&?l_2+ag5*9q4w(4#H+Nx<lL_+NutCQ%1H33>g+pkqA$ z&dNb59l`wH;L=>Kzu^8vFdRRmkBr-9)EOLs{7Cd<zsouki2tdP?~{KA@m$>Z0K12e zjd_@r^&I~FxsR5Dcg)OFem`cfmwp-1(}*ixNxOq{+*M$=57c1;eV5v`1}xWs_yyLZ z+b;4Y!oSzWpLZB~AN?Q2`jU#nq7AgK9}=Q1;G?GOm*}e_uds8w&`U1hKTmu3FsCjC zAeVZDYX>~_2I9NG#i0i60yBLg4xWBqoi9*F;Qh(V_8Po=l6<1b?XWb|MS%yFv8nPj z^xkh?y4w(YdlrXI(C$Bme1kmCr!Q`ugzv&n?^zetjfT`&gs-d>p?^Wk<^cV}^B=n5 zrwFbuJ;yl|?WLl~^8z+76Gv@A-@^at3cTJvn@%zx-1W&1S)KmEUUilB)W40o0p>{# z)W9nIK7Ms$o1xCJiN8tv=@^$X1;d9rbqj8p8KxxG;X$o^bQj*?mPrXA$h9-nxrBF} z?bNKH$eoF1-G^7+AEL!=8M~`IG=32}6nXIzk#~keA$q{|m&xowy3#L!tcl3Uaswju zkoI2_*w6DEOE=*k!~GW4*+;Y&7#W~rtr-tTJoFfzHUo8kz>wQ+9UjknqxZake_CPJ zE6}?rdDXy1#96-s=S>RGdvJ3HyY8}&Z(()m2R!*1=fPkn{P7&f$4#7z{(>L4hrB~C z8Qs@UrTBhXCpzWkJ%+XO(I2iKor8S?`S%L_Vguu`V31q0nfC(+pkMxzVxJ`M4Or?9 zIxkpfdYCp1Vm(;zkQaR3Nnd$`=_VO;rzYpQ6Ue6l&*jN_3HCVVrB95L2oCLR@Z^<# zO2>RGYY3AAe(t+VVc>uUtS@}`#Hwb6!$*DgRRowVin#qm<V7{3stxA*%(2Q%dx75$ zr3W9qLr0p#_kKh?bsyHx@_x#J{IYXyp9A?g`%;K9a^E%b#<^GrS7T?%3O}2{p)nb- zTi%EeD*yj$Fhw%1w&t}fBj2kM{$bg;?`d1BD(6EUyucqBzGgpuU10jBKKf=so?{Ox z1kc-+x(#3-Md~=;_e3M?C9H#khS^lBA99XyU6kt`N_lDvn7tu?hwtEg=Br}xwb-$X zgR9KMKZE<b8dZ*Q(=y0H?K<oWMI%%iG!u^-4PIMlS6R?f%U5;jx8O^RJ^0!;)DHpc z7xz?Uu=+IWi-8A@60b)87aK`EHpXQg^t!6FTPFIc{}9%Ls#g6R#QZsER(0BQ;6Jpa z65|QGNlkc%O%7FN9(Zk_J`?&>pEz&TNohx>*9Aj~KWhNW*P<9O8ojR(*yFfO&A`_& zVS1g7^}d~_TEfSmPqhL+GM*P9Z!d?3>MiSRaq{W~Fqcwtn8$KG9d@bDe23Reu*DPD z53USRTiVZb^;5w-%!5I`TEx81RV+{)Xuq{3TphtxyTjE9>`*UE;f(L6WvGjjHpSo2 ztS+?sH1$<ia4q|*i=#OY;{0P9<7W5)v$A(#P9Gz`7T5nc?b_|dJPkCeCwzR6S-rt8 zC&?oW#x!)P4&%l!iTd*JgQp$p2e#R4l|Rqjr(u9hjIRXpq7S6~+#62~0_!~VCdL!F zxFTGQc)niL5g80$o1J}7EbHhD50n<>K}By3q21TZtbZ~g2Z>L7R*wF}PkSis|8`~l z0S)Af$u$K#y2D>JSSPdAi_l2g=hCm``?Frma%&WPJ9$gSf-^E1^@(|N3xCz|@RRHp zCV}C7@%Kh9l)q!wYWn*b{%C1hF#lqRZ{m8cH2&)AU|exdnuq(Mr-f=7?Y;-RH3vL8 zDMTaD!*br?To|4jKZ5z-{g$Cx0CsNbqgkw*6Bw^7xzq=AY9Z~GLUt_yD`hik3VO*v zoCA{J-%@*PDOeCcNelh|k$B)NtS^)IhU(Zn>@wsp>cjhP+ho%6l>6pVr_>ucZZIe( z<GmC0(NPU`*FRFLxNdkyy_lY?bC;b;U4#9?Nwe0_emRvxYr&!kK3WHw@q^0DxV(MD zsP%Ba%pO|8eBW9%SXT7XI~RhriS{|ujM@QKzJ^ULi1mJqmv+M|@NKR;`MntYRifD6 zEvGI9?W55H_JS7%lXp9W_34j8`{2`_krxg8n1*#1Z0=7y7JBl89!~kAUu<$yCkgrX zl01Q@xNf;iyi+&cyBcwT(ddyP4?6AdFNew3#lK&IKN-9$d896Yg=YrpGT0OS;2LO5 z_S0<s{e{Bex`HmBV<tK{?OO^H-vRnPCVr3k-xd1=uc+hLCmzr~hrBwo$1!dn2Wdtr z?9kYmhsWUe{NAd^Tz|8Ux?Z%mdSla5_=(x*Uwp?%^t`*s?`$|1EMPpXU*^<vu3sTp z&r8rd&aH+v)|GCN%3PmuD1+Y8p7DIR-h)}$XLzu_4n^<(0DrXHEhFQgHhv@@;eBV= zRXHQ$;VSt<;9Ky^xy$#>JvvaI;f5<VedHalcJa||^s_1Wu~cS!1k85n3)gKuLiG)N zJdAldmhsy-n6o0j^Gx(JFk{wGHA;n^-y}r8;ihd~_(n57?lNAcA%DvdPh19l#TBMM zT({?7aMN!SH<I_cD)Tx${-B-EAEpo&!8~<hEH2JCFNgiZ$bJ9a@X>KM>sv-o-S?zl zy9dck`>$=(Q=)%ttGx7r{*RsGDIeNj@I8D%uO;|Xfsaa?wRb#vHu5!w@%Cj)kV0rL zgc5a}@!o)S>mu_m?72~P+83P1U!8RzlIIA8*P2b863~-4i3spaS6{in^{23-gHMU4 zObxy(8m5q5Ja6?7rGxh-{=Y^d^EM7YFL+VnQZIDny&Kr5L5IA0Pd!)0=UV(_vvGY> zltp&Fuiao(t&xbhcIatl>_D8q;Hsw6nf#T9`*z|Fln>m1-Z`B0X?}gyNBHZDVM>Mm zbP2n933!@<p(+VZYtCYiyy`{Whf?t6HrCIQaOy)u!=J48)^_B2uW2s5T!y~Gxk)19 zWq=KN70mPDhf;?7%KUX}PAcXp@vs%(eZCNHHHfanzq=AVy_I^p;2-w0)xh&Jsc*pd zSXa-g>hQz8u~UQF6FC<F6Jvc;5A4pN*y+yv{bRnW53hUNsRxYbZsYv*it*SFKfB!v z_`O5Kp|TzvmRn7@uhU}e%iyKe<i|nYb-_O*p7GPG8F4<ew|XC>HeeG^tGxM6hc2)_ z!XJJKP^!tuuU=uQ%=1m2XIETZ^w`oa_2cjTcpae*+!q@XtV_*UC+d5s3%q7+gEBMz zg2@-s6`oMYPlw85Cm{}eI_un^<E-hl55hkflYky%XCDa9=Yw9zx>WTy@m|Oc^HPg4 zFu#UjANhkmdb~6FBe?G)_PPr3tUsH14tSBdtd~6BBO7@<;Q=@=$AODi7`4sDbF`s; z3H(UDaJiXh2A7XAF^{$_3e`~BD=%?sALFQC?m!)4++AZmELQ^gag%dsuAd&{uaV%5 zUk2HWvR?kMX%u|QXZ#i7uwl%0Ye^c`b>cck)84jfkcN!GKk<fBW8gWCIn)m9xXz@p zU@hXW#(_t2us`Je#*+_wJUlJ?hP0#5)02ZV0p0|=MgHFCZMWQ-1mATeNJFQizhGyd z3_m@QbIw@C-%sj9)MmV+zfPfjGv}{U!CJ_f1<3y<^bIMPbSRsrX4AergIoJ*GXC)B zodwU|&ZN01_g5q@CF8#veocw+f>o?a0^@6&v;v%q67!sK6@{I23->L=PP&@*^Cx}u z55GU<0r@}Sg@+L@IvhE5j(kG&<K9Dl+DiK+{J+u{ryq&a-3Cv)!J$ij*hh1t|FS;3 zKWQU(3iI)ek3KC#PMExP9KAQD4u09p*J`!Mugy4!E$dJ@zRM=JQ@gm|w2t^~=3CGP zPwj@cJ?Wu6;8y(pPckmd@nI^KmhWGS{3T5B5b~An<@)KpP8|TFN27CrdrOkn$cp@{ zOdNl9>;T0hbei__`?2eSV?)T(1rB@RQ0Lj`l?!}y0p6N`h0EY63w8APE|suT;=-uj zokG=?@l+f;=MApU`e4%><VJ1$3~s{@?_mE3uGnK1M~wP79Y1HdYlM{;X1)i98PDNf zn?m(!336lz{>tzlQ*3$#o+9sbrtauj$d@<pE={Q;#QZMSFGwHY&oc2H!Haoq`V5x4 zL>?~2+vjl(9pd|yuI#1z#TYN<NY2`rx17u5&dYq=z`RD@zg%Y1H`*uQ|4=2G`&zm+ zlJ&`lc-5WEpU%EPN?(`XS!U87?(192t-mS1gMCJ<s|8kb-URw2hw64_^a;)pP4IL* zs7nd1twDZwu#A<wRT<bny$qKx{LUaR`GHgG;zxyiYlJ=HALQQAw-$L!<=hMVpM~pL zbD<xDwgbMhf~yDk$OcxPV9}2(*eT^HJG`rb{PW<4e@qGm>kOd&f*XB-d~@OO%Y{Sb z0&kb*+^QCKBJ97B@EE>#D$o)}JxRvtyha{M4gavoQ(qVIo$&`r13!e^DYhKFpZ!ug zcn;=i25{lRP-O%!kk6nB^WhzF2ASaNqsTXEW_)fV-vvDN^KfMYe};uB2Y9i$mnyMN zS5HlRD}3oF^5rp}+HCMrE_lrfCMAQPh*vzycIj+A9~FX!)Axlzdll+!m1o~N-l!sQ z7jvd4c#%I^49xt>pbMqZo7+aJINXo(mQvt+&dExH1$J}Z8%4jYiBL3r=|19S!28$m zTV=e>9vZ1V$bla7$(u>L=K|tJaxyRe2~|~iEb%M}$n~R-!c+quv)G{IeB3|XL(dvv zM~Qc+HtmnelTinJJ)Qintg9727*!7*eA8czb1}}JT9n;{oOk-@CgT9Jmr9gmU&eW3 zeeU}>+!Nh}akHJh<1F@r`H4TH-8i2*kzjv|OU=M570F+Q-u453q!#eD=M8FJgY|rp zms-Mq?Z9ss{F`7<C&v97OC)<{#)Xsk{fc~_VRp6Qx=&g5hsgEBuQqf!_5;{OhS>PF zS%cJ;>w_<m_sf7B+3l%z@Cjy5wFh(83{*#O?KfX>RG~SnU0eD6UXz10%!PjAicmMM zuXFjT2Y7g-pZX%Ro1UdU0K7q7_KV=W)M3<4K`z&&E+V`|dd}~e7cGfHEJJ?{oI*Yr z{(g<@294l)@JaGgg6DJDH3nSxoIlFA%5yqISDDX)lE~jd`#$Uj<torW)DPUidh!(i z<Mhn)0!b!)szSdG@>T-(J<UK}cJM%HlhzhyzZOA0c)00@Ra3!K=R!0MY{&k87MKNj zI~yGHkbJh>f3TvRoO6taJ)Be5W}ejd(L$~_8iGEHd_UI1U;Eqe`ya56(!M60uX-+J zygm+45`65N04)W(?IR8YJWWvON^l(cmxc^s-jct%3IE=d6+d43cVK^$R&hNQb?8=u znb!JfBiQM=hu$<sKTi(PCU}gC^Y22)(bf1d`=dXUv1%A{veP8DHgo;bR4*BjUtNw< z7aG1~9(kz1;z!6=4Q|ir&;jsT4(g3DFR~xCsZ>h;t#*(Dg!k%6ekt^x>iK<i6utsG z+^{+5fo;5WygBospr20C{%oOBYm(5Xy@GW<4*jLPKedwScVmFIm*x5$tIoko<5Y2< z^}8;1!b|X5*QxIWKF?uQR^;Q@M;`i{3VV{7{ARQtiZ?3*dfbQwVH%3u?uH-PRoVyd zz;BWJ4d1=V@s1oli5?A(+(Z3ca6J1K{}$N8@Rzv<4;;Y00z7=*rJLh9PaADjF64jf z>4ADk`z!LHJOce+;CI`Lb?}6zn)c;<*FQv$X<z#|SpQ~V{!!=nnThd{M0^<SHG1H` z3w8>K)JrfI-^8(u{oosK^-Rk-)-gYo<$M0fYtqmL%m?y&z2d&|kL;Sw{F{Z{<}Ty4 z<8`B6(|#f;SZ~3!_-Pejotyl?pyi7>zw6I>Nc+Alp8C!AKOG*X&+xC~J+%he;_Bwq zSNQc09-83IddE4sm3gxNFaB-q@l)%C-xSxId?!BySSHq6j>_0YCg5Lye7?`V>L=|T z=6dN5xIM-L<38W{sV`?0jQ8<D@_>K6Onofy$|SSa^+%@RN9YZ|yNkTgV7@u{#}`Nc zAfMMlezzazxaD~7@vX35aDC)!;=~wdIRl9QfiJ*L9}E^DE<XeeEsWhBe6*LkV0;%t zo)FpL0Wsv005jspTZr$m;RSJCbr`4ETf%5>e<f5-@RNsKk>GFa`E?nO*VBgJn~c6% zI7F#a{{3O{6Y_kw$(xV{9>=*+I&d3#1~MX#`c^0Z|1k6}?B(fcpBG8pYUFn%&dmnY z<9rmmS7zFWH85)#<N9Dux0aPae;Z340@jz;*F97cIkoIQcBF!gyBsEE=l&}F*nb%r z*No>)JWmzYwFStnlRrF_i|c(Zxs)4>$VlC6K7En7A<758S{y$-uu@063V=B`n$$Cq ze&Afb5ZwORsiqUrcd#SwrJo-AQ-?K@b&UOKVXhDAVpTElRaqYu2V3HQbblcI{u2Kp zcx~3}+ThbwPSpYbJ50V2@KkZ?M1jX|QkRnc3)&K)`tYPHep=g*??;`)Bvhr6oJTgK z{U&m8XL`n!PoQ3+hpt0Drs(eZ*#9*Jjp#?sz<9=7_l2x)#B&Xx|Ar7J*qrtn<pNcm z_3BbQ^)w@pf9PKp`r|);o2ny!YTd%mk$$*(jl5CZe}8d+T7rKa<d07I-7!YB2FHK! z)v}D}EBgY}7M`3B|2eR24)XW&9{DR+)ES<he3@Org7?Yy3>G4;vj=!So;-D6|3k<^ z#_xWozXrj(m>e1m)=gp`1CI5@j@t@(jlW|l*1_b9oPUe)Vj}+n*FV|F7th~og}-;G z6T5OzyGGD%pBSo-$cM+v?HUPhGti-UFoO8g@n9_e9o_i5?~Vm%0(@vy_9o!9<>Xrg z53F`;8d$KsQHL0B16MmW9iDh7OsSDibzcyt3XfP4ge*p1^zqd^_#6DO8inw@#AUg1 zpm(Jwza{NcKbXk<hJNcuUM0ATvH6>SHxWOdoV?$c)Ywx7vHswvmBjTjqnzr_`+9CL zYA*7)D)zl)v=`6rK@D;A!<SCwWc=T0NFF8HXIZf?f=4&72W6h5{pGK9@Z{V<+5omV z6sn%|^FOt$+6;e2UX!ih>Wp661~wtz!b#+4pUc7832(dCM<-ZcDpn*<AN+46bb|!s zMsb7o!P8^cxK;x_`goWQz?ZT1z3RvQa;~oq!~4t$)sYnZ>8GRMdWr^c1g&RRh)0H> z!;W$Se9#qti8ja=oWn!sBNuy+@0s?cC7r5jVckW~J_TP!KGqoq_M<t&bQ*qoV=y%r zuz#lUBo_z!ZJu=$s>|-5<ljV3oZr$Q59GiG=FuYLb4jlVjVs6c$9%fT{riabzXFCm zCJqQ3$Naes&f&WcU|kx{n(!E2=etQCky9QEEqV%ndpVHW%KTnV?Bnpq-NW<}Jm_?& zV>jkaCX;FuK);J39|Y^~sSKP)aQ#?w@*#rRn0sw_uT<qj^bUTv9Cev<AwQ2s=rep! zmr#8HpU<&rUoF;?lGK%iAL0A$Wt`t>?yv9g+)JqwG#dNk6YLnFjL$f$-u1+eofxd& zT(4L(L?+hA{e^<$1(wIIVoYS6I2s~vc>1T<Z^0|A@LywmC(q>^6y6K{uqSfi*lXfM z;8lwFDHwDgaVrGuRN7xQ@Y5drW5L+F;ferXMtH~tPVpvxA($hlRjI&DHK-dh0C~Y$ z^wN(pbeH;qIr*J$-b%+jY5pZbX}IqjcHFvrzu4<8wJFKG`s-9C+S|;vDKj`CC_*8l zkOxz#9|xb--CI$hnM3UYVB|cjo>ryb+S*hY{<;!*99XXpJPFof)_~D*;VMFV@3PcC z1wYodXje=2hv?xY;I>(;8-eJz=nEy`^T~IWzae_iQ=>}3!?3HB0m~zQ2J#$JR#TUO zb@}{M;!RUAkMMIW%k{bJk7~?CzeP@7L<S$fOnoZaFEMW`fx&&T54B^y)#Tg^UhxIr zpRx8J&R1378CD{P!A|$d2MAUg?IS}c)-dev1G2JChm${u_Ka=JiUIHK4%RRJ{(<rl zY6M?bmpqeIu-`mkuEQ@E@>f$Zv#+mapoi7%YFBf3>eS?W0Tu36f8@xaX#B3=rFLPD z0Q0@|7Or$UwJ3m?2;>syeeGzU)-pgIGngljskco(Ig)(j#lOFv0Y6Z#d*!vL1lQw; z_sE}(`TRFft$F@V_@#8>`l$l}T8=(B_?e$PnO9%Z<L`l<eWV2OvRuDM{+b?OP|ry9 z0>_dsuXT3hg*8z9;3WpS6bIhAOnwA#2Jv3Q!Oi@}ROEjPgIOcsE3ku)1XsGrrvnzM ziyz=%^n%OyyTLujJM<?raw8q_;w@;u=&1yrH))bf30%)u+o^{h%)iw5eZW%{rJh?e zp5uYP%C^QXz9U3~d5?^XJY+y#>^nz(1MaIa6~F6f_Wj87S@57-k;+&R`H5f9LU_%) z*n`2V$H=eT9(xsb#mW5LrP#GUFb>9TquwUh_u((N1RVK}x>ln9AK?cCZ<E%docy~p z`1ya&#QJd|LMv!*CE~7oFb*n*$heI8d&Wm=Xt#5Ix)vN!Bv_S#(7%ZDUk@)+I#TvT z{EHWOY9o9tejamkAouZe*aA;Yew3B;&vu*^R{Jqb*tgej#ki;urd?b&a$dfVe(Cjr zctv=V(&Xg@i*at8b20Xh0)g5Gf3-hAMR?vyUyUlmcWU&Fd{0*9`49Zrx!yiM{*z## zw2`tgZ$6z0((N+LlM+72OrGOxgksXB*qKe#a%6o)PdY*Swwv@FxZ`LbYYG3ZB6+3w z&b8QQT!1$xU+HCV#uWT6cy5l3bp;-?hj@+YyvKDfZ9xvT+2^g*^z)auoV#>I4r1JU zIgx&v;G=6P_tzzlE?B%ppjM^Ej<5$mF~)O&RBqj-y?!L;%JkdYonE?{j{QYHKV&p| zYb^N%z#YSggZT%0Xlb_|!$%)AD#vohNfY97(xdNO^w1O9-w<E$3amB;KS8ilYx0uw z?=t^#3ztP*$Zgg~+W&1xUP>WPZU*QJyf6Ov-@(zvL-hwNPd&5Og^*80u><lx&FYa) zfc9<SkxB-i?(k-kU{ApB%K%O@cqoSFPq-N&BfJOxzuw@5!bbfwnss)kMS<|;qlhB} zAFO81gDF8i9>~GCy2NL6Wc^;{p+Ze~f9&js&?B$n{~pGD6Y82&GXXngYR=V|fBTEz zk6nRr!8+ySdMI|bZOq$ZT|Jcwo=p5tYH)dvKx)=9A7+_#hyK{eyw3vPPF|~=V6}E$ zI>oq(3?y$3{NgsoNeT3`^G@Y~>mqYH1y5411$?^QtO8)!C)B?M_k6`31{zibC?n$| z8~Hz`@*YRx$%hcZeB(T%FxMY;_Es_QFZ-GjVEy~vDh0OfgP$bx|J#ZXwQGr;a}@a# z3L?+(S1Zl+PIJj$&-e4Fh93p|M37ZwzzHjCDhDnN@lbiN0Qp)ffa?bnuMb9LVt-JU zeaTAvjNwl5V^jxQbADTN3E%sDsM7c3z1XiEj75K-Zu6NA{2gPYa#ccq#m-if`$HO# zPq#1n59dC$;Z4gp72ciS@kghDm#z__SNyxWhumreub72A;q+(q)!4<_@qP<zYD#-Y z@(?d5g1kHBr)Kct+pTI2PRxpbAeibyxNZj^e;Q#!Wq!w<aH<dj>$wd-#%R9ZG`H9) zYJSlmwdVf!FT(YG9C{P}T(_$*zH4%hMEj7R0a~4({Z=9THA`VXB#%Ky+7IUTRyQy{ zz^<O44}Ry~xfwqbZ0Zf4j~`<nutFo^2*DR=sl(D5y`u+t{yZ7S&&XfRkl)9%_2>GT zJAQf`&i;h+@d5Bmb0TyqGyTmvJOn;1L!_L%&xCF43E<y4kq<hM?}7Xu34b)wn;0s- z%WvvFfv@ZOX(G7tPpG!>J*R!~(iHf@ztq11TW@8b(~swj@Yi&Bj$)pg35K=z(=6~y zG3u>?Q^UwV2-fj4Y96=(=YlDnk(=aOn-AZIel?A8nyMH3eR%cdF4axLx{H5jBK*V( zH@W557exnaDBnFjd9xPLewTBz#b8GKd84}VeF%PC22VOp{Yk#hxXX6EWc+?6Z|8E_ zqrny6`-o7j1FZ+CcL(14>Ck4d=PdHOfqSU8b9yZ6JNXE=!oTJS)!pXkZJcv#ho|J` z+yQ1BOg%Qx_k>Hkz=q@SPfPiG`-o$Q|0Q4Q-pa_c+1Sb8hmhANkRPA=nspGq&Lc>N zz`-?m-Z}hx>KgZBtkr(SIVt1WyHKPKbG--q!&9I+fPAaqMeLRTf*-@F;|8wU#Q7sQ z@QlAYmErs5rhW+g)kn9QCGoyJ*$2S8$CLL3d6hbwpYFn&_a;yH683A@iFdc5-;23) z*1|an`79rC{qB3W>L3SV$w#t$B>h*)q{p;pL5V)ed>UHaPq^0V+XSbc(7tCPd42e9 zw+wdGtI9Z_?%z|||Eo$IU3v7Kq2YQBpI(Bxio9R3Ueq&9`FG>P^a-rr)}>_D?JfBA zP0WQpdmDYe3;UinzB*Woe&6D$Z`}7TI#i{Qn^V5|=m)$Hdg@QGb|XLi0<BH3KY_=v zV|mgaxv(FV%F4VT?^Yq!1NRYsnP@NE!b@hbIdKpZ>L53QIFEske-NlR<j=-)F8RVw zM!RGITV~;W1&rQLymUR@`-!JYnX%7N*We)Q=90(Q1-kM)gVBSz?^-kRR)ZV<^OY0K zTs}Z?OIas~OALqi+e&_P(3Lh&Zm{J%;*g_|KS2gX!W$ehDHS-nc!<(~G25)l0s2@X z)WVjcmpWzS`}{a$lvhpk(=DOO$@NC)Ez4UYXIKaGz`xf=UV?_0a7BT8db(8@T+-50 zMZg+ai4Ow@oN+4-IiD6iGb`ia2z7c((Y}lG@g9t$V#J?y;=QvR@K6|f@%Cxde?%UR zBkpB0<J{2Mt<v0Id#Hi6n&)6`-$=h1b6fSu2YEcsM-^!g%IDApp8FZ{q!K*#iA$@8 zW1kE6QdM{&=dZQF()d$dSb!}d*q}P_uffzy0k72#RFT>IyOEKKf!~fYs1ev@dziXT zLQbvmQt?RiH1eD_rroo4gqoyWuNkW5pgop);NXU=;p*#Vy`lfxz&A(xC>Gqbj{Fgf z`^VGp|As%g;HTvIe4i0P>IDBvew9+l-Mi=Q>I&~s&QC05iXjfYpn>(fCjJw=-_4=K zk#OA}$-Z?6_KPFb!-9|f6sZ2-sfj`IMV16SbE``>#v|v$18E;&^i&-9jQEbM=oJ=6 zq^4Kn%%qB0MUnOUrblQ9*Oy%;-Wa|3e!XxdFdw_j_E515?9=}EYZ%w>*2V72x?drP ze6;Z058X-t$KucZm2q0%MO-@bayovd?^&;I{u8LlT(82p+*B}g6XN8!?=E)3zO1bm z1{n0Z0kV&^e+Ji^G`DINxcy(3ex*U~HbUORTXN3uk@2!F-lAK@S?9hvw2=0v`vR3f z`}bVoN*%+vBIvFP{q%RERf$|*i@aM5E{WzGJq~>a=g=kaSN+Ii0zN3?sgbPvmQ{fo zf;^tl!JuWd4<in8AN^JAlebpFJL3m*x+(S)AE#Eq*DWSK0NnMN@5XaFYI&$5-}4^! z%eU?6heG7Z>(BUIL>_nMRqdbt+Q|J~UyzruHu~!dt2V(49%Gz?LoS)Mp7v$iIZucG zXv;o4Ble=h<R6aazMAB_q`hIRi<)Kpdp0LK!M3cSyTSfRoX>*`+~JCEg8rTze>V7w zMbu%4XFk>A+#fkyn0Sa2%%Ah?s7J%~;E|lOfJgV+6g&;N^^ts_@U>rvHvp46Q}?eV z>Qh~(j=(nrxv}}8A5SH}1$wEai%~~u&vFlcKICJ%CRQDT5AMx*B=?nnZqRY~YtBhd zgVvqI_k*Rcm~{>e7-iB0a7-J2T>`IW4$@VyKK@63JntCn-q+wKwgxK?-+2)Jrq|)u z@JGD?_9^KvTo3i>Z;<Z5H=;M)1t)JnmQUw<RU|(n{B{}6ML@s!Ks^T=2l8#e&dq}L z27I%}Ls6_V^I8x;){O6Nw(26!KW2u9-g4c;5utaWKk-7Bkz*G0EGv4-xe88wp#5$I zyFP-i3le|JeEP75Jiu_@*B&aj1pCwZP_^NA=enpj#W*=WjC}K4e-mxf`O?@O&@X?( zYxkjkb}RItexZs>M2?VGaz6T270!1(XkSm>HX|6fkh#IU`Fw}`bMWaC4e|mXW$~98 zEFT&sZ}4eSgnYq8IV0r<-YaI86<k|3LP6lIH6h9{lX;NcSHbXQLx}(8w|9Q9Dg<6{ zqrV*B@9nHF;Qq-5{YIZ2kcs+7$fE}AALb%2?h;?Ln(uNQecQ!-z423>W8yv8*QSG4 zNfo9+?HK>*eRY)I4<p_zJ?*vs^`<r+{XT+o6>!9WKxGBDx22vbxEXuAk#%Pv{-Bxo zuD!{>mz(y*w`@vXiE&~GR$lm`3no<p4<VOov3^v(Oq@1+@FnWGgAv5p7X|wqGN~9i zGm3NS8GJwdE{ntOcu|)UJoJltVky|zrE)3l`NLHnOd>A%=5U@X(WwgXqa0>c0SmF8 zy@ecWFcmu%ywff6n1Ca5hO06-nSE$&(Cbj38i0kbgy`XN<{x&`82CBrt4vvjK2y&_ zD?QksVs~v!`x^EkO~Il0{S-C@`9gA+7VvnS7AmtIjn6}U3V7{(ergRGd@Q=hc-Xj} zdQ$Kq^L>%YtP?e?Y76h0-mMPc{MOWo1}h%*(-HckGv^4!kaMNC5+6eQl)l7Mpce-e zG^;Co2>wo=%hCV%Pj*H=zFf_D1nqnH9=MjN$s>b$!nc;fk1&{VywyW};dQ=Jhlp`; z6u<95@DiTnJ4X+-L=txd&(g|EgTcG#2gAU)zT|~oz;`N)e#`o`?Ow1((B7Rmw2|Nn z*70VH(`43lT<n$pmaitzp02l5lfm%Q)Uz3ionjyPwBTk>@<Vl|AC5RQ1D=$gc=|$& zGhga$^afXwkA&}79(g*K>v`~hHZl*B(W4i@cM~7J1RVMhI}!7+=X;Zu!pD@gY8jYd zHE0ExSl3G{!Q`Leaxi}nqR+2^yDpHwHZ?YOH*v}EXCM7kB%beNA>R$-c_Q(m6_`KX z>jE{WJLew#Ie*~3fp(K}mSvw`$)M`U_PPhKKheI0{lfJn%;ylNHp2TMC)?FUPry%o z3%odMA1Q^E?HYNW;a2q7y<om`ChZ5mz2$rtJbs41jU2kXmpY8_nCs*(MsAmS;wwMo zo%yXpD+e+!23mBK>tzR!M-%*&KTNq<&%##+Di3<vD*W{p!25=T=s4Gh5$EJL0z2*t zlTN{d3v;dxUi{BP1Hk2dBXt36Rs}x^FuIMMn(sUd^Y=FRm31{O-zBj~h&Gmj+l{(I z`(;yz?t&}PKktKgS9xm?dSU547CnH+ZemU`K2OJaDuU<gagn^5eD^v{@N?$+n&HeB z=I#4i5qb`vj^9UsCwA<o)Ng=KW?z|=`DI?|ly6qX1?N6*Xz#&!?~nA%e{`T6&G|b8 zof?EbKieIlw_N{*{m;t$$&A0vJ9rdv7-PVtL(KXBUd7M(TP*z;iM~|?I~exBPqf!K zKz$V(`W1N)KEu1N#qSB6#yQ?Ma2WY9zJv38h{FZ1VdvY#KA>KVr=pR6zxR_be<|-D zN<1*vjqj+h4c0e?DS-L$u>kd+;D0Qfr$!?eH@aC&(6h)-VFLI3^;T<azqK||mmEIb zWtJKA$IrqWJY3x@3mAdCP0TAb$Nm`zA5GkF5O~zbuE|O08@V|bhi`gMeHg~gwI0M} z^PTq*w_vAzCi|B8%>UMZeC2?b$!}FSxB@+^E%WIh`G?%_MXms0N|5JE&IREm;v$tE zJl}wPh*8)ZeSNeYyI#KZ$bZ_iuOWXT&tE$sRGHz%%+z1U{&eP`Q`zAEIf<JE*M=ID z2kcPZpv3g_b5`<0!{6@+)%NPV2j>}4@YzBRm1lnYF&~i^uf`bEnDO<*OdJc>Cv|YD zD7deIgBm&LW%!kr0=s<(RVUVuADewt8vf5y#x%HMGWj|4Gj6|7SDyKu^`fuJ(B2h& zzsxxLhjYh|ZIKJ?_bSky?YFO<p${jV3{WMwH~Lg{FfkMLmcY}EBDJg*`Um@ipL~ZM zFG3X5o$+;?e3M+S&pC5laQm!K)dRC$4cAU|>HEJz^^Wm!oV-YlX-|%I>g5pR%+OH9 zqMz2UNj|fwoV$LtYcBV<KkQT!?lV^MCU*{c9_KdAz~h~5dX0WOwmJ10>ajlKKhTQy z*A2;!1(tludY_H^w|J`!{9j9eI)I<+2V;{(p5d?C1-#3-$-^b=vyt(Y&8(A6OuCC4 zT3Cj<#av&zi}*VBL+-xh&E);2aE>q^d7O#!!$Dl{@C*M?6ZXBu>?h&L*@@p{d=<A- z4+LHZIX?oN&pA;%cm}(F>j{`{ud=^Gp0us+tx>dR8fxM!AGt^T>siL_lLo#TL;EYc zRfE&Pr#m%|`&)1>)S3C-_Nq-2xV~(5fF^=lI=VDv1agkUlPT~VdHwaU81k_Sbzk5s zu{+?(q<M2aH5a}ocZlYJweM4Rf~mLwyZ3zf7si5(_g#v9u!QxfoZYO8!;q)Hyp_oH zss))Fptm1&Ncn%Jxsu>JH<G8G|F7PPx*hN`e^_gHpGnt@ocS^ae{xO&j@j(3b>K+e zcLP`e`_V?QZZhx4x*bhYw(W2a&fn5aXC8;JFRF;VB#*}q+V?FssaG4;!3PoQ$G+gr zakm0lKhxuvg$kzPX+kxDd6YZ1QM<YSHe-~~I&~buIR<=S68_(Or`)F<YR>QaJ|k}c z_Jm^p8g-EC6XGLu2u$2d90YjuJ#|d8BUhNW-}>@foRgta$+ah3r?|d%DRTk5{D$*o z^pi;D;Tibp3`TWCA6+^rR8RQ(s{_d+LHmn*HaWR()=lDM(xjZ9QAddOecM<c`SzKN zp*j!W`rSjm>;=Mzhr9^4Or~xo{ZOJ$xGph&8{DK0H0_;AhpGnh{w3!gSK#YLhAOZT z<NbSpZoqF34%bca$SnM(z~L{clgK<@d6xPt{QU;lNAA;pVYyRLRnR-WV(W$X>W5up zHv8KzZfc6tKPKwQ@ZEo6UpqL9@tm1+4%&YfW#2FWImX|QW!{{-M%_T#J7uPR`N$Oi zapGc%qOZ-h>p$Axl7ICr7&F_hcc7Jbeh<D3GHP~K)-&SmKETht#QzjbRhGDE@bp>_ z*$UDh*@zQheqCMXRD4F(g`$D_#P!i@jrt76_r;GIjKz=c3;1*mb_(93QojIwgQw*= zCn0}&Rt(bhZunRnBR}Ct^Z?FjzjNJAJl79!SHU1+S6JV$%lv`w9Um$K??3aFQSJEt zRqi5xS=W~A^wIk)>{n9Z=f(9;#1XDA(tnT1KLRF`|H7O0O)Vqj1AfL&$ro&Jj=D48 zfuVe#8rbg)KC-~iKJZh61oYQn@;}3my&zv0*z>i6*arHC{;+}n1smm?34N6JbHJyt zzPw{yI+9FW4%~3rPp9dpDW2q6i)WloWu2q_Sg%OA!OugzlnQJ!pFGZB-QVF#2R;}? zK4@@mL-J372g9&88<<}t5z365Z(p1`0knr?2qZR({%>VePH@Ht&Y|mbAN!Y$eAh2w zUYffI{q3W-@*y{qrjzfN-^q8}s=w$B&9b>v3i*=03Hes|_gkOShpe~3<e4h~U*lm_ ztFrVL=bMG#?GJj8%btB^81--Af63Qg96X2LXG!oO=dz{1=SlwPaC~?C@I2D7U-}cF zQPHetRUC3K-`nRS4_^m<pFA36xNl5En96}~UU_Rm5#)-eS>@q}%6h9}%J1ald>_n1 z9AAItOTn}FZ+W9PbFNj5_Ex9K7YW+41c<G(N>8HBFFgB5yJ~~p<m0Fhj=WAC9&j1w zU}pL$@Toz#%IeiS>if|?c%@PQE>F={!j+q~sOn*Z79)o@P9hIiioBTTsn*=LVHtkO z;M?`&8AmQ%-4m*g@W5=W3*c<l`L1AxcV6;lo%xyCLG4@g<viriqrLk<AN8Ni^AIP{ z6W)mX=CJ;~UyS`KoZoSHsxR%e@gp7xUK>b%GLF*VcRmE(tXhzk3}qkoDU_NS^mDR9 zThS9<1Q<1x>n%T0Cj$KHA`S~|kDu=da4q)m5joK>=93Q!t{lW&fM1eAG#0!O;-Sop zXWySjO@Nof&W|ZT4b!<b6&^R+OVh!|<UySQzQ!MYHkhGBfaZYR!pN(NTqs1oq<Qct z4=*i9X|IW$KLhre+V~&CWB0q11a5wVFE{e4*aD}P!q1){-We=-*-NXyz?#$tOG3|F zZ4+ItH6!rrMIKip&)O!gcSswdv$>H^mBRFw@qW~4#a7Ap-|DHYDZkf~cq`;pa*SEH z0;>=5?i2dW`ec7?=X(88PE|s$`@A7o$B`#bGr6^c_E}k7#JZrrG&gAvd^!3fsS<T# zIeGEmU*_>{%!6yhdmMoO3Jg<E*0_-u*~g~bPh908ut0)chru32h#LTRT@KJm@HXe! zXTh%rEY!Ng9yo$C8*t!wx2}Q}dRjD;b+y`O>X%rN+qXP*jdnBnWC#(^-fjk6hX>9h zKNfN^^Carz!1v)da2i=&=X1Coz>ngm_Y8b6##hh5Ss#%R!Hj3deb*d3_kK^EVScV| z?WdPq@36v2Y&UXmyGaELpw~qN=@so;rm`M@`CA0*6Bx!m<O^tgKwS~~`#s;VQfk)g z5d1`2VgHH5ub1n!?^Cy=Ip?JhP5J>(sALvfWUVabtpMz$7VHu~X`gw;qI~0-CyT6l z&UijtnDZItOW*?X&>+v=XXYFQeQazCw|;T|yaGY`3uZnWsv<o9>0!Py#4_$Uhw}z+ zf5nf(pWo|%oQIcR7%V?9F3?jJu-ZZNZ~pzhNq+K&yE;<Oa13%eAwmK07Sx{!1Y0)p zQVkpXAdK%;dy2gCP%!PeUsBhe?>s4r`tEtr>q%DOpuG_1Sia2DndHNcfKM1s{sJ(Z z_<>09Vt0R~1vjTB@BbpMmoh3Hyval2dcgh{uwfxDe2}{};*q;wtja`tS?uBNB>Hh7 zan$g60p7|6mi8nMFqj#qwGxcqyPVhMgvT!;&oAGx{3-Guz<ZanD=!#DyxRrj+4!D5 zDgfVn1pjK}?G5Y%1>y6zx-}pl`@h@dJ%Cr`9J?4eVHa^_wHZ&TjVc8XKTBK%ILhgT zPd54$_Pow5&_lPOAHgr-KVAWhdqjN&aK%pS9z0*3_QYYrqh0<wJtO6O!$j^U-m9Lc zs)7AikS`yslsZDK=-1rHCqg|nY&7+3Xy5*p_z2dkEaXwI4NvC${EipnadnXDz-LUf zsBz|$?_*R0_|!BW*u>F0nM5smA!paP)D(WSKYkgE*`I&RO7diUo+fWvAN288CN<~! z)_@4L1iSCWjt2f$$*o?@v$1jHh33BNi}2f}eP?dg?v(qhx-^k_)4r!upR%Ig#fB@E z_Jy|@PxaWBajw@EzP>4bU*N8J;pzYuY`_@`m@B`BYI|chI7@y$cth;SeZVH1XV`}E zTo;_`3vV&oAtU2r^T$9{K%Tvd@m4?DE2N<g8`vMe<bh!C#>D@ikJo>Wd}f`ynTdD} z+W)5V)=;qE56-VfGY_{riM?XYzd?K|c<Yv3dyzX9>>ST|&m6fN8b$lblZ<!9<>3nc z%5P*J(#2Qr%Fw^>__tj5smc7~{$<t3!^ZO+Mc-V)dk<;vrRJ<>nI}2$3FUdncXy6; zG;3Q=&4B-INM7i=$ZPV%*Q~(5`w*ttw10O5YCdS8F4b$~%bv~-tzsM;A|5S~_Bx|X zS^{=&K|ZWy^zQ=)IY-gY0`Q{-yG%g_g9nDwuVAe<1|{(wvy(S)Exbc5n;t|WkIGZ8 z2i|Wr-xS<3%?}?_<S_fkZSd~n%;e-_JlQ<e7MUMhhdg5)7!Ofa?WX;q@Y4ssSY0{- zW^NL!Q(*b5)GY_2@uxTg+6uG&fyv}MI|pVf8BQz&=N3I2<j_M-rgf>g6Fs6O@kQuq zd5|9$xUc6+_I=>s?lxTpOEe48P0;x-d7$~udxjcSlz+D^nY{J1?;+kljxn`lmXDsm zU+r}3IatBds#oA2?5%IW8h6b44-9cz^%0DW_0YcJtk0XMdkY`a5IGBOJmk_Ju+c=$ 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�!jIN}r0hxcD2B+KBP zsX`F@HIoDo<WrBttiEx`j9p4|aPxw)-C?zs!knu|I*RC4hLU!twZAx+Lh6A4KBOO_ z7F_XEDxDJ+W4=)6cpP*yQ>{X=a&YhPnH+DCc6y%W2Mjq>2vz0@^_FFUEG?3MF~Gf1 zFtm2OJMpd_F(%+q7VdiV7@Uf3_9Y?~)?V1<`=T?cbXPRv<faR?3j7b-P<0dD*79IU zj0}~&PQ)oM*|o=|aqt|M+s9n#I_l5A_X^1q<rw?<234F_P$IJPv+l*WhREf-%$$)= z`?%n`ET%=^MuTgsnZNj6ddS{KQ7RPMmQzB2TN#EdJ0m;PjAH!5_2QFX1C;XPa|2~g zF?tR-X&a@}Y?%OFLV#pmGg~JTq6GKDc|L3Q*-c_M`&lia?3}}E&tiZ|Fz;*n4>3J{ z(m^-qy-(uN@ydT{w4YQk6O<HSO;W34MJwlXw`12Zc2^<s=-=<zgyr->?;hq-*4>c% z9rQNsQ=bmb{3o?|Td-l(It(NNEB%#k!SFNcCn$B38H**>qC`wzhh!sCy{TXkw1&42 z;e-;MI;!w>*f09P_dR(4eBX;Ap-sKO_fH(aMzTIfC9uG#)#t9OD%wy_f;JEMsej#e zNby@YhS9PD^L$0KwWb-Cby$GQ6-LC}!V$cVah6qfm|;SEaJz_~H{vD#x|;AWpt1~} z56#Uq6zYnC^J@aBQOO8deI^%C6$(TDpp(74G@dKlm~CnEf!g@2e^fdTbBHgM)mQrR zpk|1CT;Lp?u&}Y^n=K{F+l8QWF(ciUEgx`B@Y9cCx2w0MEZe=?e(ycG?=2w?=C1lw zPrzl8u#(O%vM3I}GDM#ekts4*IqWPYr+kG8i8fLE7bY8c?{$-fB#AOM!yr9(&E!*G zmfjPH6pMnQdcHXK$Fx=8nk_aVO(eUCvbToo`JPzwuw(?0@6+SR!NM>Y-~*qa0es+G zn(vyiofnE%^1~-_`&1`@t2j8vy6;9G+jY!>M6U@wnm|hgy>B{@=`%PG!COP=1C4Hd zPHf$8dzKWZ&-rU8OH1D&MhRgSmNwCTKzVt!RyC1hvkjpj%Y+PESwnFUAu<BKq&#;) z(&3Z)5GUK#yB8`_U{8C;l1r+<74JOl(IR!{fyg)`5-ByPb3B|=L&;Pk_3$ut=oh#( zF^!VnL6%_os6N`BnC(s(lkq|+Ryd)tL|3cz+4fN9hh{mN1vcc(O7~UdR#Bztzl{E% zg_HphVVQJWc0*@W;eek0%5F1d=d!JmIc#XeM8F{0%mw5f>-g36G~D=O>S<1}$Y_-U zzEwT&dp-f?j$sS)AcO%Mmf0tyRW<9{^GbDW&x4bBGp-~wH6^h%FfulALY$lzgvG); zw}2?x;E0O}er)kiPDP;9r=^pOQO54xFD&=ch$IFg+?)bTLiD<Z7@SH|u~*YSVVEGh z_~P&qX=pXqKaMJ&zBs8^XTI|h<XLx4Bc>74thCLZ&RAmEpK+v55+q92P%iFD?^ke+ zNl^1Ln}D3PFI7I(KSsyfIHW=+tc5BT)qtl^aIr%^RHnA3El(4bNBe{@GuPt_g4<$@ z>^5?_dk%bPz7Kb>G!pqpUR0Z_(O=7?&vpdqlB6f04UUB_r;M<tl^kJ&5ls9GJ~}$K z2#tiM>0m!5puf+Lv1`3-y2Q2)aM5Bw2q`qG!}7>Nuw<3J9TcWm^pX0-0;)daVN2|R zRf9;)E}*0hc$y9<X0R%;bG=jZzwhb)KhI?$ZxWY^hB_H6dnT3J^eO?*B;WGoC8oXm zK5saBu29amog%dO_7>gCewHtXkh(P<@a10Fq5BM`(oh)fe#hSBo7hT$((t_%t4R@^ z(E_}~fQJ?gx25N=wJzb`&|RE?ud?A*5nSplgn?nT4(XG0|3~5PcZq0NW7CVJ7=RlC z%=MyGp{2<P8uZs3>Di@)d&V%~7HKn!%MWJpTWPvRL7bBPzNkyN@~t(x$nDo6`HKZm z8ssvt|8AGv6|@Cpn^=_sGoy#@M5bM_;=5QqU;T6;U{`wGK3sHJt0M7q;01P7#-hnn z?cMnIeG=fa%zw%BDAr<a(~;dkm$-WtRnxKSNRuE%TTVVFnOxBgw*<VXQUAVs2fHZ+ z-{8|Sa}jhkbCDz3I{q`O2u~02Lc~e2C=_t^)B4z>ak>7eYN+qB(kmn^`@7h&^NS9e z#xLtN+a3E(8HtZ99*rO8`^#`u`Y#|mUC^`i>g$KcNi4hyasNQ3Q+QykZZWsqQA#>P z6*p6(OYeJ7{dVj7FE3|M9zaf25yWII#kR|Z!u!B`Kqt7NI-hjmxfLMIc962jLe4bK z=vaC6{24^Kk9s-}_uEC0?74(@e|Pe05%Kq#C9?snwct?7Z$~axrRRayKtIv&DJihs z*1Q_f2%_*tx6@ix%i-dAIU4dxAq0QCoMTz<pVvtb&c_jAAhqJ~MV`IF$+ql){A`K> zvxOMJ{Uu{l5;N?M`NoP$ooKMxnhMg6@wRsDlNCH#`X1F*?g3|XigZy{{m)Ng@#*j$ zb!*tScoqc}fQJg$#~vy2Gk}|CXw_>d&VhcjrY+x+q_*SBXjwFm^o09KJ9@)1h73n3 zW(v*AuneN1aK4A6e_+(><4LK+WTLPGA5@5?oA%A0<-j4}KHBr%&$8eKquVJddA$4< zqsaR4w;SS$*n%9UT@mOJ!lK?I;J^bs!1uXUq>LRUMBhZxN-mQ#8nj%5%mVxBh1au! zp*R;lA}R#>rT$Zpyz%(b<w5$IKVZ1myUtAyRPM_5JC7QZ)D-Fn2lCT!^~l=w6V5`^ zNSEm>#f#(vWUktsqqd^Iad7j)X6P|%RKhw7fcp&?xZi|c!b<zHixmO;kPjigryUt0 zwa@oDb{FX@Kz`2}!}pREdp%|TDLpD(7ss-6KR(~2U4Fo`i%O;AhWAa9)gBI&=W|PI zjaIk)Hp9X?g7!tQzvj*@6AW8!zmXBPbvf<aitB}9cg<hKZ!F?au8c96KXKl+XmkL+ z=6`%WT(W`|hjuuyEM)lJ4F^tCSJo@L^pBZToLps24W{Cre<g!#Z@L^U^Td7rVhS#7 z1<ohAkI$9CtDyEZD^xpddddxA{~uxBtJMNuXX5pL1ATLnV9n$$U7H&Ax9cm(l^D&> zZZ*QG9Ffnc5IO%AXRaJF0@Rj_WIf5EQJ#pm<23HVIZWtQsi*S8IQ^!gbI%bVp}rtM z0?)H*>)sV!Tn`@)#NV#!-}i!n{+Ku~LFzZ$0Gq*&MULjjvK5KKF%SEv{Y;Qt9FP~% zkpZeXfahxsrQB?c3bSj$gwr!=ICM$qT1RXs0y6YV|1~6kABBosW);<jewK9)f+f+7 zxn!SFUQ9lD$@`oI$VYwRrcVta)E#O{WDFWfj4b^X@oY42asK6WIOzz|FrKD7-9$JE zJ4W%OJ^w>?Q1?t#r0Qr%waq8I)hb`24gA>bsvK(f$`Vqc+L2SM94I}p!hG)DbjrsV zAqVMs`=pOvV8EZNqXI%|y~^f{)1N|GC7-A<?Q0{_8)ui4^mbxqGRlJM-roQ|M|S92 z7h>g0pIf~JGgLTfPa8*vb7-+=Dp9ixbhdoq@8{B|FllKI|9dYU-HH8J^`smsg;qdv zr5ismdn@Mg?@G&`M`sE~mg_|(|H{MRR0Sf?Vixd(D;=!?_u&6{>00_mSR^*O{jJM~ zdo7>yLT)aLx2f4`=8?t?tAf8>UNlK=2FWKPS6oBJjI-&gS|Ied;QYq6v}XR1SKD?( zqq7O{4`+<~=zb}`UYFUVydG0N<XMbGxDo}%odWy1_1>2xlG0aFxyy4F;Q2r<=|4a^ zWd09V(=Jrm!%HevZk1e_{RLV7z<4%YfMD=9Cga-=AHZ8h;*7trV{}@KPuzPpCov0U z;=9Sfq4UY<-~khbNm2<1?qifpli<@Mygrkfetg5Czdgo0&`g)W5B&_K$Ig~k2oq08 z7h6WK<r^9=KTC*MfY}o8_DH9~itD&RW@H<Qd2@OHu{<?k)8d5u7fF-igA8(n6zC7c zD4k#3j$RVE2f(FKGU8!f3rW+Q(=CIJpauB9@0^}@uLUrt<zvjkC`8*xCY9c{{iQW* z-C%xD+12BfPd;~P^DLa;N}x`}%g+IvCmh;w_J|#9to-9(a`H0uu8l|_XBK+KG=d9@ zPp>?nGF^4X-`u52uWehAWfK~f9`1_eAv|$6%=ZZdyw^p5tLVkgre2SBauR^K7epy; zTlPWEbx22c;BWB=D`O>zC*dEcj=UQ!Q^g+uZ?ZrwzXmRG^2+0s@C(DeT#8K}@Se(U zTW!l1ap36H#3BKAQWw<w>Q9`)J5M@VsUIC#bV?92b1ME2jo3nI)?Xw)l|DS;n?Q8} zcmRNTml+qpWe4uDW~_o-#uMYl0H$J<($>V`OV`x&@G@0tmrpRrnU`SFJ*8em$LY4> zm7gspo+dFd+1)DtM1=Y1GX&0Ewm~yt%{(3x@ZM3C0=aev@X>(Y$WujPt2q;{-kA}^ zeC&;r?4;4kkU@2e>7`_8MAKLy=`WV8Ul721{k=UN=HMoU9$Mtq`T_7hf2?~{r!I8` z>+Rpj8OIb~-M)VD?)Q?|c;Byvj^&(vS@*fP&c({VX6Wl`bF)(~P)xsmJULz(lj?rl zi8R>T^(j_m4Y$sAo-^O&^eP`p)V8r5@!;J78|G$^*UT53Zilf^?R@wf@~!WcUiu^Z zM$?tMH&L?`Mk{=*MRHk@O2Pn4#gpQv6R^ObV$E^p?-IlT7Dr;D5Cf-gv3TxvJr~^5 zoUk7dq$nujzfIWD+Lj4VhC?~OpSQ38&om@BEX*A$qeWplC^XrTq65<S0T6@e=}%vZ zl6FBJgLnXc#qC>TYccPZ&|0%X;E0VBZR+iUfh3T}`MB)=_ZI=oWLvxF^HlMhWQDK5 zq`kis)erOi51t<{Yt_T>h?zj1_ILf|y2a-6cfDNJmaxh_L5nH*aQX%Q%?OQkb4iM$ z>A~AGX+)#tIcyq?U(Rp=-s%<7>xaf9j$24Xi!aa4icZ(Wtd4uBrv}Cc)3^TjYpM8_ zN_%nAx^fxfl?`Y4<jkt>;fFq)5#mro9RW3Wq@kES-FgP4$2&SGy)EQAbSF>XIy;ad zu-Zc`_&07AMrCst0OVT%E-a$17CZsP@9F}E>&KcM@{Ltqym1Eh7}8S9St^H-HTm;M zMmiXA!F7nm-$kaVsM+~Rvt%e@m$XN$QPV#qcFemrb{32>_sUss|I6Q$O;8e<4O5jw zVYydFI!LG$G##z{!?@frfAmim%;a<N9YAk^zNY0y@gV&G>dROwZA9#g>6(&f*S5AU zRj*VXtu-f-`7|8tH46juYAc9y%+~lO=O`{<kO!tf4KSn=j6P$2q}w!_n4%+q=eY=s zsCCJD0V&VXeU<whM|UzJejza4LDvK9-dnVN8uO{j<b6fjT6nbj5l3Su``PfK4GPI1 zn?3z!XH|<$tJo$4J6hJo8)4_|!>g9ekW;9=ACd2(RaMsHo#_2hj8V%7Ny`r7VMp{R zdj6YR-`Y0btpAgfn7wjTSxthjG*Qi*x_u)n^35R8-Z-6(sG=f-;vEK$V2H6_*?*u} z$nbY4Yxj-eWv6j7E#kVkbA^ibKiY~}>Rj(>EJMmD3woV(%VJGew+8a?QMd&Bc>xXD zA`NOgoBNZ~Ww13vqYqeD_j!|$=tT+POO{^x%*T|#yd(g~MU%j7ruzhTSwY7q;hAV` z3EA;q4F*7bEjdrq;k>jk!3fO`Y&;mMG-kM$9)%si#==!EX?A#vhX@qKjj&{<3PjKD zKQn1i7u<F~`6~9(%VtUd{Yx5-_fJ=wC#L;OdHEF_%R)_24_yHi9CQ1;mShBzo|}iC zr^ReNNljo|USvuM1SX8#pi|H1^KTCzP(*p1k-W6l2HS@q)UV4$@u*<(t=|-`ahIlv z@;nJj0+MFC$q9LuS~~3=+Y^>tq3pW@dSdPzRuSuK>7ErWqKIMkMhH)C1sP{nf>B3{ zd4mR5tRKh-Jlv|Q6;}%naA-~jSH^ZQZSUuB#>6cnf$woOCF{QWqr5NXZ()<Q{W68@ z3D~7wvM>gc9S*YWC^wYF6pua4rgJ+bN0Bl&ZcN27>FVhyU+#p|-&S1?uMQGxSvnUG z_ipIE-Qx~AQ3BhlQGeq+epo0@dbh$FvRpqbXGhgj&A!4bTo9=%h2d&j4_;X}CfOa! zP}TD`L1~2_$WpQNch8#OLbUxQ_)b=qkA$7g?UC0IG7Z5eNAgcL_IAW=9Psz1b#Z=3 zK~fp=?myU`p&!gKynVqK7;rV7ND}tF>X-_;aT@0kN2<MG=IjDI$-9d09;G$EaG}k{ z^EKB#m{em6FGzX7H{Us7Kbh%G-k_?LO?-z*eO*2v19&|%*6^zH=l`_eGc0fA*r3)^ zt~<Xl<JS=K(}U&T=0eo4hRdFgrG8Ai**DPWP%6TlRJQ}Y(X-Ra9zpG&7uncFENuBU zLM|~Vi~Dx&w>SST<<TTHu+0(@zh60D<Sk&tRNpDN?3mDI-1R&a?5>G&3Gud?3Ak1` zUb0j;X&4rK|Bi`Xq_xT;)G72WQ}#!%s7CDGH)D;TeZ3WP&O!Xze<bQG(qJ!6c~X^m z6;!|}CLBS*#>i~!0>>AV&PFXK!urWaZZ2gVWRUD>Hi;4?cnK?O#BG`~8$DcM>7Q-x z6gf^GWila;MaQqSFhRjwd#s{V(>7dTLcBzu1C2PW@?tA=!<{H7q)AIlM1|U*bg@#W zWjlQpf8?rCC01r?6V}M`!vHoSXY!HZUc!x7(u;74p{&n$oUebd)tNkqpeQf1J}2UF z#tW@%2~4dHoDX#B(TL<~WQA_y;!ATZ?AfT3r?!;SXkehN!>scsj;ABlw1|~T>2C^1 zwrsM1)cTK`80vL&c}^<FTs~q}nm96tAYqHwbaCpYEIDd|%e6=nML6^t4?G6br*Kli zYSzdCORl$Cjjf%Cp8JrrXgKkgsx$i8jjaV;U)2_%2kd}6(O&;`_YQ2RXYTuR`BMMg zml@b6?7LhOm1-xkRm&;cMlu((^Jahe&PBXDWyTSr2NnrP#BykuOx0Rlt+^LW(NN5e z5B@gM4g$W^o@+(;OY@f;FbsuM)VmO_(?1*dG%<lbJ77VI)`)ahN3>3|vJ`mf3EaI} z?gBU`J*+*Ym?Q68e^$5%o|C<UQ>w}qho7^yZ*7I9VBhu@(oR)%7MU2nBAQtj{g;B} z7vOhJ!twd=v7?ape&5C`lDWnj5gNX{pns}H7`l5X%22EAv61NBy~mRyXY(7FS-2vJ z`Aa+OKF+CZ5z~Qd=cDus*{GwjdvgCU13IzRDvA(N=+e|Z8>l??GED`@9blYZY*I;S z3iCal<Z(mDdA<l^7QK5LAz6Vw%?cE2Po2BH7F=2PQlH^TL~RYCg3Xz?EO6htDu1f> z7OD8Ok{W-BFQ@-D!qtYK6Fm}Q(*{zYLV~(u!2q@`0<{3|(1fNhs#4l1)`q=<xM&_S zE0;<Q{EbZyrDU7mL@zbLjh<5`?+JPCCi;tVzhL?!iut%C${_ruaH|xWIb_htsmcrS zRP8|I-Kf)9oYlAe>q5qj(YA`@8V&tn-h67QZr*HXysuOd{-VfoMcSf>zBjwjA5}NW zI<r|r16U0liZ4veO5%-3{3%$Y#$<VgYFFruvJ;ccU%ll=wy(;xatz|V<LN_U>Zgi_ zV}LpSi4dcVHc9_y#fDfjOE$r1jj5ua(<&e=rVL)oA9O^=g#_q&L(<Q|dQL1`XG`Y= zY4buW=s@3{l_~T8XgUY?I@+#p$F^;ojqS#4Y&(r@+iH>~jng=3Y`d`<+qS;R{k-2l zu=g?hm_4(uwSMb7&7!`oupzTuFx~8*YcrkxN=5P0K6Q9O{V|uy_0#4Dp?F%W)D6Dv z-7Xm4)($OMiW$iTs>ca;88iz6QGZ9jhvlh7MMWiq9f<U6VwkMt%SiRvrr%p>1>Mii z-v(djvm`CqQXbBWX;q#ZL&OGP7SU{EH@UEb^Eo^HX6!IF4<0w3-HD5_@Q6%xw&)SA zU7KxW9H?*B)<l@C(X#NP{aZW!I4Lwr66QmdchPmViZHC+IZQ9(o<JVGzxdtp+TIY< z?);tSDQ)KGI0qA)${>095)0`Z(S&_MZWhL_EO>PS5##zDS~SbB-Mr_q9PEEyi5zJU z56f2qXot?3w)W=K)y&CgHnlT-(#8~K0ho|g4{5kX-D`5l4g+}XKh{ZP$Ru(9oh#%* zlav#>JT0U02?736bf$aO;i1Yd9cv?MF5MrjK3s@~@AUBNa0{%V`AqTk5b+(R;|K)A zbfh+N-5wQuR6Kz``vWTbr^>CXtIxUyVsG#FuogA%r;^xXoqswJwewAD9}+7M0l$MD zS?t8VX#hH#sJ?X`8{Ygk-mkCm$;QZ);pys-h3aFok*O47ZHV{}KY8)E8=jf;zm?N1 zc10Ze8Mwou2j|x?XK8s8KdB&^rH*4tNG7JRS$~V^AXC<xW9U_njbF#3^2^Kp-ITnZ zK9vkhVEh)9XhUEC@D&L#03IudwoMOT6HTV(7>n;d-f^aSLs)I76sWL!hC@^`(NjR} z^z=J!v2gEIA6G{ck3lX94`aC+rX${*_w#*deP%QkXH1#q!_tm#VKhE;Gq$k$_v}q) zq#zHrYX!U7d5RvU@(aDc;U|nsxCKyX_k=a7un4c+jp|(+GjjNj5MTEMJLQEJ11KzY zZcTSMeHs@OW9nuMXFvNoJEAKiDF(f2@QzYUs-`FnEDDnRO&e!fOd8Q09CsXLGaK7p z1*yLkGZ9_|Xbdqj<x76=e1kD<l<VwUC@S)W>sBT$2!;R9=B53ef??uKVwcp_rkAF_ zj#+#K-_uPReFdt-%y{R5aF`2t=^@11`0C!zHc<8XR|XuWd}&kv_{~b9h8}|5LMWBt z<r%8fxIfummlS>l`lN~F2H)s?*qbmli#VPjbWCYMwM=<fWTKJx$D0lE3(8ZDL@Dy- zNfZh`Ub)9TJBkmqP9)P~i6s8p@2LH)_}-#+Z+cZ9?_s4jFYOoq)>rJ1JlfoIP*|kw zCdzZVk58koAeKnrQT4T7KVR3E<~tcgZ9^zc{zOJH7iT$w|Da{QQs9W?N%C$}yLbcP zmu~|2)<(F;s{5hFaML+GX4i2LHg|^9%V(q;?D{7{EZZdk&=nKfF@$Ypwr?DVTqT+I z5KFOi`8RV?JWpnqHHL1?noTUV=-s8LgQqhu`$HubolNdVOV_guG%^eDqFJNqmTqin z_4EQ2=7D7GOp^lta*jiMjal+2<2%g2;7gZ7jV)I}+tBeI1LgQ%Ls5xVp@x7Qo^es= z`GBE`{%vzM=%U?m;Rki#+^mbSSgU|x&S{N^YLO!i4N_oSNgx;N*BBe8EmA9m4@A5D zu73Am@q0-DgS1~Fq3>%|%G((kUfiLWW>EzgsZ|<kj@eVxhQSv~CtY@8d#EQ&j7Ip~ zfF~Gf8_G|UA&&Ni@#O0a<{9cUzUU7%97_J4@}hn82O(C1-yDJr)kTg~mFGVPknAV8 zDx`VezS%SQ3=Tn=MWC{bQSCP>!Z#?Ap#Zt<Z?}i+No(>@7$RDTh0b%X@bAogC9>sg zb_Zfu7p99A$TO~2w9YzYppWl5p+7lcmch_m{zT)wiGn%*)%={pjMC2%ScEQD@A$w< z0sJDmgUXR>ae-HAwgn>pW%|gu%x__P>Z@ius6f9Ovb-Wzakhl>apo;^&`JINx5uV& z-2UG9Vxz}Xn*VZ`@f^gVZY9Q!FY~}AE|9A|68^oX{bXG=|CRZb?_bIY_Djc`ph0Yb zE106TjCz+kore&NxNPLoWoENU#-<B*7EddsE`HTjV`PVt_98#|l_b;rnI?Dc>v1=* zXSR3CEXp;3Z=@tNd!JBib}(bT9MBvGm3hPCWgc;Wb2BkLE!gP3m0x0&F&E0FwkpGh zG<LO5`rdmpj<}2iOI^WSE^|UkxHc>LJgb+fKy4!q%r&c@4rg{36FhM`1s)gaovD|X z#R#NW36QfKLVXnPE=$tam6jL!hbh{Q!ZmPnSQp;<yN*_E9nCoQ<sXDHf?hl_L42F= z#y9sr=aaDo8_jtjZp^Hb-*`KEKuMB+G@9R(=cC*<)Ka~htvOxKH``3JP~Vik?rue+ zT(k6xWHY$wUN<EP=cvIK6JSUw>x$OpU!r`@LFXBv+F_V$eU!+4_lNQ&OM3{3SHL%F zv05fo<j=!`E*W{!ZEAvHL#jVEsLkN}m%sY^d7CFq>6b=t5XNK1_t-NVIx2~4cgIz` z;C!F{ddtrH9-}wK94+H%<Au0A`h+_x(z8$7{pDXe!pX#dw|;u#Uqgzksrzv1ae~y+ z7mNb*!ai;ipNI`;T_}Uy99#|JfG6~UfPB@7X;ORXj1*b{(nd&9>9>#`%U4VC?;jbD z5FkjvKFporL}teUy&}2Z2v#HA!+aMU)SElGaAgy*@UMS4H>pHyYd8vi?On1!A4I>@ zV|F6{UA@nrn8~gDgpg*GlG4kS{}?Vn%uhWdV$1U3%`=N0v>(oXhw!vtW()3!h64J& z-ZmQ)8(mCf`y>K3IT>XV9?xv_O@NOT>>ExF+UvHWe7k1TKLKGsP`TR!2>y(Xp|ii6 zG#>Bo*=7;{DyM{-(L)~yPu}Hv=un>>Z97LzouK!>1^AUL3Y(1navzpXAdIO^^LYC7 zJ8u50YN#X9C%)zb=5xSx!Byr(D{>>K;^P<W@%V1VzPdUmsZ;X7kFA{F7eWs)KF>io zd@XLx?wCaf=Eysl%@;2;t&G&+YA6{R*fix<>c7Z;Rf@7M;o3m&dkt7$;7@R%B<5bh z$AgC|l0*E%DA;G}mT;3#rRXTSzmZZ^Fb6oe(4#BHvB<Ti4p;as?;WKDf52jNWmh9k z^tN3u;#@02y*EfsAMdhBmHpMpxU62P`3;yDA@-X3*>pqQ1ySv(e-{;g7yQofs`Xr1 z*kk0nPrBNpq&rCzPNZ!eVhlP4aNpmRP&bJFIW3-T3o|fuzhB{tIuap3iNRy&?7!Go zS=4%iMaN|o`0Lp~_9XF*jj!dAepv@O6H?zI_I_lEKd;*2kJ(PxR+(q8lCEp3!)lff zloP~=e7kM0&b00O2kR*+$R~1)pyF$b1^7z<Z^lXQ9jUgd0fkissva+fuxc?1okt`_ z^SCn^z@eYMuN+W1SD@dJH?o)n{DI#f!(hYEe@)w-dEZNldYj#kfFSf>)=CO3VrDa{ zOTnNc@=C?rZZSwi5%97`f*xqz1Nl7Gx~(4x<iw!Ulp{&V%GviRXJziOH%w(qH_H@> z`Lk?p120$7jzpF;tKSus?`Zo^);OQ|jYH`4@Uszu^8PZtYB&8n<D1dm;J|YSXC_t& zBmT@&u5&nJ#Btd_e#gzoofw}S7j3<QEe0z&ePXizR#3O%r$|QzUgVf8RUeat^*{+< zQc8a+F;et=+^yFcD{z>=@MKDT>%&`T^RpYtU<}le@#Ti3KM;eDZ)gR{00Qt)=jF%1 zIdOAOf+GVc-b5Trwk?L_&Xk6KnK7)co5lbf>1N=69^zf`K!DToqVSXT&^(MdA2Bxb z>8h;y<8p_Yu6<iKam1A3_xJQT+BcTG(munF3HR9z%1yG8(qX4A%=W*aH;(UD9T#z1 z%uf8fuJkN-hOF8RuAztbtM5Fr9o&sqn@(?A=IKbRl!my=&(n|K+UTIWz?|dETqT{# z1BAt5CyBweQSoVjXEbbf2ZfstP2+hSG?AjuA%*A3ef^<EgxN=d)H%FHptxr?!K|bf zE!Ko4mGN~$$03&&{kYoLi3ekz7<38hwH0*v*BpySsikws?&!O$Q)aimtAkCNkz1Sc zsSmmdK{n*|h2?+$yP$=Of=B}|mX>;EpO+EFCwp8A5GbSj#+0b32Az*cr6ob^X<a&# zHd6WHQ>0+OQ2p}IY<cS>Vr}LIkX(vH9^m?J6DtRz7Y7pQ`)EhQ+7N@%AANXRX68T) zeq-{xbFJQfv^#g;R2M^k<y%kV46VEo{ibYauqr9Wh2AxtdmRPveHKtiCXXaZ-FdI< z;fN3>7616oD=-V>qDSl2-ec_BLXlNjSwH$x@)B%1(Skxa!2sVUlH?X?Y>s^8iR?N; z`=W}+GV=0MWRXc=notk9soc@3<x2|8k|v#%H*P}^OtSA@Z>G6Ynu5D~2c{u!P?Ch| zE#L<b_!9#{onh82XjRr-rfL68;|;!ZS`=zUyv?aE?5VCkXK`2bYKX=3)>=DWgS3-} z_|?^xa{P1dFfiUE-_R6t;&|1aEqu@=F5~?`hO)Hg!hmH7&E=Uv-=zk&FtLL>jy$0f zjVlQWjWn&sVqf6lDo$*@KY`5L_evO+pl$c0je1<eWg>KHJr4TczN4X5X7qhNC&yv; zM&CFB;PpOUQ$Hl3F<7{8w19f1+Bmm_?<g9x=^&%d6p7M>4z8q)p}ukk;S8f?i80SK zg4pfAcm2$1FzyWuLp9+V{42*k@jJ(GOF5HAGP!c$g4bgb4MTU_k@AJ+(y{#z*__Pf zsi-8xKfbrI)}c1Mp@C8eevTS!#2~OI;7rTmLBP9Hyi7#FR&g~pPycmqdauI|c$5H+ zQFc4`wln#)=HILJB!z~K=%<DabTp}VYgszc`xR^?dEuqRdwOpebpf_(X9(xChMs`& zo>gA=)MK6fgkGj?qIsM0E7}^#S)`>_Aa{|Stbb1#kgQJ`z1#hl7&?)J=9&y1W7GZG zAcf>kwZGi@;0^&>6xxQZPW@+y!4s4fR3s(9qc|sHU|7GD;1q+zCF2b7prf1nV^%sn z^C!Cqm)DZ7)xJ|DZP%P_MCM$Fak|pNxPMa(%2rDAvN~4?986FZ*4m1xDppRy#z(g0 z%Sd|)tBqrL5PqX~S4xGM2hV^bm(D*;9`A8OMhJ&iz{kQTNf>at?lskP5tPQXbdeUI z0pv$cde+nl1sgSKk0L6QVVaOw==Oac78S2x8|t3+ad&S{SbnNVCO?XXmo8>{whe1y z1~Qrx5&rE^a?Sb0&Tg2bvR&gEz_9!V_zulLS5a+bA!;%Bn|6OsTdHApJYCukYTYf# zR~NjaY~R)g-eJ@P2-t-fOXaaHP;KjvPHC!KZIY;8T7P-wHL}fQ5nrQLHeaj!-1}b0 z6K%gWEO?Unrk2ultcer<l@xPUzFREV;aB$ukt)h>l1r$Y6N#L?Dif4r)3+nqmk&$v zI8zUUqehTfgN$0Yc3)%CSzkg=CJ4$%O5>?(XSBld9|YaUBIuiY_SYfmc}?~Ohe@Wt ztz#q2JPt{1+}Ivwz-hkyvomrcw!HFj^fFj$1bnI)u-XypJv}zcF5g^PCRK3ft#Gw7 z5y>cypM=~iTX_`D-+T|W=6a=_PyHcS_P4EFth%?&+`4OP=OC|VDb~ptC6{|1Hv)z8 zLBqZ^qy7M_8JqG#%FO%-^;@Ct(}KX+MlS6(b^=Q5)S%42IMX>z+2QuM-A7YqhoPKl zM=<+oxTPkR5k^KPG)|Ju_Q!J%yt}uR>n!i6V%(e6&gN-<gRM+}q9NFYlB%TqT-H@L z6T<5hKW-~f$93yo;9{kc>+h99DwI9O0vyHfG*MVSl0;`BPKoD|XVpWd@2zJAOzR?C z59HQ%62b*r7-}(CEnNJvKb&`ZqEWv3m!Gir)x6^c{3P>YDa`(tMVw2w(}B6A%o@eV z-2_ENOGJ`=Di3x~GRROE#2JP=fg8Wa<m7*_fV~?eZ=k7_$jX*KDf>e%4oUmbdRLLs z+8s8)s0Q$yPl(qVQwNeap5j~o($yqnA0Ut-*gdz{r}jC70y9096#wBZ`Hsmf=~n~1 z$D=PC+L{hsymwF(*_&<r2`#^qhT{csy4N_+4`3N3!m&%SqS4<YlX`-;5S;8u$GztD zb9H4Fg)Fpo=)#wXCf78aSX@qX$fS&!k~K>erM&2+9GMq%gZ2z;hVE>5opQ=5%4D0? z7CF8K5x|MMUKTz}PwHBs)l)8zykM5YcLN?W;C|E+UAmEP2E0yeg$85?wFCc>#&_Zx z&lI|%dqC(Vb@8*0*u)MUdijESSZC;2`ttAC@{+C2Q>Pc!A+|JdcuT3LcG9Las7P&J z4=~bzyz`tZC|(St5EJ-AJ=A<xo(FL(jiG=weUk21urd@Y9s9)e4g<@57+|l8uol`Z zTY_P{egZY@(S6i~W*GvWa1YE|6cV54iaB}4Etf`0d>zJcq)~sZvaNOjdc^hP^6>}l zD(1EBAM`%Q%=Plk=OFWOI~KFR`rOQMg@AMDMa(7nY%Mohag<#M1$2bS$UhP}_0!Nw zUvMdgrzqhA+Hy)=AFutpI5*ag(j>m~XFM}?_SmcDyVKdl0=#cjs|Atqf|vhzySc_2 zde_7j=MX!?HzhKq?MtKD$OBQ7j57|o(C_i9h68|iUb_S|VFV+8$rSx1h9Rrb;~NjK zUoX6mvZq<e9BPyS5-fCazI{a4Nith=GS(|aHbW**c`109?(5&)byHDhS7miv7n1bn zfl{!z6yvQ}GWSO~b}syftmoz9;8m2az<py4$H5qFT&N~WhZUS8<W7byhs<_sZ%cJk zM^hwvgy!9CL-h4LgbmNGh-j2y#M*guOGuEb{4`A8EL-$}#3r*mqhLSjbI$1-#P{F9 zItPkjOx!>Y<dC!hlm{0)ScG^J_kg92(&-+-Sw2&sZ}hBqd(*8*@$fXcH>_fU*q!{Z z6RAx*j$#h`EdJ3p9xFm#&k1XKM;#lp<ekEJ$rF=@jx3SP3w-uQ)l{g9N~j_!?+<{h zFj6YMVf-j>M}2D^$bYMggSa*n#i*Jmann3lW=rpo8K(P?F_(A6;yhQo6$|3l58F(= z#Zt~m^ZTg=4}RqSt!A0JvO;l_ObO)%@;uTEsE-YMc-Fw^x77}pwF%aT8g!PtW$2)i zVUv;Hq6~F04ai}N7LQg=g6mhSYZOlN$dSB}KxG%x5??@G78^Z(f4`Q^n-eF8{22i7 zd77;Wn-0lj?S7dXa=As|5&Q)W!T{T2qQ%+ncgGk&8A1wEooTv-HlpnRUyfnf=PR}% z`SlQZ{9|SAq$E!80z~YrKmti4+~GWGBIDb26a`SP1*-95$}M^)>;yBk9Mu2hIZW9i zyGza`hDK0DhV{`A;nZy?(wYYNXG*0L_meDLq^S{do(@=l*9#M9Fe5m9MIgaC8B*La z%f5K?Wm`u;EBIzb>_NNE`Mq0F+Em+?YJ8_EV;Owt<vM|jzHt)+>aYIzmEX5(!Z^}a zbhB4K_0KD!CBs2EGzHvLKAy3fV(@@G!l#FaQEOrYsWVicSa_454iOfngpS$N+0F3# zGip)Z#SdBP0cW%i_ZxDoIdcO!wlgzr2&9XbAhOI}bZJ;^i7CZnv$~0r`y7$v4&o%2 zqn|%kLTySN4hQJona%mO3_4C}jX9nUS}cKF(a>fQw5#X{4l51LLc9j*&zEueUF&jV zQ9s7$eDr&MIX(#DdRXJ{kQ;tm1|b5Qh8cpPI>6^BHNfpRG%R_HL9uZ*_}z9I1T~o4 ze(1)evZoh`*X}!PH)cck2k^~VCruFF6ilB8{cHZar_VRB9q2Ctyw9p)@B+WxE}VIR zY6H(GCiW;jDFX`7yWPzCO+I{oE8P*7dP@%N<djWrQ|def+E4^6_L5+Q#Z1&Ve`tBa zPhQw#Q3Q4tdDSbM6lX%|-z5)BQY3u_2)GLP-9Rk*f_CgZX?=aqUSDW5f0Ng?V}B6! zH}!Fv=QNMYd)FkeB*inZrUs7`D3j;Jr{xO3ugHeA1OF2?AO$Dw{3TbbnDc&&uIyWe zfLUBvskzfxBGY|6mB1+y&{G!iMMW^BJ`qThw3XCLqg55ijYU<vxSA&W@o%Q9f^G@* zC^z5k`<4dRlx4NZBh&GZrE-DmbIFHm+#sMXi{IPaJEUUVOh)=vP+k6k`}3LY#?T3} z29%ACPK#7}y>J&C#o72NG>vKu?~eqBSVyD0fm?SY78qpi4FYZ;H~D<;p{edy33t^r z$-Qi4a0a0|IDsAUFJZ;si9DrEW!Tkbwi6#|hJ-G*<_za9TYf0-L%}`#aWMq*Gx)^} z4t_xQo6pl0>@Nv+Ebs~_rF$PO0t6_gLA+ljbs(wIM`DN}SxsMWY0@pu_m7iqN;eC~ zWV0vCF=jzx4YK&<(hz7^W}&GeXX;{x2gNG&uajfMLzmNAKw*o{8{show9;6)HIBbA z^g0ENpt|%hS>1x{CLdG~?eSBzy?PmaD?KuHi2or7sT#Y=qLI-DHBz1jn(YT(Z#kXv zs~=sn^1UH|b;Js><HW!$t7sy6)x7cbuI;XPee+4-1-Iw7`Jk5(p>kThoTn4Nd)26Z z;mLvgBH$l%?;8)<NBpnP_?=B^?2r`5B~OjP2ni6By!!l~uQ2DjOay8PPpD*1b^`Iy z8`*%5gOe|b*B}L3ZAk%hqvrCO<_m2qEvaxP2`7%UX3w(5g=C}Tc)<R~!h@`fBdYG~ zMKFHj$oG;qhQ9|aBUw2rWw1Uk3d0zyobZT`t%;E)Mdkh<O|<=vxVn~gvc+mY>~r7L zE$<Y>is5p%YjFbU9OIdG8g72SJ;Y%Z#qC#8?>S3vl*Mvn{3SJe{)dcxT*itOgspCL zoKiZB<_p#}Ct6aI<C{JM?ePV|hio|RD;)M{|Bv)vXcV5u>-8gD2?i?$-CEEbrOUGe z`Auy;VAevgYl=oO>WY#Ns1vu-1)PO<jmmTx^kf2jW~t;1Y_SavEDm(l^UZ2^EIrYG zeyRw0!rGzy)@*~?B8;;YYW+U<;%)4Ij_6XYw5jo0#GeQ38DIq6Ho)gUqpbyg53J$| zIF=M^1-J_j3-<kJE4XhcuGcy&fqE!yW&KWl{*WHAT16FTW_yX|E=~>2%Y)&0FXzrQ zeVARQp)%VFGhT;`)*I5!$Xkajw2&ZEtj5y2jjh9JQ*MfG)3e1^dcV}-{NO3R0DTu@ zqqMjx9m-3=a?kCK;Vl-(RLM~?I1p)z3QZ$!`);B#JyiRxt$2V7jI~a$RITp&vtf<H z;i#_(9D<Q0JAU*-oCG1yZI4L>LdTEwEfC1_SGi4)%*}dVN|65MtF#5fufp~W#erg2 z-9)vO(XSM~unn7iV&){oCF}gbu-;e3X#2I1WnsSSP2x>d<c7LNDbFN>Kw<y<Du#eo zF!ZqR)`aJ0PBfGyerQ}f2a;0jC8#%5(JHK>ci<w(PaLE_6Sv*_v73@@Mpq$mRDs1Z zV_507&cwB#9sZA~=x}jJWb~W4(E@J4(Mh#x0~R07KDI`Ua1`%f*Fg{J4=4U2g}y#5 zHJE@d=u)-ld$^e^<Sfc`-6_1PsmPu;y=SA_Vsz|3@qg}txG|o$&C%2hxhhZZM$FKX zcx*mTy#GzSXv^ktUcKOxyBzN~>5YmMagV_>v)sR5Jr>(}e@aLW`FKBlI3nhQ1O<tR z*Vjmkht+N|Aim|i!M4$D8>CU2PD1eJm#!06w^{kQ**Bet&p1(=W}?T{rkww7^{j3% zX5a{3CPsADtl5jUWg1&5t}zf9;~GxN06#YCL-Mg4Eqqa<&gjt8l_8s+qvNWWf7bLL zCn-2IhT{n~1L&Kv$#<r2GAYl^l|(RVW@x)PO1dsPoU%N$H3x1^)68J0_L?2>78?cs znvs<dDxgXkzC6f>z=>BUJ;@9p19%DEqV9o&Wa(&=4>nvg8aMPMzrmL{ep`@WF9F`w z=TM)tQi-z+8jnicPrly{u)l4q@DonG+_(|q+Pm|iPfgW*S7R_bgRQ1{4A{ee&s+XQ zJDjQ9y$90UxnCMhFsMNRRx8LApj-!O#Dg0r37Xg~)l8<f-+=kq?`C+18klUrX9k@X zrY4#6-!nzmZ7B3;M^0|y4`Lme_&etUa$v39c{s_>b$A^m@?V|7DjELFuFyn)_x7LH zpm*4@r1VH!0y@h^WTbsoEfp>IH^D>!9OjMJKm@l}Pu!-Nbzb_l#ac5iz-vji@23iA z^;|D;vYinO=F<gr+d-2-&TBI*jquY2{8u$LO*#8_xHIewad@#O50rLQMHvV0%>Xx( zjdM9MXQYt$x)#jF{$XxeeJIVkGrgpUHFGg8qH4QKaYGyfLksrKf9?N%*G!a!uLCE} zy{U|rt6+wC%P<}CkFsB))mndGb`F5@F;at0hx<^g5#tv#$AN*QV8L#CNrP&xvW#ET zS0s)%G26}dvy1(%FRTbDO1>f58raMwS3$bUzh6s+ihf&-<SFX8R{OF@yZczm|3dCM z3;P|D!rNn3iVj=Mx)XyLW=K+5b!Ep5MQgTzBRfR-%wQ7{x%%u-!$2Odc1$nSL&MxA zVaywGr(+^6(<zw^Y)fIlOv7KR7Da6S(nSpZ_$wsD-0bGLi7Dq{=ngh$1Q|^eNQCTt zR$1s_`=U8PqenF(1n9%UG0%8+Iq7@RRs>mxMObu_LWwv0o$a|rBWBFu{sYk)U!K}* z5vtYnmv<bxMJ73!U2s{KqdJuhEN-@JB|N{sjEFe&g2>v7LsB)?W1UY0-4Y}41?A+@ zVPtR`Viz~z*Y1m#iBD=m0_r`^xrZ=)pl#!9-ljSq;{+kP#JT?A1bC?o2Nhte`q|vI z#5wjS+FykkYM0-=*Az2nP@63Qp6RHgN_><GWc>61$6bgL?<tPjhJbSu19sR!{6AO% zJ1IPqi3em)kWiC8h&MAcsyLwkxGuxeyKENl^_SjonpsL_$DGsCR4Scbi_RI#pv=Y) zM%Pc|?9|P%HD)7AC#q8-%K;{y7`;s@9ch{<WQBUx*wg~kDJ%kbbuJ15-%Arep+GaQ z9I3of7hSBiv-}euA8=om7}Uw=(G6U{lgtV}(P;a?jd&wD1}4SEi_;EG0x1h?a(}+y ze#BRrAk9p2%e0RR9g)Y?!U6_P8dop0-#z-gLYMT<OeplKcTEZKI-Fr`g=%s&xK|aL zIB5`GNNs^=;%8R&!vyD=1*Msw*zv}{p1gnfPyYjl-v{~$;hN^I8c=A;cu>JFp*?2r zw|x!}O3XIB=ahqDg@R0XEPl=+Osaw=A|UPxo2+2wQ>_ZxWmqMJ6DN>H-$C|f^9k%s zL&PGlX|xwtc2V~|zCd})RoLY5d~;7s3bwia<m@f;3@RHwa;>TpCdCjr!z&Za81^^Y zkQu(btk><u6Ql<>jPWu9eSQJ$mW=k<;fth5RE6Vq?&It^RXbrUP9BkYwU4!EH}M;= znb!K8I4k1`BK%GHaToj4F-8T8s4yQrh1I375ifnDBK&O>jAZhW;OYhTsx_JGKSZ)Q z&T75UpSe%ldz+EWPSW(tQ|`OOjcrr^<E2B&qE)vcN|UwdsUINAWK7s$8L{w}PiK#| z`+aEU&9r7ogGSp3buVi>j&>Kdv5_vmHdUZjMX3ob)=0C0v55~`5bN(Q3}6#8=E6F3 zx;eu3BZb2Wbb)3dywegQxC+G<Wh>Ac`QaK+&r+hFJZP&JTu$4N@!Yvd1aB$S3i`zI zziZbdGP7X@lCu(0eEBSTvboNu$OL)lT~cO5bq$wfeO=SkgU^`as=}b<EN&;Jh_zR= zztH0PKrov~g^Z>PTxVoVc||kJhLFTVS-)@}{UXX0$#?x*TmC*wNKh5L6WY-LaN;7U zzwUZa$;E%(XQ2QOWGpJ^O~i`O2Lqkrjfuy{$D`Ta7ApO_dpB8}tN}kK&IqE-TH24% z1)cd98tO1ApIJ9VZSk)F?^42fz>ZHo7V22Q9>-1>uUKZTjBUBf8wcoX1jLsYqqK2D zD;goi)x5O6C0y0v7xU(9N+WA!rIgZ$LHms&@0wj*?QAf4!wY`@7(>T%GPfqM$@4C9 zTTZjtE&}rQjfwa!olrQ9%k!IQ;np#VH+x#b*`)qPuJs?)wDlb&mHAnDxwQo2Q!jav zm)8CbI%x+B2kEv_*P=f_EOIq-2sf>DPn+b{bp~Jq2GyEntpAaPb*ZO{Sf8zm(ak|m z(nG!1fhRYXCq<j_;pJJ#3U{b0{&;-ur{&nUsTA=s3fpd=Ax+fEe0Du!o*6hi(m8m} zq$6eJe~C(q+Pd+=8G0T~G7OX6-hub68s1ss)BIM1vT-<YiMfm-VC^y|0LF#tUO*3_ zX=(>>by<0Gz^-cJ$9$HYUP||Thz-}YtY1dRhh)iYDB`1UyUt^NW|p1#e+xGP-$^Ws zv3o!_1bsHU#8=1+_8;bi2YE!kz`80*sFCBf4;S!}GZr)K;0y^2TTThzMl_US4V{%t z;bD<_Mun3fi#cuieS33klFt5<eUt%BV#nO9dvDV8CySIdzS5z#nzQm>Qk#})SA!h- zOKGB2loKEy(&{~`4VopXKkTigYi{?;nRX{4mQe+JRm>=7+>hFwIoNu#3E<-jfA;rD z(@-@g4r^cN?N%%3;BD7G^SN_mncv^qh-3aRWNa2^dJGN${KV<p(3T-*+^uxEnVuQI zR>I0_PLbV%?H)7id9joL?r5ha9A9&C-YeaZGJ4SDDax3~&=yrmf=`k2G4Xl5+F;A4 zmSD@w1_lYJ8I3Mvg>z3eR#>NVYJ!Ra@?CDQwI1sIGi5GT>&IgR>}{kH9XowgP?lip zYH;I8jex(|T@+n-q4`Mki10ri#W-}E6OStt<q4H{%2*W|o|fP{1t-atR|t1<D}e#3 zsKCfwCSG8J*D)~nq^g*vQhU<5Nn(}YZO2P>tGcDzhhIvqr2@I2vJ)z$5M3j%mJ!E1 zwl~-aaA*V>-m^v>##2h1NA3_Hu@@ygPclNGl#kFv^tPuBf4EoD-zVf(5CQhNJ2onM zCl>xZAQ`R@nE(4S$mV#e03D3DK*%evP-)H7cm+bR|ADjb7qa+%WAH?<zE62N$szub z_|wM+c7YO4!s9%-+3fIWDBi)#mp|GiVRW>#dqi%l9%>d$>;vEq`T~0`jJ=#)6d-7# z5O#5thbeyWIuIkNnTYiDU&P6C|J$3$8~iN|1tZ4DSzXxS?5wZ_?4yjM5AvJUMyMnH zo-o+P8|S>D?%&f9{iFTR_fNewMqDcKmO3A%h8(i<>T%SP-wZ9ME#ppY33)5)BQ%Df zmfU0eVXk7q*9ufpLDL&ctzc*q*6FUMax4Bbx9iry2(iy|i?L(OtEzN(CgeIY>^0ZJ z9#5rjcHorffYBCR?wnf&df8;TI`7!X%@5xWC1`;>D_(AF+8dB^Ri5zwy>M-Jt%8jy z2Mi5Q%eMomvr0dCi!FTeOHT*|_SI==y(Qk`S~>rS7tr$`jdl8dX;5*6rvHy0MpNBF z?na7jPV1@#@KQl}bo1^gkyCZ!Au1>|5XvFD5~u6wAX22;;Q@XwHBC&KFsjHKRc@5t zc^ruN7d4;l!I1&0_7~c}5qp0mgQM)FY@RZ?_Qgn3HU>Fm(~QdK+9(%^0Um&82pSHH zSGBLadK)fx<>cB1x}fKDBHd-Qzbu}FbPI+ZH6KE}b$-DjQVJ%{-I9`rK?%Q%ZA;1r z??u%JV}_9P8E$(_?_UWmqInJrCSG(X>dX~+Ms-5xPE?*kBsg7q3Pe~5oEA3~u5$aD z6Q6`YrEC{X*n5xtS7)l~kHO!M;*HB|kZrKqOquZMEAoo0=Ae&KP)cnOF)LXg)-!jf z#^3sqbJ^&se`>_v9{hdn1@fOdy%UCfTRCfG=Go0;b3!?h<XQW9N_2xHANYj~cxGG% zede{->8O~meiJ4xX_tybq<md%Kqfb0#)`k}#fp8hDsBRK=U%_sCj)k&=g#BK8cvcQ zjDl3znGmzrF5ukKfa7Y-HDF8qz(HKh_=;UE(NHoIn+HxFzH}y?q=PkF4_zB!gKLoh zwD2gkCEW)90(I5KHI>1D|Kg{plUA?CpYG_^k_RSqL?QQkK_HVF{64l$gAOIJ{`~LD z72V!?<q7tp8cB@WRUi2KCG^{=de>zMfiBu2%azb6>o;%xinopl3+w^H+K0cfAY1Sg z?F9Yg-{6;28o&}bCL5|g&llnw9}28d2i&Yc-yiT+q4aZX)ymGV1rmu#3pbW=2OcH~ zKUjR$DbwEA8~$doIN%*gIm$P_2k0ql5&pL@6Sz=qb*BT({#UhD=R3fBuL#5ys>IRe zHp7(`+qwUGL!TJ?_P(!&t(qt#l3C&DGWQMccKFzk25MEAcFrrW`aAT7)h*~OukJ7R zEE$VZXqV2m>>B|+`VS^YS>w56cf#8L<=^JsA4uQ{`%pm^ZxY1WP#>5&lT&N`Eh|(5 zhX@7I8S^ZZS?66@s}MDf+4I1uWC$vD5Bp1+mW<Ts&PVlN6sR(P>w>M7*!l8JMw5`d z1Wxeq26zetoX~#%rci4xAeBK14ZFcR2U}Es2dcUpV$O0opK6<pw{i~=PlSRIvvJUl z(aqv`H=2jR3+bXOH2jj;@Y?+zvSwGroGvUQh>^kU{VjuSDWXAD*oNQ&zJhAgK%ir> zQDn&wJz|}lMeYXgj-?8UDKRvdj<wQ@fsoasH%Q<^ACmO$KBG<`K!NpghLe6ri4T4I zRS!D#m(pfICHilHhe723@h<rW;Pvd^6|N_qaQP9S;^8suX$n7X)$(EtR5ff2Ir6I) zU)?UlY~(2Hzy7+allGh=Xsrjl?SQXQk4@*XU3WMm40fy<{QKOgd{fy$wYNH?=CZAc z%$yB=1>-70GFBjqBtLyd8cRc1J#NHW&rGlB332TeOXNJZoBw9$nhR4U%s{pg*Wrnx zz!X`44FiRS0}J)p7H?=irR}Xq7EwNDlwfWJ;2mm<J8(Gcu({O!wiLGqaj)g<3f3Q6 z>20gtMXEw6tK#TruKkT_9L?@%f^+XLj9qqIS;>6daJ~;x>>cl6l`rC9hwh6FDPvw{ z=POfxX8h#|j4>V4*SxJioa3k#CJ}3CJ_@~<jZgdXN0NdtMyX%60iS3=u8f#NW#F0d z!dd=0FMrr^WRc&~?qr{Nb_naN3svgW_3_{{(0>stIW#tSW*M_76t9~{M3L#4&$vPn zaPiA?qHo#*-p>%N&Cv4lMiKnsyb}9R63>K4F&x5wFd_9W8^l5uEU%saUGwi2zfs0F znn_{$k}{DK&D$NVJQ6S1`&npdv6nO+U1>>664DtIzG<ax$bJ{fY8fEN8boe>yA{_o zed&zr?2GCi{8l=Y87myOYxeS4|H)DR;DP*lMIIt7xJ(52;n@yi5Gjnra5xl>#iGrc znun-0$63`6y3ap(Y*N-Xa=lz-D4I_D8f$pUuAHZ6={f=~1B;o`$`#4yGGC2Rw^*`W zE^9vyQ{s!rrnJy4vVr~YV{o-exqn<sv5(HeWoHH}<E*1H92*lJ*cv;S0+$1vvDs~k zEdrSb_Gvz3XX*o#WxgZe7B9<UL?Oe|El>5UV?&f~jO-PZtPoTdDE|EEG)zT{dIbLj zjo<Va6vRUnHxCbCe-WB7HYSpgojca%8JXs49X7K}1wFjq+v&pkUpnBY9|0T~z7}j) z?fd}AF$1&JwbuH`I&mJG73#o%wWx?yZ$E0lKWJ@J7aZ;sqn!#fwG41|ia=riNj)`F zSyn#qjBOHtq>_!Nca=FWbBmNc5mx{ETBwP8Lc6Eqk;#7NP(BH1_=CQ|NxaD&me(0$ z&$*Poc>v&@T<pu`by+_db;Yx<g$(D<0P~NrD@q8)GN`vNwS!^8637F(|MpW0_k#~8 z&t9lxKI=T7j!>us_?EgXlHr5_?B7_b#f-dhE1J~$3Y@m@Nx^?cq%Bu{ALZOk6fkoR z4|u3xfD`rkrlvaIvo|0Ya;U|7Gh9eg1k<-wQ*|$Twy8_pd3wqZ9mJLO*rS+T-0@xb zT*%V?*u~rVen&H8>j<5Vig)Qc1L)ryTJ`%Vk){nbf6>B?4&K16rXE+A5Nl{SA#rs| zQcV?;DQ+Hwt2v6K9_gOw-&S+a^@5bTKt0zrJPw!3zlMo_DX@3!@g$swKkx;+f1lOm z8+{?ZLP<yvaAktjVZ+5SfpoYA@-@I*ilB`LKROA_1&R$s%9-zH!3e7IgJu4dEeh7G z5Xu#0e?yS*bJ4q7KD*?(DpgiH=5+5Zne?H4CHB@OJP|}KIPVrb*-UCvWf@z`zz^H8 zvN4Uxth=ES^}Rocx!RC^u*_o7Br>5Dy=%*j9-F`(qc#ZyB@LYu^btR<OIq&gZl!J; zOh$m&YcCu>f)vt)FQ}w*?lkG@d)r9Cv}YT(0`2EM;33&LS*1P{EMm}|e3O8lq;T<f zVqX(DL+U;((otR;R4}NqFmF?3ADb;92uOnU!R6gx<EIfpeFVW52g>(@>Tl%S#bEre z<!mRIMKNr|Esg9kbL<8sgg17*59dj0vCONe(5de*r%3Zev48ldoYTWRy^xr{uahUh z3o<C6;4AHB-+x5m;=Vwsi$D5R=&I!XQYkxq#9)!^E-@Na-b?u5{}b>#8Jt_@%LBd* zjjXlNWg3&@nWs0FCroYJ8L!;3kj|7~-Rsnrh1u%-6~fXJ{2vB!RC`U7?;d36a2mrn zG7c-sdqIOM!G?8nxD75z#?Glh4)6MEd%Y$m19z44Hx*nC{LxRs<mLs0cUWksN2vU( zFVb>ujKcvM<F@;a?jYXKcxO8!NA74$563+{45qVYjrq07#5vL7$;3N1)o>yR(MDE6 zpi$e;;p|mKntz#kF+?W3apOC;O+lmV^3a~e3Ex-dg0_swjPRXIz<7zmg1fvCpm{8% zO{WH&c{}DU_aO}>cR20+%IOnKt0YM%6f?U;?T}jA7HIZ{K6shK5Nt!C*9bzo0_{++ z_mc-`9s2cs`)sBhRg`Nl6YC|2#>xygD@YqGqo2*fMyEy6$r)Ccu_==fprqv_8Dk)r z4daItj6ranP^~U*h&42aeZ)#kcbhe?oJ;=#rwPnVyz}no{lj%;i5dG^<<GrNz{j2B z=-EywxZj@;D&`g^*D3y9u;R}&I*i0WHU;oZ3!5)unD%r;CI)4y*T-yN5@Pj}5W~+P zQq~S-g=Z&Y`^1p7@TyuE+gQ4NnYHzBQF~31Qac@pXy#*!R-L=@_Af1!Jod^u?3CKk z0^~qss>5viPz8MF@rZR|B`c0f72H}TvaKc)Ef^=l@bM+fPD;Erp-ZzZnJuP5GoEIE zJ+JpaK;KCVb|BSeveQ`DW;QI^dNOc+Mq`eGT(KjyY*ZbB_ba;FCRCo^%HHvlQ#1P) zyw!Nxi~AhCBejgty0l*!JI)*bN~vQc_VN(D-4(2~8*^*!`~;X$gI62H<cOgx(lSt- z-EHwIiy+ovl11tdnDe*uuww5%{p6os;IA3Ur?t&u)&OBDEy@ZqEoi7mcdF+avX`vb z*6tLyx`(TC$r0RSLD1=!wNR<Xu){sU70t%e(k|Y#)S+5I^Zz~HhoW?@3r`cr&d}T3 zn;oz{Msv4-I-XBxQC{9V?J#eNG31n$ZBGXKJ2o8w;rSqw<Nf_(0Mn#W4Ufu*0YA%# zkS?~Bg%oudf7H#ORD72pY{}!VvDKndxs*i;QaacHC#EP6CBP#{BX!(~f)e`k`)cke zj~<0ZFV9XV@g_WYt<s^fu;zsmQwlVyP)3V@=H<=6#!IT}hU;Evs7j&hbSscY%m(V# z^3YAPqV3t1WjTuabP=R=pNF<>ox6cwo7k;Nil}LKe<%$KID8VCbf@CgPP;OwFjhp> z^L$f#dfOOZ>}14T)2qZP$ueFOoz`*1f{GbT%1hf&WVfRsg&A!#RnSwPvr-8L&b@!) zq7^kyd|=dCmqF<Jm{BS;T+d6_DTLXq^sl}pDyo_JjvsvHYTw!L-gykImHQa|1=dl8 z-)KgFoIl|2Ue>m#s484{j!h54li!a6m*G(wbFrOS(&qni6Hp1eSX<)%Se>(V6JA2s z5Aost{U6uceAuLgmC#+}?%8tOnOi>?Z9>3IfHk`~xd&g-oWL(EzFioseaH40ukicp zpP4$6-@P-J)|<Bul^6%e1<&uXp1jyJUA%g0PlCoYs|ho3%~WDW7<`aiFBP@#_yodI zFc2Y^PN#h|Ijt5IFbO)wv4z$H)cdBk%09iASZ*mT9+&vq8eE|%Z4KdX2yVy?G?Sng z!n`-Y{>|+oZA@5MZbqEOgm&OS<b;|FQ~uh(lQj}MiYEttkp(wpW?bR=X5S7-Y|&{0 z$0bNPl`ZCz{j34H)}0RwO%i0y@0s&(BW3=E#n82CPf`Z?YTS7<=O+-MQvNU+z9Qg0 zPRSQdAuwpNQ1B3Z^rO1u;m-K<b)^oleb7t37;h?@GBl{!@f3QyYBw+(gV6qJVeA~F zz0E~|sDq$H)m}L$@F#1gzsZxj8S#pQu5vj-^8>86WEhPN!ZWgl437<2x6k+CGuzm~ z)I24cSD`1ZsNNEOy04y7uqO2Jg%?_jb~b*~TRmHAyLQy4NI)M~pRU{xqbJsGvO)ij zIYmTu?acAfno5D?D=cE2N%2;CB6zdU%8Y;;VR4+>CtqIQ_FePN0fJ{>5I+L(mYK7B zQ4ytEvb%0uZ{6u}wrY-N5RU$vJ!<EhZdl~g1%gfFE=CJU6Uq8UC>vS!8b%rt(Ur|K zz{`=J1$A=w|F<<G8;MSg@i1ca$x{(1qnHw)-Bj)GE{>!~M^RqIO~nk+NuDJtZtnoN zH$aXn^Oma48N6#}xzqzAQ+Y5H*Ad96icy;Aq=7E$^ntjsIpRYnQaiYG#@aI!imc2{ zN17$?o;7siujWi5BxhNT|FDU1#r22w@6s-^oEzH1uDSn8&%3Q4ii}lC39r0@k#T=8 z{mBRZ<$bm6QV}V!GLsh;nVTrVw!o&i>qko3k;D*mw-87Wh8OqAhe;ndH8SWxu!h3I zpD(GA`5UPgxa7|uwdvTI+CZr{i?6l@ZNn$?qgER=!GPIZN~JNN7<-WKY-Grz&Zx}R zm;cvw4kx5$4v!`?ixp#IkqCrf$C}b_5$&JluZcD7to-ez3g;Ur{Sm|dx<cgC#gx8_ zPHl6J-IX!?hz#yKu(qP<W|k9QH^4e6(K_Q%^01o=d7BCC<nIr_$vmCELu@(Q(K(NU z>Nlo1N%=;q!<=QOJ?ddIIo0>Q6Lyd3qh0IhAab9@CXToNqic+FmRht7h?W90T>!rU zT5<c~5>{LCmyTjH^(uDyy`**r8>|%SV9eL^g!Bg{$kFF(=RonlroU{B+v}>ZB5+E5 zJ-EzO<-8oe;PUOp9k+8`?D8>`+p~3ogx4pijsu()$_H7>^;K_lS;<<=LE+DQpn!Y; z`f2(pn^}$ISH4W%ACU_7N9gYIXgCBrUs@b`bz1B9-L4hO?#P;+OOW;I@*{B}{!x8N zLFV&xeyaDUGz_X)Z-r!0vh)Sb934GEetK8>QDM=&%GH83F1n)Kpc}G?amFE94MQV` z?Hj~$aSPd<<D<Z)E=FNdoTb;NZktpDM?-P}$1}E1rc*WhpgB;6PzriID~fIGjMiAP z-K}_b(Md8=<-c7*yemoD>7e?VH@X7yM#|n$kZz?vX4v$;1zh6uV}|es<eg!Vne3B# z(F{RwITBOL8C3U*GOf^0ku5xRP5%Th4$8%YPMI!h5Hxo>kUEdDYu3i{L~27ge5gcV zd(2@+vhTEu0~6dH$$KpFhaUO*Qo7b`sZDD>cfC&NPPlQ?ME0&i<iro1{^>(gJY0Zs z&pa$rn`4WkM0LTHieTP;5+7<XkZTqkF5qk6cKuQ?4t5K9*l2aLGhLc=rCR^#;WHWE zyv_wT>ErOVkf@~JSQ`J!l}gZy$VzpltSut3wP7v*Z8ml?=U7D>clDVMT+Kb9)ZcDZ zf?cQ+9{%tD(JY9*Kd>5mgWuxRi{riSV3Aqp=Zu?H(+md@%#N_~R5&c+rgDR`>Dq<D z(vbGB=&no18liy_=SD0t5wHQmU2^-a{k@`rFo{MANl*{>Z?EJwz@2ngg_9XLA5r_O zTcGjsm&Bvdi<wUPIjN^<q;DNTm=(TPw$bwUzV_2ll}6?@k>}x}IU6g7Ajo9hA9I!p z(0l$ZW8gXZAK#TTCy3sxLXeIvoqmNg`hJYM+%Mq|QH(Puk6}J`RY*)5w*)W8U*nTW zkgvX4O?OP~bug_fegwABB@UvMrf29Y`v=f}JabUJK)nP_`DkOFP*<O?fckV1I2S@< z!xrVy{pFzENv<Zy0=041ox|o|CiH()%ZnCP^6gW<ePgg_nc%%PdTTvY>4PZ|SG#Yd zH8S^x3Y;xIi(n({;=rkP>qTb?hGx>ey=!)1vO}OcOG&8WU-`-XqxEc$PoEwRmw3;E z)!t@!&_ip}OoshB<&z_VDHJ_bL`-?eXymE&Rn!nn8qBdxU&tE-UX?1vM(9U%{m+b< zvFXn}2>%!ywQNxkv~sR;(yB#Pp=oQ*q#Ep@VhNk;L$6Zf-9CWxgid*EpO;MA<WpB{ zEFZ`SdABkwV|!Z9rcl?~(EXM(sOMLbvMu@Qm0E|wS~RF5iLol&7?s%Uo`32Wfd$_g z@k5uYVj{<X<P>@dKKq76MP%5Y$q;o5gKmA0MDaI_F$2W7d5ZfO?9j|ns+-^7m$2D@ zp6i^C@Q$Zxs)Ad@Ox6u^QZ;GK^sF3);RxeMMaobPohkc)!sF^)&{Juxon~=#)=C2g z-RWCuv3~dNOR$L1PQV9yeh-{qNf`gDm+P*H7}g(HCc-Z;eCwemO(FdZqK|FCC*`#9 zv@)pJq!pJ6YILIK*tx$b6K4<Ay~f;DtIXVEjWQdVNFL)zXs3MU66S$Dg?Wq#gIo3= zfuPJ}1s5*`^Tir2+AjJXb6x|#HH^w><tQE4Qjx_1k@B>-mo>yl4nDa(YQS^R@Z!bh zkg+%Xuz{UaO3!SB<oXBu@>cNEiVyKIK?d|Z`lmnUYR&FV%s@x%ul(>%w@DW-hQLMb zFLWUPL}Y^SUAfuM^)yK*8Qs~A#dIe!Lqs6pT`#N8$vKNM)Q?!6TD-g+UiS;70!MuI z16P~{1xByFSVKiAN3?y#m?&W<v4}`^OjTW$grP_-juOsxy-te<8~2<iqP3@h)(Os7 zStt|51Rmz9HnCf|vf;fHIN@7DGI5q;+F|H2I^T1ye`0FyRa6wR#&^AB>b_rBPCFUo zE7uM3_OFW%6@DMkEJYvOOEY1VY$HgKw+=PE8HDd@sO^D&esyVVOX8+@J{t%lU9cX? z)L#GEG{e3varbl=n*s%~6+jFE256|JVhB=3x(HNjMy5w{#H#PJWwvgSVEl6W^;~u5 zHy(bhhUEeenul((h3E|`#Pr@1hv9pt;ReTrQJ|(s<J{Qy=&QnjCphR3g{?r9Wbmjr zpxPUla}4#S7vF2_aPWhTRN?vUaFJPhKuTNliRq5)t@lcggqPEU;iKzq7SR6um3BBF z07J2d#d=$7l}aDQo9q1m@O*u|D)Vp+@4J<W1%*-Iv!+X|eh1MMXoE>Gea)nv&~BO* z{FoZW?I)e;lf+N9q5<;^Ftvpmb3o*LbS_|VK4^CbOR_&yA6uxGWTLgZmkb2v&ji8u zlcX1=EC^1k*!W_zNTx!$Wk`e8C8fd=z1g8nj%;Snh&{By)CV<R>bS;MIe|P~Ya$B! zwq-x~-j5nXtpkKv^~-H|RzrOsXgz>?JX4Uw$GKUCR!x1d%6i4jZm>C(m*SK=kiPS{ zkPh8<`&DnW_@9K^b@442+pf^q0a#@a$#WZJ$4AJcN#@ONxw_V7kAM!aM`jH8zTp|z zdY_v%@4rCJGmm)PIxd=R?S)I?+xZM_Qi@cmDJIpTq|N8=3$O4vI~mt0#a*7gxm3jx zxQbRTt$3=sgow_`J<`hr33SHgD{8EJ$xGMSrN~|7xi%*SHOUyF?7deq;aIDGbYBi4 zvJf&1DKoEJz;<eP#{{Rf&Ga1x$w|bJy}j&jzy@W943_0owJr#cy1*AI_XAwt0M1MK zW$`n13rDw{Q=sp*rZ!i*FrAqo=7Y;ORf5Pt(i%F;?1pB$P=X8%?Lhj3XHK{SK_mXU zV+=VXHJI0A>V=!X($~VF+K(kpkyx!Lt&6oBR(;*NEH9Iv%jbN(;W*5l!)zm=FZusi zItPcy+xKlZ*_(~cwr$(Cn{2x_WAo-Vx7Fr0Yce*wHrw_)&-eHK2Q$rd&*!@C^E{5n zF9wyeOLH0sDB2H}O5D)y;C!IEy7OJ<d0{USLr!_+)Z^@PdPneW+e}+p+XDyTGjWcz z5P#k)lHo#7tz(w;y#hyD;?kxZBGYpgoabTqGaWMN&UvcHyvRmLVp91Ywl<~ZgjG&v zlU*QTI5D^%J^A2cHSxUm^n6uGF8n-Y-yFb|4F24SQsP<n_geMX7m86TJVBWD&JV*> zw`#_X+Je)9HHvf+kh2P_4Ri=<nd)f9%9luHK!P*w{(MX_WcDL@Y#MrLVbwc29*8$J zWRdZ4$c*k<n6I1ONe=ezT+x3>I1EqOUi&m+3=7`T1~<nQk}JM@KD!eHe#g<B&rzU+ zW5(Y{njlLU?~&zF9JAcn+LujDnn9<PnETDWRZ30Rn+_0!FGOPWU-=XYAi^~r3lSqf z^-n)wbVCyfO4KXut;S9Ql*RMe0WcE+ZrThb!M(X4h_OG(^YT<nfw35rg4Iu+dtR}8 z{`K#~J-@R_NZmsmvJm66y=3AHnMA9c&NcuX+ZmJ7M>NjwM51<AnN4-2@-yzqs+=eL zT){_`-EAzZa#5h_Yk!Zkg21ND4W&9zS{PzccTULqq}JTsyv~ce>!_;}VD|NHQm?ym z`&aMXc88W-G(FI@mMRE&Ttd-dc*O&_bA(d;GhksN^%*GnEBgVVntx)B-M$IYa-Bw0 zr_;Gc6mK=MzVIL2N($#Ht8N#6K&>~M`O_2~e(Ug0@{PuSw6Rg~0R|L6fg|vIyQY5; zVkh)iRpWEd*?geSY@1AoSKzU6mM9O$mW|a^bq=MU1ek(_HMfeUwgu-Lzd|tr6G0@$ zd1e3poYxg-w1kECka_)uktH4HAaYq8YdMDSm^g4J?8Y=UI5X?(kdo)%R=T#>CXO+g zk7-ukG_y~O8o@}_b0;Ep1^eAy!96B9gQ;p6UBb+{CPsB{Os*YQQVM49?~sbof3I)b zXe9)4bAGs9!qLtuS*JuF64z+5az&r+(4#J7yNl+)B*~W&Q^1oU`48n{4R1U5rv!cF zkZ*(&DJ<4bW=6bfeU-y|>(Qk4Dy>jpH@Q{gL;W?a%MIQ^_6%8mkeO$w)){_AlZf_W zNnMza{qUCLV5#KWyCGzq|G8^bAINdxAOTj$SJxb3(A6#pw`_gdd0SfR!V|Wv((M{n z@AMFf-xn%58i9q9VrApM-_4Lo8KX4DR%NX4CR&7v`1DmZ_q!gm3`>q=msO{9F)yn} zdja>rgacZ}p*rQ07k&=>f%hP>x1zao=se)qaAGsmqNEMj@1o)dM_@@GijtVt-)3%G z`W^tz^=yO>lR>D09`{|*Tp(tVZM|EhaF`mgp4K3dHy44GuG}lZztl<@?jBe_*z4hd z#Ti;FTHFTuKSumaUAnTaH(ipQG-r555B(3ZvZxnnIiK@%kqRmTzuD(7HpxrpF=kU! zY6~OiUC6&G>ThCF+jCL^zmv8Td9Q4<vi_PS_wu$pQ(RKq?pHVZ7p=Qj4{rt^R1RAu z$;;~k`9x{2{{<~JaWeC&Tc=$>RI6@2vNr`{Orj^bqetX<mWH`V{zoHCK(8PQ>Nvmm zN2B`AkxACDz`VmmwkTDUWo!=rl9cTJ*MXljU|!9~>#N%89a(*v^w@l9K)Fyn4lc=9 zn4e-1cSGW9nmf{$bCKdd<5t@2Kh^KcL*AHC*1G@eZ?v0cYqoDveq=2E8f>4J{oj3B z(Lv{eN!o6o$Fp<DaX=bD*X1h!-n8J`hV&*Qmwtx!>Za765%$U<amc!N;@5vn=lh)# zTe_}&Weaar)j(uh2ev&$DnXj!TNAEjOnh@Z59ePxj|AHmBGM(JkQny{uBxSGspmSL z?o;Ia(zgY~`pa%_vj;oFy+(FPSH@_znLkg$edPF$<L)ZO<0NHZy8Qs=!$GhfQ21Xj z9fXhkndGk!wV|3K#0MMso_S4ZjFgl03@hrD{w<%+UOon3#I*jow6;~?4I1|@O42<1 z8ks7(qn(Z9@D+m{FP6B$;%=;7ON=&v=p}FNk3gH<RT?6`&&|OJhi3Uq(3&)X9n4R+ zPgfsn#}x2=UkdMB$Bq7f`!|!pX8~h$&n!HI?O~`)N3t*A*Z5R`08r(nDc(^GKM%ZE ziR|X)1baMS9`tz(Lm!tr%1UDb<s8#c4gcc_WUqKxsf3b2fI3VC-hpR({VVqap3QWh ziXM=WVm!nMSVTWljO+!sFUD6H%`^x3f!#Qy0??3<_+%K#*Yg%8nL^US9~Td=7Nszj zo$_~B<9LfLAWgrONSe$$d9Vk@{|w9>ZoM}R(yVU=mV&(pS|6eMe;F}(R`o{}3G$&3 zRjyhO>t$q8{qtpkgq29A06bHD`B2b$vBrmtUZWvHua%UI9Kw`2UJ1<`$EtJCS)W@f z)At)h5yo@=_Q#4`w<dro*oR{g$NG(FGh}X_HPUa)#Oc<qTCh2XtY!lmB8?@VcZdI3 zQ415Cn?{nGb)O}YngM(8`n{$$VePjCE#*ZM^yJFogMoX>21Pk{3Go^fK%yu?aDVwL z8<oX1(cS66qYaLfJfycTinmBp=rbkK*j6oOmfT>L9Q~^n#${IgH~SgPHhtoVR&rx} z?T9wsiwbyrWA$^J)?|?bTUGWDnz_c4BXExmb#X22mjH@J>zJQ+_*t-wOxLK~mN_l5 zk)XD=B)6){-c@@jcy5Rn-~ke{SsLt$N)s)C=h~99w0aqlh_A|>G=lkQ53lO3YVtoY zk0ztO#1CP+2ws7?(-!p&&H*s4`NJFsSahTaU(8cDs9LAfzI1eJ{jmPr<rrOiPB@xv zzysTlpTF#X`eFNKsgYaihPW}_$vE)b$;c|eNUB*3?iyok8tRO~Gy5kjAC?650aRc* z*W}BoEMM>jRmKuoFn__JHz7}XDd|r_=KtNN$S(N&zxhNpqE6Uz?TFmzl_h!E%bTnG zNm0s<S8=Rbgva-;nzd!(M;D|<R%st@K8aM=Vy17AVs%bbBMwQk*AF4B*MjpEt_o~^ z#%!RAH~4+^Z^RF|Dn<;}#7ydxN5;2LKUb^VN7|YDX;Bu?HR@20!)W;NIwWn@92aO} zAb#oIL7yY9w}gt4d0tM@*Z}8($ierWOpnYZt=ps0kT*-8xoRy3UHrMlSLy8OaYbPh zn|%sGLm7JLlVERsh^f4G<Q!>Onif2~UhRh3S8BSr8y<Ullba8L6#%8Mcy!%YWo5#c za?*}D7}Nfrhe6=;N!u7x7e%Q(C)7RO+Uy%`>B2LPV9v~xM=;-Q0L4mOx;Mglz^vPQ zEI8LlSX*gh!}B#52}{44hvWqFg=3=N_GP%=vw0-}eqt<2^ue&)4(&@#*5RRnA=n4q zAo_p%J+>;NyNh$W&Ad~>14f!zZW=PP7H`w4%Ij4-Y0^pkpxIc>MV&#{EfYd$c9|KE ziF&q$53}{#F8N*W3_@lZA$<z)o;epmAB$zXDE}@-LguGNvy}v7Bz#3;w+7%|d>hXC z`(r15CFGzoh&kfYZ_l*Yy$i8eg{%QBM#IWJ_)#?&q!X{}I4}8>*SUjX-#d2~0AaS= z{5J<*1*J-$XJKh5zi@T!i~UtMv+jeZ)V4jBVC-Oyy+42gNn*nNS9RSmoAZ&y4BH0l zql|ir*VstgDGJsNg#;tTQ9^0CWH4oiur3D<Y2WO}(ZCwCDpbwM;$~SH{$oqp-VH>` zRjdvj7S?zpzRP&kJjRYHq=pnPKoODI%spf~{D~Dww?c64-A1B>%n2n>PIN@t)oqy6 zb;eRgPq4#H8)Y`PEbn@r@PcRajeRrn<5#kn@to|pH=kPQgMZl=-m1^a7EZ^s=43zH zJ?#%kvB@XziNg}mI_LHSfof*yn1`-fT$!o$ERM84Un|f|*34TZa4r19tUhZD97yU1 zWAal+^0s(#xtdY3s_cAQV0sF0u>T#vZIg;A(6is6M`B(K5nx$}`4u`_d>`2x<dgM$ zy?Q4lq#pI_EF^*MgJ#k<jY)DkS~ZOtc<gZwpsL}%o<Ldu^$)*clEdr_Mp1-8KZXc4 z(3uPlJ`tRs+X=x%Sj^%IRmG9A-h}N%(&k5=`3~>pYDvaPlHV#n{g{9EUS!dQdH+eX z1Yv&Ic4SD86*8Q=wyr&t&`E4y9Yti{m{5N^!I=W7vSz;Wp*sL^756-`b{tOSH9^N% z6f*y)*CG)^v3qH+PT^qRr5WtC!RTXUdR?<M|G6w___uy5h1LC;0X%R3*l)xWEG3y= zHIz1y;1Jj=_oev^HmwQq3aNKw^mJN1g=V`=e%IGaR__s6G()ryszl;ze)r9fr9GBV zr+qHgyr+bgLlFEKt=?<h>D%l#%j75aVI)(w7AiQOsn}tkeS=XGK?D_%c}O~HeL-Bx z%45VGxL?Dc=&=#5{{Es?h?0wT`p#VzDJf;5k=#kHEDEdLTn^Q>6BcwC925QkY#24# zD%9f>9{Km%M*wI|jI@P>X43WT>w$}zB&IG)<Y^HhYIUyRs3$wgI8by?tZ1SPgHpQ) z#@}xI=L0En9Ruj|3{mwlQvgpKamEi8C|SNPcIf!wypo;3nuMOyXx=yGu+urX<}SFZ z?|LIYHGfL2p}+`{A&p`>l{Bl;S}tJb!L2$@mz{(!Qm&py^}Vmc`HsvK`ZWQB@Sg`p z6}(T#(v&*te}(zwBIB;NN<)R~k#|W*%Tnf?c)v)K*OB3yEBVxvUVK_VN`n)xJJ2Et zm_{i|@!GAyi^Q&~y1Bdtx3DKyz~@ZifBr(R{KDLodJJHBcP*^rxda8X;z_>u=sk6p z&iN6}c`X1(=+>m=EtS!?YgETSX<TdKa{Bgq)+k-NZYOkGVM{Qe&OG~%p7a};D<t}G z0L5Np%9haZw-K|Vb?HDxE1N!dAi`R*PFbKz63jgAWP7Ck|IgK}9PDF!foivF7Yv-7 z-v!dV{x&<)(MQUZ#IRJ8@p8e7tKXODgl}`kAm5mmvueJRi*cT@4(p;kh91-9HmA!~ z*F_6F&d9SSqu4Ew+ZfS3`S6SiD<_cpw2W)EZyUnZ{@8-VTPX6jr8it!{C4+dpJA$} zz{t=^lkb07=y7eAbt_)(!mvG{xZ5u2V%}GilTC5iGVs%V>WeWwi%7w}Ah1MhkuiQy zBK*HSB8aJM(4#89=pt(qEjS$NHoR%Oo1K9@ff*;7qBUEW{Tl4$%P)n2T!~7-fPc`b z#Sy#vWW>U%@JCx15;c>J%@HDG<qL=QHD`-I(>0z{(hY7i1oJi*L&bkr!h4G6nKy?u zppoY}3Yq-Qfi6)gka;yi(;C&E?nP5t`*xG+>Dw-4FC-nebg?0F`|C_a;NZb1znHd4 za~XTcLdTDeNs{}*y+BUhQ*_<ljYyC+-oLo>NY&4APS$e^)8vu`rz@U0oq_&jef5*X zlOc3q4b)L^oQr@nP9GGBU4yf@RyZ%qHl@abu|``(kwd<;(UfuA3Fk~z?o$!ZSIe5x z`KFd0<aK5;s49~K?BAR!(W2Q!_bM7hwsj}_Q4*@&K)C-S{Ij8YP?RFcn(sANliV;? zs0FFB+gp+~7D>jV2(e~-bX;n-q=Y;1Z_b^>1K0ZU8AE8h;T*ef>JF-mFv`pObf^1B zu1K#r0|^){;5hYrU$m6y+P?SNVnB1?n-aAPt}z@^i88~}v*;=$1VHPgr*eGz@z;Wa zS@&Uyj17x+T|&1tSTR#FMK%vuQZx<rJ||y>2~;<p^4=qz6i+Da>OmA^8MKsyGcL`5 zUD02T9gTD*<Nuf7b&se~tA7Ulu9?clq^ba6SnI(ZgpHb#_bsF9fd>wCJQ~o>q?oN9 z@QZzvM?XeKfGE+Kx;BsGhQ;8_859+%d!qV#dyhht5OqIV$CY&%;x;P7ip)C=$KvpV z(bq3{y#j8y5l!QFY-y0nx1OrF%0;Znr8JA6IdFdY0Z7&|tx5)#vqgu6^QP#RU=cRB z2&F9LNey$CBsX{Rc8-ipmVaT<nz=uAttWqRCuePb(-R3!$$eyCbL^S*a7I&f-t^iY z(0_6vJlUILyf(<PLNG{iwqUP_p|ryuEk>**s~UEERgk;j@f)AssGthw9-JU6S;!em z8k+vzb`OWo!nAo{cn~pRD!NzRE)7!T*W=ze;^zkQoB)re(zlqb*3B`?{t0eXRy#g} zU|BX6thY?4;y&e%kH+JV`sbN)=kLl_=hG_@k-ypw8<TfFEtcFN^uE@t{A^?=>Ieew zD}p7c9EL3oX~Xk~Vyp37zDFl=6!_%Mh?hV;P2mcHq6LMNdj0uOc|}w*It8Hqzu!c7 z<5Lb$=2zC|nyM8cC&3zczG#G8P%!CT36aXCO&-G@tV5o-pGk1zmm%j8nX$)uym@d6 z{TyTf=VPQfkD!(5h~E;7fpW@<^2cUjxlg$bJQwbohMspg`@h8{H0BnqPmnagE^Npu zDA}E60%WpZCM&?t!|Kg+g2)u(_USJ3YhN(Ix%AzKXMm+Gb|B1+O-Stb1^S0jFwX|l zM)6vpx_QF<Cdt*aFDL&826ndYHyZnA&WXpg!Mb<-KlU7^3F!DU?(H}A-&%i=V;|(? z%kSBjB?K3XOld)GZEKck<JP)x4$Y%l!Giq|G{&A&*gVBpBf(@e=uuQ!!pQ#yC0c$5 zRV{Z=jFT%rfi#^(>Zn9*?G$&f+y(qaD1UZM-cwoMMVlkKA#<3q?*iL9j9LQ*s^pxn z5JYe(wSq(4VJ?m!usYP`p?N=aYt4ok4H$^kqO>r!-&(a=4X{1QKgR<8{>Hd&9g0>T z#0@$ybKjw*Rg*Dv)r1lx@-{!RmETMtD=J51GLG9{Niysntpj_<1jupUC@DDn)`I-g zULV0ZpXY))HihPG?`I+dHhm7_^EA7Pec$?dH#hjDrUKb%=t1+fxv`jW_obF*^tV6w z)urS{9sYsszhto|g!hm3lQLLcw*S0D1VjV$|Na%M<v=r9W#Yg_Gp<QE6g%#-|Meq- zVEY$q4oPlh5Gk_JOjh1yqtp8>`{}1mJ<Po&{*Qv&J-1i-wDvOb-xK;v;G84La+7Ix z^PoAx*%+jPe*4`QTU^jIhKhXCeuGRMcPhuht<#(W2@)Lp{0BAvofk{?5c}NW+*!Mi zq3Db#(qyUOrJ`{i^A@!9EHn~>3#4#G$M-Vj+72fEyl@#pDfF=5CD^R*43Cp_qpC?& zDqqbLS!E<I!9I88>2f)TF#>*Ge*>2u<ftnpH?O;90Z5p|mRVYEwZUYgn^4l<DU3ze zyJg=!&bG{%$6X#uZ5N!`lD#LLUEz=u4(QyplI^x<qa=GT3^7Fl5PHqd@b9D}xG*L^ zr1$M)srly*RxC+}6>CYj|KYgJ%fZBt2x_8!_J|%P@vm7n3B2BN(7CjvJou2nH_b)e zhkh;JP7p(oq~IV8&M!>7`Mlng)7D#I=iG0qu33+7rSMgkg`sf`E~UkMM(D!^WmW|X zbI4|cIsZU1upZU6_4G6MN$xQB4}&xjK%El=cO-U|(cxLng(+n(0V&6}uc1We;c2RL zMBlaewS=jRDy>=I?>K&#mm@=I5d&M!H_I@zkET#+ZPIZQHu134Dnj#yH)Cu2KIR`& zHv~G&kQl@vHy4sG^yr!e$llL0&lEh{%R1k|=i*fO?<qxwkg?V>AvCYr%4MYnL&DfX zDI3vw=mI?EB{fxKV+DnW7JeIUP%ZaDkl?ra59x&h*D@39@n}JGVp%n4shj3S(fRit z6Hy8|L)*)v*;+uskk(gicnRf;W%7p`iN1&+!=G_b_EThoi#m3Ub|>Ml+>%SBQ2$Ok zun=Dp@mbv3?#rf~%k_h}xYLK!S=L{!K%Zk{N#r$cHDTafM7E}~8FE~VzsS;3DcD05 zw1L8938%?A_ZRsmSdy;!s<?|{N)?1ZN7D!Uo3f^foU_-6hc&%*>*ZqQNNbNOga5dy zDv?~^Dehqm5M6BJ{KtKmPKpA&N2h+Nx78&3yG?utO*iqeluUH*@g%p3qQd+7SYMzz zh$UQL@FM#VcE*^w{olQwY6S9T7Q|-+DsM5^!;UUn%BYCWyITKM<sShgCFL)Zt_6pc zrq%Js@Ge37YCn6KyG&gAk?KpYg?BQ`mx`*Sb=*6HZ0*e+&kq@q$~9VgR9sgvPttd4 zT8x`-tTPM`t_d~4x$K9W;es)<8@+c;WiA^Y^XIQAmt8I9sXE#n9If`!wackZ`a_5^ z1^D3O3TNbe9g@umsnQlpzH)MEders2v?R+rchJo#CzC!lbmMQDV5t@}E7VdnUE(-C zK4Ek6m}kf<9UkzR9c%vL%$7^CGpMU#_U*IhS9r|iA#d2=M@Z-9I_|+J0qXwLEh_V* zc+GlmEG4)%bO}_XnE;B|eNkcE5`0d)YF1EKn+Os(m|}wh{w}Dw>yLIEY=@5Hn^MQ* zY|t(n&D!!FJkzQ4tJ4mW$;88-<vlP`8n-MsgIPph18`Bo>zyQQ#1uwN+o$&gJDTC^ zM~wugpx1UHW^v~MbNjDLV$>NAl0g5C+XdUyX?`yT6Lx0I48$POHD4swQe)$*0fYQ% zr7-!ezvkHL;~wLbK1^Lff_G;K=L2hQe03<asd#4ES$%i7>=}zjQT_E4{=DGtqgWPi z)B?Rd8{^Q_ZX3Ov<B@cXe^rXmU<gEFv5ZcK_6B%<1N%4hBX(r|dTu>5M%+D@zG_v) zn#q&qT?={hq%`9SC(p02{EefWP?US|DWKnTzb0Yj#f!<tR<6}^Vn292=1Em#Zt_H! zNht!w+0!7^RC%{eJGGk2Tu+h)aXquzAq<(vcL{`r&3t5^*FdTMWH9{BY&I$ScfCJV zwg+R(nNj_=H<Uw8R%4?b076awq{3x&j3ixcqv>2fKEnJsDlk3aGu*wuIy8EQCU)#I z^bu>51Lp}uF%`V-+{{L~h44zhpdXq_$rjFUxj!(-@@v(zOkCl9HN<J{sFWfJ+^35l z67NHUgs9BjBmv-tPJ;QFqu}`<j)%@FXu*&LipQRiIyr#iwbq4Z@oBA+O#y48tJRuv ztWV#YOQDRT7T|`B2$C6J@Y$eMQ2pEYTN`SaEkk2rDf}74(<rJtF(v_PZ_9(ADDpEv zhC71j*#56)%8ji$!*kr2ILwj9@0@I!(MX@VFDM8y4}a2l<pb${-WVza;aMleZ5=9p zZW`fxgsttUc+p(p?POt$oJUkz$$T&ZK_A&GITZ?gb^OduyWId1aZ+cOKYYVPtXZjw z*qAPVdYD}AS2=_#EQN5)?%bOMa~Mw2aknUkqD4rPpb7rR$Bpp3i!4=lv5N7)P3R&m z+E?0R>Ncp7k$(L}zIxmlC9we^yn2fx+!mOw_(3@DftDB04E%Ql-aEz0uz3jva(#Fn z)8Qy=N#!F#p@My0RXa~rx;mEl91d-4EO}lYC!H)7vXm#*A2qVK+GDO`(!v#9%(`Yw zyu|_w(HC;yJ~>qCvljI5zPDm28pbJ)huKVUvc!+?9;4rgkG21OFCznIQ)#7oDl6OO zLmL8ifm7$xqH#_=S$(6P+Qm9?&|I2xYm;;&Cxu?*jFVot1Vn7RbiIq`UpLR5xBb1p z3HvYTA|W!&V;9mwAt6@#W<KWc%l~Qg;X#Lcre$3|#r6>AIhmHI{1^e6rlZALH^;Z! zsB1ThzIt(wBXiu*b>`*QJ$>@BWGP4fYuKehKdpV<s|tk?<~JjK&i%v7>6cVsFG0%~ zd~F6Graf*P4YlmFto>6XEo7xgup22}4-T~f+)jVE%oo_Re>MxQ9XoRCkk9njniel5 z?~8X*k|eCort0Q(7K47rDjc(u{A*P=hdbDJ#TM9(D^bnoO+tP^iX)@J(VqN|(<2Ao zmurB%a{u)e*QQgC#XU!>!>Pv6YNzEin>?fM4Cw)Jf?dm>jiGZ7*bmm9R{@V^q3mJQ z`E~Jw2#R_n<~hZ5y=z(qXEx^w&cz`-%qSSj&<nv&*wAx|3NP6Nnr$!47WzT7$}8bG zrz1t#M$_%`O(e3zWR&m}9@K3){sDlpl01*4!-tD~oA5K~&WGKoum`2klyol^J12QG zT28-v-gAPSBb3p3oYl*^Ovtoha8Jez+>>!M_#aPF71YkiFz-3(eQ&7UcTvg+!RkO= z^Zo+%e@gz3X9??slY_@*vKC(*9f`t>OGGDEdS6SFrY}<{FfiY_G)H5HJ$Xy&|HXB? z;7}tJ^3^pEdXxcA55WLlgqulJ%U%cXHzh~au=a%BhX{;;F&hymN3JOuA!pMqH}?pU z0-Kz&M^2FC3d(b#JvXd1Jr(Wiu`L$u`q-d#g$p=GCkxA{Voz26^z5_6b~W4+w7rb1 z7Wn`v=tse$Y=8>BzcNO(uMrq>waGb5@I*fcbGqaF4o7x+9!NeN;Cwc6IuI5kerQ_w zu6-BE{f>h`?<oqrK8|~wzts<l@~_*;ELr5fR-1fM$>?Bax90lHjt&+tKIaRDa`7i; z6lT9J-SX@H%48S=4du=&NX2eii^VpWUpXQ_%JVlSu}c}#Y4(L2MwW*@h~wKxD0`D- zeiQW{9?glhqt?caDEC~Xh!?+ZBl|&B+L=eF2bBfem<EAWFlRN6F2Z|h77+*y_|;xD zEOYhXY`wh{rng}Wo;S#yASFK~ReCa76v#d$LM`@bls`J`?PiX_Jvnq#f5{K=<p7yn z5*J9eoc%UO+oGjV_ruWMnvW<-+IgeJYOlsqFk%Ux1+9zKbxVO!q0Gt%Cqs-Anq5A` zbVL}xpuewPrkhJav=NDJCGv=G4ZuE6|C7(FoiwsMpQIxu5*dZg6fI?ucLXAeTA;*x z;L#hxFyv(QMS<`E6hhvCqVjvq%Oo{GwFs_Y{!VC{&@+K){P`hK@vl;*%a4T(BbJJE z_ap1)vqY0Jg?~ZH;NFx8;-C}p!SKV^>(p>k9$n_GY+I~dl&ffK3(t6d=8C-k`Xhh9 z{Sg_>;9k22WsIaFFS;0xlmkw;7BVc~j0xKZm@g%cbPISktKN<<=ObIq|GJAAK2#2K zt-320()Fqirk74l_XaTaH2%c-4q;E6{$oGny$oo5!+JB~kO))3O|Ze@%bN>$#1)3Y zN6^=PERrQg$vB@V?3zGO0CkTWro$HcXQ6BwviBC4-!wrdNv`+uQ<`AXogN^5gExdX zQszj7nO(P)3oiXNdxMS6lAir3y$m;T^A)cYV!XpJ_wRCu@!RBcPUr5=O#a@b5z|Nr zgqtso^|XcjgqX_}9REFssou?T1!c~bd6MlBo)5?-BX##ps|^kkcD`U!XNXVW&sjvC zIoiZ1Q@0PQ{F=BMnOU$wmt1GK5VV45zu<gEhh5N`w%UDWeOh2M8^0!j&U`V}&&OKa zWS+3K`iC|D6d2(9WspOJHS$;ol7>g?zxs8Wx8As8kmZoIIexa@fEF&n2&j_wSCm zs1;0U&5+I0=l1`EiSeR5SK21E)jDE*v>Mc^+zFv`FTJtibZv84wb)ys%BYI1p?R`v z#nY|CLBLd^k?bB*QiVXasu@kpQzTK!_10-s$4bD~v4YuA+HS2e@+6pJ^8x0ULBN-m z;CDpmhbqaa0nKRV9RNSHn@w8HHqI$K5o%X(`y2EBs%^hNsL{HV9xjhB%BkP|B;9-C z>nDJ;p37-NnPB?s*{djK>Cgv7NiOHsINfQfuL`P#w(GvLR$r7dzg(H8q}pls4Uhr* zc0r3Y#?nT=<rF2PB-!F~(TTIT#>mc^p|A;&P-L<g1%Ce|uV7&cN!({{l1Vd&MtXUE z9$Bt0q36%<^m}te@9S@&HpG-Mjr&xpedbn+qP|2|<_SFQ+MkY#oJ#9UZQ3}~lA>!; zpk8gbyq(*{wL*@vSymiby%yI3vW*pKWoTuO&M>g&iA3tSDAU{8R-pW){)0pSjYR!V zz(fxx-^O>=-(sDVh2|1tWq;1<M?yq^79k~f2Az6UWAlew&bffN+*HW=t+dsu4eS9m zf8TYd-KKinE9-eDBLkSz_(t)i>_rF=AEIqmet?IL{1s~0!5gWm<WY!j1LAM}@ugDl z6F!`_20(j%pYY6Q)cZr<+`$3c!SpKAUOBt)C(BdOJ^qpyWkx1VY=Fev+NA^)&4z}= zUtsY2cVYcxokD_`S37%a`kR$i*?@NeV#G=Pv`?@mZ(mi@v<c@QdF6T|IbIY&CRa7s z;|LAq>7C7T2<xD91TvOjk(V$X+l?I<dzd-y6>5zF*=Z-Cv=ejAT^=hh{v(*np1^CR zQqj#wNmFYS&_P`k<DpKS&}ZQdzvk|AKUy$Tp3HE1@t5ioI%6O^&)fm{xQ#l&5jAyo zKj}7%jhB=I&yJ1XIebLQ_P1Sc_BrZ&?jX=ev%tJ{fX$N&!r<)aU2~T@#S_^7-3Q1; zawqZ>UU>nubed8GA7b@sErNZw5d?Wn{hx$X6?Z)U^O~yt`AsYvkL%bYFa0JOraP~` zy_;T^8bJD#^{)e+1U;2vNdK~>r<6K?oEHTpp;`NN2A=mYE7EiDLW_*8;&pUJ&Gv1@ z20jfF&}BXWeB8wtiibYcv0`0zWZv7m4e`bUSb4T<)~X?I<$n^l*jFOUnMWa@;qTX! z<@1D&3v{V-^M4<n;;Ko{@^!W~?QhI^jZANIj+Qh2uMa^F=x`{|E)I5##Z_69^&y&` z9Ti7Qm!v~ikz)4^%<%U>Zfm*k%=a#kNK`8vot$NGEVI|?=)NJ3C$+*{djTqdl)DzL z0rz*0yF!m2Iy%h`<SA!c3-Cp)EcJ$&yO18EB-F%d%1eS;PD_v~M&MkpetR6{hl?)m zrn%>bGyEcmFZ%|3FOv^oac3hk_|Upc@A_k`jpu70;Uc}Y5fu)qFMt|K`DgP$Z7WHD z+{dU?Ao1m-vldfi@~Sf7nfyv%@L~7KS2aX{O<jllXk-XmptC)0G2iY0*S*mY8X>M^ zllwrt$j^%S-{Nb3pZ+Spq`SeVuj<L!0#k1ndV|6TER|PybD$lSN9ag)y}wMQN2taJ zW9QpnZO6IJKcgbjAZ3>i7zLy>YSTg6)||!c^OGLYqstC61(xqxWjf1h$r-o#l>g-q zct65BNoaB9oY;t)V;L_qyvq_EU|F4S>yGMDA)<JaHs@t01)|JXQ6u^kpn-$}7UG0B zHi6kD_^P0OC85eq0_+WG``>iO@J%ICD4d$ShZfG>kUnQ=IV}bzQ~`pV;Qa)d3Z2fj z364yGZ0@ORvy<BGi`XM!MGSUD7!8dV^XIcig4TPr>c~ttb-R+i&s2Q(mh{tY%9`?| z#UD?LY}h#^YYzzQlCSZKttIkGT~>O)Gt;z2S-2C8Un=)ovAYPF)2QSQC6$RTg_){< zp6%F>wIuwa`-h7C!9D5WJoKahS^KiKaDX&QY97|}uFNnmuSrg2HmmuP<G`rg{R@E3 z5%L1t0Zs)=z`GT}adZ90eyLL-qUmiuFs@8!*bxvsO+Z?4cZHtg?FrF>4JfaZe7X|8 zld%_4yvqwk-?@@1|GbCo(Ac)f$v;&4!zfs+C+>|qb0rA<TTRV>!c$eS!?nT|<9RA- za-+w^GejAbzxH0_^cWN5Z!-6A_@qcYsR^f#5(lcmN1wFp*VocH#oqLsS3<QURDU&0 zJyx2wRno@&C8kCaQwq5a=9|}6GO2><(#AKB_RwkwPBsh`AY3C)-D}>NX(o&oSP}CL z<YuvI60a|MO~o34o_Yok;OCbCS82n9A~ez$_EorvsQrzbT*|NvaF6W7b>>)bD|M+B zM9D35yUsmA)Lm?27ox$bKOJ7URxn0Pf1pLmv7K=D@)JUl-0lH-`tRTYi`k)g;ig%H z3xO<9vUqSgFfge<b0$1AmtGKkW$jV(<AnFs?w=Dc3NOL+Yq2{k4tvn^GEtO*h8@;S zwzEVHKKXRvNGOp@jB-Ek+ElHlUuM4Qq5u32<lx|9CE~xzC%TJZ**lr){P)+v2wQ)) z>g0mMiD+6E)7M6DKjalir5NUfU*cD7c0ms)7_?n)_CA7)49jd~0I5tPD)C0OJSumM zF_`iS)car_jvJ)VgZSV_50TV2+RE#Of0RzBU?gtj;McP4sfJ~FS7xhI;LGt#!sK=% zNbQW%6_KKBPvIKhz+@Ew>t7cTM>P7ih{IW7;i$pTg-*(Q6mjl*Nd_pxt24do`hTWN z8O<Ng>z?e&p@5aTjd>nDQ*N4P=JGYe#`4yyW#O5LNVc1etCv&~m^!?69fBSgL4}*& zFK8Y(ZsX&axVZft8Nh(k@XenKdI#{Pea3PRaY`d%!L4BcbOZQh=#avX>b8`>X3YNJ z|HJ?I2K*$*6Spl=3j<2}@h3vX#O&T|>Q*Ie(Ytz1utW);r1T>G1f;-a6v7_S(D2$d z4wxu)D}PM2e^$)~WP7}1FdH)WL%NWyMu!P(vDTMLH0ICh28L^MEGzhDY#S11T?Fw* z3)B+m+w1L`G9=#{CYHJ@2M-KA)!gj)9kzd{I<d^>N)v0AwGGVwj}PS3w8C(4Rs`xm zb%S;WfxW|C(7oB_d#Vb}rnpf9$wsVLYw6wUN?l6Z5lOv{=S5zP9GzsBd#a3SS4=P_ zOSHD)<Gi^E5?9AxSZ-y|&9eGW!EwyAKC<eblbbv=xvABfTHpfd#l1Yy%g^xMuVP{E z!BI^ry!zCQf&!&I17dxDW!O6OO51`$g|Cr{xBR9NnWCcRmPLS*G6O3WR%wa6E`%@= z3nCUpVk5?Br9n<L-;3Uo8G0E{gVfqXS0gxMQjDZc9H+l>qq&2hXH<C@Ivrmwc{sK* z9?-9qUF`iu*BFt+Dm=F$XixS|IWFV{`Ii&7Oh%$_kX$+s?4;TFOy0|HMVUKI7uo=j ztcu3wgnjNu?;-)u(#Ev3RHpmY8q$igf^?und#%PqVS3(YV68lA6f;etbprW+a};9^ zENLg1l{Y{BdJ~gp<zp;xg%jnJ%1T8WFH=Z7vsE1!HQ(ec;Ea=PFS3f2X7b<Pk@dW& z-$kgI3(PgPa&fr2bfAK+C!6#oeM#cPoN_C@N+aaE!`|1wYYEar)g~B)w9ONkc9gb? zyV3d5mtA#9ET)EWK!Y)INpLYTLr2COX1r*^h!b2-hE=5WPh@sS78P<xWO6MObf+6t zpOgV(Y6RmEX^8dr1UMB^x8|o7zMp{@;YuI#VkT_zj7utX<w{2Bpa^{-LCk@_<c3sB z6H=f30|HSoH*DwwGEq*IXI>u<?P>)&2(TdylPV90L;a4M%KQ`H<sDXtUQ<8rsg?V; z!P%E^^L5>_{<rslmpfpLK(`Ko&&5dPb}ayJK`%enW(HqrB?3vH+k0vjM4<E0LcOyU zFWX9|=k(;a-#@#?nTcgKw;sOal8=DsJW?Agu#~fv*LoZF^8iL>x&>OmU}igcbqwD_ z@zC3QwlzgOaow9%|ICD~S%~Ve5IThNyncHEd>$yna^5f;8q$wNA$z`!hFC2OSj!ro zjCBSv-!MUMw(pUy^c0R4HN`(1;S&9#)&D|Jiyh%u`%K~*VgF1yS-J^n^54Bv#2=72 z_FagGyFYo4TI<Y9yF21DAk}@GEpoT&*i~uqWX{5hu$E;ty*AHQSc;`n2`SZi(Qu=- zJO~zjKcts`A7cT;xf}{|HQT*kA3ff$fNJ85S9M!?Z`96ToLi#@f9?|@rXV%~aDM9V z#D|<A{~nHHN%6$)9xC%P9MtSU8(Et0;{WC6akiBihB>HHZ@PFn$5I*!`;G2nR*2|> z1d)cgKPV{)VbCY1f_gLxCBc2ZKa~h9*|(h4Gx<G56TFq|hrW{s;2yCDY=;g${3@YA zRjEB5`{=ySOHDHcbx7~quRzWhmKeTH+QDVJ$+i7{_#UN6YK_71TC4WL{tr9qcE=kW zjN7~wIL`DdhX-Q;7lL{%Rc$#ItVQo`{An+Lvto!B<dq#`aT-WMhIqaiwp8iB=%PC6 zJg0s=k&3pUU#sMf7b_x7lpEr~29Z7j<nsuNI3L4xM0}KQ%RnN2F~fLuu)kEuz<4oD zFY9~!0&mhqL>2x0^`_rWk-T)GLaXxiAQW5ZFKtEMNgW+6>MQur2*EXEK|16mpcTSV z*BW?Viu+g1qna3|ddU3=(7K(XWaZDm-tZPYHKe~qP)!3Hoga{e_p4D>e6pxeaY-cu z?5+JSSKpg;pT1Ct=KdBRNT}b1-_Rd6L$%8bBov*&<gteJKMzNIP1UJty4y9j&Bpp1 zD{)gvGO;079h@tmo&42jdZJf5fDZ1hQJuhYq@huHox<?894>H@1Dk&GwI^SZ%d4!- z`ZUqp$|YKDUE2FOTYYy1u?l{sXy*j0ECG4(_S;VkI@jPvVeL-Z@Y%sUQ?&g&LNsyZ zv5o{$eiizAfz~Jo%6OG*ts=q{M&+ZAOKO$=!<NgcgGkbgnrD7HSld{TVk>a!s24F~ z&6SWVm<Kh#k+e!YC=jXF&>wlx^ny#a`K_L3FwLZ;fm}K(#l##_7=<#0-YZTISN_jy zQ7z|7gN6rM6upCHS&MtB88=M-`_F0KW>51fikhLNr6%1K&C;*NEt~_Ra6s-afO?rY zAlAJ&wjG<pt+koVcC^gXS^uCpH{~CC3`(hwCr>x!<0HvJ%r`s--&&9$ISew&UN7jn z$B`ou)};DW$I_iFDF<=*)OLfbSbPTz&Y)k4WYOV^n$s^!Y-*<){%c7oS1SArRnGm| zm3+CmU9N2a=4E6MtZ2bN0t+_+5K1j~1DZ$De5)l<Di3SVi4Dz62NT!(n>*Dq1-yI) z?s*!M`j3Op*&zci^s{A+Mnk!t3GH~Q#+IigCT6*Bb$fYE6eip`3U0(1oj=i;RyVaE z>6yot(|rcPFs_ZxuiHZZs^fT;rMn-;pAf&DNRa`4xVx}%gdUB#tE;zrSa16@)nGf+ z^|k+c4|q`wJj6}AiobOz;aZ8@VbL0z2nzfbCw2Mz^q}WwDXuQrqBP&#V?(M6S^-)5 znL8zv&%S<_2_^vSkK3(;+^PduCU)ZOE;aNb)^4kj-te7=Z;s4JpYYp?AR2HLJ-3U8 zhiqH3hW+S5CRsv7$E2EJef{>ljWO?WIJ-spIQ5Faf`HE`BPkZ*F>g}*cI}hxCk|1b zLMxxQ0C4sKL0|8>;G9KfMZ=iL941i(t$D~Od`!s67o`^*&Z?!H_@|z}SJvtJG4<jP zVN^$4^~`5>w039fID;cKd!tv+T*VOp^JoYReboKiq-s<XQ-J2)>q^Yx4xK+UA9K^K z9yJWu(^Yq9aJayg$bG|QbfehMDp>2Gl-$zr51rU->GA<6!2Y{E*pW5=#v4WrX<p*V zaw90waLP*4o_Ds@68=ULd+vKhBK%y4#@6ytLkzs!MOxNj<P3-&#Lki`WywSYKEw~( z$aaMEI)BswCHcU;ADJ>!7Pulk*6K3%&zi5Uc5Oi%SU;A(h+*UJRJ?wa-79S)*(3)e zYtn;=kwD``(}BQUDq+=%HAUqn1WzO2#*YdEl_sx#OA<0t{gnnhM&BVImXG~0Mio*H zD7&u1;<&c&;WE&GbIC7zu2z4cdghYTqLy088Ioe0)O7=}@*`rQrG`tXPZmir?IXT2 zvZovg>q0NVZR81+Vc#$s^4*>^v4Jrw!le<MpP<6p00N(Fr=TQClnkBBQzIa^eWqR% z!wML#*+~z<9?K7wMm|zw?cz!xoT@n@h4<(gHyfY7w|w!HVX40Ol6K;!Bm@jh&U&`2 z;AJj$OloH{Q#ZXzwuZobT(P>|^_;NcX`Ytn;Kb?1IOGcYf8518KQ_yytcN2f7J6}^ zgGICcdM%xNcnMF3Y~!5_Fz;;@d;PIx2(dcrQ`T;A`fMUPJES|)8@9m4dye9_o}Rfi zz8Lky$`<j21k+yMn7fmDNP+gP{S4_&lFDUkIYJG<MYN*KZjY1&nvR)v9KNmm3RnU! zQXgf5m>czVgXWRp)MAB3;BqW*MJQC3Ol><0z%Vla1o1hwRi|u-{Mr&mO(5s84Axa? zF}rt8%<ztLFXS8s^){b3wZd$7Ki6k31_r`<P2JII#^6+8!C%2pbk{@UwjyjJna_YI zm$Qw9unDtZ6dyTE;T-C*Q(Ey4ZBm20nQ-Z5O{s0gq~k^>d*24F5E7ZPsaX1JHc(@C zK5zN4@F7Q&mTQ)l3(<Rrnx|nL54?x|wMEW?{d<)+O5{VBU$+tM*C~rUQwoV`b)@az z;DY4;ah;-|w7X?<`A;hb7u6Ni?dAQj7f1IO3~ZRMH($+K44o15D)Or5H~xJDIi}T3 zasBV1qeo`S{<pNhV1IqvIl~`bfz0ZqX;a+ArvnP>tT1Yh6%zA;4tV+9)?BY5=`rX= z(*A4MY5gRd#V4<sDxk1RfHp7cpc|MY_PC-Ax79N2y}$jhP=8dx=Z>^&i{6&+a!g+9 zNPg86=N<A7sc6q^)P<BQ<F4Yx$o4ol?rrX@P35N1QSB`=&|HyCNW(Vh_f`{TuXTbe z32DAzz4;PnF>;_?A0{08L@f3a1&n~E<%)g?)|b^>>Oe{t^#ALPFN6XdyeY$BXY8O~ zX)U)(;`<s3bVA5_YB=m38#fcOcWQ`ZlC_z#dAT66*hCmRou+uTs8VhS;okbF^;Rm6 zsL!N}EpXsAuU+qLta7)TY_8teC_!5Fiq!4=;vi9EUp`S26<KoD5Ed$n@N?4x!wJJU z#k7N@n@zA!%2aQKFj<^K#^4yw%7;RkV3TX3!umB^EswzQzg&9h)yiT}qIYz-rr_C~ zv{L8^v6YgkE9gbodv;{Zsh+H(1?4+uxp!UcWTO=#2avE#Mht*^?au3vy!P*ocFCYl z5YM~MO8NS9lNn~hwuV(qihfi^Zs0)hyf#tWJK*p>x~Cy~P}zSJFNf9{>hInG898}X zMje)<8njBMw|w=$RF4UUpe#_?CVAn25Hb3k;G0*U6$3k&bAQKwT$BHLT566~**4h% zmI?Fd7Z1)Saj^HD2<E0Mc|RrlU{s<}gQ&vS_`&A_69bC@BhBTbqP$a)JL=8pQDhL` z7p-C(OT$DpMwY+35he+M$LFFnhgW9`^iXnK0sF+5GS#<6w4G>1IAzS`81Qq^u~X|~ zKC4&1d7W|XLFKBuE6b<~B~xu(yHZ>i?tz?8c)d0LXp<KCuF79su&BmVy@x!3x!*uz zWq#Zbd;88n^2m4{>;n<~?#t|S?+*5Tq%421t5KU`Iy|27#-W8O_S+1%Bc@3=kBFog zx<D{gK%tKg^1vMm+ukFT4qAq1!5p<Ju1Vt)5J8dP_o=>0T~$EzpaYHIZRCW@JXQLC zMBI^~n;yf*Gyuq@mbhtIlwS#3I5PhZ#AOE@6cqIJZ`kX$nU7JZv%3mtV1Va7=0TOu zx5Ydjr?W%%NSVLxJw6+$*CUr%@17`0GhL`(mz$fuPD2wyn|f|P>Q{J9T5q<Mm6tKP z!kSvDjO^({VyYrt39x!$8f6h(y>BAp-$sZm=rTf6dVh=e|Ihz+l-l`#V!9|CS&gO4 zkDWGAE0mIW=FRR)VidyxNw<=JF{9p@Q5YXaJA~@9w=f=>u^0E+b+jWoyk8q>#rK;$ zNy!YmK$0W=A|tjfri?L)pXn7MbuVM-kDXZO|8fJ7-<jLyWv?Z{^S##>J@}8y_w1ue zO58E9zv^qLcRIM2@*Vs=*$Kc$STvm4M^lH^Z%W@33(H_7760YuuX)61T)*pT8X!iG z?e}{GPTFde3l%F##pyBkLu>8E-gn0mxwV-a(Yl6!qV7H(B+hrk&;SG+g1rkM)q?sA zc`(P)3xqknAzRo+H<w+M@WWDIYh4Y*Aoq0GkTCf+)hm{5#Fk;L3g-D<!!Fai>uoi~ z5R+eWIueu3nInWg;@B4TTe<Wuy?#Fiw}N=O5!Ie~3_re%8jdwGADQ=!27|OojpEEw zcEr@06T$a9m*9IIROuLJDVue39yo9xaUOw%;Satsi?z<1#ys*RPywqR(SGZpj6<?E zI$Wy5{|~EveMh0GbyZwFG?Y-XfluUd*wJJKXZ(R_xq$AdOvV*d?Vtp}X?gEuy<+v7 z$&=fl0hECwo!F&QxeN}Epnm#<vKw;Tvwt9PEDkqGjW159BGq|vRxIP5Df1}9;x{2~ zfy1TWXFu~H8OEk2t^6J%EY$7q0>9UFh(i4zE$Vlq?xSLpC=ARq#$Vn!Vq0J|Qw0(d z&|0-MC7=ktWkP^`#q~+L<QSZ+xs&b7>l`6HSy958w;tI`dW3inI5LYA@81_zL<C)9 z+9a-%D$eML*W4Q&i;phc_`N>=zSWu)t&BuQF75>Ho%W*UJmA*Tkj&;plE>F>5sc0$ zLHYWDjdECgtR(83kxC1y4)576hzrOpbQ~hU%7Gao@yoXYdOBEKl&6YI2mV@2cIaPh zitpI<^M@EFc<H3Z9`QlXT-?_TN$9kgm1f&2FJ+>N!gEz_p$<ls?BfZVE*~_v3OQbO z#PhKioq2^pLHfOES?txQy-=}(P)}sLSJr<Xm8VL0P{z{yarM#HV=m4RDTAz$`!)YY zo}8q1TE>BPQgj0l8E3dbrOH2c9rN9IATwb89kz>>x*bC#8r8*y8V`hNI$r;T7z6oy z9RTmydrG6^e$8a8-|!fz#9>*!glG!|#Fd!{xwr;A2ygJ$<|prB{!ya5<gTzMe?d@H z<Ms~xBg6ygWo?*wR1gQBa3eIOA($6f2lxHKBmc)(qRgQ@x=O+3{%Drejp!w`Tmr)R z=whOMfAwx@tyyh&Crm^;noIQEoJ}DKM_KlMrH1Kua)uhDF2hDv+k8xvAO|yna$0<) z6v&PQ#i*<<p_Bxvi?3&N!|nqxnlgCF1zl<{Y+H?2cZv|z;Szk&xLJE7Z5{8GSNAaq zZnC-;%Hvb(U(RBIn*qh8NM2u7e=~fAg~^t#P%%V;AI<r-s!<G}ye@W`@7`xC|GS<L zBr86HCDdBKp?>ht+pa?fvi*)zVTsh7gY`*XcSz8}b=ok#)_hY;Q(uO3N&oV@D*9HN z>#i0TR=MA-+F_A%t4SlRVCkK#e<?+vNs}7K*B4fYa%gMur)(5y)3xVj2rqiyh~_aj zaP1XzYjK@)=Oi>Yx}jKdq|Df>ObRuPh2IpEl_t3M5*lL#_P;t~sn%;MM-l06e8V3s zxLlB#?Ci6kM+?~;3D8I_f4VAQ%B%2Yx#;!WW@n~`5Spxu<mLx+3~gFO0Q}>~ajA60 z)N237J3`Be%xO@TuvbJ?&>%6UYz{LurGx8yZG9M1V{?#<m(JOU^x4u3s*ggoGQHsY z0No-LznSsOD}Nip-_z<|GzuiVtX`e>%bL4iyX#KK;Ih!e37`@_!^iRoxzVhmY?5dh zH&4jqn=$fd@&DkP!8Nx<!m8()UcQ8rT};?W;TQz>ug+#5SM=f8Ec#zAV^w$@p8?O} zAcZ{>B+|@n6{bdU+(IL*2zkWBs3|i#G@xmyoqWuD7iBfSJAYo80|jS_&Jao@;Woiz zb~~$DTW|vSp2sl#gD>~ZfGk$i{?l|jY?3@4GPF;gIBYxZcYdc@TsbRUTbj%nbd3~4 zMG*5cBC0}sD5>%nK{%TtOE7<!<!XtgdPEwH%gAhZ<oym7{+#xwY89{)yng`y&YwtD zs-t9VxAGFE#Rp2RLV5+)|3YB7u|KvYQE>dKbZfd036x8g&ORP1W~R}lBJ|<=2T_Kg zlkFWcVkFu{MUXDPuvEqU%-U+2i?Vd5u)KxhkCw#%oj#!4>%4tI?^vuQh*kPq>2b8` zE&FprWlQNzr%Ha{)FQJELiZ7RR)dZXp!#KjH}J;rKd;KJW+iA#yQOM_cIO*o6>r_U zRRp>;{y`Z{lHo#(R&}J{z&EdUFLO0TI+9Y%h9eih?rWwu=n(4b;OP=M#g$LnS{xnO zUkku+hE2iq21)R}Q4;|DE`=Tt0$cfxRO~V|-LbVU+k9HPlb~*gocMwJl8ZRXQq|?? zfCVR+eX7!*URLLeNXw80K2cA3h7tPIL96AB<;A7_<J$H826vXXyd9*<xkBD*82}Ys zvH^<@x+I4D->lTKx=LfuTUkg;6~j3!ek>B}r&1-^ANr>SAgNI6E80%{|Hslf1;*L7 zU3B8ccG94+)y8b>q_J(=p4d*~G`4Lvwr$(~r|<V4&*3u<?(5onEzVxVJHm#d8QJUZ zaPCSHYJeS^O*!ViMEbbU7lA((vgry<8KH+=TPbPEHTZ*s5Kv97jf&SRFRp48<3oWE z;02oSJBJkuXivBWDbyCKf3k!`eQpqf{VhaaXi?%uQ%5+#Fo)y`Rg|Euk&ka<j!fcN zABwwVG6in3JRh<~SaSWkb3uIUu{GyRcP>A&x?M@2*t(!maQ@rOen-<u�rNzew)D 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�F>InBkK>lH? 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,yEI?o# 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 diff --git a/requirements.txt b/requirements.txt index 42d99c8..609e640 100644 --- a/requirements.txt +++ b/requirements.txt @@ -31,4 +31,4 @@ https://github.com/explosion/spacy-models/releases/download/it_core_news_sm-2.3. https://github.com/explosion/spacy-models/releases/download/nl_core_news_sm-2.3.0/nl_core_news_sm-2.3.0.tar.gz#egg=nl_core_news_sm https://github.com/explosion/spacy-models/releases/download/xx_ent_wiki_sm-2.3.0/xx_ent_wiki_sm-2.3.0.tar.gz#egg=xx_ent_wiki_sm stop-words==2018.7.23 -stop_words==2018.7.23 \ No newline at end of file +stop_words==2018.7.23 From 1bf04e3f336b8e3df2fae73a570002eec5a320bd Mon Sep 17 00:00:00 2001 From: Citronelol <> Date: Sat, 14 Nov 2020 19:15:42 +0100 Subject: [PATCH 394/496] [Cleaning] Removing install requirements in setuppy --- setup.py | 4 ---- 1 file changed, 4 deletions(-) diff --git a/setup.py b/setup.py index 39d4c4c..33c165b 100644 --- a/setup.py +++ b/setup.py @@ -31,9 +31,6 @@ def run(self): pass -with open(Path(__file__).resolve().parent.joinpath('requirements.txt'), 'r') as fh: - requirements = [r.split('#', 1)[0].strip() for r in fh.read().split('\n')] - print(requirements) with open(Path(__file__).resolve().parent.joinpath('VERSION'), 'r') as fh: version = fh.read() @@ -50,7 +47,6 @@ def run(self): 'License :: OSI Approved :: MIT License', 'Operating System :: OS Independent', ], - install_requires=requirements, cmdclass={ 'install': PostInstallCommand, }, From ffec6463cdb7e7a4a3d897514711e17d4b200d9d Mon Sep 17 00:00:00 2001 From: Citronelol <> Date: Fri, 20 Nov 2020 11:19:40 +0100 Subject: [PATCH 395/496] [Cleaning] Keeping keyword extractor and cleaning requirements --- README.md | 4 +- nautilus_nlp/utils/keyword_extractor.py | 49 +++++++++++++++++++++++++ requirements.txt | 8 +--- 3 files changed, 53 insertions(+), 8 deletions(-) create mode 100644 nautilus_nlp/utils/keyword_extractor.py diff --git a/README.md b/README.md index a9d774a..5f6183e 100644 --- a/README.md +++ b/README.md @@ -45,9 +45,9 @@ then you can install it via pip: pip install -e . ``` -# Quick start +This library uses Spacy as tokenizer. Current models supported are `en_core_web_sm` and `fr_core_news_sm`. -The [notebook](notebooks/) folder contains various notebook on how to use this library. +# Quick start Here is a quick example: diff --git a/nautilus_nlp/utils/keyword_extractor.py b/nautilus_nlp/utils/keyword_extractor.py new file mode 100644 index 0000000..1705ea0 --- /dev/null +++ b/nautilus_nlp/utils/keyword_extractor.py @@ -0,0 +1,49 @@ +# GNU Lesser General Public License v3.0 only +# Copyright (C) 2020 Artefact +# licence-information@artefact.com +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 3 of the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public License +# along with this program; if not, write to the Free Software Foundation, +# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + +from flashtext import KeywordProcessor + + +def extract_keywords(text, keyword, case_sensitive=True): + """ + Extract Keywords from a document. + + Parameters + ---------- + text : str + Text to extract keywords from + keyword : + Single keyword (str) or list of keywords (list) + case_sensitive : + If False, will be case insensitive. + + Returns + ------- + list + Return list of extracted keyworkds + """ + + processor = KeywordProcessor(case_sensitive=case_sensitive) + if isinstance(keyword, list): + processor.add_keywords_from_list(keyword) + elif isinstance(keyword, str): + processor.add_keyword(keyword) + elif isinstance(keyword, dict): + processor.add_keywords_from_dict(keyword) + + return processor.extract_keywords(text) \ No newline at end of file diff --git a/requirements.txt b/requirements.txt index 609e640..a2082ff 100644 --- a/requirements.txt +++ b/requirements.txt @@ -12,6 +12,7 @@ sphinx_rtd_theme #library requirements chardet==3.0.4 emoji>=0.5.2 +flashtext==2.7 ftfy<5.0.0,>=4.2.0 mosestokenizer nlpaug==1.0.1 @@ -21,14 +22,9 @@ phonenumbers==8.10.12 pylint==2.4.4 regex==2019.8.19 sacremoses==0.0.13 -scikit_learn==0.20.3 +scikit_learn==0.23.2 setuptools==40.8.0 spacy==2.1.3 https://github.com/explosion/spacy-models/releases/download/fr_core_news_sm-2.3.0/fr_core_news_sm-2.3.0.tar.gz#egg=fr_core_news_sm https://github.com/explosion/spacy-models/releases/download/en_core_web_sm-2.3.1/en_core_web_sm-2.3.1.tar.gz#egg=en_core_web_sm -https://github.com/explosion/spacy-models/releases/download/de_core_news_sm-2.3.0/de_core_news_sm-2.3.0.tar.gz#egg=de_core_news_sm -https://github.com/explosion/spacy-models/releases/download/it_core_news_sm-2.3.0/it_core_news_sm-2.3.0.tar.gz#egg=it_core_news_sm -https://github.com/explosion/spacy-models/releases/download/nl_core_news_sm-2.3.0/nl_core_news_sm-2.3.0.tar.gz#egg=nl_core_news_sm -https://github.com/explosion/spacy-models/releases/download/xx_ent_wiki_sm-2.3.0/xx_ent_wiki_sm-2.3.0.tar.gz#egg=xx_ent_wiki_sm -stop-words==2018.7.23 stop_words==2018.7.23 From f310ee7cd99dbccdf9d1b7d6593a234d9edd0c6f Mon Sep 17 00:00:00 2001 From: Citronelol <> Date: Fri, 20 Nov 2020 13:56:57 +0100 Subject: [PATCH 396/496] [Remove] Remove test for removed function --- tests/test_keyword_extractor.py | 20 +------------------- 1 file changed, 1 insertion(+), 19 deletions(-) diff --git a/tests/test_keyword_extractor.py b/tests/test_keyword_extractor.py index 69a2a43..f694692 100644 --- a/tests/test_keyword_extractor.py +++ b/tests/test_keyword_extractor.py @@ -1,23 +1,5 @@ import pytest -from nautilus_nlp.analysis.keyword_extractor import get_frequent_words, extract_keywords - - -@pytest.mark.parametrize( - "input_tokens, expected, ngrams_number, number_top_words", - [ - (['I', 'eat', 'orange', 'oranges', 'at', 'orange'], [('orange', 2)], 1, 1), - (['Un', 'chat', 'rose', 'reste', 'un', 'chat', 'rose'], [('chat rose', 2)], 2, 1), - ] - ) -def test_get_frequent_words(input_tokens, expected, ngrams_number, number_top_words): - result = get_frequent_words( - input_tokens, ngrams_number=ngrams_number, number_top_words=number_top_words) - assert result == expected - - -def test_get_frequent_words_output_lenght(): - input_tokens = ['one', 'two', 'three', 'four', 'five', 'six', 'seven'] - assert len(get_frequent_words(input_tokens, number_top_words=5)) == 5 +from nautilus_nlp.utils.keyword_extractor import extract_keywords @pytest.mark.parametrize( From 059e7607d53efad191e145610aad14c3a8056af1 Mon Sep 17 00:00:00 2001 From: Citronelol <> Date: Fri, 20 Nov 2020 14:09:38 +0100 Subject: [PATCH 397/496] [Fix] Add newline for lint --- nautilus_nlp/utils/keyword_extractor.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/nautilus_nlp/utils/keyword_extractor.py b/nautilus_nlp/utils/keyword_extractor.py index 1705ea0..f804d52 100644 --- a/nautilus_nlp/utils/keyword_extractor.py +++ b/nautilus_nlp/utils/keyword_extractor.py @@ -46,4 +46,5 @@ def extract_keywords(text, keyword, case_sensitive=True): elif isinstance(keyword, dict): processor.add_keywords_from_dict(keyword) - return processor.extract_keywords(text) \ No newline at end of file + return processor.extract_keywords(text) + \ No newline at end of file From f7661b3daf526637fc72ab243c264dd075a9990f Mon Sep 17 00:00:00 2001 From: "sacha.lasry" <sacha.lasry@artefact.com> Date: Mon, 23 Nov 2020 18:37:45 +0100 Subject: [PATCH 398/496] added test coverage --- .github/workflows/ci_actions.yml | 3 ++- requirements.txt | 1 + 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/.github/workflows/ci_actions.yml b/.github/workflows/ci_actions.yml index 859f7c6..3179876 100644 --- a/.github/workflows/ci_actions.yml +++ b/.github/workflows/ci_actions.yml @@ -48,4 +48,5 @@ jobs: - name: Run pytest run: | pip install pytest - pytest tests + pip install pytest-cov + pytest --cov=nautilus_nlp tests diff --git a/requirements.txt b/requirements.txt index 00dc863..29c021b 100644 --- a/requirements.txt +++ b/requirements.txt @@ -8,6 +8,7 @@ coverage python-dotenv>=0.5.1 pillow pytest +pytest-cov #library requirements pyLDAvis==2.1.2 From 3a105ec1d64686a9b5349a2f90afbd780b02944d Mon Sep 17 00:00:00 2001 From: "sacha.lasry" <sacha.lasry@artefact.com> Date: Mon, 23 Nov 2020 18:55:48 +0100 Subject: [PATCH 399/496] fixed pytests version --- .github/workflows/ci_actions.yml | 3 --- requirements.txt | 4 ++-- 2 files changed, 2 insertions(+), 5 deletions(-) diff --git a/.github/workflows/ci_actions.yml b/.github/workflows/ci_actions.yml index 3179876..4b4ba74 100644 --- a/.github/workflows/ci_actions.yml +++ b/.github/workflows/ci_actions.yml @@ -42,11 +42,8 @@ jobs: - name: Run pylint run: | - pip install pylint pylint nautilus_nlp tests - name: Run pytest run: | - pip install pytest - pip install pytest-cov pytest --cov=nautilus_nlp tests diff --git a/requirements.txt b/requirements.txt index 29c021b..bbd8fe4 100644 --- a/requirements.txt +++ b/requirements.txt @@ -7,8 +7,8 @@ sphinx_rtd_theme coverage python-dotenv>=0.5.1 pillow -pytest -pytest-cov +pytest==6.1.1 +pytest-cov==2.10.1 #library requirements pyLDAvis==2.1.2 From 16c6865eea297ef1a26825a4895a60a4e12e1d13 Mon Sep 17 00:00:00 2001 From: "sacha.lasry" <sacha.lasry@artefact.com> Date: Tue, 24 Nov 2020 12:36:36 +0100 Subject: [PATCH 400/496] fixed conflict --- .github/workflows/ci_actions.yml | 14 -------------- 1 file changed, 14 deletions(-) diff --git a/.github/workflows/ci_actions.yml b/.github/workflows/ci_actions.yml index dd45702..4b4ba74 100644 --- a/.github/workflows/ci_actions.yml +++ b/.github/workflows/ci_actions.yml @@ -17,7 +17,6 @@ # Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. name: CI -<<<<<<< HEAD:.github/workflows/ci_actions.yml on: [push, pull_request] jobs: @@ -48,16 +47,3 @@ jobs: - name: Run pytest run: | pytest --cov=nautilus_nlp tests -======= -os: - - linux -services: - - docker -install: - - pip install -r requirements.txt - - pip install -e . -script: - - pylint nautilus_nlp/ - - pylint tests/ - - pytest tests/* ->>>>>>> dev:.travis.yml From f19daa5eee4b239b92f0bea019dbf9c07c852a1d Mon Sep 17 00:00:00 2001 From: Citronelol <> Date: Thu, 26 Nov 2020 09:53:04 +0100 Subject: [PATCH 401/496] [Init] New readme draft --- README.md | 91 ++++++++++++++++++++++++++++++------------------------- 1 file changed, 49 insertions(+), 42 deletions(-) diff --git a/README.md b/README.md index 5f6183e..68900c7 100644 --- a/README.md +++ b/README.md @@ -1,82 +1,86 @@ -Nautilus_NLP [![Build Status](https://travis-ci.com/artefactory/nautilus-nlp.svg?token=Ssg4shz5pz9qGnYCybSj&branch=master)](https://travis-ci.com/artefactory/nautilus-nlp) +Insert new lib name here ============================== -![Nautilus-NLP](/references/nautilus_nlp_logo.png) -The Nautilus NLP library aimed to be a meta-library to be used to help you get started on handling your NLP use-case. +**Insert new logo here** -This library can help you with: +Working on an NLP project and tired of always looking for the same silly preprocessing functions on the web? :tired_face: - 1. Cleaning text data - 2. Normalizing your dataset - 3. Training automatically multiclass, multilabel classifier - 4. Help you discover topics and cluster your data +:disappointed_relieved: Need to efficiently extract mail adresses in a document? Hashtags in tweets? Remove accents from a French tweet? -You can find a list of the available features [in this article.](https://artefactory.atlassian.net/wiki/spaces/CK/pages/822837299/Nautilus+NLP+-+key+features) +**Insert new lib name here** got you covered! :rocket: -# Feature Request +**Insert new lib name here** packages in a unique library all the text preprocessing functions you need to ease your NLP project. :mag: Quickly explore below our referential. -As an Artefact user, you might be working on a NLP use case, and wish to use Nautilus. +* [Replacing emails](#replace_emails) +* [Replacing phone numbers](#replace_phone_numbers) +* [Removing hashtags](#remove_hashtags) +* [Extracting emojis](#extract_emojis) + + +Cannot find a new one? Feel free to open an [issue]((https://github.com/artefactory/nautilus-nlp/issues) )). -However, if you think Nautilus is lacking features that can be useful not only to your use case but also others, feel free to to [fill up an issue](https://github.com/artefactory/nautilus-nlp/issues) with the label "Feature-request". -We will try to put it in the roadmap and implement it as soon as possible. # Installation -Beware, this package has been tested on Python **3.6** & **3.7**, and will probably not be working under python **2.7** as **Python2.7** EOL is scheduled for December 2019. +This package has been tested on Python **3.7**. To install this library you should first clone the repository: -``` +```bash git clone git@github.com:artefactory/nautilus-nlp.git && cd nautilus_nlp/ ``` -**If you don't use the docker container, we strongly advise you to do these steps in a virtual environnement** +We strongly advise you to do the remaining steps in a virtual environnement. -First you need to install the required files: +First install the required files: -``` +```bash pip install -r requirements.txt ``` -then you can install it via pip: +then install the library with pip: -``` +```bash pip install -e . ``` This library uses Spacy as tokenizer. Current models supported are `en_core_web_sm` and `fr_core_news_sm`. -# Quick start -Here is a quick example: +# Functions + +## Replacing emails <a name="replace_emails"></a> + +```python +example = "I have forwarded this email to obama@whitehouse.gov" +example = replace_emails(replace_with="*EMAIL*") +print(example) +# "I have forwarded this email to *EMAIL*" +``` + +## Replacing phone numbers <a name="replace_phone_numbers"></a> +```python +Insert example here ``` ->>> from nautilus_nlp.preprocessing.preprocess import preprocess_text ->>> from nautilus_nlp.preprocessing.tokenizer import tokenize ->>> from nautilus_nlp.preprocessing.lemmatization import lemmatize_english_tokens -[nltk_data] Downloading package wordnet to /Users/hugo/nltk_data... -[nltk_data] Package wordnet is already up-to-date! ->>> text = """Tropical Storm Nicole was a short-lived and unusually asymmetric tropical cyclone that caused extensive flooding in Jamaica during the 2010 Atlantic hurricane season.\nSource:https://en.wikipedia.org/wiki/Tropical_Storm_Nicole_(2010)""" ->>> clean_text = preprocess_text(text, lowercase=True, -... no_punct=True, -... no_numbers=True, -... no_stopwords='en', -... no_urls=True, -... replace_with='') ->>> clean_text -'tropical storm nicole short lived unusually asymmetric tropical cyclone caused extensive flooding jamaica atlantic hurricane season source' ->>> tokenized_text = tokenize(clean_text) ->>> tokenized_text -['tropical', 'storm', 'nicole', 'short', 'lived', 'unusually', 'asymmetric', 'tropical', 'cyclone', 'caused', 'extensive', 'flooding', 'jamaica', 'atlantic', 'hurricane', 'season', 'source'] ->>> lemma_text = lemmatize_english_tokens(tokenized_text) ->>> lemma_text -['tropical', 'storm', 'nicole', 'short', 'live', 'unusually', 'asymmetric', 'tropical', 'cyclone', 'cause', 'extensive', 'flooding', 'jamaica', 'atlantic', 'hurricane', 'season', 'source'] + +## Removing Hashtags <a name="remove_hashtags"></a> + +```python +Insert example here ``` +## Extracting emojis <a name="extract_emojis"></a> + +```python +Insert example here +``` # Make HTML documentation +**à updater** + In order to make the html Sphinx documentation, you need to run at the nautilus_nlp root path: `sphinx-apidoc -f nautilus_nlp -o docs/` This will generate the .rst files. @@ -84,7 +88,10 @@ You can generate the doc with `cd docs && make html` You can now open the file index.html located in the build folder. + # Project Organization + +**à updater** ------------ ├── LICENSE From e55577fbef03f65efb3c11d6ef6c1231db844274 Mon Sep 17 00:00:00 2001 From: Citronelol <> Date: Thu, 26 Nov 2020 09:57:36 +0100 Subject: [PATCH 402/496] [Fix] Cleaning draft --- README.md | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/README.md b/README.md index 68900c7..64ca8e4 100644 --- a/README.md +++ b/README.md @@ -3,13 +3,15 @@ Insert new lib name here **Insert new logo here** -Working on an NLP project and tired of always looking for the same silly preprocessing functions on the web? :tired_face: +:tired_face: Working on an NLP project and tired of always looking for the same silly preprocessing functions on the web? -:disappointed_relieved: Need to efficiently extract mail adresses in a document? Hashtags in tweets? Remove accents from a French tweet? +:disappointed_relieved: Need to efficiently extract email adresses from a document? Hashtags from tweets? Remove accents from a French post? **Insert new lib name here** got you covered! :rocket: -**Insert new lib name here** packages in a unique library all the text preprocessing functions you need to ease your NLP project. :mag: Quickly explore below our referential. +**Insert new lib name here** packages in a unique library all the text preprocessing functions you need to ease your NLP project. + +:mag: Quickly explore below our functions referential. * [Replacing emails](#replace_emails) * [Replacing phone numbers](#replace_phone_numbers) @@ -90,9 +92,8 @@ You can generate the doc with You can now open the file index.html located in the build folder. # Project Organization - -**à updater** ------------ +**à updater** ├── LICENSE ├── Makefile <- Makefile with commands like `make data` or `make train` From 80f4bcc548b3ce0985316d8f43c1322a80efc277 Mon Sep 17 00:00:00 2001 From: Rafaelle AYGALENQ <rafaelle.aygalenq@artefact.com> Date: Thu, 26 Nov 2020 15:41:19 +0100 Subject: [PATCH 403/496] add test for data augmentation --- .../preprocessing/data_augmentation.py | 8 +- tests/test_data_augmentation.py | 74 +++++++++++++++++++ 2 files changed, 78 insertions(+), 4 deletions(-) create mode 100644 tests/test_data_augmentation.py diff --git a/nautilus_nlp/preprocessing/data_augmentation.py b/nautilus_nlp/preprocessing/data_augmentation.py index d9cdccf..207593b 100644 --- a/nautilus_nlp/preprocessing/data_augmentation.py +++ b/nautilus_nlp/preprocessing/data_augmentation.py @@ -149,10 +149,10 @@ def get_augmented_entities(sentence_augmented: str, entities: list) -> list: """ entities_augmented = [] for entity in entities: - regex = r'(?:^|\W)' + re.escape(entity[0].strip()) + r'(?:$|\W)' - if (re.search(re.compile(regex), sentence_augmented)): - start_index = re.search(regex, sentence_augmented).start()+1 - end_index = re.search(regex, sentence_augmented).end()-1 + search = re.search(entity[0].strip(), sentence_augmented) + if search: + start_index = search.start() + end_index = search.end() new_entity = { 'entity': entity[1], 'word': sentence_augmented[start_index: end_index], diff --git a/tests/test_data_augmentation.py b/tests/test_data_augmentation.py new file mode 100644 index 0000000..b01eccd --- /dev/null +++ b/tests/test_data_augmentation.py @@ -0,0 +1,74 @@ +import pytest +from nautilus_nlp.preprocessing.data_augmentation import augment_text, CouldNotAugment, UnavailableAugmenter + +@pytest.mark.parametrize( + "text, method, stopwords, entities, expected", + [ + ( + "I want to buy a small black handbag.", + 'wordnet_synonym', + ['small', 'black', 'handbag'], + [ + {'entity': 'Size', 'word': 'small', 'startCharIndex': 16, 'endCharIndex': 21}, + {'entity': 'Color', 'word': 'black', 'startCharIndex': 22, 'endCharIndex': 27}, + {'entity': 'Type', 'word': 'handbag', 'startCharIndex': 28, 'endCharIndex': 35} + ], + {'type':str, 'entities':['black', 'handbag', 'small']} + ), + ( + "I want to buy a small black handbag.", + 'aug_sub_bert', + ['small', 'black', 'handbag'], + [ + {'entity': 'Size', 'word': 'small', 'startCharIndex': 16, 'endCharIndex': 21}, + {'entity': 'Color', 'word': 'black', 'startCharIndex': 22, 'endCharIndex': 27}, + {'entity': 'Type', 'word': 'handbag', 'startCharIndex': 28, 'endCharIndex': 35} + ], + {'type':str, 'entities':['black', 'handbag', 'small']} + ), + ( + "I live in New York and I am looking for a lipstick", + 'wordnet_synonym', + ['New York', 'lipstick'], + [ + {'entity': 'City', 'word': 'New York', 'startCharIndex': 10, 'endCharIndex': 18}, + {'entity': 'Type', 'word': 'bag', 'startCharIndex': 42, 'endCharIndex': 50} + ], + {'type':str, 'entities':['lipstick', 'New York']} + ), + ( + "I live in New York and I am looking for a lipstick", + 'ppdb_synonym', + ['New York', 'lipstick'], + [ + {'entity': 'City', 'word': 'New York', 'startCharIndex': 10, 'endCharIndex': 18}, + {'entity': 'Type', 'word': 'bag', 'startCharIndex': 42, 'endCharIndex': 50} + ], + {} + ), + ( + "I want to buy a small black bag", + 'aug_sub_bert', + None, + None, + {'type':str} + ) + ] + ) + +def test_data_augmentation(text, method, stopwords, entities, expected): + if method not in ['aug_sub_bert', 'wordnet_synonym']: + with pytest.raises(UnavailableAugmenter) as excinfo: + augment_text(text, method, stopwords, entities) + assert str(excinfo.value) == 'The given augmenter is not supported. You must choose one \ + of the following: wordnet_synonym or aug_sub_bert' + else: + if entities is not None: + try: + augmented_text, augmented_entities = augment_text(text, method, stopwords, entities) + augmented_entities = sorted([el['word'] for el in augmented_entities]) + assert {'type': type(augmented_text), 'entities': augmented_entities} == expected + except CouldNotAugment: + assert True + else: + assert {'type': type(augment_text(text, method, stopwords, entities))} == expected From 480af82fd186be2965660c921bc6f5adcfca7555 Mon Sep 17 00:00:00 2001 From: Rafaelle AYGALENQ <rafaelle.aygalenq@artefact.com> Date: Thu, 26 Nov 2020 15:53:47 +0100 Subject: [PATCH 404/496] update requirements for data augmentation tests --- requirements.txt | 2 ++ 1 file changed, 2 insertions(+) diff --git a/requirements.txt b/requirements.txt index a2082ff..c64b770 100644 --- a/requirements.txt +++ b/requirements.txt @@ -28,3 +28,5 @@ spacy==2.1.3 https://github.com/explosion/spacy-models/releases/download/fr_core_news_sm-2.3.0/fr_core_news_sm-2.3.0.tar.gz#egg=fr_core_news_sm https://github.com/explosion/spacy-models/releases/download/en_core_web_sm-2.3.1/en_core_web_sm-2.3.1.tar.gz#egg=en_core_web_sm stop_words==2018.7.23 +torch==1.7.0 +transformers==3.5.1 \ No newline at end of file From 2e9ad32aa5e62b6689d3a3d3cbab6149efbfbffd Mon Sep 17 00:00:00 2001 From: Rafaelle AYGALENQ <rafaelle.aygalenq@artefact.com> Date: Wed, 2 Dec 2020 15:35:49 +0100 Subject: [PATCH 405/496] refacto test data augmentation --- .../preprocessing/data_augmentation.py | 26 ++++--- tests/test_data_augmentation.py | 76 ++++++++----------- 2 files changed, 47 insertions(+), 55 deletions(-) diff --git a/nautilus_nlp/preprocessing/data_augmentation.py b/nautilus_nlp/preprocessing/data_augmentation.py index 207593b..8c9fe59 100644 --- a/nautilus_nlp/preprocessing/data_augmentation.py +++ b/nautilus_nlp/preprocessing/data_augmentation.py @@ -51,20 +51,24 @@ def augment_text( augmenter = get_augmenter(method, stopwords) augmented_text = augmenter.augment(text) if entities is not None: - formatted_entities = [( - text[entities[i]['startCharIndex']:entities[i]['endCharIndex']].strip(), - entities[i]['entity']) for i in range(len(entities))] - if are_entities_in_augmented_text(entities, augmented_text): - augmented_entities = get_augmented_entities( - augmented_text, - formatted_entities - ) - clean_entities = clean_sentence_entities(augmented_text, augmented_entities) - return augmented_text, clean_entities - raise CouldNotAugment('Text was not correctly augmented because entities were altered') + return process_entities_and_text(entities, text, augmented_text) return augmented_text +def process_entities_and_text(entities, text, augmented_text): + formatted_entities = [( + text[entities[i]['startCharIndex']:entities[i]['endCharIndex']].strip(), + entities[i]['entity']) for i in range(len(entities))] + if are_entities_in_augmented_text(entities, augmented_text): + augmented_entities = get_augmented_entities( + augmented_text, + formatted_entities + ) + clean_entities = clean_sentence_entities(augmented_text, augmented_entities) + return augmented_text, clean_entities + raise CouldNotAugment('Text was not correctly augmented because entities were altered') + + def are_entities_in_augmented_text(entities: list, augmented_text: str) -> bool: """ Given a list of entities, check if all the words associated to each entity diff --git a/tests/test_data_augmentation.py b/tests/test_data_augmentation.py index b01eccd..863087e 100644 --- a/tests/test_data_augmentation.py +++ b/tests/test_data_augmentation.py @@ -1,13 +1,13 @@ import pytest -from nautilus_nlp.preprocessing.data_augmentation import augment_text, CouldNotAugment, UnavailableAugmenter +from nautilus_nlp.preprocessing.data_augmentation import process_entities_and_text, \ + get_augmenter, CouldNotAugment, UnavailableAugmenter @pytest.mark.parametrize( - "text, method, stopwords, entities, expected", + "text, text_augmented, entities, expected", [ ( "I want to buy a small black handbag.", - 'wordnet_synonym', - ['small', 'black', 'handbag'], + "I want to acquire a small black handbag", [ {'entity': 'Size', 'word': 'small', 'startCharIndex': 16, 'endCharIndex': 21}, {'entity': 'Color', 'word': 'black', 'startCharIndex': 22, 'endCharIndex': 27}, @@ -17,8 +17,7 @@ ), ( "I want to buy a small black handbag.", - 'aug_sub_bert', - ['small', 'black', 'handbag'], + "I would like to buy a black small handbag", [ {'entity': 'Size', 'word': 'small', 'startCharIndex': 16, 'endCharIndex': 21}, {'entity': 'Color', 'word': 'black', 'startCharIndex': 22, 'endCharIndex': 27}, @@ -26,49 +25,38 @@ ], {'type':str, 'entities':['black', 'handbag', 'small']} ), + ] +) + +def test_process_entities_and_text_not_altered(text, text_augmented, entities, expected): + augmented_text, augmented_entities = process_entities_and_text(entities, text, text_augmented) + augmented_entities = sorted([el['word'] for el in augmented_entities]) + assert {'type': type(augmented_text), 'entities': augmented_entities} == expected + + +@pytest.mark.parametrize( + "text, text_augmented, entities", + [ ( "I live in New York and I am looking for a lipstick", - 'wordnet_synonym', - ['New York', 'lipstick'], - [ - {'entity': 'City', 'word': 'New York', 'startCharIndex': 10, 'endCharIndex': 18}, - {'entity': 'Type', 'word': 'bag', 'startCharIndex': 42, 'endCharIndex': 50} - ], - {'type':str, 'entities':['lipstick', 'New York']} - ), - ( - "I live in New York and I am looking for a lipstick", - 'ppdb_synonym', - ['New York', 'lipstick'], + "I live in New and York I an looking for a lipstick", [ {'entity': 'City', 'word': 'New York', 'startCharIndex': 10, 'endCharIndex': 18}, {'entity': 'Type', 'word': 'bag', 'startCharIndex': 42, 'endCharIndex': 50} - ], - {} - ), - ( - "I want to buy a small black bag", - 'aug_sub_bert', - None, - None, - {'type':str} + ] ) ] - ) +) + +def test_process_entities_and_text_altered(text, text_augmented, entities): + with pytest.raises(CouldNotAugment) as excinfo: + process_entities_and_text(entities, text, text_augmented) + assert str(excinfo.value) == 'Text was not correctly augmented because entities were altered' + -def test_data_augmentation(text, method, stopwords, entities, expected): - if method not in ['aug_sub_bert', 'wordnet_synonym']: - with pytest.raises(UnavailableAugmenter) as excinfo: - augment_text(text, method, stopwords, entities) - assert str(excinfo.value) == 'The given augmenter is not supported. You must choose one \ - of the following: wordnet_synonym or aug_sub_bert' - else: - if entities is not None: - try: - augmented_text, augmented_entities = augment_text(text, method, stopwords, entities) - augmented_entities = sorted([el['word'] for el in augmented_entities]) - assert {'type': type(augmented_text), 'entities': augmented_entities} == expected - except CouldNotAugment: - assert True - else: - assert {'type': type(augment_text(text, method, stopwords, entities))} == expected +def test_get_augmenter(): + method = 'ppdb_synonym' + with pytest.raises(UnavailableAugmenter) as excinfo: + get_augmenter(method) + assert str(excinfo.value) == 'The given augmenter is not supported. You must choose one \ + of the following: wordnet_synonym or aug_sub_bert' From 8050eb4b452bb5258e9795b89ff4b09aabadc749 Mon Sep 17 00:00:00 2001 From: Rafaelle AYGALENQ <rafaelle.aygalenq@artefact.com> Date: Thu, 3 Dec 2020 09:07:07 +0100 Subject: [PATCH 406/496] add docstring for process_entities_and_text --- .../preprocessing/data_augmentation.py | 28 ++++++++++++++++++- 1 file changed, 27 insertions(+), 1 deletion(-) diff --git a/nautilus_nlp/preprocessing/data_augmentation.py b/nautilus_nlp/preprocessing/data_augmentation.py index 8c9fe59..34b6cff 100644 --- a/nautilus_nlp/preprocessing/data_augmentation.py +++ b/nautilus_nlp/preprocessing/data_augmentation.py @@ -55,7 +55,33 @@ def augment_text( return augmented_text -def process_entities_and_text(entities, text, augmented_text): +def process_entities_and_text(entities: list, text: str, augmented_text: str): + """ + Given a list of initial entities, verify that they have not been altered by + the data augmentation operation and are still in the augmented text. + Parameters + ---------- + entities: list + entities associated to text, must be in the following format: + [ + { + 'entity': str, + 'word': str, + 'startCharIndex': int, + 'endCharIndex': int + }, + { + ... + } + ] + text: str + initial text + augmented_text: str + new text resulting of data augmentation operation + Returns + ------- + Augmented text and entities with their updated position in augmented text + """ formatted_entities = [( text[entities[i]['startCharIndex']:entities[i]['endCharIndex']].strip(), entities[i]['entity']) for i in range(len(entities))] From b83e99bc29a272701b0b1d4df24d89c8b64eda1b Mon Sep 17 00:00:00 2001 From: Rafaelle AYGALENQ <rafaelle.aygalenq@artefact.com> Date: Thu, 3 Dec 2020 17:56:28 +0100 Subject: [PATCH 407/496] remove torch and transformers from requirements --- nautilus_nlp/preprocessing/data_augmentation.py | 5 +++-- requirements.txt | 4 +--- 2 files changed, 4 insertions(+), 5 deletions(-) diff --git a/nautilus_nlp/preprocessing/data_augmentation.py b/nautilus_nlp/preprocessing/data_augmentation.py index 34b6cff..71f22f1 100644 --- a/nautilus_nlp/preprocessing/data_augmentation.py +++ b/nautilus_nlp/preprocessing/data_augmentation.py @@ -2,7 +2,6 @@ import re from itertools import combinations from typing import List, Optional, Tuple - import nlpaug.augmenter.word as naw @@ -146,7 +145,9 @@ def get_augmenter(method: str, stopwords: List[str] = None) -> naw.SynonymAug: if method == 'wordnet_synonym': return naw.SynonymAug(aug_src='wordnet', stopwords=stopwords) if method == 'aug_sub_bert': - return naw.ContextualWordEmbsAug(model_path='bert-base-uncased', action="substitute", stopwords=stopwords) + return naw.ContextualWordEmbsAug(model_path='bert-base-uncased', + action="substitute", + stopwords=stopwords) raise UnavailableAugmenter('The given augmenter is not supported. You must choose one \ of the following: wordnet_synonym or aug_sub_bert') diff --git a/requirements.txt b/requirements.txt index c64b770..d92f898 100644 --- a/requirements.txt +++ b/requirements.txt @@ -27,6 +27,4 @@ setuptools==40.8.0 spacy==2.1.3 https://github.com/explosion/spacy-models/releases/download/fr_core_news_sm-2.3.0/fr_core_news_sm-2.3.0.tar.gz#egg=fr_core_news_sm https://github.com/explosion/spacy-models/releases/download/en_core_web_sm-2.3.1/en_core_web_sm-2.3.1.tar.gz#egg=en_core_web_sm -stop_words==2018.7.23 -torch==1.7.0 -transformers==3.5.1 \ No newline at end of file +stop_words==2018.7.23 \ No newline at end of file From 88d934319d68686c7b8ecb407937e19e6e6864b3 Mon Sep 17 00:00:00 2001 From: Rafaelle AYGALENQ <rafaelle.aygalenq@artefact.com> Date: Thu, 3 Dec 2020 18:03:05 +0100 Subject: [PATCH 408/496] fix linting --- nautilus_nlp/preprocessing/data_augmentation.py | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/nautilus_nlp/preprocessing/data_augmentation.py b/nautilus_nlp/preprocessing/data_augmentation.py index 71f22f1..5ba5e89 100644 --- a/nautilus_nlp/preprocessing/data_augmentation.py +++ b/nautilus_nlp/preprocessing/data_augmentation.py @@ -145,9 +145,7 @@ def get_augmenter(method: str, stopwords: List[str] = None) -> naw.SynonymAug: if method == 'wordnet_synonym': return naw.SynonymAug(aug_src='wordnet', stopwords=stopwords) if method == 'aug_sub_bert': - return naw.ContextualWordEmbsAug(model_path='bert-base-uncased', - action="substitute", - stopwords=stopwords) + return naw.ContextualWordEmbsAug(model_path='bert-base-uncased', action="substitute", stopwords=stopwords) raise UnavailableAugmenter('The given augmenter is not supported. You must choose one \ of the following: wordnet_synonym or aug_sub_bert') From bb608e12e63b1285764422e6615d26cc1e4df914 Mon Sep 17 00:00:00 2001 From: Rafaelle AYGALENQ <rafaelle.aygalenq@artefact.com> Date: Mon, 14 Dec 2020 18:16:46 +0100 Subject: [PATCH 409/496] [FIX] fix conflicts in text_preprocess --- nautilus_nlp/preprocessing/text_preprocess.py | 411 ++---------------- 1 file changed, 30 insertions(+), 381 deletions(-) diff --git a/nautilus_nlp/preprocessing/text_preprocess.py b/nautilus_nlp/preprocessing/text_preprocess.py index 6b025ad..ef6003a 100644 --- a/nautilus_nlp/preprocessing/text_preprocess.py +++ b/nautilus_nlp/preprocessing/text_preprocess.py @@ -22,18 +22,17 @@ import re import unicodedata -from typing import Optional from ftfy import fix_text as _fix_text from nautilus_nlp.utils import constants from nautilus_nlp.utils.phone_number import \ extract_phone_numbers as _extract_phone_numbers -<<<<<<< HEAD def normalize_whitespace(text) -> str: """ - Given ``text`` str, replace one or more spacings with a single space, and one - or more linebreaks with a single newline. Also strip leading/trailing whitespace. + Given ``text`` str, replace one or more spacings with a single space, and + one or more linebreaks with a single newline. Also strip leading/trailing + whitespace. eg. " foo bar " -> "foo bar" Parameters @@ -68,7 +67,8 @@ def remove_eol_characters(text) -> str: def fix_bad_unicode(text, normalization: str = "NFC") -> str: """ - Fix unicode text that's "broken" using `ftfy <http://ftfy.readthedocs.org/>`_; + Fix unicode text that's "broken" using `ftfy + <http://ftfy.readthedocs.org/>`_; this includes mojibake, HTML entities and other code cruft, and non-standard forms for display purposes. @@ -77,8 +77,9 @@ def fix_bad_unicode(text, normalization: str = "NFC") -> str: text : string normalization ({'NFC', 'NFKC', 'NFD', 'NFKD'}): - if 'NFC', combines characters and diacritics written using separate code points, - e.g. converting "e" plus an acute accent modifier into "é"; unicode + if 'NFC', combines characters and diacritics written using separate + code points, e.g. converting "e" plus an acute accent modifier into + "é"; unicode can be converted to NFC form without any change in its meaning! if 'NFKC', additional normalizations are applied that can change the meanings of characters, e.g. ellipsis characters will be replaced @@ -93,7 +94,8 @@ def fix_bad_unicode(text, normalization: str = "NFC") -> str: def unpack_english_contractions(text) -> str: """ - Replace *English* contractions in ``text`` str with their unshortened forms. + Replace *English* contractions in ``text`` str with their unshortened + forms. N.B. The "'d" and "'s" forms are ambiguous (had/would, is/has/possessive), so are left as-is. eg. "You're fired. She's nice." -> "You are fired. She's nice." @@ -168,7 +170,7 @@ def replace_emails(text, replace_with="*EMAIL*") -> str: return text -def replace_phone_numbers(text, country_format_to_detect: list, +def replace_phone_numbers(text, country_to_detect: list, replace_with: str = "*PHONE*", method: str = "regex") -> str: """ @@ -182,8 +184,9 @@ def replace_phone_numbers(text, country_format_to_detect: list, method : ['regex','detection'] regex is faster but will omit a lot of numbers, while detection will catch every numbers, but takes a while. - country_format_to_detect : list - If a list of country code is specified, will catch every number formatted. + country_to_detect : list + If a list of country code is specified, will catch every number + formatted. Only when method = 'detection'. Returns ------- @@ -192,14 +195,16 @@ def replace_phone_numbers(text, country_format_to_detect: list, if method == 'regex': text = constants.PHONE_REGEX.sub(replace_with, text) elif method == 'detection': - found_nums = _extract_phone_numbers(text, countrylist=country_format_to_detect) + found_nums = _extract_phone_numbers(text, + countrylist=country_to_detect) # order by lenght to avoid truncated numbers to be removed first. found_nums.sort(key=len, reverse=True) for phone_number in found_nums: text = text.replace(phone_number, replace_with) else: - raise ValueError('Please input a valid method between "regex" or "detection"') + raise ValueError('Please input a valid method between "regex" or \ + "detection"') return text @@ -223,7 +228,8 @@ def replace_numbers(text, replace_with="*NUMBER*") -> str: def replace_currency_symbols(text, replace_with=None) -> str: """ - Replace all currency symbols in ``text`` str with string specified by ``replace_with`` str. + Replace all currency symbols in ``text`` str with string specified by + ``replace_with`` str. Parameters ---------- @@ -231,9 +237,9 @@ def replace_currency_symbols(text, replace_with=None) -> str: raw text replace_with : None or string if None (default), replace symbols with - their standard 3-letter abbreviations (e.g. '$' with 'USD', '£' with 'GBP'); - otherwise, pass in a string with which to replace all symbols - (e.g. "*CURRENCY*") + their standard 3-letter abbreviations (e.g. '$' with 'USD', '£' + with 'GBP'); otherwise, pass in a string with which to replace all + symbols (e.g. "*CURRENCY*") Returns ------- @@ -273,7 +279,8 @@ def remove_punct(text, marks=None) -> str: instead. The former's performance is about 5-10x faster. """ if marks: - text = re.sub("[{}]+".format(re.escape(marks)), " ", text, flags=re.UNICODE) + text = re.sub("[{}]+".format(re.escape(marks)), " ", text, + flags=re.UNICODE) else: text = text.translate(constants.PUNCT_TRANSLATE_UNICODE) return text @@ -281,8 +288,9 @@ def remove_punct(text, marks=None) -> str: def remove_accents(text, method: str = "unicode") -> str: """ - Remove accents from any accented unicode characters in ``text`` str, either by - transforming them into ascii equivalents or removing them entirely. + Remove accents from any accented unicode characters in ``text`` str, + either by transforming them into ascii equivalents or removing them + entirely. Parameters ---------- @@ -310,141 +318,6 @@ def remove_accents(text, method: str = "unicode") -> str: c for c in unicodedata.normalize("NFKD", text) if not unicodedata.combining(c) -======= -from nautilus_nlp.utils.stopwords import get_stopwords - - -class TextPreprocessor(): - - def __init__(self, text): - if isinstance(text, str): - self.text = text - else: - raise ValueError("Input must be a string") - - def clean_text(self, lang: str = 'en') -> str: - #TODO : check how to pipe operations - stopwords = get_stopwords(lang) - self.text = self.fix_bad_unicode(normalization="NFC") - self.text = self.remove_eol_characters() - self.text = self.remove_accents(method="unicode") - self.text = self.remove_punct() - self.text = self.text.lower() - self.text = self.remove_stopwords(stopwords=stopwords) - return self.normalize_whitespace() - - def remove_eol_characters(self) -> str: - """ - Remove end of line (\n) char. - - Parameters - ---------- - text : str - - Returns - ------- - str - """ - self.text = self.text.replace("\n", " ") - return self.text - - def remove_stopwords(self, stopwords: list) -> str: - """ - Remove stopwords from a text. - eg. 'I like when you move your body !' -> 'I move body !' - - Parameters - ---------- - stopwords : list - list of stopwords to remove - - Returns - ------- - str - text without stopwords - - Raises - ------ - ValueError - When inputs is not a string - """ - self.text = ' '.join([word.strip() for word in self.text.split() if word not in stopwords]) - return self.text - - def fix_bad_unicode(self, normalization: str = "NFC") -> str: - """ - Fix unicode text that's "broken" using `ftfy <http://ftfy.readthedocs.org/>`_; - this includes mojibake, HTML entities and other code cruft, - and non-standard forms for display purposes. - - Parameters - ---------- - text : string - - normalization : string {'NFC', 'NFKC', 'NFD', 'NFKD'} - if 'NFC', combines characters and diacritics written using separate code points, - e.g. converting "e" plus an acute accent modifier into "é"; unicode - can be converted to NFC form without any change in its meaning! - if 'NFKC', additional normalizations are applied that can change - the meanings of characters, e.g. ellipsis characters will be replaced - with three periods - - Returns - ------- - string - """ - self.text = _fix_text(self.text, normalization=normalization) - return self.text - - def normalize_whitespace(self) -> str: - """ - Given ``text`` str, replace one or more spacings with a single space, and one - or more linebreaks with a single newline. Also strip leading/trailing whitespace. - eg. " foo bar " -> "foo bar" - - Parameters - ---------- - text : string - - Returns - ------- - string - """ - self.text = constants.NONBREAKING_SPACE_REGEX.sub( - " ", constants.LINEBREAK_REGEX.sub(r"\n", self.text) - ).strip() - return self.text - - def unpack_english_contractions(self) -> str: - """ - Replace *English* contractions in ``text`` str with their unshortened forms. - N.B. The "'d" and "'s" forms are ambiguous (had/would, is/has/possessive), - so are left as-is. - eg. "You're fired. She's nice." -> "You are fired. She's nice." - - Parameters - ---------- - text : string - - Returns - ------- - string - """ - - # standard - self.text = constants.CONTRACTION_NT_NOT.sub( - r"\1\2 not", - self.text, - ) - self.text = constants.CONTRACTION_LL_WILL.sub( - r"\1\2 will", - self.text, - ) - self.text = constants.CONTRACTION_RE_ARE.sub(r"\1\2 are", self.text) - self.text = constants.CONTRACTION_VE_HAVE.sub( - r"\1\2 have", - self.text, ->>>>>>> feature/new-readme ) elif method == "ascii": text = ( @@ -452,9 +325,9 @@ def unpack_english_contractions(self) -> str: .encode("ascii", errors="ignore") .decode("ascii") ) -<<<<<<< HEAD else: - msg = '`method` must be either "unicode" and "ascii", not {}'.format(method) + msg = '`method` must be either "unicode" and "ascii", not {}' \ + .format(method) raise ValueError(msg) return text @@ -495,227 +368,3 @@ def filter_non_latin_characters(text) -> str: text = constants.LATIN_CHARACTERS_RE.sub(' ', text) text = normalize_whitespace(text) return text -======= - return self.text - - def replace_emails(self, replace_with: str = "*EMAIL*") -> str: - """ - Replace all emails in ``text`` str with ``replace_with`` str - - Parameters - ---------- - text : string - replace_with : string - the string you want the email address to be replaced with. - - Returns - ------- - string - """ - self.text = constants.EMAIL_REGEX.sub(replace_with, self.text) - return self.text - - def replace_phone_numbers(self, - country_format_to_detect: list, - replace_with: str = "*PHONE*", - method: str = "regex") -> str: - """ - Replace all phone numbers in ``text`` str with ``replace_with`` str - - Parameters - ---------- - text : string - replace_with : string - the string you want the phone number to be replaced with. - method : string {'regex','detection'} - regex is faster but will omit a lot of numbers, while detection will - catch every numbers, but takes a while. - country_format_to_detect : list - If a list of country code is specified, will catch every number formatted. - Only when method = 'detection'. - - Returns - ------- - string - """ - if method == 'regex': - self.text = constants.PHONE_REGEX.sub(replace_with, self.text) - elif method == 'detection': - found_nums = _extract_phone_numbers(self.text, countrylist=country_format_to_detect) - - # order by lenght to avoid truncated numbers to be removed first. - found_nums.sort(key=len, reverse=True) - for phone_number in found_nums: - self.text = self.text.replace(phone_number, replace_with) - else: - raise ValueError('Please input a valid method between "regex" or "detection"') - return self.text - - def replace_numbers(self, replace_with: str = "*NUMBER*") -> str: - """ - Replace all numbers in ``text`` str with ``replace_with`` str. - - Parameters - ---------- - text : string - replace_with : string - the string you want the number to be replaced with. - - Returns - ------- - string - """ - self.text = constants.NUMBERS_REGEX.sub(replace_with, self.text) - return self.text - - def replace_currency_symbols(self, replace_with: Optional[str] = None) -> str: - """ - Replace all currency symbols in ``text`` str with string specified by ``replace_with`` str. - - Parameters - ---------- - text : str - raw text - replace_with : str, optional - if None (default), replace symbols with their standard 3-letter abbreviations \ - (e.g. '$' with 'USD', '£' with 'GBP'); otherwise, pass in a string with \ - which to replace all symbols (e.g. "*CURRENCY*") - - Returns - ------- - string - """ - if replace_with is None: - for k, v in constants.CURRENCIES.items(): - self.text = self.text.replace(k, v) - else: - self.text = constants.CURRENCY_REGEX.sub(replace_with, self.text) - return self.text - - def remove_punct(self, marks: Optional[str] = None) -> str: - """ - Remove punctuation from ``text`` by replacing all instances of ``marks`` - with whitespace. - - Parameters - ---------- - text : str - raw text - marks : str, optional - If specified, remove only the characters in this string, - e.g. ``marks=',;:'`` removes commas, semi-colons, and colons. - Otherwise, all punctuation marks are removed. - - Returns - ------- - string - - Note - ------- - When ``marks=None``, Python's built-in :meth:`str.translate()` is - used to remove punctuation; otherwise, a regular expression is used - instead. The former's performance is about 5-10x faster. - """ - if marks: - self.text = re.sub("[{}]+".format(re.escape(marks)), " ", self.text, flags=re.UNICODE) - else: - self.text = self.text.translate(constants.PUNCT_TRANSLATE_UNICODE) - return self.text - - def remove_accents(self, method: str = "unicode") -> str: - """ - Remove accents from any accented unicode characters in ``text`` str, either by - transforming them into ascii equivalents or removing them entirely. - - Parameters - ---------- - text : str - raw text - - method : str ({'unicode', 'ascii'}) - if 'unicode', remove accented - char for any unicode symbol with a direct ASCII equivalent; if 'ascii', - remove accented char for any unicode symbol - - NB: the 'ascii' method is notably faster than 'unicode', but less good - - Returns - ------- - string - - Raises - ------- - ValueError - if ``method`` is not in {'unicode', 'ascii'} - """ - if method == "unicode": - self.text = "".join( - c - for c in unicodedata.normalize("NFKD", self.text) - if not unicodedata.combining(c) - ) - elif method == "ascii": - self.text = ( - unicodedata.normalize("NFKD", self.text) - .encode("ascii", errors="ignore") - .decode("ascii") - ) - else: - msg = '`method` must be either "unicode" and "ascii", not {}'.format(method) - raise ValueError(msg) - return self.text - - def remove_multiple_spaces_and_strip_text(self) -> str: - """ - Remove multiple spaces, strip text, and remove '-', '*' characters. - - Parameters - ---------- - text : str - the text to be processed - - Returns - ------- - string - the text with removed multiple spaces and strip text - """ - regex_remove_multiple_spaces_list = ["\\t", "[\\s\\-\\*]{2,}"] - for regex_remove_multiple_spaces in regex_remove_multiple_spaces_list: - self.text = re.sub(regex_remove_multiple_spaces, " ", self.text) - self.text = self.text.strip() - return self.text - - def filter_non_latin_characters(self) -> str: - """ - Function that filters non latin characters of a text - - Parameters - ---------- - text : str - - Returns - ------- - string - """ - self.text = constants.LATIN_CHARACTERS_RE.sub(' ', self.text) - self.text = self.normalize_whitespace() - return self.text - - def remove_smallwords(self, smallwords_threshold: int) -> list: - """ - Function that removes words which length is below a threshold - 'Hello my name is John Doe' --> 'Hello name John Doe' - - Parameters - ---------- - text : str - smallwords_threshold: int - threshold of small word - - Returns - ------- - str - """ - self.text = ' '.join([word for word in self.text.split() if len(word) > smallwords_threshold]) - return self.text ->>>>>>> feature/new-readme From 7c9aac27df821886819a380882d2699c1c8ad062 Mon Sep 17 00:00:00 2001 From: Rafaelle AYGALENQ <rafaelle.aygalenq@artefact.com> Date: Mon, 14 Dec 2020 18:21:36 +0100 Subject: [PATCH 410/496] [FIX] fix tests --- nautilus_nlp/preprocessing/preprocessor.py | 2 +- tests/test_preprocessor.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/nautilus_nlp/preprocessing/preprocessor.py b/nautilus_nlp/preprocessing/preprocessor.py index 33c8169..ad651d2 100644 --- a/nautilus_nlp/preprocessing/preprocessor.py +++ b/nautilus_nlp/preprocessing/preprocessor.py @@ -7,7 +7,7 @@ from nautilus_nlp.preprocessing import text_preprocess -class Preprocessor(object): +class Preprocessor(): def __init__( self, social_pipelines=None, text_pipelines=None): """ diff --git a/tests/test_preprocessor.py b/tests/test_preprocessor.py index 90d448c..9ce19f6 100644 --- a/tests/test_preprocessor.py +++ b/tests/test_preprocessor.py @@ -296,7 +296,7 @@ def test_replace_phone_numbers(input_str, expected_str): input_str, replace_with="*PHONE*", method="detection", - country_format_to_detect=phone.SUPPORTED_COUNTRY) + country_to_detect=phone.SUPPORTED_COUNTRY) np.testing.assert_equal(result, expected_str) From ce78c42320d1ac92c9c74b69cc1d70df188175b8 Mon Sep 17 00:00:00 2001 From: Amale EL HAMRI <amale.elhamri@artefact.com> Date: Mon, 4 Jan 2021 16:04:12 +0100 Subject: [PATCH 411/496] fix default preprocessing functions --- nautilus_nlp/preprocessing/preprocessor.py | 43 +++++++++++----------- 1 file changed, 22 insertions(+), 21 deletions(-) diff --git a/nautilus_nlp/preprocessing/preprocessor.py b/nautilus_nlp/preprocessing/preprocessor.py index ad651d2..11e0746 100644 --- a/nautilus_nlp/preprocessing/preprocessor.py +++ b/nautilus_nlp/preprocessing/preprocessor.py @@ -1,35 +1,36 @@ -from inspect import getmembers, isfunction - from sklearn.pipeline import Pipeline from sklearn.preprocessing import FunctionTransformer -from nautilus_nlp.preprocessing import social_preprocess -from nautilus_nlp.preprocessing import text_preprocess +from nautilus_nlp.preprocessing.social_preprocess import (remove_html_tags, remove_mentions, remove_emoji, + remove_hashtag) +from nautilus_nlp.preprocessing.text_preprocess import normalize_whitespace, remove_eol_characters, fix_bad_unicode class Preprocessor(): def __init__( - self, social_pipelines=None, text_pipelines=None): + self, social_functions=None, text_functions=None): """ """ - if social_pipelines is None: - self.social_pipelines = Pipeline( - steps=[(function_name, FunctionTransformer(function_callable)) - for function_name, function_callable in getmembers(social_preprocess) - if isfunction(function_callable)]) - if text_pipelines is None: - self.text_pipelines = Pipeline( - steps=[(function_name, FunctionTransformer(function_callable)) - for function_name, function_callable in getmembers(text_preprocess) - if isfunction(function_callable)]) + if social_functions is None: + social_functions = (remove_html_tags, remove_mentions, remove_emoji, remove_hashtag) + if text_functions is None: + text_functions = (remove_eol_characters, fix_bad_unicode, normalize_whitespace) + self.social_pipeline = self.build_pipeline(social_functions) + self.text_pipeline = self.build_pipeline(text_functions) + + @staticmethod + def build_pipeline(function_list): + return Pipeline( + steps=[ + (function.__name__, FunctionTransformer(function)) + for function in function_list]) - def apply_social_pipeline(self, text): - return self.social_pipelines.fit_transform(text) - def apply_text_pipeline(self, text): - return self.text_pipelines.fit_transform(text) + @staticmethod + def apply_pipeline(text, pipeline): + return pipeline.fit_transform(text) def apply_all_pipeline(self, text): - text = self.apply_social_pipeline(text) - text = self.apply_text_pipeline(text) + text = self.apply_pipeline(text, self.social_pipeline) + text = self.apply_pipeline(text, self.text_pipeline) return text From 18f693a8cec9513589fd1aa605b6cb6ef136c53c Mon Sep 17 00:00:00 2001 From: Amale EL HAMRI <amale.elhamri@artefact.com> Date: Mon, 4 Jan 2021 16:22:29 +0100 Subject: [PATCH 412/496] adding docstring to preprocessor --- nautilus_nlp/preprocessing/preprocessor.py | 46 ++++++++++++++++++++++ 1 file changed, 46 insertions(+) diff --git a/nautilus_nlp/preprocessing/preprocessor.py b/nautilus_nlp/preprocessing/preprocessor.py index 11e0746..e780f6c 100644 --- a/nautilus_nlp/preprocessing/preprocessor.py +++ b/nautilus_nlp/preprocessing/preprocessor.py @@ -10,6 +10,14 @@ class Preprocessor(): def __init__( self, social_functions=None, text_functions=None): """ + Initialize preprocessor object to apply all text transformation + + Parameters + ---------- + social_functions : iterable|None + list of functions of social preprocessing + text_functions : iterable|None + list of functions of text preprocessing """ if social_functions is None: social_functions = (remove_html_tags, remove_mentions, remove_emoji, remove_hashtag) @@ -20,6 +28,18 @@ def __init__( @staticmethod def build_pipeline(function_list): + """ + Build sklearn pipeline from a function list + + Parameters + ---------- + function_list : iterable + list of functions of preprocessing + + Returns + ------- + sklearn.pipeline.Pipeline + """ return Pipeline( steps=[ (function.__name__, FunctionTransformer(function)) @@ -28,9 +48,35 @@ def build_pipeline(function_list): @staticmethod def apply_pipeline(text, pipeline): + """ + Apply preprocessing pipeline to a text + + Parameters + ---------- + text : string + text to preprocess + pipeline : sklearn.pipeline.Pipeline + pipeline to transform the text + + Returns + ------- + string + """ return pipeline.fit_transform(text) def apply_all_pipeline(self, text): + """ + Apply social and text pipeline to text + + Parameters + ---------- + text : string + text to preprocess + + Returns + ------- + string + """ text = self.apply_pipeline(text, self.social_pipeline) text = self.apply_pipeline(text, self.text_pipeline) return text From 0c788652cf3797df1b12f1fccb8b5c66aaa51ed5 Mon Sep 17 00:00:00 2001 From: Amale EL HAMRI <amale.elhamri@artefact.com> Date: Mon, 4 Jan 2021 16:29:44 +0100 Subject: [PATCH 413/496] add type hinting --- nautilus_nlp/preprocessing/preprocessor.py | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/nautilus_nlp/preprocessing/preprocessor.py b/nautilus_nlp/preprocessing/preprocessor.py index e780f6c..f5fe9ca 100644 --- a/nautilus_nlp/preprocessing/preprocessor.py +++ b/nautilus_nlp/preprocessing/preprocessor.py @@ -1,3 +1,5 @@ +from typing import List, Callable, Optional + from sklearn.pipeline import Pipeline from sklearn.preprocessing import FunctionTransformer @@ -8,7 +10,9 @@ class Preprocessor(): def __init__( - self, social_functions=None, text_functions=None): + self, + social_functions: Optional[Callable] = None, + text_functions: Optional[Callable] = None): """ Initialize preprocessor object to apply all text transformation @@ -27,7 +31,7 @@ def __init__( self.text_pipeline = self.build_pipeline(text_functions) @staticmethod - def build_pipeline(function_list): + def build_pipeline(function_list: List[Callable]) -> Pipeline: """ Build sklearn pipeline from a function list @@ -47,7 +51,7 @@ def build_pipeline(function_list): @staticmethod - def apply_pipeline(text, pipeline): + def apply_pipeline(text: str, pipeline: Pipeline) -> str: """ Apply preprocessing pipeline to a text @@ -64,7 +68,7 @@ def apply_pipeline(text, pipeline): """ return pipeline.fit_transform(text) - def apply_all_pipeline(self, text): + def apply_all_pipeline(self, text: str) -> str: """ Apply social and text pipeline to text From df54ddd2523b9d86b5cd4bdfb4c58a46d7ee161c Mon Sep 17 00:00:00 2001 From: Amale EL HAMRI <amale.elhamri@artefact.com> Date: Mon, 4 Jan 2021 16:48:42 +0100 Subject: [PATCH 414/496] adding test for text preprocessor --- tests/test_preprocessor.py | 41 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 41 insertions(+) diff --git a/tests/test_preprocessor.py b/tests/test_preprocessor.py index 9ce19f6..e4a11a6 100644 --- a/tests/test_preprocessor.py +++ b/tests/test_preprocessor.py @@ -29,6 +29,8 @@ from nautilus_nlp.preprocessing.token_preprocess import (remove_stopwords, remove_tokens_with_nonletters, remove_special_caracters_from_tokenslist, remove_smallwords) +from nautilus_nlp.preprocessing.preprocessor import Preprocessor + import nautilus_nlp.utils.phone_number as phone from nautilus_nlp.utils.stopwords import get_stopwords @@ -385,3 +387,42 @@ def test_remove_emoji(input_str, expected_str): def test_convert_emoji_to_text(input_str, expected_str): result = convert_emoji_to_text(input_str) np.testing.assert_equal(result, expected_str) + + +@pytest.mark.parametrize( + "social_functions, text_functions", + [ + (None, None), + (None, [remove_punct]), + ([remove_emoji], None), + ([remove_emoji], [remove_punct]) + + ] +) +def test_init_preprocessor(social_functions, text_functions): + assert Preprocessor( + social_functions=social_functions, + text_functions=text_functions) + + +def test_apply_preprocessor(): + # Given + text = "Some text with @mentions and whitespaces and #hashtags" + social_functions = (remove_mentions, remove_hashtag) + text_functions = (normalize_whitespace,) + + preprocessor = Preprocessor( + social_functions=social_functions, + text_functions=text_functions) + + expected_result = text + for function in social_functions: + expected_result = function(expected_result) + for function in text_functions: + expected_result = function(expected_result) + + # When + result = preprocessor.apply_all_pipeline(text) + + # Then + assert expected_result == result From c551adfa0af0945917bbb70a38dbc137dbd0bbc7 Mon Sep 17 00:00:00 2001 From: Amale EL HAMRI <amale.elhamri@artefact.com> Date: Mon, 4 Jan 2021 16:54:43 +0100 Subject: [PATCH 415/496] remove __init__.py and .gitkeep --- nautilus_nlp/__init__.py | 17 ----------------- nautilus_nlp/data/.gitkeep | 0 2 files changed, 17 deletions(-) delete mode 100644 nautilus_nlp/__init__.py delete mode 100644 nautilus_nlp/data/.gitkeep diff --git a/nautilus_nlp/__init__.py b/nautilus_nlp/__init__.py deleted file mode 100644 index d46139b..0000000 --- a/nautilus_nlp/__init__.py +++ /dev/null @@ -1,17 +0,0 @@ -# GNU Lesser General Public License v3.0 only -# Copyright (C) 2020 Artefact -# licence-information@artefact.com -# -# This program is free software; you can redistribute it and/or -# modify it under the terms of the GNU Lesser General Public -# License as published by the Free Software Foundation; either -# version 3 of the License, or (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public License -# along with this program; if not, write to the Free Software Foundation, -# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. diff --git a/nautilus_nlp/data/.gitkeep b/nautilus_nlp/data/.gitkeep deleted file mode 100644 index e69de29..0000000 From 6f2d3a28ee4b8a7f3ede9cf916b2d0c6c380baa9 Mon Sep 17 00:00:00 2001 From: Amale EL HAMRI <amale.elhamri@artefact.com> Date: Mon, 4 Jan 2021 16:55:24 +0100 Subject: [PATCH 416/496] remove __init__.py and .gitkeep --- tests/__init__.py | 0 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 tests/__init__.py diff --git a/tests/__init__.py b/tests/__init__.py deleted file mode 100644 index e69de29..0000000 From 75fa21ebf5f3342919da75198c395dd8c2d3eea5 Mon Sep 17 00:00:00 2001 From: Amale EL HAMRI <amale.elhamri@artefact.com> Date: Mon, 4 Jan 2021 17:16:40 +0100 Subject: [PATCH 417/496] Revert "remove __init__.py and .gitkeep" This reverts commit 6f2d3a28ee4b8a7f3ede9cf916b2d0c6c380baa9. --- tests/__init__.py | 0 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 tests/__init__.py diff --git a/tests/__init__.py b/tests/__init__.py new file mode 100644 index 0000000..e69de29 From 049d8076d9818a95232c40677f431297e11b77fa Mon Sep 17 00:00:00 2001 From: Amale EL HAMRI <amale.elhamri@artefact.com> Date: Mon, 4 Jan 2021 17:16:51 +0100 Subject: [PATCH 418/496] Revert "remove __init__.py and .gitkeep" This reverts commit c551adfa0af0945917bbb70a38dbc137dbd0bbc7. --- nautilus_nlp/__init__.py | 17 +++++++++++++++++ nautilus_nlp/data/.gitkeep | 0 2 files changed, 17 insertions(+) create mode 100644 nautilus_nlp/__init__.py create mode 100644 nautilus_nlp/data/.gitkeep diff --git a/nautilus_nlp/__init__.py b/nautilus_nlp/__init__.py new file mode 100644 index 0000000..d46139b --- /dev/null +++ b/nautilus_nlp/__init__.py @@ -0,0 +1,17 @@ +# GNU Lesser General Public License v3.0 only +# Copyright (C) 2020 Artefact +# licence-information@artefact.com +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 3 of the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public License +# along with this program; if not, write to the Free Software Foundation, +# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. diff --git a/nautilus_nlp/data/.gitkeep b/nautilus_nlp/data/.gitkeep new file mode 100644 index 0000000..e69de29 From bbb5bf1a8ae08202e88a164b8fc4183666cc0401 Mon Sep 17 00:00:00 2001 From: Amale EL HAMRI <amale.elhamri@artefact.com> Date: Mon, 4 Jan 2021 17:22:08 +0100 Subject: [PATCH 419/496] adding python and pip versions --- .github/workflows/ci_actions.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.github/workflows/ci_actions.yml b/.github/workflows/ci_actions.yml index 4b4ba74..26c4afc 100644 --- a/.github/workflows/ci_actions.yml +++ b/.github/workflows/ci_actions.yml @@ -37,7 +37,9 @@ jobs: - name: Install requirements run: + python --version python -m pip install --upgrade pip + pip --version pip install -r requirements.txt - name: Run pylint From eac588aaa801a8a012700ccacfd455780a24b7fd Mon Sep 17 00:00:00 2001 From: Amale EL HAMRI <amale.elhamri@artefact.com> Date: Mon, 4 Jan 2021 17:24:15 +0100 Subject: [PATCH 420/496] upgrade to python 3.7 --- .github/workflows/ci_actions.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/ci_actions.yml b/.github/workflows/ci_actions.yml index 26c4afc..6e40787 100644 --- a/.github/workflows/ci_actions.yml +++ b/.github/workflows/ci_actions.yml @@ -25,7 +25,7 @@ jobs: runs-on: ubuntu-latest strategy: matrix: - python-version: [3.6] + python-version: [3.7] steps: - uses: actions/checkout@v2 From 104bc2afc4dcfc412d59324185bb6cb09fd13789 Mon Sep 17 00:00:00 2001 From: Amale EL HAMRI <amale.elhamri@artefact.com> Date: Mon, 4 Jan 2021 17:26:56 +0100 Subject: [PATCH 421/496] debug CI --- .github/workflows/ci_actions.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/ci_actions.yml b/.github/workflows/ci_actions.yml index 6e40787..ac71263 100644 --- a/.github/workflows/ci_actions.yml +++ b/.github/workflows/ci_actions.yml @@ -37,10 +37,10 @@ jobs: - name: Install requirements run: - python --version python -m pip install --upgrade pip pip --version pip install -r requirements.txt + echo "requirements installed" - name: Run pylint run: | From f3986f173c0c22105db30f3251e82b5461054614 Mon Sep 17 00:00:00 2001 From: Amale EL HAMRI <amale.elhamri@artefact.com> Date: Mon, 4 Jan 2021 17:27:48 +0100 Subject: [PATCH 422/496] debug CI --- .github/workflows/ci_actions.yml | 2 -- 1 file changed, 2 deletions(-) diff --git a/.github/workflows/ci_actions.yml b/.github/workflows/ci_actions.yml index ac71263..1c12c26 100644 --- a/.github/workflows/ci_actions.yml +++ b/.github/workflows/ci_actions.yml @@ -37,8 +37,6 @@ jobs: - name: Install requirements run: - python -m pip install --upgrade pip - pip --version pip install -r requirements.txt echo "requirements installed" From b6fa1c772b69f8e889521b48112f1458071a641c Mon Sep 17 00:00:00 2001 From: Amale EL HAMRI <amale.elhamri@artefact.com> Date: Mon, 4 Jan 2021 17:28:43 +0100 Subject: [PATCH 423/496] debug CI --- .github/workflows/ci_actions.yml | 1 - 1 file changed, 1 deletion(-) diff --git a/.github/workflows/ci_actions.yml b/.github/workflows/ci_actions.yml index 1c12c26..43fbcc8 100644 --- a/.github/workflows/ci_actions.yml +++ b/.github/workflows/ci_actions.yml @@ -38,7 +38,6 @@ jobs: - name: Install requirements run: pip install -r requirements.txt - echo "requirements installed" - name: Run pylint run: | From 2a4bc915093cefb4343e641cb6cdd2420445dff3 Mon Sep 17 00:00:00 2001 From: Amale EL HAMRI <amale.elhamri@artefact.com> Date: Mon, 4 Jan 2021 17:30:49 +0100 Subject: [PATCH 424/496] debug CI --- .github/workflows/ci_actions.yml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.github/workflows/ci_actions.yml b/.github/workflows/ci_actions.yml index 43fbcc8..f4b3a1c 100644 --- a/.github/workflows/ci_actions.yml +++ b/.github/workflows/ci_actions.yml @@ -36,7 +36,8 @@ jobs: python-version: ${{ matrix.python-version }} - name: Install requirements - run: + run: | + python -m pip install --upgrade pip pip install -r requirements.txt - name: Run pylint From c2a1a33c751771356670063d2308e881272356d3 Mon Sep 17 00:00:00 2001 From: Amale EL HAMRI <amale.elhamri@artefact.com> Date: Mon, 4 Jan 2021 17:32:12 +0100 Subject: [PATCH 425/496] update spacy version --- requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements.txt b/requirements.txt index 4ae5ce7..a449c8f 100644 --- a/requirements.txt +++ b/requirements.txt @@ -25,7 +25,7 @@ regex==2019.8.19 sacremoses==0.0.13 scikit_learn==0.23.2 setuptools==40.8.0 -spacy==2.1.3 +spacy==2.2.4 https://github.com/explosion/spacy-models/releases/download/fr_core_news_sm-2.3.0/fr_core_news_sm-2.3.0.tar.gz#egg=fr_core_news_sm https://github.com/explosion/spacy-models/releases/download/en_core_web_sm-2.3.1/en_core_web_sm-2.3.1.tar.gz#egg=en_core_web_sm stop_words==2018.7.23 \ No newline at end of file From 5b80c7712f77da545e3d18ca7beaba972ce11401 Mon Sep 17 00:00:00 2001 From: Amale EL HAMRI <amale.elhamri@artefact.com> Date: Mon, 4 Jan 2021 17:34:07 +0100 Subject: [PATCH 426/496] update spacy models --- requirements.txt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/requirements.txt b/requirements.txt index a449c8f..d08ae17 100644 --- a/requirements.txt +++ b/requirements.txt @@ -26,6 +26,6 @@ sacremoses==0.0.13 scikit_learn==0.23.2 setuptools==40.8.0 spacy==2.2.4 -https://github.com/explosion/spacy-models/releases/download/fr_core_news_sm-2.3.0/fr_core_news_sm-2.3.0.tar.gz#egg=fr_core_news_sm -https://github.com/explosion/spacy-models/releases/download/en_core_web_sm-2.3.1/en_core_web_sm-2.3.1.tar.gz#egg=en_core_web_sm +https://github.com/explosion/spacy-models/releases/download/en_core_web_sm-2.3.1/en_core_web_sm-2.3.1.tar.gz +https://github.com/explosion/spacy-models/releases/download/fr_core_news_sm-2.3.0/fr_core_news_sm-2.3.0.tar.gz stop_words==2018.7.23 \ No newline at end of file From bcb041ea0f5b2b6faa7fe787f6a7a90f08088f86 Mon Sep 17 00:00:00 2001 From: Amale EL HAMRI <amale.elhamri@artefact.com> Date: Mon, 4 Jan 2021 17:35:19 +0100 Subject: [PATCH 427/496] fix spacy version --- requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements.txt b/requirements.txt index d08ae17..f2cb8e3 100644 --- a/requirements.txt +++ b/requirements.txt @@ -25,7 +25,7 @@ regex==2019.8.19 sacremoses==0.0.13 scikit_learn==0.23.2 setuptools==40.8.0 -spacy==2.2.4 +spacy==2.3.4 https://github.com/explosion/spacy-models/releases/download/en_core_web_sm-2.3.1/en_core_web_sm-2.3.1.tar.gz https://github.com/explosion/spacy-models/releases/download/fr_core_news_sm-2.3.0/fr_core_news_sm-2.3.0.tar.gz stop_words==2018.7.23 \ No newline at end of file From 92a254350750b8568b6935528c2d9a16410dc177 Mon Sep 17 00:00:00 2001 From: Amale EL HAMRI <amale.elhamri@artefact.com> Date: Mon, 4 Jan 2021 17:37:36 +0100 Subject: [PATCH 428/496] fix pylint --- tests/test_preprocessor.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/test_preprocessor.py b/tests/test_preprocessor.py index e4a11a6..75adcbd 100644 --- a/tests/test_preprocessor.py +++ b/tests/test_preprocessor.py @@ -425,4 +425,4 @@ def test_apply_preprocessor(): result = preprocessor.apply_all_pipeline(text) # Then - assert expected_result == result + assert expected_result == result From 706e9ba7a8acc56daecd535c6ac610210859be2a Mon Sep 17 00:00:00 2001 From: Amale EL HAMRI <amale.elhamri@artefact.com> Date: Tue, 5 Jan 2021 10:23:57 +0100 Subject: [PATCH 429/496] adding 3.6 3.7 and 3.8 versions in CI --- .github/workflows/ci_actions.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/ci_actions.yml b/.github/workflows/ci_actions.yml index f4b3a1c..2c410da 100644 --- a/.github/workflows/ci_actions.yml +++ b/.github/workflows/ci_actions.yml @@ -25,7 +25,7 @@ jobs: runs-on: ubuntu-latest strategy: matrix: - python-version: [3.7] + python-version: [3.6, 3.7, 3.8] steps: - uses: actions/checkout@v2 From 73a97fdd5663b911f012a890da624130c52f8ba9 Mon Sep 17 00:00:00 2001 From: Amale EL HAMRI <amale.elhamri@artefact.com> Date: Tue, 5 Jan 2021 10:28:14 +0100 Subject: [PATCH 430/496] removing arg input_str --- nautilus_nlp/preprocessing/social_preprocess.py | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/nautilus_nlp/preprocessing/social_preprocess.py b/nautilus_nlp/preprocessing/social_preprocess.py index fafb584..20809a3 100644 --- a/nautilus_nlp/preprocessing/social_preprocess.py +++ b/nautilus_nlp/preprocessing/social_preprocess.py @@ -90,7 +90,7 @@ def remove_emoji(text) -> str: return text -def convert_emoji_to_text(text, code_delimiters=(':', ':'), input_str=None) -> str: +def convert_emoji_to_text(text, code_delimiters=(':', ':')) -> str: """ Convert emoji to their CLDR Short Name, according to the unicode convention http://www.unicode.org/emoji/charts/full-emoji-list.html @@ -99,16 +99,14 @@ def convert_emoji_to_text(text, code_delimiters=(':', ':'), input_str=None) -> s Parameters ---------- text : str - code_delimiters : tuple of symbols around the emoji code. - eg: (':',':') --> :grinning_face: + code_delimiters : tuple of symbols around the emoji code. + eg: (':',':') --> :grinning_face: Returns ------- str string """ - if input_str is not None: - return _emoji.demojize(input_str, delimiters=code_delimiters) return _emoji.demojize(text, delimiters=code_delimiters) @@ -127,7 +125,7 @@ def extract_emojis(text) -> list: list of all emojis converted with their unicode conventions """ emojis_in_text = constants.EMOJI_PATTERN.findall(text) - emojis_converted = [convert_emoji_to_text(text, input_str=emoji_text) for emoji_text in emojis_in_text] + emojis_converted = [convert_emoji_to_text(emoji_text) for emoji_text in emojis_in_text] return emojis_converted From a62391a20d1392ebeba177620fa6185b5c244da3 Mon Sep 17 00:00:00 2001 From: Amale EL HAMRI <amale.elhamri@artefact.com> Date: Tue, 5 Jan 2021 10:38:07 +0100 Subject: [PATCH 431/496] merigng social_functions and text_functions to functions param --- nautilus_nlp/preprocessing/preprocessor.py | 46 ++++++---------------- tests/test_preprocessor.py | 26 +++++------- 2 files changed, 22 insertions(+), 50 deletions(-) diff --git a/nautilus_nlp/preprocessing/preprocessor.py b/nautilus_nlp/preprocessing/preprocessor.py index f5fe9ca..6478914 100644 --- a/nautilus_nlp/preprocessing/preprocessor.py +++ b/nautilus_nlp/preprocessing/preprocessor.py @@ -11,24 +11,21 @@ class Preprocessor(): def __init__( self, - social_functions: Optional[Callable] = None, - text_functions: Optional[Callable] = None): + functions: Optional[Callable] = None): """ Initialize preprocessor object to apply all text transformation Parameters ---------- - social_functions : iterable|None - list of functions of social preprocessing - text_functions : iterable|None - list of functions of text preprocessing + functions : iterable|None + list of functions of preprocessing """ - if social_functions is None: - social_functions = (remove_html_tags, remove_mentions, remove_emoji, remove_hashtag) - if text_functions is None: - text_functions = (remove_eol_characters, fix_bad_unicode, normalize_whitespace) - self.social_pipeline = self.build_pipeline(social_functions) - self.text_pipeline = self.build_pipeline(text_functions) + if functions is None: + functions = (remove_html_tags, remove_mentions, remove_emoji, remove_hashtag, + remove_eol_characters, fix_bad_unicode, normalize_whitespace) + if len(functions) == 0: + raise ValueError("Cannot initialize a preprocessor with 0 function") + self.pipeline = self.build_pipeline(functions) @staticmethod def build_pipeline(function_list: List[Callable]) -> Pipeline: @@ -50,27 +47,9 @@ def build_pipeline(function_list: List[Callable]) -> Pipeline: for function in function_list]) - @staticmethod - def apply_pipeline(text: str, pipeline: Pipeline) -> str: - """ - Apply preprocessing pipeline to a text - - Parameters - ---------- - text : string - text to preprocess - pipeline : sklearn.pipeline.Pipeline - pipeline to transform the text - - Returns - ------- - string - """ - return pipeline.fit_transform(text) - - def apply_all_pipeline(self, text: str) -> str: + def apply_pipeline(self, text: str) -> str: """ - Apply social and text pipeline to text + Apply pipeline to text Parameters ---------- @@ -81,6 +60,5 @@ def apply_all_pipeline(self, text: str) -> str: ------- string """ - text = self.apply_pipeline(text, self.social_pipeline) - text = self.apply_pipeline(text, self.text_pipeline) + text = self.pipeline.fit_transform(text) return text diff --git a/tests/test_preprocessor.py b/tests/test_preprocessor.py index 75adcbd..6cba59c 100644 --- a/tests/test_preprocessor.py +++ b/tests/test_preprocessor.py @@ -390,39 +390,33 @@ def test_convert_emoji_to_text(input_str, expected_str): @pytest.mark.parametrize( - "social_functions, text_functions", + "functions", [ - (None, None), - (None, [remove_punct]), - ([remove_emoji], None), - ([remove_emoji], [remove_punct]) + (None), + ([remove_punct, remove_emoji]) ] ) -def test_init_preprocessor(social_functions, text_functions): +def test_init_preprocessor(functions): assert Preprocessor( - social_functions=social_functions, - text_functions=text_functions) + functions=functions) def test_apply_preprocessor(): # Given text = "Some text with @mentions and whitespaces and #hashtags" - social_functions = (remove_mentions, remove_hashtag) - text_functions = (normalize_whitespace,) + function_list = (remove_mentions, remove_hashtag, normalize_whitespace) preprocessor = Preprocessor( - social_functions=social_functions, - text_functions=text_functions) + functions=function_list + ) expected_result = text - for function in social_functions: - expected_result = function(expected_result) - for function in text_functions: + for function in function_list: expected_result = function(expected_result) # When - result = preprocessor.apply_all_pipeline(text) + result = preprocessor.apply_pipeline(text) # Then assert expected_result == result From b51ca14f65a0070dbd0c0218c7c5952a339b7857 Mon Sep 17 00:00:00 2001 From: Amale EL HAMRI <amale.elhamri@artefact.com> Date: Tue, 5 Jan 2021 10:41:28 +0100 Subject: [PATCH 432/496] fix pylint --- tests/test_preprocessor.py | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/tests/test_preprocessor.py b/tests/test_preprocessor.py index 6cba59c..5a11597 100644 --- a/tests/test_preprocessor.py +++ b/tests/test_preprocessor.py @@ -407,9 +407,7 @@ def test_apply_preprocessor(): text = "Some text with @mentions and whitespaces and #hashtags" function_list = (remove_mentions, remove_hashtag, normalize_whitespace) - preprocessor = Preprocessor( - functions=function_list - ) + preprocessor = Preprocessor(functions=function_list) expected_result = text for function in function_list: From 7af4cf47dc0491a397e6722fe3c029077693a720 Mon Sep 17 00:00:00 2001 From: tkumar-19088 <kumart.19088@gmail.com> Date: Wed, 13 Jan 2021 21:05:35 +0530 Subject: [PATCH 433/496] Implemented correction in Tokenizer function in nautilus_nlp/utils/tokenizer.py to enable correct loading of spacy language models --- nautilus_nlp/utils/tokenizer.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/nautilus_nlp/utils/tokenizer.py b/nautilus_nlp/utils/tokenizer.py index 5067849..8cae936 100644 --- a/nautilus_nlp/utils/tokenizer.py +++ b/nautilus_nlp/utils/tokenizer.py @@ -88,7 +88,7 @@ def tokenize(text: str, lang_module: str = 'en_spacy') -> List[str]: If lang_module is not a valid module name """ if "spacy" in lang_module: - lang = lang_module.split()[0] + lang = lang_module.split("_")[0] spacymodel = _get_spacy_tokenizer(lang) spacydoc = spacymodel(text) return [spacy_token.text for spacy_token in spacydoc] From 6f539997bb9d95ccdbd260a1433485593e7bf154 Mon Sep 17 00:00:00 2001 From: Amale EL HAMRI <amale.elhamri@artefact.com> Date: Fri, 22 Jan 2021 10:09:10 +0100 Subject: [PATCH 434/496] refacto preprocessor --- nautilus_nlp/preprocessing/preprocessor.py | 42 ++++++++++++---------- tests/test_preprocessor.py | 32 +++++++++-------- 2 files changed, 42 insertions(+), 32 deletions(-) diff --git a/nautilus_nlp/preprocessing/preprocessor.py b/nautilus_nlp/preprocessing/preprocessor.py index 6478914..8078fc2 100644 --- a/nautilus_nlp/preprocessing/preprocessor.py +++ b/nautilus_nlp/preprocessing/preprocessor.py @@ -1,4 +1,4 @@ -from typing import List, Callable, Optional +from typing import List, Callable from sklearn.pipeline import Pipeline from sklearn.preprocessing import FunctionTransformer @@ -10,32 +10,33 @@ class Preprocessor(): def __init__( - self, - functions: Optional[Callable] = None): + self): """ Initialize preprocessor object to apply all text transformation + """ + self.__operations = [] + self.pipeline = None + + def pipe(self, operation: Callable): + """ + Add an operation to pipe in the preprocessor Parameters ---------- - functions : iterable|None - list of functions of preprocessing + operation : callable + text preprocessing function """ - if functions is None: - functions = (remove_html_tags, remove_mentions, remove_emoji, remove_hashtag, - remove_eol_characters, fix_bad_unicode, normalize_whitespace) - if len(functions) == 0: - raise ValueError("Cannot initialize a preprocessor with 0 function") - self.pipeline = self.build_pipeline(functions) + self.__operations.append(operation) @staticmethod - def build_pipeline(function_list: List[Callable]) -> Pipeline: + def build_pipeline(operation_list: List[Callable]) -> Pipeline: """ - Build sklearn pipeline from a function list + Build sklearn pipeline from a operation list Parameters ---------- - function_list : iterable - list of functions of preprocessing + operation_list : iterable + list of __operations of preprocessing Returns ------- @@ -43,11 +44,11 @@ def build_pipeline(function_list: List[Callable]) -> Pipeline: """ return Pipeline( steps=[ - (function.__name__, FunctionTransformer(function)) - for function in function_list]) + (operation.__name__, FunctionTransformer(operation)) + for operation in operation_list]) - def apply_pipeline(self, text: str) -> str: + def run(self, text: str) -> str: """ Apply pipeline to text @@ -60,5 +61,10 @@ def apply_pipeline(self, text: str) -> str: ------- string """ + operations = self.__operations + if operations == []: + operations = (remove_html_tags, remove_mentions, remove_emoji, remove_hashtag, + remove_eol_characters, fix_bad_unicode, normalize_whitespace) + self.pipeline = self.build_pipeline(operations) text = self.pipeline.fit_transform(text) return text diff --git a/tests/test_preprocessor.py b/tests/test_preprocessor.py index 5a11597..e518191 100644 --- a/tests/test_preprocessor.py +++ b/tests/test_preprocessor.py @@ -389,32 +389,36 @@ def test_convert_emoji_to_text(input_str, expected_str): np.testing.assert_equal(result, expected_str) -@pytest.mark.parametrize( - "functions", - [ - (None), - ([remove_punct, remove_emoji]) +def test_custom_preprocess(): + # Given + text = "Some text with @mentions and #hashtags" - ] -) -def test_init_preprocessor(functions): - assert Preprocessor( - functions=functions) + preprocessor = Preprocessor() + preprocessor.pipe(remove_hashtag) + preprocessor.pipe(remove_mentions) + expected_result = remove_hashtag(text) + expected_result = remove_mentions(expected_result) + # When + result = preprocessor.run(text) + + # Then + assert expected_result == result def test_apply_preprocessor(): # Given text = "Some text with @mentions and whitespaces and #hashtags" - function_list = (remove_mentions, remove_hashtag, normalize_whitespace) + operations = (remove_html_tags, remove_mentions, remove_emoji, remove_hashtag, + remove_eol_characters, fix_bad_unicode, normalize_whitespace) - preprocessor = Preprocessor(functions=function_list) + preprocessor = Preprocessor() expected_result = text - for function in function_list: + for function in operations: expected_result = function(expected_result) # When - result = preprocessor.apply_pipeline(text) + result = preprocessor.run(text) # Then assert expected_result == result From ef9da2c663711ccf37069020632daca21102f4f0 Mon Sep 17 00:00:00 2001 From: Amale EL HAMRI <amale.elhamri@artefact.com> Date: Fri, 22 Jan 2021 10:29:09 +0100 Subject: [PATCH 435/496] adding Preprocessor in root __init__ --- nautilus_nlp/__init__.py | 1 + nautilus_nlp/{preprocessing => }/preprocessor.py | 0 tests/test_preprocessor.py | 2 +- 3 files changed, 2 insertions(+), 1 deletion(-) rename nautilus_nlp/{preprocessing => }/preprocessor.py (100%) diff --git a/nautilus_nlp/__init__.py b/nautilus_nlp/__init__.py index d46139b..7643ec5 100644 --- a/nautilus_nlp/__init__.py +++ b/nautilus_nlp/__init__.py @@ -15,3 +15,4 @@ # You should have received a copy of the GNU Lesser General Public License # along with this program; if not, write to the Free Software Foundation, # Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +from nautilus_nlp.preprocessor import Preprocessor diff --git a/nautilus_nlp/preprocessing/preprocessor.py b/nautilus_nlp/preprocessor.py similarity index 100% rename from nautilus_nlp/preprocessing/preprocessor.py rename to nautilus_nlp/preprocessor.py diff --git a/tests/test_preprocessor.py b/tests/test_preprocessor.py index e518191..51d94db 100644 --- a/tests/test_preprocessor.py +++ b/tests/test_preprocessor.py @@ -29,7 +29,7 @@ from nautilus_nlp.preprocessing.token_preprocess import (remove_stopwords, remove_tokens_with_nonletters, remove_special_caracters_from_tokenslist, remove_smallwords) -from nautilus_nlp.preprocessing.preprocessor import Preprocessor +from nautilus_nlp import Preprocessor import nautilus_nlp.utils.phone_number as phone from nautilus_nlp.utils.stopwords import get_stopwords From e997930908585a3519ceb274cb552e8292f4583d Mon Sep 17 00:00:00 2001 From: Rafaelle AYGALENQ <rafaelle.aygalenq@artefact.com> Date: Mon, 25 Jan 2021 20:35:05 +0100 Subject: [PATCH 436/496] reorg repo v1 --- {nautilus_nlp => config}/__init__.py | 0 {nautilus_nlp/config => config}/config.py | 35 ++++++++++ {nautilus_nlp/utils => config}/constants.py | 0 .../data => config}/country_code.json | 0 {nautilus_nlp/data => config}/french_FEEL.csv | 0 .../data => config}/french_numbers.txt | 0 .../data => config}/french_stopwords.txt | 0 {nautilus_nlp/data => config}/stopwords.json | 0 nautilus_nlp/analysis/ngrams.py | 39 ----------- nautilus_nlp/data/.gitkeep | 0 nautilus_nlp/data/__init__.py | 17 ----- nautilus_nlp/preprocessing/preprocessor.py | 64 ------------------ nautilus_nlp/utils/__init__.py | 17 ----- nautilus_nlp/utils/keyword_extractor.py | 50 -------------- .../__init__.py | 1 + .../augmentation/text_augmentation.py | 0 .../classic/preprocess.py | 5 +- preprocessing/preprocessor.py | 65 +++++++++++++++++++ .../social/preprocess.py | 4 +- .../token/preprocess.py | 0 .../token}/tokenizer.py | 0 tests/test_data_augmentation.py | 6 +- tests/test_document_loader.py | 2 +- tests/test_keyword_extractor.py | 16 ----- tests/test_phone_number.py | 2 +- tests/test_preprocessor.py | 44 +++++++------ {nautilus_nlp/config => utils}/__init__.py | 0 {nautilus_nlp/utils => utils}/file_loader.py | 0 {nautilus_nlp/utils => utils}/phone_number.py | 29 +-------- {nautilus_nlp/utils => utils}/stopwords.py | 7 +- 30 files changed, 138 insertions(+), 265 deletions(-) rename {nautilus_nlp => config}/__init__.py (100%) rename {nautilus_nlp/config => config}/config.py (73%) rename {nautilus_nlp/utils => config}/constants.py (100%) rename {nautilus_nlp/data => config}/country_code.json (100%) rename {nautilus_nlp/data => config}/french_FEEL.csv (100%) rename {nautilus_nlp/data => config}/french_numbers.txt (100%) rename {nautilus_nlp/data => config}/french_stopwords.txt (100%) rename {nautilus_nlp/data => config}/stopwords.json (100%) delete mode 100644 nautilus_nlp/analysis/ngrams.py delete mode 100644 nautilus_nlp/data/.gitkeep delete mode 100644 nautilus_nlp/data/__init__.py delete mode 100644 nautilus_nlp/preprocessing/preprocessor.py delete mode 100644 nautilus_nlp/utils/__init__.py delete mode 100644 nautilus_nlp/utils/keyword_extractor.py rename {nautilus_nlp/preprocessing => preprocessing}/__init__.py (94%) rename nautilus_nlp/preprocessing/data_augmentation.py => preprocessing/augmentation/text_augmentation.py (100%) rename nautilus_nlp/preprocessing/text_preprocess.py => preprocessing/classic/preprocess.py (98%) create mode 100644 preprocessing/preprocessor.py rename nautilus_nlp/preprocessing/social_preprocess.py => preprocessing/social/preprocess.py (97%) rename nautilus_nlp/preprocessing/token_preprocess.py => preprocessing/token/preprocess.py (100%) rename {nautilus_nlp/utils => preprocessing/token}/tokenizer.py (100%) delete mode 100644 tests/test_keyword_extractor.py rename {nautilus_nlp/config => utils}/__init__.py (100%) rename {nautilus_nlp/utils => utils}/file_loader.py (100%) rename {nautilus_nlp/utils => utils}/phone_number.py (67%) rename {nautilus_nlp/utils => utils}/stopwords.py (94%) diff --git a/nautilus_nlp/__init__.py b/config/__init__.py similarity index 100% rename from nautilus_nlp/__init__.py rename to config/__init__.py diff --git a/nautilus_nlp/config/config.py b/config/config.py similarity index 73% rename from nautilus_nlp/config/config.py rename to config/config.py index 35681cf..df90e45 100644 --- a/nautilus_nlp/config/config.py +++ b/config/config.py @@ -17,10 +17,15 @@ # Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. #!/usr/local/bin/python3 import os +import phonenumbers as _phonenumbers ROOT_FOLDER = os.path.abspath(os.path.join(os.path.dirname(__file__), '..')) +# Stopwords config +STOPWORDS_JSON_FILEPATH = os.path.join(ROOT_FOLDER, "config", "stopwords.json") + +# Country config COUNTRY_MAPPING_ISO = { 'af': 'Afghanistan', 'ax': 'Åland Islands', 'al': 'Albania', 'dz': 'Algeria', 'as': 'American Samoa', 'ad': 'Andorra', 'ao': 'Angola', 'ai': 'Anguilla', 'aq': 'Antarctica', 'ag': 'Antigua and Barbuda', 'ar': 'Argentina', @@ -73,3 +78,33 @@ 've': 'Venezuela (Bolivarian Republic of)', 'vn': 'Viet Nam', 'vg': 'Virgin Islands (British)', 'vi': 'Virgin Islands (U.S.)', 'wf': 'Wallis and Futuna', 'eh': 'Western Sahara', 'ye': 'Yemen', 'zm': 'Zambia', 'zw': 'Zimbabwe'} + +# Phone numbers config +SUPPORTED_COUNTRY = [None, 'US', 'AG', 'AI', 'AS', 'BB', 'BM', 'BS', 'CA', 'DM', + 'GD', 'GU', 'JM', 'KN', 'KY', 'LC', 'MP', 'MS', 'PR', 'SX', 'TC', 'TT', + 'VC', 'VG', 'VI', 'RU', 'KZ', 'EG', 'ZA', 'GR', 'NL', 'BE', 'FR', 'ES', + 'HU', 'IT', 'VA', 'RO', 'CH', 'AT', 'GB', 'GG', 'IM', 'JE', 'DK', 'SE', + 'NO', 'SJ', 'PL', 'DE', 'PE', 'MX', 'CU', 'AR', 'BR', 'CL', 'CO', 'VE', + 'MY', 'AU', 'CC', 'CX', 'ID', 'PH', 'NZ', 'SG', 'TH', 'JP', 'KR', 'VN', + 'CN', 'TR', 'IN', 'PK', 'AF', 'LK', 'MM', 'IR', 'SS', 'MA', 'EH', 'DZ', + 'TN', 'LY', 'GM', 'SN', 'MR', 'ML', 'GN', 'CI', 'BF', 'NE', 'TG', 'BJ', + 'MU', 'LR', 'SL', 'GH', 'NG', 'TD', 'CF', 'CM', 'CV', 'ST', 'GQ', 'GA', + 'CG', 'CD', 'AO', 'GW', 'IO', 'AC', 'SC', 'SD', 'RW', 'ET', 'SO', 'DJ', + 'KE', 'TZ', 'UG', 'BI', 'MZ', 'ZM', 'MG', 'RE', 'YT', 'ZW', 'NA', 'MW', + 'LS', 'BW', 'SZ', 'KM', 'SH', 'TA', 'ER', 'AW', 'FO', 'GL', 'GI', 'PT', + 'LU', 'IE', 'IS', 'AL', 'MT', 'CY', 'FI', 'AX', 'BG', 'LT', 'LV', 'EE', + 'MD', 'AM', 'BY', 'AD', 'MC', 'SM', 'UA', 'RS', 'ME', 'XK', 'HR', 'SI', + 'BA', 'MK', 'CZ', 'SK', 'LI', 'FK', 'BZ', 'GT', 'SV', 'HN', 'NI', 'CR', + 'PA', 'PM', 'HT', 'GP', 'BL', 'MF', 'BO', 'GY', 'EC', 'GF', 'PY', 'MQ', + 'SR', 'UY', 'CW', 'BQ', 'TL', 'NF', 'BN', 'NR', 'PG', 'TO', 'SB', 'VU', + 'FJ', 'PW', 'WF', 'CK', 'NU', 'WS', 'KI', 'NC', 'TV', 'PF', 'TK', 'FM', + 'MH', 'KP', 'HK', 'MO', 'KH', 'LA', 'BD', 'TW', 'MV', 'LB', 'JO', 'SY', + 'IQ', 'KW', 'SA', 'YE', 'OM', 'PS', 'AE', 'IL', 'BH', 'QA', 'BT', 'MN', + 'NP', 'TJ', 'TM', 'AZ', 'GE', 'KG', 'UZ', 'DO'] + +FORMAT_NUMBERS = { + "E164": _phonenumbers.PhoneNumberFormat.E164, + "INTERNATIONAL": _phonenumbers.PhoneNumberFormat.INTERNATIONAL, + "NATIONAL": _phonenumbers.PhoneNumberFormat.NATIONAL, + "RFC3966": _phonenumbers.PhoneNumberFormat.RFC3966 +} diff --git a/nautilus_nlp/utils/constants.py b/config/constants.py similarity index 100% rename from nautilus_nlp/utils/constants.py rename to config/constants.py diff --git a/nautilus_nlp/data/country_code.json b/config/country_code.json similarity index 100% rename from nautilus_nlp/data/country_code.json rename to config/country_code.json diff --git a/nautilus_nlp/data/french_FEEL.csv b/config/french_FEEL.csv similarity index 100% rename from nautilus_nlp/data/french_FEEL.csv rename to config/french_FEEL.csv diff --git a/nautilus_nlp/data/french_numbers.txt b/config/french_numbers.txt similarity index 100% rename from nautilus_nlp/data/french_numbers.txt rename to config/french_numbers.txt diff --git a/nautilus_nlp/data/french_stopwords.txt b/config/french_stopwords.txt similarity index 100% rename from nautilus_nlp/data/french_stopwords.txt rename to config/french_stopwords.txt diff --git a/nautilus_nlp/data/stopwords.json b/config/stopwords.json similarity index 100% rename from nautilus_nlp/data/stopwords.json rename to config/stopwords.json diff --git a/nautilus_nlp/analysis/ngrams.py b/nautilus_nlp/analysis/ngrams.py deleted file mode 100644 index 89cbb13..0000000 --- a/nautilus_nlp/analysis/ngrams.py +++ /dev/null @@ -1,39 +0,0 @@ -# GNU Lesser General Public License v3.0 only -# Copyright (C) 2020 Artefact -# licence-information@artefact.com -# -# This program is free software; you can redistribute it and/or -# modify it under the terms of the GNU Lesser General Public -# License as published by the Free Software Foundation; either -# version 3 of the License, or (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public License -# along with this program; if not, write to the Free Software Foundation, -# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. -# -*- coding: utf-8 -*- -from typing import List, Generator - - -def create_ngrams(tokens: List[str], nb_elements: int) -> Generator: - """ - Create n-grams for list of tokens - - Parameters - ---------- - tokens : list - list of strings - nb_elements : int - number of elements in the n-gram - - Returns - ------- - Generator - generator of all n-grams - """ - ngrams = zip(*[tokens[index_token:] for index_token in range(nb_elements)]) - return (" ".join(ngram) for ngram in ngrams) diff --git a/nautilus_nlp/data/.gitkeep b/nautilus_nlp/data/.gitkeep deleted file mode 100644 index e69de29..0000000 diff --git a/nautilus_nlp/data/__init__.py b/nautilus_nlp/data/__init__.py deleted file mode 100644 index d46139b..0000000 --- a/nautilus_nlp/data/__init__.py +++ /dev/null @@ -1,17 +0,0 @@ -# GNU Lesser General Public License v3.0 only -# Copyright (C) 2020 Artefact -# licence-information@artefact.com -# -# This program is free software; you can redistribute it and/or -# modify it under the terms of the GNU Lesser General Public -# License as published by the Free Software Foundation; either -# version 3 of the License, or (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public License -# along with this program; if not, write to the Free Software Foundation, -# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. diff --git a/nautilus_nlp/preprocessing/preprocessor.py b/nautilus_nlp/preprocessing/preprocessor.py deleted file mode 100644 index 6478914..0000000 --- a/nautilus_nlp/preprocessing/preprocessor.py +++ /dev/null @@ -1,64 +0,0 @@ -from typing import List, Callable, Optional - -from sklearn.pipeline import Pipeline -from sklearn.preprocessing import FunctionTransformer - -from nautilus_nlp.preprocessing.social_preprocess import (remove_html_tags, remove_mentions, remove_emoji, - remove_hashtag) -from nautilus_nlp.preprocessing.text_preprocess import normalize_whitespace, remove_eol_characters, fix_bad_unicode - - -class Preprocessor(): - def __init__( - self, - functions: Optional[Callable] = None): - """ - Initialize preprocessor object to apply all text transformation - - Parameters - ---------- - functions : iterable|None - list of functions of preprocessing - """ - if functions is None: - functions = (remove_html_tags, remove_mentions, remove_emoji, remove_hashtag, - remove_eol_characters, fix_bad_unicode, normalize_whitespace) - if len(functions) == 0: - raise ValueError("Cannot initialize a preprocessor with 0 function") - self.pipeline = self.build_pipeline(functions) - - @staticmethod - def build_pipeline(function_list: List[Callable]) -> Pipeline: - """ - Build sklearn pipeline from a function list - - Parameters - ---------- - function_list : iterable - list of functions of preprocessing - - Returns - ------- - sklearn.pipeline.Pipeline - """ - return Pipeline( - steps=[ - (function.__name__, FunctionTransformer(function)) - for function in function_list]) - - - def apply_pipeline(self, text: str) -> str: - """ - Apply pipeline to text - - Parameters - ---------- - text : string - text to preprocess - - Returns - ------- - string - """ - text = self.pipeline.fit_transform(text) - return text diff --git a/nautilus_nlp/utils/__init__.py b/nautilus_nlp/utils/__init__.py deleted file mode 100644 index d46139b..0000000 --- a/nautilus_nlp/utils/__init__.py +++ /dev/null @@ -1,17 +0,0 @@ -# GNU Lesser General Public License v3.0 only -# Copyright (C) 2020 Artefact -# licence-information@artefact.com -# -# This program is free software; you can redistribute it and/or -# modify it under the terms of the GNU Lesser General Public -# License as published by the Free Software Foundation; either -# version 3 of the License, or (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public License -# along with this program; if not, write to the Free Software Foundation, -# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. diff --git a/nautilus_nlp/utils/keyword_extractor.py b/nautilus_nlp/utils/keyword_extractor.py deleted file mode 100644 index f804d52..0000000 --- a/nautilus_nlp/utils/keyword_extractor.py +++ /dev/null @@ -1,50 +0,0 @@ -# GNU Lesser General Public License v3.0 only -# Copyright (C) 2020 Artefact -# licence-information@artefact.com -# -# This program is free software; you can redistribute it and/or -# modify it under the terms of the GNU Lesser General Public -# License as published by the Free Software Foundation; either -# version 3 of the License, or (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public License -# along with this program; if not, write to the Free Software Foundation, -# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - -from flashtext import KeywordProcessor - - -def extract_keywords(text, keyword, case_sensitive=True): - """ - Extract Keywords from a document. - - Parameters - ---------- - text : str - Text to extract keywords from - keyword : - Single keyword (str) or list of keywords (list) - case_sensitive : - If False, will be case insensitive. - - Returns - ------- - list - Return list of extracted keyworkds - """ - - processor = KeywordProcessor(case_sensitive=case_sensitive) - if isinstance(keyword, list): - processor.add_keywords_from_list(keyword) - elif isinstance(keyword, str): - processor.add_keyword(keyword) - elif isinstance(keyword, dict): - processor.add_keywords_from_dict(keyword) - - return processor.extract_keywords(text) - \ No newline at end of file diff --git a/nautilus_nlp/preprocessing/__init__.py b/preprocessing/__init__.py similarity index 94% rename from nautilus_nlp/preprocessing/__init__.py rename to preprocessing/__init__.py index d46139b..7643ec5 100644 --- a/nautilus_nlp/preprocessing/__init__.py +++ b/preprocessing/__init__.py @@ -15,3 +15,4 @@ # You should have received a copy of the GNU Lesser General Public License # along with this program; if not, write to the Free Software Foundation, # Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +from nautilus_nlp.preprocessor import Preprocessor diff --git a/nautilus_nlp/preprocessing/data_augmentation.py b/preprocessing/augmentation/text_augmentation.py similarity index 100% rename from nautilus_nlp/preprocessing/data_augmentation.py rename to preprocessing/augmentation/text_augmentation.py diff --git a/nautilus_nlp/preprocessing/text_preprocess.py b/preprocessing/classic/preprocess.py similarity index 98% rename from nautilus_nlp/preprocessing/text_preprocess.py rename to preprocessing/classic/preprocess.py index ef6003a..691acae 100644 --- a/nautilus_nlp/preprocessing/text_preprocess.py +++ b/preprocessing/classic/preprocess.py @@ -23,9 +23,8 @@ import re import unicodedata from ftfy import fix_text as _fix_text -from nautilus_nlp.utils import constants -from nautilus_nlp.utils.phone_number import \ - extract_phone_numbers as _extract_phone_numbers +from config import constants +from utils.phone_number import extract_phone_numbers as _extract_phone_numbers def normalize_whitespace(text) -> str: diff --git a/preprocessing/preprocessor.py b/preprocessing/preprocessor.py new file mode 100644 index 0000000..0b34eb3 --- /dev/null +++ b/preprocessing/preprocessor.py @@ -0,0 +1,65 @@ +from typing import List, Callable + +from sklearn.pipeline import Pipeline +from sklearn.preprocessing import FunctionTransformer + +from preprocessing.social.preprocess import (remove_html_tags, remove_mentions, remove_emoji, + remove_hashtag) +from preprocessing.classic.preprocess import normalize_whitespace, remove_eol_characters, fix_bad_unicode + + +class Preprocessor(): + def __init__( + self): + """ + Initialize preprocessor object to apply all text transformation + """ + self.__operations = [] + self.pipeline = None + + def pipe(self, operation: Callable): + """ + Add an operation to pipe in the preprocessor + Parameters + ---------- + operation : callable + text preprocessing function + """ + self.__operations.append(operation) + + @staticmethod + def build_pipeline(operation_list: List[Callable]) -> Pipeline: + """ + Build sklearn pipeline from a operation list + Parameters + ---------- + operation_list : iterable + list of __operations of preprocessing + Returns + ------- + sklearn.pipeline.Pipeline + """ + return Pipeline( + steps=[ + (operation.__name__, FunctionTransformer(operation)) + for operation in operation_list]) + + + def run(self, text: str) -> str: + """ + Apply pipeline to text + Parameters + ---------- + text : string + text to preprocess + Returns + ------- + string + """ + operations = self.__operations + if operations == []: + operations = (remove_html_tags, remove_mentions, remove_emoji, remove_hashtag, + remove_eol_characters, fix_bad_unicode, normalize_whitespace) + self.pipeline = self.build_pipeline(operations) + text = self.pipeline.fit_transform(text) + return text \ No newline at end of file diff --git a/nautilus_nlp/preprocessing/social_preprocess.py b/preprocessing/social/preprocess.py similarity index 97% rename from nautilus_nlp/preprocessing/social_preprocess.py rename to preprocessing/social/preprocess.py index 20809a3..b017f65 100644 --- a/nautilus_nlp/preprocessing/social_preprocess.py +++ b/preprocessing/social/preprocess.py @@ -20,8 +20,8 @@ from __future__ import absolute_import, division, print_function, unicode_literals import emoji as _emoji -from nautilus_nlp.utils import constants -from nautilus_nlp.preprocessing.text_preprocess import normalize_whitespace +from config import constants +from preprocessing.classic.preprocess import normalize_whitespace def remove_mentions(text) -> str: diff --git a/nautilus_nlp/preprocessing/token_preprocess.py b/preprocessing/token/preprocess.py similarity index 100% rename from nautilus_nlp/preprocessing/token_preprocess.py rename to preprocessing/token/preprocess.py diff --git a/nautilus_nlp/utils/tokenizer.py b/preprocessing/token/tokenizer.py similarity index 100% rename from nautilus_nlp/utils/tokenizer.py rename to preprocessing/token/tokenizer.py diff --git a/tests/test_data_augmentation.py b/tests/test_data_augmentation.py index 863087e..d13245b 100644 --- a/tests/test_data_augmentation.py +++ b/tests/test_data_augmentation.py @@ -1,6 +1,8 @@ import pytest -from nautilus_nlp.preprocessing.data_augmentation import process_entities_and_text, \ - get_augmenter, CouldNotAugment, UnavailableAugmenter +from preprocessing.augmentation.text_augmentation import ( + process_entities_and_text, get_augmenter, CouldNotAugment, + UnavailableAugmenter +) @pytest.mark.parametrize( "text, text_augmented, entities, expected", diff --git a/tests/test_document_loader.py b/tests/test_document_loader.py index a757619..060af44 100644 --- a/tests/test_document_loader.py +++ b/tests/test_document_loader.py @@ -20,7 +20,7 @@ import os import numpy as np -from nautilus_nlp.utils.file_loader import (detect_encoding, documents_loader) +from utils.file_loader import (detect_encoding, documents_loader) TESTDOC_LATIN1 = "J'aime les frites bien grasse étalon châpeau!" TESTDOC_UTF8 = "Un deuxième exemple de texte en utf-8 cette fois!" diff --git a/tests/test_keyword_extractor.py b/tests/test_keyword_extractor.py deleted file mode 100644 index f694692..0000000 --- a/tests/test_keyword_extractor.py +++ /dev/null @@ -1,16 +0,0 @@ -import pytest -from nautilus_nlp.utils.keyword_extractor import extract_keywords - - -@pytest.mark.parametrize( - "input_text, keyword, case_sensitive, expected", - [ - ("I eat an orange oranges at Orange", 'orange', False, ['orange', 'orange']), - ("I eat an orange oranges at Orange", 'orange', True, ['orange']), - ("I eat an orange oranges at Orange", {'orange': ['orange', 'oranges']}, False, ['orange', 'orange', 'orange']), - ("I eat an orange oranges at Orange", {'orange': ['orange', 'oranges']}, True, ['orange', 'orange']), - ("I eat an orange oranges at Orange", {'fruit': ['orange', 'oranges']}, True, ['fruit', 'fruit']), - ] - ) -def test_extract_keywords(input_text, keyword, case_sensitive, expected): - assert extract_keywords(input_text, keyword=keyword, case_sensitive=case_sensitive) == expected diff --git a/tests/test_phone_number.py b/tests/test_phone_number.py index 4aff394..4b6c832 100644 --- a/tests/test_phone_number.py +++ b/tests/test_phone_number.py @@ -15,7 +15,7 @@ # You should have received a copy of the GNU Lesser General Public License # along with this program; if not, write to the Free Software Foundation, # Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. -import nautilus_nlp.utils.phone_number as phone +import utils.phone_number as phone def test_extract_phone_number(): input_str = '(541) 754-3010 is a US. Phone' diff --git a/tests/test_preprocessor.py b/tests/test_preprocessor.py index 5a11597..355836d 100644 --- a/tests/test_preprocessor.py +++ b/tests/test_preprocessor.py @@ -17,22 +17,22 @@ # Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. import pytest import numpy as np -from nautilus_nlp.preprocessing.text_preprocess import (normalize_whitespace, remove_eol_characters, +from preprocessing.classic.preprocess import (normalize_whitespace, remove_eol_characters, fix_bad_unicode, unpack_english_contractions, replace_urls, replace_emails, replace_phone_numbers, replace_numbers, replace_currency_symbols, remove_punct, remove_accents, remove_multiple_spaces_and_strip_text, filter_non_latin_characters) -from nautilus_nlp.preprocessing.social_preprocess import (remove_mentions, extract_mentions, remove_html_tags, +from preprocessing.social.preprocess import (remove_mentions, extract_mentions, remove_html_tags, remove_emoji, convert_emoji_to_text, extract_emojis, extract_hashtags, remove_hashtag) -from nautilus_nlp.preprocessing.token_preprocess import (remove_stopwords, remove_tokens_with_nonletters, +from preprocessing.token.preprocess import (remove_stopwords, remove_tokens_with_nonletters, remove_special_caracters_from_tokenslist, remove_smallwords) -from nautilus_nlp.preprocessing.preprocessor import Preprocessor +from preprocessing.preprocessor import Preprocessor -import nautilus_nlp.utils.phone_number as phone -from nautilus_nlp.utils.stopwords import get_stopwords +import utils.phone_number as phone +from utils.stopwords import get_stopwords @pytest.mark.parametrize("text, expected_result", @@ -389,32 +389,36 @@ def test_convert_emoji_to_text(input_str, expected_str): np.testing.assert_equal(result, expected_str) -@pytest.mark.parametrize( - "functions", - [ - (None), - ([remove_punct, remove_emoji]) +def test_custom_preprocess(): + # Given + text = "Some text with @mentions and #hashtags" - ] -) -def test_init_preprocessor(functions): - assert Preprocessor( - functions=functions) + preprocessor = Preprocessor() + preprocessor.pipe(remove_hashtag) + preprocessor.pipe(remove_mentions) + expected_result = remove_hashtag(text) + expected_result = remove_mentions(expected_result) + # When + result = preprocessor.run(text) + + # Then + assert expected_result == result def test_apply_preprocessor(): # Given text = "Some text with @mentions and whitespaces and #hashtags" - function_list = (remove_mentions, remove_hashtag, normalize_whitespace) + operations = (remove_html_tags, remove_mentions, remove_emoji, remove_hashtag, + remove_eol_characters, fix_bad_unicode, normalize_whitespace) - preprocessor = Preprocessor(functions=function_list) + preprocessor = Preprocessor() expected_result = text - for function in function_list: + for function in operations: expected_result = function(expected_result) # When - result = preprocessor.apply_pipeline(text) + result = preprocessor.run(text) # Then assert expected_result == result diff --git a/nautilus_nlp/config/__init__.py b/utils/__init__.py similarity index 100% rename from nautilus_nlp/config/__init__.py rename to utils/__init__.py diff --git a/nautilus_nlp/utils/file_loader.py b/utils/file_loader.py similarity index 100% rename from nautilus_nlp/utils/file_loader.py rename to utils/file_loader.py diff --git a/nautilus_nlp/utils/phone_number.py b/utils/phone_number.py similarity index 67% rename from nautilus_nlp/utils/phone_number.py rename to utils/phone_number.py index 6ad58fc..6120155 100644 --- a/nautilus_nlp/utils/phone_number.py +++ b/utils/phone_number.py @@ -17,35 +17,8 @@ # Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. from typing import Optional import phonenumbers as _phonenumbers +from config.config import SUPPORTED_COUNTRY, FORMAT_NUMBERS -SUPPORTED_COUNTRY = [None, 'US', 'AG', 'AI', 'AS', 'BB', 'BM', 'BS', 'CA', 'DM', - 'GD', 'GU', 'JM', 'KN', 'KY', 'LC', 'MP', 'MS', 'PR', 'SX', 'TC', 'TT', - 'VC', 'VG', 'VI', 'RU', 'KZ', 'EG', 'ZA', 'GR', 'NL', 'BE', 'FR', 'ES', - 'HU', 'IT', 'VA', 'RO', 'CH', 'AT', 'GB', 'GG', 'IM', 'JE', 'DK', 'SE', - 'NO', 'SJ', 'PL', 'DE', 'PE', 'MX', 'CU', 'AR', 'BR', 'CL', 'CO', 'VE', - 'MY', 'AU', 'CC', 'CX', 'ID', 'PH', 'NZ', 'SG', 'TH', 'JP', 'KR', 'VN', - 'CN', 'TR', 'IN', 'PK', 'AF', 'LK', 'MM', 'IR', 'SS', 'MA', 'EH', 'DZ', - 'TN', 'LY', 'GM', 'SN', 'MR', 'ML', 'GN', 'CI', 'BF', 'NE', 'TG', 'BJ', - 'MU', 'LR', 'SL', 'GH', 'NG', 'TD', 'CF', 'CM', 'CV', 'ST', 'GQ', 'GA', - 'CG', 'CD', 'AO', 'GW', 'IO', 'AC', 'SC', 'SD', 'RW', 'ET', 'SO', 'DJ', - 'KE', 'TZ', 'UG', 'BI', 'MZ', 'ZM', 'MG', 'RE', 'YT', 'ZW', 'NA', 'MW', - 'LS', 'BW', 'SZ', 'KM', 'SH', 'TA', 'ER', 'AW', 'FO', 'GL', 'GI', 'PT', - 'LU', 'IE', 'IS', 'AL', 'MT', 'CY', 'FI', 'AX', 'BG', 'LT', 'LV', 'EE', - 'MD', 'AM', 'BY', 'AD', 'MC', 'SM', 'UA', 'RS', 'ME', 'XK', 'HR', 'SI', - 'BA', 'MK', 'CZ', 'SK', 'LI', 'FK', 'BZ', 'GT', 'SV', 'HN', 'NI', 'CR', - 'PA', 'PM', 'HT', 'GP', 'BL', 'MF', 'BO', 'GY', 'EC', 'GF', 'PY', 'MQ', - 'SR', 'UY', 'CW', 'BQ', 'TL', 'NF', 'BN', 'NR', 'PG', 'TO', 'SB', 'VU', - 'FJ', 'PW', 'WF', 'CK', 'NU', 'WS', 'KI', 'NC', 'TV', 'PF', 'TK', 'FM', - 'MH', 'KP', 'HK', 'MO', 'KH', 'LA', 'BD', 'TW', 'MV', 'LB', 'JO', 'SY', - 'IQ', 'KW', 'SA', 'YE', 'OM', 'PS', 'AE', 'IL', 'BH', 'QA', 'BT', 'MN', - 'NP', 'TJ', 'TM', 'AZ', 'GE', 'KG', 'UZ', 'DO'] - -FORMAT_NUMBERS = { - "E164": _phonenumbers.PhoneNumberFormat.E164, - "INTERNATIONAL": _phonenumbers.PhoneNumberFormat.INTERNATIONAL, - "NATIONAL": _phonenumbers.PhoneNumberFormat.NATIONAL, - "RFC3966": _phonenumbers.PhoneNumberFormat.RFC3966 -} def find_phone_numbers(string: str, region_code: Optional[str] = None) -> str: """ diff --git a/nautilus_nlp/utils/stopwords.py b/utils/stopwords.py similarity index 94% rename from nautilus_nlp/utils/stopwords.py rename to utils/stopwords.py index 0f3eb57..89cb7d0 100644 --- a/nautilus_nlp/utils/stopwords.py +++ b/utils/stopwords.py @@ -24,11 +24,8 @@ import os from stop_words import LANGUAGE_MAPPING as _LANGUAGE_MAPPING from stop_words import get_stop_words as _get_stop_words -from nautilus_nlp.config.config import ROOT_FOLDER -from nautilus_nlp.utils.file_loader import documents_loader - - -STOPWORDS_JSON_FILEPATH = os.path.join(ROOT_FOLDER, "data", "stopwords.json") +from config.config import STOPWORDS_JSON_FILEPATH +from utils.file_loader import documents_loader def _load_stopwords_from_json(filepath=STOPWORDS_JSON_FILEPATH): From c45e5acfd2a10dc01857c61cf0279edc44802071 Mon Sep 17 00:00:00 2001 From: Rafaelle AYGALENQ <rafaelle.aygalenq@artefact.com> Date: Mon, 25 Jan 2021 20:35:59 +0100 Subject: [PATCH 437/496] update import init --- preprocessing/__init__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/preprocessing/__init__.py b/preprocessing/__init__.py index 7643ec5..97b4d25 100644 --- a/preprocessing/__init__.py +++ b/preprocessing/__init__.py @@ -15,4 +15,4 @@ # You should have received a copy of the GNU Lesser General Public License # along with this program; if not, write to the Free Software Foundation, # Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. -from nautilus_nlp.preprocessor import Preprocessor +from preprocessing.preprocessor import Preprocessor From 1ebb20135cf71e5b025d535a5e122aa2d889db21 Mon Sep 17 00:00:00 2001 From: Rafaelle AYGALENQ <rafaelle.aygalenq@artefact.com> Date: Mon, 25 Jan 2021 20:40:08 +0100 Subject: [PATCH 438/496] fix pylint --- tests/test_preprocessor.py | 27 +++++++++++++++------------ 1 file changed, 15 insertions(+), 12 deletions(-) diff --git a/tests/test_preprocessor.py b/tests/test_preprocessor.py index 355836d..13564b0 100644 --- a/tests/test_preprocessor.py +++ b/tests/test_preprocessor.py @@ -17,18 +17,21 @@ # Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. import pytest import numpy as np -from preprocessing.classic.preprocess import (normalize_whitespace, remove_eol_characters, - fix_bad_unicode, unpack_english_contractions, - replace_urls, replace_emails, replace_phone_numbers, - replace_numbers, replace_currency_symbols, remove_punct, - remove_accents, remove_multiple_spaces_and_strip_text, - filter_non_latin_characters) -from preprocessing.social.preprocess import (remove_mentions, extract_mentions, remove_html_tags, - remove_emoji, convert_emoji_to_text, extract_emojis, - extract_hashtags, remove_hashtag) -from preprocessing.token.preprocess import (remove_stopwords, remove_tokens_with_nonletters, - remove_special_caracters_from_tokenslist, - remove_smallwords) +from preprocessing.classic.preprocess import ( + normalize_whitespace, remove_eol_characters, fix_bad_unicode, + unpack_english_contractions, replace_urls, replace_emails, + replace_phone_numbers, replace_numbers, replace_currency_symbols, + remove_punct, remove_accents, remove_multiple_spaces_and_strip_text, + filter_non_latin_characters +) +from preprocessing.social.preprocess import ( + remove_mentions, extract_mentions, remove_html_tags, remove_emoji, + convert_emoji_to_text, extract_emojis, extract_hashtags, remove_hashtag +) +from preprocessing.token.preprocess import ( + remove_stopwords, remove_tokens_with_nonletters, + remove_special_caracters_from_tokenslist, remove_smallwords +) from preprocessing.preprocessor import Preprocessor import utils.phone_number as phone From c646072281f45eb0ea1a83c9839ec7b8a94c3dd6 Mon Sep 17 00:00:00 2001 From: Rafaelle AYGALENQ <rafaelle.aygalenq@artefact.com> Date: Mon, 25 Jan 2021 20:58:39 +0100 Subject: [PATCH 439/496] update ci with new name and fix pylint --- .github/workflows/ci_actions.yml | 4 ++-- preprocessing/preprocessor.py | 6 +++--- utils/stopwords.py | 1 - 3 files changed, 5 insertions(+), 6 deletions(-) diff --git a/.github/workflows/ci_actions.yml b/.github/workflows/ci_actions.yml index 2c410da..8cdb602 100644 --- a/.github/workflows/ci_actions.yml +++ b/.github/workflows/ci_actions.yml @@ -42,8 +42,8 @@ jobs: - name: Run pylint run: | - pylint nautilus_nlp tests + pylint config preprocessing utils tests - name: Run pytest run: | - pytest --cov=nautilus_nlp tests + pytest --cov=preprocessing tests diff --git a/preprocessing/preprocessor.py b/preprocessing/preprocessor.py index 0b34eb3..41ec77c 100644 --- a/preprocessing/preprocessor.py +++ b/preprocessing/preprocessor.py @@ -3,8 +3,8 @@ from sklearn.pipeline import Pipeline from sklearn.preprocessing import FunctionTransformer -from preprocessing.social.preprocess import (remove_html_tags, remove_mentions, remove_emoji, - remove_hashtag) +from preprocessing.social.preprocess import ( + remove_html_tags, remove_mentions, remove_emoji, remove_hashtag) from preprocessing.classic.preprocess import normalize_whitespace, remove_eol_characters, fix_bad_unicode @@ -62,4 +62,4 @@ def run(self, text: str) -> str: remove_eol_characters, fix_bad_unicode, normalize_whitespace) self.pipeline = self.build_pipeline(operations) text = self.pipeline.fit_transform(text) - return text \ No newline at end of file + return text diff --git a/utils/stopwords.py b/utils/stopwords.py index 89cb7d0..305ff2b 100644 --- a/utils/stopwords.py +++ b/utils/stopwords.py @@ -21,7 +21,6 @@ unicode_literals) import json -import os from stop_words import LANGUAGE_MAPPING as _LANGUAGE_MAPPING from stop_words import get_stop_words as _get_stop_words from config.config import STOPWORDS_JSON_FILEPATH From bdf4f9861b4b8318f2edb675af2b1ae4fd43d22b Mon Sep 17 00:00:00 2001 From: Rafaelle AYGALENQ <rafaelle.aygalenq@artefact.com> Date: Mon, 25 Jan 2021 21:12:44 +0100 Subject: [PATCH 440/496] rm unused config files --- config/french_FEEL.csv | 14128 ---------------------------------- config/french_numbers.txt | 101 - config/french_stopwords.txt | 689 -- 3 files changed, 14918 deletions(-) delete mode 100644 config/french_FEEL.csv delete mode 100644 config/french_numbers.txt delete mode 100644 config/french_stopwords.txt diff --git a/config/french_FEEL.csv b/config/french_FEEL.csv deleted file mode 100644 index 40f15d6..0000000 --- a/config/french_FEEL.csv +++ /dev/null @@ -1,14128 +0,0 @@ -id;word;polarity;joy;fear;sadness;anger;surprise;disgust -1;à ce endroit là;positive;0;0;0;0;0;0 -2;à le hâte;negative;0;1;0;0;1;0 -3;à part;negative;0;0;1;0;0;0 -4;à pic;negative;0;1;0;0;0;0 -5;à rallonge;negative;0;0;1;0;0;0 -6;abasourdir;negative;0;0;0;0;1;0 -7;ablation;negative;0;1;0;0;0;1 -8;abominable;negative;0;1;0;0;0;1 -9;abrupt;negative;0;1;0;0;0;0 -10;absent;negative;0;1;1;0;0;0 -11;absorber;positive;0;0;0;0;1;0 -12;absurde;negative;0;0;0;1;1;1 -13;acceptable;positive;0;0;0;0;0;0 -14;accidentel;negative;0;1;1;0;1;0 -15;accusateur;negative;0;1;0;1;0;1 -16;accuser;negative;0;1;1;1;0;1 -17;acheteur;positive;0;0;0;0;0;0 -18;acquisition;positive;0;0;0;0;0;0 -19;active;positive;0;0;0;0;0;0 -20;actuel;positive;0;0;0;0;1;0 -21;addition;positive;0;0;0;0;0;0 -22;adhésif;positive;0;0;0;0;0;1 -23;administration;positive;0;0;0;0;0;0 -24;administratif;positive;0;0;0;0;0;0 -25;administrateur;positive;0;0;0;0;0;0 -26;admirateur;positive;0;0;0;0;0;0 -27;admissible;positive;0;0;0;0;0;0 -28;adolescent;positive;0;0;0;0;0;0 -29;aérien;positive;0;1;0;0;0;0 -30;affable;positive;0;0;0;0;0;0 -31;affaire;positive;0;0;0;0;0;0 -32;affectueux;positive;0;0;0;0;0;0 -33;affirmative;positive;0;0;0;0;0;0 -34;affliger;negative;0;1;1;0;0;0 -35;affreux;negative;0;1;1;1;1;1 -36;agent de conservation;positive;0;0;0;0;1;0 -37;agent de police;positive;0;1;0;0;0;0 -38;agrafe;positive;0;0;0;0;0;0 -39;agréable;positive;0;0;0;0;0;0 -40;agressif;negative;0;1;0;1;0;0 -41;agriculteur;positive;0;0;0;0;0;0 -42;aiguiser;positive;0;1;0;1;0;0 -43;aimer;positive;0;0;0;0;0;0 -44;aîné;positive;0;0;0;0;0;0 -45;aisément;positive;0;0;0;0;0;0 -46;alcalin;positive;0;0;0;0;0;0 -47;alentour;positive;0;0;0;0;0;0 -48;allonger;negative;0;1;1;1;0;1 -49;allure;positive;0;0;0;0;0;0 -50;allusion;negative;0;1;0;1;1;0 -51;alternative;positive;0;0;0;0;0;0 -52;amas;negative;0;0;0;0;0;0 -53;amatrice;negative;0;0;0;0;0;0 -54;ambassadrice;positive;0;0;0;0;0;0 -55;ambitieux;positive;0;0;0;0;0;0 -56;amélioration;positive;0;0;0;0;0;0 -57;ami;positive;0;0;0;0;0;0 -58;amourette;negative;0;0;0;0;0;0 -59;analyse;positive;0;0;0;0;0;0 -60;ancien;negative;0;0;0;0;0;0 -61;ancien élève;positive;0;0;0;0;0;0 -62;anguleux;positive;0;0;0;0;0;0 -63;animal;negative;0;1;0;0;0;1 -64;annuel;positive;0;0;0;0;0;0 -65;anticipatif;positive;0;0;0;0;0;0 -66;anxieux;negative;0;1;0;0;0;0 -67;apathique;negative;0;1;1;0;0;0 -68;apparenter;positive;0;0;0;0;0;0 -69;apprenant;positive;0;0;0;0;0;0 -70;apprenti;positive;0;0;0;0;0;0 -71;approbation;positive;0;0;0;0;0;0 -72;approbateur;positive;0;0;0;0;0;0 -73;approcher;positive;0;0;0;0;0;0 -74;approprier;positive;0;0;0;0;0;0 -75;approximatif;positive;0;0;0;0;0;0 -76;appui;positive;0;0;0;0;0;0 -77;aqueux;negative;0;0;0;0;0;1 -78;ardent;positive;0;0;0;0;1;0 -79;arête;negative;0;1;0;0;0;0 -80;aride;negative;0;1;1;0;0;0 -81;armature;positive;0;0;0;0;0;0 -82;arnaqueur;negative;0;1;0;1;0;1 -83;arrondissement;positive;0;0;0;0;0;0 -84;artisane;positive;0;0;0;0;0;0 -85;asile;positive;0;0;0;0;0;0 -86;asphyxie;negative;0;1;0;1;0;0 -87;aspiration;positive;0;0;0;0;0;0 -88;assaillant;negative;0;1;1;1;0;0 -89;assentiment;positive;0;0;0;0;0;0 -90;assidu;positive;0;0;0;0;0;0 -91;assistance;positive;0;0;0;0;0;0 -92;assistant;positive;0;0;0;0;0;0 -93;assourdir;negative;0;1;1;0;0;0 -94;asticot;negative;0;0;0;0;0;1 -95;astucieux;positive;0;0;0;0;0;0 -96;athéiste;negative;0;0;0;0;0;0 -97;attarder mental;negative;0;1;1;0;0;1 -98;attentif;positive;0;0;0;0;0;0 -99;attirer;positive;0;0;0;0;1;0 -100;attitude amical;positive;0;0;0;0;0;0 -101;attroupement;positive;0;0;0;0;0;0 -102;au chômage;negative;0;1;1;0;0;0 -103;au gouvernement;positive;0;0;0;0;0;0 -104;au premier plan;positive;0;0;0;0;0;0 -105;auditif;positive;0;0;0;0;0;0 -106;auditeur;positive;0;1;0;0;0;0 -107;augure;negative;0;1;0;0;0;0 -108;aussi que;positive;0;0;0;0;0;0 -109;autonomie;positive;0;0;0;0;0;0 -110;autosatisfaction;positive;0;0;0;0;0;0 -111;avant dernier;negative;0;0;1;0;0;0 -112;avantageux;positive;1;0;0;0;0;0 -113;avec amertume;negative;0;0;1;1;0;1 -114;avec fermeté;positive;0;0;0;0;0;0 -115;avec insistance;positive;0;0;0;0;0;0 -116;avec lequel;positive;0;0;0;0;0;0 -117;aventureux;positive;0;1;0;0;1;0 -118;aventurier;positive;0;1;0;0;1;0 -119;avocat;positive;0;1;0;1;0;1 -120;avoir du chagrin;negative;0;1;1;0;0;0 -121;avouer;negative;0;1;1;0;0;0 -122;badaud;positive;0;0;0;0;0;0 -123;bafouiller;negative;0;1;0;0;0;0 -124;baisse;negative;0;0;1;0;0;0 -125;baissière;negative;0;1;1;1;0;0 -126;balaise;negative;0;1;0;0;1;0 -127;balbutiement;positive;0;0;0;0;0;0 -128;banlieusard;negative;0;0;0;0;0;0 -129;bannière;positive;0;0;0;0;0;0 -130;banquière;positive;0;0;0;0;0;0 -131;banshie;negative;0;1;1;1;0;1 -132;baraquer;positive;0;1;0;0;0;0 -133;barge;negative;0;1;0;0;0;1 -134;bâtard;negative;0;1;0;1;0;1 -135;batifoler;positive;1;0;0;0;0;0 -136;battant;positive;0;0;0;0;0;0 -137;batteuse;positive;0;0;0;0;0;0 -138;bavardage;negative;0;0;0;0;0;0 -139;bavard;negative;0;0;0;0;0;0 -140;bazar;negative;0;1;1;1;0;1 -141;beau;positive;0;0;0;0;0;0 -142;belliqueux;negative;0;1;0;1;0;0 -143;bénigne;positive;1;0;0;0;0;0 -144;bête;negative;0;0;0;1;0;1 -145;beuglement;negative;0;1;1;1;0;0 -146;beugler;negative;0;1;1;1;0;0 -147;bien;positive;1;0;0;0;0;0 -148;bienfaiteur;positive;0;0;0;0;0;0 -149;bienheureux;positive;1;0;0;0;0;0 -150;bienveillance;positive;0;0;0;0;1;0 -151;bijoutier;positive;0;0;0;0;0;0 -152;bimensuel;positive;0;0;0;0;0;0 -153;bisannuel;positive;0;0;0;0;0;0 -154;bisexuel;positive;0;0;0;0;0;0 -155;blagueur;positive;0;0;0;0;1;0 -156;blanc;positive;0;0;0;0;0;0 -157;bloquer;negative;0;1;0;0;1;0 -158;boiteux;negative;0;0;1;0;0;0 -159;bon à manger;positive;0;0;0;0;0;0 -160;bon à rien;negative;0;0;1;1;0;1 -161;bord;positive;0;0;0;0;0;0 -162;bord de mer;positive;0;0;0;0;0;0 -163;boueux;negative;0;0;0;0;0;1 -164;bouleverser;negative;0;1;1;1;0;0 -165;bourbe;negative;0;1;0;0;0;1 -166;bourde;negative;0;1;1;0;0;1 -167;bourgeois;negative;0;0;0;0;0;0 -168;bourrasque;negative;0;1;0;0;1;0 -169;bourru;negative;0;0;0;1;0;1 -170;boutonneux;negative;0;0;0;0;0;1 -171;boxeuse;positive;0;0;0;1;0;0 -172;boycottage;negative;0;0;0;1;0;1 -173;brève;positive;0;0;0;0;0;0 -174;brillant;positive;0;0;0;0;0;0 -175;briller;positive;0;0;0;0;0;1 -176;broche;positive;0;0;0;0;0;0 -177;brouiller;negative;0;1;0;0;0;0 -178;broussailleux;negative;0;0;0;0;0;0 -179;brumeux;negative;0;1;1;0;0;0 -180;bruyamment;negative;0;0;0;1;0;0 -181;bruyère;negative;0;0;0;0;0;0 -182;câble;positive;0;0;0;0;1;0 -183;cache nez;negative;0;0;0;0;0;0 -184;caduque;negative;0;0;1;0;0;1 -185;cafouiller;negative;0;0;0;0;0;0 -186;cafteur;negative;0;0;0;1;0;0 -187;caillouteux;negative;0;1;0;0;0;0 -188;caissier;positive;0;0;0;0;0;0 -189;calcul;positive;0;0;0;1;0;0 -190;calleux;negative;0;0;0;1;0;1 -191;calme;positive;0;0;0;0;0;0 -192;calmer;positive;0;0;0;0;0;0 -193;calomnieux;negative;0;0;0;1;0;1 -194;calvaire;negative;0;1;1;1;1;0 -195;cambrioleur;negative;0;1;0;0;0;1 -196;candidat;positive;0;0;0;0;0;0 -197;candide;negative;0;0;1;0;0;0 -198;capital;positive;0;0;0;0;0;0 -199;capiteux;negative;1;0;0;0;0;0 -200;capitonnage;positive;0;0;0;0;0;0 -201;capricieux;negative;0;0;0;1;0;0 -202;capsule;positive;0;0;0;0;0;0 -203;captiver;positive;0;0;0;0;0;0 -204;captif;negative;0;1;1;0;0;0 -205;capturer au lasso;negative;0;1;0;1;0;0 -206;caritatif;positive;0;0;0;0;0;0 -207;cascade;positive;0;1;0;0;1;0 -208;catcheur;negative;0;1;0;1;0;0 -209;caustique;negative;0;1;0;0;0;1 -210;cavalier;positive;0;0;0;0;0;0 -211;cédant;positive;0;0;0;0;0;0 -212;cellier;positive;0;0;0;0;0;0 -213;cérémoniel;positive;0;0;0;0;0;0 -214;chahut;negative;0;0;0;1;0;1 -215;chahuteur;negative;0;0;0;1;0;0 -216;chamailleur;negative;0;0;0;1;0;1 -217;champion;positive;0;0;0;0;0;0 -218;chancelière;positive;0;0;0;0;0;0 -219;chanceux;positive;1;0;0;0;0;0 -220;chanteur;positive;0;0;0;0;0;0 -221;chaotique;negative;0;1;1;0;0;0 -222;charade;positive;0;0;0;0;1;0 -223;charge;negative;0;1;0;1;1;0 -224;charme;positive;0;0;0;0;1;0 -225;charnel;negative;0;0;0;0;0;0 -226;chasseur;negative;0;1;1;1;0;0 -227;chatouilleur;negative;0;0;0;0;0;0 -228;chemin;positive;0;0;0;0;0;0 -229;chenapan;negative;0;1;0;1;0;1 -230;chercheur;positive;0;0;0;0;0;0 -231;chétif;negative;0;1;1;0;0;1 -232;chevelu;negative;0;0;0;0;0;1 -233;chirurgien;positive;0;0;0;0;0;0 -234;chômeur;negative;0;1;1;0;0;0 -235;cingler;negative;0;1;0;0;1;1 -236;circonscription;positive;0;0;0;0;0;0 -237;cireur;negative;0;0;0;0;0;1 -238;citoyen;positive;0;0;0;0;0;0 -239;civil;positive;0;0;0;0;0;0 -240;clairvoyant;positive;0;0;0;0;0;0 -241;claquement;negative;0;1;0;0;1;0 -242;classification;negative;0;1;1;1;0;0 -243;clef;positive;0;0;0;0;0;0 -244;clément;positive;1;0;0;0;0;0 -245;client;positive;0;0;0;0;0;0 -246;clore;negative;0;0;1;0;0;0 -247;coder;negative;0;0;0;0;0;0 -248;coercitif;negative;0;1;1;0;0;0 -249;cognitif;positive;0;0;0;0;0;0 -250;cohérence;positive;0;0;0;0;0;0 -251;cohésion;positive;0;0;0;0;0;0 -252;cohésif;positive;0;0;0;0;0;0 -253;coiffeur|coiffeuse;positive;0;0;0;0;0;0 -254;collaborateur;positive;0;0;0;0;0;0 -255;collecter;positive;0;0;0;0;0;0 -256;collectionneur;positive;0;0;0;0;0;0 -257;collectif;positive;0;0;0;0;0;0 -258;colonisateur;negative;0;1;0;0;0;0 -259;comateux;negative;0;1;1;0;0;0 -260;combattant;positive;0;0;0;1;0;0 -261;comique;positive;1;0;0;0;0;0 -262;commémoratif;positive;0;0;1;0;0;0 -263;commencement;positive;0;0;0;0;0;0 -264;commentateur;positive;0;0;0;0;0;0 -265;commerçant;positive;0;0;0;0;0;0 -266;commission;positive;0;0;0;0;0;0 -267;commode;positive;1;0;0;0;0;0 -268;commun;positive;0;0;0;0;0;0 -269;communicatif;positive;1;0;0;0;0;0 -270;compact;positive;0;0;0;0;0;0 -271;compensateur;positive;0;0;0;0;0;0 -272;compétence;positive;0;0;0;0;0;0 -273;compétitif;negative;0;0;0;1;0;0 -274;complètement;positive;0;0;0;0;0;0 -275;comploter;negative;0;1;0;1;0;0 -276;compositeur;positive;0;0;0;0;0;0 -277;concevoir;positive;0;0;0;0;0;0 -278;concilier;positive;0;0;0;0;0;0 -279;concorde;positive;0;0;0;0;0;0 -280;concret;positive;0;0;0;0;0;0 -281;concurrent;negative;0;1;1;1;0;1 -282;concurrentiel;negative;0;0;0;1;0;0 -283;conditionnel;positive;0;0;0;0;0;0 -284;confection;positive;0;0;0;0;0;0 -285;confessionnel;positive;0;0;0;0;0;0 -286;confidentiel;positive;0;0;0;0;0;0 -287;conflit;negative;0;0;0;1;0;0 -288;confrérie féminin;positive;0;0;0;0;0;0 -289;confus;negative;0;1;1;0;0;0 -290;conjecture;negative;0;1;1;0;0;0 -291;conjoint;positive;0;0;0;0;0;0 -292;connaisseur;positive;0;0;0;0;0;0 -293;connecter;positive;0;0;0;0;0;0 -294;connaître;positive;0;0;0;0;0;0 -295;conquérant;positive;0;0;0;0;0;0 -296;consciencieux;positive;0;0;0;0;0;0 -297;consécutif;positive;0;0;0;0;0;0 -298;conseiller;positive;0;1;0;1;0;0 -299;consentement;positive;0;0;0;0;0;0 -300;conservation;positive;0;0;0;0;0;0 -301;conservateur;negative;0;0;0;0;1;0 -302;consolateur;positive;1;0;0;0;0;0 -303;conspiration;negative;0;1;1;1;0;1 -304;conspirateur;negative;0;1;0;1;0;1 -305;constamment;negative;0;0;0;0;0;0 -306;constitutionnel;positive;0;0;0;0;0;0 -307;contagieux;negative;0;1;1;0;0;1 -308;conte;positive;1;0;0;0;0;0 -309;contemporain;positive;0;0;0;0;0;0 -310;content;positive;0;0;0;0;0;0 -311;contestable;negative;0;0;0;0;0;0 -312;conteur;positive;0;0;0;0;0;0 -313;contiguë;positive;0;0;0;0;0;0 -314;continuel;positive;0;0;0;0;0;0 -315;contraindre;negative;0;1;0;0;0;0 -316;contrarier;negative;0;1;1;1;0;1 -317;contrebandier;negative;0;1;0;1;0;1 -318;contrecarrer;positive;0;1;0;1;1;0 -319;contremaître;positive;0;0;0;0;0;0 -320;contretemps;negative;0;1;1;0;1;1 -321;contrevenant;negative;0;1;1;1;0;1 -322;contrevenir à;negative;0;0;0;1;0;0 -323;contributrice;positive;0;0;0;0;0;0 -324;convenance;positive;1;0;0;0;0;0 -325;conventionnel;positive;0;0;0;0;0;0 -326;copain;positive;0;0;0;0;0;0 -327;copieur;negative;0;0;0;1;0;1 -328;copine;positive;0;0;0;0;0;0 -329;coquillage;negative;0;0;0;0;0;1 -330;corallien;positive;0;0;0;0;0;0 -331;corbeau;negative;0;0;0;1;0;1 -332;cordial;positive;0;0;0;0;0;0 -333;corporel;positive;0;0;0;0;0;0 -334;correctif;negative;0;1;1;0;0;0 -335;correspondant;positive;0;0;0;0;0;0 -336;costaud;positive;0;1;0;0;0;0 -337;côtier;positive;0;0;0;0;0;0 -338;côtière;positive;0;0;0;0;0;0 -339;coup de feu;negative;0;1;1;1;0;0 -340;courageux;positive;0;1;0;0;0;0 -341;courbure;positive;0;0;0;0;0;0 -342;coureur;positive;0;0;0;0;0;0 -343;courrier;positive;0;0;0;0;0;0 -344;courroie;negative;0;1;0;0;0;0 -345;courtier;positive;0;0;0;0;0;0 -346;coutumier;positive;0;0;0;0;0;0 -347;crainte;negative;0;1;0;0;0;0 -348;craintif;negative;0;1;1;0;0;0 -349;crasseux;negative;0;0;0;0;0;1 -350;créancier;positive;0;0;0;0;0;0 -351;créateur;positive;0;0;0;0;0;0 -352;crémeux;positive;0;0;0;0;0;0 -353;crétin;negative;0;0;0;1;0;1 -354;creux;negative;0;1;1;0;0;0 -355;crevasse;negative;0;1;0;0;1;0 -356;cri;negative;0;1;0;1;1;0 -357;criminel;negative;0;1;0;1;0;1 -358;critiquer;negative;0;0;0;1;0;0 -359;critiqueur;negative;0;0;0;1;0;1 -360;croître;positive;0;0;0;0;0;0 -361;crosse;positive;0;0;0;0;0;0 -362;croyant;positive;0;0;0;0;0;0 -363;cruel;negative;0;1;1;1;0;1 -364;cruellement;negative;0;0;1;0;0;0 -365;cueilleur;positive;0;0;0;0;0;0 -366;cultiver;positive;0;0;0;0;0;0 -367;curatif;positive;0;0;0;0;0;0 -368;curé;positive;0;0;0;0;0;0 -369;curieux;negative;0;0;0;0;0;0 -370;curseur;positive;0;0;0;0;0;0 -371;cursus;positive;0;0;0;0;0;0 -372;cutané;positive;0;0;0;0;0;0 -373;cuve;negative;0;0;0;0;0;1 -374;cuvette;positive;0;0;0;0;0;0 -375;dangereux;negative;0;1;1;1;1;0 -376;danseur;positive;0;0;0;0;0;0 -377;de ce monde;positive;0;0;0;0;0;0 -378;de garçon;positive;0;0;0;0;0;0 -379;de naissance;positive;0;0;0;0;0;0 -380;de travers;negative;0;1;1;0;0;1 -381;débiteur;negative;0;1;1;0;0;0 -382;début;positive;0;0;0;0;0;0 -383;débutant;negative;0;1;0;0;0;0 -384;déception;negative;0;0;1;1;0;0 -385;décès;negative;0;0;1;0;0;0 -386;déchaîner;negative;0;1;0;1;1;1 -387;déclaration;positive;0;0;0;0;0;0 -388;déclarer;positive;0;1;0;0;0;0 -389;déclinaison;positive;0;0;1;0;0;0 -390;décombre|décombres;negative;0;1;1;0;0;1 -391;décontracter;positive;1;0;0;0;0;0 -392;décoratif;positive;0;0;0;0;0;0 -393;décevoir;negative;0;0;1;1;0;0 -394;dédaigneux;negative;0;0;0;1;0;1 -395;défaire son valise;positive;0;0;0;0;0;0 -396;défaire;negative;0;0;0;0;0;0 -397;défectueux;negative;0;0;1;0;0;1 -398;défendable;positive;0;0;0;0;0;0 -399;défendeur;positive;0;1;1;1;0;0 -400;défensif;negative;0;0;0;0;0;0 -401;déficience;negative;0;0;1;0;0;0 -402;dégât;negative;0;0;1;1;0;1 -403;dégénérer;negative;0;1;0;0;0;1 -404;dégoûter;negative;0;1;1;1;0;1 -405;délabrer;negative;0;0;1;0;0;0 -406;délaver;negative;0;0;1;0;0;0 -407;déléguer;positive;0;0;0;0;0;0 -408;délicat;negative;0;1;0;0;0;0 -409;délicatesse;positive;0;0;0;0;0;0 -410;délice;positive;1;0;0;0;0;0 -411;délicieux;positive;1;0;0;0;0;0 -412;délinquant;negative;0;1;1;1;0;1 -413;demanderesse;negative;0;0;1;1;0;1 -414;démence;negative;0;1;1;1;0;1 -415;dément;negative;0;1;0;1;0;0 -416;demeure;positive;0;0;0;0;0;0 -417;démonstrateur;positive;0;0;0;0;0;0 -418;dentaire;positive;0;0;0;0;0;0 -419;dénuer;negative;0;1;1;0;0;0 -420;dépareiller;negative;0;0;0;0;0;0 -421;déplacer;negative;0;0;0;1;1;0 -422;déplaire;negative;0;0;1;0;0;1 -423;dépourvue;negative;0;0;1;0;0;0 -424;dépourvues;negative;0;0;1;0;0;0 -425;dépourvus;negative;0;0;1;0;0;0 -426;dépressif;negative;0;1;1;1;0;0 -427;dérogation;positive;0;0;0;0;0;0 -428;dérouter;negative;0;1;1;0;1;0 -429;du conjoint;positive;0;0;0;0;0;0 -430;désagrément;negative;0;0;0;1;0;0 -431;désapprobateur;negative;0;0;1;1;0;1 -432;désastreux;negative;0;1;1;1;0;1 -433;désavantage;negative;0;0;1;0;0;0 -434;descendant;positive;0;0;0;0;0;0 -435;descriptif;positive;0;0;0;0;0;0 -436;déshonneur;negative;0;0;1;0;0;1 -437;désopiler;positive;0;0;0;0;1;0 -438;désordre;negative;0;1;0;1;1;0 -439;désorganisation;negative;0;0;0;0;0;0 -440;dessiner le contour;positive;0;0;0;0;0;0 -441;destroyer;negative;0;1;0;1;0;0 -442;destructeur;negative;0;1;1;1;0;1 -443;déstructurer;negative;0;1;1;0;0;0 -444;détenteur;positive;0;0;0;0;0;0 -445;détenir;negative;0;1;1;1;0;1 -446;déterminer;positive;0;0;0;0;0;0 -447;détourner;negative;0;1;1;0;0;0 -448;dévalorisation;negative;0;1;1;0;0;0 -449;dévastateur;negative;0;1;1;1;0;1 -450;dévoiler;negative;0;1;0;0;1;0 -451;dictateur;negative;0;1;1;1;0;0 -452;diffamatoire;negative;0;0;0;1;0;1 -453;différend;negative;0;0;1;1;0;0 -454;différentiel;positive;0;0;0;0;0;0 -455;difficile;negative;0;0;1;0;0;0 -456;difficulté;negative;0;0;1;0;0;0 -457;difforme;negative;0;1;1;0;0;1 -458;difformité;negative;0;1;1;0;0;1 -459;diminuer;negative;0;0;1;0;0;0 -460;diminution;negative;0;0;1;0;0;0 -461;dingue;negative;0;1;0;0;1;1 -462;directement;positive;0;0;0;0;0;0 -463;directeur|directrice de le photographie;positive;0;0;0;0;0;0 -464;discipliner;positive;0;0;0;0;0;0 -465;discordance;negative;0;0;0;1;0;0 -466;discret;positive;0;0;1;0;1;0 -467;disgracieux;negative;0;0;0;0;0;1 -468;dispute;negative;0;1;1;1;0;1 -469;dissident;negative;0;1;0;1;0;0 -470;dissimuler;negative;0;1;1;0;0;0 -471;distinction;positive;0;0;0;0;1;0 -472;distinctif;positive;0;0;0;0;0;0 -473;distinguer;positive;0;0;0;0;0;0 -474;divertir;positive;1;0;0;0;0;0 -475;divin;positive;0;0;0;0;0;0 -476;diviser en deux;negative;0;0;0;0;0;0 -477;divulgation;negative;0;1;0;0;1;0 -478;dominateur;negative;0;0;0;1;0;0 -479;donateur;positive;0;0;0;0;0;0 -480;donner son approbation à;positive;0;0;0;0;0;0 -481;donneur;positive;0;0;0;0;0;0 -482;dormeur|dormeuse;positive;0;0;0;0;0;0 -483;doux;positive;0;0;1;0;0;0 -484;douer;positive;0;0;0;0;0;0 -485;douloureux;negative;0;1;1;1;0;1 -486;douteur;negative;0;1;0;0;0;1 -487;doyen;positive;0;0;0;0;0;0 -488;draconien;negative;0;0;1;0;0;0 -489;du gouverneur;positive;0;0;0;0;0;0 -490;du moi|mois précédent;positive;0;0;0;0;0;0 -491;dual;positive;0;0;0;0;0;0 -492;dubitatif;negative;0;1;0;0;0;0 -493;duperie;negative;0;1;1;1;1;1 -494;duplicata;positive;0;0;0;0;0;0 -495;duveteux;positive;1;0;0;0;0;0 -496;ébouriffer;negative;0;0;0;0;0;1 -497;ébranler;negative;0;1;1;0;1;0 -498;écailleur;negative;0;0;0;0;0;1 -499;écartement;positive;0;0;0;0;0;0 -500;échec;negative;0;0;1;0;0;1 -501;éclaireur;positive;0;0;0;0;0;0 -502;éclat;positive;1;0;0;0;0;0 -503;économe;positive;0;0;0;0;0;0 -504;écoulement;positive;0;0;0;0;0;0 -505;écraser;negative;0;0;1;0;0;0 -506;écume;positive;0;0;0;0;0;1 -507;écumeur;negative;0;0;0;0;0;1 -508;édifice;positive;0;0;0;0;0;0 -509;éditeur;positive;0;0;0;0;0;0 -510;effervescence;negative;0;1;0;0;1;0 -511;effrayer|effrayer;negative;0;1;1;1;0;1 -512;effroyable;negative;0;0;1;0;1;0 -513;égarer;negative;0;1;1;0;1;0 -514;élan;positive;0;0;0;0;0;0 -515;électeur;positive;0;0;0;0;0;0 -516;éleveur;positive;0;0;0;0;0;0 -517;élocution;positive;0;0;0;0;0;0 -518;emballeur;positive;0;0;0;0;0;0 -519;embarrasser;negative;0;1;0;0;0;1 -520;éminent;positive;0;0;0;0;0;0 -521;émotif;negative;0;1;1;0;0;0 -522;empaqueteur|empaqueteuse;positive;0;0;0;0;0;0 -523;employer;positive;0;0;0;0;0;0 -524;employer de bureau;positive;0;0;0;0;0;0 -525;empoisonner;negative;0;1;1;1;1;1 -526;empreinte digital;positive;0;0;0;0;0;0 -527;emprunteur;negative;0;0;0;0;0;0 -528;en avant;positive;0;0;0;0;0;0 -529;en diminution;negative;0;0;1;0;0;0 -530;en double;positive;0;0;0;0;0;0 -531;en extase;positive;0;0;0;0;1;0 -532;en flamme;negative;0;1;0;1;0;0 -533;en ivoire;positive;0;0;0;0;0;0 -534;en or;positive;0;0;0;0;0;0 -535;en totalité;positive;0;0;0;0;0;0 -536;enchérisseuse;positive;0;0;0;0;0;0 -537;endormir;positive;0;0;0;0;0;0 -538;enduire;positive;0;0;0;0;0;0 -539;enflammer;negative;0;0;0;1;0;0 -540;engager;positive;0;0;0;0;0;0 -541;enlever;negative;0;1;1;1;0;0 -542;ennemi;negative;0;1;1;1;0;1 -543;ennuyeux;negative;0;1;1;1;0;1 -544;énormément;negative;0;0;1;0;0;0 -545;enquêtrice;positive;0;0;0;0;0;0 -546;entaille;negative;0;1;1;0;0;0 -547;entente;positive;0;0;0;0;0;0 -548;entier;positive;0;0;0;0;0;0 -549;entrain;positive;0;0;0;0;0;0 -550;entraîneur;positive;0;0;0;0;0;0 -551;entre parenthèse;negative;0;0;0;0;0;0 -552;entremetteur;positive;0;0;0;0;0;0 -553;envieux;negative;0;0;0;1;0;0 -554;environ|environs;positive;0;0;0;0;0;0 -555;envoyer;positive;0;0;0;0;0;0 -556;épars;negative;0;0;1;0;0;0 -557;épicier;positive;0;0;0;0;0;0 -558;épineux;negative;0;1;1;1;1;1 -559;éploré;negative;0;1;1;1;0;0 -560;épluchure;negative;0;0;0;0;0;0 -561;épouse;positive;0;0;0;0;0;0 -562;épouvantable;negative;0;1;1;1;0;1 -563;équivalent;positive;0;0;0;0;0;0 -564;éroder;negative;0;0;1;0;0;1 -565;escarper;negative;0;1;0;0;0;0 -566;escroquer;negative;0;1;1;1;1;0 -567;espèce;positive;0;0;0;0;0;0 -568;espiègle;positive;0;0;0;1;1;0 -569;espion;negative;0;1;0;0;1;0 -570;esprit du mal;negative;0;1;0;1;0;1 -571;estimable;positive;0;0;0;0;0;0 -572;étape;positive;0;0;0;0;0;0 -573;étendre;negative;0;1;1;1;0;1 -574;éternel;positive;0;0;1;0;0;0 -575;étonnant;positive;0;0;0;0;1;0 -576;étouffer;negative;0;1;1;1;0;0 -577;étrange;negative;0;1;0;0;1;1 -578;étranger;negative;0;1;1;0;0;1 -579;être apprenti;positive;0;0;0;0;0;0 -580;être constamment sur le dos de;negative;0;1;1;1;0;0 -581;étreindre;positive;0;0;0;0;1;0 -582;étreinte;positive;0;0;0;0;0;0 -583;étudiant;positive;0;0;0;0;0;0 -584;évasif;negative;0;0;0;0;1;0 -585;éventuel;negative;0;0;0;0;0;0 -586;évitement;negative;0;0;0;0;0;1 -587;évocateur;positive;0;0;0;0;0;0 -588;examinateur;positive;0;0;0;0;0;0 -589;exceptionnel;positive;0;0;0;0;1;0 -590;excessif;negative;0;0;1;1;0;0 -591;excursion;positive;0;0;0;0;0;0 -592;excuser;positive;0;0;0;0;0;0 -593;excuser moi;positive;0;0;0;0;0;0 -594;exécrer;negative;0;1;0;1;0;1 -595;exécuteur testamentaire;positive;0;0;0;0;0;0 -596;exhaustif;positive;0;0;0;0;0;0 -597;exiger;negative;0;0;0;1;0;0 -598;exister;positive;0;0;0;0;0;0 -599;existence;positive;1;0;0;0;0;0 -600;expatrier;negative;0;1;1;0;0;0 -601;expérimentateur;positive;0;0;0;0;0;0 -602;expérimenter;positive;0;0;0;0;0;0 -603;expert;positive;0;0;0;0;0;0 -604;expertise;positive;0;0;0;0;0;0 -605;explicatif;positive;0;0;0;0;0;0 -606;explosif;negative;0;1;0;1;1;0 -607;expulser;negative;0;1;1;1;1;0 -608;exténuer;negative;0;0;1;0;0;0 -609;extrêmement;negative;0;0;1;0;0;0 -610;fabricant;positive;0;0;0;0;0;0 -611;fabriquer;positive;0;0;0;0;0;0 -612;fabriquer de tout pièce;negative;0;0;0;0;0;0 -613;facile;positive;0;0;0;0;0;0 -614;facultatif;positive;0;0;0;0;0;0 -615;faire attention à;negative;0;1;0;0;0;0 -616;faire dissidence;negative;0;0;0;1;0;0 -617;faire du shopping;positive;0;0;0;0;1;0 -618;faire obstacle à;negative;0;0;1;1;0;0 -619;faire un manifestation devant;negative;0;1;0;1;1;0 -620;faire un sieste;positive;0;0;0;0;0;0 -621;faisable;positive;1;0;0;0;0;0 -622;fallacieux;negative;0;0;0;1;0;1 -623;familial;positive;0;0;0;0;0;0 -624;fanatique;positive;0;1;0;1;0;0 -625;farfadet;positive;0;1;0;0;0;0 -626;fastidieux;negative;0;0;1;0;0;0 -627;FAUX;negative;0;1;1;1;0;1 -628;favorable;positive;1;0;0;0;0;0 -629;fécond;positive;0;0;0;0;0;0 -630;feignant;negative;0;0;0;0;0;1 -631;féminin;positive;0;0;0;0;0;0 -632;fermier;positive;0;0;0;0;0;0 -633;fermoir;positive;0;0;0;0;0;0 -634;fervent;positive;0;0;0;0;0;0 -635;ferveur;positive;1;0;0;0;0;0 -636;festin;positive;1;0;0;0;0;0 -637;festif;positive;1;0;0;0;0;0 -638;feutrer;positive;0;0;0;0;0;0 -639;fidèle;positive;0;0;0;0;0;0 -640;fier;positive;0;0;0;0;0;0 -641;fiévreux;negative;0;1;0;0;0;0 -642;figuratif;positive;0;0;0;0;0;0 -643;filandreux;negative;0;0;0;0;0;1 -644;fin;negative;0;1;1;0;0;0 -645;flatteur;positive;1;0;0;0;0;0 -646;flot;negative;0;1;0;0;1;0 -647;folle|fou;negative;0;1;0;1;1;1 -648;folle|fou de joie;positive;1;0;0;0;0;0 -649;folle|fou furieux;negative;0;1;0;1;0;1 -650;fonceur;positive;0;0;0;0;0;0 -651;fonctionnel;positive;0;0;0;0;0;0 -652;fondateur;positive;0;0;0;0;0;0 -653;forcer;negative;0;1;0;0;0;0 -654;forcément;positive;0;0;0;0;0;0 -655;foreur;negative;0;1;0;1;0;0 -656;formatif;positive;0;0;0;0;0;0 -657;formateur;positive;0;0;0;0;0;0 -658;forme;positive;0;0;0;0;0;0 -659;fort;positive;0;0;0;0;0;0 -660;forteresse;positive;0;0;0;0;0;0 -661;fouillis;negative;0;0;0;1;0;1 -662;fouineur;negative;0;0;0;1;0;1 -663;fourgonnette;positive;0;0;0;0;0;0 -664;fragmenter;negative;0;0;1;0;0;0 -665;franc;positive;0;0;0;0;1;0 -666;fraternel;positive;0;0;0;0;0;0 -667;frauduleux;negative;0;0;0;1;0;1 -668;frimeur;negative;0;0;0;1;0;0 -669;frisson;negative;0;1;0;0;0;0 -670;froid;negative;0;0;1;1;0;0 -671;fructueux;positive;1;0;0;0;0;0 -672;fruit de l imagination;positive;0;0;0;0;0;0 -673;fugitif;negative;0;1;1;1;0;1 -674;fugueur;negative;0;1;1;0;0;0 -675;fumeur|fumeuse;negative;0;0;0;0;0;1 -676;furie;negative;0;1;1;1;0;0 -677;furieux;negative;0;0;0;1;0;1 -678;furtif;negative;0;1;0;0;1;0 -679;futé;negative;1;0;0;0;0;0 -680;gadoue;negative;0;0;0;0;0;1 -681;gagnant;positive;0;0;0;0;1;0 -682;gain;positive;0;0;0;0;1;0 -683;gamin;positive;0;0;0;1;0;0 -684;garant;positive;0;0;0;0;0;0 -685;gardien;positive;0;0;0;0;0;0 -686;garnement;negative;0;0;0;1;0;0 -687;gaspilleur;negative;0;0;1;1;0;1 -688;gazouillis;positive;1;0;0;0;0;0 -689;géant;negative;0;1;0;0;0;1 -690;gélatineux;negative;0;0;0;0;0;1 -691;gemme;positive;1;0;0;0;0;0 -692;gêner;negative;0;1;0;0;0;0 -693;généraliser;positive;0;0;0;0;0;0 -694;générateur|génératrice;positive;0;0;0;0;0;0 -695;généreux;positive;0;0;0;0;0;0 -696;genre;positive;0;0;0;0;0;0 -697;girond;positive;0;0;0;0;0;0 -698;gitan;negative;0;0;0;0;0;1 -699;glaçage;positive;0;0;0;0;0;0 -700;glauque;negative;0;1;1;0;0;1 -701;globalité;positive;0;0;0;0;0;0 -702;glume;positive;0;0;0;0;0;0 -703;gousse;positive;0;0;0;0;0;0 -704;gracieux;positive;0;0;0;0;0;0 -705;graduel;positive;0;0;0;0;0;0 -706;grain;positive;0;0;0;0;0;0 -707;graisseur|graisseux;negative;0;0;0;0;0;1 -708;grand salle;positive;0;0;0;0;0;0 -709;granuleux;negative;0;0;0;0;0;1 -710;gras;negative;0;0;0;0;0;1 -711;gravats;negative;0;1;1;0;0;0 -712;graveleux;negative;0;0;0;0;0;1 -713;graveur;positive;0;0;0;0;0;0 -714;grincheux;negative;0;0;1;1;0;0 -715;grisonner;negative;0;0;1;0;0;1 -716;grizzly;negative;0;1;0;0;0;0 -717;grossier;negative;0;0;0;0;0;1 -718;grossièreté;negative;0;0;0;1;0;1 -719;guenille;negative;0;0;1;0;0;1 -720;guérissable;positive;0;0;0;0;0;0 -721;guerrier;negative;0;1;0;1;0;0 -722;habitant;positive;0;0;0;0;0;0 -723;habit;positive;0;0;0;0;0;0 -724;habituer;positive;0;0;0;0;0;0 -725;habituel;positive;0;0;0;0;0;0 -726;haillon;negative;0;0;1;0;0;1 -727;haine;negative;0;0;0;1;0;1 -728;handicaper;negative;0;1;1;0;0;0 -729;hanter;negative;0;1;1;0;0;0 -730;harmonieux;positive;0;0;0;0;0;0 -731;harnachement;negative;0;1;1;0;0;0 -732;hâtif;negative;0;0;0;1;0;0 -733;haut;negative;0;0;0;0;0;0 -734;herbeux;negative;0;0;0;0;0;0 -735;héritage;positive;0;0;0;0;0;0 -736;heureux;positive;1;0;0;0;0;0 -737;hideux;negative;0;1;1;0;0;1 -738;historien;positive;0;0;0;0;0;0 -739;homosexuel;negative;0;1;0;0;0;0 -740;honteux;negative;0;1;1;1;0;1 -741;horrible;negative;0;1;0;0;0;1 -742;hors pair;positive;0;1;0;0;0;0 -743;hostilité;negative;0;0;0;1;0;1 -744;houleux;negative;0;1;0;1;0;0 -745;hystérique;negative;0;1;0;1;0;0 -746;idiot;negative;0;0;0;1;0;1 -747;ignifuger;positive;0;0;0;0;0;0 -748;illettré;negative;0;0;1;0;0;1 -749;illimiter;positive;0;0;0;0;0;0 -750;illustre;positive;0;0;0;0;0;0 -751;imaginatif|imaginative;positive;0;0;0;0;0;0 -752;imbécile;negative;0;0;0;1;0;1 -753;imitateur;negative;0;0;0;1;0;1 -754;immaculé;positive;0;0;0;0;0;0 -755;immatériel;negative;0;0;1;0;0;0 -756;immense;positive;0;0;0;0;0;0 -757;immigrant;negative;0;1;1;0;0;0 -758;immigrer;negative;0;1;1;0;0;0 -759;immonde;negative;0;1;1;1;0;1 -760;immortel|immortelle;positive;0;0;0;0;0;0 -761;impensable;negative;0;1;0;0;0;1 -762;impératif;negative;0;0;0;0;0;0 -763;impersonnel;negative;0;0;1;0;0;0 -764;impitoyable;negative;0;1;0;1;0;0 -765;importun;negative;0;0;0;1;0;1 -766;imprécis;negative;0;1;1;0;0;0 -767;imprévu;negative;0;0;0;0;1;0 -768;improductif;negative;0;0;1;1;0;0 -769;inactif;negative;0;0;1;0;0;0 -770;inadéquat;negative;0;0;1;0;0;0 -771;inattendu;negative;0;0;0;0;1;0 -772;inattention;negative;0;1;1;0;0;0 -773;incalculable;negative;0;0;0;0;0;0 -774;incendie criminel;negative;0;1;0;1;0;0 -775;incendie de forêt;negative;0;1;1;0;1;0 -776;incestueux;negative;0;1;1;0;0;1 -777;incisive;negative;0;0;1;1;0;0 -778;inclure;positive;0;0;0;0;0;0 -779;incohérent;negative;0;1;0;0;0;0 -780;incomparable;positive;0;0;0;0;0;0 -781;incompétent;negative;0;0;1;0;0;0 -782;incompréhensible;negative;0;0;1;0;0;0 -783;inconcevable;negative;0;1;0;1;0;1 -784;inconnu|inconnue;negative;0;1;0;0;0;0 -785;inconscient;negative;0;1;0;0;0;0 -786;inconvenance;negative;0;0;0;1;0;1 -787;indécent;negative;0;0;0;0;0;1 -788;indic;negative;0;0;0;0;0;0 -789;indication;positive;0;0;0;0;0;0 -790;indicatif;positive;0;0;0;0;0;0 -791;indigent;negative;0;1;1;0;0;0 -792;indiscret;negative;0;0;0;1;0;1 -793;indompté;negative;0;0;0;1;0;0 -794;industrie de le pêche;positive;0;0;0;0;0;0 -795;industrieux;positive;0;0;0;0;0;0 -796;inébranlable;positive;0;0;0;0;0;0 -797;inéluctable;negative;0;1;1;0;0;0 -798;inexplicable;negative;0;0;1;0;0;0 -799;inextensible;negative;0;0;0;0;0;0 -800;infâme;negative;0;1;1;1;1;1 -801;infect;negative;0;1;0;1;0;1 -802;infectieux;negative;0;1;1;0;0;1 -803;inférieur;negative;0;1;1;1;0;0 -804;infertile;negative;0;0;1;0;0;0 -805;infiltration;negative;0;0;0;0;0;1 -806;inflexible;negative;0;0;0;1;0;0 -807;influençable;negative;0;0;0;0;0;0 -808;informateur;positive;0;0;0;0;0;0 -809;infraction;negative;0;1;1;1;0;1 -810;ingénieux;positive;0;0;0;0;0;0 -811;inhabituel;negative;0;0;0;0;1;0 -812;inhospitalier;negative;0;1;1;0;0;0 -813;initiateur;positive;0;0;0;0;0;0 -814;initier;positive;0;0;0;0;0;0 -815;injustifiable;negative;0;0;1;1;0;1 -816;innocent;positive;0;0;0;0;0;0 -817;inoffensif;positive;0;0;0;0;0;0 -818;inquiet;negative;0;1;1;0;0;0 -819;inquisiteur;negative;0;1;1;1;1;0 -820;insensible;negative;0;0;1;0;0;1 -821;insidieux;negative;0;1;0;1;0;1 -822;insolite;negative;0;0;0;0;1;0 -823;insouciant;negative;0;0;1;1;0;1 -824;insoutenable;negative;0;1;1;0;0;1 -825;inspecteur;positive;0;0;0;0;0;0 -826;instinctif;positive;0;1;0;1;0;1 -827;instructif;positive;0;0;0;0;0;0 -828;instructrice;positive;0;0;0;0;0;0 -829;instruire;positive;0;0;0;0;0;0 -830;insurger;negative;0;0;0;1;0;0 -831;intellectuel;positive;0;0;0;0;0;0 -832;intenter un procès à;negative;0;0;1;1;0;0 -833;intentionnel;negative;0;0;0;1;0;0 -834;interminable;negative;0;1;1;1;0;0 -835;interrogateur;negative;0;1;0;0;0;0 -836;interrompre;negative;0;0;1;1;1;0 -837;interruption;negative;0;0;1;0;1;0 -838;intervieweur;positive;0;1;0;0;0;0 -839;intime;positive;0;0;0;0;0;0 -840;introductif;positive;0;0;0;0;0;0 -841;introspectif;positive;0;0;0;0;0;0 -842;introverti;negative;0;1;1;0;0;0 -843;intrus;negative;0;1;0;1;1;0 -844;intrusion;negative;0;1;1;1;1;0 -845;intrusif;negative;0;1;0;1;1;1 -846;intuitif;positive;0;0;0;0;0;0 -847;inutilisé;negative;0;0;1;0;0;0 -848;invariable;positive;0;0;0;0;0;0 -849;inventif;positive;1;0;0;0;0;0 -850;inventeur;positive;0;0;0;0;0;0 -851;investigateur;positive;0;0;0;0;0;0 -852;irrationnel;negative;0;1;0;0;0;1 -853;irréel;negative;0;1;1;0;1;0 -854;irréfléchi;negative;0;1;0;1;1;0 -855;irrégulier;negative;0;1;1;1;0;0 -856;irrespectueux;negative;0;1;1;1;0;1 -857;irrévérencieux;negative;0;0;0;1;0;1 -858;isoler;negative;0;0;1;0;0;0 -859;itératif;positive;0;0;0;0;0;0 -860;jadis;positive;0;0;0;0;0;0 -861;jappement;negative;0;1;0;1;1;0 -862;jeter;negative;0;1;0;1;0;0 -863;jeu de hasard;positive;0;0;0;0;0;0 -864;joaillier;positive;0;0;0;0;0;0 -865;jovial;positive;1;0;0;0;0;0 -866;joyeux;positive;0;0;0;0;1;0 -867;joyeusement;positive;1;0;0;0;0;0 -868;judicieux;positive;0;0;0;0;0;0 -869;jumelle;positive;0;0;0;0;0;0 -870;kidnapper;negative;0;1;1;1;1;0 -871;le plus intime;positive;0;0;0;0;0;0 -872;le plus secret;positive;0;0;0;0;0;0 -873;laborieux;negative;0;0;1;0;0;0 -874;laineur|laineuse;positive;0;0;0;0;0;0 -875;laisser sans surveillance;negative;0;1;1;0;0;0 -876;laiterie;positive;0;0;0;0;0;0 -877;laiteux;positive;0;0;0;0;0;0 -878;lame;positive;0;1;0;0;0;0 -879;lamelle;positive;0;0;0;0;0;0 -880;lamentable;negative;0;1;1;1;0;1 -881;lascif;negative;0;0;0;0;0;1 -882;las;negative;0;0;1;0;0;0 -883;latéral;positive;0;0;0;0;0;0 -884;latéralement;negative;0;0;0;0;0;0 -885;lauréat;positive;0;0;0;0;0;0 -886;laxatif;negative;0;1;0;0;0;1 -887;léger;positive;0;0;0;0;0;0 -888;législatif;positive;0;0;0;0;0;0 -889;législateur;positive;0;0;0;0;0;0 -890;leurre;negative;0;1;0;0;1;0 -891;libéral;positive;0;0;0;0;0;0 -892;libidineux;positive;1;0;0;0;0;0 -893;licenciement;negative;0;1;1;1;0;0 -894;ligneux;positive;0;0;0;0;0;0 -895;limitatif;negative;0;1;1;0;0;0 -896;limite;negative;0;0;0;0;0;0 -897;limitrophe;positive;0;0;0;0;0;0 -898;lit de bébé;positive;0;0;0;0;0;0 -899;lit cage;positive;0;0;0;0;0;0 -900;litigieux;negative;0;1;0;1;0;1 -901;locution;positive;0;0;0;0;0;0 -902;locuteur;positive;0;0;0;0;0;0 -903;logement;positive;0;0;0;0;0;0 -904;longue;positive;0;0;0;0;0;0 -905;louable;positive;0;0;0;0;1;0 -906;lourd;negative;0;0;1;1;0;0 -907;loyal;positive;0;0;0;0;0;0 -908;loyauté;positive;0;0;0;0;0;0 -909;lucratif;positive;1;0;0;0;0;0 -910;lueur vacillant;negative;0;1;0;0;1;0 -911;lumière éblouissant;negative;0;1;0;1;0;0 -912;lumineux;positive;1;0;0;0;0;0 -913;lunatique;negative;0;0;0;0;1;0 -914;lustrer;positive;0;0;0;0;0;0 -915;lutteur;negative;0;1;0;1;0;0 -916;luxueux;positive;1;0;0;0;0;0 -917;magicien;positive;0;0;0;0;1;0 -918;magnitude;positive;0;0;0;0;0;0 -919;maîtrise;positive;0;0;0;0;1;0 -920;majesté;positive;1;0;0;0;0;0 -921;majestueux;positive;0;0;0;0;1;0 -922;malade;negative;0;1;1;0;0;0 -923;maladif;negative;0;0;1;0;0;1 -924;maladroit;negative;0;1;0;0;0;1 -925;malavisé;negative;0;0;0;0;0;1 -926;malchanceux;negative;0;1;1;1;0;1 -927;malheureux;negative;0;0;1;1;0;1 -928;maligne;negative;0;1;1;1;0;0 -929;malléable;positive;0;0;0;0;0;0 -930;malpropre;negative;0;0;0;0;0;1 -931;malveillant;negative;0;0;0;1;0;0 -932;maniable;positive;0;0;0;0;0;0 -933;manière;negative;0;0;0;1;0;1 -934;manifestant;positive;0;0;0;0;0;0 -935;manifeste;positive;0;1;0;0;0;0 -936;manuelle;positive;0;0;0;0;0;0 -937;marais;negative;0;1;0;0;0;1 -938;marchand;positive;0;0;0;0;0;0 -939;marchand de fruit et légume;positive;0;0;0;0;0;0 -940;marcheur;positive;0;0;0;0;0;0 -941;marécage;negative;0;1;1;0;0;1 -942;marécageux;negative;0;1;0;0;0;1 -943;marginal;negative;0;0;1;0;0;0 -944;marieur;positive;0;0;0;0;0;0 -945;marinade;negative;0;1;0;0;0;0 -946;marmonner;negative;0;1;1;1;0;0 -947;martyr|martyre;negative;0;1;1;0;0;0 -948;masculinité;positive;0;0;0;0;0;0 -949;matelas;positive;0;0;0;0;0;0 -950;matelassage;positive;0;0;0;0;0;0 -951;matériel;positive;0;0;0;0;0;0 -952;maternel;positive;0;0;0;0;0;0 -953;mathématicien;positive;0;0;0;0;0;0 -954;matière visqueux;negative;0;0;0;0;0;1 -955;maudire;negative;0;0;0;1;0;0 -956;maussade;negative;0;1;1;0;0;0 -957;maximum;positive;0;0;0;0;0;0 -958;mec;negative;0;0;0;0;0;0 -959;mécanicien;positive;0;0;0;0;0;0 -960;mécanisme;positive;0;0;0;0;0;0 -961;méconnaître;negative;0;0;1;0;0;0 -962;médiateur|médiatrice;positive;0;0;0;0;0;0 -963;méditerranéen;positive;0;0;0;0;0;0 -964;mélancolique;negative;0;0;1;0;0;0 -965;mélanger;positive;0;0;0;0;0;0 -966;mélodieux;positive;0;0;0;0;0;0 -967;mendiant;negative;0;0;1;0;0;0 -968;menstruation;negative;0;0;0;0;0;0 -969;menstruel;positive;0;0;0;0;0;0 -970;menteur;negative;0;0;0;1;0;1 -971;menu;positive;0;0;0;0;0;0 -972;méprendre;negative;0;0;0;1;0;1 -973;méprisable;negative;0;0;0;1;0;1 -974;mercuriel;negative;0;1;0;1;1;0 -975;mériter;positive;0;0;0;0;0;0 -976;merveilleux;positive;0;0;0;0;1;0 -977;messager;positive;0;0;0;0;0;0 -978;méticuleux;negative;0;1;1;0;0;1 -979;métier;positive;0;0;0;0;0;0 -980;mettre en liberté conditionnel;positive;0;0;0;0;0;0 -981;meulage;negative;0;0;0;1;0;1 -982;meurtrier|meurtrière;negative;0;1;1;1;1;1 -983;militant;negative;0;0;0;1;0;0 -984;mince;negative;0;1;1;0;0;0 -985;miniature;negative;0;1;1;0;0;0 -986;ministériel;positive;0;0;0;0;0;0 -987;minuscule;positive;0;0;1;0;0;0 -988;minutieux;positive;0;0;0;0;0;0 -989;miraculeux;positive;0;0;0;0;1;0 -990;miséricordieux;positive;1;0;0;0;0;0 -991;mixture;negative;0;0;0;0;0;1 -992;modèle;positive;0;0;0;0;0;0 -993;modérateur;positive;0;0;0;0;0;0 -994;modérer;positive;0;0;0;0;0;0 -995;modeste;positive;0;0;1;0;0;0 -996;mou;negative;0;0;1;0;0;1 -997;montagneux;positive;0;0;0;0;0;0 -998;monter;positive;0;0;0;0;0;0 -999;moqueur;negative;0;0;1;1;0;1 -1000;morne;negative;0;0;1;0;0;0 -1001;morose;negative;0;0;1;0;0;0 -1002;mortel;negative;0;1;1;1;0;1 -1003;motocross;negative;0;1;0;1;0;0 -1004;mouchard;negative;0;0;0;1;0;0 -1005;mouffette;negative;0;0;0;0;0;1 -1006;mousse;negative;0;0;0;0;0;1 -1007;mousseux;negative;0;0;0;0;0;1 -1008;mouvement;positive;0;0;0;0;0;0 -1009;moyenne;positive;0;0;0;0;0;0 -1010;muet|muette;negative;0;1;1;0;1;0 -1011;mugissement;negative;0;1;1;1;0;0 -1012;musicien;positive;0;0;0;0;0;0 -1013;mutuel;positive;0;0;0;0;0;0 -1014;mystérieux;negative;0;1;0;0;1;0 -1015;nain;negative;0;0;0;0;0;0 -1016;narquois;negative;0;0;0;1;0;1 -1017;narrateur;positive;0;0;0;0;0;0 -1018;nauséeux;negative;0;0;1;0;0;1 -1019;navigateur;positive;0;0;0;0;0;0 -1020;nébuleuse;negative;0;1;0;0;0;0 -1021;négociant;positive;0;0;0;0;0;0 -1022;négociateur;positive;0;0;0;0;0;0 -1023;négresse;negative;0;0;0;1;0;0 -1024;neigeux;positive;0;0;0;0;0;0 -1025;néné;negative;0;0;0;0;0;0 -1026;nerveux;positive;0;0;0;0;1;0 -1027;nette;positive;0;0;0;0;0;0 -1028;névrosé;negative;0;1;1;0;0;1 -1029;nichon;negative;0;0;0;0;0;0 -1030;noble;negative;0;0;0;0;0;0 -1031;nocif;negative;0;1;1;1;0;1 -1032;nominée;positive;0;0;0;0;0;0 -1033;nommer;positive;0;0;0;0;0;0 -1034;non contraindre;positive;0;0;0;0;0;0 -1035;non divulguer;negative;0;1;0;0;0;0 -1036;non immatriculer;negative;0;1;1;0;0;0 -1037;non officiel;negative;0;1;0;0;0;0 -1038;non organique;negative;0;0;0;0;0;0 -1039;non souhaiter;negative;0;0;1;0;0;0 -1040;non surveiller;negative;0;1;0;0;1;0 -1041;non tacher;positive;0;0;0;0;0;0 -1042;non valider;negative;0;0;0;0;0;1 -1043;non résident;negative;0;0;0;0;0;0 -1044;nonchalamment;positive;1;0;0;0;0;0 -1045;nonchalant;negative;1;0;0;0;0;0 -1046;nonne;positive;0;0;0;0;0;0 -1047;normatif;positive;0;0;0;0;0;0 -1048;notionnel;negative;0;0;0;0;0;0 -1049;notoriété;positive;0;0;0;0;0;0 -1050;nouveau;positive;0;0;0;0;0;0 -1051;nouveau venu|venue;positive;0;1;0;0;1;0 -1052;nuageux;negative;0;0;1;0;0;0 -1053;nuisible;negative;0;1;1;1;0;1 -1054;nul;negative;0;1;1;0;0;1 -1055;nutritif;positive;0;0;0;0;0;0 -1056;objectif;positive;0;0;0;0;0;0 -1057;obligatoire;positive;0;0;0;0;0;0 -1058;obliger;negative;0;1;0;0;0;0 -1059;obscénité;negative;0;0;0;1;0;1 -1060;obséquieux;negative;0;1;1;1;0;1 -1061;observateur;positive;0;0;0;0;0;0 -1062;obstétricien;positive;0;0;0;0;0;0 -1063;occasion;positive;0;0;0;0;1;0 -1064;occasionnel;positive;0;0;0;0;1;0 -1065;occupant;positive;0;0;0;0;0;0 -1066;odieux;negative;0;1;1;1;0;1 -1067;odorer;positive;0;0;0;0;0;0 -1068;offense;negative;0;1;1;1;1;1 -1069;officiant;positive;1;0;0;0;0;0 -1070;officieux;negative;0;1;0;0;0;0 -1071;oisif;negative;0;0;1;0;0;1 -1072;onctuosité;positive;0;0;0;0;0;0 -1073;onéreux;negative;0;0;1;0;0;0 -1074;onguent;positive;0;0;0;0;0;0 -1075;opérationnel;positive;0;0;0;0;0;0 -1076;opérateur;positive;0;0;0;0;0;0 -1077;opportun;positive;1;0;0;0;0;0 -1078;opposable;negative;0;1;0;1;0;1 -1079;oppressif;negative;0;1;1;1;0;1 -1080;optionnel;positive;0;0;0;0;0;0 -1081;orageux;negative;0;1;0;1;0;0 -1082;orateur;positive;0;0;0;0;0;0 -1083;ordinaire;negative;0;0;1;0;0;0 -1084;organisation;positive;0;0;0;0;0;0 -1085;organisateur;positive;0;0;0;0;0;0 -1086;orgueilleux;negative;0;0;0;1;0;1 -1087;orphelin|orpheline;negative;0;1;1;0;0;0 -1088;ottoman|ottomane;positive;0;0;0;0;0;0 -1089;oublieur;negative;0;1;1;0;0;0 -1090;ouvrier;positive;0;0;0;0;0;0 -1091;pâlir;negative;0;0;1;0;0;0 -1092;palissade;positive;0;0;0;0;0;0 -1093;paquet;positive;0;0;0;0;0;0 -1094;par intérim;positive;0;0;0;0;0;0 -1095;par mégarde;negative;0;1;1;0;1;0 -1096;paresseux;negative;0;0;1;0;0;1 -1097;parieur;negative;0;1;0;0;1;0 -1098;parmi;positive;0;0;0;0;0;0 -1099;part;positive;0;0;0;0;0;0 -1100;particule;positive;0;0;0;0;0;0 -1101;particulier;negative;0;1;0;0;1;0 -1102;partisan;positive;0;0;0;0;0;0 -1103;parvenir;negative;0;0;0;0;0;1 -1104;pas le moindre;negative;0;0;0;0;0;0 -1105;passager;positive;0;0;1;0;1;0 -1106;passif;negative;0;1;1;0;0;0 -1107;pastille;positive;0;0;0;0;0;0 -1108;pâtée;negative;0;0;0;0;0;1 -1109;paternel;positive;0;0;0;0;0;0 -1110;patron|patronne;positive;0;0;0;0;0;0 -1111;pause;negative;0;0;0;0;0;0 -1112;payeur;positive;0;0;0;0;0;0 -1113;paysan;negative;0;0;0;0;0;0 -1114;pécheresse;negative;0;1;1;1;0;1 -1115;peine;negative;0;0;1;0;0;0 -1116;péjoratif;negative;0;1;1;1;0;1 -1117;pendant ce temps;positive;0;0;0;0;0;0 -1118;penderie;positive;0;0;0;0;0;0 -1119;péniblement;negative;0;0;1;0;0;0 -1120;penseur;positive;0;0;0;0;0;0 -1121;pensif;positive;0;0;1;0;0;0 -1122;père;positive;0;0;0;0;0;0 -1123;père fouettard;negative;0;1;1;1;0;0 -1124;perforateur|perforatrice;negative;0;1;0;1;0;0 -1125;périlleux;negative;0;1;1;0;0;0 -1126;périmer;negative;0;0;1;0;0;1 -1127;permanent;positive;0;0;0;0;0;0 -1128;permettre;positive;0;0;0;0;0;0 -1129;permissif;positive;0;0;0;0;0;0 -1130;pernicieux;negative;0;1;1;1;0;0 -1131;perpétuel;positive;0;0;0;0;0;0 -1132;persister;positive;0;0;0;0;0;0 -1133;personne sonder;positive;0;0;0;0;0;0 -1134;perspicace;positive;0;0;0;0;0;0 -1135;persuasif;positive;0;0;0;0;0;0 -1136;pertinent;positive;0;0;0;0;0;0 -1137;pervers;negative;0;1;0;1;0;1 -1138;peser;negative;0;0;1;0;0;0 -1139;pet;negative;0;0;0;0;0;1 -1140;pétillement;positive;1;0;0;0;0;0 -1141;pétrifier;negative;0;1;0;0;1;0 -1142;pétrin;negative;0;1;1;0;0;1 -1143;peu commun;negative;0;0;0;0;0;0 -1144;peu équitable;negative;0;0;1;1;0;0 -1145;peu recommandable;negative;0;1;0;1;0;1 -1146;peu scrupuleux;negative;0;0;0;1;0;1 -1147;peu séduire;negative;0;0;1;0;0;1 -1148;peureux;negative;0;1;1;1;0;1 -1149;pharmacien;positive;0;0;0;0;0;0 -1150;phénoménal;positive;0;0;0;0;1;0 -1151;photo;positive;0;0;0;0;1;0 -1152;photocopie;positive;0;0;0;0;0;0 -1153;physicien;positive;0;0;0;0;0;0 -1154;physique;positive;0;0;0;0;0;0 -1155;pierreuse|pierreux;negative;0;1;0;0;0;0 -1156;piéton;positive;0;0;0;0;0;0 -1157;pieux;positive;0;0;1;0;0;1 -1158;pigeonnier;positive;0;0;0;0;0;0 -1159;pilleur;negative;0;1;1;1;0;0 -1160;pinailleur;negative;0;0;0;1;0;1 -1161;pionnier;positive;0;0;0;0;0;0 -1162;pitoyable;negative;0;0;1;0;0;1 -1163;placer en quarantaine;negative;0;1;0;0;0;1 -1164;plaignant;negative;0;0;1;0;0;0 -1165;plaisant;positive;0;0;0;0;1;0 -1166;plein été;positive;1;0;0;0;0;0 -1167;pliable;positive;0;0;0;0;0;0 -1168;plonger;positive;0;1;0;0;1;0 -1169;plongeur;positive;0;0;0;0;0;0 -1170;pluriel;positive;0;0;0;0;0;0 -1171;plus frais;positive;0;0;0;0;0;0 -1172;plus grand;positive;0;0;0;0;0;0 -1173;plus haut;positive;0;0;0;0;0;0 -1174;plus poteler;negative;0;0;0;0;0;0 -1175;plus sèche;positive;0;0;0;0;0;0 -1176;pluvieux;negative;0;0;1;0;0;0 -1177;poids lourd;positive;0;0;0;0;0;0 -1178;poignard;negative;0;1;0;0;0;0 -1179;poigne;negative;0;1;0;1;1;0 -1180;poilu;negative;0;0;0;0;0;1 -1181;pointe;positive;0;0;0;0;0;0 -1182;pointilleux;negative;0;1;1;0;0;1 -1183;polir;positive;0;0;0;0;0;0 -1184;police;positive;0;1;0;0;0;0 -1185;policier;positive;0;0;0;0;0;0 -1186;polisson;negative;0;0;0;1;0;0 -1187;politesse;positive;0;0;0;0;0;0 -1188;pompeur;negative;0;0;0;0;0;1 -1189;ponctuel;positive;0;0;0;0;1;0 -1190;populeux;negative;0;0;0;0;0;0 -1191;poreux;negative;0;0;0;0;0;1 -1192;porter un coup sec à;negative;0;0;0;1;0;0 -1193;porteur;positive;0;0;0;0;0;0 -1194;position par défaut;negative;0;1;1;0;0;1 -1195;poteler;negative;0;0;0;0;0;1 -1196;potentiel;positive;0;0;0;0;1;0 -1197;poudreuse;negative;0;0;0;0;0;0 -1198;poursuivre en justice;negative;0;1;1;1;0;1 -1199;pousser à;negative;0;1;0;1;0;0 -1200;poussiéreux;negative;0;0;0;0;0;1 -1201;pragmatique;positive;0;0;0;0;0;0 -1202;praticien;positive;0;0;0;0;0;0 -1203;pratique;positive;0;0;0;0;0;0 -1204;précieux;positive;1;0;0;0;0;0 -1205;précipiter;negative;0;1;0;0;1;0 -1206;prédateur;negative;0;1;0;0;0;0 -1207;préférentiel;positive;0;0;0;0;0;0 -1208;préliminaire;positive;0;0;0;0;0;0 -1209;premier;positive;1;0;0;0;0;0 -1210;premier naître;positive;0;0;0;0;0;0 -1211;preneur;positive;0;0;0;0;0;0 -1212;préparer;positive;0;0;0;0;0;0 -1213;préserver;positive;1;0;0;0;0;0 -1214;président;positive;0;0;0;0;0;0 -1215;présomptueux;negative;0;0;0;1;0;1 -1216;prétentieux;negative;0;0;0;1;0;1 -1217;prétention;negative;0;1;0;0;0;0 -1218;prêteur;positive;0;0;0;0;0;0 -1219;préventive;positive;0;0;0;0;0;0 -1220;primaire;positive;0;0;0;0;0;0 -1221;primitif;negative;0;0;0;0;0;0 -1222;princier;positive;0;0;0;0;1;0 -1223;printanier;positive;1;0;0;0;0;0 -1224;prisonnier;negative;0;1;1;1;0;1 -1225;prisonnier de guerre;negative;0;1;1;1;0;0 -1226;prodigieux;positive;0;0;0;0;1;0 -1227;productif;positive;1;0;0;0;0;0 -1228;producteur;positive;0;0;0;0;0;0 -1229;proéminence;positive;0;0;0;0;0;0 -1230;proéminent;positive;0;0;0;0;0;0 -1231;professorat;positive;0;0;0;0;0;0 -1232;programmateur;positive;0;0;0;0;0;0 -1233;progressif;positive;0;0;0;0;0;0 -1234;prohibitif;negative;0;1;1;1;0;0 -1235;promeneur;positive;0;0;0;0;0;0 -1236;prometteur;positive;0;0;0;0;0;0 -1237;promotionnel;positive;0;0;0;0;0;0 -1238;promoteur;positive;0;0;0;0;0;0 -1239;promptement;negative;0;0;0;0;0;0 -1240;prophétesse;positive;0;0;0;0;0;0 -1241;proportionnel;positive;0;0;0;0;0;0 -1242;proprement;positive;0;0;0;0;0;0 -1243;protecteur;positive;0;0;0;0;0;0 -1244;protestant;positive;0;1;0;0;0;0 -1245;protubérance;negative;0;1;0;0;0;1 -1246;provincial;negative;0;0;0;0;0;0 -1247;provocateur;negative;0;0;0;1;0;0 -1248;proxénète;negative;0;1;0;0;0;1 -1249;proximité;positive;0;0;0;0;0;0 -1250;prudemment;positive;0;1;0;0;0;0 -1251;pull;positive;0;0;0;0;0;0 -1252;pulpeux;negative;0;0;0;0;0;0 -1253;punir;negative;0;1;1;1;0;0 -1254;pur;positive;0;0;0;1;0;0 -1255;purgatif;positive;0;0;0;0;0;0 -1256;purger;negative;0;1;0;0;0;1 -1257;putatif;positive;0;0;0;0;0;0 -1258;qualifiante;positive;0;0;0;0;0;0 -1259;qualificatif;positive;0;0;0;0;0;0 -1260;quantitatif;positive;0;0;0;0;0;0 -1261;quasiment;positive;0;0;0;0;0;0 -1262;quelconque;negative;0;0;1;0;0;0 -1263;qui augmenter fortement;negative;0;1;0;0;1;0 -1264;qui commencer;positive;1;0;0;0;0;0 -1265;qui donner envie de vomir;negative;0;0;1;0;0;1 -1266;qui ébranler;negative;0;1;1;0;0;0 -1267;qui manquer de considération;negative;0;0;1;1;0;1 -1268;qui résonner;positive;0;1;0;0;1;0 -1269;race;positive;0;0;0;0;0;0 -1270;rachidien;positive;0;0;0;0;0;0 -1271;radieux;positive;0;0;0;0;1;0 -1272;radin;negative;0;1;1;1;0;1 -1273;radioactif;negative;0;1;0;0;0;0 -1274;rafale;negative;0;1;1;0;0;0 -1275;raffiner;positive;0;0;0;0;0;0 -1276;rafle;negative;0;1;0;1;1;0 -1277;rafraîchissement;positive;0;0;0;0;0;0 -1278;raillerie;negative;0;0;1;0;0;1 -1279;railleur;negative;0;0;1;1;0;1 -1280;raisonneur;negative;0;0;0;1;0;0 -1281;rancunier;negative;0;0;0;1;0;1 -1282;randonneur;positive;0;0;0;0;0;0 -1283;raser;negative;0;0;0;0;0;0 -1284;rationnel;positive;0;0;0;0;0;0 -1285;ravitaillement;positive;0;0;0;0;0;0 -1286;rayonnant;positive;1;0;0;0;0;0 -1287;rayonnement;positive;0;0;0;0;0;0 -1288;réactif;positive;0;0;0;0;0;0 -1289;réalisable;positive;0;0;0;0;0;0 -1290;réaménagement;positive;0;0;0;0;0;0 -1291;récapitulatif;positive;0;0;0;0;0;0 -1292;récemment;positive;0;0;0;0;0;0 -1293;réceptif;positive;0;0;0;0;0;0 -1294;recevoir;positive;0;0;0;0;0;0 -1295;réclamation;negative;0;0;0;1;0;0 -1296;reclus;negative;0;1;1;0;0;0 -1297;recoin;negative;0;0;1;0;0;0 -1298;reconnaître coupable;negative;0;1;1;1;0;1 -1299;recouvrable;positive;0;0;0;0;0;0 -1300;récréatif;positive;1;0;0;0;0;0 -1301;recueil;positive;0;0;0;0;0;0 -1302;rédactionnel;positive;0;0;0;0;0;0 -1303;rédacteur en chef;positive;0;0;0;0;0;0 -1304;réduire en purée;negative;0;1;0;0;0;1 -1305;refléter;positive;0;0;0;0;0;0 -1306;réformateur;positive;0;0;0;0;0;0 -1307;réfugier;negative;0;1;1;0;0;0 -1308;régal;positive;1;0;0;0;0;0 -1309;régent;positive;0;0;0;0;0;0 -1310;réglage;positive;0;0;0;0;0;0 -1311;règlement intérieur;positive;0;0;0;0;0;0 -1312;regret;negative;0;1;1;0;0;0 -1313;régulière;positive;0;0;0;0;0;0 -1314;relâcher;positive;1;0;0;0;0;0 -1315;relatif;positive;0;0;0;0;0;0 -1316;remarquable;positive;1;0;0;0;0;0 -1317;remordre;negative;0;1;1;0;0;0 -1318;remplaçant;negative;0;0;1;0;0;0 -1319;rémunérateur;positive;1;0;0;0;0;0 -1320;renégat;negative;0;0;0;1;0;0 -1321;renommer;positive;0;0;0;0;0;0 -1322;renversement;negative;0;1;0;1;0;0 -1323;renvoyer;negative;0;0;1;0;0;0 -1324;répandre;negative;0;1;0;0;1;0 -1325;réparateur;positive;0;0;0;0;0;0 -1326;répartir;positive;0;0;0;0;0;0 -1327;répit;positive;0;0;0;0;0;0 -1328;report;negative;0;0;1;0;0;0 -1329;représentant;positive;0;0;0;0;0;0 -1330;représentatif;positive;0;0;0;0;0;0 -1331;reproducteur|reproductrice;positive;1;0;0;0;0;0 -1332;républicain;positive;0;0;0;0;0;0 -1333;répugner;negative;0;1;0;1;0;1 -1334;requérant;negative;0;0;0;1;0;1 -1335;résident;positive;0;0;0;0;0;0 -1336;résiduel;negative;0;0;0;0;0;0 -1337;résistant;positive;0;0;1;0;0;0 -1338;respectif;positive;0;0;0;0;0;0 -1339;respectueux;positive;0;0;0;0;0;0 -1340;resplendir;positive;1;0;0;0;0;0 -1341;restriction;negative;0;1;1;1;0;0 -1342;restrictif;negative;0;1;1;0;0;0 -1343;retraire;positive;0;0;0;0;0;0 -1344;retraiter;positive;1;0;0;0;0;0 -1345;rétroactif;positive;0;0;0;0;0;0 -1346;réunion;positive;0;0;0;0;0;0 -1347;réussir;positive;1;0;0;0;0;0 -1348;révélateur;positive;0;0;0;0;0;0 -1349;révérencieux;positive;0;0;0;0;0;0 -1350;rêveur;positive;1;0;0;0;0;0 -1351;révocation;negative;0;1;1;0;0;0 -1352;rigoureux;negative;0;0;0;1;0;0 -1353;rital;negative;0;0;0;1;0;0 -1354;rituel;positive;0;0;0;0;0;0 -1355;rival;negative;0;1;0;1;0;0 -1356;rompre;negative;0;0;1;0;0;0 -1357;rotative;positive;0;0;0;0;0;0 -1358;routard;positive;0;0;0;0;0;0 -1359;route national;positive;0;0;0;0;0;0 -1360;ruine;negative;0;1;1;1;0;0 -1361;ruiner;negative;0;1;1;1;0;0 -1362;ruisseau;positive;0;0;0;0;0;0 -1363;sagacité;positive;0;0;0;0;0;0 -1364;sain et sauf;positive;1;0;0;0;0;0 -1365;saint;positive;0;0;0;0;1;0 -1366;saisir;negative;0;1;0;1;1;0 -1367;saloon;positive;0;0;0;1;0;0 -1368;sanguine;positive;0;0;0;0;0;0 -1369;sans assistance;negative;0;0;1;0;0;0 -1370;sans cesse;positive;0;0;0;0;0;0 -1371;sans égal;positive;0;1;0;0;0;0 -1372;sans entrave;positive;1;0;0;0;0;0 -1373;sans fin;positive;0;1;1;1;0;0 -1374;sans fondement;negative;0;0;1;0;0;0 -1375;sans histoire;positive;0;0;0;0;0;0 -1376;sans merci;negative;0;0;1;1;0;0 -1377;sans opposition;positive;0;0;0;0;0;0 -1378;sans pitié;negative;0;1;1;1;0;0 -1379;sans résultat;negative;0;0;1;0;0;1 -1380;sans soutien;negative;0;0;1;0;0;0 -1381;sans valeur;negative;0;0;1;0;0;0 -1382;satané;negative;0;0;0;1;0;0 -1383;satisfaire;positive;1;0;0;0;0;0 -1384;saugrenu;negative;0;0;0;0;1;0 -1385;sauvage;negative;0;1;0;1;0;1 -1386;savant;positive;0;0;0;0;0;0 -1387;savoureux;positive;1;0;0;0;0;0 -1388;scandaleux;negative;0;1;1;1;1;1 -1389;scélérat;negative;0;1;0;1;0;1 -1390;sceptique;negative;0;1;0;0;1;1 -1391;scrupuleux;positive;0;0;0;0;0;0 -1392;sculptrice;positive;0;0;0;0;0;0 -1393;se cacher;negative;0;1;1;0;0;0 -1394;se dévaloriser;negative;0;0;1;1;0;1 -1395;se souvenir de;positive;0;0;0;0;0;0 -1396;sèche;negative;0;1;0;1;1;0 -1397;secondairement;negative;0;0;0;0;0;0 -1398;secrète;negative;0;1;0;0;0;0 -1399;sédatif;negative;0;1;1;0;0;0 -1400;séisme;negative;0;1;0;0;1;0 -1401;sélectionner;positive;1;0;0;0;0;0 -1402;semblable;positive;0;0;0;0;0;0 -1403;sempiternel;positive;0;1;1;1;0;0 -1404;sensationnel;positive;1;0;0;0;0;0 -1405;sensible;positive;0;1;0;0;0;1 -1406;sensoriel;positive;0;0;0;0;0;0 -1407;sensuel;positive;0;0;0;0;1;0 -1408;senteur;positive;0;0;0;0;0;0 -1409;sentier;positive;0;0;0;0;0;0 -1410;sentimental;positive;0;0;0;0;0;0 -1411;serein;positive;1;0;0;0;0;0 -1412;sérieux;positive;0;1;1;1;0;0 -1413;sérieusement;negative;0;0;1;0;0;0 -1414;serment;positive;0;0;0;0;0;0 -1415;sévère;negative;0;1;0;0;0;0 -1416;sidérer;negative;0;0;0;0;1;0 -1417;signe;positive;0;0;0;0;0;0 -1418;silencieux;negative;0;1;1;0;0;0 -1419;simple;positive;0;0;0;0;0;0 -1420;sincérité;positive;0;0;0;0;0;0 -1421;singulier;positive;0;0;0;0;0;0 -1422;sinueux;negative;0;1;0;0;0;0 -1423;situation difficile;negative;0;1;1;0;0;1 -1424;sloup;positive;0;0;0;0;0;0 -1425;sms;positive;0;0;0;0;0;0 -1426;solidifier;positive;0;0;0;0;0;0 -1427;sombre;negative;0;1;1;0;0;0 -1428;sommation;negative;0;0;0;0;0;0 -1429;sommet;positive;0;0;0;0;0;0 -1430;somptueux;positive;1;0;0;0;0;0 -1431;sonder;positive;0;0;0;0;0;0 -1432;songeur;positive;1;0;0;0;0;0 -1433;sottise;negative;0;0;0;1;0;0 -1434;soudainement;negative;0;0;0;0;1;0 -1435;soupirant;positive;0;0;0;0;0;0 -1436;souple;positive;0;0;0;0;0;0 -1437;souplesse;positive;0;0;0;0;0;0 -1438;sous tendre;positive;0;0;0;0;0;0 -1439;souverain;positive;0;0;0;0;0;0 -1440;soyeux;positive;1;0;0;0;0;0 -1441;spacieux;positive;1;0;0;0;0;0 -1442;spectateur;positive;0;0;0;0;0;0 -1443;spectral;negative;0;1;0;0;0;0 -1444;spéculatif;negative;0;1;1;0;0;0 -1445;spirituel;positive;0;0;0;0;0;0 -1446;spongieux;negative;0;0;0;0;0;1 -1447;spontané;positive;0;0;0;0;0;0 -1448;sportif;positive;0;0;0;0;0;0 -1449;squameux;negative;0;0;0;0;0;1 -1450;squatteuse;negative;0;1;1;0;0;1 -1451;statisticien;positive;0;0;0;0;0;0 -1452;stèle;negative;0;0;1;0;0;0 -1453;store;positive;0;0;0;0;0;0 -1454;strate;positive;0;0;0;0;0;0 -1455;structurel;positive;0;0;0;0;0;0 -1456;stupeur;negative;0;1;1;0;0;1 -1457;subjectif;negative;0;0;0;0;0;0 -1458;subordonner;negative;0;1;1;0;0;0 -1459;substantiel;positive;0;0;0;0;0;0 -1460;substantif;positive;0;0;0;0;0;0 -1461;subtilité;positive;0;0;0;0;1;0 -1462;subversif;negative;0;0;0;1;1;0 -1463;successif;positive;0;0;0;0;0;0 -1464;suggestif;positive;0;0;0;0;0;0 -1465;suite;positive;0;0;0;0;0;0 -1466;summum;positive;1;0;0;0;0;0 -1467;supercherie;negative;0;1;1;1;1;1 -1468;superficiel;negative;0;0;1;0;0;1 -1469;superflu;negative;0;0;1;0;0;0 -1470;supérieur;positive;0;0;0;0;0;0 -1471;superstitieux;negative;0;1;0;0;0;0 -1472;supervision;negative;0;1;1;0;0;0 -1473;supplier;negative;0;0;1;0;0;0 -1474;supplique;positive;0;0;0;0;0;0 -1475;supporter;negative;0;1;1;0;0;0 -1476;supportrice;positive;0;0;0;0;0;0 -1477;supposition;positive;0;0;0;0;0;0 -1478;sur le ventre;negative;0;1;1;0;0;0 -1479;surnager;positive;0;0;0;0;0;0 -1480;surnaturel;negative;0;1;0;0;0;0 -1481;surprendre;negative;0;1;0;0;1;0 -1482;surveillant;positive;0;0;0;0;0;0 -1483;susciter;positive;0;0;0;0;0;0 -1484;sweat;positive;0;0;0;0;0;0 -1485;tâcher;negative;0;0;0;0;0;1 -1486;talentueux;positive;0;0;0;0;0;0 -1487;tapageur;negative;0;1;0;1;1;0 -1488;taquin;positive;0;0;0;1;1;0 -1489;tardif;negative;0;1;1;0;1;0 -1490;technicien;positive;0;0;0;0;0;0 -1491;tempétueux;negative;0;1;0;1;0;0 -1492;temporel;positive;0;0;0;0;0;0 -1493;tenace;positive;0;0;0;0;0;0 -1494;tendance;positive;0;0;1;0;0;0 -1495;terminer;positive;1;0;0;0;0;0 -1496;terrestre;positive;0;0;0;0;0;0 -1497;tête le premier;negative;0;0;0;1;1;0 -1498;théologien;positive;0;0;0;0;0;0 -1499;tirer;positive;0;1;1;1;1;0 -1500;tireur|tireuse;negative;0;1;0;1;1;0 -1501;tissage;positive;0;0;0;0;0;0 -1502;tituber;negative;0;1;0;0;1;0 -1503;tolérance;positive;0;0;0;0;0;0 -1504;torride;negative;0;1;0;1;0;0 -1505;tortueux;negative;0;1;0;0;0;0 -1506;touchant;positive;0;0;1;0;0;0 -1507;tourner;positive;0;1;0;1;1;0 -1508;tout de même;negative;0;0;0;0;0;0 -1509;tout puissant;positive;1;0;0;0;0;0 -1510;tout le deux semaine;positive;0;0;0;0;0;0 -1511;trafiquant;negative;0;1;0;1;0;1 -1512;traître;negative;0;1;1;1;1;1 -1513;transaction;positive;0;0;0;0;0;0 -1514;transitif;positive;0;0;0;0;0;0 -1515;travailleur|travailleuse;positive;0;0;0;0;0;0 -1516;traverser à gué;positive;0;0;0;0;0;0 -1517;trembloter;negative;0;1;0;1;0;0 -1518;trésorière;positive;0;0;0;0;0;0 -1519;tripler;positive;0;0;0;0;0;0 -1520;tromperie;negative;0;0;0;1;0;1 -1521;trompeur;negative;0;0;1;1;0;1 -1522;trop cher;negative;0;0;1;1;0;1 -1523;trop liquide;negative;0;0;0;0;0;1 -1524;trop long;negative;0;0;1;0;0;0 -1525;trop zélé;negative;0;0;0;0;0;0 -1526;trou perdu;negative;0;1;1;0;0;1 -1527;troubadour;positive;0;0;0;0;0;0 -1528;trouble;negative;0;1;0;1;1;0 -1529;trouillard;negative;0;0;0;0;0;1 -1530;trouvaille;positive;0;0;0;0;0;0 -1531;tueur;negative;0;1;1;1;1;1 -1532;tumultueux;negative;0;1;0;1;0;0 -1533;tuteur|tutrice;positive;0;0;0;0;0;0 -1534;ultime;positive;0;1;1;0;0;0 -1535;ultraviolette;positive;0;0;0;0;0;0 -1536;un foi|fois par semaine;positive;0;0;0;0;0;0 -1537;uniformité;positive;0;0;0;0;0;0 -1538;universel;positive;0;0;0;0;0;0 -1539;urgent;negative;0;1;0;0;0;0 -1540;user;negative;0;0;1;0;0;0 -1541;vaciller;negative;0;1;0;0;1;0 -1542;vagabonder;negative;0;1;1;0;0;0 -1543;vaillant;positive;0;0;0;0;0;0 -1544;vain;negative;0;0;1;0;0;0 -1545;vaporeux;positive;0;0;0;0;0;0 -1546;variqueux;negative;0;0;0;0;0;1 -1547;vaseux;negative;0;0;0;0;0;1 -1548;végétarien;positive;0;0;0;0;0;0 -1549;velouteux;positive;0;0;0;0;0;0 -1550;velu;negative;0;0;0;0;0;1 -1551;vendeur;positive;0;0;0;0;0;0 -1552;vengeur;negative;0;0;0;1;0;0 -1553;venimeux;negative;0;1;1;1;1;1 -1554;vent violent;negative;0;1;0;0;0;0 -1555;ventriculaire;positive;0;0;0;0;0;0 -1556;verbeux;positive;0;0;0;0;0;0 -1557;vérificateur|vérificatrice;positive;0;0;0;0;0;0 -1558;véritable;positive;0;0;0;0;0;0 -1559;vernir;positive;1;0;0;0;0;0 -1560;versement;positive;0;0;0;0;0;0 -1561;vertueux;positive;0;0;0;0;0;0 -1562;vestige;negative;0;1;0;0;0;1 -1563;vêtir;positive;0;0;0;0;0;0 -1564;vicieux;negative;0;0;0;1;0;1 -1565;victorieux;positive;1;0;0;0;0;0 -1566;vigoureux;positive;0;0;0;0;0;0 -1567;villageois;positive;0;0;0;0;0;0 -1568;vindicatif;negative;0;1;0;1;0;1 -1569;violation;negative;0;0;0;1;0;0 -1570;violet|violette;positive;0;0;0;0;0;0 -1571;virtuel;negative;0;0;0;0;0;0 -1572;visiteur;positive;1;0;0;0;0;0 -1573;visqueux;negative;0;0;0;0;0;1 -1574;visuel;positive;0;0;0;0;0;0 -1575;vitrer;positive;0;0;0;0;0;0 -1576;vif;negative;0;1;0;0;1;1 -1577;v?u;positive;0;0;0;0;0;0 -1578;voisin;positive;0;0;0;0;0;0 -1579;voleur;negative;0;1;1;1;1;1 -1580;voluptueux;positive;0;0;0;0;0;0 -1581;voyageur;positive;0;0;0;0;0;0 -1582;voyant;positive;0;0;0;0;0;1 -1583;youpi;positive;1;0;0;0;0;0 -1584;zéro;negative;0;0;1;0;0;0 -1585;zut;negative;0;0;1;1;0;1 -1586;bon gorgée;negative;0;0;0;0;0;1 -1587;école maternel;positive;0;0;0;0;0;0 -1588;un foi|fois tout le deux moi|mois;positive;0;0;0;0;0;0 -1589;@card@ kilo;positive;0;0;0;0;0;0 -1590;à base de plante;positive;0;0;0;0;0;0 -1591;à bord;positive;0;0;0;0;0;0 -1592;à capuche;positive;0;1;0;0;0;0 -1593;à carreau;positive;0;0;0;0;0;0 -1594;à clou;negative;0;0;0;0;0;0 -1595;à condition que;positive;0;0;0;0;0;0 -1596;à contrec?ur;negative;0;1;1;1;0;1 -1597;à côte;negative;0;0;0;0;0;1 -1598;à cru;positive;0;0;0;0;0;0 -1599;à dessein;positive;0;0;0;0;0;0 -1600;à destination de;positive;0;0;0;0;0;0 -1601;à feuillage caduc;negative;0;0;0;0;0;0 -1602;à feuille;positive;0;0;0;0;0;0 -1603;à fleur;positive;1;0;0;0;0;0 -1604;à foison;positive;1;0;0;0;0;0 -1605;à force de qch;positive;0;0;0;0;0;0 -1606;à fort poitrine;positive;0;0;0;0;0;0 -1607;à friser;positive;0;0;0;0;0;0 -1608;à froid;negative;0;0;1;0;0;0 -1609;à gauche;negative;0;0;0;0;0;0 -1610;à intervalle régulier;positive;0;0;0;0;0;0 -1611;à jamais;positive;0;0;0;0;0;0 -1612;à juste titre;positive;0;0;0;0;0;0 -1613;à l étranger;positive;0;0;0;0;0;0 -1614;à l improviste;negative;0;0;0;0;1;0 -1615;à l unanimité;positive;0;0;0;0;0;0 -1616;à le bon franquette;positive;0;0;0;0;1;0 -1617;à le dérive;negative;0;1;1;0;0;0 -1618;à le différence de;negative;0;0;0;0;0;0 -1619;à le menthe;positive;0;0;0;0;0;0 -1620;avoir le mode;positive;0;0;0;0;0;0 -1621;à le mode;positive;0;0;0;0;0;0 -1622;à le retraite;positive;1;0;0;0;0;0 -1623;à maintes reprise;negative;0;0;0;0;0;0 -1624;à mi chemin;positive;0;0;0;0;0;0 -1625;à naître;positive;0;0;0;0;0;0 -1626;à nervure;negative;0;0;0;0;0;1 -1627;à nouveau;positive;0;0;0;0;0;0 -1628;à peine;negative;0;0;1;0;0;0 -1629;à peu près;negative;0;0;0;0;0;0 -1630;à plat;negative;0;0;1;0;0;0 -1631;à plat ventre;negative;0;1;1;0;0;0 -1632;à plusieurs reprise;negative;0;0;0;0;0;0 -1633;avoir priori;negative;0;1;0;1;0;1 -1634;à propos;negative;0;0;0;0;0;0 -1635;à quai;positive;0;0;0;0;0;0 -1636;à queue;negative;0;0;0;0;0;0 -1637;à son compte;positive;0;0;0;0;0;0 -1638;à spiral|spirale;positive;0;0;0;0;0;0 -1639;à succès;positive;0;0;0;0;0;0 -1640;à supposer que;negative;0;0;0;0;0;0 -1641;à thème;positive;0;0;0;0;0;0 -1642;à tort;negative;0;1;1;1;0;0 -1643;à tout jamais;positive;0;0;0;0;0;0 -1644;à tout épreuve;positive;0;0;0;0;0;0 -1645;à tribord;positive;0;0;0;0;0;0 -1646;à venir;positive;0;0;0;0;0;0 -1647;à vie;positive;0;0;0;0;0;0 -1648;à vrai dire;positive;0;0;0;0;0;0 -1649;abaisser;negative;0;0;1;0;0;0 -1650;abaissement;negative;0;0;1;0;0;0 -1651;abandon;negative;0;1;1;1;1;0 -1652;abandonner;negative;0;1;1;1;0;1 -1653;abaondonnées;negative;0;1;1;0;0;0 -1654;abat;negative;0;0;0;0;0;1 -1655;abattoir;negative;0;1;1;1;0;1 -1656;abattre;negative;0;1;1;1;1;0 -1657;abbé;negative;0;1;0;0;0;0 -1658;abcès;negative;0;1;1;0;0;1 -1659;abdiquer;negative;0;1;1;0;0;0 -1660;abdomen;positive;0;0;0;0;0;0 -1661;abdominal;positive;0;0;0;0;0;0 -1662;abeille;negative;0;1;0;1;0;0 -1663;aberrer;negative;0;0;0;1;1;0 -1664;abhorrer;negative;0;1;0;1;0;1 -1665;abîme;negative;0;1;1;0;0;0 -1666;abîmer;negative;0;1;1;1;0;0 -1667;abject;negative;0;0;0;1;0;1 -1668;aboiement;negative;0;1;0;1;0;0 -1669;abolir;negative;0;0;1;1;0;0 -1670;abolition;negative;0;0;1;1;0;0 -1671;abomination;negative;0;1;1;1;0;1 -1672;abonder;positive;1;0;0;0;0;0 -1673;abondant;positive;1;0;0;0;0;0 -1674;abonnement;positive;0;0;0;0;0;0 -1675;aborder;positive;0;0;0;1;1;0 -1676;aborigène;positive;0;0;0;0;0;0 -1677;abortif;negative;0;1;1;1;0;0 -1678;aboutir;positive;1;0;0;0;0;0 -1679;aboyer;negative;0;1;0;1;0;0 -1680;abpimée;negative;0;1;1;1;0;0 -1681;abrasion;negative;0;1;1;0;0;1 -1682;abréger;positive;0;0;0;0;0;0 -1683;abreuvoir;positive;0;0;0;0;0;0 -1684;abréviation;positive;0;0;0;0;0;0 -1685;abri de jardin;negative;0;0;0;0;0;0 -1686;abriter;positive;0;0;0;0;0;0 -1687;abrogation;negative;0;1;1;0;0;0 -1688;abroger;negative;0;1;1;0;0;0 -1689;abrutir;negative;0;0;0;1;0;1 -1690;absence;negative;0;1;1;0;0;0 -1691;absentéisme;negative;0;0;1;0;0;0 -1692;absinthe;negative;0;0;0;0;0;0 -1693;absoudre;positive;1;0;0;0;0;0 -1694;absolution;positive;0;0;0;0;0;0 -1695;absorbant;positive;0;0;0;0;0;0 -1696;absorption;positive;0;0;0;0;0;0 -1697;abstention;negative;0;1;1;0;0;0 -1698;abstinence;negative;0;1;1;0;0;0 -1699;abstraction;negative;0;1;1;0;0;0 -1700;abstraire;positive;0;0;0;0;0;0 -1701;absurdité;negative;0;0;0;1;1;1 -1702;abuser de;negative;0;1;1;1;0;0 -1703;académie;positive;0;0;0;0;0;0 -1704;académique;positive;0;0;0;0;0;0 -1705;accabler;negative;0;1;1;1;0;0 -1706;accablant;negative;0;1;1;1;0;0 -1707;accalmir;positive;0;0;0;0;0;0 -1708;accéder;positive;1;0;0;0;0;0 -1709;accélérateur;negative;0;0;0;1;0;0 -1710;accélération;positive;0;1;0;0;0;0 -1711;accentuation;positive;0;0;0;0;0;0 -1712;accentuer;positive;0;0;0;0;0;0 -1713;acceptant;positive;0;0;0;0;0;0 -1714;acceptation;positive;0;0;0;0;0;0 -1715;accepter;positive;0;0;0;0;0;0 -1716;accès;positive;0;0;0;0;0;0 -1717;accessible;positive;0;0;0;0;0;0 -1718;accession;positive;0;0;0;0;0;0 -1719;accessoire;negative;0;0;0;0;0;0 -1720;accessoirement;negative;0;0;0;0;0;0 -1721;accident mortel;negative;0;1;1;0;0;0 -1722;accident vasculaire cérébral;negative;0;1;1;0;1;0 -1723;accidenter;negative;0;1;1;0;0;0 -1724;accidentellement;negative;0;1;1;0;1;0 -1725;acclamation;positive;1;0;0;0;0;0 -1726;acclamer;positive;0;0;0;0;1;0 -1727;accolade;positive;0;0;0;0;1;0 -1728;accommoder;positive;0;0;0;0;0;0 -1729;accommodation;positive;0;0;0;0;0;0 -1730;accompagner;positive;0;0;0;0;0;0 -1731;accompagnement;positive;0;0;0;0;0;0 -1732;accomplir;positive;1;0;0;0;0;0 -1733;accomplissement;positive;0;0;0;0;0;0 -1734;accordable;positive;0;0;0;0;0;0 -1735;accorder;positive;0;0;0;0;0;0 -1736;accordéon;positive;0;0;0;0;0;0 -1737;accord;positive;0;0;0;0;0;0 -1738;accoutumer;positive;0;0;0;0;0;0 -1739;accréditer;positive;0;0;0;0;0;0 -1740;accro;negative;0;0;1;1;0;0 -1741;accrochage;negative;0;0;0;1;0;0 -1742;accrocher;negative;0;1;0;0;1;0 -1743;accroc;negative;0;1;0;0;1;0 -1744;accroissement;positive;0;0;0;0;0;0 -1745;accroître;positive;0;0;0;0;0;0 -1746;accroupir;negative;0;1;0;0;0;0 -1747;accroupissement;negative;0;1;0;0;0;0 -1748;accroire;positive;0;0;0;0;0;0 -1749;accroire|accroître;positive;0;0;0;0;0;0 -1750;accueil;positive;0;0;0;0;0;0 -1751;accueillir;positive;1;0;0;0;0;0 -1752;accumuler;positive;0;0;0;0;0;0 -1753;accusatif;negative;0;0;0;1;0;1 -1754;accusation;negative;0;0;0;1;0;1 -1755;acérer;negative;0;1;0;1;0;0 -1756;acétique;negative;0;0;0;0;0;1 -1757;acharner;negative;0;1;0;1;0;1 -1758;achat;positive;0;0;0;0;0;0 -1759;acheminer par tuyau;positive;0;0;0;0;0;0 -1760;acheminer par pont aérien;positive;0;0;0;0;0;0 -1761;acheter;positive;0;0;0;0;0;0 -1762;achever;positive;0;0;0;0;0;0 -1763;achèvement;positive;1;0;0;0;0;0 -1764;acide;negative;0;0;0;0;0;1 -1765;acidité;negative;0;0;0;0;0;1 -1766;acier;positive;0;0;0;0;0;0 -1767;acompte;positive;0;0;0;0;0;0 -1768;acouphène;negative;0;1;1;0;0;0 -1769;acoustique;positive;0;0;0;0;0;0 -1770;acquéreur;positive;0;0;0;0;0;0 -1771;acquérir;positive;0;0;0;0;0;0 -1772;acquiescement;positive;0;0;0;0;0;0 -1773;âcre;negative;0;0;0;0;0;1 -1774;acrobate;positive;0;1;0;0;0;0 -1775;acte;positive;0;0;0;0;0;0 -1776;acte de défi;negative;0;1;0;1;0;1 -1777;acte de fiducie;negative;0;0;0;1;0;0 -1778;acte délictuel;negative;0;1;0;1;0;0 -1779;actif;positive;0;0;0;0;0;0 -1780;action;positive;0;0;0;0;0;0 -1781;action de grâce;positive;0;0;0;0;0;0 -1782;actionnable;negative;0;1;0;1;0;1 -1783;actionnaire;positive;0;0;0;0;0;0 -1784;activité;positive;0;0;0;0;0;0 -1785;actuaire;positive;0;0;0;0;0;0 -1786;actualité;positive;0;0;0;0;0;0 -1787;acuité;positive;0;0;0;0;0;0 -1788;acupuncture;positive;0;0;0;0;0;0 -1789;adage;positive;0;0;0;0;0;0 -1790;adaptabilité;positive;0;0;0;0;0;0 -1791;adaptable;positive;0;0;0;0;0;0 -1792;adaptation;positive;0;0;0;0;0;0 -1793;adapter;positive;0;0;0;0;0;0 -1794;addenda;positive;0;0;0;0;0;0 -1795;addiction;negative;0;1;1;0;0;0 -1796;additif;negative;0;0;0;0;0;1 -1797;additionner;positive;0;0;0;0;0;0 -1798;additionnel;positive;0;0;0;0;0;0 -1799;adepte;positive;0;0;0;0;0;0 -1800;adéquat;positive;0;0;0;0;0;0 -1801;adéquation;positive;0;0;0;0;0;0 -1802;adhérer;positive;0;0;0;0;0;0 -1803;adhérence;positive;0;0;0;0;0;0 -1804;adhérent;positive;0;0;0;0;0;0 -1805;adhérer à;positive;0;0;0;0;0;0 -1806;adhésion;positive;0;0;0;0;0;0 -1807;adieu;negative;0;0;1;0;0;0 -1808;adipeux;negative;0;0;0;0;0;1 -1809;adjacent;positive;0;0;0;0;0;0 -1810;adjectif;positive;0;0;0;0;0;0 -1811;adjectival;positive;0;0;0;0;0;0 -1812;adjoindre;positive;0;0;0;0;0;0 -1813;adjuvant;positive;0;0;0;0;0;0 -1814;admettre;positive;0;0;0;0;0;0 -1815;administrer;positive;0;0;0;0;0;0 -1816;administrer qch à qqn;positive;0;0;0;0;0;0 -1817;admirable;positive;0;0;0;0;0;0 -1818;admiration;positive;0;0;0;0;0;0 -1819;admirer;positive;0;0;0;0;0;0 -1820;admissibilité;positive;0;0;0;0;0;0 -1821;admission;positive;0;0;0;0;0;0 -1822;admonition;negative;0;1;0;1;0;0 -1823;adobe;positive;0;0;0;0;0;0 -1824;adolescence;positive;0;0;0;0;0;0 -1825;adopter;positive;0;0;0;0;0;0 -1826;adoption;positive;0;0;0;0;0;0 -1827;adorable;positive;0;0;1;0;1;0 -1828;adoration;positive;0;1;0;0;0;0 -1829;adorer;positive;0;1;0;0;0;0 -1830;ado|ados;positive;0;0;0;0;0;0 -1831;adosser;positive;0;0;0;0;0;0 -1832;adoucir;positive;0;0;0;0;0;0 -1833;adoucissant;positive;0;0;0;0;0;0 -1834;adoucissement;positive;0;0;0;0;0;0 -1835;adresse;positive;0;0;0;0;0;0 -1836;adresser;positive;0;0;0;0;0;0 -1837;adroit;positive;0;0;0;0;0;0 -1838;adulte;positive;0;0;0;0;0;0 -1839;adultère;negative;0;0;1;1;0;1 -1840;adversaire;negative;0;1;0;1;0;1 -1841;adverse;negative;0;1;0;1;0;1 -1842;adversité;negative;0;1;1;1;0;0 -1843;aération;positive;0;0;0;0;0;0 -1844;aérer;positive;0;0;0;0;0;0 -1845;aérodrome;positive;0;0;0;0;0;0 -1846;aérodynamique;positive;0;0;0;0;0;0 -1847;aéroglisseur;positive;0;0;0;0;0;0 -1848;aéronautique;positive;0;0;0;0;0;0 -1849;aéroport;positive;0;0;0;0;0;0 -1850;aérosol;positive;0;0;0;0;0;0 -1851;affaiblir;negative;0;1;1;0;0;0 -1852;affairement;positive;0;0;0;0;0;0 -1853;affaisés;negative;0;0;1;0;0;0 -1854;affaisser;negative;0;0;1;0;0;0 -1855;affaissement;negative;0;0;1;0;0;0 -1856;affamer;negative;0;1;1;1;0;0 -1857;affectation;positive;0;0;0;0;0;0 -1858;affecter;negative;0;0;1;0;0;0 -1859;affection;positive;0;0;0;0;0;0 -1860;affichage;positive;0;0;0;0;0;0 -1861;affiche;positive;0;0;0;0;1;0 -1862;afficher;positive;0;0;0;0;0;0 -1863;affidavit;positive;0;0;0;0;0;0 -1864;affiliation;positive;0;0;0;0;0;0 -1865;affilier;positive;0;0;0;0;0;0 -1866;affinage;positive;0;0;0;0;0;0 -1867;affiner;positive;0;0;0;0;0;0 -1868;affinité;positive;0;0;0;0;0;0 -1869;affirmatif;positive;0;0;0;0;0;0 -1870;affirmation;positive;0;0;0;0;0;0 -1871;affirmativement;positive;0;0;0;0;0;0 -1872;affirmer;positive;0;0;0;0;0;0 -1873;affixe;positive;0;0;0;0;0;0 -1874;affliction;negative;0;1;1;0;0;1 -1875;affluent;positive;0;0;0;0;0;0 -1876;affluer;negative;0;1;0;1;1;0 -1877;afflux;negative;0;1;0;0;1;0 -1878;affoler;negative;0;1;1;0;0;0 -1879;affolement;negative;0;1;0;1;0;0 -1880;affréter;positive;0;0;0;0;0;0 -1881;affronter;negative;0;0;0;0;0;0 -1882;âffuté;negative;0;1;0;0;0;0 -1883;âffutée;negative;0;1;0;0;0;0 -1884;âffutées;negative;0;1;0;0;0;0 -1885;âffutés;negative;0;1;0;0;0;0 -1886;agacer;negative;0;0;1;1;0;0 -1887;agacement;negative;0;0;1;1;0;1 -1888;agate;positive;0;0;0;0;0;0 -1889;âge;negative;0;1;1;0;0;0 -1890;âgé;negative;0;0;1;0;0;0 -1891;agence;positive;0;0;0;0;0;0 -1892;agenouiller;negative;0;0;1;0;0;0 -1893;agent;positive;0;0;0;0;0;0 -1894;agent de change;positive;0;0;0;0;0;0 -1895;agglomération;positive;0;0;0;0;0;0 -1896;agglomérer;negative;0;0;0;0;0;0 -1897;aggraver;negative;0;1;1;1;0;0 -1898;aggravation;negative;0;1;1;1;0;1 -1899;aggressifs;negative;0;1;0;1;0;0 -1900;agile;positive;0;0;0;0;0;0 -1901;agilité;positive;0;0;0;0;0;0 -1902;agir;positive;0;0;0;0;0;0 -1903;agissements;positive;0;0;0;0;0;0 -1904;agiter;negative;0;1;0;1;0;0 -1905;agneau;positive;0;0;0;0;0;0 -1906;agnostique;negative;0;1;1;0;0;0 -1907;agonir;negative;0;1;1;1;0;0 -1908;agrafer;positive;0;0;0;0;0;0 -1909;agrandir;negative;0;0;0;0;0;0 -1910;agrégat;negative;0;0;0;0;0;0 -1911;agrégation;negative;0;0;0;0;0;0 -1912;agresseur;negative;0;1;1;1;0;0 -1913;agression;negative;0;1;0;1;1;0 -1914;agricole;positive;0;0;0;0;0;0 -1915;agriculture;positive;0;0;0;0;0;0 -1916;ahurir;negative;0;0;0;0;1;0 -1917;ahurissant;negative;0;0;0;0;1;0 -1918;aide;positive;0;0;0;0;0;0 -1919;aider;positive;0;0;0;0;0;0 -1920;aigle;positive;0;0;0;0;0;0 -1921;aigre;negative;0;0;0;0;0;1 -1922;aigu marine;positive;0;0;0;0;0;0 -1923;aiguille;negative;0;1;0;0;0;0 -1924;aiguiller;positive;0;0;0;0;0;0 -1925;aiguillonner;positive;0;1;0;0;0;0 -1926;aiguisoir;negative;0;1;0;0;0;0 -1927;ail;negative;0;0;0;0;0;1 -1928;aile;positive;0;0;0;0;0;0 -1929;ailer;positive;0;0;0;0;0;0 -1930;aileron;positive;0;0;0;0;0;0 -1931;aimable;positive;0;0;0;0;0;0 -1932;aimant;positive;0;0;0;0;0;0 -1933;airbag;positive;0;0;0;0;0;0 -1934;aire;positive;0;0;0;0;0;0 -1935;aire de jeu;positive;0;0;0;0;1;0 -1936;air;negative;0;0;0;0;0;1 -1937;aisance;positive;1;0;0;0;0;0 -1938;aisé;positive;1;0;0;0;0;0 -1939;ajourner;negative;0;0;1;0;0;0 -1940;ajournement;negative;0;0;1;0;0;0 -1941;ajout;positive;0;0;0;0;0;0 -1942;ajouter;positive;0;0;0;0;0;0 -1943;ajustage;positive;0;0;0;0;0;0 -1944;ajuster;positive;0;0;0;0;0;0 -1945;ajustement;positive;0;0;0;0;0;0 -1946;alambiquer;negative;0;0;0;0;0;1 -1947;alanguir;negative;0;0;1;0;0;0 -1948;alarmer;negative;0;1;0;0;1;0 -1949;alarme;negative;0;1;0;0;1;0 -1950;albâtre;positive;0;0;0;0;0;0 -1951;album;positive;0;0;0;0;0;0 -1952;alcali;positive;0;0;0;0;0;0 -1953;alcaloïde;positive;0;0;0;0;0;0 -1954;alchimie;positive;0;0;0;0;0;0 -1955;alcool;negative;0;0;0;0;0;0 -1956;alcoolisme;negative;0;1;1;1;0;1 -1957;alcôve;positive;0;0;0;0;0;0 -1958;alerte;positive;0;1;0;1;1;0 -1959;alésage;negative;0;1;0;1;0;0 -1960;algèbre;positive;0;0;0;0;0;0 -1961;algébrique;positive;0;0;0;0;0;0 -1962;algorithme;positive;0;0;0;0;0;0 -1963;alibi;positive;0;0;0;0;0;0 -1964;aliénation;negative;0;1;1;1;0;1 -1965;aliéner;negative;0;0;1;0;0;1 -1966;aligner;positive;0;0;0;0;0;0 -1967;alignement;positive;0;0;0;0;0;0 -1968;aliment;positive;0;0;0;0;0;0 -1969;alimentaire;positive;0;0;0;0;0;0 -1970;alimentation;positive;0;0;0;0;0;0 -1971;alimenter;positive;0;0;0;0;0;0 -1972;alinéa;positive;0;0;0;0;0;0 -1973;aliquote;positive;0;0;0;0;0;0 -1974;allaitement;positive;0;0;0;0;0;0 -1975;allaiter;positive;0;0;0;0;0;0 -1976;allécher;positive;0;0;0;0;1;0 -1977;alléchant;positive;0;0;0;0;1;0 -1978;aller;positive;0;0;0;0;0;0 -1979;allégation;negative;0;0;0;1;0;0 -1980;allégeance;positive;0;0;0;0;0;0 -1981;allégorie;positive;0;0;0;0;0;0 -1982;allégorique;positive;0;0;0;0;0;0 -1983;allégresse;positive;1;0;0;0;0;0 -1984;allegro;positive;0;0;0;0;0;0 -1985;alléguer;negative;0;1;0;0;0;1 -1986;allemand;positive;0;0;0;0;0;0 -1987;aller à tout vitesse;negative;0;1;0;0;0;0 -1988;aller chercher;positive;0;0;0;0;0;0 -1989;alliage;positive;0;0;0;0;0;0 -1990;alliance;positive;0;0;0;0;0;0 -1991;allier;positive;0;0;0;0;0;0 -1992;alligator;negative;0;1;0;0;0;0 -1993;allocataire;positive;0;0;0;0;0;0 -1994;allocation;positive;0;0;0;0;0;0 -1995;allocation chômage;negative;0;0;1;0;0;0 -1996;allocution;positive;0;0;0;0;0;0 -1997;allongement;positive;0;0;0;0;0;0 -1998;allouer;positive;0;0;0;0;0;0 -1999;allumage;positive;0;0;0;0;0;0 -2000;allumette;positive;0;0;0;0;0;0 -2001;alluvial;positive;0;0;0;0;0;0 -2002;almanach;positive;0;0;0;0;0;0 -2003;aloha;positive;1;0;0;0;0;0 -2004;alors que;negative;0;0;0;0;0;0 -2005;alouette;positive;1;0;0;0;0;0 -2006;alphabet;positive;0;0;0;0;0;0 -2007;alphabétique;positive;0;0;0;0;0;0 -2008;alpiniste;positive;0;0;0;0;0;0 -2009;altération;negative;0;0;1;0;0;1 -2010;altercation;negative;0;0;0;1;0;0 -2011;altérer;negative;0;0;1;1;0;1 -2012;alternatif;positive;0;0;0;0;0;0 -2013;alterner;positive;0;0;0;0;0;0 -2014;altitude;positive;0;0;0;0;0;0 -2015;alto;positive;0;0;0;0;0;0 -2016;alvéolaire;positive;0;0;0;0;0;0 -2017;amadouer;positive;0;0;0;0;0;0 -2018;amande;positive;0;0;0;0;0;0 -2019;amant;positive;0;0;0;0;0;0 -2020;amarrage;positive;0;0;0;0;0;0 -2021;amarrer;positive;0;0;0;0;0;0 -2022;amasser;positive;0;0;0;0;0;0 -2023;amateur;negative;0;0;0;0;0;0 -2024;amatrices;negative;0;0;0;0;0;0 -2025;ambassade;positive;0;0;0;0;0;0 -2026;ambassadeur;positive;0;0;0;0;0;0 -2027;ambiance;positive;0;0;0;0;0;0 -2028;ambiant;positive;0;0;0;0;0;0 -2029;ambigu;negative;0;1;0;0;0;0 -2030;ambiguë;negative;0;1;0;0;0;0 -2031;ambiguïté;negative;0;1;0;0;0;0 -2032;ambition;positive;0;0;0;0;0;0 -2033;ambre;positive;0;0;0;0;0;0 -2034;ambrer;positive;0;0;0;0;0;0 -2035;ambulance;negative;0;1;1;0;0;0 -2036;âme s?ur;positive;0;1;0;0;0;0 -2037;améliorant;positive;0;0;0;0;0;0 -2038;améliorer;positive;0;0;0;0;0;0 -2039;amen;positive;0;0;0;0;0;0 -2040;aménagement;positive;0;0;0;0;0;0 -2041;aménagement paysager;positive;0;0;0;0;0;0 -2042;amendement;positive;0;0;0;0;0;0 -2043;amender;positive;0;0;0;0;0;0 -2044;aménité;positive;0;0;0;0;0;0 -2045;amèrement;negative;0;0;1;1;0;1 -2046;amertume;negative;0;0;1;1;0;1 -2047;améthyste;positive;0;0;0;0;0;0 -2048;amical;positive;0;0;0;0;0;0 -2049;amidon;negative;0;0;0;0;0;1 -2050;amidonner;negative;0;0;0;0;0;1 -2051;amiral;positive;0;0;0;0;0;0 -2052;amirauté;positive;0;0;0;0;0;0 -2053;amitié;positive;0;0;0;0;0;0 -2054;ammoniac;negative;0;0;0;0;0;1 -2055;amnésie;negative;0;1;1;0;0;0 -2056;amnistie;positive;1;0;0;0;0;0 -2057;amoindrir;negative;0;0;1;0;0;0 -2058;amorçage;positive;0;0;0;0;0;0 -2059;amorce;positive;0;0;0;0;0;0 -2060;amorcer;positive;0;0;0;0;0;0 -2061;amorphe;negative;0;0;1;0;0;1 -2062;amortir;negative;0;1;0;1;1;0 -2063;amortisseur;negative;0;1;0;0;0;0 -2064;amour;positive;0;0;0;0;0;0 -2065;amoureux;positive;1;0;0;0;0;0 -2066;amphétamine;negative;0;0;0;0;0;1 -2067;amphibien;negative;0;0;0;0;0;1 -2068;amphibiens;negative;0;0;0;0;0;1 -2069;amphibie;positive;0;0;0;0;0;0 -2070;amphithéâtre;positive;0;0;0;0;0;0 -2071;amplement;positive;0;0;0;0;0;0 -2072;ampleur;positive;0;0;0;0;0;0 -2073;amplification;positive;0;0;0;0;0;0 -2074;amplifier;positive;0;0;0;0;0;0 -2075;amplitude;positive;0;0;0;0;0;0 -2076;amputation;negative;0;1;1;0;0;1 -2077;amulette;positive;0;0;0;0;0;0 -2078;amuser;positive;1;0;0;0;0;0 -2079;amusant;positive;1;0;0;0;0;0 -2080;amuser gueule;positive;0;0;0;0;0;0 -2081;amusement;positive;1;0;0;0;0;0 -2082;amygdale;negative;0;0;0;0;0;1 -2083;an;positive;0;0;0;0;0;0 -2084;anaconda;negative;0;1;0;0;0;1 -2085;anal;negative;0;1;0;0;0;0 -2086;analgésique;negative;0;1;0;0;0;0 -2087;analogie;positive;0;0;0;0;0;0 -2088;analogique;positive;0;0;0;0;0;0 -2089;analogue;positive;0;0;0;0;0;0 -2090;analphabète;negative;0;0;1;0;0;1 -2091;analyser;positive;0;0;0;0;0;0 -2092;analyseur;positive;0;0;0;0;0;0 -2093;analyste;positive;0;0;0;0;0;0 -2094;analytique;positive;0;0;0;0;0;0 -2095;ananas;positive;0;0;0;0;0;0 -2096;anarchie;negative;0;1;0;1;0;0 -2097;anarchisme;negative;0;1;0;1;0;0 -2098;anarchiste;negative;0;1;0;1;0;0 -2099;anastomose;negative;0;1;0;0;0;1 -2100;anathème;negative;0;1;1;1;0;1 -2101;anatomie;positive;0;0;0;0;0;0 -2102;anatomique;positive;0;0;0;0;0;0 -2103;ancestral;positive;0;0;0;0;0;0 -2104;ancêtre;positive;0;0;0;0;0;0 -2105;ancien combattant;positive;0;0;0;0;0;0 -2106;ancienneté;positive;0;0;0;0;0;0 -2107;ancrage;positive;0;0;1;0;0;0 -2108;ancre;positive;0;0;0;0;0;0 -2109;âne;negative;0;1;0;1;0;1 -2110;anéantir;negative;0;1;1;1;0;0 -2111;anéantissement;negative;0;1;1;1;0;0 -2112;anémone;positive;0;0;0;0;0;0 -2113;ânerie;negative;0;0;0;0;0;1 -2114;ânesse;positive;0;0;0;0;0;0 -2115;anesthésier;negative;0;1;0;0;0;0 -2116;anesthésiant;negative;0;1;0;0;0;0 -2117;anesthésie;negative;0;1;0;0;0;0 -2118;anesthésique;negative;0;1;0;0;0;0 -2119;ange;positive;0;0;0;0;1;0 -2120;angélique;positive;0;0;0;0;0;0 -2121;angine;negative;0;1;1;0;0;0 -2122;angiographie;positive;0;0;0;0;0;0 -2123;angle;positive;0;0;0;0;0;0 -2124;angoisser;negative;0;1;1;0;0;0 -2125;angoissant;negative;0;1;1;0;0;0 -2126;angoisse;negative;0;1;1;1;0;0 -2127;anguille;negative;0;1;0;0;0;1 -2128;angulaire;positive;0;0;0;0;0;0 -2129;anhydre;positive;0;0;0;0;0;0 -2130;animal de compagnie;negative;0;0;0;0;0;0 -2131;animer;positive;1;0;0;0;0;0 -2132;animosité;negative;0;1;1;1;0;1 -2133;annales;positive;0;0;0;0;0;0 -2134;anneau;positive;0;0;0;0;0;0 -2135;année;positive;0;0;0;0;0;0 -2136;annexe;positive;0;0;0;0;0;0 -2137;annexer;positive;0;0;0;0;0;0 -2138;annexion;positive;0;0;0;0;0;0 -2139;annihilation;negative;0;1;1;1;0;0 -2140;annihiler;negative;0;1;0;1;0;0 -2141;anniversaire;positive;0;0;0;0;1;0 -2142;annonce;positive;0;0;0;0;0;0 -2143;annoncer;positive;0;0;0;0;0;0 -2144;annotation;positive;0;0;0;0;0;0 -2145;annoter;positive;0;0;0;0;0;0 -2146;annuaire;positive;0;0;0;0;0;0 -2147;annulaire;positive;0;0;0;0;0;0 -2148;annulation;negative;0;1;1;1;1;0 -2149;anomalie;negative;0;1;0;0;1;0 -2150;anonyme;negative;0;1;1;0;0;1 -2151;anormal;negative;0;1;0;1;1;1 -2152;anse;positive;0;0;0;0;0;0 -2153;antagonisme;negative;0;0;0;1;0;0 -2154;antagoniste;negative;0;1;0;1;0;1 -2155;antalgique;negative;0;1;0;0;0;0 -2156;antécédent;positive;0;0;0;0;0;0 -2157;antéchrist;negative;0;1;0;1;0;1 -2158;antenne;positive;0;0;0;0;0;0 -2159;antérieurement;positive;0;0;0;0;0;0 -2160;anthologie;positive;0;0;0;0;0;0 -2161;anthrax;negative;0;1;1;0;0;1 -2162;anthropologie;positive;0;0;0;0;0;0 -2163;anthropophage;negative;0;1;0;0;0;1 -2164;anthropophagie;negative;0;1;0;0;0;1 -2165;antibiotique;positive;0;0;0;0;0;0 -2166;anticipation;positive;0;0;0;0;0;0 -2167;anticiper;positive;0;0;0;0;0;0 -2168;antidote;positive;0;0;0;0;0;0 -2169;antifongique;positive;0;0;0;0;0;0 -2170;antilope;positive;0;0;0;0;0;0 -2171;antimoine;negative;0;1;0;0;0;1 -2172;antipathie;negative;0;0;0;1;0;1 -2173;antipathique;negative;0;0;0;1;0;1 -2174;antiquaire;positive;0;0;0;0;0;0 -2175;antiquité;positive;0;0;0;0;0;0 -2176;antiseptique;positive;0;0;0;0;0;0 -2177;antisocial;negative;0;1;1;1;0;1 -2178;antithèse;negative;0;0;0;1;0;0 -2179;antithétique;negative;0;0;0;0;0;0 -2180;antiviral;positive;0;0;0;0;0;0 -2181;anxiété;negative;0;1;1;1;0;0 -2182;août;positive;1;0;0;0;0;0 -2183;aorte;positive;0;0;0;0;0;0 -2184;apache;negative;0;1;0;0;0;0 -2185;apaiser;positive;0;0;0;0;0;0 -2186;apaisant;positive;0;0;0;0;0;0 -2187;apathie;negative;0;0;1;0;0;0 -2188;apercevoir;positive;0;0;0;0;0;0 -2189;apéritif;positive;0;0;0;0;0;0 -2190;aphone;negative;0;1;1;0;1;0 -2191;aplanir;negative;0;0;0;0;0;0 -2192;aplatir;negative;0;0;0;0;0;0 -2193;aplomb;positive;0;0;0;0;0;0 -2194;apocalyptique;negative;0;1;1;0;0;0 -2195;apogée;positive;0;0;0;0;1;0 -2196;apologétique;positive;0;0;1;0;0;0 -2197;apologiste;positive;0;0;0;0;0;0 -2198;apostasie;negative;0;0;1;0;0;0 -2199;apostat;negative;0;0;1;0;0;0 -2200;apostolique;positive;0;0;0;0;0;0 -2201;apostrophe;positive;0;0;0;0;1;0 -2202;apôtre;positive;0;0;0;0;0;0 -2203;appareil;positive;0;0;0;0;0;0 -2204;appareil de chauffage;positive;0;0;0;0;0;0 -2205;appareillage;positive;0;0;0;0;0;0 -2206;appartement;positive;0;0;0;0;0;0 -2207;appartement terrasse;positive;0;0;0;0;0;0 -2208;appât;negative;0;1;0;0;1;0 -2209;appelant;positive;0;0;0;0;0;0 -2210;appeler;positive;0;0;0;0;0;0 -2211;appellation inappropriée;negative;0;0;0;0;0;0 -2212;appel;negative;0;1;0;1;1;0 -2213;appendice;positive;0;0;0;0;0;0 -2214;appendicite;negative;0;1;1;0;0;0 -2215;appentis;negative;0;0;0;0;0;1 -2216;appétissant;positive;1;0;0;0;0;0 -2217;appétit;positive;0;0;0;0;0;0 -2218;applaudir;positive;0;0;0;0;0;0 -2219;applaudissement;positive;0;0;0;0;1;0 -2220;applicabilité;positive;0;0;0;0;0;0 -2221;applicable;positive;0;0;0;0;0;0 -2222;application;positive;0;0;0;0;0;0 -2223;appliquer;positive;0;0;0;0;0;0 -2224;apporter;positive;0;0;0;0;0;0 -2225;apposer;positive;0;0;0;0;0;0 -2226;appréciable;positive;0;0;0;0;0;0 -2227;apprécier;positive;0;0;0;0;0;0 -2228;appréciation;positive;0;0;0;0;0;0 -2229;appréhender;negative;0;1;0;1;0;0 -2230;appréhension;negative;0;1;1;0;1;0 -2231;apprendre;positive;0;0;0;0;1;0 -2232;apprentissage;positive;0;0;0;0;0;0 -2233;apprêt;positive;0;0;0;0;0;0 -2234;apprivoiser;positive;0;0;0;0;0;0 -2235;apprivoisement;positive;0;0;0;0;0;0 -2236;approche;positive;0;0;0;0;0;0 -2237;approfondir;positive;0;0;0;0;0;0 -2238;appropirées;positive;0;0;0;0;0;0 -2239;appropriation;positive;0;0;0;0;0;0 -2240;approuver;positive;0;0;0;0;0;0 -2241;approvisionnement;positive;0;0;0;0;0;0 -2242;approvisionner;positive;0;0;0;0;0;0 -2243;approximation;positive;0;0;0;0;0;0 -2244;approximativement;positive;0;0;0;0;0;0 -2245;appuyer;positive;0;0;0;0;0;0 -2246;après midi;positive;0;0;0;0;0;0 -2247;aptitude;positive;0;0;0;0;0;0 -2248;apurement;positive;0;0;0;0;0;0 -2249;aqua;positive;0;0;0;0;0;0 -2250;aquarium;positive;0;0;0;0;0;0 -2251;aquatique;positive;0;0;0;0;0;0 -2252;aqueduc;positive;0;0;0;0;0;0 -2253;arable;positive;0;0;0;0;0;0 -2254;araignée;negative;0;1;0;0;0;1 -2255;arbalète;negative;0;1;0;0;0;0 -2256;arbitraire;negative;0;0;1;1;0;1 -2257;arbitre;positive;0;0;0;0;0;0 -2258;arbitrer;positive;0;0;0;0;0;0 -2259;arbuste;positive;0;0;0;0;0;0 -2260;arc;positive;0;0;0;0;0;0 -2261;arcade;positive;0;0;0;0;0;0 -2262;archaïque;negative;0;0;0;1;0;1 -2263;arche;positive;0;0;0;0;0;0 -2264;archéologie;positive;0;0;0;0;0;0 -2265;archéologique;positive;0;0;0;0;0;0 -2266;archéologue;positive;0;0;0;0;0;0 -2267;archer;positive;0;0;0;0;0;0 -2268;archétype;positive;0;0;0;0;0;0 -2269;archevêque;positive;0;0;0;0;0;0 -2270;archipel;positive;0;0;0;0;0;0 -2271;architecte;positive;0;0;0;0;0;0 -2272;architecture;positive;0;0;0;0;0;0 -2273;archivage;positive;0;0;0;0;0;0 -2274;archiver;positive;0;0;0;0;0;0 -2275;archives;positive;0;0;0;0;0;0 -2276;arctique;positive;0;0;0;0;0;0 -2277;ardoise;positive;0;0;0;0;0;0 -2278;ardu;negative;0;0;1;0;0;0 -2279;arène;positive;0;0;0;0;0;0 -2280;aréole;positive;0;0;0;0;0;0 -2281;argent;positive;0;0;0;1;1;0 -2282;argent liquide;positive;0;1;0;1;0;0 -2283;argent recueillir;positive;1;0;0;0;0;0 -2284;argenter;positive;0;0;0;0;0;0 -2285;argenterie;positive;0;0;0;0;0;0 -2286;argile;positive;0;0;0;0;0;0 -2287;argot;negative;0;0;0;0;0;0 -2288;argument;negative;0;0;0;1;0;0 -2289;argumentation;negative;0;0;0;1;0;0 -2290;argumenter;negative;0;0;0;1;0;0 -2291;aridité;negative;0;0;0;0;0;0 -2292;aristocrate;positive;0;0;0;0;0;0 -2293;aristocratie;positive;0;0;0;0;0;0 -2294;aristocratique;positive;0;0;0;0;0;0 -2295;arithmétique;positive;0;0;0;0;0;0 -2296;armada;negative;0;1;0;1;0;0 -2297;arme à feu;negative;0;1;0;1;0;0 -2298;arme à répétition;negative;0;0;0;0;0;0 -2299;armement;negative;0;1;0;1;0;0 -2300;armer;positive;0;0;0;0;0;0 -2301;arme;positive;0;0;0;0;0;0 -2302;armoire;positive;0;0;0;0;0;0 -2303;armure;positive;0;1;0;0;0;0 -2304;armurerie;negative;0;1;0;1;0;0 -2305;arnaque;negative;0;1;1;1;1;0 -2306;arnaquer;negative;0;1;1;1;1;0 -2307;arôme;positive;1;0;0;0;0;0 -2308;arpentage;positive;0;0;0;0;0;0 -2309;arpenteur;positive;0;0;0;0;0;0 -2310;arquer;negative;0;0;1;0;0;0 -2311;arracher;negative;0;1;0;1;1;0 -2312;arranger;positive;0;0;0;0;0;0 -2313;arrangement;positive;0;0;0;0;0;0 -2314;arrestation;negative;0;0;0;1;0;0 -2315;arrêt;negative;0;1;1;1;1;0 -2316;arrêter;negative;0;1;0;0;1;0 -2317;arrêté;positive;0;0;0;0;0;0 -2318;arrhes;positive;0;0;0;0;0;0 -2319;arriération;negative;0;1;1;0;0;1 -2320;arrière goût;negative;0;0;0;0;0;1 -2321;arrière pays;positive;0;0;0;0;0;0 -2322;arrière plan;positive;0;0;0;0;0;0 -2323;arriérer;negative;0;0;0;0;0;0 -2324;arrimer;positive;0;0;0;0;0;0 -2325;arrivé|arrivée;positive;0;0;0;0;0;0 -2326;arriver;positive;0;0;0;0;0;0 -2327;arriver à;positive;1;0;0;0;0;0 -2328;arriviste;negative;0;0;0;0;0;1 -2329;arrogance;negative;0;0;0;1;0;0 -2330;arrogant;negative;0;0;0;1;0;1 -2331;arrondir;positive;0;0;0;0;0;0 -2332;arroser;negative;0;1;0;0;0;0 -2333;arsenal;negative;0;1;0;1;0;0 -2334;arsenic;negative;0;1;1;0;0;1 -2335;art;positive;0;0;1;0;1;0 -2336;art du portrait;positive;0;0;0;0;0;0 -2337;art oratoire;positive;0;0;0;0;0;0 -2338;artère;positive;0;0;0;0;0;0 -2339;artériosclérose;negative;0;1;1;0;0;0 -2340;arthropode;positive;0;0;0;0;0;0 -2341;artichaut;positive;0;0;0;0;0;0 -2342;article;positive;0;0;0;0;0;0 -2343;articulation;positive;0;0;0;0;0;0 -2344;articuler;positive;0;0;0;0;0;0 -2345;artifice;negative;0;1;0;0;0;0 -2346;artillerie;negative;0;1;0;1;0;0 -2347;artilleur;positive;0;0;0;0;0;0 -2348;artisan;positive;0;0;0;0;0;0 -2349;artisanal;positive;0;0;0;0;0;0 -2350;artisanat;positive;0;0;0;0;0;0 -2351;artiste;positive;0;0;0;0;0;0 -2352;artistique;positive;0;0;0;0;0;0 -2353;as;positive;1;0;0;0;0;0 -2354;ascendance;positive;0;0;0;0;0;0 -2355;ascendant;negative;0;1;0;1;0;0 -2356;ascenseur;positive;0;0;0;0;0;0 -2357;ascension;positive;0;1;0;0;0;0 -2358;ascète;negative;0;0;1;0;0;0 -2359;ascétique;negative;0;0;1;0;0;0 -2360;aspartame;positive;0;0;0;0;0;0 -2361;aspect;positive;0;0;0;0;0;0 -2362;aspérité;negative;0;1;0;0;0;0 -2363;asphalte;negative;0;0;0;0;0;1 -2364;asphalter;negative;0;0;0;0;0;1 -2365;aspic;negative;0;1;0;0;0;1 -2366;aspirant;positive;0;0;0;0;0;0 -2367;aspirer;negative;0;0;0;0;0;0 -2368;assaillir;negative;0;1;0;0;0;0 -2369;assaillie;negative;0;1;0;0;0;0 -2370;assaillies;negative;0;1;0;0;0;0 -2371;assainir;positive;0;0;0;0;0;1 -2372;assaisonner;positive;0;0;0;0;0;0 -2373;assaisonnement;positive;0;0;0;0;0;0 -2374;assassin;negative;0;1;1;1;0;1 -2375;assassinat;negative;0;1;1;1;0;0 -2376;assassiner;negative;0;1;0;1;0;0 -2377;assaut;negative;0;1;0;1;1;0 -2378;assécher;negative;0;0;0;0;0;0 -2379;assemblage;positive;0;0;0;0;0;0 -2380;assembler;positive;0;0;0;0;0;0 -2381;assemblée plénier;positive;0;0;0;0;0;0 -2382;assemblée;positive;0;0;0;0;0;0 -2383;asséner;negative;0;1;0;1;1;0 -2384;asséner un coup;negative;0;0;0;1;0;0 -2385;assertion;positive;0;0;0;0;0;0 -2386;asservir;negative;0;0;0;1;0;0 -2387;asservissement;negative;0;1;1;1;0;1 -2388;assesseur;positive;0;0;0;0;0;0 -2389;assiduité;positive;0;0;0;0;0;0 -2390;assiette;positive;0;0;0;0;0;0 -2391;assimilation;positive;0;0;0;0;0;0 -2392;assimiler;positive;0;0;0;0;0;0 -2393;assister;positive;0;0;0;0;0;0 -2394;assister à;positive;0;0;0;0;0;0 -2395;association;positive;0;0;0;0;0;0 -2396;association caritatif;positive;0;0;0;0;0;0 -2397;associer;positive;0;0;0;0;0;0 -2398;assoiffer;negative;0;1;1;0;0;0 -2399;assoiffer de sang;negative;0;1;0;1;0;1 -2400;assombrir;negative;0;1;1;0;0;0 -2401;assommant;negative;0;0;1;0;0;0 -2402;assortiment;positive;0;0;0;0;0;0 -2403;assouplissement;positive;0;0;0;0;0;0 -2404;assourdissant;negative;0;1;0;0;1;0 -2405;assouvir;positive;1;0;0;0;0;0 -2406;assouvissement;positive;1;0;0;0;0;0 -2407;assujettir;negative;0;0;0;1;0;1 -2408;assujettissement;negative;0;1;1;1;0;1 -2409;assurance;positive;0;1;0;0;0;0 -2410;assurer;positive;0;0;0;0;0;0 -2411;assurément;positive;0;0;0;0;0;0 -2412;assureur;positive;0;0;0;0;0;0 -2413;astérisque;positive;0;0;0;0;0;0 -2414;astéroïde;negative;0;1;0;0;0;0 -2415;astigmatisme;negative;0;1;1;0;0;0 -2416;astral;positive;0;0;0;0;0;0 -2417;astraux;positive;0;0;0;0;0;0 -2418;astre;positive;0;0;0;0;0;0 -2419;astringent;negative;0;1;0;0;0;1 -2420;astrologie;positive;0;0;0;0;0;0 -2421;astrologue;positive;0;0;0;0;0;0 -2422;astronaute;positive;0;0;0;0;0;0 -2423;astronome;positive;0;0;0;0;0;0 -2424;astronomie;positive;0;0;0;0;0;0 -2425;asymétrie;negative;0;0;0;0;0;1 -2426;asymétrique;negative;0;1;1;0;0;1 -2427;asymptotique;positive;0;0;0;0;0;0 -2428;atelier;positive;0;0;0;0;0;0 -2429;atelier de reliure;positive;0;0;0;0;0;0 -2430;athée;negative;0;0;1;1;0;1 -2431;athéisme;negative;0;0;0;0;0;0 -2432;athérosclérose;negative;0;1;1;0;0;0 -2433;athlète;positive;0;0;0;0;0;0 -2434;athlétique;positive;0;0;0;0;0;0 -2435;athlétisme;positive;0;0;0;0;0;0 -2436;atlas;positive;0;0;0;0;0;0 -2437;atmosphère;positive;1;0;0;0;0;0 -2438;atmosphérique;positive;0;0;0;0;0;0 -2439;atoll;positive;0;0;0;0;0;0 -2440;atome;positive;0;0;0;0;0;0 -2441;atomique;negative;0;1;0;1;0;0 -2442;atout;positive;0;0;0;0;1;0 -2443;atrium;positive;0;0;0;0;0;0 -2444;atroce;negative;0;1;1;1;0;1 -2445;atrocement;negative;0;1;1;0;1;1 -2446;atrophie;negative;0;1;1;0;0;1 -2447;atrophier;negative;0;1;1;0;0;1 -2448;attacher;positive;0;0;0;0;0;0 -2449;attachant;positive;0;0;0;0;0;0 -2450;attachement;positive;0;0;0;0;0;0 -2451;attanchants;positive;0;0;0;0;0;0 -2452;attaque choc;negative;0;1;0;1;1;0 -2453;attaquer;negative;0;1;0;1;1;0 -2454;attaquer avec un hache;negative;0;1;0;1;1;0 -2455;atteindre;positive;0;0;0;0;0;0 -2456;attelage;positive;0;0;0;0;0;0 -2457;attelle;positive;0;0;0;0;0;0 -2458;attenir;positive;0;0;0;0;0;0 -2459;attenant;positive;0;0;0;0;0;0 -2460;attendre;negative;0;0;0;0;0;0 -2461;attentionner;positive;0;0;0;0;0;0 -2462;attentonnée;positive;0;0;0;0;0;0 -2463;atténuer;positive;0;0;0;0;0;0 -2464;atterrer;negative;0;1;0;0;1;1 -2465;atterrir;positive;1;0;0;0;0;0 -2466;atterrissage;positive;0;0;0;0;0;0 -2467;attestation;positive;0;0;0;0;0;0 -2468;attester;positive;0;0;0;0;0;0 -2469;attirail;positive;0;0;0;0;0;0 -2470;attirance;positive;0;0;0;0;0;0 -2471;attiser;positive;0;0;0;0;0;0 -2472;attraction;positive;0;0;0;0;0;0 -2473;attractivité;positive;0;0;0;0;0;0 -2474;attraire;positive;0;0;0;0;1;0 -2475;attraper;negative;0;1;0;0;1;0 -2476;attribuable;negative;0;1;1;0;0;0 -2477;attribuer;positive;0;0;0;0;1;0 -2478;attribut;positive;0;0;0;0;0;0 -2479;attribution;positive;0;0;0;0;0;0 -2480;attrition;negative;0;0;1;0;0;1 -2481;attrouper;positive;0;0;0;0;0;0 -2482;au beurre;positive;0;0;0;0;0;1 -2483;au bord du larme;negative;0;1;1;0;0;1 -2484;au centre;positive;0;0;0;0;0;0 -2485;au charme désuet;positive;0;0;0;0;0;0 -2486;au chocolat;positive;0;0;0;0;0;0 -2487;au coin du feu;positive;1;0;0;0;0;0 -2488;au curry;positive;0;0;0;0;0;0 -2489;au galop;positive;0;0;0;0;0;0 -2490;au goût de beurre;positive;0;0;0;0;0;1 -2491;au hasard;positive;0;0;0;0;1;0 -2492;au lait;positive;0;0;0;0;0;0 -2493;au microscope;positive;0;0;0;0;0;0 -2494;au milieu de;positive;0;0;0;0;0;0 -2495;au pouvoir;positive;0;0;0;0;0;0 -2496;au revoir;negative;0;0;1;0;0;0 -2497;au dessus;positive;0;0;0;0;0;0 -2498;aubaine;positive;0;0;0;0;1;0 -2499;aube;positive;0;0;0;0;1;0 -2500;auberge;positive;0;0;0;0;0;0 -2501;aubergiste;positive;0;0;0;0;0;0 -2502;audacieux;positive;0;0;0;0;0;0 -2503;audibilité;positive;0;0;0;0;0;0 -2504;audible;positive;0;0;0;0;0;0 -2505;audit;positive;0;0;0;0;0;0 -2506;auditer;positive;0;0;0;0;0;0 -2507;auditionner;positive;0;0;0;0;0;0 -2508;auditorium;positive;0;0;0;0;0;0 -2509;auge;positive;0;0;0;0;0;0 -2510;augurer;positive;0;0;0;0;0;0 -2511;auguste;positive;1;0;0;0;0;0 -2512;aumônier;positive;0;0;0;0;0;0 -2513;auparavant;positive;0;0;0;0;0;0 -2514;aura;positive;1;0;0;0;0;0 -2515;auréole;positive;0;0;0;0;0;0 -2516;aurore;positive;0;0;0;0;1;0 -2517;auspice;positive;0;0;0;0;0;0 -2518;austère;negative;0;1;1;0;0;0 -2519;austérité;negative;0;1;1;0;0;0 -2520;autel;positive;0;0;0;0;0;0 -2521;authenticité;positive;0;0;0;0;0;0 -2522;authentification;positive;0;0;0;0;0;0 -2523;authentifier;positive;0;0;0;0;0;0 -2524;authentique;positive;0;0;0;0;0;0 -2525;auto;positive;0;0;0;0;0;0 -2526;autobiographie;positive;0;0;0;0;0;0 -2527;autobus;positive;0;0;0;0;0;0 -2528;autochtone;positive;0;0;0;0;0;0 -2529;autocratique;negative;0;1;1;1;0;0 -2530;autographe;positive;0;0;0;0;0;0 -2531;automatique;positive;0;0;0;0;0;0 -2532;automne;negative;0;1;1;0;0;0 -2533;automobile;positive;0;0;0;0;0;0 -2534;autopsie;negative;0;1;1;0;0;1 -2535;autoriser;positive;0;0;0;0;0;0 -2536;autorisation;positive;0;0;0;0;0;0 -2537;autoritaire;negative;0;0;0;1;0;0 -2538;autorité;positive;0;0;0;0;0;0 -2539;autoroute;positive;0;0;0;0;0;0 -2540;autosuffisance;positive;0;0;0;0;0;0 -2541;autruche;negative;0;1;0;0;0;0 -2542;auvent;positive;0;0;0;0;0;0 -2543;au herbe;positive;0;0;0;0;0;0 -2544;au idée arrêté;negative;0;0;0;1;0;0 -2545;au m?urs léger;negative;0;0;0;0;0;1 -2546;au multiple fonction;positive;0;0;0;0;0;0 -2547;au pomme;positive;0;0;0;0;0;0 -2548;aval;positive;0;0;0;0;0;0 -2549;avalanche;negative;0;1;1;0;1;0 -2550;avaler;positive;0;1;0;0;1;0 -2551;avance;positive;0;1;0;0;1;0 -2552;avancer;positive;1;0;0;0;0;0 -2553;avancement;positive;0;0;1;0;0;0 -2554;avancer au ralenti;negative;0;0;1;0;0;1 -2555;avancer lentement;negative;0;0;1;0;0;1 -2556;avancer petit à petit;positive;0;0;0;0;0;0 -2557;avant de;negative;0;0;0;0;0;0 -2558;avant bras;positive;0;0;0;1;0;0 -2559;avant garde;positive;0;0;0;0;0;0 -2560;avant poste;negative;0;1;0;0;0;0 -2561;avant propos;positive;0;0;0;0;0;0 -2562;avantage;positive;0;0;0;0;0;0 -2563;avantager;positive;1;0;0;0;0;0 -2564;avare;negative;0;1;1;1;0;1 -2565;avarice;negative;0;0;0;1;0;1 -2566;avatar;positive;0;0;0;0;0;0 -2567;avec attention;positive;0;1;0;0;0;0 -2568;avec crainte;negative;0;1;1;0;1;0 -2569;avec de gros morceau;negative;0;0;0;0;0;0 -2570;avec désinvolture;positive;0;0;0;0;0;0 -2571;avec le même intensité;positive;0;0;0;0;0;0 -2572;avec lassitude;negative;0;0;1;0;0;0 -2573;avec modération;positive;0;0;0;0;0;0 -2574;avec parcimonie;positive;0;0;0;0;0;0 -2575;avec précaution;positive;0;1;0;0;0;0 -2576;avec prudence;positive;0;1;0;0;0;0 -2577;avec quoi;positive;0;0;0;0;0;0 -2578;avec sérieux;positive;0;0;0;0;0;0 -2579;avec un grand raffinement;positive;1;0;0;0;0;0 -2580;avec violence;negative;0;1;1;1;0;1 -2581;avenant;positive;0;0;0;0;0;0 -2582;avènement;positive;0;0;0;0;0;0 -2583;avenir;positive;0;0;0;0;0;0 -2584;avent;positive;0;0;0;0;0;0 -2585;avenue;positive;0;0;0;0;0;0 -2586;avérer;positive;0;0;0;0;0;0 -2587;avers;positive;0;0;0;0;0;0 -2588;aversion;negative;0;1;0;1;0;1 -2589;avertir;positive;0;1;0;0;1;0 -2590;aveu;negative;0;1;1;0;1;0 -2591;aveugler;negative;0;1;0;0;1;0 -2592;aveuglant;negative;0;1;0;0;1;0 -2593;aveugle;negative;0;1;0;0;0;0 -2594;aveuglément;negative;0;1;1;0;0;0 -2595;aviateur;positive;0;0;0;0;0;0 -2596;aviation;positive;0;0;0;0;0;0 -2597;avide;negative;0;0;0;1;0;1 -2598;avidité;negative;0;0;0;1;0;1 -2599;avion;positive;0;0;0;0;0;0 -2600;aviron;negative;0;0;0;0;0;0 -2601;aviser;positive;0;0;0;0;0;0 -2602;avoir confiance;positive;0;0;0;0;0;0 -2603;avoir du difficulté;negative;0;1;1;0;0;0 -2604;avoir en horreur;negative;0;1;0;1;0;1 -2605;avoir en stock;positive;0;0;0;0;0;0 -2606;avoir le hoquet;negative;0;1;0;0;1;0 -2607;avoir le moyen;positive;0;0;0;0;0;0 -2608;avoir peur;negative;0;1;1;0;1;0 -2609;avoir pitié;negative;0;0;1;0;0;0 -2610;avoir pour but;positive;0;0;0;0;0;0 -2611;avoir recours;positive;0;0;0;0;0;0 -2612;avoir un compte;positive;0;0;0;0;0;0 -2613;avoir un handicap;negative;0;0;1;0;0;0 -2614;avoir un mouvement de recul;negative;0;1;1;0;1;1 -2615;avoir un tic;negative;0;1;0;0;1;0 -2616;avortement;negative;0;1;1;0;0;1 -2617;avorter;negative;0;1;1;1;0;0 -2618;axe;positive;0;0;0;0;0;0 -2619;axe central;positive;0;0;0;0;0;0 -2620;axe routier;positive;0;0;0;0;0;0 -2621;axial;positive;0;0;0;0;0;0 -2622;axiomatique;positive;0;0;0;0;0;0 -2623;axiome;positive;0;0;0;0;0;0 -2624;azimut;positive;0;0;0;0;0;0 -2625;azur;positive;0;0;0;0;0;0 -2626;azurer;positive;0;0;0;0;0;0 -2627;baïonnette;negative;0;1;0;1;0;0 -2628;babillage;negative;0;0;0;0;0;0 -2629;babiller;negative;0;0;0;0;0;0 -2630;babine;negative;0;0;0;0;0;0 -2631;babouin;negative;0;0;0;0;0;1 -2632;baby sitter;positive;0;0;0;0;0;0 -2633;bac;negative;0;0;0;0;0;0 -2634;baccalauréat;positive;0;0;0;0;0;0 -2635;baccarat;positive;0;0;0;0;1;0 -2636;bachelier bachelier;positive;0;0;0;0;0;0 -2637;backgammon;positive;0;0;0;0;1;0 -2638;bâcler;negative;0;0;0;0;0;1 -2639;bactérie;negative;0;1;0;0;0;1 -2640;badge;positive;0;0;0;0;0;0 -2641;badinage;positive;0;0;0;0;1;0 -2642;badiner;positive;0;0;0;0;1;0 -2643;baffe;negative;0;0;0;1;1;0 -2644;bagage;positive;0;0;0;0;0;0 -2645;bagagiste;positive;0;0;0;0;0;0 -2646;bagarre;negative;0;1;0;1;0;1 -2647;bagatelle;negative;0;0;0;0;0;1 -2648;bague;positive;0;0;0;0;0;0 -2649;bague|bagues orthodontique;positive;0;0;0;0;0;0 -2650;baguette;positive;0;1;0;0;0;0 -2651;bai|baie;positive;0;0;0;0;0;0 -2652;baigner;negative;0;0;0;0;0;1 -2653;baignoire;positive;0;0;0;0;0;0 -2654;bail;positive;0;0;0;0;0;0 -2655;bâillement;negative;0;0;0;0;0;0 -2656;bâiller;negative;0;0;0;0;0;0 -2657;bailleur;positive;0;0;0;0;0;0 -2658;bailleur de fond|fonds;positive;0;0;0;0;0;0 -2659;bâillon;negative;0;1;0;1;0;1 -2660;bâillonner;negative;0;1;0;1;0;1 -2661;bain;positive;1;0;0;0;0;0 -2662;baiser;positive;0;0;0;0;1;0 -2663;baisser;negative;0;1;1;0;0;0 -2664;baissier;negative;0;1;1;1;0;0 -2665;bal masquer;negative;0;0;0;0;1;0 -2666;balade;positive;1;0;0;0;0;0 -2667;balafre;negative;0;1;1;1;0;1 -2668;balafrer;negative;0;1;1;1;0;0 -2669;balai;positive;0;0;0;0;0;0 -2670;balance;positive;0;0;0;0;0;0 -2671;balancement;positive;0;0;0;0;0;0 -2672;balançoire;positive;0;0;0;0;0;0 -2673;balayage;negative;0;0;0;0;0;0 -2674;balayer|balayer;negative;0;0;0;0;0;0 -2675;balcon;positive;0;0;0;0;0;0 -2676;baldaquin;positive;0;0;0;0;0;0 -2677;baleine;negative;0;1;0;0;0;0 -2678;baliverne;negative;0;0;1;1;0;1 -2679;ballade;positive;1;0;0;0;0;0 -2680;ballast;positive;0;0;0;0;0;0 -2681;ballaster;positive;0;0;0;0;0;0 -2682;ballet;positive;0;0;0;0;0;0 -2683;ballon;positive;0;0;0;0;0;0 -2684;ballon de basket;positive;1;0;0;0;0;0 -2685;ballot;positive;0;0;0;0;0;0 -2686;balsamine;positive;0;0;0;0;0;0 -2687;balsamique;positive;0;0;0;0;0;0 -2688;balustrade;positive;0;0;0;0;0;0 -2689;banane;positive;0;0;0;0;0;0 -2690;banc;positive;0;0;0;0;0;0 -2691;bancal;negative;0;1;0;1;0;0 -2692;bande dessiner;positive;1;0;0;0;0;0 -2693;bande vidéo;positive;0;0;0;0;0;0 -2694;bande annonce;positive;0;0;0;0;0;0 -2695;bander;positive;0;0;0;0;0;0 -2696;bander le ?il;negative;0;1;0;0;1;0 -2697;banderole;positive;0;0;0;0;0;0 -2698;bandit;negative;0;1;0;0;0;1 -2699;banjo;positive;0;0;0;0;0;0 -2700;banlieue;negative;0;0;1;0;0;0 -2701;bannir;negative;0;1;1;1;0;0 -2702;bannissement;negative;0;0;1;1;0;1 -2703;banque;positive;0;0;0;0;0;0 -2704;banquet;positive;1;0;0;0;0;0 -2705;banquier;positive;0;0;0;0;0;0 -2706;banshee;negative;0;1;1;1;0;1 -2707;baptême;positive;0;0;0;0;0;0 -2708;baptismal;positive;1;0;0;0;0;0 -2709;baraque;positive;0;0;0;0;0;0 -2710;baratter;negative;0;0;0;1;0;0 -2711;barbare;negative;0;1;0;1;0;1 -2712;barbarie;negative;0;1;1;1;0;1 -2713;barbarisme;negative;0;1;0;1;0;1 -2714;barbecue;positive;0;0;0;0;0;0 -2715;barbeler;negative;0;1;0;1;0;0 -2716;barbiche;negative;0;0;0;0;0;0 -2717;barbu;positive;0;0;0;0;0;0 -2718;barbue;positive;0;0;0;0;0;0 -2719;bardane;positive;0;0;0;0;0;0 -2720;barde;positive;0;0;0;0;0;0 -2721;bardeau;positive;0;0;0;0;0;0 -2722;baril;positive;0;0;0;0;0;0 -2723;barjot;negative;0;0;0;0;0;1 -2724;barman;positive;0;0;0;0;0;0 -2725;baromètre;positive;0;0;0;0;0;0 -2726;baron;positive;0;0;0;0;0;0 -2727;baroque;positive;0;0;0;0;0;0 -2728;barque;positive;0;0;0;0;0;0 -2729;barque à fond plat;positive;0;0;0;0;0;0 -2730;barrer;negative;0;0;0;0;0;0 -2731;barrette;positive;0;0;0;0;0;0 -2732;barricade;negative;0;1;0;0;0;0 -2733;barricader;negative;0;1;0;0;0;0 -2734;baryton;positive;0;0;0;0;0;0 -2735;bas;negative;0;1;1;1;0;0 -2736;bas de gamme;negative;0;0;0;0;0;0 -2737;bas fond|fonds;negative;0;1;1;0;0;1 -2738;base de donnée;positive;0;0;0;0;0;0 -2739;base ball;positive;0;0;0;0;0;0 -2740;baser;positive;0;0;0;0;0;0 -2741;basilique;positive;0;0;0;0;0;0 -2742;basket ball;positive;1;0;0;0;0;0 -2743;basket;positive;0;0;0;0;0;0 -2744;bas terre;positive;0;0;0;0;0;0 -2745;basse;negative;0;1;1;1;0;0 -2746;bassin;positive;0;0;0;0;0;0 -2747;bassine;positive;0;0;0;0;0;0 -2748;basson;positive;0;0;0;0;0;0 -2749;bastion;positive;0;1;1;1;0;0 -2750;bataille;negative;0;1;1;1;0;0 -2751;batailler;negative;0;1;0;1;0;0 -2752;bataillon;negative;0;1;0;1;0;0 -2753;bateau;positive;0;0;0;0;0;0 -2754;bateau à vapeur;positive;0;0;0;0;0;0 -2755;bathymétrie;positive;0;0;0;0;0;0 -2756;bâtiment;positive;0;0;0;0;0;0 -2757;bâtir;positive;0;0;0;0;0;0 -2758;bâtisseur;positive;0;0;0;0;0;0 -2759;battage;positive;0;0;0;0;0;0 -2760;battage médiatique;negative;0;0;0;0;0;0 -2761;batte;negative;0;1;0;0;0;1 -2762;battement de jambe;negative;0;0;0;1;0;0 -2763;batterie;positive;0;0;0;1;0;0 -2764;battre;negative;0;1;1;1;0;0 -2765;baudrier;negative;0;1;1;0;0;0 -2766;bavarder;positive;0;0;0;0;0;0 -2767;bavasser;negative;0;0;0;0;0;0 -2768;bavette;positive;0;0;0;0;0;0 -2769;bavoir;positive;0;0;0;0;0;0 -2770;bavure;negative;0;0;0;0;0;1 -2771;bayou;negative;0;1;0;0;0;1 -2772;beagle;positive;0;0;0;0;0;0 -2773;béer;negative;0;1;0;0;1;0 -2774;béant;negative;0;1;0;0;1;0 -2775;béat;positive;1;0;0;0;0;0 -2776;béatitude;positive;1;0;0;0;0;0 -2777;beau gosse;positive;0;0;0;0;0;0 -2778;beauté;positive;1;0;0;0;0;0 -2779;bébé;positive;1;0;0;0;0;0 -2780;bec verseur;positive;0;0;0;0;0;0 -2781;bécane;positive;0;0;0;0;0;0 -2782;bêche;positive;0;0;0;0;0;0 -2783;bécher;positive;0;0;0;0;0;0 -2784;bêcher;positive;0;0;0;0;0;0 -2785;becquet;negative;0;1;1;1;0;0 -2786;bégaiement;negative;0;0;1;0;0;0 -2787;bégayer|bégayer;negative;0;0;1;0;0;0 -2788;beignet;positive;0;0;0;0;0;0 -2789;bélier;negative;0;0;0;1;0;0 -2790;belligérant;negative;0;1;0;1;0;0 -2791;belvédère;positive;0;0;0;0;0;0 -2792;bémol;negative;0;0;1;0;0;0 -2793;bénédiction;positive;0;0;0;0;1;0 -2794;bénéfice;positive;1;0;0;0;0;0 -2795;bénéficiaire;positive;0;0;0;0;0;0 -2796;bénéficier;positive;1;0;0;0;0;0 -2797;bénéfique;positive;1;0;0;0;0;0 -2798;bénévolat;positive;0;0;0;0;0;0 -2799;bénévole;positive;0;1;0;0;0;0 -2800;bénir;positive;0;0;0;0;0;0 -2801;bénin;positive;1;0;0;0;0;0 -2802;benzène;negative;0;0;0;0;0;1 -2803;béquille;positive;0;0;0;0;0;0 -2804;berceau;positive;0;0;0;1;0;0 -2805;bercer;positive;0;0;0;0;0;0 -2806;berceuse;positive;1;0;0;0;0;0 -2807;bergamote;positive;0;0;0;0;0;0 -2808;berge;positive;0;0;0;0;0;0 -2809;berger;positive;0;0;0;0;0;0 -2810;berlin;positive;0;0;0;0;0;0 -2811;berline;positive;0;0;0;0;0;0 -2812;berner;negative;0;0;0;0;0;1 -2813;besoin;positive;0;0;0;0;0;0 -2814;bestial;negative;0;1;0;0;0;1 -2815;bestiole;negative;0;1;0;0;0;1 -2816;bétail;positive;0;0;0;0;0;0 -2817;bêtise;negative;0;0;0;1;0;1 -2818;béton;positive;0;0;0;0;0;0 -2819;beurre;positive;0;0;0;0;0;0 -2820;beurrer;positive;0;0;0;0;0;0 -2821;beuverie;negative;0;0;0;0;0;0 -2822;biais;negative;0;0;0;1;0;1 -2823;biaiser;negative;0;0;1;1;1;1 -2824;bibliographie;positive;0;0;0;0;0;0 -2825;bibliothécaire;positive;0;0;0;0;0;0 -2826;bibliothèque;positive;0;0;0;0;0;0 -2827;biblique;positive;0;0;0;0;0;0 -2828;biche;positive;0;0;0;0;0;0 -2829;bicouche;positive;0;0;0;0;0;0 -2830;bicyclette;positive;0;0;0;0;0;0 -2831;bien;positive;0;1;0;0;1;0 -2832;bien en plein propriété;positive;0;0;0;0;0;0 -2833;bien que;negative;0;0;0;0;0;0 -2834;bien aimer;positive;0;0;0;0;0;0 -2835;bien être;positive;1;0;0;0;0;0 -2836;bienfaisance;positive;0;0;0;0;0;0 -2837;biennal;positive;0;0;0;0;0;0 -2838;bienséance;positive;0;0;0;0;0;0 -2839;bienvenir;positive;1;0;0;0;0;0 -2840;bière;positive;1;0;0;0;0;0 -2841;bifurcation;negative;0;1;1;0;0;0 -2842;bigot;negative;0;1;1;1;0;1 -2843;bihebdomadaire;positive;0;0;0;0;0;0 -2844;bijou;positive;0;0;0;0;0;0 -2845;bijouterie;positive;0;0;0;0;0;0 -2846;bilatéral;positive;0;0;0;0;0;0 -2847;bile;negative;0;0;1;1;0;1 -2848;bilingue;positive;0;0;0;0;0;0 -2849;billard;positive;0;0;0;0;0;0 -2850;bille;positive;0;0;0;0;0;0 -2851;billet;positive;0;0;0;0;0;0 -2852;bimestriel;positive;0;0;0;0;0;0 -2853;binaire;positive;0;0;0;0;0;0 -2854;binoculaire;positive;0;0;0;0;0;0 -2855;binôme;positive;0;0;0;0;0;0 -2856;binomial;positive;0;0;0;0;0;0 -2857;biogenèse;positive;0;0;0;0;0;0 -2858;biographe;positive;0;0;0;0;0;0 -2859;biographie;positive;0;0;0;0;0;0 -2860;biologie;positive;0;0;0;0;0;0 -2861;biopsie;negative;0;1;1;0;0;1 -2862;biosphère;positive;0;0;0;0;0;0 -2863;bipartite;positive;0;0;0;0;0;0 -2864;bis;positive;1;0;0;0;0;0 -2865;biscuit salé;positive;0;0;0;0;0;0 -2866;bise;positive;1;0;0;0;0;0 -2867;biseau;positive;0;0;0;0;0;0 -2868;biseauter;positive;0;0;0;0;0;0 -2869;bison;negative;0;1;0;0;0;0 -2870;bisou;positive;0;0;0;0;1;0 -2871;bit;positive;0;0;0;0;0;0 -2872;bitume;negative;0;0;0;0;0;1 -2873;bizarre;negative;0;1;0;0;1;1 -2874;bizarrerie;negative;0;0;1;0;1;1 -2875;black jack;negative;0;0;0;1;0;0 -2876;blafard;negative;0;1;1;0;1;0 -2877;blagant;positive;0;0;0;0;1;0 -2878;blague;positive;1;0;0;0;0;0 -2879;blaguer;positive;1;0;0;0;0;0 -2880;blaireau;negative;0;1;0;1;0;0 -2881;blâme;negative;0;0;0;1;0;1 -2882;blâmer;negative;0;0;0;1;0;1 -2883;blanchâtre;negative;0;0;0;0;0;1 -2884;blancheur;positive;1;0;0;0;0;0 -2885;blanchisserie;positive;0;0;0;0;0;0 -2886;blason;positive;0;0;0;0;0;0 -2887;blasphématoire;negative;0;0;0;1;0;1 -2888;blasphème;negative;0;0;0;1;0;0 -2889;blé à moudre;positive;0;0;0;0;0;0 -2890;blême;negative;0;1;1;0;0;0 -2891;blennorragie;negative;0;1;1;1;0;1 -2892;blesser;negative;0;1;1;1;0;1 -2893;blessant;negative;0;1;1;1;0;1 -2894;blessure;negative;0;1;1;1;0;1 -2895;bleu;negative;0;1;1;0;0;0 -2896;bleu ciel;positive;0;0;0;0;0;0 -2897;bleu de travail;positive;0;0;0;0;0;0 -2898;bleu lavande;positive;0;0;0;0;0;0 -2899;bleuâtre;negative;0;0;0;0;0;1 -2900;blindage;positive;0;1;0;0;0;0 -2901;blinder;negative;0;1;0;0;0;0 -2902;blitz;negative;0;1;0;1;1;0 -2903;blizzard;negative;0;1;1;0;0;0 -2904;bloc de roche;positive;0;0;0;0;0;0 -2905;blocage;negative;0;1;1;1;1;0 -2906;blocus;negative;0;1;1;1;0;0 -2907;blond;positive;0;0;0;0;0;0 -2908;blond|blonde;positive;0;0;0;0;0;0 -2909;blouse;positive;0;0;0;0;0;0 -2910;blouser;positive;0;0;0;0;0;0 -2911;blues;negative;0;1;1;0;0;0 -2912;bluff;negative;0;0;0;0;0;0 -2913;bluffer;negative;0;0;0;0;0;0 -2914;boa;negative;0;1;0;0;0;1 -2915;bobard;negative;0;0;0;1;0;1 -2916;bocal;positive;0;0;0;0;0;0 -2917;bogue;positive;0;0;0;0;0;0 -2918;boire;positive;0;0;0;0;0;0 -2919;bois;positive;0;0;0;0;0;0 -2920;bois de chauffage;positive;0;0;0;0;0;0 -2921;boiser;positive;0;0;0;0;0;0 -2922;boisseau;positive;0;0;0;0;0;0 -2923;boisson;positive;0;0;0;0;0;0 -2924;boisson alcooliser;negative;0;0;0;0;0;0 -2925;boite;positive;0;0;0;0;0;0 -2926;boîte;positive;0;0;0;0;0;0 -2927;boîte de conserve;positive;0;0;0;0;0;0 -2928;boîte de nuit;positive;0;0;0;0;0;0 -2929;boitement;negative;0;0;1;0;0;0 -2930;boiter;negative;0;0;1;0;0;0 -2931;boîtier;positive;0;0;0;0;0;0 -2932;bol;positive;0;0;0;0;0;0 -2933;bol alimentaire;positive;0;0;0;0;0;0 -2934;bombarder;negative;0;1;0;0;1;1 -2935;bombardement;negative;0;1;0;1;1;0 -2936;bombardier;negative;0;1;1;1;1;0 -2937;bombe;negative;0;1;1;1;1;0 -2938;bon;positive;0;0;0;0;1;0 -2939;bonbon;positive;0;0;0;0;0;0 -2940;bonbon au caramel;positive;0;0;0;0;0;0 -2941;bond;positive;0;0;0;0;0;0 -2942;bonde;negative;0;1;0;0;0;0 -2943;bonder;negative;0;1;0;0;0;0 -2944;bonheur;positive;1;0;0;0;0;0 -2945;bon garde;positive;0;0;0;0;0;0 -2946;bon volonté;positive;1;0;0;0;0;0 -2947;bonnet;positive;0;0;0;0;0;0 -2948;bonneterie;positive;0;0;0;0;0;0 -2949;bonté;positive;0;0;0;0;1;0 -2950;bonus;positive;0;0;0;0;1;0 -2951;boomerang;positive;0;0;0;0;0;0 -2952;booster;positive;0;0;0;0;0;0 -2953;bord du trottoir;negative;0;0;0;0;0;0 -2954;bord sous le vent;negative;0;1;1;0;0;0 -2955;border;positive;0;0;0;0;0;0 -2956;bordeau|bordeaux;negative;0;1;1;0;0;0 -2957;bordée;positive;0;0;0;0;0;0 -2958;bordel;negative;0;0;0;0;0;1 -2959;boréal;positive;0;0;0;0;0;0 -2960;boréals;positive;0;0;0;0;0;0 -2961;borner;negative;0;0;0;1;0;0 -2962;borner kilométrique;positive;0;0;0;0;0;0 -2963;bosquet;positive;0;0;0;0;0;0 -2964;boston;positive;0;0;0;0;0;0 -2965;botanique;positive;0;0;0;0;0;0 -2966;botaniste;positive;0;0;0;0;0;0 -2967;botte;positive;0;0;0;0;0;0 -2968;bouc;negative;0;0;0;0;0;0 -2969;bouc émissaire;negative;0;1;1;1;0;0 -2970;bouchage;negative;0;1;0;0;1;0 -2971;bouche bée;negative;0;1;0;0;1;0 -2972;boucher;negative;0;1;1;1;1;0 -2973;bouchère;negative;0;1;0;1;0;1 -2974;bouchon;positive;0;0;0;0;0;0 -2975;boucler d oreille;positive;0;0;0;0;0;0 -2976;boucler;positive;0;0;0;0;0;0 -2977;bouclier;positive;0;0;0;0;0;0 -2978;boue;negative;0;0;0;0;0;1 -2979;bouée;positive;0;0;0;0;0;0 -2980;bouée de sauvetage;positive;0;0;0;0;0;0 -2981;bouffant;negative;0;0;0;0;0;0 -2982;bouffir;negative;0;0;0;0;0;1 -2983;bouffon;negative;0;0;0;0;1;1 -2984;bougeoir;positive;0;0;0;0;0;0 -2985;bougie;positive;0;0;0;0;0;0 -2986;bougonner;negative;0;0;0;1;0;1 -2987;bouillant;negative;0;1;0;1;0;0 -2988;bouillir;negative;0;0;0;0;0;1 -2989;bouilloire;positive;0;0;0;0;0;0 -2990;bouillon;positive;0;0;0;0;0;0 -2991;bouillonner;negative;0;0;0;1;0;0 -2992;boulangerie;positive;0;0;0;0;0;0 -2993;boule;positive;0;0;0;0;0;0 -2994;boule de feu;positive;0;0;0;0;0;0 -2995;boule de neige;positive;0;0;0;0;0;0 -2996;bouleau;negative;0;1;0;1;0;1 -2997;bouledogue;positive;0;0;0;0;0;0 -2998;boulet;positive;0;0;0;0;0;0 -2999;boulette;positive;0;0;0;0;0;0 -3000;bouleversant;negative;0;1;1;1;0;0 -3001;bouleversement;negative;0;1;1;1;1;0 -3002;boulon;positive;0;0;0;0;0;0 -3003;boulonner;positive;0;0;0;0;0;0 -3004;bouquet;positive;0;0;0;0;0;0 -3005;bourbier;negative;0;1;1;0;0;1 -3006;bourdonner;negative;0;0;0;0;0;0 -3007;bourdonnement;negative;0;1;0;0;1;0 -3008;bourgeon;positive;0;0;0;0;0;0 -3009;bourreau;negative;0;1;1;1;0;0 -3010;boursoufler;negative;0;0;0;0;0;1 -3011;bousculade;negative;0;1;0;1;1;0 -3012;bousculer;negative;0;1;0;1;1;0 -3013;bouse;negative;0;0;0;0;0;1 -3014;boussole;positive;0;0;0;0;0;0 -3015;boutade;positive;0;0;0;0;1;0 -3016;bouteille;positive;0;0;0;0;0;0 -3017;boutique;positive;0;0;0;0;0;0 -3018;boutonner;positive;0;0;0;0;0;0 -3019;bovin;negative;0;0;0;0;0;1 -3020;box;positive;0;0;0;0;0;0 -3021;boxe;negative;0;0;0;1;0;0 -3022;boxer;positive;0;0;0;0;0;0 -3023;boxeur;positive;0;0;0;1;0;0 -3024;boyau;negative;0;0;0;0;0;1 -3025;boycott;negative;0;0;0;1;0;1 -3026;boycotter;negative;0;0;0;1;0;1 -3027;brûlé;negative;0;0;0;0;0;1 -3028;brûlée;negative;0;0;0;0;0;1 -3029;bracelet;positive;0;0;0;0;0;0 -3030;brachial;positive;0;0;0;0;0;0 -3031;braconnage;negative;0;1;1;1;0;1 -3032;brailler;negative;0;0;0;1;1;0 -3033;brainstorming;positive;0;0;0;0;0;0 -3034;braise;negative;0;1;0;0;0;0 -3035;brancard;negative;0;1;1;0;0;0 -3036;branche;positive;0;0;0;0;0;0 -3037;brancher;positive;0;0;0;0;0;0 -3038;branchie;positive;0;0;0;0;0;0 -3039;brandy;positive;0;0;0;0;0;0 -3040;branhcée;positive;0;0;0;0;0;0 -3041;branler;negative;0;1;0;0;1;0 -3042;branlant;negative;0;1;0;0;0;0 -3043;braquage;negative;0;1;1;1;0;1 -3044;braquer;negative;0;1;0;0;0;0 -3045;bras;positive;0;0;0;0;0;0 -3046;bras droit;positive;0;0;0;0;0;0 -3047;brasier;negative;0;1;0;1;0;0 -3048;brassage;positive;0;0;0;0;0;0 -3049;brasser;positive;0;0;0;0;0;0 -3050;bravade;negative;0;0;0;0;0;0 -3051;brave;positive;0;0;0;0;0;0 -3052;bravoure;positive;0;0;0;0;0;0 -3053;brebis;positive;0;0;0;0;0;0 -3054;brèche;negative;0;1;0;0;0;0 -3055;bredouillement;negative;0;1;0;0;0;0 -3056;bredouiller;negative;0;1;0;1;0;0 -3057;bref;positive;0;0;0;0;0;0 -3058;bretelle;positive;0;0;0;0;0;0 -3059;brevet;positive;0;0;0;0;0;0 -3060;breveter;positive;0;0;0;0;0;0 -3061;bribe;positive;0;0;0;0;0;0 -3062;brick;negative;0;1;1;0;0;0 -3063;bricoler;positive;0;0;0;0;0;0 -3064;brider;negative;0;1;1;0;0;0 -3065;brièvement;positive;0;0;0;0;0;0 -3066;brigade;positive;0;1;0;0;0;0 -3067;brin;positive;0;0;0;0;0;0 -3068;brindille;negative;0;0;0;0;0;0 -3069;brique;positive;0;0;0;0;0;0 -3070;brise;negative;0;1;1;0;0;0 -3071;briser;negative;0;1;1;1;1;0 -3072;briseur;negative;0;1;1;0;0;0 -3073;brocart;positive;0;0;0;0;0;0 -3074;brochet;negative;0;1;0;0;0;0 -3075;brochette;negative;0;1;0;0;0;0 -3076;brochure;positive;0;0;0;0;0;0 -3077;broder;positive;0;0;0;0;0;0 -3078;broderie;positive;0;0;0;0;0;0 -3079;broderie perlé;positive;0;0;0;0;0;0 -3080;bronco;negative;0;1;0;0;1;0 -3081;bronzage;positive;0;0;0;0;0;0 -3082;bronze;positive;0;0;0;0;0;0 -3083;bronzer;positive;0;0;0;0;0;0 -3084;brosse;positive;0;0;0;0;0;0 -3085;brouette;positive;0;0;0;0;0;1 -3086;brouillage;negative;0;1;0;1;0;0 -3087;brouillard;negative;0;1;1;0;0;0 -3088;brouillon;positive;0;0;0;0;0;0 -3089;broussaille;negative;0;0;0;0;0;1 -3090;brousse;positive;0;0;0;0;0;0 -3091;broutille;negative;0;0;0;0;0;1 -3092;broyer du noir;negative;0;0;1;0;0;0 -3093;broyer;negative;0;1;1;1;0;1 -3094;broyeur;negative;0;1;0;0;0;0 -3095;bruine;negative;0;0;1;0;0;1 -3096;bruiner;negative;0;0;1;0;0;1 -3097;bruissement;negative;0;1;0;0;1;0 -3098;bruir|bruire de tambour;positive;0;0;0;0;0;0 -3099;bruir|bruire métallique;negative;0;1;0;0;1;0 -3100;bruir|bruire sec;negative;0;1;0;0;1;0 -3101;bruir|bruire sourd;negative;0;1;1;0;1;0 -3102;brûler;negative;0;1;0;1;0;0 -3103;brûlant;negative;0;1;0;1;0;0 -3104;brûleur;negative;0;1;0;1;0;0 -3105;brûlure;negative;0;1;0;0;0;0 -3106;brûlure d estomac;negative;0;0;1;0;0;1 -3107;brume;negative;0;1;1;0;0;0 -3108;brumer;negative;0;1;1;0;0;0 -3109;brun;positive;0;0;0;0;0;0 -3110;brun grisâtre;negative;0;0;1;0;0;1 -3111;brun|brune;positive;0;0;0;0;0;0 -3112;brunet;positive;0;0;0;0;0;0 -3113;brunir;negative;0;0;0;0;0;0 -3114;brusque;negative;0;1;0;1;1;0 -3115;brusquement;negative;0;1;0;0;1;0 -3116;brusquer;negative;0;1;0;1;1;0 -3117;brut;negative;0;1;1;1;0;1 -3118;brutal;negative;0;1;0;1;0;1 -3119;brutaliser;negative;0;1;0;1;0;0 -3120;brutalité;negative;0;1;1;1;0;1 -3121;brute;negative;0;1;1;1;0;1 -3122;bruyant;negative;0;1;0;1;1;0 -3123;buccal;positive;0;0;0;0;0;0 -3124;bûche;positive;0;0;0;0;0;0 -3125;budget;positive;0;0;0;0;0;0 -3126;budgétiser;positive;0;0;0;0;0;0 -3127;buffet;positive;0;0;0;1;0;0 -3128;buffle;negative;0;1;0;0;0;0 -3129;buisson;positive;0;0;0;0;0;0 -3130;bulbe;negative;0;0;0;0;0;1 -3131;bulbeux;negative;0;0;0;0;0;0 -3132;bulldozer;negative;0;1;0;1;0;0 -3133;bulle;positive;0;0;0;0;0;0 -3134;bulletin;positive;0;0;0;0;0;0 -3135;bungalow;positive;0;0;0;0;0;0 -3136;bunker;negative;0;1;0;0;0;0 -3137;bureau;positive;0;0;0;0;0;0 -3138;bureaucrate;negative;0;0;0;0;0;1 -3139;bureaucratie;negative;0;0;0;0;0;0 -3140;burin;negative;0;1;0;1;0;0 -3141;buriner;negative;0;0;0;1;0;0 -3142;burlesque;positive;0;0;0;0;1;0 -3143;buste;positive;0;0;0;0;0;0 -3144;but;positive;0;0;0;0;0;0 -3145;butane;negative;0;0;0;0;0;1 -3146;butyreux;positive;0;0;0;0;0;1 -3147;bye;negative;0;0;1;0;0;0 -3148;çà et là;negative;0;0;0;0;0;0 -3149;cabale;negative;0;1;0;0;0;0 -3150;cabane;positive;0;0;1;0;0;1 -3151;cabane pour enfant;positive;1;0;0;0;0;0 -3152;cabaret;positive;0;0;0;0;1;0 -3153;cabillaud;negative;0;0;0;0;0;0 -3154;cabine;positive;0;0;0;0;0;0 -3155;cabine de luxe;positive;0;0;0;0;0;0 -3156;cabine de pilotage;positive;0;0;0;0;0;0 -3157;cabine particulier;positive;0;0;0;0;0;0 -3158;cabinet;positive;0;0;0;0;0;0 -3159;câbler;positive;0;0;0;0;0;0 -3160;cabosser;negative;0;1;1;0;0;0 -3161;cabriole;positive;1;0;0;0;0;0 -3162;cabriolet;positive;0;0;0;0;0;0 -3163;caca;negative;0;0;0;0;0;1 -3164;cacao;positive;0;0;0;0;0;0 -3165;cache;negative;0;1;0;0;0;0 -3166;cacher;negative;0;1;1;0;1;0 -3167;cachemire;positive;0;0;0;0;0;0 -3168;cachot;negative;0;1;1;0;0;0 -3169;cacophonie;negative;0;1;0;1;0;1 -3170;cadavre;negative;0;1;1;0;1;1 -3171;caddie;positive;0;0;0;0;0;0 -3172;cadeau;positive;0;0;0;0;1;0 -3173;cadenas;negative;0;1;0;0;0;0 -3174;cadenasser;negative;0;1;0;0;0;0 -3175;cadence;positive;0;0;0;0;0;0 -3176;cadencer;positive;0;0;1;1;0;0 -3177;cadet;positive;0;0;0;0;0;0 -3178;cadran;positive;0;0;0;0;0;0 -3179;cadran solaire;positive;0;0;0;0;0;0 -3180;cadre;positive;0;0;0;0;0;0 -3181;caduc;negative;0;0;1;0;0;1 -3182;café;positive;0;0;0;0;0;0 -3183;café restaurant;positive;0;0;0;0;0;0 -3184;cafouillage;negative;0;0;0;0;0;0 -3185;cage;negative;0;1;1;0;0;0 -3186;cageot;positive;0;0;0;0;0;0 -3187;cahier;positive;0;0;0;0;0;0 -3188;caille;negative;0;1;0;0;0;0 -3189;cailler;negative;0;0;0;0;0;1 -3190;caillot;negative;0;1;0;0;0;1 -3191;caillou;positive;0;0;0;1;0;0 -3192;cairn;positive;0;0;0;0;0;0 -3193;caisse;positive;0;0;0;0;0;0 -3194;calamiter;negative;0;1;1;0;0;0 -3195;calandre;negative;0;0;0;0;0;0 -3196;calcaire;negative;0;0;0;0;0;1 -3197;calciner;negative;0;1;0;0;0;1 -3198;calculable;positive;0;0;0;0;0;0 -3199;calculateur;positive;0;0;0;0;0;0 -3200;calculateur|calculatrice;positive;0;0;0;0;0;0 -3201;calculer;positive;0;0;0;0;0;0 -3202;calculette;positive;0;0;0;0;0;0 -3203;calembour;positive;1;0;0;0;0;0 -3204;calendrier;positive;0;0;0;0;0;0 -3205;calibre;positive;0;0;0;0;0;0 -3206;calibrer;positive;0;0;0;0;0;0 -3207;calice;positive;0;0;0;0;0;0 -3208;calicot;positive;0;0;0;0;0;0 -3209;câlin;positive;0;0;0;0;0;0 -3210;câliner;positive;0;0;0;0;0;0 -3211;calligraphie;positive;0;0;0;0;0;0 -3212;calmement;positive;1;0;0;0;0;0 -3213;calomnier;negative;0;1;1;1;0;1 -3214;calorie;negative;0;0;0;0;0;0 -3215;calorimètre;positive;0;0;0;0;0;0 -3216;calorique;negative;0;0;0;0;0;0 -3217;calquer;positive;0;0;0;0;0;0 -3218;calque;positive;0;0;0;0;0;0 -3219;camarade;positive;0;0;0;0;0;0 -3220;camarade de classe;positive;0;0;0;0;0;0 -3221;camarade de jeu;positive;0;0;0;0;0;0 -3222;camaraderie;positive;0;0;0;0;0;0 -3223;cambriolage;negative;0;1;1;0;1;0 -3224;cambrioler;negative;0;1;1;1;0;1 -3225;cambrure;positive;0;0;0;0;0;0 -3226;came;positive;0;0;0;0;0;0 -3227;camer;positive;0;0;0;0;0;0 -3228;caméléon;positive;0;0;0;0;0;0 -3229;camelote;negative;0;0;1;0;0;1 -3230;cameraman;positive;0;0;0;0;0;0 -3231;caméraman;positive;0;0;0;0;0;0 -3232;camion;positive;0;0;0;0;0;0 -3233;camionnette;positive;0;0;0;0;0;0 -3234;camouflage;negative;0;0;0;0;1;0 -3235;camoufler;negative;0;0;0;0;1;0 -3236;camp;positive;0;0;0;0;0;0 -3237;campagne;positive;0;1;0;1;0;0 -3238;campement;positive;0;0;0;0;0;0 -3239;camper;positive;0;0;0;0;0;0 -3240;camping;positive;0;0;0;0;0;0 -3241;campus;positive;0;0;0;0;0;0 -3242;canalisation;negative;0;0;0;0;0;1 -3243;canapé;positive;0;0;1;0;0;0 -3244;canard;positive;0;0;0;0;0;0 -3245;canard mâle;positive;0;0;0;0;0;0 -3246;canari;positive;0;0;0;0;0;0 -3247;cancer;negative;0;1;1;1;0;1 -3248;candidature;positive;0;1;0;1;0;0 -3249;caniche;positive;0;0;0;0;0;0 -3250;canidé;positive;0;0;0;0;0;0 -3251;canin;positive;0;0;0;0;0;0 -3252;canine;positive;0;0;0;0;0;0 -3253;caniveau;negative;0;0;0;0;0;1 -3254;canneler;positive;0;0;0;0;0;0 -3255;cannelle;positive;0;0;0;0;0;0 -3256;cannibale;negative;0;1;0;0;0;1 -3257;cannibalisme;negative;0;1;0;0;0;1 -3258;canoë;positive;0;0;0;0;0;0 -3259;canon;negative;0;1;0;1;0;0 -3260;canonique;positive;0;0;0;0;0;0 -3261;canot de sauvetage;positive;0;0;0;0;0;0 -3262;canotage;positive;1;0;0;0;0;0 -3263;cantilever;positive;0;0;0;0;0;0 -3264;cantine;positive;0;0;0;0;0;0 -3265;cantique;positive;0;0;1;0;0;0 -3266;canton;positive;0;0;0;0;0;0 -3267;cantonnement;negative;0;0;1;0;0;0 -3268;canular;negative;0;0;1;1;1;1 -3269;caoutchouc;negative;0;0;0;0;0;0 -3270;cap;positive;0;0;0;0;0;0 -3271;capable;positive;0;0;0;0;0;0 -3272;capacité;positive;0;0;0;0;0;0 -3273;capillaire;positive;0;0;0;0;0;0 -3274;capitaine;positive;0;0;0;0;0;0 -3275;capitale;positive;0;0;0;0;0;0 -3276;capitaliste;negative;0;0;0;0;0;0 -3277;capitation;negative;0;0;0;0;0;0 -3278;capital propre;positive;0;0;0;0;0;0 -3279;capitole;positive;0;0;0;0;0;0 -3280;capitulation;negative;0;1;1;0;1;0 -3281;capituler;negative;0;1;1;0;0;0 -3282;caporal;positive;0;0;0;0;0;0 -3283;capot;positive;0;1;0;1;0;1 -3284;caprice;negative;0;0;0;1;1;0 -3285;captivant;positive;0;0;0;0;0;0 -3286;captivité;negative;0;1;1;0;0;0 -3287;capture;negative;0;1;0;1;1;0 -3288;capturer;negative;0;1;0;1;1;0 -3289;capuche;positive;0;1;0;1;0;1 -3290;capuchon;positive;0;0;0;0;0;0 -3291;caraco;positive;0;0;0;0;0;0 -3292;caractère aléatoire;negative;0;1;0;0;1;0 -3293;caractère raisonnable;positive;0;0;0;0;0;0 -3294;caractériser;positive;0;0;0;0;0;0 -3295;caractéristique;positive;0;0;0;0;0;0 -3296;carafe;positive;0;0;0;0;0;0 -3297;caramel;positive;0;0;0;0;0;0 -3298;carapace;positive;0;0;0;0;0;0 -3299;carat;positive;0;0;0;0;0;0 -3300;caravane;positive;0;0;0;0;0;0 -3301;carbone;negative;0;0;0;0;0;0 -3302;carboniser;negative;0;1;0;1;0;0 -3303;carburant;positive;0;0;0;0;0;0 -3304;carcasse;negative;0;1;1;0;0;1 -3305;carcinome;negative;0;1;1;0;0;0 -3306;cardigan;positive;0;0;0;0;0;0 -3307;cardinal;positive;0;0;0;0;0;0 -3308;cardiomyopathie;negative;0;1;1;0;0;0 -3309;caresse;positive;1;0;0;0;0;0 -3310;caresser;positive;1;0;0;0;0;0 -3311;carex;positive;0;0;0;0;0;0 -3312;cargaison;positive;0;0;0;0;0;0 -3313;caribou;positive;0;0;0;0;0;0 -3314;caricature;negative;0;0;0;0;0;0 -3315;caricaturer;negative;0;0;0;0;0;0 -3316;carie;negative;0;0;0;0;0;1 -3317;carillon;positive;1;0;0;0;0;0 -3318;carillonnement;positive;0;0;0;0;1;0 -3319;carillonner;positive;1;0;0;0;0;0 -3320;carlin;positive;0;0;0;0;0;0 -3321;carnation;positive;0;0;0;0;0;0 -3322;carnet;positive;0;0;0;0;0;0 -3323;carnivore;negative;0;1;0;0;0;0 -3324;carquois;negative;0;1;0;0;0;0 -3325;carrer;positive;0;0;0;0;0;0 -3326;carreau;positive;0;0;0;0;0;0 -3327;carrelage;positive;0;0;0;0;0;0 -3328;carreler;positive;0;0;0;0;0;0 -3329;carrément;positive;0;0;0;0;0;0 -3330;carrossage;positive;0;0;0;0;0;0 -3331;carrousel;positive;1;0;0;0;0;0 -3332;carrure;positive;0;0;0;0;0;0 -3333;cartable;positive;0;0;0;0;0;0 -3334;carte;positive;0;0;0;0;0;0 -3335;cartel;negative;0;1;0;1;0;0 -3336;carter;negative;0;0;0;0;0;1 -3337;cartilage;negative;0;0;0;0;0;1 -3338;cartographie;positive;0;0;0;0;0;0 -3339;cartographique;positive;0;0;0;0;0;0 -3340;carton;positive;0;0;0;0;0;0 -3341;cartouche;negative;0;1;0;0;0;0 -3342;caséine;positive;0;0;0;0;0;0 -3343;caserne;positive;0;0;0;0;0;0 -3344;casier;positive;0;0;0;0;0;0 -3345;casino;positive;0;0;0;0;1;0 -3346;casque;positive;0;1;0;0;0;0 -3347;casquette;positive;0;0;0;0;0;0 -3348;cassable;negative;0;1;0;0;0;0 -3349;casser;negative;0;1;0;0;1;0 -3350;cassant;negative;0;1;0;0;1;0 -3351;casse croûte;positive;0;0;0;0;0;0 -3352;casse pied;negative;0;0;0;1;0;0 -3353;casse tête;positive;0;0;0;0;0;0 -3354;casserole;positive;0;0;0;0;0;0 -3355;cassette;positive;0;0;0;0;0;0 -3356;cassette vidéo;positive;0;0;0;0;0;0 -3357;caste;negative;0;0;0;0;0;0 -3358;castrer;negative;0;1;1;0;0;0 -3359;catabolisme;positive;0;0;0;0;0;0 -3360;cataclysme;negative;0;1;1;1;1;0 -3361;cataire;negative;0;0;0;0;0;1 -3362;catalogue;positive;0;0;0;0;0;0 -3363;catalyse;positive;0;0;0;0;0;0 -3364;catalytique;positive;0;0;0;0;0;0 -3365;catamaran;positive;0;0;0;0;0;0 -3366;catapulte;negative;0;0;0;1;0;0 -3367;catapulter;negative;0;0;0;1;0;0 -3368;cataracte;negative;0;1;1;0;0;0 -3369;catéchisme;positive;0;0;0;0;0;1 -3370;catégorie;positive;0;0;0;0;0;0 -3371;cathartique;positive;0;0;0;0;0;0 -3372;cathédrale;positive;0;0;0;0;0;0 -3373;cathéter;negative;0;1;0;0;0;0 -3374;catholique;positive;0;0;0;0;0;0 -3375;cauchemar;negative;0;1;1;0;0;0 -3376;caudal;negative;0;0;0;0;0;1 -3377;causal;negative;0;0;1;0;0;0 -3378;causalité;negative;0;0;1;0;0;0 -3379;causation;negative;0;0;1;0;0;0 -3380;causer;negative;0;0;1;0;0;0 -3381;caution;positive;0;0;0;0;0;0 -3382;cavaler;negative;0;1;0;0;0;0 -3383;cavalerie;positive;0;0;0;0;0;0 -3384;caveau;positive;0;0;0;0;0;0 -3385;caverne;negative;0;1;1;0;0;0 -3386;caverneux;negative;0;1;1;0;0;0 -3387;cavité;negative;0;1;0;0;0;0 -3388;cayenne;positive;0;0;0;0;0;0 -3389;ce qui précéder;positive;0;0;0;0;0;0 -3390;cécité;negative;0;1;1;0;0;0 -3391;céder;positive;0;0;0;0;0;0 -3392;ceinture;negative;0;1;1;1;0;0 -3393;ceinturer;negative;0;1;1;0;0;0 -3394;célébrant;positive;1;0;0;0;0;0 -3395;célébration;positive;0;0;0;0;1;0 -3396;célèbre;positive;0;0;0;0;0;0 -3397;célébrer;positive;1;0;0;0;0;0 -3398;célibat;negative;0;0;0;0;0;0 -3399;célibataire;negative;0;0;0;0;0;0 -3400;cellulaire;positive;0;0;0;0;0;0 -3401;cellule;negative;0;0;0;0;0;0 -3402;celluloïde;positive;0;0;0;0;0;0 -3403;cendre;negative;0;1;1;0;0;1 -3404;cendrer;negative;0;1;0;0;0;0 -3405;censeur;negative;0;1;0;1;0;1 -3406;censurer;negative;0;1;0;1;0;1 -3407;cent;positive;0;0;0;0;0;0 -3408;cent douze livre;positive;0;0;0;0;0;0 -3409;cent livre;positive;0;0;0;0;0;0 -3410;centaine;positive;0;0;0;0;0;0 -3411;centenaire;positive;1;0;0;0;0;0 -3412;centième;positive;0;0;0;0;0;0 -3413;centime;positive;0;0;0;0;0;0 -3414;centimètre;positive;0;0;0;0;0;0 -3415;central;positive;0;0;0;0;0;0 -3416;centralement;positive;0;0;0;0;0;0 -3417;centrale;positive;0;0;0;0;0;0 -3418;centralisation;positive;0;0;0;0;0;0 -3419;centraliser;positive;0;0;0;0;0;0 -3420;centralité;positive;0;0;0;0;0;0 -3421;centre;positive;0;0;0;0;0;0 -3422;centre commercial;positive;0;0;0;0;0;0 -3423;centre de détention;negative;0;1;1;1;0;0 -3424;centrer;positive;0;0;0;0;0;0 -3425;centrifuge;positive;0;0;0;0;0;0 -3426;centrifuger;positive;0;0;0;0;0;0 -3427;centrifugeuse;positive;0;0;0;0;0;0 -3428;centurion;positive;0;0;0;0;0;0 -3429;céphalée;negative;0;0;1;0;0;0 -3430;céramique;positive;0;0;0;0;0;0 -3431;cerceau;positive;0;0;0;0;0;0 -3432;cercle;positive;0;0;0;0;0;0 -3433;cercueil;negative;0;1;1;0;0;0 -3434;céréale;positive;0;0;0;0;0;0 -3435;céréalier;positive;0;0;0;0;0;0 -3436;cérébral;positive;0;0;0;0;0;0 -3437;cérémonial;positive;0;0;0;0;0;0 -3438;cérémonie;positive;0;0;0;0;1;0 -3439;cerf;positive;0;0;0;0;0;0 -3440;cerf volant;positive;0;0;0;0;0;1 -3441;cerise;positive;0;0;0;0;0;0 -3442;cerner;negative;0;1;0;0;0;0 -3443;certificat;positive;0;0;0;0;0;0 -3444;certifier;positive;0;0;0;0;0;0 -3445;certitude;positive;0;0;0;0;0;0 -3446;cérumen;negative;0;0;0;0;0;1 -3447;cerveau;positive;0;0;0;0;0;0 -3448;cervelle;positive;0;0;0;0;0;0 -3449;cessation;negative;0;0;1;0;1;0 -3450;cession;positive;0;0;0;0;0;0 -3451;cessionnaire;positive;0;0;0;0;0;0 -3452;ceuillie;positive;1;0;0;0;0;0 -3453;chacunes;positive;0;0;0;0;0;0 -3454;chacuns;positive;0;0;0;0;0;0 -3455;chagrin;negative;0;1;1;0;0;0 -3456;chaîne;negative;0;1;1;1;0;1 -3457;chair;negative;0;0;0;0;0;1 -3458;chaire;positive;0;0;0;0;0;0 -3459;chaise;positive;0;0;0;0;0;0 -3460;châle;positive;0;0;0;0;0;0 -3461;chalet;positive;0;0;0;0;0;0 -3462;chaleur;positive;0;0;0;0;0;0 -3463;chaleureux;positive;0;0;0;0;0;0 -3464;chaleureusement;positive;1;0;0;0;0;0 -3465;challenge;negative;0;1;0;1;0;0 -3466;chalut;positive;0;0;0;0;0;0 -3467;chalutier;positive;0;0;0;0;0;0 -3468;chamaillerie;negative;0;0;0;1;0;1 -3469;chaman;negative;0;1;0;0;0;0 -3470;chambre;positive;0;0;0;0;0;0 -3471;chambre à coucher;positive;0;0;0;0;0;0 -3472;chambre fort;positive;0;0;0;0;0;0 -3473;chambre libre;positive;1;0;0;0;0;0 -3474;chameau;positive;0;0;0;0;0;0 -3475;champ;positive;0;0;0;0;0;0 -3476;champ de bataille;negative;0;1;1;1;0;0 -3477;champagne;positive;0;0;0;0;0;0 -3478;champion champion;positive;1;0;0;0;0;0 -3479;chance;positive;0;0;0;0;1;0 -3480;chanceler;negative;0;1;0;0;1;0 -3481;chancelant;negative;0;1;0;0;1;0 -3482;chancelier;positive;0;0;0;0;0;0 -3483;chancre;negative;0;0;0;1;0;1 -3484;chandelier;positive;0;0;0;0;0;0 -3485;chandler;positive;0;0;0;0;0;0 -3486;changeable;positive;0;0;0;0;0;0 -3487;changeant;positive;0;0;0;0;0;0 -3488;changer;positive;0;1;0;0;0;0 -3489;changeur;positive;0;0;0;0;0;0 -3490;chanson;positive;0;0;0;0;0;0 -3491;chansonnette;positive;1;0;0;0;0;0 -3492;chant;positive;0;0;0;1;1;0 -3493;chant de noël;positive;0;0;0;0;0;0 -3494;chantage;negative;0;1;0;1;0;0 -3495;chanter en ch?ur;positive;1;0;0;0;0;0 -3496;chanvre;positive;0;0;0;0;0;0 -3497;chaos;negative;0;1;1;1;0;0 -3498;chapeau;positive;0;0;0;0;0;0 -3499;chapelain;positive;0;0;0;0;0;0 -3500;chapelet;positive;0;0;0;0;0;0 -3501;chapelle;positive;0;0;0;0;0;0 -3502;chapiteau;positive;0;0;0;0;0;0 -3503;chapitre;positive;0;0;0;0;0;0 -3504;char;positive;0;0;0;0;0;0 -3505;charabia;negative;0;0;0;1;0;0 -3506;charbon;negative;0;1;1;0;0;1 -3507;charbon de bois;negative;0;0;0;0;0;1 -3508;charbon ardent;negative;0;1;0;0;0;0 -3509;charcuter;negative;0;1;0;1;0;1 -3510;charcutier;negative;0;1;0;1;0;1 -3511;chardon;positive;0;0;0;0;0;0 -3512;charger;negative;0;1;1;0;0;0 -3513;chargement;positive;0;0;0;0;0;0 -3514;charger qqn de faire qch;positive;0;0;0;0;0;0 -3515;chargeur;positive;0;0;0;0;0;0 -3516;chariot;positive;0;0;0;0;0;0 -3517;charitable;positive;0;0;0;0;0;0 -3518;charité;positive;0;0;0;0;0;0 -3519;charlatan;negative;0;0;0;1;0;1 -3520;charmer;positive;0;0;0;0;0;0 -3521;charmant;positive;0;0;0;0;0;0 -3522;charmeur;positive;0;0;0;0;0;0 -3523;charnière;positive;0;0;0;0;0;0 -3524;charnu;negative;0;0;0;0;0;0 -3525;charognard;negative;0;1;0;0;0;1 -3526;charpenter;positive;0;0;0;0;0;0 -3527;charpentier;positive;0;0;0;0;0;0 -3528;charpir;negative;0;1;1;0;0;1 -3529;charretier;positive;0;0;0;0;0;0 -3530;charrette;positive;0;0;0;0;0;1 -3531;charrier;positive;0;0;0;0;1;0 -3532;charrue;positive;0;0;0;0;0;0 -3533;charte;positive;0;0;0;0;0;0 -3534;chasser;negative;0;1;0;1;0;0 -3535;chasse;negative;0;1;0;1;0;0 -3536;chasteté;positive;0;0;0;0;0;0 -3537;chat;positive;0;0;0;0;0;0 -3538;chat sauvage;negative;0;1;0;0;0;0 -3539;chat tigré;positive;0;0;0;0;0;0 -3540;châtaigne;positive;0;0;0;0;0;0 -3541;châtaignier;positive;0;0;0;0;0;0 -3542;châtain;positive;0;0;0;0;0;0 -3543;château;positive;0;0;0;0;0;0 -3544;châtiment;negative;0;1;1;1;0;0 -3545;chatoiement;positive;1;0;0;0;0;0 -3546;chaton;positive;0;0;0;0;0;0 -3547;chatouillement;positive;0;0;0;0;1;0 -3548;chatouiller;positive;0;0;0;0;1;0 -3549;chatouilleux;negative;0;0;0;0;0;0 -3550;chat|chatte;positive;0;0;0;0;0;0 -3551;chaud;positive;0;0;0;1;0;0 -3552;chaud|chaude;positive;0;0;0;1;0;0 -3553;chaudière;positive;0;0;0;0;0;0 -3554;chauffage;positive;0;0;0;0;0;0 -3555;chauffer;positive;0;0;0;0;0;0 -3556;chauffe eau;positive;0;0;0;0;0;0 -3557;chauffeur;positive;0;0;0;0;0;0 -3558;chaumière;positive;0;0;0;0;0;0 -3559;chausser;positive;0;0;0;0;0;0 -3560;chaussette;positive;0;0;0;0;0;0 -3561;chausseur;positive;0;0;0;0;0;0 -3562;chausson;positive;0;0;0;0;0;0 -3563;chaussure;positive;0;0;0;0;0;0 -3564;chauve;negative;0;0;1;0;0;1 -3565;chauve souris;negative;0;1;0;0;0;1 -3566;chavirer;negative;0;1;0;0;0;0 -3567;check list;positive;0;0;0;0;0;0 -3568;cheesecake;positive;0;0;0;0;0;0 -3569;chef d équipe;positive;0;0;0;0;0;0 -3570;chef d orchestre;positive;0;0;0;0;0;0 -3571;chef opérateur;positive;0;0;0;0;0;0 -3572;chemin de fer;positive;0;0;0;0;0;0 -3573;cheminer;positive;0;0;0;1;0;0 -3574;cheminement;positive;0;0;0;0;0;0 -3575;chemise;positive;0;0;0;0;0;0 -3576;chemisier;positive;0;0;0;0;0;0 -3577;chêne;positive;0;0;0;0;0;0 -3578;chenil;negative;0;0;1;0;0;0 -3579;chenille;negative;0;0;0;0;0;1 -3580;chèque;positive;0;0;0;0;0;0 -3581;chercher;positive;0;0;0;0;0;0 -3582;chère;negative;0;0;1;0;0;0 -3583;chérir;positive;0;0;1;0;0;0 -3584;cher;negative;0;0;1;0;0;0 -3585;cheval;positive;0;0;0;0;0;0 -3586;cheval de course;positive;0;0;0;0;0;0 -3587;cheval sauvage;negative;0;1;0;0;1;0 -3588;chevalerie;positive;0;0;0;0;0;0 -3589;chevalet;positive;0;0;0;0;0;0 -3590;chevalier;positive;0;0;0;0;0;0 -3591;chevaucher;positive;0;0;0;0;0;0 -3592;chevauchement;negative;0;0;0;0;0;0 -3593;cheveu;positive;0;0;0;0;0;0 -3594;cheville;positive;0;0;0;0;0;0 -3595;chèvre;positive;0;0;0;0;0;0 -3596;chèvrefeuille;positive;0;0;0;0;0;0 -3597;chevreuil;negative;0;0;0;0;0;0 -3598;chevron;positive;0;0;0;0;0;0 -3599;chevronner;positive;0;0;0;0;0;0 -3600;chewing gum;positive;0;0;0;0;0;0 -3601;chic;positive;1;0;0;0;0;0 -3602;chichi;negative;0;0;0;0;0;1 -3603;chien;positive;0;0;0;0;0;0 -3604;chien de garde;positive;0;1;0;0;0;0 -3605;chien|chienne;negative;0;1;1;1;0;1 -3606;chiffonner;negative;0;0;0;1;0;0 -3607;chiffre;positive;0;0;0;0;0;0 -3608;chignon;positive;0;0;0;0;0;0 -3609;chimère;negative;0;1;0;0;1;0 -3610;chimie;positive;0;0;0;0;0;0 -3611;chimiste;positive;0;0;0;0;0;0 -3612;chine;positive;0;0;0;0;0;0 -3613;chinook;negative;0;0;0;0;0;0 -3614;chiot;positive;0;0;0;0;0;0 -3615;chiquer;negative;0;0;0;0;0;1 -3616;chirurgie;negative;0;1;1;0;0;0 -3617;chloroforme;negative;0;1;0;0;0;1 -3618;choc;negative;0;1;0;1;1;0 -3619;chochotte;negative;0;1;0;0;0;1 -3620;chocolat;positive;0;0;0;0;0;0 -3621;ch?ur;positive;0;0;0;0;0;0 -3622;choisir;positive;0;0;0;0;0;0 -3623;choix;positive;0;0;0;0;0;0 -3624;choléra;negative;0;1;1;0;0;1 -3625;choper;negative;0;1;0;1;1;0 -3626;choral;positive;1;0;0;0;0;0 -3627;chorale;positive;0;0;0;0;0;0 -3628;chose;negative;0;1;0;1;0;1 -3629;chou;positive;0;0;0;0;0;0 -3630;choucroute;negative;0;0;0;0;0;0 -3631;chouette;positive;1;0;0;0;0;0 -3632;chromatique;positive;0;0;0;0;0;0 -3633;chromatographie;positive;0;0;0;0;0;0 -3634;chromosome;positive;0;0;0;0;0;0 -3635;chronique;positive;0;0;0;0;0;0 -3636;chronographe;positive;0;0;0;0;0;0 -3637;chronologique;positive;0;0;0;0;0;0 -3638;chronomètre;positive;0;0;0;0;0;0 -3639;chuchoter;negative;0;1;0;0;0;0 -3640;chuchotement;negative;0;1;0;0;0;0 -3641;chut;negative;0;0;0;0;0;0 -3642;chuter;negative;0;1;1;0;1;0 -3643;chutney;positive;0;0;0;0;0;0 -3644;ci joindre;positive;0;0;0;0;0;0 -3645;cible;negative;0;1;1;0;0;0 -3646;cibler;negative;0;1;0;0;0;0 -3647;cicatrice;negative;0;1;1;1;0;1 -3648;cicatrisation;positive;0;0;0;0;0;0 -3649;cicatriser;positive;0;0;0;0;0;0 -3650;cidre;positive;0;0;0;0;0;0 -3651;ciel;positive;0;0;0;0;0;0 -3652;cierge;positive;0;0;0;0;0;0 -3653;cieux;positive;0;0;0;0;0;0 -3654;cigare;negative;0;0;0;0;0;1 -3655;cigarette;negative;0;0;0;0;0;1 -3656;ciguë;negative;0;1;0;0;0;1 -3657;cil;negative;0;1;0;1;0;0 -3658;cime;positive;0;0;0;0;0;0 -3659;ciment;positive;0;0;0;0;0;0 -3660;cimenter;negative;0;0;0;0;0;0 -3661;cimetière;negative;0;1;1;0;0;0 -3662;cinéma;positive;0;0;0;0;0;0 -3663;cinématique;positive;0;0;0;0;0;0 -3664;cinématographie;positive;0;0;0;0;0;0 -3665;cinglant;negative;0;1;0;1;1;0 -3666;cirage;positive;0;0;0;0;0;0 -3667;circoncision;negative;0;1;0;0;0;0 -3668;circonférence;positive;0;0;0;0;0;0 -3669;circonférentiel;positive;0;0;0;0;0;0 -3670;circonscrire;negative;0;1;1;0;0;0 -3671;circonstance;positive;0;0;0;0;1;0 -3672;circonstanciel;positive;0;0;0;0;0;0 -3673;circonvolution;positive;0;0;0;0;0;0 -3674;circuit;positive;0;0;0;0;0;0 -3675;circulaire;positive;0;0;0;0;0;0 -3676;circuler;positive;0;0;0;0;0;0 -3677;cirer;positive;0;0;0;0;0;0 -3678;cireux;negative;0;0;0;0;0;1 -3679;cirque;negative;0;0;0;0;0;0 -3680;cirrus;negative;0;0;1;0;0;0 -3681;cisaille;negative;0;1;0;0;0;0 -3682;ciseau;negative;0;0;0;1;0;0 -3683;ciseler;negative;0;0;0;1;0;0 -3684;citadelle;positive;0;0;0;0;0;0 -3685;citation à comparaître;negative;0;1;0;1;0;0 -3686;cité;positive;0;0;0;0;0;0 -3687;citer à comparaître;negative;0;1;0;1;0;0 -3688;citrine;negative;0;0;0;0;0;0 -3689;citron;negative;0;0;0;0;0;1 -3690;civet;positive;0;0;0;0;0;0 -3691;civière;negative;0;1;1;0;0;0 -3692;civilisation;positive;0;0;0;0;0;0 -3693;civiliser;positive;0;0;0;0;0;0 -3694;civilité;positive;0;0;0;0;0;0 -3695;civique;positive;0;0;0;0;0;0 -3696;clair;positive;0;0;0;0;0;0 -3697;clair de lune;positive;0;0;0;0;0;0 -3698;claire;positive;0;0;0;0;0;0 -3699;clairière;positive;0;0;0;0;0;0 -3700;clairon;positive;0;0;0;0;0;0 -3701;clairsemer;negative;0;0;1;0;0;0 -3702;clamer;negative;0;0;0;1;1;1 -3703;clameur;negative;0;0;0;1;1;1 -3704;clan;positive;0;0;0;0;0;0 -3705;clandestin;negative;0;1;1;0;0;0 -3706;clandestinement;negative;0;1;0;0;0;0 -3707;clapet;negative;0;0;0;1;0;1 -3708;clapier;negative;0;1;1;0;0;0 -3709;claque;negative;0;0;0;1;1;0 -3710;claquer;negative;0;1;0;1;1;0 -3711;clarifier;positive;0;0;0;0;0;0 -3712;clarinette;positive;0;0;0;0;0;0 -3713;clarté;positive;0;0;0;0;0;0 -3714;classer;positive;0;0;0;0;0;0 -3715;classe;positive;0;0;0;0;0;0 -3716;classeur;positive;0;0;0;0;0;0 -3717;classique;positive;0;0;0;0;0;0 -3718;clause;positive;0;0;0;0;0;0 -3719;clause restrictif;positive;0;0;0;0;0;0 -3720;clavecin;positive;0;0;0;0;0;0 -3721;clé;positive;0;0;0;0;0;0 -3722;clé en main;positive;0;0;0;0;0;0 -3723;clef de voûte;positive;0;0;0;0;0;0 -3724;clémence;positive;0;0;0;0;0;0 -3725;clergé;positive;0;0;0;0;0;0 -3726;clic;positive;0;0;0;0;1;0 -3727;clientèle;positive;0;0;0;0;0;0 -3728;clignement du ?il;positive;0;0;0;0;0;0 -3729;cligner du ?il;positive;0;0;0;0;0;0 -3730;clignotant;negative;0;0;0;0;1;0 -3731;clignoter;positive;0;0;0;0;0;0 -3732;climat;positive;0;0;0;0;0;0 -3733;climatologie;positive;0;0;0;0;0;0 -3734;clinquant;negative;0;0;0;0;0;0 -3735;clip;positive;0;0;0;0;0;0 -3736;clipper;negative;0;0;0;0;0;0 -3737;clique;positive;0;0;0;0;0;0 -3738;cliquer sur;positive;0;0;0;0;1;0 -3739;cliquet;positive;0;0;0;0;0;0 -3740;cliqueter;negative;0;1;0;0;1;0 -3741;cliquetis;negative;0;1;0;0;1;0 -3742;clivage;negative;0;1;1;0;0;0 -3743;clochard;negative;0;1;1;0;0;1 -3744;cloche;positive;0;0;0;0;0;0 -3745;clocher;positive;0;0;0;0;0;0 -3746;cloître;negative;0;0;1;0;0;0 -3747;cloque;negative;0;0;0;0;0;1 -3748;clôturer;negative;0;0;0;1;0;0 -3749;clou;negative;0;0;0;0;0;0 -3750;clou de finition;positive;0;0;0;0;0;0 -3751;clou de girofle;negative;0;0;0;0;0;1 -3752;clouter;negative;0;0;0;0;0;0 -3753;clown;positive;0;0;0;0;1;0 -3754;club;positive;0;0;0;0;0;0 -3755;club house;positive;0;0;0;0;0;0 -3756;coïncidence;positive;0;0;0;0;1;0 -3757;coagulation;negative;0;0;0;0;0;0 -3758;coaguler;negative;0;1;0;0;0;1 -3759;coalition;positive;0;0;0;0;0;0 -3760;coassement;negative;0;1;0;0;0;0 -3761;coasser;negative;0;1;0;0;0;0 -3762;cobalt;negative;0;0;0;0;0;0 -3763;cobra;negative;0;1;0;0;0;1 -3764;coca;negative;0;0;0;0;0;0 -3765;cocaïne;negative;0;1;1;0;0;1 -3766;cocarde;positive;0;0;0;0;0;0 -3767;coche;negative;0;0;0;0;0;0 -3768;cochon;negative;0;0;0;0;0;1 -3769;cockpit;positive;0;0;0;0;0;0 -3770;cocktail;positive;0;0;0;0;0;0 -3771;cocon;positive;0;0;0;0;0;0 -3772;cocu;negative;0;0;1;0;0;1 -3773;codex;positive;0;0;0;0;0;0 -3774;codification;positive;0;0;0;0;0;0 -3775;codifier;positive;0;0;0;0;0;0 -3776;coefficient;positive;0;0;0;0;0;0 -3777;coercition;negative;0;1;1;1;0;1 -3778;c?ur;positive;0;0;0;0;0;0 -3779;coexister;positive;0;0;0;0;0;0 -3780;coexistence;positive;0;0;0;0;0;0 -3781;coffre;negative;0;1;1;0;0;0 -3782;coffre fort;positive;0;0;0;0;0;0 -3783;cognition;positive;0;0;0;0;0;0 -3784;cohabitation;positive;0;0;0;0;0;0 -3785;cohérent;positive;0;0;0;0;0;0 -3786;cohorte;positive;0;0;0;0;0;0 -3787;coiffure;positive;0;0;0;0;0;0 -3788;coin du feu;positive;1;0;0;0;0;0 -3789;coin coin;negative;0;0;0;1;0;1 -3790;coincer;negative;0;1;1;1;1;0 -3791;coincement;negative;0;1;0;0;0;0 -3792;coïncident;positive;0;0;0;0;0;0 -3793;coïncider;positive;0;0;0;0;0;0 -3794;coke;negative;0;0;0;0;0;0 -3795;col;positive;0;0;0;0;0;0 -3796;col roulé;positive;0;0;0;0;0;0 -3797;colère;negative;0;1;0;1;0;1 -3798;colibri;positive;0;0;0;0;0;0 -3799;colique;negative;0;0;1;0;0;1 -3800;colis;positive;0;0;0;0;0;0 -3801;collage;negative;0;1;0;0;0;0 -3802;collante;negative;0;0;0;0;0;1 -3803;collatéral;positive;0;0;0;0;0;0 -3804;collation;positive;0;0;0;0;0;0 -3805;collationner;positive;0;0;0;0;0;0 -3806;colle;positive;0;0;0;0;0;0 -3807;collection;positive;0;0;0;0;0;0 -3808;collectionner;positive;0;0;0;0;0;0 -3809;collectivement;positive;0;0;0;0;0;0 -3810;collège;positive;0;0;0;0;0;0 -3811;collégien;positive;0;0;0;0;0;0 -3812;collègue;positive;0;0;0;0;0;0 -3813;collerette;positive;0;0;0;0;0;0 -3814;colley;positive;0;0;0;0;0;0 -3815;collier;positive;0;0;0;0;0;0 -3816;colline;positive;0;0;0;0;0;0 -3817;collision;negative;0;1;1;1;1;0 -3818;collocation;positive;0;0;0;0;0;0 -3819;colloque;positive;0;0;0;0;0;0 -3820;collusion;negative;0;1;1;1;0;1 -3821;colombe;positive;0;0;0;0;0;0 -3822;colombier;positive;0;0;0;0;0;0 -3823;colon;negative;0;1;0;0;0;0 -3824;côlon;negative;0;0;0;0;0;1 -3825;colonel;positive;0;0;0;0;0;0 -3826;colonial;negative;0;1;0;1;0;0 -3827;colonie;negative;0;1;0;1;0;0 -3828;colonnaire;positive;0;0;0;0;0;0 -3829;colonne;positive;0;0;0;0;0;0 -3830;colonne vertébral;positive;0;0;0;1;0;0 -3831;colophon;positive;0;0;0;0;0;0 -3832;colorant;positive;0;0;0;0;0;0 -3833;coloration;positive;0;0;0;0;0;0 -3834;colorer;positive;0;0;0;0;0;0 -3835;colorier;positive;0;0;0;0;0;0 -3836;colossal;positive;0;0;0;0;0;0 -3837;colportage;negative;0;0;0;0;0;0 -3838;colporter;negative;0;0;0;0;0;0 -3839;coma;negative;0;1;1;0;0;0 -3840;combat;negative;0;1;1;1;0;0 -3841;combatif;negative;0;1;0;1;0;0 -3842;combattre;negative;0;1;0;1;0;0 -3843;combinaison;positive;0;0;0;0;0;0 -3844;combinatoire;positive;0;0;0;0;0;0 -3845;combiner;positive;0;0;0;0;0;0 -3846;combler;positive;1;0;0;0;0;0 -3847;combustible;positive;0;0;0;0;0;0 -3848;combustion;negative;0;1;0;0;0;0 -3849;comédien;positive;0;0;0;0;0;0 -3850;comestible;positive;0;0;0;0;0;0 -3851;comète;positive;0;0;0;0;0;0 -3852;comité;positive;0;0;0;0;0;0 -3853;commander;positive;0;0;0;0;0;0 -3854;commande;positive;0;0;0;0;0;0 -3855;commandement;positive;0;0;0;0;0;0 -3856;commandeur;positive;0;0;0;0;0;0 -3857;commémoration;positive;1;0;0;0;0;0 -3858;commémorer;positive;0;0;1;0;0;0 -3859;commencer;positive;0;0;0;0;0;0 -3860;commentaire;positive;0;0;0;0;0;0 -3861;commenter;positive;0;0;0;0;0;0 -3862;commérage;negative;0;0;0;0;0;1 -3863;commerce;positive;0;0;0;0;0;0 -3864;commercial;positive;0;0;0;0;0;0 -3865;commercialisable;positive;0;0;0;0;0;0 -3866;commercialiser;positive;0;0;0;0;0;0 -3867;commère;negative;0;0;0;0;0;1 -3868;commérer;negative;0;0;0;0;0;1 -3869;commettre;positive;0;0;0;0;0;0 -3870;commissaire;positive;0;0;0;0;0;0 -3871;commissaire priseur;positive;0;0;0;0;0;0 -3872;commissariat;positive;0;0;0;0;0;0 -3873;commissionner;positive;0;0;0;0;0;0 -3874;commodité;positive;0;0;0;0;0;0 -3875;commodore;positive;0;0;0;0;0;0 -3876;commonwealth;positive;0;0;0;0;0;0 -3877;commotion;negative;0;1;1;1;0;0 -3878;commotion cérébral;negative;0;1;1;1;0;0 -3879;commuer;positive;0;0;0;0;0;0 -3880;communauté;positive;0;0;0;0;0;0 -3881;commune;positive;0;0;0;0;0;0 -3882;communément;positive;0;0;0;0;0;0 -3883;communicable;positive;0;0;0;0;0;0 -3884;communication;positive;0;0;0;0;0;0 -3885;communier;positive;0;0;0;0;0;0 -3886;communion;positive;0;0;0;0;0;0 -3887;communiquer;positive;0;0;0;0;0;0 -3888;communisme;negative;0;1;1;1;0;0 -3889;communiste;negative;0;1;0;1;0;0 -3890;commun|communs;positive;0;0;0;0;0;0 -3891;commutateur;positive;0;0;0;0;0;0 -3892;commutatif;positive;0;0;0;0;0;0 -3893;commutation;positive;0;0;0;0;0;0 -3894;commuter;positive;0;0;0;0;0;0 -3895;compactage;positive;0;0;0;0;0;0 -3896;compagne;positive;0;0;0;0;0;0 -3897;compagnie;positive;0;0;0;0;0;0 -3898;compagnie aérien;positive;0;0;0;0;0;0 -3899;compagnon;positive;0;0;0;0;0;0 -3900;comparable;positive;0;0;0;0;0;0 -3901;comparaison;negative;0;0;0;0;0;0 -3902;comparatif;positive;0;0;0;0;0;0 -3903;compartiment;positive;0;0;0;0;0;0 -3904;compas;positive;0;0;0;0;0;0 -3905;compatibilité;positive;0;0;0;0;0;0 -3906;compatible;positive;0;0;0;0;0;0 -3907;compatir;positive;0;0;1;0;0;0 -3908;compatissant;positive;0;1;1;0;0;0 -3909;compatissante;positive;0;1;1;0;0;0 -3910;compatissantes;positive;0;1;1;0;0;0 -3911;compatissants;positive;0;1;1;0;0;0 -3912;compatriote;positive;0;0;0;0;0;0 -3913;compensation;positive;0;0;0;0;0;0 -3914;compensatoire;positive;0;0;0;0;0;0 -3915;compenser;positive;0;0;0;0;1;0 -3916;compétent;positive;0;0;0;0;0;0 -3917;compétition;negative;0;0;0;1;0;0 -3918;compilation;positive;0;0;0;0;0;0 -3919;compiler;positive;0;0;0;0;0;0 -3920;complaindre;negative;0;1;1;0;0;1 -3921;complaisance;positive;0;0;0;0;0;0 -3922;complaire;negative;0;0;0;0;0;1 -3923;complaisant;negative;0;0;0;0;0;1 -3924;complément;positive;0;0;0;0;1;0 -3925;complémentaire;positive;0;0;0;0;0;0 -3926;complet;positive;0;0;0;0;0;0 -3927;compléter;positive;0;0;0;0;1;0 -3928;complexe;negative;0;1;1;0;0;0 -3929;complexité;negative;0;0;0;0;0;0 -3930;complication;negative;0;1;1;0;0;0 -3931;complice;positive;0;0;0;0;0;0 -3932;complicité;positive;0;0;0;0;0;0 -3933;compliment;positive;0;0;0;0;1;0 -3934;complimenter;positive;0;0;0;0;1;0 -3935;compliquer;negative;0;1;1;0;0;1 -3936;complot;negative;0;1;1;1;1;0 -3937;comportement;positive;0;0;0;0;0;0 -3938;comporter;positive;0;0;0;0;0;0 -3939;composant;positive;0;0;0;0;0;0 -3940;composante;positive;0;0;0;0;0;0 -3941;composer;negative;0;0;0;0;0;0 -3942;composé de constituer de;positive;0;0;0;0;0;0 -3943;composer un numéro;positive;0;0;0;0;0;0 -3944;composite;positive;0;0;0;0;0;0 -3945;composition;positive;0;0;0;0;0;0 -3946;compost;negative;0;0;0;0;0;1 -3947;composter;negative;0;0;0;0;0;1 -3948;compréhensif;positive;0;0;0;0;0;0 -3949;compréhension;positive;0;0;0;0;0;0 -3950;comprendre;positive;0;0;0;0;0;0 -3951;compresser;negative;0;0;0;1;0;0 -3952;compressible;negative;0;1;1;0;0;0 -3953;comprimer;negative;0;1;1;0;0;0 -3954;compromettre;positive;0;0;0;0;0;0 -3955;comptabilité;positive;0;0;0;0;0;0 -3956;comptable;positive;0;0;0;0;0;0 -3957;compte à rebours;negative;0;1;0;0;0;0 -3958;compter rendre;positive;0;0;0;0;0;0 -3959;compte tour;positive;0;0;0;0;0;0 -3960;compter;positive;0;0;0;0;0;0 -3961;compter à rebours;negative;0;1;0;0;0;0 -3962;compte;positive;0;0;0;0;0;0 -3963;compteur de vitesse;positive;0;0;0;0;0;0 -3964;comptoir;negative;0;0;0;0;0;0 -3965;compulsion;negative;0;1;0;1;0;0 -3966;comte;positive;0;0;0;0;0;0 -3967;comté;positive;0;0;0;0;0;0 -3968;con;negative;0;0;0;1;0;1 -3969;concaténation;positive;0;0;0;0;0;0 -3970;concave;positive;0;0;0;0;0;0 -3971;concentration;positive;0;0;0;0;0;0 -3972;concentrer;positive;0;0;0;0;0;0 -3973;concentrique;positive;0;0;0;0;0;0 -3974;concepteur;positive;0;0;0;0;0;0 -3975;conception;positive;0;0;0;0;0;0 -3976;concerner;negative;0;1;1;0;0;0 -3977;concert;positive;1;0;0;0;0;0 -3978;concession;positive;0;0;0;0;0;0 -3979;concessionnaire;positive;0;0;0;0;0;0 -3980;concevable;positive;0;0;0;0;0;0 -3981;concierge;positive;0;0;0;0;0;1 -3982;conciliation;positive;0;0;0;0;0;0 -3983;concis;positive;0;0;0;0;0;0 -3984;concision;positive;0;0;0;0;0;0 -3985;conclave;positive;0;0;0;0;0;0 -3986;conclure;positive;0;0;0;0;0;0 -3987;conclusion;positive;0;0;0;0;0;0 -3988;concoction;positive;0;0;0;0;0;0 -3989;concomitance;positive;0;0;0;0;0;0 -3990;concomitant;positive;0;0;0;0;0;0 -3991;concordance;positive;0;0;0;0;0;0 -3992;concorder;positive;0;0;0;0;0;0 -3993;concourir;positive;0;0;0;0;0;0 -3994;concours;negative;0;1;0;1;0;0 -3995;concrétiser;positive;0;0;0;0;0;0 -3996;concubinage;positive;0;0;0;0;0;0 -3997;concurrence;negative;0;0;0;1;0;0 -3998;condamnation;negative;0;1;1;1;0;1 -3999;condamner;negative;0;1;1;0;0;0 -4000;condensation;positive;0;0;0;0;0;0 -4001;condenser;positive;0;0;0;0;0;0 -4002;condescendance;negative;0;0;1;1;0;1 -4003;condescendre;negative;0;0;0;0;0;1 -4004;condescendant;negative;0;0;0;0;0;1 -4005;condiment;positive;1;0;0;0;0;0 -4006;condition préalable;positive;0;0;0;0;0;0 -4007;conditionner;negative;0;0;0;0;0;0 -4008;condition;positive;0;0;0;0;0;0 -4009;condoléance;positive;0;0;1;0;0;0 -4010;conducteur;positive;0;0;0;0;0;0 -4011;conduction;positive;0;0;0;0;0;0 -4012;conductivité;positive;0;0;0;0;0;0 -4013;conduire;positive;0;0;0;0;0;0 -4014;conduire de cheminée;positive;0;0;0;0;0;0 -4015;cône;positive;0;0;0;0;0;0 -4016;confectionner;positive;0;0;0;0;0;0 -4017;confédération;positive;0;0;0;0;0;0 -4018;confédérer;positive;0;0;0;0;0;0 -4019;conférence;positive;0;0;0;0;0;0 -4020;conférencier;positive;0;0;0;0;0;0 -4021;conférer;positive;0;0;0;0;0;0 -4022;confessionnal;positive;0;1;0;0;0;0 -4023;confession;positive;0;0;0;0;0;0 -4024;confiance;positive;0;1;0;0;0;0 -4025;confier;positive;0;0;0;0;0;0 -4026;confiant;positive;0;0;0;0;0;0 -4027;confidentiellement;positive;0;0;0;0;0;0 -4028;configuration;positive;0;0;0;0;0;0 -4029;confiner;negative;0;1;1;1;0;1 -4030;confins;positive;0;0;0;0;0;0 -4031;confirmation;positive;0;0;0;0;0;0 -4032;confirmer;positive;0;0;0;0;0;0 -4033;confire;positive;0;0;0;0;0;0 -4034;confiscation;negative;0;1;1;0;0;0 -4035;confisquer;negative;0;0;1;1;0;0 -4036;confiture;positive;0;0;0;0;0;0 -4037;conflagration;negative;0;1;0;1;1;0 -4038;conflictuel;negative;0;0;0;1;0;1 -4039;confluence;positive;0;0;0;0;0;0 -4040;confluent;positive;0;0;0;0;0;0 -4041;confondre;negative;0;1;0;0;1;0 -4042;conformation;positive;0;0;0;0;0;0 -4043;conforme;positive;0;0;0;0;0;0 -4044;conformité;positive;0;0;0;0;0;0 -4045;confort;positive;0;0;0;0;0;0 -4046;confortable;positive;1;0;0;0;0;0 -4047;conforter;positive;0;0;0;0;0;0 -4048;confraternel;positive;0;0;0;0;0;0 -4049;confrère;positive;0;0;0;0;0;0 -4050;confrérie;positive;0;0;0;0;0;0 -4051;confrontation;negative;0;1;0;1;0;0 -4052;confronter;negative;0;0;0;1;0;0 -4053;confusion;negative;0;1;1;1;1;0 -4054;congédier;negative;0;1;1;1;0;0 -4055;congélateur;positive;0;0;0;0;0;0 -4056;congélation;negative;0;0;0;0;0;0 -4057;congeler;negative;0;0;0;0;0;0 -4058;congénital;negative;0;1;0;0;0;0 -4059;congé;positive;1;0;0;0;0;0 -4060;congestion;negative;0;0;0;1;0;0 -4061;conglomérat;positive;0;0;0;0;0;0 -4062;conglomérer;positive;0;0;0;0;0;0 -4063;congratulateur;positive;1;0;0;0;0;0 -4064;congrégation;positive;0;0;0;0;0;0 -4065;congrès;positive;0;0;0;0;0;1 -4066;congruence;positive;0;0;0;0;0;0 -4067;conique;positive;0;0;0;0;0;0 -4068;conjecturer;positive;0;0;0;0;0;0 -4069;conjoindre;positive;0;0;0;0;0;0 -4070;conjointement;positive;0;0;0;0;0;0 -4071;conjonctif;positive;0;0;0;0;0;0 -4072;conjonction;positive;0;0;0;0;0;0 -4073;conjonctive;positive;0;0;0;0;0;0 -4074;conjoncture;positive;0;0;0;0;0;0 -4075;conjugaison;positive;0;0;0;0;0;0 -4076;conjugal;positive;0;0;0;0;0;0 -4077;conjuguer;positive;0;0;0;0;0;0 -4078;connaissance;positive;0;0;0;0;0;0 -4079;connard;negative;0;0;0;1;0;1 -4080;connerie;negative;0;0;0;1;0;1 -4081;connexion;positive;0;0;0;0;0;0 -4082;connaître de tout le monde;positive;1;0;0;0;0;0 -4083;conquérir;positive;1;0;0;0;0;0 -4084;conquête;negative;0;1;0;1;0;0 -4085;consacrer;positive;0;0;0;0;0;0 -4086;consanguin;negative;0;1;1;0;0;1 -4087;consciemment;positive;0;0;0;0;0;0 -4088;conscience;positive;0;0;0;0;0;0 -4089;conscient;positive;0;0;0;0;0;0 -4090;conscription;negative;0;1;0;0;0;0 -4091;consécration;positive;0;0;1;0;0;0 -4092;conseil;positive;0;0;0;0;0;0 -4093;consentir;positive;0;0;0;0;0;0 -4094;consentant;positive;0;0;0;0;0;0 -4095;conséquence;positive;0;0;0;0;0;0 -4096;conserver;positive;0;0;0;0;0;0 -4097;conservatisme;negative;0;0;0;0;0;0 -4098;conservatoire;positive;0;0;0;0;0;0 -4099;considérable;positive;1;0;0;0;0;0 -4100;considérablement;positive;1;0;0;0;0;0 -4101;considérer;positive;0;0;0;0;0;0 -4102;consignataire;positive;0;0;0;0;0;0 -4103;consignation;positive;0;0;0;0;0;0 -4104;consigner;negative;0;1;1;0;0;0 -4105;consistance;positive;0;0;0;0;0;0 -4106;consolation;positive;0;0;0;0;0;0 -4107;console;positive;0;0;1;0;0;0 -4108;consoler;positive;0;0;1;0;0;0 -4109;consolidation;positive;0;0;0;0;0;0 -4110;consolider;positive;0;0;0;0;0;0 -4111;consommer;positive;0;0;0;0;0;0 -4112;consommation;positive;0;0;0;0;0;0 -4113;consonne;positive;0;0;0;0;0;0 -4114;consort;positive;0;0;0;0;0;0 -4115;constable;positive;0;0;0;0;0;0 -4116;constance;positive;0;0;0;0;0;0 -4117;constant;positive;0;0;0;0;1;0 -4118;constater;positive;0;0;0;0;0;0 -4119;constellation;positive;0;0;0;0;0;0 -4120;constipation;negative;0;0;0;0;0;1 -4121;constituant;positive;0;1;0;0;0;0 -4122;constituer;positive;0;0;0;0;0;0 -4123;constitution;positive;0;0;0;0;0;0 -4124;constitutionnalité;positive;0;0;0;0;0;0 -4125;constructeur;positive;0;0;0;0;0;0 -4126;construction;positive;0;0;0;0;0;0 -4127;construire;positive;0;0;0;0;0;0 -4128;consul;positive;0;0;0;0;0;0 -4129;consultation;positive;0;0;0;0;0;0 -4130;consulter;positive;0;0;0;0;0;0 -4131;consumation;negative;0;1;1;0;0;0 -4132;contact;positive;0;0;0;0;0;0 -4133;contacter;positive;0;0;0;0;0;0 -4134;contagion;negative;0;1;0;0;0;1 -4135;contamination;negative;0;1;0;0;0;1 -4136;contaminer;negative;0;1;1;0;0;1 -4137;contemplatif;positive;0;0;0;0;0;0 -4138;contemplation;positive;1;0;0;0;0;0 -4139;contempler;positive;0;0;0;0;0;0 -4140;contenance;positive;0;0;0;0;0;0 -4141;contentement;positive;0;0;0;0;0;0 -4142;contenter;positive;0;0;0;0;0;0 -4143;contentieux;negative;0;1;0;1;0;1 -4144;contenir;positive;0;0;0;0;0;0 -4145;contester;negative;0;0;0;1;0;0 -4146;contexte;positive;0;0;0;0;0;0 -4147;contigu;positive;0;0;0;0;0;0 -4148;contiguës;positive;0;0;0;0;0;0 -4149;contiguïté;positive;0;0;0;0;0;0 -4150;continence;positive;0;0;0;0;0;0 -4151;continent;positive;0;0;0;0;0;0 -4152;continental;positive;0;0;0;0;0;0 -4153;contingence;negative;0;1;0;0;1;0 -4154;contingent;negative;0;0;0;0;0;0 -4155;continu;positive;0;0;0;0;0;0 -4156;continuation;positive;0;0;0;0;0;0 -4157;continuer;positive;0;0;0;0;0;0 -4158;continuellement;positive;0;0;0;0;0;0 -4159;continuité;positive;0;0;0;0;0;0 -4160;contondant;negative;0;1;0;1;0;0 -4161;contour;positive;0;0;0;0;0;0 -4162;contracter;positive;0;0;0;0;0;0 -4163;contractile;positive;0;0;0;0;0;0 -4164;contraction;positive;0;0;0;0;0;0 -4165;contradiction;negative;0;0;0;1;0;0 -4166;contradictoire;negative;0;0;0;1;0;1 -4167;contrairement;negative;0;0;0;1;0;0 -4168;contrairement à;negative;0;0;0;0;0;0 -4169;contraire;negative;0;1;1;1;0;0 -4170;contralto;positive;0;0;0;0;0;0 -4171;contrariété;negative;0;0;0;1;0;1 -4172;contraster;negative;0;0;0;0;0;0 -4173;contravention;negative;0;0;0;1;0;0 -4174;contre;negative;0;0;0;1;0;0 -4175;contre nature;negative;0;1;0;0;0;1 -4176;contre son gré;negative;0;1;1;0;0;0 -4177;contre torpilleur;negative;0;1;0;1;0;0 -4178;contrebalancer;positive;0;0;0;0;0;0 -4179;contrebande;negative;0;1;0;1;0;1 -4180;contredire;negative;0;0;0;1;0;0 -4181;contrefaçon;negative;0;0;0;1;0;1 -4182;contrefaire;positive;0;0;0;0;0;0 -4183;contrefort;positive;0;0;0;0;0;0 -4184;contrer;negative;0;0;0;1;1;0 -4185;contresens;negative;0;1;1;0;0;0 -4186;contribuer;positive;1;0;0;0;0;0 -4187;contributeur;positive;0;0;0;0;0;0 -4188;contrôler;positive;0;0;0;0;0;0 -4189;contrôleur;positive;0;0;0;0;0;0 -4190;controverse;negative;0;0;0;1;0;0 -4191;controverser;negative;0;0;0;1;0;1 -4192;contusion;negative;0;1;1;0;0;0 -4193;convaincant;positive;0;0;0;0;0;0 -4194;convaincre;positive;0;0;0;0;0;0 -4195;convalescence;positive;0;0;0;0;0;0 -4196;convalescent;positive;0;0;0;0;0;0 -4197;convection;positive;0;0;0;0;0;0 -4198;convenable;positive;0;0;0;0;0;0 -4199;convention;positive;0;0;0;0;0;0 -4200;convenir;positive;0;0;0;0;0;0 -4201;convergence;positive;0;0;0;0;0;0 -4202;convergent;positive;0;0;0;0;0;0 -4203;converger;positive;0;0;0;0;0;0 -4204;converser;positive;0;0;0;0;0;0 -4205;conversation;positive;0;0;0;0;0;0 -4206;conversationnel;positive;0;0;0;0;0;0 -4207;conversion;positive;0;0;0;0;0;0 -4208;convertir;positive;0;0;0;0;0;0 -4209;convertible;positive;0;0;0;0;0;0 -4210;convexe;positive;0;0;0;0;0;0 -4211;convexité;positive;0;0;0;0;0;0 -4212;convier;positive;0;0;0;0;1;0 -4213;convive;positive;0;0;0;0;0;0 -4214;convivialité;positive;0;0;0;0;0;0 -4215;convoi;positive;0;0;0;0;0;0 -4216;convoiter;positive;0;0;0;0;0;0 -4217;convoyer;positive;0;0;0;0;0;0 -4218;cool;positive;1;0;0;0;0;0 -4219;coopérant;positive;0;0;0;0;0;0 -4220;coopératif;positive;0;0;0;0;0;0 -4221;coopération;positive;0;0;0;0;0;0 -4222;coopérative;positive;0;0;0;0;0;0 -4223;coopérer;positive;0;0;0;0;0;0 -4224;coordonner;positive;0;0;0;0;0;0 -4225;copie;negative;0;0;0;1;0;1 -4226;copier;negative;0;0;0;0;0;0 -4227;copieux;negative;0;0;0;1;0;1 -4228;copyright;positive;0;0;0;0;0;0 -4229;coq;negative;0;1;0;0;0;0 -4230;coque;positive;0;0;0;0;0;0 -4231;coquelicot;positive;0;0;0;0;0;0 -4232;coqueluche;negative;0;1;1;0;0;1 -4233;coquin;negative;0;1;0;1;1;1 -4234;cor;negative;0;1;0;0;0;0 -4235;corail;positive;0;0;0;0;0;0 -4236;corbillard;negative;0;1;1;0;0;0 -4237;corde à linge;positive;0;0;0;0;0;0 -4238;cordon;positive;0;0;0;0;0;0 -4239;cordonnier;positive;0;0;0;0;0;0 -4240;corne;negative;0;1;0;0;0;0 -4241;corner;positive;0;0;0;0;0;0 -4242;corneille;negative;0;1;0;0;0;1 -4243;cornemuse;positive;0;0;0;0;0;0 -4244;cornet;positive;0;0;0;0;0;0 -4245;corniche;positive;0;0;0;0;0;0 -4246;corollaire;positive;0;0;0;0;0;0 -4247;coroner;positive;0;0;0;0;0;0 -4248;corporation;positive;0;0;0;0;0;0 -4249;corps législatif;positive;0;0;0;0;0;0 -4250;corpulent;positive;0;0;0;0;0;0 -4251;corpus;positive;0;0;0;0;0;0 -4252;corral;positive;0;0;0;0;0;0 -4253;correct;positive;0;0;0;0;0;0 -4254;correctement;positive;0;0;0;0;0;0 -4255;correcteur;positive;0;0;0;0;0;0 -4256;correction;negative;0;1;1;1;0;0 -4257;corrélatif;positive;0;0;0;0;0;0 -4258;corrélation;positive;0;0;0;0;0;0 -4259;correspondance;positive;0;0;0;0;0;0 -4260;correspondre;positive;0;0;0;0;0;0 -4261;correspondre à;positive;0;0;0;0;0;0 -4262;corridor;positive;0;0;0;0;0;0 -4263;corroboration;positive;0;0;0;0;0;0 -4264;corroborer;positive;0;0;0;0;0;0 -4265;corrompre;negative;0;0;1;1;0;1 -4266;corrosif;negative;0;1;0;0;0;1 -4267;corrosion;negative;0;0;1;0;0;1 -4268;corrovsive;negative;0;1;0;0;0;1 -4269;corrupteur;negative;0;1;1;1;0;1 -4270;corruption;negative;0;0;0;1;0;1 -4271;corsage;positive;0;0;0;0;0;0 -4272;cortège;positive;0;0;0;0;0;0 -4273;cortex;positive;0;0;0;0;0;0 -4274;cortical;positive;0;0;0;0;0;0 -4275;corvée;negative;0;0;1;0;0;1 -4276;corvette;positive;0;0;0;0;0;0 -4277;cosmétique;positive;0;0;0;0;0;0 -4278;cosmique;positive;0;0;0;0;0;0 -4279;cosmologie;positive;0;0;0;0;0;0 -4280;cosmopolite;positive;0;0;0;0;0;0 -4281;cosmos;positive;0;0;0;0;0;0 -4282;cosse;positive;0;0;0;0;0;0 -4283;costume;positive;0;0;0;0;0;0 -4284;côtelette;negative;0;0;0;0;0;0 -4285;cotisation;positive;0;0;0;0;0;0 -4286;coton;positive;0;0;0;0;0;0 -4287;cotonneux;positive;0;0;0;0;0;0 -4288;cottage;positive;0;0;0;0;0;0 -4289;cou;positive;0;0;0;0;0;0 -4290;couche de finition;positive;0;0;0;0;0;0 -4291;couche culotte;negative;0;0;0;0;0;1 -4292;coucher;negative;0;0;0;0;0;0 -4293;coucher de soleil;positive;0;0;0;0;0;0 -4294;coucher du soleil;positive;0;0;0;0;0;0 -4295;couchette;positive;0;0;0;0;0;0 -4296;coucou;negative;0;0;0;0;0;1 -4297;coude;negative;0;0;0;1;0;0 -4298;coudre;positive;0;0;0;0;0;0 -4299;couenne;negative;0;0;0;0;0;1 -4300;couette;positive;1;0;0;0;0;0 -4301;couguar;negative;0;1;0;0;0;0 -4302;couinement;negative;0;1;1;0;1;0 -4303;couiner;negative;0;1;1;1;1;0 -4304;couler;negative;0;1;1;0;0;1 -4305;couleur;positive;0;0;0;0;0;0 -4306;couleur prune;positive;0;0;0;0;0;0 -4307;coulisser;negative;0;0;0;0;0;0 -4308;coulissant;negative;0;0;0;0;0;0 -4309;couloir;positive;0;0;0;0;0;0 -4310;coup d état;negative;0;0;0;1;1;0 -4311;coup de balai;negative;0;0;0;0;0;0 -4312;coup de chance extraordinaire;positive;0;0;0;0;1;0 -4313;coup de couteau;negative;0;1;1;1;1;0 -4314;coup de fil;positive;0;0;0;0;0;0 -4315;coup de foudre;negative;0;1;0;1;1;0 -4316;coup de fouet;negative;0;1;0;1;0;0 -4317;coup de langue;negative;0;0;0;0;0;1 -4318;coup de pied;negative;0;0;0;1;0;0 -4319;coup de poing;negative;0;1;1;1;1;0 -4320;coup de vent;negative;0;1;0;0;1;0 -4321;coup sec;negative;0;1;0;1;1;0 -4322;coupable;negative;0;1;1;1;0;1 -4323;couper en deux;negative;0;0;0;0;0;0 -4324;couper le cheveu;positive;0;0;0;0;0;0 -4325;coupe de cheveu;positive;0;0;0;0;0;0 -4326;couper;negative;0;1;0;1;0;0 -4327;couper en dé;positive;0;0;0;0;0;0 -4328;couper en gros morceau;positive;0;0;0;0;0;0 -4329;couper en tranche;negative;0;0;0;0;0;0 -4330;couple;positive;0;0;0;0;0;0 -4331;coupler;positive;0;0;0;0;0;0 -4332;couple mal assortir;negative;0;0;0;0;0;1 -4333;couplet;positive;0;0;0;0;0;0 -4334;coupole;positive;0;0;0;0;0;0 -4335;coupon;positive;0;0;0;0;0;0 -4336;coup;negative;0;1;0;1;0;0 -4337;coupure;negative;0;1;1;1;0;1 -4338;couramment;positive;0;0;0;0;0;0 -4339;courir d air;negative;0;1;0;0;0;0 -4340;courante;positive;0;0;0;0;0;0 -4341;courant;positive;0;0;0;0;0;0 -4342;courbatu;negative;0;0;1;0;0;0 -4343;courbaturer;negative;0;0;1;0;0;0 -4344;courir;positive;0;0;0;0;0;0 -4345;courir après;negative;0;1;0;1;0;0 -4346;couronnement;positive;0;0;0;0;1;0 -4347;couronner;positive;0;0;0;0;0;0 -4348;courriel;positive;0;0;0;0;0;0 -4349;courroux;negative;0;1;0;1;0;0 -4350;cour|cours;positive;0;0;0;0;0;0 -4351;cour|cours d eau;positive;0;0;0;0;0;0 -4352;course;positive;0;0;0;0;0;0 -4353;course à pied;positive;0;0;0;0;0;0 -4354;coursier;positive;0;0;0;0;0;0 -4355;court;negative;0;0;0;0;0;0 -4356;courtage;positive;0;0;0;0;0;0 -4357;courtiser;positive;0;0;0;0;0;0 -4358;courtois;positive;0;0;0;0;0;0 -4359;courtoisie;positive;1;0;0;0;0;0 -4360;coussin;positive;0;0;0;0;0;0 -4361;coût;negative;0;0;0;0;0;0 -4362;couteau;negative;0;1;0;1;0;0 -4363;coûter;negative;0;0;0;0;0;0 -4364;coûteux;negative;0;0;1;0;0;0 -4365;coutume;positive;0;0;0;0;0;0 -4366;couture;positive;0;0;0;0;0;0 -4367;couturière;positive;0;0;0;0;0;0 -4368;couver;positive;0;0;0;0;0;0 -4369;couvent;positive;0;0;0;0;0;0 -4370;couvercle;positive;0;0;0;0;0;0 -4371;couvrir;positive;0;0;0;0;0;0 -4372;couvrante;positive;0;0;0;0;0;0 -4373;couvrant;positive;0;0;0;0;0;0 -4374;couvrir chef;positive;0;0;0;0;0;0 -4375;couvrir feu;negative;0;1;0;0;0;0 -4376;couvrir de chaume;positive;0;0;0;0;0;0 -4377;coyote;negative;0;1;0;0;0;0 -4378;crabe;negative;0;1;0;0;0;1 -4379;cracher;negative;0;0;0;0;0;1 -4380;crachin;negative;0;0;1;0;0;1 -4381;cracker;positive;0;0;0;0;0;0 -4382;craie;positive;0;0;0;0;0;0 -4383;craindre;negative;0;1;0;0;0;0 -4384;craintivement;negative;0;1;1;0;1;0 -4385;cramoisir;negative;0;0;0;0;0;1 -4386;crampe;negative;0;1;1;1;1;0 -4387;cranter;positive;0;0;0;0;0;0 -4388;crapaud;negative;0;0;0;0;0;1 -4389;crapule;negative;0;1;0;1;0;1 -4390;craquement;negative;0;1;0;1;0;0 -4391;craquer;negative;0;1;0;1;1;0 -4392;crash;negative;0;1;1;0;1;0 -4393;crasse;negative;0;0;0;0;0;1 -4394;cratère;negative;0;1;0;0;0;0 -4395;cravate;positive;0;0;0;0;0;0 -4396;crayon;positive;0;0;0;0;0;0 -4397;crayon à papier;positive;0;0;0;0;0;0 -4398;crayonner;positive;0;0;0;0;0;0 -4399;crayon de couleur;positive;0;0;0;0;0;0 -4400;crayon gras;positive;0;0;0;0;0;0 -4401;créancier hypothécaire;positive;0;0;0;0;0;0 -4402;créatif;positive;1;0;0;0;0;0 -4403;création;positive;0;0;0;0;0;0 -4404;créature;negative;0;1;0;0;0;1 -4405;crèche;positive;0;0;0;0;0;0 -4406;crédibilité;positive;0;0;0;0;0;0 -4407;crédible;positive;0;0;0;0;0;0 -4408;crédit;positive;0;0;0;0;0;0 -4409;créditer;positive;0;0;0;0;0;0 -4410;créditeur;positive;0;0;0;0;0;0 -4411;credo;positive;0;0;0;0;0;0 -4412;crédule;negative;0;0;1;0;0;0 -4413;créer;positive;1;0;0;0;0;0 -4414;crémaillère;positive;0;0;1;0;0;0 -4415;crémation;negative;0;0;1;0;0;0 -4416;crème;positive;0;0;0;0;1;0 -4417;crémerie;positive;0;0;0;0;0;0 -4418;crémier;positive;0;0;0;0;0;0 -4419;créneau;positive;0;0;0;0;0;0 -4420;créole;positive;0;0;0;0;0;0 -4421;crêpe;positive;0;0;0;0;0;0 -4422;crêper;positive;0;0;0;0;0;0 -4423;crépitement;negative;0;1;0;1;1;0 -4424;crépiter;negative;0;1;0;0;0;0 -4425;crescendo;positive;0;0;0;0;1;0 -4426;crête;negative;0;0;0;0;0;0 -4427;creuser;negative;0;0;0;0;0;0 -4428;crevaison;negative;0;1;1;0;1;0 -4429;crever;negative;0;1;1;0;1;0 -4430;crevette;negative;0;0;0;0;0;0 -4431;cri strident;negative;0;1;1;1;1;0 -4432;crier;negative;0;1;1;1;0;1 -4433;criard;negative;0;0;0;0;1;1 -4434;cribler;negative;0;1;1;0;0;0 -4435;cribler de trou;negative;0;1;1;0;0;0 -4436;cric;positive;0;0;0;0;0;0 -4437;cricket;positive;0;0;0;0;0;0 -4438;crier de joie;positive;0;0;0;0;1;0 -4439;crime;negative;0;1;1;1;0;0 -4440;criminalité;negative;0;1;0;1;0;1 -4441;crinière;positive;0;0;0;0;0;0 -4442;crique;positive;0;1;0;0;0;1 -4443;criquet;negative;0;1;0;0;0;1 -4444;crise;negative;0;1;1;1;1;0 -4445;crisper;negative;0;1;0;1;0;0 -4446;crissement;negative;0;1;1;1;1;0 -4447;crisser;negative;0;1;1;1;1;0 -4448;cristal;positive;0;0;0;0;0;0 -4449;cristallin;positive;0;0;0;0;0;0 -4450;cristallisation;positive;0;0;0;0;0;0 -4451;critère;positive;0;0;0;0;0;0 -4452;croassement;negative;0;1;0;0;0;0 -4453;croc;negative;0;1;0;0;0;0 -4454;crochet;positive;0;0;0;0;0;0 -4455;crocodile;negative;0;1;0;0;0;0 -4456;croire;positive;0;0;0;0;0;0 -4457;croisade;negative;0;1;0;1;0;0 -4458;croiser;negative;0;0;0;0;0;0 -4459;croisé;negative;0;0;0;0;0;0 -4460;croiseur;positive;0;0;0;0;0;0 -4461;croisière;positive;0;0;0;0;0;0 -4462;croissance;positive;0;0;0;0;0;0 -4463;croissance démesuré;negative;0;0;1;0;0;0 -4464;croissant;positive;0;0;0;0;0;0 -4465;croix;positive;0;1;1;1;0;0 -4466;croix gammée;negative;0;1;0;1;0;1 -4467;croquant;positive;0;0;0;0;0;0 -4468;croquant|croquante;positive;0;0;0;0;0;0 -4469;croque mitaine;negative;0;1;1;1;0;0 -4470;croque mort;positive;0;0;1;0;0;0 -4471;croquer;negative;0;0;0;1;0;0 -4472;croquet;positive;0;0;0;0;0;0 -4473;croquis;positive;0;0;0;0;0;0 -4474;crotale;negative;0;1;0;0;0;1 -4475;croupe;negative;0;0;0;0;0;0 -4476;croupier;positive;0;0;0;0;0;0 -4477;croustillant;positive;0;0;0;0;0;0 -4478;croûte;negative;0;0;0;0;0;1 -4479;croyance;positive;0;0;0;0;0;0 -4480;cruauté;negative;0;1;1;1;0;1 -4481;crucial;positive;0;0;0;0;0;0 -4482;crucifix;negative;0;1;0;0;0;0 -4483;crucifixion;negative;0;1;1;1;0;1 -4484;crustacé;negative;0;0;0;0;0;1 -4485;crypte;negative;0;1;1;0;0;0 -4486;crypter;negative;0;1;0;0;0;0 -4487;cryptographie;positive;0;0;0;0;0;0 -4488;cube;negative;0;0;0;1;0;0 -4489;cueillir;positive;1;0;0;0;0;0 -4490;cuillère;positive;0;0;0;0;0;0 -4491;cuillère à soupe;positive;0;0;0;0;0;0 -4492;cuillerée;positive;0;0;0;0;0;0 -4493;cuir;positive;0;0;0;0;0;0 -4494;cuir brut;positive;0;0;0;0;0;0 -4495;cuir chevelu;negative;0;1;0;0;0;1 -4496;cuire;positive;0;0;0;0;0;0 -4497;cuiseur vapeur;positive;0;0;0;0;0;0 -4498;cuisiner;positive;0;0;0;0;0;0 -4499;cuisine;positive;0;0;0;0;0;0 -4500;cuisinier;positive;0;0;0;0;0;0 -4501;cuisinier|cuisinière;positive;0;0;0;0;0;0 -4502;cuisson;positive;0;0;0;0;0;0 -4503;cuit|cuite;negative;0;0;0;0;0;0 -4504;cuivre;positive;0;0;0;0;0;0 -4505;cuivrer;positive;0;0;0;0;0;0 -4506;cul;negative;0;0;0;0;0;0 -4507;culasse;negative;0;0;0;0;0;0 -4508;culinaire;positive;0;0;0;0;0;0 -4509;culminer;positive;1;0;0;0;0;0 -4510;culotte;negative;0;0;0;0;0;0 -4511;culpabilité;negative;0;0;1;1;0;1 -4512;culture;positive;0;0;0;0;0;0 -4513;cumulus;negative;0;0;0;0;0;0 -4514;cupide;negative;0;1;0;1;0;0 -4515;cupidité;negative;0;0;0;1;0;1 -4516;curable;positive;0;0;0;0;0;0 -4517;curateur;positive;0;0;0;0;0;0 -4518;curcuma;positive;0;0;0;0;0;0 -4519;curling;positive;0;0;0;0;0;0 -4520;curry;positive;0;0;0;0;0;0 -4521;curviligne;positive;0;0;0;0;0;0 -4522;cuticule;negative;0;0;0;0;0;1 -4523;cutter;negative;0;1;0;0;0;0 -4524;cuvée;positive;0;0;0;0;0;0 -4525;cyanure;negative;0;1;0;0;0;1 -4526;cycle;positive;0;0;0;0;0;0 -4527;cyclique;positive;0;0;0;0;0;0 -4528;cycliste;positive;0;0;0;0;0;0 -4529;cyclone;negative;0;1;0;0;1;0 -4530;cygne;positive;0;0;0;0;0;0 -4531;cylindre;positive;0;0;0;0;0;0 -4532;cylindrique;positive;0;0;0;0;0;0 -4533;cymbale;positive;0;0;0;0;0;0 -4534;cynique;negative;0;0;0;1;0;1 -4535;cytomégalovirus;negative;0;1;1;0;0;1 -4536;cytoplasme;positive;0;0;0;0;0;0 -4537;d accord;positive;0;0;0;0;0;0 -4538;d actualité;positive;0;0;0;0;0;0 -4539;d essai;negative;0;1;0;0;0;0 -4540;d humeur changeant;negative;0;0;1;1;0;0 -4541;d intérieur;positive;0;0;0;0;0;0 -4542;d occasion;negative;0;0;0;0;0;0 -4543;d or;positive;0;0;0;0;0;0 -4544;dactylo;positive;0;0;0;0;0;0 -4545;dactylographe;positive;0;0;0;0;0;0 -4546;dague;negative;0;1;0;0;0;0 -4547;dallage;positive;0;0;0;0;0;0 -4548;dalle;positive;0;0;0;0;0;0 -4549;dame;positive;0;0;0;1;0;1 -4550;damnation;negative;0;1;1;1;0;0 -4551;damner;negative;0;1;1;0;0;0 -4552;damoiselle;positive;0;0;0;0;0;0 -4553;dandy;positive;0;0;0;0;0;1 -4554;danger;negative;0;1;1;0;0;0 -4555;dangeureuses;negative;0;1;0;0;1;0 -4556;dans le monde entier;positive;0;0;0;0;0;0 -4557;dans le secret;positive;0;0;0;0;0;0 -4558;dans le sen|sens de le longueur;positive;0;0;0;0;0;0 -4559;danse;positive;0;0;0;0;0;0 -4560;danser;positive;0;0;0;0;0;0 -4561;dard;negative;0;1;0;1;1;0 -4562;date;positive;1;0;0;0;0;0 -4563;date anniversaire;positive;0;0;0;0;1;0 -4564;dauphin;positive;0;0;0;0;1;0 -4565;dé à coudre;positive;0;0;0;0;0;0 -4566;de banlieue;negative;0;0;0;0;0;0 -4567;de baptême;positive;1;0;0;0;0;0 -4568;de base;positive;0;0;0;0;0;0 -4569;de bon augure;positive;1;0;0;0;0;0 -4570;de bon c?ur;positive;1;0;0;0;0;0 -4571;de bon goût;positive;0;0;0;0;0;0 -4572;de bureau;positive;0;0;0;0;0;0 -4573;de cabaret;positive;0;0;0;0;1;0 -4574;de ce côté là;positive;0;0;0;0;0;0 -4575;de citron;negative;0;0;0;0;0;1 -4576;de conclusion;positive;0;0;0;0;0;0 -4577;de confirmation;positive;0;0;0;0;0;0 -4578;de consolation;negative;0;0;1;0;0;0 -4579;de contrebande;negative;0;1;0;1;0;1 -4580;de côté;negative;0;0;0;0;0;0 -4581;de cuisine;positive;0;0;0;0;0;0 -4582;de démolition;negative;0;0;0;1;0;0 -4583;de façade;negative;0;0;0;1;0;1 -4584;de face;positive;0;0;0;0;0;0 -4585;de façon constant;positive;0;0;0;0;0;0 -4586;de façon décontracté;positive;0;0;0;0;0;0 -4587;de façon identique;positive;0;0;0;0;0;0 -4588;de façon introspectif;positive;0;0;0;0;0;0 -4589;de félicitation;positive;1;0;0;0;0;0 -4590;de fer;positive;0;0;0;0;0;0 -4591;de fête;positive;1;0;0;0;0;0 -4592;de force;negative;0;1;0;1;0;0 -4593;de fort carrure;positive;0;1;0;0;0;0 -4594;de fortune;negative;0;0;1;0;0;0 -4595;de gala;positive;0;0;0;0;0;0 -4596;de gouverneur;positive;0;0;0;0;0;0 -4597;de jeu;positive;0;0;0;0;0;0 -4598;de jour;positive;0;0;0;0;0;0 -4599;de le conversation;positive;0;0;0;0;0;0 -4600;de le lune;positive;0;0;0;0;0;0 -4601;de lancement;positive;0;0;0;0;0;0 -4602;de luxe;positive;1;0;0;0;0;0 -4603;de manière choquant;negative;0;0;0;0;1;0 -4604;de manière exquis;positive;1;0;0;0;0;0 -4605;de manière inattendu;negative;0;0;0;0;1;0 -4606;de manière satisfaisant;positive;0;0;0;0;0;0 -4607;de marée;negative;0;1;0;0;0;0 -4608;de marié;positive;0;0;0;0;0;0 -4609;de marque déposer;positive;0;0;0;0;0;0 -4610;de masse;negative;0;1;0;0;0;0 -4611;de mauvais augure;negative;0;1;0;0;0;0 -4612;de mauvais goût;negative;0;0;0;0;0;1 -4613;de mauvais qualité;negative;0;0;0;1;0;1 -4614;de mauvais réputation;negative;0;1;0;1;0;1 -4615;de même;positive;0;0;0;0;0;0 -4616;de mesure;positive;0;0;0;0;0;0 -4617;de moisir;negative;0;0;0;0;0;1 -4618;de montagne;positive;0;0;0;0;0;0 -4619;de notre jour;positive;0;0;0;0;0;0 -4620;de nouveau;positive;0;0;0;0;0;0 -4621;de plein air;positive;0;0;0;0;0;0 -4622;de poisson;negative;0;1;0;0;0;0 -4623;de précaution;positive;0;0;0;0;0;0 -4624;de premier choix;positive;0;0;0;0;0;0 -4625;de premier qualité;positive;1;0;0;0;0;0 -4626;de profil;negative;0;0;0;0;0;0 -4627;de qualité;positive;0;0;0;0;0;0 -4628;de rechange;positive;0;0;0;0;0;0 -4629;de représaille;negative;0;1;0;1;0;0 -4630;de rêve;positive;1;0;0;0;0;0 -4631;de saint;positive;0;0;0;0;1;0 -4632;de second main;negative;0;0;0;0;0;0 -4633;de son plein gré;positive;0;0;0;0;0;0 -4634;de soutien;positive;0;0;0;0;0;0 -4635;de sport;positive;0;0;0;0;0;0 -4636;de substitution;positive;0;0;0;0;0;0 -4637;de terre;positive;0;0;0;0;0;0 -4638;de titan;negative;0;1;0;0;0;0 -4639;de toujours;positive;0;0;0;0;0;0 -4640;de tout le jour;positive;0;0;0;0;0;0 -4641;de transition;positive;0;0;0;0;0;0 -4642;de travail;positive;0;0;0;0;0;0 -4643;de valeur;positive;0;0;0;0;0;0 -4644;de velours;positive;0;0;0;0;0;0 -4645;de vote;positive;0;0;0;0;0;0 -4646;de voyage;positive;1;0;0;0;0;0 -4647;dealer;negative;0;0;0;0;0;0 -4648;déambulation;negative;0;0;1;0;0;0 -4649;débâcle;negative;0;1;1;1;0;0 -4650;déballer;positive;0;0;0;0;0;0 -4651;débarquer;positive;0;0;0;0;0;0 -4652;débarras;negative;0;0;0;0;0;1 -4653;débarrasser;negative;0;0;1;1;0;0 -4654;débarrasser de;negative;0;0;1;0;0;0 -4655;débattre;positive;0;0;0;0;0;0 -4656;débauche;negative;0;1;0;0;0;1 -4657;débile;negative;0;0;0;1;0;1 -4658;débiliter;negative;0;0;0;1;0;1 -4659;débit;positive;0;0;0;0;0;0 -4660;débiter;positive;0;0;0;0;0;0 -4661;déblaiement;positive;0;0;0;0;0;0 -4662;déblayer|déblayer;positive;0;0;0;0;0;0 -4663;débloquer;negative;0;0;0;0;0;0 -4664;déboisement;positive;0;0;0;0;0;0 -4665;déboîter;negative;0;1;1;1;0;1 -4666;débordant;positive;0;0;0;0;0;0 -4667;débordement;negative;0;1;0;1;1;0 -4668;déboucher;positive;0;0;0;0;0;0 -4669;déboursement;positive;0;0;0;0;0;0 -4670;débourser;positive;0;0;0;0;0;0 -4671;débrancher;negative;0;0;1;0;0;0 -4672;débrayer|débrayer;positive;0;0;0;0;0;0 -4673;débris;negative;0;1;1;0;0;1 -4674;débuter;positive;0;0;0;0;0;0 -4675;décadence;negative;0;0;1;1;0;1 -4676;décalage;negative;0;0;1;0;0;0 -4677;décalquer;positive;0;0;0;0;0;0 -4678;décapage;negative;0;1;0;1;0;1 -4679;décapotable;positive;0;0;0;0;0;0 -4680;décapsuleur;positive;0;0;0;0;0;0 -4681;décéder;negative;0;0;1;0;0;0 -4682;décelable;positive;0;0;0;0;0;0 -4683;déceler;positive;0;0;0;0;0;0 -4684;décence;positive;0;0;0;0;0;0 -4685;décennie;positive;0;0;0;0;0;0 -4686;décent;positive;0;0;0;0;0;0 -4687;décentralisation;negative;0;0;0;0;0;0 -4688;décerner;positive;0;0;0;0;0;0 -4689;décevant;negative;0;0;1;1;1;1 -4690;déchaînement;negative;0;1;0;1;1;0 -4691;décharge;negative;0;0;0;0;0;1 -4692;décharger;negative;0;0;0;0;0;0 -4693;décharner;negative;0;1;1;0;0;1 -4694;déchet;negative;0;0;0;0;0;1 -4695;déchiffrer;positive;0;0;0;0;0;0 -4696;déchiqueter;negative;0;1;1;1;0;0 -4697;déchirer;negative;0;1;1;1;0;0 -4698;déchirure;negative;0;1;1;1;0;0 -4699;décidément;negative;0;0;0;0;0;0 -4700;décimal;positive;0;0;0;0;0;0 -4701;décimale;positive;0;0;0;0;0;0 -4702;décisif;positive;0;1;0;0;0;0 -4703;décision;positive;0;0;0;0;0;0 -4704;déclaration écrire sous sermen;positive;0;0;0;0;0;0 -4705;déclaration inexact;negative;0;0;0;1;0;1 -4706;déclaration officiel;positive;0;0;0;0;0;0 -4707;déclaratoire;positive;0;0;0;0;0;0 -4708;déclencher;negative;0;0;0;0;0;0 -4709;déclenchement;positive;0;0;0;0;0;0 -4710;déclic;positive;0;0;0;0;1;0 -4711;déclin;negative;0;1;1;0;0;0 -4712;décliner;negative;0;0;1;0;0;0 -4713;décolorant;negative;0;0;1;0;0;1 -4714;décoloration;negative;0;0;0;0;0;1 -4715;décolorer;negative;0;0;1;0;0;1 -4716;décomposer;negative;0;0;1;0;0;1 -4717;décomposition;negative;0;1;1;0;0;1 -4718;décompte;positive;0;0;0;0;0;0 -4719;déconcentrer;negative;0;0;0;1;0;0 -4720;déconcerter;negative;0;1;1;0;1;0 -4721;déconcertant;negative;0;1;1;0;1;0 -4722;déconnecter;negative;0;0;1;0;0;0 -4723;déconnexion;negative;0;0;1;0;0;0 -4724;décontraction;positive;1;0;0;0;0;0 -4725;décontracturant musculaire;positive;0;0;0;0;0;0 -4726;déconvenue;negative;0;0;1;1;1;1 -4727;décor;positive;0;0;0;0;0;0 -4728;décorateur;positive;0;0;0;0;0;0 -4729;décoration;positive;0;0;0;0;0;0 -4730;décorer;positive;0;0;0;0;0;0 -4731;décorum;positive;0;0;0;0;0;0 -4732;découpage;negative;0;1;1;1;0;1 -4733;découper en cube;negative;0;0;0;1;0;0 -4734;décourager;negative;0;1;1;0;0;0 -4735;décourageant;negative;0;0;1;0;0;0 -4736;découragement;negative;0;1;1;0;0;0 -4737;décours;negative;0;1;1;0;0;0 -4738;découdre;negative;0;1;1;0;0;0 -4739;découvrir;positive;0;0;0;0;0;0 -4740;découverte;positive;1;0;0;0;0;0 -4741;décrépit;negative;0;0;1;0;0;0 -4742;décréter;positive;0;0;0;0;0;0 -4743;décrier;negative;0;0;0;1;0;1 -4744;décrire;positive;0;0;0;0;0;0 -4745;décroiser;positive;0;0;0;0;0;0 -4746;décroître;negative;0;0;1;0;0;0 -4747;décroissant;negative;0;0;1;0;0;0 -4748;décuple;positive;0;0;0;0;0;0 -4749;dédaigner;negative;0;0;0;1;0;1 -4750;dédain;negative;0;1;1;1;0;1 -4751;dédale;negative;0;1;0;0;1;0 -4752;dédicace;positive;0;0;0;0;0;0 -4753;dédicacer;positive;0;0;0;0;0;0 -4754;dédier;positive;0;0;0;0;0;0 -4755;dédommagement;positive;0;0;0;0;0;0 -4756;dédommager;positive;0;0;0;0;1;0 -4757;déductif;positive;0;0;0;0;0;0 -4758;déduction;positive;0;0;0;0;0;0 -4759;déduire;positive;0;0;0;0;0;0 -4760;déesse;positive;0;0;0;0;0;0 -4761;défaillir;negative;0;1;1;1;0;0 -4762;défaite;negative;0;0;0;1;0;0 -4763;défaut de paiement;negative;0;1;1;0;0;0 -4764;défavorable;negative;0;1;1;1;0;1 -4765;défection;negative;0;1;0;0;0;1 -4766;défendre;positive;0;0;0;1;0;0 -4767;défense;positive;0;1;0;1;0;0 -4768;défenseur;positive;0;0;0;0;0;0 -4769;déférence;positive;0;0;0;0;0;0 -4770;déferlant;negative;0;0;0;0;0;0 -4771;défi;negative;0;1;0;1;0;1 -4772;déficit;negative;0;1;1;0;0;0 -4773;défier;negative;0;1;1;1;1;0 -4774;défigurer;negative;0;1;1;1;0;1 -4775;défiler;positive;0;1;0;0;1;0 -4776;définir;positive;0;0;0;0;0;0 -4777;définitif;positive;0;0;0;0;0;0 -4778;définition;positive;0;0;0;0;0;0 -4779;déflation;negative;0;1;0;0;0;0 -4780;defloration;positive;0;0;0;0;0;0 -4781;défloration;positive;0;0;0;0;0;0 -4782;défoncer;negative;0;0;0;0;0;1 -4783;déformation;negative;0;1;1;1;0;1 -4784;déformer;negative;0;0;1;1;0;1 -4785;défrichement;positive;0;0;0;0;0;0 -4786;défunt;negative;0;0;1;0;0;0 -4787;dégager;positive;0;0;0;0;0;0 -4788;dégectueuses;negative;0;0;1;0;0;1 -4789;dégel;negative;0;1;0;0;0;0 -4790;dégeler;negative;0;1;0;0;0;0 -4791;dégénérescence;negative;0;0;1;1;0;1 -4792;dégingander;negative;0;0;1;0;0;1 -4793;dégoût;negative;0;1;1;1;0;1 -4794;dégoûtant;negative;0;1;0;1;0;1 -4795;dégonfler;negative;0;0;1;0;0;0 -4796;dégonflement;negative;0;1;0;0;0;0 -4797;dégoût;negative;0;1;0;1;0;1 -4798;dégoûtane;negative;0;0;0;0;0;1 -4799;dégoûter;negative;0;0;0;0;0;1 -4800;dégoûtant;negative;0;1;0;1;0;1 -4801;dégrader;negative;0;1;1;0;0;1 -4802;dégradant;negative;0;1;1;0;0;1 -4803;dégradation;negative;0;1;1;0;0;1 -4804;degré;positive;0;0;0;0;0;0 -4805;dégueuler;negative;0;0;0;0;0;1 -4806;déguiser;negative;0;0;0;0;0;0 -4807;déguisement;negative;0;0;0;0;0;0 -4808;dégustation;positive;0;0;0;0;0;0 -4809;déjeuner;positive;0;0;0;0;0;0 -4810;déjouer;negative;0;0;1;0;0;0 -4811;délaisser;negative;0;1;1;1;0;1 -4812;délaissement;negative;0;1;1;1;0;0 -4813;délectable;positive;1;0;0;0;0;0 -4814;délecter;positive;1;0;0;0;0;0 -4815;délégation;positive;0;0;0;0;0;0 -4816;délétère;negative;0;1;1;1;0;1 -4817;délibérer;positive;0;0;0;0;0;0 -4818;délibérant;positive;0;0;0;0;0;0 -4819;délibératif;positive;0;0;0;0;0;0 -4820;délibération;positive;0;0;0;0;0;0 -4821;délicatement;positive;0;0;0;0;0;0 -4822;délictuel;negative;0;0;0;1;0;1 -4823;délictuelle;negative;0;0;0;1;0;1 -4824;délictuelles;negative;0;0;0;1;0;1 -4825;délictuels;negative;0;0;0;1;0;1 -4826;délimitation;positive;0;0;0;0;0;0 -4827;délimiter;positive;0;0;0;0;0;0 -4828;délinquance;negative;0;1;0;1;0;1 -4829;délire;negative;0;1;1;1;0;1 -4830;délit;negative;0;1;1;1;0;1 -4831;délivrance;positive;0;0;0;0;0;0 -4832;déloger;negative;0;0;0;0;0;0 -4833;déloyal;negative;0;1;0;1;0;1 -4834;delta;positive;0;0;0;0;0;0 -4835;déluge;negative;0;1;1;0;1;0 -4836;demande reconventionnel;positive;0;0;0;0;0;0 -4837;demander;negative;0;0;0;1;0;0 -4838;demandeur;positive;0;0;0;0;0;0 -4839;démangeaison;negative;0;0;0;1;1;0 -4840;démanger;negative;0;0;0;1;1;0 -4841;démarche;positive;0;0;0;0;0;0 -4842;démarche arrogant;negative;0;0;0;0;0;0 -4843;démarrer;positive;0;0;0;0;0;0 -4844;démasquer;positive;0;1;0;0;1;0 -4845;démêler;negative;0;0;0;1;0;0 -4846;démembrement;negative;0;1;1;0;0;1 -4847;déménagement;negative;0;0;0;0;0;0 -4848;démentir;negative;0;0;0;1;0;0 -4849;demeurer;positive;0;0;0;0;0;0 -4850;demi;negative;0;0;0;0;0;0 -4851;demi|demie;negative;0;0;0;0;0;0 -4852;démission;negative;0;0;1;0;1;0 -4853;démo;positive;0;0;0;0;0;0 -4854;démocrate;positive;0;0;0;0;0;0 -4855;démocratie;positive;0;0;0;0;0;0 -4856;démoder;negative;0;0;0;0;0;1 -4857;demoiselle d honneur;positive;0;0;0;0;0;0 -4858;démolition;negative;0;0;0;1;0;0 -4859;démoniaque;negative;0;1;1;1;0;1 -4860;démonstratif;positive;0;0;1;0;0;0 -4861;démonstration;positive;0;0;0;0;0;0 -4862;démontrable;positive;0;0;0;0;0;0 -4863;démontrer;positive;0;0;0;0;0;0 -4864;démoraliser;negative;0;1;1;0;0;0 -4865;démunir;negative;0;0;1;0;0;0 -4866;dénaturer;negative;0;0;0;1;0;1 -4867;déni;negative;0;0;0;1;0;0 -4868;dénier;negative;0;0;1;1;0;0 -4869;dénigrement;negative;0;1;1;1;0;1 -4870;dénigrer;negative;0;0;1;1;0;1 -4871;dénominateur;positive;0;0;0;0;0;0 -4872;dénomination;positive;0;0;0;0;0;0 -4873;dénoncer;negative;0;0;0;1;0;1 -4874;dénonciation;negative;0;1;0;1;0;1 -4875;dénouer;negative;0;0;0;0;0;0 -4876;dénoyauter;negative;0;1;1;0;0;0 -4877;denrée;positive;0;0;0;0;0;0 -4878;dense;positive;0;0;0;0;0;0 -4879;densité;positive;0;0;0;0;0;0 -4880;dent;negative;0;1;0;0;0;0 -4881;denté;negative;0;1;1;1;0;0 -4882;dentée;negative;0;1;1;1;0;0 -4883;dentelle;positive;0;1;1;1;0;0 -4884;dentisterie;positive;0;1;0;0;0;0 -4885;dénuder;negative;0;1;1;1;0;1 -4886;déodorant;positive;0;0;0;0;0;0 -4887;dépassant;positive;0;0;0;0;1;0 -4888;dépasser;negative;0;0;1;0;0;1 -4889;dépêcher;positive;0;0;0;0;0;0 -4890;dépeigner|dépeindre;positive;0;0;0;0;0;0 -4891;dépeindre;positive;0;0;0;0;0;0 -4892;dépendant;negative;0;0;0;0;0;0 -4893;dépendre;negative;0;0;0;0;0;0 -4894;dépense;negative;0;1;0;0;0;0 -4895;dépenser;negative;0;0;0;0;0;0 -4896;dépit;negative;0;0;1;1;0;1 -4897;déplaisant;negative;0;0;1;0;0;1 -4898;dépliant;positive;0;0;0;0;0;0 -4899;déplier;positive;0;0;0;0;0;0 -4900;déplorable;negative;0;1;1;1;0;1 -4901;déplorer;negative;0;0;1;1;0;1 -4902;déployer;positive;0;0;0;0;0;0 -4903;déporter;negative;0;1;1;1;1;0 -4904;dépositaire;positive;0;0;0;0;0;0 -4905;déposition;positive;0;0;0;0;0;0 -4906;déposséder;negative;0;1;1;1;0;0 -4907;dépôt de bilan;negative;0;0;1;0;0;0 -4908;dépôt visqueux;negative;0;0;0;0;0;1 -4909;dépourvu;negative;0;1;1;0;0;0 -4910;dépourvu de qch;negative;0;0;1;0;0;0 -4911;dépourvu de sen|sens;negative;0;0;1;0;0;0 -4912;dépourvue de sen|sens;negative;0;0;1;0;0;0 -4913;dépourvues de sen|sens;negative;0;0;1;0;0;0 -4914;dépouvus de sen|sens;negative;0;0;1;0;0;0 -4915;dépravation;negative;0;0;0;1;0;1 -4916;dépraver;negative;0;1;1;1;0;1 -4917;dépréciation;negative;0;1;1;0;0;0 -4918;dépression;negative;0;1;1;0;0;0 -4919;dépréssives;negative;0;1;1;0;0;0 -4920;déprimant;negative;0;0;1;0;0;1 -4921;déprime;negative;0;1;1;0;0;0 -4922;déprimer;negative;0;1;1;1;0;0 -4923;dérailler;negative;0;1;0;0;1;0 -4924;déraisonnable;negative;0;1;0;0;0;1 -4925;dérangement;negative;0;1;1;1;1;0 -4926;dérapage;negative;0;1;1;1;0;0 -4927;déraper;negative;0;1;1;1;1;0 -4928;dérision;negative;0;0;1;1;0;1 -4929;dérisoire;negative;0;0;1;0;0;1 -4930;dérivation;negative;0;0;0;0;0;0 -4931;dérive;negative;0;1;0;0;0;0 -4932;dériver;negative;0;1;0;0;0;0 -4933;dermatologie;positive;0;0;0;0;0;0 -4934;dermatologue;positive;0;0;0;0;0;0 -4935;dermique;positive;0;0;0;0;0;0 -4936;dernier;negative;0;1;1;0;0;0 -4937;dérober;negative;0;1;1;1;1;0 -4938;déroger à;negative;0;1;1;0;0;0 -4939;dérouler;positive;0;0;0;0;0;0 -4940;déroutant;negative;0;1;1;0;1;0 -4941;déroute;negative;0;1;0;0;1;0 -4942;du cieux;positive;0;0;0;0;0;0 -4943;du tas de qch;positive;0;0;0;0;0;0 -4944;désactivation;negative;0;1;0;0;0;0 -4945;désactiver;negative;0;1;1;1;0;0 -4946;désaffecter;negative;0;0;1;1;0;0 -4947;désagréable;negative;0;0;1;0;0;1 -4948;désapprobation;negative;0;0;1;1;0;1 -4949;désapprouver;negative;0;0;1;1;0;1 -4950;désarmer;negative;0;1;1;0;0;0 -4951;désavantager;negative;0;0;1;0;0;0 -4952;désavouer;negative;0;0;0;1;0;1 -4953;descendance;positive;0;0;0;0;0;0 -4954;descendre directement de;positive;0;0;0;0;0;0 -4955;descente;negative;0;1;1;1;1;0 -4956;description;positive;0;0;0;0;0;0 -4957;désenchantement;negative;0;0;1;1;0;1 -4958;désengagement;negative;0;0;1;0;0;0 -4959;déséquilibrer;negative;0;1;1;0;0;0 -4960;désert;negative;0;1;1;1;0;1 -4961;déserter;negative;0;1;1;1;0;1 -4962;désertion;negative;0;1;1;0;0;0 -4963;désertique;negative;0;1;1;0;0;0 -4964;désespérer;negative;0;1;1;0;0;0 -4965;désespoir;negative;0;1;1;1;0;1 -4966;déshabiller;positive;0;0;0;0;0;0 -4967;désherbage;negative;0;0;0;0;0;1 -4968;désherber;negative;0;0;0;0;0;1 -4969;déshonorer;negative;0;1;1;1;0;1 -4970;déshydrater;negative;0;0;0;0;0;0 -4971;désignation;positive;0;0;0;0;0;0 -4972;désigner;positive;0;0;0;0;0;0 -4973;désillusion;negative;0;0;1;1;0;1 -4974;désincarner;negative;0;1;1;0;0;0 -4975;désinfectant;negative;0;0;0;0;0;1 -4976;désinfecter;negative;0;0;0;0;0;1 -4977;désinfection;positive;0;0;0;0;0;0 -4978;désinformation;negative;0;1;1;1;0;1 -4979;désintégration;negative;0;1;1;1;0;0 -4980;désintégrer;negative;0;1;1;1;0;1 -4981;désirabilité;positive;0;0;0;0;0;0 -4982;désirable;positive;0;0;0;0;0;0 -4983;désirer ardemment;positive;0;0;0;0;0;0 -4984;désireux;positive;0;0;0;0;0;0 -4985;désobéir;negative;0;0;0;1;0;1 -4986;désobéissance;negative;0;1;1;1;0;1 -4987;désobéissant;negative;0;1;0;1;0;0 -4988;désobliger;negative;0;1;1;1;0;1 -4989;désobligeant;negative;0;1;1;1;0;1 -4990;désolation;negative;0;1;1;0;0;0 -4991;désoler;negative;0;1;1;0;0;0 -4992;désopilant;positive;0;0;0;0;1;0 -4993;désordonner;negative;0;1;1;1;0;1 -4994;désorganiser;negative;0;1;1;0;0;0 -4995;désormais;positive;0;0;0;0;0;0 -4996;despotique;negative;0;1;1;0;0;0 -4997;despotisme;negative;0;1;1;1;0;1 -4998;dessécher;negative;0;0;0;0;0;0 -4999;dessein;positive;0;0;0;0;0;0 -5000;desserrage;positive;0;0;0;0;0;0 -5001;desserrer;positive;0;0;0;0;0;0 -5002;desserrement;positive;0;0;0;0;0;0 -5003;dessert;positive;0;0;0;0;0;0 -5004;dessin;positive;0;0;0;0;0;0 -5005;dessin animer;positive;0;0;0;0;0;0 -5006;dessiner;positive;0;0;0;0;0;0 -5007;dessinateur dessinateur;positive;0;0;0;0;0;0 -5008;dessinateur;positive;0;0;0;0;0;0 -5009;dessus de lit;positive;0;0;0;0;0;0 -5010;destinataire;positive;0;0;0;0;0;0 -5011;destination;positive;0;1;1;0;1;0 -5012;destiner;positive;0;0;0;0;0;0 -5013;destruction;negative;0;1;1;1;0;0 -5014;désuet;negative;0;0;0;0;0;1 -5015;désuétude;negative;0;1;1;0;0;0 -5016;détacher;positive;0;0;0;0;0;0 -5017;détachement;negative;0;1;1;0;0;0 -5018;détail;negative;0;0;0;0;0;0 -5019;détaillant;positive;0;0;0;0;0;0 -5020;détectable;positive;0;0;0;0;0;0 -5021;détectables;positive;0;0;0;0;0;0 -5022;détecter;positive;0;0;0;0;0;0 -5023;détecteur;positive;0;0;0;0;0;0 -5024;détection;positive;0;0;0;0;0;0 -5025;détective;positive;0;0;0;0;0;0 -5026;détendre;positive;0;0;0;0;0;0 -5027;détention;negative;0;1;1;1;0;0 -5028;détention préventif;negative;0;1;1;1;0;0 -5029;détergent;negative;0;0;0;0;0;1 -5030;détérioration;negative;0;1;1;1;0;1 -5031;détériorer;negative;0;0;1;0;0;1 -5032;déterminable;positive;0;0;0;0;0;0 -5033;détermination;positive;0;0;0;0;0;0 -5034;déterrer;negative;0;0;1;0;0;1 -5035;détestable;negative;0;0;1;1;0;1 -5036;détester;negative;0;0;0;1;0;1 -5037;détonateur;positive;0;0;0;0;0;0 -5038;détour;negative;0;0;0;0;0;0 -5039;détournement;negative;0;1;0;0;0;0 -5040;détournement de fond|fonds;negative;0;0;0;1;0;1 -5041;détremper;negative;0;0;1;0;0;1 -5042;détriment;negative;0;1;1;1;0;0 -5043;détritus;negative;0;0;0;0;0;1 -5044;détroit;positive;0;0;0;0;0;0 -5045;détruire;negative;0;1;1;1;0;0 -5046;dette;negative;0;0;1;0;0;0 -5047;deuil;negative;0;0;1;0;0;0 -5048;deuxième année;positive;0;0;0;0;0;0 -5049;dévaloriser;negative;0;1;1;1;0;1 -5050;devanture;positive;0;0;0;0;0;0 -5051;dévastation;negative;0;1;1;1;1;0 -5052;dévaster;negative;0;1;1;1;0;0 -5053;développer;positive;0;0;0;0;0;0 -5054;développement;positive;0;0;0;0;0;0 -5055;devenir;positive;0;0;0;0;0;0 -5056;devenir ami avec;positive;0;0;0;0;0;0 -5057;devenir trop grand;negative;0;0;0;0;0;0 -5058;déverrouiller;positive;0;0;0;0;0;0 -5059;dévier;negative;0;1;0;0;0;0 -5060;deviner;positive;0;0;0;0;1;0 -5061;devinette;positive;0;0;0;0;1;0 -5062;devis;positive;0;0;0;0;0;0 -5063;devise;positive;0;0;0;0;0;0 -5064;dévoilement;positive;0;0;0;0;0;0 -5065;devoir;positive;0;0;0;0;0;0 -5066;dévorer;negative;0;0;0;1;0;0 -5067;dévot;positive;0;0;0;0;0;0 -5068;dévotion;positive;0;0;0;0;0;0 -5069;dévouer;positive;0;0;0;0;0;0 -5070;dévouement;positive;0;0;0;0;0;0 -5071;dextérité;positive;0;0;0;0;0;0 -5072;dextrose;positive;0;0;0;0;0;0 -5073;diable;negative;0;1;1;1;0;1 -5074;diabolique;negative;0;1;1;1;0;1 -5075;diacre;positive;0;0;0;0;0;0 -5076;diadème;positive;0;0;0;0;0;0 -5077;diagnostic;positive;0;1;0;0;1;0 -5078;diagnostique;positive;0;0;0;0;0;0 -5079;diagramme;positive;0;0;0;0;0;0 -5080;diagramme circulaire;positive;0;0;0;0;0;0 -5081;dialecte;positive;0;0;0;0;0;0 -5082;dialectique;positive;0;0;0;0;0;0 -5083;dialoguer;positive;0;0;0;0;0;0 -5084;dialogue;positive;0;0;0;0;0;0 -5085;diamant;positive;1;0;0;0;0;0 -5086;diamant solitiare;positive;0;0;0;0;0;0 -5087;diamètre;positive;0;0;0;0;0;0 -5088;diaphragme;positive;0;0;0;0;0;0 -5089;diapositive;negative;0;1;0;0;0;0 -5090;diarrhée;negative;0;0;0;0;0;1 -5091;diatribe;negative;0;0;1;1;0;1 -5092;dichotomie;positive;0;0;0;0;0;0 -5093;dichotomique;positive;0;0;0;0;0;0 -5094;dictatorial;negative;0;1;1;1;0;0 -5095;dictature;negative;0;1;1;1;0;1 -5096;dicter;positive;0;0;0;0;0;0 -5097;diction;positive;0;0;0;0;0;0 -5098;dictionnaire;positive;0;0;0;0;0;0 -5099;dictionnaire du synonyme;positive;0;0;0;0;0;0 -5100;dicton;positive;0;0;0;0;0;0 -5101;didactique;positive;0;0;0;0;0;0 -5102;diète;negative;0;0;0;0;0;0 -5103;diététique;positive;0;0;0;0;0;0 -5104;dieu;positive;0;1;0;0;0;0 -5105;différer;negative;0;0;1;0;0;0 -5106;différemment;positive;0;0;0;0;1;0 -5107;différence;negative;0;0;0;0;0;0 -5108;différenciation;negative;0;0;0;0;0;0 -5109;différencier;negative;0;0;0;0;0;0 -5110;différent;negative;0;0;0;0;0;0 -5111;diffus;positive;0;0;0;0;0;0 -5112;digérer;positive;0;0;0;0;0;0 -5113;digestion;positive;0;0;0;0;0;0 -5114;digne;positive;0;0;0;0;0;0 -5115;digne de confiance;negative;0;1;0;0;1;0 -5116;dignité;positive;0;0;0;0;0;0 -5117;digresser;negative;0;1;0;1;0;0 -5118;dilatation;negative;0;0;0;0;0;1 -5119;dilater;negative;0;0;0;0;0;0 -5120;dilemme;negative;0;1;1;1;0;0 -5121;diligence;positive;0;0;0;0;0;0 -5122;diluer;positive;0;0;0;0;0;0 -5123;dilution;positive;0;0;0;0;0;0 -5124;dîme;negative;0;0;0;0;0;0 -5125;dimension;positive;0;0;0;0;0;0 -5126;diminuer progressivement;negative;0;1;1;0;0;0 -5127;diminutif;positive;0;0;0;0;0;0 -5128;dîner;positive;0;0;0;0;0;0 -5129;dinosaure;negative;0;1;0;0;0;0 -5130;diocésain;positive;0;0;0;0;0;0 -5131;diocèse;positive;0;0;0;0;0;0 -5132;diorama;positive;0;0;0;0;0;0 -5133;diplomate;positive;0;0;0;0;0;0 -5134;diplomatie;positive;0;0;0;0;0;0 -5135;diplomatique;positive;0;0;0;0;0;0 -5136;diplôme;positive;1;0;0;0;0;0 -5137;directeur;positive;0;0;0;0;0;0 -5138;direction;positive;0;0;0;0;0;0 -5139;directeur|directrice;positive;0;0;0;0;0;0 -5140;diriger;positive;0;0;0;0;0;0 -5141;dirigeable;positive;0;0;0;0;0;0 -5142;dirofilariose;negative;0;0;0;0;0;1 -5143;disc jockey;positive;0;0;0;0;0;0 -5144;discernable;positive;0;0;0;0;0;0 -5145;discernement;positive;0;0;0;0;0;0 -5146;discerner;positive;0;0;0;0;0;0 -5147;disciple;positive;0;0;0;0;0;0 -5148;disciplinaire;negative;0;1;1;0;0;0 -5149;discipline;negative;0;1;0;0;0;0 -5150;discontinu;negative;0;0;0;0;0;0 -5151;discontinuité;negative;0;1;1;0;0;1 -5152;discorder;negative;0;1;1;0;0;0 -5153;discordant;negative;0;1;1;0;0;0 -5154;discorde;negative;0;0;0;1;0;1 -5155;discourir;positive;0;0;0;0;0;0 -5156;discours;positive;0;0;0;0;0;0 -5157;discrédit;negative;0;0;1;0;0;1 -5158;discréditer;negative;0;0;0;1;0;1 -5159;discrétion;positive;0;0;0;0;1;0 -5160;discrétionnaire;negative;0;0;0;0;0;0 -5161;discrimination;negative;0;1;1;1;0;1 -5162;discriminatoire;negative;0;0;1;1;0;1 -5163;discriminer;negative;0;0;1;1;0;1 -5164;disculper;positive;0;0;0;0;0;0 -5165;discussion;positive;0;0;0;0;0;0 -5166;discutable;negative;0;1;0;1;0;1 -5167;discuter;positive;0;0;0;0;0;0 -5168;disgrâce;negative;0;1;1;1;0;1 -5169;disgracier;negative;0;1;1;1;0;1 -5170;disjoindre;negative;0;0;0;0;0;0 -5171;disjonctif;negative;0;0;0;0;1;0 -5172;dislocation;negative;0;1;0;0;1;0 -5173;disloquer;negative;0;1;1;1;0;1 -5174;disparaître;negative;0;1;0;0;0;0 -5175;disparate;negative;0;0;0;0;0;0 -5176;disparité;negative;0;0;1;1;0;1 -5177;disparition;negative;0;1;0;0;0;0 -5178;dispense;positive;0;0;0;0;0;0 -5179;dispenser;positive;0;0;0;0;0;0 -5180;disperser;positive;0;0;0;0;0;0 -5181;disponible;positive;1;0;0;0;0;0 -5182;disposer;positive;0;0;0;0;0;0 -5183;dispositif;positive;0;0;0;0;0;0 -5184;disposition;positive;0;0;0;0;0;0 -5185;disqualification;negative;0;0;1;0;0;0 -5186;disqualifier;negative;0;0;1;1;0;1 -5187;disque;positive;0;0;0;0;0;0 -5188;disquette;positive;0;0;0;0;0;0 -5189;dissection;negative;0;0;0;0;0;1 -5190;dissemblable;negative;0;0;0;0;0;0 -5191;dissémination;positive;0;0;0;0;0;0 -5192;disséminer;positive;0;0;0;0;0;0 -5193;dissension;negative;0;0;0;1;0;0 -5194;disséquer;negative;0;0;0;0;0;1 -5195;dissertation;positive;0;0;0;0;0;0 -5196;dissimulation;negative;0;1;1;1;0;0 -5197;dissiper;negative;0;0;0;0;0;0 -5198;dissipéees;negative;0;0;0;0;0;0 -5199;dissociation;negative;0;0;0;0;0;0 -5200;dissolution;negative;0;1;1;1;1;0 -5201;dissolvant;positive;0;0;0;0;0;0 -5202;dissonance;negative;0;0;0;1;0;0 -5203;dissoner;negative;0;1;0;1;0;0 -5204;dissoudre;negative;0;0;0;0;0;0 -5205;dissuader;negative;0;1;1;0;0;0 -5206;distal;positive;0;0;0;0;0;0 -5207;distance;negative;0;0;0;0;0;0 -5208;distanlointains;negative;0;0;1;0;0;0 -5209;distant;negative;0;1;1;0;0;0 -5210;distantsdistante;negative;0;0;1;0;0;0 -5211;distillat;positive;0;0;0;0;0;0 -5212;distillation;positive;0;0;0;0;0;0 -5213;distiller;positive;0;0;0;0;0;0 -5214;distinct;positive;0;0;0;0;0;0 -5215;distorsion;negative;0;0;0;0;0;0 -5216;distraire;negative;0;0;0;0;0;0 -5217;distribution;positive;0;0;0;0;0;0 -5218;district;positive;0;0;0;0;0;0 -5219;diurne;positive;0;0;0;0;0;0 -5220;divan;positive;0;0;1;0;0;0 -5221;divergence;negative;0;0;0;0;0;0 -5222;divergent;negative;0;0;0;1;1;0 -5223;diverger;negative;0;0;0;0;0;0 -5224;divers;positive;0;0;0;0;0;0 -5225;diversifier;positive;0;0;0;0;0;0 -5226;diversion;positive;0;0;0;0;1;0 -5227;diversité;positive;0;0;0;0;0;0 -5228;divertissant;positive;1;0;0;0;0;0 -5229;divertissement;positive;0;0;0;0;1;0 -5230;dividende;positive;0;0;0;0;0;0 -5231;divination;positive;0;0;0;0;0;0 -5232;divinité;positive;0;1;0;0;0;0 -5233;diviser;negative;0;0;0;0;0;0 -5234;diviser en zone;positive;0;0;0;0;0;0 -5235;diviseur;negative;0;0;0;0;0;0 -5236;divisible;negative;0;0;0;0;0;0 -5237;division;negative;0;0;1;1;0;0 -5238;divulguer;positive;0;0;0;0;0;0 -5239;dix;positive;0;0;0;0;0;0 -5240;dixième;positive;0;0;0;0;0;0 -5241;dlibérée;positive;0;0;0;0;0;0 -5242;docile;positive;0;0;1;0;0;0 -5243;docilement;positive;0;0;0;0;0;0 -5244;dock;positive;0;0;0;0;0;0 -5245;docteur;positive;0;0;0;0;0;0 -5246;doctrinal;negative;0;1;0;0;0;0 -5247;doctrine;positive;0;0;0;0;0;0 -5248;document;positive;0;0;0;0;0;0 -5249;documentaire;positive;0;0;0;0;0;0 -5250;documentaliste;positive;0;0;0;0;0;0 -5251;documenter;positive;0;0;0;0;0;0 -5252;dodu;negative;0;0;0;0;0;1 -5253;dogmatique;negative;0;0;0;0;0;0 -5254;dogme;positive;0;0;0;0;0;0 -5255;doigt;positive;0;0;0;0;0;0 -5256;doigt de pied;negative;0;0;0;0;0;1 -5257;doigter;positive;0;0;0;0;0;0 -5258;doléance;negative;0;0;1;1;0;1 -5259;dollar;positive;0;0;0;0;0;0 -5260;domaine;positive;0;0;0;0;0;0 -5261;dôme;positive;0;0;0;0;0;0 -5262;domestication;positive;0;0;0;0;0;0 -5263;domestiquer;positive;0;0;0;0;0;0 -5264;domicile;positive;0;0;0;0;0;0 -5265;domicilier;positive;0;0;0;0;0;0 -5266;dominance;negative;0;1;0;0;0;0 -5267;dominer;negative;0;1;0;1;0;0 -5268;dominant;negative;0;1;0;0;0;0 -5269;dominante;negative;0;1;0;0;0;0 -5270;domination;negative;0;1;1;1;0;0 -5271;dominion;negative;0;1;0;0;0;0 -5272;domino;negative;0;1;0;0;0;0 -5273;dommage;negative;0;1;1;1;0;1 -5274;dommage et intérêt;negative;0;0;1;0;0;0 -5275;domptage;positive;0;0;0;0;0;0 -5276;dompter;positive;0;0;0;0;0;0 -5277;don;positive;0;0;0;0;1;0 -5278;don du ciel;positive;0;0;0;0;1;0 -5279;donation;positive;1;0;0;0;0;0 -5280;donjon;negative;0;1;1;0;0;0 -5281;donner;positive;0;0;0;0;0;0 -5282;donnée;positive;0;0;0;0;0;0 -5283;donner qch à qqn;positive;0;0;0;0;0;0 -5284;donner du coup de bec;negative;0;0;0;1;0;0 -5285;donner du coup de canne à;negative;0;1;0;1;0;0 -5286;donner du cour|cours particulier;positive;0;0;0;0;0;0 -5287;donner naissance à;positive;0;0;0;0;0;0 -5288;donner suite;positive;0;0;0;0;0;0 -5289;donner un coup de coude;negative;0;0;0;1;0;0 -5290;donner un coup de couteau à;negative;0;1;1;1;1;0 -5291;donner un coup de pied;negative;0;0;0;1;0;0 -5292;donner un coup de pied dans;positive;0;0;0;0;0;0 -5293;donner un coup de poing;negative;0;1;1;1;1;0 -5294;donner un coup de tête;negative;0;1;0;1;1;0 -5295;donner un petit coup de coude;positive;0;0;0;0;0;0 -5296;donner un pourboire à;positive;0;0;0;0;0;0 -5297;donner un fessée à;negative;0;1;1;1;0;0 -5298;dont on se souvenir;positive;0;0;0;0;0;0 -5299;dorer;positive;0;0;0;0;0;0 -5300;dorénavant;positive;0;0;0;0;0;0 -5301;dorloter;positive;1;0;0;0;0;0 -5302;dormeur;positive;0;0;0;0;0;0 -5303;dormir;positive;0;0;0;0;0;0 -5304;dorsal;positive;0;0;0;0;0;0 -5305;dortoir;positive;0;0;0;0;0;0 -5306;dorure;positive;0;0;0;0;0;0 -5307;dos;positive;0;0;0;0;0;0 -5308;dos nu;negative;0;1;1;1;0;0 -5309;dose;positive;0;0;0;0;0;0 -5310;doser;positive;0;0;0;0;0;0 -5311;dossier;positive;0;0;0;0;0;0 -5312;dossier médical;positive;0;0;0;0;0;0 -5313;dot;positive;0;0;0;0;0;0 -5314;dotation;positive;0;0;0;0;0;0 -5315;doter;positive;1;0;0;0;0;0 -5316;doubler;positive;0;0;0;0;0;0 -5317;doublement;negative;0;0;1;0;0;0 -5318;double;positive;0;0;0;0;0;0 -5319;doublure;positive;0;0;0;0;0;0 -5320;doucement;positive;1;0;0;0;0;0 -5321;douceur;positive;1;0;0;0;0;0 -5322;douche;positive;0;0;0;0;0;0 -5323;douillet;positive;1;0;0;0;0;0 -5324;douleur vif;negative;0;1;1;0;1;0 -5325;douleur;negative;0;0;1;0;0;0 -5326;douloureusement;negative;0;0;1;0;0;0 -5327;douter;negative;0;1;0;0;0;0 -5328;doute;negative;0;1;1;0;0;0 -5329;douteux;negative;0;1;0;0;0;1 -5330;douve;negative;0;1;1;0;0;0 -5331;douzaine;positive;0;0;0;0;0;0 -5332;douze;positive;0;0;0;0;0;0 -5333;douzième;positive;0;0;0;0;0;0 -5334;dragon;negative;0;1;0;1;0;0 -5335;drague;negative;0;0;0;0;0;0 -5336;draguer;negative;0;0;0;0;0;0 -5337;drainage;negative;0;0;0;0;0;1 -5338;drainer;negative;0;0;0;0;0;0 -5339;dramatique;negative;0;1;1;0;1;0 -5340;dramaturge;positive;0;0;0;0;0;0 -5341;drame;negative;0;1;1;0;1;0 -5342;drap;positive;0;0;0;0;0;0 -5343;drapeau;positive;0;0;0;0;0;0 -5344;draper;positive;0;0;0;0;0;0 -5345;draperie;positive;0;0;0;0;0;0 -5346;drastique;negative;0;0;1;0;0;0 -5347;dresser;positive;0;0;0;0;0;0 -5348;dresser le bilan;positive;0;0;0;0;0;0 -5349;dresseur de cheval;positive;0;0;0;0;0;0 -5350;drogue;negative;0;0;1;0;0;1 -5351;droguer;negative;0;0;1;0;0;1 -5352;droit;positive;0;0;0;0;0;0 -5353;droit d auteur;positive;0;0;0;0;0;0 -5354;droit de naissance;positive;0;0;0;0;0;0 -5355;droit de visite;positive;0;0;0;0;0;0 -5356;droit|droite;positive;0;0;0;0;0;0 -5357;drôle;positive;1;0;0;0;0;0 -5358;drugstore;positive;0;0;0;0;0;0 -5359;druide;positive;0;0;0;0;0;0 -5360;du coin;positive;0;0;0;0;0;0 -5361;du congrès;positive;0;0;0;0;0;0 -5362;du gâteau;positive;1;0;0;0;0;0 -5363;du haut;positive;0;0;0;0;0;0 -5364;du moi|mois dernier;positive;0;0;0;0;0;0 -5365;du second degré;positive;0;0;0;0;0;0 -5366;dualisme;positive;0;0;0;0;0;0 -5367;dualité;positive;0;0;0;0;0;0 -5368;duaux;positive;0;0;0;0;0;0 -5369;dubotatives;negative;0;1;0;0;0;0 -5370;duc;positive;0;0;0;0;0;0 -5371;ductile;positive;0;0;0;0;0;0 -5372;dûe;negative;0;0;0;0;0;0 -5373;duel;negative;0;1;0;1;0;0 -5374;dûes;negative;0;0;0;0;0;0 -5375;dune;positive;0;0;0;0;0;0 -5376;duo;positive;1;0;0;0;0;0 -5377;duper;negative;0;1;1;0;0;1 -5378;dupe;negative;0;0;0;1;0;0 -5379;duplex;positive;0;0;0;0;0;0 -5380;duplicité;negative;0;0;0;1;0;0 -5381;dupliquer;positive;0;0;0;0;0;0 -5382;dur;negative;0;1;1;1;0;1 -5383;dur travail;negative;0;0;1;0;0;0 -5384;durabilité;positive;0;0;0;0;0;0 -5385;durable;positive;0;0;0;0;0;0 -5386;durcir;negative;0;1;0;1;0;1 -5387;durcissement;negative;0;0;1;1;0;0 -5388;dureté;negative;0;1;1;1;0;0 -5389;dûs;negative;0;0;0;0;0;0 -5390;duvet;positive;0;0;0;0;0;0 -5391;dynamique;positive;0;0;0;0;1;0 -5392;dynamite;negative;0;1;0;0;1;0 -5393;dynastie;positive;0;0;0;0;0;0 -5394;dysenterie;negative;0;1;1;0;0;1 -5395;dyspepsie;negative;0;0;0;0;0;1 -5396;eau;positive;0;0;0;0;0;0 -5397;eau de javel;negative;0;0;1;0;0;1 -5398;eau de mer;negative;0;0;0;0;0;1 -5399;eau fort;positive;0;0;0;0;0;0 -5400;eau usé;negative;0;0;0;0;0;1 -5401;ébat amoureux;positive;0;0;0;0;0;0 -5402;ébauche;positive;0;0;0;0;0;0 -5403;ébène;positive;0;0;0;0;0;0 -5404;éblouir;negative;0;1;0;1;0;0 -5405;éblouissant;negative;0;0;0;1;0;0 -5406;éblouissement;negative;0;1;0;1;0;0 -5407;ébranlage;negative;0;1;0;1;0;0 -5408;écaillage;negative;0;0;0;0;0;1 -5409;écaille;positive;0;0;0;0;0;0 -5410;écailleux;negative;0;0;0;0;0;1 -5411;écarlate;negative;0;1;0;1;1;0 -5412;écart;negative;0;1;1;0;1;0 -5413;écart de conduite;negative;0;1;0;0;0;0 -5414;écarteler;negative;0;1;1;0;0;1 -5415;écarter;negative;0;1;1;1;0;1 -5416;ecchymose;negative;0;1;1;0;0;0 -5417;ecclésiastique;positive;0;0;0;0;0;0 -5418;échafaud;negative;0;1;0;0;0;0 -5419;échafaudage;negative;0;1;0;0;0;0 -5420;échaffauder;positive;0;0;0;0;0;0 -5421;échalier;positive;0;0;0;0;0;0 -5422;échange;positive;0;0;0;0;0;0 -5423;échanger;positive;0;0;0;0;0;0 -5424;échantillon;positive;0;0;0;0;0;0 -5425;échapper;negative;0;1;0;1;0;0 -5426;échapper à;negative;0;1;0;0;0;0 -5427;écharde;negative;0;1;1;0;1;0 -5428;échasse;negative;0;1;0;0;0;0 -5429;échauffourée;negative;0;0;0;1;0;0 -5430;échéance;negative;0;1;0;0;0;1 -5431;échec|échecs;positive;0;0;0;0;0;0 -5432;échelle;positive;0;0;0;0;0;0 -5433;échelon;positive;0;0;0;0;0;0 -5434;écheveau;positive;0;0;0;0;0;0 -5435;échine;negative;0;0;0;0;0;0 -5436;echo;positive;0;0;0;0;0;0 -5437;écho;positive;0;0;0;0;0;0 -5438;échographie;positive;0;0;0;0;0;0 -5439;échouer;negative;0;1;1;0;0;0 -5440;éclabousser;negative;0;0;0;0;1;0 -5441;éclaboussure;negative;0;0;0;0;1;0 -5442;éclairage;positive;0;0;0;0;1;0 -5443;eclaircir;positive;1;0;0;0;0;0 -5444;éclaircir;positive;1;0;0;0;0;0 -5445;éclaircissement;positive;0;0;0;0;0;0 -5446;éclairer;positive;0;0;0;0;1;0 -5447;éclater;negative;0;1;0;0;1;0 -5448;éclectique;positive;0;0;0;0;0;0 -5449;eclipse;negative;0;1;0;0;0;0 -5450;éclipse;negative;0;1;0;0;0;0 -5451;éclipser;negative;0;1;1;0;0;0 -5452;écliptique;negative;0;1;0;0;0;0 -5453;éclisse;positive;0;0;0;0;0;0 -5454;éclisser;positive;0;0;0;0;0;0 -5455;écloper;negative;0;0;1;0;0;0 -5456;éclore;positive;0;0;0;0;0;0 -5457;écluse;positive;0;0;0;0;0;0 -5458;éc?urer;negative;0;1;1;1;0;1 -5459;éc?urant;negative;0;1;1;1;0;1 -5460;éc?urement;negative;0;1;1;1;0;1 -5461;école;positive;0;0;0;0;0;0 -5462;écolier;positive;0;0;0;0;0;0 -5463;écologique;positive;0;0;0;0;0;0 -5464;éconduire;negative;0;0;1;0;0;0 -5465;economie;positive;0;0;0;0;0;0 -5466;économie;positive;0;0;0;0;0;1 -5467;économique;positive;1;0;0;0;0;0 -5468;écorce;negative;0;1;0;1;0;1 -5469;écossais;positive;0;0;0;0;0;0 -5470;écouler;positive;0;0;0;0;0;0 -5471;écoulement de sang;negative;0;1;1;0;0;1 -5472;écourter;negative;0;1;0;1;1;0 -5473;écoute clandestin;negative;0;1;0;0;0;0 -5474;écouteur;positive;0;0;0;0;0;0 -5475;écouvillon;negative;0;0;0;0;0;1 -5476;écran;positive;0;0;0;0;0;0 -5477;écrasant;negative;0;1;1;1;0;1 -5478;écrémer;negative;0;0;0;0;0;0 -5479;écrevisse;negative;0;0;0;0;0;0 -5480;écrire;positive;0;0;0;0;0;0 -5481;écriture;positive;0;0;0;0;0;0 -5482;écriture saint;positive;0;0;0;0;0;0 -5483;écrivain;positive;0;0;0;0;0;0 -5484;écrivant;positive;0;0;0;0;0;0 -5485;écumer;negative;0;0;0;0;0;1 -5486;écumeux;negative;0;0;0;0;0;1 -5487;écureuil;positive;0;0;0;0;0;0 -5488;écurie;positive;0;0;0;0;0;0 -5489;édenter;negative;0;0;1;0;0;1 -5490;édification;positive;0;0;0;0;0;0 -5491;édifier;positive;0;0;0;0;0;0 -5492;édit;negative;0;1;0;0;0;0 -5493;éditer;positive;0;0;0;0;0;0 -5494;editeur;positive;0;0;0;0;0;0 -5495;edition;positive;0;0;0;0;0;0 -5496;édition;positive;0;0;0;0;0;0 -5497;editorial;positive;0;0;0;0;0;0 -5498;éditorial;positive;0;0;0;0;0;0 -5499;édredon;positive;1;0;0;0;0;0 -5500;éducatif;positive;0;0;0;0;0;0 -5501;éducation;positive;0;0;0;0;0;0 -5502;édulcorant;positive;0;0;0;0;0;0 -5503;éduquer;positive;0;0;0;0;0;0 -5504;eétouffants;negative;0;1;1;0;0;1 -5505;effaçage;negative;0;0;1;0;0;0 -5506;effacer;negative;0;1;1;1;0;0 -5507;effacement;negative;0;1;1;0;0;0 -5508;effarer;negative;0;1;0;0;1;1 -5509;effectuer;positive;0;0;0;0;0;0 -5510;effeminé;negative;0;0;0;0;0;0 -5511;efféminer;negative;0;0;0;0;0;0 -5512;effet;positive;0;0;0;0;0;0 -5513;effet personnel;positive;0;0;0;0;0;0 -5514;efficace;positive;0;0;0;0;0;0 -5515;efficacement;positive;0;0;0;0;0;0 -5516;efficacité;positive;0;0;0;0;0;0 -5517;effigie;positive;0;0;0;1;0;0 -5518;effilage;positive;0;0;0;0;0;0 -5519;effiler;positive;0;0;0;0;0;0 -5520;effilocher;negative;0;0;1;0;0;1 -5521;effondrement;negative;0;1;1;0;1;1 -5522;effort;positive;0;0;0;0;0;0 -5523;effrayant;negative;0;1;1;1;1;0 -5524;effroi;negative;0;1;0;0;1;0 -5525;effronté;negative;0;0;0;1;0;1 -5526;effronterie;positive;0;0;0;0;0;0 -5527;effusion;negative;0;0;0;0;0;0 -5528;égal;positive;0;0;0;0;0;0 -5529;également;positive;0;0;0;0;0;0 -5530;égalisation;positive;0;0;0;0;0;0 -5531;égaliser;positive;0;0;0;0;0;0 -5532;égalité;positive;0;0;0;0;0;0 -5533;égard;positive;0;0;0;0;0;0 -5534;égérie;positive;0;0;0;0;0;0 -5535;égide;positive;0;0;0;0;0;0 -5536;église;positive;0;0;0;0;0;0 -5537;ego;negative;0;0;0;0;0;0 -5538;égocentrique;negative;0;0;0;1;0;1 -5539;égoïsme;negative;0;0;0;1;0;1 -5540;égoïste;negative;0;0;0;1;0;1 -5541;égout;negative;0;0;0;0;0;1 -5542;égouttement;negative;0;0;0;0;0;0 -5543;égratigner;negative;0;1;1;0;0;0 -5544;égratignure;negative;0;1;1;1;1;0 -5545;éhonté;negative;0;0;0;1;0;1 -5546;éjaculation;positive;0;0;0;0;1;0 -5547;éjaculer;positive;1;0;0;0;0;0 -5548;éjecter;negative;0;1;1;1;0;0 -5549;éjection;negative;0;1;1;1;1;0 -5550;élaboration;positive;0;0;0;0;0;0 -5551;élaborer;positive;0;0;0;0;0;0 -5552;élaguer;negative;0;0;0;0;0;0 -5553;élargir;positive;0;0;0;0;0;0 -5554;élargissement;negative;0;0;0;0;0;0 -5555;élasticité;positive;0;0;0;0;0;0 -5556;élastique;positive;0;0;0;0;0;0 -5557;élection;positive;0;0;0;0;0;0 -5558;élection primaire;positive;0;0;0;0;0;0 -5559;électorat;positive;0;0;0;0;0;0 -5560;électricité;positive;0;0;0;0;0;0 -5561;électrique;positive;0;0;0;0;1;0 -5562;élégance;positive;0;0;0;0;0;0 -5563;élégant;positive;0;0;0;0;0;1 -5564;élément;positive;0;0;0;0;0;0 -5565;élément vital;positive;0;0;0;0;0;0 -5566;élevage;positive;0;0;0;0;0;0 -5567;élévation;positive;0;1;0;0;0;0 -5568;élève;positive;0;0;0;0;0;0 -5569;élever;positive;0;0;0;0;0;0 -5570;élève de terminal;positive;0;0;0;0;0;0 -5571;élève officier;positive;0;0;0;0;0;0 -5572;eleveur;positive;0;0;0;0;0;0 -5573;elfe;positive;0;1;0;1;0;1 -5574;éligible;positive;0;0;0;0;0;0 -5575;élimination;negative;0;1;1;1;0;1 -5576;éliminer;negative;0;1;0;1;1;0 -5577;élingue;negative;0;1;0;1;0;0 -5578;élinguer;negative;0;1;0;1;0;0 -5579;élire;positive;0;0;0;0;0;0 -5580;ellipse;positive;0;0;0;0;0;0 -5581;ellipsoïdal;positive;0;0;0;0;0;0 -5582;ellipsoïde;positive;0;0;0;0;0;0 -5583;elliptique;positive;0;0;0;0;0;0 -5584;éloge;positive;0;0;0;0;0;0 -5585;éloge funèbre;negative;0;0;1;0;0;0 -5586;éloigner;negative;0;0;1;0;0;0 -5587;éloignement;negative;0;0;1;0;0;0 -5588;éloquence;positive;0;0;0;0;0;0 -5589;éloquent;positive;0;0;0;0;0;0 -5590;élucidation;positive;0;0;0;0;0;0 -5591;élucider;positive;0;0;0;0;0;0 -5592;éluder;negative;0;1;0;0;0;1 -5593;émacier;negative;0;1;1;0;0;1 -5594;émail;positive;0;0;0;0;0;0 -5595;émancipation;positive;1;0;0;0;0;0 -5596;émaner;positive;0;0;0;0;0;0 -5597;emballage;positive;0;0;0;0;0;0 -5598;emballer;positive;0;0;0;0;0;0 -5599;embarassante;negative;0;1;0;0;0;0 -5600;embarassantes;negative;0;1;0;0;0;0 -5601;embarassants;negative;0;1;0;0;0;0 -5602;embarcadère;positive;0;0;0;0;0;0 -5603;embarcation;positive;0;0;0;0;0;0 -5604;embarder;negative;0;1;0;0;1;0 -5605;embargo;negative;0;0;0;1;0;0 -5606;embarquement;positive;0;0;0;0;0;0 -5607;embarquer;positive;0;0;0;0;0;0 -5608;embarquer de force;negative;0;1;0;1;0;1 -5609;embarras;negative;0;1;1;0;1;1 -5610;embaucher;positive;0;0;0;0;0;0 -5611;embellir;positive;1;0;0;0;0;0 -5612;embellissement;positive;0;0;0;0;0;0 -5613;embêter;negative;0;0;1;1;0;0 -5614;embêtement;negative;0;1;1;1;0;0 -5615;emblématique;positive;0;0;0;0;0;0 -5616;emblème;positive;0;0;0;0;0;0 -5617;embolie;negative;0;1;1;0;0;0 -5618;embouchure;positive;0;0;0;0;0;0 -5619;embout;positive;0;0;0;0;0;0 -5620;embraser;negative;0;1;0;1;1;0 -5621;embrasement;negative;0;1;0;1;0;0 -5622;embrasser;positive;0;0;0;0;1;0 -5623;embrayage;positive;0;0;0;0;0;0 -5624;embrocher;negative;0;1;0;0;0;0 -5625;embrouiller;negative;0;0;0;0;0;0 -5626;embryon;positive;0;0;0;0;0;0 -5627;embuer;negative;0;1;1;0;0;0 -5628;embuscade;negative;0;1;0;1;1;0 -5629;émécher;negative;0;0;0;0;0;1 -5630;emeraude;positive;0;0;0;0;0;0 -5631;émeraude;positive;0;0;0;0;0;0 -5632;émergence;positive;0;0;0;0;0;0 -5633;émerger;positive;0;0;0;0;1;0 -5634;émérite;positive;0;0;0;0;0;0 -5635;émettre;positive;0;0;0;0;0;0 -5636;émeute;negative;0;1;0;1;0;0 -5637;émigration;negative;0;0;0;0;0;0 -5638;émigrer;negative;0;0;0;0;0;0 -5639;émincer;negative;0;1;0;0;0;0 -5640;éminemment;positive;0;0;0;0;0;0 -5641;eminence;positive;0;0;0;0;0;0 -5642;éminence;positive;0;0;0;0;0;0 -5643;emir;positive;0;0;0;0;0;0 -5644;émir;positive;0;0;0;0;0;0 -5645;émissaire;positive;0;0;0;0;0;0 -5646;emmêler;negative;0;1;0;1;0;0 -5647;émotionnel;positive;0;0;0;0;0;0 -5648;émousser;negative;0;1;0;1;0;0 -5649;empaqueter;positive;0;0;0;0;0;0 -5650;empaqueteur;positive;0;0;0;0;0;0 -5651;empathie;positive;0;0;0;0;0;0 -5652;empattement;positive;0;0;0;0;0;0 -5653;empêcher;negative;0;1;0;0;0;0 -5654;empereur;positive;0;0;0;0;0;0 -5655;empester;negative;0;0;0;0;0;1 -5656;empêtrer;negative;0;1;1;1;0;1 -5657;empétrés;negative;0;1;1;1;0;1 -5658;emphase;positive;0;0;0;0;0;0 -5659;emphatique;positive;0;0;0;0;0;0 -5660;empiétement;negative;0;1;1;1;0;0 -5661;empiètement;negative;0;1;1;1;0;0 -5662;empiéter;negative;0;1;1;1;0;0 -5663;empiler;negative;0;0;0;0;0;0 -5664;empire;positive;0;0;0;0;0;0 -5665;empirique;positive;0;0;0;0;0;0 -5666;empirisme;positive;0;0;0;0;0;0 -5667;emplacement;positive;0;0;0;0;0;0 -5668;emploi;positive;0;0;0;0;0;0 -5669;employer abusivement;negative;0;1;1;1;0;0 -5670;employeur;positive;0;0;0;0;0;0 -5671;empocher;positive;0;0;0;0;0;0 -5672;empoigner;negative;0;1;0;1;0;0 -5673;empreinte;positive;0;0;0;0;0;0 -5674;empreindre de pas;positive;0;0;0;0;0;0 -5675;empressement;positive;0;0;0;0;0;0 -5676;emprisonner;negative;0;1;1;1;0;1 -5677;emprisonnement;negative;0;1;1;1;0;1 -5678;emprunt;positive;0;0;0;0;0;0 -5679;emprunter;positive;0;0;0;0;0;0 -5680;émouvoir;positive;0;0;1;0;0;0 -5681;émuler;negative;0;0;0;0;0;0 -5682;émulsion;positive;0;0;0;0;0;0 -5683;en général;positive;0;0;0;0;0;0 -5684;en abondance;positive;1;0;0;0;0;0 -5685;en activité;positive;0;0;0;0;0;0 -5686;en agate;positive;0;0;0;0;0;0 -5687;en apesanteur;positive;0;0;0;0;0;0 -5688;en argent;positive;0;0;0;0;0;0 -5689;en arriérer;negative;0;1;0;0;0;1 -5690;en attente;negative;0;0;0;0;0;0 -5691;en avance;positive;0;0;0;0;0;0 -5692;en aveugle;negative;0;1;1;0;0;0 -5693;en baisse;negative;0;1;1;1;0;0 -5694;en bois;positive;0;0;0;0;0;0 -5695;en bon santé;positive;1;0;0;0;0;0 -5696;en caoutchouc;negative;0;0;0;0;0;0 -5697;en ce qui concerner;positive;0;0;0;0;0;0 -5698;en cela;positive;0;0;0;0;0;0 -5699;en chef;positive;0;0;0;0;0;0 -5700;en colère;negative;0;0;0;1;0;1 -5701;en colimaçon;positive;0;0;0;0;0;0 -5702;en colonne;positive;0;0;0;0;0;0 -5703;en continu;positive;0;0;0;0;0;0 -5704;en corrélation;positive;0;0;0;0;0;0 -5705;en couper;positive;0;0;0;0;0;0 -5706;en cour|cours;positive;0;0;0;0;0;0 -5707;en déclin;negative;0;0;1;0;0;0 -5708;en dent de scie;negative;0;1;1;1;0;0 -5709;en désaccord;negative;0;0;1;1;0;0 -5710;en descente;negative;0;1;0;0;0;0 -5711;en désordre;negative;0;1;1;1;0;1 -5712;en dessous;negative;0;0;0;0;0;0 -5713;en deuil;negative;0;0;1;0;0;0 -5714;en développement;positive;0;0;0;0;0;0 -5715;en douceur;positive;1;0;0;0;0;0 -5716;en épi;negative;0;1;0;0;0;0 -5717;en étain;positive;0;0;0;0;0;0 -5718;en évidence;positive;0;0;0;0;0;0 -5719;en éviter;negative;0;1;0;0;0;1 -5720;en fac similé;negative;0;0;0;0;0;0 -5721;en faillite;negative;0;1;1;0;0;0 -5722;en faire autant;positive;0;0;0;0;0;0 -5723;en feu;negative;0;1;0;1;0;0 -5724;en filigrane;positive;0;0;0;0;0;0 -5725;en fleur;positive;0;0;0;0;0;0 -5726;en former de cône;positive;0;0;0;0;0;0 -5727;en former de croître;positive;0;0;0;0;0;0 -5728;en fuite;negative;0;1;0;0;0;0 -5729;en furie;negative;0;1;0;1;0;1 -5730;en fusion;negative;0;1;0;0;0;0 -5731;en granite;positive;0;0;0;0;0;0 -5732;en haillon;negative;0;0;1;0;0;0 -5733;en hausse;positive;1;0;0;0;0;0 -5734;en haut;positive;0;0;0;0;0;0 -5735;en image;positive;0;0;0;0;0;0 -5736;en instance;positive;0;0;0;0;0;0 -5737;en jachère;negative;0;0;1;0;0;0 -5738;en lacet;negative;0;0;0;0;0;0 -5739;en laine;positive;0;0;0;0;0;0 -5740;en lambeau;negative;0;0;1;0;0;0 -5741;en larme;negative;0;1;1;0;0;1 -5742;en loque;negative;0;0;1;0;0;0 -5743;en marbre;positive;0;0;0;0;0;0 -5744;en mauvais santé;negative;0;1;1;0;0;1 -5745;en montée;positive;0;1;0;0;0;0 -5746;en morceau;negative;0;0;1;0;0;0 -5747;en mouvement;positive;0;0;1;0;0;0 -5748;en nickel;positive;0;0;0;0;0;0 -5749;en option;positive;0;0;0;0;0;0 -5750;en orbite;positive;0;0;0;0;0;0 -5751;en partie;negative;0;0;0;0;0;0 -5752;en peluche;positive;0;0;0;0;0;0 -5753;en pente;negative;0;1;0;0;0;0 -5754;en plein air;positive;0;0;0;0;0;0 -5755;en plein essor;positive;0;0;0;0;1;0 -5756;en plein forme;positive;1;0;0;0;0;0 -5757;en pleur|pleurs;negative;0;1;1;0;0;1 -5758;en plume;positive;0;0;0;0;0;0 -5759;en plus;positive;0;0;0;0;0;0 -5760;en poudre;negative;0;0;0;0;0;0 -5761;en privé;positive;0;0;0;0;0;0 -5762;en rafale;negative;0;1;0;0;1;0 -5763;en relief;positive;0;0;0;0;0;0 -5764;en retard;negative;0;1;1;1;1;0 -5765;en rotin;positive;0;0;0;0;0;0 -5766;en ruine;negative;0;1;1;1;0;1 -5767;en ruiner s;negative;0;0;1;0;0;1 -5768;en saillie;negative;0;1;0;0;1;0 -5769;en sang;negative;0;1;1;1;0;1 -5770;en satin;positive;0;0;0;0;0;0 -5771;en se battre;negative;0;0;0;1;0;0 -5772;en secret;negative;0;1;0;0;0;0 -5773;en série;positive;0;0;0;0;0;0 -5774;en silence;negative;0;0;0;0;0;0 -5775;en solitaire;negative;0;0;1;0;0;0 -5776;en sommeil;positive;0;0;0;0;0;0 -5777;en streaming;negative;0;0;0;0;0;0 -5778;en supposer que;negative;0;1;0;0;0;0 -5779;en surplus;negative;0;0;0;0;0;0 -5780;en suspens;positive;0;1;0;0;1;0 -5781;en synergie;positive;0;0;0;0;0;0 -5782;en terre;positive;0;0;0;0;0;0 -5783;en touffe;negative;0;0;0;0;0;1 -5784;en tout;positive;0;0;0;0;0;0 -5785;en train de mourir;negative;0;1;1;1;0;1 -5786;en très fort hausse;negative;0;1;0;0;1;0 -5787;en tripler;positive;0;0;0;0;0;0 -5788;en trop;negative;0;0;0;0;0;0 -5789;en vain;negative;0;0;1;0;0;1 -5790;en velours côtelé;positive;0;0;0;0;0;0 -5791;en vérité;positive;0;0;0;0;0;0 -5792;en vie;positive;0;0;0;0;0;0 -5793;en vigueur;positive;0;0;0;0;0;0 -5794;en voie de développement;positive;0;0;0;0;0;0 -5795;en voie de disparition;negative;0;1;1;0;0;0 -5796;en vouloir à qqn;negative;0;0;0;1;0;0 -5797;en vrac;negative;0;1;1;1;0;0 -5798;en vue;positive;0;0;0;0;0;0 -5799;en cas;positive;0;0;0;0;0;0 -5800;en tête;positive;0;0;0;0;0;0 -5801;encadrement;positive;0;0;0;0;0;0 -5802;encaisser;positive;0;1;0;1;0;0 -5803;encapuchonner;positive;0;1;0;0;0;0 -5804;enceinte;positive;0;0;0;0;0;0 -5805;encens;positive;0;0;0;1;0;0 -5806;encercler;negative;0;1;0;0;0;0 -5807;enchaîner;negative;0;1;1;0;0;0 -5808;enchainement;positive;0;0;0;0;0;0 -5809;enchaînement;positive;0;0;0;0;0;0 -5810;enchanter;positive;0;0;0;0;1;0 -5811;enchantement;positive;1;0;0;0;0;0 -5812;enchanteur;positive;0;0;0;0;0;0 -5813;enchérir;positive;0;0;0;0;0;0 -5814;enchérisseur;positive;0;0;0;0;0;0 -5815;enchevêtrement;negative;0;1;0;1;0;1 -5816;enchevêtrer;negative;0;1;0;1;0;0 -5817;enclave;negative;0;1;1;0;0;0 -5818;enclaver;negative;0;1;1;0;0;0 -5819;enclin;negative;0;1;1;0;0;0 -5820;enclos paroissial;negative;0;0;1;0;0;0 -5821;enclume;positive;0;0;0;0;0;0 -5822;encoche;positive;0;0;0;0;0;0 -5823;encoder;negative;0;1;0;0;0;0 -5824;encombrer;negative;0;0;1;0;0;1 -5825;encombrement;negative;0;0;0;1;0;0 -5826;encore exister;positive;1;0;0;0;0;0 -5827;encourager;positive;0;0;0;0;1;0 -5828;encourir;negative;0;1;1;0;0;0 -5829;encre;positive;0;0;0;0;0;0 -5830;encyclopédie;positive;0;0;0;0;0;0 -5831;endémique;negative;0;1;1;0;0;1 -5832;endetter;negative;0;1;1;0;0;0 -5833;endeuiller;negative;0;0;1;0;0;0 -5834;endiguement;negative;0;1;1;0;0;0 -5835;endocardite;negative;0;1;1;0;0;0 -5836;endoctrinement;negative;0;1;0;1;0;0 -5837;endolorir;negative;0;0;1;1;0;0 -5838;endommagement;negative;0;0;1;0;0;0 -5839;endommager;negative;0;1;1;1;0;1 -5840;endossement;positive;0;0;0;0;0;0 -5841;endroit;positive;0;0;0;0;0;0 -5842;enduire de jointement;negative;0;0;0;0;0;1 -5843;endurance;positive;0;0;0;0;0;0 -5844;endurcir;negative;0;1;0;1;0;1 -5845;énergie;positive;1;0;0;0;0;0 -5846;énergique;positive;1;0;0;0;0;0 -5847;enfance;positive;1;0;0;0;0;0 -5848;enfant;positive;1;0;0;0;0;0 -5849;enfant en bas âge;positive;0;1;0;0;1;0 -5850;enfant gâté;negative;0;0;0;1;0;1 -5851;enfantin;negative;0;0;0;0;0;1 -5852;enfer;negative;0;1;1;1;0;1 -5853;enfermer;negative;0;1;1;1;0;1 -5854;enfiler;negative;0;0;0;0;0;0 -5855;enfler;negative;0;1;0;0;0;1 -5856;enflure;negative;0;1;0;0;0;1 -5857;enfoncer;negative;0;1;0;1;1;0 -5858;enfouir;negative;0;1;1;0;0;0 -5859;enfourcher;positive;0;0;0;0;0;0 -5860;enfreindre;negative;0;0;0;0;0;0 -5861;enfuir;negative;0;1;0;0;0;0 -5862;enfumer;negative;0;1;1;0;0;1 -5863;engagement;positive;0;0;0;0;0;0 -5864;englober;positive;0;0;0;0;0;0 -5865;engloutir;negative;0;0;0;1;0;0 -5866;engouement;positive;0;0;0;0;0;0 -5867;engouement passager;negative;0;0;0;0;0;0 -5868;engourdir;negative;0;1;1;0;0;0 -5869;engourdissement;negative;0;1;1;0;0;0 -5870;engranger;positive;0;0;0;0;0;0 -5871;énigmatique;negative;0;1;0;0;0;0 -5872;enivrement;positive;0;0;0;0;1;0 -5873;enjamber;positive;0;0;0;0;0;0 -5874;enjeu;positive;0;0;0;0;0;0 -5875;enjoindre;negative;0;0;0;1;0;0 -5876;enjoué;positive;0;0;0;1;1;0 -5877;enjouement;positive;0;0;0;0;0;0 -5878;enlèvement;negative;0;1;1;0;1;0 -5879;enlumineur;positive;1;0;0;0;0;0 -5880;enneiger;positive;0;0;0;0;0;0 -5881;ennui;negative;0;0;1;1;0;0 -5882;ennuyer;negative;0;0;1;1;0;1 -5883;énoncer;positive;0;0;0;0;0;0 -5884;énonciation;positive;0;0;0;0;0;0 -5885;énormité;negative;0;0;0;1;0;1 -5886;enquête;positive;0;0;0;0;0;0 -5887;enquêter sur;positive;0;0;0;0;0;0 -5888;enquêteur;positive;0;0;0;0;0;0 -5889;enraciner;positive;0;0;0;0;0;0 -5890;enrager;negative;0;1;1;1;0;1 -5891;enregistrement;positive;0;0;0;0;0;0 -5892;enregistrer;positive;0;0;0;0;0;0 -5893;enregistreur;positive;0;0;0;0;0;0 -5894;enrichir;positive;1;0;0;0;0;0 -5895;enrobage;positive;0;0;0;0;0;0 -5896;enrobant;positive;0;0;0;0;0;0 -5897;enrober;positive;0;0;0;0;0;0 -5898;enrouer;negative;0;0;1;0;0;0 -5899;enrouler;positive;0;0;0;0;0;0 -5900;enroulement;negative;0;0;0;0;0;0 -5901;ensanglanter;negative;0;1;1;1;0;1 -5902;enseignant;positive;0;0;0;0;0;0 -5903;enseigne;positive;0;0;0;0;0;0 -5904;enseigner;positive;0;0;0;0;0;0 -5905;enseignement;positive;0;0;0;0;0;0 -5906;ensevelir;negative;0;1;1;0;0;0 -5907;ensoleiller;positive;0;0;0;0;1;0 -5908;ensoleillement;positive;1;0;0;0;0;0 -5909;ensorceler;negative;0;1;0;0;0;0 -5910;entacher;negative;0;1;1;1;0;1 -5911;entailler;negative;0;1;1;1;0;0 -5912;entasser;negative;0;0;0;0;0;0 -5913;entendement;positive;0;0;0;0;0;0 -5914;entendre;positive;0;0;0;0;0;0 -5915;enterrer;negative;0;1;1;0;0;0 -5916;enterrement;negative;0;1;1;1;0;0 -5917;entêter;negative;0;0;1;1;0;0 -5918;entêtement;negative;0;0;0;1;0;0 -5919;enthousiasme;positive;0;0;0;1;1;0 -5920;enthousiaste;positive;0;0;0;0;1;0 -5921;entièrement;positive;0;0;0;0;0;0 -5922;entité;positive;0;0;0;0;0;0 -5923;entomologie;negative;0;0;0;0;0;1 -5924;entonnoir;positive;0;0;0;0;0;0 -5925;entorse;negative;0;1;1;0;1;0 -5926;entortiller;negative;0;1;0;1;0;0 -5927;entourer;positive;0;0;0;0;0;0 -5928;entracte;positive;0;0;0;0;0;0 -5929;entrailles;negative;0;0;0;0;0;1 -5930;entraîner;positive;0;0;0;0;0;0 -5931;entraînant;positive;0;0;0;0;0;0 -5932;entraînement;positive;0;0;0;0;0;0 -5933;entrer;positive;0;0;0;0;0;0 -5934;entrant;positive;0;0;0;0;0;0 -5935;entrave;negative;0;1;1;1;1;0 -5936;entraver;negative;0;1;1;1;1;0 -5937;entre temps;positive;0;0;0;0;0;0 -5938;entrecroiser;positive;0;0;0;0;0;0 -5939;entrejambe;positive;0;0;0;0;0;0 -5940;entreposage;positive;0;0;0;0;0;0 -5941;entrepôt;positive;0;0;0;0;0;0 -5942;entrepôt débarras;negative;0;1;1;0;0;0 -5943;entreprenant;negative;0;1;0;1;0;0 -5944;entreprendre;positive;0;0;0;0;0;0 -5945;entrepreneur;positive;0;0;0;0;0;0 -5946;entrepreneur de pompe funèbre;positive;0;0;1;0;0;0 -5947;entreprise;positive;0;0;0;0;0;0 -5948;entrer en collision;negative;0;1;0;0;1;0 -5949;entrer en éruption;negative;0;1;0;1;1;0 -5950;entretien;positive;0;0;0;0;0;0 -5951;entrevoir;positive;0;0;0;0;0;0 -5952;entrevue;positive;0;0;0;0;0;0 -5953;entropie;negative;0;1;0;0;1;0 -5954;entrouvrir;positive;0;0;0;0;0;0 -5955;énumération;positive;0;0;0;0;0;0 -5956;énumérer;positive;0;0;0;0;0;0 -5957;envahir par le mauvais herbe;negative;0;1;1;0;0;1 -5958;envahir;negative;0;1;1;1;1;0 -5959;envahissant;negative;0;1;0;1;1;1 -5960;envahisseur;negative;0;1;1;1;0;0 -5961;envelopper;positive;0;0;0;0;0;0 -5962;enveloppe;positive;0;0;0;0;0;0 -5963;envie irrésistible;negative;0;0;1;0;0;0 -5964;environ;positive;0;0;0;0;0;0 -5965;environner;positive;0;0;0;0;0;0 -5966;environnement;positive;0;0;0;0;0;0 -5967;envisager;positive;0;0;0;0;0;0 -5968;envoi;positive;0;0;0;0;0;0 -5969;envol;negative;0;0;0;0;0;0 -5970;envoûter;negative;0;1;0;0;0;0 -5971;envoyer un sms à;positive;0;0;0;0;0;0 -5972;éolienne;positive;0;0;0;0;0;0 -5973;épagneul;positive;0;0;0;0;0;0 -5974;épais;negative;0;0;0;0;0;0 -5975;épaisseur;negative;0;0;0;0;0;0 -5976;épaissir;negative;0;0;0;0;0;0 -5977;épaississant;negative;0;0;0;0;0;0 -5978;épaississement;negative;0;0;0;0;0;0 -5979;épanchement;negative;0;1;0;0;0;1 -5980;épanouir;positive;1;0;0;0;0;0 -5981;épanouissement;positive;0;0;0;0;0;0 -5982;épargne;positive;0;0;0;0;0;1 -5983;éparpiller;negative;0;1;1;0;0;0 -5984;éparpillement;negative;0;1;1;0;0;0 -5985;épar|épars;negative;0;1;1;0;0;0 -5986;épater;positive;0;0;0;0;1;0 -5987;épaule;positive;0;0;0;0;0;0 -5988;épée;negative;0;1;0;0;0;0 -5989;éperdre;negative;0;1;1;0;0;0 -5990;éperlan;negative;0;0;0;0;0;0 -5991;éphémère;negative;0;0;1;0;1;0 -5992;ephéméride;positive;0;0;0;0;0;0 -5993;éphéméride;positive;0;0;0;0;0;0 -5994;épicéa;positive;0;0;0;0;0;0 -5995;épicer;negative;0;1;0;0;1;0 -5996;épicerie;positive;0;0;0;0;0;0 -5997;épiderme;positive;0;0;0;0;0;0 -5998;épilepsie;negative;0;1;0;0;0;0 -5999;épilogue;negative;0;0;0;0;0;0 -6000;épine;negative;0;1;0;0;0;1 -6001;épingle;positive;0;0;0;0;0;0 -6002;épingler;positive;0;0;0;0;0;0 -6003;épique;positive;0;0;0;0;1;0 -6004;épiscopal;positive;0;0;0;0;0;0 -6005;épisode;positive;0;0;0;0;0;0 -6006;épisodique;positive;0;0;0;0;0;0 -6007;épisser;positive;0;0;0;0;0;0 -6008;épissure;positive;0;0;0;0;0;0 -6009;épitaphe;negative;0;0;1;0;0;0 -6010;épithète;positive;0;0;0;0;0;0 -6011;épître;positive;0;0;0;0;0;0 -6012;éplucher;negative;0;0;0;0;0;0 -6013;éponge;negative;0;0;0;0;0;1 -6014;éponger;negative;0;0;0;0;0;1 -6015;épopée;positive;0;0;0;0;1;0 -6016;époque;positive;0;0;0;0;0;0 -6017;épouser;positive;0;1;0;0;1;0 -6018;épousseter;negative;0;0;0;0;0;1 -6019;époux;positive;0;0;0;0;0;0 -6020;épreuve;negative;0;1;1;1;1;0 -6021;épreuve de force;negative;0;0;0;1;0;0 -6022;éprendre;positive;1;0;0;0;0;0 -6023;éprouver;negative;0;1;1;1;0;1 -6024;éprouvant;negative;0;1;1;1;0;1 -6025;éprouver de le rancune contre;negative;0;0;0;1;0;0 -6026;épuiser;negative;0;0;1;0;0;0 -6027;épuisant;negative;0;0;1;0;0;0 -6028;épuisement;negative;0;1;1;0;0;0 -6029;épuration;positive;0;0;0;0;0;0 -6030;équateur;positive;0;0;0;0;0;0 -6031;équation;positive;0;0;0;0;0;0 -6032;équatorial;positive;0;0;0;0;0;0 -6033;équerre;positive;0;0;0;0;0;0 -6034;équestre;positive;0;0;0;0;0;0 -6035;équidistant;positive;0;0;0;0;0;0 -6036;équilibration;positive;0;0;0;0;0;0 -6037;équilibre;positive;0;0;0;0;0;0 -6038;équilibrer;positive;0;0;0;0;0;0 -6039;équipage;positive;0;0;0;0;0;0 -6040;équipement;positive;0;0;0;0;0;0 -6041;équiper;positive;0;0;0;0;0;0 -6042;équitable;positive;0;0;0;0;0;0 -6043;équitablement;positive;0;0;0;0;0;0 -6044;équitation;positive;0;0;0;0;0;0 -6045;équité;positive;0;0;0;0;0;0 -6046;équivalence;positive;0;0;0;0;0;0 -6047;équivaloir à;positive;0;0;0;0;0;0 -6048;équivoque;negative;0;1;0;0;0;0 -6049;éradication;negative;0;1;1;1;0;1 -6050;éradiquer;negative;0;1;1;1;0;1 -6051;érafler;negative;0;1;1;0;0;0 -6052;éraflure;negative;0;1;1;0;0;1 -6053;érection;positive;0;0;0;0;0;0 -6054;ergoteur;negative;0;0;0;1;0;0 -6055;ériger;positive;0;0;0;0;0;0 -6056;ermite;negative;0;0;1;0;0;0 -6057;érosion;negative;0;0;0;0;0;0 -6058;érotique;positive;0;0;0;0;1;0 -6059;errance;negative;0;0;1;0;0;0 -6060;errer;negative;0;1;1;0;0;0 -6061;errant;negative;0;1;1;0;0;0 -6062;erratique;negative;0;0;0;0;1;0 -6063;erratum;negative;0;0;0;0;0;0 -6064;erroné;negative;0;1;1;0;0;0 -6065;érudit;positive;0;0;0;0;0;0 -6066;éruption;negative;0;1;0;1;1;0 -6067;éruption cutané;negative;0;0;0;0;0;1 -6068;escadron;positive;0;0;0;0;0;0 -6069;escalade;positive;0;0;0;0;0;0 -6070;escalader;positive;0;1;0;0;0;0 -6071;escalator;positive;0;0;0;0;0;0 -6072;escalier;positive;0;0;0;0;0;0 -6073;escapade;positive;0;0;0;0;0;0 -6074;escargot;negative;0;0;0;0;0;1 -6075;escarmouche;negative;0;0;0;1;0;0 -6076;escarpement;negative;0;1;0;0;0;0 -6077;esclavage;negative;0;1;1;1;0;1 -6078;esclave;negative;0;1;1;1;0;1 -6079;escorte;positive;0;0;0;0;0;0 -6080;escorter;positive;0;0;0;0;0;0 -6081;escouade;positive;0;0;0;0;0;0 -6082;escroc;negative;0;0;0;1;0;1 -6083;ésotérique;positive;0;0;0;0;0;0 -6084;espace;positive;0;0;0;0;0;0 -6085;espacer;positive;0;0;0;0;0;0 -6086;espérance;positive;0;0;0;0;0;0 -6087;espérance de vie;positive;0;0;0;0;0;0 -6088;espérer;positive;0;0;0;0;0;0 -6089;esperluette;positive;0;0;0;0;0;0 -6090;espionnage;negative;0;1;0;1;1;0 -6091;espionner;negative;0;1;0;0;0;0 -6092;espoir;positive;0;0;0;0;1;0 -6093;esprit;positive;0;0;0;0;0;0 -6094;esquisse;positive;0;0;0;0;0;0 -6095;esquisser;positive;0;0;0;0;0;0 -6096;esquive;negative;0;1;0;0;0;0 -6097;esquiver;negative;0;1;0;0;0;0 -6098;essaim;negative;0;1;0;0;0;1 -6099;essaimage;negative;0;1;0;1;0;0 -6100;essayer|essayer;positive;0;0;0;0;0;0 -6101;essayiste;positive;0;0;0;0;0;0 -6102;essentiel;positive;0;0;0;0;0;0 -6103;essentiellement;positive;0;0;0;0;0;0 -6104;essieu;positive;0;0;0;0;0;0 -6105;essor;positive;0;0;0;0;1;0 -6106;esssence;positive;0;0;0;0;0;0 -6107;essuyer;positive;0;0;0;0;0;0 -6108;esthétique;positive;1;0;0;0;0;0 -6109;esthétisme;positive;1;0;0;0;0;0 -6110;estimation;positive;0;0;0;0;1;0 -6111;estime;positive;0;0;1;0;0;0 -6112;estimer;positive;0;0;1;0;0;0 -6113;estival;positive;1;0;0;0;0;0 -6114;estivau;positive;1;0;0;0;0;0 -6115;estomac;positive;0;0;0;0;0;1 -6116;estuaire;positive;0;0;0;0;0;0 -6117;estudiantin;positive;0;0;0;0;0;0 -6118;esturgeon;positive;0;0;0;0;0;0 -6119;étable;negative;0;0;0;0;0;0 -6120;établir;positive;0;0;0;0;0;0 -6121;établiées;positive;0;0;0;0;0;0 -6122;établir le fausseté de;negative;0;0;0;1;0;0 -6123;établir un discrimination;negative;0;0;1;1;0;1 -6124;établissement;positive;0;0;0;0;0;0 -6125;établissement scolaire;positive;0;0;0;0;0;0 -6126;étage;positive;0;0;0;0;0;0 -6127;étagère;positive;0;0;0;0;0;0 -6128;étai;positive;0;0;0;0;0;0 -6129;étain;positive;0;0;0;0;0;0 -6130;étal;positive;0;0;0;0;0;1 -6131;étalage;positive;1;0;0;0;0;0 -6132;étaler;negative;0;0;0;1;0;0 -6133;étalon;positive;0;0;0;0;0;0 -6134;étanche;positive;0;0;0;0;0;0 -6135;étancher;positive;0;0;0;0;0;0 -6136;étang;negative;0;0;0;0;0;1 -6137;étape important;positive;0;0;0;0;0;0 -6138;état;positive;0;0;0;0;0;0 -6139;étau;negative;0;1;0;0;0;0 -6140;étayer|étayer;positive;0;0;0;0;0;0 -6142;éteindre;negative;0;0;1;1;0;0 -6143;étendue sauvage;negative;0;1;1;0;0;0 -6144;éternité;positive;0;0;0;0;0;0 -6145;éternuer;negative;0;0;0;0;1;0 -6146;éternuement;negative;0;0;0;0;1;1 -6147;éthanol;negative;0;0;0;0;0;1 -6148;éther;negative;0;0;0;0;0;1 -6149;éthéré;negative;0;1;0;0;0;0 -6150;éthique;positive;0;0;0;0;0;0 -6151;ethnographie;positive;0;0;0;0;0;0 -6152;étinceler;positive;1;0;0;0;0;0 -6153;étincelant;positive;1;0;0;0;0;0 -6154;étincelle;positive;0;0;0;0;1;0 -6155;étiologie;positive;0;0;0;0;0;0 -6156;étiqueter;positive;0;0;0;0;0;0 -6157;étiquette;positive;0;0;0;0;0;0 -6158;étirer;positive;0;0;0;0;0;0 -6159;étoffe;positive;0;0;0;0;0;0 -6160;étoile;positive;0;0;0;0;0;0 -6161;étoiler;positive;1;0;0;0;0;0 -6162;étole;positive;0;0;0;0;0;0 -6163;étonnamment;positive;0;0;0;0;1;0 -6164;étonnement;positive;0;1;0;0;1;0 -6165;étonner;positive;0;1;0;0;1;0 -6166;étouffant;negative;0;1;1;0;1;1 -6167;étouffoir;negative;0;1;0;0;0;0 -6168;étourderie;negative;0;1;1;0;0;0 -6169;étourdir;negative;0;1;1;0;1;0 -6170;étourdissement;negative;0;1;0;0;1;0 -6171;étrangement;negative;0;1;0;0;1;0 -6172;étrangeté;negative;0;0;1;0;1;1 -6173;étrangleur;negative;0;1;1;1;1;0 -6174;être à le tête;positive;0;0;0;0;0;0 -6175;être à le traîne;negative;0;0;1;0;0;0 -6176;être affaler;negative;0;0;0;0;0;0 -6177;être allonger;positive;0;0;0;0;0;0 -6178;être assortir;positive;0;0;0;0;0;0 -6179;être au service de;negative;0;0;0;0;0;0 -6180;être avachir;negative;0;0;0;0;0;0 -6181;être bénéfique;positive;1;0;0;0;0;0 -6182;être bénévole;positive;0;1;0;0;0;0 -6183;être caractériser;positive;0;0;0;0;0;0 -6184;être conforme à;positive;0;0;0;0;0;0 -6185;être domicilier;positive;0;0;0;0;0;0 -6186;être en adéquation;negative;0;1;0;1;0;0 -6187;être en apprentissage;positive;0;0;0;0;0;0 -6188;être en désaccord;negative;0;0;0;1;0;0 -6189;être en rage;negative;0;0;0;1;0;0 -6190;être imposant;negative;0;1;0;1;0;1 -6191;être incliner;negative;0;1;0;0;0;0 -6192;être indiscret;negative;0;0;0;1;0;1 -6193;être inonder;negative;0;1;0;0;0;0 -6194;être le plus toucher par;negative;0;0;1;1;0;0 -6195;être le premier toucher par;negative;0;0;1;1;0;0 -6196;être protubérant;negative;0;1;0;0;0;1 -6197;être quitte;positive;0;0;0;0;0;0 -6198;être rayonnant;positive;0;0;0;0;0;0 -6199;être souffrant;negative;0;0;1;0;0;0 -6200;étriquer;negative;0;1;1;0;0;0 -6201;étroit;negative;0;1;1;0;0;0 -6202;étroitesse;negative;0;1;1;1;0;0 -6203;étude;positive;0;0;0;0;0;0 -6204;étudier de deuxième année;positive;0;0;0;0;0;0 -6205;étudier de premier cycle unir;positive;0;0;0;0;0;0 -6206;étudier de premier année;positive;0;0;0;0;0;0 -6207;étudier;positive;0;0;0;0;0;0 -6208;étymologie;positive;0;0;0;0;0;0 -6209;euchre;positive;0;0;0;0;0;0 -6210;eugénisme;negative;0;0;1;0;0;0 -6211;euh;negative;0;1;1;0;0;0 -6212;euphémisme;negative;0;0;0;0;0;0 -6213;euthanasie;negative;0;1;1;0;0;0 -6214;évacuation;negative;0;1;0;0;0;0 -6215;évader;negative;0;1;0;1;0;0 -6216;évaluer;positive;0;0;0;0;0;0 -6217;evanescence;negative;0;0;1;0;1;0 -6218;évanescence;negative;0;0;1;0;1;0 -6219;évangélique;positive;0;0;0;0;0;0 -6220;évangéliste;positive;0;0;0;0;0;0 -6221;évangile;positive;0;0;0;0;0;0 -6222;évanouissement;negative;0;1;1;0;1;0 -6223;évaporation;negative;0;0;0;0;0;0 -6224;éveil;positive;1;0;0;0;0;0 -6225;éveiller;positive;0;0;0;0;0;0 -6226;événement;positive;0;0;0;0;1;0 -6227;événement fortuit;positive;0;0;0;0;1;0 -6228;événement marquant;positive;0;0;0;0;0;0 -6229;évent;positive;0;0;0;1;0;0 -6230;éventail;positive;0;0;0;0;0;0 -6231;éventer;positive;0;0;0;0;0;0 -6232;éventuellement;positive;0;0;0;0;1;0 -6233;évêque;positive;0;0;0;0;0;0 -6234;évidemment;positive;0;0;0;0;0;0 -6235;évident;positive;0;0;0;1;0;1 -6236;évier;negative;0;1;1;0;0;0 -6237;évincer;negative;0;1;1;1;1;0 -6238;éviter;negative;0;1;0;0;0;1 -6239;évoluer;positive;1;0;0;0;0;0 -6240;evolution;positive;0;0;0;0;0;0 -6241;évolution;positive;0;0;0;0;0;0 -6242;évoquer;positive;0;0;0;0;0;0 -6243;exacerbation;negative;0;1;0;1;0;0 -6244;exacerber;negative;0;0;0;0;0;0 -6245;exact;positive;0;0;0;0;0;0 -6246;exactitude;positive;0;0;0;0;0;0 -6247;exagération;negative;0;0;0;0;0;0 -6248;exagérer;negative;0;0;0;1;0;0 -6249;exaltation;positive;0;0;0;0;1;0 -6250;exalter;positive;0;0;0;0;0;0 -6251;examiner avec soin;positive;0;0;0;0;0;0 -6252;exaspération;negative;0;0;0;1;0;1 -6253;exaspérer;negative;0;1;0;1;0;0 -6254;exaucer;positive;0;0;0;0;0;0 -6255;excavateur;negative;0;0;0;0;0;0 -6256;excavation;negative;0;0;0;0;1;0 -6257;excaver;negative;0;0;1;0;0;1 -6258;excéder;positive;0;0;0;0;1;0 -6259;excédent;negative;0;0;0;0;0;0 -6260;excellence;positive;0;0;0;0;1;1 -6261;excellent;positive;0;0;0;1;0;0 -6262;exceller;positive;0;0;0;0;1;0 -6263;excentricité;negative;0;0;0;0;0;0 -6264;excentrique;negative;0;1;0;1;1;0 -6265;exception;positive;0;0;0;0;1;0 -6266;exceptionnellement;negative;0;0;0;0;0;0 -6267;excès;negative;0;0;0;0;0;1 -6268;excessivement;negative;0;0;0;0;0;0 -6269;exciser;negative;0;1;0;0;0;1 -6270;excision;negative;0;1;0;0;0;0 -6271;excitabilité;positive;0;0;0;0;0;0 -6272;excitable;positive;0;0;0;0;1;0 -6273;excitant;positive;0;0;0;0;1;0 -6274;excitation;positive;0;1;0;1;1;0 -6275;exciter;positive;0;0;0;0;1;0 -6276;exclure;negative;0;1;1;1;0;1 -6277;exclusion;negative;0;1;1;0;0;1 -6278;excrément;negative;0;0;0;0;0;1 -6279;excrétion;negative;0;0;0;0;0;1 -6280;excroissance;negative;0;1;0;0;0;0 -6281;excuse;positive;0;0;1;0;0;0 -6282;exécutif;positive;0;0;0;0;0;0 -6283;exécution;negative;0;1;1;1;0;0 -6284;exégèse;positive;0;0;0;0;0;0 -6285;exemplaire;positive;0;0;0;0;0;0 -6286;exemple;positive;0;0;0;0;0;0 -6287;exempt;positive;0;0;0;0;0;0 -6288;exempter;positive;0;0;0;0;0;0 -6289;exemption;positive;0;0;0;0;0;0 -6290;exercer;positive;0;0;0;0;0;0 -6291;exercer son pontificat;positive;0;0;0;0;0;0 -6292;exercice;positive;0;0;0;0;0;0 -6293;exercice physique;positive;0;0;0;0;0;0 -6294;exhiber;negative;0;0;0;1;0;0 -6295;exhortation;positive;0;0;0;0;0;0 -6296;exhumer;negative;0;0;1;0;0;0 -6297;exigeant;negative;0;1;0;1;1;1 -6298;exiguïté;negative;0;0;1;0;0;0 -6299;exil;negative;0;1;1;1;0;0 -6300;existant;positive;0;0;0;0;0;0 -6301;exode;negative;0;0;1;0;0;0 -6302;exorbiter;negative;0;1;0;1;1;0 -6303;exorbitant;negative;0;1;0;1;1;0 -6304;exorcisme;negative;0;1;1;1;0;0 -6305;exorciste;negative;0;1;0;1;0;0 -6306;exotique;positive;0;0;0;0;0;0 -6307;expansif;positive;0;0;0;0;0;0 -6308;expansion;positive;0;0;0;0;0;0 -6309;expédient;positive;0;0;0;0;0;0 -6310;expéditif;negative;0;0;0;1;0;0 -6311;expédition;positive;0;0;0;0;0;0 -6312;expérience;positive;0;0;0;0;1;0 -6313;expert comptable commissaire avoir;positive;0;1;0;0;0;0 -6314;expiation;positive;1;0;0;0;0;0 -6315;expiration;negative;0;1;0;0;0;1 -6316;expirer;negative;0;0;1;0;0;1 -6317;explication;positive;0;0;0;0;0;0 -6318;expliquer;positive;0;0;0;0;0;0 -6319;exploit;positive;0;0;0;0;1;0 -6320;exploitation agricole;positive;0;0;0;0;0;0 -6321;exploitation forestier;positive;0;0;0;0;0;0 -6322;explorateur;positive;0;0;0;0;0;0 -6323;explorer;positive;0;0;0;0;1;0 -6324;exploser;negative;0;1;1;1;1;0 -6325;expo;positive;0;0;0;0;0;0 -6326;exponentiel;positive;0;0;0;0;0;0 -6327;exportation;positive;0;0;0;0;0;0 -6328;exporter;positive;0;0;0;0;0;0 -6329;exposant;positive;0;0;0;0;0;0 -6330;exposer;negative;0;1;0;0;1;0 -6331;exposer le grand ligne;positive;0;0;0;0;0;0 -6332;express;positive;0;0;0;0;0;0 -6333;expressif;positive;0;0;0;0;0;0 -6334;expression;positive;0;0;0;0;0;0 -6335;expression idiomatique;positive;0;0;0;0;0;0 -6336;expression passer partout;negative;0;0;0;0;0;0 -6337;exprimer;positive;0;0;0;0;0;0 -6338;exprimer son reconnaissance;positive;0;0;0;0;0;0 -6339;expropriation;negative;0;1;1;1;0;1 -6340;exquis;positive;1;0;0;0;0;0 -6341;exsangue;negative;0;1;0;0;0;0 -6342;exsuder;negative;0;0;0;0;0;1 -6343;extase;positive;1;0;0;0;0;0 -6344;extatique;positive;0;0;0;0;1;0 -6345;extensible;positive;0;0;0;0;0;0 -6346;extension;positive;0;0;0;0;0;0 -6347;exténuation;negative;0;0;1;0;0;0 -6348;extérieur;negative;0;0;0;0;0;0 -6349;extérieurement;negative;0;0;0;0;0;0 -6350;extermination;negative;0;1;1;1;0;1 -6351;exterminer;negative;0;1;1;1;0;1 -6352;externe;negative;0;0;0;0;0;0 -6353;extirper;positive;0;0;0;0;0;0 -6354;extra muros;negative;0;0;0;0;0;0 -6355;extracteur;positive;0;0;0;0;0;0 -6356;extraction;positive;0;0;0;0;0;0 -6357;extradition;negative;0;1;1;0;0;0 -6358;extraire;positive;0;0;0;0;0;0 -6359;extrajudiciaire;negative;0;1;0;0;0;0 -6360;extraodianires;positive;1;0;0;0;0;0 -6361;extraordinaire;positive;0;1;0;0;1;0 -6362;extraterrestre;negative;0;1;0;0;0;1 -6363;extrêmement pénible;negative;0;1;1;0;0;0 -6364;extrémité;negative;0;0;0;0;0;0 -6365;extrinsèque;negative;0;0;0;0;0;0 -6366;extrusion;negative;0;1;0;0;0;1 -6367;exubérance;positive;1;0;0;0;0;0 -6368;exulter;positive;1;0;0;0;0;0 -6369;fable;positive;1;0;0;0;0;0 -6370;fabulation;negative;0;0;0;1;0;0 -6371;fac similé;negative;0;0;0;0;0;0 -6372;face;positive;0;0;0;0;0;0 -6373;facette;positive;0;0;0;0;0;0 -6374;fâcheux;negative;0;0;0;1;0;1 -6375;facile à vivre;positive;0;0;0;0;0;0 -6376;facilement;positive;1;0;0;0;0;0 -6377;faciliter;positive;1;0;0;0;0;0 -6378;façonnage;positive;0;0;0;0;0;0 -6379;façonner;positive;0;0;0;0;0;0 -6380;façon;positive;0;0;0;0;0;0 -6381;facteur;positive;0;0;0;0;0;0 -6382;factice;negative;0;0;0;1;0;1 -6383;faction;negative;0;0;0;1;0;0 -6384;facturable;negative;0;1;1;0;0;0 -6385;facultativement;positive;0;0;0;0;0;0 -6386;faculté;positive;0;0;0;0;0;0 -6387;fade;negative;0;0;1;0;0;1 -6388;faible;negative;0;0;1;1;0;1 -6389;faiblement;negative;0;1;1;0;0;0 -6390;faiblesse;negative;0;1;1;0;0;0 -6391;faiblir;negative;0;1;0;0;0;0 -6392;faïence;positive;0;0;0;0;0;0 -6393;faille;negative;0;1;1;0;0;0 -6394;faillible;negative;0;1;1;0;0;0 -6395;faillite;negative;0;1;1;1;0;1 -6396;faim;negative;0;0;1;0;0;0 -6397;faire;positive;0;0;0;0;0;0 -6398;faire apparaître;negative;0;0;0;0;1;0 -6399;faire appel;positive;0;0;0;0;0;0 -6400;faire attention;positive;0;1;0;0;0;0 -6401;faire bouillir;negative;0;0;0;1;0;1 -6402;faire cadeau;positive;0;0;0;0;0;0 -6403;faire campagne;positive;0;0;0;0;0;0 -6404;faire chanter;negative;0;1;0;1;0;0 -6405;faire circuler;positive;0;0;0;0;0;0 -6406;faire confiance;positive;0;0;0;0;0;0 -6407;faire cuire au barbecue;positive;0;0;0;0;0;0 -6408;faire de l exercice;positive;0;0;0;0;0;0 -6409;faire de le boxe;negative;0;0;0;1;0;0 -6410;faire de le luge;positive;1;0;0;0;0;0 -6411;faire de le moto;positive;0;0;0;0;0;0 -6412;faire de le publicité;positive;0;0;0;0;0;0 -6413;faire de le sculpture;positive;0;0;0;0;0;0 -6414;faire du affaire;positive;0;0;0;0;0;0 -6415;faire du compromis;positive;0;0;0;0;0;0 -6416;faire du course;positive;0;0;0;0;1;0 -6417;faire du folie;negative;0;1;0;0;1;0 -6418;faire du histoire;negative;0;0;1;1;0;0 -6419;faire du remarque continuell;negative;0;1;1;1;0;0 -6420;faire du réserve;positive;0;0;0;0;0;0 -6421;faire détoner;negative;0;1;0;0;1;0 -6422;faire du canoë;positive;0;0;0;0;0;0 -6423;faire du jogging;positive;0;0;0;0;0;0 -6424;faire du mannequinat;positive;0;0;0;0;0;0 -6425;faire du planeur;positive;1;0;0;0;0;0 -6426;faire du racolage;negative;0;0;0;0;0;0 -6427;faire du rap;negative;0;0;0;0;0;0 -6428;faire du trafic;negative;0;0;1;0;0;0 -6429;faire du traîneau;positive;1;0;0;0;0;0 -6430;faire exploser;negative;0;1;0;1;1;0 -6431;faire face;positive;0;0;0;0;0;0 -6432;faire fondre;negative;0;0;0;0;0;0 -6433;faire infuser;positive;0;0;0;0;0;0 -6434;faire le chronique de;positive;0;0;0;0;0;0 -6435;faire le cour;positive;0;0;0;0;0;0 -6436;faire le course;positive;0;0;0;0;0;0 -6437;faire le fête;positive;0;0;0;0;1;0 -6438;faire le grimace;negative;0;1;1;1;0;1 -6439;faire le leçon;positive;0;0;0;0;0;0 -6440;faire le queue;negative;0;0;1;0;0;0 -6441;faire le clown;positive;0;0;0;0;1;0 -6442;faire le médiateur;positive;0;0;0;0;0;0 -6443;faire le pitre;positive;0;0;0;0;1;0 -6444;faire le magasin;positive;0;0;0;0;1;0 -6445;faire mal;negative;0;1;1;1;0;0 -6446;faire marche arrière;negative;0;1;1;0;0;0 -6447;faire obstruction à;negative;0;0;0;1;0;0 -6448;faire passer un entretien;positive;0;0;0;0;0;0 -6449;faire pipi;negative;0;0;0;0;0;1 -6450;faire pivoter;positive;0;0;0;0;0;0 -6451;faire plaisir;positive;1;0;0;0;0;0 -6452;faire référence à;positive;0;0;0;0;0;0 -6453;faire remarquer;negative;0;0;0;0;0;0 -6454;faire semblant;negative;0;0;0;1;0;1 -6455;faire son début;positive;0;0;0;0;0;0 -6456;faire son valise;positive;0;0;0;0;0;0 -6457;faire signe;positive;0;0;0;0;0;0 -6458;faire suite;positive;0;0;0;0;0;0 -6459;faire surface;positive;0;0;0;0;0;0 -6460;faire sursauter;negative;0;1;0;0;1;0 -6461;faire tourner;positive;0;0;0;0;0;0 -6462;faire tremper;negative;0;0;0;0;0;1 -6463;faire un bond;positive;1;0;0;0;0;0 -6464;faire un bruit métallique;negative;0;1;0;0;1;0 -6465;faire un bruit sourd;negative;0;1;0;0;1;0 -6466;faire un coup amortir;negative;0;1;0;1;1;0 -6467;faire un geste;positive;0;0;0;0;0;0 -6468;faire un régime;negative;0;0;0;0;0;0 -6469;faire un scanner de;positive;0;0;0;0;0;0 -6470;faire un signe de le main;positive;0;0;0;0;0;0 -6471;faire un signe de le tête;positive;0;0;0;0;0;0 -6472;faire un somme;positive;0;0;0;0;0;0 -6473;faire un sondage;positive;0;0;0;0;0;0 -6474;faire un descente dans;negative;0;1;0;1;1;0 -6475;faire un digression;negative;0;1;0;1;0;0 -6476;faire un embardée;negative;0;1;0;0;1;0 -6477;faire un gaffe;negative;0;1;1;0;0;1 -6478;faire un hémorragie;negative;0;1;1;0;0;1 -6479;faire un overdose;negative;0;1;1;0;0;1 -6480;faire un randonnée;positive;0;0;0;0;0;0 -6481;faire un remise;positive;0;0;0;0;0;0 -6482;fairway;positive;0;0;0;0;0;0 -6483;faisabilité;positive;0;0;0;0;0;0 -6484;faire autorité;positive;0;0;0;0;0;0 -6485;faire le sieste;positive;0;0;0;0;0;0 -6486;faisceau;positive;1;0;0;0;0;0 -6487;fait et geste;positive;0;0;0;0;0;0 -6488;falacieuses;negative;0;0;0;1;0;1 -6489;falaise;negative;0;1;0;0;0;0 -6490;falsification;negative;0;0;0;1;0;1 -6491;falsifier;negative;0;1;1;0;0;1 -6492;fameusement;positive;1;0;0;0;0;0 -6493;familiariser;positive;0;0;0;0;0;0 -6494;familiarité;positive;0;0;0;0;0;0 -6495;familier;positive;0;0;0;0;0;0 -6496;famille;positive;0;0;0;0;0;0 -6497;famille du défunt;negative;0;0;1;0;0;0 -6498;famine;negative;0;1;1;0;0;0 -6499;fan;positive;0;0;0;0;0;0 -6500;fanatisme;negative;0;1;0;1;0;0 -6501;fandango;positive;0;0;0;0;0;0 -6502;faner;negative;0;0;1;0;0;1 -6503;fanfare;positive;0;0;0;0;1;0 -6504;fanfaronnade;negative;0;0;0;0;0;0 -6505;fanfaronner;negative;0;0;0;0;0;0 -6506;fanion;positive;0;0;0;0;0;0 -6507;fantaisiste;negative;0;0;0;0;1;0 -6508;fantasme;positive;0;0;0;0;0;0 -6509;fantasque;negative;0;0;0;0;1;0 -6510;fantoche;negative;0;0;0;0;0;0 -6511;fantomatique;negative;0;1;0;0;0;0 -6512;fantôme;negative;0;1;0;0;1;0 -6513;faon;negative;0;0;0;0;0;0 -6514;fard;positive;0;0;0;0;0;0 -6515;fardeau;negative;0;1;1;1;0;0 -6516;farfelu;negative;0;1;0;0;1;0 -6517;farine;positive;0;0;0;0;0;0 -6518;fariner;positive;0;0;0;0;0;0 -6519;faro;positive;0;0;0;0;0;0 -6520;fascia;positive;0;0;0;0;0;0 -6521;fasciner;positive;0;1;0;0;1;0 -6522;fascinant;positive;0;1;0;0;1;0 -6523;fascination;positive;0;0;0;0;0;0 -6524;fatal;negative;0;1;1;1;0;0 -6525;fatalité;negative;0;1;1;0;0;0 -6526;fatiguer;negative;0;0;1;1;0;0 -6527;faucher;negative;0;1;1;0;0;0 -6528;faucille;negative;0;1;0;0;0;0 -6529;faucon;negative;0;1;0;0;0;0 -6530;faune;positive;0;0;0;0;0;0 -6531;faux couche;negative;0;1;1;0;1;0 -6532;fausser;negative;0;0;1;1;1;1 -6533;faussement;negative;0;0;1;1;0;0 -6534;faussement pudique;negative;0;1;0;0;0;1 -6535;faussement timide;negative;0;1;0;0;0;1 -6536;fausseté;negative;0;0;0;1;0;1 -6537;faute;negative;0;0;1;0;0;1 -6538;faute professionnel;negative;0;1;0;1;0;0 -6539;fauve;negative;0;1;0;0;0;1 -6540;fauvette;positive;0;0;0;0;0;0 -6541;faux pas;negative;0;1;1;0;1;1 -6542;faux pli;negative;0;0;0;0;0;0 -6543;faux bourdon;negative;0;1;0;0;0;1 -6544;faveur;positive;0;0;0;0;0;0 -6545;favori;positive;0;0;0;0;0;0 -6546;favoriser;positive;0;0;0;0;0;0 -6547;favorite;positive;0;0;0;0;0;0 -6548;fébrile;negative;0;1;1;0;1;0 -6549;fécal;negative;0;0;0;0;0;1 -6550;fèces;negative;0;0;0;0;0;1 -6551;fécondité;positive;0;0;0;0;0;0 -6552;fécule;negative;0;0;0;0;0;1 -6553;fécule de maïs;positive;0;0;0;0;0;0 -6554;fédéral;positive;0;0;0;0;0;0 -6555;fédération;positive;0;0;0;0;0;0 -6556;fée;positive;0;0;0;0;0;0 -6557;féerie;positive;1;0;0;0;0;0 -6558;feindre;negative;0;0;0;0;0;1 -6559;feinte;negative;0;0;0;0;0;1 -6560;féliciter;positive;1;0;0;0;0;0 -6561;félin;positive;0;0;0;0;0;0 -6562;félure;negative;0;1;0;1;0;0 -6563;femelle;positive;0;0;0;0;0;0 -6564;féministe;positive;0;0;0;0;0;0 -6565;féminité;positive;0;0;0;0;0;0 -6566;femme;positive;0;0;0;0;0;0 -6567;femme au foyer;positive;0;0;0;0;0;0 -6568;femme de ménage;positive;0;0;0;0;0;0 -6569;femme fatal;positive;0;0;0;0;0;0 -6570;femme politique;positive;0;0;0;0;0;0 -6571;fendre;negative;0;1;0;1;0;0 -6572;fenêtre;positive;0;0;0;0;0;0 -6573;fenouil;negative;0;0;0;0;0;1 -6574;fente;negative;0;1;0;0;0;0 -6575;féodal;negative;0;0;0;0;0;0 -6576;féodalisme;negative;0;0;1;1;0;0 -6577;fer;positive;0;0;0;0;0;0 -6578;fer à cheval;positive;0;0;0;0;0;0 -6579;fermer;positive;0;0;0;0;0;0 -6580;fermement;positive;0;0;0;0;0;0 -6581;ferment;negative;0;0;0;0;0;1 -6582;fermentation;negative;0;0;0;0;0;1 -6583;fermenter;negative;0;0;0;0;0;1 -6584;fermer à clé;positive;0;0;0;0;0;0 -6585;fermeté;positive;0;0;0;0;0;0 -6586;fermette;positive;0;0;0;0;0;0 -6587;fermeture;positive;0;0;1;0;0;0 -6588;fermeture éclair;positive;0;0;0;0;0;0 -6589;féroce;negative;0;1;0;1;0;1 -6590;férocité;negative;0;1;0;1;0;0 -6591;ferry;positive;0;0;0;0;0;0 -6592;fertile;positive;0;0;0;0;0;0 -6593;fertiliser;positive;0;0;0;0;0;0 -6594;fesse;positive;0;0;0;0;0;0 -6595;fesser;negative;0;1;1;1;0;0 -6596;festival;positive;0;0;0;0;1;0 -6597;fêter;positive;0;0;0;0;1;0 -6598;fétiche;negative;0;0;0;1;0;0 -6599;feu d artifice;positive;0;0;0;0;1;0 -6600;feu de joie;positive;1;0;0;0;0;0 -6601;feuillage;positive;0;0;0;0;0;0 -6602;feuille;positive;0;0;0;0;0;0 -6603;feuilleter;positive;0;0;0;0;0;0 -6604;feuilleton;positive;0;0;0;0;0;0 -6605;feuillu;positive;0;0;0;0;0;0 -6606;fiabilité;positive;0;0;0;0;0;0 -6607;fiable;positive;0;0;0;0;0;0 -6608;fiançailles;positive;0;0;0;0;0;0 -6609;fiancer;positive;0;0;0;0;0;0 -6610;fibre;positive;0;0;0;0;0;0 -6611;fibreux;negative;0;0;0;0;0;1 -6612;fiche;negative;0;1;0;0;0;0 -6613;fiche de renseignement;positive;0;0;0;0;0;0 -6614;fichier;positive;0;0;0;0;0;0 -6615;ficher;negative;0;0;0;1;0;1 -6616;fictif;negative;0;0;0;1;0;1 -6617;fiction;positive;0;0;0;0;0;0 -6618;fidélité;positive;0;0;0;0;0;0 -6619;fiduciaire;positive;0;0;0;0;0;0 -6620;fierté;positive;1;0;0;0;0;0 -6621;fiesta;positive;0;0;0;0;1;0 -6622;fièvre;negative;0;1;0;0;0;0 -6623;figer;negative;0;0;1;0;0;0 -6624;figure;positive;0;0;0;0;0;0 -6625;figurer;positive;0;0;0;0;0;0 -6626;figurine;positive;0;0;0;0;0;0 -6627;fil de fer;positive;0;0;0;0;0;0 -6628;fil dentaire;negative;0;0;0;0;0;1 -6629;filage;negative;0;1;0;0;0;0 -6630;filament;negative;0;0;0;0;0;0 -6631;filamenteux;negative;0;0;0;0;0;1 -6632;filer à tout vitesse;negative;0;1;0;0;1;0 -6633;filetage;negative;0;0;0;0;0;0 -6634;filial;negative;0;0;0;0;0;0 -6635;filiation;positive;0;0;0;0;0;0 -6636;filière;positive;0;0;0;0;0;0 -6637;filigrane;positive;0;0;0;0;0;0 -6638;fille;positive;1;0;0;0;0;0 -6639;fille de joie;negative;0;0;0;1;0;1 -6640;film;positive;0;0;0;0;0;0 -6641;filmer;positive;0;0;0;0;0;0 -6642;fil|fils;positive;0;0;0;0;0;0 -6643;filtre;positive;0;0;0;0;0;0 -6644;filtrer;positive;0;0;0;0;0;0 -6645;finalement;positive;0;0;0;0;1;1 -6646;finalisation;positive;1;0;0;0;0;0 -6647;finalité;negative;0;0;1;0;0;0 -6648;finance;positive;0;0;0;0;0;0 -6649;financer;positive;0;0;0;0;0;0 -6650;financier;positive;0;0;0;0;0;0 -6651;finesse;positive;0;0;0;0;0;0 -6652;finir;negative;0;1;1;0;0;0 -6653;finition;positive;0;0;0;0;0;0 -6654;fiole;positive;0;0;0;0;0;0 -6655;firmament;positive;0;0;0;0;0;0 -6656;firme;positive;0;0;0;0;0;0 -6657;fiscal;positive;0;0;0;0;0;0 -6658;fissile;negative;0;0;0;0;0;0 -6659;fission;negative;0;1;0;0;1;0 -6660;fissuration;negative;0;1;0;1;0;0 -6661;fissurer;negative;0;1;1;1;0;0 -6662;fistule;negative;0;0;0;0;0;1 -6663;fixer;positive;0;0;0;0;0;0 -6664;fixement;negative;0;1;0;1;0;0 -6665;fixer du regard;negative;0;1;0;1;1;0 -6666;fixer le prix;positive;0;0;0;0;0;0 -6667;flacon;positive;0;0;0;0;0;0 -6668;flairer;positive;0;0;0;0;0;0 -6669;flambeau;positive;0;0;0;0;0;0 -6670;flamber;negative;0;1;0;1;0;0 -6671;flamboiement;positive;0;0;0;0;1;0 -6672;flamboyant;negative;0;0;0;1;0;0 -6673;flanelle;positive;0;0;0;0;0;0 -6674;flâneur;positive;1;0;0;0;0;0 -6675;flanquer;negative;0;0;0;0;0;0 -6676;flash;negative;0;1;0;0;1;0 -6677;flash back;positive;0;0;0;0;1;0 -6678;flasque;negative;0;0;1;0;0;1 -6679;flatter qqn servilement;negative;0;0;0;0;0;0 -6680;flatterie;positive;0;0;0;0;0;0 -6681;flatulence;negative;0;0;0;0;0;1 -6682;flèche;positive;0;1;0;0;1;0 -6683;fléchette;negative;0;1;0;0;0;0 -6684;fléchir;negative;0;0;1;0;0;0 -6685;fléchissement;negative;0;0;1;0;0;0 -6686;flétrir;negative;0;0;1;0;0;1 -6687;fleur;positive;1;0;0;0;0;0 -6688;fleuret;positive;0;0;0;0;0;0 -6689;fleurir;positive;1;0;0;0;0;0 -6690;fleuriste;positive;0;0;0;0;0;0 -6691;fleuve;positive;0;0;0;0;0;0 -6692;flexibilité;positive;0;0;0;0;0;0 -6693;flexible;positive;0;0;0;0;0;0 -6694;flexion;positive;0;0;0;0;0;0 -6695;flic;negative;0;1;0;0;0;0 -6696;flirt;positive;0;0;0;0;1;0 -6697;flirter;positive;1;0;0;0;0;0 -6698;flocon;negative;0;0;0;0;0;0 -6699;flocon de neige;positive;0;0;0;0;0;0 -6700;flop;negative;0;0;0;0;0;1 -6701;floraison;positive;1;0;0;0;0;0 -6702;floral;positive;1;0;0;0;0;0 -6703;flore;positive;0;0;0;0;0;0 -6704;florir;positive;0;0;0;0;0;0 -6705;florissant;positive;0;0;0;0;0;0 -6706;flottabilité;positive;0;0;0;0;0;0 -6707;flottant;positive;0;0;0;0;0;0 -6708;flotte;positive;0;0;0;0;0;0 -6709;flottement;positive;0;0;0;0;0;0 -6710;flotter;positive;0;0;0;0;0;0 -6711;flotteur;positive;0;0;0;0;0;0 -6712;flou;negative;0;1;1;0;0;0 -6713;flou|flous;negative;0;1;1;0;0;0 -6714;fluctuer;positive;0;0;0;0;0;0 -6715;fluctuant;positive;0;0;0;0;0;0 -6716;fluctuation;negative;0;1;0;1;0;0 -6717;fluide;positive;0;0;0;0;0;0 -6718;fluidité;positive;1;0;0;0;0;0 -6719;fluo;positive;0;0;0;0;0;0 -6720;fluorescence;positive;0;0;0;0;0;0 -6721;fluorescent;positive;0;0;0;0;0;0 -6722;fluos;positive;0;0;0;0;0;0 -6723;flûte;positive;0;0;0;0;0;0 -6724;flûtiste;positive;0;0;0;0;0;0 -6725;fluvial;positive;0;0;0;0;0;0 -6726;flyer;positive;0;0;0;0;0;0 -6727;foc;positive;0;0;0;0;0;0 -6728;focal;positive;0;0;0;0;0;0 -6729;focaliser;positive;0;0;0;0;0;0 -6730;foi;positive;0;0;0;0;0;0 -6731;foi|fois;positive;0;0;0;0;0;0 -6732;folie;positive;1;0;0;0;0;0 -6733;folio;positive;0;0;0;0;0;0 -6734;folk;positive;0;0;0;0;0;0 -6735;folklore;positive;1;0;0;0;0;0 -6736;folliculaire;negative;0;0;0;0;0;0 -6737;follicule;negative;0;0;0;0;0;0 -6738;fonction;positive;0;0;0;0;0;0 -6739;fonctionner;positive;0;0;0;0;0;0 -6740;fond de cale;negative;0;1;1;0;0;1 -6741;fondamental;positive;0;0;0;0;0;0 -6742;fondamentalement;positive;0;0;0;0;0;0 -6743;fondant;negative;0;0;0;0;0;0 -6744;fondation;positive;0;0;0;0;0;0 -6745;fondement;positive;0;0;0;0;0;0 -6746;fonder;positive;0;0;0;0;0;0 -6747;fonderie;positive;0;0;0;0;0;0 -6748;fondre;negative;0;0;0;0;0;0 -6749;fondre sur;negative;0;1;0;1;1;0 -6750;fond|fonds;positive;0;0;0;0;0;0 -6751;fontaine;positive;0;0;0;0;0;0 -6752;fonte;negative;0;1;0;0;0;0 -6753;foot;positive;0;0;0;0;0;0 -6754;football;positive;0;0;0;0;0;0 -6755;forceps;negative;0;1;0;0;0;0 -6756;forer;negative;0;1;0;1;0;0 -6757;forêt verdoyant;positive;0;0;0;0;0;0 -6758;foreuse;negative;0;1;0;1;0;0 -6759;forge;positive;0;0;0;0;0;0 -6760;forger;positive;0;0;0;0;0;0 -6761;forgeron;positive;0;0;0;0;0;0 -6762;formalisme;negative;0;0;0;0;0;0 -6763;formalité;positive;0;0;0;0;0;0 -6764;formation;positive;0;0;0;0;0;0 -6765;former;positive;0;0;0;0;0;0 -6766;forme indistinct;negative;0;1;0;0;0;1 -6767;forme physique;positive;0;0;0;0;0;0 -6768;former un crôute;negative;0;0;0;0;0;1 -6769;formidable;positive;0;0;1;0;1;0 -6770;formulaire;positive;0;0;0;0;0;0 -6771;formulation;positive;0;0;0;0;0;0 -6772;formule;positive;0;0;0;0;0;0 -6773;formuler;positive;0;0;0;0;0;0 -6774;formuler un plainte;negative;0;0;1;1;0;0 -6775;fornication;negative;0;0;0;0;0;1 -6776;fortifiant;positive;0;0;0;0;0;0 -6777;fortification;positive;0;0;0;0;0;0 -6778;fortifier;positive;0;0;0;0;0;0 -6779;fortuit;negative;0;0;0;0;1;0 -6780;fortune;positive;0;0;0;0;1;0 -6781;fortuné;positive;1;0;0;0;0;0 -6782;forum;positive;0;0;0;0;0;0 -6783;fossile;negative;0;0;0;0;0;0 -6784;fots;positive;0;0;0;0;0;0 -6785;fou de joie;positive;0;0;0;0;1;0 -6786;fou folle|fou;negative;0;1;0;1;0;0 -6787;fou furieux;negative;0;1;0;1;0;1 -6788;foudre;negative;0;1;0;1;1;0 -6789;fouet;negative;0;1;0;1;0;0 -6790;fouetter;negative;0;1;1;1;0;1 -6791;fougère;negative;0;0;0;0;0;1 -6792;fouille;negative;0;0;0;0;1;0 -6793;fouiner;negative;0;0;0;1;0;1 -6794;foulard;positive;0;0;0;0;0;0 -6795;foule;negative;0;1;0;1;1;1 -6796;fouler;positive;0;0;0;0;0;0 -6797;foulure;negative;0;1;1;0;1;0 -6798;four;positive;0;0;0;0;0;0 -6799;fourbe;negative;0;1;1;1;0;1 -6800;fourche;positive;0;0;0;0;0;0 -6801;fourchette;positive;0;0;0;0;0;0 -6802;fourchu;negative;0;1;0;0;0;0 -6803;fourguer;negative;0;0;0;0;0;0 -6804;fourmi;negative;0;1;0;0;0;1 -6805;fourmiller;negative;0;1;0;1;0;0 -6806;fourmillant;negative;0;1;0;1;0;0 -6807;fourmillement;negative;0;1;0;1;0;0 -6808;fournaise;negative;0;0;0;1;0;0 -6809;fournée;positive;0;0;0;0;0;0 -6810;fournir;positive;0;0;0;0;0;0 -6811;fournisseur;positive;0;0;0;0;0;0 -6812;fourniture;positive;0;0;0;0;0;0 -6813;fourniture de bureau;positive;0;0;0;0;0;0 -6814;fourrer;negative;0;1;0;0;0;0 -6815;fourre tout;negative;0;0;0;0;0;0 -6816;fourreau;negative;0;0;0;0;0;0 -6817;fourrure;positive;0;0;0;0;0;0 -6818;fourvoyer;negative;0;1;0;1;0;0 -6819;foutaise;negative;0;0;1;1;0;1 -6820;foutre;negative;0;1;1;1;0;1 -6821;foyer;positive;0;0;0;0;0;0 -6822;fracas;negative;0;1;0;1;1;0 -6823;fracasser;negative;0;1;1;0;1;0 -6824;fraction;positive;0;0;0;0;0;0 -6825;fractionnaire;positive;0;0;0;0;0;0 -6826;fractionner;positive;0;0;0;0;0;0 -6827;fracture;negative;0;1;1;0;0;0 -6828;fracturer;negative;0;1;1;0;0;0 -6829;fragile;negative;0;1;1;0;1;0 -6830;fragilité;negative;0;1;1;0;0;0 -6831;fragment;positive;0;0;0;0;0;0 -6832;fragmentaire;positive;0;0;0;0;0;0 -6833;frais de scolarité;positive;0;0;0;0;0;0 -6834;frais général;positive;0;0;0;0;0;0 -6835;fraise;positive;0;0;0;0;0;0 -6836;franchement;positive;0;0;0;0;0;0 -6837;franchir;positive;0;0;0;0;0;0 -6838;franchise;positive;0;0;0;0;0;0 -6839;franchiser;positive;0;0;0;0;0;0 -6840;franchissement;positive;0;0;0;0;0;0 -6841;frange;positive;0;0;0;0;0;0 -6842;franger;positive;0;0;0;0;0;0 -6843;frange de lit;positive;0;0;0;0;0;0 -6844;frapper;negative;0;1;0;0;1;0 -6845;frappant;negative;0;1;0;0;1;0 -6846;frappeur;negative;0;1;0;1;0;0 -6847;fraternellement;positive;0;0;0;0;0;0 -6848;fraternité;positive;0;0;0;0;0;0 -6849;fraude;negative;0;0;0;1;0;0 -6850;frauder;negative;0;0;0;1;0;1 -6851;fredonnement;negative;0;1;0;0;0;0 -6852;fredonner;negative;0;1;0;0;0;0 -6853;freelance;positive;0;0;0;0;0;0 -6854;frégate;positive;0;1;0;0;0;0 -6855;frein;negative;0;1;0;0;1;0 -6856;freiner;negative;0;1;0;0;1;0 -6857;frelater;negative;0;0;1;1;0;0 -6858;frêle;negative;0;1;1;0;0;0 -6859;frelon;negative;0;1;0;0;0;0 -6860;frémissement;negative;0;1;0;0;0;0 -6861;frêne;negative;0;1;0;0;0;0 -6862;frénésie;negative;0;1;0;1;0;0 -6863;frénétique;negative;0;1;0;1;1;1 -6864;fréquemment;positive;0;0;0;0;0;0 -6865;fréquence;positive;0;0;0;0;0;0 -6866;fréquent;positive;0;0;0;0;0;0 -6867;fréquenter;positive;0;0;0;0;0;0 -6868;frère;positive;0;0;0;0;0;0 -6869;fresque;positive;0;0;0;0;0;0 -6870;fret;positive;0;0;0;0;0;0 -6871;frêt;positive;0;0;0;0;0;0 -6872;frétillement;positive;0;0;0;0;1;0 -6873;friable;negative;0;1;1;0;0;0 -6874;friandise;positive;1;0;0;0;0;0 -6875;friction;negative;0;0;0;1;0;1 -6876;frigide;negative;0;1;1;0;0;1 -6877;fringant;positive;0;0;0;0;1;0 -6878;fripe;negative;0;0;1;0;0;1 -6879;fripouille;negative;0;0;0;0;0;1 -6880;frire;negative;0;0;0;0;0;1 -6881;friser;positive;0;0;0;0;0;0 -6882;frisquet;negative;0;0;0;0;0;0 -6883;frissonner;negative;0;1;0;0;0;0 -6884;frissonnant;negative;0;1;0;0;0;0 -6885;frivole;negative;0;0;0;0;0;1 -6886;froidement;negative;0;0;1;0;0;0 -6887;froideur;negative;0;1;1;1;0;1 -6888;froisser;negative;0;0;1;0;0;0 -6889;froissement;negative;0;1;0;0;1;0 -6890;froncer le sourcil;negative;0;0;1;1;0;1 -6891;froncement;negative;0;0;1;1;0;0 -6892;fronde;negative;0;1;0;1;0;0 -6893;frontal;positive;0;0;0;0;0;0 -6894;frontalier;positive;0;0;0;0;0;0 -6895;frontispice;positive;0;0;0;0;0;0 -6896;frotter;negative;0;0;0;0;0;0 -6897;frottement;negative;0;1;0;1;0;1 -6898;frottis;negative;0;0;0;0;0;1 -6899;froussard;negative;0;1;1;1;0;1 -6900;frugal;positive;0;0;0;0;0;0 -6901;fruit;positive;0;0;0;0;0;0 -6902;fruit de mer;negative;0;0;0;0;0;1 -6903;frustration;negative;0;0;1;1;0;0 -6904;frustrer;negative;0;0;1;1;0;0 -6905;fugace;negative;0;1;1;0;1;0 -6906;fuir;negative;0;1;1;1;0;1 -6907;fulgurer;negative;0;1;0;0;1;0 -6908;fulgurant;negative;0;1;0;0;1;0 -6909;fulminer;negative;0;0;0;1;0;0 -6910;fumer;negative;0;0;0;0;0;1 -6911;fumeur;negative;0;0;0;0;0;1 -6912;fumier;negative;0;0;0;0;0;1 -6913;fumigation;negative;0;1;0;0;0;1 -6914;funérailles;negative;0;0;1;0;0;0 -6915;funk;negative;0;0;1;0;0;0 -6916;fureur;negative;0;1;1;1;0;0 -6917;furieusement;negative;0;0;0;1;0;0 -6918;furtivement;positive;0;0;0;0;1;0 -6919;fusain;negative;0;0;0;0;0;1 -6920;fuseau;positive;0;0;0;0;0;0 -6921;fuser;negative;0;1;0;1;0;0 -6922;fusée éclairant;positive;0;0;0;0;1;0 -6923;fusible;positive;0;0;0;0;0;0 -6924;fusil;negative;0;1;0;1;0;0 -6925;fusil de chasse;negative;0;1;0;0;0;0 -6926;fusillade;negative;0;1;1;1;0;0 -6927;fusionner;positive;0;0;0;0;0;0 -6928;fût;positive;0;0;0;0;0;0 -6929;futilité;negative;0;0;0;0;0;1 -6930;futur;positive;0;0;0;0;0;0 -6931;futur marié;positive;0;0;0;0;0;0 -6932;gâcher;negative;0;1;1;1;0;1 -6933;gâchette;negative;0;1;0;0;0;0 -6934;gaffe;negative;0;1;1;0;1;1 -6935;gage;positive;0;0;0;0;0;0 -6936;gagner pain;positive;0;0;0;0;0;0 -6937;gagner;positive;1;0;0;0;0;0 -6938;gagner net;positive;0;0;0;0;0;0 -6939;gai;positive;0;0;0;0;1;0 -6940;gaieté;positive;0;0;0;0;1;0 -6941;gainage;negative;0;0;0;0;0;0 -6942;gainer;negative;0;0;0;0;0;0 -6943;gaine;negative;0;1;1;0;0;0 -6944;gala;positive;0;0;0;0;0;0 -6945;galant;positive;0;0;0;0;0;0 -6946;galanterie;positive;0;0;0;0;0;0 -6947;galaxie;positive;0;0;0;0;0;0 -6948;galber;positive;0;0;0;0;0;0 -6949;gale;negative;0;1;0;0;0;1 -6950;galère;negative;0;1;1;0;0;0 -6951;galerie;positive;0;0;0;0;0;0 -6952;galerie marchand;positive;0;0;0;0;0;0 -6953;galet;positive;0;0;0;0;0;0 -6954;galon;positive;0;0;0;0;0;0 -6955;galop;positive;0;0;0;0;0;0 -6956;galoper;positive;0;0;0;0;0;0 -6957;galvanique;positive;1;0;0;0;0;0 -6958;galvaniser;positive;1;0;0;0;0;0 -6959;galvanisant;positive;1;0;0;0;0;0 -6960;gambader;positive;1;0;0;0;0;0 -6961;gamelle;positive;0;0;0;0;0;0 -6962;gamme;positive;1;0;0;0;0;0 -6963;gang;negative;0;1;0;1;0;0 -6964;gant;positive;0;0;0;0;0;0 -6965;gantelet;positive;0;0;0;0;0;0 -6966;garage;positive;0;0;0;0;0;0 -6967;garantir;positive;0;0;0;0;0;0 -6968;garantiesjustifiés;positive;0;0;0;0;0;0 -6969;garçon;positive;0;0;0;0;0;1 -6970;garçonne;positive;0;0;0;0;0;0 -6971;garde à vue;negative;0;1;1;1;0;0 -6972;garde du corps;positive;0;0;0;0;0;0 -6973;garde boue;positive;0;0;0;0;0;0 -6974;garder manger;positive;0;0;0;0;0;0 -6975;garde meuble;positive;0;0;0;0;0;0 -6976;garde robe;positive;0;0;0;0;0;0 -6977;garder;positive;0;0;0;0;0;0 -6978;garde;positive;0;0;0;0;0;0 -6979;gardien de prison gardien;negative;0;1;0;1;0;0 -6980;gardien gardien;negative;0;1;0;1;0;0 -6981;gare;positive;0;0;0;0;0;0 -6982;garenne;positive;0;0;0;0;0;0 -6983;garer;positive;0;0;0;0;0;0 -6984;garnir;positive;0;0;0;0;0;0 -6985;garnison;positive;0;0;0;0;0;0 -6986;garnissage;positive;0;0;0;0;0;0 -6987;garniture;positive;0;0;0;0;0;0 -6988;garrot;negative;0;1;0;0;0;0 -6989;gaspillage;negative;0;1;1;0;0;1 -6990;gaspiller;negative;0;0;1;1;0;1 -6991;gastrique;negative;0;0;0;0;0;1 -6992;gastronomie;positive;0;0;0;0;0;0 -6993;gastronomique;positive;0;0;0;0;0;0 -6994;gâteau;positive;0;0;0;0;0;0 -6995;gâteau au fromage;positive;0;0;0;0;0;0 -6996;gauche;negative;0;1;0;0;0;1 -6997;gaucherie;negative;0;1;0;0;0;1 -6998;gauchir;negative;0;0;0;0;0;1 -6999;gauchissement;negative;0;0;1;1;0;0 -7000;gaufrer;negative;0;0;0;0;0;0 -7001;gaufrette;positive;0;0;0;0;0;0 -7002;gay;negative;0;1;0;0;0;0 -7003;gays;negative;0;1;0;0;0;0 -7004;gaz;negative;0;0;0;0;0;1 -7005;gaze;positive;0;0;0;0;0;0 -7006;gazéification;negative;0;0;0;0;0;0 -7007;gazelle;positive;0;0;0;0;0;0 -7008;gazetier;positive;0;0;0;0;0;0 -7009;gazette;positive;0;0;0;0;0;0 -7010;gazeuse;negative;0;0;0;0;0;1 -7011;gazeux;negative;0;0;0;0;0;1 -7012;gazoduc;positive;0;0;0;0;0;0 -7013;gazon;positive;0;0;0;0;0;0 -7014;gazouiller;positive;1;0;0;0;0;0 -7015;geai;positive;0;0;0;0;0;0 -7016;géantses;negative;0;1;0;0;0;0 -7017;geindre;negative;0;1;1;0;0;1 -7018;gel;negative;0;1;1;0;0;1 -7019;gélatine;negative;0;0;0;0;0;1 -7020;geler;negative;0;0;1;0;0;0 -7021;gelure;negative;0;1;1;0;0;1 -7022;gémeau;positive;0;0;0;0;0;0 -7023;gémir;negative;0;1;1;0;0;1 -7024;gémissement;negative;0;1;1;0;0;1 -7025;gênant;negative;0;1;0;0;0;0 -7026;gêne;negative;0;0;1;0;0;1 -7027;généalogie;positive;0;0;0;0;0;0 -7028;général;positive;0;0;0;0;0;0 -7029;généralement;positive;0;0;0;0;0;0 -7030;général|générale;positive;0;0;0;0;0;0 -7031;généralisation;negative;0;0;0;0;0;0 -7032;généralité;positive;0;0;0;0;0;0 -7033;générals;positive;0;0;0;0;0;0 -7034;générateur;positive;0;0;0;0;0;0 -7035;génération;positive;0;0;0;0;0;0 -7036;générer;positive;0;0;0;0;0;0 -7037;générique;positive;0;0;0;0;0;0 -7038;générosité;positive;0;0;0;0;1;0 -7039;genèse;positive;0;0;0;0;0;0 -7040;génétique;positive;0;0;0;0;0;0 -7041;génial;positive;0;0;1;0;0;0 -7042;génie;positive;0;0;0;0;0;0 -7043;génisse;positive;0;0;0;0;0;0 -7044;génital;negative;0;0;0;0;0;1 -7045;géniteur;positive;0;0;0;0;0;0 -7046;genou;positive;0;0;0;0;0;0 -7047;gens;positive;0;0;0;0;0;0 -7048;gentil;positive;0;0;0;0;0;0 -7049;gentilhomme;positive;0;0;0;0;0;0 -7050;gentillesse;positive;0;0;0;0;0;0 -7051;géographie;positive;0;0;0;0;0;0 -7052;geôle;negative;0;1;1;1;0;0 -7053;géologie;positive;0;0;0;0;0;0 -7054;géométrie;positive;0;0;0;0;0;0 -7055;gérance;positive;0;0;0;0;0;0 -7056;géranium;positive;0;0;0;0;0;0 -7057;gérant;positive;0;0;0;0;0;0 -7058;gerbe;negative;0;0;1;0;0;0 -7059;gerber;negative;0;0;0;0;0;1 -7060;gérer;positive;0;0;0;0;0;0 -7061;gériatrique;negative;0;0;1;0;0;0 -7062;germer;negative;0;0;0;0;0;1 -7063;germination;negative;0;0;0;0;0;0 -7064;gestation;positive;0;0;0;0;0;0 -7065;geste;positive;0;0;0;0;0;0 -7066;gestion;positive;0;0;0;0;0;0 -7067;gestionnaire;positive;0;0;0;0;0;0 -7068;ghetto;negative;0;1;1;0;0;1 -7069;gicler;negative;0;1;0;0;1;0 -7070;gifle;negative;0;0;0;1;1;0 -7071;gifler;negative;0;0;0;1;1;0 -7072;gigantesque;negative;0;1;0;0;0;0 -7073;gilet;positive;0;0;0;0;0;0 -7074;gin;positive;0;0;0;0;0;0 -7075;gingembre;negative;0;0;0;0;0;0 -7076;girafe;positive;0;0;0;0;0;0 -7077;girouette;positive;0;0;0;0;0;0 -7078;gisant;negative;0;1;1;1;0;1 -7079;givre;negative;0;0;1;0;0;0 -7080;givrer;negative;0;0;1;0;0;0 -7081;glabre;negative;0;0;0;0;0;0 -7082;glace;negative;0;0;0;0;0;0 -7083;glacer;negative;0;1;1;0;0;0 -7084;glaciaire;negative;0;1;1;0;0;0 -7085;glacial;negative;0;1;1;0;0;0 -7086;glacier;negative;0;0;0;0;0;0 -7087;glacière;positive;0;0;0;0;0;0 -7088;gladiateur;negative;0;1;0;1;0;0 -7089;glaiciales;negative;0;1;1;0;0;0 -7090;glaire;negative;0;0;0;0;0;1 -7091;glaise;positive;0;0;0;0;0;0 -7092;gland;positive;0;0;0;0;0;0 -7093;glaner;negative;0;0;0;0;0;0 -7094;glapir;negative;0;1;0;1;1;0 -7095;glapissement;negative;0;1;0;1;1;0 -7096;glas;negative;0;1;1;0;0;0 -7097;glissade;negative;0;1;0;0;1;0 -7098;glisser;negative;0;0;0;0;0;0 -7099;glissant;negative;0;0;0;0;0;0 -7100;glissement;negative;0;1;0;0;0;0 -7101;glissement de terrain;negative;0;1;1;0;0;0 -7102;globe;positive;0;0;0;0;0;0 -7103;globulaire;positive;0;0;0;0;0;0 -7104;gloire;positive;0;0;0;0;0;0 -7105;glorification;positive;1;0;0;0;0;0 -7106;glorifier;positive;0;0;0;0;0;0 -7107;glossaire;positive;0;0;0;0;0;0 -7108;gloussement;positive;0;0;0;0;1;0 -7109;glousser;positive;0;0;0;0;1;0 -7110;gloutonnerie;negative;0;0;0;0;0;1 -7111;gluer;negative;0;0;0;0;0;1 -7112;gluant;negative;0;0;0;0;0;1 -7113;glucose;positive;0;0;0;0;0;0 -7114;gluten;negative;0;0;0;0;0;0 -7115;glycérine;negative;0;0;0;0;0;1 -7116;gnome;negative;0;1;0;1;0;1 -7117;gobelet;positive;0;0;0;0;0;0 -7118;gobelin;negative;0;1;0;0;0;1 -7119;goéland;negative;0;1;0;0;0;1 -7120;goélette;negative;0;0;0;0;0;0 -7121;goguenard;negative;0;0;1;1;0;1 -7122;goinfre;negative;0;0;0;0;0;1 -7123;golden retriever;positive;0;0;0;0;0;0 -7124;golf;positive;0;0;0;0;0;0 -7125;golfe;negative;0;1;0;0;0;0 -7126;gomme;negative;0;0;0;0;0;0 -7127;gond;positive;0;0;0;0;0;0 -7128;gondole;positive;0;0;0;0;0;0 -7129;gonflage;negative;0;1;0;1;0;0 -7130;gonfler;negative;0;1;0;1;0;1 -7131;gonflement;negative;0;1;0;0;0;1 -7132;gong;negative;0;1;0;0;1;0 -7133;gonorrhée;negative;0;1;1;1;0;1 -7134;gorge;negative;0;1;0;0;0;1 -7135;gorger;positive;0;1;0;0;1;1 -7136;gorille;negative;0;1;0;1;0;0 -7137;gospel;positive;0;0;0;0;0;0 -7138;gosse;positive;0;0;0;0;0;0 -7139;goudron;negative;0;0;0;0;0;1 -7140;goudronner;negative;0;0;0;0;0;1 -7141;goudronneuse;negative;0;0;0;0;0;1 -7142;goudronneux;negative;0;0;0;0;0;1 -7143;gouffre;negative;0;1;0;0;0;0 -7144;gouge;positive;0;0;0;0;0;0 -7145;goujat;negative;0;0;0;1;0;1 -7146;goulag;negative;0;1;1;0;0;0 -7147;gourmand;negative;0;0;0;0;0;1 -7148;gourmandise;negative;0;0;0;1;0;1 -7149;gourmet;positive;0;0;0;0;0;0 -7150;gourou;negative;0;1;0;1;0;1 -7151;gousset;positive;0;0;0;0;0;0 -7152;goût;positive;0;0;1;0;0;1 -7153;goût piquant;positive;0;0;0;0;1;1 -7154;goûter;positive;0;0;0;0;0;0 -7155;goûteur|goûteux;positive;1;0;0;0;0;0 -7156;goûteux;positive;1;0;0;0;0;0 -7157;goutte;negative;0;1;1;0;0;1 -7158;goutte à goutte;negative;0;0;0;0;0;0 -7159;gouttelette;negative;0;0;0;0;0;0 -7160;goutter;negative;0;0;0;0;0;0 -7161;gouttière;negative;0;0;0;0;0;1 -7162;gouvernail;positive;0;0;0;0;0;0 -7163;gouvernant;positive;0;0;0;0;0;0 -7164;gouvernement;positive;0;1;0;0;0;0 -7165;gouverner;positive;0;0;0;0;0;0 -7166;gouverneur;positive;0;0;0;0;0;0 -7167;grace;positive;0;0;0;0;0;0 -7168;grâce;positive;0;0;0;0;0;0 -7169;gracieusement;positive;0;0;0;0;0;0 -7170;gradation;positive;0;0;0;0;0;0 -7171;grade;positive;0;0;0;0;0;0 -7172;gradin;positive;0;0;0;0;0;0 -7173;graduellement;positive;0;0;0;0;0;0 -7174;graine;positive;0;0;0;0;0;0 -7175;graissage;negative;0;0;0;0;0;1 -7176;graisse;negative;0;0;1;0;0;1 -7177;graisser;negative;0;0;0;0;0;1 -7178;graisseux;negative;0;0;0;0;0;1 -7179;grammaire;positive;0;0;0;0;0;0 -7180;gramme;positive;0;0;0;0;0;0 -7181;grand;positive;0;0;0;0;0;0 -7182;grand coup;negative;0;1;0;1;1;0 -7183;grand dam;negative;0;0;1;0;0;1 -7184;grand et maigre;negative;0;0;1;0;0;1 -7185;grand livre;positive;0;0;0;0;0;0 -7186;grand magasin;positive;0;0;0;0;0;0 -7187;grand mère;positive;0;0;0;0;0;0 -7188;grand père;positive;0;0;0;0;0;0 -7189;grandement;positive;0;0;0;0;0;0 -7190;grandeur;positive;0;0;0;0;1;0 -7191;grandiloquence;positive;0;0;0;0;0;0 -7192;grandiose;positive;0;0;0;0;1;0 -7193;grandir;positive;0;0;0;0;0;0 -7194;grange;positive;0;0;0;0;0;0 -7195;granite;positive;0;0;0;0;0;0 -7196;granule;negative;0;0;0;0;0;0 -7197;granuler;negative;0;0;0;0;0;0 -7198;graphique;positive;0;0;0;0;0;0 -7199;graphisme;positive;0;0;0;0;0;0 -7200;grappe;positive;0;0;0;0;0;0 -7201;grassouillet;negative;0;0;0;0;0;1 -7202;gratis;positive;0;0;0;0;0;0 -7203;gratitude;positive;0;0;0;0;0;0 -7204;grattage;negative;0;1;0;1;0;1 -7205;gratter ciel;positive;0;0;0;0;0;0 -7206;gratter;negative;0;1;1;1;1;0 -7207;gratuit;positive;0;0;0;0;0;1 -7208;gratuitement;positive;0;0;0;0;0;0 -7209;graver;positive;0;0;0;0;0;0 -7210;gravement;negative;0;0;1;0;0;0 -7211;gravier;negative;0;0;0;0;0;0 -7212;gravir;positive;0;1;0;0;0;0 -7213;gravitation;positive;0;0;0;0;0;0 -7214;graviter;positive;0;0;0;0;0;0 -7215;gravure;positive;0;0;0;0;0;0 -7216;gravure sur bois;positive;0;0;0;0;0;0 -7217;gré;positive;0;0;0;0;0;0 -7218;gréement;positive;0;0;0;0;0;0 -7219;greffe;positive;0;0;0;0;0;0 -7220;greffer;positive;0;0;0;0;0;0 -7221;greffier;positive;0;0;0;0;0;0 -7222;greffon;positive;0;0;0;0;0;0 -7223;grégaire;positive;0;0;0;0;0;0 -7224;grêlé;negative;0;1;1;0;0;0 -7225;grelotter;negative;0;1;0;0;0;0 -7226;grelottant;negative;0;1;0;0;0;0 -7227;grenade;negative;0;1;0;1;0;0 -7228;grenat;positive;0;0;0;0;0;0 -7229;grenier;positive;0;0;0;0;0;0 -7230;grenouille;negative;0;0;0;0;0;1 -7231;grès;positive;0;0;0;0;0;0 -7232;grésil;negative;0;1;1;0;0;1 -7233;grésillement;negative;0;1;0;1;0;0 -7234;grésiller;negative;0;1;0;1;0;0 -7235;grève;negative;0;0;0;1;0;0 -7236;gribouillage;negative;0;0;0;0;1;0 -7237;gribouiller;negative;0;0;0;0;1;0 -7238;grief;negative;0;0;1;1;0;1 -7239;griffe;negative;0;1;0;1;0;0 -7240;griffer;negative;0;1;0;1;1;0 -7241;griffon;positive;0;0;0;0;0;0 -7242;griffonner;negative;0;0;0;0;0;0 -7243;griffure;negative;0;1;0;1;1;0 -7244;grignoter;positive;0;0;0;0;0;0 -7245;grill;positive;0;0;0;0;0;0 -7246;grillage;negative;0;1;0;0;1;0 -7247;griller;negative;0;0;0;1;0;0 -7248;grillon;positive;0;0;0;0;0;0 -7249;grimace;negative;0;1;1;1;0;1 -7250;grimacer;negative;0;1;1;1;0;1 -7251;grimper;positive;0;1;0;0;0;0 -7252;grincer;negative;0;1;0;1;0;1 -7253;grincement;negative;0;1;1;1;1;0 -7254;grippe;negative;0;1;1;0;0;1 -7255;gris;negative;0;0;1;0;0;1 -7256;griser;negative;1;0;0;0;0;0 -7257;grisant;negative;1;0;0;0;0;0 -7258;gris|grise;negative;0;0;1;0;0;1 -7259;grisonnant;negative;0;0;1;0;0;1 -7260;grivois;negative;0;0;0;0;0;1 -7261;groggy;negative;0;0;1;0;1;0 -7262;groin;negative;0;0;0;0;0;1 -7263;grommeler;negative;0;1;1;1;0;1 -7264;grondement;negative;0;1;0;1;1;1 -7265;gros lot;positive;0;0;0;0;1;0 -7266;gros morceau;positive;0;0;0;0;0;0 -7267;gros titre;positive;0;0;0;0;0;0 -7268;grossesse;positive;0;0;0;0;0;1 -7269;grosseur;negative;0;1;0;0;0;0 -7270;grossièrement;negative;0;0;0;0;0;0 -7271;grossir;negative;0;0;0;0;0;0 -7272;grotesque;negative;0;0;0;0;0;1 -7273;grotte;negative;0;1;1;0;0;0 -7274;grouiller;negative;0;1;0;1;0;1 -7275;grouillant;negative;0;1;0;1;0;0 -7276;grouper;positive;0;0;0;0;0;0 -7277;groupement;positive;0;0;0;0;0;0 -7278;grue;positive;0;0;0;0;0;0 -7279;grumeleux;negative;0;0;0;0;0;1 -7280;gué;positive;0;0;0;0;0;0 -7281;guépard;negative;0;1;0;0;0;0 -7282;guêpe;negative;0;1;0;0;0;0 -7283;guérillero;negative;0;1;0;1;0;0 -7284;guérir;positive;0;0;0;0;0;0 -7285;guérison;positive;0;0;0;0;0;0 -7286;guerre;negative;0;1;1;1;0;0 -7287;guet;positive;0;0;0;0;0;0 -7288;guet apens;negative;0;1;0;1;1;0 -7289;guetteur;positive;0;0;0;0;0;0 -7290;gueule;negative;0;0;0;1;0;1 -7291;gueule|gueules;negative;0;0;0;0;0;1 -7292;guichet;positive;0;0;0;0;0;0 -7293;guidage;positive;0;0;0;0;0;0 -7294;guide;positive;0;0;0;0;0;0 -7295;guider;positive;0;0;0;0;0;0 -7296;guider un barque;positive;0;0;0;0;0;0 -7297;guilde;positive;0;0;0;0;0;0 -7298;guillotine;negative;0;1;1;1;0;1 -7299;guillotiner;negative;0;1;1;1;0;1 -7300;guinder;negative;0;0;1;0;0;1 -7301;guinée;positive;0;0;0;0;0;0 -7302;guirlande;positive;1;0;0;0;0;0 -7303;guitare;positive;0;0;0;0;0;0 -7304;gymnase;positive;0;0;0;0;0;0 -7305;gymnaste;positive;0;0;0;0;0;0 -7306;gymnastique;positive;0;0;0;0;0;0 -7307;gynécologie;negative;0;0;0;0;0;1 -7308;gyroscope;positive;0;0;0;0;0;0 -7309;habile;positive;0;0;0;0;0;0 -7310;habileté;positive;0;0;0;0;0;0 -7311;habiliter;positive;0;0;0;0;0;0 -7312;habiller;positive;0;0;0;0;0;0 -7313;habillement;positive;0;0;0;0;0;0 -7314;habitat;positive;0;0;0;0;0;0 -7315;habitation;positive;0;0;0;0;0;0 -7316;habiter;positive;0;0;0;0;0;0 -7317;habitude;positive;0;0;0;0;0;0 -7318;habituellement;positive;0;0;0;0;0;0 -7319;hacher;negative;0;1;0;0;0;0 -7320;hachette;negative;0;1;0;1;1;0 -7321;hachis;negative;0;0;0;1;0;0 -7322;hacienda;positive;0;0;0;0;0;0 -7323;haie;positive;0;0;0;0;0;0 -7324;haineux;negative;0;1;1;1;0;1 -7325;haïr;negative;0;1;1;1;0;1 -7326;hâle;positive;0;0;0;0;0;0 -7327;hâler;positive;0;0;0;0;0;0 -7328;haleine;positive;0;0;0;0;0;0 -7329;halètement;negative;0;1;0;0;1;0 -7330;haleter;negative;0;1;1;0;1;0 -7331;hall;positive;0;0;0;0;0;0 -7332;hallebardier;positive;0;0;0;0;0;0 -7333;hallucination;negative;0;1;0;0;0;0 -7334;halo;positive;0;0;0;0;0;0 -7335;halte;negative;0;1;1;1;0;0 -7336;haltère;negative;0;0;0;0;0;0 -7337;hamac;positive;0;0;0;0;0;0 -7338;hameau;positive;0;0;0;0;0;0 -7339;hameçon;negative;0;1;0;0;1;0 -7340;hanche;positive;0;0;0;0;0;0 -7341;handicap;negative;0;0;1;0;0;0 -7342;harceler;negative;0;1;0;1;0;0 -7343;harcèlement;negative;0;1;0;1;0;0 -7344;harde;negative;0;1;0;0;0;0 -7345;hardi;positive;0;0;0;0;0;0 -7346;harem;positive;0;0;0;0;0;0 -7347;harmonica;positive;0;0;0;0;0;0 -7348;harmonie;positive;0;0;0;0;0;0 -7349;harmonieusement;positive;0;0;0;0;0;0 -7350;harmonique;positive;0;0;0;0;0;0 -7351;harmoniser;positive;0;0;0;0;0;0 -7352;harnais;negative;0;1;1;0;0;0 -7353;harpe;positive;0;0;0;0;0;0 -7354;hasard;positive;0;0;0;0;1;0 -7355;hasard extraordinaire;positive;0;0;0;0;1;0 -7356;haschisch;negative;0;0;0;0;0;1 -7357;hâte;negative;0;0;0;1;0;0 -7358;hâter;negative;0;1;0;0;1;0 -7359;hâtivement;negative;0;1;0;0;1;0 -7360;hausse;positive;0;0;0;0;0;0 -7361;haussement d épaule;negative;0;0;0;0;0;0 -7362;hausser;positive;0;0;0;0;0;0 -7363;hausser le épaule;negative;0;0;0;0;0;0 -7364;haut et fort;negative;0;0;0;1;0;0 -7365;haut le c?ur;negative;0;0;0;0;0;1 -7366;haut parleur;positive;0;0;0;0;0;0 -7367;hautain;negative;0;0;0;1;0;1 -7368;hautbois;positive;0;0;0;0;0;0 -7369;haut terre;positive;0;0;0;0;0;0 -7370;hauteur;positive;0;0;0;0;0;0 -7371;havre;positive;0;0;0;0;0;0 -7372;hebdomadaire;positive;0;0;0;0;0;0 -7373;hébergement;positive;0;0;0;0;0;0 -7374;hébétement;negative;0;0;1;0;1;0 -7375;hébéter;negative;0;0;1;0;1;0 -7376;hectare;positive;0;0;0;0;0;0 -7377;hédonisme;positive;1;0;0;0;0;0 -7378;hégémonique;negative;0;1;1;0;0;0 -7379;hélicoïdal;positive;0;0;0;0;0;0 -7380;hématite;positive;0;0;0;0;0;0 -7381;hemi;positive;0;0;0;0;0;0 -7382;hémi;positive;0;0;0;0;0;0 -7383;hémisphère;positive;0;0;0;0;0;0 -7384;hémisphérique;positive;0;0;0;0;0;0 -7385;hémorragie;negative;0;1;1;0;0;1 -7386;hémorroïde;negative;0;0;0;0;0;1 -7387;hennir;negative;0;0;0;0;0;0 -7388;hennissement;negative;0;0;0;0;0;0 -7389;héraldique;positive;0;0;0;0;0;0 -7390;héraut;positive;0;0;0;0;0;0 -7391;herbacé;negative;0;0;0;0;0;0 -7392;herbe;negative;0;0;0;0;0;1 -7393;herbe à chat;negative;0;0;0;0;0;1 -7394;herbier;positive;0;0;0;0;0;0 -7395;héréditaire;positive;0;0;0;0;0;0 -7396;hérédité;positive;0;0;0;0;0;0 -7397;hérésie;negative;0;0;0;1;0;1 -7398;hérétique;negative;0;0;0;1;0;1 -7399;hérisser;negative;0;1;0;0;0;0 -7400;hérisser de pointe;negative;0;1;0;0;0;0 -7401;hérisson;positive;0;0;0;0;0;0 -7402;hériter;positive;0;0;0;0;0;0 -7403;héritier;positive;0;0;0;0;0;0 -7404;hermaphrodite;negative;0;0;0;0;1;1 -7405;herméneutique;positive;0;0;0;0;0;0 -7406;hernie;negative;0;1;1;0;0;1 -7407;héroïne;negative;0;0;0;0;0;1 -7408;héroïque;positive;0;0;0;0;1;0 -7409;héroïque;positive;0;0;0;0;1;0 -7410;héroïsme;positive;0;0;0;0;1;0 -7411;héro|héros;positive;0;0;0;0;1;0 -7412;herpès;negative;0;0;0;0;0;1 -7413;hésiter;negative;0;1;1;0;0;0 -7414;hésitant;negative;0;1;1;0;0;0 -7415;hésitation;negative;0;1;0;0;0;0 -7416;hétéroclite;positive;0;0;0;0;0;0 -7417;hétérogenéité;positive;0;0;0;0;0;0 -7418;hétérogénéité;positive;0;0;0;0;0;0 -7419;heure;positive;0;0;0;0;0;0 -7420;heure du coucher;positive;0;0;0;0;0;0 -7421;heureusement;positive;1;0;0;0;0;0 -7422;heurt;negative;0;1;0;1;0;0 -7423;heurter sur le côté;negative;0;0;0;0;0;0 -7424;hexagone;positive;0;0;0;0;0;0 -7425;hiatal;negative;0;1;0;0;1;0 -7426;hiatus;negative;0;1;0;0;1;0 -7427;hibernation;negative;0;0;1;0;0;0 -7428;hiberner;negative;0;0;1;0;0;0 -7429;hic;negative;0;1;0;0;1;0 -7430;hiérarchique;positive;0;0;0;0;0;0 -7431;highlands;positive;0;0;0;0;0;0 -7432;hilarant;positive;0;0;0;0;1;0 -7433;hilarité;positive;0;0;0;0;1;0 -7434;hippie;negative;0;0;0;0;0;1 -7435;hippique;positive;0;0;0;0;0;0 -7436;hirondelle;positive;0;0;0;0;0;0 -7437;hirsute;negative;0;0;0;0;0;1 -7438;hisser;positive;0;0;0;0;0;0 -7439;histoire;negative;0;0;1;1;0;0 -7440;histologie;positive;0;0;0;0;0;0 -7441;historiographie;positive;0;0;0;0;0;0 -7442;historique;positive;0;0;0;0;1;0 -7443;hiver;negative;0;0;1;0;0;0 -7444;hivernal;negative;0;0;1;0;0;0 -7445;hobby;positive;1;0;0;0;0;0 -7446;hocher le tête;positive;0;0;0;0;0;0 -7447;hocher de le tête;positive;0;0;0;0;0;0 -7448;hochet;negative;0;1;0;0;1;0 -7449;hockey;positive;0;0;0;0;0;0 -7450;holocauste;negative;0;1;1;1;0;1 -7451;homélie;positive;0;0;0;0;0;0 -7452;homéopathie;positive;0;0;0;0;0;0 -7453;homéopathique;positive;0;0;0;0;0;0 -7454;homicide;negative;0;1;1;1;0;1 -7455;hommage;positive;0;0;0;0;0;0 -7456;homme;positive;0;0;0;0;0;0 -7457;homme d état;positive;0;0;0;0;0;0 -7458;homme politique;positive;0;0;0;0;0;0 -7459;homogène;positive;0;0;0;0;0;0 -7460;homogénéité;positive;0;0;0;0;0;0 -7461;homologie;positive;0;0;0;0;0;0 -7462;homologue;positive;0;0;0;0;0;0 -7463;homonyme;positive;0;0;0;0;0;0 -7464;homosexualité;negative;0;0;0;0;0;0 -7465;homosexualité féminin;negative;0;0;0;0;0;0 -7466;hongre;negative;0;1;1;0;0;0 -7467;hongrer;negative;0;1;1;0;0;0 -7468;honnêteté;positive;0;0;0;0;0;0 -7469;honneur;positive;0;0;0;0;0;0 -7470;honorable;positive;0;0;0;0;0;0 -7471;honorer;positive;0;0;0;0;0;0 -7472;honte;negative;0;1;1;1;0;1 -7473;hôpital;negative;0;1;1;0;0;0 -7474;hoquet;negative;0;1;0;0;1;0 -7475;hoqueter;negative;0;1;0;0;1;0 -7476;horaire;positive;0;0;0;0;0;0 -7477;horde;negative;0;1;0;1;1;0 -7478;horizon;positive;0;0;0;0;0;0 -7479;horizontal;positive;0;0;0;0;0;0 -7480;horizontalement;positive;0;0;0;0;0;0 -7481;horloge;positive;0;0;0;0;0;0 -7482;horoscope;positive;0;0;0;0;0;0 -7483;horrifier;negative;0;1;1;0;1;1 -7484;horrifique;negative;0;1;1;1;0;1 -7485;hors de prix;negative;0;0;1;1;0;1 -7486;hors de propos;negative;0;1;0;0;0;0 -7487;hors du chemin;negative;0;1;1;0;0;0 -7488;hors jeu;negative;0;1;1;0;0;0 -7489;hors norme;positive;1;0;0;0;0;0 -7490;hors le loi;negative;0;1;0;1;0;0 -7491;horticole;positive;0;0;0;0;0;0 -7492;horticulture;positive;0;0;0;0;0;0 -7493;hospice;negative;0;0;1;0;0;0 -7494;hospitalité;positive;0;0;0;0;0;0 -7495;hostie;positive;0;0;0;0;0;0 -7496;hostile;negative;0;1;1;1;0;1 -7497;hôte;positive;0;0;0;0;0;0 -7498;hôtel;positive;0;0;0;0;0;0 -7499;hotte;positive;0;1;0;1;0;1 -7500;houe;negative;0;1;0;0;0;0 -7501;houle;negative;0;1;0;0;0;0 -7502;hourra;positive;1;0;0;0;0;0 -7503;huard;positive;0;0;0;0;0;1 -7504;huer;negative;0;1;0;1;1;1 -7505;huile;negative;0;0;0;0;0;1 -7506;huiler;negative;0;0;0;0;0;1 -7507;huitième;positive;0;0;0;0;0;0 -7508;huître;negative;0;0;0;0;0;1 -7509;hululement;negative;0;0;0;1;0;1 -7510;hululer;negative;0;0;0;1;0;1 -7511;humain;positive;0;0;0;0;0;0 -7512;humanitaire;positive;0;0;0;0;1;0 -7513;humanité;positive;0;0;0;0;0;0 -7514;humble;positive;0;0;1;0;0;1 -7515;humblement;positive;0;0;0;0;0;0 -7516;humeur;positive;0;0;0;0;0;0 -7517;humeur noir;negative;0;0;1;0;0;0 -7518;humide;negative;0;0;0;0;0;1 -7519;humidité;negative;0;0;0;0;0;1 -7520;humilier;negative;0;0;1;0;0;1 -7521;humiliant;negative;0;0;1;0;0;1 -7522;humiliation;negative;0;1;1;0;1;1 -7523;humilité;positive;0;0;0;0;0;0 -7524;hummer;positive;0;0;0;0;0;0 -7525;humoriste;positive;1;0;0;0;0;0 -7526;humoristique;positive;1;0;0;0;0;0 -7527;hutte;positive;0;0;1;0;0;1 -7528;hybride;negative;0;0;0;0;0;0 -7529;hydraulique;positive;0;0;0;0;0;0 -7530;hydre;negative;0;1;0;0;0;0 -7531;hydrocéphalie;negative;0;1;1;0;0;1 -7532;hydrodynamique;positive;0;0;0;0;0;0 -7533;hydrogène;positive;0;0;0;0;0;0 -7534;hydrographique;positive;0;0;0;0;0;0 -7535;hydrologie;positive;0;0;0;0;0;0 -7536;hydromel;positive;0;0;0;0;0;0 -7537;hygiène;positive;0;0;0;0;0;0 -7538;hygiéniqes;positive;0;0;0;0;0;0 -7539;hygiénique;positive;0;0;0;0;0;0 -7540;hymne;positive;0;0;1;0;0;0 -7541;hyper médiatisation;negative;0;0;0;0;0;0 -7542;hyperbole;negative;0;0;0;0;0;0 -7543;hypertrophie;negative;0;1;0;0;1;1 -7544;hypnotique;negative;0;1;0;0;0;0 -7545;hypocrisie;negative;0;0;0;1;0;1 -7546;hypocrite;negative;0;0;0;0;0;1 -7547;hypothèque;negative;0;1;1;0;0;0 -7548;hypothéquer;negative;0;1;1;0;0;0 -7549;hypothétique;negative;0;0;0;0;0;0 -7550;hystérie;negative;0;1;0;1;0;0 -7551;iceberg;negative;0;1;0;0;0;0 -7552;icône;positive;0;0;0;0;0;0 -7553;iconique;positive;0;0;0;0;0;0 -7554;iconographie;positive;0;0;0;0;0;0 -7555;idéalisme;positive;1;0;0;0;0;0 -7556;idéaliste;positive;0;0;0;0;0;0 -7557;idée;positive;0;0;0;0;0;0 -7558;idée faux;negative;0;1;0;1;0;1 -7559;idée fixe;negative;0;1;1;1;0;0 -7560;idem;positive;0;0;0;0;0;0 -7561;identification;positive;0;0;0;0;0;0 -7562;identifier;positive;0;0;0;0;0;0 -7563;identique;positive;0;0;0;0;0;0 -7564;identiquement;positive;0;0;0;0;0;0 -7565;identité;positive;0;0;0;0;0;0 -7566;idéologie;positive;0;0;0;0;0;0 -7567;idiomatique;positive;0;0;0;0;0;0 -7568;idiome;positive;0;0;0;0;0;0 -7569;idiotie;negative;0;0;1;1;0;1 -7570;idolâtrie;positive;0;1;0;0;0;1 -7571;idole;positive;1;0;0;0;0;0 -7572;if;positive;0;0;0;0;0;0 -7573;igloo;positive;0;0;0;0;0;0 -7574;igname;positive;0;0;0;0;0;0 -7575;igné;negative;0;0;0;0;0;0 -7576;ignoble;negative;0;1;0;1;0;1 -7577;ignorance;negative;0;0;1;0;0;0 -7578;ignorer;negative;0;0;1;0;0;1 -7579;ignorant;negative;0;0;1;0;0;1 -7580;il y avoir;positive;0;0;0;0;0;0 -7581;île;positive;0;0;0;0;0;0 -7582;illégal;negative;0;1;1;1;0;1 -7583;illégalement;negative;0;1;0;0;0;0 -7584;illégalité;negative;0;1;0;1;0;1 -7585;illicite;negative;0;1;1;1;0;1 -7586;illisible;negative;0;0;0;0;0;0 -7587;illogique;negative;0;0;0;0;0;0 -7588;illumination;positive;0;0;0;0;1;0 -7589;illuminer;positive;0;0;0;0;1;0 -7590;illusion;negative;0;1;1;1;1;0 -7591;illusionnisme;negative;0;1;0;0;1;0 -7592;illustratif;positive;0;0;0;0;0;0 -7593;illustration;positive;0;0;0;0;0;0 -7594;illustrer;positive;0;0;0;0;0;0 -7595;îlot;positive;0;0;0;0;0;0 -7596;image;positive;0;0;0;0;0;0 -7597;imagerie;positive;0;0;0;0;0;0 -7598;imaginaire;positive;0;0;0;0;0;0 -7599;imaginer;positive;0;0;0;0;0;0 -7600;imaginatif;positive;0;0;0;0;0;0 -7601;imagination;positive;0;0;0;0;0;0 -7602;imam;positive;0;0;0;0;0;0 -7603;imberbe;negative;0;0;0;0;0;0 -7604;imbiber;negative;0;0;0;0;0;1 -7605;imiter;negative;0;0;0;0;0;0 -7606;imitation;negative;0;0;0;1;1;1 -7607;immatriculation;positive;0;0;0;0;0;0 -7608;immature;negative;0;0;0;0;0;1 -7609;immaturité;negative;0;0;0;1;0;1 -7610;immédiat;positive;0;0;0;0;1;0 -7611;immédiatement;positive;0;0;0;0;1;0 -7612;immédiateté;positive;0;0;0;0;1;0 -7613;immémorial;positive;0;0;0;0;0;0 -7614;immerger;negative;0;1;1;0;1;0 -7615;immérité;negative;0;0;1;1;0;0 -7616;immersion;negative;0;1;0;0;0;0 -7617;immeuble;positive;0;0;0;0;0;0 -7618;immigration;positive;0;0;0;0;0;0 -7619;imminent;negative;0;1;0;0;1;0 -7620;immobile;negative;0;1;1;0;1;0 -7621;immobiliser;negative;0;1;0;1;1;0 -7622;immobilité;positive;0;1;1;0;0;0 -7623;immodéré;negative;0;0;0;1;0;0 -7624;immoral;negative;0;1;1;1;0;1 -7625;immoralité;negative;0;0;0;1;0;1 -7626;immortalité;positive;0;0;0;0;0;0 -7627;immortel;positive;0;0;1;0;0;0 -7628;immuable;positive;0;0;0;0;0;0 -7629;immunisation;positive;0;0;0;0;0;0 -7630;immuniser;positive;0;0;0;0;0;0 -7631;immunitaire;positive;0;0;0;0;0;0 -7632;immunité;positive;0;0;0;0;0;0 -7633;impact;negative;0;1;0;0;0;0 -7634;impalpable;negative;0;1;0;0;0;0 -7635;imparfaitement;negative;0;0;0;0;0;1 -7636;impartialité;positive;0;0;0;0;0;0 -7637;impasse;negative;0;1;1;1;0;1 -7638;impatience;negative;0;0;0;1;0;0 -7639;impatient;negative;0;0;0;1;0;0 -7640;impatient|impatiente;negative;0;0;0;1;0;0 -7641;impeccable;positive;0;0;0;0;0;0 -7642;impénitent;negative;0;0;1;0;0;0 -7643;impérativement;positive;0;0;0;0;0;0 -7644;impératrice;positive;0;0;0;0;0;0 -7645;imperceptible;negative;0;0;1;0;0;0 -7646;imperfection;negative;0;0;1;0;0;1 -7647;imperial;positive;0;0;0;0;0;0 -7648;impérial;positive;0;0;0;0;0;0 -7649;impérissable;positive;0;0;0;0;0;0 -7650;imperméabiliser;positive;0;0;0;0;0;0 -7651;imperméable;positive;0;1;0;1;0;0 -7652;impertinent;negative;0;0;0;1;0;0 -7653;imperturbable;positive;0;0;0;0;0;0 -7654;impie;negative;0;1;1;0;0;0 -7655;implacable;positive;0;0;0;0;0;0 -7656;implant;positive;0;0;0;0;0;0 -7657;implantation;positive;0;0;0;0;0;0 -7658;implanter;positive;0;0;0;0;0;0 -7659;implicite;positive;0;0;0;0;0;0 -7660;impliquer;positive;0;0;0;0;0;0 -7661;implorer;negative;0;1;1;0;0;0 -7662;implosion;negative;0;1;0;0;1;0 -7663;impoli;negative;0;0;0;0;0;1 -7664;impopulaire;negative;0;0;1;0;0;1 -7665;importance;positive;0;0;0;0;0;0 -7666;important;positive;0;0;0;0;0;0 -7667;importation;positive;0;0;0;0;0;0 -7668;importuner;negative;0;1;0;0;0;0 -7669;imposer;negative;0;1;0;1;0;0 -7670;imposition;negative;0;1;1;0;0;0 -7671;impossibilité;negative;0;0;1;0;0;0 -7672;impossible;negative;0;0;1;0;0;0 -7673;impossible à distinguer;negative;0;0;0;0;0;0 -7674;imposte;positive;0;0;0;0;0;0 -7675;imposteur;negative;0;0;0;1;0;1 -7676;imposture;negative;0;0;0;1;0;1 -7677;impôt;negative;0;0;1;1;0;0 -7678;impotent;negative;0;0;1;0;0;0 -7679;impraticable;negative;0;0;1;0;0;0 -7680;imprécision;negative;0;1;1;0;0;0 -7681;imprégner;negative;0;0;0;0;0;0 -7682;impression;positive;0;0;0;0;0;0 -7683;impressionnable;negative;0;1;0;0;0;0 -7684;impressionnant;positive;0;1;0;0;1;0 -7685;impressionner;positive;0;0;0;0;1;0 -7686;imprévisible;negative;0;1;0;0;1;0 -7687;imprimante;positive;0;0;0;0;0;0 -7688;imprimer;positive;0;0;0;0;0;0 -7689;imprimerie;positive;0;0;0;0;0;0 -7690;imprimeur;positive;0;0;0;0;0;0 -7691;improbable;negative;0;1;1;0;1;0 -7692;impromptu;negative;0;0;0;0;1;0 -7693;improvisation;negative;0;0;0;0;1;0 -7694;improviser;negative;0;0;0;0;1;0 -7695;imprudence;negative;0;1;0;1;1;1 -7696;imprudent;negative;0;1;1;1;0;0 -7697;impudence;positive;0;0;0;0;0;0 -7698;impudent;negative;0;0;0;1;0;0 -7699;impuissance;negative;0;1;1;1;0;0 -7700;impuissant;negative;0;1;1;1;0;1 -7701;impulsion;positive;0;0;0;0;1;0 -7702;impunité;negative;0;0;1;1;0;0 -7703;impur;negative;0;0;0;0;0;1 -7704;impureté;negative;0;0;0;0;0;1 -7705;imputable;negative;0;1;1;0;0;0 -7706;imputation;negative;0;0;1;1;0;0 -7707;in quarto;positive;0;0;0;0;0;0 -7708;inacceptable;negative;0;0;1;1;0;0 -7709;inaccessible;negative;0;0;1;1;0;0 -7710;inachever;negative;0;0;1;0;0;0 -7711;inachèvement;negative;0;0;1;0;0;0 -7712;inaction;negative;0;1;1;0;0;0 -7713;inactivation;negative;0;1;0;0;0;0 -7714;inactiver;negative;0;1;0;0;0;0 -7715;inactivité;negative;0;0;1;0;0;0 -7716;inadéquation;negative;0;0;1;0;0;1 -7717;inadmissible;negative;0;0;1;1;0;1 -7718;inaliénable;positive;0;0;0;0;0;0 -7719;inamical;negative;0;1;1;1;0;1 -7720;inanimé;negative;0;1;1;0;0;0 -7721;inaperçu;negative;0;0;1;0;0;0 -7722;inapplicable;negative;0;0;0;0;0;0 -7723;inapproprié;negative;0;0;1;1;0;1 -7724;inappropriée;negative;0;0;1;1;0;1 -7725;inappropriées;negative;0;0;1;1;0;1 -7726;inappropriés;negative;0;0;1;1;0;1 -7727;inapte;negative;0;0;1;0;0;0 -7728;inassouvi;negative;0;0;1;1;1;0 -7729;inattentif;negative;0;0;0;0;0;0 -7730;inaudible;negative;0;0;0;0;0;0 -7731;inaugural;positive;0;0;0;0;0;0 -7732;inauguration;positive;0;0;0;0;0;0 -7733;inaugurer;positive;1;0;0;0;0;0 -7734;incandescent;negative;0;1;0;0;1;0 -7735;incapable;negative;0;0;1;0;0;0 -7736;incapacité;negative;0;0;1;0;0;1 -7737;incarcération;negative;0;1;1;1;0;1 -7738;incarcérer;negative;0;1;1;1;0;0 -7739;incarnation;positive;0;0;0;0;0;0 -7740;incarner;positive;0;0;0;0;0;0 -7741;incassable;positive;0;0;0;0;0;0 -7742;incendiaire;negative;0;1;0;1;1;0 -7743;incendie;negative;0;1;0;1;1;0 -7744;incendie volontaire;negative;0;1;0;1;0;0 -7745;incendier;negative;0;1;0;1;0;0 -7746;incertitude;negative;0;1;0;0;1;0 -7747;incessant;negative;0;1;1;1;0;0 -7748;inceste;negative;0;1;1;1;0;1 -7749;inchangé;positive;0;0;0;0;0;0 -7750;incidence;positive;0;0;0;0;0;0 -7751;incident;negative;0;1;1;0;1;1 -7752;incinération;negative;0;0;1;0;0;1 -7753;inciser;negative;0;1;0;0;0;0 -7754;incision;negative;0;1;0;0;0;1 -7755;inciter;positive;0;0;0;0;0;0 -7756;inclinaison;negative;0;1;0;0;0;0 -7757;incliner;negative;0;1;0;0;0;0 -7758;inclination;positive;0;0;0;0;0;0 -7759;inclus;positive;0;0;0;0;0;0 -7760;inclusion;positive;0;0;0;0;0;0 -7761;incognito;negative;0;1;0;0;0;0 -7762;incohérence;negative;0;0;1;0;0;0 -7763;incolore;negative;0;0;1;0;0;0 -7764;incommensurable;positive;0;0;0;0;0;0 -7765;incommensurablement;positive;0;0;0;0;0;0 -7766;incommode;negative;0;0;1;1;0;1 -7767;incommoder;negative;0;0;1;1;0;1 -7768;incompatible;negative;0;0;1;1;0;1 -7769;incompétence;negative;0;0;1;1;0;1 -7770;incomplet;negative;0;0;0;0;0;0 -7771;incomplètement;negative;0;0;1;0;0;0 -7772;inconciliable;negative;0;1;1;1;0;0 -7773;inconfort;negative;0;0;1;0;0;1 -7774;inconfortable;negative;0;0;0;0;0;0 -7775;incongru;negative;0;0;0;1;1;0 -7776;inconnu;negative;0;1;0;0;0;0 -7777;inconscience;negative;0;1;1;0;1;0 -7778;inconséquence;negative;0;0;1;0;0;0 -7779;inconsidéré;negative;0;0;0;1;0;1 -7780;inconsistance;negative;0;0;1;0;0;0 -7781;inconstant;negative;0;0;0;1;0;1 -7782;inconstitutionnel;negative;0;0;0;0;0;0 -7783;incontestable;positive;0;0;0;0;0;0 -7784;incontestablement;positive;0;0;0;0;0;0 -7785;incontesté;positive;0;0;0;0;0;0 -7786;incontinence;negative;0;1;0;0;1;1 -7787;incontrôlable;negative;0;1;0;1;1;0 -7788;incontrôlé;negative;0;1;1;0;1;0 -7789;inconvénient;negative;0;0;1;1;0;0 -7790;incorporation;positive;0;0;0;0;0;0 -7791;incorporer;positive;0;0;0;0;0;0 -7792;incorrect;negative;0;0;0;0;0;0 -7793;incrédule;negative;0;0;0;1;1;1 -7794;incrément;positive;0;0;0;0;0;0 -7795;incrimination;negative;0;1;1;1;0;0 -7796;incroyable;negative;0;0;0;0;1;0 -7797;incrustation;negative;0;0;0;0;0;0 -7798;incubation;negative;0;1;1;0;0;0 -7799;incube;negative;0;1;0;0;0;1 -7800;inculpation;negative;0;1;0;1;0;1 -7801;inculper;negative;0;1;0;1;0;1 -7802;inculquer;positive;0;0;0;0;0;0 -7803;inculte;negative;0;0;1;0;0;1 -7804;incurable;negative;0;1;1;1;0;1 -7805;incursion;negative;0;1;0;1;0;0 -7806;indécence;negative;0;0;0;1;0;1 -7807;indécis;negative;0;1;1;0;1;0 -7808;indécision;negative;0;0;1;0;0;0 -7809;indéfectible;positive;0;0;0;0;0;0 -7810;indéfendable;negative;0;1;0;0;0;0 -7811;indéfini;negative;0;0;0;0;0;0 -7812;indéifférents;negative;0;0;1;1;0;1 -7813;indélébile;positive;0;0;0;0;0;0 -7814;indemne;positive;0;0;0;0;1;0 -7815;indemnisation;positive;0;0;0;0;0;0 -7816;indemniser;positive;0;0;0;0;0;0 -7817;indemnité;positive;0;0;0;0;0;0 -7818;indéniable;negative;0;0;0;0;0;0 -7819;indépendance;positive;0;0;0;0;1;0 -7820;indépendant;positive;0;0;0;0;0;0 -7821;indescriptible;negative;0;1;1;0;0;0 -7822;indésirable;negative;0;1;1;1;0;1 -7823;indestructible;positive;0;0;0;0;0;0 -7824;indéterminer;negative;0;0;1;0;0;0 -7825;index;positive;0;0;0;0;0;0 -7826;index géographique;positive;0;0;0;0;0;0 -7827;indicateur;positive;0;0;0;0;0;0 -7828;indicible;negative;0;1;1;0;0;0 -7829;indifféremment;positive;0;0;0;0;0;0 -7830;indifférence;negative;0;1;1;1;0;1 -7831;indifférenciable;negative;0;0;0;0;0;0 -7832;indifférenciables;negative;0;0;0;0;0;0 -7833;indifférent;negative;0;0;1;0;0;1 -7834;indigène;positive;0;0;0;0;0;0 -7835;indigestion;negative;0;0;0;0;0;1 -7836;indignation;negative;0;0;0;1;0;1 -7837;indigne;negative;0;0;0;0;0;1 -7838;indigner;negative;0;0;0;1;0;1 -7839;indigo;positive;0;0;0;0;0;0 -7840;indiquer;positive;0;0;0;0;0;0 -7841;indiscernable;negative;0;0;0;0;0;0 -7842;indiscipliné;negative;0;1;0;1;0;1 -7843;indiscutable;positive;0;0;0;0;0;0 -7844;indiscutablement;positive;0;0;0;0;0;0 -7845;indispensable;positive;0;0;0;0;0;0 -7846;indistinct;negative;0;1;0;0;0;0 -7847;individualité;positive;0;0;0;0;0;0 -7848;individuel;negative;0;0;1;0;0;0 -7849;individueld;negative;0;0;1;0;0;0 -7850;indivisible;positive;0;0;0;0;0;0 -7851;indolent;negative;0;0;0;0;0;0 -7852;indolore;positive;0;0;0;0;0;0 -7853;indomptable;positive;0;1;0;0;0;0 -7854;indu;negative;0;0;1;1;0;0 -7855;indubitable;positive;0;0;0;0;0;1 -7856;induction;positive;0;0;0;0;0;0 -7857;induire;negative;0;0;0;0;0;0 -7858;induire en erreur;negative;0;1;0;1;0;0 -7859;indulgence;positive;0;0;0;0;0;0 -7860;indulgent;positive;0;0;0;0;0;0 -7861;industrie;positive;0;0;0;0;0;0 -7862;inédit;positive;0;0;1;0;1;0 -7863;ineffable;negative;0;1;1;1;0;0 -7864;inefficace;negative;0;0;1;0;0;1 -7865;inefficacité;negative;0;0;1;0;0;1 -7866;inégal;negative;0;1;1;1;0;1 -7867;inégalable;positive;0;0;0;0;0;0 -7868;inégalé;positive;0;0;0;0;0;0 -7869;inégalité;negative;0;1;1;1;0;0 -7870;inélastique;negative;0;0;0;0;0;0 -7871;inéligible;negative;0;0;1;0;0;0 -7872;inepte;negative;0;0;0;1;0;1 -7873;ineptie;negative;0;1;1;0;0;1 -7874;inépuisable;positive;0;0;0;0;0;0 -7875;inéquitable;negative;0;0;1;1;0;0 -7876;inerte;negative;0;1;1;0;0;0 -7877;inertie;positive;0;0;0;0;0;0 -7878;inestimable;positive;1;0;0;0;0;0 -7879;inévitable;negative;0;1;1;0;0;0 -7880;inévitablement;negative;0;0;0;0;0;0 -7881;inexact;negative;0;0;0;0;0;0 -7882;inexactitude;negative;0;0;0;1;0;1 -7883;inexcusable;negative;0;0;1;1;0;1 -7884;inexistant;negative;0;0;1;0;0;0 -7885;inexpérience;negative;0;0;1;0;0;0 -7886;inexpérimenté;negative;0;0;1;0;0;0 -7887;inexpliqué;negative;0;1;1;0;0;0 -7888;inexploité;negative;0;0;1;0;0;0 -7889;inexploré;negative;0;0;1;0;0;0 -7890;infaillibilité;positive;0;0;0;0;0;0 -7891;infaillible;positive;0;0;0;0;0;0 -7892;infaisable;negative;0;0;1;0;0;0 -7893;infamie;negative;0;0;1;1;0;1 -7894;infanterie;positive;0;0;0;0;0;0 -7895;infanticide;negative;0;1;1;1;0;1 -7896;infantile;negative;0;0;0;1;0;1 -7897;infarctus;negative;0;1;0;0;1;0 -7898;infecteninfects;negative;0;1;0;1;0;1 -7899;infecter;negative;0;1;1;0;0;1 -7900;infection;negative;0;1;1;0;0;1 -7901;inférence;positive;0;0;0;0;0;0 -7902;infériorité;negative;0;0;1;1;0;0 -7903;infernal;negative;0;1;1;1;0;1 -7904;infertilité;negative;0;1;1;0;0;0 -7905;infestation;negative;0;1;0;0;0;1 -7906;infidele;negative;0;0;1;0;0;1 -7907;infidèle;negative;0;1;1;1;0;1 -7908;infidélité;negative;0;1;1;1;0;1 -7909;infini;positive;0;0;0;0;0;0 -7910;infiniment;positive;0;0;0;0;0;0 -7911;infinité;positive;0;0;0;0;0;0 -7912;infinitésimal;negative;0;0;0;0;0;0 -7913;infirme;negative;0;1;1;0;0;0 -7914;infirmer;negative;0;1;0;0;0;0 -7915;infirmerie;positive;0;0;0;0;0;0 -7916;infirmier;positive;0;0;0;0;0;0 -7917;infirmier en chef;positive;0;0;0;0;0;0 -7918;infirmité;negative;0;1;1;0;0;0 -7919;inflammation;negative;0;1;0;0;0;1 -7920;inflation;negative;0;1;0;1;0;0 -7921;infliction;negative;0;1;1;0;0;0 -7922;infliger;negative;0;1;1;1;0;0 -7923;inflorescence;positive;1;0;0;0;0;0 -7924;influence;positive;0;0;0;0;0;0 -7925;influencer;positive;0;0;0;0;0;0 -7926;influent;positive;0;0;0;0;0;0 -7927;infomes;negative;0;0;0;0;0;1 -7928;infondé;negative;0;1;0;1;0;1 -7929;information;positive;0;0;0;0;0;0 -7930;informer;positive;0;0;0;0;0;0 -7931;informel;positive;0;0;0;0;0;0 -7932;infortune;negative;0;1;1;0;0;1 -7933;infos;positive;0;0;0;0;0;0 -7934;infranchissable;negative;0;0;1;0;0;0 -7935;infrastructure;positive;0;0;0;0;0;0 -7936;infructueux;negative;0;0;1;0;0;0 -7937;infus;positive;0;0;0;0;0;0 -7938;infuser;positive;0;0;0;0;0;0 -7939;infusion;positive;0;0;0;0;0;0 -7940;ingénierie;positive;0;0;0;0;0;0 -7941;ingénieur;positive;0;0;0;0;0;0 -7942;ingéniosité;positive;0;0;0;0;0;0 -7943;ingérable;negative;0;1;1;1;0;1 -7944;ingérence;negative;0;1;1;1;1;0 -7945;ingérer;positive;0;0;0;0;0;0 -7946;ingestion;positive;0;0;0;0;0;0 -7947;ingrat;negative;0;0;0;1;0;1 -7948;ingrédient;positive;0;0;0;0;0;0 -7949;inhabité;negative;0;0;1;0;0;0 -7950;inhalation;positive;0;0;0;0;0;0 -7951;inhaler;positive;0;0;0;0;0;0 -7952;inhérent;positive;0;0;0;0;0;0 -7953;inhiber;negative;0;0;1;0;0;0 -7954;inhibition;negative;0;1;1;0;0;0 -7955;inhumain;negative;0;1;1;1;0;1 -7956;inhumanité;negative;0;1;1;1;0;1 -7957;inhumation;negative;0;1;1;1;0;0 -7958;inhumer;negative;0;1;1;0;0;0 -7959;inimitable;positive;0;0;0;0;0;0 -7960;inimitié;negative;0;1;1;1;0;1 -7961;inintelligible;negative;0;1;1;0;0;0 -7962;inintéressant;negative;0;0;1;0;0;1 -7963;ininterrompu;positive;0;0;0;0;0;0 -7964;iniquité;negative;0;0;1;0;0;1 -7965;initial;positive;0;0;0;0;0;0 -7966;initiative;positive;0;0;0;0;0;0 -7967;injecter;negative;0;1;0;0;0;0 -7968;injection;negative;0;1;0;0;0;0 -7969;injonction;negative;0;1;1;1;0;0 -7970;injurier;negative;0;1;0;1;0;0 -7971;injuste;negative;0;0;1;1;0;1 -7972;injustement;negative;0;1;1;1;0;0 -7973;injustice;negative;0;0;1;1;0;0 -7974;injustifié;negative;0;0;1;1;0;1 -7975;inné;positive;0;0;0;0;0;0 -7976;innocemment;positive;0;0;0;0;0;0 -7977;innocence;positive;0;0;0;0;0;0 -7978;innocenter;positive;0;0;0;0;0;0 -7979;innofensives;positive;0;0;0;0;0;0 -7980;innomables;negative;0;1;1;0;0;0 -7981;innombrable;negative;0;0;0;0;0;0 -7982;innommable;negative;0;1;1;0;0;0 -7983;innovation;positive;0;0;0;0;0;0 -7984;innover;positive;0;0;0;0;0;0 -7985;inoccupé;negative;0;0;1;0;0;0 -7986;inoculation;positive;0;0;0;0;0;0 -7987;inondation;negative;0;1;1;0;1;0 -7988;inonder;negative;0;1;0;0;1;0 -7989;inopérant;negative;0;0;1;1;0;0 -7990;inopportun;negative;0;0;1;1;1;1 -7991;inorganique;negative;0;0;0;0;0;0 -7992;inoxydable;positive;0;0;0;0;0;0 -7993;inquiéter;negative;0;1;1;0;1;0 -7994;inquiétant;negative;0;1;1;0;0;0 -7995;inquiétude;negative;0;1;1;0;0;0 -7996;insaisissable;negative;0;0;0;0;1;0 -7997;insatisfaction;negative;0;0;1;1;0;0 -7998;insatisfaisant;negative;0;0;1;0;0;1 -7999;insatisfait;negative;0;0;1;1;1;1 -8000;inscription;positive;0;0;0;0;0;0 -8001;inscrire;positive;0;0;0;0;0;0 -8002;insecte;negative;0;1;0;0;0;1 -8003;insécurité;negative;0;1;1;0;0;0 -8004;inséparable;positive;0;0;0;0;0;0 -8005;insérer;positive;0;0;0;0;0;0 -8006;insertion;positive;0;0;0;0;0;0 -8007;insigne;positive;0;0;0;0;0;0 -8008;insignifiance;negative;0;0;0;0;0;0 -8009;insignifiant;negative;0;0;1;1;0;1 -8010;insinuation;negative;0;1;0;1;1;0 -8011;insinuer;negative;0;0;0;0;0;0 -8012;insipide;negative;0;0;1;0;0;1 -8013;insister;negative;0;0;0;1;0;0 -8014;insister sur;positive;0;0;0;0;0;0 -8015;insolent;negative;0;0;0;1;0;0 -8016;insoluble;negative;0;0;1;1;0;0 -8017;insolvabilité;negative;0;1;1;0;1;0 -8018;insolvable;negative;0;1;1;0;0;0 -8019;insomnie;negative;0;1;1;0;0;0 -8020;inspecter;positive;0;0;0;0;0;0 -8021;inspiration;positive;0;0;0;0;0;0 -8022;inspirer;positive;0;0;0;0;1;0 -8023;instabilité;negative;0;1;0;1;1;1 -8024;installation;positive;0;0;0;0;0;0 -8025;installer;positive;0;0;0;0;0;0 -8026;instantané;positive;0;0;0;0;1;0 -8027;instantanément;positive;0;0;0;0;1;0 -8028;instigation;negative;0;0;0;0;0;0 -8029;instinct;positive;0;0;0;0;0;0 -8030;instituer;positive;0;0;0;0;0;0 -8031;institut;positive;0;0;0;0;0;0 -8032;instituteur;positive;0;0;0;0;0;0 -8033;institution;positive;0;0;0;0;0;0 -8034;instructeur;positive;0;0;0;0;0;0 -8035;instruction;positive;0;0;0;0;0;0 -8036;instrument;positive;0;0;0;0;0;0 -8037;instrumental;positive;0;0;0;0;0;0 -8038;instrumentalisation;negative;0;1;1;1;0;0 -8039;instrumentiste;positive;0;0;0;0;0;0 -8040;insuffisamment;negative;0;0;1;0;0;0 -8041;insuffisance;negative;0;0;1;1;0;1 -8042;insuffisant;negative;0;1;1;0;0;0 -8043;insuffler;positive;0;0;0;0;0;0 -8044;insulaire;negative;0;1;1;0;0;0 -8045;insulter;negative;0;1;1;1;0;1 -8046;insultant;negative;0;1;1;1;0;1 -8047;insulte;negative;0;0;1;1;1;1 -8048;insupportable;negative;0;0;1;0;0;1 -8049;insurmontable;negative;0;1;1;0;0;0 -8050;insurpassé;positive;0;1;0;0;0;0 -8051;insurpassée;positive;0;1;0;0;0;0 -8052;insurpassées;positive;0;1;0;0;0;0 -8053;insurpassés;positive;0;1;0;0;0;0 -8054;insurrection;negative;0;0;0;1;0;0 -8055;intact;positive;0;0;0;0;0;0 -8056;intangible;positive;0;0;0;0;0;0 -8057;integral;positive;0;0;0;0;0;0 -8058;intégral;positive;0;0;0;0;0;0 -8059;intégralité;positive;0;0;0;0;0;0 -8060;intégrals;positive;0;0;0;0;0;0 -8061;intégration;positive;0;0;0;0;0;0 -8062;intégrer;positive;0;0;0;0;0;0 -8063;intégrité;positive;0;0;0;0;0;0 -8064;intellect;positive;0;0;0;0;0;0 -8065;intelligence;positive;0;1;0;0;0;0 -8066;intelligent;positive;0;0;0;0;0;0 -8067;intelligibilité;positive;0;0;0;0;0;0 -8068;intenable;negative;0;0;1;1;0;1 -8069;intendance;positive;0;0;0;0;0;0 -8070;intendant;positive;0;0;0;0;0;0 -8071;intendant économe;positive;0;0;0;0;0;0 -8072;intendant|intendante;positive;0;0;0;0;0;0 -8073;intensément;positive;0;0;0;0;0;0 -8074;intention;positive;0;0;0;0;0;0 -8075;interaction;positive;0;0;0;0;0;0 -8076;intercéder;negative;0;1;1;1;1;0 -8077;intercepter;positive;0;0;0;0;1;0 -8078;interception;positive;0;0;0;0;1;0 -8079;intercession;positive;0;0;0;0;0;0 -8080;interchangeable;positive;0;0;0;0;0;0 -8081;interdépendance;negative;0;1;1;0;0;0 -8082;interdépendant;negative;0;1;1;0;0;0 -8083;interdiction;negative;0;1;1;1;0;1 -8084;interdire;negative;0;1;1;1;0;0 -8085;intéresser;positive;1;0;0;0;0;0 -8086;intérêt;positive;0;0;0;0;0;0 -8087;interférence;negative;0;1;1;1;0;0 -8088;interféromètre;negative;0;0;0;0;0;0 -8089;interfonctionnement;positive;0;0;0;0;0;0 -8090;intérieur;positive;0;0;0;0;0;1 -8091;intérieurement;positive;0;0;0;0;0;0 -8092;intérimaire;positive;0;0;0;0;0;0 -8093;interlocutoire;positive;0;0;0;0;0;0 -8094;interlude;positive;0;0;0;0;0;0 -8095;intermède;positive;0;0;0;0;0;0 -8096;intermédiaire;positive;0;0;0;0;0;0 -8097;intermittent;positive;0;0;0;0;0;0 -8098;international;positive;0;0;0;0;0;0 -8099;interne;positive;0;0;0;0;0;0 -8100;internement;negative;0;1;1;0;0;0 -8101;interphone;positive;0;0;0;0;0;0 -8102;interpolation;positive;0;0;0;0;0;0 -8103;interpoler;positive;0;0;0;0;0;0 -8104;interprétation;positive;0;0;0;0;0;0 -8105;interprétation erroné;negative;0;1;1;0;0;0 -8106;interprète;positive;0;0;0;0;0;0 -8107;interpréter;positive;1;0;0;0;0;0 -8108;interrogatoire;negative;0;1;1;1;0;0 -8109;interroger;negative;0;1;0;0;0;0 -8110;interrupteur;positive;0;0;0;0;0;0 -8111;interruption de grossesse;negative;0;1;1;0;0;1 -8112;intersection;positive;0;0;0;0;0;0 -8113;intervalle;positive;0;0;0;0;0;0 -8114;intervention;positive;0;0;0;0;0;0 -8115;interview;positive;0;0;0;0;0;0 -8116;interviewer;positive;0;0;0;0;0;0 -8117;intestat;negative;0;1;1;0;1;0 -8118;intestin;negative;0;0;0;0;0;1 -8119;intestinal;negative;0;0;0;0;0;1 -8120;intimement;positive;0;1;0;0;0;0 -8121;intimidation;negative;0;1;0;1;0;0 -8122;intimider;negative;0;1;0;0;0;0 -8123;intituler;positive;0;0;0;0;0;0 -8124;intolérable;negative;0;0;0;1;0;1 -8125;intolérance;negative;0;1;0;1;0;1 -8126;intolérant;negative;0;1;1;1;0;1 -8127;intonation;positive;0;0;0;0;0;0 -8128;intraitable;negative;0;0;1;1;0;0 -8129;intransigeant;negative;0;0;0;1;0;0 -8130;intrépide;positive;0;1;0;0;0;0 -8131;intrigant;positive;0;1;0;0;1;0 -8132;intrigue secondaire;negative;0;0;0;0;0;0 -8133;intriguer;negative;0;1;0;0;1;0 -8134;intrinsèque;positive;0;0;0;0;0;0 -8135;intrinsèquement;positive;0;0;0;0;0;0 -8136;introduction;positive;0;0;0;0;0;0 -8137;introduire;positive;0;0;0;0;0;0 -8138;introduire clandestinement;negative;0;1;0;0;0;0 -8139;introspection;positive;0;0;0;0;0;0 -8140;intuition;positive;0;0;0;0;0;0 -8141;intuitivement;positive;0;0;0;0;0;0 -8142;inutile;negative;0;0;1;0;0;0 -8143;invaincu;positive;0;0;1;0;1;0 -8144;invalidation;negative;0;0;1;0;0;0 -8145;invalide;negative;0;1;1;0;0;0 -8146;invalider;negative;0;0;1;0;1;0 -8147;invalidité;negative;0;0;1;0;0;0 -8148;invariablement;positive;0;0;0;0;0;0 -8149;invasion;negative;0;1;0;1;1;0 -8150;inventaire;positive;0;0;0;0;0;0 -8151;inverse;negative;0;0;0;0;0;0 -8152;inverser;negative;0;1;0;0;0;0 -8153;inversement;negative;0;0;0;0;0;0 -8154;inversion;negative;0;1;0;1;1;1 -8155;investigation;positive;0;0;0;0;0;0 -8156;investisseur;positive;0;0;0;0;0;0 -8157;investiture;positive;0;0;0;0;0;0 -8158;invincible;positive;0;0;0;0;0;0 -8159;invisibilité;negative;0;1;0;0;0;0 -8160;invisible;negative;0;1;1;0;0;0 -8161;inviter;positive;0;0;0;0;1;0 -8162;invitation;positive;0;0;0;0;0;0 -8163;invocation;positive;0;0;0;0;0;0 -8164;involontaire;negative;0;1;1;0;1;0 -8165;involontairement;negative;0;1;1;0;1;0 -8166;involution;positive;0;1;0;1;0;0 -8167;invoquer;positive;0;0;0;0;0;0 -8168;irascibilité;negative;0;0;1;1;0;1 -8169;ire;negative;0;0;0;1;0;0 -8170;iris;positive;0;1;0;0;0;0 -8171;iriser;positive;0;0;0;0;0;0 -8172;irlandais;negative;0;0;0;0;0;1 -8173;ironie;negative;0;0;0;1;0;0 -8174;ironique;negative;0;0;0;1;0;0 -8175;irradiation;negative;0;1;0;0;0;0 -8176;irradier;positive;1;0;0;0;0;0 -8177;irrationalité;negative;0;1;0;1;0;0 -8178;irréaliste;negative;0;1;1;0;0;0 -8179;irrecevable;negative;0;0;0;1;0;1 -8180;irréductible;positive;0;0;0;0;0;0 -8181;irréfutable;positive;0;0;0;0;0;0 -8182;irrégularité;negative;0;1;0;0;0;0 -8183;irrégulièrement;negative;0;0;0;0;0;0 -8184;irréparable;negative;0;1;1;0;0;0 -8185;irrépressible;positive;0;0;0;0;0;0 -8186;irréprochable;positive;0;0;0;0;0;0 -8187;irrésistible;positive;0;0;0;0;0;0 -8188;irrespect;negative;0;0;0;1;0;0 -8189;irresponsable;negative;0;1;1;0;0;0 -8190;irréversible;negative;0;1;0;0;0;0 -8191;irrévocabilité;negative;0;0;1;0;0;0 -8192;irrévocable;negative;0;0;1;1;0;0 -8193;irrigation;positive;0;0;0;0;0;0 -8194;irriguer;positive;0;0;0;0;0;0 -8195;irritabilité;negative;0;0;0;1;0;0 -8196;irritable;negative;0;0;0;1;0;0 -8197;irriter;negative;0;0;0;1;0;1 -8198;irritant;negative;0;0;0;1;0;1 -8199;irritation;negative;0;0;1;1;0;1 -8200;isolant;positive;0;0;1;1;0;1 -8201;isolation;positive;0;0;0;0;0;0 -8202;isomorphisme;positive;0;0;0;0;0;0 -8203;isothermique;positive;0;0;0;0;0;0 -8204;issue;positive;0;0;0;0;0;0 -8205;itération;positive;0;0;0;0;0;0 -8206;itérer;positive;0;0;0;0;0;0 -8207;itinéraire;positive;0;0;0;0;0;0 -8208;itinérant;positive;1;0;0;0;0;0 -8209;ivoire;positive;0;0;0;0;0;0 -8210;ivre;negative;0;0;0;0;0;1 -8211;ivresse;negative;0;1;1;0;1;0 -8212;jacasser;negative;0;0;0;1;0;1 -8213;jachère;negative;0;0;1;0;0;0 -8214;jacinthe;positive;0;0;0;0;0;0 -8215;jackpot;positive;0;0;0;0;1;0 -8216;jacquet;positive;0;0;0;0;1;0 -8217;jade;positive;0;0;0;0;0;0 -8218;jaguar;negative;0;1;0;0;0;0 -8219;jaillissement;positive;0;0;0;0;1;1 -8220;jalon;positive;0;0;0;0;0;0 -8221;jalouser;negative;0;0;0;1;0;1 -8222;jaloux;negative;0;0;0;1;0;1 -8223;jalousie;negative;0;1;1;1;0;1 -8224;jambe;positive;0;0;0;0;0;0 -8225;jambier|jambière;positive;0;0;0;0;0;0 -8226;jambier|jambière de cuir;positive;0;0;0;0;0;0 -8227;jambon;positive;0;0;0;0;0;0 -8228;jambon fumé;positive;0;0;0;0;0;0 -8229;jante;positive;0;0;0;0;0;0 -8230;japon;positive;0;0;0;0;0;0 -8231;japper;negative;0;1;0;1;1;0 -8232;jardin;positive;1;0;0;0;0;0 -8233;jardin d enfant;positive;0;0;0;0;0;0 -8234;jardin public;positive;0;0;0;0;0;0 -8235;jardinage;positive;0;0;0;0;0;0 -8236;jardiner;positive;0;0;0;0;0;0 -8237;jardinier;positive;0;0;0;0;0;0 -8238;jargon;negative;0;0;0;0;0;0 -8239;jarre;positive;0;0;0;0;0;0 -8240;jarret;positive;0;1;0;0;0;0 -8241;jarretelle;positive;0;0;0;0;0;0 -8242;jarretière;positive;0;0;0;0;0;0 -8243;jar|jars;positive;0;0;0;0;0;0 -8244;jaspe;positive;0;0;0;0;0;0 -8245;jauge;positive;0;0;0;0;0;0 -8246;jaugeage;positive;0;0;0;0;0;0 -8247;jauger;positive;0;0;0;0;0;0 -8248;jaune;positive;0;0;0;0;0;0 -8249;jaunisse;negative;0;1;0;0;0;1 -8250;javelot;negative;0;1;0;1;0;0 -8251;jeûne;negative;0;0;1;0;0;0 -8252;jean;positive;0;0;0;0;0;0 -8253;jeep;positive;0;0;0;0;0;0 -8254;jeter un coup d ?il;positive;0;0;0;0;0;0 -8255;jeter du détritus;negative;0;0;0;0;0;1 -8256;jeter du ordure;negative;0;0;0;0;0;1 -8257;jeton;positive;0;0;0;0;0;0 -8258;jeu de dame;positive;0;0;0;0;0;0 -8259;jeu de mot;positive;1;0;0;0;0;0 -8260;jeu du solitaire;positive;0;0;0;0;0;0 -8261;jeune;positive;0;0;0;0;1;0 -8262;jeune femme;positive;0;0;0;1;0;1 -8263;jeune fille;positive;0;0;0;1;0;1 -8264;jeune homme;positive;0;0;0;0;0;1 -8265;jeune marié;positive;0;0;0;0;0;0 -8266;jeunesse;positive;0;1;0;1;1;0 -8267;jeu d argent;negative;0;1;0;0;1;0 -8268;jingle;positive;1;0;0;0;0;0 -8269;joaillerie;positive;0;0;0;0;0;0 -8270;jockey;positive;0;0;0;0;0;0 -8271;jogging;positive;0;0;0;0;0;0 -8272;joie;positive;1;0;0;0;0;0 -8273;joindre;positive;0;0;0;0;0;0 -8274;jointure;positive;0;0;0;0;0;0 -8275;joker;positive;0;0;0;0;1;0 -8276;joli;positive;0;0;0;0;0;0 -8277;jonc;positive;0;0;0;0;0;0 -8278;jonction;positive;0;0;0;0;0;0 -8279;jonglage;positive;0;0;0;0;0;0 -8280;jongler;positive;0;0;0;0;0;0 -8281;jonglerie;positive;0;0;0;0;0;0 -8282;joue;positive;0;0;0;0;0;0 -8283;jouer;positive;1;0;0;0;0;0 -8284;jouer au golf;positive;0;0;0;0;0;0 -8285;jouer du violon;positive;0;0;0;0;0;0 -8286;jouer un atout;positive;0;0;0;0;1;0 -8287;jouet;positive;1;0;0;0;0;0 -8288;joueur;negative;0;0;0;0;0;0 -8289;joueur de cornemuse;positive;0;0;0;0;0;0 -8290;joug;positive;0;0;0;0;0;0 -8291;jouir de;positive;0;0;0;0;0;0 -8292;jour;positive;0;0;0;0;0;0 -8293;journal;positive;0;0;0;0;0;0 -8294;journal intime;positive;0;0;0;0;0;0 -8295;journal officiel;positive;0;0;0;0;0;0 -8296;journalisme;positive;0;0;0;0;0;0 -8297;journaliste;positive;0;0;0;0;0;0 -8298;journée;positive;0;0;0;0;0;0 -8299;joyau;positive;0;0;0;0;0;0 -8300;joyeuses|joyeux;positive;0;0;0;0;0;0 -8301;jubilaire;positive;0;0;0;0;1;0 -8302;jubiler;positive;0;0;0;0;1;0 -8303;juchoir;positive;0;0;0;0;0;0 -8304;judiciaire;positive;0;0;0;0;0;0 -8305;juge;positive;0;0;0;0;0;0 -8306;juger;negative;0;0;0;0;0;0 -8307;jugeote;positive;0;0;0;0;0;0 -8308;jumeau;positive;0;0;0;0;0;0 -8309;jument;positive;0;0;0;0;0;0 -8310;jungle;negative;0;1;0;0;0;0 -8311;junior;positive;0;0;0;0;0;0 -8312;junte;negative;0;1;0;1;0;0 -8313;jupe;positive;0;0;0;0;0;0 -8314;juridiction;positive;0;0;0;0;0;0 -8315;juridique;positive;0;0;0;0;0;0 -8316;jurisprudence;positive;0;0;1;0;0;0 -8317;juriste;positive;0;0;0;0;0;0 -8318;juron;negative;0;0;0;1;0;0 -8319;jury;positive;0;0;0;0;0;0 -8320;jus;positive;0;0;0;0;0;0 -8321;jusqu à;positive;0;0;0;0;0;0 -8322;jusqu ici;positive;0;0;0;0;0;0 -8323;juste;positive;0;0;0;0;0;0 -8324;juste à temps;positive;0;0;0;0;0;0 -8325;justesse;positive;0;0;0;0;0;0 -8326;justice;positive;0;0;0;0;0;0 -8327;justifiable;positive;0;0;0;0;0;0 -8328;justificatif;positive;0;0;0;0;0;0 -8329;justification;positive;0;0;0;0;0;0 -8330;justifier;positive;0;0;0;0;0;0 -8331;jute;negative;0;0;0;0;0;0 -8332;juteux;positive;0;0;0;0;0;0 -8333;juvenile;negative;0;0;0;0;0;0 -8334;juvénile;negative;0;0;0;0;0;0 -8335;juxtaposition;positive;0;0;0;0;0;0 -8336;kaiser;positive;0;0;0;0;0;0 -8337;kaki;negative;0;0;0;0;0;0 -8338;kaléidoscope;positive;0;0;0;0;0;0 -8339;kangourou;positive;0;0;0;0;0;0 -8340;kanji;positive;0;0;0;0;0;0 -8341;karma;positive;0;0;0;0;0;0 -8342;kayak;positive;0;0;0;0;0;0 -8343;kérosène;negative;0;1;0;0;0;1 -8344;khan;positive;0;1;0;0;0;0 -8345;kilogramme;positive;0;0;0;0;0;0 -8346;kilométrage;positive;0;0;0;0;0;0 -8347;kilomètre;positive;0;0;0;0;0;0 -8348;kilt;positive;0;0;0;0;0;0 -8349;kimono;positive;0;0;0;0;0;0 -8350;kiosque;positive;0;0;0;0;0;0 -8351;kiosque à journal|journau;positive;0;0;0;0;0;0 -8352;kit;positive;0;0;0;0;0;0 -8353;klaxonner;negative;0;0;0;1;0;1 -8354;kris;negative;0;1;0;0;0;0 -8355;kyste;negative;0;1;1;0;0;1 -8356;kyste sébacé;negative;0;0;0;0;0;1 -8357;kystique;negative;0;0;0;0;0;1 -8358;le plus âgé;negative;0;0;0;0;0;0 -8359;le plus bas;negative;0;0;1;0;0;0 -8360;le plus petit;negative;0;1;1;0;0;0 -8361;là bas;negative;0;0;0;0;0;0 -8362;labeur;negative;0;0;1;0;0;1 -8363;labo;positive;0;0;0;0;0;0 -8364;laboratoire;positive;0;0;0;0;0;0 -8365;labour;positive;0;0;0;0;0;0 -8366;labourage;positive;0;0;0;0;0;0 -8367;labourer;positive;0;0;0;0;0;0 -8368;labyrinthe;negative;0;1;0;0;1;0 -8369;lac;positive;0;0;0;0;0;0 -8370;lac écossais;negative;0;1;0;0;0;0 -8371;lâche;negative;0;1;1;1;0;1 -8372;lâchement;negative;0;1;0;1;0;1 -8373;lâcher le chien;positive;0;0;0;0;0;0 -8374;lâcheté;negative;0;1;0;1;0;1 -8375;laconique;negative;0;1;0;1;1;0 -8376;lacrosse;positive;0;0;0;0;0;0 -8377;lacté;positive;0;0;0;0;0;0 -8378;lagon;positive;0;0;0;0;0;0 -8379;laïcité;positive;0;0;0;0;0;0 -8380;laid;negative;0;0;0;0;0;1 -8381;laideur;negative;0;1;1;0;0;1 -8382;laine;positive;0;0;0;0;0;0 -8383;laineux;positive;0;0;0;0;0;0 -8384;laïque;negative;0;0;1;0;0;0 -8385;laisse;negative;0;1;1;1;0;0 -8386;laisser;negative;0;0;0;0;0;0 -8387;laisser sortir;negative;1;0;0;0;0;0 -8388;laisser supposer;positive;0;0;0;0;0;0 -8389;laisser tomber;negative;0;1;1;0;0;0 -8390;lait;positive;0;0;0;0;0;0 -8391;laitier;positive;0;0;0;0;0;0 -8392;laitier|laitière;positive;0;0;0;0;0;0 -8393;laiton;positive;0;0;0;0;0;0 -8394;laitue;positive;0;0;0;0;0;0 -8395;lama;negative;0;1;0;0;0;1 -8396;lambda;positive;0;0;0;0;0;0 -8397;lambeau;negative;0;0;1;0;0;0 -8398;lambrequin;positive;0;0;0;0;0;0 -8399;lamentablement;negative;0;0;1;0;0;0 -8400;lamentation;negative;0;1;1;0;0;1 -8401;laminer;positive;0;0;0;0;0;0 -8402;lampe;positive;0;0;0;0;0;0 -8403;lampe de poche;positive;0;0;0;0;0;0 -8404;lamper;negative;0;0;0;0;0;1 -8405;lance;negative;0;1;1;1;0;0 -8406;lance pierre;negative;0;1;0;1;0;0 -8407;lancement;positive;1;0;0;0;0;0 -8408;lancier;negative;0;1;0;0;0;0 -8409;lanciner;negative;0;1;1;0;1;0 -8410;lancinant;negative;0;1;1;0;1;0 -8411;lande;negative;0;0;0;0;0;0 -8412;langage;positive;0;0;0;0;0;0 -8413;langoureux;negative;0;1;1;0;0;0 -8414;langoustine;negative;0;0;0;0;0;0 -8415;langue;positive;0;0;0;0;0;0 -8416;languir;negative;0;0;1;0;0;0 -8417;languissant;negative;0;0;1;0;0;0 -8418;lanterne;positive;0;0;0;0;0;0 -8419;lapidaire;negative;0;0;1;1;0;0 -8420;lapin;positive;0;0;0;0;0;0 -8421;laque;negative;0;0;0;0;0;1 -8422;laquer;negative;0;0;0;0;0;1 -8423;larcin;negative;0;0;0;1;1;1 -8424;lard;negative;0;0;0;0;0;1 -8425;large;positive;0;0;0;0;0;0 -8426;large sourire;positive;0;0;0;0;1;0 -8427;largement;positive;0;0;0;0;0;0 -8428;largeur;positive;0;0;0;0;0;0 -8429;largo;positive;0;0;0;0;0;0 -8430;larguer;negative;0;0;0;0;0;1 -8431;larme;negative;0;0;1;0;0;0 -8432;larve;negative;0;0;0;0;0;1 -8433;larynx;positive;0;0;0;0;0;0 -8434;laser;positive;0;0;0;0;0;0 -8435;lasser;negative;0;0;1;0;0;0 -8436;lassitude;negative;0;0;1;0;0;0 -8437;lasso;negative;0;1;0;1;0;0 -8438;latex;negative;0;0;0;0;0;0 -8439;latitude;positive;0;0;0;0;0;0 -8440;latrines;negative;0;0;0;0;0;1 -8441;laurier;positive;1;0;0;0;0;0 -8442;lavande;positive;0;0;0;0;0;0 -8443;laver;positive;0;0;0;0;0;0 -8444;lave;negative;0;1;0;1;0;1 -8445;lavement;negative;0;0;0;0;0;1 -8446;laverie;positive;0;0;0;0;0;0 -8447;le long de;positive;0;0;0;0;0;0 -8448;le meilleur;positive;1;0;0;0;0;0 -8449;le plus élever;positive;0;1;0;0;1;0 -8450;le plus grand;positive;1;0;0;0;0;0 -8451;le plus haut;positive;0;1;0;0;1;0 -8452;le souffle couper;negative;0;1;0;0;1;0 -8453;leader;positive;0;0;0;0;0;0 -8454;lécher;negative;0;0;0;0;0;1 -8455;leçon;positive;0;0;0;0;0;0 -8456;lectorat;positive;0;0;0;0;0;0 -8457;lecteur;positive;0;0;0;0;0;0 -8458;lecture;positive;0;0;0;0;0;0 -8459;lecture attentif;positive;0;0;0;0;0;0 -8460;légal;positive;0;0;0;0;0;0 -8461;légalement;positive;0;0;0;0;0;0 -8462;légaliser;positive;0;1;0;1;0;0 -8463;légalité;positive;0;0;0;0;0;0 -8464;légendaire;positive;0;0;0;0;0;0 -8465;légende;positive;0;0;0;0;0;0 -8466;légender;positive;0;0;0;0;0;0 -8467;légèrement;negative;0;0;0;0;0;0 -8468;légèrement venteux;positive;1;0;0;0;0;0 -8469;légèreté;positive;1;0;0;0;0;0 -8470;légiférer;positive;0;0;0;0;0;0 -8471;légion;positive;0;0;0;0;0;0 -8472;législation;positive;0;0;0;0;0;0 -8473;législature;positive;0;0;0;0;0;0 -8474;légitime;positive;0;0;0;0;0;0 -8475;légitimité;positive;0;0;0;0;0;0 -8476;legs;positive;0;0;0;0;0;0 -8477;léguer;positive;0;0;0;0;0;0 -8478;légume;positive;0;0;0;0;0;0 -8479;légumineux;positive;0;0;0;0;0;0 -8480;lemme;positive;0;0;0;0;0;0 -8481;lendemain;positive;0;0;0;0;0;0 -8482;lent;negative;0;0;1;0;0;1 -8483;lentement;negative;0;0;0;0;0;0 -8484;lente;negative;0;0;1;0;0;1 -8485;lenteur;negative;0;1;1;0;0;0 -8486;lentille;positive;0;0;0;0;0;0 -8487;léopard;negative;0;1;0;0;0;0 -8488;lèpre;negative;0;1;1;0;0;1 -8489;le ?il bandé;negative;0;1;0;0;0;0 -8490;lesbianisme;negative;0;0;0;0;0;0 -8491;lesbien;negative;0;1;1;0;0;1 -8492;lésiner;negative;0;1;1;0;0;0 -8493;lessive;positive;0;0;0;0;0;0 -8494;lest;positive;0;0;0;0;0;0 -8495;lester;positive;0;0;0;0;0;0 -8496;létal;negative;0;1;1;0;0;1 -8497;léthargie;negative;0;0;1;0;0;0 -8498;léthargique;negative;0;1;1;0;0;0 -8499;lettre;positive;0;0;0;0;0;0 -8500;lettrer;positive;0;0;0;0;0;0 -8501;leucémie;negative;0;1;1;1;0;0 -8502;lever;positive;0;0;0;0;0;0 -8503;lever du jour;positive;0;0;0;0;0;0 -8504;lever du soleil;positive;0;0;0;0;0;0 -8505;levier;positive;0;0;0;0;0;0 -8506;lèvre;positive;0;0;0;0;0;0 -8507;lévrier;positive;0;0;0;0;0;0 -8508;levure;positive;0;0;0;0;0;0 -8509;lexique;positive;0;0;0;0;0;0 -8510;liaison;positive;0;0;0;0;0;0 -8511;libéralisme;positive;0;0;0;0;0;0 -8512;libération conditionnel;positive;0;0;0;0;0;0 -8513;libérer;positive;1;0;0;0;0;0 -8514;liberté;positive;0;0;0;0;1;0 -8515;libido;positive;1;0;0;0;0;0 -8516;libraire;positive;0;0;0;0;0;0 -8517;librairie;positive;0;0;0;0;0;0 -8518;libre;positive;1;0;0;0;0;0 -8519;librement;positive;0;0;0;0;0;0 -8520;licence;positive;0;0;0;0;0;0 -8521;licencier;negative;0;1;0;1;0;0 -8522;lichen;negative;0;0;0;0;0;1 -8523;licorne;positive;0;0;0;0;0;0 -8524;lier;positive;0;0;0;0;0;0 -8525;liège;positive;0;0;0;0;0;0 -8526;lien;positive;0;0;0;0;0;0 -8527;lieu;positive;0;0;0;0;0;0 -8528;lieu commun;positive;0;0;0;0;0;0 -8529;lieu de naissance;positive;0;0;0;1;0;0 -8530;lieu de prédilection;positive;0;0;0;0;0;0 -8531;lieu de travail;positive;0;0;0;0;0;0 -8532;lieu sûr;positive;0;0;0;0;0;0 -8533;lieutenant;positive;0;0;0;0;0;0 -8534;lièvre;negative;0;1;0;0;0;0 -8535;ligament;positive;0;0;0;0;0;0 -8536;ligature;positive;0;0;0;0;0;0 -8537;ligne;positive;0;0;0;1;0;0 -8538;lignée;positive;0;0;0;0;0;0 -8539;ligoter;negative;0;1;1;0;0;0 -8540;ligue;positive;0;0;0;0;0;0 -8541;lilas;positive;0;0;0;0;0;0 -8542;limace;negative;0;0;0;0;0;1 -8543;limaille;positive;0;0;0;0;0;0 -8544;limbe|limbes;negative;0;1;1;0;0;0 -8545;limier;positive;0;0;0;0;0;0 -8546;limitation;positive;0;0;0;0;0;0 -8547;limiter;negative;0;0;1;1;0;0 -8548;limoger;negative;0;0;1;0;0;0 -8549;limousine;positive;0;0;0;0;0;0 -8550;limpidité;positive;0;0;0;0;0;0 -8551;lin;positive;0;0;0;0;0;0 -8552;linceul;negative;0;0;1;0;0;0 -8553;linge à laver;positive;0;0;0;0;0;0 -8554;linge de lit;positive;0;0;0;0;0;0 -8555;linge de maison;positive;0;0;0;0;0;0 -8556;lingot;positive;0;0;0;0;0;0 -8557;lingual;positive;0;0;0;0;0;0 -8558;linguiste;positive;0;0;0;0;0;0 -8559;linguistique;positive;0;0;0;0;0;0 -8560;linoléum;positive;0;0;0;0;0;0 -8561;lion;positive;0;1;0;0;0;0 -8562;liquéfaction;negative;0;0;1;0;0;0 -8563;liquéfier;negative;0;0;1;0;0;0 -8564;liqueur;negative;0;0;1;1;0;0 -8565;liquidateur;negative;0;0;0;0;0;0 -8566;liquidation;negative;0;0;1;0;0;0 -8567;liquide;positive;0;0;0;0;0;0 -8568;liquider;negative;0;0;0;0;0;0 -8569;liquidité;positive;0;0;0;0;0;0 -8570;lire;positive;0;0;0;0;0;0 -8571;lire attentivement;positive;0;0;0;0;0;0 -8572;lisibilité;positive;0;0;0;0;0;0 -8573;lisible;positive;0;0;0;0;0;0 -8574;lisière;positive;0;0;0;0;0;0 -8575;lisse;positive;0;0;0;0;0;0 -8576;listage;positive;0;0;0;0;0;0 -8577;liste;positive;0;0;0;0;0;0 -8578;liste de vérification;positive;0;0;0;0;0;0 -8579;lister;positive;0;0;0;0;0;0 -8580;listing;positive;0;0;0;0;0;0 -8581;lit;positive;0;0;0;0;0;0 -8582;lit bébé;positive;0;0;0;0;0;0 -8583;lire d enfant;positive;0;0;0;0;0;0 -8584;litanie;positive;0;0;0;0;0;0 -8585;literie;positive;0;0;0;0;0;0 -8586;lithographie;positive;0;0;0;0;0;0 -8587;lithologie;positive;0;0;0;0;0;0 -8588;lithosphère;positive;0;0;0;0;0;0 -8589;litière;negative;0;0;0;0;0;1 -8590;litige;negative;0;1;1;1;0;0 -8591;litre;positive;0;0;0;0;0;0 -8592;littéraire;positive;0;0;0;0;0;0 -8593;littéralement;positive;0;0;0;0;0;0 -8594;littérature;positive;0;0;0;0;0;0 -8595;littoral;positive;0;0;0;0;0;0 -8596;liturgie;positive;0;0;0;0;0;0 -8597;livide;negative;0;1;0;1;0;1 -8598;livraison;positive;0;0;0;0;0;0 -8599;livre sterling;positive;0;0;0;0;0;0 -8600;livrer;positive;0;0;0;0;0;0 -8601;livre;positive;0;0;0;0;0;0 -8602;livresque;positive;0;0;0;0;0;0 -8603;livret;positive;0;0;0;0;0;0 -8604;lobbyiste;negative;0;0;0;0;0;0 -8605;lobe;positive;0;0;0;0;0;0 -8606;local;positive;0;0;0;0;0;0 -8607;localisation;positive;0;0;0;0;0;0 -8608;localiser;positive;0;0;0;0;0;0 -8609;localité;positive;0;0;0;0;0;0 -8610;locataire;positive;0;0;0;0;0;0 -8611;location;positive;0;0;0;0;0;0 -8612;loch;negative;0;1;0;0;0;0 -8613;locomotion;positive;0;0;0;0;0;0 -8614;locomotive;positive;0;0;0;0;0;0 -8615;locuste;negative;0;1;0;0;0;1 -8616;loft;positive;0;0;0;0;0;0 -8617;logarithme;positive;0;0;0;0;0;0 -8618;logarithmique;positive;0;0;0;0;0;0 -8619;loge;positive;0;0;0;0;0;0 -8620;loger;positive;0;0;0;0;0;0 -8621;logique;positive;0;0;0;0;0;0 -8622;logistique;positive;0;0;0;0;0;0 -8623;logo;positive;0;0;0;0;0;0 -8624;logotype;positive;0;0;0;0;0;0 -8625;loi;positive;0;0;0;0;0;0 -8626;lointain;negative;0;0;1;0;0;0 -8627;lointainests;negative;0;0;1;0;0;0 -8628;loisir;positive;0;0;0;0;1;0 -8629;lombaire;positive;0;0;0;0;0;0 -8630;long;positive;0;0;0;0;0;0 -8631;longe;positive;0;0;0;0;0;0 -8632;longévité;positive;0;0;0;0;0;0 -8633;longitude;positive;0;0;0;0;0;0 -8634;longitudinal;positive;0;0;0;0;0;0 -8635;longitudinalement;positive;0;0;0;0;0;0 -8636;longueur;positive;0;0;0;0;0;0 -8637;loquace;positive;0;0;0;0;0;0 -8638;loquet;positive;0;0;0;0;0;0 -8639;lorgner;negative;0;0;0;1;0;1 -8640;losange;positive;0;0;0;0;0;0 -8641;lot;positive;0;0;0;0;0;0 -8642;loterie;positive;0;1;0;0;1;0 -8643;lotion;positive;0;0;0;0;0;0 -8644;loto;positive;0;1;0;0;1;0 -8645;louange;positive;0;0;0;0;0;0 -8646;loucher;negative;0;0;0;0;0;0 -8647;louche;negative;0;1;1;0;0;0 -8648;louer;positive;0;0;0;0;0;0 -8649;loupe;positive;0;0;0;0;0;0 -8650;lourdaud;negative;0;0;0;0;0;1 -8651;lourde;negative;0;1;1;1;0;0 -8652;lourdement;negative;0;0;1;0;0;0 -8653;lourdeur;negative;0;0;0;0;0;0 -8654;loyer;positive;0;0;0;0;0;0 -8655;lubie;positive;1;0;0;0;0;0 -8656;lubrifiant;negative;0;0;0;0;0;1 -8657;lubrification;negative;0;0;0;0;0;1 -8658;lubrifier;negative;0;0;0;0;0;1 -8659;lubrique;negative;0;0;0;0;0;1 -8660;luciole;positive;0;0;0;0;0;0 -8661;lueur;positive;0;0;0;0;1;0 -8662;luge;positive;1;0;0;0;0;0 -8663;lugubre;negative;0;1;1;0;0;1 -8664;luire;positive;0;0;0;0;1;0 -8665;lumière;positive;0;0;0;0;0;0 -8666;lumière du étoile;positive;0;0;0;0;0;0 -8667;lumière du soleil;positive;1;0;0;0;0;0 -8668;luminescent;positive;1;0;0;0;0;0 -8669;luminosité;positive;1;0;0;0;0;0 -8670;lunaire;positive;0;0;0;0;0;0 -8671;lune;positive;0;0;0;0;0;0 -8672;lune de miel;positive;0;0;0;0;1;0 -8673;lunette;positive;0;0;0;0;0;0 -8674;lunette|lunettes;positive;0;0;0;0;0;0 -8675;lunette|lunettes de protection;positive;0;0;0;0;0;0 -8676;lunette|lunettes de soleil;positive;0;0;0;0;0;0 -8677;lustre;positive;1;0;0;0;0;0 -8678;luth;positive;0;0;0;0;0;0 -8679;lutte;negative;0;1;1;1;0;0 -8680;lutter;negative;0;1;0;1;0;0 -8681;luxe;positive;1;0;0;0;0;0 -8682;luxure;negative;0;0;0;0;0;0 -8683;luxuriant;positive;0;0;1;0;0;1 -8684;luzerne;positive;0;0;0;0;0;0 -8685;lymphatique;positive;0;0;0;0;0;0 -8686;lymphe;positive;0;0;0;0;0;0 -8687;lyncher;negative;0;1;1;1;0;1 -8688;lynx;negative;0;1;0;0;0;0 -8689;lyre;positive;1;0;0;0;0;0 -8690;lyrique;positive;1;0;0;0;0;0 -8691;lys;positive;0;0;0;0;0;0 -8692;mon chéri;positive;0;0;0;0;0;0 -8693;macabre;negative;0;1;1;0;0;1 -8694;macération;negative;0;0;1;0;0;1 -8695;mâcher;negative;0;0;0;0;0;1 -8696;machine;positive;0;0;0;0;0;0 -8697;machine à écrire;positive;0;0;0;0;0;0 -8698;machinerie;positive;0;0;0;0;0;0 -8699;machiniste;positive;0;0;0;0;0;0 -8700;mâchoire;positive;0;0;0;0;0;0 -8701;macis;negative;0;1;0;0;0;0 -8702;maçon;positive;0;0;0;0;0;0 -8703;madame;positive;0;0;0;0;0;0 -8704;mademoiselle;negative;0;0;0;0;0;0 -8705;mafia;negative;0;1;0;1;0;0 -8706;magasin;positive;0;0;0;0;0;0 -8707;magazine;positive;0;0;0;0;0;0 -8708;magenta;positive;0;0;0;0;0;0 -8709;magie;positive;0;0;0;0;1;0 -8710;magique;positive;0;0;0;0;1;0 -8711;magistrat;positive;0;0;0;0;0;0 -8712;magma;negative;0;1;0;0;0;0 -8713;magnat;positive;0;0;0;0;0;0 -8714;magnétisme;positive;0;0;0;0;0;0 -8715;magnétite;positive;0;0;0;0;0;0 -8716;magnificence;positive;0;0;0;0;0;0 -8717;magnifique;positive;0;0;0;0;1;0 -8718;magot;positive;0;0;0;0;0;0 -8719;maigre;negative;0;1;1;0;0;0 -8720;maille;positive;0;0;0;0;0;0 -8721;maillet;negative;0;1;0;1;0;0 -8722;maillon;positive;0;0;0;0;0;0 -8723;maillot;positive;0;0;0;0;0;0 -8724;main;positive;0;0;0;0;0;0 -8725;maintenance;positive;0;0;0;0;0;0 -8726;maintenir son vitesse;positive;0;0;0;0;0;0 -8727;maintes foi|fois;positive;0;0;0;0;0;0 -8728;maintien;positive;1;0;0;0;0;0 -8729;maire;positive;0;0;0;0;0;0 -8730;maison;positive;0;0;0;0;0;0 -8731;maison clore;negative;0;0;0;0;0;1 -8732;maison de maître;positive;0;0;0;0;0;0 -8733;maison de ville;positive;0;0;0;0;0;0 -8734;maisonnée;positive;0;0;0;0;0;0 -8735;maître;positive;0;0;0;0;0;0 -8736;maître de conférence;positive;0;0;0;0;0;0 -8737;maîtriser un sujet;positive;0;0;0;0;0;0 -8738;majeur;positive;0;0;0;0;0;0 -8739;majordome;positive;0;0;0;0;0;0 -8740;majorité;positive;0;0;0;0;0;0 -8741;majuscule;positive;0;0;0;0;0;0 -8742;mal à l aise;negative;0;0;0;0;0;0 -8743;mal assortir;negative;0;0;0;0;0;1 -8744;mal assurer;negative;0;1;0;0;1;0 -8745;mal comprendre;negative;0;1;1;1;0;0 -8746;mal de dent;negative;0;1;1;0;0;1 -8747;mal de tête;negative;0;0;1;0;0;0 -8748;mal du pays;negative;0;0;1;0;0;0 -8749;mal informer;negative;0;1;1;0;0;0 -8750;mal renseigner;negative;0;1;1;0;0;0 -8751;mal être;negative;0;0;1;0;0;0 -8752;maladie;negative;0;1;1;1;0;1 -8753;maladresse;negative;0;1;0;0;0;1 -8754;malais|malaise;negative;0;1;1;0;0;0 -8755;malaria;negative;0;1;1;0;0;1 -8756;malaxer;positive;0;0;0;0;0;0 -8757;malchance;negative;0;1;1;0;0;0 -8758;malédiction;negative;0;1;1;1;0;1 -8759;malencontreux;negative;0;0;1;0;0;0 -8760;malentendu;negative;0;1;1;1;0;0 -8761;malfaçon;negative;0;1;0;0;0;1 -8762;malformation;negative;0;1;1;0;1;1 -8763;malfrat;negative;0;1;0;1;0;1 -8764;malheur;negative;0;1;1;0;0;1 -8765;malheureusement;negative;0;0;1;0;0;0 -8766;malhonnête;negative;0;0;1;1;0;1 -8767;malhonnêteté;negative;0;0;1;1;0;1 -8768;malice;negative;0;1;0;1;0;1 -8769;malicieux;negative;0;1;0;1;1;0 -8770;malignité;negative;0;1;1;0;0;0 -8771;maline;positive;0;0;0;0;0;0 -8772;maline|malines;positive;0;0;0;0;0;0 -8773;malle;negative;0;0;0;0;0;0 -8774;malpoli;negative;0;0;0;0;0;1 -8775;malsain;negative;0;1;1;0;0;1 -8776;maltraitance;negative;0;1;1;1;0;1 -8777;maltraiter;negative;0;1;1;1;0;1 -8778;malveilants;negative;0;0;0;1;0;0 -8779;malveillance;negative;0;1;0;1;0;0 -8780;malversation;negative;0;0;0;0;0;1 -8781;maman;positive;0;1;0;0;0;0 -8782;mamelon;positive;0;0;0;0;0;0 -8783;mammifère;positive;0;0;0;0;0;0 -8784;mammouth;negative;0;1;0;0;0;0 -8785;management;positive;0;0;0;0;0;0 -8786;manche;positive;0;0;0;0;0;0 -8787;manchette;positive;0;0;0;0;0;0 -8788;mandamus;negative;0;1;0;0;0;0 -8789;mandarin;positive;0;0;0;0;0;0 -8790;mandarine;positive;0;0;0;0;0;0 -8791;mandataire;positive;0;0;0;0;0;0 -8792;mandater;positive;0;0;0;0;0;0 -8793;mandibule;negative;0;1;0;0;0;0 -8794;mandoline;positive;0;0;0;0;0;0 -8795;mandrin;negative;0;0;0;0;0;0 -8796;manège;positive;1;0;0;0;0;0 -8797;manette;positive;0;0;0;0;0;0 -8798;manette du gaz;negative;0;0;0;1;0;0 -8799;manger;positive;0;0;0;0;0;0 -8800;mangeoire;positive;0;0;0;0;0;0 -8801;mangeur;positive;0;0;0;0;0;0 -8802;mangoustanier;positive;0;0;0;0;0;0 -8803;mangue;positive;0;0;0;0;0;0 -8804;maniaque;negative;0;1;0;1;0;0 -8805;manie;negative;0;0;1;1;0;0 -8806;manier;positive;0;0;0;0;0;0 -8807;maniérer;negative;0;0;0;0;0;0 -8808;manif;positive;0;0;0;0;0;0 -8809;manifester;positive;0;0;0;0;0;0 -8810;manifestement;positive;0;0;0;0;0;0 -8811;manifester contre;negative;0;0;0;1;0;0 -8812;manifester violemment;negative;0;1;0;1;0;0 -8813;manifestesévidents;positive;0;0;0;0;0;0 -8814;manigancer;positive;0;0;0;0;0;0 -8815;manipulation;negative;0;1;1;1;1;0 -8816;manivelle;negative;0;0;0;1;0;0 -8817;manne;positive;1;0;0;0;0;0 -8818;mannequin;negative;0;0;0;0;0;1 -8819;man?uvrer;positive;0;0;0;0;0;0 -8820;man?uvre;positive;0;0;0;0;0;0 -8821;manoir;negative;0;1;0;0;0;0 -8822;manquer;negative;0;1;1;0;0;0 -8823;manquer de;negative;0;0;1;0;0;0 -8824;manque de confiance;negative;0;1;0;1;0;1 -8825;manque de respect;negative;0;0;0;1;0;0 -8826;manquement;negative;0;0;0;0;0;1 -8827;manquer de respect;negative;0;0;0;1;0;0 -8828;manteau;positive;0;0;0;0;0;0 -8829;manucure;positive;0;0;0;0;0;0 -8830;manucurer;positive;0;0;0;0;0;0 -8831;manuel;positive;0;0;0;0;0;0 -8832;manuscrit;positive;0;0;0;0;0;0 -8833;maquereau;negative;0;1;0;0;0;1 -8834;maquillage;positive;0;0;0;0;0;0 -8835;marasme;negative;0;1;1;0;0;1 -8836;marbre;positive;0;0;0;0;0;0 -8837;marbrer;positive;0;0;0;0;0;0 -8838;marchander;positive;0;0;0;0;0;0 -8839;marchandise;positive;0;1;0;0;0;0 -8840;marcher;positive;0;0;0;0;0;0 -8841;marcher à quatre patte;negative;0;0;1;0;0;1 -8842;marche;positive;0;0;0;0;0;0 -8843;mare;negative;0;0;0;0;0;1 -8844;maréchal;positive;0;0;0;0;0;0 -8845;maréchal ferrant;positive;0;0;0;0;0;0 -8846;marée;negative;0;1;0;0;0;0 -8847;marge de man?uvre;positive;0;0;0;0;0;0 -8848;mari tromper;negative;0;0;1;0;0;1 -8849;mariage;positive;0;0;0;0;0;0 -8850;marier;positive;0;0;0;0;0;0 -8851;marijuana;negative;0;0;0;0;0;1 -8852;marin;positive;0;0;0;0;0;0 -8853;marine;positive;0;0;0;0;0;0 -8854;marionnette;negative;0;0;0;0;0;0 -8855;maritime;positive;0;0;0;0;0;0 -8856;marmelade;positive;0;0;0;0;0;0 -8857;marmite;positive;0;0;0;0;0;0 -8858;marne;positive;0;0;0;0;0;0 -8859;marner;positive;0;0;0;0;0;0 -8860;marque de coup;negative;0;0;0;0;0;0 -8861;marquer;positive;0;0;0;0;0;0 -8862;marqueter;negative;0;0;0;0;0;0 -8863;marqueterie;negative;0;0;0;0;0;0 -8864;marquis;positive;0;0;0;0;0;0 -8865;marrer;positive;1;0;0;0;0;0 -8866;marrant;positive;1;0;0;0;0;0 -8867;marron;positive;0;0;0;0;0;0 -8868;mars;positive;0;0;0;0;0;0 -8869;marteau;negative;0;1;0;1;0;0 -8870;martelage;negative;0;0;0;1;0;0 -8871;marteler;negative;0;0;0;1;0;0 -8872;martial;positive;0;0;0;1;0;0 -8873;martingale;positive;0;0;0;0;0;0 -8874;martyr;negative;0;1;1;0;0;0 -8875;martyriser;negative;0;1;1;0;0;0 -8876;mascarade;negative;0;0;0;0;1;0 -8877;masculin;positive;0;0;0;0;0;0 -8878;masochisme;negative;0;1;0;1;0;1 -8879;masque;negative;0;1;0;0;0;0 -8880;masquer;negative;0;1;0;0;0;0 -8881;massage;positive;1;0;0;0;0;0 -8882;masse;negative;0;1;0;0;0;0 -8883;masser;positive;1;0;0;0;0;0 -8884;massif;negative;0;1;0;0;0;0 -8885;mastiquer;negative;0;0;0;0;0;1 -8886;mastiquer bruyamment;negative;0;0;0;0;0;1 -8887;masturbation;positive;1;0;0;0;0;0 -8888;masturber;positive;1;0;0;0;0;0 -8889;match;positive;0;0;0;0;0;0 -8890;mat;negative;0;1;0;0;0;0 -8891;matelasser;positive;0;0;0;0;0;0 -8892;matelot;positive;0;0;0;0;0;0 -8893;matérialiser;positive;0;0;0;0;0;0 -8894;matérialisme;negative;0;0;1;0;0;0 -8895;matérialiste;negative;0;0;1;0;0;1 -8896;matérialité;negative;0;0;0;0;0;0 -8897;matériau|matériaux;positive;0;0;0;0;0;0 -8898;matériel de guerre;negative;0;1;0;0;0;0 -8899;matériel informatique;positive;0;0;0;0;0;0 -8900;matériellement;positive;0;0;0;0;0;0 -8901;maternité;positive;0;0;0;0;0;0 -8902;mathématique;positive;0;0;0;0;0;0 -8903;matière;negative;0;0;0;1;0;1 -8904;matière gluant;negative;0;0;0;0;0;1 -8905;matière fécal;negative;0;0;0;0;0;1 -8906;matin;positive;0;0;0;0;0;0 -8907;matinée;positive;0;0;0;0;0;0 -8908;matou;positive;0;0;0;0;0;0 -8909;matraque;negative;0;1;0;1;0;0 -8910;matraquer;negative;0;0;0;1;0;0 -8911;matrice;positive;0;0;0;0;0;0 -8912;matrone;positive;0;0;0;0;0;0 -8913;maturité;positive;0;0;0;0;0;0 -8914;maugréer;negative;0;0;1;1;0;0 -8915;mausolée;negative;0;0;1;0;0;0 -8916;maussadeq;negative;0;0;1;1;0;0 -8917;mauvais;negative;0;1;1;1;0;1 -8918;mauvais comportement;negative;0;0;0;1;1;1 -8919;mauvais conduite;negative;0;0;0;1;1;1 -8920;mauvais gestion;negative;0;1;1;0;0;0 -8921;mauvais herbe;negative;0;0;0;0;0;1 -8922;mauvais réputation;negative;0;0;1;0;0;1 -8923;mauvais passe;negative;0;1;1;0;0;0 -8924;mauve;positive;0;0;0;0;0;0 -8925;mauviette;negative;0;1;0;0;0;1 -8926;mal;negative;0;0;1;0;0;0 -8927;maximal;positive;0;0;0;0;0;0 -8928;maxime;positive;0;0;0;0;0;0 -8929;méandre;negative;0;1;1;0;0;0 -8930;mécanique;positive;0;0;0;0;0;0 -8931;mécénat;positive;0;0;0;0;0;0 -8932;mécène;positive;0;0;0;0;0;0 -8933;méchanceté;negative;0;1;0;1;0;1 -8934;méchant;negative;0;1;1;1;0;1 -8935;mèche;positive;0;0;0;0;0;0 -8936;mécontent;negative;0;1;1;1;0;1 -8937;mécontentement;negative;0;1;1;1;0;1 -8938;médaille;positive;0;0;0;0;1;0 -8939;médailler;positive;1;0;0;0;0;0 -8940;médaillon;positive;0;0;0;0;0;0 -8941;médecin;positive;0;0;0;0;0;0 -8942;médecine;positive;0;0;0;0;0;0 -8943;médecine légal;positive;0;0;0;0;0;0 -8944;média;positive;0;0;0;0;0;0 -8945;médian;positive;0;0;0;0;0;0 -8946;medias;positive;0;0;0;0;0;0 -8947;médias;positive;0;0;0;0;0;0 -8948;médiateur;positive;0;0;0;0;0;0 -8949;médiation;positive;0;0;0;0;0;0 -8950;médical;positive;0;1;0;0;0;0 -8951;médicament;negative;0;0;0;0;0;0 -8952;médicinal;positive;0;0;0;0;0;0 -8953;médico légal;positive;0;0;0;0;0;0 -8954;médiéval;negative;0;0;0;0;0;0 -8955;médiocre;negative;0;0;0;1;0;1 -8956;médiocrité;negative;0;0;0;1;0;1 -8957;méditatif;positive;0;0;0;0;0;0 -8958;méditation;positive;0;0;0;0;0;0 -8959;méditer;positive;0;0;0;0;0;0 -8960;médium;positive;0;0;0;0;0;0 -8961;medley;positive;0;0;0;0;0;0 -8962;méduser;negative;0;1;0;0;1;1 -8963;meeting;positive;0;0;0;0;0;0 -8964;méfait;negative;0;1;1;1;0;1 -8965;méfiance;negative;0;1;0;1;0;1 -8966;méfiant;negative;0;1;0;1;1;0 -8967;meilleur;positive;0;0;0;0;0;0 -8968;mélancolie;negative;0;0;1;0;0;0 -8969;mélancoliquement;negative;0;0;1;0;0;0 -8970;mélasse;negative;0;0;0;0;0;1 -8971;mêler;positive;0;0;0;0;0;0 -8972;mélodie;positive;0;0;0;0;0;0 -8973;mélodramatique;negative;0;0;1;0;0;0 -8974;mélodrame;negative;0;0;1;1;0;0 -8975;membrane;positive;0;0;0;0;0;0 -8976;membre;positive;0;0;0;0;0;0 -8977;membre du congrès;positive;0;0;0;0;0;0 -8978;même si;negative;0;0;0;0;0;0 -8979;mémo;positive;0;0;0;0;0;0 -8980;mémoire;positive;0;0;0;0;0;0 -8981;mémorable;positive;0;0;0;0;1;0 -8982;memorial;positive;0;0;0;0;0;0 -8983;mémorial;positive;0;0;0;0;0;0 -8984;mémoriaux;negative;0;0;1;0;0;0 -8985;mémoriser;positive;0;0;0;0;0;0 -8986;menacer;negative;0;1;0;1;0;1 -8987;menaçant;negative;0;1;0;1;0;1 -8988;menace;negative;0;1;0;1;0;0 -8989;ménage;positive;0;0;0;0;0;0 -8990;ménagerie;negative;0;0;0;1;1;1 -8991;menançante;negative;0;1;0;0;0;0 -8992;mener;positive;0;0;0;0;0;0 -8993;mençants;negative;0;1;0;1;0;0 -8994;mendicité;negative;0;0;1;0;0;0 -8995;mendier;negative;0;0;1;0;0;1 -8996;ménestrel;positive;0;0;0;0;0;0 -8997;meneur;positive;0;0;0;0;0;0 -8998;ménisque;positive;0;0;0;0;0;0 -8999;mensonge;negative;0;0;1;1;0;1 -9000;mensonger;negative;0;0;0;1;0;1 -9001;mensualité;positive;0;0;0;0;0;0 -9002;mensuel;positive;0;0;0;0;0;0 -9003;mensuellement;positive;0;0;0;0;0;0 -9004;mental;negative;0;0;0;0;0;0 -9005;menthe;positive;0;0;0;0;0;0 -9006;mention;positive;0;0;0;0;0;0 -9007;mentionner ci dessus;positive;0;0;0;0;0;0 -9008;mentionner;positive;0;0;0;0;0;0 -9009;mentir;negative;0;0;1;1;0;1 -9010;mentor;positive;0;0;0;0;0;0 -9011;menuisier;positive;0;0;0;0;0;0 -9012;menu détail;negative;0;0;0;0;0;0 -9013;mépriser;negative;0;0;0;1;0;1 -9014;méprisant;negative;0;0;0;1;0;1 -9015;méprise;negative;0;1;1;1;0;0 -9016;mer;positive;0;0;0;0;0;0 -9017;mercantile;positive;0;0;0;0;0;0 -9018;mercenaire;negative;0;1;0;1;0;0 -9019;merde;negative;0;0;0;1;0;1 -9020;mère;positive;0;0;1;0;0;0 -9021;mère porteur;positive;0;0;0;0;0;0 -9022;méridien;positive;0;0;0;0;0;0 -9023;méridien|méridienne;positive;0;0;0;0;0;0 -9024;méritant;positive;0;0;0;0;0;0 -9025;mérite;positive;0;0;0;0;0;0 -9026;méritoire;positive;0;0;0;0;0;0 -9027;merveille;positive;0;0;0;0;1;0 -9028;merveilleusement;positive;0;0;0;0;1;0 -9029;mesa;positive;0;0;0;0;0;0 -9030;mésange;positive;0;0;0;0;0;0 -9031;mésaventure;negative;0;1;1;0;1;1 -9032;mesquin;negative;0;0;1;1;0;1 -9033;message;positive;0;0;0;0;0;0 -9034;mesurable;positive;0;0;0;0;0;0 -9035;mesurer;positive;0;0;0;0;0;0 -9036;mesure;positive;0;0;0;0;0;0 -9037;métabolisme;positive;0;0;0;0;0;0 -9038;métal;positive;0;0;0;0;0;0 -9039;métallurgie;positive;0;0;0;0;0;0 -9040;métamorphose;negative;0;0;0;0;0;0 -9041;métaphore;positive;0;0;0;0;0;0 -9042;métaphorique;positive;0;0;0;0;0;0 -9043;métaphysique;positive;0;0;0;0;0;0 -9044;métastase;negative;0;0;1;0;0;0 -9045;météo;positive;0;0;0;0;0;0 -9046;météore;negative;0;1;0;0;0;0 -9047;météorique;negative;0;1;0;0;1;0 -9048;météorite;negative;0;1;0;0;0;0 -9049;météorologie;positive;0;0;0;0;0;0 -9050;météorologique;positive;0;0;0;0;0;0 -9051;méthanol;negative;0;0;0;0;0;1 -9052;méthode;positive;0;0;0;0;0;0 -9053;méthode thérapeutique;positive;0;0;0;0;0;0 -9054;méthodique;positive;0;0;0;0;0;0 -9055;métier à tisser;negative;0;1;0;0;0;0 -9056;mètre;positive;0;0;0;0;0;0 -9057;métrique;positive;0;0;0;0;0;0 -9058;métrologie;positive;0;0;0;0;0;0 -9059;métropole;positive;0;0;0;0;0;0 -9060;métropolitain;positive;0;0;0;0;0;0 -9061;mets fin;positive;0;0;0;0;0;0 -9062;mettre;positive;0;0;0;0;0;0 -9063;mettre à contribution;positive;0;0;0;0;0;0 -9064;mettre à quai;positive;0;0;0;0;0;0 -9065;mettre à sac;negative;0;0;0;1;0;0 -9066;mettre au chenil;negative;0;0;1;0;0;0 -9067;mettre au défi;negative;0;1;0;1;0;0 -9068;mettre au défi de faire qch;positive;0;0;0;0;0;0 -9069;mettre au garage;positive;0;0;0;0;0;0 -9070;mettre au jour;positive;0;0;0;0;1;0 -9071;mettre bas;negative;0;0;0;0;0;1 -9072;mettre dans un tableau;positive;0;0;0;0;0;0 -9073;mettre en bouteille;positive;0;0;0;0;0;0 -9074;mettre en cage;negative;0;1;1;0;0;0 -9075;mettre en commun;positive;0;0;0;0;0;0 -9076;mettre en danger;negative;0;1;0;1;0;0 -9077;mettre en gage;negative;0;0;0;0;0;0 -9078;mettre en péril;negative;0;1;0;1;0;0 -9079;mettre en pratique;positive;0;0;0;0;0;0 -9080;mettre en scène;positive;0;0;0;0;0;0 -9081;mettre en tombola;positive;0;0;0;0;1;0 -9082;mettre en vigueur;positive;0;0;0;0;0;0 -9083;mettre fin;negative;0;1;1;0;0;0 -9084;mettre l accent sur;positive;0;0;0;0;0;0 -9085;mettre le pression;negative;0;1;0;1;0;0 -9086;mettre pied à terre;positive;0;0;0;0;0;0 -9087;mettre sous calmer;positive;0;0;0;0;0;0 -9088;mettre sous sédatif;positive;0;0;0;0;0;0 -9089;mettre sur cric;positive;0;0;0;0;0;0 -9090;mettre un corset;positive;0;0;0;0;0;0 -9091;mettre un terme à;negative;0;0;1;0;0;0 -9092;meuble de rangement;positive;0;0;0;0;0;0 -9093;meubler;positive;0;0;0;0;0;0 -9094;meuble;positive;0;0;0;0;0;0 -9095;meuglement;negative;0;1;1;1;0;0 -9096;meugler;negative;0;1;1;1;0;0 -9097;meule;negative;0;0;0;0;0;0 -9098;meuleuse;negative;0;1;0;0;0;0 -9099;meute;positive;0;0;0;0;0;0 -9100;miaou;negative;0;1;1;0;0;0 -9101;miaulement;negative;0;1;1;0;0;0 -9102;miauler;negative;0;1;1;0;0;0 -9103;mica;positive;0;0;0;0;0;0 -9104;miche;positive;0;0;0;0;0;0 -9105;micro;positive;0;0;0;0;0;0 -9106;microbe;negative;0;1;0;0;0;1 -9107;microbiologie;positive;0;0;0;0;0;0 -9108;microcosme;positive;0;0;0;0;0;0 -9109;microgramme;positive;0;0;0;0;0;0 -9110;micromètre;positive;0;0;0;0;0;0 -9111;micron;positive;0;0;0;0;0;0 -9112;microphone;positive;0;0;0;0;0;0 -9113;microscope;positive;0;0;0;0;0;0 -9114;microscopie;positive;0;0;0;0;0;0 -9115;microscopique;negative;0;0;0;0;0;0 -9116;midi;positive;0;0;0;0;0;0 -9117;miel;positive;0;0;0;0;0;0 -9118;miette;negative;0;0;0;0;0;0 -9119;mignon;positive;1;0;0;0;0;0 -9120;migraine;negative;0;0;1;0;0;0 -9121;migrant;negative;0;0;0;0;0;0 -9122;migrateur;negative;0;0;0;0;0;0 -9123;migration;negative;0;1;1;0;0;0 -9124;migrer;negative;0;0;0;0;0;0 -9125;mijoter;positive;0;0;0;1;0;0 -9126;mildiou;negative;0;0;0;0;0;1 -9127;mile;positive;0;0;0;0;0;0 -9128;milice;negative;0;1;1;1;0;0 -9129;milieu;positive;0;0;0;0;0;0 -9130;milieu de l être;positive;1;0;0;0;0;0 -9131;militaire;positive;0;1;0;1;0;0 -9132;mille;positive;0;0;0;0;0;0 -9133;mille milliard;positive;0;0;0;0;0;0 -9134;millénaire;positive;0;0;0;0;0;0 -9135;milliard;positive;0;0;0;0;0;0 -9136;millier;positive;0;0;0;0;0;0 -9137;milligramme;positive;0;0;0;0;0;0 -9138;millimètre;positive;0;0;0;0;0;0 -9139;million;positive;0;0;0;0;0;0 -9140;millionnaire;positive;0;0;0;0;0;0 -9141;mimer;negative;0;0;0;0;0;0 -9142;mime;positive;0;0;0;0;0;0 -9143;mimétisme;negative;0;0;0;0;1;0 -9144;minable;negative;0;1;0;1;0;1 -9145;miner;negative;0;1;1;0;0;0 -9146;minerai;positive;0;0;0;0;0;0 -9147;minéral;positive;0;0;0;0;0;0 -9148;minéralogie;positive;0;0;0;0;0;0 -9149;minet;positive;0;0;0;0;0;0 -9150;mineur;positive;0;0;0;0;0;0 -9151;minibus;positive;0;0;0;0;0;0 -9152;minimiser;negative;0;0;1;0;0;0 -9153;minimum;negative;0;0;1;0;0;0 -9154;ministère;positive;0;0;0;0;0;0 -9155;ministre;positive;0;0;0;0;0;0 -9156;minivan;positive;0;0;0;0;0;0 -9157;minorité;negative;0;1;1;0;0;0 -9158;minou;positive;0;0;0;0;0;0 -9159;minuit;positive;0;0;0;0;0;0 -9160;minute;positive;0;0;0;0;0;0 -9161;miracle;positive;0;0;0;0;1;0 -9162;mirage;negative;0;0;0;0;1;0 -9163;miroir;positive;0;0;0;0;0;0 -9164;miroitement;positive;1;0;0;0;0;0 -9165;miroiter;positive;1;0;0;0;0;0 -9166;mise au point;positive;0;0;0;0;0;0 -9167;mettre en accusation;negative;0;1;0;1;0;1 -9168;mettre en conserve;positive;0;0;0;0;0;0 -9169;mettre en évidence;positive;0;0;0;0;0;0 -9170;mettre en examen;negative;0;1;0;0;0;0 -9171;mettre en garde;negative;0;1;0;0;0;0 -9172;mettre en ?uvre;positive;0;0;0;0;0;0 -9173;mettre en tableau x;positive;0;0;0;0;0;0 -9174;misérable;negative;0;0;1;1;0;1 -9175;misérablement;negative;0;0;1;0;0;0 -9176;misère;negative;0;1;1;1;0;1 -9177;miséricorde;positive;0;0;0;0;0;0 -9178;missile;negative;0;1;0;0;0;0 -9179;mission;positive;0;0;0;0;0;0 -9180;missionnaire;positive;0;0;0;0;0;0 -9181;missive;positive;0;0;0;0;0;0 -9182;mite;negative;0;1;0;0;0;1 -9183;miteux;negative;0;0;0;0;0;1 -9184;mitonner;positive;0;0;0;1;0;0 -9185;mitre;positive;0;0;0;0;0;0 -9186;mixer;positive;0;0;0;0;0;0 -9187;mixte;positive;0;0;0;0;0;0 -9188;mobile;positive;0;0;1;0;0;0 -9189;mobilier;positive;0;0;0;0;0;0 -9190;mobilisation;positive;0;0;0;0;0;0 -9191;mobiliser;positive;0;0;0;0;0;0 -9192;mobilité;positive;0;0;0;0;0;0 -9193;modal;positive;0;0;0;0;0;0 -9194;modalité;positive;0;0;0;0;0;0 -9195;mode;positive;0;0;0;0;0;0 -9196;modelage;positive;0;0;0;0;0;0 -9197;modeleur;positive;0;0;0;0;0;0 -9198;modéliste;positive;0;0;0;0;0;0 -9199;modération;positive;0;0;0;0;0;0 -9200;modérément;positive;0;0;0;0;0;0 -9201;moderne;positive;0;0;0;0;0;0 -9202;modernisme;positive;0;0;0;0;0;0 -9203;modestement;positive;0;0;0;0;0;0 -9204;modestie;positive;0;0;0;0;0;0 -9205;modifiable;positive;0;0;0;0;0;0 -9206;modification;negative;0;0;1;0;0;1 -9207;modifier;negative;0;0;1;0;0;1 -9208;modulation;positive;0;0;0;0;0;0 -9209;module;positive;0;0;0;0;0;0 -9210;moduler;positive;0;0;0;0;0;0 -9211;moelle;positive;0;0;0;0;0;0 -9212;moelle osseux;positive;0;0;0;0;0;0 -9213;moignon;negative;0;0;0;0;0;1 -9214;moindre;negative;0;0;1;0;0;1 -9215;moine;positive;0;0;0;0;0;0 -9216;moi|mois;positive;0;0;0;0;0;0 -9217;moisir;negative;0;0;0;0;0;1 -9218;moisissure;negative;0;0;0;0;0;1 -9219;moisson;positive;0;0;0;0;0;0 -9220;moissonner;positive;0;0;0;0;0;0 -9221;molaire;positive;0;0;0;0;0;0 -9222;moléculaire;positive;0;0;0;0;0;0 -9223;molécule;positive;0;0;0;0;0;0 -9224;mollusque;negative;0;0;0;0;0;1 -9225;moment;positive;0;0;0;0;0;0 -9226;momentané;negative;0;0;0;0;0;0 -9227;momie;negative;0;1;1;0;0;1 -9228;monade;positive;0;0;0;0;0;0 -9229;monarchie;positive;0;0;0;0;0;0 -9230;monarque;positive;0;0;0;0;0;0 -9231;monastère;positive;0;0;0;0;0;0 -9232;monastique;positive;0;0;0;0;0;0 -9233;monde;positive;0;0;0;0;0;0 -9234;mondial;positive;0;0;0;0;0;0 -9235;monétaire;positive;0;0;0;0;0;0 -9236;monnaie;positive;0;0;0;1;1;0 -9237;monochrome;negative;0;0;1;0;0;1 -9238;monocle;positive;0;0;0;0;0;0 -9239;monocouche;positive;0;0;0;0;0;0 -9240;monogamie;positive;0;0;0;0;0;0 -9241;monogramme;positive;0;0;0;0;0;0 -9242;monographie;positive;0;0;0;0;0;0 -9243;monologue;negative;0;0;0;0;0;0 -9244;monopole;positive;0;0;0;0;0;0 -9245;monopoliste;negative;0;0;0;1;0;0 -9246;monotone;negative;0;0;1;0;0;0 -9247;monotonie;negative;0;0;1;0;0;0 -9248;monsieur;positive;0;0;0;0;0;0 -9249;monstre;negative;0;1;0;1;1;1 -9250;monstruosité;negative;0;1;0;1;1;1 -9251;mont;positive;0;0;0;0;0;0 -9252;montage;positive;0;0;0;0;0;0 -9253;montagne;positive;0;0;0;0;0;0 -9254;montagne russe;negative;0;1;0;0;0;0 -9255;montant;positive;0;0;0;0;0;0 -9256;monter charge;positive;0;0;0;0;0;0 -9257;monticule;negative;0;0;0;0;0;1 -9258;montrer;positive;0;1;0;0;0;0 -9259;montrer bracelet;positive;0;0;0;0;0;0 -9260;monture;positive;0;0;0;0;0;0 -9261;monument;positive;0;0;0;0;0;0 -9262;monumental;positive;0;0;0;0;0;0 -9263;monumentaux;positive;0;0;0;0;0;0 -9264;moquerie;negative;0;1;1;1;0;1 -9265;moral;positive;0;0;0;1;0;0 -9266;moralité;positive;0;0;0;0;0;0 -9267;moratoire;negative;0;0;1;0;0;0 -9268;morbide;negative;0;0;1;0;0;1 -9269;morbidité;negative;0;1;1;1;0;1 -9270;mordillement;negative;0;1;1;0;1;0 -9271;mordre;negative;0;0;0;1;0;0 -9272;morgue;negative;0;1;1;0;0;1 -9273;moribond;negative;0;0;1;0;0;0 -9274;morphine;negative;0;0;0;0;0;0 -9275;morphisme;positive;0;0;0;0;0;0 -9276;morphologie;positive;0;0;0;0;0;0 -9277;morsure;negative;0;0;0;1;0;0 -9278;mort naître;negative;0;0;1;0;0;0 -9279;mortalité;negative;0;1;1;1;0;0 -9280;mourir;negative;0;0;1;0;0;1 -9281;mortier;negative;0;1;0;1;0;0 -9282;mortification;negative;0;1;1;0;1;1 -9283;mort;negative;0;0;1;0;0;1 -9284;mortuaire;negative;0;1;1;0;0;0 -9285;morue;negative;0;0;0;0;0;0 -9286;morveux;negative;0;0;0;1;0;0 -9287;mosaïque;positive;0;0;0;0;0;0 -9288;mosquée;positive;0;0;0;1;0;0 -9289;mot;positive;0;0;0;0;0;0 -9290;mot pour mot;positive;0;0;0;0;0;0 -9291;moteur;positive;0;0;0;0;0;0 -9292;motif;positive;0;0;0;0;0;0 -9293;motif écossais;positive;0;0;0;0;0;0 -9294;motion;positive;0;0;0;0;0;0 -9295;motivation;positive;0;0;0;0;0;0 -9296;moto;positive;0;0;0;0;0;0 -9297;motocycliste;positive;0;0;0;0;0;0 -9298;moucharder;negative;0;0;0;0;0;0 -9299;mouche;positive;0;0;0;0;0;0 -9300;moucher;negative;0;0;0;0;1;1 -9301;moucheron;negative;0;0;0;0;0;0 -9302;moucheter;negative;0;0;0;0;0;0 -9303;mouchoir;negative;0;0;1;0;0;1 -9304;moudre;negative;0;0;0;1;0;0 -9305;mouette;negative;0;1;0;0;0;1 -9306;mouillage;positive;0;0;1;0;0;0 -9307;mouillant;positive;0;0;0;0;0;0 -9308;mouiller;negative;0;0;0;0;0;1 -9309;mouler;positive;0;0;0;0;0;0 -9310;moulin à vent;positive;0;0;0;0;0;0 -9311;mouliner;negative;0;0;0;0;0;0 -9312;moulinet;negative;0;0;0;0;0;0 -9313;mourant;negative;0;1;1;1;0;1 -9314;mousquet;negative;0;1;0;0;0;0 -9315;moussant;negative;0;0;0;0;0;1 -9316;mousseline;positive;0;0;0;0;0;0 -9317;mousson;negative;0;1;1;0;0;0 -9318;moussu;negative;0;0;0;0;0;1 -9319;moustache;positive;0;0;0;0;0;0 -9320;moustique;negative;0;1;0;1;0;1 -9321;moutarde;negative;0;0;0;0;0;0 -9322;mouton;positive;0;0;0;0;0;0 -9323;mouture;negative;0;0;0;1;0;1 -9324;mouvement constant;negative;0;0;0;0;0;0 -9325;mouvementer;negative;0;1;0;1;0;0 -9326;moyen;positive;0;0;0;0;0;0 -9327;moyen de subsistance;positive;0;0;0;0;0;0 -9328;moyeu;positive;0;0;0;0;0;0 -9329;mucosité;negative;0;0;0;0;0;1 -9330;mucus;negative;0;0;0;0;0;1 -9331;muet;negative;0;1;1;0;1;1 -9332;mugir;negative;0;1;1;1;0;0 -9333;mule;negative;0;0;0;1;0;0 -9334;multilatéral;positive;0;0;0;0;0;0 -9335;multiple;positive;0;0;0;0;0;0 -9336;multiplex;positive;0;0;0;0;0;0 -9337;multiplicateur;positive;0;0;0;0;0;0 -9338;multiplication;positive;0;0;0;0;0;0 -9339;multiplicité;positive;0;0;0;0;0;0 -9340;multiplier;positive;0;0;0;0;0;0 -9341;multitude;positive;0;0;0;0;0;0 -9342;municipal;positive;0;0;0;0;0;0 -9343;municipalité;positive;0;0;0;0;0;0 -9344;munir;positive;0;0;0;0;0;0 -9345;munition;negative;0;1;0;1;0;0 -9346;mùouvenmentée;negative;0;1;0;1;0;0 -9347;muqueuse;negative;0;0;0;0;0;1 -9348;muqueux;negative;0;0;0;0;0;1 -9349;mûre;positive;0;0;0;0;0;0 -9350;mûrir;positive;0;0;0;0;0;0 -9351;murmure;negative;0;1;0;0;0;0 -9352;murmurer;negative;0;1;0;0;0;0 -9353;mûr;positive;0;0;0;0;0;0 -9354;musc;positive;0;0;0;0;0;0 -9355;muscade;positive;0;0;0;0;0;0 -9356;muscle;positive;0;0;0;0;0;0 -9357;musculaire;positive;0;0;0;0;0;0 -9358;muse;positive;0;0;0;0;0;0 -9359;museau;negative;0;1;1;1;0;1 -9360;musée;positive;0;0;0;0;0;0 -9361;museler;negative;0;1;1;1;0;0 -9362;muselière;negative;0;1;1;1;0;0 -9363;musique;positive;0;0;1;0;0;0 -9364;mustang;positive;0;0;0;0;0;0 -9365;mutable;positive;0;0;0;0;0;0 -9366;mutant;negative;0;1;0;0;0;1 -9367;mutation;negative;0;1;0;0;1;0 -9368;mutilation;negative;0;1;1;1;0;1 -9369;mutiler;negative;0;1;1;0;0;1 -9370;mutin;positive;1;0;0;0;0;0 -9371;mutinerie;negative;0;1;0;1;1;1 -9372;mutuellement;positive;0;0;0;0;0;0 -9373;mycose vaginal;negative;0;1;0;0;0;1 -9374;myope;negative;0;0;1;0;0;0 -9375;myopie;negative;0;1;1;1;0;0 -9376;myriade;positive;0;0;0;0;0;0 -9377;mystère;negative;0;1;1;0;1;0 -9378;mysticisme;negative;0;1;0;0;0;0 -9379;mystique;negative;0;1;0;0;1;0 -9380;mythe;positive;0;0;0;0;0;0 -9381;mythique;positive;0;0;0;0;0;0 -9382;mythologie;positive;0;0;0;0;0;0 -9383;mythologique;positive;0;0;0;0;0;0 -9384;nacelle;positive;0;0;0;0;0;0 -9385;nadir;positive;0;0;0;0;0;0 -9386;nager;positive;0;0;0;0;0;0 -9387;nageoire;positive;0;0;0;0;0;0 -9388;naïf;negative;0;0;1;0;0;0 -9389;naissance;positive;0;1;0;0;0;0 -9390;naître;positive;1;0;0;0;0;0 -9391;naissant;positive;1;0;0;0;0;0 -9392;nanomètre;positive;0;0;0;0;0;0 -9393;narcotique;negative;0;1;1;1;0;1 -9394;narine;negative;0;0;0;0;0;1 -9395;narratif;positive;0;0;0;0;0;0 -9396;narration;positive;0;0;0;0;0;0 -9397;narrer;positive;0;0;0;0;0;0 -9398;natal;positive;0;0;0;0;0;0 -9399;natation;positive;0;1;0;0;0;0 -9400;natif;positive;0;0;0;0;0;0 -9401;nation;positive;0;0;0;0;0;0 -9402;national;positive;0;0;0;0;0;0 -9403;nationalité;positive;0;0;0;0;0;0 -9404;national|nationaux;positive;0;0;0;0;0;0 -9405;nativité;positive;1;0;0;0;0;0 -9406;natte;positive;0;0;0;0;0;0 -9407;natter;positive;0;0;0;0;0;0 -9408;naturalisation;positive;0;0;0;0;0;0 -9409;naturaliser;positive;0;0;0;0;0;0 -9410;naturaliste;positive;0;0;0;0;0;0 -9411;nature;positive;0;0;0;0;0;0 -9412;naturel;positive;0;0;0;0;0;0 -9413;naturellement;positive;0;0;0;0;0;0 -9414;naufrage;negative;0;1;1;0;0;0 -9415;nauséabond;negative;0;0;0;0;0;1 -9416;nausée;negative;0;0;0;0;0;1 -9417;nautique;positive;0;0;0;0;0;0 -9418;naval;positive;0;0;0;0;0;0 -9419;navet;negative;0;0;0;0;0;1 -9420;navette;positive;0;0;0;0;0;0 -9421;navigable;positive;0;0;0;0;0;0 -9422;navigation;positive;0;0;0;0;0;0 -9423;navigation à voile;positive;0;0;0;0;0;0 -9424;navigation de plaisance;positive;0;0;0;0;0;0 -9425;naviguer;positive;0;0;0;0;0;0 -9426;navire;positive;0;0;0;0;0;0 -9427;navire prison;negative;0;1;1;0;0;0 -9428;ne pas aimer;negative;0;0;0;1;0;1 -9429;ne pas croire;negative;0;0;0;0;0;0 -9430;ne pas être d accord;negative;0;0;0;1;0;0 -9431;ne pas tenir compte;negative;0;0;0;0;0;1 -9432;néanmoins;negative;0;0;0;0;0;0 -9433;néant;negative;0;1;1;0;0;0 -9434;nébuleux;negative;0;1;1;0;0;0 -9435;nébulosité;negative;0;1;0;0;0;0 -9436;nécessiter;positive;0;0;1;0;0;0 -9437;nécessiteux;negative;0;0;1;0;0;0 -9438;nécro;negative;0;0;1;0;1;1 -9439;nécrologie;negative;0;0;1;0;0;0 -9440;nécrose;negative;0;1;1;0;0;1 -9441;nectar;positive;0;0;0;0;0;0 -9442;nef;positive;0;0;0;0;0;0 -9443;néfaste;negative;0;1;1;1;0;1 -9444;négatif;negative;0;1;1;1;0;1 -9445;négation;negative;0;0;1;1;0;0 -9446;négatif|négative;negative;0;0;1;0;0;0 -9447;négliger;negative;0;1;1;1;0;1 -9448;négligeable;negative;0;0;1;0;0;0 -9449;négligeante;negative;0;1;1;1;0;0 -9450;négligeantes;negative;0;1;1;1;0;0 -9451;négligeants;negative;0;1;1;1;0;0 -9452;négligemment;negative;0;1;1;0;0;0 -9453;négligence;negative;0;1;1;1;0;1 -9454;négligent;negative;0;1;1;1;0;1 -9455;négociation;positive;0;0;0;0;0;0 -9456;négocier;positive;0;0;0;0;0;0 -9457;nègre;negative;0;0;1;1;0;1 -9458;neige;positive;0;0;0;0;0;0 -9459;neige fondu;negative;0;1;1;0;1;1 -9460;neiger;positive;0;0;0;0;0;0 -9461;néonatal;negative;0;0;0;0;0;0 -9462;néophyte;negative;0;1;1;0;0;0 -9463;néoprène;positive;0;0;0;0;0;0 -9464;népotisme;negative;0;1;1;1;0;1 -9465;nerf;positive;0;0;0;0;0;0 -9466;nervosité;negative;0;1;0;1;0;0 -9467;net;positive;0;0;0;0;0;0 -9468;nettement;positive;0;0;0;0;0;0 -9469;netteté;positive;0;0;0;0;0;0 -9470;nettoyage;positive;0;0;0;0;0;0 -9471;nettoyant;positive;0;0;0;0;0;0 -9472;nettoyer;positive;0;0;0;0;0;0 -9473;neuf;positive;0;0;0;0;0;0 -9474;neurologie;positive;0;0;0;0;0;0 -9475;neutraliser;negative;0;0;0;1;1;0 -9476;neutralité;positive;0;0;0;0;0;0 -9477;neutre;positive;0;1;1;0;0;0 -9478;neuvième;positive;0;0;0;0;0;0 -9479;neveu;positive;0;0;0;0;0;0 -9480;névralgie;negative;0;1;1;0;0;0 -9481;névrose;negative;0;1;1;0;0;0 -9482;névrotique;negative;0;1;1;0;0;1 -9483;nez;positive;0;0;0;0;0;1 -9484;niais;negative;0;0;0;0;0;1 -9485;niaiserie;negative;0;0;0;1;0;1 -9486;nier;negative;0;0;0;1;0;0 -9487;nicher;positive;0;0;0;0;0;0 -9488;nickel;positive;0;0;0;0;0;0 -9489;nicotine;negative;0;0;0;0;0;1 -9490;nid;positive;0;0;0;0;0;0 -9491;nièce;positive;0;0;0;0;0;0 -9492;nihilisme;negative;0;0;0;1;0;1 -9493;niveau;positive;0;0;0;0;0;0 -9494;niveler;positive;0;0;0;0;0;0 -9495;noblesse;positive;0;0;0;0;0;0 -9496;nocturne;negative;0;1;1;0;0;0 -9497;nodulaire;negative;0;1;0;0;0;1 -9498;nodule;negative;0;1;0;0;0;1 -9499;n?ud coulant;positive;0;0;1;0;0;0 -9500;noir;negative;0;1;1;1;0;1 -9501;noirceur;negative;0;1;1;0;0;0 -9502;noir|noire;negative;0;1;1;0;0;0 -9503;noix de muscade;positive;0;0;0;0;0;0 -9504;nom;positive;0;0;0;0;0;0 -9505;nom de famille;positive;0;0;0;0;0;0 -9506;nomade;positive;0;0;0;0;0;0 -9507;nombre;positive;0;0;0;0;0;0 -9508;nombre de passager;positive;0;0;0;0;0;0 -9509;nombre entier;positive;0;0;0;0;0;0 -9510;nombreux;positive;0;0;0;0;0;0 -9511;nombril;positive;0;0;0;0;0;0 -9512;nomenclature;positive;0;0;0;0;0;0 -9513;nominal;positive;0;0;0;0;0;0 -9514;nomination;positive;0;0;0;0;0;0 -9515;nominé;positive;0;0;0;0;0;0 -9516;non accompagner;negative;0;0;1;0;0;0 -9517;non approuver;negative;0;0;0;0;0;1 -9518;non armer;negative;0;0;0;0;0;0 -9519;non armé;negative;0;0;0;0;0;0 -9520;non attacher;negative;0;1;0;0;0;0 -9521;non autoriser;negative;0;0;0;0;0;0 -9522;non confirmer;negative;0;0;0;0;0;0 -9523;non contenir;negative;0;1;0;0;0;0 -9524;non conventionnel;negative;0;0;0;0;0;0 -9525;non découvrir;negative;0;0;1;0;1;0 -9526;non découvert;negative;0;0;1;0;1;0 -9527;non déranger;positive;1;0;0;0;0;0 -9528;non désirer;negative;0;0;1;0;0;0 -9529;non développer;negative;0;0;0;0;0;0 -9530;non écrire;negative;0;0;0;0;0;0 -9531;non enregistrer;negative;0;0;1;0;0;0 -9532;non former;negative;0;0;1;0;0;0 -9533;non formé;negative;0;0;1;0;0;0 -9534;non garder;negative;0;1;0;0;1;0 -9535;non infecter;positive;0;0;0;0;0;0 -9536;non initier;negative;0;1;1;0;0;0 -9537;non inscrire;negative;0;1;1;0;0;0 -9538;non intentionnel;negative;0;0;0;0;1;0 -9539;non laver;negative;0;0;0;0;0;1 -9540;non lire;negative;0;0;1;0;0;0 -9541;non marier;negative;0;0;0;0;0;0 -9542;non marquer;positive;0;0;0;0;0;0 -9543;non meubler;negative;0;0;0;0;0;0 -9544;non numéroter;negative;0;0;0;0;0;0 -9545;non orienter;negative;0;0;0;0;0;0 -9546;non ouvrir;negative;0;0;0;0;0;0 -9547;non partager;negative;0;0;1;0;0;0 -9548;non protéger;negative;0;1;1;0;0;0 -9549;non réciproque;negative;0;0;1;0;0;0 -9550;non réclamer;negative;0;0;0;0;0;0 -9551;non reconnaître;negative;0;0;1;0;0;0 -9552;non réglementer;negative;0;1;1;0;0;0 -9553;non rémunérer;negative;0;0;1;1;0;0 -9554;non résoudre;negative;0;0;1;0;1;0 -9555;non révéler;negative;0;1;0;0;0;0 -9556;non scientifique;negative;0;0;0;0;0;0 -9557;non spécifier;negative;0;0;0;0;0;0 -9558;non sucrer;positive;0;0;0;0;0;0 -9559;non tester;negative;0;0;0;0;0;0 -9560;non traduire;negative;0;0;0;0;0;0 -9561;non troubler;positive;1;0;0;0;0;0 -9562;non valide;negative;0;0;1;0;0;0 -9563;non vérifier;negative;0;1;0;0;0;0 -9564;non viable;negative;0;0;1;0;0;0 -9565;non paiement;negative;0;1;1;0;0;0 -9566;non résider;negative;0;0;0;0;0;0 -9567;non respect;negative;0;1;1;1;0;0 -9568;non sen|sens;negative;0;0;0;1;0;0 -9569;normal;positive;0;0;0;0;0;0 -9570;normaliser;positive;0;0;0;0;0;0 -9571;normalité;positive;0;0;0;0;0;0 -9572;norme;positive;0;0;0;0;0;0 -9573;nostalgie;negative;0;0;1;0;0;0 -9574;nostalgique;negative;0;0;1;0;0;0 -9575;notable;positive;0;0;0;0;0;0 -9576;notaire;positive;0;0;0;0;0;0 -9577;notamment;positive;0;0;0;0;0;0 -9578;noter;positive;0;0;0;0;0;0 -9579;note;negative;0;0;0;0;0;0 -9580;notice nécrologique;negative;0;0;1;0;0;0 -9581;notification;positive;0;0;0;0;0;0 -9582;notifier;positive;0;0;0;0;0;0 -9583;notion;positive;0;0;0;0;0;0 -9584;notoire;negative;0;1;0;1;0;1 -9585;nouer;negative;0;0;0;0;0;0 -9586;nouille;positive;0;0;0;0;0;0 -9587;nounou;positive;0;0;0;0;0;0 -9588;nourrir;positive;0;0;1;0;0;0 -9589;nourrissant;positive;0;0;1;0;0;0 -9590;nourrisseur;positive;0;0;0;0;0;0 -9591;nourrisson;positive;0;1;0;0;1;0 -9592;nourriture;positive;0;0;0;0;0;0 -9593;nouveau venu;positive;0;1;0;0;1;0 -9594;nouveau naître;positive;0;0;0;0;0;0 -9595;nouveauté;positive;1;0;0;0;0;0 -9596;nouveau investissement;positive;0;0;0;0;0;0 -9597;nouveau session;positive;0;0;0;0;0;0 -9598;nouvellement;positive;0;0;0;0;0;0 -9599;novice;negative;0;1;0;0;0;0 -9600;noyau;positive;0;0;0;0;0;0 -9601;nu;negative;0;1;1;0;0;0 -9602;nuage;negative;0;0;1;0;0;0 -9603;nuageuges;negative;0;0;1;0;0;0 -9604;nuancer;positive;0;0;0;0;0;0 -9605;nuance;positive;0;0;0;0;0;0 -9606;nudité;negative;0;0;0;0;0;0 -9607;nue;negative;0;1;1;0;0;0 -9608;nuer;negative;0;1;0;0;0;1 -9609;nuire;negative;0;1;1;0;0;0 -9610;nuit;negative;0;1;1;0;0;0 -9611;numérateur;positive;0;0;0;0;0;0 -9612;numérique;positive;0;0;0;0;0;0 -9613;numériquement;positive;0;0;0;0;0;0 -9614;numéro;positive;0;0;0;0;0;0 -9615;numérotation;positive;0;0;0;0;0;0 -9616;numéroter;positive;0;0;0;0;0;0 -9617;nuptial;positive;0;0;0;0;0;0 -9618;nuque;positive;0;0;0;0;0;0 -9619;nutrition;positive;0;0;0;0;0;0 -9620;nymphe;negative;0;0;0;0;0;1 -9621;oasis;positive;0;0;0;0;0;0 -9622;obéir;positive;0;1;0;0;0;0 -9623;obéir à;positive;0;1;0;0;0;0 -9624;obéissance;positive;0;0;0;0;0;0 -9625;obéissant;positive;0;0;0;0;0;0 -9626;obélisque;positive;0;0;0;0;0;0 -9627;obèse;negative;0;0;0;0;0;1 -9628;obésité;negative;0;0;1;0;0;1 -9629;obi;positive;0;1;0;0;0;1 -9630;obit;negative;0;0;1;0;1;1 -9631;objection;negative;0;0;0;1;0;0 -9632;objet faire à le main;positive;0;0;0;0;0;0 -9633;objet;positive;0;0;0;0;0;0 -9634;obligation;negative;0;1;1;0;0;0 -9635;oblique;negative;0;0;0;0;0;0 -9636;obscène;negative;0;0;0;0;0;1 -9637;obscur;negative;0;1;1;0;0;0 -9638;obscurcir;negative;0;1;1;0;0;0 -9639;obscurité;negative;0;1;1;1;0;0 -9640;obsèques;negative;0;0;1;0;0;0 -9641;observance;positive;0;0;0;0;0;0 -9642;observant;positive;0;0;0;0;0;0 -9643;observante;positive;0;0;0;0;0;0 -9644;observantes;positive;0;0;0;0;0;0 -9645;observation;positive;0;0;0;0;0;0 -9646;observatoire;positive;0;0;0;0;0;0 -9647;observer;positive;0;0;0;0;0;0 -9648;obsession;negative;0;1;1;1;0;0 -9649;obsolescence;negative;0;0;1;0;0;1 -9650;obsolète;negative;0;0;1;0;0;1 -9651;obstacle;negative;0;1;1;1;1;0 -9652;obstination;negative;0;0;0;1;0;0 -9653;obstruction;negative;0;0;0;1;1;0 -9654;obstruer;negative;0;1;1;1;0;0 -9655;obtenir;positive;1;0;0;0;0;0 -9656;obturateur;negative;0;0;0;0;0;0 -9657;obtus;negative;0;0;0;1;0;0 -9658;ocarina;positive;0;0;0;0;0;0 -9659;occasionnellement;negative;0;0;0;0;0;0 -9660;occasionner;positive;0;0;0;0;1;0 -9661;occidental;positive;0;0;0;0;0;0 -9662;occlusion;negative;0;1;1;0;0;1 -9663;occultation;negative;0;1;1;1;0;0 -9664;occulte;negative;0;1;0;0;0;1 -9665;occupation;positive;0;0;0;0;0;0 -9666;occuper;negative;0;0;1;1;0;0 -9667;océan;positive;0;0;0;0;0;0 -9668;océanique;positive;0;0;0;0;0;0 -9669;octave;positive;0;0;0;0;0;0 -9670;octet;positive;0;0;0;0;0;0 -9671;octogone;positive;0;0;0;0;0;0 -9672;oculaire;positive;0;0;0;0;0;0 -9673;ode;positive;1;0;0;0;0;0 -9674;odomètre;positive;0;0;0;0;0;0 -9675;odontologie;positive;0;1;0;0;0;0 -9676;odorant;positive;0;0;0;0;0;0 -9677;odorat;negative;0;0;0;1;0;1 -9678;?cuménique;positive;0;0;0;0;0;0 -9679;?il;positive;0;0;0;0;0;0 -9680;?illet;positive;0;0;0;0;0;0 -9681;?uf;positive;0;0;0;0;0;0 -9682;?uf de poisson;negative;0;0;0;0;0;0 -9683;?uvre;positive;0;0;0;0;0;0 -9684;?uvre classique;positive;1;0;0;0;0;0 -9685;offenser;negative;0;1;1;1;0;1 -9686;offensant;negative;0;1;1;1;0;1 -9687;offensif;negative;0;0;1;1;0;1 -9688;offensive;negative;0;0;1;1;0;1 -9689;offrir;positive;1;0;0;0;0;0 -9690;officiel;positive;0;0;0;0;0;0 -9691;officier;positive;0;0;0;0;0;0 -9692;officieueses;positive;0;0;0;0;0;0 -9693;offrande;positive;0;0;0;0;0;0 -9694;offre;positive;0;0;0;0;0;0 -9695;ogre;negative;0;1;0;1;0;1 -9696;oie;negative;0;0;0;0;0;0 -9697;oignon;negative;0;0;0;0;0;1 -9698;oiseau;positive;0;0;0;0;0;0 -9699;oiseau mouche;positive;0;0;0;0;0;0 -9700;oisillon;positive;0;0;0;0;0;0 -9701;oisiveté;negative;0;0;1;0;0;1 -9702;olfactif;positive;0;0;0;0;0;0 -9703;oligarchie;negative;0;0;0;1;0;0 -9704;olive;positive;0;0;0;0;0;0 -9705;ombilic;positive;0;0;0;0;0;0 -9706;ombilical;positive;0;0;0;0;0;0 -9707;ombrager;negative;0;1;1;0;0;0 -9708;ombrer;positive;0;0;0;0;0;0 -9709;ombrelle;positive;0;0;0;0;0;0 -9710;ombre;positive;0;0;0;0;0;0 -9711;oméga;positive;0;0;0;0;0;0 -9712;omelette;positive;0;0;0;0;0;0 -9713;omettre;negative;0;1;0;0;0;1 -9714;omission;negative;0;1;1;0;0;0 -9715;omnibus;positive;0;0;0;0;0;0 -9716;omnipotence;positive;0;1;0;0;0;0 -9717;omnipotent;positive;0;0;0;0;0;0 -9718;omniprésent;positive;0;0;0;0;0;0 -9719;omniscient;positive;0;0;0;0;0;0 -9720;once;positive;0;0;0;0;0;0 -9721;oncle;positive;0;0;0;0;0;0 -9722;oncologue;positive;0;0;0;0;0;0 -9723;onction;positive;0;0;0;0;0;0 -9724;onde;positive;0;0;0;0;0;0 -9725;ondoyer;positive;0;0;0;0;0;0 -9726;onduler;positive;0;0;0;0;0;0 -9727;ongle;negative;0;0;0;0;0;1 -9728;ontologie;positive;0;0;0;0;0;0 -9729;onyx;positive;0;0;0;0;0;0 -9730;onze;positive;0;0;0;0;0;0 -9731;onzième;positive;0;0;0;0;0;0 -9732;opacité;negative;0;1;0;0;0;0 -9733;opale;positive;0;0;0;0;0;0 -9734;opaque;negative;0;1;1;0;0;0 -9735;opération;negative;0;1;0;0;0;0 -9736;ophtalmique;positive;0;0;0;0;0;0 -9737;ophtalmologiste;positive;0;0;0;0;0;0 -9738;opiacer;negative;0;1;0;0;0;1 -9739;opinion;positive;0;0;0;0;0;0 -9740;opium;negative;0;1;1;1;0;1 -9741;opportunisme;negative;0;0;0;0;0;0 -9742;opportunité;positive;0;0;0;0;1;0 -9743;opposant;negative;0;1;0;1;0;1 -9744;opposer;negative;0;1;1;1;0;1 -9745;opposer son veto;negative;0;0;0;1;0;0 -9746;opposition;negative;0;0;0;1;0;0 -9747;oppresser;negative;0;1;1;1;0;1 -9748;oppressant;negative;0;1;1;1;0;1 -9749;oppresseur;negative;0;1;1;1;0;0 -9750;oppression;negative;0;1;1;1;0;1 -9751;opprimer;negative;0;1;1;1;0;1 -9752;opressants;negative;0;1;1;1;0;1 -9753;optimisme;positive;0;0;0;0;1;0 -9754;optimiste;positive;0;0;0;0;0;0 -9755;option;positive;0;0;0;0;0;0 -9756;optique;positive;0;0;0;0;0;0 -9757;optométriste;positive;0;0;0;0;0;0 -9758;opulence;positive;1;0;0;0;0;0 -9759;opulent;positive;1;0;0;0;0;0 -9760;opus;positive;0;0;0;0;0;0 -9761;oracle;positive;0;0;0;0;0;0 -9762;orage;negative;0;1;0;1;1;0 -9763;oraison;positive;0;0;0;0;0;0 -9764;oral;positive;0;0;0;0;0;0 -9765;orange;positive;0;0;0;0;0;0 -9766;oratoire;positive;0;0;0;0;0;0 -9767;orbe;positive;0;0;0;0;0;0 -9768;orbite;positive;0;0;0;0;0;0 -9769;orchestre;positive;0;0;1;1;0;0 -9770;ordinateur;positive;0;0;0;0;0;0 -9771;ordination;positive;0;0;0;0;0;0 -9772;ordonnance;positive;0;0;0;0;0;0 -9773;ordonner;positive;0;0;0;0;0;0 -9774;ordre gestuel;positive;0;0;0;0;0;0 -9775;ordre;positive;0;0;0;0;0;0 -9776;ordure;negative;0;0;1;0;0;1 -9777;orée;positive;0;0;0;0;0;0 -9778;oreille;positive;0;0;0;0;0;0 -9779;oreiller;positive;0;0;0;0;0;0 -9780;oreillon;negative;0;1;1;0;0;1 -9781;organe;positive;1;0;0;0;0;0 -9782;organique;positive;0;0;0;0;0;0 -9783;organiser;positive;0;0;0;0;0;0 -9784;organisme;positive;0;0;0;0;1;0 -9785;organiste;positive;0;0;0;0;0;0 -9786;orgasme;positive;1;0;0;0;0;0 -9787;orgie;negative;0;0;0;0;0;1 -9788;orgue;positive;1;0;0;0;0;0 -9789;orgueil;negative;0;0;0;0;0;1 -9790;orient;positive;0;0;0;0;0;0 -9791;oriental;positive;0;0;0;0;0;0 -9792;orientation;positive;0;0;0;0;0;0 -9793;orienter;positive;0;0;0;0;0;0 -9794;orifice;negative;0;0;0;0;0;0 -9795;origan;positive;0;0;0;0;0;0 -9796;originaire;positive;0;0;0;0;0;0 -9797;originalité;positive;0;0;0;0;1;0 -9798;origine;positive;0;0;0;0;0;0 -9799;orner;positive;0;0;0;0;0;0 -9800;ornement;positive;0;0;0;0;0;0 -9801;ornemental;positive;0;0;0;0;0;0 -9802;ornementation;positive;0;0;0;0;0;0 -9803;ornière;positive;0;0;0;0;0;0 -9804;orphelin;negative;0;1;1;0;0;0 -9805;orque;negative;0;1;0;1;0;1 -9806;orteil;negative;0;0;0;0;0;1 -9807;orthodoxe;positive;0;0;0;0;0;0 -9808;orthodoxie;positive;0;0;0;0;0;0 -9809;orthogonal;positive;0;0;0;0;0;0 -9810;orthographe;positive;0;0;0;0;0;0 -9811;ortie;negative;0;0;1;1;0;1 -9812;os;negative;0;0;0;0;0;0 -9813;osciller;negative;0;1;1;0;0;0 -9814;oscillant;negative;0;1;1;0;0;0 -9815;oscillation;negative;0;1;1;0;0;0 -9816;oscillatoire;negative;0;1;1;0;0;0 -9817;oser;negative;0;0;0;1;0;0 -9818;osier;positive;0;0;0;0;0;0 -9819;ossement;negative;0;0;0;0;0;0 -9820;osseux;negative;0;0;1;0;0;0 -9821;ostensible;positive;0;0;0;0;0;0 -9822;ostensiblement;positive;0;0;0;0;0;0 -9823;otage;negative;0;1;1;1;0;0 -9824;ôter;negative;0;1;1;1;0;0 -9825;oubli;negative;0;1;1;1;0;0 -9826;oublier;negative;0;1;1;0;0;0 -9827;oublieux;negative;0;1;1;0;0;0 -9828;ouïr dire;negative;0;1;1;1;0;1 -9829;ouragan;negative;0;1;0;0;0;0 -9830;ourler;positive;0;0;0;0;0;0 -9831;ourlet;positive;0;0;0;0;0;0 -9832;outillage;positive;0;0;0;0;0;0 -9833;outil de coupe;positive;0;0;0;0;0;0 -9834;outrage;negative;0;1;0;1;0;1 -9835;outrageux;negative;0;0;0;0;1;0 -9836;ouvrir;positive;0;0;0;0;0;0 -9837;ouvertement;positive;0;0;0;0;0;0 -9838;ouverture;positive;0;0;0;0;0;0 -9839;ouvrage;positive;0;0;0;0;0;0 -9840;ouvranr;positive;0;0;0;0;0;0 -9841;ouvrer|ouvrir boîte;positive;0;0;0;0;0;0 -9842;ouvreur;positive;0;0;0;0;0;0 -9843;ouvreur|ouvreuse;positive;0;0;0;0;0;0 -9844;ovaire;positive;0;0;0;0;0;0 -9845;ovale;positive;0;0;0;0;0;0 -9846;ovation;positive;0;0;1;0;0;0 -9847;overdose;negative;0;1;1;0;0;1 -9848;ovoïde;negative;0;0;0;0;0;0 -9849;oxydation;negative;0;0;0;0;0;1 -9850;oxygène;positive;0;0;0;0;0;0 -9851;oxymore;negative;0;0;0;0;0;0 -9852;pacifier;positive;0;0;0;0;0;0 -9853;pacifique;positive;0;0;0;0;1;0 -9854;pack;positive;0;0;0;0;0;0 -9855;pacotille;negative;0;0;0;0;0;1 -9856;pacte;positive;0;0;0;0;0;0 -9857;pagaie;positive;0;0;0;0;0;0 -9858;pagaille;negative;0;0;0;1;0;1 -9859;paganisme;positive;0;0;0;0;0;0 -9860;pagayer|pagayer;positive;0;0;0;0;0;0 -9861;page;positive;0;0;0;0;0;0 -9862;pagination;positive;0;0;0;0;0;0 -9863;pagode;positive;0;0;0;0;0;0 -9864;paie;positive;0;0;0;0;0;0 -9865;paiement;positive;0;0;0;0;0;0 -9866;païen;negative;0;1;0;1;0;0 -9867;paillard;negative;0;0;0;0;0;1 -9868;paillasson;negative;0;0;0;0;0;0 -9869;paille;positive;0;0;0;0;0;0 -9870;paillette;positive;0;0;0;0;0;1 -9871;pain;positive;0;0;0;0;0;0 -9872;pair;positive;0;0;0;0;0;0 -9873;paire;positive;0;0;0;0;0;0 -9874;paisible;positive;0;0;0;0;1;0 -9875;paix;positive;0;0;0;0;0;0 -9876;palais;positive;0;0;0;0;0;0 -9877;palais de justice;positive;0;0;0;0;0;0 -9878;palan;positive;0;0;0;0;0;0 -9879;pale;negative;0;1;0;0;0;0 -9880;pâle;negative;0;1;1;0;1;0 -9881;paléontologie;positive;0;0;0;0;0;0 -9882;palet;positive;0;0;0;0;0;0 -9883;palette;positive;0;0;0;0;0;0 -9884;palladium;positive;0;0;0;0;0;0 -9885;palliatif;positive;0;1;1;0;0;0 -9886;palme;positive;0;0;0;0;0;0 -9887;palmier;positive;0;0;0;0;0;0 -9888;palourde;negative;0;0;0;0;0;1 -9889;palpable;positive;0;0;0;0;1;0 -9890;palper;positive;0;0;0;0;0;0 -9891;palpitation;negative;0;1;1;0;1;0 -9892;palpiter;negative;0;1;1;0;1;0 -9893;paludisme;negative;0;1;1;0;0;1 -9894;pâmoison;positive;1;0;0;0;0;0 -9895;pampille;positive;0;0;0;0;0;0 -9896;panacée;positive;0;0;0;0;0;0 -9897;panache;positive;1;0;0;0;0;0 -9898;panacher;positive;0;0;0;0;0;0 -9899;pancake;positive;0;0;0;0;0;0 -9900;pancarte;positive;0;0;0;0;1;0 -9901;pandémie;negative;0;1;1;0;0;1 -9902;pandémique;negative;0;1;1;0;0;1 -9903;panel;positive;0;0;0;0;0;0 -9904;panier;positive;0;0;0;0;0;0 -9905;panique;negative;0;1;0;1;0;0 -9906;paniquer;negative;0;1;0;0;0;0 -9907;panne;negative;0;1;1;0;0;1 -9908;panneau;positive;0;0;0;0;0;0 -9909;panorama;positive;0;0;0;0;0;0 -9910;panoramique;positive;0;0;0;0;0;0 -9911;pansement adhésif;negative;0;0;1;0;0;0 -9912;pantalon;positive;0;0;0;0;0;0 -9913;panthéon;positive;0;0;0;0;0;0 -9914;panthère;negative;0;1;0;0;0;0 -9915;pantin;negative;0;0;0;0;0;0 -9916;pantomime;positive;1;0;0;0;0;0 -9917;pantoufle;positive;0;0;0;0;0;0 -9918;paon;positive;0;0;0;0;0;0 -9919;papa;positive;0;0;0;0;0;0 -9920;papal;positive;0;0;0;0;0;0 -9921;papauté;positive;0;0;0;0;0;0 -9922;pape;positive;0;0;0;0;0;0 -9923;paperasse;negative;0;0;0;0;0;0 -9924;papeterie;positive;0;0;0;0;0;0 -9925;papier;positive;0;0;0;0;0;0 -9926;papier de garde;positive;0;0;0;0;0;0 -9927;papillon;positive;0;0;0;0;0;0 -9928;papoter;positive;0;0;0;0;0;0 -9929;paprika;positive;0;0;0;0;0;0 -9930;papyrus;positive;0;0;0;0;0;0 -9931;paquebot;positive;0;0;0;0;0;0 -9932;par accident;negative;0;1;1;0;1;0 -9933;par conséquent;positive;0;0;0;0;0;0 -9934;par défaut;negative;0;1;1;0;0;1 -9935;par dix;positive;0;0;0;0;0;0 -9936;par hasard;positive;0;0;0;0;1;0 -9937;par inadvertance;negative;0;1;1;0;1;0 -9938;par là;positive;0;0;0;0;0;0 -9939;par le force;negative;0;1;0;1;0;0 -9940;par le poste;positive;0;0;0;0;0;0 -9941;par le suite;negative;0;0;0;0;0;0 -9942;par lot;positive;0;0;0;0;0;0 -9943;par morceau;negative;0;0;1;0;0;0 -9944;par procuration;positive;0;0;0;0;0;0 -9945;par quatre;positive;0;0;0;0;0;0 -9946;par surprise;negative;0;1;0;0;1;0 -9947;parabole;positive;0;0;0;0;0;0 -9948;parabolique;positive;0;0;0;0;0;0 -9949;parachute;negative;0;1;0;0;0;0 -9950;parade;positive;0;1;0;0;1;0 -9951;paradigme;positive;0;0;0;0;0;0 -9952;paradisiaque;positive;0;0;0;0;0;0 -9953;paradoxal;negative;0;0;0;0;0;0 -9954;paradoxe;negative;0;0;0;0;0;0 -9955;paragraphe;positive;0;0;0;0;0;0 -9956;parallaxe;negative;0;0;0;0;0;0 -9957;parallèle;positive;0;0;0;0;0;0 -9958;parallélisme;positive;0;0;0;0;0;0 -9959;paralyser;negative;0;1;1;1;1;0 -9960;paralysie;negative;0;1;1;1;0;1 -9961;parangon;positive;0;0;0;0;0;0 -9962;paranoïa;negative;0;1;0;1;0;0 -9963;parapet;positive;0;0;0;0;0;0 -9964;paraphrase;positive;0;0;0;0;0;0 -9965;paraphraser;positive;0;0;0;0;0;0 -9966;parapluie;positive;0;0;0;0;0;0 -9967;parasite;negative;0;1;0;0;0;1 -9968;parasol;positive;0;0;0;0;0;0 -9969;parc;positive;0;0;0;0;0;0 -9970;parcelle;positive;0;0;0;0;0;0 -9971;parchemin;positive;0;0;0;0;0;0 -9972;parcimonie;positive;0;0;0;0;0;0 -9973;parcimonieux;negative;0;0;0;0;0;0 -9974;parcours;positive;0;0;0;0;0;0 -9975;pardessus;positive;0;0;0;0;0;0 -9976;pardon;positive;0;0;0;0;0;0 -9977;pardonner;positive;0;0;0;0;0;0 -9978;parer balle;positive;0;0;0;0;0;0 -9979;parer choc;positive;0;0;0;0;0;0 -9980;pareil;positive;0;0;0;0;0;0 -9981;parenchyme;positive;0;0;0;0;0;0 -9982;parent;positive;0;0;0;0;0;0 -9983;parental;positive;0;0;0;0;0;0 -9984;parentales;positive;0;0;0;0;0;0 -9985;parenthèse;positive;0;0;0;0;0;0 -9986;parent|parents;positive;0;0;0;0;0;0 -9987;parer;positive;0;0;0;0;1;0 -9988;paresse;negative;0;0;1;0;0;1 -9989;parfaire;positive;0;0;0;0;0;0 -9990;parfum;positive;1;0;0;0;0;0 -9991;parfumer;positive;0;0;0;0;0;0 -9992;paria;negative;0;1;1;0;0;1 -9993;pariétal;positive;0;0;0;0;0;0 -9994;pari;positive;0;1;0;0;1;0 -9995;parité;positive;0;0;0;0;0;0 -9996;parjure;negative;0;1;0;1;1;0 -9997;parjurer;negative;0;0;1;1;1;1 -9998;parler;positive;0;0;0;0;0;0 -9999;parlement;positive;0;0;0;0;0;0 -10000;parlementaire;positive;0;0;0;0;0;0 -10001;parodier;negative;0;0;0;0;0;0 -10002;paroi;negative;0;0;0;0;0;0 -10003;paroisse;positive;0;0;0;0;0;0 -10004;parole;positive;0;0;0;0;0;0 -10005;paroxysme;positive;0;0;0;0;1;0 -10006;parquet;positive;0;0;0;0;0;0 -10007;parrain;positive;0;0;0;0;0;0 -10008;parrainage;positive;0;0;0;0;0;0 -10009;parrainer;positive;0;0;0;0;0;0 -10010;partager;positive;0;0;0;0;0;0 -10011;partenaire;positive;0;0;0;0;0;0 -10012;partenariat;positive;0;0;0;0;0;0 -10014;parti prendre;negative;0;0;0;0;0;0 -10015;partial;negative;0;0;0;0;0;0 -10016;partialité;negative;0;0;0;0;0;0 -10017;participation;positive;0;0;0;1;0;0 -10018;participer;positive;0;0;0;0;0;0 -10019;particularité;negative;0;0;0;0;1;1 -10020;particulères;positive;0;0;0;0;0;0 -10021;partie;positive;1;0;0;0;0;0 -10022;partiel;negative;0;0;1;0;0;0 -10023;partiellement;negative;0;0;0;0;0;0 -10024;parure;positive;0;0;0;0;0;0 -10025;parvenir à;positive;0;0;0;0;0;0 -10026;pas cher;negative;0;0;0;0;0;0 -10027;pas complètement;negative;0;0;1;0;0;0 -10028;pas convaincre;negative;0;0;0;0;0;0 -10029;pas de côté;negative;0;1;0;0;0;0 -10030;pas digne de confiance;negative;0;1;0;1;0;0 -10031;pas disposer;negative;0;0;0;1;0;0 -10032;pas préparer;negative;0;1;0;0;1;0 -10033;passable;negative;0;0;0;0;0;0 -10034;passade;negative;0;0;0;0;0;0 -10035;passage;positive;0;0;0;0;0;0 -10036;passage à tabac;negative;0;1;1;1;0;0 -10037;passer temps;positive;1;0;0;0;0;0 -10038;passeport;positive;0;0;0;0;0;0 -10039;passer en contrebande;negative;0;1;0;0;0;0 -10040;passerelle;positive;0;0;0;0;0;0 -10041;passim;negative;0;0;0;0;0;0 -10042;passion;negative;0;0;0;0;0;0 -10043;passionée;positive;0;0;0;0;0;0 -10044;passionées;positive;0;0;0;0;0;0 -10045;passionés;positive;0;0;0;0;0;0 -10046;passionner;positive;0;0;0;0;1;0 -10047;passionnant;positive;0;0;0;0;1;0 -10048;passivité;negative;0;0;1;0;0;0 -10049;passoire;positive;0;0;0;0;0;0 -10050;pastel;positive;0;0;0;0;0;0 -10051;patauger;negative;0;1;1;1;0;1 -10052;patch;negative;0;0;0;0;0;0 -10053;patchwork;positive;0;0;0;0;0;0 -10054;patère;positive;0;0;0;0;0;0 -10055;paternité;positive;0;0;0;0;0;0 -10056;pathétique;negative;0;0;1;1;0;1 -10057;pathologie;negative;0;1;1;0;0;0 -10058;pathos;positive;0;0;0;0;0;0 -10059;patience;positive;0;0;0;0;0;0 -10060;patient;negative;0;1;1;0;0;0 -10061;patienter;negative;0;0;0;0;0;0 -10062;patin;positive;0;0;0;0;0;0 -10063;patinage;positive;0;0;0;0;0;0 -10064;patiner;positive;0;0;0;0;0;0 -10065;patinoire;positive;0;0;0;0;0;0 -10066;patio;positive;0;0;0;0;0;0 -10067;pâtisserie;positive;1;0;0;0;0;0 -10068;patriarcal;positive;0;0;0;0;0;0 -10069;patriarche;positive;0;0;0;0;0;0 -10070;patrimoine;positive;0;0;0;0;0;0 -10071;patriote;positive;0;0;0;0;0;0 -10072;patriotique;positive;0;0;0;0;0;0 -10073;patriotisme;positive;0;0;0;0;0;0 -10074;patron;positive;0;0;0;0;0;0 -10075;patronage;positive;0;0;0;0;0;0 -10076;patrouille;positive;0;0;0;0;0;0 -10077;patrouiller;positive;0;0;0;0;0;0 -10078;patte;positive;0;0;0;0;0;0 -10079;pâturage;positive;0;0;0;0;0;0 -10080;pâture;positive;0;0;0;0;0;0 -10081;paume;positive;0;0;0;0;0;0 -10082;pauvre;negative;0;1;1;0;0;0 -10083;pauvrement;negative;0;1;1;0;0;0 -10084;pauvreté;negative;0;1;1;1;0;1 -10085;pavage;positive;0;0;0;0;0;0 -10086;pavaner;negative;0;0;0;0;0;0 -10087;paver;positive;0;0;0;0;0;0 -10088;pavillon;positive;0;0;0;0;0;0 -10089;pavot;positive;0;0;0;0;0;0 -10090;pax;positive;0;0;0;0;0;0 -10091;paye;positive;1;0;0;0;0;0 -10092;payer|payer;positive;0;0;0;0;0;0 -10093;pays;positive;0;0;0;0;0;0 -10094;paysage;positive;0;0;0;0;0;0 -10095;péage;negative;0;0;0;0;0;0 -10096;peau de vache;negative;0;0;0;0;0;0 -10097;peaufinage;positive;0;0;0;0;0;0 -10098;peaufiner;positive;0;0;0;0;0;0 -10099;pêcher;positive;0;0;0;0;0;0 -10100;pêche à le ligne;positive;0;0;0;0;0;0 -10101;pêcher au chalut;positive;0;0;0;0;0;0 -10102;pécuniaire;negative;0;0;0;0;0;0 -10103;pédagogique;positive;0;0;0;0;0;0 -10104;pédale;positive;0;0;0;0;0;0 -10105;pédaler;positive;0;0;0;0;0;0 -10106;pédant;negative;0;0;0;1;0;1 -10107;pédiatrie;positive;0;0;0;0;0;0 -10108;pédicule;negative;0;0;0;0;0;0 -10109;pedigree;positive;0;0;0;0;0;0 -10110;pédoncule;negative;0;0;0;0;0;0 -10111;peigne;positive;0;0;0;0;0;0 -10112;peigner;positive;0;0;0;0;0;0 -10113;peignoir;positive;0;0;0;0;0;0 -10114;peindre;positive;0;0;0;0;0;0 -10115;peiner;negative;0;1;1;0;0;0 -10116;peintre;positive;0;0;0;0;0;0 -10117;peinture;positive;0;0;0;0;0;0 -10118;peinture mural;positive;0;0;0;0;0;0 -10119;pelage;positive;0;0;0;0;0;0 -10120;pélagien;positive;0;0;0;0;0;0 -10121;pélagique;positive;0;0;0;0;0;0 -10122;peler;negative;0;0;0;0;0;0 -10123;pèlerin;positive;0;0;0;0;0;0 -10124;pèlerinage;positive;0;0;0;0;0;0 -10125;pelle;positive;0;0;0;0;0;0 -10126;pelleter;positive;0;0;0;0;0;0 -10127;pellicule;positive;0;0;0;0;0;0 -10128;pelotage;negative;0;1;0;1;0;1 -10129;peloter;negative;0;1;0;1;0;1 -10130;peloton;positive;0;0;0;0;0;0 -10131;pelouse;positive;0;0;0;0;0;0 -10132;peluche;positive;0;0;0;0;0;0 -10133;pénal;negative;0;1;1;0;0;0 -10134;pénalité;negative;0;1;1;1;0;0 -10135;pencher;negative;0;0;0;0;0;0 -10136;pendaison;negative;0;1;1;1;0;1 -10137;pendant que;negative;0;0;0;0;0;0 -10138;pendentif;positive;0;0;0;0;0;0 -10139;pendre;negative;0;0;0;0;0;0 -10140;pendule;positive;0;0;0;0;0;0 -10141;pénétrer;positive;0;0;0;0;1;0 -10142;pénétrante;positive;0;0;0;0;1;0 -10143;pénétrant;positive;0;0;0;0;1;0 -10144;pénétrer illégalement dans un;negative;0;1;0;1;0;0 -10145;pénibilité;negative;0;0;0;1;0;0 -10146;pénible;negative;0;1;1;1;0;1 -10147;péniche;positive;0;0;0;0;0;0 -10148;péninsule;positive;0;0;0;0;0;0 -10149;pénitence;negative;0;1;1;0;0;0 -10150;pénitencier;negative;0;1;1;1;0;0 -10151;penny;positive;0;0;0;0;0;0 -10152;pénombre;negative;0;1;1;1;0;0 -10153;penser;positive;0;0;0;0;0;0 -10154;penser bête;positive;0;0;0;0;0;0 -10155;penser après coup;negative;0;1;1;0;0;0 -10156;pension;positive;0;0;0;0;0;0 -10157;pension alimentaire;negative;0;0;0;0;0;0 -10158;pensionnaire;positive;0;0;0;0;0;0 -10159;pentagone;positive;0;0;0;0;0;0 -10160;pente;negative;0;1;1;0;0;0 -10161;penthouse;positive;0;0;0;0;0;0 -10162;pénultième;negative;0;0;1;0;0;0 -10163;pénurie;negative;0;1;1;1;0;1 -10164;pépiement;positive;1;0;0;0;0;0 -10165;pépier;positive;1;0;0;0;0;0 -10166;pépin;negative;0;1;1;0;1;0 -10167;pépinière;positive;0;0;0;0;0;0 -10168;pépite;positive;1;0;0;0;0;0 -10169;perceptible;positive;0;0;0;0;0;0 -10170;percer;negative;0;1;0;1;0;0 -10171;perceur;negative;0;1;0;1;0;0 -10172;percevoir;positive;0;0;0;0;1;0 -10173;perche;positive;0;0;0;0;0;0 -10174;percher;positive;0;0;0;0;0;0 -10175;perchoir;positive;0;0;0;0;0;0 -10176;percolation;negative;0;1;0;0;0;1 -10177;percussion;positive;0;0;0;0;0;0 -10178;perdant;negative;0;0;1;1;1;0 -10179;perdition;negative;0;1;1;1;0;1 -10180;perdre;negative;0;1;1;0;1;0 -10181;péremption;negative;0;1;0;0;0;1 -10182;péremptoire;negative;0;1;1;0;0;0 -10183;pérenne;positive;0;0;0;0;0;0 -10184;pereuses;negative;0;1;1;0;0;0 -10185;perfection;positive;0;0;0;0;1;0 -10186;perforation;negative;0;1;0;0;0;0 -10187;perforer;negative;0;1;0;0;0;0 -10188;performance;positive;0;0;0;0;1;0 -10189;péridot;positive;0;0;0;0;0;0 -10190;péril;negative;0;1;1;0;0;0 -10191;périmètre;positive;0;0;0;0;0;0 -10192;période;negative;0;0;0;0;0;0 -10193;périodicité;positive;0;0;0;0;0;0 -10194;périodique;positive;0;0;0;0;0;0 -10195;périodiquement;positive;0;0;0;0;0;0 -10196;péripétie;positive;0;1;0;0;1;0 -10197;périr;negative;0;1;1;0;0;0 -10198;périssable;negative;0;0;0;0;0;1 -10199;perle;positive;0;0;0;0;0;0 -10200;perler;positive;0;0;0;0;0;0 -10201;permanence;positive;0;0;0;0;0;0 -10202;perméable;negative;0;0;0;0;0;0 -10203;permission;positive;0;0;0;0;0;0 -10204;permutable;positive;0;0;0;0;0;0 -10205;permutation;negative;0;1;1;0;0;0 -10206;permuter;positive;0;0;0;0;0;0 -10207;perpendiculaire;positive;0;0;0;0;0;0 -10208;perpétrer;negative;0;1;0;1;0;0 -10209;perpétuation;positive;0;0;0;0;0;0 -10210;perpétuellement;positive;0;0;0;0;0;0 -10211;perpétuer;positive;0;0;0;0;0;0 -10212;perpétuité;positive;0;0;0;0;0;0 -10213;perplexe;negative;0;1;1;0;1;0 -10214;perplexité;negative;0;1;1;0;1;0 -10215;perron;negative;0;1;0;0;0;0 -10216;perroquet;negative;0;0;0;0;0;1 -10217;perruque;negative;0;0;0;0;0;0 -10218;persécuter;negative;0;1;1;1;0;0 -10219;persécution;negative;0;1;1;1;0;1 -10220;persévérance;positive;0;0;0;0;0;0 -10221;persévérer;positive;0;0;0;0;0;0 -10222;persévérant;positive;0;0;0;0;0;0 -10223;persil;positive;0;0;0;0;0;0 -10224;persistance;positive;0;0;0;0;0;0 -10225;persistant;positive;0;0;0;0;0;0 -10226;personnage;positive;0;0;0;0;0;0 -10227;personnaliser;positive;0;0;0;0;0;0 -10228;personnalité;positive;0;0;0;0;0;0 -10229;personne âgé;positive;0;0;0;0;0;0 -10230;personne interroger;positive;0;0;0;0;0;0 -10231;personne qui changer qch;positive;0;0;0;0;0;0 -10232;personne qui fredonner;positive;0;0;0;0;0;0 -10233;personne qui prier;positive;0;0;0;0;0;0 -10234;personne qui se disputer;negative;0;0;0;1;0;0 -10235;personnel;positive;0;0;0;0;0;0 -10236;personne;positive;0;0;0;0;0;0 -10237;personnification;positive;0;0;0;0;0;0 -10238;perspective;positive;0;0;0;0;0;0 -10239;perspicacité;positive;0;0;0;0;0;0 -10240;persuasion;positive;0;0;0;0;0;0 -10241;perte;negative;0;1;1;1;0;0 -10242;perte de connaissance;negative;0;1;1;0;1;0 -10243;pertinence;positive;0;0;0;0;0;0 -10244;perturbation;negative;0;1;1;1;1;0 -10245;perversion;negative;0;0;1;1;0;1 -10246;pervertir;negative;0;1;0;1;0;1 -10247;pesage;positive;0;0;0;0;0;0 -10248;pesant;negative;0;1;1;0;0;0 -10249;pesanteur;positive;0;0;0;0;0;0 -10250;pessimisme;negative;0;1;1;1;0;0 -10251;pessimiste;negative;0;1;1;0;0;0 -10252;peste;negative;0;1;1;0;0;1 -10253;pestilence;negative;0;1;0;0;0;1 -10254;pétasse;negative;0;1;1;1;0;1 -10255;pétiller;positive;1;0;0;0;0;0 -10256;péter;positive;0;0;0;0;0;0 -10257;petit chat;positive;0;0;0;0;0;0 -10258;petit coin;negative;0;0;0;0;0;1 -10259;petit comité;positive;0;0;0;0;0;0 -10260;petit coup;negative;0;1;0;1;1;0 -10261;petit coup de coude;positive;0;0;0;0;0;0 -10262;petit déjeuner;positive;0;0;0;0;0;0 -10263;petit gros petit gros|grosse;negative;0;0;1;0;0;1 -10264;petit morceau;negative;0;0;1;0;0;0 -10265;petit oiseau;positive;0;0;0;0;0;0 -10266;petit pain;positive;0;0;0;0;0;0 -10267;petit salon;positive;0;0;0;0;0;0 -10268;petit;negative;0;0;1;0;0;0 -10269;petit bête;negative;0;1;0;0;0;1 -10270;petit enfance;positive;0;0;0;0;0;0 -10271;petit ferme;positive;0;0;0;0;0;0 -10272;petit idée;positive;0;0;0;0;0;0 -10273;petit morsure;negative;0;1;1;0;1;0 -10274;petit tache;negative;0;0;1;0;0;1 -10275;petit tape;positive;0;0;0;0;0;0 -10276;petitesse;negative;0;0;1;0;0;0 -10277;pétition;positive;0;0;0;0;0;0 -10278;pétitionnaire;positive;0;0;0;0;0;0 -10279;pétitionner;positive;0;0;0;0;0;0 -10280;petit cadeau;positive;1;0;0;0;0;0 -10281;petit enfant;positive;0;0;0;0;0;0 -10282;pétoncle;positive;0;0;0;0;0;0 -10283;pétrir;positive;0;0;0;0;0;0 -10284;peu à peu;positive;0;0;0;0;0;0 -10285;peu aimable;negative;0;1;1;1;0;1 -10286;peu amical;negative;0;1;1;1;0;1 -10287;peu attraire;negative;0;0;1;0;0;1 -10288;peu attrayant;negative;0;0;1;0;0;1 -10289;peu clément;negative;0;0;1;0;0;0 -10290;peu communepeu commun;negative;0;0;0;0;0;0 -10291;peu commune;negative;0;0;0;0;0;0 -10292;peu compatissant;negative;0;0;0;1;0;1 -10293;peu compatissante;negative;0;0;0;1;0;1 -10294;peu compatissantes;negative;0;0;0;1;0;1 -10295;peu compatissants;negative;0;0;0;1;0;1 -10296;peu conclure;negative;0;0;1;0;0;0 -10297;peu concluant;negative;0;0;1;0;0;0 -10298;peu coûteux;positive;1;0;0;0;0;0 -10299;peu critique;negative;0;0;0;0;0;0 -10300;peu familier;negative;0;1;0;0;0;0 -10301;peu fiable;negative;0;1;0;1;0;0 -10302;peu fréquemment;negative;0;0;0;0;1;0 -10303;peu fréquent;negative;0;0;0;0;1;0 -10304;peu importer;negative;0;0;0;0;0;0 -10305;peu instruire;negative;0;0;1;0;0;0 -10306;peu méfier;negative;0;1;1;0;1;0 -10307;peu méfiant;negative;0;1;1;0;1;0 -10308;peu original;negative;0;0;0;0;0;0 -10309;peu orthodoxe;negative;0;1;1;0;0;1 -10310;peu profitable;negative;0;0;1;0;0;0 -10311;peu réaliste;negative;0;1;1;0;0;0 -10312;peu rentable;negative;0;0;1;0;0;0 -10313;peu satisfaisant;negative;0;0;1;0;0;1 -10314;peu séduisant;negative;0;0;1;0;0;1 -10315;peu soigner;negative;0;0;0;0;0;1 -10316;peu sûr;negative;0;1;0;0;1;0 -10317;peuple;positive;0;0;0;0;0;0 -10318;peupler;positive;0;0;0;0;0;0 -10319;peur;negative;0;1;0;1;1;0 -10320;phalange;positive;0;1;0;0;0;0 -10321;phare;positive;0;0;0;0;0;0 -10322;pharmaceutique;positive;0;0;0;0;0;0 -10323;pharmacie;positive;0;0;0;0;0;0 -10324;pharmacologie;positive;0;0;0;0;0;0 -10325;phase;positive;0;0;0;0;0;0 -10326;phénix;positive;0;0;0;0;0;0 -10327;phénomène;positive;0;0;0;0;0;0 -10328;philanthrope;positive;0;0;0;0;0;0 -10329;philanthropie;positive;0;0;0;0;0;0 -10330;philosophe;positive;0;0;0;0;0;0 -10331;philosophie;positive;0;0;0;0;0;0 -10332;philosophique;positive;0;0;0;0;0;0 -10333;phonétique;positive;0;0;0;0;0;0 -10334;phonographe;positive;0;0;0;0;0;0 -10335;phonologie;positive;0;0;0;0;0;0 -10336;phoque;positive;0;0;0;0;0;0 -10337;phosphore;positive;0;0;0;0;0;0 -10338;photocopier;positive;0;0;0;0;0;0 -10339;photogénique;positive;0;0;0;0;0;0 -10340;photographe;positive;0;0;0;0;0;0 -10341;photographie;positive;0;0;0;0;0;0 -10342;photométrie;positive;0;0;0;0;0;0 -10343;phraséologie;positive;0;0;0;0;0;0 -10344;phylogénie;positive;0;0;0;0;0;0 -10345;physiologie;positive;0;0;0;0;0;0 -10346;pianiste;positive;0;0;0;0;0;0 -10347;piano;positive;0;0;0;0;0;0 -10348;piaulement;negative;0;1;1;0;0;0 -10349;piauler;negative;0;1;1;0;0;0 -10350;piazza;positive;0;0;0;0;0;0 -10351;pic;positive;0;1;0;0;0;0 -10352;piccolo;positive;0;0;0;0;0;0 -10353;pichet;positive;0;0;0;0;0;0 -10354;pick up;positive;0;0;0;0;0;0 -10355;picoler;negative;0;0;0;0;0;0 -10356;picorer;negative;0;0;0;1;0;0 -10357;picotement;negative;0;1;0;0;1;0 -10358;picoter;negative;0;1;0;0;0;0 -10359;pie;negative;0;1;0;0;0;1 -10360;pièce de dix cent;positive;0;0;0;0;0;0 -10361;pièce de monnaie;positive;0;0;0;0;0;0 -10362;pièce de théâtre;negative;0;1;1;0;1;0 -10363;pièce jointe;positive;0;0;0;0;0;0 -10364;pièce;positive;0;0;0;0;0;0 -10365;pied;positive;0;0;0;0;0;0 -10366;pied de biche;positive;0;0;0;0;0;0 -10367;piédestal;positive;0;0;0;0;0;0 -10368;pied nu;positive;0;0;0;0;0;0 -10369;piégeage;negative;0;1;0;0;1;0 -10370;piéger;negative;0;1;0;0;1;0 -10371;piège;negative;0;1;0;0;1;0 -10372;pierre;positive;0;0;0;1;0;0 -10373;pierre à feu;negative;0;1;0;0;0;0 -10374;pierre précieux;positive;1;0;0;0;0;0 -10375;pierre tombal;negative;0;0;1;0;0;0 -10376;pierreux;negative;0;1;0;0;0;0 -10377;piété;positive;0;0;0;0;0;0 -10378;piétiner;negative;0;1;1;0;0;0 -10379;piètre;negative;0;0;1;0;0;1 -10380;pieu;negative;0;1;1;0;0;0 -10381;pieuvre;negative;0;1;0;0;0;1 -10382;pigeon;negative;0;1;0;0;0;1 -10383;pigment;positive;0;0;0;0;0;0 -10384;pigmenter;positive;0;0;0;0;0;0 -10385;pilier;positive;0;0;0;0;0;0 -10386;pilote;positive;0;0;0;0;0;0 -10387;piloter;positive;0;0;0;0;0;0 -10388;pilule;positive;0;0;0;0;0;0 -10389;pimenter;negative;0;1;0;0;1;0 -10390;pin;positive;0;0;1;0;0;0 -10391;pinacle;positive;0;0;0;0;0;0 -10392;pince;negative;0;1;0;1;0;0 -10393;pince à linge;positive;0;0;0;0;0;0 -10394;pinceant;negative;0;1;0;0;0;0 -10395;pinceau;positive;0;0;0;0;0;0 -10396;pincée;negative;0;0;0;0;0;0 -10397;pincement;negative;0;1;0;0;0;0 -10398;pincer;negative;0;1;0;1;0;0 -10399;pion;negative;0;0;0;0;0;0 -10400;pipelet;negative;0;0;0;0;0;0 -10401;pipeline;positive;0;0;0;0;0;0 -10402;pipette;positive;0;0;0;0;0;0 -10403;pipi;negative;0;0;0;0;0;1 -10404;piquant;negative;0;1;0;0;1;0 -10405;pique;negative;0;1;0;1;0;0 -10406;pique niquer;positive;0;0;0;0;1;0 -10407;piquer niquer;positive;0;0;0;0;1;0 -10408;piquer sur;negative;0;1;0;1;1;0 -10409;piquet;negative;0;1;1;1;1;0 -10410;piquet de grève;negative;0;1;0;1;1;0 -10411;piqûre;negative;0;1;0;1;1;1 -10412;piratage;negative;0;1;0;1;0;0 -10413;pirate;negative;0;1;0;1;0;0 -10414;pirater;negative;0;1;0;1;0;0 -10415;piraterie;negative;0;1;0;1;0;0 -10416;pire;negative;0;1;1;0;0;0 -10417;pirogue;positive;0;0;0;0;0;0 -10418;piscine;positive;0;0;0;0;0;0 -10419;pister;positive;0;0;0;0;0;0 -10420;pistolet;negative;0;1;0;1;0;0 -10421;piston;positive;0;0;0;0;0;0 -10422;pitié;negative;0;0;1;0;0;0 -10423;pittoresque;positive;0;0;0;0;0;0 -10424;pivot;positive;0;0;0;0;0;0 -10425;pivoter;positive;0;0;0;0;0;0 -10426;placage;positive;0;0;0;0;0;0 -10427;placard;positive;0;0;0;0;0;0 -10428;place du marché;positive;0;0;0;0;0;0 -10429;placebo;positive;0;0;0;0;0;0 -10430;plafond;positive;0;0;0;0;0;0 -10431;plage;positive;1;0;0;0;0;0 -10432;plagiat;negative;0;0;1;1;0;1 -10433;plaid;positive;0;0;0;0;0;0 -10434;plaider;negative;0;1;1;1;0;1 -10435;plaideur;negative;0;0;1;1;0;0 -10436;plaie;negative;0;1;1;1;0;1 -10437;plaine;positive;0;0;0;0;0;0 -10438;plainte;negative;0;0;0;1;0;0 -10439;plaintif;negative;0;0;1;0;0;0 -10440;plaisance;positive;1;0;0;0;0;0 -10441;plaisanter;positive;1;0;0;0;0;0 -10442;plaisanterie;positive;0;0;0;0;1;0 -10443;planche;positive;0;0;0;0;0;0 -10444;plancher;positive;0;0;0;0;0;0 -10445;planéité;negative;0;0;1;0;0;0 -10446;planer;positive;1;0;0;0;0;0 -10447;planétarium;positive;0;0;0;0;0;0 -10448;planète;positive;0;0;0;0;0;0 -10449;planification;positive;0;0;0;0;0;0 -10450;planifier;positive;0;0;0;0;0;0 -10451;plantation;positive;0;0;0;0;0;0 -10452;plante;positive;0;0;0;0;0;0 -10453;plante du pied;negative;0;0;0;0;0;1 -10454;planter;positive;0;0;0;0;0;0 -10455;planteur|planteuse;positive;0;0;0;0;0;0 -10456;plantureux;positive;0;0;0;0;0;0 -10457;plaquage;positive;0;0;0;0;0;0 -10458;plaque chauffant;positive;0;0;0;0;0;0 -10459;plaque tournant;positive;0;0;0;0;0;0 -10460;plaquer;negative;0;1;1;0;0;0 -10461;plaquer au sol;positive;0;0;0;1;1;0 -10462;plaquette;positive;0;0;0;0;0;0 -10463;plasma;negative;0;0;0;0;0;1 -10464;plasticité;positive;0;0;0;0;0;0 -10465;plastifier;positive;0;0;0;0;0;0 -10466;plastique;negative;0;0;0;0;0;0 -10467;plat forme;positive;0;0;0;0;0;0 -10468;plateau;positive;0;0;0;0;0;0 -10469;plateforme;positive;0;0;0;0;0;0 -10470;platine;positive;0;0;0;0;0;0 -10471;platitude;negative;0;0;1;0;0;0 -10472;plâtre;negative;0;0;1;0;0;0 -10473;plâtrer;negative;0;0;1;0;0;0 -10474;plausibilité;positive;0;0;0;0;0;0 -10475;playa;positive;0;0;0;0;0;0 -10476;plein;positive;0;0;0;0;0;0 -10477;plein à craquer;negative;0;1;0;0;0;0 -10478;plein d espoir;positive;0;0;0;0;1;0 -10479;plein de bulle;positive;0;0;0;0;0;0 -10480;plein de monde;negative;0;1;0;0;0;0 -10481;plein de ressentiment;negative;0;0;0;1;0;0 -10482;plein propriété;positive;0;0;0;0;0;0 -10483;plénier;positive;0;0;0;0;0;0 -10484;plénitude;positive;0;0;0;0;0;0 -10485;pléthore;positive;0;0;0;0;0;0 -10486;pleur;negative;0;0;1;1;0;0 -10487;pleurant;negative;0;0;1;0;0;0 -10488;pleurer;negative;0;0;1;1;0;0 -10489;pleur|pleurs;negative;0;0;1;0;0;0 -10490;pleuvoir;negative;0;0;1;0;0;0 -10491;plexus;positive;0;0;0;0;0;0 -10492;pli;negative;0;1;1;0;0;1 -10493;pliage;positive;0;0;0;0;0;0 -10494;plier;negative;0;0;1;0;0;0 -10495;plinthe;positive;0;0;0;0;0;0 -10496;plisser;negative;0;0;1;0;0;0 -10497;ploiement;negative;0;0;1;0;0;0 -10498;plomb;positive;0;0;0;0;0;0 -10499;ployer;negative;0;0;1;0;0;0 -10500;pluie;negative;0;0;1;0;0;0 -10501;plumage;positive;0;0;0;0;0;0 -10502;plume;positive;0;0;0;0;0;0 -10503;plumeau;negative;0;0;0;0;0;1 -10504;pluralité;positive;0;0;0;0;0;0 -10505;plus âgé;positive;0;0;1;0;0;0 -10506;plus dodu;negative;0;0;0;0;0;0 -10507;plus élever;positive;0;0;0;0;0;0 -10508;plus grand que;positive;0;0;0;0;1;1 -10509;plus important;positive;0;0;0;0;0;0 -10510;plus jeune;positive;1;0;0;0;0;0 -10511;plus loin;negative;0;1;1;0;0;0 -10512;plus petit;negative;0;1;1;0;0;0 -10513;plus sec;positive;0;0;0;0;0;0 -10514;plus tôt;positive;0;0;0;0;0;0 -10515;plus vieux;positive;0;0;1;0;0;0 -10516;plusieurs foi|fois;negative;0;0;0;0;0;0 -10517;plutonium;positive;0;0;0;0;0;0 -10518;pluvier;positive;0;0;0;0;0;0 -10519;pneumonie;negative;0;1;1;0;0;0 -10520;poche;positive;0;0;0;0;0;0 -10521;poche ventral;positive;0;0;0;0;0;0 -10522;pochoir;positive;0;0;0;0;0;0 -10523;podium;positive;0;0;0;0;0;0 -10524;podomètre;positive;0;0;0;0;0;0 -10525;poêle;positive;0;0;0;0;0;0 -10526;poêle à frire;negative;0;0;0;0;0;0 -10527;poème;positive;0;0;0;0;0;0 -10528;poésie;positive;0;0;0;0;0;0 -10529;poète;positive;0;0;0;0;0;0 -10530;poétique;positive;0;0;0;0;0;0 -10531;poigner|poindre;positive;0;0;1;0;1;0 -10532;poignant;positive;0;0;1;0;1;0 -10533;poignarder;negative;0;1;1;1;1;0 -10534;poignet;positive;0;0;0;0;0;0 -10535;poing;positive;0;0;0;0;0;0 -10536;point culminer;positive;0;0;0;0;1;0 -10537;point de repère;positive;0;0;0;0;0;0 -10538;point de suture;negative;0;0;0;0;0;0 -10539;point de vue;positive;0;0;0;0;0;0 -10540;point fort;positive;0;0;0;0;0;0 -10541;point virgule;positive;0;0;0;0;0;0 -10542;pointer;positive;0;0;0;0;0;0 -10543;pointeur;positive;0;0;0;0;0;0 -10544;point de suspension;positive;0;0;0;0;0;0 -10545;pointu;negative;0;1;0;0;0;0 -10546;pointure;positive;0;0;0;0;0;0 -10547;pois;positive;0;0;0;0;0;0 -10548;poison;negative;0;1;1;1;0;1 -10549;poisseux;negative;0;0;0;0;0;1 -10550;poisson;positive;0;0;0;0;0;0 -10551;poissonnerie;positive;0;0;0;0;0;0 -10552;poitrine;positive;0;0;0;0;0;0 -10553;poivre;negative;0;0;0;0;0;0 -10554;poivron;negative;0;0;0;0;0;0 -10555;poker;positive;0;0;0;0;1;0 -10556;polaire;negative;0;1;0;0;0;0 -10557;polarité;positive;0;0;0;0;1;0 -10558;pôle;positive;0;0;0;0;0;0 -10559;polémique;negative;0;0;0;1;0;1 -10560;police de caractère;positive;0;0;0;0;0;0 -10561;polio;negative;0;1;1;0;0;0 -10562;politique;positive;0;0;0;1;0;1 -10563;polluer;negative;0;0;0;0;0;1 -10564;pollution;negative;0;0;0;0;0;1 -10565;polo;positive;0;0;0;0;0;0 -10566;polonais;positive;0;0;0;0;0;0 -10567;polygamie;negative;0;0;0;0;0;1 -10568;polygonal;positive;0;0;0;0;0;0 -10569;polygonales;positive;0;0;0;0;0;0 -10570;polygone;positive;0;0;0;0;0;0 -10571;polymère;positive;0;0;0;0;0;0 -10572;polymorphisme;positive;0;0;0;0;0;0 -10573;polyvalence;positive;0;0;0;0;0;0 -10574;polyvalent;positive;0;0;0;0;0;0 -10575;pommade;positive;0;0;0;0;0;0 -10576;pomme;positive;0;0;0;0;0;0 -10577;pompage;positive;0;0;0;0;0;0 -10578;pompe;positive;0;0;0;0;0;0 -10579;pomper;positive;0;0;0;0;0;0 -10580;pompette;negative;0;0;0;0;0;1 -10581;pompeux;negative;0;0;0;0;0;1 -10582;pompier;positive;0;0;0;0;0;0 -10583;ponceur;positive;0;0;0;0;0;0 -10584;poncho;positive;0;0;0;0;0;0 -10585;ponction;negative;0;1;1;0;1;0 -10586;ponctualité;positive;0;0;0;0;0;0 -10587;ponctuation;positive;0;0;0;0;0;0 -10588;ponctuellement;negative;0;0;0;0;0;0 -10589;pondérer;positive;0;0;0;0;0;0 -10590;poney;positive;0;0;0;0;0;0 -10591;pont;positive;0;0;0;0;0;0 -10592;pontife;positive;0;0;0;0;0;0 -10593;pontificat;positive;0;0;0;0;0;0 -10594;pontifier;positive;0;0;0;0;0;0 -10595;ponton;positive;0;0;0;0;0;0 -10596;pop;negative;0;1;0;0;1;0 -10597;populace;negative;0;1;0;1;0;1 -10598;populaire;positive;0;0;0;0;0;0 -10599;populariser;positive;0;0;0;0;0;0 -10600;popularité;positive;0;0;0;0;0;0 -10601;population;positive;0;0;0;0;0;0 -10602;porc épic;negative;0;1;0;0;0;1 -10603;porcelaine;positive;0;0;0;0;0;0 -10604;porche;positive;0;0;0;0;0;0 -10605;porcherie;negative;0;0;0;0;0;1 -10606;pore;negative;0;0;0;0;0;1 -10607;porno;negative;0;0;0;0;0;1 -10608;pornographie;negative;0;1;0;0;0;1 -10609;pornographique;negative;0;0;0;0;0;1 -10610;porosité;negative;0;0;0;0;0;1 -10611;porridge;positive;0;0;0;0;0;0 -10612;port;positive;0;0;0;0;0;0 -10613;port maritime;positive;0;0;0;0;0;0 -10614;portable;positive;0;0;0;0;0;0 -10615;portage;positive;0;0;0;0;0;0 -10616;portail;positive;0;0;0;0;0;0 -10617;porter;positive;0;0;1;0;0;0 -10618;portatif;positive;0;0;0;0;0;0 -10619;porte;positive;0;0;0;0;0;0 -10620;porte bonheur;positive;0;0;0;0;1;0 -10621;porte monnaie;positive;0;0;0;0;0;0 -10622;porte parole;positive;0;0;0;0;0;0 -10623;porte voix;negative;0;1;0;0;0;0 -10624;portefeuille;positive;0;0;0;0;0;0 -10625;porter atteindre;negative;0;1;1;1;0;1 -10626;porter un toast;positive;1;0;0;0;0;0 -10627;portion;positive;0;0;0;0;0;0 -10628;portique;positive;0;0;0;0;0;0 -10629;portraire;positive;0;0;0;0;0;0 -10630;pose;positive;0;0;0;0;0;0 -10631;poser;positive;0;0;0;0;0;0 -10632;pose de carrelage;positive;0;0;0;0;0;0 -10633;poser du tuile sur;positive;0;0;0;0;0;0 -10634;position;positive;0;0;0;0;0;0 -10635;position accroupir;negative;0;1;0;0;0;0 -10636;position debout;positive;0;0;0;0;0;0 -10637;possédant;positive;0;0;0;0;0;0 -10638;posséder;negative;0;1;0;1;0;1 -10639;posséedées;negative;0;1;0;1;0;1 -10640;possesseur;positive;0;0;0;0;0;0 -10641;possession;negative;0;1;1;1;0;1 -10642;possibilité;positive;0;0;0;0;0;0 -10643;possible;positive;0;0;0;0;1;0 -10644;post scriptum;positive;0;0;0;0;0;0 -10645;postal;positive;0;0;0;0;0;0 -10646;poste;positive;0;0;0;0;0;0 -10647;poste d amarrage;positive;0;0;0;0;0;0 -10648;poste de commandement;positive;0;0;0;0;0;0 -10649;poste de guet;positive;0;0;0;0;0;0 -10650;poste vacant;positive;1;0;0;0;0;0 -10651;poster;positive;0;0;0;0;0;0 -10652;postérieur;negative;0;0;0;0;0;0 -10653;postérieurement;negative;0;0;0;0;0;0 -10654;postériorité;negative;0;0;0;0;0;0 -10655;postérité;negative;0;0;1;0;0;0 -10656;posthume;negative;0;0;1;0;0;0 -10657;postillonner;negative;0;0;0;0;0;1 -10658;postulat;positive;0;0;0;0;0;0 -10659;postuler;positive;0;0;0;0;0;0 -10660;postuler à;positive;0;0;0;0;0;0 -10661;posture;positive;0;0;0;0;0;0 -10662;pot;positive;0;0;0;0;0;0 -10663;pot à crème;positive;0;0;0;0;0;0 -10664;pot de fleur;positive;0;0;0;0;0;0 -10665;pot au feu;positive;0;0;0;0;0;0 -10666;pot de vin;negative;0;0;0;0;0;0 -10667;pot pourri;positive;0;0;0;0;0;0 -10668;potable;positive;0;0;0;0;0;0 -10669;pote;positive;0;0;0;0;0;0 -10670;poteau indicateur;positive;0;0;0;0;0;0 -10671;potence;negative;0;1;1;1;0;0 -10672;poterie;positive;0;0;0;0;0;0 -10673;potier;positive;0;0;0;0;0;0 -10674;potion;positive;0;0;0;0;1;0 -10675;pou;negative;0;1;0;0;0;1 -10676;poubelle;negative;0;0;0;0;0;1 -10677;pouce;positive;0;0;0;0;0;0 -10678;poudre;negative;0;0;0;0;0;1 -10679;poudrer;negative;0;0;0;0;0;0 -10680;poudre à canon;negative;0;1;0;0;0;0 -10681;poudreux;negative;0;0;0;0;0;0 -10682;poulain;positive;0;0;0;0;0;0 -10683;poule;positive;0;0;0;0;0;0 -10684;poule mouillé;negative;0;1;0;0;0;1 -10685;poulet;positive;0;1;0;0;0;0 -10686;pouliche;positive;0;0;0;0;0;0 -10687;poulie;positive;0;0;0;0;0;0 -10688;poulpe;negative;0;1;0;0;0;1 -10689;pouls;positive;0;0;0;0;0;0 -10690;poumon;positive;0;0;0;0;0;0 -10691;poupée;positive;1;0;0;0;0;0 -10692;pour le jeune;positive;0;0;0;0;0;0 -10693;pour toujours;positive;0;0;0;0;0;0 -10694;pourboire;positive;0;0;0;0;0;0 -10695;pourcentage;positive;0;0;0;0;0;0 -10696;pourchasser;negative;0;1;0;1;0;0 -10697;pourpoint;positive;0;0;0;0;0;0 -10698;pourpre;positive;0;0;0;0;0;0 -10699;pourquoi;positive;0;0;0;0;0;0 -10700;pourrir;negative;0;0;1;0;0;1 -10701;pourriture;negative;0;1;1;0;1;1 -10702;poursuite judiciaire;negative;0;1;1;1;0;1 -10703;poursuite;negative;0;1;0;0;0;0 -10704;poursuivant;negative;0;1;0;0;0;0 -10705;poursuivre;negative;0;1;1;1;0;0 -10706;pourvoir au besoin de;positive;0;0;0;0;0;0 -10707;pourvu que;positive;0;0;0;0;0;0 -10708;pousse;negative;0;0;0;0;0;1 -10709;pousser;negative;0;1;0;0;1;0 -10710;poussée;negative;0;1;0;0;1;0 -10711;pousser du cri;negative;0;0;1;1;0;0 -10712;pousser du huée;negative;0;0;0;1;0;1 -10713;pousser doucement;negative;0;1;1;0;0;0 -10714;pousser du doigt;negative;0;1;0;1;1;0 -10715;pousser un cri perçant;negative;0;1;0;1;1;0 -10716;poussette;positive;0;0;0;0;0;0 -10717;poussière;negative;0;0;0;0;0;1 -10718;poutre;positive;0;0;0;0;0;0 -10719;pouvoir exécutif;positive;0;0;0;0;0;0 -10720;pouvoir judiciaire;positive;0;0;0;0;0;0 -10721;prairie;positive;0;0;0;0;0;0 -10722;praticable;positive;1;0;0;0;0;0 -10723;pratiquer;positive;0;0;0;0;1;0 -10724;pratiquement;positive;0;0;0;0;0;0 -10725;praxis;positive;0;0;0;0;0;0 -10726;pré;positive;0;0;0;0;0;0 -10727;préalable;positive;0;0;0;0;0;0 -10728;préambule;positive;0;0;0;0;0;0 -10729;précaire;negative;0;1;1;0;1;0 -10730;précaution;positive;0;0;0;0;0;0 -10731;précautionneux;positive;0;1;0;0;0;0 -10732;précéder;positive;0;0;0;0;0;0 -10733;précédemment;positive;0;0;0;0;0;0 -10734;précepte;positive;0;0;0;0;0;0 -10735;précepteur;positive;0;0;0;0;0;0 -10736;précession;positive;0;0;0;0;0;0 -10737;prêcher;positive;0;0;0;0;0;0 -10738;précicpités;negative;0;0;0;0;0;0 -10739;précipice;negative;0;1;0;0;0;0 -10740;précipitamment;negative;0;0;0;1;1;0 -10741;précipitation;negative;0;1;0;1;1;0 -10742;précis;positive;0;0;0;0;0;0 -10743;précisément;positive;0;0;0;0;0;0 -10744;précision;positive;0;0;0;0;0;0 -10745;préclusion;negative;0;1;0;0;0;0 -10746;précoce;negative;0;1;1;0;1;0 -10747;précurseur;positive;0;0;0;0;0;0 -10748;prédécesseur;positive;0;0;0;0;0;0 -10749;prédicat;positive;0;0;0;0;0;0 -10750;prédicateur;positive;0;0;0;0;0;0 -10751;prédication;positive;0;0;0;0;0;0 -10752;prédicteur;positive;0;0;0;0;0;0 -10753;prédictif;positive;0;0;0;0;0;0 -10754;prédiction;positive;0;0;0;0;0;0 -10755;prédilection;positive;0;0;0;0;0;0 -10756;prédire;positive;0;0;0;0;0;0 -10757;prédisposer;positive;0;0;0;0;0;0 -10758;prédisposition;positive;0;0;0;0;0;0 -10759;prédominer;positive;0;0;0;0;0;0 -10760;prédominant;positive;0;0;0;0;0;0 -10761;prééminent;positive;0;0;0;0;0;0 -10762;préemption;positive;0;0;0;0;0;0 -10763;préface;positive;0;0;0;0;0;0 -10764;préfacer;positive;0;0;0;0;0;0 -10765;préférer;positive;0;0;0;0;0;0 -10766;préférence;positive;0;0;0;0;0;0 -10767;préfet;positive;0;0;0;0;0;0 -10768;préfixe;positive;0;0;0;0;0;0 -10769;préhistorique;negative;0;1;0;0;0;0 -10770;préjudice;negative;0;1;1;1;0;0 -10771;préjudiciable;negative;0;1;1;1;0;0 -10772;préjuger;negative;0;1;0;1;0;1 -10773;prélude;positive;0;0;0;0;0;0 -10774;prématuré;negative;0;1;1;0;1;0 -10775;prématurément;negative;0;1;0;0;0;0 -10776;préméditation;positive;0;0;0;0;0;0 -10777;préméditer;negative;0;1;0;1;0;0 -10778;prémices;positive;0;0;0;0;0;0 -10779;premier plan;positive;0;0;0;0;0;0 -10780;prémisse;positive;0;0;0;0;0;0 -10781;prémonition;negative;0;1;0;0;0;0 -10782;prendre;negative;0;1;0;0;1;0 -10783;prendre feu;negative;0;1;0;1;1;0 -10784;prendre garde;negative;0;1;0;0;0;0 -10785;prendre le fuite;negative;0;1;0;0;0;0 -10786;prendre le petit déjeuner;positive;0;0;0;0;0;0 -10787;prendre le risque de;positive;0;0;0;0;1;0 -10788;prendre part à;positive;0;0;0;0;0;0 -10789;préoccupation;negative;0;1;1;0;0;0 -10790;préoccuper;negative;0;1;1;0;0;0 -10791;préparation;positive;0;0;0;0;0;0 -10792;préparatoire;positive;0;0;0;0;0;0 -10793;prépondérance;positive;0;0;0;0;0;0 -10794;prérequis;positive;0;0;0;0;0;0 -10795;prérogative;positive;0;0;0;0;0;0 -10796;présage;negative;0;1;0;1;0;0 -10797;présager;positive;0;0;0;0;0;0 -10798;presbytère;positive;0;0;0;0;0;0 -10799;prescient;positive;0;0;0;0;0;0 -10800;prescription;positive;0;0;0;0;0;0 -10801;prescrire;positive;0;0;0;0;0;0 -10802;préséance;positive;0;0;0;0;0;0 -10803;présence;positive;0;0;0;0;0;0 -10804;présent;positive;0;0;0;0;1;0 -10805;présentable;positive;0;0;0;0;0;0 -10806;présentation;positive;0;0;0;0;1;0 -10807;présenter;positive;0;0;0;0;0;0 -10808;présenter du excuse;positive;0;0;1;0;0;0 -10809;préservation;positive;0;0;0;0;0;0 -10810;présider;positive;0;0;0;0;0;0 -10811;présidence;positive;0;0;0;0;0;0 -10812;présomption;negative;0;1;0;0;0;0 -10813;presser;negative;0;1;0;0;0;0 -10814;pressant;negative;0;1;0;0;0;0 -10815;pression;negative;0;1;1;1;0;0 -10816;prestation;positive;0;0;0;0;0;0 -10817;prestidigitation;negative;0;1;0;0;1;0 -10818;prestige;positive;0;0;0;0;0;0 -10819;presto;positive;0;0;0;0;1;0 -10820;présumer;positive;0;0;0;0;0;0 -10821;présupposer;positive;0;0;0;0;0;0 -10822;prêt;positive;0;0;0;0;0;0 -10823;prétendant;positive;0;0;0;0;0;0 -10824;prétendre;negative;0;1;1;1;0;0 -10825;prêter;positive;0;0;0;0;0;0 -10826;prêter à confusion;negative;0;1;0;1;0;0 -10827;prêter serment;positive;0;0;0;0;0;0 -10828;prétexter;negative;0;0;0;1;0;0 -10829;prétexte;negative;0;0;0;0;0;1 -10830;prêtre;positive;0;0;0;0;0;0 -10831;prêtrise;positive;0;0;1;0;0;0 -10832;preuve;positive;0;0;0;0;0;0 -10833;prévalence;positive;0;0;0;0;0;0 -10834;prévaloir;positive;0;0;0;0;0;0 -10835;prévenance;positive;0;0;0;0;0;0 -10836;prévenir;positive;0;0;0;0;0;0 -10837;prévenant;positive;0;0;0;0;0;0 -10838;préventif;positive;0;0;0;0;0;0 -10839;prévention;positive;0;0;0;0;0;0 -10840;prévision;positive;0;0;0;0;0;0 -10841;prévisionniste;positive;0;0;0;0;0;0 -10842;prévoir;positive;0;0;0;0;1;0 -10843;prévoyance;positive;0;0;0;0;0;0 -10844;prier;positive;0;1;0;0;1;0 -10845;prière;positive;0;0;0;0;0;0 -10846;prieuré;positive;0;0;0;0;0;0 -10847;primate;negative;0;0;0;0;0;0 -10848;primauté;positive;0;0;0;0;0;0 -10849;prime;positive;0;0;0;0;1;0 -10850;primordial;positive;0;0;0;0;0;0 -10851;prince;positive;0;0;0;0;0;0 -10852;princesse;positive;0;0;0;0;0;0 -10853;principal;positive;0;0;0;0;0;0 -10854;principalement;positive;0;0;0;0;0;0 -10855;principe;positive;0;0;0;0;0;0 -10856;priorité;positive;0;0;0;0;0;0 -10857;prendre de vertige;negative;0;1;0;0;1;0 -10858;prise de bec;negative;0;0;0;1;0;0 -10859;prise de courant;negative;0;1;0;0;0;0 -10860;prise de vertige;negative;0;1;0;0;1;0 -10861;prise en compte;positive;0;0;0;0;0;0 -10862;prise en considération;positive;0;0;0;0;0;0 -10863;prismatique;positive;0;0;0;0;0;0 -10864;prisme;positive;0;0;0;0;0;0 -10865;prison;negative;0;1;1;1;0;0 -10866;prisonnier prisonnier;negative;0;1;1;1;0;1 -10867;privation;negative;0;1;1;1;0;1 -10868;priver;positive;0;0;0;0;0;0 -10869;priver de qch;negative;0;0;1;0;0;0 -10870;privilège;positive;0;0;0;0;0;0 -10871;privilégier;positive;0;0;0;0;0;0 -10872;privilégié;positive;0;0;0;0;0;0 -10873;probabilité;positive;0;0;0;0;0;0 -10874;probable;positive;0;0;0;0;0;0 -10875;probant;positive;1;0;0;0;0;0 -10876;probation;negative;0;1;1;0;0;0 -10877;probatoire;negative;0;1;0;0;0;0 -10878;probité;positive;0;0;0;0;0;0 -10879;problème;negative;0;1;1;1;1;0 -10880;procédé;positive;0;1;0;0;0;0 -10881;procéder;positive;0;0;0;0;0;0 -10882;procéder à un lavage interne;negative;0;1;0;0;0;1 -10883;procédure;positive;0;1;0;0;0;0 -10884;procession;positive;0;0;1;0;1;0 -10885;processus;positive;0;0;0;0;0;0 -10886;prochain;positive;0;0;0;0;0;0 -10887;prochainement;positive;0;0;0;0;0;0 -10888;prochain|prochaine;positive;0;0;0;0;0;0 -10889;proclamation;positive;0;0;0;0;0;0 -10890;proclamer;positive;0;0;0;0;0;0 -10891;procrastination;negative;0;1;1;0;0;0 -10892;procréation;positive;1;0;0;0;0;0 -10893;procréer;positive;0;0;0;0;0;0 -10894;procuration;positive;0;0;0;0;0;0 -10895;procureur;positive;0;0;0;0;0;0 -10896;prodige;positive;0;0;0;0;0;0 -10897;prodigue;positive;0;0;0;0;0;0 -10898;production;positive;0;0;0;0;0;0 -10899;productivité;positive;1;0;0;0;0;0 -10900;produire;positive;0;0;0;0;0;0 -10901;produit;positive;0;0;0;0;0;0 -10902;produit phare;positive;0;0;0;0;0;0 -10903;produit cosmétique;positive;0;0;0;0;0;0 -10904;produit de beauté;positive;0;0;0;0;0;0 -10905;profanation;negative;0;1;1;1;0;1 -10906;profaner;negative;0;0;1;1;0;1 -10907;professer;positive;0;0;0;0;0;0 -10908;professeur;positive;0;0;0;0;0;0 -10909;professeur particulier;positive;0;0;0;0;0;0 -10910;profession;positive;0;0;0;0;0;0 -10911;professionnel;positive;0;0;0;0;0;0 -10912;profil;positive;0;0;0;0;0;0 -10913;profit;positive;1;0;0;0;0;0 -10914;profiter de;positive;0;0;0;0;0;0 -10915;profondément;positive;0;0;0;0;0;0 -10916;profondeur;negative;0;1;0;0;0;0 -10917;profusion;positive;0;0;0;0;0;0 -10918;progéniture;positive;0;0;0;0;0;0 -10919;programme;positive;0;0;0;0;0;0 -10920;programmer;positive;0;0;0;0;0;0 -10921;programmeur;positive;0;0;0;0;0;0 -10922;progrès;positive;0;0;0;0;0;0 -10923;progresser;positive;0;1;0;0;1;0 -10924;progressiste;positive;0;0;0;0;0;0 -10925;progressivement;positive;0;0;0;0;0;0 -10926;prohiber;negative;0;1;1;1;0;1 -10927;prohibition;negative;0;1;1;1;0;1 -10928;proie;negative;0;1;1;0;0;0 -10929;projecteur;positive;0;0;0;0;0;0 -10930;projectile;negative;0;1;0;0;1;0 -10931;projection;positive;0;0;0;0;0;0 -10932;projet de loi;positive;0;0;0;0;0;0 -10933;projeter;positive;0;0;0;0;0;0 -10934;prolétaire;negative;0;0;0;0;0;0 -10935;prolétariat;negative;0;0;0;0;0;0 -10936;prolétarien;negative;0;0;0;0;0;0 -10937;prolifique;positive;0;0;0;0;0;0 -10938;prolixe;positive;0;0;0;0;0;0 -10939;prologue;positive;0;0;0;0;0;0 -10940;prolongation;positive;0;0;0;0;0;0 -10941;prolongement;positive;0;0;0;0;0;0 -10942;prolonger;positive;0;0;0;0;0;1 -10943;promenade;positive;1;0;0;0;0;0 -10944;promenade en barque;positive;0;0;0;0;0;0 -10945;promesse;positive;0;0;0;0;0;0 -10946;promettre;positive;0;0;0;0;0;0 -10947;promissoire;positive;0;0;0;0;0;0 -10948;promissoires;positive;0;0;0;0;0;0 -10949;promontoire;positive;0;0;0;0;0;0 -10950;promotion;positive;0;0;0;1;0;0 -10951;prompt;positive;0;0;0;0;0;0 -10952;promulgation;positive;0;0;0;0;0;0 -10953;promulguer;positive;0;0;0;0;0;0 -10954;prononcer;positive;0;0;0;0;0;0 -10955;prononciation;positive;0;0;0;0;0;0 -10956;pronostic;positive;0;1;0;0;0;0 -10957;propagande;negative;0;1;0;1;0;0 -10958;propagation;negative;0;1;0;0;0;0 -10959;propane;negative;0;0;0;0;0;1 -10960;propension;negative;0;0;1;0;0;0 -10961;prophète;positive;0;0;0;0;0;0 -10962;prophétie;positive;0;0;0;0;0;0 -10963;prophétique;positive;0;0;0;0;0;0 -10964;prophétiser;positive;0;0;0;0;0;0 -10965;prophylactique;positive;0;0;0;0;0;0 -10966;prophylaxie;positive;0;0;0;0;0;0 -10967;propice;positive;0;0;0;0;1;0 -10968;proportion;positive;0;0;0;0;0;0 -10969;proportionner;positive;0;0;0;0;0;0 -10970;propos insignifiant;negative;0;1;1;0;0;1 -10971;proposer;positive;0;0;0;0;0;0 -10972;proposition;positive;0;0;0;0;0;0 -10973;proposition de loi;positive;0;0;0;0;0;0 -10974;propre;positive;0;0;0;0;0;0 -10975;propreté;positive;0;0;0;0;0;0 -10976;propulser;negative;0;1;0;0;0;0 -10977;propulsion;negative;0;1;0;0;1;0 -10978;prorata;positive;0;0;0;0;0;0 -10979;proscrire;negative;0;1;0;1;0;0 -10980;prose;positive;0;0;0;0;0;0 -10981;prospecter;positive;0;0;0;0;0;0 -10982;prospectif;positive;0;0;0;0;0;0 -10983;prospective;positive;0;0;0;0;0;0 -10984;prospectivement;positive;0;0;0;0;0;0 -10985;prospère;positive;0;0;0;0;1;0 -10986;prospérer;positive;1;0;0;0;0;0 -10987;prospérité;positive;1;0;0;0;0;0 -10988;prostituer;negative;0;0;1;1;0;1 -10989;prostitution;negative;0;0;1;0;0;1 -10990;protagoniste;positive;0;0;0;0;0;0 -10991;protection;positive;0;0;0;0;0;0 -10992;protéger;positive;0;0;0;0;0;0 -10993;protéine;positive;0;0;0;0;0;0 -10994;protéiné;positive;0;0;0;0;0;0 -10995;protéique;positive;0;0;0;0;0;0 -10996;protestation;negative;0;0;0;1;0;0 -10997;protester;negative;0;0;0;1;0;0 -10998;protocole;positive;0;0;0;0;0;0 -10999;prototype;negative;0;1;0;0;0;0 -11000;protozoaire;positive;0;0;0;0;0;0 -11001;prouesse;positive;0;0;0;0;1;0 -11002;prouver;positive;0;0;0;0;0;0 -11003;provenir;positive;0;0;0;0;0;0 -11004;proverbe;positive;0;0;0;0;0;0 -11005;proverbial;positive;0;0;0;0;0;0 -11006;providence;positive;0;0;0;0;0;0 -11007;province;positive;0;0;0;0;0;0 -11008;proviseur;positive;0;0;0;0;0;0 -11009;provision;positive;0;0;0;0;0;0 -11010;provisoire;negative;0;1;0;0;0;0 -11011;provisoirement;negative;0;0;0;0;0;0 -11012;provocant;negative;0;0;0;1;1;1 -11013;provocation;negative;0;0;0;1;0;0 -11014;provoquer;negative;0;0;0;1;0;0 -11015;proximal;positive;0;0;0;0;0;0 -11016;prudent;positive;0;1;0;0;0;0 -11017;prune;positive;0;0;0;0;0;0 -11018;pruneau;negative;0;0;0;0;0;0 -11019;psaume;positive;0;0;0;0;0;0 -11020;pseudo;negative;0;1;1;1;0;0 -11021;psyché;negative;0;1;0;0;0;0 -11022;psychique;negative;0;1;0;0;0;0 -11023;psychisme;negative;0;1;0;0;0;0 -11024;psychologie;positive;0;0;0;0;0;0 -11025;psychologique;positive;0;0;0;0;0;0 -11026;psychologue;positive;0;0;0;0;0;0 -11027;psychose;negative;0;1;1;1;0;0 -11028;puer;negative;0;0;0;0;0;1 -11029;puant;negative;0;0;0;0;0;1 -11030;puanteur;negative;0;0;0;0;0;1 -11031;pub;positive;0;0;0;0;0;0 -11032;pubère;negative;0;0;0;0;0;0 -11033;puberté;negative;0;0;0;0;0;0 -11034;public;positive;0;0;0;0;0;0 -11035;publicitaire;negative;0;0;0;0;0;0 -11036;publicité;positive;0;0;0;0;0;0 -11037;publier;positive;0;0;0;0;0;0 -11038;publique;positive;0;0;0;0;0;0 -11039;publiquement;positive;0;0;0;0;0;0 -11040;puceron;negative;0;1;0;0;0;1 -11041;pudding;positive;0;0;0;0;0;0 -11042;puéril;negative;0;0;0;0;0;1 -11043;puisard;negative;0;0;0;0;0;1 -11044;puissamment;positive;0;1;0;0;0;0 -11045;puissance;positive;0;0;0;0;0;0 -11046;puits;positive;0;0;0;0;0;0 -11047;pull over;positive;0;0;0;0;0;0 -11048;pulmonaire;positive;0;0;0;0;0;0 -11049;pulpe;negative;0;0;0;0;0;1 -11050;pulsation;positive;0;0;0;0;0;0 -11051;pulvériser;positive;0;0;0;0;0;0 -11052;puma;negative;0;1;0;1;1;0 -11053;punaise;negative;0;0;0;0;0;0 -11054;punaiser;negative;0;0;0;0;0;0 -11055;punch;negative;0;1;1;1;1;0 -11056;punitif;negative;0;1;1;1;0;0 -11057;punition;negative;0;1;1;1;0;1 -11058;punk;negative;0;1;0;1;0;1 -11059;pupitre;positive;0;0;0;0;0;0 -11060;pur sang;positive;0;0;0;0;0;0 -11061;purée;negative;0;1;0;0;0;1 -11062;purée de pomme de terre;negative;0;0;0;0;0;0 -11063;purement;positive;0;0;0;0;0;0 -11064;pureté;positive;0;0;0;0;1;0 -11065;purgatoire;negative;0;1;0;0;0;1 -11066;purge;negative;0;1;0;0;0;1 -11067;purifier;positive;0;0;0;0;0;0 -11068;purification;positive;0;0;0;0;0;1 -11069;purin;negative;0;0;0;0;0;1 -11070;puriste;positive;0;0;0;0;0;0 -11071;pouvoir;negative;0;0;0;0;0;1 -11072;putain;negative;0;0;0;0;0;1 -11073;pute;negative;0;0;0;0;0;1 -11074;putois;negative;0;0;0;0;0;1 -11075;pygmée;negative;0;0;0;0;0;0 -11076;pyjama;positive;0;0;0;0;0;0 -11077;pyramidal;positive;0;0;0;0;0;0 -11078;pyramide;positive;0;0;0;0;0;0 -11079;pyrotechnie;positive;0;0;0;0;0;0 -11080;quadrant;positive;0;0;0;0;0;0 -11081;quadratique;positive;0;0;0;0;0;0 -11082;quadrilatère;positive;0;0;0;0;0;0 -11083;quadripolaire;positive;0;0;0;0;0;0 -11084;quadripôle;positive;0;0;0;0;0;0 -11085;quadruple;positive;0;0;0;0;0;0 -11086;quadrupler;positive;0;0;0;0;0;0 -11087;quai;positive;0;0;0;0;0;0 -11088;qualifier;positive;0;0;0;0;0;0 -11089;qualifiantes;positive;0;0;0;0;0;0 -11090;qualifiants;positive;0;0;0;0;0;0 -11091;qualification;positive;0;0;0;0;0;0 -11092;qualité;positive;0;0;0;0;0;0 -11093;quantifier;positive;0;0;0;0;0;0 -11094;quantique;positive;0;0;0;0;0;0 -11095;quantitativement;positive;0;0;0;0;0;0 -11096;quantité;positive;0;0;0;0;0;0 -11097;quantité suffisant;positive;0;0;0;0;0;0 -11098;quantum;positive;0;0;0;0;0;0 -11099;quarantaine;negative;0;1;0;0;0;1 -11100;quarante;positive;0;0;0;0;0;0 -11101;quart;positive;0;0;0;0;0;0 -11102;quartet;positive;0;0;0;0;0;0 -11103;quartier;positive;0;0;0;0;0;0 -11104;quartile;positive;0;0;0;0;0;0 -11105;quartz;positive;0;0;0;0;0;0 -11106;quasi;positive;0;0;0;0;0;0 -11107;quaternaire;positive;0;0;0;0;0;0 -11108;quatre vingt dix;positive;0;0;0;0;0;0 -11109;quatre vingts;positive;0;0;0;0;0;0 -11110;quatrième;positive;0;0;0;0;0;0 -11111;quatuor;positive;0;0;0;0;0;0 -11112;que ce être;negative;0;0;0;0;0;0 -11113;quel que être;negative;0;0;0;0;0;0 -11114;quémander;negative;0;0;1;0;0;1 -11115;querelle;negative;0;1;1;1;0;1 -11116;questionnaire;negative;0;0;0;0;0;0 -11117;questionner;negative;0;1;0;0;0;0 -11118;questionnement;negative;0;1;0;0;0;0 -11119;quête;positive;0;0;0;0;0;0 -11120;queue;negative;0;0;1;0;0;0 -11121;qui avoir du avis très arrêter;negative;0;0;0;1;0;0 -11122;qui avoir du préjugé;negative;0;1;0;1;0;1 -11123;qui avoir lieu;positive;0;0;0;0;0;0 -11124;qui avoir perdre;negative;0;0;1;1;1;0 -11125;qui avoir sommeil;negative;0;0;1;0;0;0 -11126;qui avoir un odeur de moisir;negative;0;0;0;0;0;1 -11127;qui approcher;positive;0;0;0;0;0;0 -11128;qui arriver;positive;0;0;0;0;0;0 -11129;qui attendre;negative;0;0;0;0;0;0 -11130;qui bâiller;negative;0;0;0;0;0;0 -11131;qui bouche;negative;0;0;0;1;1;0 -11132;qui calculer;positive;0;0;0;0;0;0 -11133;qui cause du tort;negative;0;0;1;1;0;1 -11134;qui commander;positive;0;0;0;0;0;0 -11135;qui consommer beaucoup;negative;0;0;0;0;0;1 -11136;qui court;positive;0;0;0;0;0;0 -11137;qui déborder;negative;0;1;0;0;1;0 -11138;qui délire;negative;0;1;1;1;1;0 -11139;qui désirer;positive;0;0;0;0;0;0 -11140;qui divaguer qui radoter;negative;0;1;1;0;0;0 -11141;qui dormir;positive;0;0;0;0;0;0 -11142;qui doute;negative;0;1;0;0;0;0 -11143;qui embaumer;positive;0;0;0;0;0;0 -11144;qui empêcher de se concentrer;negative;0;0;0;1;0;0 -11145;qui empire;negative;0;0;1;0;0;1 -11146;qui en résulter;positive;0;0;0;0;0;0 -11147;qui entrave;negative;0;0;1;1;0;0 -11148;qui être un échec;negative;0;0;1;0;0;0 -11149;qui établir;positive;0;0;0;0;0;0 -11150;qui extraire;positive;0;0;0;0;0;0 -11151;qui faire bouger le chose;positive;0;0;0;0;0;0 -11152;qui fond;negative;0;0;0;0;0;0 -11153;qui fuir;negative;0;1;0;0;1;1 -11154;qui gaspiller;negative;0;1;1;1;0;1 -11155;qui induire en erreur;negative;0;0;0;1;0;1 -11156;qui jouer de le batterie;positive;0;0;0;0;0;0 -11157;qui jouer du tambour;positive;0;0;0;0;0;0 -11158;qui manque de;negative;0;0;1;0;0;0 -11159;qui maudire;negative;0;1;0;1;0;1 -11160;qui mijoter;positive;0;0;0;0;0;0 -11161;qui monter;positive;0;1;0;0;0;0 -11162;qui monter à cru;positive;0;0;0;0;0;0 -11163;qui monter en flêche;negative;0;1;0;0;1;0 -11164;qui ne peser rien;positive;0;0;0;0;0;0 -11165;qui ne se douter de rien;negative;0;1;1;0;1;0 -11166;qui nettoyer;positive;0;0;0;0;0;0 -11167;qui observer en silence;negative;0;1;1;0;0;0 -11168;qui obstruer;negative;0;0;0;1;1;0 -11169;qui passer;negative;0;0;1;0;0;0 -11170;qui passer inaperçu;positive;0;0;0;0;0;0 -11171;qui perdre;negative;0;0;1;1;1;0 -11172;qui périr;negative;0;1;1;0;0;0 -11173;qui pouvoir se procurer;positive;1;0;0;0;0;0 -11174;qui prendre effet;positive;0;0;0;0;0;0 -11175;qui promettre;positive;0;0;0;0;0;0 -11176;qui protéger;positive;0;0;0;0;0;0 -11177;qui réchauffer;positive;1;0;0;0;0;0 -11178;qui recouvrer|recouvrir;positive;0;0;0;0;0;0 -11179;qui répondre;positive;0;0;0;0;0;0 -11180;qui représenter;positive;0;0;0;0;0;0 -11181;qui rester;negative;0;0;0;0;0;0 -11182;qui retenir;negative;0;0;0;0;0;0 -11183;qui rétrécir;negative;0;1;1;0;0;0 -11184;qui rime;positive;0;0;0;0;0;0 -11185;qui rire;positive;1;0;0;0;0;0 -11186;qui rougir;negative;0;0;0;0;1;0 -11187;qui roule;negative;0;0;0;0;0;0 -11188;qui s empiffrer;negative;0;0;0;0;0;1 -11189;qui s ennuyer;negative;0;0;1;0;0;0 -11190;qui se cacher;negative;0;1;1;0;0;0 -11191;qui se consumer;negative;0;1;1;0;0;0 -11192;qui se dégrader;negative;0;0;1;0;0;1 -11193;qui se détériorer;negative;0;0;1;0;0;1 -11194;qui se faire du souci;negative;0;1;1;0;0;0 -11195;qui se réduire;negative;0;1;1;0;0;0 -11196;qui se vanter;negative;0;0;0;0;0;0 -11197;qui se voir;positive;0;0;0;0;0;0 -11198;qui sombre;negative;0;1;1;0;0;0 -11199;qui sommeiller;positive;0;0;0;0;0;0 -11200;qui sonner;positive;0;0;0;0;1;0 -11201;qui soulager;positive;0;0;0;0;0;0 -11202;qui subsister;positive;1;0;0;0;0;0 -11203;qui suivre;positive;0;0;0;0;0;0 -11204;qui tendre ver|vers;positive;0;0;0;0;0;0 -11205;qui tomber;negative;0;1;1;0;0;0 -11206;qui tourner;negative;0;1;0;0;0;0 -11207;qui travailler;positive;0;0;0;0;0;0 -11208;quiétude;positive;0;0;0;0;0;0 -11209;quille;negative;0;1;0;0;0;0 -11210;quincaillerie;positive;0;0;0;0;0;0 -11211;quinine;positive;0;0;0;0;0;0 -11212;quiproquo;negative;0;1;1;1;0;0 -11213;quitter;negative;0;1;1;1;1;0 -11214;quiz;negative;0;0;0;0;0;0 -11215;quorum;positive;0;0;0;0;0;0 -11216;quota;positive;0;0;0;0;0;0 -11217;quotidien;positive;0;0;0;0;0;0 -11218;quotidiennement;positive;0;0;0;0;0;0 -11219;quotient;negative;0;0;0;0;0;0 -11220;rabais;positive;0;0;0;0;0;0 -11221;rabaisser;negative;0;1;1;1;0;1 -11222;rabat;negative;0;0;0;0;0;0 -11223;rabique;negative;0;1;1;1;0;1 -11224;rabougrir;negative;0;1;1;0;0;0 -11225;raccommodage;positive;0;0;0;0;0;0 -11226;raccord;positive;0;0;0;0;0;0 -11227;raccorder;positive;0;0;0;0;0;0 -11228;raccordement;positive;0;0;0;0;0;0 -11229;raccourcir;negative;0;0;0;0;0;0 -11230;raccourcissement;negative;0;0;0;0;0;0 -11231;rachat;positive;0;0;0;0;0;0 -11232;racheter;positive;0;0;0;0;0;0 -11233;rachis;positive;0;0;0;1;0;0 -11234;racine;positive;0;0;0;0;0;0 -11235;racket;negative;0;1;0;0;0;0 -11236;racler;negative;0;1;1;1;0;0 -11237;racoler;negative;0;0;0;0;0;0 -11238;racoleur;negative;0;0;0;0;0;0 -11239;raconter;positive;0;0;0;0;0;0 -11240;raconter un bobard;negative;0;0;0;1;0;1 -11241;radar;positive;0;0;0;0;0;0 -11242;radeau;negative;0;1;1;0;0;0 -11243;radiateur;positive;0;0;0;0;0;0 -11244;radiation;negative;0;1;0;0;0;0 -11245;radical;negative;0;0;1;0;0;0 -11246;radicalement;negative;0;1;0;0;1;0 -11247;radio;positive;0;0;0;0;0;0 -11248;radioactivité;negative;0;1;0;0;0;0 -11249;radiographie;positive;0;0;0;0;0;0 -11250;radiologie;positive;0;0;0;0;0;0 -11251;radium;negative;0;0;0;0;0;0 -11252;radius;positive;0;0;0;0;0;0 -11253;radon;negative;0;1;0;0;0;0 -11254;radotage;negative;0;0;0;0;0;1 -11255;radoter;negative;0;0;0;0;0;1 -11256;raffinage;positive;0;0;0;0;0;0 -11257;raffinement;positive;0;0;0;0;0;0 -11258;raffinerie;positive;0;0;0;0;0;0 -11259;rafraîchir;positive;1;0;0;0;0;0 -11260;rafraîchissant;positive;1;0;0;0;0;0 -11261;rage;negative;0;1;0;1;0;0 -11262;rage de dent;negative;0;1;1;0;0;1 -11263;ragot;negative;0;0;0;0;0;1 -11264;ragoût;positive;0;0;0;0;0;0 -11265;raid;negative;0;1;0;1;1;0 -11266;raide;negative;0;1;1;0;0;0 -11267;raideur;negative;0;1;1;1;0;0 -11268;raidir;negative;0;1;0;1;0;0 -11269;raie;positive;0;0;0;0;0;0 -11270;rail;positive;0;0;0;1;0;0 -11271;railler;negative;0;1;1;1;0;1 -11272;raisin;positive;0;0;0;0;0;0 -11273;raison;positive;0;0;0;0;0;0 -11274;raisonnablement;positive;0;0;0;0;0;0 -11275;raisonner;positive;0;0;0;0;0;0 -11276;raisonnement;positive;0;0;0;0;0;0 -11277;rajeunir;positive;1;0;0;0;0;0 -11278;ralentir;negative;0;0;1;0;0;0 -11279;râler;negative;0;1;1;1;0;1 -11280;râleur|râleux;negative;0;1;1;1;0;1 -11281;rallonge;positive;0;0;0;0;0;0 -11282;rallonger;positive;0;0;0;0;0;0 -11283;rallongement;positive;0;0;0;0;0;0 -11284;rallye;positive;0;0;0;0;0;0 -11285;rame de papier;positive;0;0;0;0;0;0 -11286;rampe;positive;0;0;0;1;0;0 -11287;ramper;negative;0;0;1;0;0;1 -11288;ramure;positive;0;0;0;0;0;0 -11289;rance;negative;0;0;0;0;0;1 -11290;ranch;positive;0;0;0;0;0;0 -11291;rançon;negative;0;1;0;1;0;0 -11292;rançonnement;negative;0;1;0;0;0;0 -11293;rançonner;negative;0;1;0;1;0;0 -11294;rancune;negative;0;0;1;1;0;1 -11295;randonner;positive;0;0;0;0;0;0 -11296;rang;positive;0;0;0;1;0;0 -11297;ranger;positive;0;0;0;0;0;0 -11298;rap;negative;0;0;0;0;0;0 -11299;rapace;negative;0;1;0;0;0;0 -11300;râper;negative;0;0;0;1;0;0 -11301;rapide;positive;0;0;0;0;1;0 -11302;rappel;positive;0;0;0;0;0;0 -11303;rappeler;positive;1;0;0;0;0;0 -11304;rapper;negative;0;0;0;0;0;0 -11305;rapport;positive;0;0;0;0;0;0 -11306;rapporter;positive;0;0;0;0;0;0 -11307;raquette;negative;0;1;0;0;0;0 -11308;rare;negative;0;1;1;0;1;0 -11309;rarement;negative;0;0;1;0;1;0 -11310;rareté;negative;0;1;1;1;1;0 -11311;rasage;positive;0;0;0;0;0;0 -11312;rasoir;negative;0;1;0;0;0;0 -11313;rassasier;positive;0;0;0;0;0;0 -11314;rassemblement;positive;0;0;0;0;0;0 -11315;rassembler;positive;0;0;0;0;0;0 -11316;rasseoir|rassir;negative;0;0;0;0;0;1 -11317;rassurer;positive;1;0;0;0;0;0 -11318;rassurant;positive;1;0;0;0;0;0 -11319;rat;negative;0;1;0;0;0;1 -11320;rate;negative;0;0;1;0;0;0 -11321;rater;negative;0;1;1;1;0;0 -11322;râteau;negative;0;0;0;0;0;0 -11323;ratification;positive;0;0;0;0;0;0 -11324;ratifier;positive;0;0;0;0;0;0 -11325;ratio;positive;0;0;0;0;0;0 -11326;ration;negative;0;0;1;0;0;0 -11327;rationalisme;positive;0;0;0;0;0;0 -11328;rationalité;positive;0;0;0;0;0;0 -11329;rationner;negative;0;0;1;0;0;0 -11330;ratisser;negative;0;0;0;0;0;0 -11331;rattraper;negative;0;0;1;0;0;0 -11332;rauque;negative;0;0;1;1;0;0 -11333;ravage;negative;0;1;1;1;0;0 -11334;ravir;positive;0;0;0;0;1;0 -11335;ravin;negative;0;1;0;0;0;0 -11336;ravissement;positive;1;0;0;0;0;0 -11337;ravisseur;negative;0;1;0;0;0;0 -11338;ravitailler;positive;0;0;0;0;0;0 -11339;rayaux;positive;0;0;0;0;0;0 -11340;rayon;positive;1;0;0;0;0;0 -11341;rayon de miel;positive;0;0;0;0;0;0 -11342;rayon de soleil;positive;1;0;0;0;0;0 -11343;rayonner;positive;1;0;0;0;0;0 -11344;rayure;negative;0;0;0;0;0;0 -11345;réaction;positive;0;0;0;0;0;0 -11346;réactionnaire;negative;0;1;0;1;0;1 -11347;réactivité;positive;0;0;0;0;0;0 -11348;réaffirmer;positive;0;0;0;0;0;0 -11349;réagir;negative;0;1;0;1;0;0 -11350;réajustement;positive;0;0;0;0;0;0 -11351;réalisation;positive;0;0;0;0;0;0 -11352;réaliser;positive;0;0;0;0;0;0 -11353;réalisme;positive;0;0;0;0;0;0 -11354;réaliste;positive;0;0;0;0;0;0 -11355;réalité;positive;0;0;0;0;0;0 -11356;réaménager;positive;0;0;0;0;0;0 -11357;réanimation;negative;0;1;1;0;0;0 -11358;réanimer;positive;0;0;0;0;0;0 -11359;réapparaître;positive;0;0;0;0;1;0 -11360;réapprovisionner;positive;0;0;0;0;0;0 -11361;réarrangement;positive;0;0;0;0;0;0 -11362;réarranger;positive;0;0;0;0;0;0 -11363;réassembler;positive;0;0;0;0;0;0 -11364;réassurance;positive;0;0;0;0;0;0 -11365;rebâtir;positive;0;0;0;0;0;0 -11366;rebelle;negative;0;1;0;1;0;0 -11367;rébellion;negative;0;1;0;1;1;1 -11368;rebond;positive;1;0;0;0;0;0 -11369;rebondir;positive;1;0;0;0;0;0 -11370;rebord;negative;0;1;0;0;0;0 -11371;récalcitrant;negative;0;0;0;1;0;1 -11372;recensement;positive;0;0;0;0;0;0 -11373;recenser;positive;0;0;0;0;0;0 -11374;récent;positive;0;0;0;0;0;0 -11375;récépissé;positive;0;0;0;0;0;0 -11376;réceptacle;positive;0;0;0;0;0;0 -11377;récepteur;positive;0;0;0;0;0;0 -11378;réception;positive;0;0;0;0;0;0 -11379;récession;negative;0;1;1;1;0;1 -11380;recette;positive;0;0;1;0;0;0 -11381;recevabilité;positive;0;0;0;0;0;0 -11382;réchauffer;positive;1;0;0;0;0;0 -11383;réchauffement;positive;1;0;0;0;0;0 -11384;recherche;positive;0;0;0;0;0;0 -11385;rechercher;positive;0;0;0;0;0;0 -11386;rechute;negative;0;1;1;0;1;0 -11387;rechuter;negative;0;1;1;0;0;0 -11388;récidive;negative;0;0;1;1;0;1 -11389;récidiver;negative;0;0;0;0;0;0 -11390;récidivisme;negative;0;0;1;1;0;1 -11391;récif;positive;0;0;0;0;0;0 -11392;réciprocité;positive;0;0;0;0;0;0 -11393;réciproque;positive;0;0;0;0;0;0 -11394;réciproquement;positive;0;0;0;0;0;0 -11395;récit;positive;0;0;0;0;0;0 -11396;récital;positive;0;0;0;0;0;0 -11397;récitation;positive;0;0;0;0;0;0 -11398;réciter;positive;0;0;0;0;0;0 -11399;reclure;negative;0;1;1;0;0;0 -11400;récolte;positive;0;0;0;0;0;0 -11401;récolter;positive;0;0;0;0;0;0 -11402;recombinaison;positive;0;0;0;0;0;0 -11403;recombiner;positive;0;0;0;0;0;0 -11404;recombinante;positive;0;0;0;0;0;0 -11405;recombinantes;positive;0;0;0;0;0;0 -11406;recombinants;positive;0;0;0;0;0;0 -11407;recommandation;positive;0;0;0;0;0;0 -11408;recommander;positive;0;0;0;0;0;0 -11409;récompense;positive;0;0;0;0;1;0 -11410;récompenser;positive;0;0;0;0;1;0 -11411;recompter;positive;0;0;0;0;0;0 -11412;réconciliation;positive;0;0;0;0;0;0 -11413;réconcilier;positive;0;0;0;0;0;0 -11414;réconfort;positive;0;0;0;0;0;0 -11415;réconforter;positive;1;0;0;0;0;0 -11416;réconfortant;positive;1;0;0;0;0;0 -11417;reconnaissable;positive;0;0;0;0;0;0 -11418;reconnaissance;positive;0;0;0;0;0;0 -11419;reconnaître;positive;0;0;0;0;0;0 -11420;reconnaissant;positive;0;0;0;0;0;0 -11421;reconsidérer;negative;0;0;0;0;0;0 -11422;reconstituer;positive;0;0;0;0;0;0 -11423;reconstitution;positive;0;0;0;0;0;0 -11424;reconstitution historique;positive;0;0;0;0;0;0 -11425;reconstruction;positive;0;0;0;0;0;0 -11426;reconstruire;positive;0;0;0;0;0;0 -11427;record;positive;0;0;0;0;0;0 -11428;recours;positive;0;0;0;0;0;0 -11429;recourir;positive;0;0;0;0;0;0 -11430;recouvrir;positive;0;0;0;0;0;0 -11431;recouvrer|recouvrir;positive;0;0;0;0;0;0 -11432;recouvrante;positive;0;0;0;0;0;0 -11433;recouvrantes;positive;0;0;0;0;0;0 -11434;recouvrants;positive;0;0;0;0;0;0 -11435;récréation;positive;1;0;0;0;0;0 -11436;recroître;positive;0;0;0;0;0;0 -11437;recruter;positive;0;0;0;0;0;0 -11438;recrutement;positive;0;0;0;0;0;0 -11439;rectangle;positive;0;0;0;0;0;0 -11440;rectangulaire;positive;0;0;0;0;0;0 -11441;recteur;positive;0;0;0;0;0;0 -11442;rectification;positive;0;0;0;0;0;0 -11443;rectifier;positive;0;0;0;0;0;0 -11444;recueillir;positive;0;0;0;0;0;0 -11445;récupérable;positive;0;0;0;0;0;0 -11446;récupération;positive;1;0;0;0;0;0 -11447;récupérer;positive;1;0;0;0;0;0 -11448;récurer;negative;0;0;0;0;0;1 -11449;récurrence;negative;0;0;0;0;0;0 -11450;récurrent;negative;0;0;1;0;0;0 -11451;récursif;positive;0;0;0;0;0;0 -11452;récursivement;positive;0;0;0;0;0;0 -11453;rédaction;positive;0;0;0;0;0;0 -11454;reddition;negative;0;1;1;0;0;0 -11455;rédemption;positive;1;0;0;0;0;0 -11456;redevable;negative;0;0;0;0;0;0 -11457;rédiger;positive;0;0;0;0;0;0 -11458;redire;negative;0;0;0;0;0;0 -11459;redondance;negative;0;0;1;0;0;0 -11460;redonder;negative;0;0;0;0;0;0 -11461;redondant;negative;0;0;0;0;0;0 -11462;redoublement;negative;0;0;1;0;0;0 -11463;redresser;positive;0;0;0;0;0;0 -11464;réduire au maximum;negative;0;0;1;0;0;0 -11465;réduire de moitié;negative;0;0;0;0;0;0 -11466;réel;positive;0;0;0;0;0;0 -11467;rééquipement;positive;0;0;0;0;0;0 -11468;rééquiper;positive;0;0;0;0;0;0 -11469;réexamen;positive;0;0;0;0;0;0 -11470;réexaminer;negative;0;0;0;0;0;0 -11471;refaire;positive;0;0;0;0;0;0 -11472;réfectoire;positive;0;0;0;0;0;0 -11473;référence;positive;0;0;0;0;0;0 -11474;referendum;positive;0;0;0;0;0;0 -11475;référendum;positive;0;0;0;0;0;0 -11476;réfléchir;positive;0;0;0;0;0;0 -11477;réfléchissant;positive;0;0;0;0;0;0 -11478;réflecteur;positive;0;0;0;0;0;0 -11479;reflet;positive;0;0;0;0;0;0 -11480;réflexe;positive;0;0;0;0;1;0 -11481;reflux;negative;0;0;1;0;0;1 -11482;refondre;positive;0;0;0;0;0;0 -11483;réforme;positive;0;0;0;0;0;0 -11484;réformer;positive;0;0;0;0;0;0 -11485;refouler;negative;0;0;1;0;0;0 -11486;refoulement;negative;0;1;1;1;0;0 -11487;réfractaire;negative;0;0;0;1;0;0 -11488;réfracteur;positive;0;0;0;0;0;0 -11489;réfraction;positive;0;0;0;0;0;0 -11490;refrain;positive;1;0;0;0;0;0 -11491;réfréner;negative;0;0;0;0;0;0 -11492;réfrigérateur;negative;0;0;0;0;0;0 -11493;réfrigération;negative;0;0;0;0;0;0 -11494;réfrigérer;negative;0;0;0;0;0;0 -11495;refroidir;negative;0;1;1;0;0;0 -11496;refroidissant;positive;0;0;0;0;0;0 -11497;refroidissement;positive;0;0;0;0;0;0 -11498;refroidisseur;positive;0;0;0;0;0;0 -11499;refuge;positive;0;0;0;0;0;0 -11500;refus;negative;0;0;0;0;0;0 -11501;refuser;negative;0;0;0;0;0;0 -11502;refuséesdémentis;negative;0;0;1;1;0;0 -11503;réfutation;negative;0;1;0;0;0;0 -11504;réfuter;negative;0;0;0;1;0;0 -11505;regagner;positive;0;0;0;0;0;0 -11506;regard;positive;0;0;0;0;0;0 -11507;regard méchant;negative;0;0;0;1;0;1 -11508;regarder;positive;0;0;0;0;0;0 -11509;regarder avec du ?il rond;positive;0;0;0;0;1;0 -11510;regarder bêtement;negative;0;0;0;0;1;0 -11511;regarder bouche bée;negative;0;0;0;0;1;0 -11512;regarder en face;positive;0;0;0;0;0;0 -11513;regarder méchamment;negative;0;0;0;1;0;1 -11514;régate;positive;0;0;0;0;0;0 -11515;régence;positive;0;0;0;0;0;0 -11516;régénération;positive;0;0;0;0;0;0 -11517;régénérer;positive;0;0;0;0;0;0 -11518;regent;positive;0;0;0;0;0;0 -11519;regimber;negative;0;1;0;1;0;0 -11520;régime politique;positive;0;0;0;0;0;0 -11521;régiment;negative;0;1;0;0;0;0 -11522;région;positive;0;0;0;0;0;0 -11523;région boisé;positive;0;0;0;0;0;0 -11524;région montagneux;positive;0;0;0;0;0;0 -11525;régional;positive;0;0;0;0;0;0 -11526;régionalisme;negative;0;0;0;0;0;0 -11527;registre;positive;0;0;0;0;0;0 -11528;règle;positive;0;1;0;0;0;0 -11529;régler;positive;0;0;0;0;0;0 -11530;réglementaire;positive;0;0;0;0;0;0 -11531;réglementation;positive;0;0;0;0;0;0 -11532;réglementer;positive;0;0;0;0;0;0 -11533;règne;positive;0;0;0;0;0;0 -11534;régner;positive;0;0;0;0;0;0 -11535;régner sur;positive;0;1;0;0;0;0 -11536;regorger;negative;0;1;0;0;1;1 -11537;régresser;negative;0;0;1;0;0;0 -11538;régression;negative;0;0;1;0;0;0 -11539;regrettable;negative;0;0;1;0;0;0 -11540;regretter;negative;0;0;1;0;0;0 -11541;regrouper;positive;0;0;0;0;0;0 -11542;régularisation;positive;0;0;0;0;0;0 -11543;régulariser;positive;0;0;0;0;0;0 -11544;régularité;positive;0;0;0;0;0;0 -11545;régulateur;positive;0;1;0;0;0;0 -11546;régulation;positive;0;0;0;0;0;0 -11547;réguler;positive;0;0;0;0;0;0 -11548;régulièrement;positive;0;0;0;0;0;0 -11549;régulier;positive;0;0;0;0;0;0 -11550;régurgitation;negative;0;0;0;0;0;1 -11551;réhabilitation;positive;0;0;0;0;0;0 -11552;réhabiliter;positive;0;0;0;0;0;0 -11553;rehaussement;positive;0;0;0;0;0;0 -11554;réimpression;positive;0;0;0;0;0;0 -11555;réimprimer;positive;0;0;0;0;0;0 -11556;réincarner;positive;1;0;0;0;0;0 -11557;reine;positive;0;0;0;0;0;0 -11558;réinsérer;positive;0;0;0;0;0;0 -11559;réinsertion;positive;0;0;0;0;0;0 -11560;réinstaller;positive;0;0;0;0;0;0 -11561;réintégration;positive;0;0;0;0;0;0 -11562;réinvestir;positive;0;0;0;0;0;0 -11563;réinvestissement;positive;0;0;0;0;0;0 -11564;rejeter;negative;0;1;1;0;0;1 -11565;rejoindre;positive;0;0;0;0;0;0 -11566;réjouissance;positive;0;0;0;0;1;0 -11567;relais;positive;0;0;0;0;0;0 -11568;relance;positive;0;0;0;0;0;0 -11569;relation;positive;0;0;0;0;0;0 -11570;relativement;positive;0;0;0;0;0;0 -11571;relativité;positive;0;0;0;0;0;0 -11572;relaxation;positive;1;0;0;0;0;0 -11573;relayer|relayer;positive;0;0;0;0;0;0 -11574;relégation;negative;0;0;1;0;0;0 -11575;relier;negative;0;0;0;0;0;0 -11576;religieux;positive;0;0;0;0;0;0 -11577;religion;positive;0;0;0;0;0;0 -11578;relique;negative;0;0;0;0;0;0 -11579;remake;positive;0;0;0;0;0;0 -11580;remaniement;positive;0;0;0;0;0;0 -11581;remarquablement;positive;0;0;0;0;1;0 -11582;remarquer;positive;0;0;0;0;0;0 -11583;remblai;positive;0;0;0;0;0;0 -11584;rembourser;positive;0;0;0;1;0;0 -11585;remède;positive;0;0;0;0;0;0 -11586;remédier;positive;0;0;0;0;0;0 -11587;remettre à plus tard;negative;0;0;1;0;0;0 -11588;remettre;positive;0;0;0;0;0;0 -11589;remettre du diplôme;positive;0;1;0;0;1;0 -11590;rémission;positive;1;0;0;0;0;0 -11591;remodeler;positive;0;0;0;0;0;0 -11592;remonter;positive;0;0;0;0;0;0 -11593;remonter le fermeture éclair;positive;0;0;0;0;0;0 -11594;remords;negative;0;0;1;0;0;0 -11595;remorquer;positive;0;0;0;0;0;0 -11596;remorqueur;positive;0;0;0;0;0;0 -11597;remous;negative;0;1;1;0;0;1 -11598;rempart;positive;0;0;0;0;0;0 -11599;remplacement;negative;0;0;1;0;0;0 -11600;remplir;positive;0;0;0;0;0;0 -11601;remplir de nouveau;positive;0;0;0;0;0;0 -11602;remplissage;positive;0;0;0;0;0;0 -11603;remue méninge;positive;0;0;0;0;0;0 -11604;rémunération;positive;0;0;0;0;0;0 -11605;rémunérer;positive;1;0;0;0;0;0 -11606;renaissance;positive;0;0;0;0;0;0 -11607;renard;positive;0;0;0;0;0;0 -11608;renarde;negative;0;0;0;0;0;0 -11609;rencontre;positive;0;0;0;0;1;0 -11610;rencontrer;positive;0;0;0;0;1;0 -11611;rendement;positive;0;0;0;0;0;0 -11612;rendre vous;positive;0;0;0;0;0;0 -11613;rendre;positive;0;0;0;0;0;0 -11614;rendre enclin;positive;0;0;0;0;0;1 -11615;rendre esclave;negative;0;0;0;1;0;0 -11616;rendre fou;negative;0;1;0;1;0;0 -11617;rendre le pareil;positive;0;0;0;0;0;0 -11618;rendre responsable;negative;0;0;0;1;0;1 -11619;rendre visite;positive;0;0;0;0;0;0 -11620;rêne;positive;0;0;0;0;0;0 -11621;renflement;negative;0;0;0;0;0;1 -11622;renfoncement;negative;0;1;1;0;0;0 -11623;renforcement;positive;0;0;0;0;0;0 -11624;renforcer;positive;0;0;0;1;0;0 -11625;renfort;positive;0;0;0;0;0;0 -11626;renfrogner;negative;0;0;1;1;0;1 -11627;reniflement;negative;0;0;1;0;0;1 -11628;renifler;negative;0;0;1;0;0;1 -11629;renne;positive;0;0;0;0;0;0 -11630;renom;positive;0;0;0;0;0;0 -11631;renommée;positive;0;0;0;0;0;0 -11632;renoncer;negative;0;0;1;1;0;0 -11633;renoncer à;negative;0;1;1;1;0;0 -11634;renonciation;negative;0;1;1;0;0;0 -11635;renouveau;positive;0;0;0;0;0;0 -11636;renouvellement;positive;0;0;0;0;0;0 -11637;rénovation;positive;1;0;0;0;0;0 -11638;rénover;positive;0;0;0;0;0;0 -11639;renseignement;positive;0;0;0;0;0;0 -11640;renseigner;positive;0;0;0;0;0;0 -11641;rente;positive;0;0;0;0;0;0 -11642;rentrer;positive;0;0;0;0;0;0 -11643;rentrée;positive;0;0;0;0;0;0 -11644;renverser;negative;0;1;0;0;0;0 -11645;réorganisation;positive;0;0;0;0;0;0 -11646;réorganiser;positive;0;0;0;0;0;0 -11647;repaire;positive;0;0;0;0;0;0 -11648;réparation;positive;0;0;0;0;0;0 -11649;réparer;positive;0;0;0;0;0;0 -11650;repartir;positive;1;0;0;0;0;0 -11651;répartition;positive;0;0;0;0;0;0 -11652;repas;positive;0;0;0;0;0;0 -11653;repasser;positive;0;0;0;0;0;0 -11654;repentir;negative;0;1;1;0;0;0 -11655;repérer;negative;0;0;0;0;0;0 -11656;répertoire;positive;0;0;0;0;0;0 -11657;répéter;negative;0;0;0;0;0;0 -11658;répéteur;negative;0;0;0;0;0;0 -11659;repli;negative;0;1;1;0;0;0 -11660;réplication;negative;0;0;0;0;0;0 -11661;répondre;positive;0;0;0;0;0;0 -11662;réponse;positive;0;0;0;0;0;0 -11663;reportage;positive;0;0;0;0;0;0 -11664;reporter;negative;0;0;1;0;0;0 -11665;repos;positive;1;0;0;0;0;0 -11666;reposer;positive;0;0;0;0;0;0 -11667;reposant;positive;0;0;0;0;0;0 -11668;repousser;negative;0;1;0;1;0;1 -11669;repoussant;negative;0;1;0;1;0;1 -11670;répréhensible;negative;0;0;0;1;0;0 -11671;reprendre;positive;1;0;0;0;0;0 -11672;représaille;negative;0;1;1;1;0;0 -11673;représenter;positive;0;0;0;0;0;0 -11674;représentation;positive;0;0;0;0;0;0 -11675;répression;negative;0;1;1;1;0;0 -11676;réprimande;negative;0;1;1;1;0;0 -11677;réprimander;negative;0;0;0;1;0;0 -11678;réprimer;negative;0;1;1;1;0;0 -11679;reprisage;positive;0;0;0;0;0;0 -11680;reprise;positive;0;0;0;0;0;0 -11681;repriser;positive;0;0;0;0;0;0 -11682;réprobation;negative;0;1;1;1;0;1 -11683;reproche;negative;0;0;1;1;0;1 -11684;reprocher;negative;0;0;1;1;0;1 -11685;reproducteur;positive;1;0;0;0;0;0 -11686;reproduire;positive;0;0;0;0;0;0 -11687;repsats;positive;0;0;0;0;0;0 -11688;reptile;negative;0;1;0;0;0;0 -11689;repaître;positive;0;0;0;0;0;0 -11690;république;positive;0;0;0;0;0;0 -11691;repudiation;negative;0;0;0;1;0;1 -11692;répudiation;negative;0;0;0;1;0;1 -11693;répugnance;negative;0;0;0;0;0;1 -11694;répugnant;negative;0;1;0;1;0;1 -11695;répulsif;negative;0;1;0;1;0;1 -11696;répulsion;negative;0;1;0;1;0;1 -11697;réputer;positive;0;0;0;0;0;0 -11698;requérir;negative;0;0;0;1;0;1 -11699;requiem;negative;0;0;1;0;0;0 -11700;requin;negative;0;1;0;0;0;0 -11701;réquisition;positive;0;0;0;0;0;0 -11702;réquisitionner;positive;0;0;0;0;0;0 -11703;réseau;positive;0;0;0;0;0;0 -11704;résection;negative;0;1;0;0;0;1 -11705;réséquer;negative;0;1;0;0;0;1 -11706;réservation;positive;0;0;0;0;0;0 -11707;réserver;positive;0;0;0;0;0;0 -11708;réservoir;positive;0;0;0;0;0;0 -11709;résider;positive;0;0;0;0;0;0 -11710;résidence;positive;0;0;0;0;0;0 -11711;résidu;negative;0;0;0;0;0;0 -11712;résignation;negative;0;0;1;0;1;0 -11713;résigner;negative;0;0;1;0;0;0 -11714;résiliation;negative;0;0;1;0;1;0 -11715;résilience;positive;0;0;0;0;0;0 -11716;résilient;positive;0;0;0;0;0;0 -11717;résilier;negative;0;1;1;0;0;0 -11718;résine;negative;0;0;0;0;0;1 -11719;résisitantes;negative;0;0;1;0;0;0 -11720;résister;negative;0;0;1;0;0;0 -11721;résistance;positive;0;0;0;1;0;0 -11722;résister à;positive;0;1;0;1;0;0 -11723;résoudre;positive;0;0;0;0;0;0 -11724;résolument;positive;0;0;0;0;0;0 -11725;résolution;positive;0;0;0;0;0;0 -11726;résonance;negative;0;1;0;0;0;0 -11727;résonateur;negative;0;0;0;0;0;0 -11728;résonner;negative;0;1;0;0;1;0 -11729;respect;positive;0;0;0;0;0;0 -11730;respectabilité;positive;0;0;0;0;0;0 -11731;respectable;positive;0;0;0;0;0;0 -11732;respecter;positive;0;0;0;0;0;0 -11733;respecteuses;positive;0;0;0;0;0;0 -11734;respirateur;positive;0;0;0;0;0;0 -11735;respiration;positive;0;0;0;0;0;0 -11736;respirer;positive;0;0;0;0;0;0 -11737;resplendissant;positive;1;0;0;0;0;0 -11738;responsabiliser;positive;0;0;0;0;0;0 -11739;responsable;positive;0;0;0;0;0;0 -11740;ressemblance;positive;0;0;0;0;0;0 -11741;ressembler;positive;0;0;0;0;0;0 -11742;ressemblant;positive;0;0;0;0;0;0 -11743;ressentir;positive;0;0;0;0;0;0 -11744;ressentiment;negative;0;0;1;1;0;1 -11745;resserrer;positive;0;0;0;1;0;0 -11746;ressource;positive;0;0;0;0;0;0 -11747;ressusciter;positive;1;0;0;0;0;0 -11748;restant;negative;0;0;0;0;0;0 -11749;restaurant;positive;0;0;0;0;0;0 -11750;restauration;positive;0;0;0;0;0;0 -11751;restaurer;positive;0;0;0;0;0;0 -11752;rester;positive;0;0;0;0;0;0 -11753;rester bouche bée;positive;0;0;0;0;1;0 -11754;rester tapir;negative;0;1;1;0;0;0 -11755;restitution;positive;0;0;0;1;0;0 -11756;restraindre;negative;0;1;0;1;0;0 -11757;restreindre;negative;0;1;1;0;0;0 -11758;restructuration;positive;0;0;0;0;0;0 -11759;résulter;positive;0;0;0;0;0;0 -11760;résultat;positive;0;0;0;0;0;0 -11761;résumer;positive;0;0;0;0;0;0 -11762;résurrection;positive;0;0;0;0;0;0 -11763;rétablir;positive;0;0;0;0;0;0 -11764;rétablissement;positive;1;0;0;0;0;0 -11765;retard;negative;0;1;1;1;0;1 -11766;retarder;negative;0;0;1;0;0;0 -11767;retenir;negative;0;0;0;0;0;0 -11768;rétention;positive;0;0;0;0;0;0 -11769;retentir;negative;0;1;0;1;1;0 -11770;retentissant;negative;0;1;0;1;1;0 -11771;réticence;negative;0;1;1;0;0;1 -11772;réticent;negative;0;1;0;0;0;0 -11773;rétine;positive;0;0;0;0;0;0 -11774;retirer;negative;0;0;1;0;0;0 -11775;rétorquer;negative;0;0;0;1;0;0 -11776;retour;positive;0;0;0;0;0;0 -11777;retour de flamme;negative;0;0;1;1;0;0 -11778;retour en arrière;positive;0;0;0;0;1;0 -11779;retourner voir;positive;0;0;0;0;0;0 -11780;retracer;positive;0;0;0;0;0;0 -11781;rétractation;negative;0;1;1;0;0;0 -11782;rétracter;negative;0;1;0;1;0;0 -11783;retraite;positive;0;1;1;0;0;0 -11784;retranchement;negative;0;1;1;0;0;0 -11785;rétrécir;negative;0;1;1;0;0;0 -11786;rétrécissement;negative;0;1;1;0;0;0 -11787;retriever;positive;0;0;0;0;0;0 -11788;rétrograde;negative;0;0;1;0;0;1 -11789;rétrograder;negative;0;0;1;0;0;1 -11790;rétrospectif;positive;0;0;0;0;0;0 -11791;rétrospection;positive;0;0;0;0;0;0 -11792;rétrospectif|rétrospective;positive;0;0;0;0;0;0 -11793;rétrospectivement;positive;0;0;0;0;0;0 -11794;retrouvaille;positive;0;0;0;0;0;0 -11795;retrouver;positive;0;0;0;0;0;0 -11796;reunion;positive;0;0;0;0;0;0 -11797;réunir;positive;0;0;0;0;0;0 -11798;réussiée;positive;0;0;0;0;0;0 -11799;réussite;positive;0;0;0;0;0;0 -11800;revalorisation;positive;0;0;0;0;0;0 -11801;revanche;negative;0;0;0;1;0;0 -11802;rêver;positive;1;0;0;0;0;0 -11803;rêve;positive;1;0;0;0;0;0 -11804;revêche;negative;0;0;0;1;0;1 -11805;réveiller;positive;0;0;0;0;0;0 -11806;réveillon;positive;0;0;0;0;0;0 -11807;révéler;positive;0;0;0;0;0;0 -11808;revendre;negative;0;0;0;0;0;0 -11809;revenir à;positive;0;0;0;0;0;0 -11810;revenir sur son pas;negative;0;1;1;0;0;0 -11811;revenir;positive;0;0;1;0;0;0 -11812;revenu;positive;0;0;1;0;0;0 -11813;réverbération;negative;0;1;0;0;1;0 -11814;révérence;positive;0;0;0;0;0;0 -11815;révérend;positive;0;0;0;0;0;0 -11816;révérer;positive;0;0;0;0;0;0 -11817;rêverie;positive;0;0;0;0;0;0 -11818;réversion;negative;0;0;0;0;0;0 -11819;revêtir;positive;0;0;0;0;0;0 -11820;revigorer;positive;0;0;0;0;0;0 -11821;revigorant;positive;0;0;0;0;0;0 -11822;réviser;positive;0;0;0;0;0;0 -11823;révision;positive;0;0;0;0;0;0 -11824;revisiter;positive;0;0;0;0;0;0 -11825;révolter;negative;0;1;0;1;0;1 -11826;révoltant;negative;0;1;0;1;0;1 -11827;révolte;negative;0;0;0;1;1;0 -11828;révolu;negative;0;0;1;0;0;0 -11829;révolutionnaire;negative;0;1;0;1;0;0 -11830;révolutionner;positive;0;0;0;0;1;0 -11831;révolvantes;negative;0;1;0;1;0;1 -11832;revolver;negative;0;1;1;1;0;0 -11833;révoquer;negative;0;1;1;1;0;1 -11834;rhabiller;positive;0;0;0;0;0;0 -11835;rhétorique;positive;0;0;0;0;0;0 -11836;rhum;positive;0;0;0;0;0;0 -11837;rhumatisme;negative;0;1;1;1;0;0 -11838;rhume;negative;0;0;1;0;0;0 -11839;ricanement;negative;0;0;0;1;0;1 -11840;ricaner;negative;0;0;0;1;0;1 -11841;riche;positive;0;0;1;0;0;1 -11842;richesse;positive;0;0;0;0;0;0 -11843;ride;negative;0;1;1;0;0;1 -11844;rider;negative;0;0;1;0;0;0 -11845;rideau;positive;0;0;0;0;0;0 -11846;ridicule;negative;0;0;1;1;1;1 -11847;ridiculiser;negative;0;0;1;1;0;1 -11848;rien de temps;negative;0;0;0;0;1;0 -11849;rigide;negative;0;0;0;1;0;0 -11850;rigidifier;negative;0;1;0;1;0;0 -11851;rigidité;negative;0;1;1;1;0;0 -11852;rigolade;positive;1;0;0;0;0;0 -11853;rigoler;positive;0;0;0;0;1;0 -11854;rigole;positive;0;0;0;0;0;0 -11855;rigueur;negative;0;1;0;1;0;1 -11856;rimer;positive;0;0;0;0;0;0 -11857;rime;positive;0;0;0;0;0;0 -11858;rinçage;positive;0;0;0;0;0;0 -11859;rincer;positive;0;0;0;0;0;0 -11860;riposte;negative;0;0;0;1;0;0 -11861;riposter;negative;0;0;0;1;0;0 -11862;rire;positive;0;0;0;0;1;0 -11863;rire bête;positive;1;0;0;0;0;0 -11864;rire bêtement;positive;1;0;0;0;0;0 -11865;risible;negative;0;0;0;0;0;1 -11866;risque;negative;0;1;0;0;0;0 -11867;risquer;negative;0;1;0;0;0;0 -11868;rite;positive;0;0;0;0;0;0 -11869;ritualiste;positive;0;0;0;0;0;0 -11870;rivage;positive;0;0;0;0;0;0 -11871;rivaliser;negative;0;1;0;1;0;0 -11872;rivalité;negative;0;0;0;1;0;0 -11873;rive;positive;0;0;0;0;0;0 -11874;riverain;positive;0;0;0;0;0;0 -11875;rivet;positive;0;0;0;0;0;0 -11876;riveter;positive;0;0;0;0;0;0 -11877;rivière;positive;0;0;0;0;0;0 -11878;rixe;negative;0;1;0;1;0;1 -11879;riz;positive;0;0;0;0;0;0 -11880;rizière;positive;0;0;0;0;0;0 -11881;roadster;positive;0;0;0;0;0;0 -11882;robe;positive;0;0;0;0;0;0 -11883;robinet;positive;0;0;0;0;0;0 -11884;robot;positive;0;0;0;0;0;0 -11885;robotique;positive;0;0;0;0;0;0 -11886;rocailleux;negative;0;1;0;0;0;0 -11887;roche;positive;0;0;0;0;0;0 -11888;rocher;positive;0;0;0;0;0;0 -11889;rock;positive;0;0;0;0;0;0 -11890;rôder;negative;0;1;0;0;1;0 -11891;rogner;positive;0;0;0;0;0;0 -11892;roi;positive;0;0;0;0;0;0 -11893;rôle;positive;0;0;0;0;0;0 -11894;romantique;positive;0;0;0;0;0;0 -11895;romantisme;positive;0;0;0;0;0;0 -11896;romarin;positive;0;0;0;0;0;0 -11897;rond;positive;0;0;0;0;0;0 -11898;rond point;positive;0;0;0;0;0;0 -11899;ronde;positive;0;0;0;0;0;0 -11900;rondin;positive;0;0;0;0;0;0 -11901;ronflement;negative;0;0;0;1;0;1 -11902;ronfler;negative;0;0;0;1;0;1 -11903;ronronnement;positive;0;0;0;0;0;0 -11904;ronronner;positive;0;0;0;0;0;0 -11905;roquette;negative;0;1;0;1;0;0 -11906;rosaire;positive;0;0;0;0;0;0 -11907;rose;positive;0;0;0;0;0;0 -11908;roser;positive;0;0;0;0;0;0 -11909;roseau;positive;0;0;0;0;0;0 -11910;rosette;positive;0;0;0;0;0;0 -11911;rosier;positive;0;0;0;0;0;0 -11912;rossignol;positive;1;0;0;0;0;0 -11913;rotatif;positive;0;0;0;0;0;0 -11914;rôtir;negative;0;0;0;0;0;0 -11915;rotin;positive;0;0;0;0;0;0 -11916;rôtisserie;positive;0;0;0;0;0;0 -11917;rotor;positive;0;0;0;0;0;0 -11918;rotule;positive;0;0;0;0;0;0 -11919;rouage;positive;0;0;0;0;0;0 -11920;roucoulement;positive;1;0;0;0;0;0 -11921;roucouler;positive;1;0;0;0;0;0 -11922;roue;positive;0;0;0;0;0;0 -11923;rouge à lèvre;positive;0;0;0;0;0;0 -11924;rougeâtre;negative;0;0;0;0;0;1 -11925;rougeaud;negative;0;0;0;0;0;1 -11926;rougeole;negative;0;1;1;0;0;1 -11927;rouge;negative;0;0;0;0;0;0 -11928;rougeur;negative;0;0;0;0;0;1 -11929;rougir;negative;0;0;0;0;1;0 -11930;rougissant;negative;0;0;0;0;1;0 -11931;rouille;negative;0;1;1;0;0;1 -11932;rouiller;negative;0;0;1;0;0;1 -11933;rouler;negative;0;0;0;0;0;0 -11934;rouleau;positive;0;0;0;0;0;0 -11935;rouleau compresseur;negative;0;1;0;0;0;0 -11936;roulement;positive;0;0;0;0;0;0 -11937;rouquin;negative;0;0;0;0;0;0 -11938;rousse;negative;0;0;0;0;0;0 -11939;route;positive;0;0;0;0;0;0 -11940;route à péage;positive;0;0;0;0;0;0 -11941;routine;positive;0;0;0;0;0;0 -11942;roux;negative;0;0;0;0;0;0 -11943;royal;positive;0;0;0;0;0;0 -11944;royaume;positive;0;0;0;0;0;0 -11945;royauté;positive;0;0;0;0;0;0 -11946;ruban;positive;0;0;0;1;0;0 -11947;ruban adhésif;positive;0;0;0;0;0;0 -11948;rubis;positive;0;0;0;0;0;0 -11949;rubrique;positive;0;0;0;0;0;0 -11950;ruche;negative;0;1;0;1;0;0 -11951;rude;negative;0;1;1;0;0;0 -11952;rudimentaire;negative;0;1;1;0;0;0 -11953;rudiment;positive;0;0;0;0;0;0 -11954;rue;positive;0;0;0;0;0;0 -11955;rue principal;positive;0;0;0;0;0;0 -11956;ruer;negative;0;1;0;1;1;0 -11957;ruelle;positive;0;0;0;0;0;0 -11958;rugir;negative;0;1;0;1;1;0 -11959;rugissement;negative;0;1;0;1;1;0 -11960;rugosité;negative;0;0;1;1;0;1 -11961;rugueux;negative;0;1;0;0;0;0 -11962;ruineux;negative;0;1;1;1;0;1 -11963;ruisseler;negative;0;0;0;0;0;0 -11964;ruisselant;negative;0;0;0;0;0;0 -11965;ruissellement;negative;0;0;0;0;0;0 -11966;rumeur;negative;0;1;1;1;0;1 -11967;rune;negative;0;0;0;0;0;0 -11968;rupture;negative;0;1;1;0;1;0 -11969;rural;negative;0;0;0;0;0;0 -11970;rush;negative;0;1;0;1;1;0 -11971;rustique;negative;0;0;0;0;0;0 -11972;rythme;positive;0;0;0;0;0;0 -11973;rythmer;positive;0;0;0;0;1;0 -11974;rythmique;positive;0;0;0;0;1;0 -11975;s abstenir;negative;0;1;1;0;0;0 -11976;s accroupir;negative;0;1;0;0;0;0 -11977;s adapter;positive;0;0;0;0;0;0 -11978;s agenouiller;negative;0;0;1;0;0;0 -11979;s armer;positive;0;0;0;0;0;0 -11980;s arrêter;negative;0;1;0;0;1;0 -11981;s attarder;negative;0;0;0;0;0;0 -11982;s attendre à;positive;0;0;0;0;1;0 -11983;s atténuer;negative;0;0;0;0;0;0 -11984;s attrouper;negative;0;1;0;0;0;0 -11985;s avérer;positive;0;0;0;0;0;0 -11986;s éclairer;positive;0;0;0;0;1;0 -11987;s écouler;positive;0;0;0;0;0;0 -11988;s efforcer;positive;0;0;0;0;0;0 -11989;s élever;positive;0;0;0;0;0;0 -11990;s émerveiller;positive;0;0;0;0;1;0 -11991;s emmêler;negative;0;1;0;1;0;0 -11992;s emporter;negative;0;1;0;1;0;0 -11993;s enchevêtrer;negative;0;1;0;1;0;0 -11994;s endurcir;negative;0;0;1;1;0;0 -11995;s enrager;negative;0;1;0;1;0;0 -11996;s ensuivre;positive;0;0;0;0;0;0 -11997;s entraînant;positive;0;0;0;0;0;0 -11998;s envaser;negative;0;1;0;0;0;1 -11999;s épanouir;positive;1;0;0;0;0;0 -12000;s éparpiller;negative;0;1;1;0;0;0 -12001;s estomper;negative;0;0;1;0;0;0 -12002;s étendre;positive;0;0;0;0;0;0 -12003;s évertuer;positive;0;0;0;0;0;0 -12004;s exécutant;positive;0;0;0;0;0;0 -12005;s expatrier;negative;0;1;1;0;0;0 -12006;s identifier;positive;0;0;0;0;0;0 -12007;s inclinant;negative;0;1;0;0;0;0 -12008;s incliner;positive;0;1;0;0;0;0 -12009;s inquiéter;negative;0;1;0;0;0;0 -12010;s inscrire;positive;0;0;0;0;0;0 -12011;s occupant de;positive;0;0;0;0;0;0 -12012;s opposer à;negative;0;0;0;1;0;0 -12013;sable;negative;0;0;0;0;0;0 -12014;sableux;negative;0;0;0;0;0;1 -12015;sableur|sableuse;negative;0;0;0;0;0;1 -12016;sablier;positive;0;0;0;0;0;0 -12017;sablonneux;negative;0;0;0;0;0;1 -12018;sabot;negative;0;0;0;0;0;0 -12019;sabotage;negative;0;1;1;1;1;1 -12020;saboter;negative;0;1;1;1;1;1 -12021;sabre;negative;0;1;0;1;0;0 -12022;sabrer;negative;0;1;0;1;0;0 -12023;sac;positive;0;0;0;1;0;0 -12024;sac à dos;positive;0;0;0;0;0;0 -12025;sac à main;positive;0;0;0;0;0;0 -12026;saccader;negative;0;0;0;0;0;0 -12027;saccage;negative;0;1;0;1;1;0 -12028;saccager;negative;0;1;1;1;1;1 -12029;sacerdotal;positive;0;0;0;0;0;0 -12030;savoir;positive;0;0;0;0;0;0 -12031;sacoche;positive;0;0;0;0;0;0 -12032;sacré;positive;0;0;0;0;0;0 -12033;sacrer;positive;0;0;0;0;0;0 -12034;sacrement;positive;0;0;0;0;0;0 -12035;sacrifice;negative;0;1;1;0;0;1 -12036;safran;positive;0;0;0;0;0;0 -12037;saga;positive;0;0;0;0;0;0 -12038;sage;positive;0;0;0;0;0;0 -12039;sage femme;positive;0;0;0;0;0;0 -12040;sagesse;positive;0;0;0;0;0;0 -12041;saignant;negative;0;1;1;0;0;1 -12042;saignement;negative;0;1;1;0;0;1 -12043;sailler|saillir;negative;0;1;0;0;1;0 -12044;saillant;positive;0;1;0;0;1;0 -12045;saillie;negative;0;1;0;0;0;1 -12046;sain;positive;0;0;0;0;0;0 -12047;saindoux;negative;0;0;0;0;0;1 -12048;sainteté;positive;0;1;0;0;1;0 -12049;saisissant;negative;0;1;0;0;1;0 -12050;saison;positive;0;0;0;0;0;0 -12051;salade;negative;0;0;0;0;0;0 -12052;salaire;positive;0;0;0;0;0;0 -12053;salamandre;negative;0;1;0;0;0;1 -12054;sale;negative;0;0;0;0;0;1 -12055;saler;negative;0;0;0;0;0;1 -12056;sale gosse;negative;0;0;0;1;0;1 -12057;saleté;negative;0;0;0;0;0;1 -12058;salin;negative;0;0;0;0;0;0 -12059;salin|saline;negative;0;0;0;0;0;0 -12060;salir;negative;0;0;0;0;0;1 -12061;salissant;negative;0;1;1;1;0;1 -12062;salive;positive;0;0;0;0;0;1 -12063;saliver;positive;0;0;0;0;0;1 -12064;salle;positive;0;0;0;0;0;0 -12065;salle de bain;positive;0;0;0;0;0;0 -12066;salle de bal;positive;0;0;0;0;0;0 -12067;salon;positive;1;0;0;0;0;0 -12068;salope;negative;0;0;0;1;0;1 -12069;salopette;positive;0;0;0;0;0;0 -12070;salubre;positive;0;0;0;0;0;0 -12071;saluer;positive;1;0;0;0;0;0 -12072;salut;negative;0;0;1;0;1;0 -12073;salutaire;positive;0;0;0;0;0;0 -12074;salutation;positive;0;0;0;0;1;0 -12075;salve;negative;0;1;0;0;0;0 -12076;samba;positive;1;0;0;0;0;0 -12077;samissants;negative;0;1;1;1;0;1 -12078;samouraï;positive;0;1;0;0;0;0 -12079;sanctification;positive;0;0;0;0;0;0 -12080;sanctifier;positive;0;0;0;0;0;0 -12081;sanction;negative;0;1;1;1;0;1 -12082;sanctionner;negative;0;1;1;0;0;0 -12083;sanctuaire;positive;0;0;0;0;0;0 -12084;sandale;positive;0;0;0;0;0;0 -12085;sang;negative;0;1;1;1;0;1 -12086;sang froid;positive;0;0;0;0;0;0 -12087;sangler;negative;0;1;1;1;0;1 -12088;sanglant;negative;0;1;1;1;0;1 -12089;sangle;negative;0;1;0;0;0;0 -12090;sanglier;negative;0;1;0;0;0;1 -12091;sanglot;negative;0;0;1;0;0;0 -12092;sangloter;negative;0;0;1;0;0;0 -12093;sangsue;negative;0;0;0;0;0;1 -12094;sanguinaire;negative;0;1;0;1;0;1 -12095;sanguin;positive;0;0;0;0;0;0 -12096;sanitaire;positive;0;0;0;0;0;0 -12097;sans abri;negative;0;1;1;1;0;1 -12098;sans accompagnement;negative;0;0;1;0;0;0 -12099;sans aide;negative;0;0;1;0;0;0 -12100;sans ambiguïté;positive;0;0;0;0;0;0 -12101;sans âme;negative;0;1;1;0;0;1 -12102;sans arme;negative;0;0;0;0;0;0 -12103;sans attache;negative;0;0;1;0;0;0 -12104;sans aucun doute;positive;0;0;0;0;0;0 -12105;sans borne;positive;0;0;0;0;0;0 -12106;sans bruit;positive;1;0;0;0;0;0 -12107;sans but;negative;0;0;1;0;0;0 -12108;sans c?ur;negative;0;0;1;1;0;1 -12109;sans conséquence;negative;0;0;1;0;0;0 -12110;sans contrainte;positive;0;0;0;0;0;0 -12111;sans couleur;negative;0;0;1;0;0;0 -12112;sans couture;positive;0;0;0;0;0;0 -12113;sans défense;negative;0;1;1;0;0;0 -12114;sans délai;positive;0;0;0;0;1;0 -12115;sans dent;negative;0;0;1;0;0;1 -12116;sans domicile fixe;negative;0;1;1;1;0;1 -12117;sans doute;positive;0;0;0;0;0;0 -12118;sans éclat;negative;0;0;1;0;0;0 -12119;sans emploi;negative;0;1;1;0;0;0 -12120;sans énergie;negative;0;0;1;0;0;0 -12121;sans équivoque;positive;0;0;0;0;0;0 -12122;sans espoir;negative;0;1;1;0;0;0 -12123;sans être voir;negative;0;0;1;0;0;0 -12124;sans faille;positive;0;0;0;0;0;0 -12125;sans faire exprès;negative;0;1;1;0;1;0 -12126;sans faute;positive;0;0;0;0;0;0 -12127;sans fil;positive;0;0;0;1;1;0 -12128;sans fond;negative;0;1;0;0;0;0 -12129;sans formation;negative;0;0;1;0;0;0 -12130;sans heurt;positive;1;0;0;0;0;0 -12131;sans importance;negative;0;0;1;0;0;0 -12132;sans instruction;negative;0;0;1;0;0;1 -12133;sans interruption;positive;1;0;0;0;0;0 -12134;sans le faire exprès;negative;0;1;1;0;0;0 -12135;sans le savoir;negative;0;1;1;0;0;0 -12136;sans le sou;negative;0;0;1;0;0;0 -12137;sans le vouloir;negative;0;1;1;0;1;0 -12138;sans lien;negative;0;0;1;0;0;0 -12139;sans limite;positive;0;0;0;0;0;0 -12140;sans manche;positive;0;0;0;0;0;0 -12141;sans nom;negative;0;1;1;0;0;1 -12142;sans obstacle;positive;0;0;0;0;0;0 -12143;sans permis;negative;0;0;0;0;0;0 -12144;sans peur;positive;0;1;0;0;0;0 -12145;sans précédent;positive;0;0;0;0;1;0 -12146;sans prétention;positive;0;0;0;0;0;0 -12147;sans rapport;negative;0;1;1;0;0;0 -12148;sans relâche;positive;0;0;0;0;0;0 -12149;sans résistance;positive;0;0;0;0;0;0 -12150;sans restriction;positive;1;0;0;0;0;0 -12151;sans retenue;positive;1;0;0;0;0;0 -12152;sans scrupule;negative;0;0;0;1;0;1 -12153;sans soleil;negative;0;0;1;0;0;0 -12154;sans sucre;positive;0;0;0;0;0;0 -12155;sans surveillance;negative;0;1;1;0;0;0 -12156;sans tache;positive;0;0;0;0;0;0 -12157;sans tenir compte de;negative;0;0;0;0;0;0 -12158;sans titre;negative;0;0;1;0;0;0 -12159;sans vie;negative;0;1;1;0;0;0 -12160;sans voix;negative;0;1;1;0;1;0 -12161;santé;positive;1;0;0;0;0;0 -12162;santé mental;positive;0;0;0;0;0;0 -12163;saoul;negative;0;0;0;0;0;1 -12164;sapeur pompier;positive;0;0;0;0;0;0 -12165;saphir;positive;0;0;0;0;0;0 -12166;sarcasme;negative;0;0;1;1;0;1 -12167;sarcastique;negative;0;0;0;1;0;1 -12168;sarcome;negative;0;1;1;0;0;0 -12169;sardonique;negative;0;0;0;1;0;1 -12170;satanique;negative;0;1;0;1;0;0 -12171;satellite;positive;0;0;0;0;0;0 -12172;satin;positive;0;0;0;0;0;0 -12173;satiner;positive;0;0;0;0;0;0 -12174;satire;negative;0;0;0;1;0;1 -12175;satirique;negative;0;0;0;1;0;1 -12176;satisfaction;positive;1;0;0;0;0;0 -12177;saturation;negative;0;0;0;0;0;0 -12178;saturer;negative;0;0;1;1;0;1 -12179;sauce;positive;0;0;0;0;0;0 -12180;sauge;positive;0;0;0;0;0;0 -12181;saule;positive;0;0;0;0;0;0 -12182;saumâtre;negative;0;0;0;0;0;1 -12183;saumure;negative;0;0;0;0;0;1 -12184;sauna;positive;0;0;0;0;0;0 -12185;saupoudrage;positive;0;0;0;0;0;0 -12186;saupoudrer;positive;0;0;0;0;0;0 -12187;saut;positive;1;0;0;0;0;0 -12188;sauter;negative;0;1;0;0;0;1 -12189;sauter en parachute;negative;0;1;0;0;0;0 -12190;sauterelle;positive;0;1;0;0;0;1 -12191;sautiller;positive;1;0;0;0;0;0 -12192;sauvagerie;negative;0;1;0;1;0;0 -12193;sauvegarde;positive;0;0;0;0;0;0 -12194;sauvegarder;positive;0;0;0;0;0;0 -12195;sauver;positive;0;0;0;0;0;0 -12196;sauvetage;positive;0;0;0;0;1;0 -12197;savane;positive;0;0;0;0;0;0 -12198;saveur;positive;0;0;1;0;0;1 -12199;savon;positive;0;0;0;0;0;0 -12200;savonner;positive;0;0;0;0;0;0 -12201;savonneux;negative;0;1;0;0;0;0 -12202;savourer;positive;0;0;1;0;0;1 -12203;saxo;positive;0;0;0;0;0;0 -12204;saxophone;positive;0;0;0;0;0;0 -12205;scalpel;negative;0;1;0;0;0;0 -12206;scalper;negative;0;1;0;0;0;1 -12207;scandale;negative;0;1;0;1;1;0 -12208;scander;positive;0;0;0;1;1;0 -12209;scanner;positive;0;0;0;0;0;0 -12210;scape;negative;0;0;0;0;0;0 -12211;scarabée;positive;0;1;0;0;0;1 -12212;sceau;positive;0;0;0;0;0;0 -12213;sceller;positive;0;0;0;0;0;0 -12214;scène;positive;0;0;0;0;0;0 -12215;scénique;positive;0;0;0;0;0;0 -12216;scepticisme;negative;0;1;0;0;1;0 -12217;schéma;positive;0;0;0;0;0;0 -12218;schématique;positive;0;0;0;0;0;0 -12219;schisme;negative;0;0;0;1;0;0 -12220;schizophrénie;negative;0;1;1;1;0;1 -12221;sciatique;negative;0;1;1;0;0;0 -12222;sciemment;positive;0;0;0;0;0;0 -12223;science;positive;0;0;0;0;0;0 -12224;science économique;positive;0;0;0;0;0;0 -12225;science humain;positive;0;0;0;0;0;0 -12226;scientifique;positive;0;0;0;0;0;0 -12227;scinder;negative;0;0;0;1;0;0 -12228;scintillant;positive;1;0;0;0;0;0 -12229;scintillateur;positive;0;0;0;0;0;0 -12230;scintillation;positive;0;0;0;0;1;0 -12231;scintillement;positive;0;0;0;0;1;0 -12232;scintiller;positive;0;0;0;0;1;1 -12233;scission;negative;0;0;1;1;0;0 -12234;sciure;negative;0;0;0;0;0;1 -12235;scolaire;positive;0;0;0;0;0;0 -12236;scolarité;positive;0;0;0;0;0;0 -12237;sconse;negative;0;0;0;0;0;1 -12238;scoop;positive;0;0;0;0;1;0 -12239;score;positive;0;0;0;0;1;0 -12240;scorie;negative;0;0;0;0;0;1 -12241;scorpion;negative;0;1;0;1;1;1 -12242;scotch;positive;0;0;0;0;0;0 -12243;scout;positive;0;0;0;0;0;0 -12244;scribe;positive;0;0;0;0;0;0 -12245;script;positive;0;0;0;0;0;0 -12246;scriptural;positive;0;0;0;0;0;0 -12247;scruter;negative;0;0;0;0;0;0 -12248;scrutin;positive;0;0;0;0;0;0 -12249;sculpter;positive;0;0;0;0;0;0 -12250;sculpteur;positive;0;0;0;0;0;0 -12251;sculpture;positive;0;0;0;0;0;0 -12252;se bagarrer;negative;0;1;0;1;0;1 -12253;se baigner;positive;0;0;0;0;0;0 -12254;se balader;positive;1;0;0;0;0;0 -12255;se balancer;positive;0;0;0;0;0;0 -12256;se baser;positive;0;0;0;0;0;0 -12257;se battre;negative;0;1;0;1;0;0 -12258;se battre pour qch;negative;0;1;0;1;0;0 -12259;se battre en duel;negative;0;1;0;1;0;0 -12260;se blottir;positive;0;0;0;0;0;0 -12261;se boursoufler;negative;0;0;0;0;0;1 -12262;se braquer;negative;0;1;0;0;1;0 -12263;se briser;negative;0;0;0;0;1;0 -12264;se camoufler;negative;0;0;0;0;1;0 -12265;se casser;negative;0;0;0;0;1;0 -12266;se casser net;negative;0;1;0;1;1;0 -12267;se charger de;positive;0;0;0;0;0;0 -12268;se chevaucher;negative;0;0;0;0;0;0 -12269;se composer de;positive;0;0;0;0;0;0 -12270;se concentrer;positive;0;0;0;0;0;0 -12271;se concrétiser;positive;0;0;0;0;0;0 -12272;se conformer;positive;0;0;0;0;0;0 -12273;se conjuguer;positive;0;0;0;0;0;0 -12274;se connaître;positive;0;0;0;0;0;0 -12275;se connecter;positive;0;0;0;0;0;0 -12276;se contracter;negative;0;1;0;1;0;0 -12277;se contredire;negative;0;0;0;1;0;0 -12278;se coucher;positive;0;0;0;0;0;0 -12279;se couper;negative;0;1;1;0;0;0 -12280;se courber;negative;0;1;0;0;0;0 -12281;se couvrir;positive;0;0;0;0;0;0 -12282;se crisper;negative;0;1;0;1;0;0 -12283;se débarrasser;negative;0;0;1;1;0;0 -12284;se débarrasser de;negative;0;0;1;1;0;1 -12285;se débattre;negative;0;1;1;1;0;0 -12286;se débrouiller;negative;0;1;1;1;0;0 -12287;se décomposer;negative;0;1;1;0;0;1 -12288;se décourager;negative;0;1;1;1;0;0 -12289;se déformer;negative;0;0;1;1;0;0 -12290;se dégonfler;negative;0;1;1;1;0;0 -12291;se dégrader;negative;0;0;1;0;0;1 -12292;se déguiser;negative;0;0;0;0;0;0 -12293;se délecter;positive;1;0;0;0;0;0 -12294;se délester;positive;0;0;0;0;0;0 -12295;se dépêcher;negative;0;1;0;1;1;0 -12296;se déployer;positive;0;0;0;0;0;0 -12297;se dépouiller de;negative;0;0;0;0;0;1 -12298;se déprécier;negative;0;0;1;1;0;1 -12299;se dérouler;positive;0;0;0;0;0;0 -12300;se déshabiller;positive;0;0;0;0;0;0 -12301;se désintégrer;negative;0;1;1;1;0;1 -12302;se désister;negative;0;1;1;0;0;0 -12303;se détendre;positive;0;0;0;0;0;0 -12304;se détériorer;negative;0;1;1;1;0;1 -12305;se développer;positive;0;0;0;0;0;0 -12306;se dilater;negative;0;1;0;0;0;0 -12307;se disperser;negative;0;1;1;0;0;0 -12308;se disputer;negative;0;0;0;1;0;0 -12309;se dissiper;negative;0;0;0;0;0;0 -12310;se dissoudre;negative;0;0;0;0;0;0 -12311;se diversifier;positive;0;0;0;0;0;0 -12312;se doucher;positive;0;0;0;0;0;0 -12313;se durcir;negative;0;0;1;1;0;0 -12314;se faire passer pour;negative;0;0;0;1;0;0 -12315;se faire plaisir;positive;1;0;0;0;0;0 -12316;se familiariser;positive;0;0;0;0;0;0 -12317;se fatiguer;negative;0;0;1;0;0;0 -12318;se faufiler;negative;0;1;0;1;1;0 -12319;se fissurer;negative;0;1;0;0;1;0 -12320;se fouler;negative;0;1;1;0;1;0 -12321;se frotter;negative;0;0;0;0;0;0 -12322;se glisser;negative;0;0;0;0;0;1 -12323;se glisser furtivement;negative;0;1;0;1;1;0 -12324;se gonfler;negative;0;0;0;0;0;1 -12325;se hérisser;negative;0;1;0;0;1;0 -12326;se jeter sur;negative;0;1;0;1;1;0 -12327;se joindre à;positive;0;0;0;0;0;0 -12328;se lamenter;negative;0;1;1;0;0;1 -12329;se lasser;negative;0;0;1;0;0;0 -12330;se loger;positive;0;0;0;0;0;0 -12331;se marier;positive;0;1;0;0;1;0 -12332;se masturber;positive;1;0;0;0;0;0 -12333;se matérialiser;positive;0;0;0;0;0;0 -12334;se méfier de;negative;0;1;0;1;0;1 -12335;se mélanger;positive;0;0;0;0;0;0 -12336;se mêler;negative;0;0;0;1;0;0 -12337;se méprendre;negative;0;1;1;1;0;0 -12338;se mettre à califourchon sur;positive;0;0;0;0;0;0 -12339;se mettre à genou;negative;0;0;1;0;0;0 -12340;se mettre en grève;negative;0;0;0;1;0;0 -12341;se mirer;positive;0;0;0;0;0;0 -12342;se moquer;negative;0;0;0;1;0;1 -12343;se moquer de;negative;0;1;1;1;0;0 -12344;se multiplier;positive;0;0;0;0;0;0 -12345;se noyer;negative;0;1;1;0;0;0 -12346;se pâmer;positive;1;0;0;0;0;0 -12347;se parjurer;negative;0;0;1;1;1;1 -12348;se pavaner;negative;0;0;0;0;0;0 -12349;se pencher;negative;0;1;0;0;0;0 -12350;se percher;positive;0;0;0;0;0;0 -12351;se périmer;negative;0;0;1;0;0;1 -12352;se permettre;positive;0;0;0;0;0;0 -12353;se plaindre;negative;0;0;1;1;0;0 -12354;se plier;negative;0;0;0;0;0;0 -12355;se plonger;positive;0;0;0;0;0;0 -12356;se porter garant;positive;0;0;0;0;0;0 -12357;se positionner;positive;0;0;0;0;0;0 -12358;se précipiter;negative;0;1;1;1;1;0 -12359;se prélasser;positive;1;0;0;0;0;0 -12360;se préparer;positive;0;0;0;0;0;0 -12361;se presser;negative;0;1;0;1;1;0 -12362;se procurer;positive;0;0;0;0;0;0 -12363;se produire;positive;0;0;0;0;0;0 -12364;se profiler;negative;0;1;0;0;0;0 -12365;se promener;positive;1;0;0;0;0;0 -12366;se propager;negative;0;1;0;0;0;0 -12367;se proposer;positive;0;1;0;0;0;0 -12368;se prostituer;negative;0;0;1;0;0;1 -12369;se qualifier;positive;1;0;0;0;0;0 -12370;se quereller;negative;0;0;0;1;0;0 -12371;se raidir;negative;0;1;0;1;0;0 -12372;se rappeler;positive;0;0;0;0;0;0 -12373;se rapprocher;positive;0;0;0;0;0;0 -12374;se raser;positive;0;0;0;0;0;0 -12375;se rassembler;positive;0;0;0;0;0;0 -12376;se rebeller;negative;0;1;0;1;0;0 -12377;se redresser;positive;0;0;0;0;0;0 -12378;se régaler;positive;1;0;0;0;0;0 -12379;se régénérer;positive;0;0;0;0;0;0 -12380;se rejoindre;positive;0;0;0;0;0;0 -12381;se réjouir;positive;0;0;0;0;1;0 -12382;se rendre;negative;0;1;1;0;0;0 -12383;se renseigner;positive;0;0;0;0;0;0 -12384;se répandre;negative;0;0;0;0;0;0 -12385;se repentir;positive;0;1;0;0;0;0 -12386;se reposer;positive;1;0;0;0;0;0 -12387;se représenter;positive;0;0;0;0;0;0 -12388;se reproduire;negative;0;0;0;0;0;0 -12389;se retirer;negative;0;1;1;0;0;0 -12390;se retourner contre qqn;negative;0;0;1;1;0;0 -12391;se rétracter;negative;0;1;0;1;0;0 -12392;se rétrécir;negative;0;1;1;0;0;0 -12393;se réveiller;positive;0;0;0;0;0;0 -12394;se révolter;negative;0;0;0;1;1;0 -12395;se séparer;negative;0;0;1;0;0;0 -12396;se solidifier;positive;0;0;0;0;0;0 -12397;se souvenir;positive;0;0;0;0;0;0 -12398;se spécialiser;positive;0;0;0;0;0;0 -12399;se suicider;negative;0;1;1;1;0;0 -12400;se taire;negative;0;0;0;0;0;0 -12401;se tapir;negative;0;1;1;0;0;0 -12402;se tenir debout;positive;0;0;0;0;0;0 -12403;se terminer;negative;0;1;1;0;0;0 -12404;se tortiller;negative;0;0;0;0;0;1 -12405;se tracasser;negative;0;1;0;0;0;0 -12406;se tromper;negative;0;1;1;0;0;0 -12407;se vanter;negative;0;0;0;0;0;0 -12408;se vautrer;negative;0;1;1;0;1;1 -12409;se venger;negative;0;1;0;1;1;0 -12410;séance;positive;0;0;0;0;0;0 -12411;seau;positive;0;0;0;0;0;0 -12412;sec;negative;0;1;0;1;1;0 -12413;sécable;negative;0;0;0;0;0;0 -12414;sécateur;negative;0;0;0;0;0;0 -12415;sécession;negative;0;1;0;0;0;0 -12416;sécher;negative;0;0;0;0;0;0 -12417;sèche cheveu;positive;0;0;0;0;0;0 -12418;sèche linge;positive;0;0;0;0;0;0 -12419;sécheresse;negative;0;1;1;0;0;0 -12420;secondaire;negative;0;0;1;0;0;0 -12421;second;positive;0;0;0;0;1;0 -12422;seconder;positive;0;0;0;0;0;0 -12423;secouer;negative;0;1;0;0;0;0 -12424;secourir;positive;0;0;0;0;1;0 -12425;secours;positive;0;0;0;0;1;0 -12426;secousse;negative;0;1;0;1;1;0 -12427;secret;negative;0;1;0;0;1;0 -12428;secrétaire;positive;0;0;0;0;0;0 -12429;secrétaire général;positive;0;0;0;0;0;0 -12430;secrétariat;positive;0;0;0;0;0;0 -12431;secrètement;negative;0;1;0;0;0;0 -12432;sécréter;negative;0;0;0;0;0;1 -12433;sécrétion;negative;0;0;0;0;0;1 -12434;sectaire;negative;0;1;1;1;0;1 -12435;sectarisme;negative;0;1;0;1;0;0 -12436;secte;negative;0;1;0;0;0;0 -12437;secteur;positive;0;0;0;0;0;0 -12438;section;positive;0;0;0;0;0;0 -12439;sectionner;negative;0;1;1;1;0;0 -12440;sécurité;positive;0;0;0;0;0;0 -12441;sédentaire;negative;0;0;0;0;0;0 -12442;sédiment;negative;0;0;0;0;0;1 -12443;sédimentaire;negative;0;0;0;0;0;1 -12444;sédition;negative;0;0;1;1;0;0 -12445;séduction;positive;0;0;0;0;0;0 -12446;séduire;positive;0;0;0;0;0;0 -12447;séduisant;positive;0;0;0;0;0;0 -12448;segment;positive;0;0;0;0;0;0 -12449;segmenter;positive;0;0;0;0;0;0 -12450;ségrégation;negative;0;0;1;0;0;0 -12451;seigle;positive;0;0;0;0;0;0 -12452;seigneur;positive;0;0;0;0;0;1 -12453;seigneurie;positive;0;0;0;0;0;0 -12454;sein;positive;0;0;0;0;0;0 -12455;séjour;positive;0;0;0;0;0;0 -12456;séjourner;positive;0;0;0;0;0;0 -12457;sel;negative;0;0;0;0;0;1 -12458;sélection;positive;0;0;0;0;0;0 -12459;selle;positive;0;0;0;0;0;0 -12460;seller;positive;0;0;0;0;0;0 -12461;semaine;positive;0;0;0;0;0;0 -12462;sémaphore;positive;0;0;0;0;0;0 -12463;semblant;positive;0;0;0;0;0;0 -12464;sembler;positive;0;0;0;0;0;0 -12465;semelle;negative;0;0;0;0;0;1 -12466;semence;positive;0;0;0;0;0;0 -12467;séminaire;positive;0;0;0;0;0;0 -12468;séminal;positive;0;0;0;0;0;0 -12469;sémiotique;positive;0;0;0;0;0;0 -12470;semis;positive;0;0;0;0;0;0 -12471;sénat;positive;0;0;0;0;0;0 -12472;sénateur;positive;0;0;0;0;0;0 -12473;sénescence;negative;0;0;1;0;0;0 -12474;sénile;negative;0;1;1;0;0;0 -12475;senior;positive;0;0;0;0;0;0 -12476;sénior;positive;0;0;0;0;0;0 -12477;sen|sens;positive;0;0;0;0;0;0 -12478;sen|sens général;positive;0;0;0;0;0;0 -12479;sensation;positive;0;1;1;1;1;1 -12480;sensibilité;positive;0;0;0;0;0;0 -12481;sensiblement;positive;0;0;0;0;0;0 -12482;sensiblerie;negative;0;0;0;0;1;1 -12483;sensualité;positive;0;0;0;0;0;0 -12484;sentence;negative;0;1;1;1;0;1 -12485;sentir;positive;0;0;0;0;0;0 -12486;sentimentalité;positive;0;0;0;0;0;0 -12487;sentinelle;positive;0;0;0;0;0;0 -12488;sentir mauvais;negative;0;0;0;0;0;1 -12489;sépaés;negative;0;0;1;0;0;0 -12490;séparable;negative;0;0;1;0;0;0 -12491;séparation;negative;0;1;1;0;0;0 -12492;séparatiste;negative;0;0;0;1;0;1 -12493;séparer;negative;0;1;1;1;0;1 -12494;séparément;negative;0;1;1;0;0;0 -12495;sépia;positive;0;0;0;0;0;0 -12496;sepsis;negative;0;1;1;0;0;1 -12497;septembre;positive;0;0;0;0;0;0 -12498;septième;positive;0;0;0;0;0;0 -12499;septique;negative;0;0;0;0;0;1 -12500;septum;positive;0;0;0;0;0;0 -12501;séquence;positive;0;0;0;0;0;0 -12502;séquestration;negative;0;1;1;0;0;0 -12503;séquestrer;negative;0;1;1;0;0;0 -12504;sérénité;positive;0;0;0;0;0;0 -12505;sergé;positive;0;0;0;0;0;0 -12506;sergent;positive;0;0;0;0;0;0 -12507;série;positive;0;0;0;0;0;0 -12508;sérier;positive;0;0;0;0;0;0 -12509;serin;positive;0;0;0;0;0;0 -12510;seringue;negative;0;1;0;0;0;0 -12511;sermon;positive;0;0;0;0;0;0 -12512;serpent;negative;0;1;0;0;0;1 -12513;serpent à sonnette;negative;0;1;0;0;0;1 -12514;serpenter;negative;0;1;0;0;0;1 -12515;serpentin;positive;0;0;0;0;0;0 -12516;serpillère;negative;0;0;0;0;0;1 -12517;serre;negative;0;0;0;0;0;0 -12518;serrement;negative;0;1;0;0;0;0 -12519;serrer;negative;0;1;0;1;0;0 -12520;serre|serres;negative;0;1;0;1;0;0 -12521;serrure;positive;0;0;0;0;0;0 -12522;serrurier;positive;0;0;0;0;0;0 -12523;sérum;positive;0;0;0;0;0;0 -12524;serveur;positive;0;0;0;0;0;0 -12525;serviable;positive;0;0;0;0;0;0 -12526;service;positive;0;0;0;0;0;0 -12527;serviette;positive;0;0;0;0;0;0 -12528;serviette de table;positive;0;0;1;0;0;0 -12529;servile;negative;0;1;1;1;0;1 -12530;servir;negative;0;0;0;0;0;0 -12531;servir à le louche;positive;0;0;0;0;0;0 -12532;serviteur;positive;0;0;0;0;0;0 -12533;servitude;negative;0;1;1;1;0;0 -12534;session;positive;0;0;0;0;0;0 -12535;setter;positive;0;0;0;0;0;0 -12536;seuil;positive;0;0;0;0;0;0 -12537;seul;negative;0;1;1;1;0;1 -12538;sève;positive;0;0;1;0;0;0 -12539;sévèrement;negative;0;1;1;0;0;0 -12540;sévérité;negative;0;1;1;1;0;0 -12541;sexe;positive;0;0;0;0;0;0 -12542;sexualité;positive;0;0;0;0;0;0 -12543;sexy;positive;1;0;0;0;0;0 -12544;shérif;positive;0;0;0;0;0;0 -12545;sherry;positive;0;0;0;0;0;0 -12546;shilling;positive;0;0;0;0;0;0 -12547;shopping;positive;0;0;0;0;1;0 -12548;short;positive;0;0;0;0;0;0 -12549;si que;positive;0;0;0;0;0;0 -12550;sic;positive;0;0;0;0;0;0 -12551;sidérant;negative;0;0;0;0;1;0 -12552;siècle;positive;0;0;0;0;0;0 -12553;siège;positive;0;1;1;1;1;0 -12554;siège social;positive;0;0;0;0;0;0 -12555;siéger;positive;0;0;0;0;0;0 -12556;sieste;positive;1;0;0;0;0;0 -12557;sifflant;negative;0;1;0;1;0;0 -12558;sifflement;negative;0;1;0;1;1;0 -12559;siffler;negative;0;1;0;1;1;0 -12560;sifflet;positive;0;0;0;0;0;0 -12561;sigle;positive;0;0;0;0;0;0 -12562;signal;positive;0;0;0;0;1;0 -12563;signal lumineux;positive;0;0;0;0;1;0 -12564;signaler;positive;0;0;0;0;0;0 -12565;signalement;positive;0;0;0;0;0;0 -12566;signature;positive;0;0;0;0;0;0 -12567;signe avant coureur;negative;0;1;0;1;0;0 -12568;signe de le main;positive;0;0;0;0;0;0 -12569;signer;positive;0;0;0;0;0;0 -12570;significatif;positive;0;0;0;0;0;0 -12571;signification;positive;0;0;0;0;0;0 -12572;signifier;positive;0;0;0;0;0;0 -12573;silence;negative;1;0;0;0;0;0 -12574;silencieusement;positive;1;0;0;0;0;0 -12575;silex;negative;0;1;0;0;0;0 -12576;silhouette;positive;0;0;0;0;0;0 -12577;sillon;negative;0;1;1;0;0;1 -12578;similaire;positive;0;0;0;0;0;0 -12579;similarité;positive;0;0;0;0;0;0 -12580;similitude;positive;0;0;0;0;0;0 -12581;simplement;positive;0;0;0;0;0;0 -12582;simplet;negative;0;0;0;0;0;0 -12583;simplifier;positive;0;0;0;0;1;0 -12584;simpliste;negative;0;0;1;0;0;1 -12585;simulacre;negative;0;1;1;1;0;1 -12586;simuler;negative;0;0;0;0;0;0 -12587;simulation;negative;0;0;0;0;0;0 -12588;simultané;positive;0;0;0;0;0;0 -12589;simultanément;positive;0;0;0;0;0;0 -12590;sincère;positive;0;0;1;0;1;0 -12591;singe;positive;0;0;0;0;0;0 -12592;singer;positive;0;0;0;0;0;0 -12593;singularité;positive;0;0;0;0;0;0 -12594;singulièrement;positive;0;0;0;0;1;0 -12595;sinistre;negative;0;1;1;1;0;1 -12596;sinuer;negative;0;1;0;0;0;1 -12597;sinus;negative;0;0;0;0;0;1 -12598;siphon;negative;0;1;0;0;0;0 -12599;siphonner;negative;0;1;0;0;0;0 -12600;sire;positive;0;0;0;0;0;0 -12601;sirène;positive;0;1;0;0;1;0 -12602;sirop;positive;0;0;0;0;0;0 -12603;siroter;positive;0;0;0;0;0;0 -12604;site;positive;0;0;0;0;0;0 -12605;situation;positive;0;0;0;0;0;0 -12606;situation délicat;negative;0;1;1;0;0;0 -12607;situer;positive;0;0;0;0;0;0 -12608;sixième;positive;0;0;0;0;0;0 -12609;sketch;positive;0;0;0;0;0;0 -12610;ski;positive;0;0;0;0;0;0 -12611;skier;positive;0;0;0;0;0;0 -12612;skiff;positive;0;0;0;0;0;0 -12613;skipper;positive;0;0;0;0;0;0 -12614;slip;positive;0;0;0;0;0;0 -12615;slogan;positive;0;0;0;0;0;0 -12616;sloop;positive;0;0;0;0;0;0 -12617;smash;negative;0;1;0;1;1;0 -12618;snob;negative;0;0;0;0;0;1 -12619;sobriété;positive;0;0;0;0;0;0 -12620;sociable;positive;0;0;0;0;0;0 -12621;social;positive;0;0;0;0;0;0 -12622;socialisme;positive;0;1;0;0;0;1 -12623;socialiste;positive;0;1;1;1;0;1 -12624;société;positive;0;0;0;0;0;0 -12625;socle;positive;0;0;0;0;0;0 -12626;s?ur;positive;0;0;0;0;0;0 -12627;sofa;positive;0;0;1;0;0;0 -12628;soi dire;negative;0;0;0;0;0;0 -12629;soi même;positive;0;0;0;0;0;0 -12630;soie;positive;0;0;0;0;0;0 -12631;soif;negative;0;0;1;0;1;0 -12632;soigner;positive;0;0;0;0;0;0 -12633;soigneux;positive;0;0;0;0;0;0 -12634;soigneusement;positive;0;0;0;0;0;0 -12635;soin;positive;0;0;0;0;0;0 -12636;soir;positive;0;0;0;0;0;0 -12637;soirée;positive;0;0;0;0;0;0 -12638;soixante;positive;0;0;0;0;0;0 -12639;soixante dix;positive;0;0;0;0;0;0 -12640;sol;positive;0;0;0;0;0;1 -12641;solaire;positive;1;0;0;0;0;0 -12642;soldat;positive;0;0;1;1;0;0 -12643;solde;positive;0;0;0;0;0;0 -12644;sole;negative;0;0;0;0;0;1 -12645;soleil;positive;0;0;0;0;1;0 -12646;solidarité;positive;0;0;0;0;0;0 -12647;solidarité féminin;positive;0;0;1;1;1;0 -12648;solide;positive;0;1;1;0;1;0 -12649;solidification;positive;0;0;0;0;0;0 -12650;solidité;positive;0;0;0;0;0;0 -12651;solitaire;negative;0;1;1;1;0;1 -12652;solitude;negative;0;1;1;0;0;0 -12653;sollicitation;positive;0;0;0;0;0;0 -12654;solliciter;positive;0;0;0;0;0;0 -12655;solo;negative;0;0;1;0;0;0 -12656;solubilité;positive;0;0;0;0;0;0 -12657;soluble;positive;0;0;0;0;0;0 -12658;solution;positive;0;0;0;0;0;0 -12659;solutionner;positive;1;0;0;0;0;0 -12660;solvabilité;positive;0;0;0;0;0;0 -12661;solvable;positive;0;0;0;0;0;0 -12662;solvant;positive;0;0;0;0;0;0 -12663;somatique;negative;0;1;0;0;1;0 -12664;sombrer;negative;0;1;1;0;0;1 -12665;sombrement;negative;0;0;1;0;0;0 -12666;sommaire;negative;0;0;1;0;0;0 -12667;sommairement;negative;0;0;1;0;0;0 -12668;somme;negative;0;0;1;0;0;0 -12669;sommeil;positive;0;0;0;0;0;0 -12670;sommeiller;positive;0;0;0;0;0;0 -12671;sommer;negative;0;0;0;0;0;0 -12672;somnolence;negative;0;0;0;0;0;0 -12673;somnolent;negative;0;0;1;0;0;0 -12674;somnoler;negative;0;0;1;0;0;0 -12675;somptueux étalage;positive;1;0;0;0;0;0 -12676;son;positive;0;0;0;0;0;1 -12677;son de blé;positive;0;0;0;0;0;1 -12678;sonar;positive;0;0;0;0;0;0 -12679;sonate;positive;0;0;0;0;0;0 -12680;sondage;positive;0;0;0;0;0;0 -12681;sonde;positive;0;0;0;0;0;0 -12682;songe;positive;1;0;0;0;0;0 -12683;songer;positive;1;0;0;0;0;0 -12684;sonner;negative;0;0;1;0;1;0 -12685;sonnerie;positive;0;0;0;0;1;0 -12686;sonnet;positive;0;0;1;0;0;0 -12687;sonnette;positive;0;0;0;0;0;0 -12688;sonneur;negative;0;1;0;1;1;0 -12689;sonore;negative;0;1;0;0;1;0 -12690;soporifique;negative;0;1;1;0;0;0 -12691;soprano;positive;0;0;0;0;0;0 -12692;sorcellerie;negative;0;1;1;1;1;0 -12693;sorcier;negative;0;1;0;0;0;0 -12694;sordide;negative;0;1;1;1;0;1 -12695;sorgho;positive;0;0;0;0;0;0 -12696;sororité;positive;0;0;1;1;1;0 -12697;sort;negative;0;1;0;0;0;0 -12698;sorte;positive;0;0;0;0;0;0 -12699;sortie;positive;0;1;0;0;1;0 -12700;sortir;positive;0;0;0;0;0;0 -12701;sortir avec qqn;positive;1;0;0;0;0;0 -12702;sosie;negative;0;1;0;1;1;0 -12703;sou;positive;0;0;0;0;0;0 -12704;souche;positive;0;0;0;0;0;1 -12705;souci;negative;0;1;1;0;0;0 -12706;soucier;negative;0;1;1;0;0;0 -12707;soucieux;negative;0;1;0;0;0;0 -12708;soucoupe;positive;0;0;0;0;0;0 -12709;soudage;positive;0;0;0;0;0;0 -12710;soudain;negative;0;0;0;0;1;0 -12711;souder;positive;0;0;0;0;0;0 -12712;soudure;positive;0;0;0;0;0;0 -12713;soufflant;negative;0;1;0;0;1;0 -12714;soufflante;negative;0;0;0;0;0;0 -12715;souffle;negative;0;1;0;1;1;0 -12716;souffler;negative;0;0;1;0;0;0 -12717;souffler en rafale;negative;0;1;0;0;1;0 -12718;soufflet;negative;0;0;0;1;0;0 -12719;souffrance;negative;0;1;1;1;0;1 -12720;souffrir;negative;0;1;1;0;0;1 -12721;souffrant;negative;0;1;1;0;0;0 -12722;souffrir douleur;negative;0;1;1;1;0;0 -12723;soufre;negative;0;1;0;1;0;1 -12724;souhaitable;positive;0;0;0;0;0;0 -12725;souhaiter;positive;0;0;0;0;1;0 -12726;souiller;negative;0;0;0;0;0;1 -12727;souillure;negative;0;0;0;0;0;0 -12728;souk;negative;0;0;0;0;0;0 -12729;soulagement;positive;0;0;0;0;0;0 -12730;soulager;positive;0;0;0;0;0;0 -12731;soulever;positive;0;0;0;0;0;0 -12732;soulèvement;negative;0;1;0;1;1;0 -12733;soulier;positive;0;0;0;0;0;0 -12734;soulignement;positive;0;0;0;0;0;0 -12735;souligner;positive;0;0;0;0;0;0 -12736;soumettre;negative;0;0;0;1;0;0 -12737;soumission;negative;0;1;1;1;0;1 -12738;soupape;positive;0;0;0;0;0;0 -12739;soupçonner;negative;0;1;0;0;0;0 -12740;soupçonneux;negative;0;1;0;1;0;0 -12741;soupçon;negative;0;1;0;0;0;0 -12742;soupe;positive;0;0;0;0;0;0 -12743;soupe épais;positive;0;0;0;0;0;0 -12744;souper;positive;0;0;0;0;0;0 -12745;soupeser;positive;0;1;0;0;0;0 -12746;soupir;negative;0;0;1;0;0;0 -12747;soupirer;negative;0;0;1;1;0;1 -12748;source;positive;0;0;0;0;0;0 -12749;sourd;negative;0;0;1;0;0;1 -12750;sourire;positive;1;0;0;0;0;0 -12751;souriant;positive;1;0;0;0;0;0 -12752;sourire bête;negative;0;0;0;0;0;1 -12753;sourire suffisant;negative;0;0;0;0;0;1 -12754;souris;negative;0;1;0;0;0;0 -12755;sournois;negative;0;1;1;1;0;1 -12756;sous condition;negative;0;0;0;0;0;0 -12757;sous peu;positive;0;0;0;0;0;0 -12758;sous terre;negative;0;1;0;0;0;0 -12759;sous bois;negative;0;1;1;0;0;0 -12760;sous comité;positive;0;0;0;0;0;0 -12761;sous cutané;negative;0;1;0;0;0;1 -12762;sous ensemble;positive;0;0;0;0;0;0 -12763;sous entendre;negative;0;0;0;0;0;0 -12764;sou entendre;positive;0;1;0;1;1;0 -12765;sous estimer;negative;0;0;0;0;1;0 -12766;sous marin;negative;0;1;0;0;0;0 -12767;sou payer|payer;negative;0;0;1;1;0;0 -12768;sous sol;negative;0;1;1;0;0;0 -12769;sous type;positive;0;0;0;0;0;0 -12770;sous vêtement;positive;0;0;0;0;0;0 -12771;souscripteur;positive;0;0;0;0;0;0 -12772;souscription;positive;0;0;0;0;0;0 -12773;souscrire;positive;0;0;0;0;0;0 -12774;soustraction;negative;0;0;0;0;0;0 -12775;soustraire;negative;0;0;0;0;0;0 -12776;soutenable;positive;0;0;0;0;0;0 -12777;soutenant;positive;0;0;0;0;0;0 -12778;souteneur;negative;0;1;0;0;0;1 -12779;soutenir;positive;0;0;0;0;0;0 -12780;souterrain;negative;0;1;0;0;0;0 -12781;souterrainne;negative;0;1;0;0;0;0 -12782;souterrainnes;negative;0;1;0;0;0;0 -12783;soutien;positive;0;0;0;0;0;0 -12784;soutirer;negative;0;0;0;0;0;0 -12785;souvenir;positive;0;0;0;0;0;0 -12786;souverain pontife;positive;0;0;0;0;0;0 -12787;souveraineté;positive;0;0;0;0;0;0 -12788;spa;positive;0;0;0;0;1;0 -12789;spasme;negative;0;1;0;0;0;0 -12790;spatule;positive;0;0;0;0;0;0 -12791;spécial;positive;1;0;0;0;0;0 -12792;spécialement;positive;0;0;0;0;0;0 -12793;spécialiser;positive;0;0;0;0;0;0 -12794;spécialiste;positive;0;0;0;0;0;0 -12795;spécialité;positive;0;0;0;0;0;0 -12796;spécification;positive;0;0;0;0;0;0 -12797;spécifique;positive;0;0;0;0;0;0 -12798;spécimen;positive;0;0;0;0;0;0 -12799;spectacle;positive;0;0;0;0;0;0 -12800;spectacle fabuleux;positive;1;0;0;0;0;0 -12801;spectaculaire;positive;0;0;0;0;1;0 -12802;spectre;negative;0;1;1;0;0;0 -12803;spectromètre;positive;0;0;0;0;0;0 -12804;spectrophotomètre;positive;0;0;0;0;0;0 -12805;spectroscopie;positive;0;0;0;0;0;0 -12806;spéculation;negative;0;1;1;0;0;0 -12807;spéculer;negative;0;0;0;0;0;0 -12808;spéculum;negative;0;1;0;0;0;1 -12809;spencer;positive;0;0;0;0;0;0 -12810;sperme;positive;0;0;0;0;0;1 -12811;sphère;positive;0;0;0;0;0;0 -12812;sphérique;positive;0;0;0;0;0;0 -12813;sphinx;positive;0;0;0;0;0;0 -12814;spinal;positive;0;0;0;0;0;0 -12815;spiral|spirale;positive;0;0;0;0;0;0 -12816;spiraler;positive;0;0;0;0;0;0 -12817;spiritualité;positive;0;0;0;0;0;0 -12818;spiritueux;negative;0;0;1;1;0;0 -12819;splendeur;positive;0;0;0;0;1;0 -12820;splendide;positive;0;0;0;0;1;0 -12821;spline;positive;0;0;0;0;0;0 -12822;spoiler;negative;0;1;1;1;0;0 -12823;sponsor;positive;0;0;0;0;0;0 -12824;sponsoring;positive;0;0;0;0;0;0 -12825;sponsoriser;positive;0;0;0;0;0;0 -12826;sporadique;negative;0;0;0;0;1;0 -12827;spore;negative;0;0;0;0;0;1 -12828;sport;positive;0;0;0;0;0;0 -12829;spray;positive;0;0;0;0;0;0 -12830;square;positive;0;0;0;0;0;0 -12831;squat;negative;0;1;0;0;0;0 -12832;squatter;negative;0;1;1;0;0;1 -12833;squelette;negative;0;1;1;0;0;0 -12834;stabilité;positive;0;0;0;0;0;0 -12835;stable;positive;0;1;0;0;1;0 -12836;staccato;negative;0;0;0;0;0;0 -12837;stade;positive;0;0;0;0;0;0 -12838;stagiaire;positive;0;0;0;0;0;0 -12839;stagner;negative;0;0;1;0;0;0 -12840;stagnant;negative;0;0;1;0;0;0 -12841;stagnation;negative;0;1;1;0;0;0 -12842;stalle;positive;0;0;0;0;0;1 -12843;stand;positive;0;0;0;0;0;1 -12844;standard;positive;0;0;0;0;0;0 -12845;standardiser;positive;0;0;0;0;0;0 -12846;star;positive;0;0;0;0;0;0 -12847;starter;negative;0;1;1;1;1;0 -12848;station;positive;0;0;0;0;0;0 -12849;stationnaire;positive;0;0;0;0;0;0 -12850;stationner;positive;0;0;0;0;0;0 -12851;statique;positive;0;0;0;0;0;0 -12852;statistique;positive;0;0;0;0;0;0 -12853;stator;positive;0;0;0;0;0;0 -12854;statuaire;positive;0;0;0;0;0;0 -12855;statue;positive;0;0;0;0;0;0 -12856;statuer sur;negative;0;1;0;0;0;0 -12857;statuette;positive;0;0;0;0;0;0 -12858;stature;positive;0;0;0;0;0;0 -12859;statut;positive;0;0;0;0;0;0 -12860;statutaire;positive;0;0;0;0;0;0 -12861;stellaire;positive;0;0;0;0;0;0 -12862;stencil;positive;0;0;0;0;0;0 -12863;sténo;positive;0;0;0;0;0;0 -12864;sténographie;positive;0;0;0;0;0;0 -12865;steppe;negative;0;1;1;0;0;0 -12866;stéréoscopique;positive;0;0;0;0;0;0 -12867;stéréotype;negative;0;0;0;0;0;1 -12868;stéréotyper;negative;0;0;0;0;0;1 -12869;stérile;negative;0;1;1;0;0;0 -12870;stériliser;positive;0;1;1;0;0;0 -12871;stérilité;negative;0;1;1;0;0;0 -12872;sterling;positive;0;0;0;1;0;0 -12873;sterne;positive;0;0;0;0;0;0 -12874;stéthoscope;positive;0;0;0;0;0;0 -12875;steward;positive;0;0;0;0;0;0 -12876;stigmate;negative;0;1;1;1;0;1 -12877;stimulant;positive;0;0;0;0;0;0 -12878;stimulation;positive;1;0;0;0;0;0 -12879;stimuler;positive;0;0;0;0;0;0 -12880;stimulus;positive;0;0;0;0;0;0 -12881;stipulation;positive;0;0;0;0;0;0 -12882;stipuler;positive;0;0;0;0;0;0 -12883;stock;positive;0;0;0;0;0;0 -12884;stockage;positive;0;0;0;0;0;0 -12885;stocker;positive;0;0;0;0;0;0 -12886;stoïque;positive;0;0;0;0;0;0 -12887;stratège;positive;0;0;0;0;0;0 -12888;stratégie;positive;0;0;0;0;0;0 -12889;stratégique;positive;0;0;0;0;0;0 -12890;stratification;positive;0;0;0;0;0;0 -12891;stratus;negative;0;0;1;0;0;0 -12892;stress;negative;0;1;0;1;0;0 -12893;stresser;negative;0;1;1;1;0;0 -12894;stressant;negative;0;1;1;1;0;0 -12895;strict;negative;0;0;1;0;0;0 -12896;strident;negative;0;1;0;1;1;0 -12897;strie;negative;0;0;0;0;0;0 -12898;strier;positive;0;0;0;0;0;0 -12899;stroboscopique;positive;0;0;0;0;0;0 -12900;strophe;positive;0;0;0;0;0;0 -12901;structure;positive;0;0;0;0;0;0 -12902;structurer;positive;0;0;0;0;0;0 -12903;stuc;positive;0;0;0;0;0;0 -12904;studio;positive;0;0;0;0;0;0 -12905;stupéfaction;positive;0;0;0;0;1;0 -12906;stupéfaire;negative;0;1;0;0;1;1 -12907;stupéfiant;negative;0;0;0;0;1;0 -12908;stupéfier;positive;0;0;0;0;1;0 -12909;stupide;negative;0;0;0;1;0;1 -12910;stupidité;negative;0;0;0;1;0;1 -12911;style;positive;0;0;0;0;0;0 -12912;stylet;negative;0;1;0;0;0;0 -12913;stylo;positive;0;0;0;0;0;0 -12914;suaire;negative;0;0;1;0;0;0 -12915;suer;negative;0;0;0;0;0;1 -12916;suavité;positive;0;0;0;0;0;0 -12917;subalterne;negative;0;0;1;0;0;1 -12918;subatomique;positive;0;0;0;0;0;0 -12919;subconscient;negative;0;0;0;0;0;0 -12920;subdiviser;positive;0;0;0;0;0;0 -12921;subdivision;positive;0;0;0;0;0;0 -12922;subduction;positive;0;0;0;0;0;0 -12923;subir;negative;0;0;1;0;0;0 -12924;subito;positive;0;0;0;0;1;0 -12925;sublimation;positive;1;0;0;0;0;0 -12926;subliminal;negative;0;0;0;0;1;0 -12927;submerger;negative;0;1;1;0;1;0 -12928;submersible;negative;0;1;0;0;0;0 -12929;submersion;negative;0;1;0;0;0;0 -12930;subordination;negative;0;0;0;0;0;0 -12931;subsidiaire;negative;0;0;0;0;0;0 -12932;subsistance;positive;1;0;0;0;0;0 -12933;subsister;positive;0;0;0;0;0;0 -12934;substance;positive;0;0;0;0;0;0 -12935;substantiellement;positive;0;0;0;0;0;0 -12936;substituer;negative;0;0;0;0;0;0 -12937;substitut;negative;0;0;0;0;0;0 -12938;substitution;negative;0;0;0;0;0;0 -12939;subtil;positive;0;0;0;0;1;0 -12940;subvenir;positive;0;0;0;0;0;0 -12941;subvention;positive;0;0;0;1;0;1 -12942;subventionner;positive;0;0;0;0;0;0 -12943;subversion;negative;0;1;0;1;0;0 -12944;subvertir;negative;0;1;1;0;0;1 -12945;sucer;negative;0;0;0;0;0;0 -12946;succès;positive;1;0;0;0;0;0 -12947;successeur;positive;0;0;0;0;0;0 -12948;succession;positive;0;0;0;0;0;0 -12949;succinct;positive;0;0;0;0;0;0 -12950;succion;negative;0;1;0;0;0;0 -12951;succomber;negative;0;1;1;0;0;0 -12952;succulent;positive;1;0;0;0;0;0 -12953;succursale;positive;0;0;0;0;0;0 -12954;sucette;positive;0;0;0;1;0;0 -12955;sucre;positive;0;0;0;0;0;0 -12956;sucrer;positive;0;0;0;0;1;0 -12957;sucrerie;positive;1;0;0;0;0;0 -12958;sudation;negative;0;0;0;0;0;1 -12959;sueur;negative;0;1;0;0;0;1 -12960;suffire;positive;0;0;0;0;0;0 -12961;suffisamment;positive;0;0;0;0;0;0 -12962;suffisance;negative;0;0;0;1;0;0 -12963;suffisant;positive;0;0;0;0;0;1 -12964;suffixe;positive;0;0;0;0;0;0 -12965;suffocant;negative;0;1;1;0;0;1 -12966;suffocation;negative;0;1;0;1;0;0 -12967;suggérer;positive;0;0;0;0;0;0 -12968;suggestion;positive;0;0;0;0;0;0 -12969;suicidaire;negative;0;1;1;1;0;1 -12970;suicide;negative;0;1;1;1;0;0 -12971;suicider;negative;0;1;1;1;0;0 -12972;suie;negative;0;0;0;0;0;1 -12973;suif;positive;0;0;0;0;0;0 -12974;suintement;negative;0;0;0;0;0;1 -12975;suinter;negative;0;0;0;0;0;1 -12976;suivant;negative;0;0;0;0;0;0 -12977;suivant|suivante;negative;0;0;0;0;0;0 -12978;suivre;positive;0;0;0;0;0;0 -12979;suivre à le trace;positive;0;0;0;0;0;0 -12980;suivre le trace de;positive;0;0;0;0;0;0 -12981;sujet;negative;0;0;1;1;0;1 -12982;sujétion;negative;0;1;1;0;0;0 -12983;sultan;positive;0;1;0;0;0;0 -12984;sumo;negative;0;1;0;0;0;0 -12985;super;positive;0;1;1;1;1;0 -12986;superbe;positive;1;0;0;0;0;0 -12987;superficie;positive;0;0;0;0;0;0 -12988;supériorité;positive;0;0;0;0;0;0 -12989;superlatif;positive;0;0;0;0;0;0 -12990;superman;positive;0;0;0;0;0;0 -12991;supermarché;positive;0;0;0;0;0;0 -12992;superposer;positive;0;0;0;0;0;0 -12993;superposition;positive;0;0;0;0;0;0 -12994;superstar;positive;0;0;0;0;0;0 -12995;superstition;negative;0;1;0;0;0;0 -12996;superviser;positive;0;0;0;0;0;0 -12997;superviseur;positive;0;0;0;0;0;0 -12998;supllier;negative;0;0;1;0;0;0 -12999;supplanter;positive;0;0;0;0;0;0 -13000;supplément;positive;0;0;1;1;0;1 -13001;supplémentaire;positive;0;0;0;0;0;0 -13002;supplication;positive;0;0;0;0;0;0 -13003;supplice;negative;0;1;1;1;1;0 -13004;support;positive;0;0;0;0;0;0 -13005;supporter qch;positive;0;0;0;0;0;0 -13006;supporteur;positive;0;0;0;0;0;0 -13007;supposer;negative;0;1;0;0;0;0 -13008;suppression;negative;0;1;1;1;0;1 -13009;supprimer;negative;0;1;1;1;0;0 -13010;suprématie;positive;0;1;0;1;1;0 -13011;suprême;positive;0;0;0;0;0;0 -13012;suprêmement;positive;0;0;0;0;0;0 -13013;sur ce;positive;0;0;0;0;0;0 -13014;sur qui on ne pouvoir compter;negative;0;1;0;1;0;0 -13015;sur le champ;positive;0;0;0;0;1;0 -13016;surabondance;negative;0;0;0;0;0;1 -13017;surcharge;negative;0;0;1;0;0;0 -13018;surcharger;negative;0;0;1;0;0;0 -13019;surdité;negative;0;1;1;0;0;0 -13020;surestimer;negative;0;0;0;0;1;0 -13021;sûreté;positive;0;0;0;0;0;0 -13022;surf;positive;0;0;0;0;0;0 -13023;surface;positive;0;0;0;0;0;0 -13024;surfacturé;negative;0;0;1;0;0;0 -13025;surfacturée;negative;0;0;1;0;0;0 -13026;surfacturées;negative;0;0;1;0;0;0 -13027;surfacturés;negative;0;0;1;0;0;0 -13028;surfer;positive;0;0;0;0;0;0 -13029;surgir;positive;0;0;0;0;1;0 -13030;surhomme;positive;0;0;0;0;0;0 -13031;surhumain;positive;0;0;0;0;0;0 -13032;surintendant;positive;0;0;0;0;0;0 -13033;surintendante;positive;0;0;0;0;0;0 -13034;surmenage;negative;0;1;1;0;0;0 -13035;surnageant;positive;0;0;0;0;0;0 -13036;surnom;positive;0;0;0;0;0;0 -13037;surnommer;positive;0;0;0;0;0;0 -13038;surpasser;positive;0;0;0;0;0;0 -13039;surpasser en nombre;positive;0;0;0;0;0;0 -13040;surpayer|surpayer;negative;0;0;0;0;0;0 -13041;surplomber;positive;0;0;0;0;0;0 -13042;surplombant;positive;0;0;0;0;0;0 -13043;surplus;negative;0;0;0;0;0;0 -13044;surprenant;positive;0;0;0;0;1;0 -13045;surseoir;positive;0;0;0;0;0;0 -13046;surstocker;negative;0;0;0;0;0;0 -13047;surtaxe;negative;0;0;1;1;0;1 -13048;surtout;positive;0;0;0;0;0;0 -13049;survaleur;positive;1;0;0;0;0;0 -13050;surveillance;positive;0;1;1;0;0;0 -13051;surveiller pénitentiaire;negative;0;1;0;1;0;0 -13052;surveillant pénitentiaire;negative;0;1;0;1;0;0 -13053;surveiller;positive;0;1;0;0;0;0 -13054;survenir;positive;0;0;0;0;1;0 -13055;survie;positive;0;0;0;0;0;0 -13056;survivant;positive;1;0;0;0;0;0 -13057;survivre;positive;1;0;0;0;0;0 -13058;survivre à;positive;1;0;0;0;0;0 -13059;susceptibilité;negative;0;0;1;0;0;0 -13060;susceptible;negative;0;1;1;1;0;0 -13061;susdit;positive;0;0;0;0;0;0 -13062;susmentionné;positive;0;0;0;0;0;0 -13063;suspect;negative;0;1;0;0;0;0 -13064;suspecter;negative;0;1;0;0;0;0 -13065;suspendre;negative;0;0;1;0;1;0 -13066;suspense;negative;0;1;0;0;1;0 -13067;suspension;negative;0;1;0;0;0;0 -13068;suspicieux;negative;0;1;0;1;0;0 -13069;suspicion;negative;0;1;0;0;0;0 -13070;suture;negative;0;1;0;0;0;1 -13071;suturer qch;negative;0;0;0;0;0;0 -13072;svastika;negative;0;1;0;1;0;1 -13073;svelte;positive;0;0;0;0;0;0 -13074;swag;positive;0;0;0;0;0;0 -13075;swastika;negative;0;1;0;1;0;1 -13076;syllabe;positive;0;0;0;0;0;0 -13077;syllabique;positive;0;0;0;0;0;0 -13078;symbole;positive;0;0;0;0;0;0 -13079;symbolique;positive;0;0;0;0;0;0 -13080;symboliquement;positive;0;0;0;0;0;0 -13081;symboliser;positive;0;0;0;0;0;0 -13082;symbolisme;positive;0;0;0;0;0;0 -13083;symétrie;positive;0;0;0;0;0;0 -13084;symétrique;positive;0;0;0;0;0;0 -13085;sympathique;positive;0;0;0;0;0;0 -13086;symphonie;positive;1;0;0;0;0;0 -13087;symptomatique;negative;0;0;1;0;0;0 -13088;symptôme;negative;0;1;0;0;0;0 -13089;synagogue;positive;0;0;0;0;0;0 -13090;synchrone;positive;0;0;0;0;0;0 -13091;synchroniser;positive;0;0;0;0;1;0 -13092;syncope;negative;0;1;1;0;1;0 -13093;syndicat;positive;0;0;0;0;0;0 -13094;synergie;positive;0;0;0;0;0;0 -13095;synode;positive;0;0;0;0;0;0 -13096;synonyme;positive;0;1;0;0;0;0 -13097;synopsis;positive;0;0;0;0;0;0 -13098;synoptique;positive;0;0;0;0;0;0 -13099;syntaxe;positive;0;0;0;0;0;0 -13100;synthèse;positive;0;0;0;0;0;0 -13101;synthétique;negative;0;0;0;0;0;1 -13102;systématique;positive;0;0;0;0;0;0 -13103;systématiquement;positive;0;0;0;0;0;0 -13104;système;positive;0;0;0;0;0;0 -13105;système hydraulique;negative;0;0;1;0;0;0 -13106;tabac;negative;0;0;0;0;0;1 -13107;tabac à priser;negative;0;0;0;0;1;1 -13108;tabagisme;negative;0;0;0;0;0;1 -13109;tabernacle;positive;0;0;0;0;0;0 -13110;table;positive;0;0;0;0;0;0 -13111;tableau;positive;0;0;0;0;0;0 -13112;tableau de bord;positive;0;0;0;0;0;0 -13113;tableau noir;positive;0;0;0;0;0;0 -13114;tablette;positive;0;0;0;0;0;0 -13115;tablier;positive;0;0;0;0;0;0 -13116;tabou;negative;0;1;0;0;0;1 -13117;tabouret;positive;0;0;0;0;0;0 -13118;tabulaire;positive;0;0;0;0;0;0 -13119;tabulation;positive;0;0;0;0;0;0 -13120;tabuler;positive;0;0;0;0;0;0 -13121;tache;negative;0;1;1;1;0;1 -13122;tâche;negative;0;1;1;0;0;1 -13123;tacher;negative;0;1;1;0;0;1 -13124;tâcher de;positive;0;0;0;0;0;0 -13125;tacheter;negative;0;0;0;0;0;0 -13126;tachymètre;positive;0;0;0;0;0;0 -13127;tacite;positive;0;0;0;0;0;0 -13128;tacot;negative;0;1;0;1;1;0 -13129;tact;positive;0;0;0;0;0;0 -13130;tactile;positive;0;0;0;0;0;0 -13131;tactique;positive;0;1;0;0;0;0 -13132;taffetas;positive;0;0;0;0;0;0 -13133;taie d oreiller;positive;0;0;0;0;0;0 -13134;taillader;negative;0;1;1;1;0;1 -13135;taillant;positive;0;0;0;0;0;0 -13136;taille;positive;0;0;0;0;0;0 -13137;tailler;negative;0;1;0;0;0;0 -13138;taille haie;negative;0;0;0;0;0;0 -13139;tailleur;positive;0;0;0;0;0;0 -13140;tailleuse;positive;0;0;0;0;0;0 -13141;taire;negative;0;1;1;1;0;1 -13142;talent;positive;0;0;0;0;0;0 -13143;talisman;positive;0;0;0;0;0;0 -13144;talon;positive;0;0;0;0;0;0 -13145;talus;positive;0;0;0;0;0;0 -13146;tambour;positive;0;0;0;0;0;0 -13147;tambourin;negative;0;0;0;0;0;0 -13148;tambourinement;positive;0;0;0;0;0;0 -13149;tambouriner;positive;0;0;0;0;0;0 -13150;tamis;positive;0;0;0;0;0;0 -13151;tamisage;positive;0;0;0;0;0;0 -13152;tamiser;negative;0;0;1;0;0;0 -13153;tampon;positive;0;0;0;0;0;1 -13154;tamponner;positive;0;0;0;0;0;0 -13155;tandem;positive;0;0;0;0;0;0 -13156;tangent;negative;0;0;0;0;0;0 -13157;tanière;positive;0;0;0;0;0;0 -13158;tanner;positive;0;0;0;0;0;0 -13159;tante;positive;0;0;0;0;0;0 -13160;taper;positive;0;0;0;0;0;0 -13161;tapir;negative;0;0;0;0;0;0 -13162;tapir de course;positive;0;0;0;0;0;0 -13163;tapis roulant;positive;0;0;0;0;0;0 -13164;tapisserie;positive;0;0;0;0;0;0 -13165;tapoter;positive;0;0;0;0;0;0 -13166;taquiner;positive;0;0;1;1;0;0 -13167;taquinerie;negative;0;1;0;1;0;0 -13168;tarer;negative;0;1;0;0;0;1 -13169;tarif;negative;0;0;1;1;0;1 -13170;tartan;positive;0;0;0;0;0;0 -13171;tarte;positive;0;0;0;0;0;0 -13172;tartre;negative;0;0;0;0;0;1 -13173;tas;positive;0;0;0;0;0;1 -13174;tasse;positive;0;0;0;0;0;0 -13175;tassement;negative;0;0;1;0;0;0 -13176;tatami;negative;0;0;0;0;0;0 -13177;tâtonner;negative;0;1;0;0;0;0 -13178;tatouage;positive;0;0;0;0;0;0 -13179;tatouer;positive;0;0;0;0;0;0 -13180;taudis;negative;0;1;1;0;0;1 -13181;taureau;negative;0;1;0;0;0;0 -13182;tau|taux;positive;0;0;0;0;0;0 -13183;taverne;positive;0;0;0;0;0;0 -13184;taxe;negative;0;0;1;1;0;0 -13185;taxer;negative;0;0;1;1;0;0 -13186;taxi;positive;0;0;0;0;0;0 -13187;taxinomie;positive;0;0;0;0;0;0 -13188;taxonomie;positive;0;0;0;0;0;0 -13189;teaser;positive;0;0;0;0;0;0 -13190;technicité;positive;0;0;0;0;0;0 -13191;technique;positive;0;0;0;0;0;0 -13192;technologie;positive;0;0;0;0;0;0 -13193;ted;positive;0;0;0;0;0;0 -13194;teflon;positive;0;0;0;0;0;0 -13195;téflon;positive;0;0;0;0;0;0 -13196;teindre;positive;0;0;0;0;0;0 -13197;teinte;positive;0;0;0;0;0;0 -13198;teinter;positive;0;0;0;0;0;0 -13199;teinture;positive;0;0;0;0;0;0 -13200;télégramme;positive;0;0;0;0;0;0 -13201;télégraphe;positive;0;0;0;0;0;0 -13202;téléphone;positive;0;0;0;0;0;0 -13203;téléphoner;positive;0;0;0;0;0;0 -13204;télescope;positive;0;0;0;0;0;0 -13205;téléscope;positive;0;0;0;0;0;0 -13206;télescopique;positive;0;0;0;0;0;0 -13207;téléscripteur;positive;0;0;0;0;0;0 -13208;télévision;positive;0;0;0;0;0;0 -13209;téméraire;positive;0;1;0;1;0;0 -13210;témérité;negative;0;1;0;1;1;1 -13211;témoignage;positive;0;0;0;0;0;0 -13212;témoigner;positive;0;0;0;0;0;0 -13213;témoigner de le sympathie;positive;0;0;1;0;0;0 -13214;témoin;positive;0;0;0;0;0;0 -13215;témoin oculaire;positive;0;0;0;0;0;0 -13216;tempera;positive;0;0;0;0;0;0 -13217;tempérer;positive;0;0;0;0;0;0 -13218;tempérament;positive;0;0;0;0;0;0 -13219;tempérance;positive;0;0;0;0;0;0 -13220;température;positive;0;0;0;0;0;0 -13221;tempête;negative;0;1;1;1;1;0 -13222;temple;positive;0;0;0;0;0;0 -13223;temporaire;negative;0;0;0;0;0;0 -13224;temporairement;negative;0;0;0;0;0;0 -13225;temporal;positive;0;0;0;0;0;0 -13226;temporisation;negative;0;1;1;0;0;0 -13227;temps;positive;0;0;0;0;0;0 -13228;ténacité;positive;0;0;0;0;0;0 -13229;tendon;positive;0;0;0;0;0;0 -13230;tendre;positive;0;0;0;0;0;0 -13231;tendre un embuscade à;negative;0;1;0;1;1;0 -13232;tendresse;positive;0;0;0;0;0;0 -13233;ténèbre;negative;0;1;1;1;0;0 -13234;teneur;positive;0;0;0;0;0;0 -13235;tenir;positive;0;0;0;0;0;0 -13236;tenir compte de;positive;0;0;0;0;0;0 -13237;tenir en laisse;negative;0;1;1;0;0;0 -13238;tennis;positive;0;0;0;0;0;0 -13239;tension;negative;0;1;0;1;0;0 -13240;tentacule;negative;0;1;0;0;0;1 -13241;tenter;positive;0;0;0;0;1;0 -13242;tentant;positive;0;0;0;0;1;0 -13243;tentation;negative;0;0;0;0;0;0 -13244;tentative;positive;0;0;0;0;0;0 -13245;tente;positive;0;0;0;0;0;0 -13246;tenture;positive;0;0;0;0;0;0 -13247;ténu;negative;0;1;1;0;0;0 -13248;tenue;positive;0;0;0;0;0;0 -13249;tercet;positive;0;0;0;0;0;0 -13250;terme;positive;0;0;1;0;0;0 -13251;terminal;positive;0;1;1;0;0;0 -13252;terminus;negative;0;1;1;0;0;0 -13253;termite;negative;0;0;0;0;0;1 -13254;ternaire;positive;0;0;0;0;0;0 -13255;terne;negative;0;0;1;0;0;1 -13256;ternir;negative;0;0;1;0;0;1 -13257;terrain;positive;0;1;1;1;1;0 -13258;terrasse;positive;0;0;0;0;0;0 -13259;terre;positive;0;0;0;0;0;0 -13260;terreau;positive;0;0;0;0;0;0 -13261;terre boisé;positive;0;0;0;0;0;0 -13262;terreur;negative;0;1;1;1;0;0 -13263;terreux;positive;0;0;0;0;0;0 -13264;terrible;negative;0;1;1;1;1;1 -13265;terriblement;negative;0;1;1;1;1;1 -13266;terrier;negative;0;0;0;0;0;0 -13267;terrifier;negative;0;1;1;1;1;1 -13268;terrifiant;negative;0;1;1;1;0;1 -13269;territoire;positive;0;0;0;0;0;0 -13270;territorial;positive;0;0;0;0;0;0 -13271;terroriser;negative;0;1;1;1;1;1 -13272;terrorisme;negative;0;1;1;1;0;1 -13273;terroriste;negative;0;1;1;1;1;1 -13274;tertiaire;positive;0;0;0;0;0;0 -13275;tertre;negative;0;0;0;0;0;1 -13276;test;positive;0;0;0;0;0;0 -13277;testament;positive;0;0;0;0;0;0 -13278;tester;positive;0;0;0;0;0;0 -13279;tétanos;negative;0;1;0;0;0;1 -13280;tête;positive;0;0;0;0;0;0 -13281;tête baisser;negative;0;0;0;1;1;0 -13282;tête de n?ud;negative;0;0;0;1;0;1 -13283;tête de puits;positive;0;0;0;0;0;0 -13284;téter;positive;0;0;0;0;0;0 -13285;tétine;positive;0;0;0;0;0;0 -13286;téton;positive;0;0;0;0;0;0 -13287;tétraédrique;positive;0;0;0;0;0;0 -13288;tétu;negative;0;0;0;1;0;0 -13289;texte;positive;0;0;0;0;0;0 -13290;texte sacré;positive;0;0;0;0;0;0 -13291;texte standard;negative;0;0;0;0;0;0 -13292;textile;positive;0;0;0;0;0;0 -13293;texto;positive;0;0;0;0;0;0 -13294;textuellement;positive;0;0;0;0;0;0 -13295;textural;positive;0;0;0;0;0;0 -13296;texturale;positive;0;0;0;0;0;0 -13297;texturales;positive;0;0;0;0;0;0 -13298;texturaux;positive;0;0;0;0;0;0 -13299;texture;positive;0;0;0;0;0;0 -13300;thanksgiving;positive;0;0;0;0;0;0 -13301;thé;positive;0;0;0;0;0;0 -13302;théâtral;negative;0;0;0;0;0;0 -13303;théâtre;positive;1;0;0;0;0;0 -13304;théisme;negative;0;0;0;0;0;1 -13305;thème;positive;0;0;0;0;0;0 -13306;thème majeur;positive;0;0;0;0;0;0 -13307;théocratie;positive;0;0;0;0;0;0 -13308;théocratique;negative;0;1;1;1;0;0 -13309;théologie;positive;0;0;0;0;0;0 -13310;théologique;positive;0;0;0;0;0;0 -13311;théorème;positive;0;0;0;0;0;0 -13312;théorie;positive;0;0;0;0;0;0 -13313;théorique;negative;0;0;0;0;0;0 -13314;thérapeutique;positive;0;0;0;0;0;0 -13315;thermique;positive;0;0;0;0;0;0 -13316;thermocouple;positive;0;0;0;0;0;0 -13317;thermodynamique;positive;0;0;0;0;0;0 -13318;thermomètre;positive;0;0;0;0;0;0 -13319;thermostat;positive;0;0;0;0;0;0 -13320;thèse;positive;0;0;0;0;0;0 -13321;thon;negative;0;0;0;0;0;0 -13322;thym;positive;0;0;0;0;0;0 -13323;tiare;positive;0;0;0;0;0;0 -13324;tibia;positive;0;0;0;0;0;0 -13325;tic;negative;0;1;0;0;1;0 -13326;ticket;positive;0;0;0;0;0;0 -13327;ticket de caisse;positive;0;0;0;0;0;0 -13328;tiède;negative;0;0;0;0;0;0 -13329;tiers;positive;0;0;0;0;0;0 -13330;tige;positive;0;1;0;0;0;0 -13331;tigre;negative;0;1;0;0;0;0 -13332;tigrer;positive;0;0;0;0;0;0 -13333;tilde;positive;0;0;0;0;0;0 -13334;timbre;positive;0;0;0;0;0;0 -13335;timbrer;negative;0;1;0;0;1;1 -13336;timide;negative;0;1;1;0;0;0 -13337;timidité;negative;0;1;1;0;0;0 -13338;tintement;positive;0;0;0;0;1;0 -13339;tinter;positive;1;0;0;0;0;0 -13340;tique;negative;0;0;0;0;0;0 -13341;tir;negative;0;1;1;1;1;0 -13342;tir à l arc;positive;0;0;0;0;0;0 -13343;tirage;positive;0;0;0;0;0;0 -13344;tirant;negative;0;1;1;1;0;0 -13345;tirer bouchon;positive;0;0;0;0;0;0 -13346;tirer à pile ou face;negative;0;1;0;0;1;0 -13347;tirer profit;positive;1;0;0;0;0;0 -13348;tirer profit de;positive;0;0;0;0;0;0 -13349;tiret;negative;0;1;1;0;0;0 -13350;tireur;negative;0;1;0;1;1;0 -13351;tiroir;positive;0;0;0;0;0;0 -13352;tisser;positive;0;0;0;0;0;0 -13353;tissu;positive;0;0;1;0;0;1 -13354;titanesque;negative;0;1;0;0;0;0 -13355;titre;positive;0;0;0;0;0;0 -13356;titrer;positive;0;0;0;0;0;0 -13357;titulaire;positive;0;0;0;0;0;0 -13358;titularisation;positive;0;0;0;0;0;0 -13359;toast;positive;1;0;0;0;0;0 -13360;toboggan;positive;0;1;0;0;1;0 -13361;toge;positive;0;0;0;0;0;0 -13362;toile;positive;0;0;0;0;0;0 -13363;toile de jute;negative;0;0;0;0;0;0 -13364;toilette;negative;0;0;0;0;0;1 -13365;toiletter;positive;0;0;0;0;0;0 -13366;toilette extérieur;negative;0;0;0;0;0;1 -13367;toison;positive;0;0;1;1;0;1 -13368;toit;positive;0;0;0;0;0;0 -13369;tolérer;positive;0;0;0;0;0;0 -13370;tolérant;positive;0;0;0;0;0;0 -13371;tollé;negative;0;1;0;1;1;1 -13372;tomahawk;positive;0;0;0;0;0;0 -13373;tomber;negative;0;1;1;0;0;0 -13374;tombant;negative;0;0;1;0;0;0 -13375;tombe;negative;0;1;1;0;0;0 -13376;tombeau;negative;0;1;1;0;0;0 -13377;tomber de le nuit;negative;0;1;1;0;0;0 -13378;tomber en flocon;negative;0;0;0;0;0;0 -13379;tomber en pâmoison;positive;1;0;0;0;0;0 -13380;tomber goutte à goutte;negative;0;0;0;0;0;1 -13381;tomber nez à nez;positive;0;0;0;0;1;0 -13382;tomber sur;positive;0;0;0;0;1;0 -13383;tombeur;positive;0;0;0;0;0;0 -13384;tombola;positive;0;0;0;0;1;0 -13385;tome;positive;0;0;0;0;0;0 -13386;ton;positive;0;0;0;0;0;0 -13387;ton monotone;negative;0;1;0;0;0;1 -13388;tondeur|tondeuse;negative;0;1;0;0;0;0 -13389;tondre;negative;0;1;0;0;0;0 -13390;tonifiant;positive;1;0;0;0;0;0 -13391;tonique;positive;1;0;0;0;0;0 -13392;tonitruer;negative;0;1;0;1;1;0 -13393;tonitruant;negative;0;1;0;1;1;0 -13394;tonnage;negative;0;0;0;0;0;0 -13395;tonne;negative;0;0;0;0;0;0 -13396;tonneau;positive;0;0;0;0;0;0 -13397;tonnelet;positive;0;0;0;0;0;0 -13398;tonnelle;positive;0;0;0;0;0;0 -13399;tonner;negative;0;1;0;1;1;0 -13400;tonnerre;negative;0;1;0;1;1;0 -13401;tonton;positive;0;0;0;0;0;0 -13402;topaze;positive;0;0;0;0;0;0 -13403;topographie;positive;0;0;0;0;0;0 -13404;topographique;positive;0;0;0;0;0;0 -13405;toquade;negative;0;0;0;0;0;0 -13406;toquer;negative;0;1;0;0;1;0 -13407;torche;positive;0;0;0;0;0;0 -13408;tordre;negative;0;1;0;1;0;0 -13409;tornade;negative;0;1;0;1;0;0 -13410;torpille;negative;0;1;0;1;0;0 -13411;torpiller;negative;0;1;0;1;0;0 -13412;torrent;negative;0;1;0;1;0;0 -13413;torsader;positive;0;0;0;0;0;0 -13414;torse;positive;0;0;0;0;0;0 -13415;torsion;negative;0;1;0;0;0;0 -13416;tort;negative;0;1;1;1;0;1 -13417;tortue;positive;0;0;0;0;0;0 -13418;torture;negative;0;1;1;1;0;1 -13419;torturer;negative;0;1;1;1;0;1 -13420;total;negative;0;0;0;0;0;0 -13421;totalement;positive;0;0;0;0;0;0 -13422;totalité;positive;0;0;0;0;0;0 -13423;totem;positive;0;0;0;0;0;0 -13424;touche;positive;0;0;0;0;0;0 -13425;toucher;positive;0;0;1;0;0;0 -13426;toucher par;negative;0;0;1;0;0;0 -13427;touffe;negative;0;0;0;0;0;0 -13428;touffu;negative;0;0;0;0;0;1 -13429;tour;positive;0;0;0;1;1;1 -13430;tour de main;positive;0;0;0;0;0;0 -13431;tour de taille;positive;0;0;0;0;0;0 -13432;tourbe;negative;0;0;0;0;0;1 -13433;tourbier|tourbière;negative;0;1;0;0;0;1 -13434;tourbillon;negative;0;1;0;0;1;0 -13435;tourbillonner;negative;0;1;0;0;1;0 -13436;tourelle;positive;0;0;0;0;0;0 -13437;touriste;positive;0;0;0;0;0;0 -13438;touristique;positive;0;0;0;0;0;0 -13439;tourmaline;positive;0;0;0;0;0;0 -13440;tourment;negative;0;1;1;1;0;0 -13441;tourmente;negative;0;1;1;1;0;0 -13442;tourmenter;negative;0;1;1;1;0;0 -13443;tournage;negative;0;1;0;1;0;0 -13444;tournant;negative;0;1;0;0;0;0 -13445;tourner autour de;positive;0;0;0;0;0;0 -13446;tournante;negative;0;1;0;0;0;0 -13447;tournée;positive;0;0;0;0;0;0 -13448;tournevis;positive;0;0;0;0;0;0 -13449;tournoi;positive;0;0;0;0;0;0 -13450;tournure;positive;0;0;0;0;0;0 -13451;tout le an;positive;0;0;0;0;0;0 -13452;tout le jour;positive;0;0;0;0;0;0 -13453;tout le quinze jour;positive;0;0;0;0;0;0 -13454;tousser;negative;0;0;0;0;0;1 -13455;tout à coup;negative;0;1;0;0;1;0 -13456;tout à fait;positive;0;0;0;0;0;0 -13457;tout autour;positive;0;0;0;0;0;0 -13458;tout comprendre;positive;0;0;0;0;0;0 -13459;tout de suite;positive;0;0;0;0;0;0 -13460;tout puissance;positive;0;1;0;0;0;0 -13461;tout le heure;positive;0;0;0;0;0;0 -13462;tout le semaine;positive;0;0;0;0;0;0 -13463;toux;negative;0;0;0;0;0;1 -13464;toxicologie;positive;0;0;0;0;0;0 -13465;toxine;negative;0;1;0;0;0;0 -13466;toxique;negative;0;1;1;1;1;1 -13467;tracer;positive;0;0;0;0;0;0 -13468;tracas;negative;0;1;1;1;0;0 -13469;tracasser;negative;0;1;1;1;0;0 -13470;tracassant;negative;0;1;1;1;0;0 -13471;trace;negative;0;0;0;0;0;1 -13472;tracé;positive;0;0;0;0;0;0 -13473;tracer du ligne;positive;0;0;0;0;0;0 -13474;trachée;positive;0;0;0;0;0;0 -13475;tract;positive;0;1;0;0;0;0 -13476;tracter;positive;0;0;0;0;0;0 -13477;tracteur;positive;0;0;0;0;0;0 -13478;traction;positive;0;0;0;0;0;0 -13479;tradition;positive;0;0;0;0;0;0 -13480;traditionnel;positive;0;0;0;0;0;0 -13481;traduction;positive;0;0;0;0;0;0 -13482;Traductionse;negative;0;0;0;0;0;0 -13483;Traductionses;negative;0;0;0;0;0;0 -13484;Traductionss;negative;0;0;0;0;0;0 -13485;traduire;positive;0;0;0;0;0;0 -13486;trafic;negative;0;0;1;0;0;0 -13487;tragédie;negative;0;1;1;0;1;0 -13488;tragique;negative;0;1;1;0;1;0 -13489;trahir;negative;0;0;1;1;1;1 -13490;trahison;negative;0;1;1;1;1;1 -13491;train;positive;0;0;0;0;0;0 -13492;train en marche;positive;0;0;0;0;0;0 -13493;traîneau;positive;1;0;0;0;0;0 -13494;traîner;negative;0;1;1;1;0;1 -13495;traîner le pied;negative;0;0;1;0;0;0 -13496;trait;positive;0;0;0;0;0;0 -13497;traire d union;positive;0;0;0;0;0;0 -13498;traiter;positive;0;0;0;0;0;0 -13499;traitement;positive;0;0;0;0;0;0 -13500;traiter avec condescendance;negative;0;0;0;0;0;1 -13501;traiteur;positive;0;0;0;0;0;0 -13502;traîtrise;negative;0;1;1;1;1;0 -13503;trajectoire;positive;0;0;0;0;0;0 -13504;tram;positive;0;0;0;0;0;0 -13505;tramway;positive;0;0;0;0;0;0 -13506;tranchant;negative;0;1;1;1;0;1 -13507;tranche;negative;0;0;0;0;0;0 -13508;trancher;negative;0;1;0;0;0;0 -13509;tranquille;positive;0;0;1;0;0;0 -13510;tranquillement;positive;1;0;0;0;0;0 -13511;tranquillité;positive;0;1;1;0;0;0 -13512;transatlantique;positive;0;0;0;0;0;0 -13513;transcendance;positive;0;0;0;0;1;0 -13514;transcender;positive;0;0;0;0;0;0 -13515;transcendantal;positive;0;0;0;0;0;0 -13516;transcendant;positive;0;0;0;0;0;0 -13517;transcendentaux;positive;0;0;0;0;0;0 -13518;transcripteur;positive;0;0;0;0;0;0 -13519;transcription;positive;0;0;0;0;0;0 -13520;transcrire;positive;0;0;0;0;0;0 -13521;transe;negative;0;1;0;0;0;0 -13522;transférer;positive;0;0;0;0;0;0 -13523;transfert;positive;0;0;0;0;0;0 -13524;transfert de propriété;positive;0;0;0;0;0;0 -13525;transformation;negative;0;1;1;0;0;0 -13526;transformer;positive;0;0;0;0;0;0 -13527;transfusion;positive;0;0;0;0;0;0 -13528;transgression;negative;0;1;1;1;0;0 -13529;transir;positive;0;0;0;0;0;0 -13530;transiter;positive;0;0;0;0;0;0 -13531;transition;positive;0;0;0;0;0;0 -13532;transitoire;negative;0;0;1;0;1;0 -13533;translocation;positive;0;0;0;0;0;0 -13534;translucide;negative;0;1;1;0;0;0 -13535;transmettre;positive;0;0;0;0;0;0 -13536;transmissible;negative;0;1;0;0;0;0 -13537;transmission;positive;0;0;0;0;0;0 -13538;transmutation;positive;0;0;0;0;0;0 -13539;transparence;positive;0;0;0;0;0;0 -13540;transparent;positive;0;0;0;0;0;0 -13541;transpercer;negative;0;1;1;1;0;0 -13542;transpirer;negative;0;0;0;0;0;1 -13543;transpiration;negative;0;1;0;0;0;1 -13544;transplantation;positive;0;0;0;0;0;0 -13545;transplanter;positive;0;0;0;0;0;0 -13546;transport;positive;0;0;0;0;0;0 -13547;transport maritime;positive;0;0;0;0;0;0 -13548;transport routier;positive;0;0;0;0;0;0 -13549;transporter;positive;0;0;0;0;0;0 -13550;transporteur;positive;0;0;0;0;0;0 -13551;transposer;positive;0;0;0;0;0;0 -13552;transposition;positive;0;0;0;0;0;0 -13553;transversal;negative;0;0;0;0;0;0 -13554;transversale;negative;0;0;0;0;0;0 -13555;trapu;negative;0;0;0;0;0;0 -13556;traquer;negative;0;1;0;0;0;0 -13557;traumatique;negative;0;1;1;1;1;0 -13558;traumatiser;negative;0;1;1;1;1;0 -13559;traumatisant;negative;0;1;1;1;1;0 -13560;travail;positive;0;0;0;0;1;0 -13561;travail de bureau travail admi;positive;0;0;0;0;0;0 -13562;travail pénible;negative;0;0;1;0;0;1 -13563;travail préparatoire;positive;0;0;0;0;0;0 -13564;travailler;positive;0;0;0;0;0;0 -13565;travailler dur;positive;0;0;0;0;1;0 -13566;travailler en indépendant;positive;0;0;0;0;0;0 -13567;travailleur;positive;0;0;0;0;0;0 -13568;traverser;positive;0;0;0;0;0;0 -13569;traversier;positive;0;0;0;0;0;0 -13570;travestir;negative;0;1;1;1;0;1 -13571;trébucher;negative;0;1;0;0;1;0 -13572;trèfle;positive;0;0;0;0;0;0 -13573;treillage;positive;0;0;0;0;0;0 -13574;treillis;negative;0;0;0;0;0;0 -13575;treize;positive;0;0;0;0;0;0 -13576;treizième;negative;0;1;0;0;0;0 -13577;trek;positive;0;0;0;0;0;0 -13578;tremblant;negative;0;1;0;1;0;0 -13579;tremblante;negative;0;1;1;1;0;0 -13580;tremblement;negative;0;1;1;1;1;0 -13581;tremblement de terre;negative;0;1;1;1;1;0 -13582;trembler;negative;0;1;0;0;1;0 -13583;trémie;positive;0;0;0;0;0;0 -13584;trempage;negative;0;0;1;0;0;1 -13585;tremper;negative;0;0;1;0;0;1 -13586;trémpée;negative;0;0;0;0;0;1 -13587;trépas;negative;0;1;1;0;0;0 -13588;trépied;positive;0;0;0;0;0;0 -13589;très courant;positive;0;0;0;0;0;0 -13590;très éprouver;negative;0;0;1;0;0;0 -13591;très facile;positive;1;0;0;0;0;0 -13592;très intelligent;positive;0;0;0;0;0;0 -13593;très long;negative;0;0;0;0;0;0 -13594;très longue;negative;0;0;0;0;0;0 -13595;très peupler;negative;0;0;0;0;0;0 -13596;trésor;positive;0;0;0;0;0;0 -13597;trésorerie;positive;0;0;0;0;0;0 -13598;trésorier;positive;0;0;0;0;0;0 -13599;tressaillir;negative;0;1;1;1;1;1 -13600;tresse;positive;0;0;0;0;0;0 -13601;tresser;positive;0;0;0;0;0;0 -13602;treuil;positive;0;0;0;0;0;0 -13603;trêve;positive;0;0;0;0;0;0 -13604;tri;positive;0;0;0;0;0;0 -13605;triade;positive;0;0;0;0;0;0 -13606;trial;negative;0;1;0;1;0;0 -13607;triangle;positive;0;0;0;0;0;0 -13608;triangulaire;positive;0;0;0;0;0;0 -13609;tribord;positive;0;0;0;0;0;0 -13610;tribu;positive;0;0;0;0;0;0 -13611;tribulation;negative;0;1;1;0;0;0 -13612;tribun;positive;0;0;0;0;0;0 -13613;tribunal;positive;0;1;0;1;0;1 -13614;tribune;positive;0;0;0;0;0;0 -13615;tribut;negative;0;0;1;0;0;0 -13616;tricher;negative;0;0;1;1;1;1 -13617;tricherie;negative;0;0;0;1;0;1 -13618;tricot;positive;0;0;0;0;0;0 -13619;tricoter;positive;0;0;0;0;0;0 -13620;tricycle;positive;0;0;0;0;0;0 -13621;trident;positive;0;0;0;0;0;0 -13622;trier;positive;0;0;0;0;0;0 -13623;trieur;positive;0;0;0;0;0;0 -13624;trieuse;positive;0;0;0;0;0;0 -13625;trigo;positive;0;0;0;0;0;0 -13626;trigone;positive;0;0;0;0;0;0 -13627;trigonométrie;positive;0;0;0;0;0;0 -13628;trimballer;negative;0;0;0;0;0;0 -13629;trimestre;positive;0;0;0;0;0;0 -13630;trinité;positive;0;0;0;0;0;0 -13631;trio;positive;0;0;0;0;0;0 -13632;triomphant;positive;0;0;0;0;0;0 -13633;triomphe;positive;1;0;0;0;0;0 -13634;triompher;positive;1;0;0;0;0;0 -13635;tripartite;positive;0;0;0;0;0;0 -13636;tripe;positive;0;0;0;1;0;0 -13637;triple;positive;0;0;0;0;0;0 -13638;tripotage;negative;0;1;0;1;0;1 -13639;tripoter;negative;0;1;0;1;0;1 -13640;triste;negative;0;1;1;0;0;0 -13641;triste notoriété;negative;0;1;1;1;0;1 -13642;tristement;negative;0;0;1;0;0;1 -13643;tristesse;negative;0;1;1;0;0;0 -13644;tritium;positive;0;0;0;0;0;0 -13645;troc;positive;0;0;0;0;0;0 -13646;trois foi|fois;positive;0;0;0;0;0;0 -13647;troisième;positive;0;0;0;0;0;0 -13648;troll;negative;0;1;0;1;0;1 -13649;trombone;positive;0;0;0;0;0;0 -13650;tromper;negative;0;0;1;0;0;1 -13651;trompe;positive;0;0;0;0;0;0 -13652;trompette;positive;0;0;0;0;0;0 -13653;trompettiste;positive;0;0;0;0;0;0 -13654;tronc;negative;0;0;0;0;0;0 -13655;trône;positive;0;0;0;0;0;0 -13656;tronquer;negative;0;1;1;1;0;0 -13657;trop diluer;negative;0;0;0;0;0;1 -13658;trop longue;negative;0;0;1;0;0;0 -13659;trop payer|payer;negative;0;0;0;0;0;0 -13660;trophée;positive;0;0;0;0;1;0 -13661;tropical;positive;0;0;0;0;0;0 -13662;troquer;positive;0;0;0;0;0;0 -13663;trot;positive;0;0;0;0;0;0 -13664;trotter;positive;0;0;0;0;0;0 -13665;trottiner;positive;0;0;0;0;0;0 -13666;trottoir;positive;0;0;0;0;0;0 -13667;trou;negative;0;1;1;0;0;0 -13668;trou de serrure;positive;0;0;0;0;0;0 -13669;trou du cul;negative;0;0;0;1;0;1 -13670;troubler;negative;0;0;0;1;0;0 -13671;trouer;negative;0;1;1;0;0;0 -13672;troupe;positive;0;0;0;0;0;0 -13673;troupeau;negative;0;1;0;1;0;0 -13674;trousse;positive;0;0;0;0;0;0 -13675;trouver;positive;0;0;0;0;0;0 -13676;truc;negative;0;1;0;0;0;0 -13677;truelle;negative;0;0;0;0;0;0 -13678;truie;negative;0;0;0;0;0;1 -13679;truisme;negative;0;0;0;0;0;0 -13680;truite;negative;0;0;0;0;0;1 -13681;truquer;negative;0;0;0;0;0;0 -13682;tsar;positive;0;0;0;0;0;0 -13683;tuer;negative;0;1;1;1;0;0 -13684;tube;positive;0;0;0;0;0;0 -13685;tube couder;positive;0;0;0;0;0;0 -13686;tubulaire;positive;0;0;0;0;0;0 -13687;tubule;positive;0;0;0;0;0;0 -13688;tubulure;negative;0;0;0;0;0;0 -13689;tuerie;negative;0;1;1;1;0;0 -13690;tufté;negative;0;0;0;0;0;1 -13691;tuile;positive;0;0;0;0;0;0 -13692;tulipe;positive;0;0;0;0;0;0 -13693;tumeur;negative;0;1;1;0;0;0 -13694;tumulte;negative;0;1;0;1;1;0 -13695;tunique;positive;0;0;0;0;0;0 -13696;tunnel;negative;0;1;0;0;0;0 -13697;turban;positive;0;0;0;0;0;0 -13698;turbidité;negative;0;1;0;0;0;1 -13699;turbine;positive;0;0;0;0;0;0 -13700;turbulence;negative;0;1;0;1;0;0 -13701;turbulent;negative;0;1;0;1;0;0 -13702;turquoise;positive;0;0;0;0;0;0 -13703;tutelle;positive;0;0;0;0;0;0 -13704;tuteur;positive;0;0;0;0;0;0 -13705;tuyau;positive;0;0;0;0;0;0 -13706;tva;negative;0;0;0;0;0;0 -13707;type;negative;0;0;0;0;0;0 -13708;typhon;negative;0;1;0;0;0;0 -13709;typiquement;positive;0;0;0;0;0;0 -13710;typographie;positive;0;0;0;0;0;0 -13711;tyran;negative;0;1;1;1;0;1 -13712;tyrannie;negative;0;1;1;1;0;1 -13713;tyrannique;negative;0;1;1;1;0;1 -13714;tyranniser;negative;0;1;0;1;0;0 -13715;ubiquité;positive;0;0;0;0;0;0 -13716;ulcère;negative;0;1;1;1;0;1 -13717;ultérieur;negative;0;0;1;0;0;0 -13718;ultérieurement;negative;0;0;0;0;0;0 -13719;ultériorité;negative;0;0;0;0;0;0 -13720;ultimatum;negative;0;1;0;1;1;0 -13721;ultraviolet;positive;0;0;0;0;0;0 -13722;ultraviolettes;positive;0;0;0;0;0;0 -13723;un petit coup;positive;0;0;0;0;0;0 -13724;un peu;positive;0;0;0;0;0;0 -13725;unanime;positive;0;0;0;0;0;0 -13726;unanimement;positive;0;0;0;0;0;0 -13727;unanimité;positive;0;0;0;0;0;0 -13728;unir;positive;0;0;0;0;0;0 -13729;unification;positive;0;0;0;0;0;0 -13730;uniforme;positive;0;0;0;0;0;0 -13731;uniformément;positive;0;0;0;0;0;0 -13732;uniformiser;positive;0;0;0;0;0;0 -13733;union;positive;0;0;0;0;0;0 -13734;unique;negative;0;0;0;0;1;0 -13735;unisson;positive;0;0;0;0;0;0 -13736;unitaire;positive;0;0;0;0;0;0 -13737;unité;positive;0;0;0;0;0;0 -13738;univers;positive;0;0;0;0;0;0 -13739;universalité;positive;0;0;0;0;0;0 -13740;universitaire;positive;0;0;0;0;0;0 -13741;université;positive;0;0;0;0;0;0 -13742;univoque;positive;0;0;0;0;0;0 -13743;uranium;positive;0;0;0;0;0;0 -13744;urbain;positive;0;0;0;0;0;0 -13745;urbaine;positive;0;0;0;0;0;0 -13746;urgence;negative;0;1;1;0;1;0 -13747;urne;negative;0;0;1;0;0;0 -13748;usage;positive;0;0;0;0;0;0 -13749;usage abusif;negative;0;1;1;1;0;1 -13750;usage impropre;negative;0;1;1;1;0;0 -13751;usant;negative;0;0;1;0;0;0 -13752;usine;negative;0;0;0;0;0;0 -13753;ustensile;positive;0;0;0;0;0;0 -13754;usure;negative;0;0;1;0;0;1 -13755;usurper;negative;0;1;1;1;0;1 -13756;utérus;positive;0;0;0;0;0;0 -13757;utile;positive;0;0;0;0;0;0 -13758;utilement;positive;0;0;0;0;0;0 -13759;utilisable;positive;0;0;0;0;0;0 -13760;utilisation;positive;0;0;0;0;0;0 -13761;utiliser;negative;0;0;0;0;0;0 -13762;utilitaire;positive;0;0;0;0;0;0 -13763;utilité;positive;0;0;0;0;0;0 -13764;utopique;positive;0;0;0;0;0;0 -13765;vacance;positive;1;0;0;0;0;0 -13766;vacant;negative;0;0;1;0;0;0 -13767;vacarme;negative;0;1;0;1;1;1 -13768;vaccin;positive;0;0;0;0;0;0 -13769;vaccination;positive;0;0;0;0;0;0 -13770;vache;positive;0;0;0;0;0;0 -13771;vacuolaire;positive;0;0;0;0;0;0 -13772;vacuole;positive;0;0;0;0;0;0 -13773;vagabond;negative;0;0;1;0;0;1 -13774;vagabondage;negative;0;0;1;0;0;0 -13775;vague;negative;0;1;1;1;1;0 -13776;vague idée;positive;0;0;0;0;0;0 -13777;vaincre;positive;1;0;0;0;0;0 -13778;vainement;negative;0;0;1;0;0;1 -13779;vainqueur;positive;0;0;0;0;1;0 -13780;vairon;positive;0;0;0;0;0;0 -13781;vaisseau;positive;0;0;0;0;0;0 -13782;vaisseau amiral;positive;0;0;0;0;0;0 -13783;vaisselle;positive;0;0;0;0;0;0 -13784;valet;positive;0;0;0;0;0;0 -13785;valeur;positive;0;0;0;0;0;0 -13786;validité;positive;0;1;0;0;0;0 -13787;vallée;positive;0;0;0;0;0;0 -13788;vallon;positive;0;0;0;0;0;0 -13789;vallonner;positive;0;0;0;0;0;0 -13790;valoir;positive;0;0;0;0;0;0 -13791;valoriser;positive;0;0;0;0;0;0 -13792;valse;positive;0;0;0;0;0;0 -13793;valser;positive;0;0;0;0;0;0 -13794;vamp;positive;0;0;0;0;0;0 -13795;vampire;negative;0;1;0;1;0;1 -13796;van;positive;0;0;0;0;0;0 -13797;vanille;positive;0;0;0;0;0;0 -13798;vanité;negative;0;0;0;1;0;1 -13799;vaniteux;negative;0;0;0;1;0;1 -13800;vannage;positive;0;0;0;0;0;0 -13801;vanne;positive;0;0;0;0;0;0 -13802;vantardise;negative;0;0;0;0;0;0 -13803;vanter;negative;0;0;0;0;0;0 -13804;vapeur;positive;0;0;0;0;0;0 -13805;vaporiser;positive;0;0;0;0;0;0 -13806;vara;positive;0;0;0;0;0;0 -13807;variable;negative;0;0;0;0;1;0 -13808;variance;negative;0;0;0;0;0;0 -13809;variation;negative;0;0;0;0;0;0 -13810;varicelle;negative;0;1;1;0;0;1 -13811;varier;positive;0;0;0;0;0;0 -13812;variété;positive;0;0;0;0;0;0 -13813;vasculaire;positive;0;0;0;0;0;0 -13814;vase;negative;0;1;0;0;0;1 -13815;vasistas;positive;0;0;0;0;0;0 -13816;vaste;positive;0;0;0;0;0;0 -13817;vaudeville;positive;0;0;0;0;0;0 -13818;vaudou;negative;0;1;0;0;0;1 -13819;vaurien;negative;0;1;0;1;0;1 -13820;vautour;negative;0;1;0;0;0;1 -13821;veau;positive;0;0;1;0;0;0 -13822;vecteur;positive;0;0;0;0;0;0 -13823;vedette;positive;0;0;0;0;0;0 -13824;vega;positive;0;0;0;0;0;0 -13825;véga;positive;0;0;0;0;0;0 -13826;végétal;positive;0;0;0;0;0;0 -13827;végétarisme;positive;0;0;0;0;0;0 -13828;végétatif;negative;0;0;1;0;0;1 -13829;végétation;positive;0;0;0;0;0;0 -13830;véhément;negative;0;1;0;1;0;0 -13831;véhicule;positive;0;0;0;0;0;0 -13832;véhiculer;positive;0;0;0;0;0;0 -13833;veille;positive;0;0;0;0;0;0 -13834;veiller;positive;0;0;0;0;0;0 -13835;veilleur;positive;0;0;0;0;0;0 -13836;veine;positive;0;0;0;0;0;1 -13837;veiner;negative;0;0;0;0;0;1 -13838;veineux;negative;0;0;0;0;0;1 -13839;vélin;positive;0;0;0;0;0;0 -13840;vélo;positive;0;0;0;0;0;0 -13841;vélocité;positive;0;0;0;0;0;0 -13842;velours;positive;0;0;0;0;0;0 -13843;velours côtelé;positive;0;0;0;0;0;0 -13844;velouter;positive;0;0;0;0;0;0 -13845;venaison;negative;0;0;0;0;0;1 -13846;vendanger;positive;0;0;0;0;0;0 -13847;vendetta;negative;0;1;1;1;0;0 -13848;vendeur ambulant;positive;0;0;0;0;0;0 -13849;vendre;positive;0;0;0;0;0;0 -13850;vendre au enchère;negative;0;0;0;0;0;0 -13851;vénérable;positive;0;0;1;0;0;0 -13852;vénération;positive;0;0;0;0;0;0 -13853;vénérer;positive;0;0;0;0;0;0 -13854;vengeance;negative;0;1;0;1;1;0 -13855;venin;negative;0;1;0;1;0;1 -13856;vent;positive;0;1;1;1;0;1 -13857;vente;positive;0;0;0;0;0;0 -13858;vente au détail;positive;0;0;0;0;0;0 -13859;vente au enchère;negative;0;0;0;0;0;0 -13860;venteux;negative;0;1;0;0;1;0 -13861;ventilateur;positive;0;0;0;0;0;0 -13862;ventilation;positive;0;0;0;0;0;0 -13863;ventouse;positive;0;0;0;1;0;0 -13864;ventre;positive;0;0;0;0;0;0 -13865;ventricule;positive;0;0;0;0;0;0 -13866;ver;negative;0;0;0;0;1;1 -13867;véracité;positive;0;0;0;0;1;0 -13868;véranda;positive;0;0;0;0;0;0 -13869;verbal;positive;0;0;0;0;0;0 -13870;verbiage;positive;0;0;0;0;0;0 -13871;verbosité;negative;0;0;0;0;0;0 -13872;verdâtre;negative;0;0;0;0;0;1 -13873;verdict;positive;0;1;0;0;0;0 -13874;verdoyer;positive;0;0;0;0;0;0 -13875;verdoyant;positive;0;0;0;0;0;0 -13876;verger;positive;0;0;0;0;0;0 -13877;véridique;positive;0;0;0;0;0;0 -13878;vérificateur;positive;0;0;0;0;0;0 -13879;vérification;positive;0;0;0;0;0;0 -13880;vérifier;positive;0;0;0;0;0;0 -13881;véritablement;positive;0;0;0;0;0;0 -13882;vérité;positive;0;0;0;0;0;0 -13883;vermifuger;negative;0;0;0;0;1;1 -13884;vermine;negative;0;1;0;1;0;1 -13885;vernaculaire;positive;0;0;0;0;0;0 -13886;vernal;positive;1;0;0;0;0;0 -13887;vérole;negative;0;1;0;0;0;1 -13888;véronique;positive;0;0;0;0;0;0 -13889;verre;positive;0;0;0;0;0;0 -13890;verrerie;positive;0;0;0;0;0;0 -13891;verrou;positive;0;0;0;0;0;0 -13892;verrouiller;positive;0;0;0;0;0;0 -13893;verrue;negative;0;0;0;0;0;1 -13894;vers l extérieur;positive;0;0;0;0;0;0 -13895;vers l intérieur;positive;0;0;0;0;0;0 -13896;vers le haut;positive;0;0;0;0;0;0 -13897;versatilité;negative;0;1;0;1;1;0 -13898;verser;positive;0;0;0;0;0;0 -13899;verser dans un tasse;positive;0;1;1;0;0;1 -13900;verser un pot de vin à;negative;0;0;0;0;0;0 -13901;verset;positive;0;0;0;0;0;0 -13902;version;positive;0;0;0;0;0;0 -13903;verso;negative;0;0;0;0;0;0 -13904;vert;positive;0;0;0;0;0;0 -13905;vert jade;positive;0;0;0;0;0;0 -13906;vertebral;positive;0;0;0;0;0;0 -13907;vertébral;positive;0;0;0;0;0;0 -13908;vertèbre;positive;0;0;0;0;0;0 -13909;vertical;positive;0;0;0;0;0;0 -13910;verticalement;positive;0;0;0;0;0;0 -13911;vertige;negative;0;1;0;0;1;0 -13912;vertu;positive;0;0;0;0;0;0 -13913;verve;positive;1;0;0;0;0;0 -13914;vésiculaire;negative;0;0;0;0;0;1 -13915;vésicule;positive;0;0;0;0;0;0 -13916;vessie;negative;0;0;0;0;0;1 -13917;vestibule;positive;0;0;0;0;0;0 -13918;vêtement;positive;0;0;0;0;0;0 -13919;vétéran;positive;0;0;0;0;0;0 -13920;vétérinaire;positive;0;0;0;0;0;0 -13921;veto;negative;0;0;0;1;0;0 -13922;vétuste;negative;0;0;0;0;0;1 -13923;veuf;negative;0;0;1;0;0;0 -13924;veuf|veuve;negative;0;0;1;0;0;0 -13925;viabilité;positive;0;0;0;0;0;0 -13926;viable;positive;0;0;0;0;0;0 -13927;viaduc;positive;0;0;0;0;0;0 -13928;viager;positive;0;0;0;0;0;0 -13929;vialins;negative;0;1;0;0;1;0 -13930;viande;positive;0;0;0;0;0;0 -13931;viande de porc;positive;0;0;0;0;0;0 -13932;vibrer;positive;0;0;1;0;0;0 -13933;vibrant;positive;0;0;1;0;0;0 -13934;vibration;negative;0;1;0;0;1;0 -13935;vibratoire;positive;0;0;0;0;0;0 -13936;vibreur sonore;positive;0;0;0;0;0;0 -13937;vicaire;positive;0;0;0;0;0;0 -13938;vice;negative;0;0;0;1;0;1 -13939;victime;negative;0;1;1;1;0;0 -13940;victimiser;negative;0;1;1;1;1;1 -13941;victoire;positive;0;0;0;0;0;0 -13942;victoria;positive;0;0;0;0;0;0 -13943;victuaille;positive;0;0;0;0;0;0 -13944;vide;negative;0;1;1;0;0;1 -13945;vider;negative;0;1;1;0;0;0 -13946;vie;positive;1;0;0;0;0;0 -13947;vieux âge;negative;0;0;0;0;0;0 -13948;vieux fille;negative;0;1;1;0;0;0 -13949;vieux sorcier;negative;0;1;0;1;0;1 -13950;vieillir;negative;0;1;1;0;0;0 -13951;vieillissement;negative;0;0;0;0;0;0 -13952;vieillot;negative;0;0;0;0;0;1 -13953;vierge;negative;0;1;1;0;0;0 -13954;vigilance;positive;0;1;0;0;1;0 -13955;vigiler;positive;0;1;0;1;1;0 -13956;vigilant;positive;0;1;0;1;1;0 -13957;vigile;positive;0;0;0;0;0;0 -13958;vigne;positive;0;0;0;0;0;0 -13959;vignette;positive;0;0;0;0;0;0 -13960;vignoble;positive;0;0;0;0;0;0 -13961;vigueur;positive;1;0;0;0;0;0 -13962;viking;negative;0;1;0;0;0;0 -13963;vil;negative;0;1;0;1;0;1 -13964;vilain;negative;0;1;0;0;1;0 -13965;villa;positive;0;0;0;0;0;0 -13966;village;positive;0;0;0;0;0;0 -13967;ville;positive;0;0;0;0;0;0 -13968;vin;positive;0;0;0;0;0;0 -13969;vinaigre;negative;0;1;0;0;0;1 -13970;vinaigrette;positive;0;0;0;0;0;0 -13971;vingt;positive;0;0;0;0;0;0 -13972;vingtième;positive;0;0;0;0;0;0 -13973;viol;negative;0;1;1;1;0;1 -13974;violation de propriété;negative;0;1;0;1;0;0 -13975;violemment;negative;0;1;1;1;0;1 -13976;violence;negative;0;1;1;1;0;0 -13977;violent;negative;0;1;0;1;1;1 -13978;violer;negative;0;1;1;1;0;1 -13979;violet;positive;0;0;0;0;0;0 -13980;violon;positive;0;0;0;0;0;0 -13981;violoniste;positive;0;0;0;0;0;0 -13982;vipère;negative;0;1;1;1;0;1 -13983;virage;positive;0;1;0;0;0;0 -13984;virer;negative;0;1;0;0;1;0 -13985;virer de bord;negative;0;1;0;0;1;0 -13986;virginité;positive;0;0;0;0;0;0 -13987;virgule;positive;0;0;0;0;0;0 -13988;viril;positive;0;0;0;0;0;0 -13989;virilité;positive;0;0;0;0;0;0 -13990;virologie;negative;0;0;0;0;0;0 -13991;virtuose;positive;0;0;0;0;0;0 -13992;virulence;negative;0;1;0;1;0;0 -13993;virus;negative;0;1;0;0;0;1 -13994;virus de l herpès;negative;0;0;0;0;0;1 -13995;vis;positive;0;0;0;1;0;0 -13996;visa;positive;0;0;0;0;0;0 -13997;visage;positive;0;0;0;0;0;0 -13998;viscosité;negative;0;0;0;0;0;1 -13999;viser;positive;0;0;0;0;0;0 -14000;visibilité;positive;0;0;0;0;0;0 -14001;visible;positive;0;0;0;0;0;0 -14002;visiblement;positive;0;0;0;0;0;0 -14003;visière;positive;0;0;0;0;1;0 -14004;vision;positive;0;0;0;0;1;0 -14005;visionnaire;positive;0;0;0;0;0;0 -14006;visiter;positive;0;0;0;0;0;0 -14007;visitation;positive;0;0;0;0;0;0 -14008;visite;positive;0;0;0;0;0;0 -14009;visser;negative;0;0;0;1;0;0 -14010;visualiser;positive;0;0;0;0;0;0 -14011;vital;positive;0;0;0;0;0;0 -14012;vitalité;positive;0;0;0;0;0;0 -14013;vitesse;negative;0;1;0;0;0;0 -14014;vitre;positive;0;0;0;0;0;0 -14015;vitreux;positive;0;0;0;0;0;0 -14016;vitrine;positive;0;0;0;0;0;0 -14017;vivant;positive;0;0;0;0;0;0 -14018;vivre|vivres;positive;0;0;0;0;0;0 -14019;voûte;positive;0;0;0;0;0;0 -14020;vocabulaire;positive;0;0;0;0;0;0 -14021;vocal;positive;0;0;0;0;0;0 -14022;vocation;positive;0;0;0;0;0;0 -14023;vogue;positive;0;0;0;0;0;0 -14024;voguer;positive;0;0;0;0;0;0 -14025;voie;positive;0;0;0;0;0;0 -14026;voie ferré;positive;0;0;0;0;0;0 -14027;voile;negative;0;1;1;0;0;0 -14028;voiler;negative;0;1;1;0;0;0 -14029;voisinage;positive;0;0;0;0;0;0 -14030;voiture;positive;0;0;0;0;0;0 -14031;voiturier;positive;0;0;0;0;0;0 -14032;voix;positive;0;0;0;0;0;0 -14033;vol;negative;0;1;1;1;1;1 -14034;vol à l étalage;negative;0;1;0;1;1;1 -14035;volage;negative;0;0;0;1;0;1 -14036;volaille;positive;0;1;0;0;0;0 -14037;volant;positive;0;1;0;0;0;0 -14038;voler moteur;positive;0;0;0;0;0;0 -14039;volante;positive;0;1;0;0;0;0 -14040;volatilité;negative;0;1;0;1;1;0 -14041;volcan;negative;0;1;0;0;1;0 -14042;volcanique;negative;0;1;0;0;1;0 -14043;voler;negative;0;1;1;1;1;0 -14044;voler en éclat;negative;0;1;1;1;1;0 -14045;volet;negative;0;0;0;0;0;0 -14046;volière;positive;0;0;0;0;0;0 -14047;volontaire;positive;0;0;0;0;0;0 -14048;volontairement;positive;0;0;0;0;0;0 -14049;volontariat;positive;0;0;0;0;0;0 -14050;volonté;positive;0;0;0;0;0;0 -14051;volontiers;positive;0;0;0;0;0;0 -14052;voltige;negative;0;1;1;0;0;0 -14053;voltmètre;positive;0;0;0;0;0;0 -14054;volume;negative;0;0;0;1;0;0 -14055;volumineux;negative;0;1;0;0;0;0 -14056;vomir;negative;0;0;0;0;0;1 -14057;vomissement;negative;0;0;0;0;0;1 -14058;vorace;negative;0;1;1;1;0;0 -14059;vortex;negative;0;1;0;0;1;0 -14060;votales;positive;0;0;0;0;0;0 -14061;votant;positive;0;0;0;0;0;0 -14062;vote;positive;0;0;1;1;1;0 -14063;voter;positive;0;0;1;1;1;0 -14064;voter pour;positive;0;0;0;0;0;0 -14065;votif;positive;0;0;0;0;0;0 -14066;vouer;positive;0;0;0;0;0;0 -14067;vouloir;negative;0;1;1;0;0;0 -14068;voûte;positive;0;1;1;0;0;0 -14069;voûter;negative;0;0;1;0;0;0 -14070;voyage;positive;0;1;0;0;1;0 -14071;voyager;positive;1;0;0;0;0;0 -14072;voyelle;positive;0;0;0;0;0;0 -14073;voyou;negative;0;1;0;1;0;1 -14074;VRAI;positive;0;0;0;0;0;0 -14075;vrai casse tête;negative;0;0;0;1;0;0 -14076;vraisemblance;positive;0;0;0;0;0;0 -14077;vriller;negative;0;0;0;0;0;0 -14078;vrombir;negative;0;1;0;0;1;0 -14079;vrombissement;negative;0;1;0;0;1;0 -14080;vue;positive;0;0;0;0;0;0 -14081;vulgaire;negative;0;0;0;0;0;1 -14082;vulgarité;negative;0;0;1;1;0;1 -14083;vulnérabilité;negative;0;1;1;0;0;0 -14084;vulnérable;negative;0;1;1;0;0;0 -14085;w c;negative;0;0;0;0;0;1 -14086;wagon;positive;0;0;0;0;0;0 -14087;wagon lit;positive;0;0;0;0;0;0 -14088;wapiti;positive;0;0;0;0;0;0 -14089;wc;negative;0;0;0;0;0;1 -14090;web;positive;0;0;0;0;0;0 -14091;whisky;negative;0;0;0;0;0;0 -14092;xénophobie;negative;0;1;0;1;0;0 -14093;xérès;positive;0;0;0;0;0;0 -14094;yacht;positive;0;0;0;0;0;0 -14095;yacht de croisière;positive;0;0;0;0;0;0 -14096;yachting;positive;0;0;0;0;0;0 -14097;yak;negative;0;0;0;0;0;0 -14098;yearling;positive;0;0;0;0;0;0 -14099;yeoman;positive;0;0;0;0;0;0 -14100;yogi;positive;0;0;0;0;0;0 -14101;zap;negative;0;1;0;1;1;0 -14102;zapper;negative;0;1;0;1;1;0 -14103;zèbre;positive;0;0;0;0;0;0 -14104;zébrure;negative;0;0;0;0;0;0 -14105;zèle;positive;0;0;0;0;1;0 -14106;zélé;negative;0;0;0;0;0;0 -14107;zénith;positive;1;0;0;0;0;0 -14108;zephyr;positive;0;0;0;0;0;0 -14109;zéphyr;positive;0;0;0;0;0;0 -14110;zeppelin;positive;0;0;0;0;0;0 -14111;zeste;positive;0;0;0;0;0;0 -14112;zézaiement;negative;0;1;1;1;0;0 -14113;zibeline;positive;0;0;0;0;0;0 -14114;zinzin;negative;0;1;0;0;1;0 -14115;zinzins;negative;0;1;0;0;1;0 -14116;zipper;positive;0;0;0;0;0;0 -14117;zodiaque;positive;0;0;0;0;0;0 -14118;zone;positive;0;0;0;0;0;0 -14119;zoo;positive;0;0;0;0;0;0 -14120;zoologie;positive;0;0;0;0;0;0 -14121;zoologique;positive;0;0;0;0;0;0 -14122;zoom;positive;0;0;0;0;0;0 -14123;zoomer;positive;0;0;0;0;0;0 -14124;zozotement;negative;0;1;1;1;0;0 -14125;zozoter;negative;0;1;1;1;0;0 -14126;merci;positive;1;0;0;0;0;0 -14127;remercier;positive;1;0;0;0;0;0 -14128;remerciment;positive;1;0;0;0;0;0 -14129;moins;negative;0;0;0;0;0;0 diff --git a/config/french_numbers.txt b/config/french_numbers.txt deleted file mode 100644 index 0dea605..0000000 --- a/config/french_numbers.txt +++ /dev/null @@ -1,101 +0,0 @@ -zéro -un -deux -trois -quatre -cinq -six -sept -huit -neuf -dix -onze -douze -treize -quatorze -quinze -seize -dix-sept -dix-huit -dix-neuf -vingt -vingt-et-un -vingt-deux -vingt-trois -vingt-quatre -vingt-cinq -vingt-six -vingt-sept -vingt-huit -vingt-neuf -trente -trente-et-un -trente-deux -trente-trois -trente-quatre -trente-cinq -trente-six -trente-sept -trente-huit -trente-neuf -quarante -quarante-et-un -quarante-deux -quarante-trois -quarante-quatre -quarante-cinq -quarante-six -quarante-sept -quarante-huit -quarante-neuf -cinquante -cinquante-et-un -cinquante-deux -cinquante-trois -cinquante-quatre -cinquante-cinq -cinquante-six -cinquante-sept -cinquante-huit -cinquante-neuf -soixante -soixante-et-un -soixante-deux -soixante-trois -soixante-quatre -soixante-cinq -soixante-six -soixante-sept -soixante-huit -soixante-neuf -soixante-dix -soixante-et-onze -soixante-douze -soixante-treize -soixante-quatorze -soixante-quinze -soixante-seize -soixante-dix-sept -soixante-dix-huit -soixante-dix-neuf -quatre-vingts -quatre-vingt-un -quatre-vingt-deux -quatre-vingt-trois -quatre-vingt-quatre -quatre-vingt-cinq -quatre-vingt-six -quatre-vingt-sept -quatre-vingt-huit -quatre-vingt-neuf -quatre-vingt-dix -quatre-vingt-onze -quatre-vingt-douze -quatre-vingt-treize -quatre-vingt-quatorze -quatre-vingt-quinze -quatre-vingt-seize -quatre-vingt-dix-sept -quatre-vingt-dix-huit -quatre-vingt-dix-neuf -cent diff --git a/config/french_stopwords.txt b/config/french_stopwords.txt deleted file mode 100644 index d482b0a..0000000 --- a/config/french_stopwords.txt +++ /dev/null @@ -1,689 +0,0 @@ -a -abord -absolument -afin -ah -ai -aie -aient -aies -ailleurs -ainsi -ait -allaient -allo -allons -allô -alors -anterieur -anterieure -anterieures -apres -après -as -assez -attendu -au -aucun -aucune -aucuns -aujourd -aujourd'hui -aupres -auquel -aura -aurai -auraient -aurais -aurait -auras -aurez -auriez -aurions -aurons -auront -aussi -autre -autrefois -autrement -autres -autrui -aux -auxquelles -auxquels -avaient -avais -avait -avant -avec -avez -aviez -avions -avoir -avons -ayant -ayez -ayons -b -bah -bas -basee -bat -beau -beaucoup -bien -bigre -bon -boum -bravo -brrr -c -car -ce -ceci -cela -celle -celle-ci -celle-là -celles -celles-ci -celles-là -celui -celui-ci -celui-là -celà -cent -cependant -certain -certaine -certaines -certains -certes -ces -cet -cette -ceux -ceux-ci -ceux-là -chacun -chacune -chaque -cher -chers -chez -chiche -chut -chère -chères -ci -cinq -cinquantaine -cinquante -cinquantième -cinquième -clac -clic -combien -comme -comment -comparable -comparables -compris -concernant -contre -couic -crac -d -da -dans -de -debout -dedans -dehors -deja -delà -depuis -dernier -derniere -derriere -derrière -des -desormais -desquelles -desquels -dessous -dessus -deux -deuxième -deuxièmement -devant -devers -devra -devrait -different -differentes -differents -différent -différente -différentes -différents -dire -directe -directement -dit -dite -dits -divers -diverse -diverses -dix -dix-huit -dix-neuf -dix-sept -dixième -doit -doivent -donc -dont -dos -douze -douzième -dring -droite -du -duquel -durant -dès -début -désormais -e -effet -egale -egalement -egales -eh -elle -elle-même -elles -elles-mêmes -en -encore -enfin -entre -envers -environ -es -essai -est -et -etant -etc -etre -eu -eue -eues -euh -eurent -eus -eusse -eussent -eusses -eussiez -eussions -eut -eux -eux-mêmes -exactement -excepté -extenso -exterieur -eûmes -eût -eûtes -f -fais -faisaient -faisant -fait -faites -façon -feront -fi -flac -floc -fois -font -force -furent -fus -fusse -fussent -fusses -fussiez -fussions -fut -fûmes -fût -fûtes -g -gens -h -ha -haut -hein -hem -hep -hi -ho -holà -hop -hormis -hors -hou -houp -hue -hui -huit -huitième -hum -hurrah -hé -hélas -i -ici -il -ils -importe -j -je -jusqu -jusque -juste -k -l -la -laisser -laquelle -las -le -lequel -les -lesquelles -lesquels -leur -leurs -longtemps -lors -lorsque -lui -lui-meme -lui-même -là -lès -m -ma -maint -maintenant -mais -malgre -malgré -maximale -me -meme -memes -merci -mes -mien -mienne -miennes -miens -mille -mince -mine -minimale -moi -moi-meme -moi-même -moindres -moins -mon -mot -moyennant -multiple -multiples -même -mêmes -n -na -naturel -naturelle -naturelles -ne -neanmoins -necessaire -necessairement -neuf -neuvième -ni -nombreuses -nombreux -nommés -non -nos -notamment -notre -nous -nous-mêmes -nouveau -nouveaux -nul -néanmoins -nôtre -nôtres -o -oh -ohé -ollé -olé -on -ont -onze -onzième -ore -ou -ouf -ouias -oust -ouste -outre -ouvert -ouverte -ouverts -o| -où -p -paf -pan -par -parce -parfois -parle -parlent -parler -parmi -parole -parseme -partant -particulier -particulière -particulièrement -pas -passé -pendant -pense -permet -personne -personnes -peu -peut -peuvent -peux -pff -pfft -pfut -pif -pire -pièce -plein -plouf -plupart -plus -plusieurs -plutôt -possessif -possessifs -possible -possibles -pouah -pour -pourquoi -pourrais -pourrait -pouvait -prealable -precisement -premier -première -premièrement -pres -probable -probante -procedant -proche -près -psitt -pu -puis -puisque -pur -pure -q -qu -quand -quant -quant-à-soi -quanta -quarante -quatorze -quatre -quatre-vingt -quatrième -quatrièmement -que -quel -quelconque -quelle -quelles -quelqu'un -quelque -quelques -quels -qui -quiconque -quinze -quoi -quoique -r -rare -rarement -rares -relative -relativement -remarquable -rend -rendre -restant -reste -restent -restrictif -retour -revoici -revoilà -rien -s -sa -sacrebleu -sait -sans -sapristi -sauf -se -sein -seize -selon -semblable -semblaient -semble -semblent -sent -sept -septième -sera -serai -seraient -serais -serait -seras -serez -seriez -serions -serons -seront -ses -seul -seule -seulement -si -sien -sienne -siennes -siens -sinon -six -sixième -soi -soi-même -soient -sois -soit -soixante -sommes -son -sont -sous -souvent -soyez -soyons -specifique -specifiques -speculatif -stop -strictement -subtiles -suffisant -suffisante -suffit -suis -suit -suivant -suivante -suivantes -suivants -suivre -sujet -superpose -sur -surtout -t -ta -tac -tandis -tant -tardive -te -tel -telle -tellement -telles -tels -tenant -tend -tenir -tente -tes -tic -tien -tienne -tiennes -tiens -toc -toi -toi-même -ton -touchant -toujours -tous -tout -toute -toutefois -toutes -treize -trente -tres -trois -troisième -troisièmement -trop -très -tsoin -tsouin -tu -té -u -un -une -unes -uniformement -unique -uniques -uns -v -va -vais -valeur -vas -vers -via -vif -vifs -vingt -vivat -vive -vives -vlan -voici -voie -voient -voilà -vont -vos -votre -vous -vous-mêmes -vu -vé -vôtre -vôtres -w -x -y -z -zut -à -â -ça -ès -étaient -étais -était -étant -état -étiez -étions -été -étée -étées -étés -êtes -être -ô From de7c7dc63c499eb2cf1b900bef7d4cd7b94985ef Mon Sep 17 00:00:00 2001 From: Rafaelle AYGALENQ <rafaelle.aygalenq@artefact.com> Date: Mon, 25 Jan 2021 20:35:05 +0100 Subject: [PATCH 441/496] reorg repo v1 --- {nautilus_nlp => config}/__init__.py | 0 {nautilus_nlp/config => config}/config.py | 35 ++++++++++ {nautilus_nlp/utils => config}/constants.py | 0 .../data => config}/country_code.json | 0 {nautilus_nlp/data => config}/french_FEEL.csv | 0 .../data => config}/french_numbers.txt | 0 .../data => config}/french_stopwords.txt | 0 {nautilus_nlp/data => config}/stopwords.json | 0 nautilus_nlp/analysis/ngrams.py | 39 ----------- nautilus_nlp/data/.gitkeep | 0 nautilus_nlp/data/__init__.py | 17 ----- nautilus_nlp/utils/__init__.py | 17 ----- nautilus_nlp/utils/keyword_extractor.py | 50 -------------- .../__init__.py | 1 + .../augmentation/text_augmentation.py | 0 .../classic/preprocess.py | 5 +- preprocessing/preprocessor.py | 65 +++++++++++++++++++ .../social/preprocess.py | 4 +- .../token/preprocess.py | 0 .../token}/tokenizer.py | 0 tests/test_data_augmentation.py | 6 +- tests/test_document_loader.py | 2 +- tests/test_keyword_extractor.py | 16 ----- tests/test_phone_number.py | 2 +- tests/test_preprocessor.py | 12 ++-- {nautilus_nlp/config => utils}/__init__.py | 0 {nautilus_nlp/utils => utils}/file_loader.py | 0 {nautilus_nlp/utils => utils}/phone_number.py | 29 +-------- {nautilus_nlp/utils => utils}/stopwords.py | 7 +- 29 files changed, 120 insertions(+), 187 deletions(-) rename {nautilus_nlp => config}/__init__.py (100%) rename {nautilus_nlp/config => config}/config.py (73%) rename {nautilus_nlp/utils => config}/constants.py (100%) rename {nautilus_nlp/data => config}/country_code.json (100%) rename {nautilus_nlp/data => config}/french_FEEL.csv (100%) rename {nautilus_nlp/data => config}/french_numbers.txt (100%) rename {nautilus_nlp/data => config}/french_stopwords.txt (100%) rename {nautilus_nlp/data => config}/stopwords.json (100%) delete mode 100644 nautilus_nlp/analysis/ngrams.py delete mode 100644 nautilus_nlp/data/.gitkeep delete mode 100644 nautilus_nlp/data/__init__.py delete mode 100644 nautilus_nlp/utils/__init__.py delete mode 100644 nautilus_nlp/utils/keyword_extractor.py rename {nautilus_nlp/preprocessing => preprocessing}/__init__.py (94%) rename nautilus_nlp/preprocessing/data_augmentation.py => preprocessing/augmentation/text_augmentation.py (100%) rename nautilus_nlp/preprocessing/text_preprocess.py => preprocessing/classic/preprocess.py (98%) create mode 100644 preprocessing/preprocessor.py rename nautilus_nlp/preprocessing/social_preprocess.py => preprocessing/social/preprocess.py (97%) rename nautilus_nlp/preprocessing/token_preprocess.py => preprocessing/token/preprocess.py (100%) rename {nautilus_nlp/utils => preprocessing/token}/tokenizer.py (100%) delete mode 100644 tests/test_keyword_extractor.py rename {nautilus_nlp/config => utils}/__init__.py (100%) rename {nautilus_nlp/utils => utils}/file_loader.py (100%) rename {nautilus_nlp/utils => utils}/phone_number.py (67%) rename {nautilus_nlp/utils => utils}/stopwords.py (94%) diff --git a/nautilus_nlp/__init__.py b/config/__init__.py similarity index 100% rename from nautilus_nlp/__init__.py rename to config/__init__.py diff --git a/nautilus_nlp/config/config.py b/config/config.py similarity index 73% rename from nautilus_nlp/config/config.py rename to config/config.py index 35681cf..df90e45 100644 --- a/nautilus_nlp/config/config.py +++ b/config/config.py @@ -17,10 +17,15 @@ # Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. #!/usr/local/bin/python3 import os +import phonenumbers as _phonenumbers ROOT_FOLDER = os.path.abspath(os.path.join(os.path.dirname(__file__), '..')) +# Stopwords config +STOPWORDS_JSON_FILEPATH = os.path.join(ROOT_FOLDER, "config", "stopwords.json") + +# Country config COUNTRY_MAPPING_ISO = { 'af': 'Afghanistan', 'ax': 'Åland Islands', 'al': 'Albania', 'dz': 'Algeria', 'as': 'American Samoa', 'ad': 'Andorra', 'ao': 'Angola', 'ai': 'Anguilla', 'aq': 'Antarctica', 'ag': 'Antigua and Barbuda', 'ar': 'Argentina', @@ -73,3 +78,33 @@ 've': 'Venezuela (Bolivarian Republic of)', 'vn': 'Viet Nam', 'vg': 'Virgin Islands (British)', 'vi': 'Virgin Islands (U.S.)', 'wf': 'Wallis and Futuna', 'eh': 'Western Sahara', 'ye': 'Yemen', 'zm': 'Zambia', 'zw': 'Zimbabwe'} + +# Phone numbers config +SUPPORTED_COUNTRY = [None, 'US', 'AG', 'AI', 'AS', 'BB', 'BM', 'BS', 'CA', 'DM', + 'GD', 'GU', 'JM', 'KN', 'KY', 'LC', 'MP', 'MS', 'PR', 'SX', 'TC', 'TT', + 'VC', 'VG', 'VI', 'RU', 'KZ', 'EG', 'ZA', 'GR', 'NL', 'BE', 'FR', 'ES', + 'HU', 'IT', 'VA', 'RO', 'CH', 'AT', 'GB', 'GG', 'IM', 'JE', 'DK', 'SE', + 'NO', 'SJ', 'PL', 'DE', 'PE', 'MX', 'CU', 'AR', 'BR', 'CL', 'CO', 'VE', + 'MY', 'AU', 'CC', 'CX', 'ID', 'PH', 'NZ', 'SG', 'TH', 'JP', 'KR', 'VN', + 'CN', 'TR', 'IN', 'PK', 'AF', 'LK', 'MM', 'IR', 'SS', 'MA', 'EH', 'DZ', + 'TN', 'LY', 'GM', 'SN', 'MR', 'ML', 'GN', 'CI', 'BF', 'NE', 'TG', 'BJ', + 'MU', 'LR', 'SL', 'GH', 'NG', 'TD', 'CF', 'CM', 'CV', 'ST', 'GQ', 'GA', + 'CG', 'CD', 'AO', 'GW', 'IO', 'AC', 'SC', 'SD', 'RW', 'ET', 'SO', 'DJ', + 'KE', 'TZ', 'UG', 'BI', 'MZ', 'ZM', 'MG', 'RE', 'YT', 'ZW', 'NA', 'MW', + 'LS', 'BW', 'SZ', 'KM', 'SH', 'TA', 'ER', 'AW', 'FO', 'GL', 'GI', 'PT', + 'LU', 'IE', 'IS', 'AL', 'MT', 'CY', 'FI', 'AX', 'BG', 'LT', 'LV', 'EE', + 'MD', 'AM', 'BY', 'AD', 'MC', 'SM', 'UA', 'RS', 'ME', 'XK', 'HR', 'SI', + 'BA', 'MK', 'CZ', 'SK', 'LI', 'FK', 'BZ', 'GT', 'SV', 'HN', 'NI', 'CR', + 'PA', 'PM', 'HT', 'GP', 'BL', 'MF', 'BO', 'GY', 'EC', 'GF', 'PY', 'MQ', + 'SR', 'UY', 'CW', 'BQ', 'TL', 'NF', 'BN', 'NR', 'PG', 'TO', 'SB', 'VU', + 'FJ', 'PW', 'WF', 'CK', 'NU', 'WS', 'KI', 'NC', 'TV', 'PF', 'TK', 'FM', + 'MH', 'KP', 'HK', 'MO', 'KH', 'LA', 'BD', 'TW', 'MV', 'LB', 'JO', 'SY', + 'IQ', 'KW', 'SA', 'YE', 'OM', 'PS', 'AE', 'IL', 'BH', 'QA', 'BT', 'MN', + 'NP', 'TJ', 'TM', 'AZ', 'GE', 'KG', 'UZ', 'DO'] + +FORMAT_NUMBERS = { + "E164": _phonenumbers.PhoneNumberFormat.E164, + "INTERNATIONAL": _phonenumbers.PhoneNumberFormat.INTERNATIONAL, + "NATIONAL": _phonenumbers.PhoneNumberFormat.NATIONAL, + "RFC3966": _phonenumbers.PhoneNumberFormat.RFC3966 +} diff --git a/nautilus_nlp/utils/constants.py b/config/constants.py similarity index 100% rename from nautilus_nlp/utils/constants.py rename to config/constants.py diff --git a/nautilus_nlp/data/country_code.json b/config/country_code.json similarity index 100% rename from nautilus_nlp/data/country_code.json rename to config/country_code.json diff --git a/nautilus_nlp/data/french_FEEL.csv b/config/french_FEEL.csv similarity index 100% rename from nautilus_nlp/data/french_FEEL.csv rename to config/french_FEEL.csv diff --git a/nautilus_nlp/data/french_numbers.txt b/config/french_numbers.txt similarity index 100% rename from nautilus_nlp/data/french_numbers.txt rename to config/french_numbers.txt diff --git a/nautilus_nlp/data/french_stopwords.txt b/config/french_stopwords.txt similarity index 100% rename from nautilus_nlp/data/french_stopwords.txt rename to config/french_stopwords.txt diff --git a/nautilus_nlp/data/stopwords.json b/config/stopwords.json similarity index 100% rename from nautilus_nlp/data/stopwords.json rename to config/stopwords.json diff --git a/nautilus_nlp/analysis/ngrams.py b/nautilus_nlp/analysis/ngrams.py deleted file mode 100644 index 89cbb13..0000000 --- a/nautilus_nlp/analysis/ngrams.py +++ /dev/null @@ -1,39 +0,0 @@ -# GNU Lesser General Public License v3.0 only -# Copyright (C) 2020 Artefact -# licence-information@artefact.com -# -# This program is free software; you can redistribute it and/or -# modify it under the terms of the GNU Lesser General Public -# License as published by the Free Software Foundation; either -# version 3 of the License, or (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public License -# along with this program; if not, write to the Free Software Foundation, -# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. -# -*- coding: utf-8 -*- -from typing import List, Generator - - -def create_ngrams(tokens: List[str], nb_elements: int) -> Generator: - """ - Create n-grams for list of tokens - - Parameters - ---------- - tokens : list - list of strings - nb_elements : int - number of elements in the n-gram - - Returns - ------- - Generator - generator of all n-grams - """ - ngrams = zip(*[tokens[index_token:] for index_token in range(nb_elements)]) - return (" ".join(ngram) for ngram in ngrams) diff --git a/nautilus_nlp/data/.gitkeep b/nautilus_nlp/data/.gitkeep deleted file mode 100644 index e69de29..0000000 diff --git a/nautilus_nlp/data/__init__.py b/nautilus_nlp/data/__init__.py deleted file mode 100644 index d46139b..0000000 --- a/nautilus_nlp/data/__init__.py +++ /dev/null @@ -1,17 +0,0 @@ -# GNU Lesser General Public License v3.0 only -# Copyright (C) 2020 Artefact -# licence-information@artefact.com -# -# This program is free software; you can redistribute it and/or -# modify it under the terms of the GNU Lesser General Public -# License as published by the Free Software Foundation; either -# version 3 of the License, or (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public License -# along with this program; if not, write to the Free Software Foundation, -# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. diff --git a/nautilus_nlp/utils/__init__.py b/nautilus_nlp/utils/__init__.py deleted file mode 100644 index d46139b..0000000 --- a/nautilus_nlp/utils/__init__.py +++ /dev/null @@ -1,17 +0,0 @@ -# GNU Lesser General Public License v3.0 only -# Copyright (C) 2020 Artefact -# licence-information@artefact.com -# -# This program is free software; you can redistribute it and/or -# modify it under the terms of the GNU Lesser General Public -# License as published by the Free Software Foundation; either -# version 3 of the License, or (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public License -# along with this program; if not, write to the Free Software Foundation, -# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. diff --git a/nautilus_nlp/utils/keyword_extractor.py b/nautilus_nlp/utils/keyword_extractor.py deleted file mode 100644 index f804d52..0000000 --- a/nautilus_nlp/utils/keyword_extractor.py +++ /dev/null @@ -1,50 +0,0 @@ -# GNU Lesser General Public License v3.0 only -# Copyright (C) 2020 Artefact -# licence-information@artefact.com -# -# This program is free software; you can redistribute it and/or -# modify it under the terms of the GNU Lesser General Public -# License as published by the Free Software Foundation; either -# version 3 of the License, or (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public License -# along with this program; if not, write to the Free Software Foundation, -# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - -from flashtext import KeywordProcessor - - -def extract_keywords(text, keyword, case_sensitive=True): - """ - Extract Keywords from a document. - - Parameters - ---------- - text : str - Text to extract keywords from - keyword : - Single keyword (str) or list of keywords (list) - case_sensitive : - If False, will be case insensitive. - - Returns - ------- - list - Return list of extracted keyworkds - """ - - processor = KeywordProcessor(case_sensitive=case_sensitive) - if isinstance(keyword, list): - processor.add_keywords_from_list(keyword) - elif isinstance(keyword, str): - processor.add_keyword(keyword) - elif isinstance(keyword, dict): - processor.add_keywords_from_dict(keyword) - - return processor.extract_keywords(text) - \ No newline at end of file diff --git a/nautilus_nlp/preprocessing/__init__.py b/preprocessing/__init__.py similarity index 94% rename from nautilus_nlp/preprocessing/__init__.py rename to preprocessing/__init__.py index d46139b..7643ec5 100644 --- a/nautilus_nlp/preprocessing/__init__.py +++ b/preprocessing/__init__.py @@ -15,3 +15,4 @@ # You should have received a copy of the GNU Lesser General Public License # along with this program; if not, write to the Free Software Foundation, # Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +from nautilus_nlp.preprocessor import Preprocessor diff --git a/nautilus_nlp/preprocessing/data_augmentation.py b/preprocessing/augmentation/text_augmentation.py similarity index 100% rename from nautilus_nlp/preprocessing/data_augmentation.py rename to preprocessing/augmentation/text_augmentation.py diff --git a/nautilus_nlp/preprocessing/text_preprocess.py b/preprocessing/classic/preprocess.py similarity index 98% rename from nautilus_nlp/preprocessing/text_preprocess.py rename to preprocessing/classic/preprocess.py index ef6003a..691acae 100644 --- a/nautilus_nlp/preprocessing/text_preprocess.py +++ b/preprocessing/classic/preprocess.py @@ -23,9 +23,8 @@ import re import unicodedata from ftfy import fix_text as _fix_text -from nautilus_nlp.utils import constants -from nautilus_nlp.utils.phone_number import \ - extract_phone_numbers as _extract_phone_numbers +from config import constants +from utils.phone_number import extract_phone_numbers as _extract_phone_numbers def normalize_whitespace(text) -> str: diff --git a/preprocessing/preprocessor.py b/preprocessing/preprocessor.py new file mode 100644 index 0000000..0b34eb3 --- /dev/null +++ b/preprocessing/preprocessor.py @@ -0,0 +1,65 @@ +from typing import List, Callable + +from sklearn.pipeline import Pipeline +from sklearn.preprocessing import FunctionTransformer + +from preprocessing.social.preprocess import (remove_html_tags, remove_mentions, remove_emoji, + remove_hashtag) +from preprocessing.classic.preprocess import normalize_whitespace, remove_eol_characters, fix_bad_unicode + + +class Preprocessor(): + def __init__( + self): + """ + Initialize preprocessor object to apply all text transformation + """ + self.__operations = [] + self.pipeline = None + + def pipe(self, operation: Callable): + """ + Add an operation to pipe in the preprocessor + Parameters + ---------- + operation : callable + text preprocessing function + """ + self.__operations.append(operation) + + @staticmethod + def build_pipeline(operation_list: List[Callable]) -> Pipeline: + """ + Build sklearn pipeline from a operation list + Parameters + ---------- + operation_list : iterable + list of __operations of preprocessing + Returns + ------- + sklearn.pipeline.Pipeline + """ + return Pipeline( + steps=[ + (operation.__name__, FunctionTransformer(operation)) + for operation in operation_list]) + + + def run(self, text: str) -> str: + """ + Apply pipeline to text + Parameters + ---------- + text : string + text to preprocess + Returns + ------- + string + """ + operations = self.__operations + if operations == []: + operations = (remove_html_tags, remove_mentions, remove_emoji, remove_hashtag, + remove_eol_characters, fix_bad_unicode, normalize_whitespace) + self.pipeline = self.build_pipeline(operations) + text = self.pipeline.fit_transform(text) + return text \ No newline at end of file diff --git a/nautilus_nlp/preprocessing/social_preprocess.py b/preprocessing/social/preprocess.py similarity index 97% rename from nautilus_nlp/preprocessing/social_preprocess.py rename to preprocessing/social/preprocess.py index 20809a3..b017f65 100644 --- a/nautilus_nlp/preprocessing/social_preprocess.py +++ b/preprocessing/social/preprocess.py @@ -20,8 +20,8 @@ from __future__ import absolute_import, division, print_function, unicode_literals import emoji as _emoji -from nautilus_nlp.utils import constants -from nautilus_nlp.preprocessing.text_preprocess import normalize_whitespace +from config import constants +from preprocessing.classic.preprocess import normalize_whitespace def remove_mentions(text) -> str: diff --git a/nautilus_nlp/preprocessing/token_preprocess.py b/preprocessing/token/preprocess.py similarity index 100% rename from nautilus_nlp/preprocessing/token_preprocess.py rename to preprocessing/token/preprocess.py diff --git a/nautilus_nlp/utils/tokenizer.py b/preprocessing/token/tokenizer.py similarity index 100% rename from nautilus_nlp/utils/tokenizer.py rename to preprocessing/token/tokenizer.py diff --git a/tests/test_data_augmentation.py b/tests/test_data_augmentation.py index 863087e..d13245b 100644 --- a/tests/test_data_augmentation.py +++ b/tests/test_data_augmentation.py @@ -1,6 +1,8 @@ import pytest -from nautilus_nlp.preprocessing.data_augmentation import process_entities_and_text, \ - get_augmenter, CouldNotAugment, UnavailableAugmenter +from preprocessing.augmentation.text_augmentation import ( + process_entities_and_text, get_augmenter, CouldNotAugment, + UnavailableAugmenter +) @pytest.mark.parametrize( "text, text_augmented, entities, expected", diff --git a/tests/test_document_loader.py b/tests/test_document_loader.py index a757619..060af44 100644 --- a/tests/test_document_loader.py +++ b/tests/test_document_loader.py @@ -20,7 +20,7 @@ import os import numpy as np -from nautilus_nlp.utils.file_loader import (detect_encoding, documents_loader) +from utils.file_loader import (detect_encoding, documents_loader) TESTDOC_LATIN1 = "J'aime les frites bien grasse étalon châpeau!" TESTDOC_UTF8 = "Un deuxième exemple de texte en utf-8 cette fois!" diff --git a/tests/test_keyword_extractor.py b/tests/test_keyword_extractor.py deleted file mode 100644 index f694692..0000000 --- a/tests/test_keyword_extractor.py +++ /dev/null @@ -1,16 +0,0 @@ -import pytest -from nautilus_nlp.utils.keyword_extractor import extract_keywords - - -@pytest.mark.parametrize( - "input_text, keyword, case_sensitive, expected", - [ - ("I eat an orange oranges at Orange", 'orange', False, ['orange', 'orange']), - ("I eat an orange oranges at Orange", 'orange', True, ['orange']), - ("I eat an orange oranges at Orange", {'orange': ['orange', 'oranges']}, False, ['orange', 'orange', 'orange']), - ("I eat an orange oranges at Orange", {'orange': ['orange', 'oranges']}, True, ['orange', 'orange']), - ("I eat an orange oranges at Orange", {'fruit': ['orange', 'oranges']}, True, ['fruit', 'fruit']), - ] - ) -def test_extract_keywords(input_text, keyword, case_sensitive, expected): - assert extract_keywords(input_text, keyword=keyword, case_sensitive=case_sensitive) == expected diff --git a/tests/test_phone_number.py b/tests/test_phone_number.py index 4aff394..4b6c832 100644 --- a/tests/test_phone_number.py +++ b/tests/test_phone_number.py @@ -15,7 +15,7 @@ # You should have received a copy of the GNU Lesser General Public License # along with this program; if not, write to the Free Software Foundation, # Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. -import nautilus_nlp.utils.phone_number as phone +import utils.phone_number as phone def test_extract_phone_number(): input_str = '(541) 754-3010 is a US. Phone' diff --git a/tests/test_preprocessor.py b/tests/test_preprocessor.py index 51d94db..355836d 100644 --- a/tests/test_preprocessor.py +++ b/tests/test_preprocessor.py @@ -17,22 +17,22 @@ # Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. import pytest import numpy as np -from nautilus_nlp.preprocessing.text_preprocess import (normalize_whitespace, remove_eol_characters, +from preprocessing.classic.preprocess import (normalize_whitespace, remove_eol_characters, fix_bad_unicode, unpack_english_contractions, replace_urls, replace_emails, replace_phone_numbers, replace_numbers, replace_currency_symbols, remove_punct, remove_accents, remove_multiple_spaces_and_strip_text, filter_non_latin_characters) -from nautilus_nlp.preprocessing.social_preprocess import (remove_mentions, extract_mentions, remove_html_tags, +from preprocessing.social.preprocess import (remove_mentions, extract_mentions, remove_html_tags, remove_emoji, convert_emoji_to_text, extract_emojis, extract_hashtags, remove_hashtag) -from nautilus_nlp.preprocessing.token_preprocess import (remove_stopwords, remove_tokens_with_nonletters, +from preprocessing.token.preprocess import (remove_stopwords, remove_tokens_with_nonletters, remove_special_caracters_from_tokenslist, remove_smallwords) -from nautilus_nlp import Preprocessor +from preprocessing.preprocessor import Preprocessor -import nautilus_nlp.utils.phone_number as phone -from nautilus_nlp.utils.stopwords import get_stopwords +import utils.phone_number as phone +from utils.stopwords import get_stopwords @pytest.mark.parametrize("text, expected_result", diff --git a/nautilus_nlp/config/__init__.py b/utils/__init__.py similarity index 100% rename from nautilus_nlp/config/__init__.py rename to utils/__init__.py diff --git a/nautilus_nlp/utils/file_loader.py b/utils/file_loader.py similarity index 100% rename from nautilus_nlp/utils/file_loader.py rename to utils/file_loader.py diff --git a/nautilus_nlp/utils/phone_number.py b/utils/phone_number.py similarity index 67% rename from nautilus_nlp/utils/phone_number.py rename to utils/phone_number.py index 6ad58fc..6120155 100644 --- a/nautilus_nlp/utils/phone_number.py +++ b/utils/phone_number.py @@ -17,35 +17,8 @@ # Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. from typing import Optional import phonenumbers as _phonenumbers +from config.config import SUPPORTED_COUNTRY, FORMAT_NUMBERS -SUPPORTED_COUNTRY = [None, 'US', 'AG', 'AI', 'AS', 'BB', 'BM', 'BS', 'CA', 'DM', - 'GD', 'GU', 'JM', 'KN', 'KY', 'LC', 'MP', 'MS', 'PR', 'SX', 'TC', 'TT', - 'VC', 'VG', 'VI', 'RU', 'KZ', 'EG', 'ZA', 'GR', 'NL', 'BE', 'FR', 'ES', - 'HU', 'IT', 'VA', 'RO', 'CH', 'AT', 'GB', 'GG', 'IM', 'JE', 'DK', 'SE', - 'NO', 'SJ', 'PL', 'DE', 'PE', 'MX', 'CU', 'AR', 'BR', 'CL', 'CO', 'VE', - 'MY', 'AU', 'CC', 'CX', 'ID', 'PH', 'NZ', 'SG', 'TH', 'JP', 'KR', 'VN', - 'CN', 'TR', 'IN', 'PK', 'AF', 'LK', 'MM', 'IR', 'SS', 'MA', 'EH', 'DZ', - 'TN', 'LY', 'GM', 'SN', 'MR', 'ML', 'GN', 'CI', 'BF', 'NE', 'TG', 'BJ', - 'MU', 'LR', 'SL', 'GH', 'NG', 'TD', 'CF', 'CM', 'CV', 'ST', 'GQ', 'GA', - 'CG', 'CD', 'AO', 'GW', 'IO', 'AC', 'SC', 'SD', 'RW', 'ET', 'SO', 'DJ', - 'KE', 'TZ', 'UG', 'BI', 'MZ', 'ZM', 'MG', 'RE', 'YT', 'ZW', 'NA', 'MW', - 'LS', 'BW', 'SZ', 'KM', 'SH', 'TA', 'ER', 'AW', 'FO', 'GL', 'GI', 'PT', - 'LU', 'IE', 'IS', 'AL', 'MT', 'CY', 'FI', 'AX', 'BG', 'LT', 'LV', 'EE', - 'MD', 'AM', 'BY', 'AD', 'MC', 'SM', 'UA', 'RS', 'ME', 'XK', 'HR', 'SI', - 'BA', 'MK', 'CZ', 'SK', 'LI', 'FK', 'BZ', 'GT', 'SV', 'HN', 'NI', 'CR', - 'PA', 'PM', 'HT', 'GP', 'BL', 'MF', 'BO', 'GY', 'EC', 'GF', 'PY', 'MQ', - 'SR', 'UY', 'CW', 'BQ', 'TL', 'NF', 'BN', 'NR', 'PG', 'TO', 'SB', 'VU', - 'FJ', 'PW', 'WF', 'CK', 'NU', 'WS', 'KI', 'NC', 'TV', 'PF', 'TK', 'FM', - 'MH', 'KP', 'HK', 'MO', 'KH', 'LA', 'BD', 'TW', 'MV', 'LB', 'JO', 'SY', - 'IQ', 'KW', 'SA', 'YE', 'OM', 'PS', 'AE', 'IL', 'BH', 'QA', 'BT', 'MN', - 'NP', 'TJ', 'TM', 'AZ', 'GE', 'KG', 'UZ', 'DO'] - -FORMAT_NUMBERS = { - "E164": _phonenumbers.PhoneNumberFormat.E164, - "INTERNATIONAL": _phonenumbers.PhoneNumberFormat.INTERNATIONAL, - "NATIONAL": _phonenumbers.PhoneNumberFormat.NATIONAL, - "RFC3966": _phonenumbers.PhoneNumberFormat.RFC3966 -} def find_phone_numbers(string: str, region_code: Optional[str] = None) -> str: """ diff --git a/nautilus_nlp/utils/stopwords.py b/utils/stopwords.py similarity index 94% rename from nautilus_nlp/utils/stopwords.py rename to utils/stopwords.py index 0f3eb57..89cb7d0 100644 --- a/nautilus_nlp/utils/stopwords.py +++ b/utils/stopwords.py @@ -24,11 +24,8 @@ import os from stop_words import LANGUAGE_MAPPING as _LANGUAGE_MAPPING from stop_words import get_stop_words as _get_stop_words -from nautilus_nlp.config.config import ROOT_FOLDER -from nautilus_nlp.utils.file_loader import documents_loader - - -STOPWORDS_JSON_FILEPATH = os.path.join(ROOT_FOLDER, "data", "stopwords.json") +from config.config import STOPWORDS_JSON_FILEPATH +from utils.file_loader import documents_loader def _load_stopwords_from_json(filepath=STOPWORDS_JSON_FILEPATH): From 625b59f10cbd49836699b5d3e0e3ba13b5b133ed Mon Sep 17 00:00:00 2001 From: Rafaelle AYGALENQ <rafaelle.aygalenq@artefact.com> Date: Mon, 25 Jan 2021 20:35:59 +0100 Subject: [PATCH 442/496] update import init --- preprocessing/__init__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/preprocessing/__init__.py b/preprocessing/__init__.py index 7643ec5..97b4d25 100644 --- a/preprocessing/__init__.py +++ b/preprocessing/__init__.py @@ -15,4 +15,4 @@ # You should have received a copy of the GNU Lesser General Public License # along with this program; if not, write to the Free Software Foundation, # Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. -from nautilus_nlp.preprocessor import Preprocessor +from preprocessing.preprocessor import Preprocessor From f6cd208d398f54091676401edf1b905a3696acb8 Mon Sep 17 00:00:00 2001 From: Rafaelle AYGALENQ <rafaelle.aygalenq@artefact.com> Date: Mon, 25 Jan 2021 20:40:08 +0100 Subject: [PATCH 443/496] fix pylint --- tests/test_preprocessor.py | 27 +++++++++++++++------------ 1 file changed, 15 insertions(+), 12 deletions(-) diff --git a/tests/test_preprocessor.py b/tests/test_preprocessor.py index 355836d..13564b0 100644 --- a/tests/test_preprocessor.py +++ b/tests/test_preprocessor.py @@ -17,18 +17,21 @@ # Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. import pytest import numpy as np -from preprocessing.classic.preprocess import (normalize_whitespace, remove_eol_characters, - fix_bad_unicode, unpack_english_contractions, - replace_urls, replace_emails, replace_phone_numbers, - replace_numbers, replace_currency_symbols, remove_punct, - remove_accents, remove_multiple_spaces_and_strip_text, - filter_non_latin_characters) -from preprocessing.social.preprocess import (remove_mentions, extract_mentions, remove_html_tags, - remove_emoji, convert_emoji_to_text, extract_emojis, - extract_hashtags, remove_hashtag) -from preprocessing.token.preprocess import (remove_stopwords, remove_tokens_with_nonletters, - remove_special_caracters_from_tokenslist, - remove_smallwords) +from preprocessing.classic.preprocess import ( + normalize_whitespace, remove_eol_characters, fix_bad_unicode, + unpack_english_contractions, replace_urls, replace_emails, + replace_phone_numbers, replace_numbers, replace_currency_symbols, + remove_punct, remove_accents, remove_multiple_spaces_and_strip_text, + filter_non_latin_characters +) +from preprocessing.social.preprocess import ( + remove_mentions, extract_mentions, remove_html_tags, remove_emoji, + convert_emoji_to_text, extract_emojis, extract_hashtags, remove_hashtag +) +from preprocessing.token.preprocess import ( + remove_stopwords, remove_tokens_with_nonletters, + remove_special_caracters_from_tokenslist, remove_smallwords +) from preprocessing.preprocessor import Preprocessor import utils.phone_number as phone From b60173046560e34bd19e410690726f65ff141f5d Mon Sep 17 00:00:00 2001 From: Rafaelle AYGALENQ <rafaelle.aygalenq@artefact.com> Date: Mon, 25 Jan 2021 20:58:39 +0100 Subject: [PATCH 444/496] update ci with new name and fix pylint --- .github/workflows/ci_actions.yml | 4 ++-- preprocessing/preprocessor.py | 6 +++--- utils/stopwords.py | 1 - 3 files changed, 5 insertions(+), 6 deletions(-) diff --git a/.github/workflows/ci_actions.yml b/.github/workflows/ci_actions.yml index 2c410da..8cdb602 100644 --- a/.github/workflows/ci_actions.yml +++ b/.github/workflows/ci_actions.yml @@ -42,8 +42,8 @@ jobs: - name: Run pylint run: | - pylint nautilus_nlp tests + pylint config preprocessing utils tests - name: Run pytest run: | - pytest --cov=nautilus_nlp tests + pytest --cov=preprocessing tests diff --git a/preprocessing/preprocessor.py b/preprocessing/preprocessor.py index 0b34eb3..41ec77c 100644 --- a/preprocessing/preprocessor.py +++ b/preprocessing/preprocessor.py @@ -3,8 +3,8 @@ from sklearn.pipeline import Pipeline from sklearn.preprocessing import FunctionTransformer -from preprocessing.social.preprocess import (remove_html_tags, remove_mentions, remove_emoji, - remove_hashtag) +from preprocessing.social.preprocess import ( + remove_html_tags, remove_mentions, remove_emoji, remove_hashtag) from preprocessing.classic.preprocess import normalize_whitespace, remove_eol_characters, fix_bad_unicode @@ -62,4 +62,4 @@ def run(self, text: str) -> str: remove_eol_characters, fix_bad_unicode, normalize_whitespace) self.pipeline = self.build_pipeline(operations) text = self.pipeline.fit_transform(text) - return text \ No newline at end of file + return text diff --git a/utils/stopwords.py b/utils/stopwords.py index 89cb7d0..305ff2b 100644 --- a/utils/stopwords.py +++ b/utils/stopwords.py @@ -21,7 +21,6 @@ unicode_literals) import json -import os from stop_words import LANGUAGE_MAPPING as _LANGUAGE_MAPPING from stop_words import get_stop_words as _get_stop_words from config.config import STOPWORDS_JSON_FILEPATH From c403924a293fec83abfa6613a1d8ed81eb51114a Mon Sep 17 00:00:00 2001 From: Rafaelle AYGALENQ <rafaelle.aygalenq@artefact.com> Date: Mon, 25 Jan 2021 21:12:44 +0100 Subject: [PATCH 445/496] rm unused config files --- config/french_FEEL.csv | 14128 ---------------------------------- config/french_numbers.txt | 101 - config/french_stopwords.txt | 689 -- 3 files changed, 14918 deletions(-) delete mode 100644 config/french_FEEL.csv delete mode 100644 config/french_numbers.txt delete mode 100644 config/french_stopwords.txt diff --git a/config/french_FEEL.csv b/config/french_FEEL.csv deleted file mode 100644 index 40f15d6..0000000 --- a/config/french_FEEL.csv +++ /dev/null @@ -1,14128 +0,0 @@ -id;word;polarity;joy;fear;sadness;anger;surprise;disgust -1;à ce endroit là;positive;0;0;0;0;0;0 -2;à le hâte;negative;0;1;0;0;1;0 -3;à part;negative;0;0;1;0;0;0 -4;à pic;negative;0;1;0;0;0;0 -5;à rallonge;negative;0;0;1;0;0;0 -6;abasourdir;negative;0;0;0;0;1;0 -7;ablation;negative;0;1;0;0;0;1 -8;abominable;negative;0;1;0;0;0;1 -9;abrupt;negative;0;1;0;0;0;0 -10;absent;negative;0;1;1;0;0;0 -11;absorber;positive;0;0;0;0;1;0 -12;absurde;negative;0;0;0;1;1;1 -13;acceptable;positive;0;0;0;0;0;0 -14;accidentel;negative;0;1;1;0;1;0 -15;accusateur;negative;0;1;0;1;0;1 -16;accuser;negative;0;1;1;1;0;1 -17;acheteur;positive;0;0;0;0;0;0 -18;acquisition;positive;0;0;0;0;0;0 -19;active;positive;0;0;0;0;0;0 -20;actuel;positive;0;0;0;0;1;0 -21;addition;positive;0;0;0;0;0;0 -22;adhésif;positive;0;0;0;0;0;1 -23;administration;positive;0;0;0;0;0;0 -24;administratif;positive;0;0;0;0;0;0 -25;administrateur;positive;0;0;0;0;0;0 -26;admirateur;positive;0;0;0;0;0;0 -27;admissible;positive;0;0;0;0;0;0 -28;adolescent;positive;0;0;0;0;0;0 -29;aérien;positive;0;1;0;0;0;0 -30;affable;positive;0;0;0;0;0;0 -31;affaire;positive;0;0;0;0;0;0 -32;affectueux;positive;0;0;0;0;0;0 -33;affirmative;positive;0;0;0;0;0;0 -34;affliger;negative;0;1;1;0;0;0 -35;affreux;negative;0;1;1;1;1;1 -36;agent de conservation;positive;0;0;0;0;1;0 -37;agent de police;positive;0;1;0;0;0;0 -38;agrafe;positive;0;0;0;0;0;0 -39;agréable;positive;0;0;0;0;0;0 -40;agressif;negative;0;1;0;1;0;0 -41;agriculteur;positive;0;0;0;0;0;0 -42;aiguiser;positive;0;1;0;1;0;0 -43;aimer;positive;0;0;0;0;0;0 -44;aîné;positive;0;0;0;0;0;0 -45;aisément;positive;0;0;0;0;0;0 -46;alcalin;positive;0;0;0;0;0;0 -47;alentour;positive;0;0;0;0;0;0 -48;allonger;negative;0;1;1;1;0;1 -49;allure;positive;0;0;0;0;0;0 -50;allusion;negative;0;1;0;1;1;0 -51;alternative;positive;0;0;0;0;0;0 -52;amas;negative;0;0;0;0;0;0 -53;amatrice;negative;0;0;0;0;0;0 -54;ambassadrice;positive;0;0;0;0;0;0 -55;ambitieux;positive;0;0;0;0;0;0 -56;amélioration;positive;0;0;0;0;0;0 -57;ami;positive;0;0;0;0;0;0 -58;amourette;negative;0;0;0;0;0;0 -59;analyse;positive;0;0;0;0;0;0 -60;ancien;negative;0;0;0;0;0;0 -61;ancien élève;positive;0;0;0;0;0;0 -62;anguleux;positive;0;0;0;0;0;0 -63;animal;negative;0;1;0;0;0;1 -64;annuel;positive;0;0;0;0;0;0 -65;anticipatif;positive;0;0;0;0;0;0 -66;anxieux;negative;0;1;0;0;0;0 -67;apathique;negative;0;1;1;0;0;0 -68;apparenter;positive;0;0;0;0;0;0 -69;apprenant;positive;0;0;0;0;0;0 -70;apprenti;positive;0;0;0;0;0;0 -71;approbation;positive;0;0;0;0;0;0 -72;approbateur;positive;0;0;0;0;0;0 -73;approcher;positive;0;0;0;0;0;0 -74;approprier;positive;0;0;0;0;0;0 -75;approximatif;positive;0;0;0;0;0;0 -76;appui;positive;0;0;0;0;0;0 -77;aqueux;negative;0;0;0;0;0;1 -78;ardent;positive;0;0;0;0;1;0 -79;arête;negative;0;1;0;0;0;0 -80;aride;negative;0;1;1;0;0;0 -81;armature;positive;0;0;0;0;0;0 -82;arnaqueur;negative;0;1;0;1;0;1 -83;arrondissement;positive;0;0;0;0;0;0 -84;artisane;positive;0;0;0;0;0;0 -85;asile;positive;0;0;0;0;0;0 -86;asphyxie;negative;0;1;0;1;0;0 -87;aspiration;positive;0;0;0;0;0;0 -88;assaillant;negative;0;1;1;1;0;0 -89;assentiment;positive;0;0;0;0;0;0 -90;assidu;positive;0;0;0;0;0;0 -91;assistance;positive;0;0;0;0;0;0 -92;assistant;positive;0;0;0;0;0;0 -93;assourdir;negative;0;1;1;0;0;0 -94;asticot;negative;0;0;0;0;0;1 -95;astucieux;positive;0;0;0;0;0;0 -96;athéiste;negative;0;0;0;0;0;0 -97;attarder mental;negative;0;1;1;0;0;1 -98;attentif;positive;0;0;0;0;0;0 -99;attirer;positive;0;0;0;0;1;0 -100;attitude amical;positive;0;0;0;0;0;0 -101;attroupement;positive;0;0;0;0;0;0 -102;au chômage;negative;0;1;1;0;0;0 -103;au gouvernement;positive;0;0;0;0;0;0 -104;au premier plan;positive;0;0;0;0;0;0 -105;auditif;positive;0;0;0;0;0;0 -106;auditeur;positive;0;1;0;0;0;0 -107;augure;negative;0;1;0;0;0;0 -108;aussi que;positive;0;0;0;0;0;0 -109;autonomie;positive;0;0;0;0;0;0 -110;autosatisfaction;positive;0;0;0;0;0;0 -111;avant dernier;negative;0;0;1;0;0;0 -112;avantageux;positive;1;0;0;0;0;0 -113;avec amertume;negative;0;0;1;1;0;1 -114;avec fermeté;positive;0;0;0;0;0;0 -115;avec insistance;positive;0;0;0;0;0;0 -116;avec lequel;positive;0;0;0;0;0;0 -117;aventureux;positive;0;1;0;0;1;0 -118;aventurier;positive;0;1;0;0;1;0 -119;avocat;positive;0;1;0;1;0;1 -120;avoir du chagrin;negative;0;1;1;0;0;0 -121;avouer;negative;0;1;1;0;0;0 -122;badaud;positive;0;0;0;0;0;0 -123;bafouiller;negative;0;1;0;0;0;0 -124;baisse;negative;0;0;1;0;0;0 -125;baissière;negative;0;1;1;1;0;0 -126;balaise;negative;0;1;0;0;1;0 -127;balbutiement;positive;0;0;0;0;0;0 -128;banlieusard;negative;0;0;0;0;0;0 -129;bannière;positive;0;0;0;0;0;0 -130;banquière;positive;0;0;0;0;0;0 -131;banshie;negative;0;1;1;1;0;1 -132;baraquer;positive;0;1;0;0;0;0 -133;barge;negative;0;1;0;0;0;1 -134;bâtard;negative;0;1;0;1;0;1 -135;batifoler;positive;1;0;0;0;0;0 -136;battant;positive;0;0;0;0;0;0 -137;batteuse;positive;0;0;0;0;0;0 -138;bavardage;negative;0;0;0;0;0;0 -139;bavard;negative;0;0;0;0;0;0 -140;bazar;negative;0;1;1;1;0;1 -141;beau;positive;0;0;0;0;0;0 -142;belliqueux;negative;0;1;0;1;0;0 -143;bénigne;positive;1;0;0;0;0;0 -144;bête;negative;0;0;0;1;0;1 -145;beuglement;negative;0;1;1;1;0;0 -146;beugler;negative;0;1;1;1;0;0 -147;bien;positive;1;0;0;0;0;0 -148;bienfaiteur;positive;0;0;0;0;0;0 -149;bienheureux;positive;1;0;0;0;0;0 -150;bienveillance;positive;0;0;0;0;1;0 -151;bijoutier;positive;0;0;0;0;0;0 -152;bimensuel;positive;0;0;0;0;0;0 -153;bisannuel;positive;0;0;0;0;0;0 -154;bisexuel;positive;0;0;0;0;0;0 -155;blagueur;positive;0;0;0;0;1;0 -156;blanc;positive;0;0;0;0;0;0 -157;bloquer;negative;0;1;0;0;1;0 -158;boiteux;negative;0;0;1;0;0;0 -159;bon à manger;positive;0;0;0;0;0;0 -160;bon à rien;negative;0;0;1;1;0;1 -161;bord;positive;0;0;0;0;0;0 -162;bord de mer;positive;0;0;0;0;0;0 -163;boueux;negative;0;0;0;0;0;1 -164;bouleverser;negative;0;1;1;1;0;0 -165;bourbe;negative;0;1;0;0;0;1 -166;bourde;negative;0;1;1;0;0;1 -167;bourgeois;negative;0;0;0;0;0;0 -168;bourrasque;negative;0;1;0;0;1;0 -169;bourru;negative;0;0;0;1;0;1 -170;boutonneux;negative;0;0;0;0;0;1 -171;boxeuse;positive;0;0;0;1;0;0 -172;boycottage;negative;0;0;0;1;0;1 -173;brève;positive;0;0;0;0;0;0 -174;brillant;positive;0;0;0;0;0;0 -175;briller;positive;0;0;0;0;0;1 -176;broche;positive;0;0;0;0;0;0 -177;brouiller;negative;0;1;0;0;0;0 -178;broussailleux;negative;0;0;0;0;0;0 -179;brumeux;negative;0;1;1;0;0;0 -180;bruyamment;negative;0;0;0;1;0;0 -181;bruyère;negative;0;0;0;0;0;0 -182;câble;positive;0;0;0;0;1;0 -183;cache nez;negative;0;0;0;0;0;0 -184;caduque;negative;0;0;1;0;0;1 -185;cafouiller;negative;0;0;0;0;0;0 -186;cafteur;negative;0;0;0;1;0;0 -187;caillouteux;negative;0;1;0;0;0;0 -188;caissier;positive;0;0;0;0;0;0 -189;calcul;positive;0;0;0;1;0;0 -190;calleux;negative;0;0;0;1;0;1 -191;calme;positive;0;0;0;0;0;0 -192;calmer;positive;0;0;0;0;0;0 -193;calomnieux;negative;0;0;0;1;0;1 -194;calvaire;negative;0;1;1;1;1;0 -195;cambrioleur;negative;0;1;0;0;0;1 -196;candidat;positive;0;0;0;0;0;0 -197;candide;negative;0;0;1;0;0;0 -198;capital;positive;0;0;0;0;0;0 -199;capiteux;negative;1;0;0;0;0;0 -200;capitonnage;positive;0;0;0;0;0;0 -201;capricieux;negative;0;0;0;1;0;0 -202;capsule;positive;0;0;0;0;0;0 -203;captiver;positive;0;0;0;0;0;0 -204;captif;negative;0;1;1;0;0;0 -205;capturer au lasso;negative;0;1;0;1;0;0 -206;caritatif;positive;0;0;0;0;0;0 -207;cascade;positive;0;1;0;0;1;0 -208;catcheur;negative;0;1;0;1;0;0 -209;caustique;negative;0;1;0;0;0;1 -210;cavalier;positive;0;0;0;0;0;0 -211;cédant;positive;0;0;0;0;0;0 -212;cellier;positive;0;0;0;0;0;0 -213;cérémoniel;positive;0;0;0;0;0;0 -214;chahut;negative;0;0;0;1;0;1 -215;chahuteur;negative;0;0;0;1;0;0 -216;chamailleur;negative;0;0;0;1;0;1 -217;champion;positive;0;0;0;0;0;0 -218;chancelière;positive;0;0;0;0;0;0 -219;chanceux;positive;1;0;0;0;0;0 -220;chanteur;positive;0;0;0;0;0;0 -221;chaotique;negative;0;1;1;0;0;0 -222;charade;positive;0;0;0;0;1;0 -223;charge;negative;0;1;0;1;1;0 -224;charme;positive;0;0;0;0;1;0 -225;charnel;negative;0;0;0;0;0;0 -226;chasseur;negative;0;1;1;1;0;0 -227;chatouilleur;negative;0;0;0;0;0;0 -228;chemin;positive;0;0;0;0;0;0 -229;chenapan;negative;0;1;0;1;0;1 -230;chercheur;positive;0;0;0;0;0;0 -231;chétif;negative;0;1;1;0;0;1 -232;chevelu;negative;0;0;0;0;0;1 -233;chirurgien;positive;0;0;0;0;0;0 -234;chômeur;negative;0;1;1;0;0;0 -235;cingler;negative;0;1;0;0;1;1 -236;circonscription;positive;0;0;0;0;0;0 -237;cireur;negative;0;0;0;0;0;1 -238;citoyen;positive;0;0;0;0;0;0 -239;civil;positive;0;0;0;0;0;0 -240;clairvoyant;positive;0;0;0;0;0;0 -241;claquement;negative;0;1;0;0;1;0 -242;classification;negative;0;1;1;1;0;0 -243;clef;positive;0;0;0;0;0;0 -244;clément;positive;1;0;0;0;0;0 -245;client;positive;0;0;0;0;0;0 -246;clore;negative;0;0;1;0;0;0 -247;coder;negative;0;0;0;0;0;0 -248;coercitif;negative;0;1;1;0;0;0 -249;cognitif;positive;0;0;0;0;0;0 -250;cohérence;positive;0;0;0;0;0;0 -251;cohésion;positive;0;0;0;0;0;0 -252;cohésif;positive;0;0;0;0;0;0 -253;coiffeur|coiffeuse;positive;0;0;0;0;0;0 -254;collaborateur;positive;0;0;0;0;0;0 -255;collecter;positive;0;0;0;0;0;0 -256;collectionneur;positive;0;0;0;0;0;0 -257;collectif;positive;0;0;0;0;0;0 -258;colonisateur;negative;0;1;0;0;0;0 -259;comateux;negative;0;1;1;0;0;0 -260;combattant;positive;0;0;0;1;0;0 -261;comique;positive;1;0;0;0;0;0 -262;commémoratif;positive;0;0;1;0;0;0 -263;commencement;positive;0;0;0;0;0;0 -264;commentateur;positive;0;0;0;0;0;0 -265;commerçant;positive;0;0;0;0;0;0 -266;commission;positive;0;0;0;0;0;0 -267;commode;positive;1;0;0;0;0;0 -268;commun;positive;0;0;0;0;0;0 -269;communicatif;positive;1;0;0;0;0;0 -270;compact;positive;0;0;0;0;0;0 -271;compensateur;positive;0;0;0;0;0;0 -272;compétence;positive;0;0;0;0;0;0 -273;compétitif;negative;0;0;0;1;0;0 -274;complètement;positive;0;0;0;0;0;0 -275;comploter;negative;0;1;0;1;0;0 -276;compositeur;positive;0;0;0;0;0;0 -277;concevoir;positive;0;0;0;0;0;0 -278;concilier;positive;0;0;0;0;0;0 -279;concorde;positive;0;0;0;0;0;0 -280;concret;positive;0;0;0;0;0;0 -281;concurrent;negative;0;1;1;1;0;1 -282;concurrentiel;negative;0;0;0;1;0;0 -283;conditionnel;positive;0;0;0;0;0;0 -284;confection;positive;0;0;0;0;0;0 -285;confessionnel;positive;0;0;0;0;0;0 -286;confidentiel;positive;0;0;0;0;0;0 -287;conflit;negative;0;0;0;1;0;0 -288;confrérie féminin;positive;0;0;0;0;0;0 -289;confus;negative;0;1;1;0;0;0 -290;conjecture;negative;0;1;1;0;0;0 -291;conjoint;positive;0;0;0;0;0;0 -292;connaisseur;positive;0;0;0;0;0;0 -293;connecter;positive;0;0;0;0;0;0 -294;connaître;positive;0;0;0;0;0;0 -295;conquérant;positive;0;0;0;0;0;0 -296;consciencieux;positive;0;0;0;0;0;0 -297;consécutif;positive;0;0;0;0;0;0 -298;conseiller;positive;0;1;0;1;0;0 -299;consentement;positive;0;0;0;0;0;0 -300;conservation;positive;0;0;0;0;0;0 -301;conservateur;negative;0;0;0;0;1;0 -302;consolateur;positive;1;0;0;0;0;0 -303;conspiration;negative;0;1;1;1;0;1 -304;conspirateur;negative;0;1;0;1;0;1 -305;constamment;negative;0;0;0;0;0;0 -306;constitutionnel;positive;0;0;0;0;0;0 -307;contagieux;negative;0;1;1;0;0;1 -308;conte;positive;1;0;0;0;0;0 -309;contemporain;positive;0;0;0;0;0;0 -310;content;positive;0;0;0;0;0;0 -311;contestable;negative;0;0;0;0;0;0 -312;conteur;positive;0;0;0;0;0;0 -313;contiguë;positive;0;0;0;0;0;0 -314;continuel;positive;0;0;0;0;0;0 -315;contraindre;negative;0;1;0;0;0;0 -316;contrarier;negative;0;1;1;1;0;1 -317;contrebandier;negative;0;1;0;1;0;1 -318;contrecarrer;positive;0;1;0;1;1;0 -319;contremaître;positive;0;0;0;0;0;0 -320;contretemps;negative;0;1;1;0;1;1 -321;contrevenant;negative;0;1;1;1;0;1 -322;contrevenir à;negative;0;0;0;1;0;0 -323;contributrice;positive;0;0;0;0;0;0 -324;convenance;positive;1;0;0;0;0;0 -325;conventionnel;positive;0;0;0;0;0;0 -326;copain;positive;0;0;0;0;0;0 -327;copieur;negative;0;0;0;1;0;1 -328;copine;positive;0;0;0;0;0;0 -329;coquillage;negative;0;0;0;0;0;1 -330;corallien;positive;0;0;0;0;0;0 -331;corbeau;negative;0;0;0;1;0;1 -332;cordial;positive;0;0;0;0;0;0 -333;corporel;positive;0;0;0;0;0;0 -334;correctif;negative;0;1;1;0;0;0 -335;correspondant;positive;0;0;0;0;0;0 -336;costaud;positive;0;1;0;0;0;0 -337;côtier;positive;0;0;0;0;0;0 -338;côtière;positive;0;0;0;0;0;0 -339;coup de feu;negative;0;1;1;1;0;0 -340;courageux;positive;0;1;0;0;0;0 -341;courbure;positive;0;0;0;0;0;0 -342;coureur;positive;0;0;0;0;0;0 -343;courrier;positive;0;0;0;0;0;0 -344;courroie;negative;0;1;0;0;0;0 -345;courtier;positive;0;0;0;0;0;0 -346;coutumier;positive;0;0;0;0;0;0 -347;crainte;negative;0;1;0;0;0;0 -348;craintif;negative;0;1;1;0;0;0 -349;crasseux;negative;0;0;0;0;0;1 -350;créancier;positive;0;0;0;0;0;0 -351;créateur;positive;0;0;0;0;0;0 -352;crémeux;positive;0;0;0;0;0;0 -353;crétin;negative;0;0;0;1;0;1 -354;creux;negative;0;1;1;0;0;0 -355;crevasse;negative;0;1;0;0;1;0 -356;cri;negative;0;1;0;1;1;0 -357;criminel;negative;0;1;0;1;0;1 -358;critiquer;negative;0;0;0;1;0;0 -359;critiqueur;negative;0;0;0;1;0;1 -360;croître;positive;0;0;0;0;0;0 -361;crosse;positive;0;0;0;0;0;0 -362;croyant;positive;0;0;0;0;0;0 -363;cruel;negative;0;1;1;1;0;1 -364;cruellement;negative;0;0;1;0;0;0 -365;cueilleur;positive;0;0;0;0;0;0 -366;cultiver;positive;0;0;0;0;0;0 -367;curatif;positive;0;0;0;0;0;0 -368;curé;positive;0;0;0;0;0;0 -369;curieux;negative;0;0;0;0;0;0 -370;curseur;positive;0;0;0;0;0;0 -371;cursus;positive;0;0;0;0;0;0 -372;cutané;positive;0;0;0;0;0;0 -373;cuve;negative;0;0;0;0;0;1 -374;cuvette;positive;0;0;0;0;0;0 -375;dangereux;negative;0;1;1;1;1;0 -376;danseur;positive;0;0;0;0;0;0 -377;de ce monde;positive;0;0;0;0;0;0 -378;de garçon;positive;0;0;0;0;0;0 -379;de naissance;positive;0;0;0;0;0;0 -380;de travers;negative;0;1;1;0;0;1 -381;débiteur;negative;0;1;1;0;0;0 -382;début;positive;0;0;0;0;0;0 -383;débutant;negative;0;1;0;0;0;0 -384;déception;negative;0;0;1;1;0;0 -385;décès;negative;0;0;1;0;0;0 -386;déchaîner;negative;0;1;0;1;1;1 -387;déclaration;positive;0;0;0;0;0;0 -388;déclarer;positive;0;1;0;0;0;0 -389;déclinaison;positive;0;0;1;0;0;0 -390;décombre|décombres;negative;0;1;1;0;0;1 -391;décontracter;positive;1;0;0;0;0;0 -392;décoratif;positive;0;0;0;0;0;0 -393;décevoir;negative;0;0;1;1;0;0 -394;dédaigneux;negative;0;0;0;1;0;1 -395;défaire son valise;positive;0;0;0;0;0;0 -396;défaire;negative;0;0;0;0;0;0 -397;défectueux;negative;0;0;1;0;0;1 -398;défendable;positive;0;0;0;0;0;0 -399;défendeur;positive;0;1;1;1;0;0 -400;défensif;negative;0;0;0;0;0;0 -401;déficience;negative;0;0;1;0;0;0 -402;dégât;negative;0;0;1;1;0;1 -403;dégénérer;negative;0;1;0;0;0;1 -404;dégoûter;negative;0;1;1;1;0;1 -405;délabrer;negative;0;0;1;0;0;0 -406;délaver;negative;0;0;1;0;0;0 -407;déléguer;positive;0;0;0;0;0;0 -408;délicat;negative;0;1;0;0;0;0 -409;délicatesse;positive;0;0;0;0;0;0 -410;délice;positive;1;0;0;0;0;0 -411;délicieux;positive;1;0;0;0;0;0 -412;délinquant;negative;0;1;1;1;0;1 -413;demanderesse;negative;0;0;1;1;0;1 -414;démence;negative;0;1;1;1;0;1 -415;dément;negative;0;1;0;1;0;0 -416;demeure;positive;0;0;0;0;0;0 -417;démonstrateur;positive;0;0;0;0;0;0 -418;dentaire;positive;0;0;0;0;0;0 -419;dénuer;negative;0;1;1;0;0;0 -420;dépareiller;negative;0;0;0;0;0;0 -421;déplacer;negative;0;0;0;1;1;0 -422;déplaire;negative;0;0;1;0;0;1 -423;dépourvue;negative;0;0;1;0;0;0 -424;dépourvues;negative;0;0;1;0;0;0 -425;dépourvus;negative;0;0;1;0;0;0 -426;dépressif;negative;0;1;1;1;0;0 -427;dérogation;positive;0;0;0;0;0;0 -428;dérouter;negative;0;1;1;0;1;0 -429;du conjoint;positive;0;0;0;0;0;0 -430;désagrément;negative;0;0;0;1;0;0 -431;désapprobateur;negative;0;0;1;1;0;1 -432;désastreux;negative;0;1;1;1;0;1 -433;désavantage;negative;0;0;1;0;0;0 -434;descendant;positive;0;0;0;0;0;0 -435;descriptif;positive;0;0;0;0;0;0 -436;déshonneur;negative;0;0;1;0;0;1 -437;désopiler;positive;0;0;0;0;1;0 -438;désordre;negative;0;1;0;1;1;0 -439;désorganisation;negative;0;0;0;0;0;0 -440;dessiner le contour;positive;0;0;0;0;0;0 -441;destroyer;negative;0;1;0;1;0;0 -442;destructeur;negative;0;1;1;1;0;1 -443;déstructurer;negative;0;1;1;0;0;0 -444;détenteur;positive;0;0;0;0;0;0 -445;détenir;negative;0;1;1;1;0;1 -446;déterminer;positive;0;0;0;0;0;0 -447;détourner;negative;0;1;1;0;0;0 -448;dévalorisation;negative;0;1;1;0;0;0 -449;dévastateur;negative;0;1;1;1;0;1 -450;dévoiler;negative;0;1;0;0;1;0 -451;dictateur;negative;0;1;1;1;0;0 -452;diffamatoire;negative;0;0;0;1;0;1 -453;différend;negative;0;0;1;1;0;0 -454;différentiel;positive;0;0;0;0;0;0 -455;difficile;negative;0;0;1;0;0;0 -456;difficulté;negative;0;0;1;0;0;0 -457;difforme;negative;0;1;1;0;0;1 -458;difformité;negative;0;1;1;0;0;1 -459;diminuer;negative;0;0;1;0;0;0 -460;diminution;negative;0;0;1;0;0;0 -461;dingue;negative;0;1;0;0;1;1 -462;directement;positive;0;0;0;0;0;0 -463;directeur|directrice de le photographie;positive;0;0;0;0;0;0 -464;discipliner;positive;0;0;0;0;0;0 -465;discordance;negative;0;0;0;1;0;0 -466;discret;positive;0;0;1;0;1;0 -467;disgracieux;negative;0;0;0;0;0;1 -468;dispute;negative;0;1;1;1;0;1 -469;dissident;negative;0;1;0;1;0;0 -470;dissimuler;negative;0;1;1;0;0;0 -471;distinction;positive;0;0;0;0;1;0 -472;distinctif;positive;0;0;0;0;0;0 -473;distinguer;positive;0;0;0;0;0;0 -474;divertir;positive;1;0;0;0;0;0 -475;divin;positive;0;0;0;0;0;0 -476;diviser en deux;negative;0;0;0;0;0;0 -477;divulgation;negative;0;1;0;0;1;0 -478;dominateur;negative;0;0;0;1;0;0 -479;donateur;positive;0;0;0;0;0;0 -480;donner son approbation à;positive;0;0;0;0;0;0 -481;donneur;positive;0;0;0;0;0;0 -482;dormeur|dormeuse;positive;0;0;0;0;0;0 -483;doux;positive;0;0;1;0;0;0 -484;douer;positive;0;0;0;0;0;0 -485;douloureux;negative;0;1;1;1;0;1 -486;douteur;negative;0;1;0;0;0;1 -487;doyen;positive;0;0;0;0;0;0 -488;draconien;negative;0;0;1;0;0;0 -489;du gouverneur;positive;0;0;0;0;0;0 -490;du moi|mois précédent;positive;0;0;0;0;0;0 -491;dual;positive;0;0;0;0;0;0 -492;dubitatif;negative;0;1;0;0;0;0 -493;duperie;negative;0;1;1;1;1;1 -494;duplicata;positive;0;0;0;0;0;0 -495;duveteux;positive;1;0;0;0;0;0 -496;ébouriffer;negative;0;0;0;0;0;1 -497;ébranler;negative;0;1;1;0;1;0 -498;écailleur;negative;0;0;0;0;0;1 -499;écartement;positive;0;0;0;0;0;0 -500;échec;negative;0;0;1;0;0;1 -501;éclaireur;positive;0;0;0;0;0;0 -502;éclat;positive;1;0;0;0;0;0 -503;économe;positive;0;0;0;0;0;0 -504;écoulement;positive;0;0;0;0;0;0 -505;écraser;negative;0;0;1;0;0;0 -506;écume;positive;0;0;0;0;0;1 -507;écumeur;negative;0;0;0;0;0;1 -508;édifice;positive;0;0;0;0;0;0 -509;éditeur;positive;0;0;0;0;0;0 -510;effervescence;negative;0;1;0;0;1;0 -511;effrayer|effrayer;negative;0;1;1;1;0;1 -512;effroyable;negative;0;0;1;0;1;0 -513;égarer;negative;0;1;1;0;1;0 -514;élan;positive;0;0;0;0;0;0 -515;électeur;positive;0;0;0;0;0;0 -516;éleveur;positive;0;0;0;0;0;0 -517;élocution;positive;0;0;0;0;0;0 -518;emballeur;positive;0;0;0;0;0;0 -519;embarrasser;negative;0;1;0;0;0;1 -520;éminent;positive;0;0;0;0;0;0 -521;émotif;negative;0;1;1;0;0;0 -522;empaqueteur|empaqueteuse;positive;0;0;0;0;0;0 -523;employer;positive;0;0;0;0;0;0 -524;employer de bureau;positive;0;0;0;0;0;0 -525;empoisonner;negative;0;1;1;1;1;1 -526;empreinte digital;positive;0;0;0;0;0;0 -527;emprunteur;negative;0;0;0;0;0;0 -528;en avant;positive;0;0;0;0;0;0 -529;en diminution;negative;0;0;1;0;0;0 -530;en double;positive;0;0;0;0;0;0 -531;en extase;positive;0;0;0;0;1;0 -532;en flamme;negative;0;1;0;1;0;0 -533;en ivoire;positive;0;0;0;0;0;0 -534;en or;positive;0;0;0;0;0;0 -535;en totalité;positive;0;0;0;0;0;0 -536;enchérisseuse;positive;0;0;0;0;0;0 -537;endormir;positive;0;0;0;0;0;0 -538;enduire;positive;0;0;0;0;0;0 -539;enflammer;negative;0;0;0;1;0;0 -540;engager;positive;0;0;0;0;0;0 -541;enlever;negative;0;1;1;1;0;0 -542;ennemi;negative;0;1;1;1;0;1 -543;ennuyeux;negative;0;1;1;1;0;1 -544;énormément;negative;0;0;1;0;0;0 -545;enquêtrice;positive;0;0;0;0;0;0 -546;entaille;negative;0;1;1;0;0;0 -547;entente;positive;0;0;0;0;0;0 -548;entier;positive;0;0;0;0;0;0 -549;entrain;positive;0;0;0;0;0;0 -550;entraîneur;positive;0;0;0;0;0;0 -551;entre parenthèse;negative;0;0;0;0;0;0 -552;entremetteur;positive;0;0;0;0;0;0 -553;envieux;negative;0;0;0;1;0;0 -554;environ|environs;positive;0;0;0;0;0;0 -555;envoyer;positive;0;0;0;0;0;0 -556;épars;negative;0;0;1;0;0;0 -557;épicier;positive;0;0;0;0;0;0 -558;épineux;negative;0;1;1;1;1;1 -559;éploré;negative;0;1;1;1;0;0 -560;épluchure;negative;0;0;0;0;0;0 -561;épouse;positive;0;0;0;0;0;0 -562;épouvantable;negative;0;1;1;1;0;1 -563;équivalent;positive;0;0;0;0;0;0 -564;éroder;negative;0;0;1;0;0;1 -565;escarper;negative;0;1;0;0;0;0 -566;escroquer;negative;0;1;1;1;1;0 -567;espèce;positive;0;0;0;0;0;0 -568;espiègle;positive;0;0;0;1;1;0 -569;espion;negative;0;1;0;0;1;0 -570;esprit du mal;negative;0;1;0;1;0;1 -571;estimable;positive;0;0;0;0;0;0 -572;étape;positive;0;0;0;0;0;0 -573;étendre;negative;0;1;1;1;0;1 -574;éternel;positive;0;0;1;0;0;0 -575;étonnant;positive;0;0;0;0;1;0 -576;étouffer;negative;0;1;1;1;0;0 -577;étrange;negative;0;1;0;0;1;1 -578;étranger;negative;0;1;1;0;0;1 -579;être apprenti;positive;0;0;0;0;0;0 -580;être constamment sur le dos de;negative;0;1;1;1;0;0 -581;étreindre;positive;0;0;0;0;1;0 -582;étreinte;positive;0;0;0;0;0;0 -583;étudiant;positive;0;0;0;0;0;0 -584;évasif;negative;0;0;0;0;1;0 -585;éventuel;negative;0;0;0;0;0;0 -586;évitement;negative;0;0;0;0;0;1 -587;évocateur;positive;0;0;0;0;0;0 -588;examinateur;positive;0;0;0;0;0;0 -589;exceptionnel;positive;0;0;0;0;1;0 -590;excessif;negative;0;0;1;1;0;0 -591;excursion;positive;0;0;0;0;0;0 -592;excuser;positive;0;0;0;0;0;0 -593;excuser moi;positive;0;0;0;0;0;0 -594;exécrer;negative;0;1;0;1;0;1 -595;exécuteur testamentaire;positive;0;0;0;0;0;0 -596;exhaustif;positive;0;0;0;0;0;0 -597;exiger;negative;0;0;0;1;0;0 -598;exister;positive;0;0;0;0;0;0 -599;existence;positive;1;0;0;0;0;0 -600;expatrier;negative;0;1;1;0;0;0 -601;expérimentateur;positive;0;0;0;0;0;0 -602;expérimenter;positive;0;0;0;0;0;0 -603;expert;positive;0;0;0;0;0;0 -604;expertise;positive;0;0;0;0;0;0 -605;explicatif;positive;0;0;0;0;0;0 -606;explosif;negative;0;1;0;1;1;0 -607;expulser;negative;0;1;1;1;1;0 -608;exténuer;negative;0;0;1;0;0;0 -609;extrêmement;negative;0;0;1;0;0;0 -610;fabricant;positive;0;0;0;0;0;0 -611;fabriquer;positive;0;0;0;0;0;0 -612;fabriquer de tout pièce;negative;0;0;0;0;0;0 -613;facile;positive;0;0;0;0;0;0 -614;facultatif;positive;0;0;0;0;0;0 -615;faire attention à;negative;0;1;0;0;0;0 -616;faire dissidence;negative;0;0;0;1;0;0 -617;faire du shopping;positive;0;0;0;0;1;0 -618;faire obstacle à;negative;0;0;1;1;0;0 -619;faire un manifestation devant;negative;0;1;0;1;1;0 -620;faire un sieste;positive;0;0;0;0;0;0 -621;faisable;positive;1;0;0;0;0;0 -622;fallacieux;negative;0;0;0;1;0;1 -623;familial;positive;0;0;0;0;0;0 -624;fanatique;positive;0;1;0;1;0;0 -625;farfadet;positive;0;1;0;0;0;0 -626;fastidieux;negative;0;0;1;0;0;0 -627;FAUX;negative;0;1;1;1;0;1 -628;favorable;positive;1;0;0;0;0;0 -629;fécond;positive;0;0;0;0;0;0 -630;feignant;negative;0;0;0;0;0;1 -631;féminin;positive;0;0;0;0;0;0 -632;fermier;positive;0;0;0;0;0;0 -633;fermoir;positive;0;0;0;0;0;0 -634;fervent;positive;0;0;0;0;0;0 -635;ferveur;positive;1;0;0;0;0;0 -636;festin;positive;1;0;0;0;0;0 -637;festif;positive;1;0;0;0;0;0 -638;feutrer;positive;0;0;0;0;0;0 -639;fidèle;positive;0;0;0;0;0;0 -640;fier;positive;0;0;0;0;0;0 -641;fiévreux;negative;0;1;0;0;0;0 -642;figuratif;positive;0;0;0;0;0;0 -643;filandreux;negative;0;0;0;0;0;1 -644;fin;negative;0;1;1;0;0;0 -645;flatteur;positive;1;0;0;0;0;0 -646;flot;negative;0;1;0;0;1;0 -647;folle|fou;negative;0;1;0;1;1;1 -648;folle|fou de joie;positive;1;0;0;0;0;0 -649;folle|fou furieux;negative;0;1;0;1;0;1 -650;fonceur;positive;0;0;0;0;0;0 -651;fonctionnel;positive;0;0;0;0;0;0 -652;fondateur;positive;0;0;0;0;0;0 -653;forcer;negative;0;1;0;0;0;0 -654;forcément;positive;0;0;0;0;0;0 -655;foreur;negative;0;1;0;1;0;0 -656;formatif;positive;0;0;0;0;0;0 -657;formateur;positive;0;0;0;0;0;0 -658;forme;positive;0;0;0;0;0;0 -659;fort;positive;0;0;0;0;0;0 -660;forteresse;positive;0;0;0;0;0;0 -661;fouillis;negative;0;0;0;1;0;1 -662;fouineur;negative;0;0;0;1;0;1 -663;fourgonnette;positive;0;0;0;0;0;0 -664;fragmenter;negative;0;0;1;0;0;0 -665;franc;positive;0;0;0;0;1;0 -666;fraternel;positive;0;0;0;0;0;0 -667;frauduleux;negative;0;0;0;1;0;1 -668;frimeur;negative;0;0;0;1;0;0 -669;frisson;negative;0;1;0;0;0;0 -670;froid;negative;0;0;1;1;0;0 -671;fructueux;positive;1;0;0;0;0;0 -672;fruit de l imagination;positive;0;0;0;0;0;0 -673;fugitif;negative;0;1;1;1;0;1 -674;fugueur;negative;0;1;1;0;0;0 -675;fumeur|fumeuse;negative;0;0;0;0;0;1 -676;furie;negative;0;1;1;1;0;0 -677;furieux;negative;0;0;0;1;0;1 -678;furtif;negative;0;1;0;0;1;0 -679;futé;negative;1;0;0;0;0;0 -680;gadoue;negative;0;0;0;0;0;1 -681;gagnant;positive;0;0;0;0;1;0 -682;gain;positive;0;0;0;0;1;0 -683;gamin;positive;0;0;0;1;0;0 -684;garant;positive;0;0;0;0;0;0 -685;gardien;positive;0;0;0;0;0;0 -686;garnement;negative;0;0;0;1;0;0 -687;gaspilleur;negative;0;0;1;1;0;1 -688;gazouillis;positive;1;0;0;0;0;0 -689;géant;negative;0;1;0;0;0;1 -690;gélatineux;negative;0;0;0;0;0;1 -691;gemme;positive;1;0;0;0;0;0 -692;gêner;negative;0;1;0;0;0;0 -693;généraliser;positive;0;0;0;0;0;0 -694;générateur|génératrice;positive;0;0;0;0;0;0 -695;généreux;positive;0;0;0;0;0;0 -696;genre;positive;0;0;0;0;0;0 -697;girond;positive;0;0;0;0;0;0 -698;gitan;negative;0;0;0;0;0;1 -699;glaçage;positive;0;0;0;0;0;0 -700;glauque;negative;0;1;1;0;0;1 -701;globalité;positive;0;0;0;0;0;0 -702;glume;positive;0;0;0;0;0;0 -703;gousse;positive;0;0;0;0;0;0 -704;gracieux;positive;0;0;0;0;0;0 -705;graduel;positive;0;0;0;0;0;0 -706;grain;positive;0;0;0;0;0;0 -707;graisseur|graisseux;negative;0;0;0;0;0;1 -708;grand salle;positive;0;0;0;0;0;0 -709;granuleux;negative;0;0;0;0;0;1 -710;gras;negative;0;0;0;0;0;1 -711;gravats;negative;0;1;1;0;0;0 -712;graveleux;negative;0;0;0;0;0;1 -713;graveur;positive;0;0;0;0;0;0 -714;grincheux;negative;0;0;1;1;0;0 -715;grisonner;negative;0;0;1;0;0;1 -716;grizzly;negative;0;1;0;0;0;0 -717;grossier;negative;0;0;0;0;0;1 -718;grossièreté;negative;0;0;0;1;0;1 -719;guenille;negative;0;0;1;0;0;1 -720;guérissable;positive;0;0;0;0;0;0 -721;guerrier;negative;0;1;0;1;0;0 -722;habitant;positive;0;0;0;0;0;0 -723;habit;positive;0;0;0;0;0;0 -724;habituer;positive;0;0;0;0;0;0 -725;habituel;positive;0;0;0;0;0;0 -726;haillon;negative;0;0;1;0;0;1 -727;haine;negative;0;0;0;1;0;1 -728;handicaper;negative;0;1;1;0;0;0 -729;hanter;negative;0;1;1;0;0;0 -730;harmonieux;positive;0;0;0;0;0;0 -731;harnachement;negative;0;1;1;0;0;0 -732;hâtif;negative;0;0;0;1;0;0 -733;haut;negative;0;0;0;0;0;0 -734;herbeux;negative;0;0;0;0;0;0 -735;héritage;positive;0;0;0;0;0;0 -736;heureux;positive;1;0;0;0;0;0 -737;hideux;negative;0;1;1;0;0;1 -738;historien;positive;0;0;0;0;0;0 -739;homosexuel;negative;0;1;0;0;0;0 -740;honteux;negative;0;1;1;1;0;1 -741;horrible;negative;0;1;0;0;0;1 -742;hors pair;positive;0;1;0;0;0;0 -743;hostilité;negative;0;0;0;1;0;1 -744;houleux;negative;0;1;0;1;0;0 -745;hystérique;negative;0;1;0;1;0;0 -746;idiot;negative;0;0;0;1;0;1 -747;ignifuger;positive;0;0;0;0;0;0 -748;illettré;negative;0;0;1;0;0;1 -749;illimiter;positive;0;0;0;0;0;0 -750;illustre;positive;0;0;0;0;0;0 -751;imaginatif|imaginative;positive;0;0;0;0;0;0 -752;imbécile;negative;0;0;0;1;0;1 -753;imitateur;negative;0;0;0;1;0;1 -754;immaculé;positive;0;0;0;0;0;0 -755;immatériel;negative;0;0;1;0;0;0 -756;immense;positive;0;0;0;0;0;0 -757;immigrant;negative;0;1;1;0;0;0 -758;immigrer;negative;0;1;1;0;0;0 -759;immonde;negative;0;1;1;1;0;1 -760;immortel|immortelle;positive;0;0;0;0;0;0 -761;impensable;negative;0;1;0;0;0;1 -762;impératif;negative;0;0;0;0;0;0 -763;impersonnel;negative;0;0;1;0;0;0 -764;impitoyable;negative;0;1;0;1;0;0 -765;importun;negative;0;0;0;1;0;1 -766;imprécis;negative;0;1;1;0;0;0 -767;imprévu;negative;0;0;0;0;1;0 -768;improductif;negative;0;0;1;1;0;0 -769;inactif;negative;0;0;1;0;0;0 -770;inadéquat;negative;0;0;1;0;0;0 -771;inattendu;negative;0;0;0;0;1;0 -772;inattention;negative;0;1;1;0;0;0 -773;incalculable;negative;0;0;0;0;0;0 -774;incendie criminel;negative;0;1;0;1;0;0 -775;incendie de forêt;negative;0;1;1;0;1;0 -776;incestueux;negative;0;1;1;0;0;1 -777;incisive;negative;0;0;1;1;0;0 -778;inclure;positive;0;0;0;0;0;0 -779;incohérent;negative;0;1;0;0;0;0 -780;incomparable;positive;0;0;0;0;0;0 -781;incompétent;negative;0;0;1;0;0;0 -782;incompréhensible;negative;0;0;1;0;0;0 -783;inconcevable;negative;0;1;0;1;0;1 -784;inconnu|inconnue;negative;0;1;0;0;0;0 -785;inconscient;negative;0;1;0;0;0;0 -786;inconvenance;negative;0;0;0;1;0;1 -787;indécent;negative;0;0;0;0;0;1 -788;indic;negative;0;0;0;0;0;0 -789;indication;positive;0;0;0;0;0;0 -790;indicatif;positive;0;0;0;0;0;0 -791;indigent;negative;0;1;1;0;0;0 -792;indiscret;negative;0;0;0;1;0;1 -793;indompté;negative;0;0;0;1;0;0 -794;industrie de le pêche;positive;0;0;0;0;0;0 -795;industrieux;positive;0;0;0;0;0;0 -796;inébranlable;positive;0;0;0;0;0;0 -797;inéluctable;negative;0;1;1;0;0;0 -798;inexplicable;negative;0;0;1;0;0;0 -799;inextensible;negative;0;0;0;0;0;0 -800;infâme;negative;0;1;1;1;1;1 -801;infect;negative;0;1;0;1;0;1 -802;infectieux;negative;0;1;1;0;0;1 -803;inférieur;negative;0;1;1;1;0;0 -804;infertile;negative;0;0;1;0;0;0 -805;infiltration;negative;0;0;0;0;0;1 -806;inflexible;negative;0;0;0;1;0;0 -807;influençable;negative;0;0;0;0;0;0 -808;informateur;positive;0;0;0;0;0;0 -809;infraction;negative;0;1;1;1;0;1 -810;ingénieux;positive;0;0;0;0;0;0 -811;inhabituel;negative;0;0;0;0;1;0 -812;inhospitalier;negative;0;1;1;0;0;0 -813;initiateur;positive;0;0;0;0;0;0 -814;initier;positive;0;0;0;0;0;0 -815;injustifiable;negative;0;0;1;1;0;1 -816;innocent;positive;0;0;0;0;0;0 -817;inoffensif;positive;0;0;0;0;0;0 -818;inquiet;negative;0;1;1;0;0;0 -819;inquisiteur;negative;0;1;1;1;1;0 -820;insensible;negative;0;0;1;0;0;1 -821;insidieux;negative;0;1;0;1;0;1 -822;insolite;negative;0;0;0;0;1;0 -823;insouciant;negative;0;0;1;1;0;1 -824;insoutenable;negative;0;1;1;0;0;1 -825;inspecteur;positive;0;0;0;0;0;0 -826;instinctif;positive;0;1;0;1;0;1 -827;instructif;positive;0;0;0;0;0;0 -828;instructrice;positive;0;0;0;0;0;0 -829;instruire;positive;0;0;0;0;0;0 -830;insurger;negative;0;0;0;1;0;0 -831;intellectuel;positive;0;0;0;0;0;0 -832;intenter un procès à;negative;0;0;1;1;0;0 -833;intentionnel;negative;0;0;0;1;0;0 -834;interminable;negative;0;1;1;1;0;0 -835;interrogateur;negative;0;1;0;0;0;0 -836;interrompre;negative;0;0;1;1;1;0 -837;interruption;negative;0;0;1;0;1;0 -838;intervieweur;positive;0;1;0;0;0;0 -839;intime;positive;0;0;0;0;0;0 -840;introductif;positive;0;0;0;0;0;0 -841;introspectif;positive;0;0;0;0;0;0 -842;introverti;negative;0;1;1;0;0;0 -843;intrus;negative;0;1;0;1;1;0 -844;intrusion;negative;0;1;1;1;1;0 -845;intrusif;negative;0;1;0;1;1;1 -846;intuitif;positive;0;0;0;0;0;0 -847;inutilisé;negative;0;0;1;0;0;0 -848;invariable;positive;0;0;0;0;0;0 -849;inventif;positive;1;0;0;0;0;0 -850;inventeur;positive;0;0;0;0;0;0 -851;investigateur;positive;0;0;0;0;0;0 -852;irrationnel;negative;0;1;0;0;0;1 -853;irréel;negative;0;1;1;0;1;0 -854;irréfléchi;negative;0;1;0;1;1;0 -855;irrégulier;negative;0;1;1;1;0;0 -856;irrespectueux;negative;0;1;1;1;0;1 -857;irrévérencieux;negative;0;0;0;1;0;1 -858;isoler;negative;0;0;1;0;0;0 -859;itératif;positive;0;0;0;0;0;0 -860;jadis;positive;0;0;0;0;0;0 -861;jappement;negative;0;1;0;1;1;0 -862;jeter;negative;0;1;0;1;0;0 -863;jeu de hasard;positive;0;0;0;0;0;0 -864;joaillier;positive;0;0;0;0;0;0 -865;jovial;positive;1;0;0;0;0;0 -866;joyeux;positive;0;0;0;0;1;0 -867;joyeusement;positive;1;0;0;0;0;0 -868;judicieux;positive;0;0;0;0;0;0 -869;jumelle;positive;0;0;0;0;0;0 -870;kidnapper;negative;0;1;1;1;1;0 -871;le plus intime;positive;0;0;0;0;0;0 -872;le plus secret;positive;0;0;0;0;0;0 -873;laborieux;negative;0;0;1;0;0;0 -874;laineur|laineuse;positive;0;0;0;0;0;0 -875;laisser sans surveillance;negative;0;1;1;0;0;0 -876;laiterie;positive;0;0;0;0;0;0 -877;laiteux;positive;0;0;0;0;0;0 -878;lame;positive;0;1;0;0;0;0 -879;lamelle;positive;0;0;0;0;0;0 -880;lamentable;negative;0;1;1;1;0;1 -881;lascif;negative;0;0;0;0;0;1 -882;las;negative;0;0;1;0;0;0 -883;latéral;positive;0;0;0;0;0;0 -884;latéralement;negative;0;0;0;0;0;0 -885;lauréat;positive;0;0;0;0;0;0 -886;laxatif;negative;0;1;0;0;0;1 -887;léger;positive;0;0;0;0;0;0 -888;législatif;positive;0;0;0;0;0;0 -889;législateur;positive;0;0;0;0;0;0 -890;leurre;negative;0;1;0;0;1;0 -891;libéral;positive;0;0;0;0;0;0 -892;libidineux;positive;1;0;0;0;0;0 -893;licenciement;negative;0;1;1;1;0;0 -894;ligneux;positive;0;0;0;0;0;0 -895;limitatif;negative;0;1;1;0;0;0 -896;limite;negative;0;0;0;0;0;0 -897;limitrophe;positive;0;0;0;0;0;0 -898;lit de bébé;positive;0;0;0;0;0;0 -899;lit cage;positive;0;0;0;0;0;0 -900;litigieux;negative;0;1;0;1;0;1 -901;locution;positive;0;0;0;0;0;0 -902;locuteur;positive;0;0;0;0;0;0 -903;logement;positive;0;0;0;0;0;0 -904;longue;positive;0;0;0;0;0;0 -905;louable;positive;0;0;0;0;1;0 -906;lourd;negative;0;0;1;1;0;0 -907;loyal;positive;0;0;0;0;0;0 -908;loyauté;positive;0;0;0;0;0;0 -909;lucratif;positive;1;0;0;0;0;0 -910;lueur vacillant;negative;0;1;0;0;1;0 -911;lumière éblouissant;negative;0;1;0;1;0;0 -912;lumineux;positive;1;0;0;0;0;0 -913;lunatique;negative;0;0;0;0;1;0 -914;lustrer;positive;0;0;0;0;0;0 -915;lutteur;negative;0;1;0;1;0;0 -916;luxueux;positive;1;0;0;0;0;0 -917;magicien;positive;0;0;0;0;1;0 -918;magnitude;positive;0;0;0;0;0;0 -919;maîtrise;positive;0;0;0;0;1;0 -920;majesté;positive;1;0;0;0;0;0 -921;majestueux;positive;0;0;0;0;1;0 -922;malade;negative;0;1;1;0;0;0 -923;maladif;negative;0;0;1;0;0;1 -924;maladroit;negative;0;1;0;0;0;1 -925;malavisé;negative;0;0;0;0;0;1 -926;malchanceux;negative;0;1;1;1;0;1 -927;malheureux;negative;0;0;1;1;0;1 -928;maligne;negative;0;1;1;1;0;0 -929;malléable;positive;0;0;0;0;0;0 -930;malpropre;negative;0;0;0;0;0;1 -931;malveillant;negative;0;0;0;1;0;0 -932;maniable;positive;0;0;0;0;0;0 -933;manière;negative;0;0;0;1;0;1 -934;manifestant;positive;0;0;0;0;0;0 -935;manifeste;positive;0;1;0;0;0;0 -936;manuelle;positive;0;0;0;0;0;0 -937;marais;negative;0;1;0;0;0;1 -938;marchand;positive;0;0;0;0;0;0 -939;marchand de fruit et légume;positive;0;0;0;0;0;0 -940;marcheur;positive;0;0;0;0;0;0 -941;marécage;negative;0;1;1;0;0;1 -942;marécageux;negative;0;1;0;0;0;1 -943;marginal;negative;0;0;1;0;0;0 -944;marieur;positive;0;0;0;0;0;0 -945;marinade;negative;0;1;0;0;0;0 -946;marmonner;negative;0;1;1;1;0;0 -947;martyr|martyre;negative;0;1;1;0;0;0 -948;masculinité;positive;0;0;0;0;0;0 -949;matelas;positive;0;0;0;0;0;0 -950;matelassage;positive;0;0;0;0;0;0 -951;matériel;positive;0;0;0;0;0;0 -952;maternel;positive;0;0;0;0;0;0 -953;mathématicien;positive;0;0;0;0;0;0 -954;matière visqueux;negative;0;0;0;0;0;1 -955;maudire;negative;0;0;0;1;0;0 -956;maussade;negative;0;1;1;0;0;0 -957;maximum;positive;0;0;0;0;0;0 -958;mec;negative;0;0;0;0;0;0 -959;mécanicien;positive;0;0;0;0;0;0 -960;mécanisme;positive;0;0;0;0;0;0 -961;méconnaître;negative;0;0;1;0;0;0 -962;médiateur|médiatrice;positive;0;0;0;0;0;0 -963;méditerranéen;positive;0;0;0;0;0;0 -964;mélancolique;negative;0;0;1;0;0;0 -965;mélanger;positive;0;0;0;0;0;0 -966;mélodieux;positive;0;0;0;0;0;0 -967;mendiant;negative;0;0;1;0;0;0 -968;menstruation;negative;0;0;0;0;0;0 -969;menstruel;positive;0;0;0;0;0;0 -970;menteur;negative;0;0;0;1;0;1 -971;menu;positive;0;0;0;0;0;0 -972;méprendre;negative;0;0;0;1;0;1 -973;méprisable;negative;0;0;0;1;0;1 -974;mercuriel;negative;0;1;0;1;1;0 -975;mériter;positive;0;0;0;0;0;0 -976;merveilleux;positive;0;0;0;0;1;0 -977;messager;positive;0;0;0;0;0;0 -978;méticuleux;negative;0;1;1;0;0;1 -979;métier;positive;0;0;0;0;0;0 -980;mettre en liberté conditionnel;positive;0;0;0;0;0;0 -981;meulage;negative;0;0;0;1;0;1 -982;meurtrier|meurtrière;negative;0;1;1;1;1;1 -983;militant;negative;0;0;0;1;0;0 -984;mince;negative;0;1;1;0;0;0 -985;miniature;negative;0;1;1;0;0;0 -986;ministériel;positive;0;0;0;0;0;0 -987;minuscule;positive;0;0;1;0;0;0 -988;minutieux;positive;0;0;0;0;0;0 -989;miraculeux;positive;0;0;0;0;1;0 -990;miséricordieux;positive;1;0;0;0;0;0 -991;mixture;negative;0;0;0;0;0;1 -992;modèle;positive;0;0;0;0;0;0 -993;modérateur;positive;0;0;0;0;0;0 -994;modérer;positive;0;0;0;0;0;0 -995;modeste;positive;0;0;1;0;0;0 -996;mou;negative;0;0;1;0;0;1 -997;montagneux;positive;0;0;0;0;0;0 -998;monter;positive;0;0;0;0;0;0 -999;moqueur;negative;0;0;1;1;0;1 -1000;morne;negative;0;0;1;0;0;0 -1001;morose;negative;0;0;1;0;0;0 -1002;mortel;negative;0;1;1;1;0;1 -1003;motocross;negative;0;1;0;1;0;0 -1004;mouchard;negative;0;0;0;1;0;0 -1005;mouffette;negative;0;0;0;0;0;1 -1006;mousse;negative;0;0;0;0;0;1 -1007;mousseux;negative;0;0;0;0;0;1 -1008;mouvement;positive;0;0;0;0;0;0 -1009;moyenne;positive;0;0;0;0;0;0 -1010;muet|muette;negative;0;1;1;0;1;0 -1011;mugissement;negative;0;1;1;1;0;0 -1012;musicien;positive;0;0;0;0;0;0 -1013;mutuel;positive;0;0;0;0;0;0 -1014;mystérieux;negative;0;1;0;0;1;0 -1015;nain;negative;0;0;0;0;0;0 -1016;narquois;negative;0;0;0;1;0;1 -1017;narrateur;positive;0;0;0;0;0;0 -1018;nauséeux;negative;0;0;1;0;0;1 -1019;navigateur;positive;0;0;0;0;0;0 -1020;nébuleuse;negative;0;1;0;0;0;0 -1021;négociant;positive;0;0;0;0;0;0 -1022;négociateur;positive;0;0;0;0;0;0 -1023;négresse;negative;0;0;0;1;0;0 -1024;neigeux;positive;0;0;0;0;0;0 -1025;néné;negative;0;0;0;0;0;0 -1026;nerveux;positive;0;0;0;0;1;0 -1027;nette;positive;0;0;0;0;0;0 -1028;névrosé;negative;0;1;1;0;0;1 -1029;nichon;negative;0;0;0;0;0;0 -1030;noble;negative;0;0;0;0;0;0 -1031;nocif;negative;0;1;1;1;0;1 -1032;nominée;positive;0;0;0;0;0;0 -1033;nommer;positive;0;0;0;0;0;0 -1034;non contraindre;positive;0;0;0;0;0;0 -1035;non divulguer;negative;0;1;0;0;0;0 -1036;non immatriculer;negative;0;1;1;0;0;0 -1037;non officiel;negative;0;1;0;0;0;0 -1038;non organique;negative;0;0;0;0;0;0 -1039;non souhaiter;negative;0;0;1;0;0;0 -1040;non surveiller;negative;0;1;0;0;1;0 -1041;non tacher;positive;0;0;0;0;0;0 -1042;non valider;negative;0;0;0;0;0;1 -1043;non résident;negative;0;0;0;0;0;0 -1044;nonchalamment;positive;1;0;0;0;0;0 -1045;nonchalant;negative;1;0;0;0;0;0 -1046;nonne;positive;0;0;0;0;0;0 -1047;normatif;positive;0;0;0;0;0;0 -1048;notionnel;negative;0;0;0;0;0;0 -1049;notoriété;positive;0;0;0;0;0;0 -1050;nouveau;positive;0;0;0;0;0;0 -1051;nouveau venu|venue;positive;0;1;0;0;1;0 -1052;nuageux;negative;0;0;1;0;0;0 -1053;nuisible;negative;0;1;1;1;0;1 -1054;nul;negative;0;1;1;0;0;1 -1055;nutritif;positive;0;0;0;0;0;0 -1056;objectif;positive;0;0;0;0;0;0 -1057;obligatoire;positive;0;0;0;0;0;0 -1058;obliger;negative;0;1;0;0;0;0 -1059;obscénité;negative;0;0;0;1;0;1 -1060;obséquieux;negative;0;1;1;1;0;1 -1061;observateur;positive;0;0;0;0;0;0 -1062;obstétricien;positive;0;0;0;0;0;0 -1063;occasion;positive;0;0;0;0;1;0 -1064;occasionnel;positive;0;0;0;0;1;0 -1065;occupant;positive;0;0;0;0;0;0 -1066;odieux;negative;0;1;1;1;0;1 -1067;odorer;positive;0;0;0;0;0;0 -1068;offense;negative;0;1;1;1;1;1 -1069;officiant;positive;1;0;0;0;0;0 -1070;officieux;negative;0;1;0;0;0;0 -1071;oisif;negative;0;0;1;0;0;1 -1072;onctuosité;positive;0;0;0;0;0;0 -1073;onéreux;negative;0;0;1;0;0;0 -1074;onguent;positive;0;0;0;0;0;0 -1075;opérationnel;positive;0;0;0;0;0;0 -1076;opérateur;positive;0;0;0;0;0;0 -1077;opportun;positive;1;0;0;0;0;0 -1078;opposable;negative;0;1;0;1;0;1 -1079;oppressif;negative;0;1;1;1;0;1 -1080;optionnel;positive;0;0;0;0;0;0 -1081;orageux;negative;0;1;0;1;0;0 -1082;orateur;positive;0;0;0;0;0;0 -1083;ordinaire;negative;0;0;1;0;0;0 -1084;organisation;positive;0;0;0;0;0;0 -1085;organisateur;positive;0;0;0;0;0;0 -1086;orgueilleux;negative;0;0;0;1;0;1 -1087;orphelin|orpheline;negative;0;1;1;0;0;0 -1088;ottoman|ottomane;positive;0;0;0;0;0;0 -1089;oublieur;negative;0;1;1;0;0;0 -1090;ouvrier;positive;0;0;0;0;0;0 -1091;pâlir;negative;0;0;1;0;0;0 -1092;palissade;positive;0;0;0;0;0;0 -1093;paquet;positive;0;0;0;0;0;0 -1094;par intérim;positive;0;0;0;0;0;0 -1095;par mégarde;negative;0;1;1;0;1;0 -1096;paresseux;negative;0;0;1;0;0;1 -1097;parieur;negative;0;1;0;0;1;0 -1098;parmi;positive;0;0;0;0;0;0 -1099;part;positive;0;0;0;0;0;0 -1100;particule;positive;0;0;0;0;0;0 -1101;particulier;negative;0;1;0;0;1;0 -1102;partisan;positive;0;0;0;0;0;0 -1103;parvenir;negative;0;0;0;0;0;1 -1104;pas le moindre;negative;0;0;0;0;0;0 -1105;passager;positive;0;0;1;0;1;0 -1106;passif;negative;0;1;1;0;0;0 -1107;pastille;positive;0;0;0;0;0;0 -1108;pâtée;negative;0;0;0;0;0;1 -1109;paternel;positive;0;0;0;0;0;0 -1110;patron|patronne;positive;0;0;0;0;0;0 -1111;pause;negative;0;0;0;0;0;0 -1112;payeur;positive;0;0;0;0;0;0 -1113;paysan;negative;0;0;0;0;0;0 -1114;pécheresse;negative;0;1;1;1;0;1 -1115;peine;negative;0;0;1;0;0;0 -1116;péjoratif;negative;0;1;1;1;0;1 -1117;pendant ce temps;positive;0;0;0;0;0;0 -1118;penderie;positive;0;0;0;0;0;0 -1119;péniblement;negative;0;0;1;0;0;0 -1120;penseur;positive;0;0;0;0;0;0 -1121;pensif;positive;0;0;1;0;0;0 -1122;père;positive;0;0;0;0;0;0 -1123;père fouettard;negative;0;1;1;1;0;0 -1124;perforateur|perforatrice;negative;0;1;0;1;0;0 -1125;périlleux;negative;0;1;1;0;0;0 -1126;périmer;negative;0;0;1;0;0;1 -1127;permanent;positive;0;0;0;0;0;0 -1128;permettre;positive;0;0;0;0;0;0 -1129;permissif;positive;0;0;0;0;0;0 -1130;pernicieux;negative;0;1;1;1;0;0 -1131;perpétuel;positive;0;0;0;0;0;0 -1132;persister;positive;0;0;0;0;0;0 -1133;personne sonder;positive;0;0;0;0;0;0 -1134;perspicace;positive;0;0;0;0;0;0 -1135;persuasif;positive;0;0;0;0;0;0 -1136;pertinent;positive;0;0;0;0;0;0 -1137;pervers;negative;0;1;0;1;0;1 -1138;peser;negative;0;0;1;0;0;0 -1139;pet;negative;0;0;0;0;0;1 -1140;pétillement;positive;1;0;0;0;0;0 -1141;pétrifier;negative;0;1;0;0;1;0 -1142;pétrin;negative;0;1;1;0;0;1 -1143;peu commun;negative;0;0;0;0;0;0 -1144;peu équitable;negative;0;0;1;1;0;0 -1145;peu recommandable;negative;0;1;0;1;0;1 -1146;peu scrupuleux;negative;0;0;0;1;0;1 -1147;peu séduire;negative;0;0;1;0;0;1 -1148;peureux;negative;0;1;1;1;0;1 -1149;pharmacien;positive;0;0;0;0;0;0 -1150;phénoménal;positive;0;0;0;0;1;0 -1151;photo;positive;0;0;0;0;1;0 -1152;photocopie;positive;0;0;0;0;0;0 -1153;physicien;positive;0;0;0;0;0;0 -1154;physique;positive;0;0;0;0;0;0 -1155;pierreuse|pierreux;negative;0;1;0;0;0;0 -1156;piéton;positive;0;0;0;0;0;0 -1157;pieux;positive;0;0;1;0;0;1 -1158;pigeonnier;positive;0;0;0;0;0;0 -1159;pilleur;negative;0;1;1;1;0;0 -1160;pinailleur;negative;0;0;0;1;0;1 -1161;pionnier;positive;0;0;0;0;0;0 -1162;pitoyable;negative;0;0;1;0;0;1 -1163;placer en quarantaine;negative;0;1;0;0;0;1 -1164;plaignant;negative;0;0;1;0;0;0 -1165;plaisant;positive;0;0;0;0;1;0 -1166;plein été;positive;1;0;0;0;0;0 -1167;pliable;positive;0;0;0;0;0;0 -1168;plonger;positive;0;1;0;0;1;0 -1169;plongeur;positive;0;0;0;0;0;0 -1170;pluriel;positive;0;0;0;0;0;0 -1171;plus frais;positive;0;0;0;0;0;0 -1172;plus grand;positive;0;0;0;0;0;0 -1173;plus haut;positive;0;0;0;0;0;0 -1174;plus poteler;negative;0;0;0;0;0;0 -1175;plus sèche;positive;0;0;0;0;0;0 -1176;pluvieux;negative;0;0;1;0;0;0 -1177;poids lourd;positive;0;0;0;0;0;0 -1178;poignard;negative;0;1;0;0;0;0 -1179;poigne;negative;0;1;0;1;1;0 -1180;poilu;negative;0;0;0;0;0;1 -1181;pointe;positive;0;0;0;0;0;0 -1182;pointilleux;negative;0;1;1;0;0;1 -1183;polir;positive;0;0;0;0;0;0 -1184;police;positive;0;1;0;0;0;0 -1185;policier;positive;0;0;0;0;0;0 -1186;polisson;negative;0;0;0;1;0;0 -1187;politesse;positive;0;0;0;0;0;0 -1188;pompeur;negative;0;0;0;0;0;1 -1189;ponctuel;positive;0;0;0;0;1;0 -1190;populeux;negative;0;0;0;0;0;0 -1191;poreux;negative;0;0;0;0;0;1 -1192;porter un coup sec à;negative;0;0;0;1;0;0 -1193;porteur;positive;0;0;0;0;0;0 -1194;position par défaut;negative;0;1;1;0;0;1 -1195;poteler;negative;0;0;0;0;0;1 -1196;potentiel;positive;0;0;0;0;1;0 -1197;poudreuse;negative;0;0;0;0;0;0 -1198;poursuivre en justice;negative;0;1;1;1;0;1 -1199;pousser à;negative;0;1;0;1;0;0 -1200;poussiéreux;negative;0;0;0;0;0;1 -1201;pragmatique;positive;0;0;0;0;0;0 -1202;praticien;positive;0;0;0;0;0;0 -1203;pratique;positive;0;0;0;0;0;0 -1204;précieux;positive;1;0;0;0;0;0 -1205;précipiter;negative;0;1;0;0;1;0 -1206;prédateur;negative;0;1;0;0;0;0 -1207;préférentiel;positive;0;0;0;0;0;0 -1208;préliminaire;positive;0;0;0;0;0;0 -1209;premier;positive;1;0;0;0;0;0 -1210;premier naître;positive;0;0;0;0;0;0 -1211;preneur;positive;0;0;0;0;0;0 -1212;préparer;positive;0;0;0;0;0;0 -1213;préserver;positive;1;0;0;0;0;0 -1214;président;positive;0;0;0;0;0;0 -1215;présomptueux;negative;0;0;0;1;0;1 -1216;prétentieux;negative;0;0;0;1;0;1 -1217;prétention;negative;0;1;0;0;0;0 -1218;prêteur;positive;0;0;0;0;0;0 -1219;préventive;positive;0;0;0;0;0;0 -1220;primaire;positive;0;0;0;0;0;0 -1221;primitif;negative;0;0;0;0;0;0 -1222;princier;positive;0;0;0;0;1;0 -1223;printanier;positive;1;0;0;0;0;0 -1224;prisonnier;negative;0;1;1;1;0;1 -1225;prisonnier de guerre;negative;0;1;1;1;0;0 -1226;prodigieux;positive;0;0;0;0;1;0 -1227;productif;positive;1;0;0;0;0;0 -1228;producteur;positive;0;0;0;0;0;0 -1229;proéminence;positive;0;0;0;0;0;0 -1230;proéminent;positive;0;0;0;0;0;0 -1231;professorat;positive;0;0;0;0;0;0 -1232;programmateur;positive;0;0;0;0;0;0 -1233;progressif;positive;0;0;0;0;0;0 -1234;prohibitif;negative;0;1;1;1;0;0 -1235;promeneur;positive;0;0;0;0;0;0 -1236;prometteur;positive;0;0;0;0;0;0 -1237;promotionnel;positive;0;0;0;0;0;0 -1238;promoteur;positive;0;0;0;0;0;0 -1239;promptement;negative;0;0;0;0;0;0 -1240;prophétesse;positive;0;0;0;0;0;0 -1241;proportionnel;positive;0;0;0;0;0;0 -1242;proprement;positive;0;0;0;0;0;0 -1243;protecteur;positive;0;0;0;0;0;0 -1244;protestant;positive;0;1;0;0;0;0 -1245;protubérance;negative;0;1;0;0;0;1 -1246;provincial;negative;0;0;0;0;0;0 -1247;provocateur;negative;0;0;0;1;0;0 -1248;proxénète;negative;0;1;0;0;0;1 -1249;proximité;positive;0;0;0;0;0;0 -1250;prudemment;positive;0;1;0;0;0;0 -1251;pull;positive;0;0;0;0;0;0 -1252;pulpeux;negative;0;0;0;0;0;0 -1253;punir;negative;0;1;1;1;0;0 -1254;pur;positive;0;0;0;1;0;0 -1255;purgatif;positive;0;0;0;0;0;0 -1256;purger;negative;0;1;0;0;0;1 -1257;putatif;positive;0;0;0;0;0;0 -1258;qualifiante;positive;0;0;0;0;0;0 -1259;qualificatif;positive;0;0;0;0;0;0 -1260;quantitatif;positive;0;0;0;0;0;0 -1261;quasiment;positive;0;0;0;0;0;0 -1262;quelconque;negative;0;0;1;0;0;0 -1263;qui augmenter fortement;negative;0;1;0;0;1;0 -1264;qui commencer;positive;1;0;0;0;0;0 -1265;qui donner envie de vomir;negative;0;0;1;0;0;1 -1266;qui ébranler;negative;0;1;1;0;0;0 -1267;qui manquer de considération;negative;0;0;1;1;0;1 -1268;qui résonner;positive;0;1;0;0;1;0 -1269;race;positive;0;0;0;0;0;0 -1270;rachidien;positive;0;0;0;0;0;0 -1271;radieux;positive;0;0;0;0;1;0 -1272;radin;negative;0;1;1;1;0;1 -1273;radioactif;negative;0;1;0;0;0;0 -1274;rafale;negative;0;1;1;0;0;0 -1275;raffiner;positive;0;0;0;0;0;0 -1276;rafle;negative;0;1;0;1;1;0 -1277;rafraîchissement;positive;0;0;0;0;0;0 -1278;raillerie;negative;0;0;1;0;0;1 -1279;railleur;negative;0;0;1;1;0;1 -1280;raisonneur;negative;0;0;0;1;0;0 -1281;rancunier;negative;0;0;0;1;0;1 -1282;randonneur;positive;0;0;0;0;0;0 -1283;raser;negative;0;0;0;0;0;0 -1284;rationnel;positive;0;0;0;0;0;0 -1285;ravitaillement;positive;0;0;0;0;0;0 -1286;rayonnant;positive;1;0;0;0;0;0 -1287;rayonnement;positive;0;0;0;0;0;0 -1288;réactif;positive;0;0;0;0;0;0 -1289;réalisable;positive;0;0;0;0;0;0 -1290;réaménagement;positive;0;0;0;0;0;0 -1291;récapitulatif;positive;0;0;0;0;0;0 -1292;récemment;positive;0;0;0;0;0;0 -1293;réceptif;positive;0;0;0;0;0;0 -1294;recevoir;positive;0;0;0;0;0;0 -1295;réclamation;negative;0;0;0;1;0;0 -1296;reclus;negative;0;1;1;0;0;0 -1297;recoin;negative;0;0;1;0;0;0 -1298;reconnaître coupable;negative;0;1;1;1;0;1 -1299;recouvrable;positive;0;0;0;0;0;0 -1300;récréatif;positive;1;0;0;0;0;0 -1301;recueil;positive;0;0;0;0;0;0 -1302;rédactionnel;positive;0;0;0;0;0;0 -1303;rédacteur en chef;positive;0;0;0;0;0;0 -1304;réduire en purée;negative;0;1;0;0;0;1 -1305;refléter;positive;0;0;0;0;0;0 -1306;réformateur;positive;0;0;0;0;0;0 -1307;réfugier;negative;0;1;1;0;0;0 -1308;régal;positive;1;0;0;0;0;0 -1309;régent;positive;0;0;0;0;0;0 -1310;réglage;positive;0;0;0;0;0;0 -1311;règlement intérieur;positive;0;0;0;0;0;0 -1312;regret;negative;0;1;1;0;0;0 -1313;régulière;positive;0;0;0;0;0;0 -1314;relâcher;positive;1;0;0;0;0;0 -1315;relatif;positive;0;0;0;0;0;0 -1316;remarquable;positive;1;0;0;0;0;0 -1317;remordre;negative;0;1;1;0;0;0 -1318;remplaçant;negative;0;0;1;0;0;0 -1319;rémunérateur;positive;1;0;0;0;0;0 -1320;renégat;negative;0;0;0;1;0;0 -1321;renommer;positive;0;0;0;0;0;0 -1322;renversement;negative;0;1;0;1;0;0 -1323;renvoyer;negative;0;0;1;0;0;0 -1324;répandre;negative;0;1;0;0;1;0 -1325;réparateur;positive;0;0;0;0;0;0 -1326;répartir;positive;0;0;0;0;0;0 -1327;répit;positive;0;0;0;0;0;0 -1328;report;negative;0;0;1;0;0;0 -1329;représentant;positive;0;0;0;0;0;0 -1330;représentatif;positive;0;0;0;0;0;0 -1331;reproducteur|reproductrice;positive;1;0;0;0;0;0 -1332;républicain;positive;0;0;0;0;0;0 -1333;répugner;negative;0;1;0;1;0;1 -1334;requérant;negative;0;0;0;1;0;1 -1335;résident;positive;0;0;0;0;0;0 -1336;résiduel;negative;0;0;0;0;0;0 -1337;résistant;positive;0;0;1;0;0;0 -1338;respectif;positive;0;0;0;0;0;0 -1339;respectueux;positive;0;0;0;0;0;0 -1340;resplendir;positive;1;0;0;0;0;0 -1341;restriction;negative;0;1;1;1;0;0 -1342;restrictif;negative;0;1;1;0;0;0 -1343;retraire;positive;0;0;0;0;0;0 -1344;retraiter;positive;1;0;0;0;0;0 -1345;rétroactif;positive;0;0;0;0;0;0 -1346;réunion;positive;0;0;0;0;0;0 -1347;réussir;positive;1;0;0;0;0;0 -1348;révélateur;positive;0;0;0;0;0;0 -1349;révérencieux;positive;0;0;0;0;0;0 -1350;rêveur;positive;1;0;0;0;0;0 -1351;révocation;negative;0;1;1;0;0;0 -1352;rigoureux;negative;0;0;0;1;0;0 -1353;rital;negative;0;0;0;1;0;0 -1354;rituel;positive;0;0;0;0;0;0 -1355;rival;negative;0;1;0;1;0;0 -1356;rompre;negative;0;0;1;0;0;0 -1357;rotative;positive;0;0;0;0;0;0 -1358;routard;positive;0;0;0;0;0;0 -1359;route national;positive;0;0;0;0;0;0 -1360;ruine;negative;0;1;1;1;0;0 -1361;ruiner;negative;0;1;1;1;0;0 -1362;ruisseau;positive;0;0;0;0;0;0 -1363;sagacité;positive;0;0;0;0;0;0 -1364;sain et sauf;positive;1;0;0;0;0;0 -1365;saint;positive;0;0;0;0;1;0 -1366;saisir;negative;0;1;0;1;1;0 -1367;saloon;positive;0;0;0;1;0;0 -1368;sanguine;positive;0;0;0;0;0;0 -1369;sans assistance;negative;0;0;1;0;0;0 -1370;sans cesse;positive;0;0;0;0;0;0 -1371;sans égal;positive;0;1;0;0;0;0 -1372;sans entrave;positive;1;0;0;0;0;0 -1373;sans fin;positive;0;1;1;1;0;0 -1374;sans fondement;negative;0;0;1;0;0;0 -1375;sans histoire;positive;0;0;0;0;0;0 -1376;sans merci;negative;0;0;1;1;0;0 -1377;sans opposition;positive;0;0;0;0;0;0 -1378;sans pitié;negative;0;1;1;1;0;0 -1379;sans résultat;negative;0;0;1;0;0;1 -1380;sans soutien;negative;0;0;1;0;0;0 -1381;sans valeur;negative;0;0;1;0;0;0 -1382;satané;negative;0;0;0;1;0;0 -1383;satisfaire;positive;1;0;0;0;0;0 -1384;saugrenu;negative;0;0;0;0;1;0 -1385;sauvage;negative;0;1;0;1;0;1 -1386;savant;positive;0;0;0;0;0;0 -1387;savoureux;positive;1;0;0;0;0;0 -1388;scandaleux;negative;0;1;1;1;1;1 -1389;scélérat;negative;0;1;0;1;0;1 -1390;sceptique;negative;0;1;0;0;1;1 -1391;scrupuleux;positive;0;0;0;0;0;0 -1392;sculptrice;positive;0;0;0;0;0;0 -1393;se cacher;negative;0;1;1;0;0;0 -1394;se dévaloriser;negative;0;0;1;1;0;1 -1395;se souvenir de;positive;0;0;0;0;0;0 -1396;sèche;negative;0;1;0;1;1;0 -1397;secondairement;negative;0;0;0;0;0;0 -1398;secrète;negative;0;1;0;0;0;0 -1399;sédatif;negative;0;1;1;0;0;0 -1400;séisme;negative;0;1;0;0;1;0 -1401;sélectionner;positive;1;0;0;0;0;0 -1402;semblable;positive;0;0;0;0;0;0 -1403;sempiternel;positive;0;1;1;1;0;0 -1404;sensationnel;positive;1;0;0;0;0;0 -1405;sensible;positive;0;1;0;0;0;1 -1406;sensoriel;positive;0;0;0;0;0;0 -1407;sensuel;positive;0;0;0;0;1;0 -1408;senteur;positive;0;0;0;0;0;0 -1409;sentier;positive;0;0;0;0;0;0 -1410;sentimental;positive;0;0;0;0;0;0 -1411;serein;positive;1;0;0;0;0;0 -1412;sérieux;positive;0;1;1;1;0;0 -1413;sérieusement;negative;0;0;1;0;0;0 -1414;serment;positive;0;0;0;0;0;0 -1415;sévère;negative;0;1;0;0;0;0 -1416;sidérer;negative;0;0;0;0;1;0 -1417;signe;positive;0;0;0;0;0;0 -1418;silencieux;negative;0;1;1;0;0;0 -1419;simple;positive;0;0;0;0;0;0 -1420;sincérité;positive;0;0;0;0;0;0 -1421;singulier;positive;0;0;0;0;0;0 -1422;sinueux;negative;0;1;0;0;0;0 -1423;situation difficile;negative;0;1;1;0;0;1 -1424;sloup;positive;0;0;0;0;0;0 -1425;sms;positive;0;0;0;0;0;0 -1426;solidifier;positive;0;0;0;0;0;0 -1427;sombre;negative;0;1;1;0;0;0 -1428;sommation;negative;0;0;0;0;0;0 -1429;sommet;positive;0;0;0;0;0;0 -1430;somptueux;positive;1;0;0;0;0;0 -1431;sonder;positive;0;0;0;0;0;0 -1432;songeur;positive;1;0;0;0;0;0 -1433;sottise;negative;0;0;0;1;0;0 -1434;soudainement;negative;0;0;0;0;1;0 -1435;soupirant;positive;0;0;0;0;0;0 -1436;souple;positive;0;0;0;0;0;0 -1437;souplesse;positive;0;0;0;0;0;0 -1438;sous tendre;positive;0;0;0;0;0;0 -1439;souverain;positive;0;0;0;0;0;0 -1440;soyeux;positive;1;0;0;0;0;0 -1441;spacieux;positive;1;0;0;0;0;0 -1442;spectateur;positive;0;0;0;0;0;0 -1443;spectral;negative;0;1;0;0;0;0 -1444;spéculatif;negative;0;1;1;0;0;0 -1445;spirituel;positive;0;0;0;0;0;0 -1446;spongieux;negative;0;0;0;0;0;1 -1447;spontané;positive;0;0;0;0;0;0 -1448;sportif;positive;0;0;0;0;0;0 -1449;squameux;negative;0;0;0;0;0;1 -1450;squatteuse;negative;0;1;1;0;0;1 -1451;statisticien;positive;0;0;0;0;0;0 -1452;stèle;negative;0;0;1;0;0;0 -1453;store;positive;0;0;0;0;0;0 -1454;strate;positive;0;0;0;0;0;0 -1455;structurel;positive;0;0;0;0;0;0 -1456;stupeur;negative;0;1;1;0;0;1 -1457;subjectif;negative;0;0;0;0;0;0 -1458;subordonner;negative;0;1;1;0;0;0 -1459;substantiel;positive;0;0;0;0;0;0 -1460;substantif;positive;0;0;0;0;0;0 -1461;subtilité;positive;0;0;0;0;1;0 -1462;subversif;negative;0;0;0;1;1;0 -1463;successif;positive;0;0;0;0;0;0 -1464;suggestif;positive;0;0;0;0;0;0 -1465;suite;positive;0;0;0;0;0;0 -1466;summum;positive;1;0;0;0;0;0 -1467;supercherie;negative;0;1;1;1;1;1 -1468;superficiel;negative;0;0;1;0;0;1 -1469;superflu;negative;0;0;1;0;0;0 -1470;supérieur;positive;0;0;0;0;0;0 -1471;superstitieux;negative;0;1;0;0;0;0 -1472;supervision;negative;0;1;1;0;0;0 -1473;supplier;negative;0;0;1;0;0;0 -1474;supplique;positive;0;0;0;0;0;0 -1475;supporter;negative;0;1;1;0;0;0 -1476;supportrice;positive;0;0;0;0;0;0 -1477;supposition;positive;0;0;0;0;0;0 -1478;sur le ventre;negative;0;1;1;0;0;0 -1479;surnager;positive;0;0;0;0;0;0 -1480;surnaturel;negative;0;1;0;0;0;0 -1481;surprendre;negative;0;1;0;0;1;0 -1482;surveillant;positive;0;0;0;0;0;0 -1483;susciter;positive;0;0;0;0;0;0 -1484;sweat;positive;0;0;0;0;0;0 -1485;tâcher;negative;0;0;0;0;0;1 -1486;talentueux;positive;0;0;0;0;0;0 -1487;tapageur;negative;0;1;0;1;1;0 -1488;taquin;positive;0;0;0;1;1;0 -1489;tardif;negative;0;1;1;0;1;0 -1490;technicien;positive;0;0;0;0;0;0 -1491;tempétueux;negative;0;1;0;1;0;0 -1492;temporel;positive;0;0;0;0;0;0 -1493;tenace;positive;0;0;0;0;0;0 -1494;tendance;positive;0;0;1;0;0;0 -1495;terminer;positive;1;0;0;0;0;0 -1496;terrestre;positive;0;0;0;0;0;0 -1497;tête le premier;negative;0;0;0;1;1;0 -1498;théologien;positive;0;0;0;0;0;0 -1499;tirer;positive;0;1;1;1;1;0 -1500;tireur|tireuse;negative;0;1;0;1;1;0 -1501;tissage;positive;0;0;0;0;0;0 -1502;tituber;negative;0;1;0;0;1;0 -1503;tolérance;positive;0;0;0;0;0;0 -1504;torride;negative;0;1;0;1;0;0 -1505;tortueux;negative;0;1;0;0;0;0 -1506;touchant;positive;0;0;1;0;0;0 -1507;tourner;positive;0;1;0;1;1;0 -1508;tout de même;negative;0;0;0;0;0;0 -1509;tout puissant;positive;1;0;0;0;0;0 -1510;tout le deux semaine;positive;0;0;0;0;0;0 -1511;trafiquant;negative;0;1;0;1;0;1 -1512;traître;negative;0;1;1;1;1;1 -1513;transaction;positive;0;0;0;0;0;0 -1514;transitif;positive;0;0;0;0;0;0 -1515;travailleur|travailleuse;positive;0;0;0;0;0;0 -1516;traverser à gué;positive;0;0;0;0;0;0 -1517;trembloter;negative;0;1;0;1;0;0 -1518;trésorière;positive;0;0;0;0;0;0 -1519;tripler;positive;0;0;0;0;0;0 -1520;tromperie;negative;0;0;0;1;0;1 -1521;trompeur;negative;0;0;1;1;0;1 -1522;trop cher;negative;0;0;1;1;0;1 -1523;trop liquide;negative;0;0;0;0;0;1 -1524;trop long;negative;0;0;1;0;0;0 -1525;trop zélé;negative;0;0;0;0;0;0 -1526;trou perdu;negative;0;1;1;0;0;1 -1527;troubadour;positive;0;0;0;0;0;0 -1528;trouble;negative;0;1;0;1;1;0 -1529;trouillard;negative;0;0;0;0;0;1 -1530;trouvaille;positive;0;0;0;0;0;0 -1531;tueur;negative;0;1;1;1;1;1 -1532;tumultueux;negative;0;1;0;1;0;0 -1533;tuteur|tutrice;positive;0;0;0;0;0;0 -1534;ultime;positive;0;1;1;0;0;0 -1535;ultraviolette;positive;0;0;0;0;0;0 -1536;un foi|fois par semaine;positive;0;0;0;0;0;0 -1537;uniformité;positive;0;0;0;0;0;0 -1538;universel;positive;0;0;0;0;0;0 -1539;urgent;negative;0;1;0;0;0;0 -1540;user;negative;0;0;1;0;0;0 -1541;vaciller;negative;0;1;0;0;1;0 -1542;vagabonder;negative;0;1;1;0;0;0 -1543;vaillant;positive;0;0;0;0;0;0 -1544;vain;negative;0;0;1;0;0;0 -1545;vaporeux;positive;0;0;0;0;0;0 -1546;variqueux;negative;0;0;0;0;0;1 -1547;vaseux;negative;0;0;0;0;0;1 -1548;végétarien;positive;0;0;0;0;0;0 -1549;velouteux;positive;0;0;0;0;0;0 -1550;velu;negative;0;0;0;0;0;1 -1551;vendeur;positive;0;0;0;0;0;0 -1552;vengeur;negative;0;0;0;1;0;0 -1553;venimeux;negative;0;1;1;1;1;1 -1554;vent violent;negative;0;1;0;0;0;0 -1555;ventriculaire;positive;0;0;0;0;0;0 -1556;verbeux;positive;0;0;0;0;0;0 -1557;vérificateur|vérificatrice;positive;0;0;0;0;0;0 -1558;véritable;positive;0;0;0;0;0;0 -1559;vernir;positive;1;0;0;0;0;0 -1560;versement;positive;0;0;0;0;0;0 -1561;vertueux;positive;0;0;0;0;0;0 -1562;vestige;negative;0;1;0;0;0;1 -1563;vêtir;positive;0;0;0;0;0;0 -1564;vicieux;negative;0;0;0;1;0;1 -1565;victorieux;positive;1;0;0;0;0;0 -1566;vigoureux;positive;0;0;0;0;0;0 -1567;villageois;positive;0;0;0;0;0;0 -1568;vindicatif;negative;0;1;0;1;0;1 -1569;violation;negative;0;0;0;1;0;0 -1570;violet|violette;positive;0;0;0;0;0;0 -1571;virtuel;negative;0;0;0;0;0;0 -1572;visiteur;positive;1;0;0;0;0;0 -1573;visqueux;negative;0;0;0;0;0;1 -1574;visuel;positive;0;0;0;0;0;0 -1575;vitrer;positive;0;0;0;0;0;0 -1576;vif;negative;0;1;0;0;1;1 -1577;v?u;positive;0;0;0;0;0;0 -1578;voisin;positive;0;0;0;0;0;0 -1579;voleur;negative;0;1;1;1;1;1 -1580;voluptueux;positive;0;0;0;0;0;0 -1581;voyageur;positive;0;0;0;0;0;0 -1582;voyant;positive;0;0;0;0;0;1 -1583;youpi;positive;1;0;0;0;0;0 -1584;zéro;negative;0;0;1;0;0;0 -1585;zut;negative;0;0;1;1;0;1 -1586;bon gorgée;negative;0;0;0;0;0;1 -1587;école maternel;positive;0;0;0;0;0;0 -1588;un foi|fois tout le deux moi|mois;positive;0;0;0;0;0;0 -1589;@card@ kilo;positive;0;0;0;0;0;0 -1590;à base de plante;positive;0;0;0;0;0;0 -1591;à bord;positive;0;0;0;0;0;0 -1592;à capuche;positive;0;1;0;0;0;0 -1593;à carreau;positive;0;0;0;0;0;0 -1594;à clou;negative;0;0;0;0;0;0 -1595;à condition que;positive;0;0;0;0;0;0 -1596;à contrec?ur;negative;0;1;1;1;0;1 -1597;à côte;negative;0;0;0;0;0;1 -1598;à cru;positive;0;0;0;0;0;0 -1599;à dessein;positive;0;0;0;0;0;0 -1600;à destination de;positive;0;0;0;0;0;0 -1601;à feuillage caduc;negative;0;0;0;0;0;0 -1602;à feuille;positive;0;0;0;0;0;0 -1603;à fleur;positive;1;0;0;0;0;0 -1604;à foison;positive;1;0;0;0;0;0 -1605;à force de qch;positive;0;0;0;0;0;0 -1606;à fort poitrine;positive;0;0;0;0;0;0 -1607;à friser;positive;0;0;0;0;0;0 -1608;à froid;negative;0;0;1;0;0;0 -1609;à gauche;negative;0;0;0;0;0;0 -1610;à intervalle régulier;positive;0;0;0;0;0;0 -1611;à jamais;positive;0;0;0;0;0;0 -1612;à juste titre;positive;0;0;0;0;0;0 -1613;à l étranger;positive;0;0;0;0;0;0 -1614;à l improviste;negative;0;0;0;0;1;0 -1615;à l unanimité;positive;0;0;0;0;0;0 -1616;à le bon franquette;positive;0;0;0;0;1;0 -1617;à le dérive;negative;0;1;1;0;0;0 -1618;à le différence de;negative;0;0;0;0;0;0 -1619;à le menthe;positive;0;0;0;0;0;0 -1620;avoir le mode;positive;0;0;0;0;0;0 -1621;à le mode;positive;0;0;0;0;0;0 -1622;à le retraite;positive;1;0;0;0;0;0 -1623;à maintes reprise;negative;0;0;0;0;0;0 -1624;à mi chemin;positive;0;0;0;0;0;0 -1625;à naître;positive;0;0;0;0;0;0 -1626;à nervure;negative;0;0;0;0;0;1 -1627;à nouveau;positive;0;0;0;0;0;0 -1628;à peine;negative;0;0;1;0;0;0 -1629;à peu près;negative;0;0;0;0;0;0 -1630;à plat;negative;0;0;1;0;0;0 -1631;à plat ventre;negative;0;1;1;0;0;0 -1632;à plusieurs reprise;negative;0;0;0;0;0;0 -1633;avoir priori;negative;0;1;0;1;0;1 -1634;à propos;negative;0;0;0;0;0;0 -1635;à quai;positive;0;0;0;0;0;0 -1636;à queue;negative;0;0;0;0;0;0 -1637;à son compte;positive;0;0;0;0;0;0 -1638;à spiral|spirale;positive;0;0;0;0;0;0 -1639;à succès;positive;0;0;0;0;0;0 -1640;à supposer que;negative;0;0;0;0;0;0 -1641;à thème;positive;0;0;0;0;0;0 -1642;à tort;negative;0;1;1;1;0;0 -1643;à tout jamais;positive;0;0;0;0;0;0 -1644;à tout épreuve;positive;0;0;0;0;0;0 -1645;à tribord;positive;0;0;0;0;0;0 -1646;à venir;positive;0;0;0;0;0;0 -1647;à vie;positive;0;0;0;0;0;0 -1648;à vrai dire;positive;0;0;0;0;0;0 -1649;abaisser;negative;0;0;1;0;0;0 -1650;abaissement;negative;0;0;1;0;0;0 -1651;abandon;negative;0;1;1;1;1;0 -1652;abandonner;negative;0;1;1;1;0;1 -1653;abaondonnées;negative;0;1;1;0;0;0 -1654;abat;negative;0;0;0;0;0;1 -1655;abattoir;negative;0;1;1;1;0;1 -1656;abattre;negative;0;1;1;1;1;0 -1657;abbé;negative;0;1;0;0;0;0 -1658;abcès;negative;0;1;1;0;0;1 -1659;abdiquer;negative;0;1;1;0;0;0 -1660;abdomen;positive;0;0;0;0;0;0 -1661;abdominal;positive;0;0;0;0;0;0 -1662;abeille;negative;0;1;0;1;0;0 -1663;aberrer;negative;0;0;0;1;1;0 -1664;abhorrer;negative;0;1;0;1;0;1 -1665;abîme;negative;0;1;1;0;0;0 -1666;abîmer;negative;0;1;1;1;0;0 -1667;abject;negative;0;0;0;1;0;1 -1668;aboiement;negative;0;1;0;1;0;0 -1669;abolir;negative;0;0;1;1;0;0 -1670;abolition;negative;0;0;1;1;0;0 -1671;abomination;negative;0;1;1;1;0;1 -1672;abonder;positive;1;0;0;0;0;0 -1673;abondant;positive;1;0;0;0;0;0 -1674;abonnement;positive;0;0;0;0;0;0 -1675;aborder;positive;0;0;0;1;1;0 -1676;aborigène;positive;0;0;0;0;0;0 -1677;abortif;negative;0;1;1;1;0;0 -1678;aboutir;positive;1;0;0;0;0;0 -1679;aboyer;negative;0;1;0;1;0;0 -1680;abpimée;negative;0;1;1;1;0;0 -1681;abrasion;negative;0;1;1;0;0;1 -1682;abréger;positive;0;0;0;0;0;0 -1683;abreuvoir;positive;0;0;0;0;0;0 -1684;abréviation;positive;0;0;0;0;0;0 -1685;abri de jardin;negative;0;0;0;0;0;0 -1686;abriter;positive;0;0;0;0;0;0 -1687;abrogation;negative;0;1;1;0;0;0 -1688;abroger;negative;0;1;1;0;0;0 -1689;abrutir;negative;0;0;0;1;0;1 -1690;absence;negative;0;1;1;0;0;0 -1691;absentéisme;negative;0;0;1;0;0;0 -1692;absinthe;negative;0;0;0;0;0;0 -1693;absoudre;positive;1;0;0;0;0;0 -1694;absolution;positive;0;0;0;0;0;0 -1695;absorbant;positive;0;0;0;0;0;0 -1696;absorption;positive;0;0;0;0;0;0 -1697;abstention;negative;0;1;1;0;0;0 -1698;abstinence;negative;0;1;1;0;0;0 -1699;abstraction;negative;0;1;1;0;0;0 -1700;abstraire;positive;0;0;0;0;0;0 -1701;absurdité;negative;0;0;0;1;1;1 -1702;abuser de;negative;0;1;1;1;0;0 -1703;académie;positive;0;0;0;0;0;0 -1704;académique;positive;0;0;0;0;0;0 -1705;accabler;negative;0;1;1;1;0;0 -1706;accablant;negative;0;1;1;1;0;0 -1707;accalmir;positive;0;0;0;0;0;0 -1708;accéder;positive;1;0;0;0;0;0 -1709;accélérateur;negative;0;0;0;1;0;0 -1710;accélération;positive;0;1;0;0;0;0 -1711;accentuation;positive;0;0;0;0;0;0 -1712;accentuer;positive;0;0;0;0;0;0 -1713;acceptant;positive;0;0;0;0;0;0 -1714;acceptation;positive;0;0;0;0;0;0 -1715;accepter;positive;0;0;0;0;0;0 -1716;accès;positive;0;0;0;0;0;0 -1717;accessible;positive;0;0;0;0;0;0 -1718;accession;positive;0;0;0;0;0;0 -1719;accessoire;negative;0;0;0;0;0;0 -1720;accessoirement;negative;0;0;0;0;0;0 -1721;accident mortel;negative;0;1;1;0;0;0 -1722;accident vasculaire cérébral;negative;0;1;1;0;1;0 -1723;accidenter;negative;0;1;1;0;0;0 -1724;accidentellement;negative;0;1;1;0;1;0 -1725;acclamation;positive;1;0;0;0;0;0 -1726;acclamer;positive;0;0;0;0;1;0 -1727;accolade;positive;0;0;0;0;1;0 -1728;accommoder;positive;0;0;0;0;0;0 -1729;accommodation;positive;0;0;0;0;0;0 -1730;accompagner;positive;0;0;0;0;0;0 -1731;accompagnement;positive;0;0;0;0;0;0 -1732;accomplir;positive;1;0;0;0;0;0 -1733;accomplissement;positive;0;0;0;0;0;0 -1734;accordable;positive;0;0;0;0;0;0 -1735;accorder;positive;0;0;0;0;0;0 -1736;accordéon;positive;0;0;0;0;0;0 -1737;accord;positive;0;0;0;0;0;0 -1738;accoutumer;positive;0;0;0;0;0;0 -1739;accréditer;positive;0;0;0;0;0;0 -1740;accro;negative;0;0;1;1;0;0 -1741;accrochage;negative;0;0;0;1;0;0 -1742;accrocher;negative;0;1;0;0;1;0 -1743;accroc;negative;0;1;0;0;1;0 -1744;accroissement;positive;0;0;0;0;0;0 -1745;accroître;positive;0;0;0;0;0;0 -1746;accroupir;negative;0;1;0;0;0;0 -1747;accroupissement;negative;0;1;0;0;0;0 -1748;accroire;positive;0;0;0;0;0;0 -1749;accroire|accroître;positive;0;0;0;0;0;0 -1750;accueil;positive;0;0;0;0;0;0 -1751;accueillir;positive;1;0;0;0;0;0 -1752;accumuler;positive;0;0;0;0;0;0 -1753;accusatif;negative;0;0;0;1;0;1 -1754;accusation;negative;0;0;0;1;0;1 -1755;acérer;negative;0;1;0;1;0;0 -1756;acétique;negative;0;0;0;0;0;1 -1757;acharner;negative;0;1;0;1;0;1 -1758;achat;positive;0;0;0;0;0;0 -1759;acheminer par tuyau;positive;0;0;0;0;0;0 -1760;acheminer par pont aérien;positive;0;0;0;0;0;0 -1761;acheter;positive;0;0;0;0;0;0 -1762;achever;positive;0;0;0;0;0;0 -1763;achèvement;positive;1;0;0;0;0;0 -1764;acide;negative;0;0;0;0;0;1 -1765;acidité;negative;0;0;0;0;0;1 -1766;acier;positive;0;0;0;0;0;0 -1767;acompte;positive;0;0;0;0;0;0 -1768;acouphène;negative;0;1;1;0;0;0 -1769;acoustique;positive;0;0;0;0;0;0 -1770;acquéreur;positive;0;0;0;0;0;0 -1771;acquérir;positive;0;0;0;0;0;0 -1772;acquiescement;positive;0;0;0;0;0;0 -1773;âcre;negative;0;0;0;0;0;1 -1774;acrobate;positive;0;1;0;0;0;0 -1775;acte;positive;0;0;0;0;0;0 -1776;acte de défi;negative;0;1;0;1;0;1 -1777;acte de fiducie;negative;0;0;0;1;0;0 -1778;acte délictuel;negative;0;1;0;1;0;0 -1779;actif;positive;0;0;0;0;0;0 -1780;action;positive;0;0;0;0;0;0 -1781;action de grâce;positive;0;0;0;0;0;0 -1782;actionnable;negative;0;1;0;1;0;1 -1783;actionnaire;positive;0;0;0;0;0;0 -1784;activité;positive;0;0;0;0;0;0 -1785;actuaire;positive;0;0;0;0;0;0 -1786;actualité;positive;0;0;0;0;0;0 -1787;acuité;positive;0;0;0;0;0;0 -1788;acupuncture;positive;0;0;0;0;0;0 -1789;adage;positive;0;0;0;0;0;0 -1790;adaptabilité;positive;0;0;0;0;0;0 -1791;adaptable;positive;0;0;0;0;0;0 -1792;adaptation;positive;0;0;0;0;0;0 -1793;adapter;positive;0;0;0;0;0;0 -1794;addenda;positive;0;0;0;0;0;0 -1795;addiction;negative;0;1;1;0;0;0 -1796;additif;negative;0;0;0;0;0;1 -1797;additionner;positive;0;0;0;0;0;0 -1798;additionnel;positive;0;0;0;0;0;0 -1799;adepte;positive;0;0;0;0;0;0 -1800;adéquat;positive;0;0;0;0;0;0 -1801;adéquation;positive;0;0;0;0;0;0 -1802;adhérer;positive;0;0;0;0;0;0 -1803;adhérence;positive;0;0;0;0;0;0 -1804;adhérent;positive;0;0;0;0;0;0 -1805;adhérer à;positive;0;0;0;0;0;0 -1806;adhésion;positive;0;0;0;0;0;0 -1807;adieu;negative;0;0;1;0;0;0 -1808;adipeux;negative;0;0;0;0;0;1 -1809;adjacent;positive;0;0;0;0;0;0 -1810;adjectif;positive;0;0;0;0;0;0 -1811;adjectival;positive;0;0;0;0;0;0 -1812;adjoindre;positive;0;0;0;0;0;0 -1813;adjuvant;positive;0;0;0;0;0;0 -1814;admettre;positive;0;0;0;0;0;0 -1815;administrer;positive;0;0;0;0;0;0 -1816;administrer qch à qqn;positive;0;0;0;0;0;0 -1817;admirable;positive;0;0;0;0;0;0 -1818;admiration;positive;0;0;0;0;0;0 -1819;admirer;positive;0;0;0;0;0;0 -1820;admissibilité;positive;0;0;0;0;0;0 -1821;admission;positive;0;0;0;0;0;0 -1822;admonition;negative;0;1;0;1;0;0 -1823;adobe;positive;0;0;0;0;0;0 -1824;adolescence;positive;0;0;0;0;0;0 -1825;adopter;positive;0;0;0;0;0;0 -1826;adoption;positive;0;0;0;0;0;0 -1827;adorable;positive;0;0;1;0;1;0 -1828;adoration;positive;0;1;0;0;0;0 -1829;adorer;positive;0;1;0;0;0;0 -1830;ado|ados;positive;0;0;0;0;0;0 -1831;adosser;positive;0;0;0;0;0;0 -1832;adoucir;positive;0;0;0;0;0;0 -1833;adoucissant;positive;0;0;0;0;0;0 -1834;adoucissement;positive;0;0;0;0;0;0 -1835;adresse;positive;0;0;0;0;0;0 -1836;adresser;positive;0;0;0;0;0;0 -1837;adroit;positive;0;0;0;0;0;0 -1838;adulte;positive;0;0;0;0;0;0 -1839;adultère;negative;0;0;1;1;0;1 -1840;adversaire;negative;0;1;0;1;0;1 -1841;adverse;negative;0;1;0;1;0;1 -1842;adversité;negative;0;1;1;1;0;0 -1843;aération;positive;0;0;0;0;0;0 -1844;aérer;positive;0;0;0;0;0;0 -1845;aérodrome;positive;0;0;0;0;0;0 -1846;aérodynamique;positive;0;0;0;0;0;0 -1847;aéroglisseur;positive;0;0;0;0;0;0 -1848;aéronautique;positive;0;0;0;0;0;0 -1849;aéroport;positive;0;0;0;0;0;0 -1850;aérosol;positive;0;0;0;0;0;0 -1851;affaiblir;negative;0;1;1;0;0;0 -1852;affairement;positive;0;0;0;0;0;0 -1853;affaisés;negative;0;0;1;0;0;0 -1854;affaisser;negative;0;0;1;0;0;0 -1855;affaissement;negative;0;0;1;0;0;0 -1856;affamer;negative;0;1;1;1;0;0 -1857;affectation;positive;0;0;0;0;0;0 -1858;affecter;negative;0;0;1;0;0;0 -1859;affection;positive;0;0;0;0;0;0 -1860;affichage;positive;0;0;0;0;0;0 -1861;affiche;positive;0;0;0;0;1;0 -1862;afficher;positive;0;0;0;0;0;0 -1863;affidavit;positive;0;0;0;0;0;0 -1864;affiliation;positive;0;0;0;0;0;0 -1865;affilier;positive;0;0;0;0;0;0 -1866;affinage;positive;0;0;0;0;0;0 -1867;affiner;positive;0;0;0;0;0;0 -1868;affinité;positive;0;0;0;0;0;0 -1869;affirmatif;positive;0;0;0;0;0;0 -1870;affirmation;positive;0;0;0;0;0;0 -1871;affirmativement;positive;0;0;0;0;0;0 -1872;affirmer;positive;0;0;0;0;0;0 -1873;affixe;positive;0;0;0;0;0;0 -1874;affliction;negative;0;1;1;0;0;1 -1875;affluent;positive;0;0;0;0;0;0 -1876;affluer;negative;0;1;0;1;1;0 -1877;afflux;negative;0;1;0;0;1;0 -1878;affoler;negative;0;1;1;0;0;0 -1879;affolement;negative;0;1;0;1;0;0 -1880;affréter;positive;0;0;0;0;0;0 -1881;affronter;negative;0;0;0;0;0;0 -1882;âffuté;negative;0;1;0;0;0;0 -1883;âffutée;negative;0;1;0;0;0;0 -1884;âffutées;negative;0;1;0;0;0;0 -1885;âffutés;negative;0;1;0;0;0;0 -1886;agacer;negative;0;0;1;1;0;0 -1887;agacement;negative;0;0;1;1;0;1 -1888;agate;positive;0;0;0;0;0;0 -1889;âge;negative;0;1;1;0;0;0 -1890;âgé;negative;0;0;1;0;0;0 -1891;agence;positive;0;0;0;0;0;0 -1892;agenouiller;negative;0;0;1;0;0;0 -1893;agent;positive;0;0;0;0;0;0 -1894;agent de change;positive;0;0;0;0;0;0 -1895;agglomération;positive;0;0;0;0;0;0 -1896;agglomérer;negative;0;0;0;0;0;0 -1897;aggraver;negative;0;1;1;1;0;0 -1898;aggravation;negative;0;1;1;1;0;1 -1899;aggressifs;negative;0;1;0;1;0;0 -1900;agile;positive;0;0;0;0;0;0 -1901;agilité;positive;0;0;0;0;0;0 -1902;agir;positive;0;0;0;0;0;0 -1903;agissements;positive;0;0;0;0;0;0 -1904;agiter;negative;0;1;0;1;0;0 -1905;agneau;positive;0;0;0;0;0;0 -1906;agnostique;negative;0;1;1;0;0;0 -1907;agonir;negative;0;1;1;1;0;0 -1908;agrafer;positive;0;0;0;0;0;0 -1909;agrandir;negative;0;0;0;0;0;0 -1910;agrégat;negative;0;0;0;0;0;0 -1911;agrégation;negative;0;0;0;0;0;0 -1912;agresseur;negative;0;1;1;1;0;0 -1913;agression;negative;0;1;0;1;1;0 -1914;agricole;positive;0;0;0;0;0;0 -1915;agriculture;positive;0;0;0;0;0;0 -1916;ahurir;negative;0;0;0;0;1;0 -1917;ahurissant;negative;0;0;0;0;1;0 -1918;aide;positive;0;0;0;0;0;0 -1919;aider;positive;0;0;0;0;0;0 -1920;aigle;positive;0;0;0;0;0;0 -1921;aigre;negative;0;0;0;0;0;1 -1922;aigu marine;positive;0;0;0;0;0;0 -1923;aiguille;negative;0;1;0;0;0;0 -1924;aiguiller;positive;0;0;0;0;0;0 -1925;aiguillonner;positive;0;1;0;0;0;0 -1926;aiguisoir;negative;0;1;0;0;0;0 -1927;ail;negative;0;0;0;0;0;1 -1928;aile;positive;0;0;0;0;0;0 -1929;ailer;positive;0;0;0;0;0;0 -1930;aileron;positive;0;0;0;0;0;0 -1931;aimable;positive;0;0;0;0;0;0 -1932;aimant;positive;0;0;0;0;0;0 -1933;airbag;positive;0;0;0;0;0;0 -1934;aire;positive;0;0;0;0;0;0 -1935;aire de jeu;positive;0;0;0;0;1;0 -1936;air;negative;0;0;0;0;0;1 -1937;aisance;positive;1;0;0;0;0;0 -1938;aisé;positive;1;0;0;0;0;0 -1939;ajourner;negative;0;0;1;0;0;0 -1940;ajournement;negative;0;0;1;0;0;0 -1941;ajout;positive;0;0;0;0;0;0 -1942;ajouter;positive;0;0;0;0;0;0 -1943;ajustage;positive;0;0;0;0;0;0 -1944;ajuster;positive;0;0;0;0;0;0 -1945;ajustement;positive;0;0;0;0;0;0 -1946;alambiquer;negative;0;0;0;0;0;1 -1947;alanguir;negative;0;0;1;0;0;0 -1948;alarmer;negative;0;1;0;0;1;0 -1949;alarme;negative;0;1;0;0;1;0 -1950;albâtre;positive;0;0;0;0;0;0 -1951;album;positive;0;0;0;0;0;0 -1952;alcali;positive;0;0;0;0;0;0 -1953;alcaloïde;positive;0;0;0;0;0;0 -1954;alchimie;positive;0;0;0;0;0;0 -1955;alcool;negative;0;0;0;0;0;0 -1956;alcoolisme;negative;0;1;1;1;0;1 -1957;alcôve;positive;0;0;0;0;0;0 -1958;alerte;positive;0;1;0;1;1;0 -1959;alésage;negative;0;1;0;1;0;0 -1960;algèbre;positive;0;0;0;0;0;0 -1961;algébrique;positive;0;0;0;0;0;0 -1962;algorithme;positive;0;0;0;0;0;0 -1963;alibi;positive;0;0;0;0;0;0 -1964;aliénation;negative;0;1;1;1;0;1 -1965;aliéner;negative;0;0;1;0;0;1 -1966;aligner;positive;0;0;0;0;0;0 -1967;alignement;positive;0;0;0;0;0;0 -1968;aliment;positive;0;0;0;0;0;0 -1969;alimentaire;positive;0;0;0;0;0;0 -1970;alimentation;positive;0;0;0;0;0;0 -1971;alimenter;positive;0;0;0;0;0;0 -1972;alinéa;positive;0;0;0;0;0;0 -1973;aliquote;positive;0;0;0;0;0;0 -1974;allaitement;positive;0;0;0;0;0;0 -1975;allaiter;positive;0;0;0;0;0;0 -1976;allécher;positive;0;0;0;0;1;0 -1977;alléchant;positive;0;0;0;0;1;0 -1978;aller;positive;0;0;0;0;0;0 -1979;allégation;negative;0;0;0;1;0;0 -1980;allégeance;positive;0;0;0;0;0;0 -1981;allégorie;positive;0;0;0;0;0;0 -1982;allégorique;positive;0;0;0;0;0;0 -1983;allégresse;positive;1;0;0;0;0;0 -1984;allegro;positive;0;0;0;0;0;0 -1985;alléguer;negative;0;1;0;0;0;1 -1986;allemand;positive;0;0;0;0;0;0 -1987;aller à tout vitesse;negative;0;1;0;0;0;0 -1988;aller chercher;positive;0;0;0;0;0;0 -1989;alliage;positive;0;0;0;0;0;0 -1990;alliance;positive;0;0;0;0;0;0 -1991;allier;positive;0;0;0;0;0;0 -1992;alligator;negative;0;1;0;0;0;0 -1993;allocataire;positive;0;0;0;0;0;0 -1994;allocation;positive;0;0;0;0;0;0 -1995;allocation chômage;negative;0;0;1;0;0;0 -1996;allocution;positive;0;0;0;0;0;0 -1997;allongement;positive;0;0;0;0;0;0 -1998;allouer;positive;0;0;0;0;0;0 -1999;allumage;positive;0;0;0;0;0;0 -2000;allumette;positive;0;0;0;0;0;0 -2001;alluvial;positive;0;0;0;0;0;0 -2002;almanach;positive;0;0;0;0;0;0 -2003;aloha;positive;1;0;0;0;0;0 -2004;alors que;negative;0;0;0;0;0;0 -2005;alouette;positive;1;0;0;0;0;0 -2006;alphabet;positive;0;0;0;0;0;0 -2007;alphabétique;positive;0;0;0;0;0;0 -2008;alpiniste;positive;0;0;0;0;0;0 -2009;altération;negative;0;0;1;0;0;1 -2010;altercation;negative;0;0;0;1;0;0 -2011;altérer;negative;0;0;1;1;0;1 -2012;alternatif;positive;0;0;0;0;0;0 -2013;alterner;positive;0;0;0;0;0;0 -2014;altitude;positive;0;0;0;0;0;0 -2015;alto;positive;0;0;0;0;0;0 -2016;alvéolaire;positive;0;0;0;0;0;0 -2017;amadouer;positive;0;0;0;0;0;0 -2018;amande;positive;0;0;0;0;0;0 -2019;amant;positive;0;0;0;0;0;0 -2020;amarrage;positive;0;0;0;0;0;0 -2021;amarrer;positive;0;0;0;0;0;0 -2022;amasser;positive;0;0;0;0;0;0 -2023;amateur;negative;0;0;0;0;0;0 -2024;amatrices;negative;0;0;0;0;0;0 -2025;ambassade;positive;0;0;0;0;0;0 -2026;ambassadeur;positive;0;0;0;0;0;0 -2027;ambiance;positive;0;0;0;0;0;0 -2028;ambiant;positive;0;0;0;0;0;0 -2029;ambigu;negative;0;1;0;0;0;0 -2030;ambiguë;negative;0;1;0;0;0;0 -2031;ambiguïté;negative;0;1;0;0;0;0 -2032;ambition;positive;0;0;0;0;0;0 -2033;ambre;positive;0;0;0;0;0;0 -2034;ambrer;positive;0;0;0;0;0;0 -2035;ambulance;negative;0;1;1;0;0;0 -2036;âme s?ur;positive;0;1;0;0;0;0 -2037;améliorant;positive;0;0;0;0;0;0 -2038;améliorer;positive;0;0;0;0;0;0 -2039;amen;positive;0;0;0;0;0;0 -2040;aménagement;positive;0;0;0;0;0;0 -2041;aménagement paysager;positive;0;0;0;0;0;0 -2042;amendement;positive;0;0;0;0;0;0 -2043;amender;positive;0;0;0;0;0;0 -2044;aménité;positive;0;0;0;0;0;0 -2045;amèrement;negative;0;0;1;1;0;1 -2046;amertume;negative;0;0;1;1;0;1 -2047;améthyste;positive;0;0;0;0;0;0 -2048;amical;positive;0;0;0;0;0;0 -2049;amidon;negative;0;0;0;0;0;1 -2050;amidonner;negative;0;0;0;0;0;1 -2051;amiral;positive;0;0;0;0;0;0 -2052;amirauté;positive;0;0;0;0;0;0 -2053;amitié;positive;0;0;0;0;0;0 -2054;ammoniac;negative;0;0;0;0;0;1 -2055;amnésie;negative;0;1;1;0;0;0 -2056;amnistie;positive;1;0;0;0;0;0 -2057;amoindrir;negative;0;0;1;0;0;0 -2058;amorçage;positive;0;0;0;0;0;0 -2059;amorce;positive;0;0;0;0;0;0 -2060;amorcer;positive;0;0;0;0;0;0 -2061;amorphe;negative;0;0;1;0;0;1 -2062;amortir;negative;0;1;0;1;1;0 -2063;amortisseur;negative;0;1;0;0;0;0 -2064;amour;positive;0;0;0;0;0;0 -2065;amoureux;positive;1;0;0;0;0;0 -2066;amphétamine;negative;0;0;0;0;0;1 -2067;amphibien;negative;0;0;0;0;0;1 -2068;amphibiens;negative;0;0;0;0;0;1 -2069;amphibie;positive;0;0;0;0;0;0 -2070;amphithéâtre;positive;0;0;0;0;0;0 -2071;amplement;positive;0;0;0;0;0;0 -2072;ampleur;positive;0;0;0;0;0;0 -2073;amplification;positive;0;0;0;0;0;0 -2074;amplifier;positive;0;0;0;0;0;0 -2075;amplitude;positive;0;0;0;0;0;0 -2076;amputation;negative;0;1;1;0;0;1 -2077;amulette;positive;0;0;0;0;0;0 -2078;amuser;positive;1;0;0;0;0;0 -2079;amusant;positive;1;0;0;0;0;0 -2080;amuser gueule;positive;0;0;0;0;0;0 -2081;amusement;positive;1;0;0;0;0;0 -2082;amygdale;negative;0;0;0;0;0;1 -2083;an;positive;0;0;0;0;0;0 -2084;anaconda;negative;0;1;0;0;0;1 -2085;anal;negative;0;1;0;0;0;0 -2086;analgésique;negative;0;1;0;0;0;0 -2087;analogie;positive;0;0;0;0;0;0 -2088;analogique;positive;0;0;0;0;0;0 -2089;analogue;positive;0;0;0;0;0;0 -2090;analphabète;negative;0;0;1;0;0;1 -2091;analyser;positive;0;0;0;0;0;0 -2092;analyseur;positive;0;0;0;0;0;0 -2093;analyste;positive;0;0;0;0;0;0 -2094;analytique;positive;0;0;0;0;0;0 -2095;ananas;positive;0;0;0;0;0;0 -2096;anarchie;negative;0;1;0;1;0;0 -2097;anarchisme;negative;0;1;0;1;0;0 -2098;anarchiste;negative;0;1;0;1;0;0 -2099;anastomose;negative;0;1;0;0;0;1 -2100;anathème;negative;0;1;1;1;0;1 -2101;anatomie;positive;0;0;0;0;0;0 -2102;anatomique;positive;0;0;0;0;0;0 -2103;ancestral;positive;0;0;0;0;0;0 -2104;ancêtre;positive;0;0;0;0;0;0 -2105;ancien combattant;positive;0;0;0;0;0;0 -2106;ancienneté;positive;0;0;0;0;0;0 -2107;ancrage;positive;0;0;1;0;0;0 -2108;ancre;positive;0;0;0;0;0;0 -2109;âne;negative;0;1;0;1;0;1 -2110;anéantir;negative;0;1;1;1;0;0 -2111;anéantissement;negative;0;1;1;1;0;0 -2112;anémone;positive;0;0;0;0;0;0 -2113;ânerie;negative;0;0;0;0;0;1 -2114;ânesse;positive;0;0;0;0;0;0 -2115;anesthésier;negative;0;1;0;0;0;0 -2116;anesthésiant;negative;0;1;0;0;0;0 -2117;anesthésie;negative;0;1;0;0;0;0 -2118;anesthésique;negative;0;1;0;0;0;0 -2119;ange;positive;0;0;0;0;1;0 -2120;angélique;positive;0;0;0;0;0;0 -2121;angine;negative;0;1;1;0;0;0 -2122;angiographie;positive;0;0;0;0;0;0 -2123;angle;positive;0;0;0;0;0;0 -2124;angoisser;negative;0;1;1;0;0;0 -2125;angoissant;negative;0;1;1;0;0;0 -2126;angoisse;negative;0;1;1;1;0;0 -2127;anguille;negative;0;1;0;0;0;1 -2128;angulaire;positive;0;0;0;0;0;0 -2129;anhydre;positive;0;0;0;0;0;0 -2130;animal de compagnie;negative;0;0;0;0;0;0 -2131;animer;positive;1;0;0;0;0;0 -2132;animosité;negative;0;1;1;1;0;1 -2133;annales;positive;0;0;0;0;0;0 -2134;anneau;positive;0;0;0;0;0;0 -2135;année;positive;0;0;0;0;0;0 -2136;annexe;positive;0;0;0;0;0;0 -2137;annexer;positive;0;0;0;0;0;0 -2138;annexion;positive;0;0;0;0;0;0 -2139;annihilation;negative;0;1;1;1;0;0 -2140;annihiler;negative;0;1;0;1;0;0 -2141;anniversaire;positive;0;0;0;0;1;0 -2142;annonce;positive;0;0;0;0;0;0 -2143;annoncer;positive;0;0;0;0;0;0 -2144;annotation;positive;0;0;0;0;0;0 -2145;annoter;positive;0;0;0;0;0;0 -2146;annuaire;positive;0;0;0;0;0;0 -2147;annulaire;positive;0;0;0;0;0;0 -2148;annulation;negative;0;1;1;1;1;0 -2149;anomalie;negative;0;1;0;0;1;0 -2150;anonyme;negative;0;1;1;0;0;1 -2151;anormal;negative;0;1;0;1;1;1 -2152;anse;positive;0;0;0;0;0;0 -2153;antagonisme;negative;0;0;0;1;0;0 -2154;antagoniste;negative;0;1;0;1;0;1 -2155;antalgique;negative;0;1;0;0;0;0 -2156;antécédent;positive;0;0;0;0;0;0 -2157;antéchrist;negative;0;1;0;1;0;1 -2158;antenne;positive;0;0;0;0;0;0 -2159;antérieurement;positive;0;0;0;0;0;0 -2160;anthologie;positive;0;0;0;0;0;0 -2161;anthrax;negative;0;1;1;0;0;1 -2162;anthropologie;positive;0;0;0;0;0;0 -2163;anthropophage;negative;0;1;0;0;0;1 -2164;anthropophagie;negative;0;1;0;0;0;1 -2165;antibiotique;positive;0;0;0;0;0;0 -2166;anticipation;positive;0;0;0;0;0;0 -2167;anticiper;positive;0;0;0;0;0;0 -2168;antidote;positive;0;0;0;0;0;0 -2169;antifongique;positive;0;0;0;0;0;0 -2170;antilope;positive;0;0;0;0;0;0 -2171;antimoine;negative;0;1;0;0;0;1 -2172;antipathie;negative;0;0;0;1;0;1 -2173;antipathique;negative;0;0;0;1;0;1 -2174;antiquaire;positive;0;0;0;0;0;0 -2175;antiquité;positive;0;0;0;0;0;0 -2176;antiseptique;positive;0;0;0;0;0;0 -2177;antisocial;negative;0;1;1;1;0;1 -2178;antithèse;negative;0;0;0;1;0;0 -2179;antithétique;negative;0;0;0;0;0;0 -2180;antiviral;positive;0;0;0;0;0;0 -2181;anxiété;negative;0;1;1;1;0;0 -2182;août;positive;1;0;0;0;0;0 -2183;aorte;positive;0;0;0;0;0;0 -2184;apache;negative;0;1;0;0;0;0 -2185;apaiser;positive;0;0;0;0;0;0 -2186;apaisant;positive;0;0;0;0;0;0 -2187;apathie;negative;0;0;1;0;0;0 -2188;apercevoir;positive;0;0;0;0;0;0 -2189;apéritif;positive;0;0;0;0;0;0 -2190;aphone;negative;0;1;1;0;1;0 -2191;aplanir;negative;0;0;0;0;0;0 -2192;aplatir;negative;0;0;0;0;0;0 -2193;aplomb;positive;0;0;0;0;0;0 -2194;apocalyptique;negative;0;1;1;0;0;0 -2195;apogée;positive;0;0;0;0;1;0 -2196;apologétique;positive;0;0;1;0;0;0 -2197;apologiste;positive;0;0;0;0;0;0 -2198;apostasie;negative;0;0;1;0;0;0 -2199;apostat;negative;0;0;1;0;0;0 -2200;apostolique;positive;0;0;0;0;0;0 -2201;apostrophe;positive;0;0;0;0;1;0 -2202;apôtre;positive;0;0;0;0;0;0 -2203;appareil;positive;0;0;0;0;0;0 -2204;appareil de chauffage;positive;0;0;0;0;0;0 -2205;appareillage;positive;0;0;0;0;0;0 -2206;appartement;positive;0;0;0;0;0;0 -2207;appartement terrasse;positive;0;0;0;0;0;0 -2208;appât;negative;0;1;0;0;1;0 -2209;appelant;positive;0;0;0;0;0;0 -2210;appeler;positive;0;0;0;0;0;0 -2211;appellation inappropriée;negative;0;0;0;0;0;0 -2212;appel;negative;0;1;0;1;1;0 -2213;appendice;positive;0;0;0;0;0;0 -2214;appendicite;negative;0;1;1;0;0;0 -2215;appentis;negative;0;0;0;0;0;1 -2216;appétissant;positive;1;0;0;0;0;0 -2217;appétit;positive;0;0;0;0;0;0 -2218;applaudir;positive;0;0;0;0;0;0 -2219;applaudissement;positive;0;0;0;0;1;0 -2220;applicabilité;positive;0;0;0;0;0;0 -2221;applicable;positive;0;0;0;0;0;0 -2222;application;positive;0;0;0;0;0;0 -2223;appliquer;positive;0;0;0;0;0;0 -2224;apporter;positive;0;0;0;0;0;0 -2225;apposer;positive;0;0;0;0;0;0 -2226;appréciable;positive;0;0;0;0;0;0 -2227;apprécier;positive;0;0;0;0;0;0 -2228;appréciation;positive;0;0;0;0;0;0 -2229;appréhender;negative;0;1;0;1;0;0 -2230;appréhension;negative;0;1;1;0;1;0 -2231;apprendre;positive;0;0;0;0;1;0 -2232;apprentissage;positive;0;0;0;0;0;0 -2233;apprêt;positive;0;0;0;0;0;0 -2234;apprivoiser;positive;0;0;0;0;0;0 -2235;apprivoisement;positive;0;0;0;0;0;0 -2236;approche;positive;0;0;0;0;0;0 -2237;approfondir;positive;0;0;0;0;0;0 -2238;appropirées;positive;0;0;0;0;0;0 -2239;appropriation;positive;0;0;0;0;0;0 -2240;approuver;positive;0;0;0;0;0;0 -2241;approvisionnement;positive;0;0;0;0;0;0 -2242;approvisionner;positive;0;0;0;0;0;0 -2243;approximation;positive;0;0;0;0;0;0 -2244;approximativement;positive;0;0;0;0;0;0 -2245;appuyer;positive;0;0;0;0;0;0 -2246;après midi;positive;0;0;0;0;0;0 -2247;aptitude;positive;0;0;0;0;0;0 -2248;apurement;positive;0;0;0;0;0;0 -2249;aqua;positive;0;0;0;0;0;0 -2250;aquarium;positive;0;0;0;0;0;0 -2251;aquatique;positive;0;0;0;0;0;0 -2252;aqueduc;positive;0;0;0;0;0;0 -2253;arable;positive;0;0;0;0;0;0 -2254;araignée;negative;0;1;0;0;0;1 -2255;arbalète;negative;0;1;0;0;0;0 -2256;arbitraire;negative;0;0;1;1;0;1 -2257;arbitre;positive;0;0;0;0;0;0 -2258;arbitrer;positive;0;0;0;0;0;0 -2259;arbuste;positive;0;0;0;0;0;0 -2260;arc;positive;0;0;0;0;0;0 -2261;arcade;positive;0;0;0;0;0;0 -2262;archaïque;negative;0;0;0;1;0;1 -2263;arche;positive;0;0;0;0;0;0 -2264;archéologie;positive;0;0;0;0;0;0 -2265;archéologique;positive;0;0;0;0;0;0 -2266;archéologue;positive;0;0;0;0;0;0 -2267;archer;positive;0;0;0;0;0;0 -2268;archétype;positive;0;0;0;0;0;0 -2269;archevêque;positive;0;0;0;0;0;0 -2270;archipel;positive;0;0;0;0;0;0 -2271;architecte;positive;0;0;0;0;0;0 -2272;architecture;positive;0;0;0;0;0;0 -2273;archivage;positive;0;0;0;0;0;0 -2274;archiver;positive;0;0;0;0;0;0 -2275;archives;positive;0;0;0;0;0;0 -2276;arctique;positive;0;0;0;0;0;0 -2277;ardoise;positive;0;0;0;0;0;0 -2278;ardu;negative;0;0;1;0;0;0 -2279;arène;positive;0;0;0;0;0;0 -2280;aréole;positive;0;0;0;0;0;0 -2281;argent;positive;0;0;0;1;1;0 -2282;argent liquide;positive;0;1;0;1;0;0 -2283;argent recueillir;positive;1;0;0;0;0;0 -2284;argenter;positive;0;0;0;0;0;0 -2285;argenterie;positive;0;0;0;0;0;0 -2286;argile;positive;0;0;0;0;0;0 -2287;argot;negative;0;0;0;0;0;0 -2288;argument;negative;0;0;0;1;0;0 -2289;argumentation;negative;0;0;0;1;0;0 -2290;argumenter;negative;0;0;0;1;0;0 -2291;aridité;negative;0;0;0;0;0;0 -2292;aristocrate;positive;0;0;0;0;0;0 -2293;aristocratie;positive;0;0;0;0;0;0 -2294;aristocratique;positive;0;0;0;0;0;0 -2295;arithmétique;positive;0;0;0;0;0;0 -2296;armada;negative;0;1;0;1;0;0 -2297;arme à feu;negative;0;1;0;1;0;0 -2298;arme à répétition;negative;0;0;0;0;0;0 -2299;armement;negative;0;1;0;1;0;0 -2300;armer;positive;0;0;0;0;0;0 -2301;arme;positive;0;0;0;0;0;0 -2302;armoire;positive;0;0;0;0;0;0 -2303;armure;positive;0;1;0;0;0;0 -2304;armurerie;negative;0;1;0;1;0;0 -2305;arnaque;negative;0;1;1;1;1;0 -2306;arnaquer;negative;0;1;1;1;1;0 -2307;arôme;positive;1;0;0;0;0;0 -2308;arpentage;positive;0;0;0;0;0;0 -2309;arpenteur;positive;0;0;0;0;0;0 -2310;arquer;negative;0;0;1;0;0;0 -2311;arracher;negative;0;1;0;1;1;0 -2312;arranger;positive;0;0;0;0;0;0 -2313;arrangement;positive;0;0;0;0;0;0 -2314;arrestation;negative;0;0;0;1;0;0 -2315;arrêt;negative;0;1;1;1;1;0 -2316;arrêter;negative;0;1;0;0;1;0 -2317;arrêté;positive;0;0;0;0;0;0 -2318;arrhes;positive;0;0;0;0;0;0 -2319;arriération;negative;0;1;1;0;0;1 -2320;arrière goût;negative;0;0;0;0;0;1 -2321;arrière pays;positive;0;0;0;0;0;0 -2322;arrière plan;positive;0;0;0;0;0;0 -2323;arriérer;negative;0;0;0;0;0;0 -2324;arrimer;positive;0;0;0;0;0;0 -2325;arrivé|arrivée;positive;0;0;0;0;0;0 -2326;arriver;positive;0;0;0;0;0;0 -2327;arriver à;positive;1;0;0;0;0;0 -2328;arriviste;negative;0;0;0;0;0;1 -2329;arrogance;negative;0;0;0;1;0;0 -2330;arrogant;negative;0;0;0;1;0;1 -2331;arrondir;positive;0;0;0;0;0;0 -2332;arroser;negative;0;1;0;0;0;0 -2333;arsenal;negative;0;1;0;1;0;0 -2334;arsenic;negative;0;1;1;0;0;1 -2335;art;positive;0;0;1;0;1;0 -2336;art du portrait;positive;0;0;0;0;0;0 -2337;art oratoire;positive;0;0;0;0;0;0 -2338;artère;positive;0;0;0;0;0;0 -2339;artériosclérose;negative;0;1;1;0;0;0 -2340;arthropode;positive;0;0;0;0;0;0 -2341;artichaut;positive;0;0;0;0;0;0 -2342;article;positive;0;0;0;0;0;0 -2343;articulation;positive;0;0;0;0;0;0 -2344;articuler;positive;0;0;0;0;0;0 -2345;artifice;negative;0;1;0;0;0;0 -2346;artillerie;negative;0;1;0;1;0;0 -2347;artilleur;positive;0;0;0;0;0;0 -2348;artisan;positive;0;0;0;0;0;0 -2349;artisanal;positive;0;0;0;0;0;0 -2350;artisanat;positive;0;0;0;0;0;0 -2351;artiste;positive;0;0;0;0;0;0 -2352;artistique;positive;0;0;0;0;0;0 -2353;as;positive;1;0;0;0;0;0 -2354;ascendance;positive;0;0;0;0;0;0 -2355;ascendant;negative;0;1;0;1;0;0 -2356;ascenseur;positive;0;0;0;0;0;0 -2357;ascension;positive;0;1;0;0;0;0 -2358;ascète;negative;0;0;1;0;0;0 -2359;ascétique;negative;0;0;1;0;0;0 -2360;aspartame;positive;0;0;0;0;0;0 -2361;aspect;positive;0;0;0;0;0;0 -2362;aspérité;negative;0;1;0;0;0;0 -2363;asphalte;negative;0;0;0;0;0;1 -2364;asphalter;negative;0;0;0;0;0;1 -2365;aspic;negative;0;1;0;0;0;1 -2366;aspirant;positive;0;0;0;0;0;0 -2367;aspirer;negative;0;0;0;0;0;0 -2368;assaillir;negative;0;1;0;0;0;0 -2369;assaillie;negative;0;1;0;0;0;0 -2370;assaillies;negative;0;1;0;0;0;0 -2371;assainir;positive;0;0;0;0;0;1 -2372;assaisonner;positive;0;0;0;0;0;0 -2373;assaisonnement;positive;0;0;0;0;0;0 -2374;assassin;negative;0;1;1;1;0;1 -2375;assassinat;negative;0;1;1;1;0;0 -2376;assassiner;negative;0;1;0;1;0;0 -2377;assaut;negative;0;1;0;1;1;0 -2378;assécher;negative;0;0;0;0;0;0 -2379;assemblage;positive;0;0;0;0;0;0 -2380;assembler;positive;0;0;0;0;0;0 -2381;assemblée plénier;positive;0;0;0;0;0;0 -2382;assemblée;positive;0;0;0;0;0;0 -2383;asséner;negative;0;1;0;1;1;0 -2384;asséner un coup;negative;0;0;0;1;0;0 -2385;assertion;positive;0;0;0;0;0;0 -2386;asservir;negative;0;0;0;1;0;0 -2387;asservissement;negative;0;1;1;1;0;1 -2388;assesseur;positive;0;0;0;0;0;0 -2389;assiduité;positive;0;0;0;0;0;0 -2390;assiette;positive;0;0;0;0;0;0 -2391;assimilation;positive;0;0;0;0;0;0 -2392;assimiler;positive;0;0;0;0;0;0 -2393;assister;positive;0;0;0;0;0;0 -2394;assister à;positive;0;0;0;0;0;0 -2395;association;positive;0;0;0;0;0;0 -2396;association caritatif;positive;0;0;0;0;0;0 -2397;associer;positive;0;0;0;0;0;0 -2398;assoiffer;negative;0;1;1;0;0;0 -2399;assoiffer de sang;negative;0;1;0;1;0;1 -2400;assombrir;negative;0;1;1;0;0;0 -2401;assommant;negative;0;0;1;0;0;0 -2402;assortiment;positive;0;0;0;0;0;0 -2403;assouplissement;positive;0;0;0;0;0;0 -2404;assourdissant;negative;0;1;0;0;1;0 -2405;assouvir;positive;1;0;0;0;0;0 -2406;assouvissement;positive;1;0;0;0;0;0 -2407;assujettir;negative;0;0;0;1;0;1 -2408;assujettissement;negative;0;1;1;1;0;1 -2409;assurance;positive;0;1;0;0;0;0 -2410;assurer;positive;0;0;0;0;0;0 -2411;assurément;positive;0;0;0;0;0;0 -2412;assureur;positive;0;0;0;0;0;0 -2413;astérisque;positive;0;0;0;0;0;0 -2414;astéroïde;negative;0;1;0;0;0;0 -2415;astigmatisme;negative;0;1;1;0;0;0 -2416;astral;positive;0;0;0;0;0;0 -2417;astraux;positive;0;0;0;0;0;0 -2418;astre;positive;0;0;0;0;0;0 -2419;astringent;negative;0;1;0;0;0;1 -2420;astrologie;positive;0;0;0;0;0;0 -2421;astrologue;positive;0;0;0;0;0;0 -2422;astronaute;positive;0;0;0;0;0;0 -2423;astronome;positive;0;0;0;0;0;0 -2424;astronomie;positive;0;0;0;0;0;0 -2425;asymétrie;negative;0;0;0;0;0;1 -2426;asymétrique;negative;0;1;1;0;0;1 -2427;asymptotique;positive;0;0;0;0;0;0 -2428;atelier;positive;0;0;0;0;0;0 -2429;atelier de reliure;positive;0;0;0;0;0;0 -2430;athée;negative;0;0;1;1;0;1 -2431;athéisme;negative;0;0;0;0;0;0 -2432;athérosclérose;negative;0;1;1;0;0;0 -2433;athlète;positive;0;0;0;0;0;0 -2434;athlétique;positive;0;0;0;0;0;0 -2435;athlétisme;positive;0;0;0;0;0;0 -2436;atlas;positive;0;0;0;0;0;0 -2437;atmosphère;positive;1;0;0;0;0;0 -2438;atmosphérique;positive;0;0;0;0;0;0 -2439;atoll;positive;0;0;0;0;0;0 -2440;atome;positive;0;0;0;0;0;0 -2441;atomique;negative;0;1;0;1;0;0 -2442;atout;positive;0;0;0;0;1;0 -2443;atrium;positive;0;0;0;0;0;0 -2444;atroce;negative;0;1;1;1;0;1 -2445;atrocement;negative;0;1;1;0;1;1 -2446;atrophie;negative;0;1;1;0;0;1 -2447;atrophier;negative;0;1;1;0;0;1 -2448;attacher;positive;0;0;0;0;0;0 -2449;attachant;positive;0;0;0;0;0;0 -2450;attachement;positive;0;0;0;0;0;0 -2451;attanchants;positive;0;0;0;0;0;0 -2452;attaque choc;negative;0;1;0;1;1;0 -2453;attaquer;negative;0;1;0;1;1;0 -2454;attaquer avec un hache;negative;0;1;0;1;1;0 -2455;atteindre;positive;0;0;0;0;0;0 -2456;attelage;positive;0;0;0;0;0;0 -2457;attelle;positive;0;0;0;0;0;0 -2458;attenir;positive;0;0;0;0;0;0 -2459;attenant;positive;0;0;0;0;0;0 -2460;attendre;negative;0;0;0;0;0;0 -2461;attentionner;positive;0;0;0;0;0;0 -2462;attentonnée;positive;0;0;0;0;0;0 -2463;atténuer;positive;0;0;0;0;0;0 -2464;atterrer;negative;0;1;0;0;1;1 -2465;atterrir;positive;1;0;0;0;0;0 -2466;atterrissage;positive;0;0;0;0;0;0 -2467;attestation;positive;0;0;0;0;0;0 -2468;attester;positive;0;0;0;0;0;0 -2469;attirail;positive;0;0;0;0;0;0 -2470;attirance;positive;0;0;0;0;0;0 -2471;attiser;positive;0;0;0;0;0;0 -2472;attraction;positive;0;0;0;0;0;0 -2473;attractivité;positive;0;0;0;0;0;0 -2474;attraire;positive;0;0;0;0;1;0 -2475;attraper;negative;0;1;0;0;1;0 -2476;attribuable;negative;0;1;1;0;0;0 -2477;attribuer;positive;0;0;0;0;1;0 -2478;attribut;positive;0;0;0;0;0;0 -2479;attribution;positive;0;0;0;0;0;0 -2480;attrition;negative;0;0;1;0;0;1 -2481;attrouper;positive;0;0;0;0;0;0 -2482;au beurre;positive;0;0;0;0;0;1 -2483;au bord du larme;negative;0;1;1;0;0;1 -2484;au centre;positive;0;0;0;0;0;0 -2485;au charme désuet;positive;0;0;0;0;0;0 -2486;au chocolat;positive;0;0;0;0;0;0 -2487;au coin du feu;positive;1;0;0;0;0;0 -2488;au curry;positive;0;0;0;0;0;0 -2489;au galop;positive;0;0;0;0;0;0 -2490;au goût de beurre;positive;0;0;0;0;0;1 -2491;au hasard;positive;0;0;0;0;1;0 -2492;au lait;positive;0;0;0;0;0;0 -2493;au microscope;positive;0;0;0;0;0;0 -2494;au milieu de;positive;0;0;0;0;0;0 -2495;au pouvoir;positive;0;0;0;0;0;0 -2496;au revoir;negative;0;0;1;0;0;0 -2497;au dessus;positive;0;0;0;0;0;0 -2498;aubaine;positive;0;0;0;0;1;0 -2499;aube;positive;0;0;0;0;1;0 -2500;auberge;positive;0;0;0;0;0;0 -2501;aubergiste;positive;0;0;0;0;0;0 -2502;audacieux;positive;0;0;0;0;0;0 -2503;audibilité;positive;0;0;0;0;0;0 -2504;audible;positive;0;0;0;0;0;0 -2505;audit;positive;0;0;0;0;0;0 -2506;auditer;positive;0;0;0;0;0;0 -2507;auditionner;positive;0;0;0;0;0;0 -2508;auditorium;positive;0;0;0;0;0;0 -2509;auge;positive;0;0;0;0;0;0 -2510;augurer;positive;0;0;0;0;0;0 -2511;auguste;positive;1;0;0;0;0;0 -2512;aumônier;positive;0;0;0;0;0;0 -2513;auparavant;positive;0;0;0;0;0;0 -2514;aura;positive;1;0;0;0;0;0 -2515;auréole;positive;0;0;0;0;0;0 -2516;aurore;positive;0;0;0;0;1;0 -2517;auspice;positive;0;0;0;0;0;0 -2518;austère;negative;0;1;1;0;0;0 -2519;austérité;negative;0;1;1;0;0;0 -2520;autel;positive;0;0;0;0;0;0 -2521;authenticité;positive;0;0;0;0;0;0 -2522;authentification;positive;0;0;0;0;0;0 -2523;authentifier;positive;0;0;0;0;0;0 -2524;authentique;positive;0;0;0;0;0;0 -2525;auto;positive;0;0;0;0;0;0 -2526;autobiographie;positive;0;0;0;0;0;0 -2527;autobus;positive;0;0;0;0;0;0 -2528;autochtone;positive;0;0;0;0;0;0 -2529;autocratique;negative;0;1;1;1;0;0 -2530;autographe;positive;0;0;0;0;0;0 -2531;automatique;positive;0;0;0;0;0;0 -2532;automne;negative;0;1;1;0;0;0 -2533;automobile;positive;0;0;0;0;0;0 -2534;autopsie;negative;0;1;1;0;0;1 -2535;autoriser;positive;0;0;0;0;0;0 -2536;autorisation;positive;0;0;0;0;0;0 -2537;autoritaire;negative;0;0;0;1;0;0 -2538;autorité;positive;0;0;0;0;0;0 -2539;autoroute;positive;0;0;0;0;0;0 -2540;autosuffisance;positive;0;0;0;0;0;0 -2541;autruche;negative;0;1;0;0;0;0 -2542;auvent;positive;0;0;0;0;0;0 -2543;au herbe;positive;0;0;0;0;0;0 -2544;au idée arrêté;negative;0;0;0;1;0;0 -2545;au m?urs léger;negative;0;0;0;0;0;1 -2546;au multiple fonction;positive;0;0;0;0;0;0 -2547;au pomme;positive;0;0;0;0;0;0 -2548;aval;positive;0;0;0;0;0;0 -2549;avalanche;negative;0;1;1;0;1;0 -2550;avaler;positive;0;1;0;0;1;0 -2551;avance;positive;0;1;0;0;1;0 -2552;avancer;positive;1;0;0;0;0;0 -2553;avancement;positive;0;0;1;0;0;0 -2554;avancer au ralenti;negative;0;0;1;0;0;1 -2555;avancer lentement;negative;0;0;1;0;0;1 -2556;avancer petit à petit;positive;0;0;0;0;0;0 -2557;avant de;negative;0;0;0;0;0;0 -2558;avant bras;positive;0;0;0;1;0;0 -2559;avant garde;positive;0;0;0;0;0;0 -2560;avant poste;negative;0;1;0;0;0;0 -2561;avant propos;positive;0;0;0;0;0;0 -2562;avantage;positive;0;0;0;0;0;0 -2563;avantager;positive;1;0;0;0;0;0 -2564;avare;negative;0;1;1;1;0;1 -2565;avarice;negative;0;0;0;1;0;1 -2566;avatar;positive;0;0;0;0;0;0 -2567;avec attention;positive;0;1;0;0;0;0 -2568;avec crainte;negative;0;1;1;0;1;0 -2569;avec de gros morceau;negative;0;0;0;0;0;0 -2570;avec désinvolture;positive;0;0;0;0;0;0 -2571;avec le même intensité;positive;0;0;0;0;0;0 -2572;avec lassitude;negative;0;0;1;0;0;0 -2573;avec modération;positive;0;0;0;0;0;0 -2574;avec parcimonie;positive;0;0;0;0;0;0 -2575;avec précaution;positive;0;1;0;0;0;0 -2576;avec prudence;positive;0;1;0;0;0;0 -2577;avec quoi;positive;0;0;0;0;0;0 -2578;avec sérieux;positive;0;0;0;0;0;0 -2579;avec un grand raffinement;positive;1;0;0;0;0;0 -2580;avec violence;negative;0;1;1;1;0;1 -2581;avenant;positive;0;0;0;0;0;0 -2582;avènement;positive;0;0;0;0;0;0 -2583;avenir;positive;0;0;0;0;0;0 -2584;avent;positive;0;0;0;0;0;0 -2585;avenue;positive;0;0;0;0;0;0 -2586;avérer;positive;0;0;0;0;0;0 -2587;avers;positive;0;0;0;0;0;0 -2588;aversion;negative;0;1;0;1;0;1 -2589;avertir;positive;0;1;0;0;1;0 -2590;aveu;negative;0;1;1;0;1;0 -2591;aveugler;negative;0;1;0;0;1;0 -2592;aveuglant;negative;0;1;0;0;1;0 -2593;aveugle;negative;0;1;0;0;0;0 -2594;aveuglément;negative;0;1;1;0;0;0 -2595;aviateur;positive;0;0;0;0;0;0 -2596;aviation;positive;0;0;0;0;0;0 -2597;avide;negative;0;0;0;1;0;1 -2598;avidité;negative;0;0;0;1;0;1 -2599;avion;positive;0;0;0;0;0;0 -2600;aviron;negative;0;0;0;0;0;0 -2601;aviser;positive;0;0;0;0;0;0 -2602;avoir confiance;positive;0;0;0;0;0;0 -2603;avoir du difficulté;negative;0;1;1;0;0;0 -2604;avoir en horreur;negative;0;1;0;1;0;1 -2605;avoir en stock;positive;0;0;0;0;0;0 -2606;avoir le hoquet;negative;0;1;0;0;1;0 -2607;avoir le moyen;positive;0;0;0;0;0;0 -2608;avoir peur;negative;0;1;1;0;1;0 -2609;avoir pitié;negative;0;0;1;0;0;0 -2610;avoir pour but;positive;0;0;0;0;0;0 -2611;avoir recours;positive;0;0;0;0;0;0 -2612;avoir un compte;positive;0;0;0;0;0;0 -2613;avoir un handicap;negative;0;0;1;0;0;0 -2614;avoir un mouvement de recul;negative;0;1;1;0;1;1 -2615;avoir un tic;negative;0;1;0;0;1;0 -2616;avortement;negative;0;1;1;0;0;1 -2617;avorter;negative;0;1;1;1;0;0 -2618;axe;positive;0;0;0;0;0;0 -2619;axe central;positive;0;0;0;0;0;0 -2620;axe routier;positive;0;0;0;0;0;0 -2621;axial;positive;0;0;0;0;0;0 -2622;axiomatique;positive;0;0;0;0;0;0 -2623;axiome;positive;0;0;0;0;0;0 -2624;azimut;positive;0;0;0;0;0;0 -2625;azur;positive;0;0;0;0;0;0 -2626;azurer;positive;0;0;0;0;0;0 -2627;baïonnette;negative;0;1;0;1;0;0 -2628;babillage;negative;0;0;0;0;0;0 -2629;babiller;negative;0;0;0;0;0;0 -2630;babine;negative;0;0;0;0;0;0 -2631;babouin;negative;0;0;0;0;0;1 -2632;baby sitter;positive;0;0;0;0;0;0 -2633;bac;negative;0;0;0;0;0;0 -2634;baccalauréat;positive;0;0;0;0;0;0 -2635;baccarat;positive;0;0;0;0;1;0 -2636;bachelier bachelier;positive;0;0;0;0;0;0 -2637;backgammon;positive;0;0;0;0;1;0 -2638;bâcler;negative;0;0;0;0;0;1 -2639;bactérie;negative;0;1;0;0;0;1 -2640;badge;positive;0;0;0;0;0;0 -2641;badinage;positive;0;0;0;0;1;0 -2642;badiner;positive;0;0;0;0;1;0 -2643;baffe;negative;0;0;0;1;1;0 -2644;bagage;positive;0;0;0;0;0;0 -2645;bagagiste;positive;0;0;0;0;0;0 -2646;bagarre;negative;0;1;0;1;0;1 -2647;bagatelle;negative;0;0;0;0;0;1 -2648;bague;positive;0;0;0;0;0;0 -2649;bague|bagues orthodontique;positive;0;0;0;0;0;0 -2650;baguette;positive;0;1;0;0;0;0 -2651;bai|baie;positive;0;0;0;0;0;0 -2652;baigner;negative;0;0;0;0;0;1 -2653;baignoire;positive;0;0;0;0;0;0 -2654;bail;positive;0;0;0;0;0;0 -2655;bâillement;negative;0;0;0;0;0;0 -2656;bâiller;negative;0;0;0;0;0;0 -2657;bailleur;positive;0;0;0;0;0;0 -2658;bailleur de fond|fonds;positive;0;0;0;0;0;0 -2659;bâillon;negative;0;1;0;1;0;1 -2660;bâillonner;negative;0;1;0;1;0;1 -2661;bain;positive;1;0;0;0;0;0 -2662;baiser;positive;0;0;0;0;1;0 -2663;baisser;negative;0;1;1;0;0;0 -2664;baissier;negative;0;1;1;1;0;0 -2665;bal masquer;negative;0;0;0;0;1;0 -2666;balade;positive;1;0;0;0;0;0 -2667;balafre;negative;0;1;1;1;0;1 -2668;balafrer;negative;0;1;1;1;0;0 -2669;balai;positive;0;0;0;0;0;0 -2670;balance;positive;0;0;0;0;0;0 -2671;balancement;positive;0;0;0;0;0;0 -2672;balançoire;positive;0;0;0;0;0;0 -2673;balayage;negative;0;0;0;0;0;0 -2674;balayer|balayer;negative;0;0;0;0;0;0 -2675;balcon;positive;0;0;0;0;0;0 -2676;baldaquin;positive;0;0;0;0;0;0 -2677;baleine;negative;0;1;0;0;0;0 -2678;baliverne;negative;0;0;1;1;0;1 -2679;ballade;positive;1;0;0;0;0;0 -2680;ballast;positive;0;0;0;0;0;0 -2681;ballaster;positive;0;0;0;0;0;0 -2682;ballet;positive;0;0;0;0;0;0 -2683;ballon;positive;0;0;0;0;0;0 -2684;ballon de basket;positive;1;0;0;0;0;0 -2685;ballot;positive;0;0;0;0;0;0 -2686;balsamine;positive;0;0;0;0;0;0 -2687;balsamique;positive;0;0;0;0;0;0 -2688;balustrade;positive;0;0;0;0;0;0 -2689;banane;positive;0;0;0;0;0;0 -2690;banc;positive;0;0;0;0;0;0 -2691;bancal;negative;0;1;0;1;0;0 -2692;bande dessiner;positive;1;0;0;0;0;0 -2693;bande vidéo;positive;0;0;0;0;0;0 -2694;bande annonce;positive;0;0;0;0;0;0 -2695;bander;positive;0;0;0;0;0;0 -2696;bander le ?il;negative;0;1;0;0;1;0 -2697;banderole;positive;0;0;0;0;0;0 -2698;bandit;negative;0;1;0;0;0;1 -2699;banjo;positive;0;0;0;0;0;0 -2700;banlieue;negative;0;0;1;0;0;0 -2701;bannir;negative;0;1;1;1;0;0 -2702;bannissement;negative;0;0;1;1;0;1 -2703;banque;positive;0;0;0;0;0;0 -2704;banquet;positive;1;0;0;0;0;0 -2705;banquier;positive;0;0;0;0;0;0 -2706;banshee;negative;0;1;1;1;0;1 -2707;baptême;positive;0;0;0;0;0;0 -2708;baptismal;positive;1;0;0;0;0;0 -2709;baraque;positive;0;0;0;0;0;0 -2710;baratter;negative;0;0;0;1;0;0 -2711;barbare;negative;0;1;0;1;0;1 -2712;barbarie;negative;0;1;1;1;0;1 -2713;barbarisme;negative;0;1;0;1;0;1 -2714;barbecue;positive;0;0;0;0;0;0 -2715;barbeler;negative;0;1;0;1;0;0 -2716;barbiche;negative;0;0;0;0;0;0 -2717;barbu;positive;0;0;0;0;0;0 -2718;barbue;positive;0;0;0;0;0;0 -2719;bardane;positive;0;0;0;0;0;0 -2720;barde;positive;0;0;0;0;0;0 -2721;bardeau;positive;0;0;0;0;0;0 -2722;baril;positive;0;0;0;0;0;0 -2723;barjot;negative;0;0;0;0;0;1 -2724;barman;positive;0;0;0;0;0;0 -2725;baromètre;positive;0;0;0;0;0;0 -2726;baron;positive;0;0;0;0;0;0 -2727;baroque;positive;0;0;0;0;0;0 -2728;barque;positive;0;0;0;0;0;0 -2729;barque à fond plat;positive;0;0;0;0;0;0 -2730;barrer;negative;0;0;0;0;0;0 -2731;barrette;positive;0;0;0;0;0;0 -2732;barricade;negative;0;1;0;0;0;0 -2733;barricader;negative;0;1;0;0;0;0 -2734;baryton;positive;0;0;0;0;0;0 -2735;bas;negative;0;1;1;1;0;0 -2736;bas de gamme;negative;0;0;0;0;0;0 -2737;bas fond|fonds;negative;0;1;1;0;0;1 -2738;base de donnée;positive;0;0;0;0;0;0 -2739;base ball;positive;0;0;0;0;0;0 -2740;baser;positive;0;0;0;0;0;0 -2741;basilique;positive;0;0;0;0;0;0 -2742;basket ball;positive;1;0;0;0;0;0 -2743;basket;positive;0;0;0;0;0;0 -2744;bas terre;positive;0;0;0;0;0;0 -2745;basse;negative;0;1;1;1;0;0 -2746;bassin;positive;0;0;0;0;0;0 -2747;bassine;positive;0;0;0;0;0;0 -2748;basson;positive;0;0;0;0;0;0 -2749;bastion;positive;0;1;1;1;0;0 -2750;bataille;negative;0;1;1;1;0;0 -2751;batailler;negative;0;1;0;1;0;0 -2752;bataillon;negative;0;1;0;1;0;0 -2753;bateau;positive;0;0;0;0;0;0 -2754;bateau à vapeur;positive;0;0;0;0;0;0 -2755;bathymétrie;positive;0;0;0;0;0;0 -2756;bâtiment;positive;0;0;0;0;0;0 -2757;bâtir;positive;0;0;0;0;0;0 -2758;bâtisseur;positive;0;0;0;0;0;0 -2759;battage;positive;0;0;0;0;0;0 -2760;battage médiatique;negative;0;0;0;0;0;0 -2761;batte;negative;0;1;0;0;0;1 -2762;battement de jambe;negative;0;0;0;1;0;0 -2763;batterie;positive;0;0;0;1;0;0 -2764;battre;negative;0;1;1;1;0;0 -2765;baudrier;negative;0;1;1;0;0;0 -2766;bavarder;positive;0;0;0;0;0;0 -2767;bavasser;negative;0;0;0;0;0;0 -2768;bavette;positive;0;0;0;0;0;0 -2769;bavoir;positive;0;0;0;0;0;0 -2770;bavure;negative;0;0;0;0;0;1 -2771;bayou;negative;0;1;0;0;0;1 -2772;beagle;positive;0;0;0;0;0;0 -2773;béer;negative;0;1;0;0;1;0 -2774;béant;negative;0;1;0;0;1;0 -2775;béat;positive;1;0;0;0;0;0 -2776;béatitude;positive;1;0;0;0;0;0 -2777;beau gosse;positive;0;0;0;0;0;0 -2778;beauté;positive;1;0;0;0;0;0 -2779;bébé;positive;1;0;0;0;0;0 -2780;bec verseur;positive;0;0;0;0;0;0 -2781;bécane;positive;0;0;0;0;0;0 -2782;bêche;positive;0;0;0;0;0;0 -2783;bécher;positive;0;0;0;0;0;0 -2784;bêcher;positive;0;0;0;0;0;0 -2785;becquet;negative;0;1;1;1;0;0 -2786;bégaiement;negative;0;0;1;0;0;0 -2787;bégayer|bégayer;negative;0;0;1;0;0;0 -2788;beignet;positive;0;0;0;0;0;0 -2789;bélier;negative;0;0;0;1;0;0 -2790;belligérant;negative;0;1;0;1;0;0 -2791;belvédère;positive;0;0;0;0;0;0 -2792;bémol;negative;0;0;1;0;0;0 -2793;bénédiction;positive;0;0;0;0;1;0 -2794;bénéfice;positive;1;0;0;0;0;0 -2795;bénéficiaire;positive;0;0;0;0;0;0 -2796;bénéficier;positive;1;0;0;0;0;0 -2797;bénéfique;positive;1;0;0;0;0;0 -2798;bénévolat;positive;0;0;0;0;0;0 -2799;bénévole;positive;0;1;0;0;0;0 -2800;bénir;positive;0;0;0;0;0;0 -2801;bénin;positive;1;0;0;0;0;0 -2802;benzène;negative;0;0;0;0;0;1 -2803;béquille;positive;0;0;0;0;0;0 -2804;berceau;positive;0;0;0;1;0;0 -2805;bercer;positive;0;0;0;0;0;0 -2806;berceuse;positive;1;0;0;0;0;0 -2807;bergamote;positive;0;0;0;0;0;0 -2808;berge;positive;0;0;0;0;0;0 -2809;berger;positive;0;0;0;0;0;0 -2810;berlin;positive;0;0;0;0;0;0 -2811;berline;positive;0;0;0;0;0;0 -2812;berner;negative;0;0;0;0;0;1 -2813;besoin;positive;0;0;0;0;0;0 -2814;bestial;negative;0;1;0;0;0;1 -2815;bestiole;negative;0;1;0;0;0;1 -2816;bétail;positive;0;0;0;0;0;0 -2817;bêtise;negative;0;0;0;1;0;1 -2818;béton;positive;0;0;0;0;0;0 -2819;beurre;positive;0;0;0;0;0;0 -2820;beurrer;positive;0;0;0;0;0;0 -2821;beuverie;negative;0;0;0;0;0;0 -2822;biais;negative;0;0;0;1;0;1 -2823;biaiser;negative;0;0;1;1;1;1 -2824;bibliographie;positive;0;0;0;0;0;0 -2825;bibliothécaire;positive;0;0;0;0;0;0 -2826;bibliothèque;positive;0;0;0;0;0;0 -2827;biblique;positive;0;0;0;0;0;0 -2828;biche;positive;0;0;0;0;0;0 -2829;bicouche;positive;0;0;0;0;0;0 -2830;bicyclette;positive;0;0;0;0;0;0 -2831;bien;positive;0;1;0;0;1;0 -2832;bien en plein propriété;positive;0;0;0;0;0;0 -2833;bien que;negative;0;0;0;0;0;0 -2834;bien aimer;positive;0;0;0;0;0;0 -2835;bien être;positive;1;0;0;0;0;0 -2836;bienfaisance;positive;0;0;0;0;0;0 -2837;biennal;positive;0;0;0;0;0;0 -2838;bienséance;positive;0;0;0;0;0;0 -2839;bienvenir;positive;1;0;0;0;0;0 -2840;bière;positive;1;0;0;0;0;0 -2841;bifurcation;negative;0;1;1;0;0;0 -2842;bigot;negative;0;1;1;1;0;1 -2843;bihebdomadaire;positive;0;0;0;0;0;0 -2844;bijou;positive;0;0;0;0;0;0 -2845;bijouterie;positive;0;0;0;0;0;0 -2846;bilatéral;positive;0;0;0;0;0;0 -2847;bile;negative;0;0;1;1;0;1 -2848;bilingue;positive;0;0;0;0;0;0 -2849;billard;positive;0;0;0;0;0;0 -2850;bille;positive;0;0;0;0;0;0 -2851;billet;positive;0;0;0;0;0;0 -2852;bimestriel;positive;0;0;0;0;0;0 -2853;binaire;positive;0;0;0;0;0;0 -2854;binoculaire;positive;0;0;0;0;0;0 -2855;binôme;positive;0;0;0;0;0;0 -2856;binomial;positive;0;0;0;0;0;0 -2857;biogenèse;positive;0;0;0;0;0;0 -2858;biographe;positive;0;0;0;0;0;0 -2859;biographie;positive;0;0;0;0;0;0 -2860;biologie;positive;0;0;0;0;0;0 -2861;biopsie;negative;0;1;1;0;0;1 -2862;biosphère;positive;0;0;0;0;0;0 -2863;bipartite;positive;0;0;0;0;0;0 -2864;bis;positive;1;0;0;0;0;0 -2865;biscuit salé;positive;0;0;0;0;0;0 -2866;bise;positive;1;0;0;0;0;0 -2867;biseau;positive;0;0;0;0;0;0 -2868;biseauter;positive;0;0;0;0;0;0 -2869;bison;negative;0;1;0;0;0;0 -2870;bisou;positive;0;0;0;0;1;0 -2871;bit;positive;0;0;0;0;0;0 -2872;bitume;negative;0;0;0;0;0;1 -2873;bizarre;negative;0;1;0;0;1;1 -2874;bizarrerie;negative;0;0;1;0;1;1 -2875;black jack;negative;0;0;0;1;0;0 -2876;blafard;negative;0;1;1;0;1;0 -2877;blagant;positive;0;0;0;0;1;0 -2878;blague;positive;1;0;0;0;0;0 -2879;blaguer;positive;1;0;0;0;0;0 -2880;blaireau;negative;0;1;0;1;0;0 -2881;blâme;negative;0;0;0;1;0;1 -2882;blâmer;negative;0;0;0;1;0;1 -2883;blanchâtre;negative;0;0;0;0;0;1 -2884;blancheur;positive;1;0;0;0;0;0 -2885;blanchisserie;positive;0;0;0;0;0;0 -2886;blason;positive;0;0;0;0;0;0 -2887;blasphématoire;negative;0;0;0;1;0;1 -2888;blasphème;negative;0;0;0;1;0;0 -2889;blé à moudre;positive;0;0;0;0;0;0 -2890;blême;negative;0;1;1;0;0;0 -2891;blennorragie;negative;0;1;1;1;0;1 -2892;blesser;negative;0;1;1;1;0;1 -2893;blessant;negative;0;1;1;1;0;1 -2894;blessure;negative;0;1;1;1;0;1 -2895;bleu;negative;0;1;1;0;0;0 -2896;bleu ciel;positive;0;0;0;0;0;0 -2897;bleu de travail;positive;0;0;0;0;0;0 -2898;bleu lavande;positive;0;0;0;0;0;0 -2899;bleuâtre;negative;0;0;0;0;0;1 -2900;blindage;positive;0;1;0;0;0;0 -2901;blinder;negative;0;1;0;0;0;0 -2902;blitz;negative;0;1;0;1;1;0 -2903;blizzard;negative;0;1;1;0;0;0 -2904;bloc de roche;positive;0;0;0;0;0;0 -2905;blocage;negative;0;1;1;1;1;0 -2906;blocus;negative;0;1;1;1;0;0 -2907;blond;positive;0;0;0;0;0;0 -2908;blond|blonde;positive;0;0;0;0;0;0 -2909;blouse;positive;0;0;0;0;0;0 -2910;blouser;positive;0;0;0;0;0;0 -2911;blues;negative;0;1;1;0;0;0 -2912;bluff;negative;0;0;0;0;0;0 -2913;bluffer;negative;0;0;0;0;0;0 -2914;boa;negative;0;1;0;0;0;1 -2915;bobard;negative;0;0;0;1;0;1 -2916;bocal;positive;0;0;0;0;0;0 -2917;bogue;positive;0;0;0;0;0;0 -2918;boire;positive;0;0;0;0;0;0 -2919;bois;positive;0;0;0;0;0;0 -2920;bois de chauffage;positive;0;0;0;0;0;0 -2921;boiser;positive;0;0;0;0;0;0 -2922;boisseau;positive;0;0;0;0;0;0 -2923;boisson;positive;0;0;0;0;0;0 -2924;boisson alcooliser;negative;0;0;0;0;0;0 -2925;boite;positive;0;0;0;0;0;0 -2926;boîte;positive;0;0;0;0;0;0 -2927;boîte de conserve;positive;0;0;0;0;0;0 -2928;boîte de nuit;positive;0;0;0;0;0;0 -2929;boitement;negative;0;0;1;0;0;0 -2930;boiter;negative;0;0;1;0;0;0 -2931;boîtier;positive;0;0;0;0;0;0 -2932;bol;positive;0;0;0;0;0;0 -2933;bol alimentaire;positive;0;0;0;0;0;0 -2934;bombarder;negative;0;1;0;0;1;1 -2935;bombardement;negative;0;1;0;1;1;0 -2936;bombardier;negative;0;1;1;1;1;0 -2937;bombe;negative;0;1;1;1;1;0 -2938;bon;positive;0;0;0;0;1;0 -2939;bonbon;positive;0;0;0;0;0;0 -2940;bonbon au caramel;positive;0;0;0;0;0;0 -2941;bond;positive;0;0;0;0;0;0 -2942;bonde;negative;0;1;0;0;0;0 -2943;bonder;negative;0;1;0;0;0;0 -2944;bonheur;positive;1;0;0;0;0;0 -2945;bon garde;positive;0;0;0;0;0;0 -2946;bon volonté;positive;1;0;0;0;0;0 -2947;bonnet;positive;0;0;0;0;0;0 -2948;bonneterie;positive;0;0;0;0;0;0 -2949;bonté;positive;0;0;0;0;1;0 -2950;bonus;positive;0;0;0;0;1;0 -2951;boomerang;positive;0;0;0;0;0;0 -2952;booster;positive;0;0;0;0;0;0 -2953;bord du trottoir;negative;0;0;0;0;0;0 -2954;bord sous le vent;negative;0;1;1;0;0;0 -2955;border;positive;0;0;0;0;0;0 -2956;bordeau|bordeaux;negative;0;1;1;0;0;0 -2957;bordée;positive;0;0;0;0;0;0 -2958;bordel;negative;0;0;0;0;0;1 -2959;boréal;positive;0;0;0;0;0;0 -2960;boréals;positive;0;0;0;0;0;0 -2961;borner;negative;0;0;0;1;0;0 -2962;borner kilométrique;positive;0;0;0;0;0;0 -2963;bosquet;positive;0;0;0;0;0;0 -2964;boston;positive;0;0;0;0;0;0 -2965;botanique;positive;0;0;0;0;0;0 -2966;botaniste;positive;0;0;0;0;0;0 -2967;botte;positive;0;0;0;0;0;0 -2968;bouc;negative;0;0;0;0;0;0 -2969;bouc émissaire;negative;0;1;1;1;0;0 -2970;bouchage;negative;0;1;0;0;1;0 -2971;bouche bée;negative;0;1;0;0;1;0 -2972;boucher;negative;0;1;1;1;1;0 -2973;bouchère;negative;0;1;0;1;0;1 -2974;bouchon;positive;0;0;0;0;0;0 -2975;boucler d oreille;positive;0;0;0;0;0;0 -2976;boucler;positive;0;0;0;0;0;0 -2977;bouclier;positive;0;0;0;0;0;0 -2978;boue;negative;0;0;0;0;0;1 -2979;bouée;positive;0;0;0;0;0;0 -2980;bouée de sauvetage;positive;0;0;0;0;0;0 -2981;bouffant;negative;0;0;0;0;0;0 -2982;bouffir;negative;0;0;0;0;0;1 -2983;bouffon;negative;0;0;0;0;1;1 -2984;bougeoir;positive;0;0;0;0;0;0 -2985;bougie;positive;0;0;0;0;0;0 -2986;bougonner;negative;0;0;0;1;0;1 -2987;bouillant;negative;0;1;0;1;0;0 -2988;bouillir;negative;0;0;0;0;0;1 -2989;bouilloire;positive;0;0;0;0;0;0 -2990;bouillon;positive;0;0;0;0;0;0 -2991;bouillonner;negative;0;0;0;1;0;0 -2992;boulangerie;positive;0;0;0;0;0;0 -2993;boule;positive;0;0;0;0;0;0 -2994;boule de feu;positive;0;0;0;0;0;0 -2995;boule de neige;positive;0;0;0;0;0;0 -2996;bouleau;negative;0;1;0;1;0;1 -2997;bouledogue;positive;0;0;0;0;0;0 -2998;boulet;positive;0;0;0;0;0;0 -2999;boulette;positive;0;0;0;0;0;0 -3000;bouleversant;negative;0;1;1;1;0;0 -3001;bouleversement;negative;0;1;1;1;1;0 -3002;boulon;positive;0;0;0;0;0;0 -3003;boulonner;positive;0;0;0;0;0;0 -3004;bouquet;positive;0;0;0;0;0;0 -3005;bourbier;negative;0;1;1;0;0;1 -3006;bourdonner;negative;0;0;0;0;0;0 -3007;bourdonnement;negative;0;1;0;0;1;0 -3008;bourgeon;positive;0;0;0;0;0;0 -3009;bourreau;negative;0;1;1;1;0;0 -3010;boursoufler;negative;0;0;0;0;0;1 -3011;bousculade;negative;0;1;0;1;1;0 -3012;bousculer;negative;0;1;0;1;1;0 -3013;bouse;negative;0;0;0;0;0;1 -3014;boussole;positive;0;0;0;0;0;0 -3015;boutade;positive;0;0;0;0;1;0 -3016;bouteille;positive;0;0;0;0;0;0 -3017;boutique;positive;0;0;0;0;0;0 -3018;boutonner;positive;0;0;0;0;0;0 -3019;bovin;negative;0;0;0;0;0;1 -3020;box;positive;0;0;0;0;0;0 -3021;boxe;negative;0;0;0;1;0;0 -3022;boxer;positive;0;0;0;0;0;0 -3023;boxeur;positive;0;0;0;1;0;0 -3024;boyau;negative;0;0;0;0;0;1 -3025;boycott;negative;0;0;0;1;0;1 -3026;boycotter;negative;0;0;0;1;0;1 -3027;brûlé;negative;0;0;0;0;0;1 -3028;brûlée;negative;0;0;0;0;0;1 -3029;bracelet;positive;0;0;0;0;0;0 -3030;brachial;positive;0;0;0;0;0;0 -3031;braconnage;negative;0;1;1;1;0;1 -3032;brailler;negative;0;0;0;1;1;0 -3033;brainstorming;positive;0;0;0;0;0;0 -3034;braise;negative;0;1;0;0;0;0 -3035;brancard;negative;0;1;1;0;0;0 -3036;branche;positive;0;0;0;0;0;0 -3037;brancher;positive;0;0;0;0;0;0 -3038;branchie;positive;0;0;0;0;0;0 -3039;brandy;positive;0;0;0;0;0;0 -3040;branhcée;positive;0;0;0;0;0;0 -3041;branler;negative;0;1;0;0;1;0 -3042;branlant;negative;0;1;0;0;0;0 -3043;braquage;negative;0;1;1;1;0;1 -3044;braquer;negative;0;1;0;0;0;0 -3045;bras;positive;0;0;0;0;0;0 -3046;bras droit;positive;0;0;0;0;0;0 -3047;brasier;negative;0;1;0;1;0;0 -3048;brassage;positive;0;0;0;0;0;0 -3049;brasser;positive;0;0;0;0;0;0 -3050;bravade;negative;0;0;0;0;0;0 -3051;brave;positive;0;0;0;0;0;0 -3052;bravoure;positive;0;0;0;0;0;0 -3053;brebis;positive;0;0;0;0;0;0 -3054;brèche;negative;0;1;0;0;0;0 -3055;bredouillement;negative;0;1;0;0;0;0 -3056;bredouiller;negative;0;1;0;1;0;0 -3057;bref;positive;0;0;0;0;0;0 -3058;bretelle;positive;0;0;0;0;0;0 -3059;brevet;positive;0;0;0;0;0;0 -3060;breveter;positive;0;0;0;0;0;0 -3061;bribe;positive;0;0;0;0;0;0 -3062;brick;negative;0;1;1;0;0;0 -3063;bricoler;positive;0;0;0;0;0;0 -3064;brider;negative;0;1;1;0;0;0 -3065;brièvement;positive;0;0;0;0;0;0 -3066;brigade;positive;0;1;0;0;0;0 -3067;brin;positive;0;0;0;0;0;0 -3068;brindille;negative;0;0;0;0;0;0 -3069;brique;positive;0;0;0;0;0;0 -3070;brise;negative;0;1;1;0;0;0 -3071;briser;negative;0;1;1;1;1;0 -3072;briseur;negative;0;1;1;0;0;0 -3073;brocart;positive;0;0;0;0;0;0 -3074;brochet;negative;0;1;0;0;0;0 -3075;brochette;negative;0;1;0;0;0;0 -3076;brochure;positive;0;0;0;0;0;0 -3077;broder;positive;0;0;0;0;0;0 -3078;broderie;positive;0;0;0;0;0;0 -3079;broderie perlé;positive;0;0;0;0;0;0 -3080;bronco;negative;0;1;0;0;1;0 -3081;bronzage;positive;0;0;0;0;0;0 -3082;bronze;positive;0;0;0;0;0;0 -3083;bronzer;positive;0;0;0;0;0;0 -3084;brosse;positive;0;0;0;0;0;0 -3085;brouette;positive;0;0;0;0;0;1 -3086;brouillage;negative;0;1;0;1;0;0 -3087;brouillard;negative;0;1;1;0;0;0 -3088;brouillon;positive;0;0;0;0;0;0 -3089;broussaille;negative;0;0;0;0;0;1 -3090;brousse;positive;0;0;0;0;0;0 -3091;broutille;negative;0;0;0;0;0;1 -3092;broyer du noir;negative;0;0;1;0;0;0 -3093;broyer;negative;0;1;1;1;0;1 -3094;broyeur;negative;0;1;0;0;0;0 -3095;bruine;negative;0;0;1;0;0;1 -3096;bruiner;negative;0;0;1;0;0;1 -3097;bruissement;negative;0;1;0;0;1;0 -3098;bruir|bruire de tambour;positive;0;0;0;0;0;0 -3099;bruir|bruire métallique;negative;0;1;0;0;1;0 -3100;bruir|bruire sec;negative;0;1;0;0;1;0 -3101;bruir|bruire sourd;negative;0;1;1;0;1;0 -3102;brûler;negative;0;1;0;1;0;0 -3103;brûlant;negative;0;1;0;1;0;0 -3104;brûleur;negative;0;1;0;1;0;0 -3105;brûlure;negative;0;1;0;0;0;0 -3106;brûlure d estomac;negative;0;0;1;0;0;1 -3107;brume;negative;0;1;1;0;0;0 -3108;brumer;negative;0;1;1;0;0;0 -3109;brun;positive;0;0;0;0;0;0 -3110;brun grisâtre;negative;0;0;1;0;0;1 -3111;brun|brune;positive;0;0;0;0;0;0 -3112;brunet;positive;0;0;0;0;0;0 -3113;brunir;negative;0;0;0;0;0;0 -3114;brusque;negative;0;1;0;1;1;0 -3115;brusquement;negative;0;1;0;0;1;0 -3116;brusquer;negative;0;1;0;1;1;0 -3117;brut;negative;0;1;1;1;0;1 -3118;brutal;negative;0;1;0;1;0;1 -3119;brutaliser;negative;0;1;0;1;0;0 -3120;brutalité;negative;0;1;1;1;0;1 -3121;brute;negative;0;1;1;1;0;1 -3122;bruyant;negative;0;1;0;1;1;0 -3123;buccal;positive;0;0;0;0;0;0 -3124;bûche;positive;0;0;0;0;0;0 -3125;budget;positive;0;0;0;0;0;0 -3126;budgétiser;positive;0;0;0;0;0;0 -3127;buffet;positive;0;0;0;1;0;0 -3128;buffle;negative;0;1;0;0;0;0 -3129;buisson;positive;0;0;0;0;0;0 -3130;bulbe;negative;0;0;0;0;0;1 -3131;bulbeux;negative;0;0;0;0;0;0 -3132;bulldozer;negative;0;1;0;1;0;0 -3133;bulle;positive;0;0;0;0;0;0 -3134;bulletin;positive;0;0;0;0;0;0 -3135;bungalow;positive;0;0;0;0;0;0 -3136;bunker;negative;0;1;0;0;0;0 -3137;bureau;positive;0;0;0;0;0;0 -3138;bureaucrate;negative;0;0;0;0;0;1 -3139;bureaucratie;negative;0;0;0;0;0;0 -3140;burin;negative;0;1;0;1;0;0 -3141;buriner;negative;0;0;0;1;0;0 -3142;burlesque;positive;0;0;0;0;1;0 -3143;buste;positive;0;0;0;0;0;0 -3144;but;positive;0;0;0;0;0;0 -3145;butane;negative;0;0;0;0;0;1 -3146;butyreux;positive;0;0;0;0;0;1 -3147;bye;negative;0;0;1;0;0;0 -3148;çà et là;negative;0;0;0;0;0;0 -3149;cabale;negative;0;1;0;0;0;0 -3150;cabane;positive;0;0;1;0;0;1 -3151;cabane pour enfant;positive;1;0;0;0;0;0 -3152;cabaret;positive;0;0;0;0;1;0 -3153;cabillaud;negative;0;0;0;0;0;0 -3154;cabine;positive;0;0;0;0;0;0 -3155;cabine de luxe;positive;0;0;0;0;0;0 -3156;cabine de pilotage;positive;0;0;0;0;0;0 -3157;cabine particulier;positive;0;0;0;0;0;0 -3158;cabinet;positive;0;0;0;0;0;0 -3159;câbler;positive;0;0;0;0;0;0 -3160;cabosser;negative;0;1;1;0;0;0 -3161;cabriole;positive;1;0;0;0;0;0 -3162;cabriolet;positive;0;0;0;0;0;0 -3163;caca;negative;0;0;0;0;0;1 -3164;cacao;positive;0;0;0;0;0;0 -3165;cache;negative;0;1;0;0;0;0 -3166;cacher;negative;0;1;1;0;1;0 -3167;cachemire;positive;0;0;0;0;0;0 -3168;cachot;negative;0;1;1;0;0;0 -3169;cacophonie;negative;0;1;0;1;0;1 -3170;cadavre;negative;0;1;1;0;1;1 -3171;caddie;positive;0;0;0;0;0;0 -3172;cadeau;positive;0;0;0;0;1;0 -3173;cadenas;negative;0;1;0;0;0;0 -3174;cadenasser;negative;0;1;0;0;0;0 -3175;cadence;positive;0;0;0;0;0;0 -3176;cadencer;positive;0;0;1;1;0;0 -3177;cadet;positive;0;0;0;0;0;0 -3178;cadran;positive;0;0;0;0;0;0 -3179;cadran solaire;positive;0;0;0;0;0;0 -3180;cadre;positive;0;0;0;0;0;0 -3181;caduc;negative;0;0;1;0;0;1 -3182;café;positive;0;0;0;0;0;0 -3183;café restaurant;positive;0;0;0;0;0;0 -3184;cafouillage;negative;0;0;0;0;0;0 -3185;cage;negative;0;1;1;0;0;0 -3186;cageot;positive;0;0;0;0;0;0 -3187;cahier;positive;0;0;0;0;0;0 -3188;caille;negative;0;1;0;0;0;0 -3189;cailler;negative;0;0;0;0;0;1 -3190;caillot;negative;0;1;0;0;0;1 -3191;caillou;positive;0;0;0;1;0;0 -3192;cairn;positive;0;0;0;0;0;0 -3193;caisse;positive;0;0;0;0;0;0 -3194;calamiter;negative;0;1;1;0;0;0 -3195;calandre;negative;0;0;0;0;0;0 -3196;calcaire;negative;0;0;0;0;0;1 -3197;calciner;negative;0;1;0;0;0;1 -3198;calculable;positive;0;0;0;0;0;0 -3199;calculateur;positive;0;0;0;0;0;0 -3200;calculateur|calculatrice;positive;0;0;0;0;0;0 -3201;calculer;positive;0;0;0;0;0;0 -3202;calculette;positive;0;0;0;0;0;0 -3203;calembour;positive;1;0;0;0;0;0 -3204;calendrier;positive;0;0;0;0;0;0 -3205;calibre;positive;0;0;0;0;0;0 -3206;calibrer;positive;0;0;0;0;0;0 -3207;calice;positive;0;0;0;0;0;0 -3208;calicot;positive;0;0;0;0;0;0 -3209;câlin;positive;0;0;0;0;0;0 -3210;câliner;positive;0;0;0;0;0;0 -3211;calligraphie;positive;0;0;0;0;0;0 -3212;calmement;positive;1;0;0;0;0;0 -3213;calomnier;negative;0;1;1;1;0;1 -3214;calorie;negative;0;0;0;0;0;0 -3215;calorimètre;positive;0;0;0;0;0;0 -3216;calorique;negative;0;0;0;0;0;0 -3217;calquer;positive;0;0;0;0;0;0 -3218;calque;positive;0;0;0;0;0;0 -3219;camarade;positive;0;0;0;0;0;0 -3220;camarade de classe;positive;0;0;0;0;0;0 -3221;camarade de jeu;positive;0;0;0;0;0;0 -3222;camaraderie;positive;0;0;0;0;0;0 -3223;cambriolage;negative;0;1;1;0;1;0 -3224;cambrioler;negative;0;1;1;1;0;1 -3225;cambrure;positive;0;0;0;0;0;0 -3226;came;positive;0;0;0;0;0;0 -3227;camer;positive;0;0;0;0;0;0 -3228;caméléon;positive;0;0;0;0;0;0 -3229;camelote;negative;0;0;1;0;0;1 -3230;cameraman;positive;0;0;0;0;0;0 -3231;caméraman;positive;0;0;0;0;0;0 -3232;camion;positive;0;0;0;0;0;0 -3233;camionnette;positive;0;0;0;0;0;0 -3234;camouflage;negative;0;0;0;0;1;0 -3235;camoufler;negative;0;0;0;0;1;0 -3236;camp;positive;0;0;0;0;0;0 -3237;campagne;positive;0;1;0;1;0;0 -3238;campement;positive;0;0;0;0;0;0 -3239;camper;positive;0;0;0;0;0;0 -3240;camping;positive;0;0;0;0;0;0 -3241;campus;positive;0;0;0;0;0;0 -3242;canalisation;negative;0;0;0;0;0;1 -3243;canapé;positive;0;0;1;0;0;0 -3244;canard;positive;0;0;0;0;0;0 -3245;canard mâle;positive;0;0;0;0;0;0 -3246;canari;positive;0;0;0;0;0;0 -3247;cancer;negative;0;1;1;1;0;1 -3248;candidature;positive;0;1;0;1;0;0 -3249;caniche;positive;0;0;0;0;0;0 -3250;canidé;positive;0;0;0;0;0;0 -3251;canin;positive;0;0;0;0;0;0 -3252;canine;positive;0;0;0;0;0;0 -3253;caniveau;negative;0;0;0;0;0;1 -3254;canneler;positive;0;0;0;0;0;0 -3255;cannelle;positive;0;0;0;0;0;0 -3256;cannibale;negative;0;1;0;0;0;1 -3257;cannibalisme;negative;0;1;0;0;0;1 -3258;canoë;positive;0;0;0;0;0;0 -3259;canon;negative;0;1;0;1;0;0 -3260;canonique;positive;0;0;0;0;0;0 -3261;canot de sauvetage;positive;0;0;0;0;0;0 -3262;canotage;positive;1;0;0;0;0;0 -3263;cantilever;positive;0;0;0;0;0;0 -3264;cantine;positive;0;0;0;0;0;0 -3265;cantique;positive;0;0;1;0;0;0 -3266;canton;positive;0;0;0;0;0;0 -3267;cantonnement;negative;0;0;1;0;0;0 -3268;canular;negative;0;0;1;1;1;1 -3269;caoutchouc;negative;0;0;0;0;0;0 -3270;cap;positive;0;0;0;0;0;0 -3271;capable;positive;0;0;0;0;0;0 -3272;capacité;positive;0;0;0;0;0;0 -3273;capillaire;positive;0;0;0;0;0;0 -3274;capitaine;positive;0;0;0;0;0;0 -3275;capitale;positive;0;0;0;0;0;0 -3276;capitaliste;negative;0;0;0;0;0;0 -3277;capitation;negative;0;0;0;0;0;0 -3278;capital propre;positive;0;0;0;0;0;0 -3279;capitole;positive;0;0;0;0;0;0 -3280;capitulation;negative;0;1;1;0;1;0 -3281;capituler;negative;0;1;1;0;0;0 -3282;caporal;positive;0;0;0;0;0;0 -3283;capot;positive;0;1;0;1;0;1 -3284;caprice;negative;0;0;0;1;1;0 -3285;captivant;positive;0;0;0;0;0;0 -3286;captivité;negative;0;1;1;0;0;0 -3287;capture;negative;0;1;0;1;1;0 -3288;capturer;negative;0;1;0;1;1;0 -3289;capuche;positive;0;1;0;1;0;1 -3290;capuchon;positive;0;0;0;0;0;0 -3291;caraco;positive;0;0;0;0;0;0 -3292;caractère aléatoire;negative;0;1;0;0;1;0 -3293;caractère raisonnable;positive;0;0;0;0;0;0 -3294;caractériser;positive;0;0;0;0;0;0 -3295;caractéristique;positive;0;0;0;0;0;0 -3296;carafe;positive;0;0;0;0;0;0 -3297;caramel;positive;0;0;0;0;0;0 -3298;carapace;positive;0;0;0;0;0;0 -3299;carat;positive;0;0;0;0;0;0 -3300;caravane;positive;0;0;0;0;0;0 -3301;carbone;negative;0;0;0;0;0;0 -3302;carboniser;negative;0;1;0;1;0;0 -3303;carburant;positive;0;0;0;0;0;0 -3304;carcasse;negative;0;1;1;0;0;1 -3305;carcinome;negative;0;1;1;0;0;0 -3306;cardigan;positive;0;0;0;0;0;0 -3307;cardinal;positive;0;0;0;0;0;0 -3308;cardiomyopathie;negative;0;1;1;0;0;0 -3309;caresse;positive;1;0;0;0;0;0 -3310;caresser;positive;1;0;0;0;0;0 -3311;carex;positive;0;0;0;0;0;0 -3312;cargaison;positive;0;0;0;0;0;0 -3313;caribou;positive;0;0;0;0;0;0 -3314;caricature;negative;0;0;0;0;0;0 -3315;caricaturer;negative;0;0;0;0;0;0 -3316;carie;negative;0;0;0;0;0;1 -3317;carillon;positive;1;0;0;0;0;0 -3318;carillonnement;positive;0;0;0;0;1;0 -3319;carillonner;positive;1;0;0;0;0;0 -3320;carlin;positive;0;0;0;0;0;0 -3321;carnation;positive;0;0;0;0;0;0 -3322;carnet;positive;0;0;0;0;0;0 -3323;carnivore;negative;0;1;0;0;0;0 -3324;carquois;negative;0;1;0;0;0;0 -3325;carrer;positive;0;0;0;0;0;0 -3326;carreau;positive;0;0;0;0;0;0 -3327;carrelage;positive;0;0;0;0;0;0 -3328;carreler;positive;0;0;0;0;0;0 -3329;carrément;positive;0;0;0;0;0;0 -3330;carrossage;positive;0;0;0;0;0;0 -3331;carrousel;positive;1;0;0;0;0;0 -3332;carrure;positive;0;0;0;0;0;0 -3333;cartable;positive;0;0;0;0;0;0 -3334;carte;positive;0;0;0;0;0;0 -3335;cartel;negative;0;1;0;1;0;0 -3336;carter;negative;0;0;0;0;0;1 -3337;cartilage;negative;0;0;0;0;0;1 -3338;cartographie;positive;0;0;0;0;0;0 -3339;cartographique;positive;0;0;0;0;0;0 -3340;carton;positive;0;0;0;0;0;0 -3341;cartouche;negative;0;1;0;0;0;0 -3342;caséine;positive;0;0;0;0;0;0 -3343;caserne;positive;0;0;0;0;0;0 -3344;casier;positive;0;0;0;0;0;0 -3345;casino;positive;0;0;0;0;1;0 -3346;casque;positive;0;1;0;0;0;0 -3347;casquette;positive;0;0;0;0;0;0 -3348;cassable;negative;0;1;0;0;0;0 -3349;casser;negative;0;1;0;0;1;0 -3350;cassant;negative;0;1;0;0;1;0 -3351;casse croûte;positive;0;0;0;0;0;0 -3352;casse pied;negative;0;0;0;1;0;0 -3353;casse tête;positive;0;0;0;0;0;0 -3354;casserole;positive;0;0;0;0;0;0 -3355;cassette;positive;0;0;0;0;0;0 -3356;cassette vidéo;positive;0;0;0;0;0;0 -3357;caste;negative;0;0;0;0;0;0 -3358;castrer;negative;0;1;1;0;0;0 -3359;catabolisme;positive;0;0;0;0;0;0 -3360;cataclysme;negative;0;1;1;1;1;0 -3361;cataire;negative;0;0;0;0;0;1 -3362;catalogue;positive;0;0;0;0;0;0 -3363;catalyse;positive;0;0;0;0;0;0 -3364;catalytique;positive;0;0;0;0;0;0 -3365;catamaran;positive;0;0;0;0;0;0 -3366;catapulte;negative;0;0;0;1;0;0 -3367;catapulter;negative;0;0;0;1;0;0 -3368;cataracte;negative;0;1;1;0;0;0 -3369;catéchisme;positive;0;0;0;0;0;1 -3370;catégorie;positive;0;0;0;0;0;0 -3371;cathartique;positive;0;0;0;0;0;0 -3372;cathédrale;positive;0;0;0;0;0;0 -3373;cathéter;negative;0;1;0;0;0;0 -3374;catholique;positive;0;0;0;0;0;0 -3375;cauchemar;negative;0;1;1;0;0;0 -3376;caudal;negative;0;0;0;0;0;1 -3377;causal;negative;0;0;1;0;0;0 -3378;causalité;negative;0;0;1;0;0;0 -3379;causation;negative;0;0;1;0;0;0 -3380;causer;negative;0;0;1;0;0;0 -3381;caution;positive;0;0;0;0;0;0 -3382;cavaler;negative;0;1;0;0;0;0 -3383;cavalerie;positive;0;0;0;0;0;0 -3384;caveau;positive;0;0;0;0;0;0 -3385;caverne;negative;0;1;1;0;0;0 -3386;caverneux;negative;0;1;1;0;0;0 -3387;cavité;negative;0;1;0;0;0;0 -3388;cayenne;positive;0;0;0;0;0;0 -3389;ce qui précéder;positive;0;0;0;0;0;0 -3390;cécité;negative;0;1;1;0;0;0 -3391;céder;positive;0;0;0;0;0;0 -3392;ceinture;negative;0;1;1;1;0;0 -3393;ceinturer;negative;0;1;1;0;0;0 -3394;célébrant;positive;1;0;0;0;0;0 -3395;célébration;positive;0;0;0;0;1;0 -3396;célèbre;positive;0;0;0;0;0;0 -3397;célébrer;positive;1;0;0;0;0;0 -3398;célibat;negative;0;0;0;0;0;0 -3399;célibataire;negative;0;0;0;0;0;0 -3400;cellulaire;positive;0;0;0;0;0;0 -3401;cellule;negative;0;0;0;0;0;0 -3402;celluloïde;positive;0;0;0;0;0;0 -3403;cendre;negative;0;1;1;0;0;1 -3404;cendrer;negative;0;1;0;0;0;0 -3405;censeur;negative;0;1;0;1;0;1 -3406;censurer;negative;0;1;0;1;0;1 -3407;cent;positive;0;0;0;0;0;0 -3408;cent douze livre;positive;0;0;0;0;0;0 -3409;cent livre;positive;0;0;0;0;0;0 -3410;centaine;positive;0;0;0;0;0;0 -3411;centenaire;positive;1;0;0;0;0;0 -3412;centième;positive;0;0;0;0;0;0 -3413;centime;positive;0;0;0;0;0;0 -3414;centimètre;positive;0;0;0;0;0;0 -3415;central;positive;0;0;0;0;0;0 -3416;centralement;positive;0;0;0;0;0;0 -3417;centrale;positive;0;0;0;0;0;0 -3418;centralisation;positive;0;0;0;0;0;0 -3419;centraliser;positive;0;0;0;0;0;0 -3420;centralité;positive;0;0;0;0;0;0 -3421;centre;positive;0;0;0;0;0;0 -3422;centre commercial;positive;0;0;0;0;0;0 -3423;centre de détention;negative;0;1;1;1;0;0 -3424;centrer;positive;0;0;0;0;0;0 -3425;centrifuge;positive;0;0;0;0;0;0 -3426;centrifuger;positive;0;0;0;0;0;0 -3427;centrifugeuse;positive;0;0;0;0;0;0 -3428;centurion;positive;0;0;0;0;0;0 -3429;céphalée;negative;0;0;1;0;0;0 -3430;céramique;positive;0;0;0;0;0;0 -3431;cerceau;positive;0;0;0;0;0;0 -3432;cercle;positive;0;0;0;0;0;0 -3433;cercueil;negative;0;1;1;0;0;0 -3434;céréale;positive;0;0;0;0;0;0 -3435;céréalier;positive;0;0;0;0;0;0 -3436;cérébral;positive;0;0;0;0;0;0 -3437;cérémonial;positive;0;0;0;0;0;0 -3438;cérémonie;positive;0;0;0;0;1;0 -3439;cerf;positive;0;0;0;0;0;0 -3440;cerf volant;positive;0;0;0;0;0;1 -3441;cerise;positive;0;0;0;0;0;0 -3442;cerner;negative;0;1;0;0;0;0 -3443;certificat;positive;0;0;0;0;0;0 -3444;certifier;positive;0;0;0;0;0;0 -3445;certitude;positive;0;0;0;0;0;0 -3446;cérumen;negative;0;0;0;0;0;1 -3447;cerveau;positive;0;0;0;0;0;0 -3448;cervelle;positive;0;0;0;0;0;0 -3449;cessation;negative;0;0;1;0;1;0 -3450;cession;positive;0;0;0;0;0;0 -3451;cessionnaire;positive;0;0;0;0;0;0 -3452;ceuillie;positive;1;0;0;0;0;0 -3453;chacunes;positive;0;0;0;0;0;0 -3454;chacuns;positive;0;0;0;0;0;0 -3455;chagrin;negative;0;1;1;0;0;0 -3456;chaîne;negative;0;1;1;1;0;1 -3457;chair;negative;0;0;0;0;0;1 -3458;chaire;positive;0;0;0;0;0;0 -3459;chaise;positive;0;0;0;0;0;0 -3460;châle;positive;0;0;0;0;0;0 -3461;chalet;positive;0;0;0;0;0;0 -3462;chaleur;positive;0;0;0;0;0;0 -3463;chaleureux;positive;0;0;0;0;0;0 -3464;chaleureusement;positive;1;0;0;0;0;0 -3465;challenge;negative;0;1;0;1;0;0 -3466;chalut;positive;0;0;0;0;0;0 -3467;chalutier;positive;0;0;0;0;0;0 -3468;chamaillerie;negative;0;0;0;1;0;1 -3469;chaman;negative;0;1;0;0;0;0 -3470;chambre;positive;0;0;0;0;0;0 -3471;chambre à coucher;positive;0;0;0;0;0;0 -3472;chambre fort;positive;0;0;0;0;0;0 -3473;chambre libre;positive;1;0;0;0;0;0 -3474;chameau;positive;0;0;0;0;0;0 -3475;champ;positive;0;0;0;0;0;0 -3476;champ de bataille;negative;0;1;1;1;0;0 -3477;champagne;positive;0;0;0;0;0;0 -3478;champion champion;positive;1;0;0;0;0;0 -3479;chance;positive;0;0;0;0;1;0 -3480;chanceler;negative;0;1;0;0;1;0 -3481;chancelant;negative;0;1;0;0;1;0 -3482;chancelier;positive;0;0;0;0;0;0 -3483;chancre;negative;0;0;0;1;0;1 -3484;chandelier;positive;0;0;0;0;0;0 -3485;chandler;positive;0;0;0;0;0;0 -3486;changeable;positive;0;0;0;0;0;0 -3487;changeant;positive;0;0;0;0;0;0 -3488;changer;positive;0;1;0;0;0;0 -3489;changeur;positive;0;0;0;0;0;0 -3490;chanson;positive;0;0;0;0;0;0 -3491;chansonnette;positive;1;0;0;0;0;0 -3492;chant;positive;0;0;0;1;1;0 -3493;chant de noël;positive;0;0;0;0;0;0 -3494;chantage;negative;0;1;0;1;0;0 -3495;chanter en ch?ur;positive;1;0;0;0;0;0 -3496;chanvre;positive;0;0;0;0;0;0 -3497;chaos;negative;0;1;1;1;0;0 -3498;chapeau;positive;0;0;0;0;0;0 -3499;chapelain;positive;0;0;0;0;0;0 -3500;chapelet;positive;0;0;0;0;0;0 -3501;chapelle;positive;0;0;0;0;0;0 -3502;chapiteau;positive;0;0;0;0;0;0 -3503;chapitre;positive;0;0;0;0;0;0 -3504;char;positive;0;0;0;0;0;0 -3505;charabia;negative;0;0;0;1;0;0 -3506;charbon;negative;0;1;1;0;0;1 -3507;charbon de bois;negative;0;0;0;0;0;1 -3508;charbon ardent;negative;0;1;0;0;0;0 -3509;charcuter;negative;0;1;0;1;0;1 -3510;charcutier;negative;0;1;0;1;0;1 -3511;chardon;positive;0;0;0;0;0;0 -3512;charger;negative;0;1;1;0;0;0 -3513;chargement;positive;0;0;0;0;0;0 -3514;charger qqn de faire qch;positive;0;0;0;0;0;0 -3515;chargeur;positive;0;0;0;0;0;0 -3516;chariot;positive;0;0;0;0;0;0 -3517;charitable;positive;0;0;0;0;0;0 -3518;charité;positive;0;0;0;0;0;0 -3519;charlatan;negative;0;0;0;1;0;1 -3520;charmer;positive;0;0;0;0;0;0 -3521;charmant;positive;0;0;0;0;0;0 -3522;charmeur;positive;0;0;0;0;0;0 -3523;charnière;positive;0;0;0;0;0;0 -3524;charnu;negative;0;0;0;0;0;0 -3525;charognard;negative;0;1;0;0;0;1 -3526;charpenter;positive;0;0;0;0;0;0 -3527;charpentier;positive;0;0;0;0;0;0 -3528;charpir;negative;0;1;1;0;0;1 -3529;charretier;positive;0;0;0;0;0;0 -3530;charrette;positive;0;0;0;0;0;1 -3531;charrier;positive;0;0;0;0;1;0 -3532;charrue;positive;0;0;0;0;0;0 -3533;charte;positive;0;0;0;0;0;0 -3534;chasser;negative;0;1;0;1;0;0 -3535;chasse;negative;0;1;0;1;0;0 -3536;chasteté;positive;0;0;0;0;0;0 -3537;chat;positive;0;0;0;0;0;0 -3538;chat sauvage;negative;0;1;0;0;0;0 -3539;chat tigré;positive;0;0;0;0;0;0 -3540;châtaigne;positive;0;0;0;0;0;0 -3541;châtaignier;positive;0;0;0;0;0;0 -3542;châtain;positive;0;0;0;0;0;0 -3543;château;positive;0;0;0;0;0;0 -3544;châtiment;negative;0;1;1;1;0;0 -3545;chatoiement;positive;1;0;0;0;0;0 -3546;chaton;positive;0;0;0;0;0;0 -3547;chatouillement;positive;0;0;0;0;1;0 -3548;chatouiller;positive;0;0;0;0;1;0 -3549;chatouilleux;negative;0;0;0;0;0;0 -3550;chat|chatte;positive;0;0;0;0;0;0 -3551;chaud;positive;0;0;0;1;0;0 -3552;chaud|chaude;positive;0;0;0;1;0;0 -3553;chaudière;positive;0;0;0;0;0;0 -3554;chauffage;positive;0;0;0;0;0;0 -3555;chauffer;positive;0;0;0;0;0;0 -3556;chauffe eau;positive;0;0;0;0;0;0 -3557;chauffeur;positive;0;0;0;0;0;0 -3558;chaumière;positive;0;0;0;0;0;0 -3559;chausser;positive;0;0;0;0;0;0 -3560;chaussette;positive;0;0;0;0;0;0 -3561;chausseur;positive;0;0;0;0;0;0 -3562;chausson;positive;0;0;0;0;0;0 -3563;chaussure;positive;0;0;0;0;0;0 -3564;chauve;negative;0;0;1;0;0;1 -3565;chauve souris;negative;0;1;0;0;0;1 -3566;chavirer;negative;0;1;0;0;0;0 -3567;check list;positive;0;0;0;0;0;0 -3568;cheesecake;positive;0;0;0;0;0;0 -3569;chef d équipe;positive;0;0;0;0;0;0 -3570;chef d orchestre;positive;0;0;0;0;0;0 -3571;chef opérateur;positive;0;0;0;0;0;0 -3572;chemin de fer;positive;0;0;0;0;0;0 -3573;cheminer;positive;0;0;0;1;0;0 -3574;cheminement;positive;0;0;0;0;0;0 -3575;chemise;positive;0;0;0;0;0;0 -3576;chemisier;positive;0;0;0;0;0;0 -3577;chêne;positive;0;0;0;0;0;0 -3578;chenil;negative;0;0;1;0;0;0 -3579;chenille;negative;0;0;0;0;0;1 -3580;chèque;positive;0;0;0;0;0;0 -3581;chercher;positive;0;0;0;0;0;0 -3582;chère;negative;0;0;1;0;0;0 -3583;chérir;positive;0;0;1;0;0;0 -3584;cher;negative;0;0;1;0;0;0 -3585;cheval;positive;0;0;0;0;0;0 -3586;cheval de course;positive;0;0;0;0;0;0 -3587;cheval sauvage;negative;0;1;0;0;1;0 -3588;chevalerie;positive;0;0;0;0;0;0 -3589;chevalet;positive;0;0;0;0;0;0 -3590;chevalier;positive;0;0;0;0;0;0 -3591;chevaucher;positive;0;0;0;0;0;0 -3592;chevauchement;negative;0;0;0;0;0;0 -3593;cheveu;positive;0;0;0;0;0;0 -3594;cheville;positive;0;0;0;0;0;0 -3595;chèvre;positive;0;0;0;0;0;0 -3596;chèvrefeuille;positive;0;0;0;0;0;0 -3597;chevreuil;negative;0;0;0;0;0;0 -3598;chevron;positive;0;0;0;0;0;0 -3599;chevronner;positive;0;0;0;0;0;0 -3600;chewing gum;positive;0;0;0;0;0;0 -3601;chic;positive;1;0;0;0;0;0 -3602;chichi;negative;0;0;0;0;0;1 -3603;chien;positive;0;0;0;0;0;0 -3604;chien de garde;positive;0;1;0;0;0;0 -3605;chien|chienne;negative;0;1;1;1;0;1 -3606;chiffonner;negative;0;0;0;1;0;0 -3607;chiffre;positive;0;0;0;0;0;0 -3608;chignon;positive;0;0;0;0;0;0 -3609;chimère;negative;0;1;0;0;1;0 -3610;chimie;positive;0;0;0;0;0;0 -3611;chimiste;positive;0;0;0;0;0;0 -3612;chine;positive;0;0;0;0;0;0 -3613;chinook;negative;0;0;0;0;0;0 -3614;chiot;positive;0;0;0;0;0;0 -3615;chiquer;negative;0;0;0;0;0;1 -3616;chirurgie;negative;0;1;1;0;0;0 -3617;chloroforme;negative;0;1;0;0;0;1 -3618;choc;negative;0;1;0;1;1;0 -3619;chochotte;negative;0;1;0;0;0;1 -3620;chocolat;positive;0;0;0;0;0;0 -3621;ch?ur;positive;0;0;0;0;0;0 -3622;choisir;positive;0;0;0;0;0;0 -3623;choix;positive;0;0;0;0;0;0 -3624;choléra;negative;0;1;1;0;0;1 -3625;choper;negative;0;1;0;1;1;0 -3626;choral;positive;1;0;0;0;0;0 -3627;chorale;positive;0;0;0;0;0;0 -3628;chose;negative;0;1;0;1;0;1 -3629;chou;positive;0;0;0;0;0;0 -3630;choucroute;negative;0;0;0;0;0;0 -3631;chouette;positive;1;0;0;0;0;0 -3632;chromatique;positive;0;0;0;0;0;0 -3633;chromatographie;positive;0;0;0;0;0;0 -3634;chromosome;positive;0;0;0;0;0;0 -3635;chronique;positive;0;0;0;0;0;0 -3636;chronographe;positive;0;0;0;0;0;0 -3637;chronologique;positive;0;0;0;0;0;0 -3638;chronomètre;positive;0;0;0;0;0;0 -3639;chuchoter;negative;0;1;0;0;0;0 -3640;chuchotement;negative;0;1;0;0;0;0 -3641;chut;negative;0;0;0;0;0;0 -3642;chuter;negative;0;1;1;0;1;0 -3643;chutney;positive;0;0;0;0;0;0 -3644;ci joindre;positive;0;0;0;0;0;0 -3645;cible;negative;0;1;1;0;0;0 -3646;cibler;negative;0;1;0;0;0;0 -3647;cicatrice;negative;0;1;1;1;0;1 -3648;cicatrisation;positive;0;0;0;0;0;0 -3649;cicatriser;positive;0;0;0;0;0;0 -3650;cidre;positive;0;0;0;0;0;0 -3651;ciel;positive;0;0;0;0;0;0 -3652;cierge;positive;0;0;0;0;0;0 -3653;cieux;positive;0;0;0;0;0;0 -3654;cigare;negative;0;0;0;0;0;1 -3655;cigarette;negative;0;0;0;0;0;1 -3656;ciguë;negative;0;1;0;0;0;1 -3657;cil;negative;0;1;0;1;0;0 -3658;cime;positive;0;0;0;0;0;0 -3659;ciment;positive;0;0;0;0;0;0 -3660;cimenter;negative;0;0;0;0;0;0 -3661;cimetière;negative;0;1;1;0;0;0 -3662;cinéma;positive;0;0;0;0;0;0 -3663;cinématique;positive;0;0;0;0;0;0 -3664;cinématographie;positive;0;0;0;0;0;0 -3665;cinglant;negative;0;1;0;1;1;0 -3666;cirage;positive;0;0;0;0;0;0 -3667;circoncision;negative;0;1;0;0;0;0 -3668;circonférence;positive;0;0;0;0;0;0 -3669;circonférentiel;positive;0;0;0;0;0;0 -3670;circonscrire;negative;0;1;1;0;0;0 -3671;circonstance;positive;0;0;0;0;1;0 -3672;circonstanciel;positive;0;0;0;0;0;0 -3673;circonvolution;positive;0;0;0;0;0;0 -3674;circuit;positive;0;0;0;0;0;0 -3675;circulaire;positive;0;0;0;0;0;0 -3676;circuler;positive;0;0;0;0;0;0 -3677;cirer;positive;0;0;0;0;0;0 -3678;cireux;negative;0;0;0;0;0;1 -3679;cirque;negative;0;0;0;0;0;0 -3680;cirrus;negative;0;0;1;0;0;0 -3681;cisaille;negative;0;1;0;0;0;0 -3682;ciseau;negative;0;0;0;1;0;0 -3683;ciseler;negative;0;0;0;1;0;0 -3684;citadelle;positive;0;0;0;0;0;0 -3685;citation à comparaître;negative;0;1;0;1;0;0 -3686;cité;positive;0;0;0;0;0;0 -3687;citer à comparaître;negative;0;1;0;1;0;0 -3688;citrine;negative;0;0;0;0;0;0 -3689;citron;negative;0;0;0;0;0;1 -3690;civet;positive;0;0;0;0;0;0 -3691;civière;negative;0;1;1;0;0;0 -3692;civilisation;positive;0;0;0;0;0;0 -3693;civiliser;positive;0;0;0;0;0;0 -3694;civilité;positive;0;0;0;0;0;0 -3695;civique;positive;0;0;0;0;0;0 -3696;clair;positive;0;0;0;0;0;0 -3697;clair de lune;positive;0;0;0;0;0;0 -3698;claire;positive;0;0;0;0;0;0 -3699;clairière;positive;0;0;0;0;0;0 -3700;clairon;positive;0;0;0;0;0;0 -3701;clairsemer;negative;0;0;1;0;0;0 -3702;clamer;negative;0;0;0;1;1;1 -3703;clameur;negative;0;0;0;1;1;1 -3704;clan;positive;0;0;0;0;0;0 -3705;clandestin;negative;0;1;1;0;0;0 -3706;clandestinement;negative;0;1;0;0;0;0 -3707;clapet;negative;0;0;0;1;0;1 -3708;clapier;negative;0;1;1;0;0;0 -3709;claque;negative;0;0;0;1;1;0 -3710;claquer;negative;0;1;0;1;1;0 -3711;clarifier;positive;0;0;0;0;0;0 -3712;clarinette;positive;0;0;0;0;0;0 -3713;clarté;positive;0;0;0;0;0;0 -3714;classer;positive;0;0;0;0;0;0 -3715;classe;positive;0;0;0;0;0;0 -3716;classeur;positive;0;0;0;0;0;0 -3717;classique;positive;0;0;0;0;0;0 -3718;clause;positive;0;0;0;0;0;0 -3719;clause restrictif;positive;0;0;0;0;0;0 -3720;clavecin;positive;0;0;0;0;0;0 -3721;clé;positive;0;0;0;0;0;0 -3722;clé en main;positive;0;0;0;0;0;0 -3723;clef de voûte;positive;0;0;0;0;0;0 -3724;clémence;positive;0;0;0;0;0;0 -3725;clergé;positive;0;0;0;0;0;0 -3726;clic;positive;0;0;0;0;1;0 -3727;clientèle;positive;0;0;0;0;0;0 -3728;clignement du ?il;positive;0;0;0;0;0;0 -3729;cligner du ?il;positive;0;0;0;0;0;0 -3730;clignotant;negative;0;0;0;0;1;0 -3731;clignoter;positive;0;0;0;0;0;0 -3732;climat;positive;0;0;0;0;0;0 -3733;climatologie;positive;0;0;0;0;0;0 -3734;clinquant;negative;0;0;0;0;0;0 -3735;clip;positive;0;0;0;0;0;0 -3736;clipper;negative;0;0;0;0;0;0 -3737;clique;positive;0;0;0;0;0;0 -3738;cliquer sur;positive;0;0;0;0;1;0 -3739;cliquet;positive;0;0;0;0;0;0 -3740;cliqueter;negative;0;1;0;0;1;0 -3741;cliquetis;negative;0;1;0;0;1;0 -3742;clivage;negative;0;1;1;0;0;0 -3743;clochard;negative;0;1;1;0;0;1 -3744;cloche;positive;0;0;0;0;0;0 -3745;clocher;positive;0;0;0;0;0;0 -3746;cloître;negative;0;0;1;0;0;0 -3747;cloque;negative;0;0;0;0;0;1 -3748;clôturer;negative;0;0;0;1;0;0 -3749;clou;negative;0;0;0;0;0;0 -3750;clou de finition;positive;0;0;0;0;0;0 -3751;clou de girofle;negative;0;0;0;0;0;1 -3752;clouter;negative;0;0;0;0;0;0 -3753;clown;positive;0;0;0;0;1;0 -3754;club;positive;0;0;0;0;0;0 -3755;club house;positive;0;0;0;0;0;0 -3756;coïncidence;positive;0;0;0;0;1;0 -3757;coagulation;negative;0;0;0;0;0;0 -3758;coaguler;negative;0;1;0;0;0;1 -3759;coalition;positive;0;0;0;0;0;0 -3760;coassement;negative;0;1;0;0;0;0 -3761;coasser;negative;0;1;0;0;0;0 -3762;cobalt;negative;0;0;0;0;0;0 -3763;cobra;negative;0;1;0;0;0;1 -3764;coca;negative;0;0;0;0;0;0 -3765;cocaïne;negative;0;1;1;0;0;1 -3766;cocarde;positive;0;0;0;0;0;0 -3767;coche;negative;0;0;0;0;0;0 -3768;cochon;negative;0;0;0;0;0;1 -3769;cockpit;positive;0;0;0;0;0;0 -3770;cocktail;positive;0;0;0;0;0;0 -3771;cocon;positive;0;0;0;0;0;0 -3772;cocu;negative;0;0;1;0;0;1 -3773;codex;positive;0;0;0;0;0;0 -3774;codification;positive;0;0;0;0;0;0 -3775;codifier;positive;0;0;0;0;0;0 -3776;coefficient;positive;0;0;0;0;0;0 -3777;coercition;negative;0;1;1;1;0;1 -3778;c?ur;positive;0;0;0;0;0;0 -3779;coexister;positive;0;0;0;0;0;0 -3780;coexistence;positive;0;0;0;0;0;0 -3781;coffre;negative;0;1;1;0;0;0 -3782;coffre fort;positive;0;0;0;0;0;0 -3783;cognition;positive;0;0;0;0;0;0 -3784;cohabitation;positive;0;0;0;0;0;0 -3785;cohérent;positive;0;0;0;0;0;0 -3786;cohorte;positive;0;0;0;0;0;0 -3787;coiffure;positive;0;0;0;0;0;0 -3788;coin du feu;positive;1;0;0;0;0;0 -3789;coin coin;negative;0;0;0;1;0;1 -3790;coincer;negative;0;1;1;1;1;0 -3791;coincement;negative;0;1;0;0;0;0 -3792;coïncident;positive;0;0;0;0;0;0 -3793;coïncider;positive;0;0;0;0;0;0 -3794;coke;negative;0;0;0;0;0;0 -3795;col;positive;0;0;0;0;0;0 -3796;col roulé;positive;0;0;0;0;0;0 -3797;colère;negative;0;1;0;1;0;1 -3798;colibri;positive;0;0;0;0;0;0 -3799;colique;negative;0;0;1;0;0;1 -3800;colis;positive;0;0;0;0;0;0 -3801;collage;negative;0;1;0;0;0;0 -3802;collante;negative;0;0;0;0;0;1 -3803;collatéral;positive;0;0;0;0;0;0 -3804;collation;positive;0;0;0;0;0;0 -3805;collationner;positive;0;0;0;0;0;0 -3806;colle;positive;0;0;0;0;0;0 -3807;collection;positive;0;0;0;0;0;0 -3808;collectionner;positive;0;0;0;0;0;0 -3809;collectivement;positive;0;0;0;0;0;0 -3810;collège;positive;0;0;0;0;0;0 -3811;collégien;positive;0;0;0;0;0;0 -3812;collègue;positive;0;0;0;0;0;0 -3813;collerette;positive;0;0;0;0;0;0 -3814;colley;positive;0;0;0;0;0;0 -3815;collier;positive;0;0;0;0;0;0 -3816;colline;positive;0;0;0;0;0;0 -3817;collision;negative;0;1;1;1;1;0 -3818;collocation;positive;0;0;0;0;0;0 -3819;colloque;positive;0;0;0;0;0;0 -3820;collusion;negative;0;1;1;1;0;1 -3821;colombe;positive;0;0;0;0;0;0 -3822;colombier;positive;0;0;0;0;0;0 -3823;colon;negative;0;1;0;0;0;0 -3824;côlon;negative;0;0;0;0;0;1 -3825;colonel;positive;0;0;0;0;0;0 -3826;colonial;negative;0;1;0;1;0;0 -3827;colonie;negative;0;1;0;1;0;0 -3828;colonnaire;positive;0;0;0;0;0;0 -3829;colonne;positive;0;0;0;0;0;0 -3830;colonne vertébral;positive;0;0;0;1;0;0 -3831;colophon;positive;0;0;0;0;0;0 -3832;colorant;positive;0;0;0;0;0;0 -3833;coloration;positive;0;0;0;0;0;0 -3834;colorer;positive;0;0;0;0;0;0 -3835;colorier;positive;0;0;0;0;0;0 -3836;colossal;positive;0;0;0;0;0;0 -3837;colportage;negative;0;0;0;0;0;0 -3838;colporter;negative;0;0;0;0;0;0 -3839;coma;negative;0;1;1;0;0;0 -3840;combat;negative;0;1;1;1;0;0 -3841;combatif;negative;0;1;0;1;0;0 -3842;combattre;negative;0;1;0;1;0;0 -3843;combinaison;positive;0;0;0;0;0;0 -3844;combinatoire;positive;0;0;0;0;0;0 -3845;combiner;positive;0;0;0;0;0;0 -3846;combler;positive;1;0;0;0;0;0 -3847;combustible;positive;0;0;0;0;0;0 -3848;combustion;negative;0;1;0;0;0;0 -3849;comédien;positive;0;0;0;0;0;0 -3850;comestible;positive;0;0;0;0;0;0 -3851;comète;positive;0;0;0;0;0;0 -3852;comité;positive;0;0;0;0;0;0 -3853;commander;positive;0;0;0;0;0;0 -3854;commande;positive;0;0;0;0;0;0 -3855;commandement;positive;0;0;0;0;0;0 -3856;commandeur;positive;0;0;0;0;0;0 -3857;commémoration;positive;1;0;0;0;0;0 -3858;commémorer;positive;0;0;1;0;0;0 -3859;commencer;positive;0;0;0;0;0;0 -3860;commentaire;positive;0;0;0;0;0;0 -3861;commenter;positive;0;0;0;0;0;0 -3862;commérage;negative;0;0;0;0;0;1 -3863;commerce;positive;0;0;0;0;0;0 -3864;commercial;positive;0;0;0;0;0;0 -3865;commercialisable;positive;0;0;0;0;0;0 -3866;commercialiser;positive;0;0;0;0;0;0 -3867;commère;negative;0;0;0;0;0;1 -3868;commérer;negative;0;0;0;0;0;1 -3869;commettre;positive;0;0;0;0;0;0 -3870;commissaire;positive;0;0;0;0;0;0 -3871;commissaire priseur;positive;0;0;0;0;0;0 -3872;commissariat;positive;0;0;0;0;0;0 -3873;commissionner;positive;0;0;0;0;0;0 -3874;commodité;positive;0;0;0;0;0;0 -3875;commodore;positive;0;0;0;0;0;0 -3876;commonwealth;positive;0;0;0;0;0;0 -3877;commotion;negative;0;1;1;1;0;0 -3878;commotion cérébral;negative;0;1;1;1;0;0 -3879;commuer;positive;0;0;0;0;0;0 -3880;communauté;positive;0;0;0;0;0;0 -3881;commune;positive;0;0;0;0;0;0 -3882;communément;positive;0;0;0;0;0;0 -3883;communicable;positive;0;0;0;0;0;0 -3884;communication;positive;0;0;0;0;0;0 -3885;communier;positive;0;0;0;0;0;0 -3886;communion;positive;0;0;0;0;0;0 -3887;communiquer;positive;0;0;0;0;0;0 -3888;communisme;negative;0;1;1;1;0;0 -3889;communiste;negative;0;1;0;1;0;0 -3890;commun|communs;positive;0;0;0;0;0;0 -3891;commutateur;positive;0;0;0;0;0;0 -3892;commutatif;positive;0;0;0;0;0;0 -3893;commutation;positive;0;0;0;0;0;0 -3894;commuter;positive;0;0;0;0;0;0 -3895;compactage;positive;0;0;0;0;0;0 -3896;compagne;positive;0;0;0;0;0;0 -3897;compagnie;positive;0;0;0;0;0;0 -3898;compagnie aérien;positive;0;0;0;0;0;0 -3899;compagnon;positive;0;0;0;0;0;0 -3900;comparable;positive;0;0;0;0;0;0 -3901;comparaison;negative;0;0;0;0;0;0 -3902;comparatif;positive;0;0;0;0;0;0 -3903;compartiment;positive;0;0;0;0;0;0 -3904;compas;positive;0;0;0;0;0;0 -3905;compatibilité;positive;0;0;0;0;0;0 -3906;compatible;positive;0;0;0;0;0;0 -3907;compatir;positive;0;0;1;0;0;0 -3908;compatissant;positive;0;1;1;0;0;0 -3909;compatissante;positive;0;1;1;0;0;0 -3910;compatissantes;positive;0;1;1;0;0;0 -3911;compatissants;positive;0;1;1;0;0;0 -3912;compatriote;positive;0;0;0;0;0;0 -3913;compensation;positive;0;0;0;0;0;0 -3914;compensatoire;positive;0;0;0;0;0;0 -3915;compenser;positive;0;0;0;0;1;0 -3916;compétent;positive;0;0;0;0;0;0 -3917;compétition;negative;0;0;0;1;0;0 -3918;compilation;positive;0;0;0;0;0;0 -3919;compiler;positive;0;0;0;0;0;0 -3920;complaindre;negative;0;1;1;0;0;1 -3921;complaisance;positive;0;0;0;0;0;0 -3922;complaire;negative;0;0;0;0;0;1 -3923;complaisant;negative;0;0;0;0;0;1 -3924;complément;positive;0;0;0;0;1;0 -3925;complémentaire;positive;0;0;0;0;0;0 -3926;complet;positive;0;0;0;0;0;0 -3927;compléter;positive;0;0;0;0;1;0 -3928;complexe;negative;0;1;1;0;0;0 -3929;complexité;negative;0;0;0;0;0;0 -3930;complication;negative;0;1;1;0;0;0 -3931;complice;positive;0;0;0;0;0;0 -3932;complicité;positive;0;0;0;0;0;0 -3933;compliment;positive;0;0;0;0;1;0 -3934;complimenter;positive;0;0;0;0;1;0 -3935;compliquer;negative;0;1;1;0;0;1 -3936;complot;negative;0;1;1;1;1;0 -3937;comportement;positive;0;0;0;0;0;0 -3938;comporter;positive;0;0;0;0;0;0 -3939;composant;positive;0;0;0;0;0;0 -3940;composante;positive;0;0;0;0;0;0 -3941;composer;negative;0;0;0;0;0;0 -3942;composé de constituer de;positive;0;0;0;0;0;0 -3943;composer un numéro;positive;0;0;0;0;0;0 -3944;composite;positive;0;0;0;0;0;0 -3945;composition;positive;0;0;0;0;0;0 -3946;compost;negative;0;0;0;0;0;1 -3947;composter;negative;0;0;0;0;0;1 -3948;compréhensif;positive;0;0;0;0;0;0 -3949;compréhension;positive;0;0;0;0;0;0 -3950;comprendre;positive;0;0;0;0;0;0 -3951;compresser;negative;0;0;0;1;0;0 -3952;compressible;negative;0;1;1;0;0;0 -3953;comprimer;negative;0;1;1;0;0;0 -3954;compromettre;positive;0;0;0;0;0;0 -3955;comptabilité;positive;0;0;0;0;0;0 -3956;comptable;positive;0;0;0;0;0;0 -3957;compte à rebours;negative;0;1;0;0;0;0 -3958;compter rendre;positive;0;0;0;0;0;0 -3959;compte tour;positive;0;0;0;0;0;0 -3960;compter;positive;0;0;0;0;0;0 -3961;compter à rebours;negative;0;1;0;0;0;0 -3962;compte;positive;0;0;0;0;0;0 -3963;compteur de vitesse;positive;0;0;0;0;0;0 -3964;comptoir;negative;0;0;0;0;0;0 -3965;compulsion;negative;0;1;0;1;0;0 -3966;comte;positive;0;0;0;0;0;0 -3967;comté;positive;0;0;0;0;0;0 -3968;con;negative;0;0;0;1;0;1 -3969;concaténation;positive;0;0;0;0;0;0 -3970;concave;positive;0;0;0;0;0;0 -3971;concentration;positive;0;0;0;0;0;0 -3972;concentrer;positive;0;0;0;0;0;0 -3973;concentrique;positive;0;0;0;0;0;0 -3974;concepteur;positive;0;0;0;0;0;0 -3975;conception;positive;0;0;0;0;0;0 -3976;concerner;negative;0;1;1;0;0;0 -3977;concert;positive;1;0;0;0;0;0 -3978;concession;positive;0;0;0;0;0;0 -3979;concessionnaire;positive;0;0;0;0;0;0 -3980;concevable;positive;0;0;0;0;0;0 -3981;concierge;positive;0;0;0;0;0;1 -3982;conciliation;positive;0;0;0;0;0;0 -3983;concis;positive;0;0;0;0;0;0 -3984;concision;positive;0;0;0;0;0;0 -3985;conclave;positive;0;0;0;0;0;0 -3986;conclure;positive;0;0;0;0;0;0 -3987;conclusion;positive;0;0;0;0;0;0 -3988;concoction;positive;0;0;0;0;0;0 -3989;concomitance;positive;0;0;0;0;0;0 -3990;concomitant;positive;0;0;0;0;0;0 -3991;concordance;positive;0;0;0;0;0;0 -3992;concorder;positive;0;0;0;0;0;0 -3993;concourir;positive;0;0;0;0;0;0 -3994;concours;negative;0;1;0;1;0;0 -3995;concrétiser;positive;0;0;0;0;0;0 -3996;concubinage;positive;0;0;0;0;0;0 -3997;concurrence;negative;0;0;0;1;0;0 -3998;condamnation;negative;0;1;1;1;0;1 -3999;condamner;negative;0;1;1;0;0;0 -4000;condensation;positive;0;0;0;0;0;0 -4001;condenser;positive;0;0;0;0;0;0 -4002;condescendance;negative;0;0;1;1;0;1 -4003;condescendre;negative;0;0;0;0;0;1 -4004;condescendant;negative;0;0;0;0;0;1 -4005;condiment;positive;1;0;0;0;0;0 -4006;condition préalable;positive;0;0;0;0;0;0 -4007;conditionner;negative;0;0;0;0;0;0 -4008;condition;positive;0;0;0;0;0;0 -4009;condoléance;positive;0;0;1;0;0;0 -4010;conducteur;positive;0;0;0;0;0;0 -4011;conduction;positive;0;0;0;0;0;0 -4012;conductivité;positive;0;0;0;0;0;0 -4013;conduire;positive;0;0;0;0;0;0 -4014;conduire de cheminée;positive;0;0;0;0;0;0 -4015;cône;positive;0;0;0;0;0;0 -4016;confectionner;positive;0;0;0;0;0;0 -4017;confédération;positive;0;0;0;0;0;0 -4018;confédérer;positive;0;0;0;0;0;0 -4019;conférence;positive;0;0;0;0;0;0 -4020;conférencier;positive;0;0;0;0;0;0 -4021;conférer;positive;0;0;0;0;0;0 -4022;confessionnal;positive;0;1;0;0;0;0 -4023;confession;positive;0;0;0;0;0;0 -4024;confiance;positive;0;1;0;0;0;0 -4025;confier;positive;0;0;0;0;0;0 -4026;confiant;positive;0;0;0;0;0;0 -4027;confidentiellement;positive;0;0;0;0;0;0 -4028;configuration;positive;0;0;0;0;0;0 -4029;confiner;negative;0;1;1;1;0;1 -4030;confins;positive;0;0;0;0;0;0 -4031;confirmation;positive;0;0;0;0;0;0 -4032;confirmer;positive;0;0;0;0;0;0 -4033;confire;positive;0;0;0;0;0;0 -4034;confiscation;negative;0;1;1;0;0;0 -4035;confisquer;negative;0;0;1;1;0;0 -4036;confiture;positive;0;0;0;0;0;0 -4037;conflagration;negative;0;1;0;1;1;0 -4038;conflictuel;negative;0;0;0;1;0;1 -4039;confluence;positive;0;0;0;0;0;0 -4040;confluent;positive;0;0;0;0;0;0 -4041;confondre;negative;0;1;0;0;1;0 -4042;conformation;positive;0;0;0;0;0;0 -4043;conforme;positive;0;0;0;0;0;0 -4044;conformité;positive;0;0;0;0;0;0 -4045;confort;positive;0;0;0;0;0;0 -4046;confortable;positive;1;0;0;0;0;0 -4047;conforter;positive;0;0;0;0;0;0 -4048;confraternel;positive;0;0;0;0;0;0 -4049;confrère;positive;0;0;0;0;0;0 -4050;confrérie;positive;0;0;0;0;0;0 -4051;confrontation;negative;0;1;0;1;0;0 -4052;confronter;negative;0;0;0;1;0;0 -4053;confusion;negative;0;1;1;1;1;0 -4054;congédier;negative;0;1;1;1;0;0 -4055;congélateur;positive;0;0;0;0;0;0 -4056;congélation;negative;0;0;0;0;0;0 -4057;congeler;negative;0;0;0;0;0;0 -4058;congénital;negative;0;1;0;0;0;0 -4059;congé;positive;1;0;0;0;0;0 -4060;congestion;negative;0;0;0;1;0;0 -4061;conglomérat;positive;0;0;0;0;0;0 -4062;conglomérer;positive;0;0;0;0;0;0 -4063;congratulateur;positive;1;0;0;0;0;0 -4064;congrégation;positive;0;0;0;0;0;0 -4065;congrès;positive;0;0;0;0;0;1 -4066;congruence;positive;0;0;0;0;0;0 -4067;conique;positive;0;0;0;0;0;0 -4068;conjecturer;positive;0;0;0;0;0;0 -4069;conjoindre;positive;0;0;0;0;0;0 -4070;conjointement;positive;0;0;0;0;0;0 -4071;conjonctif;positive;0;0;0;0;0;0 -4072;conjonction;positive;0;0;0;0;0;0 -4073;conjonctive;positive;0;0;0;0;0;0 -4074;conjoncture;positive;0;0;0;0;0;0 -4075;conjugaison;positive;0;0;0;0;0;0 -4076;conjugal;positive;0;0;0;0;0;0 -4077;conjuguer;positive;0;0;0;0;0;0 -4078;connaissance;positive;0;0;0;0;0;0 -4079;connard;negative;0;0;0;1;0;1 -4080;connerie;negative;0;0;0;1;0;1 -4081;connexion;positive;0;0;0;0;0;0 -4082;connaître de tout le monde;positive;1;0;0;0;0;0 -4083;conquérir;positive;1;0;0;0;0;0 -4084;conquête;negative;0;1;0;1;0;0 -4085;consacrer;positive;0;0;0;0;0;0 -4086;consanguin;negative;0;1;1;0;0;1 -4087;consciemment;positive;0;0;0;0;0;0 -4088;conscience;positive;0;0;0;0;0;0 -4089;conscient;positive;0;0;0;0;0;0 -4090;conscription;negative;0;1;0;0;0;0 -4091;consécration;positive;0;0;1;0;0;0 -4092;conseil;positive;0;0;0;0;0;0 -4093;consentir;positive;0;0;0;0;0;0 -4094;consentant;positive;0;0;0;0;0;0 -4095;conséquence;positive;0;0;0;0;0;0 -4096;conserver;positive;0;0;0;0;0;0 -4097;conservatisme;negative;0;0;0;0;0;0 -4098;conservatoire;positive;0;0;0;0;0;0 -4099;considérable;positive;1;0;0;0;0;0 -4100;considérablement;positive;1;0;0;0;0;0 -4101;considérer;positive;0;0;0;0;0;0 -4102;consignataire;positive;0;0;0;0;0;0 -4103;consignation;positive;0;0;0;0;0;0 -4104;consigner;negative;0;1;1;0;0;0 -4105;consistance;positive;0;0;0;0;0;0 -4106;consolation;positive;0;0;0;0;0;0 -4107;console;positive;0;0;1;0;0;0 -4108;consoler;positive;0;0;1;0;0;0 -4109;consolidation;positive;0;0;0;0;0;0 -4110;consolider;positive;0;0;0;0;0;0 -4111;consommer;positive;0;0;0;0;0;0 -4112;consommation;positive;0;0;0;0;0;0 -4113;consonne;positive;0;0;0;0;0;0 -4114;consort;positive;0;0;0;0;0;0 -4115;constable;positive;0;0;0;0;0;0 -4116;constance;positive;0;0;0;0;0;0 -4117;constant;positive;0;0;0;0;1;0 -4118;constater;positive;0;0;0;0;0;0 -4119;constellation;positive;0;0;0;0;0;0 -4120;constipation;negative;0;0;0;0;0;1 -4121;constituant;positive;0;1;0;0;0;0 -4122;constituer;positive;0;0;0;0;0;0 -4123;constitution;positive;0;0;0;0;0;0 -4124;constitutionnalité;positive;0;0;0;0;0;0 -4125;constructeur;positive;0;0;0;0;0;0 -4126;construction;positive;0;0;0;0;0;0 -4127;construire;positive;0;0;0;0;0;0 -4128;consul;positive;0;0;0;0;0;0 -4129;consultation;positive;0;0;0;0;0;0 -4130;consulter;positive;0;0;0;0;0;0 -4131;consumation;negative;0;1;1;0;0;0 -4132;contact;positive;0;0;0;0;0;0 -4133;contacter;positive;0;0;0;0;0;0 -4134;contagion;negative;0;1;0;0;0;1 -4135;contamination;negative;0;1;0;0;0;1 -4136;contaminer;negative;0;1;1;0;0;1 -4137;contemplatif;positive;0;0;0;0;0;0 -4138;contemplation;positive;1;0;0;0;0;0 -4139;contempler;positive;0;0;0;0;0;0 -4140;contenance;positive;0;0;0;0;0;0 -4141;contentement;positive;0;0;0;0;0;0 -4142;contenter;positive;0;0;0;0;0;0 -4143;contentieux;negative;0;1;0;1;0;1 -4144;contenir;positive;0;0;0;0;0;0 -4145;contester;negative;0;0;0;1;0;0 -4146;contexte;positive;0;0;0;0;0;0 -4147;contigu;positive;0;0;0;0;0;0 -4148;contiguës;positive;0;0;0;0;0;0 -4149;contiguïté;positive;0;0;0;0;0;0 -4150;continence;positive;0;0;0;0;0;0 -4151;continent;positive;0;0;0;0;0;0 -4152;continental;positive;0;0;0;0;0;0 -4153;contingence;negative;0;1;0;0;1;0 -4154;contingent;negative;0;0;0;0;0;0 -4155;continu;positive;0;0;0;0;0;0 -4156;continuation;positive;0;0;0;0;0;0 -4157;continuer;positive;0;0;0;0;0;0 -4158;continuellement;positive;0;0;0;0;0;0 -4159;continuité;positive;0;0;0;0;0;0 -4160;contondant;negative;0;1;0;1;0;0 -4161;contour;positive;0;0;0;0;0;0 -4162;contracter;positive;0;0;0;0;0;0 -4163;contractile;positive;0;0;0;0;0;0 -4164;contraction;positive;0;0;0;0;0;0 -4165;contradiction;negative;0;0;0;1;0;0 -4166;contradictoire;negative;0;0;0;1;0;1 -4167;contrairement;negative;0;0;0;1;0;0 -4168;contrairement à;negative;0;0;0;0;0;0 -4169;contraire;negative;0;1;1;1;0;0 -4170;contralto;positive;0;0;0;0;0;0 -4171;contrariété;negative;0;0;0;1;0;1 -4172;contraster;negative;0;0;0;0;0;0 -4173;contravention;negative;0;0;0;1;0;0 -4174;contre;negative;0;0;0;1;0;0 -4175;contre nature;negative;0;1;0;0;0;1 -4176;contre son gré;negative;0;1;1;0;0;0 -4177;contre torpilleur;negative;0;1;0;1;0;0 -4178;contrebalancer;positive;0;0;0;0;0;0 -4179;contrebande;negative;0;1;0;1;0;1 -4180;contredire;negative;0;0;0;1;0;0 -4181;contrefaçon;negative;0;0;0;1;0;1 -4182;contrefaire;positive;0;0;0;0;0;0 -4183;contrefort;positive;0;0;0;0;0;0 -4184;contrer;negative;0;0;0;1;1;0 -4185;contresens;negative;0;1;1;0;0;0 -4186;contribuer;positive;1;0;0;0;0;0 -4187;contributeur;positive;0;0;0;0;0;0 -4188;contrôler;positive;0;0;0;0;0;0 -4189;contrôleur;positive;0;0;0;0;0;0 -4190;controverse;negative;0;0;0;1;0;0 -4191;controverser;negative;0;0;0;1;0;1 -4192;contusion;negative;0;1;1;0;0;0 -4193;convaincant;positive;0;0;0;0;0;0 -4194;convaincre;positive;0;0;0;0;0;0 -4195;convalescence;positive;0;0;0;0;0;0 -4196;convalescent;positive;0;0;0;0;0;0 -4197;convection;positive;0;0;0;0;0;0 -4198;convenable;positive;0;0;0;0;0;0 -4199;convention;positive;0;0;0;0;0;0 -4200;convenir;positive;0;0;0;0;0;0 -4201;convergence;positive;0;0;0;0;0;0 -4202;convergent;positive;0;0;0;0;0;0 -4203;converger;positive;0;0;0;0;0;0 -4204;converser;positive;0;0;0;0;0;0 -4205;conversation;positive;0;0;0;0;0;0 -4206;conversationnel;positive;0;0;0;0;0;0 -4207;conversion;positive;0;0;0;0;0;0 -4208;convertir;positive;0;0;0;0;0;0 -4209;convertible;positive;0;0;0;0;0;0 -4210;convexe;positive;0;0;0;0;0;0 -4211;convexité;positive;0;0;0;0;0;0 -4212;convier;positive;0;0;0;0;1;0 -4213;convive;positive;0;0;0;0;0;0 -4214;convivialité;positive;0;0;0;0;0;0 -4215;convoi;positive;0;0;0;0;0;0 -4216;convoiter;positive;0;0;0;0;0;0 -4217;convoyer;positive;0;0;0;0;0;0 -4218;cool;positive;1;0;0;0;0;0 -4219;coopérant;positive;0;0;0;0;0;0 -4220;coopératif;positive;0;0;0;0;0;0 -4221;coopération;positive;0;0;0;0;0;0 -4222;coopérative;positive;0;0;0;0;0;0 -4223;coopérer;positive;0;0;0;0;0;0 -4224;coordonner;positive;0;0;0;0;0;0 -4225;copie;negative;0;0;0;1;0;1 -4226;copier;negative;0;0;0;0;0;0 -4227;copieux;negative;0;0;0;1;0;1 -4228;copyright;positive;0;0;0;0;0;0 -4229;coq;negative;0;1;0;0;0;0 -4230;coque;positive;0;0;0;0;0;0 -4231;coquelicot;positive;0;0;0;0;0;0 -4232;coqueluche;negative;0;1;1;0;0;1 -4233;coquin;negative;0;1;0;1;1;1 -4234;cor;negative;0;1;0;0;0;0 -4235;corail;positive;0;0;0;0;0;0 -4236;corbillard;negative;0;1;1;0;0;0 -4237;corde à linge;positive;0;0;0;0;0;0 -4238;cordon;positive;0;0;0;0;0;0 -4239;cordonnier;positive;0;0;0;0;0;0 -4240;corne;negative;0;1;0;0;0;0 -4241;corner;positive;0;0;0;0;0;0 -4242;corneille;negative;0;1;0;0;0;1 -4243;cornemuse;positive;0;0;0;0;0;0 -4244;cornet;positive;0;0;0;0;0;0 -4245;corniche;positive;0;0;0;0;0;0 -4246;corollaire;positive;0;0;0;0;0;0 -4247;coroner;positive;0;0;0;0;0;0 -4248;corporation;positive;0;0;0;0;0;0 -4249;corps législatif;positive;0;0;0;0;0;0 -4250;corpulent;positive;0;0;0;0;0;0 -4251;corpus;positive;0;0;0;0;0;0 -4252;corral;positive;0;0;0;0;0;0 -4253;correct;positive;0;0;0;0;0;0 -4254;correctement;positive;0;0;0;0;0;0 -4255;correcteur;positive;0;0;0;0;0;0 -4256;correction;negative;0;1;1;1;0;0 -4257;corrélatif;positive;0;0;0;0;0;0 -4258;corrélation;positive;0;0;0;0;0;0 -4259;correspondance;positive;0;0;0;0;0;0 -4260;correspondre;positive;0;0;0;0;0;0 -4261;correspondre à;positive;0;0;0;0;0;0 -4262;corridor;positive;0;0;0;0;0;0 -4263;corroboration;positive;0;0;0;0;0;0 -4264;corroborer;positive;0;0;0;0;0;0 -4265;corrompre;negative;0;0;1;1;0;1 -4266;corrosif;negative;0;1;0;0;0;1 -4267;corrosion;negative;0;0;1;0;0;1 -4268;corrovsive;negative;0;1;0;0;0;1 -4269;corrupteur;negative;0;1;1;1;0;1 -4270;corruption;negative;0;0;0;1;0;1 -4271;corsage;positive;0;0;0;0;0;0 -4272;cortège;positive;0;0;0;0;0;0 -4273;cortex;positive;0;0;0;0;0;0 -4274;cortical;positive;0;0;0;0;0;0 -4275;corvée;negative;0;0;1;0;0;1 -4276;corvette;positive;0;0;0;0;0;0 -4277;cosmétique;positive;0;0;0;0;0;0 -4278;cosmique;positive;0;0;0;0;0;0 -4279;cosmologie;positive;0;0;0;0;0;0 -4280;cosmopolite;positive;0;0;0;0;0;0 -4281;cosmos;positive;0;0;0;0;0;0 -4282;cosse;positive;0;0;0;0;0;0 -4283;costume;positive;0;0;0;0;0;0 -4284;côtelette;negative;0;0;0;0;0;0 -4285;cotisation;positive;0;0;0;0;0;0 -4286;coton;positive;0;0;0;0;0;0 -4287;cotonneux;positive;0;0;0;0;0;0 -4288;cottage;positive;0;0;0;0;0;0 -4289;cou;positive;0;0;0;0;0;0 -4290;couche de finition;positive;0;0;0;0;0;0 -4291;couche culotte;negative;0;0;0;0;0;1 -4292;coucher;negative;0;0;0;0;0;0 -4293;coucher de soleil;positive;0;0;0;0;0;0 -4294;coucher du soleil;positive;0;0;0;0;0;0 -4295;couchette;positive;0;0;0;0;0;0 -4296;coucou;negative;0;0;0;0;0;1 -4297;coude;negative;0;0;0;1;0;0 -4298;coudre;positive;0;0;0;0;0;0 -4299;couenne;negative;0;0;0;0;0;1 -4300;couette;positive;1;0;0;0;0;0 -4301;couguar;negative;0;1;0;0;0;0 -4302;couinement;negative;0;1;1;0;1;0 -4303;couiner;negative;0;1;1;1;1;0 -4304;couler;negative;0;1;1;0;0;1 -4305;couleur;positive;0;0;0;0;0;0 -4306;couleur prune;positive;0;0;0;0;0;0 -4307;coulisser;negative;0;0;0;0;0;0 -4308;coulissant;negative;0;0;0;0;0;0 -4309;couloir;positive;0;0;0;0;0;0 -4310;coup d état;negative;0;0;0;1;1;0 -4311;coup de balai;negative;0;0;0;0;0;0 -4312;coup de chance extraordinaire;positive;0;0;0;0;1;0 -4313;coup de couteau;negative;0;1;1;1;1;0 -4314;coup de fil;positive;0;0;0;0;0;0 -4315;coup de foudre;negative;0;1;0;1;1;0 -4316;coup de fouet;negative;0;1;0;1;0;0 -4317;coup de langue;negative;0;0;0;0;0;1 -4318;coup de pied;negative;0;0;0;1;0;0 -4319;coup de poing;negative;0;1;1;1;1;0 -4320;coup de vent;negative;0;1;0;0;1;0 -4321;coup sec;negative;0;1;0;1;1;0 -4322;coupable;negative;0;1;1;1;0;1 -4323;couper en deux;negative;0;0;0;0;0;0 -4324;couper le cheveu;positive;0;0;0;0;0;0 -4325;coupe de cheveu;positive;0;0;0;0;0;0 -4326;couper;negative;0;1;0;1;0;0 -4327;couper en dé;positive;0;0;0;0;0;0 -4328;couper en gros morceau;positive;0;0;0;0;0;0 -4329;couper en tranche;negative;0;0;0;0;0;0 -4330;couple;positive;0;0;0;0;0;0 -4331;coupler;positive;0;0;0;0;0;0 -4332;couple mal assortir;negative;0;0;0;0;0;1 -4333;couplet;positive;0;0;0;0;0;0 -4334;coupole;positive;0;0;0;0;0;0 -4335;coupon;positive;0;0;0;0;0;0 -4336;coup;negative;0;1;0;1;0;0 -4337;coupure;negative;0;1;1;1;0;1 -4338;couramment;positive;0;0;0;0;0;0 -4339;courir d air;negative;0;1;0;0;0;0 -4340;courante;positive;0;0;0;0;0;0 -4341;courant;positive;0;0;0;0;0;0 -4342;courbatu;negative;0;0;1;0;0;0 -4343;courbaturer;negative;0;0;1;0;0;0 -4344;courir;positive;0;0;0;0;0;0 -4345;courir après;negative;0;1;0;1;0;0 -4346;couronnement;positive;0;0;0;0;1;0 -4347;couronner;positive;0;0;0;0;0;0 -4348;courriel;positive;0;0;0;0;0;0 -4349;courroux;negative;0;1;0;1;0;0 -4350;cour|cours;positive;0;0;0;0;0;0 -4351;cour|cours d eau;positive;0;0;0;0;0;0 -4352;course;positive;0;0;0;0;0;0 -4353;course à pied;positive;0;0;0;0;0;0 -4354;coursier;positive;0;0;0;0;0;0 -4355;court;negative;0;0;0;0;0;0 -4356;courtage;positive;0;0;0;0;0;0 -4357;courtiser;positive;0;0;0;0;0;0 -4358;courtois;positive;0;0;0;0;0;0 -4359;courtoisie;positive;1;0;0;0;0;0 -4360;coussin;positive;0;0;0;0;0;0 -4361;coût;negative;0;0;0;0;0;0 -4362;couteau;negative;0;1;0;1;0;0 -4363;coûter;negative;0;0;0;0;0;0 -4364;coûteux;negative;0;0;1;0;0;0 -4365;coutume;positive;0;0;0;0;0;0 -4366;couture;positive;0;0;0;0;0;0 -4367;couturière;positive;0;0;0;0;0;0 -4368;couver;positive;0;0;0;0;0;0 -4369;couvent;positive;0;0;0;0;0;0 -4370;couvercle;positive;0;0;0;0;0;0 -4371;couvrir;positive;0;0;0;0;0;0 -4372;couvrante;positive;0;0;0;0;0;0 -4373;couvrant;positive;0;0;0;0;0;0 -4374;couvrir chef;positive;0;0;0;0;0;0 -4375;couvrir feu;negative;0;1;0;0;0;0 -4376;couvrir de chaume;positive;0;0;0;0;0;0 -4377;coyote;negative;0;1;0;0;0;0 -4378;crabe;negative;0;1;0;0;0;1 -4379;cracher;negative;0;0;0;0;0;1 -4380;crachin;negative;0;0;1;0;0;1 -4381;cracker;positive;0;0;0;0;0;0 -4382;craie;positive;0;0;0;0;0;0 -4383;craindre;negative;0;1;0;0;0;0 -4384;craintivement;negative;0;1;1;0;1;0 -4385;cramoisir;negative;0;0;0;0;0;1 -4386;crampe;negative;0;1;1;1;1;0 -4387;cranter;positive;0;0;0;0;0;0 -4388;crapaud;negative;0;0;0;0;0;1 -4389;crapule;negative;0;1;0;1;0;1 -4390;craquement;negative;0;1;0;1;0;0 -4391;craquer;negative;0;1;0;1;1;0 -4392;crash;negative;0;1;1;0;1;0 -4393;crasse;negative;0;0;0;0;0;1 -4394;cratère;negative;0;1;0;0;0;0 -4395;cravate;positive;0;0;0;0;0;0 -4396;crayon;positive;0;0;0;0;0;0 -4397;crayon à papier;positive;0;0;0;0;0;0 -4398;crayonner;positive;0;0;0;0;0;0 -4399;crayon de couleur;positive;0;0;0;0;0;0 -4400;crayon gras;positive;0;0;0;0;0;0 -4401;créancier hypothécaire;positive;0;0;0;0;0;0 -4402;créatif;positive;1;0;0;0;0;0 -4403;création;positive;0;0;0;0;0;0 -4404;créature;negative;0;1;0;0;0;1 -4405;crèche;positive;0;0;0;0;0;0 -4406;crédibilité;positive;0;0;0;0;0;0 -4407;crédible;positive;0;0;0;0;0;0 -4408;crédit;positive;0;0;0;0;0;0 -4409;créditer;positive;0;0;0;0;0;0 -4410;créditeur;positive;0;0;0;0;0;0 -4411;credo;positive;0;0;0;0;0;0 -4412;crédule;negative;0;0;1;0;0;0 -4413;créer;positive;1;0;0;0;0;0 -4414;crémaillère;positive;0;0;1;0;0;0 -4415;crémation;negative;0;0;1;0;0;0 -4416;crème;positive;0;0;0;0;1;0 -4417;crémerie;positive;0;0;0;0;0;0 -4418;crémier;positive;0;0;0;0;0;0 -4419;créneau;positive;0;0;0;0;0;0 -4420;créole;positive;0;0;0;0;0;0 -4421;crêpe;positive;0;0;0;0;0;0 -4422;crêper;positive;0;0;0;0;0;0 -4423;crépitement;negative;0;1;0;1;1;0 -4424;crépiter;negative;0;1;0;0;0;0 -4425;crescendo;positive;0;0;0;0;1;0 -4426;crête;negative;0;0;0;0;0;0 -4427;creuser;negative;0;0;0;0;0;0 -4428;crevaison;negative;0;1;1;0;1;0 -4429;crever;negative;0;1;1;0;1;0 -4430;crevette;negative;0;0;0;0;0;0 -4431;cri strident;negative;0;1;1;1;1;0 -4432;crier;negative;0;1;1;1;0;1 -4433;criard;negative;0;0;0;0;1;1 -4434;cribler;negative;0;1;1;0;0;0 -4435;cribler de trou;negative;0;1;1;0;0;0 -4436;cric;positive;0;0;0;0;0;0 -4437;cricket;positive;0;0;0;0;0;0 -4438;crier de joie;positive;0;0;0;0;1;0 -4439;crime;negative;0;1;1;1;0;0 -4440;criminalité;negative;0;1;0;1;0;1 -4441;crinière;positive;0;0;0;0;0;0 -4442;crique;positive;0;1;0;0;0;1 -4443;criquet;negative;0;1;0;0;0;1 -4444;crise;negative;0;1;1;1;1;0 -4445;crisper;negative;0;1;0;1;0;0 -4446;crissement;negative;0;1;1;1;1;0 -4447;crisser;negative;0;1;1;1;1;0 -4448;cristal;positive;0;0;0;0;0;0 -4449;cristallin;positive;0;0;0;0;0;0 -4450;cristallisation;positive;0;0;0;0;0;0 -4451;critère;positive;0;0;0;0;0;0 -4452;croassement;negative;0;1;0;0;0;0 -4453;croc;negative;0;1;0;0;0;0 -4454;crochet;positive;0;0;0;0;0;0 -4455;crocodile;negative;0;1;0;0;0;0 -4456;croire;positive;0;0;0;0;0;0 -4457;croisade;negative;0;1;0;1;0;0 -4458;croiser;negative;0;0;0;0;0;0 -4459;croisé;negative;0;0;0;0;0;0 -4460;croiseur;positive;0;0;0;0;0;0 -4461;croisière;positive;0;0;0;0;0;0 -4462;croissance;positive;0;0;0;0;0;0 -4463;croissance démesuré;negative;0;0;1;0;0;0 -4464;croissant;positive;0;0;0;0;0;0 -4465;croix;positive;0;1;1;1;0;0 -4466;croix gammée;negative;0;1;0;1;0;1 -4467;croquant;positive;0;0;0;0;0;0 -4468;croquant|croquante;positive;0;0;0;0;0;0 -4469;croque mitaine;negative;0;1;1;1;0;0 -4470;croque mort;positive;0;0;1;0;0;0 -4471;croquer;negative;0;0;0;1;0;0 -4472;croquet;positive;0;0;0;0;0;0 -4473;croquis;positive;0;0;0;0;0;0 -4474;crotale;negative;0;1;0;0;0;1 -4475;croupe;negative;0;0;0;0;0;0 -4476;croupier;positive;0;0;0;0;0;0 -4477;croustillant;positive;0;0;0;0;0;0 -4478;croûte;negative;0;0;0;0;0;1 -4479;croyance;positive;0;0;0;0;0;0 -4480;cruauté;negative;0;1;1;1;0;1 -4481;crucial;positive;0;0;0;0;0;0 -4482;crucifix;negative;0;1;0;0;0;0 -4483;crucifixion;negative;0;1;1;1;0;1 -4484;crustacé;negative;0;0;0;0;0;1 -4485;crypte;negative;0;1;1;0;0;0 -4486;crypter;negative;0;1;0;0;0;0 -4487;cryptographie;positive;0;0;0;0;0;0 -4488;cube;negative;0;0;0;1;0;0 -4489;cueillir;positive;1;0;0;0;0;0 -4490;cuillère;positive;0;0;0;0;0;0 -4491;cuillère à soupe;positive;0;0;0;0;0;0 -4492;cuillerée;positive;0;0;0;0;0;0 -4493;cuir;positive;0;0;0;0;0;0 -4494;cuir brut;positive;0;0;0;0;0;0 -4495;cuir chevelu;negative;0;1;0;0;0;1 -4496;cuire;positive;0;0;0;0;0;0 -4497;cuiseur vapeur;positive;0;0;0;0;0;0 -4498;cuisiner;positive;0;0;0;0;0;0 -4499;cuisine;positive;0;0;0;0;0;0 -4500;cuisinier;positive;0;0;0;0;0;0 -4501;cuisinier|cuisinière;positive;0;0;0;0;0;0 -4502;cuisson;positive;0;0;0;0;0;0 -4503;cuit|cuite;negative;0;0;0;0;0;0 -4504;cuivre;positive;0;0;0;0;0;0 -4505;cuivrer;positive;0;0;0;0;0;0 -4506;cul;negative;0;0;0;0;0;0 -4507;culasse;negative;0;0;0;0;0;0 -4508;culinaire;positive;0;0;0;0;0;0 -4509;culminer;positive;1;0;0;0;0;0 -4510;culotte;negative;0;0;0;0;0;0 -4511;culpabilité;negative;0;0;1;1;0;1 -4512;culture;positive;0;0;0;0;0;0 -4513;cumulus;negative;0;0;0;0;0;0 -4514;cupide;negative;0;1;0;1;0;0 -4515;cupidité;negative;0;0;0;1;0;1 -4516;curable;positive;0;0;0;0;0;0 -4517;curateur;positive;0;0;0;0;0;0 -4518;curcuma;positive;0;0;0;0;0;0 -4519;curling;positive;0;0;0;0;0;0 -4520;curry;positive;0;0;0;0;0;0 -4521;curviligne;positive;0;0;0;0;0;0 -4522;cuticule;negative;0;0;0;0;0;1 -4523;cutter;negative;0;1;0;0;0;0 -4524;cuvée;positive;0;0;0;0;0;0 -4525;cyanure;negative;0;1;0;0;0;1 -4526;cycle;positive;0;0;0;0;0;0 -4527;cyclique;positive;0;0;0;0;0;0 -4528;cycliste;positive;0;0;0;0;0;0 -4529;cyclone;negative;0;1;0;0;1;0 -4530;cygne;positive;0;0;0;0;0;0 -4531;cylindre;positive;0;0;0;0;0;0 -4532;cylindrique;positive;0;0;0;0;0;0 -4533;cymbale;positive;0;0;0;0;0;0 -4534;cynique;negative;0;0;0;1;0;1 -4535;cytomégalovirus;negative;0;1;1;0;0;1 -4536;cytoplasme;positive;0;0;0;0;0;0 -4537;d accord;positive;0;0;0;0;0;0 -4538;d actualité;positive;0;0;0;0;0;0 -4539;d essai;negative;0;1;0;0;0;0 -4540;d humeur changeant;negative;0;0;1;1;0;0 -4541;d intérieur;positive;0;0;0;0;0;0 -4542;d occasion;negative;0;0;0;0;0;0 -4543;d or;positive;0;0;0;0;0;0 -4544;dactylo;positive;0;0;0;0;0;0 -4545;dactylographe;positive;0;0;0;0;0;0 -4546;dague;negative;0;1;0;0;0;0 -4547;dallage;positive;0;0;0;0;0;0 -4548;dalle;positive;0;0;0;0;0;0 -4549;dame;positive;0;0;0;1;0;1 -4550;damnation;negative;0;1;1;1;0;0 -4551;damner;negative;0;1;1;0;0;0 -4552;damoiselle;positive;0;0;0;0;0;0 -4553;dandy;positive;0;0;0;0;0;1 -4554;danger;negative;0;1;1;0;0;0 -4555;dangeureuses;negative;0;1;0;0;1;0 -4556;dans le monde entier;positive;0;0;0;0;0;0 -4557;dans le secret;positive;0;0;0;0;0;0 -4558;dans le sen|sens de le longueur;positive;0;0;0;0;0;0 -4559;danse;positive;0;0;0;0;0;0 -4560;danser;positive;0;0;0;0;0;0 -4561;dard;negative;0;1;0;1;1;0 -4562;date;positive;1;0;0;0;0;0 -4563;date anniversaire;positive;0;0;0;0;1;0 -4564;dauphin;positive;0;0;0;0;1;0 -4565;dé à coudre;positive;0;0;0;0;0;0 -4566;de banlieue;negative;0;0;0;0;0;0 -4567;de baptême;positive;1;0;0;0;0;0 -4568;de base;positive;0;0;0;0;0;0 -4569;de bon augure;positive;1;0;0;0;0;0 -4570;de bon c?ur;positive;1;0;0;0;0;0 -4571;de bon goût;positive;0;0;0;0;0;0 -4572;de bureau;positive;0;0;0;0;0;0 -4573;de cabaret;positive;0;0;0;0;1;0 -4574;de ce côté là;positive;0;0;0;0;0;0 -4575;de citron;negative;0;0;0;0;0;1 -4576;de conclusion;positive;0;0;0;0;0;0 -4577;de confirmation;positive;0;0;0;0;0;0 -4578;de consolation;negative;0;0;1;0;0;0 -4579;de contrebande;negative;0;1;0;1;0;1 -4580;de côté;negative;0;0;0;0;0;0 -4581;de cuisine;positive;0;0;0;0;0;0 -4582;de démolition;negative;0;0;0;1;0;0 -4583;de façade;negative;0;0;0;1;0;1 -4584;de face;positive;0;0;0;0;0;0 -4585;de façon constant;positive;0;0;0;0;0;0 -4586;de façon décontracté;positive;0;0;0;0;0;0 -4587;de façon identique;positive;0;0;0;0;0;0 -4588;de façon introspectif;positive;0;0;0;0;0;0 -4589;de félicitation;positive;1;0;0;0;0;0 -4590;de fer;positive;0;0;0;0;0;0 -4591;de fête;positive;1;0;0;0;0;0 -4592;de force;negative;0;1;0;1;0;0 -4593;de fort carrure;positive;0;1;0;0;0;0 -4594;de fortune;negative;0;0;1;0;0;0 -4595;de gala;positive;0;0;0;0;0;0 -4596;de gouverneur;positive;0;0;0;0;0;0 -4597;de jeu;positive;0;0;0;0;0;0 -4598;de jour;positive;0;0;0;0;0;0 -4599;de le conversation;positive;0;0;0;0;0;0 -4600;de le lune;positive;0;0;0;0;0;0 -4601;de lancement;positive;0;0;0;0;0;0 -4602;de luxe;positive;1;0;0;0;0;0 -4603;de manière choquant;negative;0;0;0;0;1;0 -4604;de manière exquis;positive;1;0;0;0;0;0 -4605;de manière inattendu;negative;0;0;0;0;1;0 -4606;de manière satisfaisant;positive;0;0;0;0;0;0 -4607;de marée;negative;0;1;0;0;0;0 -4608;de marié;positive;0;0;0;0;0;0 -4609;de marque déposer;positive;0;0;0;0;0;0 -4610;de masse;negative;0;1;0;0;0;0 -4611;de mauvais augure;negative;0;1;0;0;0;0 -4612;de mauvais goût;negative;0;0;0;0;0;1 -4613;de mauvais qualité;negative;0;0;0;1;0;1 -4614;de mauvais réputation;negative;0;1;0;1;0;1 -4615;de même;positive;0;0;0;0;0;0 -4616;de mesure;positive;0;0;0;0;0;0 -4617;de moisir;negative;0;0;0;0;0;1 -4618;de montagne;positive;0;0;0;0;0;0 -4619;de notre jour;positive;0;0;0;0;0;0 -4620;de nouveau;positive;0;0;0;0;0;0 -4621;de plein air;positive;0;0;0;0;0;0 -4622;de poisson;negative;0;1;0;0;0;0 -4623;de précaution;positive;0;0;0;0;0;0 -4624;de premier choix;positive;0;0;0;0;0;0 -4625;de premier qualité;positive;1;0;0;0;0;0 -4626;de profil;negative;0;0;0;0;0;0 -4627;de qualité;positive;0;0;0;0;0;0 -4628;de rechange;positive;0;0;0;0;0;0 -4629;de représaille;negative;0;1;0;1;0;0 -4630;de rêve;positive;1;0;0;0;0;0 -4631;de saint;positive;0;0;0;0;1;0 -4632;de second main;negative;0;0;0;0;0;0 -4633;de son plein gré;positive;0;0;0;0;0;0 -4634;de soutien;positive;0;0;0;0;0;0 -4635;de sport;positive;0;0;0;0;0;0 -4636;de substitution;positive;0;0;0;0;0;0 -4637;de terre;positive;0;0;0;0;0;0 -4638;de titan;negative;0;1;0;0;0;0 -4639;de toujours;positive;0;0;0;0;0;0 -4640;de tout le jour;positive;0;0;0;0;0;0 -4641;de transition;positive;0;0;0;0;0;0 -4642;de travail;positive;0;0;0;0;0;0 -4643;de valeur;positive;0;0;0;0;0;0 -4644;de velours;positive;0;0;0;0;0;0 -4645;de vote;positive;0;0;0;0;0;0 -4646;de voyage;positive;1;0;0;0;0;0 -4647;dealer;negative;0;0;0;0;0;0 -4648;déambulation;negative;0;0;1;0;0;0 -4649;débâcle;negative;0;1;1;1;0;0 -4650;déballer;positive;0;0;0;0;0;0 -4651;débarquer;positive;0;0;0;0;0;0 -4652;débarras;negative;0;0;0;0;0;1 -4653;débarrasser;negative;0;0;1;1;0;0 -4654;débarrasser de;negative;0;0;1;0;0;0 -4655;débattre;positive;0;0;0;0;0;0 -4656;débauche;negative;0;1;0;0;0;1 -4657;débile;negative;0;0;0;1;0;1 -4658;débiliter;negative;0;0;0;1;0;1 -4659;débit;positive;0;0;0;0;0;0 -4660;débiter;positive;0;0;0;0;0;0 -4661;déblaiement;positive;0;0;0;0;0;0 -4662;déblayer|déblayer;positive;0;0;0;0;0;0 -4663;débloquer;negative;0;0;0;0;0;0 -4664;déboisement;positive;0;0;0;0;0;0 -4665;déboîter;negative;0;1;1;1;0;1 -4666;débordant;positive;0;0;0;0;0;0 -4667;débordement;negative;0;1;0;1;1;0 -4668;déboucher;positive;0;0;0;0;0;0 -4669;déboursement;positive;0;0;0;0;0;0 -4670;débourser;positive;0;0;0;0;0;0 -4671;débrancher;negative;0;0;1;0;0;0 -4672;débrayer|débrayer;positive;0;0;0;0;0;0 -4673;débris;negative;0;1;1;0;0;1 -4674;débuter;positive;0;0;0;0;0;0 -4675;décadence;negative;0;0;1;1;0;1 -4676;décalage;negative;0;0;1;0;0;0 -4677;décalquer;positive;0;0;0;0;0;0 -4678;décapage;negative;0;1;0;1;0;1 -4679;décapotable;positive;0;0;0;0;0;0 -4680;décapsuleur;positive;0;0;0;0;0;0 -4681;décéder;negative;0;0;1;0;0;0 -4682;décelable;positive;0;0;0;0;0;0 -4683;déceler;positive;0;0;0;0;0;0 -4684;décence;positive;0;0;0;0;0;0 -4685;décennie;positive;0;0;0;0;0;0 -4686;décent;positive;0;0;0;0;0;0 -4687;décentralisation;negative;0;0;0;0;0;0 -4688;décerner;positive;0;0;0;0;0;0 -4689;décevant;negative;0;0;1;1;1;1 -4690;déchaînement;negative;0;1;0;1;1;0 -4691;décharge;negative;0;0;0;0;0;1 -4692;décharger;negative;0;0;0;0;0;0 -4693;décharner;negative;0;1;1;0;0;1 -4694;déchet;negative;0;0;0;0;0;1 -4695;déchiffrer;positive;0;0;0;0;0;0 -4696;déchiqueter;negative;0;1;1;1;0;0 -4697;déchirer;negative;0;1;1;1;0;0 -4698;déchirure;negative;0;1;1;1;0;0 -4699;décidément;negative;0;0;0;0;0;0 -4700;décimal;positive;0;0;0;0;0;0 -4701;décimale;positive;0;0;0;0;0;0 -4702;décisif;positive;0;1;0;0;0;0 -4703;décision;positive;0;0;0;0;0;0 -4704;déclaration écrire sous sermen;positive;0;0;0;0;0;0 -4705;déclaration inexact;negative;0;0;0;1;0;1 -4706;déclaration officiel;positive;0;0;0;0;0;0 -4707;déclaratoire;positive;0;0;0;0;0;0 -4708;déclencher;negative;0;0;0;0;0;0 -4709;déclenchement;positive;0;0;0;0;0;0 -4710;déclic;positive;0;0;0;0;1;0 -4711;déclin;negative;0;1;1;0;0;0 -4712;décliner;negative;0;0;1;0;0;0 -4713;décolorant;negative;0;0;1;0;0;1 -4714;décoloration;negative;0;0;0;0;0;1 -4715;décolorer;negative;0;0;1;0;0;1 -4716;décomposer;negative;0;0;1;0;0;1 -4717;décomposition;negative;0;1;1;0;0;1 -4718;décompte;positive;0;0;0;0;0;0 -4719;déconcentrer;negative;0;0;0;1;0;0 -4720;déconcerter;negative;0;1;1;0;1;0 -4721;déconcertant;negative;0;1;1;0;1;0 -4722;déconnecter;negative;0;0;1;0;0;0 -4723;déconnexion;negative;0;0;1;0;0;0 -4724;décontraction;positive;1;0;0;0;0;0 -4725;décontracturant musculaire;positive;0;0;0;0;0;0 -4726;déconvenue;negative;0;0;1;1;1;1 -4727;décor;positive;0;0;0;0;0;0 -4728;décorateur;positive;0;0;0;0;0;0 -4729;décoration;positive;0;0;0;0;0;0 -4730;décorer;positive;0;0;0;0;0;0 -4731;décorum;positive;0;0;0;0;0;0 -4732;découpage;negative;0;1;1;1;0;1 -4733;découper en cube;negative;0;0;0;1;0;0 -4734;décourager;negative;0;1;1;0;0;0 -4735;décourageant;negative;0;0;1;0;0;0 -4736;découragement;negative;0;1;1;0;0;0 -4737;décours;negative;0;1;1;0;0;0 -4738;découdre;negative;0;1;1;0;0;0 -4739;découvrir;positive;0;0;0;0;0;0 -4740;découverte;positive;1;0;0;0;0;0 -4741;décrépit;negative;0;0;1;0;0;0 -4742;décréter;positive;0;0;0;0;0;0 -4743;décrier;negative;0;0;0;1;0;1 -4744;décrire;positive;0;0;0;0;0;0 -4745;décroiser;positive;0;0;0;0;0;0 -4746;décroître;negative;0;0;1;0;0;0 -4747;décroissant;negative;0;0;1;0;0;0 -4748;décuple;positive;0;0;0;0;0;0 -4749;dédaigner;negative;0;0;0;1;0;1 -4750;dédain;negative;0;1;1;1;0;1 -4751;dédale;negative;0;1;0;0;1;0 -4752;dédicace;positive;0;0;0;0;0;0 -4753;dédicacer;positive;0;0;0;0;0;0 -4754;dédier;positive;0;0;0;0;0;0 -4755;dédommagement;positive;0;0;0;0;0;0 -4756;dédommager;positive;0;0;0;0;1;0 -4757;déductif;positive;0;0;0;0;0;0 -4758;déduction;positive;0;0;0;0;0;0 -4759;déduire;positive;0;0;0;0;0;0 -4760;déesse;positive;0;0;0;0;0;0 -4761;défaillir;negative;0;1;1;1;0;0 -4762;défaite;negative;0;0;0;1;0;0 -4763;défaut de paiement;negative;0;1;1;0;0;0 -4764;défavorable;negative;0;1;1;1;0;1 -4765;défection;negative;0;1;0;0;0;1 -4766;défendre;positive;0;0;0;1;0;0 -4767;défense;positive;0;1;0;1;0;0 -4768;défenseur;positive;0;0;0;0;0;0 -4769;déférence;positive;0;0;0;0;0;0 -4770;déferlant;negative;0;0;0;0;0;0 -4771;défi;negative;0;1;0;1;0;1 -4772;déficit;negative;0;1;1;0;0;0 -4773;défier;negative;0;1;1;1;1;0 -4774;défigurer;negative;0;1;1;1;0;1 -4775;défiler;positive;0;1;0;0;1;0 -4776;définir;positive;0;0;0;0;0;0 -4777;définitif;positive;0;0;0;0;0;0 -4778;définition;positive;0;0;0;0;0;0 -4779;déflation;negative;0;1;0;0;0;0 -4780;defloration;positive;0;0;0;0;0;0 -4781;défloration;positive;0;0;0;0;0;0 -4782;défoncer;negative;0;0;0;0;0;1 -4783;déformation;negative;0;1;1;1;0;1 -4784;déformer;negative;0;0;1;1;0;1 -4785;défrichement;positive;0;0;0;0;0;0 -4786;défunt;negative;0;0;1;0;0;0 -4787;dégager;positive;0;0;0;0;0;0 -4788;dégectueuses;negative;0;0;1;0;0;1 -4789;dégel;negative;0;1;0;0;0;0 -4790;dégeler;negative;0;1;0;0;0;0 -4791;dégénérescence;negative;0;0;1;1;0;1 -4792;dégingander;negative;0;0;1;0;0;1 -4793;dégoût;negative;0;1;1;1;0;1 -4794;dégoûtant;negative;0;1;0;1;0;1 -4795;dégonfler;negative;0;0;1;0;0;0 -4796;dégonflement;negative;0;1;0;0;0;0 -4797;dégoût;negative;0;1;0;1;0;1 -4798;dégoûtane;negative;0;0;0;0;0;1 -4799;dégoûter;negative;0;0;0;0;0;1 -4800;dégoûtant;negative;0;1;0;1;0;1 -4801;dégrader;negative;0;1;1;0;0;1 -4802;dégradant;negative;0;1;1;0;0;1 -4803;dégradation;negative;0;1;1;0;0;1 -4804;degré;positive;0;0;0;0;0;0 -4805;dégueuler;negative;0;0;0;0;0;1 -4806;déguiser;negative;0;0;0;0;0;0 -4807;déguisement;negative;0;0;0;0;0;0 -4808;dégustation;positive;0;0;0;0;0;0 -4809;déjeuner;positive;0;0;0;0;0;0 -4810;déjouer;negative;0;0;1;0;0;0 -4811;délaisser;negative;0;1;1;1;0;1 -4812;délaissement;negative;0;1;1;1;0;0 -4813;délectable;positive;1;0;0;0;0;0 -4814;délecter;positive;1;0;0;0;0;0 -4815;délégation;positive;0;0;0;0;0;0 -4816;délétère;negative;0;1;1;1;0;1 -4817;délibérer;positive;0;0;0;0;0;0 -4818;délibérant;positive;0;0;0;0;0;0 -4819;délibératif;positive;0;0;0;0;0;0 -4820;délibération;positive;0;0;0;0;0;0 -4821;délicatement;positive;0;0;0;0;0;0 -4822;délictuel;negative;0;0;0;1;0;1 -4823;délictuelle;negative;0;0;0;1;0;1 -4824;délictuelles;negative;0;0;0;1;0;1 -4825;délictuels;negative;0;0;0;1;0;1 -4826;délimitation;positive;0;0;0;0;0;0 -4827;délimiter;positive;0;0;0;0;0;0 -4828;délinquance;negative;0;1;0;1;0;1 -4829;délire;negative;0;1;1;1;0;1 -4830;délit;negative;0;1;1;1;0;1 -4831;délivrance;positive;0;0;0;0;0;0 -4832;déloger;negative;0;0;0;0;0;0 -4833;déloyal;negative;0;1;0;1;0;1 -4834;delta;positive;0;0;0;0;0;0 -4835;déluge;negative;0;1;1;0;1;0 -4836;demande reconventionnel;positive;0;0;0;0;0;0 -4837;demander;negative;0;0;0;1;0;0 -4838;demandeur;positive;0;0;0;0;0;0 -4839;démangeaison;negative;0;0;0;1;1;0 -4840;démanger;negative;0;0;0;1;1;0 -4841;démarche;positive;0;0;0;0;0;0 -4842;démarche arrogant;negative;0;0;0;0;0;0 -4843;démarrer;positive;0;0;0;0;0;0 -4844;démasquer;positive;0;1;0;0;1;0 -4845;démêler;negative;0;0;0;1;0;0 -4846;démembrement;negative;0;1;1;0;0;1 -4847;déménagement;negative;0;0;0;0;0;0 -4848;démentir;negative;0;0;0;1;0;0 -4849;demeurer;positive;0;0;0;0;0;0 -4850;demi;negative;0;0;0;0;0;0 -4851;demi|demie;negative;0;0;0;0;0;0 -4852;démission;negative;0;0;1;0;1;0 -4853;démo;positive;0;0;0;0;0;0 -4854;démocrate;positive;0;0;0;0;0;0 -4855;démocratie;positive;0;0;0;0;0;0 -4856;démoder;negative;0;0;0;0;0;1 -4857;demoiselle d honneur;positive;0;0;0;0;0;0 -4858;démolition;negative;0;0;0;1;0;0 -4859;démoniaque;negative;0;1;1;1;0;1 -4860;démonstratif;positive;0;0;1;0;0;0 -4861;démonstration;positive;0;0;0;0;0;0 -4862;démontrable;positive;0;0;0;0;0;0 -4863;démontrer;positive;0;0;0;0;0;0 -4864;démoraliser;negative;0;1;1;0;0;0 -4865;démunir;negative;0;0;1;0;0;0 -4866;dénaturer;negative;0;0;0;1;0;1 -4867;déni;negative;0;0;0;1;0;0 -4868;dénier;negative;0;0;1;1;0;0 -4869;dénigrement;negative;0;1;1;1;0;1 -4870;dénigrer;negative;0;0;1;1;0;1 -4871;dénominateur;positive;0;0;0;0;0;0 -4872;dénomination;positive;0;0;0;0;0;0 -4873;dénoncer;negative;0;0;0;1;0;1 -4874;dénonciation;negative;0;1;0;1;0;1 -4875;dénouer;negative;0;0;0;0;0;0 -4876;dénoyauter;negative;0;1;1;0;0;0 -4877;denrée;positive;0;0;0;0;0;0 -4878;dense;positive;0;0;0;0;0;0 -4879;densité;positive;0;0;0;0;0;0 -4880;dent;negative;0;1;0;0;0;0 -4881;denté;negative;0;1;1;1;0;0 -4882;dentée;negative;0;1;1;1;0;0 -4883;dentelle;positive;0;1;1;1;0;0 -4884;dentisterie;positive;0;1;0;0;0;0 -4885;dénuder;negative;0;1;1;1;0;1 -4886;déodorant;positive;0;0;0;0;0;0 -4887;dépassant;positive;0;0;0;0;1;0 -4888;dépasser;negative;0;0;1;0;0;1 -4889;dépêcher;positive;0;0;0;0;0;0 -4890;dépeigner|dépeindre;positive;0;0;0;0;0;0 -4891;dépeindre;positive;0;0;0;0;0;0 -4892;dépendant;negative;0;0;0;0;0;0 -4893;dépendre;negative;0;0;0;0;0;0 -4894;dépense;negative;0;1;0;0;0;0 -4895;dépenser;negative;0;0;0;0;0;0 -4896;dépit;negative;0;0;1;1;0;1 -4897;déplaisant;negative;0;0;1;0;0;1 -4898;dépliant;positive;0;0;0;0;0;0 -4899;déplier;positive;0;0;0;0;0;0 -4900;déplorable;negative;0;1;1;1;0;1 -4901;déplorer;negative;0;0;1;1;0;1 -4902;déployer;positive;0;0;0;0;0;0 -4903;déporter;negative;0;1;1;1;1;0 -4904;dépositaire;positive;0;0;0;0;0;0 -4905;déposition;positive;0;0;0;0;0;0 -4906;déposséder;negative;0;1;1;1;0;0 -4907;dépôt de bilan;negative;0;0;1;0;0;0 -4908;dépôt visqueux;negative;0;0;0;0;0;1 -4909;dépourvu;negative;0;1;1;0;0;0 -4910;dépourvu de qch;negative;0;0;1;0;0;0 -4911;dépourvu de sen|sens;negative;0;0;1;0;0;0 -4912;dépourvue de sen|sens;negative;0;0;1;0;0;0 -4913;dépourvues de sen|sens;negative;0;0;1;0;0;0 -4914;dépouvus de sen|sens;negative;0;0;1;0;0;0 -4915;dépravation;negative;0;0;0;1;0;1 -4916;dépraver;negative;0;1;1;1;0;1 -4917;dépréciation;negative;0;1;1;0;0;0 -4918;dépression;negative;0;1;1;0;0;0 -4919;dépréssives;negative;0;1;1;0;0;0 -4920;déprimant;negative;0;0;1;0;0;1 -4921;déprime;negative;0;1;1;0;0;0 -4922;déprimer;negative;0;1;1;1;0;0 -4923;dérailler;negative;0;1;0;0;1;0 -4924;déraisonnable;negative;0;1;0;0;0;1 -4925;dérangement;negative;0;1;1;1;1;0 -4926;dérapage;negative;0;1;1;1;0;0 -4927;déraper;negative;0;1;1;1;1;0 -4928;dérision;negative;0;0;1;1;0;1 -4929;dérisoire;negative;0;0;1;0;0;1 -4930;dérivation;negative;0;0;0;0;0;0 -4931;dérive;negative;0;1;0;0;0;0 -4932;dériver;negative;0;1;0;0;0;0 -4933;dermatologie;positive;0;0;0;0;0;0 -4934;dermatologue;positive;0;0;0;0;0;0 -4935;dermique;positive;0;0;0;0;0;0 -4936;dernier;negative;0;1;1;0;0;0 -4937;dérober;negative;0;1;1;1;1;0 -4938;déroger à;negative;0;1;1;0;0;0 -4939;dérouler;positive;0;0;0;0;0;0 -4940;déroutant;negative;0;1;1;0;1;0 -4941;déroute;negative;0;1;0;0;1;0 -4942;du cieux;positive;0;0;0;0;0;0 -4943;du tas de qch;positive;0;0;0;0;0;0 -4944;désactivation;negative;0;1;0;0;0;0 -4945;désactiver;negative;0;1;1;1;0;0 -4946;désaffecter;negative;0;0;1;1;0;0 -4947;désagréable;negative;0;0;1;0;0;1 -4948;désapprobation;negative;0;0;1;1;0;1 -4949;désapprouver;negative;0;0;1;1;0;1 -4950;désarmer;negative;0;1;1;0;0;0 -4951;désavantager;negative;0;0;1;0;0;0 -4952;désavouer;negative;0;0;0;1;0;1 -4953;descendance;positive;0;0;0;0;0;0 -4954;descendre directement de;positive;0;0;0;0;0;0 -4955;descente;negative;0;1;1;1;1;0 -4956;description;positive;0;0;0;0;0;0 -4957;désenchantement;negative;0;0;1;1;0;1 -4958;désengagement;negative;0;0;1;0;0;0 -4959;déséquilibrer;negative;0;1;1;0;0;0 -4960;désert;negative;0;1;1;1;0;1 -4961;déserter;negative;0;1;1;1;0;1 -4962;désertion;negative;0;1;1;0;0;0 -4963;désertique;negative;0;1;1;0;0;0 -4964;désespérer;negative;0;1;1;0;0;0 -4965;désespoir;negative;0;1;1;1;0;1 -4966;déshabiller;positive;0;0;0;0;0;0 -4967;désherbage;negative;0;0;0;0;0;1 -4968;désherber;negative;0;0;0;0;0;1 -4969;déshonorer;negative;0;1;1;1;0;1 -4970;déshydrater;negative;0;0;0;0;0;0 -4971;désignation;positive;0;0;0;0;0;0 -4972;désigner;positive;0;0;0;0;0;0 -4973;désillusion;negative;0;0;1;1;0;1 -4974;désincarner;negative;0;1;1;0;0;0 -4975;désinfectant;negative;0;0;0;0;0;1 -4976;désinfecter;negative;0;0;0;0;0;1 -4977;désinfection;positive;0;0;0;0;0;0 -4978;désinformation;negative;0;1;1;1;0;1 -4979;désintégration;negative;0;1;1;1;0;0 -4980;désintégrer;negative;0;1;1;1;0;1 -4981;désirabilité;positive;0;0;0;0;0;0 -4982;désirable;positive;0;0;0;0;0;0 -4983;désirer ardemment;positive;0;0;0;0;0;0 -4984;désireux;positive;0;0;0;0;0;0 -4985;désobéir;negative;0;0;0;1;0;1 -4986;désobéissance;negative;0;1;1;1;0;1 -4987;désobéissant;negative;0;1;0;1;0;0 -4988;désobliger;negative;0;1;1;1;0;1 -4989;désobligeant;negative;0;1;1;1;0;1 -4990;désolation;negative;0;1;1;0;0;0 -4991;désoler;negative;0;1;1;0;0;0 -4992;désopilant;positive;0;0;0;0;1;0 -4993;désordonner;negative;0;1;1;1;0;1 -4994;désorganiser;negative;0;1;1;0;0;0 -4995;désormais;positive;0;0;0;0;0;0 -4996;despotique;negative;0;1;1;0;0;0 -4997;despotisme;negative;0;1;1;1;0;1 -4998;dessécher;negative;0;0;0;0;0;0 -4999;dessein;positive;0;0;0;0;0;0 -5000;desserrage;positive;0;0;0;0;0;0 -5001;desserrer;positive;0;0;0;0;0;0 -5002;desserrement;positive;0;0;0;0;0;0 -5003;dessert;positive;0;0;0;0;0;0 -5004;dessin;positive;0;0;0;0;0;0 -5005;dessin animer;positive;0;0;0;0;0;0 -5006;dessiner;positive;0;0;0;0;0;0 -5007;dessinateur dessinateur;positive;0;0;0;0;0;0 -5008;dessinateur;positive;0;0;0;0;0;0 -5009;dessus de lit;positive;0;0;0;0;0;0 -5010;destinataire;positive;0;0;0;0;0;0 -5011;destination;positive;0;1;1;0;1;0 -5012;destiner;positive;0;0;0;0;0;0 -5013;destruction;negative;0;1;1;1;0;0 -5014;désuet;negative;0;0;0;0;0;1 -5015;désuétude;negative;0;1;1;0;0;0 -5016;détacher;positive;0;0;0;0;0;0 -5017;détachement;negative;0;1;1;0;0;0 -5018;détail;negative;0;0;0;0;0;0 -5019;détaillant;positive;0;0;0;0;0;0 -5020;détectable;positive;0;0;0;0;0;0 -5021;détectables;positive;0;0;0;0;0;0 -5022;détecter;positive;0;0;0;0;0;0 -5023;détecteur;positive;0;0;0;0;0;0 -5024;détection;positive;0;0;0;0;0;0 -5025;détective;positive;0;0;0;0;0;0 -5026;détendre;positive;0;0;0;0;0;0 -5027;détention;negative;0;1;1;1;0;0 -5028;détention préventif;negative;0;1;1;1;0;0 -5029;détergent;negative;0;0;0;0;0;1 -5030;détérioration;negative;0;1;1;1;0;1 -5031;détériorer;negative;0;0;1;0;0;1 -5032;déterminable;positive;0;0;0;0;0;0 -5033;détermination;positive;0;0;0;0;0;0 -5034;déterrer;negative;0;0;1;0;0;1 -5035;détestable;negative;0;0;1;1;0;1 -5036;détester;negative;0;0;0;1;0;1 -5037;détonateur;positive;0;0;0;0;0;0 -5038;détour;negative;0;0;0;0;0;0 -5039;détournement;negative;0;1;0;0;0;0 -5040;détournement de fond|fonds;negative;0;0;0;1;0;1 -5041;détremper;negative;0;0;1;0;0;1 -5042;détriment;negative;0;1;1;1;0;0 -5043;détritus;negative;0;0;0;0;0;1 -5044;détroit;positive;0;0;0;0;0;0 -5045;détruire;negative;0;1;1;1;0;0 -5046;dette;negative;0;0;1;0;0;0 -5047;deuil;negative;0;0;1;0;0;0 -5048;deuxième année;positive;0;0;0;0;0;0 -5049;dévaloriser;negative;0;1;1;1;0;1 -5050;devanture;positive;0;0;0;0;0;0 -5051;dévastation;negative;0;1;1;1;1;0 -5052;dévaster;negative;0;1;1;1;0;0 -5053;développer;positive;0;0;0;0;0;0 -5054;développement;positive;0;0;0;0;0;0 -5055;devenir;positive;0;0;0;0;0;0 -5056;devenir ami avec;positive;0;0;0;0;0;0 -5057;devenir trop grand;negative;0;0;0;0;0;0 -5058;déverrouiller;positive;0;0;0;0;0;0 -5059;dévier;negative;0;1;0;0;0;0 -5060;deviner;positive;0;0;0;0;1;0 -5061;devinette;positive;0;0;0;0;1;0 -5062;devis;positive;0;0;0;0;0;0 -5063;devise;positive;0;0;0;0;0;0 -5064;dévoilement;positive;0;0;0;0;0;0 -5065;devoir;positive;0;0;0;0;0;0 -5066;dévorer;negative;0;0;0;1;0;0 -5067;dévot;positive;0;0;0;0;0;0 -5068;dévotion;positive;0;0;0;0;0;0 -5069;dévouer;positive;0;0;0;0;0;0 -5070;dévouement;positive;0;0;0;0;0;0 -5071;dextérité;positive;0;0;0;0;0;0 -5072;dextrose;positive;0;0;0;0;0;0 -5073;diable;negative;0;1;1;1;0;1 -5074;diabolique;negative;0;1;1;1;0;1 -5075;diacre;positive;0;0;0;0;0;0 -5076;diadème;positive;0;0;0;0;0;0 -5077;diagnostic;positive;0;1;0;0;1;0 -5078;diagnostique;positive;0;0;0;0;0;0 -5079;diagramme;positive;0;0;0;0;0;0 -5080;diagramme circulaire;positive;0;0;0;0;0;0 -5081;dialecte;positive;0;0;0;0;0;0 -5082;dialectique;positive;0;0;0;0;0;0 -5083;dialoguer;positive;0;0;0;0;0;0 -5084;dialogue;positive;0;0;0;0;0;0 -5085;diamant;positive;1;0;0;0;0;0 -5086;diamant solitiare;positive;0;0;0;0;0;0 -5087;diamètre;positive;0;0;0;0;0;0 -5088;diaphragme;positive;0;0;0;0;0;0 -5089;diapositive;negative;0;1;0;0;0;0 -5090;diarrhée;negative;0;0;0;0;0;1 -5091;diatribe;negative;0;0;1;1;0;1 -5092;dichotomie;positive;0;0;0;0;0;0 -5093;dichotomique;positive;0;0;0;0;0;0 -5094;dictatorial;negative;0;1;1;1;0;0 -5095;dictature;negative;0;1;1;1;0;1 -5096;dicter;positive;0;0;0;0;0;0 -5097;diction;positive;0;0;0;0;0;0 -5098;dictionnaire;positive;0;0;0;0;0;0 -5099;dictionnaire du synonyme;positive;0;0;0;0;0;0 -5100;dicton;positive;0;0;0;0;0;0 -5101;didactique;positive;0;0;0;0;0;0 -5102;diète;negative;0;0;0;0;0;0 -5103;diététique;positive;0;0;0;0;0;0 -5104;dieu;positive;0;1;0;0;0;0 -5105;différer;negative;0;0;1;0;0;0 -5106;différemment;positive;0;0;0;0;1;0 -5107;différence;negative;0;0;0;0;0;0 -5108;différenciation;negative;0;0;0;0;0;0 -5109;différencier;negative;0;0;0;0;0;0 -5110;différent;negative;0;0;0;0;0;0 -5111;diffus;positive;0;0;0;0;0;0 -5112;digérer;positive;0;0;0;0;0;0 -5113;digestion;positive;0;0;0;0;0;0 -5114;digne;positive;0;0;0;0;0;0 -5115;digne de confiance;negative;0;1;0;0;1;0 -5116;dignité;positive;0;0;0;0;0;0 -5117;digresser;negative;0;1;0;1;0;0 -5118;dilatation;negative;0;0;0;0;0;1 -5119;dilater;negative;0;0;0;0;0;0 -5120;dilemme;negative;0;1;1;1;0;0 -5121;diligence;positive;0;0;0;0;0;0 -5122;diluer;positive;0;0;0;0;0;0 -5123;dilution;positive;0;0;0;0;0;0 -5124;dîme;negative;0;0;0;0;0;0 -5125;dimension;positive;0;0;0;0;0;0 -5126;diminuer progressivement;negative;0;1;1;0;0;0 -5127;diminutif;positive;0;0;0;0;0;0 -5128;dîner;positive;0;0;0;0;0;0 -5129;dinosaure;negative;0;1;0;0;0;0 -5130;diocésain;positive;0;0;0;0;0;0 -5131;diocèse;positive;0;0;0;0;0;0 -5132;diorama;positive;0;0;0;0;0;0 -5133;diplomate;positive;0;0;0;0;0;0 -5134;diplomatie;positive;0;0;0;0;0;0 -5135;diplomatique;positive;0;0;0;0;0;0 -5136;diplôme;positive;1;0;0;0;0;0 -5137;directeur;positive;0;0;0;0;0;0 -5138;direction;positive;0;0;0;0;0;0 -5139;directeur|directrice;positive;0;0;0;0;0;0 -5140;diriger;positive;0;0;0;0;0;0 -5141;dirigeable;positive;0;0;0;0;0;0 -5142;dirofilariose;negative;0;0;0;0;0;1 -5143;disc jockey;positive;0;0;0;0;0;0 -5144;discernable;positive;0;0;0;0;0;0 -5145;discernement;positive;0;0;0;0;0;0 -5146;discerner;positive;0;0;0;0;0;0 -5147;disciple;positive;0;0;0;0;0;0 -5148;disciplinaire;negative;0;1;1;0;0;0 -5149;discipline;negative;0;1;0;0;0;0 -5150;discontinu;negative;0;0;0;0;0;0 -5151;discontinuité;negative;0;1;1;0;0;1 -5152;discorder;negative;0;1;1;0;0;0 -5153;discordant;negative;0;1;1;0;0;0 -5154;discorde;negative;0;0;0;1;0;1 -5155;discourir;positive;0;0;0;0;0;0 -5156;discours;positive;0;0;0;0;0;0 -5157;discrédit;negative;0;0;1;0;0;1 -5158;discréditer;negative;0;0;0;1;0;1 -5159;discrétion;positive;0;0;0;0;1;0 -5160;discrétionnaire;negative;0;0;0;0;0;0 -5161;discrimination;negative;0;1;1;1;0;1 -5162;discriminatoire;negative;0;0;1;1;0;1 -5163;discriminer;negative;0;0;1;1;0;1 -5164;disculper;positive;0;0;0;0;0;0 -5165;discussion;positive;0;0;0;0;0;0 -5166;discutable;negative;0;1;0;1;0;1 -5167;discuter;positive;0;0;0;0;0;0 -5168;disgrâce;negative;0;1;1;1;0;1 -5169;disgracier;negative;0;1;1;1;0;1 -5170;disjoindre;negative;0;0;0;0;0;0 -5171;disjonctif;negative;0;0;0;0;1;0 -5172;dislocation;negative;0;1;0;0;1;0 -5173;disloquer;negative;0;1;1;1;0;1 -5174;disparaître;negative;0;1;0;0;0;0 -5175;disparate;negative;0;0;0;0;0;0 -5176;disparité;negative;0;0;1;1;0;1 -5177;disparition;negative;0;1;0;0;0;0 -5178;dispense;positive;0;0;0;0;0;0 -5179;dispenser;positive;0;0;0;0;0;0 -5180;disperser;positive;0;0;0;0;0;0 -5181;disponible;positive;1;0;0;0;0;0 -5182;disposer;positive;0;0;0;0;0;0 -5183;dispositif;positive;0;0;0;0;0;0 -5184;disposition;positive;0;0;0;0;0;0 -5185;disqualification;negative;0;0;1;0;0;0 -5186;disqualifier;negative;0;0;1;1;0;1 -5187;disque;positive;0;0;0;0;0;0 -5188;disquette;positive;0;0;0;0;0;0 -5189;dissection;negative;0;0;0;0;0;1 -5190;dissemblable;negative;0;0;0;0;0;0 -5191;dissémination;positive;0;0;0;0;0;0 -5192;disséminer;positive;0;0;0;0;0;0 -5193;dissension;negative;0;0;0;1;0;0 -5194;disséquer;negative;0;0;0;0;0;1 -5195;dissertation;positive;0;0;0;0;0;0 -5196;dissimulation;negative;0;1;1;1;0;0 -5197;dissiper;negative;0;0;0;0;0;0 -5198;dissipéees;negative;0;0;0;0;0;0 -5199;dissociation;negative;0;0;0;0;0;0 -5200;dissolution;negative;0;1;1;1;1;0 -5201;dissolvant;positive;0;0;0;0;0;0 -5202;dissonance;negative;0;0;0;1;0;0 -5203;dissoner;negative;0;1;0;1;0;0 -5204;dissoudre;negative;0;0;0;0;0;0 -5205;dissuader;negative;0;1;1;0;0;0 -5206;distal;positive;0;0;0;0;0;0 -5207;distance;negative;0;0;0;0;0;0 -5208;distanlointains;negative;0;0;1;0;0;0 -5209;distant;negative;0;1;1;0;0;0 -5210;distantsdistante;negative;0;0;1;0;0;0 -5211;distillat;positive;0;0;0;0;0;0 -5212;distillation;positive;0;0;0;0;0;0 -5213;distiller;positive;0;0;0;0;0;0 -5214;distinct;positive;0;0;0;0;0;0 -5215;distorsion;negative;0;0;0;0;0;0 -5216;distraire;negative;0;0;0;0;0;0 -5217;distribution;positive;0;0;0;0;0;0 -5218;district;positive;0;0;0;0;0;0 -5219;diurne;positive;0;0;0;0;0;0 -5220;divan;positive;0;0;1;0;0;0 -5221;divergence;negative;0;0;0;0;0;0 -5222;divergent;negative;0;0;0;1;1;0 -5223;diverger;negative;0;0;0;0;0;0 -5224;divers;positive;0;0;0;0;0;0 -5225;diversifier;positive;0;0;0;0;0;0 -5226;diversion;positive;0;0;0;0;1;0 -5227;diversité;positive;0;0;0;0;0;0 -5228;divertissant;positive;1;0;0;0;0;0 -5229;divertissement;positive;0;0;0;0;1;0 -5230;dividende;positive;0;0;0;0;0;0 -5231;divination;positive;0;0;0;0;0;0 -5232;divinité;positive;0;1;0;0;0;0 -5233;diviser;negative;0;0;0;0;0;0 -5234;diviser en zone;positive;0;0;0;0;0;0 -5235;diviseur;negative;0;0;0;0;0;0 -5236;divisible;negative;0;0;0;0;0;0 -5237;division;negative;0;0;1;1;0;0 -5238;divulguer;positive;0;0;0;0;0;0 -5239;dix;positive;0;0;0;0;0;0 -5240;dixième;positive;0;0;0;0;0;0 -5241;dlibérée;positive;0;0;0;0;0;0 -5242;docile;positive;0;0;1;0;0;0 -5243;docilement;positive;0;0;0;0;0;0 -5244;dock;positive;0;0;0;0;0;0 -5245;docteur;positive;0;0;0;0;0;0 -5246;doctrinal;negative;0;1;0;0;0;0 -5247;doctrine;positive;0;0;0;0;0;0 -5248;document;positive;0;0;0;0;0;0 -5249;documentaire;positive;0;0;0;0;0;0 -5250;documentaliste;positive;0;0;0;0;0;0 -5251;documenter;positive;0;0;0;0;0;0 -5252;dodu;negative;0;0;0;0;0;1 -5253;dogmatique;negative;0;0;0;0;0;0 -5254;dogme;positive;0;0;0;0;0;0 -5255;doigt;positive;0;0;0;0;0;0 -5256;doigt de pied;negative;0;0;0;0;0;1 -5257;doigter;positive;0;0;0;0;0;0 -5258;doléance;negative;0;0;1;1;0;1 -5259;dollar;positive;0;0;0;0;0;0 -5260;domaine;positive;0;0;0;0;0;0 -5261;dôme;positive;0;0;0;0;0;0 -5262;domestication;positive;0;0;0;0;0;0 -5263;domestiquer;positive;0;0;0;0;0;0 -5264;domicile;positive;0;0;0;0;0;0 -5265;domicilier;positive;0;0;0;0;0;0 -5266;dominance;negative;0;1;0;0;0;0 -5267;dominer;negative;0;1;0;1;0;0 -5268;dominant;negative;0;1;0;0;0;0 -5269;dominante;negative;0;1;0;0;0;0 -5270;domination;negative;0;1;1;1;0;0 -5271;dominion;negative;0;1;0;0;0;0 -5272;domino;negative;0;1;0;0;0;0 -5273;dommage;negative;0;1;1;1;0;1 -5274;dommage et intérêt;negative;0;0;1;0;0;0 -5275;domptage;positive;0;0;0;0;0;0 -5276;dompter;positive;0;0;0;0;0;0 -5277;don;positive;0;0;0;0;1;0 -5278;don du ciel;positive;0;0;0;0;1;0 -5279;donation;positive;1;0;0;0;0;0 -5280;donjon;negative;0;1;1;0;0;0 -5281;donner;positive;0;0;0;0;0;0 -5282;donnée;positive;0;0;0;0;0;0 -5283;donner qch à qqn;positive;0;0;0;0;0;0 -5284;donner du coup de bec;negative;0;0;0;1;0;0 -5285;donner du coup de canne à;negative;0;1;0;1;0;0 -5286;donner du cour|cours particulier;positive;0;0;0;0;0;0 -5287;donner naissance à;positive;0;0;0;0;0;0 -5288;donner suite;positive;0;0;0;0;0;0 -5289;donner un coup de coude;negative;0;0;0;1;0;0 -5290;donner un coup de couteau à;negative;0;1;1;1;1;0 -5291;donner un coup de pied;negative;0;0;0;1;0;0 -5292;donner un coup de pied dans;positive;0;0;0;0;0;0 -5293;donner un coup de poing;negative;0;1;1;1;1;0 -5294;donner un coup de tête;negative;0;1;0;1;1;0 -5295;donner un petit coup de coude;positive;0;0;0;0;0;0 -5296;donner un pourboire à;positive;0;0;0;0;0;0 -5297;donner un fessée à;negative;0;1;1;1;0;0 -5298;dont on se souvenir;positive;0;0;0;0;0;0 -5299;dorer;positive;0;0;0;0;0;0 -5300;dorénavant;positive;0;0;0;0;0;0 -5301;dorloter;positive;1;0;0;0;0;0 -5302;dormeur;positive;0;0;0;0;0;0 -5303;dormir;positive;0;0;0;0;0;0 -5304;dorsal;positive;0;0;0;0;0;0 -5305;dortoir;positive;0;0;0;0;0;0 -5306;dorure;positive;0;0;0;0;0;0 -5307;dos;positive;0;0;0;0;0;0 -5308;dos nu;negative;0;1;1;1;0;0 -5309;dose;positive;0;0;0;0;0;0 -5310;doser;positive;0;0;0;0;0;0 -5311;dossier;positive;0;0;0;0;0;0 -5312;dossier médical;positive;0;0;0;0;0;0 -5313;dot;positive;0;0;0;0;0;0 -5314;dotation;positive;0;0;0;0;0;0 -5315;doter;positive;1;0;0;0;0;0 -5316;doubler;positive;0;0;0;0;0;0 -5317;doublement;negative;0;0;1;0;0;0 -5318;double;positive;0;0;0;0;0;0 -5319;doublure;positive;0;0;0;0;0;0 -5320;doucement;positive;1;0;0;0;0;0 -5321;douceur;positive;1;0;0;0;0;0 -5322;douche;positive;0;0;0;0;0;0 -5323;douillet;positive;1;0;0;0;0;0 -5324;douleur vif;negative;0;1;1;0;1;0 -5325;douleur;negative;0;0;1;0;0;0 -5326;douloureusement;negative;0;0;1;0;0;0 -5327;douter;negative;0;1;0;0;0;0 -5328;doute;negative;0;1;1;0;0;0 -5329;douteux;negative;0;1;0;0;0;1 -5330;douve;negative;0;1;1;0;0;0 -5331;douzaine;positive;0;0;0;0;0;0 -5332;douze;positive;0;0;0;0;0;0 -5333;douzième;positive;0;0;0;0;0;0 -5334;dragon;negative;0;1;0;1;0;0 -5335;drague;negative;0;0;0;0;0;0 -5336;draguer;negative;0;0;0;0;0;0 -5337;drainage;negative;0;0;0;0;0;1 -5338;drainer;negative;0;0;0;0;0;0 -5339;dramatique;negative;0;1;1;0;1;0 -5340;dramaturge;positive;0;0;0;0;0;0 -5341;drame;negative;0;1;1;0;1;0 -5342;drap;positive;0;0;0;0;0;0 -5343;drapeau;positive;0;0;0;0;0;0 -5344;draper;positive;0;0;0;0;0;0 -5345;draperie;positive;0;0;0;0;0;0 -5346;drastique;negative;0;0;1;0;0;0 -5347;dresser;positive;0;0;0;0;0;0 -5348;dresser le bilan;positive;0;0;0;0;0;0 -5349;dresseur de cheval;positive;0;0;0;0;0;0 -5350;drogue;negative;0;0;1;0;0;1 -5351;droguer;negative;0;0;1;0;0;1 -5352;droit;positive;0;0;0;0;0;0 -5353;droit d auteur;positive;0;0;0;0;0;0 -5354;droit de naissance;positive;0;0;0;0;0;0 -5355;droit de visite;positive;0;0;0;0;0;0 -5356;droit|droite;positive;0;0;0;0;0;0 -5357;drôle;positive;1;0;0;0;0;0 -5358;drugstore;positive;0;0;0;0;0;0 -5359;druide;positive;0;0;0;0;0;0 -5360;du coin;positive;0;0;0;0;0;0 -5361;du congrès;positive;0;0;0;0;0;0 -5362;du gâteau;positive;1;0;0;0;0;0 -5363;du haut;positive;0;0;0;0;0;0 -5364;du moi|mois dernier;positive;0;0;0;0;0;0 -5365;du second degré;positive;0;0;0;0;0;0 -5366;dualisme;positive;0;0;0;0;0;0 -5367;dualité;positive;0;0;0;0;0;0 -5368;duaux;positive;0;0;0;0;0;0 -5369;dubotatives;negative;0;1;0;0;0;0 -5370;duc;positive;0;0;0;0;0;0 -5371;ductile;positive;0;0;0;0;0;0 -5372;dûe;negative;0;0;0;0;0;0 -5373;duel;negative;0;1;0;1;0;0 -5374;dûes;negative;0;0;0;0;0;0 -5375;dune;positive;0;0;0;0;0;0 -5376;duo;positive;1;0;0;0;0;0 -5377;duper;negative;0;1;1;0;0;1 -5378;dupe;negative;0;0;0;1;0;0 -5379;duplex;positive;0;0;0;0;0;0 -5380;duplicité;negative;0;0;0;1;0;0 -5381;dupliquer;positive;0;0;0;0;0;0 -5382;dur;negative;0;1;1;1;0;1 -5383;dur travail;negative;0;0;1;0;0;0 -5384;durabilité;positive;0;0;0;0;0;0 -5385;durable;positive;0;0;0;0;0;0 -5386;durcir;negative;0;1;0;1;0;1 -5387;durcissement;negative;0;0;1;1;0;0 -5388;dureté;negative;0;1;1;1;0;0 -5389;dûs;negative;0;0;0;0;0;0 -5390;duvet;positive;0;0;0;0;0;0 -5391;dynamique;positive;0;0;0;0;1;0 -5392;dynamite;negative;0;1;0;0;1;0 -5393;dynastie;positive;0;0;0;0;0;0 -5394;dysenterie;negative;0;1;1;0;0;1 -5395;dyspepsie;negative;0;0;0;0;0;1 -5396;eau;positive;0;0;0;0;0;0 -5397;eau de javel;negative;0;0;1;0;0;1 -5398;eau de mer;negative;0;0;0;0;0;1 -5399;eau fort;positive;0;0;0;0;0;0 -5400;eau usé;negative;0;0;0;0;0;1 -5401;ébat amoureux;positive;0;0;0;0;0;0 -5402;ébauche;positive;0;0;0;0;0;0 -5403;ébène;positive;0;0;0;0;0;0 -5404;éblouir;negative;0;1;0;1;0;0 -5405;éblouissant;negative;0;0;0;1;0;0 -5406;éblouissement;negative;0;1;0;1;0;0 -5407;ébranlage;negative;0;1;0;1;0;0 -5408;écaillage;negative;0;0;0;0;0;1 -5409;écaille;positive;0;0;0;0;0;0 -5410;écailleux;negative;0;0;0;0;0;1 -5411;écarlate;negative;0;1;0;1;1;0 -5412;écart;negative;0;1;1;0;1;0 -5413;écart de conduite;negative;0;1;0;0;0;0 -5414;écarteler;negative;0;1;1;0;0;1 -5415;écarter;negative;0;1;1;1;0;1 -5416;ecchymose;negative;0;1;1;0;0;0 -5417;ecclésiastique;positive;0;0;0;0;0;0 -5418;échafaud;negative;0;1;0;0;0;0 -5419;échafaudage;negative;0;1;0;0;0;0 -5420;échaffauder;positive;0;0;0;0;0;0 -5421;échalier;positive;0;0;0;0;0;0 -5422;échange;positive;0;0;0;0;0;0 -5423;échanger;positive;0;0;0;0;0;0 -5424;échantillon;positive;0;0;0;0;0;0 -5425;échapper;negative;0;1;0;1;0;0 -5426;échapper à;negative;0;1;0;0;0;0 -5427;écharde;negative;0;1;1;0;1;0 -5428;échasse;negative;0;1;0;0;0;0 -5429;échauffourée;negative;0;0;0;1;0;0 -5430;échéance;negative;0;1;0;0;0;1 -5431;échec|échecs;positive;0;0;0;0;0;0 -5432;échelle;positive;0;0;0;0;0;0 -5433;échelon;positive;0;0;0;0;0;0 -5434;écheveau;positive;0;0;0;0;0;0 -5435;échine;negative;0;0;0;0;0;0 -5436;echo;positive;0;0;0;0;0;0 -5437;écho;positive;0;0;0;0;0;0 -5438;échographie;positive;0;0;0;0;0;0 -5439;échouer;negative;0;1;1;0;0;0 -5440;éclabousser;negative;0;0;0;0;1;0 -5441;éclaboussure;negative;0;0;0;0;1;0 -5442;éclairage;positive;0;0;0;0;1;0 -5443;eclaircir;positive;1;0;0;0;0;0 -5444;éclaircir;positive;1;0;0;0;0;0 -5445;éclaircissement;positive;0;0;0;0;0;0 -5446;éclairer;positive;0;0;0;0;1;0 -5447;éclater;negative;0;1;0;0;1;0 -5448;éclectique;positive;0;0;0;0;0;0 -5449;eclipse;negative;0;1;0;0;0;0 -5450;éclipse;negative;0;1;0;0;0;0 -5451;éclipser;negative;0;1;1;0;0;0 -5452;écliptique;negative;0;1;0;0;0;0 -5453;éclisse;positive;0;0;0;0;0;0 -5454;éclisser;positive;0;0;0;0;0;0 -5455;écloper;negative;0;0;1;0;0;0 -5456;éclore;positive;0;0;0;0;0;0 -5457;écluse;positive;0;0;0;0;0;0 -5458;éc?urer;negative;0;1;1;1;0;1 -5459;éc?urant;negative;0;1;1;1;0;1 -5460;éc?urement;negative;0;1;1;1;0;1 -5461;école;positive;0;0;0;0;0;0 -5462;écolier;positive;0;0;0;0;0;0 -5463;écologique;positive;0;0;0;0;0;0 -5464;éconduire;negative;0;0;1;0;0;0 -5465;economie;positive;0;0;0;0;0;0 -5466;économie;positive;0;0;0;0;0;1 -5467;économique;positive;1;0;0;0;0;0 -5468;écorce;negative;0;1;0;1;0;1 -5469;écossais;positive;0;0;0;0;0;0 -5470;écouler;positive;0;0;0;0;0;0 -5471;écoulement de sang;negative;0;1;1;0;0;1 -5472;écourter;negative;0;1;0;1;1;0 -5473;écoute clandestin;negative;0;1;0;0;0;0 -5474;écouteur;positive;0;0;0;0;0;0 -5475;écouvillon;negative;0;0;0;0;0;1 -5476;écran;positive;0;0;0;0;0;0 -5477;écrasant;negative;0;1;1;1;0;1 -5478;écrémer;negative;0;0;0;0;0;0 -5479;écrevisse;negative;0;0;0;0;0;0 -5480;écrire;positive;0;0;0;0;0;0 -5481;écriture;positive;0;0;0;0;0;0 -5482;écriture saint;positive;0;0;0;0;0;0 -5483;écrivain;positive;0;0;0;0;0;0 -5484;écrivant;positive;0;0;0;0;0;0 -5485;écumer;negative;0;0;0;0;0;1 -5486;écumeux;negative;0;0;0;0;0;1 -5487;écureuil;positive;0;0;0;0;0;0 -5488;écurie;positive;0;0;0;0;0;0 -5489;édenter;negative;0;0;1;0;0;1 -5490;édification;positive;0;0;0;0;0;0 -5491;édifier;positive;0;0;0;0;0;0 -5492;édit;negative;0;1;0;0;0;0 -5493;éditer;positive;0;0;0;0;0;0 -5494;editeur;positive;0;0;0;0;0;0 -5495;edition;positive;0;0;0;0;0;0 -5496;édition;positive;0;0;0;0;0;0 -5497;editorial;positive;0;0;0;0;0;0 -5498;éditorial;positive;0;0;0;0;0;0 -5499;édredon;positive;1;0;0;0;0;0 -5500;éducatif;positive;0;0;0;0;0;0 -5501;éducation;positive;0;0;0;0;0;0 -5502;édulcorant;positive;0;0;0;0;0;0 -5503;éduquer;positive;0;0;0;0;0;0 -5504;eétouffants;negative;0;1;1;0;0;1 -5505;effaçage;negative;0;0;1;0;0;0 -5506;effacer;negative;0;1;1;1;0;0 -5507;effacement;negative;0;1;1;0;0;0 -5508;effarer;negative;0;1;0;0;1;1 -5509;effectuer;positive;0;0;0;0;0;0 -5510;effeminé;negative;0;0;0;0;0;0 -5511;efféminer;negative;0;0;0;0;0;0 -5512;effet;positive;0;0;0;0;0;0 -5513;effet personnel;positive;0;0;0;0;0;0 -5514;efficace;positive;0;0;0;0;0;0 -5515;efficacement;positive;0;0;0;0;0;0 -5516;efficacité;positive;0;0;0;0;0;0 -5517;effigie;positive;0;0;0;1;0;0 -5518;effilage;positive;0;0;0;0;0;0 -5519;effiler;positive;0;0;0;0;0;0 -5520;effilocher;negative;0;0;1;0;0;1 -5521;effondrement;negative;0;1;1;0;1;1 -5522;effort;positive;0;0;0;0;0;0 -5523;effrayant;negative;0;1;1;1;1;0 -5524;effroi;negative;0;1;0;0;1;0 -5525;effronté;negative;0;0;0;1;0;1 -5526;effronterie;positive;0;0;0;0;0;0 -5527;effusion;negative;0;0;0;0;0;0 -5528;égal;positive;0;0;0;0;0;0 -5529;également;positive;0;0;0;0;0;0 -5530;égalisation;positive;0;0;0;0;0;0 -5531;égaliser;positive;0;0;0;0;0;0 -5532;égalité;positive;0;0;0;0;0;0 -5533;égard;positive;0;0;0;0;0;0 -5534;égérie;positive;0;0;0;0;0;0 -5535;égide;positive;0;0;0;0;0;0 -5536;église;positive;0;0;0;0;0;0 -5537;ego;negative;0;0;0;0;0;0 -5538;égocentrique;negative;0;0;0;1;0;1 -5539;égoïsme;negative;0;0;0;1;0;1 -5540;égoïste;negative;0;0;0;1;0;1 -5541;égout;negative;0;0;0;0;0;1 -5542;égouttement;negative;0;0;0;0;0;0 -5543;égratigner;negative;0;1;1;0;0;0 -5544;égratignure;negative;0;1;1;1;1;0 -5545;éhonté;negative;0;0;0;1;0;1 -5546;éjaculation;positive;0;0;0;0;1;0 -5547;éjaculer;positive;1;0;0;0;0;0 -5548;éjecter;negative;0;1;1;1;0;0 -5549;éjection;negative;0;1;1;1;1;0 -5550;élaboration;positive;0;0;0;0;0;0 -5551;élaborer;positive;0;0;0;0;0;0 -5552;élaguer;negative;0;0;0;0;0;0 -5553;élargir;positive;0;0;0;0;0;0 -5554;élargissement;negative;0;0;0;0;0;0 -5555;élasticité;positive;0;0;0;0;0;0 -5556;élastique;positive;0;0;0;0;0;0 -5557;élection;positive;0;0;0;0;0;0 -5558;élection primaire;positive;0;0;0;0;0;0 -5559;électorat;positive;0;0;0;0;0;0 -5560;électricité;positive;0;0;0;0;0;0 -5561;électrique;positive;0;0;0;0;1;0 -5562;élégance;positive;0;0;0;0;0;0 -5563;élégant;positive;0;0;0;0;0;1 -5564;élément;positive;0;0;0;0;0;0 -5565;élément vital;positive;0;0;0;0;0;0 -5566;élevage;positive;0;0;0;0;0;0 -5567;élévation;positive;0;1;0;0;0;0 -5568;élève;positive;0;0;0;0;0;0 -5569;élever;positive;0;0;0;0;0;0 -5570;élève de terminal;positive;0;0;0;0;0;0 -5571;élève officier;positive;0;0;0;0;0;0 -5572;eleveur;positive;0;0;0;0;0;0 -5573;elfe;positive;0;1;0;1;0;1 -5574;éligible;positive;0;0;0;0;0;0 -5575;élimination;negative;0;1;1;1;0;1 -5576;éliminer;negative;0;1;0;1;1;0 -5577;élingue;negative;0;1;0;1;0;0 -5578;élinguer;negative;0;1;0;1;0;0 -5579;élire;positive;0;0;0;0;0;0 -5580;ellipse;positive;0;0;0;0;0;0 -5581;ellipsoïdal;positive;0;0;0;0;0;0 -5582;ellipsoïde;positive;0;0;0;0;0;0 -5583;elliptique;positive;0;0;0;0;0;0 -5584;éloge;positive;0;0;0;0;0;0 -5585;éloge funèbre;negative;0;0;1;0;0;0 -5586;éloigner;negative;0;0;1;0;0;0 -5587;éloignement;negative;0;0;1;0;0;0 -5588;éloquence;positive;0;0;0;0;0;0 -5589;éloquent;positive;0;0;0;0;0;0 -5590;élucidation;positive;0;0;0;0;0;0 -5591;élucider;positive;0;0;0;0;0;0 -5592;éluder;negative;0;1;0;0;0;1 -5593;émacier;negative;0;1;1;0;0;1 -5594;émail;positive;0;0;0;0;0;0 -5595;émancipation;positive;1;0;0;0;0;0 -5596;émaner;positive;0;0;0;0;0;0 -5597;emballage;positive;0;0;0;0;0;0 -5598;emballer;positive;0;0;0;0;0;0 -5599;embarassante;negative;0;1;0;0;0;0 -5600;embarassantes;negative;0;1;0;0;0;0 -5601;embarassants;negative;0;1;0;0;0;0 -5602;embarcadère;positive;0;0;0;0;0;0 -5603;embarcation;positive;0;0;0;0;0;0 -5604;embarder;negative;0;1;0;0;1;0 -5605;embargo;negative;0;0;0;1;0;0 -5606;embarquement;positive;0;0;0;0;0;0 -5607;embarquer;positive;0;0;0;0;0;0 -5608;embarquer de force;negative;0;1;0;1;0;1 -5609;embarras;negative;0;1;1;0;1;1 -5610;embaucher;positive;0;0;0;0;0;0 -5611;embellir;positive;1;0;0;0;0;0 -5612;embellissement;positive;0;0;0;0;0;0 -5613;embêter;negative;0;0;1;1;0;0 -5614;embêtement;negative;0;1;1;1;0;0 -5615;emblématique;positive;0;0;0;0;0;0 -5616;emblème;positive;0;0;0;0;0;0 -5617;embolie;negative;0;1;1;0;0;0 -5618;embouchure;positive;0;0;0;0;0;0 -5619;embout;positive;0;0;0;0;0;0 -5620;embraser;negative;0;1;0;1;1;0 -5621;embrasement;negative;0;1;0;1;0;0 -5622;embrasser;positive;0;0;0;0;1;0 -5623;embrayage;positive;0;0;0;0;0;0 -5624;embrocher;negative;0;1;0;0;0;0 -5625;embrouiller;negative;0;0;0;0;0;0 -5626;embryon;positive;0;0;0;0;0;0 -5627;embuer;negative;0;1;1;0;0;0 -5628;embuscade;negative;0;1;0;1;1;0 -5629;émécher;negative;0;0;0;0;0;1 -5630;emeraude;positive;0;0;0;0;0;0 -5631;émeraude;positive;0;0;0;0;0;0 -5632;émergence;positive;0;0;0;0;0;0 -5633;émerger;positive;0;0;0;0;1;0 -5634;émérite;positive;0;0;0;0;0;0 -5635;émettre;positive;0;0;0;0;0;0 -5636;émeute;negative;0;1;0;1;0;0 -5637;émigration;negative;0;0;0;0;0;0 -5638;émigrer;negative;0;0;0;0;0;0 -5639;émincer;negative;0;1;0;0;0;0 -5640;éminemment;positive;0;0;0;0;0;0 -5641;eminence;positive;0;0;0;0;0;0 -5642;éminence;positive;0;0;0;0;0;0 -5643;emir;positive;0;0;0;0;0;0 -5644;émir;positive;0;0;0;0;0;0 -5645;émissaire;positive;0;0;0;0;0;0 -5646;emmêler;negative;0;1;0;1;0;0 -5647;émotionnel;positive;0;0;0;0;0;0 -5648;émousser;negative;0;1;0;1;0;0 -5649;empaqueter;positive;0;0;0;0;0;0 -5650;empaqueteur;positive;0;0;0;0;0;0 -5651;empathie;positive;0;0;0;0;0;0 -5652;empattement;positive;0;0;0;0;0;0 -5653;empêcher;negative;0;1;0;0;0;0 -5654;empereur;positive;0;0;0;0;0;0 -5655;empester;negative;0;0;0;0;0;1 -5656;empêtrer;negative;0;1;1;1;0;1 -5657;empétrés;negative;0;1;1;1;0;1 -5658;emphase;positive;0;0;0;0;0;0 -5659;emphatique;positive;0;0;0;0;0;0 -5660;empiétement;negative;0;1;1;1;0;0 -5661;empiètement;negative;0;1;1;1;0;0 -5662;empiéter;negative;0;1;1;1;0;0 -5663;empiler;negative;0;0;0;0;0;0 -5664;empire;positive;0;0;0;0;0;0 -5665;empirique;positive;0;0;0;0;0;0 -5666;empirisme;positive;0;0;0;0;0;0 -5667;emplacement;positive;0;0;0;0;0;0 -5668;emploi;positive;0;0;0;0;0;0 -5669;employer abusivement;negative;0;1;1;1;0;0 -5670;employeur;positive;0;0;0;0;0;0 -5671;empocher;positive;0;0;0;0;0;0 -5672;empoigner;negative;0;1;0;1;0;0 -5673;empreinte;positive;0;0;0;0;0;0 -5674;empreindre de pas;positive;0;0;0;0;0;0 -5675;empressement;positive;0;0;0;0;0;0 -5676;emprisonner;negative;0;1;1;1;0;1 -5677;emprisonnement;negative;0;1;1;1;0;1 -5678;emprunt;positive;0;0;0;0;0;0 -5679;emprunter;positive;0;0;0;0;0;0 -5680;émouvoir;positive;0;0;1;0;0;0 -5681;émuler;negative;0;0;0;0;0;0 -5682;émulsion;positive;0;0;0;0;0;0 -5683;en général;positive;0;0;0;0;0;0 -5684;en abondance;positive;1;0;0;0;0;0 -5685;en activité;positive;0;0;0;0;0;0 -5686;en agate;positive;0;0;0;0;0;0 -5687;en apesanteur;positive;0;0;0;0;0;0 -5688;en argent;positive;0;0;0;0;0;0 -5689;en arriérer;negative;0;1;0;0;0;1 -5690;en attente;negative;0;0;0;0;0;0 -5691;en avance;positive;0;0;0;0;0;0 -5692;en aveugle;negative;0;1;1;0;0;0 -5693;en baisse;negative;0;1;1;1;0;0 -5694;en bois;positive;0;0;0;0;0;0 -5695;en bon santé;positive;1;0;0;0;0;0 -5696;en caoutchouc;negative;0;0;0;0;0;0 -5697;en ce qui concerner;positive;0;0;0;0;0;0 -5698;en cela;positive;0;0;0;0;0;0 -5699;en chef;positive;0;0;0;0;0;0 -5700;en colère;negative;0;0;0;1;0;1 -5701;en colimaçon;positive;0;0;0;0;0;0 -5702;en colonne;positive;0;0;0;0;0;0 -5703;en continu;positive;0;0;0;0;0;0 -5704;en corrélation;positive;0;0;0;0;0;0 -5705;en couper;positive;0;0;0;0;0;0 -5706;en cour|cours;positive;0;0;0;0;0;0 -5707;en déclin;negative;0;0;1;0;0;0 -5708;en dent de scie;negative;0;1;1;1;0;0 -5709;en désaccord;negative;0;0;1;1;0;0 -5710;en descente;negative;0;1;0;0;0;0 -5711;en désordre;negative;0;1;1;1;0;1 -5712;en dessous;negative;0;0;0;0;0;0 -5713;en deuil;negative;0;0;1;0;0;0 -5714;en développement;positive;0;0;0;0;0;0 -5715;en douceur;positive;1;0;0;0;0;0 -5716;en épi;negative;0;1;0;0;0;0 -5717;en étain;positive;0;0;0;0;0;0 -5718;en évidence;positive;0;0;0;0;0;0 -5719;en éviter;negative;0;1;0;0;0;1 -5720;en fac similé;negative;0;0;0;0;0;0 -5721;en faillite;negative;0;1;1;0;0;0 -5722;en faire autant;positive;0;0;0;0;0;0 -5723;en feu;negative;0;1;0;1;0;0 -5724;en filigrane;positive;0;0;0;0;0;0 -5725;en fleur;positive;0;0;0;0;0;0 -5726;en former de cône;positive;0;0;0;0;0;0 -5727;en former de croître;positive;0;0;0;0;0;0 -5728;en fuite;negative;0;1;0;0;0;0 -5729;en furie;negative;0;1;0;1;0;1 -5730;en fusion;negative;0;1;0;0;0;0 -5731;en granite;positive;0;0;0;0;0;0 -5732;en haillon;negative;0;0;1;0;0;0 -5733;en hausse;positive;1;0;0;0;0;0 -5734;en haut;positive;0;0;0;0;0;0 -5735;en image;positive;0;0;0;0;0;0 -5736;en instance;positive;0;0;0;0;0;0 -5737;en jachère;negative;0;0;1;0;0;0 -5738;en lacet;negative;0;0;0;0;0;0 -5739;en laine;positive;0;0;0;0;0;0 -5740;en lambeau;negative;0;0;1;0;0;0 -5741;en larme;negative;0;1;1;0;0;1 -5742;en loque;negative;0;0;1;0;0;0 -5743;en marbre;positive;0;0;0;0;0;0 -5744;en mauvais santé;negative;0;1;1;0;0;1 -5745;en montée;positive;0;1;0;0;0;0 -5746;en morceau;negative;0;0;1;0;0;0 -5747;en mouvement;positive;0;0;1;0;0;0 -5748;en nickel;positive;0;0;0;0;0;0 -5749;en option;positive;0;0;0;0;0;0 -5750;en orbite;positive;0;0;0;0;0;0 -5751;en partie;negative;0;0;0;0;0;0 -5752;en peluche;positive;0;0;0;0;0;0 -5753;en pente;negative;0;1;0;0;0;0 -5754;en plein air;positive;0;0;0;0;0;0 -5755;en plein essor;positive;0;0;0;0;1;0 -5756;en plein forme;positive;1;0;0;0;0;0 -5757;en pleur|pleurs;negative;0;1;1;0;0;1 -5758;en plume;positive;0;0;0;0;0;0 -5759;en plus;positive;0;0;0;0;0;0 -5760;en poudre;negative;0;0;0;0;0;0 -5761;en privé;positive;0;0;0;0;0;0 -5762;en rafale;negative;0;1;0;0;1;0 -5763;en relief;positive;0;0;0;0;0;0 -5764;en retard;negative;0;1;1;1;1;0 -5765;en rotin;positive;0;0;0;0;0;0 -5766;en ruine;negative;0;1;1;1;0;1 -5767;en ruiner s;negative;0;0;1;0;0;1 -5768;en saillie;negative;0;1;0;0;1;0 -5769;en sang;negative;0;1;1;1;0;1 -5770;en satin;positive;0;0;0;0;0;0 -5771;en se battre;negative;0;0;0;1;0;0 -5772;en secret;negative;0;1;0;0;0;0 -5773;en série;positive;0;0;0;0;0;0 -5774;en silence;negative;0;0;0;0;0;0 -5775;en solitaire;negative;0;0;1;0;0;0 -5776;en sommeil;positive;0;0;0;0;0;0 -5777;en streaming;negative;0;0;0;0;0;0 -5778;en supposer que;negative;0;1;0;0;0;0 -5779;en surplus;negative;0;0;0;0;0;0 -5780;en suspens;positive;0;1;0;0;1;0 -5781;en synergie;positive;0;0;0;0;0;0 -5782;en terre;positive;0;0;0;0;0;0 -5783;en touffe;negative;0;0;0;0;0;1 -5784;en tout;positive;0;0;0;0;0;0 -5785;en train de mourir;negative;0;1;1;1;0;1 -5786;en très fort hausse;negative;0;1;0;0;1;0 -5787;en tripler;positive;0;0;0;0;0;0 -5788;en trop;negative;0;0;0;0;0;0 -5789;en vain;negative;0;0;1;0;0;1 -5790;en velours côtelé;positive;0;0;0;0;0;0 -5791;en vérité;positive;0;0;0;0;0;0 -5792;en vie;positive;0;0;0;0;0;0 -5793;en vigueur;positive;0;0;0;0;0;0 -5794;en voie de développement;positive;0;0;0;0;0;0 -5795;en voie de disparition;negative;0;1;1;0;0;0 -5796;en vouloir à qqn;negative;0;0;0;1;0;0 -5797;en vrac;negative;0;1;1;1;0;0 -5798;en vue;positive;0;0;0;0;0;0 -5799;en cas;positive;0;0;0;0;0;0 -5800;en tête;positive;0;0;0;0;0;0 -5801;encadrement;positive;0;0;0;0;0;0 -5802;encaisser;positive;0;1;0;1;0;0 -5803;encapuchonner;positive;0;1;0;0;0;0 -5804;enceinte;positive;0;0;0;0;0;0 -5805;encens;positive;0;0;0;1;0;0 -5806;encercler;negative;0;1;0;0;0;0 -5807;enchaîner;negative;0;1;1;0;0;0 -5808;enchainement;positive;0;0;0;0;0;0 -5809;enchaînement;positive;0;0;0;0;0;0 -5810;enchanter;positive;0;0;0;0;1;0 -5811;enchantement;positive;1;0;0;0;0;0 -5812;enchanteur;positive;0;0;0;0;0;0 -5813;enchérir;positive;0;0;0;0;0;0 -5814;enchérisseur;positive;0;0;0;0;0;0 -5815;enchevêtrement;negative;0;1;0;1;0;1 -5816;enchevêtrer;negative;0;1;0;1;0;0 -5817;enclave;negative;0;1;1;0;0;0 -5818;enclaver;negative;0;1;1;0;0;0 -5819;enclin;negative;0;1;1;0;0;0 -5820;enclos paroissial;negative;0;0;1;0;0;0 -5821;enclume;positive;0;0;0;0;0;0 -5822;encoche;positive;0;0;0;0;0;0 -5823;encoder;negative;0;1;0;0;0;0 -5824;encombrer;negative;0;0;1;0;0;1 -5825;encombrement;negative;0;0;0;1;0;0 -5826;encore exister;positive;1;0;0;0;0;0 -5827;encourager;positive;0;0;0;0;1;0 -5828;encourir;negative;0;1;1;0;0;0 -5829;encre;positive;0;0;0;0;0;0 -5830;encyclopédie;positive;0;0;0;0;0;0 -5831;endémique;negative;0;1;1;0;0;1 -5832;endetter;negative;0;1;1;0;0;0 -5833;endeuiller;negative;0;0;1;0;0;0 -5834;endiguement;negative;0;1;1;0;0;0 -5835;endocardite;negative;0;1;1;0;0;0 -5836;endoctrinement;negative;0;1;0;1;0;0 -5837;endolorir;negative;0;0;1;1;0;0 -5838;endommagement;negative;0;0;1;0;0;0 -5839;endommager;negative;0;1;1;1;0;1 -5840;endossement;positive;0;0;0;0;0;0 -5841;endroit;positive;0;0;0;0;0;0 -5842;enduire de jointement;negative;0;0;0;0;0;1 -5843;endurance;positive;0;0;0;0;0;0 -5844;endurcir;negative;0;1;0;1;0;1 -5845;énergie;positive;1;0;0;0;0;0 -5846;énergique;positive;1;0;0;0;0;0 -5847;enfance;positive;1;0;0;0;0;0 -5848;enfant;positive;1;0;0;0;0;0 -5849;enfant en bas âge;positive;0;1;0;0;1;0 -5850;enfant gâté;negative;0;0;0;1;0;1 -5851;enfantin;negative;0;0;0;0;0;1 -5852;enfer;negative;0;1;1;1;0;1 -5853;enfermer;negative;0;1;1;1;0;1 -5854;enfiler;negative;0;0;0;0;0;0 -5855;enfler;negative;0;1;0;0;0;1 -5856;enflure;negative;0;1;0;0;0;1 -5857;enfoncer;negative;0;1;0;1;1;0 -5858;enfouir;negative;0;1;1;0;0;0 -5859;enfourcher;positive;0;0;0;0;0;0 -5860;enfreindre;negative;0;0;0;0;0;0 -5861;enfuir;negative;0;1;0;0;0;0 -5862;enfumer;negative;0;1;1;0;0;1 -5863;engagement;positive;0;0;0;0;0;0 -5864;englober;positive;0;0;0;0;0;0 -5865;engloutir;negative;0;0;0;1;0;0 -5866;engouement;positive;0;0;0;0;0;0 -5867;engouement passager;negative;0;0;0;0;0;0 -5868;engourdir;negative;0;1;1;0;0;0 -5869;engourdissement;negative;0;1;1;0;0;0 -5870;engranger;positive;0;0;0;0;0;0 -5871;énigmatique;negative;0;1;0;0;0;0 -5872;enivrement;positive;0;0;0;0;1;0 -5873;enjamber;positive;0;0;0;0;0;0 -5874;enjeu;positive;0;0;0;0;0;0 -5875;enjoindre;negative;0;0;0;1;0;0 -5876;enjoué;positive;0;0;0;1;1;0 -5877;enjouement;positive;0;0;0;0;0;0 -5878;enlèvement;negative;0;1;1;0;1;0 -5879;enlumineur;positive;1;0;0;0;0;0 -5880;enneiger;positive;0;0;0;0;0;0 -5881;ennui;negative;0;0;1;1;0;0 -5882;ennuyer;negative;0;0;1;1;0;1 -5883;énoncer;positive;0;0;0;0;0;0 -5884;énonciation;positive;0;0;0;0;0;0 -5885;énormité;negative;0;0;0;1;0;1 -5886;enquête;positive;0;0;0;0;0;0 -5887;enquêter sur;positive;0;0;0;0;0;0 -5888;enquêteur;positive;0;0;0;0;0;0 -5889;enraciner;positive;0;0;0;0;0;0 -5890;enrager;negative;0;1;1;1;0;1 -5891;enregistrement;positive;0;0;0;0;0;0 -5892;enregistrer;positive;0;0;0;0;0;0 -5893;enregistreur;positive;0;0;0;0;0;0 -5894;enrichir;positive;1;0;0;0;0;0 -5895;enrobage;positive;0;0;0;0;0;0 -5896;enrobant;positive;0;0;0;0;0;0 -5897;enrober;positive;0;0;0;0;0;0 -5898;enrouer;negative;0;0;1;0;0;0 -5899;enrouler;positive;0;0;0;0;0;0 -5900;enroulement;negative;0;0;0;0;0;0 -5901;ensanglanter;negative;0;1;1;1;0;1 -5902;enseignant;positive;0;0;0;0;0;0 -5903;enseigne;positive;0;0;0;0;0;0 -5904;enseigner;positive;0;0;0;0;0;0 -5905;enseignement;positive;0;0;0;0;0;0 -5906;ensevelir;negative;0;1;1;0;0;0 -5907;ensoleiller;positive;0;0;0;0;1;0 -5908;ensoleillement;positive;1;0;0;0;0;0 -5909;ensorceler;negative;0;1;0;0;0;0 -5910;entacher;negative;0;1;1;1;0;1 -5911;entailler;negative;0;1;1;1;0;0 -5912;entasser;negative;0;0;0;0;0;0 -5913;entendement;positive;0;0;0;0;0;0 -5914;entendre;positive;0;0;0;0;0;0 -5915;enterrer;negative;0;1;1;0;0;0 -5916;enterrement;negative;0;1;1;1;0;0 -5917;entêter;negative;0;0;1;1;0;0 -5918;entêtement;negative;0;0;0;1;0;0 -5919;enthousiasme;positive;0;0;0;1;1;0 -5920;enthousiaste;positive;0;0;0;0;1;0 -5921;entièrement;positive;0;0;0;0;0;0 -5922;entité;positive;0;0;0;0;0;0 -5923;entomologie;negative;0;0;0;0;0;1 -5924;entonnoir;positive;0;0;0;0;0;0 -5925;entorse;negative;0;1;1;0;1;0 -5926;entortiller;negative;0;1;0;1;0;0 -5927;entourer;positive;0;0;0;0;0;0 -5928;entracte;positive;0;0;0;0;0;0 -5929;entrailles;negative;0;0;0;0;0;1 -5930;entraîner;positive;0;0;0;0;0;0 -5931;entraînant;positive;0;0;0;0;0;0 -5932;entraînement;positive;0;0;0;0;0;0 -5933;entrer;positive;0;0;0;0;0;0 -5934;entrant;positive;0;0;0;0;0;0 -5935;entrave;negative;0;1;1;1;1;0 -5936;entraver;negative;0;1;1;1;1;0 -5937;entre temps;positive;0;0;0;0;0;0 -5938;entrecroiser;positive;0;0;0;0;0;0 -5939;entrejambe;positive;0;0;0;0;0;0 -5940;entreposage;positive;0;0;0;0;0;0 -5941;entrepôt;positive;0;0;0;0;0;0 -5942;entrepôt débarras;negative;0;1;1;0;0;0 -5943;entreprenant;negative;0;1;0;1;0;0 -5944;entreprendre;positive;0;0;0;0;0;0 -5945;entrepreneur;positive;0;0;0;0;0;0 -5946;entrepreneur de pompe funèbre;positive;0;0;1;0;0;0 -5947;entreprise;positive;0;0;0;0;0;0 -5948;entrer en collision;negative;0;1;0;0;1;0 -5949;entrer en éruption;negative;0;1;0;1;1;0 -5950;entretien;positive;0;0;0;0;0;0 -5951;entrevoir;positive;0;0;0;0;0;0 -5952;entrevue;positive;0;0;0;0;0;0 -5953;entropie;negative;0;1;0;0;1;0 -5954;entrouvrir;positive;0;0;0;0;0;0 -5955;énumération;positive;0;0;0;0;0;0 -5956;énumérer;positive;0;0;0;0;0;0 -5957;envahir par le mauvais herbe;negative;0;1;1;0;0;1 -5958;envahir;negative;0;1;1;1;1;0 -5959;envahissant;negative;0;1;0;1;1;1 -5960;envahisseur;negative;0;1;1;1;0;0 -5961;envelopper;positive;0;0;0;0;0;0 -5962;enveloppe;positive;0;0;0;0;0;0 -5963;envie irrésistible;negative;0;0;1;0;0;0 -5964;environ;positive;0;0;0;0;0;0 -5965;environner;positive;0;0;0;0;0;0 -5966;environnement;positive;0;0;0;0;0;0 -5967;envisager;positive;0;0;0;0;0;0 -5968;envoi;positive;0;0;0;0;0;0 -5969;envol;negative;0;0;0;0;0;0 -5970;envoûter;negative;0;1;0;0;0;0 -5971;envoyer un sms à;positive;0;0;0;0;0;0 -5972;éolienne;positive;0;0;0;0;0;0 -5973;épagneul;positive;0;0;0;0;0;0 -5974;épais;negative;0;0;0;0;0;0 -5975;épaisseur;negative;0;0;0;0;0;0 -5976;épaissir;negative;0;0;0;0;0;0 -5977;épaississant;negative;0;0;0;0;0;0 -5978;épaississement;negative;0;0;0;0;0;0 -5979;épanchement;negative;0;1;0;0;0;1 -5980;épanouir;positive;1;0;0;0;0;0 -5981;épanouissement;positive;0;0;0;0;0;0 -5982;épargne;positive;0;0;0;0;0;1 -5983;éparpiller;negative;0;1;1;0;0;0 -5984;éparpillement;negative;0;1;1;0;0;0 -5985;épar|épars;negative;0;1;1;0;0;0 -5986;épater;positive;0;0;0;0;1;0 -5987;épaule;positive;0;0;0;0;0;0 -5988;épée;negative;0;1;0;0;0;0 -5989;éperdre;negative;0;1;1;0;0;0 -5990;éperlan;negative;0;0;0;0;0;0 -5991;éphémère;negative;0;0;1;0;1;0 -5992;ephéméride;positive;0;0;0;0;0;0 -5993;éphéméride;positive;0;0;0;0;0;0 -5994;épicéa;positive;0;0;0;0;0;0 -5995;épicer;negative;0;1;0;0;1;0 -5996;épicerie;positive;0;0;0;0;0;0 -5997;épiderme;positive;0;0;0;0;0;0 -5998;épilepsie;negative;0;1;0;0;0;0 -5999;épilogue;negative;0;0;0;0;0;0 -6000;épine;negative;0;1;0;0;0;1 -6001;épingle;positive;0;0;0;0;0;0 -6002;épingler;positive;0;0;0;0;0;0 -6003;épique;positive;0;0;0;0;1;0 -6004;épiscopal;positive;0;0;0;0;0;0 -6005;épisode;positive;0;0;0;0;0;0 -6006;épisodique;positive;0;0;0;0;0;0 -6007;épisser;positive;0;0;0;0;0;0 -6008;épissure;positive;0;0;0;0;0;0 -6009;épitaphe;negative;0;0;1;0;0;0 -6010;épithète;positive;0;0;0;0;0;0 -6011;épître;positive;0;0;0;0;0;0 -6012;éplucher;negative;0;0;0;0;0;0 -6013;éponge;negative;0;0;0;0;0;1 -6014;éponger;negative;0;0;0;0;0;1 -6015;épopée;positive;0;0;0;0;1;0 -6016;époque;positive;0;0;0;0;0;0 -6017;épouser;positive;0;1;0;0;1;0 -6018;épousseter;negative;0;0;0;0;0;1 -6019;époux;positive;0;0;0;0;0;0 -6020;épreuve;negative;0;1;1;1;1;0 -6021;épreuve de force;negative;0;0;0;1;0;0 -6022;éprendre;positive;1;0;0;0;0;0 -6023;éprouver;negative;0;1;1;1;0;1 -6024;éprouvant;negative;0;1;1;1;0;1 -6025;éprouver de le rancune contre;negative;0;0;0;1;0;0 -6026;épuiser;negative;0;0;1;0;0;0 -6027;épuisant;negative;0;0;1;0;0;0 -6028;épuisement;negative;0;1;1;0;0;0 -6029;épuration;positive;0;0;0;0;0;0 -6030;équateur;positive;0;0;0;0;0;0 -6031;équation;positive;0;0;0;0;0;0 -6032;équatorial;positive;0;0;0;0;0;0 -6033;équerre;positive;0;0;0;0;0;0 -6034;équestre;positive;0;0;0;0;0;0 -6035;équidistant;positive;0;0;0;0;0;0 -6036;équilibration;positive;0;0;0;0;0;0 -6037;équilibre;positive;0;0;0;0;0;0 -6038;équilibrer;positive;0;0;0;0;0;0 -6039;équipage;positive;0;0;0;0;0;0 -6040;équipement;positive;0;0;0;0;0;0 -6041;équiper;positive;0;0;0;0;0;0 -6042;équitable;positive;0;0;0;0;0;0 -6043;équitablement;positive;0;0;0;0;0;0 -6044;équitation;positive;0;0;0;0;0;0 -6045;équité;positive;0;0;0;0;0;0 -6046;équivalence;positive;0;0;0;0;0;0 -6047;équivaloir à;positive;0;0;0;0;0;0 -6048;équivoque;negative;0;1;0;0;0;0 -6049;éradication;negative;0;1;1;1;0;1 -6050;éradiquer;negative;0;1;1;1;0;1 -6051;érafler;negative;0;1;1;0;0;0 -6052;éraflure;negative;0;1;1;0;0;1 -6053;érection;positive;0;0;0;0;0;0 -6054;ergoteur;negative;0;0;0;1;0;0 -6055;ériger;positive;0;0;0;0;0;0 -6056;ermite;negative;0;0;1;0;0;0 -6057;érosion;negative;0;0;0;0;0;0 -6058;érotique;positive;0;0;0;0;1;0 -6059;errance;negative;0;0;1;0;0;0 -6060;errer;negative;0;1;1;0;0;0 -6061;errant;negative;0;1;1;0;0;0 -6062;erratique;negative;0;0;0;0;1;0 -6063;erratum;negative;0;0;0;0;0;0 -6064;erroné;negative;0;1;1;0;0;0 -6065;érudit;positive;0;0;0;0;0;0 -6066;éruption;negative;0;1;0;1;1;0 -6067;éruption cutané;negative;0;0;0;0;0;1 -6068;escadron;positive;0;0;0;0;0;0 -6069;escalade;positive;0;0;0;0;0;0 -6070;escalader;positive;0;1;0;0;0;0 -6071;escalator;positive;0;0;0;0;0;0 -6072;escalier;positive;0;0;0;0;0;0 -6073;escapade;positive;0;0;0;0;0;0 -6074;escargot;negative;0;0;0;0;0;1 -6075;escarmouche;negative;0;0;0;1;0;0 -6076;escarpement;negative;0;1;0;0;0;0 -6077;esclavage;negative;0;1;1;1;0;1 -6078;esclave;negative;0;1;1;1;0;1 -6079;escorte;positive;0;0;0;0;0;0 -6080;escorter;positive;0;0;0;0;0;0 -6081;escouade;positive;0;0;0;0;0;0 -6082;escroc;negative;0;0;0;1;0;1 -6083;ésotérique;positive;0;0;0;0;0;0 -6084;espace;positive;0;0;0;0;0;0 -6085;espacer;positive;0;0;0;0;0;0 -6086;espérance;positive;0;0;0;0;0;0 -6087;espérance de vie;positive;0;0;0;0;0;0 -6088;espérer;positive;0;0;0;0;0;0 -6089;esperluette;positive;0;0;0;0;0;0 -6090;espionnage;negative;0;1;0;1;1;0 -6091;espionner;negative;0;1;0;0;0;0 -6092;espoir;positive;0;0;0;0;1;0 -6093;esprit;positive;0;0;0;0;0;0 -6094;esquisse;positive;0;0;0;0;0;0 -6095;esquisser;positive;0;0;0;0;0;0 -6096;esquive;negative;0;1;0;0;0;0 -6097;esquiver;negative;0;1;0;0;0;0 -6098;essaim;negative;0;1;0;0;0;1 -6099;essaimage;negative;0;1;0;1;0;0 -6100;essayer|essayer;positive;0;0;0;0;0;0 -6101;essayiste;positive;0;0;0;0;0;0 -6102;essentiel;positive;0;0;0;0;0;0 -6103;essentiellement;positive;0;0;0;0;0;0 -6104;essieu;positive;0;0;0;0;0;0 -6105;essor;positive;0;0;0;0;1;0 -6106;esssence;positive;0;0;0;0;0;0 -6107;essuyer;positive;0;0;0;0;0;0 -6108;esthétique;positive;1;0;0;0;0;0 -6109;esthétisme;positive;1;0;0;0;0;0 -6110;estimation;positive;0;0;0;0;1;0 -6111;estime;positive;0;0;1;0;0;0 -6112;estimer;positive;0;0;1;0;0;0 -6113;estival;positive;1;0;0;0;0;0 -6114;estivau;positive;1;0;0;0;0;0 -6115;estomac;positive;0;0;0;0;0;1 -6116;estuaire;positive;0;0;0;0;0;0 -6117;estudiantin;positive;0;0;0;0;0;0 -6118;esturgeon;positive;0;0;0;0;0;0 -6119;étable;negative;0;0;0;0;0;0 -6120;établir;positive;0;0;0;0;0;0 -6121;établiées;positive;0;0;0;0;0;0 -6122;établir le fausseté de;negative;0;0;0;1;0;0 -6123;établir un discrimination;negative;0;0;1;1;0;1 -6124;établissement;positive;0;0;0;0;0;0 -6125;établissement scolaire;positive;0;0;0;0;0;0 -6126;étage;positive;0;0;0;0;0;0 -6127;étagère;positive;0;0;0;0;0;0 -6128;étai;positive;0;0;0;0;0;0 -6129;étain;positive;0;0;0;0;0;0 -6130;étal;positive;0;0;0;0;0;1 -6131;étalage;positive;1;0;0;0;0;0 -6132;étaler;negative;0;0;0;1;0;0 -6133;étalon;positive;0;0;0;0;0;0 -6134;étanche;positive;0;0;0;0;0;0 -6135;étancher;positive;0;0;0;0;0;0 -6136;étang;negative;0;0;0;0;0;1 -6137;étape important;positive;0;0;0;0;0;0 -6138;état;positive;0;0;0;0;0;0 -6139;étau;negative;0;1;0;0;0;0 -6140;étayer|étayer;positive;0;0;0;0;0;0 -6142;éteindre;negative;0;0;1;1;0;0 -6143;étendue sauvage;negative;0;1;1;0;0;0 -6144;éternité;positive;0;0;0;0;0;0 -6145;éternuer;negative;0;0;0;0;1;0 -6146;éternuement;negative;0;0;0;0;1;1 -6147;éthanol;negative;0;0;0;0;0;1 -6148;éther;negative;0;0;0;0;0;1 -6149;éthéré;negative;0;1;0;0;0;0 -6150;éthique;positive;0;0;0;0;0;0 -6151;ethnographie;positive;0;0;0;0;0;0 -6152;étinceler;positive;1;0;0;0;0;0 -6153;étincelant;positive;1;0;0;0;0;0 -6154;étincelle;positive;0;0;0;0;1;0 -6155;étiologie;positive;0;0;0;0;0;0 -6156;étiqueter;positive;0;0;0;0;0;0 -6157;étiquette;positive;0;0;0;0;0;0 -6158;étirer;positive;0;0;0;0;0;0 -6159;étoffe;positive;0;0;0;0;0;0 -6160;étoile;positive;0;0;0;0;0;0 -6161;étoiler;positive;1;0;0;0;0;0 -6162;étole;positive;0;0;0;0;0;0 -6163;étonnamment;positive;0;0;0;0;1;0 -6164;étonnement;positive;0;1;0;0;1;0 -6165;étonner;positive;0;1;0;0;1;0 -6166;étouffant;negative;0;1;1;0;1;1 -6167;étouffoir;negative;0;1;0;0;0;0 -6168;étourderie;negative;0;1;1;0;0;0 -6169;étourdir;negative;0;1;1;0;1;0 -6170;étourdissement;negative;0;1;0;0;1;0 -6171;étrangement;negative;0;1;0;0;1;0 -6172;étrangeté;negative;0;0;1;0;1;1 -6173;étrangleur;negative;0;1;1;1;1;0 -6174;être à le tête;positive;0;0;0;0;0;0 -6175;être à le traîne;negative;0;0;1;0;0;0 -6176;être affaler;negative;0;0;0;0;0;0 -6177;être allonger;positive;0;0;0;0;0;0 -6178;être assortir;positive;0;0;0;0;0;0 -6179;être au service de;negative;0;0;0;0;0;0 -6180;être avachir;negative;0;0;0;0;0;0 -6181;être bénéfique;positive;1;0;0;0;0;0 -6182;être bénévole;positive;0;1;0;0;0;0 -6183;être caractériser;positive;0;0;0;0;0;0 -6184;être conforme à;positive;0;0;0;0;0;0 -6185;être domicilier;positive;0;0;0;0;0;0 -6186;être en adéquation;negative;0;1;0;1;0;0 -6187;être en apprentissage;positive;0;0;0;0;0;0 -6188;être en désaccord;negative;0;0;0;1;0;0 -6189;être en rage;negative;0;0;0;1;0;0 -6190;être imposant;negative;0;1;0;1;0;1 -6191;être incliner;negative;0;1;0;0;0;0 -6192;être indiscret;negative;0;0;0;1;0;1 -6193;être inonder;negative;0;1;0;0;0;0 -6194;être le plus toucher par;negative;0;0;1;1;0;0 -6195;être le premier toucher par;negative;0;0;1;1;0;0 -6196;être protubérant;negative;0;1;0;0;0;1 -6197;être quitte;positive;0;0;0;0;0;0 -6198;être rayonnant;positive;0;0;0;0;0;0 -6199;être souffrant;negative;0;0;1;0;0;0 -6200;étriquer;negative;0;1;1;0;0;0 -6201;étroit;negative;0;1;1;0;0;0 -6202;étroitesse;negative;0;1;1;1;0;0 -6203;étude;positive;0;0;0;0;0;0 -6204;étudier de deuxième année;positive;0;0;0;0;0;0 -6205;étudier de premier cycle unir;positive;0;0;0;0;0;0 -6206;étudier de premier année;positive;0;0;0;0;0;0 -6207;étudier;positive;0;0;0;0;0;0 -6208;étymologie;positive;0;0;0;0;0;0 -6209;euchre;positive;0;0;0;0;0;0 -6210;eugénisme;negative;0;0;1;0;0;0 -6211;euh;negative;0;1;1;0;0;0 -6212;euphémisme;negative;0;0;0;0;0;0 -6213;euthanasie;negative;0;1;1;0;0;0 -6214;évacuation;negative;0;1;0;0;0;0 -6215;évader;negative;0;1;0;1;0;0 -6216;évaluer;positive;0;0;0;0;0;0 -6217;evanescence;negative;0;0;1;0;1;0 -6218;évanescence;negative;0;0;1;0;1;0 -6219;évangélique;positive;0;0;0;0;0;0 -6220;évangéliste;positive;0;0;0;0;0;0 -6221;évangile;positive;0;0;0;0;0;0 -6222;évanouissement;negative;0;1;1;0;1;0 -6223;évaporation;negative;0;0;0;0;0;0 -6224;éveil;positive;1;0;0;0;0;0 -6225;éveiller;positive;0;0;0;0;0;0 -6226;événement;positive;0;0;0;0;1;0 -6227;événement fortuit;positive;0;0;0;0;1;0 -6228;événement marquant;positive;0;0;0;0;0;0 -6229;évent;positive;0;0;0;1;0;0 -6230;éventail;positive;0;0;0;0;0;0 -6231;éventer;positive;0;0;0;0;0;0 -6232;éventuellement;positive;0;0;0;0;1;0 -6233;évêque;positive;0;0;0;0;0;0 -6234;évidemment;positive;0;0;0;0;0;0 -6235;évident;positive;0;0;0;1;0;1 -6236;évier;negative;0;1;1;0;0;0 -6237;évincer;negative;0;1;1;1;1;0 -6238;éviter;negative;0;1;0;0;0;1 -6239;évoluer;positive;1;0;0;0;0;0 -6240;evolution;positive;0;0;0;0;0;0 -6241;évolution;positive;0;0;0;0;0;0 -6242;évoquer;positive;0;0;0;0;0;0 -6243;exacerbation;negative;0;1;0;1;0;0 -6244;exacerber;negative;0;0;0;0;0;0 -6245;exact;positive;0;0;0;0;0;0 -6246;exactitude;positive;0;0;0;0;0;0 -6247;exagération;negative;0;0;0;0;0;0 -6248;exagérer;negative;0;0;0;1;0;0 -6249;exaltation;positive;0;0;0;0;1;0 -6250;exalter;positive;0;0;0;0;0;0 -6251;examiner avec soin;positive;0;0;0;0;0;0 -6252;exaspération;negative;0;0;0;1;0;1 -6253;exaspérer;negative;0;1;0;1;0;0 -6254;exaucer;positive;0;0;0;0;0;0 -6255;excavateur;negative;0;0;0;0;0;0 -6256;excavation;negative;0;0;0;0;1;0 -6257;excaver;negative;0;0;1;0;0;1 -6258;excéder;positive;0;0;0;0;1;0 -6259;excédent;negative;0;0;0;0;0;0 -6260;excellence;positive;0;0;0;0;1;1 -6261;excellent;positive;0;0;0;1;0;0 -6262;exceller;positive;0;0;0;0;1;0 -6263;excentricité;negative;0;0;0;0;0;0 -6264;excentrique;negative;0;1;0;1;1;0 -6265;exception;positive;0;0;0;0;1;0 -6266;exceptionnellement;negative;0;0;0;0;0;0 -6267;excès;negative;0;0;0;0;0;1 -6268;excessivement;negative;0;0;0;0;0;0 -6269;exciser;negative;0;1;0;0;0;1 -6270;excision;negative;0;1;0;0;0;0 -6271;excitabilité;positive;0;0;0;0;0;0 -6272;excitable;positive;0;0;0;0;1;0 -6273;excitant;positive;0;0;0;0;1;0 -6274;excitation;positive;0;1;0;1;1;0 -6275;exciter;positive;0;0;0;0;1;0 -6276;exclure;negative;0;1;1;1;0;1 -6277;exclusion;negative;0;1;1;0;0;1 -6278;excrément;negative;0;0;0;0;0;1 -6279;excrétion;negative;0;0;0;0;0;1 -6280;excroissance;negative;0;1;0;0;0;0 -6281;excuse;positive;0;0;1;0;0;0 -6282;exécutif;positive;0;0;0;0;0;0 -6283;exécution;negative;0;1;1;1;0;0 -6284;exégèse;positive;0;0;0;0;0;0 -6285;exemplaire;positive;0;0;0;0;0;0 -6286;exemple;positive;0;0;0;0;0;0 -6287;exempt;positive;0;0;0;0;0;0 -6288;exempter;positive;0;0;0;0;0;0 -6289;exemption;positive;0;0;0;0;0;0 -6290;exercer;positive;0;0;0;0;0;0 -6291;exercer son pontificat;positive;0;0;0;0;0;0 -6292;exercice;positive;0;0;0;0;0;0 -6293;exercice physique;positive;0;0;0;0;0;0 -6294;exhiber;negative;0;0;0;1;0;0 -6295;exhortation;positive;0;0;0;0;0;0 -6296;exhumer;negative;0;0;1;0;0;0 -6297;exigeant;negative;0;1;0;1;1;1 -6298;exiguïté;negative;0;0;1;0;0;0 -6299;exil;negative;0;1;1;1;0;0 -6300;existant;positive;0;0;0;0;0;0 -6301;exode;negative;0;0;1;0;0;0 -6302;exorbiter;negative;0;1;0;1;1;0 -6303;exorbitant;negative;0;1;0;1;1;0 -6304;exorcisme;negative;0;1;1;1;0;0 -6305;exorciste;negative;0;1;0;1;0;0 -6306;exotique;positive;0;0;0;0;0;0 -6307;expansif;positive;0;0;0;0;0;0 -6308;expansion;positive;0;0;0;0;0;0 -6309;expédient;positive;0;0;0;0;0;0 -6310;expéditif;negative;0;0;0;1;0;0 -6311;expédition;positive;0;0;0;0;0;0 -6312;expérience;positive;0;0;0;0;1;0 -6313;expert comptable commissaire avoir;positive;0;1;0;0;0;0 -6314;expiation;positive;1;0;0;0;0;0 -6315;expiration;negative;0;1;0;0;0;1 -6316;expirer;negative;0;0;1;0;0;1 -6317;explication;positive;0;0;0;0;0;0 -6318;expliquer;positive;0;0;0;0;0;0 -6319;exploit;positive;0;0;0;0;1;0 -6320;exploitation agricole;positive;0;0;0;0;0;0 -6321;exploitation forestier;positive;0;0;0;0;0;0 -6322;explorateur;positive;0;0;0;0;0;0 -6323;explorer;positive;0;0;0;0;1;0 -6324;exploser;negative;0;1;1;1;1;0 -6325;expo;positive;0;0;0;0;0;0 -6326;exponentiel;positive;0;0;0;0;0;0 -6327;exportation;positive;0;0;0;0;0;0 -6328;exporter;positive;0;0;0;0;0;0 -6329;exposant;positive;0;0;0;0;0;0 -6330;exposer;negative;0;1;0;0;1;0 -6331;exposer le grand ligne;positive;0;0;0;0;0;0 -6332;express;positive;0;0;0;0;0;0 -6333;expressif;positive;0;0;0;0;0;0 -6334;expression;positive;0;0;0;0;0;0 -6335;expression idiomatique;positive;0;0;0;0;0;0 -6336;expression passer partout;negative;0;0;0;0;0;0 -6337;exprimer;positive;0;0;0;0;0;0 -6338;exprimer son reconnaissance;positive;0;0;0;0;0;0 -6339;expropriation;negative;0;1;1;1;0;1 -6340;exquis;positive;1;0;0;0;0;0 -6341;exsangue;negative;0;1;0;0;0;0 -6342;exsuder;negative;0;0;0;0;0;1 -6343;extase;positive;1;0;0;0;0;0 -6344;extatique;positive;0;0;0;0;1;0 -6345;extensible;positive;0;0;0;0;0;0 -6346;extension;positive;0;0;0;0;0;0 -6347;exténuation;negative;0;0;1;0;0;0 -6348;extérieur;negative;0;0;0;0;0;0 -6349;extérieurement;negative;0;0;0;0;0;0 -6350;extermination;negative;0;1;1;1;0;1 -6351;exterminer;negative;0;1;1;1;0;1 -6352;externe;negative;0;0;0;0;0;0 -6353;extirper;positive;0;0;0;0;0;0 -6354;extra muros;negative;0;0;0;0;0;0 -6355;extracteur;positive;0;0;0;0;0;0 -6356;extraction;positive;0;0;0;0;0;0 -6357;extradition;negative;0;1;1;0;0;0 -6358;extraire;positive;0;0;0;0;0;0 -6359;extrajudiciaire;negative;0;1;0;0;0;0 -6360;extraodianires;positive;1;0;0;0;0;0 -6361;extraordinaire;positive;0;1;0;0;1;0 -6362;extraterrestre;negative;0;1;0;0;0;1 -6363;extrêmement pénible;negative;0;1;1;0;0;0 -6364;extrémité;negative;0;0;0;0;0;0 -6365;extrinsèque;negative;0;0;0;0;0;0 -6366;extrusion;negative;0;1;0;0;0;1 -6367;exubérance;positive;1;0;0;0;0;0 -6368;exulter;positive;1;0;0;0;0;0 -6369;fable;positive;1;0;0;0;0;0 -6370;fabulation;negative;0;0;0;1;0;0 -6371;fac similé;negative;0;0;0;0;0;0 -6372;face;positive;0;0;0;0;0;0 -6373;facette;positive;0;0;0;0;0;0 -6374;fâcheux;negative;0;0;0;1;0;1 -6375;facile à vivre;positive;0;0;0;0;0;0 -6376;facilement;positive;1;0;0;0;0;0 -6377;faciliter;positive;1;0;0;0;0;0 -6378;façonnage;positive;0;0;0;0;0;0 -6379;façonner;positive;0;0;0;0;0;0 -6380;façon;positive;0;0;0;0;0;0 -6381;facteur;positive;0;0;0;0;0;0 -6382;factice;negative;0;0;0;1;0;1 -6383;faction;negative;0;0;0;1;0;0 -6384;facturable;negative;0;1;1;0;0;0 -6385;facultativement;positive;0;0;0;0;0;0 -6386;faculté;positive;0;0;0;0;0;0 -6387;fade;negative;0;0;1;0;0;1 -6388;faible;negative;0;0;1;1;0;1 -6389;faiblement;negative;0;1;1;0;0;0 -6390;faiblesse;negative;0;1;1;0;0;0 -6391;faiblir;negative;0;1;0;0;0;0 -6392;faïence;positive;0;0;0;0;0;0 -6393;faille;negative;0;1;1;0;0;0 -6394;faillible;negative;0;1;1;0;0;0 -6395;faillite;negative;0;1;1;1;0;1 -6396;faim;negative;0;0;1;0;0;0 -6397;faire;positive;0;0;0;0;0;0 -6398;faire apparaître;negative;0;0;0;0;1;0 -6399;faire appel;positive;0;0;0;0;0;0 -6400;faire attention;positive;0;1;0;0;0;0 -6401;faire bouillir;negative;0;0;0;1;0;1 -6402;faire cadeau;positive;0;0;0;0;0;0 -6403;faire campagne;positive;0;0;0;0;0;0 -6404;faire chanter;negative;0;1;0;1;0;0 -6405;faire circuler;positive;0;0;0;0;0;0 -6406;faire confiance;positive;0;0;0;0;0;0 -6407;faire cuire au barbecue;positive;0;0;0;0;0;0 -6408;faire de l exercice;positive;0;0;0;0;0;0 -6409;faire de le boxe;negative;0;0;0;1;0;0 -6410;faire de le luge;positive;1;0;0;0;0;0 -6411;faire de le moto;positive;0;0;0;0;0;0 -6412;faire de le publicité;positive;0;0;0;0;0;0 -6413;faire de le sculpture;positive;0;0;0;0;0;0 -6414;faire du affaire;positive;0;0;0;0;0;0 -6415;faire du compromis;positive;0;0;0;0;0;0 -6416;faire du course;positive;0;0;0;0;1;0 -6417;faire du folie;negative;0;1;0;0;1;0 -6418;faire du histoire;negative;0;0;1;1;0;0 -6419;faire du remarque continuell;negative;0;1;1;1;0;0 -6420;faire du réserve;positive;0;0;0;0;0;0 -6421;faire détoner;negative;0;1;0;0;1;0 -6422;faire du canoë;positive;0;0;0;0;0;0 -6423;faire du jogging;positive;0;0;0;0;0;0 -6424;faire du mannequinat;positive;0;0;0;0;0;0 -6425;faire du planeur;positive;1;0;0;0;0;0 -6426;faire du racolage;negative;0;0;0;0;0;0 -6427;faire du rap;negative;0;0;0;0;0;0 -6428;faire du trafic;negative;0;0;1;0;0;0 -6429;faire du traîneau;positive;1;0;0;0;0;0 -6430;faire exploser;negative;0;1;0;1;1;0 -6431;faire face;positive;0;0;0;0;0;0 -6432;faire fondre;negative;0;0;0;0;0;0 -6433;faire infuser;positive;0;0;0;0;0;0 -6434;faire le chronique de;positive;0;0;0;0;0;0 -6435;faire le cour;positive;0;0;0;0;0;0 -6436;faire le course;positive;0;0;0;0;0;0 -6437;faire le fête;positive;0;0;0;0;1;0 -6438;faire le grimace;negative;0;1;1;1;0;1 -6439;faire le leçon;positive;0;0;0;0;0;0 -6440;faire le queue;negative;0;0;1;0;0;0 -6441;faire le clown;positive;0;0;0;0;1;0 -6442;faire le médiateur;positive;0;0;0;0;0;0 -6443;faire le pitre;positive;0;0;0;0;1;0 -6444;faire le magasin;positive;0;0;0;0;1;0 -6445;faire mal;negative;0;1;1;1;0;0 -6446;faire marche arrière;negative;0;1;1;0;0;0 -6447;faire obstruction à;negative;0;0;0;1;0;0 -6448;faire passer un entretien;positive;0;0;0;0;0;0 -6449;faire pipi;negative;0;0;0;0;0;1 -6450;faire pivoter;positive;0;0;0;0;0;0 -6451;faire plaisir;positive;1;0;0;0;0;0 -6452;faire référence à;positive;0;0;0;0;0;0 -6453;faire remarquer;negative;0;0;0;0;0;0 -6454;faire semblant;negative;0;0;0;1;0;1 -6455;faire son début;positive;0;0;0;0;0;0 -6456;faire son valise;positive;0;0;0;0;0;0 -6457;faire signe;positive;0;0;0;0;0;0 -6458;faire suite;positive;0;0;0;0;0;0 -6459;faire surface;positive;0;0;0;0;0;0 -6460;faire sursauter;negative;0;1;0;0;1;0 -6461;faire tourner;positive;0;0;0;0;0;0 -6462;faire tremper;negative;0;0;0;0;0;1 -6463;faire un bond;positive;1;0;0;0;0;0 -6464;faire un bruit métallique;negative;0;1;0;0;1;0 -6465;faire un bruit sourd;negative;0;1;0;0;1;0 -6466;faire un coup amortir;negative;0;1;0;1;1;0 -6467;faire un geste;positive;0;0;0;0;0;0 -6468;faire un régime;negative;0;0;0;0;0;0 -6469;faire un scanner de;positive;0;0;0;0;0;0 -6470;faire un signe de le main;positive;0;0;0;0;0;0 -6471;faire un signe de le tête;positive;0;0;0;0;0;0 -6472;faire un somme;positive;0;0;0;0;0;0 -6473;faire un sondage;positive;0;0;0;0;0;0 -6474;faire un descente dans;negative;0;1;0;1;1;0 -6475;faire un digression;negative;0;1;0;1;0;0 -6476;faire un embardée;negative;0;1;0;0;1;0 -6477;faire un gaffe;negative;0;1;1;0;0;1 -6478;faire un hémorragie;negative;0;1;1;0;0;1 -6479;faire un overdose;negative;0;1;1;0;0;1 -6480;faire un randonnée;positive;0;0;0;0;0;0 -6481;faire un remise;positive;0;0;0;0;0;0 -6482;fairway;positive;0;0;0;0;0;0 -6483;faisabilité;positive;0;0;0;0;0;0 -6484;faire autorité;positive;0;0;0;0;0;0 -6485;faire le sieste;positive;0;0;0;0;0;0 -6486;faisceau;positive;1;0;0;0;0;0 -6487;fait et geste;positive;0;0;0;0;0;0 -6488;falacieuses;negative;0;0;0;1;0;1 -6489;falaise;negative;0;1;0;0;0;0 -6490;falsification;negative;0;0;0;1;0;1 -6491;falsifier;negative;0;1;1;0;0;1 -6492;fameusement;positive;1;0;0;0;0;0 -6493;familiariser;positive;0;0;0;0;0;0 -6494;familiarité;positive;0;0;0;0;0;0 -6495;familier;positive;0;0;0;0;0;0 -6496;famille;positive;0;0;0;0;0;0 -6497;famille du défunt;negative;0;0;1;0;0;0 -6498;famine;negative;0;1;1;0;0;0 -6499;fan;positive;0;0;0;0;0;0 -6500;fanatisme;negative;0;1;0;1;0;0 -6501;fandango;positive;0;0;0;0;0;0 -6502;faner;negative;0;0;1;0;0;1 -6503;fanfare;positive;0;0;0;0;1;0 -6504;fanfaronnade;negative;0;0;0;0;0;0 -6505;fanfaronner;negative;0;0;0;0;0;0 -6506;fanion;positive;0;0;0;0;0;0 -6507;fantaisiste;negative;0;0;0;0;1;0 -6508;fantasme;positive;0;0;0;0;0;0 -6509;fantasque;negative;0;0;0;0;1;0 -6510;fantoche;negative;0;0;0;0;0;0 -6511;fantomatique;negative;0;1;0;0;0;0 -6512;fantôme;negative;0;1;0;0;1;0 -6513;faon;negative;0;0;0;0;0;0 -6514;fard;positive;0;0;0;0;0;0 -6515;fardeau;negative;0;1;1;1;0;0 -6516;farfelu;negative;0;1;0;0;1;0 -6517;farine;positive;0;0;0;0;0;0 -6518;fariner;positive;0;0;0;0;0;0 -6519;faro;positive;0;0;0;0;0;0 -6520;fascia;positive;0;0;0;0;0;0 -6521;fasciner;positive;0;1;0;0;1;0 -6522;fascinant;positive;0;1;0;0;1;0 -6523;fascination;positive;0;0;0;0;0;0 -6524;fatal;negative;0;1;1;1;0;0 -6525;fatalité;negative;0;1;1;0;0;0 -6526;fatiguer;negative;0;0;1;1;0;0 -6527;faucher;negative;0;1;1;0;0;0 -6528;faucille;negative;0;1;0;0;0;0 -6529;faucon;negative;0;1;0;0;0;0 -6530;faune;positive;0;0;0;0;0;0 -6531;faux couche;negative;0;1;1;0;1;0 -6532;fausser;negative;0;0;1;1;1;1 -6533;faussement;negative;0;0;1;1;0;0 -6534;faussement pudique;negative;0;1;0;0;0;1 -6535;faussement timide;negative;0;1;0;0;0;1 -6536;fausseté;negative;0;0;0;1;0;1 -6537;faute;negative;0;0;1;0;0;1 -6538;faute professionnel;negative;0;1;0;1;0;0 -6539;fauve;negative;0;1;0;0;0;1 -6540;fauvette;positive;0;0;0;0;0;0 -6541;faux pas;negative;0;1;1;0;1;1 -6542;faux pli;negative;0;0;0;0;0;0 -6543;faux bourdon;negative;0;1;0;0;0;1 -6544;faveur;positive;0;0;0;0;0;0 -6545;favori;positive;0;0;0;0;0;0 -6546;favoriser;positive;0;0;0;0;0;0 -6547;favorite;positive;0;0;0;0;0;0 -6548;fébrile;negative;0;1;1;0;1;0 -6549;fécal;negative;0;0;0;0;0;1 -6550;fèces;negative;0;0;0;0;0;1 -6551;fécondité;positive;0;0;0;0;0;0 -6552;fécule;negative;0;0;0;0;0;1 -6553;fécule de maïs;positive;0;0;0;0;0;0 -6554;fédéral;positive;0;0;0;0;0;0 -6555;fédération;positive;0;0;0;0;0;0 -6556;fée;positive;0;0;0;0;0;0 -6557;féerie;positive;1;0;0;0;0;0 -6558;feindre;negative;0;0;0;0;0;1 -6559;feinte;negative;0;0;0;0;0;1 -6560;féliciter;positive;1;0;0;0;0;0 -6561;félin;positive;0;0;0;0;0;0 -6562;félure;negative;0;1;0;1;0;0 -6563;femelle;positive;0;0;0;0;0;0 -6564;féministe;positive;0;0;0;0;0;0 -6565;féminité;positive;0;0;0;0;0;0 -6566;femme;positive;0;0;0;0;0;0 -6567;femme au foyer;positive;0;0;0;0;0;0 -6568;femme de ménage;positive;0;0;0;0;0;0 -6569;femme fatal;positive;0;0;0;0;0;0 -6570;femme politique;positive;0;0;0;0;0;0 -6571;fendre;negative;0;1;0;1;0;0 -6572;fenêtre;positive;0;0;0;0;0;0 -6573;fenouil;negative;0;0;0;0;0;1 -6574;fente;negative;0;1;0;0;0;0 -6575;féodal;negative;0;0;0;0;0;0 -6576;féodalisme;negative;0;0;1;1;0;0 -6577;fer;positive;0;0;0;0;0;0 -6578;fer à cheval;positive;0;0;0;0;0;0 -6579;fermer;positive;0;0;0;0;0;0 -6580;fermement;positive;0;0;0;0;0;0 -6581;ferment;negative;0;0;0;0;0;1 -6582;fermentation;negative;0;0;0;0;0;1 -6583;fermenter;negative;0;0;0;0;0;1 -6584;fermer à clé;positive;0;0;0;0;0;0 -6585;fermeté;positive;0;0;0;0;0;0 -6586;fermette;positive;0;0;0;0;0;0 -6587;fermeture;positive;0;0;1;0;0;0 -6588;fermeture éclair;positive;0;0;0;0;0;0 -6589;féroce;negative;0;1;0;1;0;1 -6590;férocité;negative;0;1;0;1;0;0 -6591;ferry;positive;0;0;0;0;0;0 -6592;fertile;positive;0;0;0;0;0;0 -6593;fertiliser;positive;0;0;0;0;0;0 -6594;fesse;positive;0;0;0;0;0;0 -6595;fesser;negative;0;1;1;1;0;0 -6596;festival;positive;0;0;0;0;1;0 -6597;fêter;positive;0;0;0;0;1;0 -6598;fétiche;negative;0;0;0;1;0;0 -6599;feu d artifice;positive;0;0;0;0;1;0 -6600;feu de joie;positive;1;0;0;0;0;0 -6601;feuillage;positive;0;0;0;0;0;0 -6602;feuille;positive;0;0;0;0;0;0 -6603;feuilleter;positive;0;0;0;0;0;0 -6604;feuilleton;positive;0;0;0;0;0;0 -6605;feuillu;positive;0;0;0;0;0;0 -6606;fiabilité;positive;0;0;0;0;0;0 -6607;fiable;positive;0;0;0;0;0;0 -6608;fiançailles;positive;0;0;0;0;0;0 -6609;fiancer;positive;0;0;0;0;0;0 -6610;fibre;positive;0;0;0;0;0;0 -6611;fibreux;negative;0;0;0;0;0;1 -6612;fiche;negative;0;1;0;0;0;0 -6613;fiche de renseignement;positive;0;0;0;0;0;0 -6614;fichier;positive;0;0;0;0;0;0 -6615;ficher;negative;0;0;0;1;0;1 -6616;fictif;negative;0;0;0;1;0;1 -6617;fiction;positive;0;0;0;0;0;0 -6618;fidélité;positive;0;0;0;0;0;0 -6619;fiduciaire;positive;0;0;0;0;0;0 -6620;fierté;positive;1;0;0;0;0;0 -6621;fiesta;positive;0;0;0;0;1;0 -6622;fièvre;negative;0;1;0;0;0;0 -6623;figer;negative;0;0;1;0;0;0 -6624;figure;positive;0;0;0;0;0;0 -6625;figurer;positive;0;0;0;0;0;0 -6626;figurine;positive;0;0;0;0;0;0 -6627;fil de fer;positive;0;0;0;0;0;0 -6628;fil dentaire;negative;0;0;0;0;0;1 -6629;filage;negative;0;1;0;0;0;0 -6630;filament;negative;0;0;0;0;0;0 -6631;filamenteux;negative;0;0;0;0;0;1 -6632;filer à tout vitesse;negative;0;1;0;0;1;0 -6633;filetage;negative;0;0;0;0;0;0 -6634;filial;negative;0;0;0;0;0;0 -6635;filiation;positive;0;0;0;0;0;0 -6636;filière;positive;0;0;0;0;0;0 -6637;filigrane;positive;0;0;0;0;0;0 -6638;fille;positive;1;0;0;0;0;0 -6639;fille de joie;negative;0;0;0;1;0;1 -6640;film;positive;0;0;0;0;0;0 -6641;filmer;positive;0;0;0;0;0;0 -6642;fil|fils;positive;0;0;0;0;0;0 -6643;filtre;positive;0;0;0;0;0;0 -6644;filtrer;positive;0;0;0;0;0;0 -6645;finalement;positive;0;0;0;0;1;1 -6646;finalisation;positive;1;0;0;0;0;0 -6647;finalité;negative;0;0;1;0;0;0 -6648;finance;positive;0;0;0;0;0;0 -6649;financer;positive;0;0;0;0;0;0 -6650;financier;positive;0;0;0;0;0;0 -6651;finesse;positive;0;0;0;0;0;0 -6652;finir;negative;0;1;1;0;0;0 -6653;finition;positive;0;0;0;0;0;0 -6654;fiole;positive;0;0;0;0;0;0 -6655;firmament;positive;0;0;0;0;0;0 -6656;firme;positive;0;0;0;0;0;0 -6657;fiscal;positive;0;0;0;0;0;0 -6658;fissile;negative;0;0;0;0;0;0 -6659;fission;negative;0;1;0;0;1;0 -6660;fissuration;negative;0;1;0;1;0;0 -6661;fissurer;negative;0;1;1;1;0;0 -6662;fistule;negative;0;0;0;0;0;1 -6663;fixer;positive;0;0;0;0;0;0 -6664;fixement;negative;0;1;0;1;0;0 -6665;fixer du regard;negative;0;1;0;1;1;0 -6666;fixer le prix;positive;0;0;0;0;0;0 -6667;flacon;positive;0;0;0;0;0;0 -6668;flairer;positive;0;0;0;0;0;0 -6669;flambeau;positive;0;0;0;0;0;0 -6670;flamber;negative;0;1;0;1;0;0 -6671;flamboiement;positive;0;0;0;0;1;0 -6672;flamboyant;negative;0;0;0;1;0;0 -6673;flanelle;positive;0;0;0;0;0;0 -6674;flâneur;positive;1;0;0;0;0;0 -6675;flanquer;negative;0;0;0;0;0;0 -6676;flash;negative;0;1;0;0;1;0 -6677;flash back;positive;0;0;0;0;1;0 -6678;flasque;negative;0;0;1;0;0;1 -6679;flatter qqn servilement;negative;0;0;0;0;0;0 -6680;flatterie;positive;0;0;0;0;0;0 -6681;flatulence;negative;0;0;0;0;0;1 -6682;flèche;positive;0;1;0;0;1;0 -6683;fléchette;negative;0;1;0;0;0;0 -6684;fléchir;negative;0;0;1;0;0;0 -6685;fléchissement;negative;0;0;1;0;0;0 -6686;flétrir;negative;0;0;1;0;0;1 -6687;fleur;positive;1;0;0;0;0;0 -6688;fleuret;positive;0;0;0;0;0;0 -6689;fleurir;positive;1;0;0;0;0;0 -6690;fleuriste;positive;0;0;0;0;0;0 -6691;fleuve;positive;0;0;0;0;0;0 -6692;flexibilité;positive;0;0;0;0;0;0 -6693;flexible;positive;0;0;0;0;0;0 -6694;flexion;positive;0;0;0;0;0;0 -6695;flic;negative;0;1;0;0;0;0 -6696;flirt;positive;0;0;0;0;1;0 -6697;flirter;positive;1;0;0;0;0;0 -6698;flocon;negative;0;0;0;0;0;0 -6699;flocon de neige;positive;0;0;0;0;0;0 -6700;flop;negative;0;0;0;0;0;1 -6701;floraison;positive;1;0;0;0;0;0 -6702;floral;positive;1;0;0;0;0;0 -6703;flore;positive;0;0;0;0;0;0 -6704;florir;positive;0;0;0;0;0;0 -6705;florissant;positive;0;0;0;0;0;0 -6706;flottabilité;positive;0;0;0;0;0;0 -6707;flottant;positive;0;0;0;0;0;0 -6708;flotte;positive;0;0;0;0;0;0 -6709;flottement;positive;0;0;0;0;0;0 -6710;flotter;positive;0;0;0;0;0;0 -6711;flotteur;positive;0;0;0;0;0;0 -6712;flou;negative;0;1;1;0;0;0 -6713;flou|flous;negative;0;1;1;0;0;0 -6714;fluctuer;positive;0;0;0;0;0;0 -6715;fluctuant;positive;0;0;0;0;0;0 -6716;fluctuation;negative;0;1;0;1;0;0 -6717;fluide;positive;0;0;0;0;0;0 -6718;fluidité;positive;1;0;0;0;0;0 -6719;fluo;positive;0;0;0;0;0;0 -6720;fluorescence;positive;0;0;0;0;0;0 -6721;fluorescent;positive;0;0;0;0;0;0 -6722;fluos;positive;0;0;0;0;0;0 -6723;flûte;positive;0;0;0;0;0;0 -6724;flûtiste;positive;0;0;0;0;0;0 -6725;fluvial;positive;0;0;0;0;0;0 -6726;flyer;positive;0;0;0;0;0;0 -6727;foc;positive;0;0;0;0;0;0 -6728;focal;positive;0;0;0;0;0;0 -6729;focaliser;positive;0;0;0;0;0;0 -6730;foi;positive;0;0;0;0;0;0 -6731;foi|fois;positive;0;0;0;0;0;0 -6732;folie;positive;1;0;0;0;0;0 -6733;folio;positive;0;0;0;0;0;0 -6734;folk;positive;0;0;0;0;0;0 -6735;folklore;positive;1;0;0;0;0;0 -6736;folliculaire;negative;0;0;0;0;0;0 -6737;follicule;negative;0;0;0;0;0;0 -6738;fonction;positive;0;0;0;0;0;0 -6739;fonctionner;positive;0;0;0;0;0;0 -6740;fond de cale;negative;0;1;1;0;0;1 -6741;fondamental;positive;0;0;0;0;0;0 -6742;fondamentalement;positive;0;0;0;0;0;0 -6743;fondant;negative;0;0;0;0;0;0 -6744;fondation;positive;0;0;0;0;0;0 -6745;fondement;positive;0;0;0;0;0;0 -6746;fonder;positive;0;0;0;0;0;0 -6747;fonderie;positive;0;0;0;0;0;0 -6748;fondre;negative;0;0;0;0;0;0 -6749;fondre sur;negative;0;1;0;1;1;0 -6750;fond|fonds;positive;0;0;0;0;0;0 -6751;fontaine;positive;0;0;0;0;0;0 -6752;fonte;negative;0;1;0;0;0;0 -6753;foot;positive;0;0;0;0;0;0 -6754;football;positive;0;0;0;0;0;0 -6755;forceps;negative;0;1;0;0;0;0 -6756;forer;negative;0;1;0;1;0;0 -6757;forêt verdoyant;positive;0;0;0;0;0;0 -6758;foreuse;negative;0;1;0;1;0;0 -6759;forge;positive;0;0;0;0;0;0 -6760;forger;positive;0;0;0;0;0;0 -6761;forgeron;positive;0;0;0;0;0;0 -6762;formalisme;negative;0;0;0;0;0;0 -6763;formalité;positive;0;0;0;0;0;0 -6764;formation;positive;0;0;0;0;0;0 -6765;former;positive;0;0;0;0;0;0 -6766;forme indistinct;negative;0;1;0;0;0;1 -6767;forme physique;positive;0;0;0;0;0;0 -6768;former un crôute;negative;0;0;0;0;0;1 -6769;formidable;positive;0;0;1;0;1;0 -6770;formulaire;positive;0;0;0;0;0;0 -6771;formulation;positive;0;0;0;0;0;0 -6772;formule;positive;0;0;0;0;0;0 -6773;formuler;positive;0;0;0;0;0;0 -6774;formuler un plainte;negative;0;0;1;1;0;0 -6775;fornication;negative;0;0;0;0;0;1 -6776;fortifiant;positive;0;0;0;0;0;0 -6777;fortification;positive;0;0;0;0;0;0 -6778;fortifier;positive;0;0;0;0;0;0 -6779;fortuit;negative;0;0;0;0;1;0 -6780;fortune;positive;0;0;0;0;1;0 -6781;fortuné;positive;1;0;0;0;0;0 -6782;forum;positive;0;0;0;0;0;0 -6783;fossile;negative;0;0;0;0;0;0 -6784;fots;positive;0;0;0;0;0;0 -6785;fou de joie;positive;0;0;0;0;1;0 -6786;fou folle|fou;negative;0;1;0;1;0;0 -6787;fou furieux;negative;0;1;0;1;0;1 -6788;foudre;negative;0;1;0;1;1;0 -6789;fouet;negative;0;1;0;1;0;0 -6790;fouetter;negative;0;1;1;1;0;1 -6791;fougère;negative;0;0;0;0;0;1 -6792;fouille;negative;0;0;0;0;1;0 -6793;fouiner;negative;0;0;0;1;0;1 -6794;foulard;positive;0;0;0;0;0;0 -6795;foule;negative;0;1;0;1;1;1 -6796;fouler;positive;0;0;0;0;0;0 -6797;foulure;negative;0;1;1;0;1;0 -6798;four;positive;0;0;0;0;0;0 -6799;fourbe;negative;0;1;1;1;0;1 -6800;fourche;positive;0;0;0;0;0;0 -6801;fourchette;positive;0;0;0;0;0;0 -6802;fourchu;negative;0;1;0;0;0;0 -6803;fourguer;negative;0;0;0;0;0;0 -6804;fourmi;negative;0;1;0;0;0;1 -6805;fourmiller;negative;0;1;0;1;0;0 -6806;fourmillant;negative;0;1;0;1;0;0 -6807;fourmillement;negative;0;1;0;1;0;0 -6808;fournaise;negative;0;0;0;1;0;0 -6809;fournée;positive;0;0;0;0;0;0 -6810;fournir;positive;0;0;0;0;0;0 -6811;fournisseur;positive;0;0;0;0;0;0 -6812;fourniture;positive;0;0;0;0;0;0 -6813;fourniture de bureau;positive;0;0;0;0;0;0 -6814;fourrer;negative;0;1;0;0;0;0 -6815;fourre tout;negative;0;0;0;0;0;0 -6816;fourreau;negative;0;0;0;0;0;0 -6817;fourrure;positive;0;0;0;0;0;0 -6818;fourvoyer;negative;0;1;0;1;0;0 -6819;foutaise;negative;0;0;1;1;0;1 -6820;foutre;negative;0;1;1;1;0;1 -6821;foyer;positive;0;0;0;0;0;0 -6822;fracas;negative;0;1;0;1;1;0 -6823;fracasser;negative;0;1;1;0;1;0 -6824;fraction;positive;0;0;0;0;0;0 -6825;fractionnaire;positive;0;0;0;0;0;0 -6826;fractionner;positive;0;0;0;0;0;0 -6827;fracture;negative;0;1;1;0;0;0 -6828;fracturer;negative;0;1;1;0;0;0 -6829;fragile;negative;0;1;1;0;1;0 -6830;fragilité;negative;0;1;1;0;0;0 -6831;fragment;positive;0;0;0;0;0;0 -6832;fragmentaire;positive;0;0;0;0;0;0 -6833;frais de scolarité;positive;0;0;0;0;0;0 -6834;frais général;positive;0;0;0;0;0;0 -6835;fraise;positive;0;0;0;0;0;0 -6836;franchement;positive;0;0;0;0;0;0 -6837;franchir;positive;0;0;0;0;0;0 -6838;franchise;positive;0;0;0;0;0;0 -6839;franchiser;positive;0;0;0;0;0;0 -6840;franchissement;positive;0;0;0;0;0;0 -6841;frange;positive;0;0;0;0;0;0 -6842;franger;positive;0;0;0;0;0;0 -6843;frange de lit;positive;0;0;0;0;0;0 -6844;frapper;negative;0;1;0;0;1;0 -6845;frappant;negative;0;1;0;0;1;0 -6846;frappeur;negative;0;1;0;1;0;0 -6847;fraternellement;positive;0;0;0;0;0;0 -6848;fraternité;positive;0;0;0;0;0;0 -6849;fraude;negative;0;0;0;1;0;0 -6850;frauder;negative;0;0;0;1;0;1 -6851;fredonnement;negative;0;1;0;0;0;0 -6852;fredonner;negative;0;1;0;0;0;0 -6853;freelance;positive;0;0;0;0;0;0 -6854;frégate;positive;0;1;0;0;0;0 -6855;frein;negative;0;1;0;0;1;0 -6856;freiner;negative;0;1;0;0;1;0 -6857;frelater;negative;0;0;1;1;0;0 -6858;frêle;negative;0;1;1;0;0;0 -6859;frelon;negative;0;1;0;0;0;0 -6860;frémissement;negative;0;1;0;0;0;0 -6861;frêne;negative;0;1;0;0;0;0 -6862;frénésie;negative;0;1;0;1;0;0 -6863;frénétique;negative;0;1;0;1;1;1 -6864;fréquemment;positive;0;0;0;0;0;0 -6865;fréquence;positive;0;0;0;0;0;0 -6866;fréquent;positive;0;0;0;0;0;0 -6867;fréquenter;positive;0;0;0;0;0;0 -6868;frère;positive;0;0;0;0;0;0 -6869;fresque;positive;0;0;0;0;0;0 -6870;fret;positive;0;0;0;0;0;0 -6871;frêt;positive;0;0;0;0;0;0 -6872;frétillement;positive;0;0;0;0;1;0 -6873;friable;negative;0;1;1;0;0;0 -6874;friandise;positive;1;0;0;0;0;0 -6875;friction;negative;0;0;0;1;0;1 -6876;frigide;negative;0;1;1;0;0;1 -6877;fringant;positive;0;0;0;0;1;0 -6878;fripe;negative;0;0;1;0;0;1 -6879;fripouille;negative;0;0;0;0;0;1 -6880;frire;negative;0;0;0;0;0;1 -6881;friser;positive;0;0;0;0;0;0 -6882;frisquet;negative;0;0;0;0;0;0 -6883;frissonner;negative;0;1;0;0;0;0 -6884;frissonnant;negative;0;1;0;0;0;0 -6885;frivole;negative;0;0;0;0;0;1 -6886;froidement;negative;0;0;1;0;0;0 -6887;froideur;negative;0;1;1;1;0;1 -6888;froisser;negative;0;0;1;0;0;0 -6889;froissement;negative;0;1;0;0;1;0 -6890;froncer le sourcil;negative;0;0;1;1;0;1 -6891;froncement;negative;0;0;1;1;0;0 -6892;fronde;negative;0;1;0;1;0;0 -6893;frontal;positive;0;0;0;0;0;0 -6894;frontalier;positive;0;0;0;0;0;0 -6895;frontispice;positive;0;0;0;0;0;0 -6896;frotter;negative;0;0;0;0;0;0 -6897;frottement;negative;0;1;0;1;0;1 -6898;frottis;negative;0;0;0;0;0;1 -6899;froussard;negative;0;1;1;1;0;1 -6900;frugal;positive;0;0;0;0;0;0 -6901;fruit;positive;0;0;0;0;0;0 -6902;fruit de mer;negative;0;0;0;0;0;1 -6903;frustration;negative;0;0;1;1;0;0 -6904;frustrer;negative;0;0;1;1;0;0 -6905;fugace;negative;0;1;1;0;1;0 -6906;fuir;negative;0;1;1;1;0;1 -6907;fulgurer;negative;0;1;0;0;1;0 -6908;fulgurant;negative;0;1;0;0;1;0 -6909;fulminer;negative;0;0;0;1;0;0 -6910;fumer;negative;0;0;0;0;0;1 -6911;fumeur;negative;0;0;0;0;0;1 -6912;fumier;negative;0;0;0;0;0;1 -6913;fumigation;negative;0;1;0;0;0;1 -6914;funérailles;negative;0;0;1;0;0;0 -6915;funk;negative;0;0;1;0;0;0 -6916;fureur;negative;0;1;1;1;0;0 -6917;furieusement;negative;0;0;0;1;0;0 -6918;furtivement;positive;0;0;0;0;1;0 -6919;fusain;negative;0;0;0;0;0;1 -6920;fuseau;positive;0;0;0;0;0;0 -6921;fuser;negative;0;1;0;1;0;0 -6922;fusée éclairant;positive;0;0;0;0;1;0 -6923;fusible;positive;0;0;0;0;0;0 -6924;fusil;negative;0;1;0;1;0;0 -6925;fusil de chasse;negative;0;1;0;0;0;0 -6926;fusillade;negative;0;1;1;1;0;0 -6927;fusionner;positive;0;0;0;0;0;0 -6928;fût;positive;0;0;0;0;0;0 -6929;futilité;negative;0;0;0;0;0;1 -6930;futur;positive;0;0;0;0;0;0 -6931;futur marié;positive;0;0;0;0;0;0 -6932;gâcher;negative;0;1;1;1;0;1 -6933;gâchette;negative;0;1;0;0;0;0 -6934;gaffe;negative;0;1;1;0;1;1 -6935;gage;positive;0;0;0;0;0;0 -6936;gagner pain;positive;0;0;0;0;0;0 -6937;gagner;positive;1;0;0;0;0;0 -6938;gagner net;positive;0;0;0;0;0;0 -6939;gai;positive;0;0;0;0;1;0 -6940;gaieté;positive;0;0;0;0;1;0 -6941;gainage;negative;0;0;0;0;0;0 -6942;gainer;negative;0;0;0;0;0;0 -6943;gaine;negative;0;1;1;0;0;0 -6944;gala;positive;0;0;0;0;0;0 -6945;galant;positive;0;0;0;0;0;0 -6946;galanterie;positive;0;0;0;0;0;0 -6947;galaxie;positive;0;0;0;0;0;0 -6948;galber;positive;0;0;0;0;0;0 -6949;gale;negative;0;1;0;0;0;1 -6950;galère;negative;0;1;1;0;0;0 -6951;galerie;positive;0;0;0;0;0;0 -6952;galerie marchand;positive;0;0;0;0;0;0 -6953;galet;positive;0;0;0;0;0;0 -6954;galon;positive;0;0;0;0;0;0 -6955;galop;positive;0;0;0;0;0;0 -6956;galoper;positive;0;0;0;0;0;0 -6957;galvanique;positive;1;0;0;0;0;0 -6958;galvaniser;positive;1;0;0;0;0;0 -6959;galvanisant;positive;1;0;0;0;0;0 -6960;gambader;positive;1;0;0;0;0;0 -6961;gamelle;positive;0;0;0;0;0;0 -6962;gamme;positive;1;0;0;0;0;0 -6963;gang;negative;0;1;0;1;0;0 -6964;gant;positive;0;0;0;0;0;0 -6965;gantelet;positive;0;0;0;0;0;0 -6966;garage;positive;0;0;0;0;0;0 -6967;garantir;positive;0;0;0;0;0;0 -6968;garantiesjustifiés;positive;0;0;0;0;0;0 -6969;garçon;positive;0;0;0;0;0;1 -6970;garçonne;positive;0;0;0;0;0;0 -6971;garde à vue;negative;0;1;1;1;0;0 -6972;garde du corps;positive;0;0;0;0;0;0 -6973;garde boue;positive;0;0;0;0;0;0 -6974;garder manger;positive;0;0;0;0;0;0 -6975;garde meuble;positive;0;0;0;0;0;0 -6976;garde robe;positive;0;0;0;0;0;0 -6977;garder;positive;0;0;0;0;0;0 -6978;garde;positive;0;0;0;0;0;0 -6979;gardien de prison gardien;negative;0;1;0;1;0;0 -6980;gardien gardien;negative;0;1;0;1;0;0 -6981;gare;positive;0;0;0;0;0;0 -6982;garenne;positive;0;0;0;0;0;0 -6983;garer;positive;0;0;0;0;0;0 -6984;garnir;positive;0;0;0;0;0;0 -6985;garnison;positive;0;0;0;0;0;0 -6986;garnissage;positive;0;0;0;0;0;0 -6987;garniture;positive;0;0;0;0;0;0 -6988;garrot;negative;0;1;0;0;0;0 -6989;gaspillage;negative;0;1;1;0;0;1 -6990;gaspiller;negative;0;0;1;1;0;1 -6991;gastrique;negative;0;0;0;0;0;1 -6992;gastronomie;positive;0;0;0;0;0;0 -6993;gastronomique;positive;0;0;0;0;0;0 -6994;gâteau;positive;0;0;0;0;0;0 -6995;gâteau au fromage;positive;0;0;0;0;0;0 -6996;gauche;negative;0;1;0;0;0;1 -6997;gaucherie;negative;0;1;0;0;0;1 -6998;gauchir;negative;0;0;0;0;0;1 -6999;gauchissement;negative;0;0;1;1;0;0 -7000;gaufrer;negative;0;0;0;0;0;0 -7001;gaufrette;positive;0;0;0;0;0;0 -7002;gay;negative;0;1;0;0;0;0 -7003;gays;negative;0;1;0;0;0;0 -7004;gaz;negative;0;0;0;0;0;1 -7005;gaze;positive;0;0;0;0;0;0 -7006;gazéification;negative;0;0;0;0;0;0 -7007;gazelle;positive;0;0;0;0;0;0 -7008;gazetier;positive;0;0;0;0;0;0 -7009;gazette;positive;0;0;0;0;0;0 -7010;gazeuse;negative;0;0;0;0;0;1 -7011;gazeux;negative;0;0;0;0;0;1 -7012;gazoduc;positive;0;0;0;0;0;0 -7013;gazon;positive;0;0;0;0;0;0 -7014;gazouiller;positive;1;0;0;0;0;0 -7015;geai;positive;0;0;0;0;0;0 -7016;géantses;negative;0;1;0;0;0;0 -7017;geindre;negative;0;1;1;0;0;1 -7018;gel;negative;0;1;1;0;0;1 -7019;gélatine;negative;0;0;0;0;0;1 -7020;geler;negative;0;0;1;0;0;0 -7021;gelure;negative;0;1;1;0;0;1 -7022;gémeau;positive;0;0;0;0;0;0 -7023;gémir;negative;0;1;1;0;0;1 -7024;gémissement;negative;0;1;1;0;0;1 -7025;gênant;negative;0;1;0;0;0;0 -7026;gêne;negative;0;0;1;0;0;1 -7027;généalogie;positive;0;0;0;0;0;0 -7028;général;positive;0;0;0;0;0;0 -7029;généralement;positive;0;0;0;0;0;0 -7030;général|générale;positive;0;0;0;0;0;0 -7031;généralisation;negative;0;0;0;0;0;0 -7032;généralité;positive;0;0;0;0;0;0 -7033;générals;positive;0;0;0;0;0;0 -7034;générateur;positive;0;0;0;0;0;0 -7035;génération;positive;0;0;0;0;0;0 -7036;générer;positive;0;0;0;0;0;0 -7037;générique;positive;0;0;0;0;0;0 -7038;générosité;positive;0;0;0;0;1;0 -7039;genèse;positive;0;0;0;0;0;0 -7040;génétique;positive;0;0;0;0;0;0 -7041;génial;positive;0;0;1;0;0;0 -7042;génie;positive;0;0;0;0;0;0 -7043;génisse;positive;0;0;0;0;0;0 -7044;génital;negative;0;0;0;0;0;1 -7045;géniteur;positive;0;0;0;0;0;0 -7046;genou;positive;0;0;0;0;0;0 -7047;gens;positive;0;0;0;0;0;0 -7048;gentil;positive;0;0;0;0;0;0 -7049;gentilhomme;positive;0;0;0;0;0;0 -7050;gentillesse;positive;0;0;0;0;0;0 -7051;géographie;positive;0;0;0;0;0;0 -7052;geôle;negative;0;1;1;1;0;0 -7053;géologie;positive;0;0;0;0;0;0 -7054;géométrie;positive;0;0;0;0;0;0 -7055;gérance;positive;0;0;0;0;0;0 -7056;géranium;positive;0;0;0;0;0;0 -7057;gérant;positive;0;0;0;0;0;0 -7058;gerbe;negative;0;0;1;0;0;0 -7059;gerber;negative;0;0;0;0;0;1 -7060;gérer;positive;0;0;0;0;0;0 -7061;gériatrique;negative;0;0;1;0;0;0 -7062;germer;negative;0;0;0;0;0;1 -7063;germination;negative;0;0;0;0;0;0 -7064;gestation;positive;0;0;0;0;0;0 -7065;geste;positive;0;0;0;0;0;0 -7066;gestion;positive;0;0;0;0;0;0 -7067;gestionnaire;positive;0;0;0;0;0;0 -7068;ghetto;negative;0;1;1;0;0;1 -7069;gicler;negative;0;1;0;0;1;0 -7070;gifle;negative;0;0;0;1;1;0 -7071;gifler;negative;0;0;0;1;1;0 -7072;gigantesque;negative;0;1;0;0;0;0 -7073;gilet;positive;0;0;0;0;0;0 -7074;gin;positive;0;0;0;0;0;0 -7075;gingembre;negative;0;0;0;0;0;0 -7076;girafe;positive;0;0;0;0;0;0 -7077;girouette;positive;0;0;0;0;0;0 -7078;gisant;negative;0;1;1;1;0;1 -7079;givre;negative;0;0;1;0;0;0 -7080;givrer;negative;0;0;1;0;0;0 -7081;glabre;negative;0;0;0;0;0;0 -7082;glace;negative;0;0;0;0;0;0 -7083;glacer;negative;0;1;1;0;0;0 -7084;glaciaire;negative;0;1;1;0;0;0 -7085;glacial;negative;0;1;1;0;0;0 -7086;glacier;negative;0;0;0;0;0;0 -7087;glacière;positive;0;0;0;0;0;0 -7088;gladiateur;negative;0;1;0;1;0;0 -7089;glaiciales;negative;0;1;1;0;0;0 -7090;glaire;negative;0;0;0;0;0;1 -7091;glaise;positive;0;0;0;0;0;0 -7092;gland;positive;0;0;0;0;0;0 -7093;glaner;negative;0;0;0;0;0;0 -7094;glapir;negative;0;1;0;1;1;0 -7095;glapissement;negative;0;1;0;1;1;0 -7096;glas;negative;0;1;1;0;0;0 -7097;glissade;negative;0;1;0;0;1;0 -7098;glisser;negative;0;0;0;0;0;0 -7099;glissant;negative;0;0;0;0;0;0 -7100;glissement;negative;0;1;0;0;0;0 -7101;glissement de terrain;negative;0;1;1;0;0;0 -7102;globe;positive;0;0;0;0;0;0 -7103;globulaire;positive;0;0;0;0;0;0 -7104;gloire;positive;0;0;0;0;0;0 -7105;glorification;positive;1;0;0;0;0;0 -7106;glorifier;positive;0;0;0;0;0;0 -7107;glossaire;positive;0;0;0;0;0;0 -7108;gloussement;positive;0;0;0;0;1;0 -7109;glousser;positive;0;0;0;0;1;0 -7110;gloutonnerie;negative;0;0;0;0;0;1 -7111;gluer;negative;0;0;0;0;0;1 -7112;gluant;negative;0;0;0;0;0;1 -7113;glucose;positive;0;0;0;0;0;0 -7114;gluten;negative;0;0;0;0;0;0 -7115;glycérine;negative;0;0;0;0;0;1 -7116;gnome;negative;0;1;0;1;0;1 -7117;gobelet;positive;0;0;0;0;0;0 -7118;gobelin;negative;0;1;0;0;0;1 -7119;goéland;negative;0;1;0;0;0;1 -7120;goélette;negative;0;0;0;0;0;0 -7121;goguenard;negative;0;0;1;1;0;1 -7122;goinfre;negative;0;0;0;0;0;1 -7123;golden retriever;positive;0;0;0;0;0;0 -7124;golf;positive;0;0;0;0;0;0 -7125;golfe;negative;0;1;0;0;0;0 -7126;gomme;negative;0;0;0;0;0;0 -7127;gond;positive;0;0;0;0;0;0 -7128;gondole;positive;0;0;0;0;0;0 -7129;gonflage;negative;0;1;0;1;0;0 -7130;gonfler;negative;0;1;0;1;0;1 -7131;gonflement;negative;0;1;0;0;0;1 -7132;gong;negative;0;1;0;0;1;0 -7133;gonorrhée;negative;0;1;1;1;0;1 -7134;gorge;negative;0;1;0;0;0;1 -7135;gorger;positive;0;1;0;0;1;1 -7136;gorille;negative;0;1;0;1;0;0 -7137;gospel;positive;0;0;0;0;0;0 -7138;gosse;positive;0;0;0;0;0;0 -7139;goudron;negative;0;0;0;0;0;1 -7140;goudronner;negative;0;0;0;0;0;1 -7141;goudronneuse;negative;0;0;0;0;0;1 -7142;goudronneux;negative;0;0;0;0;0;1 -7143;gouffre;negative;0;1;0;0;0;0 -7144;gouge;positive;0;0;0;0;0;0 -7145;goujat;negative;0;0;0;1;0;1 -7146;goulag;negative;0;1;1;0;0;0 -7147;gourmand;negative;0;0;0;0;0;1 -7148;gourmandise;negative;0;0;0;1;0;1 -7149;gourmet;positive;0;0;0;0;0;0 -7150;gourou;negative;0;1;0;1;0;1 -7151;gousset;positive;0;0;0;0;0;0 -7152;goût;positive;0;0;1;0;0;1 -7153;goût piquant;positive;0;0;0;0;1;1 -7154;goûter;positive;0;0;0;0;0;0 -7155;goûteur|goûteux;positive;1;0;0;0;0;0 -7156;goûteux;positive;1;0;0;0;0;0 -7157;goutte;negative;0;1;1;0;0;1 -7158;goutte à goutte;negative;0;0;0;0;0;0 -7159;gouttelette;negative;0;0;0;0;0;0 -7160;goutter;negative;0;0;0;0;0;0 -7161;gouttière;negative;0;0;0;0;0;1 -7162;gouvernail;positive;0;0;0;0;0;0 -7163;gouvernant;positive;0;0;0;0;0;0 -7164;gouvernement;positive;0;1;0;0;0;0 -7165;gouverner;positive;0;0;0;0;0;0 -7166;gouverneur;positive;0;0;0;0;0;0 -7167;grace;positive;0;0;0;0;0;0 -7168;grâce;positive;0;0;0;0;0;0 -7169;gracieusement;positive;0;0;0;0;0;0 -7170;gradation;positive;0;0;0;0;0;0 -7171;grade;positive;0;0;0;0;0;0 -7172;gradin;positive;0;0;0;0;0;0 -7173;graduellement;positive;0;0;0;0;0;0 -7174;graine;positive;0;0;0;0;0;0 -7175;graissage;negative;0;0;0;0;0;1 -7176;graisse;negative;0;0;1;0;0;1 -7177;graisser;negative;0;0;0;0;0;1 -7178;graisseux;negative;0;0;0;0;0;1 -7179;grammaire;positive;0;0;0;0;0;0 -7180;gramme;positive;0;0;0;0;0;0 -7181;grand;positive;0;0;0;0;0;0 -7182;grand coup;negative;0;1;0;1;1;0 -7183;grand dam;negative;0;0;1;0;0;1 -7184;grand et maigre;negative;0;0;1;0;0;1 -7185;grand livre;positive;0;0;0;0;0;0 -7186;grand magasin;positive;0;0;0;0;0;0 -7187;grand mère;positive;0;0;0;0;0;0 -7188;grand père;positive;0;0;0;0;0;0 -7189;grandement;positive;0;0;0;0;0;0 -7190;grandeur;positive;0;0;0;0;1;0 -7191;grandiloquence;positive;0;0;0;0;0;0 -7192;grandiose;positive;0;0;0;0;1;0 -7193;grandir;positive;0;0;0;0;0;0 -7194;grange;positive;0;0;0;0;0;0 -7195;granite;positive;0;0;0;0;0;0 -7196;granule;negative;0;0;0;0;0;0 -7197;granuler;negative;0;0;0;0;0;0 -7198;graphique;positive;0;0;0;0;0;0 -7199;graphisme;positive;0;0;0;0;0;0 -7200;grappe;positive;0;0;0;0;0;0 -7201;grassouillet;negative;0;0;0;0;0;1 -7202;gratis;positive;0;0;0;0;0;0 -7203;gratitude;positive;0;0;0;0;0;0 -7204;grattage;negative;0;1;0;1;0;1 -7205;gratter ciel;positive;0;0;0;0;0;0 -7206;gratter;negative;0;1;1;1;1;0 -7207;gratuit;positive;0;0;0;0;0;1 -7208;gratuitement;positive;0;0;0;0;0;0 -7209;graver;positive;0;0;0;0;0;0 -7210;gravement;negative;0;0;1;0;0;0 -7211;gravier;negative;0;0;0;0;0;0 -7212;gravir;positive;0;1;0;0;0;0 -7213;gravitation;positive;0;0;0;0;0;0 -7214;graviter;positive;0;0;0;0;0;0 -7215;gravure;positive;0;0;0;0;0;0 -7216;gravure sur bois;positive;0;0;0;0;0;0 -7217;gré;positive;0;0;0;0;0;0 -7218;gréement;positive;0;0;0;0;0;0 -7219;greffe;positive;0;0;0;0;0;0 -7220;greffer;positive;0;0;0;0;0;0 -7221;greffier;positive;0;0;0;0;0;0 -7222;greffon;positive;0;0;0;0;0;0 -7223;grégaire;positive;0;0;0;0;0;0 -7224;grêlé;negative;0;1;1;0;0;0 -7225;grelotter;negative;0;1;0;0;0;0 -7226;grelottant;negative;0;1;0;0;0;0 -7227;grenade;negative;0;1;0;1;0;0 -7228;grenat;positive;0;0;0;0;0;0 -7229;grenier;positive;0;0;0;0;0;0 -7230;grenouille;negative;0;0;0;0;0;1 -7231;grès;positive;0;0;0;0;0;0 -7232;grésil;negative;0;1;1;0;0;1 -7233;grésillement;negative;0;1;0;1;0;0 -7234;grésiller;negative;0;1;0;1;0;0 -7235;grève;negative;0;0;0;1;0;0 -7236;gribouillage;negative;0;0;0;0;1;0 -7237;gribouiller;negative;0;0;0;0;1;0 -7238;grief;negative;0;0;1;1;0;1 -7239;griffe;negative;0;1;0;1;0;0 -7240;griffer;negative;0;1;0;1;1;0 -7241;griffon;positive;0;0;0;0;0;0 -7242;griffonner;negative;0;0;0;0;0;0 -7243;griffure;negative;0;1;0;1;1;0 -7244;grignoter;positive;0;0;0;0;0;0 -7245;grill;positive;0;0;0;0;0;0 -7246;grillage;negative;0;1;0;0;1;0 -7247;griller;negative;0;0;0;1;0;0 -7248;grillon;positive;0;0;0;0;0;0 -7249;grimace;negative;0;1;1;1;0;1 -7250;grimacer;negative;0;1;1;1;0;1 -7251;grimper;positive;0;1;0;0;0;0 -7252;grincer;negative;0;1;0;1;0;1 -7253;grincement;negative;0;1;1;1;1;0 -7254;grippe;negative;0;1;1;0;0;1 -7255;gris;negative;0;0;1;0;0;1 -7256;griser;negative;1;0;0;0;0;0 -7257;grisant;negative;1;0;0;0;0;0 -7258;gris|grise;negative;0;0;1;0;0;1 -7259;grisonnant;negative;0;0;1;0;0;1 -7260;grivois;negative;0;0;0;0;0;1 -7261;groggy;negative;0;0;1;0;1;0 -7262;groin;negative;0;0;0;0;0;1 -7263;grommeler;negative;0;1;1;1;0;1 -7264;grondement;negative;0;1;0;1;1;1 -7265;gros lot;positive;0;0;0;0;1;0 -7266;gros morceau;positive;0;0;0;0;0;0 -7267;gros titre;positive;0;0;0;0;0;0 -7268;grossesse;positive;0;0;0;0;0;1 -7269;grosseur;negative;0;1;0;0;0;0 -7270;grossièrement;negative;0;0;0;0;0;0 -7271;grossir;negative;0;0;0;0;0;0 -7272;grotesque;negative;0;0;0;0;0;1 -7273;grotte;negative;0;1;1;0;0;0 -7274;grouiller;negative;0;1;0;1;0;1 -7275;grouillant;negative;0;1;0;1;0;0 -7276;grouper;positive;0;0;0;0;0;0 -7277;groupement;positive;0;0;0;0;0;0 -7278;grue;positive;0;0;0;0;0;0 -7279;grumeleux;negative;0;0;0;0;0;1 -7280;gué;positive;0;0;0;0;0;0 -7281;guépard;negative;0;1;0;0;0;0 -7282;guêpe;negative;0;1;0;0;0;0 -7283;guérillero;negative;0;1;0;1;0;0 -7284;guérir;positive;0;0;0;0;0;0 -7285;guérison;positive;0;0;0;0;0;0 -7286;guerre;negative;0;1;1;1;0;0 -7287;guet;positive;0;0;0;0;0;0 -7288;guet apens;negative;0;1;0;1;1;0 -7289;guetteur;positive;0;0;0;0;0;0 -7290;gueule;negative;0;0;0;1;0;1 -7291;gueule|gueules;negative;0;0;0;0;0;1 -7292;guichet;positive;0;0;0;0;0;0 -7293;guidage;positive;0;0;0;0;0;0 -7294;guide;positive;0;0;0;0;0;0 -7295;guider;positive;0;0;0;0;0;0 -7296;guider un barque;positive;0;0;0;0;0;0 -7297;guilde;positive;0;0;0;0;0;0 -7298;guillotine;negative;0;1;1;1;0;1 -7299;guillotiner;negative;0;1;1;1;0;1 -7300;guinder;negative;0;0;1;0;0;1 -7301;guinée;positive;0;0;0;0;0;0 -7302;guirlande;positive;1;0;0;0;0;0 -7303;guitare;positive;0;0;0;0;0;0 -7304;gymnase;positive;0;0;0;0;0;0 -7305;gymnaste;positive;0;0;0;0;0;0 -7306;gymnastique;positive;0;0;0;0;0;0 -7307;gynécologie;negative;0;0;0;0;0;1 -7308;gyroscope;positive;0;0;0;0;0;0 -7309;habile;positive;0;0;0;0;0;0 -7310;habileté;positive;0;0;0;0;0;0 -7311;habiliter;positive;0;0;0;0;0;0 -7312;habiller;positive;0;0;0;0;0;0 -7313;habillement;positive;0;0;0;0;0;0 -7314;habitat;positive;0;0;0;0;0;0 -7315;habitation;positive;0;0;0;0;0;0 -7316;habiter;positive;0;0;0;0;0;0 -7317;habitude;positive;0;0;0;0;0;0 -7318;habituellement;positive;0;0;0;0;0;0 -7319;hacher;negative;0;1;0;0;0;0 -7320;hachette;negative;0;1;0;1;1;0 -7321;hachis;negative;0;0;0;1;0;0 -7322;hacienda;positive;0;0;0;0;0;0 -7323;haie;positive;0;0;0;0;0;0 -7324;haineux;negative;0;1;1;1;0;1 -7325;haïr;negative;0;1;1;1;0;1 -7326;hâle;positive;0;0;0;0;0;0 -7327;hâler;positive;0;0;0;0;0;0 -7328;haleine;positive;0;0;0;0;0;0 -7329;halètement;negative;0;1;0;0;1;0 -7330;haleter;negative;0;1;1;0;1;0 -7331;hall;positive;0;0;0;0;0;0 -7332;hallebardier;positive;0;0;0;0;0;0 -7333;hallucination;negative;0;1;0;0;0;0 -7334;halo;positive;0;0;0;0;0;0 -7335;halte;negative;0;1;1;1;0;0 -7336;haltère;negative;0;0;0;0;0;0 -7337;hamac;positive;0;0;0;0;0;0 -7338;hameau;positive;0;0;0;0;0;0 -7339;hameçon;negative;0;1;0;0;1;0 -7340;hanche;positive;0;0;0;0;0;0 -7341;handicap;negative;0;0;1;0;0;0 -7342;harceler;negative;0;1;0;1;0;0 -7343;harcèlement;negative;0;1;0;1;0;0 -7344;harde;negative;0;1;0;0;0;0 -7345;hardi;positive;0;0;0;0;0;0 -7346;harem;positive;0;0;0;0;0;0 -7347;harmonica;positive;0;0;0;0;0;0 -7348;harmonie;positive;0;0;0;0;0;0 -7349;harmonieusement;positive;0;0;0;0;0;0 -7350;harmonique;positive;0;0;0;0;0;0 -7351;harmoniser;positive;0;0;0;0;0;0 -7352;harnais;negative;0;1;1;0;0;0 -7353;harpe;positive;0;0;0;0;0;0 -7354;hasard;positive;0;0;0;0;1;0 -7355;hasard extraordinaire;positive;0;0;0;0;1;0 -7356;haschisch;negative;0;0;0;0;0;1 -7357;hâte;negative;0;0;0;1;0;0 -7358;hâter;negative;0;1;0;0;1;0 -7359;hâtivement;negative;0;1;0;0;1;0 -7360;hausse;positive;0;0;0;0;0;0 -7361;haussement d épaule;negative;0;0;0;0;0;0 -7362;hausser;positive;0;0;0;0;0;0 -7363;hausser le épaule;negative;0;0;0;0;0;0 -7364;haut et fort;negative;0;0;0;1;0;0 -7365;haut le c?ur;negative;0;0;0;0;0;1 -7366;haut parleur;positive;0;0;0;0;0;0 -7367;hautain;negative;0;0;0;1;0;1 -7368;hautbois;positive;0;0;0;0;0;0 -7369;haut terre;positive;0;0;0;0;0;0 -7370;hauteur;positive;0;0;0;0;0;0 -7371;havre;positive;0;0;0;0;0;0 -7372;hebdomadaire;positive;0;0;0;0;0;0 -7373;hébergement;positive;0;0;0;0;0;0 -7374;hébétement;negative;0;0;1;0;1;0 -7375;hébéter;negative;0;0;1;0;1;0 -7376;hectare;positive;0;0;0;0;0;0 -7377;hédonisme;positive;1;0;0;0;0;0 -7378;hégémonique;negative;0;1;1;0;0;0 -7379;hélicoïdal;positive;0;0;0;0;0;0 -7380;hématite;positive;0;0;0;0;0;0 -7381;hemi;positive;0;0;0;0;0;0 -7382;hémi;positive;0;0;0;0;0;0 -7383;hémisphère;positive;0;0;0;0;0;0 -7384;hémisphérique;positive;0;0;0;0;0;0 -7385;hémorragie;negative;0;1;1;0;0;1 -7386;hémorroïde;negative;0;0;0;0;0;1 -7387;hennir;negative;0;0;0;0;0;0 -7388;hennissement;negative;0;0;0;0;0;0 -7389;héraldique;positive;0;0;0;0;0;0 -7390;héraut;positive;0;0;0;0;0;0 -7391;herbacé;negative;0;0;0;0;0;0 -7392;herbe;negative;0;0;0;0;0;1 -7393;herbe à chat;negative;0;0;0;0;0;1 -7394;herbier;positive;0;0;0;0;0;0 -7395;héréditaire;positive;0;0;0;0;0;0 -7396;hérédité;positive;0;0;0;0;0;0 -7397;hérésie;negative;0;0;0;1;0;1 -7398;hérétique;negative;0;0;0;1;0;1 -7399;hérisser;negative;0;1;0;0;0;0 -7400;hérisser de pointe;negative;0;1;0;0;0;0 -7401;hérisson;positive;0;0;0;0;0;0 -7402;hériter;positive;0;0;0;0;0;0 -7403;héritier;positive;0;0;0;0;0;0 -7404;hermaphrodite;negative;0;0;0;0;1;1 -7405;herméneutique;positive;0;0;0;0;0;0 -7406;hernie;negative;0;1;1;0;0;1 -7407;héroïne;negative;0;0;0;0;0;1 -7408;héroïque;positive;0;0;0;0;1;0 -7409;héroïque;positive;0;0;0;0;1;0 -7410;héroïsme;positive;0;0;0;0;1;0 -7411;héro|héros;positive;0;0;0;0;1;0 -7412;herpès;negative;0;0;0;0;0;1 -7413;hésiter;negative;0;1;1;0;0;0 -7414;hésitant;negative;0;1;1;0;0;0 -7415;hésitation;negative;0;1;0;0;0;0 -7416;hétéroclite;positive;0;0;0;0;0;0 -7417;hétérogenéité;positive;0;0;0;0;0;0 -7418;hétérogénéité;positive;0;0;0;0;0;0 -7419;heure;positive;0;0;0;0;0;0 -7420;heure du coucher;positive;0;0;0;0;0;0 -7421;heureusement;positive;1;0;0;0;0;0 -7422;heurt;negative;0;1;0;1;0;0 -7423;heurter sur le côté;negative;0;0;0;0;0;0 -7424;hexagone;positive;0;0;0;0;0;0 -7425;hiatal;negative;0;1;0;0;1;0 -7426;hiatus;negative;0;1;0;0;1;0 -7427;hibernation;negative;0;0;1;0;0;0 -7428;hiberner;negative;0;0;1;0;0;0 -7429;hic;negative;0;1;0;0;1;0 -7430;hiérarchique;positive;0;0;0;0;0;0 -7431;highlands;positive;0;0;0;0;0;0 -7432;hilarant;positive;0;0;0;0;1;0 -7433;hilarité;positive;0;0;0;0;1;0 -7434;hippie;negative;0;0;0;0;0;1 -7435;hippique;positive;0;0;0;0;0;0 -7436;hirondelle;positive;0;0;0;0;0;0 -7437;hirsute;negative;0;0;0;0;0;1 -7438;hisser;positive;0;0;0;0;0;0 -7439;histoire;negative;0;0;1;1;0;0 -7440;histologie;positive;0;0;0;0;0;0 -7441;historiographie;positive;0;0;0;0;0;0 -7442;historique;positive;0;0;0;0;1;0 -7443;hiver;negative;0;0;1;0;0;0 -7444;hivernal;negative;0;0;1;0;0;0 -7445;hobby;positive;1;0;0;0;0;0 -7446;hocher le tête;positive;0;0;0;0;0;0 -7447;hocher de le tête;positive;0;0;0;0;0;0 -7448;hochet;negative;0;1;0;0;1;0 -7449;hockey;positive;0;0;0;0;0;0 -7450;holocauste;negative;0;1;1;1;0;1 -7451;homélie;positive;0;0;0;0;0;0 -7452;homéopathie;positive;0;0;0;0;0;0 -7453;homéopathique;positive;0;0;0;0;0;0 -7454;homicide;negative;0;1;1;1;0;1 -7455;hommage;positive;0;0;0;0;0;0 -7456;homme;positive;0;0;0;0;0;0 -7457;homme d état;positive;0;0;0;0;0;0 -7458;homme politique;positive;0;0;0;0;0;0 -7459;homogène;positive;0;0;0;0;0;0 -7460;homogénéité;positive;0;0;0;0;0;0 -7461;homologie;positive;0;0;0;0;0;0 -7462;homologue;positive;0;0;0;0;0;0 -7463;homonyme;positive;0;0;0;0;0;0 -7464;homosexualité;negative;0;0;0;0;0;0 -7465;homosexualité féminin;negative;0;0;0;0;0;0 -7466;hongre;negative;0;1;1;0;0;0 -7467;hongrer;negative;0;1;1;0;0;0 -7468;honnêteté;positive;0;0;0;0;0;0 -7469;honneur;positive;0;0;0;0;0;0 -7470;honorable;positive;0;0;0;0;0;0 -7471;honorer;positive;0;0;0;0;0;0 -7472;honte;negative;0;1;1;1;0;1 -7473;hôpital;negative;0;1;1;0;0;0 -7474;hoquet;negative;0;1;0;0;1;0 -7475;hoqueter;negative;0;1;0;0;1;0 -7476;horaire;positive;0;0;0;0;0;0 -7477;horde;negative;0;1;0;1;1;0 -7478;horizon;positive;0;0;0;0;0;0 -7479;horizontal;positive;0;0;0;0;0;0 -7480;horizontalement;positive;0;0;0;0;0;0 -7481;horloge;positive;0;0;0;0;0;0 -7482;horoscope;positive;0;0;0;0;0;0 -7483;horrifier;negative;0;1;1;0;1;1 -7484;horrifique;negative;0;1;1;1;0;1 -7485;hors de prix;negative;0;0;1;1;0;1 -7486;hors de propos;negative;0;1;0;0;0;0 -7487;hors du chemin;negative;0;1;1;0;0;0 -7488;hors jeu;negative;0;1;1;0;0;0 -7489;hors norme;positive;1;0;0;0;0;0 -7490;hors le loi;negative;0;1;0;1;0;0 -7491;horticole;positive;0;0;0;0;0;0 -7492;horticulture;positive;0;0;0;0;0;0 -7493;hospice;negative;0;0;1;0;0;0 -7494;hospitalité;positive;0;0;0;0;0;0 -7495;hostie;positive;0;0;0;0;0;0 -7496;hostile;negative;0;1;1;1;0;1 -7497;hôte;positive;0;0;0;0;0;0 -7498;hôtel;positive;0;0;0;0;0;0 -7499;hotte;positive;0;1;0;1;0;1 -7500;houe;negative;0;1;0;0;0;0 -7501;houle;negative;0;1;0;0;0;0 -7502;hourra;positive;1;0;0;0;0;0 -7503;huard;positive;0;0;0;0;0;1 -7504;huer;negative;0;1;0;1;1;1 -7505;huile;negative;0;0;0;0;0;1 -7506;huiler;negative;0;0;0;0;0;1 -7507;huitième;positive;0;0;0;0;0;0 -7508;huître;negative;0;0;0;0;0;1 -7509;hululement;negative;0;0;0;1;0;1 -7510;hululer;negative;0;0;0;1;0;1 -7511;humain;positive;0;0;0;0;0;0 -7512;humanitaire;positive;0;0;0;0;1;0 -7513;humanité;positive;0;0;0;0;0;0 -7514;humble;positive;0;0;1;0;0;1 -7515;humblement;positive;0;0;0;0;0;0 -7516;humeur;positive;0;0;0;0;0;0 -7517;humeur noir;negative;0;0;1;0;0;0 -7518;humide;negative;0;0;0;0;0;1 -7519;humidité;negative;0;0;0;0;0;1 -7520;humilier;negative;0;0;1;0;0;1 -7521;humiliant;negative;0;0;1;0;0;1 -7522;humiliation;negative;0;1;1;0;1;1 -7523;humilité;positive;0;0;0;0;0;0 -7524;hummer;positive;0;0;0;0;0;0 -7525;humoriste;positive;1;0;0;0;0;0 -7526;humoristique;positive;1;0;0;0;0;0 -7527;hutte;positive;0;0;1;0;0;1 -7528;hybride;negative;0;0;0;0;0;0 -7529;hydraulique;positive;0;0;0;0;0;0 -7530;hydre;negative;0;1;0;0;0;0 -7531;hydrocéphalie;negative;0;1;1;0;0;1 -7532;hydrodynamique;positive;0;0;0;0;0;0 -7533;hydrogène;positive;0;0;0;0;0;0 -7534;hydrographique;positive;0;0;0;0;0;0 -7535;hydrologie;positive;0;0;0;0;0;0 -7536;hydromel;positive;0;0;0;0;0;0 -7537;hygiène;positive;0;0;0;0;0;0 -7538;hygiéniqes;positive;0;0;0;0;0;0 -7539;hygiénique;positive;0;0;0;0;0;0 -7540;hymne;positive;0;0;1;0;0;0 -7541;hyper médiatisation;negative;0;0;0;0;0;0 -7542;hyperbole;negative;0;0;0;0;0;0 -7543;hypertrophie;negative;0;1;0;0;1;1 -7544;hypnotique;negative;0;1;0;0;0;0 -7545;hypocrisie;negative;0;0;0;1;0;1 -7546;hypocrite;negative;0;0;0;0;0;1 -7547;hypothèque;negative;0;1;1;0;0;0 -7548;hypothéquer;negative;0;1;1;0;0;0 -7549;hypothétique;negative;0;0;0;0;0;0 -7550;hystérie;negative;0;1;0;1;0;0 -7551;iceberg;negative;0;1;0;0;0;0 -7552;icône;positive;0;0;0;0;0;0 -7553;iconique;positive;0;0;0;0;0;0 -7554;iconographie;positive;0;0;0;0;0;0 -7555;idéalisme;positive;1;0;0;0;0;0 -7556;idéaliste;positive;0;0;0;0;0;0 -7557;idée;positive;0;0;0;0;0;0 -7558;idée faux;negative;0;1;0;1;0;1 -7559;idée fixe;negative;0;1;1;1;0;0 -7560;idem;positive;0;0;0;0;0;0 -7561;identification;positive;0;0;0;0;0;0 -7562;identifier;positive;0;0;0;0;0;0 -7563;identique;positive;0;0;0;0;0;0 -7564;identiquement;positive;0;0;0;0;0;0 -7565;identité;positive;0;0;0;0;0;0 -7566;idéologie;positive;0;0;0;0;0;0 -7567;idiomatique;positive;0;0;0;0;0;0 -7568;idiome;positive;0;0;0;0;0;0 -7569;idiotie;negative;0;0;1;1;0;1 -7570;idolâtrie;positive;0;1;0;0;0;1 -7571;idole;positive;1;0;0;0;0;0 -7572;if;positive;0;0;0;0;0;0 -7573;igloo;positive;0;0;0;0;0;0 -7574;igname;positive;0;0;0;0;0;0 -7575;igné;negative;0;0;0;0;0;0 -7576;ignoble;negative;0;1;0;1;0;1 -7577;ignorance;negative;0;0;1;0;0;0 -7578;ignorer;negative;0;0;1;0;0;1 -7579;ignorant;negative;0;0;1;0;0;1 -7580;il y avoir;positive;0;0;0;0;0;0 -7581;île;positive;0;0;0;0;0;0 -7582;illégal;negative;0;1;1;1;0;1 -7583;illégalement;negative;0;1;0;0;0;0 -7584;illégalité;negative;0;1;0;1;0;1 -7585;illicite;negative;0;1;1;1;0;1 -7586;illisible;negative;0;0;0;0;0;0 -7587;illogique;negative;0;0;0;0;0;0 -7588;illumination;positive;0;0;0;0;1;0 -7589;illuminer;positive;0;0;0;0;1;0 -7590;illusion;negative;0;1;1;1;1;0 -7591;illusionnisme;negative;0;1;0;0;1;0 -7592;illustratif;positive;0;0;0;0;0;0 -7593;illustration;positive;0;0;0;0;0;0 -7594;illustrer;positive;0;0;0;0;0;0 -7595;îlot;positive;0;0;0;0;0;0 -7596;image;positive;0;0;0;0;0;0 -7597;imagerie;positive;0;0;0;0;0;0 -7598;imaginaire;positive;0;0;0;0;0;0 -7599;imaginer;positive;0;0;0;0;0;0 -7600;imaginatif;positive;0;0;0;0;0;0 -7601;imagination;positive;0;0;0;0;0;0 -7602;imam;positive;0;0;0;0;0;0 -7603;imberbe;negative;0;0;0;0;0;0 -7604;imbiber;negative;0;0;0;0;0;1 -7605;imiter;negative;0;0;0;0;0;0 -7606;imitation;negative;0;0;0;1;1;1 -7607;immatriculation;positive;0;0;0;0;0;0 -7608;immature;negative;0;0;0;0;0;1 -7609;immaturité;negative;0;0;0;1;0;1 -7610;immédiat;positive;0;0;0;0;1;0 -7611;immédiatement;positive;0;0;0;0;1;0 -7612;immédiateté;positive;0;0;0;0;1;0 -7613;immémorial;positive;0;0;0;0;0;0 -7614;immerger;negative;0;1;1;0;1;0 -7615;immérité;negative;0;0;1;1;0;0 -7616;immersion;negative;0;1;0;0;0;0 -7617;immeuble;positive;0;0;0;0;0;0 -7618;immigration;positive;0;0;0;0;0;0 -7619;imminent;negative;0;1;0;0;1;0 -7620;immobile;negative;0;1;1;0;1;0 -7621;immobiliser;negative;0;1;0;1;1;0 -7622;immobilité;positive;0;1;1;0;0;0 -7623;immodéré;negative;0;0;0;1;0;0 -7624;immoral;negative;0;1;1;1;0;1 -7625;immoralité;negative;0;0;0;1;0;1 -7626;immortalité;positive;0;0;0;0;0;0 -7627;immortel;positive;0;0;1;0;0;0 -7628;immuable;positive;0;0;0;0;0;0 -7629;immunisation;positive;0;0;0;0;0;0 -7630;immuniser;positive;0;0;0;0;0;0 -7631;immunitaire;positive;0;0;0;0;0;0 -7632;immunité;positive;0;0;0;0;0;0 -7633;impact;negative;0;1;0;0;0;0 -7634;impalpable;negative;0;1;0;0;0;0 -7635;imparfaitement;negative;0;0;0;0;0;1 -7636;impartialité;positive;0;0;0;0;0;0 -7637;impasse;negative;0;1;1;1;0;1 -7638;impatience;negative;0;0;0;1;0;0 -7639;impatient;negative;0;0;0;1;0;0 -7640;impatient|impatiente;negative;0;0;0;1;0;0 -7641;impeccable;positive;0;0;0;0;0;0 -7642;impénitent;negative;0;0;1;0;0;0 -7643;impérativement;positive;0;0;0;0;0;0 -7644;impératrice;positive;0;0;0;0;0;0 -7645;imperceptible;negative;0;0;1;0;0;0 -7646;imperfection;negative;0;0;1;0;0;1 -7647;imperial;positive;0;0;0;0;0;0 -7648;impérial;positive;0;0;0;0;0;0 -7649;impérissable;positive;0;0;0;0;0;0 -7650;imperméabiliser;positive;0;0;0;0;0;0 -7651;imperméable;positive;0;1;0;1;0;0 -7652;impertinent;negative;0;0;0;1;0;0 -7653;imperturbable;positive;0;0;0;0;0;0 -7654;impie;negative;0;1;1;0;0;0 -7655;implacable;positive;0;0;0;0;0;0 -7656;implant;positive;0;0;0;0;0;0 -7657;implantation;positive;0;0;0;0;0;0 -7658;implanter;positive;0;0;0;0;0;0 -7659;implicite;positive;0;0;0;0;0;0 -7660;impliquer;positive;0;0;0;0;0;0 -7661;implorer;negative;0;1;1;0;0;0 -7662;implosion;negative;0;1;0;0;1;0 -7663;impoli;negative;0;0;0;0;0;1 -7664;impopulaire;negative;0;0;1;0;0;1 -7665;importance;positive;0;0;0;0;0;0 -7666;important;positive;0;0;0;0;0;0 -7667;importation;positive;0;0;0;0;0;0 -7668;importuner;negative;0;1;0;0;0;0 -7669;imposer;negative;0;1;0;1;0;0 -7670;imposition;negative;0;1;1;0;0;0 -7671;impossibilité;negative;0;0;1;0;0;0 -7672;impossible;negative;0;0;1;0;0;0 -7673;impossible à distinguer;negative;0;0;0;0;0;0 -7674;imposte;positive;0;0;0;0;0;0 -7675;imposteur;negative;0;0;0;1;0;1 -7676;imposture;negative;0;0;0;1;0;1 -7677;impôt;negative;0;0;1;1;0;0 -7678;impotent;negative;0;0;1;0;0;0 -7679;impraticable;negative;0;0;1;0;0;0 -7680;imprécision;negative;0;1;1;0;0;0 -7681;imprégner;negative;0;0;0;0;0;0 -7682;impression;positive;0;0;0;0;0;0 -7683;impressionnable;negative;0;1;0;0;0;0 -7684;impressionnant;positive;0;1;0;0;1;0 -7685;impressionner;positive;0;0;0;0;1;0 -7686;imprévisible;negative;0;1;0;0;1;0 -7687;imprimante;positive;0;0;0;0;0;0 -7688;imprimer;positive;0;0;0;0;0;0 -7689;imprimerie;positive;0;0;0;0;0;0 -7690;imprimeur;positive;0;0;0;0;0;0 -7691;improbable;negative;0;1;1;0;1;0 -7692;impromptu;negative;0;0;0;0;1;0 -7693;improvisation;negative;0;0;0;0;1;0 -7694;improviser;negative;0;0;0;0;1;0 -7695;imprudence;negative;0;1;0;1;1;1 -7696;imprudent;negative;0;1;1;1;0;0 -7697;impudence;positive;0;0;0;0;0;0 -7698;impudent;negative;0;0;0;1;0;0 -7699;impuissance;negative;0;1;1;1;0;0 -7700;impuissant;negative;0;1;1;1;0;1 -7701;impulsion;positive;0;0;0;0;1;0 -7702;impunité;negative;0;0;1;1;0;0 -7703;impur;negative;0;0;0;0;0;1 -7704;impureté;negative;0;0;0;0;0;1 -7705;imputable;negative;0;1;1;0;0;0 -7706;imputation;negative;0;0;1;1;0;0 -7707;in quarto;positive;0;0;0;0;0;0 -7708;inacceptable;negative;0;0;1;1;0;0 -7709;inaccessible;negative;0;0;1;1;0;0 -7710;inachever;negative;0;0;1;0;0;0 -7711;inachèvement;negative;0;0;1;0;0;0 -7712;inaction;negative;0;1;1;0;0;0 -7713;inactivation;negative;0;1;0;0;0;0 -7714;inactiver;negative;0;1;0;0;0;0 -7715;inactivité;negative;0;0;1;0;0;0 -7716;inadéquation;negative;0;0;1;0;0;1 -7717;inadmissible;negative;0;0;1;1;0;1 -7718;inaliénable;positive;0;0;0;0;0;0 -7719;inamical;negative;0;1;1;1;0;1 -7720;inanimé;negative;0;1;1;0;0;0 -7721;inaperçu;negative;0;0;1;0;0;0 -7722;inapplicable;negative;0;0;0;0;0;0 -7723;inapproprié;negative;0;0;1;1;0;1 -7724;inappropriée;negative;0;0;1;1;0;1 -7725;inappropriées;negative;0;0;1;1;0;1 -7726;inappropriés;negative;0;0;1;1;0;1 -7727;inapte;negative;0;0;1;0;0;0 -7728;inassouvi;negative;0;0;1;1;1;0 -7729;inattentif;negative;0;0;0;0;0;0 -7730;inaudible;negative;0;0;0;0;0;0 -7731;inaugural;positive;0;0;0;0;0;0 -7732;inauguration;positive;0;0;0;0;0;0 -7733;inaugurer;positive;1;0;0;0;0;0 -7734;incandescent;negative;0;1;0;0;1;0 -7735;incapable;negative;0;0;1;0;0;0 -7736;incapacité;negative;0;0;1;0;0;1 -7737;incarcération;negative;0;1;1;1;0;1 -7738;incarcérer;negative;0;1;1;1;0;0 -7739;incarnation;positive;0;0;0;0;0;0 -7740;incarner;positive;0;0;0;0;0;0 -7741;incassable;positive;0;0;0;0;0;0 -7742;incendiaire;negative;0;1;0;1;1;0 -7743;incendie;negative;0;1;0;1;1;0 -7744;incendie volontaire;negative;0;1;0;1;0;0 -7745;incendier;negative;0;1;0;1;0;0 -7746;incertitude;negative;0;1;0;0;1;0 -7747;incessant;negative;0;1;1;1;0;0 -7748;inceste;negative;0;1;1;1;0;1 -7749;inchangé;positive;0;0;0;0;0;0 -7750;incidence;positive;0;0;0;0;0;0 -7751;incident;negative;0;1;1;0;1;1 -7752;incinération;negative;0;0;1;0;0;1 -7753;inciser;negative;0;1;0;0;0;0 -7754;incision;negative;0;1;0;0;0;1 -7755;inciter;positive;0;0;0;0;0;0 -7756;inclinaison;negative;0;1;0;0;0;0 -7757;incliner;negative;0;1;0;0;0;0 -7758;inclination;positive;0;0;0;0;0;0 -7759;inclus;positive;0;0;0;0;0;0 -7760;inclusion;positive;0;0;0;0;0;0 -7761;incognito;negative;0;1;0;0;0;0 -7762;incohérence;negative;0;0;1;0;0;0 -7763;incolore;negative;0;0;1;0;0;0 -7764;incommensurable;positive;0;0;0;0;0;0 -7765;incommensurablement;positive;0;0;0;0;0;0 -7766;incommode;negative;0;0;1;1;0;1 -7767;incommoder;negative;0;0;1;1;0;1 -7768;incompatible;negative;0;0;1;1;0;1 -7769;incompétence;negative;0;0;1;1;0;1 -7770;incomplet;negative;0;0;0;0;0;0 -7771;incomplètement;negative;0;0;1;0;0;0 -7772;inconciliable;negative;0;1;1;1;0;0 -7773;inconfort;negative;0;0;1;0;0;1 -7774;inconfortable;negative;0;0;0;0;0;0 -7775;incongru;negative;0;0;0;1;1;0 -7776;inconnu;negative;0;1;0;0;0;0 -7777;inconscience;negative;0;1;1;0;1;0 -7778;inconséquence;negative;0;0;1;0;0;0 -7779;inconsidéré;negative;0;0;0;1;0;1 -7780;inconsistance;negative;0;0;1;0;0;0 -7781;inconstant;negative;0;0;0;1;0;1 -7782;inconstitutionnel;negative;0;0;0;0;0;0 -7783;incontestable;positive;0;0;0;0;0;0 -7784;incontestablement;positive;0;0;0;0;0;0 -7785;incontesté;positive;0;0;0;0;0;0 -7786;incontinence;negative;0;1;0;0;1;1 -7787;incontrôlable;negative;0;1;0;1;1;0 -7788;incontrôlé;negative;0;1;1;0;1;0 -7789;inconvénient;negative;0;0;1;1;0;0 -7790;incorporation;positive;0;0;0;0;0;0 -7791;incorporer;positive;0;0;0;0;0;0 -7792;incorrect;negative;0;0;0;0;0;0 -7793;incrédule;negative;0;0;0;1;1;1 -7794;incrément;positive;0;0;0;0;0;0 -7795;incrimination;negative;0;1;1;1;0;0 -7796;incroyable;negative;0;0;0;0;1;0 -7797;incrustation;negative;0;0;0;0;0;0 -7798;incubation;negative;0;1;1;0;0;0 -7799;incube;negative;0;1;0;0;0;1 -7800;inculpation;negative;0;1;0;1;0;1 -7801;inculper;negative;0;1;0;1;0;1 -7802;inculquer;positive;0;0;0;0;0;0 -7803;inculte;negative;0;0;1;0;0;1 -7804;incurable;negative;0;1;1;1;0;1 -7805;incursion;negative;0;1;0;1;0;0 -7806;indécence;negative;0;0;0;1;0;1 -7807;indécis;negative;0;1;1;0;1;0 -7808;indécision;negative;0;0;1;0;0;0 -7809;indéfectible;positive;0;0;0;0;0;0 -7810;indéfendable;negative;0;1;0;0;0;0 -7811;indéfini;negative;0;0;0;0;0;0 -7812;indéifférents;negative;0;0;1;1;0;1 -7813;indélébile;positive;0;0;0;0;0;0 -7814;indemne;positive;0;0;0;0;1;0 -7815;indemnisation;positive;0;0;0;0;0;0 -7816;indemniser;positive;0;0;0;0;0;0 -7817;indemnité;positive;0;0;0;0;0;0 -7818;indéniable;negative;0;0;0;0;0;0 -7819;indépendance;positive;0;0;0;0;1;0 -7820;indépendant;positive;0;0;0;0;0;0 -7821;indescriptible;negative;0;1;1;0;0;0 -7822;indésirable;negative;0;1;1;1;0;1 -7823;indestructible;positive;0;0;0;0;0;0 -7824;indéterminer;negative;0;0;1;0;0;0 -7825;index;positive;0;0;0;0;0;0 -7826;index géographique;positive;0;0;0;0;0;0 -7827;indicateur;positive;0;0;0;0;0;0 -7828;indicible;negative;0;1;1;0;0;0 -7829;indifféremment;positive;0;0;0;0;0;0 -7830;indifférence;negative;0;1;1;1;0;1 -7831;indifférenciable;negative;0;0;0;0;0;0 -7832;indifférenciables;negative;0;0;0;0;0;0 -7833;indifférent;negative;0;0;1;0;0;1 -7834;indigène;positive;0;0;0;0;0;0 -7835;indigestion;negative;0;0;0;0;0;1 -7836;indignation;negative;0;0;0;1;0;1 -7837;indigne;negative;0;0;0;0;0;1 -7838;indigner;negative;0;0;0;1;0;1 -7839;indigo;positive;0;0;0;0;0;0 -7840;indiquer;positive;0;0;0;0;0;0 -7841;indiscernable;negative;0;0;0;0;0;0 -7842;indiscipliné;negative;0;1;0;1;0;1 -7843;indiscutable;positive;0;0;0;0;0;0 -7844;indiscutablement;positive;0;0;0;0;0;0 -7845;indispensable;positive;0;0;0;0;0;0 -7846;indistinct;negative;0;1;0;0;0;0 -7847;individualité;positive;0;0;0;0;0;0 -7848;individuel;negative;0;0;1;0;0;0 -7849;individueld;negative;0;0;1;0;0;0 -7850;indivisible;positive;0;0;0;0;0;0 -7851;indolent;negative;0;0;0;0;0;0 -7852;indolore;positive;0;0;0;0;0;0 -7853;indomptable;positive;0;1;0;0;0;0 -7854;indu;negative;0;0;1;1;0;0 -7855;indubitable;positive;0;0;0;0;0;1 -7856;induction;positive;0;0;0;0;0;0 -7857;induire;negative;0;0;0;0;0;0 -7858;induire en erreur;negative;0;1;0;1;0;0 -7859;indulgence;positive;0;0;0;0;0;0 -7860;indulgent;positive;0;0;0;0;0;0 -7861;industrie;positive;0;0;0;0;0;0 -7862;inédit;positive;0;0;1;0;1;0 -7863;ineffable;negative;0;1;1;1;0;0 -7864;inefficace;negative;0;0;1;0;0;1 -7865;inefficacité;negative;0;0;1;0;0;1 -7866;inégal;negative;0;1;1;1;0;1 -7867;inégalable;positive;0;0;0;0;0;0 -7868;inégalé;positive;0;0;0;0;0;0 -7869;inégalité;negative;0;1;1;1;0;0 -7870;inélastique;negative;0;0;0;0;0;0 -7871;inéligible;negative;0;0;1;0;0;0 -7872;inepte;negative;0;0;0;1;0;1 -7873;ineptie;negative;0;1;1;0;0;1 -7874;inépuisable;positive;0;0;0;0;0;0 -7875;inéquitable;negative;0;0;1;1;0;0 -7876;inerte;negative;0;1;1;0;0;0 -7877;inertie;positive;0;0;0;0;0;0 -7878;inestimable;positive;1;0;0;0;0;0 -7879;inévitable;negative;0;1;1;0;0;0 -7880;inévitablement;negative;0;0;0;0;0;0 -7881;inexact;negative;0;0;0;0;0;0 -7882;inexactitude;negative;0;0;0;1;0;1 -7883;inexcusable;negative;0;0;1;1;0;1 -7884;inexistant;negative;0;0;1;0;0;0 -7885;inexpérience;negative;0;0;1;0;0;0 -7886;inexpérimenté;negative;0;0;1;0;0;0 -7887;inexpliqué;negative;0;1;1;0;0;0 -7888;inexploité;negative;0;0;1;0;0;0 -7889;inexploré;negative;0;0;1;0;0;0 -7890;infaillibilité;positive;0;0;0;0;0;0 -7891;infaillible;positive;0;0;0;0;0;0 -7892;infaisable;negative;0;0;1;0;0;0 -7893;infamie;negative;0;0;1;1;0;1 -7894;infanterie;positive;0;0;0;0;0;0 -7895;infanticide;negative;0;1;1;1;0;1 -7896;infantile;negative;0;0;0;1;0;1 -7897;infarctus;negative;0;1;0;0;1;0 -7898;infecteninfects;negative;0;1;0;1;0;1 -7899;infecter;negative;0;1;1;0;0;1 -7900;infection;negative;0;1;1;0;0;1 -7901;inférence;positive;0;0;0;0;0;0 -7902;infériorité;negative;0;0;1;1;0;0 -7903;infernal;negative;0;1;1;1;0;1 -7904;infertilité;negative;0;1;1;0;0;0 -7905;infestation;negative;0;1;0;0;0;1 -7906;infidele;negative;0;0;1;0;0;1 -7907;infidèle;negative;0;1;1;1;0;1 -7908;infidélité;negative;0;1;1;1;0;1 -7909;infini;positive;0;0;0;0;0;0 -7910;infiniment;positive;0;0;0;0;0;0 -7911;infinité;positive;0;0;0;0;0;0 -7912;infinitésimal;negative;0;0;0;0;0;0 -7913;infirme;negative;0;1;1;0;0;0 -7914;infirmer;negative;0;1;0;0;0;0 -7915;infirmerie;positive;0;0;0;0;0;0 -7916;infirmier;positive;0;0;0;0;0;0 -7917;infirmier en chef;positive;0;0;0;0;0;0 -7918;infirmité;negative;0;1;1;0;0;0 -7919;inflammation;negative;0;1;0;0;0;1 -7920;inflation;negative;0;1;0;1;0;0 -7921;infliction;negative;0;1;1;0;0;0 -7922;infliger;negative;0;1;1;1;0;0 -7923;inflorescence;positive;1;0;0;0;0;0 -7924;influence;positive;0;0;0;0;0;0 -7925;influencer;positive;0;0;0;0;0;0 -7926;influent;positive;0;0;0;0;0;0 -7927;infomes;negative;0;0;0;0;0;1 -7928;infondé;negative;0;1;0;1;0;1 -7929;information;positive;0;0;0;0;0;0 -7930;informer;positive;0;0;0;0;0;0 -7931;informel;positive;0;0;0;0;0;0 -7932;infortune;negative;0;1;1;0;0;1 -7933;infos;positive;0;0;0;0;0;0 -7934;infranchissable;negative;0;0;1;0;0;0 -7935;infrastructure;positive;0;0;0;0;0;0 -7936;infructueux;negative;0;0;1;0;0;0 -7937;infus;positive;0;0;0;0;0;0 -7938;infuser;positive;0;0;0;0;0;0 -7939;infusion;positive;0;0;0;0;0;0 -7940;ingénierie;positive;0;0;0;0;0;0 -7941;ingénieur;positive;0;0;0;0;0;0 -7942;ingéniosité;positive;0;0;0;0;0;0 -7943;ingérable;negative;0;1;1;1;0;1 -7944;ingérence;negative;0;1;1;1;1;0 -7945;ingérer;positive;0;0;0;0;0;0 -7946;ingestion;positive;0;0;0;0;0;0 -7947;ingrat;negative;0;0;0;1;0;1 -7948;ingrédient;positive;0;0;0;0;0;0 -7949;inhabité;negative;0;0;1;0;0;0 -7950;inhalation;positive;0;0;0;0;0;0 -7951;inhaler;positive;0;0;0;0;0;0 -7952;inhérent;positive;0;0;0;0;0;0 -7953;inhiber;negative;0;0;1;0;0;0 -7954;inhibition;negative;0;1;1;0;0;0 -7955;inhumain;negative;0;1;1;1;0;1 -7956;inhumanité;negative;0;1;1;1;0;1 -7957;inhumation;negative;0;1;1;1;0;0 -7958;inhumer;negative;0;1;1;0;0;0 -7959;inimitable;positive;0;0;0;0;0;0 -7960;inimitié;negative;0;1;1;1;0;1 -7961;inintelligible;negative;0;1;1;0;0;0 -7962;inintéressant;negative;0;0;1;0;0;1 -7963;ininterrompu;positive;0;0;0;0;0;0 -7964;iniquité;negative;0;0;1;0;0;1 -7965;initial;positive;0;0;0;0;0;0 -7966;initiative;positive;0;0;0;0;0;0 -7967;injecter;negative;0;1;0;0;0;0 -7968;injection;negative;0;1;0;0;0;0 -7969;injonction;negative;0;1;1;1;0;0 -7970;injurier;negative;0;1;0;1;0;0 -7971;injuste;negative;0;0;1;1;0;1 -7972;injustement;negative;0;1;1;1;0;0 -7973;injustice;negative;0;0;1;1;0;0 -7974;injustifié;negative;0;0;1;1;0;1 -7975;inné;positive;0;0;0;0;0;0 -7976;innocemment;positive;0;0;0;0;0;0 -7977;innocence;positive;0;0;0;0;0;0 -7978;innocenter;positive;0;0;0;0;0;0 -7979;innofensives;positive;0;0;0;0;0;0 -7980;innomables;negative;0;1;1;0;0;0 -7981;innombrable;negative;0;0;0;0;0;0 -7982;innommable;negative;0;1;1;0;0;0 -7983;innovation;positive;0;0;0;0;0;0 -7984;innover;positive;0;0;0;0;0;0 -7985;inoccupé;negative;0;0;1;0;0;0 -7986;inoculation;positive;0;0;0;0;0;0 -7987;inondation;negative;0;1;1;0;1;0 -7988;inonder;negative;0;1;0;0;1;0 -7989;inopérant;negative;0;0;1;1;0;0 -7990;inopportun;negative;0;0;1;1;1;1 -7991;inorganique;negative;0;0;0;0;0;0 -7992;inoxydable;positive;0;0;0;0;0;0 -7993;inquiéter;negative;0;1;1;0;1;0 -7994;inquiétant;negative;0;1;1;0;0;0 -7995;inquiétude;negative;0;1;1;0;0;0 -7996;insaisissable;negative;0;0;0;0;1;0 -7997;insatisfaction;negative;0;0;1;1;0;0 -7998;insatisfaisant;negative;0;0;1;0;0;1 -7999;insatisfait;negative;0;0;1;1;1;1 -8000;inscription;positive;0;0;0;0;0;0 -8001;inscrire;positive;0;0;0;0;0;0 -8002;insecte;negative;0;1;0;0;0;1 -8003;insécurité;negative;0;1;1;0;0;0 -8004;inséparable;positive;0;0;0;0;0;0 -8005;insérer;positive;0;0;0;0;0;0 -8006;insertion;positive;0;0;0;0;0;0 -8007;insigne;positive;0;0;0;0;0;0 -8008;insignifiance;negative;0;0;0;0;0;0 -8009;insignifiant;negative;0;0;1;1;0;1 -8010;insinuation;negative;0;1;0;1;1;0 -8011;insinuer;negative;0;0;0;0;0;0 -8012;insipide;negative;0;0;1;0;0;1 -8013;insister;negative;0;0;0;1;0;0 -8014;insister sur;positive;0;0;0;0;0;0 -8015;insolent;negative;0;0;0;1;0;0 -8016;insoluble;negative;0;0;1;1;0;0 -8017;insolvabilité;negative;0;1;1;0;1;0 -8018;insolvable;negative;0;1;1;0;0;0 -8019;insomnie;negative;0;1;1;0;0;0 -8020;inspecter;positive;0;0;0;0;0;0 -8021;inspiration;positive;0;0;0;0;0;0 -8022;inspirer;positive;0;0;0;0;1;0 -8023;instabilité;negative;0;1;0;1;1;1 -8024;installation;positive;0;0;0;0;0;0 -8025;installer;positive;0;0;0;0;0;0 -8026;instantané;positive;0;0;0;0;1;0 -8027;instantanément;positive;0;0;0;0;1;0 -8028;instigation;negative;0;0;0;0;0;0 -8029;instinct;positive;0;0;0;0;0;0 -8030;instituer;positive;0;0;0;0;0;0 -8031;institut;positive;0;0;0;0;0;0 -8032;instituteur;positive;0;0;0;0;0;0 -8033;institution;positive;0;0;0;0;0;0 -8034;instructeur;positive;0;0;0;0;0;0 -8035;instruction;positive;0;0;0;0;0;0 -8036;instrument;positive;0;0;0;0;0;0 -8037;instrumental;positive;0;0;0;0;0;0 -8038;instrumentalisation;negative;0;1;1;1;0;0 -8039;instrumentiste;positive;0;0;0;0;0;0 -8040;insuffisamment;negative;0;0;1;0;0;0 -8041;insuffisance;negative;0;0;1;1;0;1 -8042;insuffisant;negative;0;1;1;0;0;0 -8043;insuffler;positive;0;0;0;0;0;0 -8044;insulaire;negative;0;1;1;0;0;0 -8045;insulter;negative;0;1;1;1;0;1 -8046;insultant;negative;0;1;1;1;0;1 -8047;insulte;negative;0;0;1;1;1;1 -8048;insupportable;negative;0;0;1;0;0;1 -8049;insurmontable;negative;0;1;1;0;0;0 -8050;insurpassé;positive;0;1;0;0;0;0 -8051;insurpassée;positive;0;1;0;0;0;0 -8052;insurpassées;positive;0;1;0;0;0;0 -8053;insurpassés;positive;0;1;0;0;0;0 -8054;insurrection;negative;0;0;0;1;0;0 -8055;intact;positive;0;0;0;0;0;0 -8056;intangible;positive;0;0;0;0;0;0 -8057;integral;positive;0;0;0;0;0;0 -8058;intégral;positive;0;0;0;0;0;0 -8059;intégralité;positive;0;0;0;0;0;0 -8060;intégrals;positive;0;0;0;0;0;0 -8061;intégration;positive;0;0;0;0;0;0 -8062;intégrer;positive;0;0;0;0;0;0 -8063;intégrité;positive;0;0;0;0;0;0 -8064;intellect;positive;0;0;0;0;0;0 -8065;intelligence;positive;0;1;0;0;0;0 -8066;intelligent;positive;0;0;0;0;0;0 -8067;intelligibilité;positive;0;0;0;0;0;0 -8068;intenable;negative;0;0;1;1;0;1 -8069;intendance;positive;0;0;0;0;0;0 -8070;intendant;positive;0;0;0;0;0;0 -8071;intendant économe;positive;0;0;0;0;0;0 -8072;intendant|intendante;positive;0;0;0;0;0;0 -8073;intensément;positive;0;0;0;0;0;0 -8074;intention;positive;0;0;0;0;0;0 -8075;interaction;positive;0;0;0;0;0;0 -8076;intercéder;negative;0;1;1;1;1;0 -8077;intercepter;positive;0;0;0;0;1;0 -8078;interception;positive;0;0;0;0;1;0 -8079;intercession;positive;0;0;0;0;0;0 -8080;interchangeable;positive;0;0;0;0;0;0 -8081;interdépendance;negative;0;1;1;0;0;0 -8082;interdépendant;negative;0;1;1;0;0;0 -8083;interdiction;negative;0;1;1;1;0;1 -8084;interdire;negative;0;1;1;1;0;0 -8085;intéresser;positive;1;0;0;0;0;0 -8086;intérêt;positive;0;0;0;0;0;0 -8087;interférence;negative;0;1;1;1;0;0 -8088;interféromètre;negative;0;0;0;0;0;0 -8089;interfonctionnement;positive;0;0;0;0;0;0 -8090;intérieur;positive;0;0;0;0;0;1 -8091;intérieurement;positive;0;0;0;0;0;0 -8092;intérimaire;positive;0;0;0;0;0;0 -8093;interlocutoire;positive;0;0;0;0;0;0 -8094;interlude;positive;0;0;0;0;0;0 -8095;intermède;positive;0;0;0;0;0;0 -8096;intermédiaire;positive;0;0;0;0;0;0 -8097;intermittent;positive;0;0;0;0;0;0 -8098;international;positive;0;0;0;0;0;0 -8099;interne;positive;0;0;0;0;0;0 -8100;internement;negative;0;1;1;0;0;0 -8101;interphone;positive;0;0;0;0;0;0 -8102;interpolation;positive;0;0;0;0;0;0 -8103;interpoler;positive;0;0;0;0;0;0 -8104;interprétation;positive;0;0;0;0;0;0 -8105;interprétation erroné;negative;0;1;1;0;0;0 -8106;interprète;positive;0;0;0;0;0;0 -8107;interpréter;positive;1;0;0;0;0;0 -8108;interrogatoire;negative;0;1;1;1;0;0 -8109;interroger;negative;0;1;0;0;0;0 -8110;interrupteur;positive;0;0;0;0;0;0 -8111;interruption de grossesse;negative;0;1;1;0;0;1 -8112;intersection;positive;0;0;0;0;0;0 -8113;intervalle;positive;0;0;0;0;0;0 -8114;intervention;positive;0;0;0;0;0;0 -8115;interview;positive;0;0;0;0;0;0 -8116;interviewer;positive;0;0;0;0;0;0 -8117;intestat;negative;0;1;1;0;1;0 -8118;intestin;negative;0;0;0;0;0;1 -8119;intestinal;negative;0;0;0;0;0;1 -8120;intimement;positive;0;1;0;0;0;0 -8121;intimidation;negative;0;1;0;1;0;0 -8122;intimider;negative;0;1;0;0;0;0 -8123;intituler;positive;0;0;0;0;0;0 -8124;intolérable;negative;0;0;0;1;0;1 -8125;intolérance;negative;0;1;0;1;0;1 -8126;intolérant;negative;0;1;1;1;0;1 -8127;intonation;positive;0;0;0;0;0;0 -8128;intraitable;negative;0;0;1;1;0;0 -8129;intransigeant;negative;0;0;0;1;0;0 -8130;intrépide;positive;0;1;0;0;0;0 -8131;intrigant;positive;0;1;0;0;1;0 -8132;intrigue secondaire;negative;0;0;0;0;0;0 -8133;intriguer;negative;0;1;0;0;1;0 -8134;intrinsèque;positive;0;0;0;0;0;0 -8135;intrinsèquement;positive;0;0;0;0;0;0 -8136;introduction;positive;0;0;0;0;0;0 -8137;introduire;positive;0;0;0;0;0;0 -8138;introduire clandestinement;negative;0;1;0;0;0;0 -8139;introspection;positive;0;0;0;0;0;0 -8140;intuition;positive;0;0;0;0;0;0 -8141;intuitivement;positive;0;0;0;0;0;0 -8142;inutile;negative;0;0;1;0;0;0 -8143;invaincu;positive;0;0;1;0;1;0 -8144;invalidation;negative;0;0;1;0;0;0 -8145;invalide;negative;0;1;1;0;0;0 -8146;invalider;negative;0;0;1;0;1;0 -8147;invalidité;negative;0;0;1;0;0;0 -8148;invariablement;positive;0;0;0;0;0;0 -8149;invasion;negative;0;1;0;1;1;0 -8150;inventaire;positive;0;0;0;0;0;0 -8151;inverse;negative;0;0;0;0;0;0 -8152;inverser;negative;0;1;0;0;0;0 -8153;inversement;negative;0;0;0;0;0;0 -8154;inversion;negative;0;1;0;1;1;1 -8155;investigation;positive;0;0;0;0;0;0 -8156;investisseur;positive;0;0;0;0;0;0 -8157;investiture;positive;0;0;0;0;0;0 -8158;invincible;positive;0;0;0;0;0;0 -8159;invisibilité;negative;0;1;0;0;0;0 -8160;invisible;negative;0;1;1;0;0;0 -8161;inviter;positive;0;0;0;0;1;0 -8162;invitation;positive;0;0;0;0;0;0 -8163;invocation;positive;0;0;0;0;0;0 -8164;involontaire;negative;0;1;1;0;1;0 -8165;involontairement;negative;0;1;1;0;1;0 -8166;involution;positive;0;1;0;1;0;0 -8167;invoquer;positive;0;0;0;0;0;0 -8168;irascibilité;negative;0;0;1;1;0;1 -8169;ire;negative;0;0;0;1;0;0 -8170;iris;positive;0;1;0;0;0;0 -8171;iriser;positive;0;0;0;0;0;0 -8172;irlandais;negative;0;0;0;0;0;1 -8173;ironie;negative;0;0;0;1;0;0 -8174;ironique;negative;0;0;0;1;0;0 -8175;irradiation;negative;0;1;0;0;0;0 -8176;irradier;positive;1;0;0;0;0;0 -8177;irrationalité;negative;0;1;0;1;0;0 -8178;irréaliste;negative;0;1;1;0;0;0 -8179;irrecevable;negative;0;0;0;1;0;1 -8180;irréductible;positive;0;0;0;0;0;0 -8181;irréfutable;positive;0;0;0;0;0;0 -8182;irrégularité;negative;0;1;0;0;0;0 -8183;irrégulièrement;negative;0;0;0;0;0;0 -8184;irréparable;negative;0;1;1;0;0;0 -8185;irrépressible;positive;0;0;0;0;0;0 -8186;irréprochable;positive;0;0;0;0;0;0 -8187;irrésistible;positive;0;0;0;0;0;0 -8188;irrespect;negative;0;0;0;1;0;0 -8189;irresponsable;negative;0;1;1;0;0;0 -8190;irréversible;negative;0;1;0;0;0;0 -8191;irrévocabilité;negative;0;0;1;0;0;0 -8192;irrévocable;negative;0;0;1;1;0;0 -8193;irrigation;positive;0;0;0;0;0;0 -8194;irriguer;positive;0;0;0;0;0;0 -8195;irritabilité;negative;0;0;0;1;0;0 -8196;irritable;negative;0;0;0;1;0;0 -8197;irriter;negative;0;0;0;1;0;1 -8198;irritant;negative;0;0;0;1;0;1 -8199;irritation;negative;0;0;1;1;0;1 -8200;isolant;positive;0;0;1;1;0;1 -8201;isolation;positive;0;0;0;0;0;0 -8202;isomorphisme;positive;0;0;0;0;0;0 -8203;isothermique;positive;0;0;0;0;0;0 -8204;issue;positive;0;0;0;0;0;0 -8205;itération;positive;0;0;0;0;0;0 -8206;itérer;positive;0;0;0;0;0;0 -8207;itinéraire;positive;0;0;0;0;0;0 -8208;itinérant;positive;1;0;0;0;0;0 -8209;ivoire;positive;0;0;0;0;0;0 -8210;ivre;negative;0;0;0;0;0;1 -8211;ivresse;negative;0;1;1;0;1;0 -8212;jacasser;negative;0;0;0;1;0;1 -8213;jachère;negative;0;0;1;0;0;0 -8214;jacinthe;positive;0;0;0;0;0;0 -8215;jackpot;positive;0;0;0;0;1;0 -8216;jacquet;positive;0;0;0;0;1;0 -8217;jade;positive;0;0;0;0;0;0 -8218;jaguar;negative;0;1;0;0;0;0 -8219;jaillissement;positive;0;0;0;0;1;1 -8220;jalon;positive;0;0;0;0;0;0 -8221;jalouser;negative;0;0;0;1;0;1 -8222;jaloux;negative;0;0;0;1;0;1 -8223;jalousie;negative;0;1;1;1;0;1 -8224;jambe;positive;0;0;0;0;0;0 -8225;jambier|jambière;positive;0;0;0;0;0;0 -8226;jambier|jambière de cuir;positive;0;0;0;0;0;0 -8227;jambon;positive;0;0;0;0;0;0 -8228;jambon fumé;positive;0;0;0;0;0;0 -8229;jante;positive;0;0;0;0;0;0 -8230;japon;positive;0;0;0;0;0;0 -8231;japper;negative;0;1;0;1;1;0 -8232;jardin;positive;1;0;0;0;0;0 -8233;jardin d enfant;positive;0;0;0;0;0;0 -8234;jardin public;positive;0;0;0;0;0;0 -8235;jardinage;positive;0;0;0;0;0;0 -8236;jardiner;positive;0;0;0;0;0;0 -8237;jardinier;positive;0;0;0;0;0;0 -8238;jargon;negative;0;0;0;0;0;0 -8239;jarre;positive;0;0;0;0;0;0 -8240;jarret;positive;0;1;0;0;0;0 -8241;jarretelle;positive;0;0;0;0;0;0 -8242;jarretière;positive;0;0;0;0;0;0 -8243;jar|jars;positive;0;0;0;0;0;0 -8244;jaspe;positive;0;0;0;0;0;0 -8245;jauge;positive;0;0;0;0;0;0 -8246;jaugeage;positive;0;0;0;0;0;0 -8247;jauger;positive;0;0;0;0;0;0 -8248;jaune;positive;0;0;0;0;0;0 -8249;jaunisse;negative;0;1;0;0;0;1 -8250;javelot;negative;0;1;0;1;0;0 -8251;jeûne;negative;0;0;1;0;0;0 -8252;jean;positive;0;0;0;0;0;0 -8253;jeep;positive;0;0;0;0;0;0 -8254;jeter un coup d ?il;positive;0;0;0;0;0;0 -8255;jeter du détritus;negative;0;0;0;0;0;1 -8256;jeter du ordure;negative;0;0;0;0;0;1 -8257;jeton;positive;0;0;0;0;0;0 -8258;jeu de dame;positive;0;0;0;0;0;0 -8259;jeu de mot;positive;1;0;0;0;0;0 -8260;jeu du solitaire;positive;0;0;0;0;0;0 -8261;jeune;positive;0;0;0;0;1;0 -8262;jeune femme;positive;0;0;0;1;0;1 -8263;jeune fille;positive;0;0;0;1;0;1 -8264;jeune homme;positive;0;0;0;0;0;1 -8265;jeune marié;positive;0;0;0;0;0;0 -8266;jeunesse;positive;0;1;0;1;1;0 -8267;jeu d argent;negative;0;1;0;0;1;0 -8268;jingle;positive;1;0;0;0;0;0 -8269;joaillerie;positive;0;0;0;0;0;0 -8270;jockey;positive;0;0;0;0;0;0 -8271;jogging;positive;0;0;0;0;0;0 -8272;joie;positive;1;0;0;0;0;0 -8273;joindre;positive;0;0;0;0;0;0 -8274;jointure;positive;0;0;0;0;0;0 -8275;joker;positive;0;0;0;0;1;0 -8276;joli;positive;0;0;0;0;0;0 -8277;jonc;positive;0;0;0;0;0;0 -8278;jonction;positive;0;0;0;0;0;0 -8279;jonglage;positive;0;0;0;0;0;0 -8280;jongler;positive;0;0;0;0;0;0 -8281;jonglerie;positive;0;0;0;0;0;0 -8282;joue;positive;0;0;0;0;0;0 -8283;jouer;positive;1;0;0;0;0;0 -8284;jouer au golf;positive;0;0;0;0;0;0 -8285;jouer du violon;positive;0;0;0;0;0;0 -8286;jouer un atout;positive;0;0;0;0;1;0 -8287;jouet;positive;1;0;0;0;0;0 -8288;joueur;negative;0;0;0;0;0;0 -8289;joueur de cornemuse;positive;0;0;0;0;0;0 -8290;joug;positive;0;0;0;0;0;0 -8291;jouir de;positive;0;0;0;0;0;0 -8292;jour;positive;0;0;0;0;0;0 -8293;journal;positive;0;0;0;0;0;0 -8294;journal intime;positive;0;0;0;0;0;0 -8295;journal officiel;positive;0;0;0;0;0;0 -8296;journalisme;positive;0;0;0;0;0;0 -8297;journaliste;positive;0;0;0;0;0;0 -8298;journée;positive;0;0;0;0;0;0 -8299;joyau;positive;0;0;0;0;0;0 -8300;joyeuses|joyeux;positive;0;0;0;0;0;0 -8301;jubilaire;positive;0;0;0;0;1;0 -8302;jubiler;positive;0;0;0;0;1;0 -8303;juchoir;positive;0;0;0;0;0;0 -8304;judiciaire;positive;0;0;0;0;0;0 -8305;juge;positive;0;0;0;0;0;0 -8306;juger;negative;0;0;0;0;0;0 -8307;jugeote;positive;0;0;0;0;0;0 -8308;jumeau;positive;0;0;0;0;0;0 -8309;jument;positive;0;0;0;0;0;0 -8310;jungle;negative;0;1;0;0;0;0 -8311;junior;positive;0;0;0;0;0;0 -8312;junte;negative;0;1;0;1;0;0 -8313;jupe;positive;0;0;0;0;0;0 -8314;juridiction;positive;0;0;0;0;0;0 -8315;juridique;positive;0;0;0;0;0;0 -8316;jurisprudence;positive;0;0;1;0;0;0 -8317;juriste;positive;0;0;0;0;0;0 -8318;juron;negative;0;0;0;1;0;0 -8319;jury;positive;0;0;0;0;0;0 -8320;jus;positive;0;0;0;0;0;0 -8321;jusqu à;positive;0;0;0;0;0;0 -8322;jusqu ici;positive;0;0;0;0;0;0 -8323;juste;positive;0;0;0;0;0;0 -8324;juste à temps;positive;0;0;0;0;0;0 -8325;justesse;positive;0;0;0;0;0;0 -8326;justice;positive;0;0;0;0;0;0 -8327;justifiable;positive;0;0;0;0;0;0 -8328;justificatif;positive;0;0;0;0;0;0 -8329;justification;positive;0;0;0;0;0;0 -8330;justifier;positive;0;0;0;0;0;0 -8331;jute;negative;0;0;0;0;0;0 -8332;juteux;positive;0;0;0;0;0;0 -8333;juvenile;negative;0;0;0;0;0;0 -8334;juvénile;negative;0;0;0;0;0;0 -8335;juxtaposition;positive;0;0;0;0;0;0 -8336;kaiser;positive;0;0;0;0;0;0 -8337;kaki;negative;0;0;0;0;0;0 -8338;kaléidoscope;positive;0;0;0;0;0;0 -8339;kangourou;positive;0;0;0;0;0;0 -8340;kanji;positive;0;0;0;0;0;0 -8341;karma;positive;0;0;0;0;0;0 -8342;kayak;positive;0;0;0;0;0;0 -8343;kérosène;negative;0;1;0;0;0;1 -8344;khan;positive;0;1;0;0;0;0 -8345;kilogramme;positive;0;0;0;0;0;0 -8346;kilométrage;positive;0;0;0;0;0;0 -8347;kilomètre;positive;0;0;0;0;0;0 -8348;kilt;positive;0;0;0;0;0;0 -8349;kimono;positive;0;0;0;0;0;0 -8350;kiosque;positive;0;0;0;0;0;0 -8351;kiosque à journal|journau;positive;0;0;0;0;0;0 -8352;kit;positive;0;0;0;0;0;0 -8353;klaxonner;negative;0;0;0;1;0;1 -8354;kris;negative;0;1;0;0;0;0 -8355;kyste;negative;0;1;1;0;0;1 -8356;kyste sébacé;negative;0;0;0;0;0;1 -8357;kystique;negative;0;0;0;0;0;1 -8358;le plus âgé;negative;0;0;0;0;0;0 -8359;le plus bas;negative;0;0;1;0;0;0 -8360;le plus petit;negative;0;1;1;0;0;0 -8361;là bas;negative;0;0;0;0;0;0 -8362;labeur;negative;0;0;1;0;0;1 -8363;labo;positive;0;0;0;0;0;0 -8364;laboratoire;positive;0;0;0;0;0;0 -8365;labour;positive;0;0;0;0;0;0 -8366;labourage;positive;0;0;0;0;0;0 -8367;labourer;positive;0;0;0;0;0;0 -8368;labyrinthe;negative;0;1;0;0;1;0 -8369;lac;positive;0;0;0;0;0;0 -8370;lac écossais;negative;0;1;0;0;0;0 -8371;lâche;negative;0;1;1;1;0;1 -8372;lâchement;negative;0;1;0;1;0;1 -8373;lâcher le chien;positive;0;0;0;0;0;0 -8374;lâcheté;negative;0;1;0;1;0;1 -8375;laconique;negative;0;1;0;1;1;0 -8376;lacrosse;positive;0;0;0;0;0;0 -8377;lacté;positive;0;0;0;0;0;0 -8378;lagon;positive;0;0;0;0;0;0 -8379;laïcité;positive;0;0;0;0;0;0 -8380;laid;negative;0;0;0;0;0;1 -8381;laideur;negative;0;1;1;0;0;1 -8382;laine;positive;0;0;0;0;0;0 -8383;laineux;positive;0;0;0;0;0;0 -8384;laïque;negative;0;0;1;0;0;0 -8385;laisse;negative;0;1;1;1;0;0 -8386;laisser;negative;0;0;0;0;0;0 -8387;laisser sortir;negative;1;0;0;0;0;0 -8388;laisser supposer;positive;0;0;0;0;0;0 -8389;laisser tomber;negative;0;1;1;0;0;0 -8390;lait;positive;0;0;0;0;0;0 -8391;laitier;positive;0;0;0;0;0;0 -8392;laitier|laitière;positive;0;0;0;0;0;0 -8393;laiton;positive;0;0;0;0;0;0 -8394;laitue;positive;0;0;0;0;0;0 -8395;lama;negative;0;1;0;0;0;1 -8396;lambda;positive;0;0;0;0;0;0 -8397;lambeau;negative;0;0;1;0;0;0 -8398;lambrequin;positive;0;0;0;0;0;0 -8399;lamentablement;negative;0;0;1;0;0;0 -8400;lamentation;negative;0;1;1;0;0;1 -8401;laminer;positive;0;0;0;0;0;0 -8402;lampe;positive;0;0;0;0;0;0 -8403;lampe de poche;positive;0;0;0;0;0;0 -8404;lamper;negative;0;0;0;0;0;1 -8405;lance;negative;0;1;1;1;0;0 -8406;lance pierre;negative;0;1;0;1;0;0 -8407;lancement;positive;1;0;0;0;0;0 -8408;lancier;negative;0;1;0;0;0;0 -8409;lanciner;negative;0;1;1;0;1;0 -8410;lancinant;negative;0;1;1;0;1;0 -8411;lande;negative;0;0;0;0;0;0 -8412;langage;positive;0;0;0;0;0;0 -8413;langoureux;negative;0;1;1;0;0;0 -8414;langoustine;negative;0;0;0;0;0;0 -8415;langue;positive;0;0;0;0;0;0 -8416;languir;negative;0;0;1;0;0;0 -8417;languissant;negative;0;0;1;0;0;0 -8418;lanterne;positive;0;0;0;0;0;0 -8419;lapidaire;negative;0;0;1;1;0;0 -8420;lapin;positive;0;0;0;0;0;0 -8421;laque;negative;0;0;0;0;0;1 -8422;laquer;negative;0;0;0;0;0;1 -8423;larcin;negative;0;0;0;1;1;1 -8424;lard;negative;0;0;0;0;0;1 -8425;large;positive;0;0;0;0;0;0 -8426;large sourire;positive;0;0;0;0;1;0 -8427;largement;positive;0;0;0;0;0;0 -8428;largeur;positive;0;0;0;0;0;0 -8429;largo;positive;0;0;0;0;0;0 -8430;larguer;negative;0;0;0;0;0;1 -8431;larme;negative;0;0;1;0;0;0 -8432;larve;negative;0;0;0;0;0;1 -8433;larynx;positive;0;0;0;0;0;0 -8434;laser;positive;0;0;0;0;0;0 -8435;lasser;negative;0;0;1;0;0;0 -8436;lassitude;negative;0;0;1;0;0;0 -8437;lasso;negative;0;1;0;1;0;0 -8438;latex;negative;0;0;0;0;0;0 -8439;latitude;positive;0;0;0;0;0;0 -8440;latrines;negative;0;0;0;0;0;1 -8441;laurier;positive;1;0;0;0;0;0 -8442;lavande;positive;0;0;0;0;0;0 -8443;laver;positive;0;0;0;0;0;0 -8444;lave;negative;0;1;0;1;0;1 -8445;lavement;negative;0;0;0;0;0;1 -8446;laverie;positive;0;0;0;0;0;0 -8447;le long de;positive;0;0;0;0;0;0 -8448;le meilleur;positive;1;0;0;0;0;0 -8449;le plus élever;positive;0;1;0;0;1;0 -8450;le plus grand;positive;1;0;0;0;0;0 -8451;le plus haut;positive;0;1;0;0;1;0 -8452;le souffle couper;negative;0;1;0;0;1;0 -8453;leader;positive;0;0;0;0;0;0 -8454;lécher;negative;0;0;0;0;0;1 -8455;leçon;positive;0;0;0;0;0;0 -8456;lectorat;positive;0;0;0;0;0;0 -8457;lecteur;positive;0;0;0;0;0;0 -8458;lecture;positive;0;0;0;0;0;0 -8459;lecture attentif;positive;0;0;0;0;0;0 -8460;légal;positive;0;0;0;0;0;0 -8461;légalement;positive;0;0;0;0;0;0 -8462;légaliser;positive;0;1;0;1;0;0 -8463;légalité;positive;0;0;0;0;0;0 -8464;légendaire;positive;0;0;0;0;0;0 -8465;légende;positive;0;0;0;0;0;0 -8466;légender;positive;0;0;0;0;0;0 -8467;légèrement;negative;0;0;0;0;0;0 -8468;légèrement venteux;positive;1;0;0;0;0;0 -8469;légèreté;positive;1;0;0;0;0;0 -8470;légiférer;positive;0;0;0;0;0;0 -8471;légion;positive;0;0;0;0;0;0 -8472;législation;positive;0;0;0;0;0;0 -8473;législature;positive;0;0;0;0;0;0 -8474;légitime;positive;0;0;0;0;0;0 -8475;légitimité;positive;0;0;0;0;0;0 -8476;legs;positive;0;0;0;0;0;0 -8477;léguer;positive;0;0;0;0;0;0 -8478;légume;positive;0;0;0;0;0;0 -8479;légumineux;positive;0;0;0;0;0;0 -8480;lemme;positive;0;0;0;0;0;0 -8481;lendemain;positive;0;0;0;0;0;0 -8482;lent;negative;0;0;1;0;0;1 -8483;lentement;negative;0;0;0;0;0;0 -8484;lente;negative;0;0;1;0;0;1 -8485;lenteur;negative;0;1;1;0;0;0 -8486;lentille;positive;0;0;0;0;0;0 -8487;léopard;negative;0;1;0;0;0;0 -8488;lèpre;negative;0;1;1;0;0;1 -8489;le ?il bandé;negative;0;1;0;0;0;0 -8490;lesbianisme;negative;0;0;0;0;0;0 -8491;lesbien;negative;0;1;1;0;0;1 -8492;lésiner;negative;0;1;1;0;0;0 -8493;lessive;positive;0;0;0;0;0;0 -8494;lest;positive;0;0;0;0;0;0 -8495;lester;positive;0;0;0;0;0;0 -8496;létal;negative;0;1;1;0;0;1 -8497;léthargie;negative;0;0;1;0;0;0 -8498;léthargique;negative;0;1;1;0;0;0 -8499;lettre;positive;0;0;0;0;0;0 -8500;lettrer;positive;0;0;0;0;0;0 -8501;leucémie;negative;0;1;1;1;0;0 -8502;lever;positive;0;0;0;0;0;0 -8503;lever du jour;positive;0;0;0;0;0;0 -8504;lever du soleil;positive;0;0;0;0;0;0 -8505;levier;positive;0;0;0;0;0;0 -8506;lèvre;positive;0;0;0;0;0;0 -8507;lévrier;positive;0;0;0;0;0;0 -8508;levure;positive;0;0;0;0;0;0 -8509;lexique;positive;0;0;0;0;0;0 -8510;liaison;positive;0;0;0;0;0;0 -8511;libéralisme;positive;0;0;0;0;0;0 -8512;libération conditionnel;positive;0;0;0;0;0;0 -8513;libérer;positive;1;0;0;0;0;0 -8514;liberté;positive;0;0;0;0;1;0 -8515;libido;positive;1;0;0;0;0;0 -8516;libraire;positive;0;0;0;0;0;0 -8517;librairie;positive;0;0;0;0;0;0 -8518;libre;positive;1;0;0;0;0;0 -8519;librement;positive;0;0;0;0;0;0 -8520;licence;positive;0;0;0;0;0;0 -8521;licencier;negative;0;1;0;1;0;0 -8522;lichen;negative;0;0;0;0;0;1 -8523;licorne;positive;0;0;0;0;0;0 -8524;lier;positive;0;0;0;0;0;0 -8525;liège;positive;0;0;0;0;0;0 -8526;lien;positive;0;0;0;0;0;0 -8527;lieu;positive;0;0;0;0;0;0 -8528;lieu commun;positive;0;0;0;0;0;0 -8529;lieu de naissance;positive;0;0;0;1;0;0 -8530;lieu de prédilection;positive;0;0;0;0;0;0 -8531;lieu de travail;positive;0;0;0;0;0;0 -8532;lieu sûr;positive;0;0;0;0;0;0 -8533;lieutenant;positive;0;0;0;0;0;0 -8534;lièvre;negative;0;1;0;0;0;0 -8535;ligament;positive;0;0;0;0;0;0 -8536;ligature;positive;0;0;0;0;0;0 -8537;ligne;positive;0;0;0;1;0;0 -8538;lignée;positive;0;0;0;0;0;0 -8539;ligoter;negative;0;1;1;0;0;0 -8540;ligue;positive;0;0;0;0;0;0 -8541;lilas;positive;0;0;0;0;0;0 -8542;limace;negative;0;0;0;0;0;1 -8543;limaille;positive;0;0;0;0;0;0 -8544;limbe|limbes;negative;0;1;1;0;0;0 -8545;limier;positive;0;0;0;0;0;0 -8546;limitation;positive;0;0;0;0;0;0 -8547;limiter;negative;0;0;1;1;0;0 -8548;limoger;negative;0;0;1;0;0;0 -8549;limousine;positive;0;0;0;0;0;0 -8550;limpidité;positive;0;0;0;0;0;0 -8551;lin;positive;0;0;0;0;0;0 -8552;linceul;negative;0;0;1;0;0;0 -8553;linge à laver;positive;0;0;0;0;0;0 -8554;linge de lit;positive;0;0;0;0;0;0 -8555;linge de maison;positive;0;0;0;0;0;0 -8556;lingot;positive;0;0;0;0;0;0 -8557;lingual;positive;0;0;0;0;0;0 -8558;linguiste;positive;0;0;0;0;0;0 -8559;linguistique;positive;0;0;0;0;0;0 -8560;linoléum;positive;0;0;0;0;0;0 -8561;lion;positive;0;1;0;0;0;0 -8562;liquéfaction;negative;0;0;1;0;0;0 -8563;liquéfier;negative;0;0;1;0;0;0 -8564;liqueur;negative;0;0;1;1;0;0 -8565;liquidateur;negative;0;0;0;0;0;0 -8566;liquidation;negative;0;0;1;0;0;0 -8567;liquide;positive;0;0;0;0;0;0 -8568;liquider;negative;0;0;0;0;0;0 -8569;liquidité;positive;0;0;0;0;0;0 -8570;lire;positive;0;0;0;0;0;0 -8571;lire attentivement;positive;0;0;0;0;0;0 -8572;lisibilité;positive;0;0;0;0;0;0 -8573;lisible;positive;0;0;0;0;0;0 -8574;lisière;positive;0;0;0;0;0;0 -8575;lisse;positive;0;0;0;0;0;0 -8576;listage;positive;0;0;0;0;0;0 -8577;liste;positive;0;0;0;0;0;0 -8578;liste de vérification;positive;0;0;0;0;0;0 -8579;lister;positive;0;0;0;0;0;0 -8580;listing;positive;0;0;0;0;0;0 -8581;lit;positive;0;0;0;0;0;0 -8582;lit bébé;positive;0;0;0;0;0;0 -8583;lire d enfant;positive;0;0;0;0;0;0 -8584;litanie;positive;0;0;0;0;0;0 -8585;literie;positive;0;0;0;0;0;0 -8586;lithographie;positive;0;0;0;0;0;0 -8587;lithologie;positive;0;0;0;0;0;0 -8588;lithosphère;positive;0;0;0;0;0;0 -8589;litière;negative;0;0;0;0;0;1 -8590;litige;negative;0;1;1;1;0;0 -8591;litre;positive;0;0;0;0;0;0 -8592;littéraire;positive;0;0;0;0;0;0 -8593;littéralement;positive;0;0;0;0;0;0 -8594;littérature;positive;0;0;0;0;0;0 -8595;littoral;positive;0;0;0;0;0;0 -8596;liturgie;positive;0;0;0;0;0;0 -8597;livide;negative;0;1;0;1;0;1 -8598;livraison;positive;0;0;0;0;0;0 -8599;livre sterling;positive;0;0;0;0;0;0 -8600;livrer;positive;0;0;0;0;0;0 -8601;livre;positive;0;0;0;0;0;0 -8602;livresque;positive;0;0;0;0;0;0 -8603;livret;positive;0;0;0;0;0;0 -8604;lobbyiste;negative;0;0;0;0;0;0 -8605;lobe;positive;0;0;0;0;0;0 -8606;local;positive;0;0;0;0;0;0 -8607;localisation;positive;0;0;0;0;0;0 -8608;localiser;positive;0;0;0;0;0;0 -8609;localité;positive;0;0;0;0;0;0 -8610;locataire;positive;0;0;0;0;0;0 -8611;location;positive;0;0;0;0;0;0 -8612;loch;negative;0;1;0;0;0;0 -8613;locomotion;positive;0;0;0;0;0;0 -8614;locomotive;positive;0;0;0;0;0;0 -8615;locuste;negative;0;1;0;0;0;1 -8616;loft;positive;0;0;0;0;0;0 -8617;logarithme;positive;0;0;0;0;0;0 -8618;logarithmique;positive;0;0;0;0;0;0 -8619;loge;positive;0;0;0;0;0;0 -8620;loger;positive;0;0;0;0;0;0 -8621;logique;positive;0;0;0;0;0;0 -8622;logistique;positive;0;0;0;0;0;0 -8623;logo;positive;0;0;0;0;0;0 -8624;logotype;positive;0;0;0;0;0;0 -8625;loi;positive;0;0;0;0;0;0 -8626;lointain;negative;0;0;1;0;0;0 -8627;lointainests;negative;0;0;1;0;0;0 -8628;loisir;positive;0;0;0;0;1;0 -8629;lombaire;positive;0;0;0;0;0;0 -8630;long;positive;0;0;0;0;0;0 -8631;longe;positive;0;0;0;0;0;0 -8632;longévité;positive;0;0;0;0;0;0 -8633;longitude;positive;0;0;0;0;0;0 -8634;longitudinal;positive;0;0;0;0;0;0 -8635;longitudinalement;positive;0;0;0;0;0;0 -8636;longueur;positive;0;0;0;0;0;0 -8637;loquace;positive;0;0;0;0;0;0 -8638;loquet;positive;0;0;0;0;0;0 -8639;lorgner;negative;0;0;0;1;0;1 -8640;losange;positive;0;0;0;0;0;0 -8641;lot;positive;0;0;0;0;0;0 -8642;loterie;positive;0;1;0;0;1;0 -8643;lotion;positive;0;0;0;0;0;0 -8644;loto;positive;0;1;0;0;1;0 -8645;louange;positive;0;0;0;0;0;0 -8646;loucher;negative;0;0;0;0;0;0 -8647;louche;negative;0;1;1;0;0;0 -8648;louer;positive;0;0;0;0;0;0 -8649;loupe;positive;0;0;0;0;0;0 -8650;lourdaud;negative;0;0;0;0;0;1 -8651;lourde;negative;0;1;1;1;0;0 -8652;lourdement;negative;0;0;1;0;0;0 -8653;lourdeur;negative;0;0;0;0;0;0 -8654;loyer;positive;0;0;0;0;0;0 -8655;lubie;positive;1;0;0;0;0;0 -8656;lubrifiant;negative;0;0;0;0;0;1 -8657;lubrification;negative;0;0;0;0;0;1 -8658;lubrifier;negative;0;0;0;0;0;1 -8659;lubrique;negative;0;0;0;0;0;1 -8660;luciole;positive;0;0;0;0;0;0 -8661;lueur;positive;0;0;0;0;1;0 -8662;luge;positive;1;0;0;0;0;0 -8663;lugubre;negative;0;1;1;0;0;1 -8664;luire;positive;0;0;0;0;1;0 -8665;lumière;positive;0;0;0;0;0;0 -8666;lumière du étoile;positive;0;0;0;0;0;0 -8667;lumière du soleil;positive;1;0;0;0;0;0 -8668;luminescent;positive;1;0;0;0;0;0 -8669;luminosité;positive;1;0;0;0;0;0 -8670;lunaire;positive;0;0;0;0;0;0 -8671;lune;positive;0;0;0;0;0;0 -8672;lune de miel;positive;0;0;0;0;1;0 -8673;lunette;positive;0;0;0;0;0;0 -8674;lunette|lunettes;positive;0;0;0;0;0;0 -8675;lunette|lunettes de protection;positive;0;0;0;0;0;0 -8676;lunette|lunettes de soleil;positive;0;0;0;0;0;0 -8677;lustre;positive;1;0;0;0;0;0 -8678;luth;positive;0;0;0;0;0;0 -8679;lutte;negative;0;1;1;1;0;0 -8680;lutter;negative;0;1;0;1;0;0 -8681;luxe;positive;1;0;0;0;0;0 -8682;luxure;negative;0;0;0;0;0;0 -8683;luxuriant;positive;0;0;1;0;0;1 -8684;luzerne;positive;0;0;0;0;0;0 -8685;lymphatique;positive;0;0;0;0;0;0 -8686;lymphe;positive;0;0;0;0;0;0 -8687;lyncher;negative;0;1;1;1;0;1 -8688;lynx;negative;0;1;0;0;0;0 -8689;lyre;positive;1;0;0;0;0;0 -8690;lyrique;positive;1;0;0;0;0;0 -8691;lys;positive;0;0;0;0;0;0 -8692;mon chéri;positive;0;0;0;0;0;0 -8693;macabre;negative;0;1;1;0;0;1 -8694;macération;negative;0;0;1;0;0;1 -8695;mâcher;negative;0;0;0;0;0;1 -8696;machine;positive;0;0;0;0;0;0 -8697;machine à écrire;positive;0;0;0;0;0;0 -8698;machinerie;positive;0;0;0;0;0;0 -8699;machiniste;positive;0;0;0;0;0;0 -8700;mâchoire;positive;0;0;0;0;0;0 -8701;macis;negative;0;1;0;0;0;0 -8702;maçon;positive;0;0;0;0;0;0 -8703;madame;positive;0;0;0;0;0;0 -8704;mademoiselle;negative;0;0;0;0;0;0 -8705;mafia;negative;0;1;0;1;0;0 -8706;magasin;positive;0;0;0;0;0;0 -8707;magazine;positive;0;0;0;0;0;0 -8708;magenta;positive;0;0;0;0;0;0 -8709;magie;positive;0;0;0;0;1;0 -8710;magique;positive;0;0;0;0;1;0 -8711;magistrat;positive;0;0;0;0;0;0 -8712;magma;negative;0;1;0;0;0;0 -8713;magnat;positive;0;0;0;0;0;0 -8714;magnétisme;positive;0;0;0;0;0;0 -8715;magnétite;positive;0;0;0;0;0;0 -8716;magnificence;positive;0;0;0;0;0;0 -8717;magnifique;positive;0;0;0;0;1;0 -8718;magot;positive;0;0;0;0;0;0 -8719;maigre;negative;0;1;1;0;0;0 -8720;maille;positive;0;0;0;0;0;0 -8721;maillet;negative;0;1;0;1;0;0 -8722;maillon;positive;0;0;0;0;0;0 -8723;maillot;positive;0;0;0;0;0;0 -8724;main;positive;0;0;0;0;0;0 -8725;maintenance;positive;0;0;0;0;0;0 -8726;maintenir son vitesse;positive;0;0;0;0;0;0 -8727;maintes foi|fois;positive;0;0;0;0;0;0 -8728;maintien;positive;1;0;0;0;0;0 -8729;maire;positive;0;0;0;0;0;0 -8730;maison;positive;0;0;0;0;0;0 -8731;maison clore;negative;0;0;0;0;0;1 -8732;maison de maître;positive;0;0;0;0;0;0 -8733;maison de ville;positive;0;0;0;0;0;0 -8734;maisonnée;positive;0;0;0;0;0;0 -8735;maître;positive;0;0;0;0;0;0 -8736;maître de conférence;positive;0;0;0;0;0;0 -8737;maîtriser un sujet;positive;0;0;0;0;0;0 -8738;majeur;positive;0;0;0;0;0;0 -8739;majordome;positive;0;0;0;0;0;0 -8740;majorité;positive;0;0;0;0;0;0 -8741;majuscule;positive;0;0;0;0;0;0 -8742;mal à l aise;negative;0;0;0;0;0;0 -8743;mal assortir;negative;0;0;0;0;0;1 -8744;mal assurer;negative;0;1;0;0;1;0 -8745;mal comprendre;negative;0;1;1;1;0;0 -8746;mal de dent;negative;0;1;1;0;0;1 -8747;mal de tête;negative;0;0;1;0;0;0 -8748;mal du pays;negative;0;0;1;0;0;0 -8749;mal informer;negative;0;1;1;0;0;0 -8750;mal renseigner;negative;0;1;1;0;0;0 -8751;mal être;negative;0;0;1;0;0;0 -8752;maladie;negative;0;1;1;1;0;1 -8753;maladresse;negative;0;1;0;0;0;1 -8754;malais|malaise;negative;0;1;1;0;0;0 -8755;malaria;negative;0;1;1;0;0;1 -8756;malaxer;positive;0;0;0;0;0;0 -8757;malchance;negative;0;1;1;0;0;0 -8758;malédiction;negative;0;1;1;1;0;1 -8759;malencontreux;negative;0;0;1;0;0;0 -8760;malentendu;negative;0;1;1;1;0;0 -8761;malfaçon;negative;0;1;0;0;0;1 -8762;malformation;negative;0;1;1;0;1;1 -8763;malfrat;negative;0;1;0;1;0;1 -8764;malheur;negative;0;1;1;0;0;1 -8765;malheureusement;negative;0;0;1;0;0;0 -8766;malhonnête;negative;0;0;1;1;0;1 -8767;malhonnêteté;negative;0;0;1;1;0;1 -8768;malice;negative;0;1;0;1;0;1 -8769;malicieux;negative;0;1;0;1;1;0 -8770;malignité;negative;0;1;1;0;0;0 -8771;maline;positive;0;0;0;0;0;0 -8772;maline|malines;positive;0;0;0;0;0;0 -8773;malle;negative;0;0;0;0;0;0 -8774;malpoli;negative;0;0;0;0;0;1 -8775;malsain;negative;0;1;1;0;0;1 -8776;maltraitance;negative;0;1;1;1;0;1 -8777;maltraiter;negative;0;1;1;1;0;1 -8778;malveilants;negative;0;0;0;1;0;0 -8779;malveillance;negative;0;1;0;1;0;0 -8780;malversation;negative;0;0;0;0;0;1 -8781;maman;positive;0;1;0;0;0;0 -8782;mamelon;positive;0;0;0;0;0;0 -8783;mammifère;positive;0;0;0;0;0;0 -8784;mammouth;negative;0;1;0;0;0;0 -8785;management;positive;0;0;0;0;0;0 -8786;manche;positive;0;0;0;0;0;0 -8787;manchette;positive;0;0;0;0;0;0 -8788;mandamus;negative;0;1;0;0;0;0 -8789;mandarin;positive;0;0;0;0;0;0 -8790;mandarine;positive;0;0;0;0;0;0 -8791;mandataire;positive;0;0;0;0;0;0 -8792;mandater;positive;0;0;0;0;0;0 -8793;mandibule;negative;0;1;0;0;0;0 -8794;mandoline;positive;0;0;0;0;0;0 -8795;mandrin;negative;0;0;0;0;0;0 -8796;manège;positive;1;0;0;0;0;0 -8797;manette;positive;0;0;0;0;0;0 -8798;manette du gaz;negative;0;0;0;1;0;0 -8799;manger;positive;0;0;0;0;0;0 -8800;mangeoire;positive;0;0;0;0;0;0 -8801;mangeur;positive;0;0;0;0;0;0 -8802;mangoustanier;positive;0;0;0;0;0;0 -8803;mangue;positive;0;0;0;0;0;0 -8804;maniaque;negative;0;1;0;1;0;0 -8805;manie;negative;0;0;1;1;0;0 -8806;manier;positive;0;0;0;0;0;0 -8807;maniérer;negative;0;0;0;0;0;0 -8808;manif;positive;0;0;0;0;0;0 -8809;manifester;positive;0;0;0;0;0;0 -8810;manifestement;positive;0;0;0;0;0;0 -8811;manifester contre;negative;0;0;0;1;0;0 -8812;manifester violemment;negative;0;1;0;1;0;0 -8813;manifestesévidents;positive;0;0;0;0;0;0 -8814;manigancer;positive;0;0;0;0;0;0 -8815;manipulation;negative;0;1;1;1;1;0 -8816;manivelle;negative;0;0;0;1;0;0 -8817;manne;positive;1;0;0;0;0;0 -8818;mannequin;negative;0;0;0;0;0;1 -8819;man?uvrer;positive;0;0;0;0;0;0 -8820;man?uvre;positive;0;0;0;0;0;0 -8821;manoir;negative;0;1;0;0;0;0 -8822;manquer;negative;0;1;1;0;0;0 -8823;manquer de;negative;0;0;1;0;0;0 -8824;manque de confiance;negative;0;1;0;1;0;1 -8825;manque de respect;negative;0;0;0;1;0;0 -8826;manquement;negative;0;0;0;0;0;1 -8827;manquer de respect;negative;0;0;0;1;0;0 -8828;manteau;positive;0;0;0;0;0;0 -8829;manucure;positive;0;0;0;0;0;0 -8830;manucurer;positive;0;0;0;0;0;0 -8831;manuel;positive;0;0;0;0;0;0 -8832;manuscrit;positive;0;0;0;0;0;0 -8833;maquereau;negative;0;1;0;0;0;1 -8834;maquillage;positive;0;0;0;0;0;0 -8835;marasme;negative;0;1;1;0;0;1 -8836;marbre;positive;0;0;0;0;0;0 -8837;marbrer;positive;0;0;0;0;0;0 -8838;marchander;positive;0;0;0;0;0;0 -8839;marchandise;positive;0;1;0;0;0;0 -8840;marcher;positive;0;0;0;0;0;0 -8841;marcher à quatre patte;negative;0;0;1;0;0;1 -8842;marche;positive;0;0;0;0;0;0 -8843;mare;negative;0;0;0;0;0;1 -8844;maréchal;positive;0;0;0;0;0;0 -8845;maréchal ferrant;positive;0;0;0;0;0;0 -8846;marée;negative;0;1;0;0;0;0 -8847;marge de man?uvre;positive;0;0;0;0;0;0 -8848;mari tromper;negative;0;0;1;0;0;1 -8849;mariage;positive;0;0;0;0;0;0 -8850;marier;positive;0;0;0;0;0;0 -8851;marijuana;negative;0;0;0;0;0;1 -8852;marin;positive;0;0;0;0;0;0 -8853;marine;positive;0;0;0;0;0;0 -8854;marionnette;negative;0;0;0;0;0;0 -8855;maritime;positive;0;0;0;0;0;0 -8856;marmelade;positive;0;0;0;0;0;0 -8857;marmite;positive;0;0;0;0;0;0 -8858;marne;positive;0;0;0;0;0;0 -8859;marner;positive;0;0;0;0;0;0 -8860;marque de coup;negative;0;0;0;0;0;0 -8861;marquer;positive;0;0;0;0;0;0 -8862;marqueter;negative;0;0;0;0;0;0 -8863;marqueterie;negative;0;0;0;0;0;0 -8864;marquis;positive;0;0;0;0;0;0 -8865;marrer;positive;1;0;0;0;0;0 -8866;marrant;positive;1;0;0;0;0;0 -8867;marron;positive;0;0;0;0;0;0 -8868;mars;positive;0;0;0;0;0;0 -8869;marteau;negative;0;1;0;1;0;0 -8870;martelage;negative;0;0;0;1;0;0 -8871;marteler;negative;0;0;0;1;0;0 -8872;martial;positive;0;0;0;1;0;0 -8873;martingale;positive;0;0;0;0;0;0 -8874;martyr;negative;0;1;1;0;0;0 -8875;martyriser;negative;0;1;1;0;0;0 -8876;mascarade;negative;0;0;0;0;1;0 -8877;masculin;positive;0;0;0;0;0;0 -8878;masochisme;negative;0;1;0;1;0;1 -8879;masque;negative;0;1;0;0;0;0 -8880;masquer;negative;0;1;0;0;0;0 -8881;massage;positive;1;0;0;0;0;0 -8882;masse;negative;0;1;0;0;0;0 -8883;masser;positive;1;0;0;0;0;0 -8884;massif;negative;0;1;0;0;0;0 -8885;mastiquer;negative;0;0;0;0;0;1 -8886;mastiquer bruyamment;negative;0;0;0;0;0;1 -8887;masturbation;positive;1;0;0;0;0;0 -8888;masturber;positive;1;0;0;0;0;0 -8889;match;positive;0;0;0;0;0;0 -8890;mat;negative;0;1;0;0;0;0 -8891;matelasser;positive;0;0;0;0;0;0 -8892;matelot;positive;0;0;0;0;0;0 -8893;matérialiser;positive;0;0;0;0;0;0 -8894;matérialisme;negative;0;0;1;0;0;0 -8895;matérialiste;negative;0;0;1;0;0;1 -8896;matérialité;negative;0;0;0;0;0;0 -8897;matériau|matériaux;positive;0;0;0;0;0;0 -8898;matériel de guerre;negative;0;1;0;0;0;0 -8899;matériel informatique;positive;0;0;0;0;0;0 -8900;matériellement;positive;0;0;0;0;0;0 -8901;maternité;positive;0;0;0;0;0;0 -8902;mathématique;positive;0;0;0;0;0;0 -8903;matière;negative;0;0;0;1;0;1 -8904;matière gluant;negative;0;0;0;0;0;1 -8905;matière fécal;negative;0;0;0;0;0;1 -8906;matin;positive;0;0;0;0;0;0 -8907;matinée;positive;0;0;0;0;0;0 -8908;matou;positive;0;0;0;0;0;0 -8909;matraque;negative;0;1;0;1;0;0 -8910;matraquer;negative;0;0;0;1;0;0 -8911;matrice;positive;0;0;0;0;0;0 -8912;matrone;positive;0;0;0;0;0;0 -8913;maturité;positive;0;0;0;0;0;0 -8914;maugréer;negative;0;0;1;1;0;0 -8915;mausolée;negative;0;0;1;0;0;0 -8916;maussadeq;negative;0;0;1;1;0;0 -8917;mauvais;negative;0;1;1;1;0;1 -8918;mauvais comportement;negative;0;0;0;1;1;1 -8919;mauvais conduite;negative;0;0;0;1;1;1 -8920;mauvais gestion;negative;0;1;1;0;0;0 -8921;mauvais herbe;negative;0;0;0;0;0;1 -8922;mauvais réputation;negative;0;0;1;0;0;1 -8923;mauvais passe;negative;0;1;1;0;0;0 -8924;mauve;positive;0;0;0;0;0;0 -8925;mauviette;negative;0;1;0;0;0;1 -8926;mal;negative;0;0;1;0;0;0 -8927;maximal;positive;0;0;0;0;0;0 -8928;maxime;positive;0;0;0;0;0;0 -8929;méandre;negative;0;1;1;0;0;0 -8930;mécanique;positive;0;0;0;0;0;0 -8931;mécénat;positive;0;0;0;0;0;0 -8932;mécène;positive;0;0;0;0;0;0 -8933;méchanceté;negative;0;1;0;1;0;1 -8934;méchant;negative;0;1;1;1;0;1 -8935;mèche;positive;0;0;0;0;0;0 -8936;mécontent;negative;0;1;1;1;0;1 -8937;mécontentement;negative;0;1;1;1;0;1 -8938;médaille;positive;0;0;0;0;1;0 -8939;médailler;positive;1;0;0;0;0;0 -8940;médaillon;positive;0;0;0;0;0;0 -8941;médecin;positive;0;0;0;0;0;0 -8942;médecine;positive;0;0;0;0;0;0 -8943;médecine légal;positive;0;0;0;0;0;0 -8944;média;positive;0;0;0;0;0;0 -8945;médian;positive;0;0;0;0;0;0 -8946;medias;positive;0;0;0;0;0;0 -8947;médias;positive;0;0;0;0;0;0 -8948;médiateur;positive;0;0;0;0;0;0 -8949;médiation;positive;0;0;0;0;0;0 -8950;médical;positive;0;1;0;0;0;0 -8951;médicament;negative;0;0;0;0;0;0 -8952;médicinal;positive;0;0;0;0;0;0 -8953;médico légal;positive;0;0;0;0;0;0 -8954;médiéval;negative;0;0;0;0;0;0 -8955;médiocre;negative;0;0;0;1;0;1 -8956;médiocrité;negative;0;0;0;1;0;1 -8957;méditatif;positive;0;0;0;0;0;0 -8958;méditation;positive;0;0;0;0;0;0 -8959;méditer;positive;0;0;0;0;0;0 -8960;médium;positive;0;0;0;0;0;0 -8961;medley;positive;0;0;0;0;0;0 -8962;méduser;negative;0;1;0;0;1;1 -8963;meeting;positive;0;0;0;0;0;0 -8964;méfait;negative;0;1;1;1;0;1 -8965;méfiance;negative;0;1;0;1;0;1 -8966;méfiant;negative;0;1;0;1;1;0 -8967;meilleur;positive;0;0;0;0;0;0 -8968;mélancolie;negative;0;0;1;0;0;0 -8969;mélancoliquement;negative;0;0;1;0;0;0 -8970;mélasse;negative;0;0;0;0;0;1 -8971;mêler;positive;0;0;0;0;0;0 -8972;mélodie;positive;0;0;0;0;0;0 -8973;mélodramatique;negative;0;0;1;0;0;0 -8974;mélodrame;negative;0;0;1;1;0;0 -8975;membrane;positive;0;0;0;0;0;0 -8976;membre;positive;0;0;0;0;0;0 -8977;membre du congrès;positive;0;0;0;0;0;0 -8978;même si;negative;0;0;0;0;0;0 -8979;mémo;positive;0;0;0;0;0;0 -8980;mémoire;positive;0;0;0;0;0;0 -8981;mémorable;positive;0;0;0;0;1;0 -8982;memorial;positive;0;0;0;0;0;0 -8983;mémorial;positive;0;0;0;0;0;0 -8984;mémoriaux;negative;0;0;1;0;0;0 -8985;mémoriser;positive;0;0;0;0;0;0 -8986;menacer;negative;0;1;0;1;0;1 -8987;menaçant;negative;0;1;0;1;0;1 -8988;menace;negative;0;1;0;1;0;0 -8989;ménage;positive;0;0;0;0;0;0 -8990;ménagerie;negative;0;0;0;1;1;1 -8991;menançante;negative;0;1;0;0;0;0 -8992;mener;positive;0;0;0;0;0;0 -8993;mençants;negative;0;1;0;1;0;0 -8994;mendicité;negative;0;0;1;0;0;0 -8995;mendier;negative;0;0;1;0;0;1 -8996;ménestrel;positive;0;0;0;0;0;0 -8997;meneur;positive;0;0;0;0;0;0 -8998;ménisque;positive;0;0;0;0;0;0 -8999;mensonge;negative;0;0;1;1;0;1 -9000;mensonger;negative;0;0;0;1;0;1 -9001;mensualité;positive;0;0;0;0;0;0 -9002;mensuel;positive;0;0;0;0;0;0 -9003;mensuellement;positive;0;0;0;0;0;0 -9004;mental;negative;0;0;0;0;0;0 -9005;menthe;positive;0;0;0;0;0;0 -9006;mention;positive;0;0;0;0;0;0 -9007;mentionner ci dessus;positive;0;0;0;0;0;0 -9008;mentionner;positive;0;0;0;0;0;0 -9009;mentir;negative;0;0;1;1;0;1 -9010;mentor;positive;0;0;0;0;0;0 -9011;menuisier;positive;0;0;0;0;0;0 -9012;menu détail;negative;0;0;0;0;0;0 -9013;mépriser;negative;0;0;0;1;0;1 -9014;méprisant;negative;0;0;0;1;0;1 -9015;méprise;negative;0;1;1;1;0;0 -9016;mer;positive;0;0;0;0;0;0 -9017;mercantile;positive;0;0;0;0;0;0 -9018;mercenaire;negative;0;1;0;1;0;0 -9019;merde;negative;0;0;0;1;0;1 -9020;mère;positive;0;0;1;0;0;0 -9021;mère porteur;positive;0;0;0;0;0;0 -9022;méridien;positive;0;0;0;0;0;0 -9023;méridien|méridienne;positive;0;0;0;0;0;0 -9024;méritant;positive;0;0;0;0;0;0 -9025;mérite;positive;0;0;0;0;0;0 -9026;méritoire;positive;0;0;0;0;0;0 -9027;merveille;positive;0;0;0;0;1;0 -9028;merveilleusement;positive;0;0;0;0;1;0 -9029;mesa;positive;0;0;0;0;0;0 -9030;mésange;positive;0;0;0;0;0;0 -9031;mésaventure;negative;0;1;1;0;1;1 -9032;mesquin;negative;0;0;1;1;0;1 -9033;message;positive;0;0;0;0;0;0 -9034;mesurable;positive;0;0;0;0;0;0 -9035;mesurer;positive;0;0;0;0;0;0 -9036;mesure;positive;0;0;0;0;0;0 -9037;métabolisme;positive;0;0;0;0;0;0 -9038;métal;positive;0;0;0;0;0;0 -9039;métallurgie;positive;0;0;0;0;0;0 -9040;métamorphose;negative;0;0;0;0;0;0 -9041;métaphore;positive;0;0;0;0;0;0 -9042;métaphorique;positive;0;0;0;0;0;0 -9043;métaphysique;positive;0;0;0;0;0;0 -9044;métastase;negative;0;0;1;0;0;0 -9045;météo;positive;0;0;0;0;0;0 -9046;météore;negative;0;1;0;0;0;0 -9047;météorique;negative;0;1;0;0;1;0 -9048;météorite;negative;0;1;0;0;0;0 -9049;météorologie;positive;0;0;0;0;0;0 -9050;météorologique;positive;0;0;0;0;0;0 -9051;méthanol;negative;0;0;0;0;0;1 -9052;méthode;positive;0;0;0;0;0;0 -9053;méthode thérapeutique;positive;0;0;0;0;0;0 -9054;méthodique;positive;0;0;0;0;0;0 -9055;métier à tisser;negative;0;1;0;0;0;0 -9056;mètre;positive;0;0;0;0;0;0 -9057;métrique;positive;0;0;0;0;0;0 -9058;métrologie;positive;0;0;0;0;0;0 -9059;métropole;positive;0;0;0;0;0;0 -9060;métropolitain;positive;0;0;0;0;0;0 -9061;mets fin;positive;0;0;0;0;0;0 -9062;mettre;positive;0;0;0;0;0;0 -9063;mettre à contribution;positive;0;0;0;0;0;0 -9064;mettre à quai;positive;0;0;0;0;0;0 -9065;mettre à sac;negative;0;0;0;1;0;0 -9066;mettre au chenil;negative;0;0;1;0;0;0 -9067;mettre au défi;negative;0;1;0;1;0;0 -9068;mettre au défi de faire qch;positive;0;0;0;0;0;0 -9069;mettre au garage;positive;0;0;0;0;0;0 -9070;mettre au jour;positive;0;0;0;0;1;0 -9071;mettre bas;negative;0;0;0;0;0;1 -9072;mettre dans un tableau;positive;0;0;0;0;0;0 -9073;mettre en bouteille;positive;0;0;0;0;0;0 -9074;mettre en cage;negative;0;1;1;0;0;0 -9075;mettre en commun;positive;0;0;0;0;0;0 -9076;mettre en danger;negative;0;1;0;1;0;0 -9077;mettre en gage;negative;0;0;0;0;0;0 -9078;mettre en péril;negative;0;1;0;1;0;0 -9079;mettre en pratique;positive;0;0;0;0;0;0 -9080;mettre en scène;positive;0;0;0;0;0;0 -9081;mettre en tombola;positive;0;0;0;0;1;0 -9082;mettre en vigueur;positive;0;0;0;0;0;0 -9083;mettre fin;negative;0;1;1;0;0;0 -9084;mettre l accent sur;positive;0;0;0;0;0;0 -9085;mettre le pression;negative;0;1;0;1;0;0 -9086;mettre pied à terre;positive;0;0;0;0;0;0 -9087;mettre sous calmer;positive;0;0;0;0;0;0 -9088;mettre sous sédatif;positive;0;0;0;0;0;0 -9089;mettre sur cric;positive;0;0;0;0;0;0 -9090;mettre un corset;positive;0;0;0;0;0;0 -9091;mettre un terme à;negative;0;0;1;0;0;0 -9092;meuble de rangement;positive;0;0;0;0;0;0 -9093;meubler;positive;0;0;0;0;0;0 -9094;meuble;positive;0;0;0;0;0;0 -9095;meuglement;negative;0;1;1;1;0;0 -9096;meugler;negative;0;1;1;1;0;0 -9097;meule;negative;0;0;0;0;0;0 -9098;meuleuse;negative;0;1;0;0;0;0 -9099;meute;positive;0;0;0;0;0;0 -9100;miaou;negative;0;1;1;0;0;0 -9101;miaulement;negative;0;1;1;0;0;0 -9102;miauler;negative;0;1;1;0;0;0 -9103;mica;positive;0;0;0;0;0;0 -9104;miche;positive;0;0;0;0;0;0 -9105;micro;positive;0;0;0;0;0;0 -9106;microbe;negative;0;1;0;0;0;1 -9107;microbiologie;positive;0;0;0;0;0;0 -9108;microcosme;positive;0;0;0;0;0;0 -9109;microgramme;positive;0;0;0;0;0;0 -9110;micromètre;positive;0;0;0;0;0;0 -9111;micron;positive;0;0;0;0;0;0 -9112;microphone;positive;0;0;0;0;0;0 -9113;microscope;positive;0;0;0;0;0;0 -9114;microscopie;positive;0;0;0;0;0;0 -9115;microscopique;negative;0;0;0;0;0;0 -9116;midi;positive;0;0;0;0;0;0 -9117;miel;positive;0;0;0;0;0;0 -9118;miette;negative;0;0;0;0;0;0 -9119;mignon;positive;1;0;0;0;0;0 -9120;migraine;negative;0;0;1;0;0;0 -9121;migrant;negative;0;0;0;0;0;0 -9122;migrateur;negative;0;0;0;0;0;0 -9123;migration;negative;0;1;1;0;0;0 -9124;migrer;negative;0;0;0;0;0;0 -9125;mijoter;positive;0;0;0;1;0;0 -9126;mildiou;negative;0;0;0;0;0;1 -9127;mile;positive;0;0;0;0;0;0 -9128;milice;negative;0;1;1;1;0;0 -9129;milieu;positive;0;0;0;0;0;0 -9130;milieu de l être;positive;1;0;0;0;0;0 -9131;militaire;positive;0;1;0;1;0;0 -9132;mille;positive;0;0;0;0;0;0 -9133;mille milliard;positive;0;0;0;0;0;0 -9134;millénaire;positive;0;0;0;0;0;0 -9135;milliard;positive;0;0;0;0;0;0 -9136;millier;positive;0;0;0;0;0;0 -9137;milligramme;positive;0;0;0;0;0;0 -9138;millimètre;positive;0;0;0;0;0;0 -9139;million;positive;0;0;0;0;0;0 -9140;millionnaire;positive;0;0;0;0;0;0 -9141;mimer;negative;0;0;0;0;0;0 -9142;mime;positive;0;0;0;0;0;0 -9143;mimétisme;negative;0;0;0;0;1;0 -9144;minable;negative;0;1;0;1;0;1 -9145;miner;negative;0;1;1;0;0;0 -9146;minerai;positive;0;0;0;0;0;0 -9147;minéral;positive;0;0;0;0;0;0 -9148;minéralogie;positive;0;0;0;0;0;0 -9149;minet;positive;0;0;0;0;0;0 -9150;mineur;positive;0;0;0;0;0;0 -9151;minibus;positive;0;0;0;0;0;0 -9152;minimiser;negative;0;0;1;0;0;0 -9153;minimum;negative;0;0;1;0;0;0 -9154;ministère;positive;0;0;0;0;0;0 -9155;ministre;positive;0;0;0;0;0;0 -9156;minivan;positive;0;0;0;0;0;0 -9157;minorité;negative;0;1;1;0;0;0 -9158;minou;positive;0;0;0;0;0;0 -9159;minuit;positive;0;0;0;0;0;0 -9160;minute;positive;0;0;0;0;0;0 -9161;miracle;positive;0;0;0;0;1;0 -9162;mirage;negative;0;0;0;0;1;0 -9163;miroir;positive;0;0;0;0;0;0 -9164;miroitement;positive;1;0;0;0;0;0 -9165;miroiter;positive;1;0;0;0;0;0 -9166;mise au point;positive;0;0;0;0;0;0 -9167;mettre en accusation;negative;0;1;0;1;0;1 -9168;mettre en conserve;positive;0;0;0;0;0;0 -9169;mettre en évidence;positive;0;0;0;0;0;0 -9170;mettre en examen;negative;0;1;0;0;0;0 -9171;mettre en garde;negative;0;1;0;0;0;0 -9172;mettre en ?uvre;positive;0;0;0;0;0;0 -9173;mettre en tableau x;positive;0;0;0;0;0;0 -9174;misérable;negative;0;0;1;1;0;1 -9175;misérablement;negative;0;0;1;0;0;0 -9176;misère;negative;0;1;1;1;0;1 -9177;miséricorde;positive;0;0;0;0;0;0 -9178;missile;negative;0;1;0;0;0;0 -9179;mission;positive;0;0;0;0;0;0 -9180;missionnaire;positive;0;0;0;0;0;0 -9181;missive;positive;0;0;0;0;0;0 -9182;mite;negative;0;1;0;0;0;1 -9183;miteux;negative;0;0;0;0;0;1 -9184;mitonner;positive;0;0;0;1;0;0 -9185;mitre;positive;0;0;0;0;0;0 -9186;mixer;positive;0;0;0;0;0;0 -9187;mixte;positive;0;0;0;0;0;0 -9188;mobile;positive;0;0;1;0;0;0 -9189;mobilier;positive;0;0;0;0;0;0 -9190;mobilisation;positive;0;0;0;0;0;0 -9191;mobiliser;positive;0;0;0;0;0;0 -9192;mobilité;positive;0;0;0;0;0;0 -9193;modal;positive;0;0;0;0;0;0 -9194;modalité;positive;0;0;0;0;0;0 -9195;mode;positive;0;0;0;0;0;0 -9196;modelage;positive;0;0;0;0;0;0 -9197;modeleur;positive;0;0;0;0;0;0 -9198;modéliste;positive;0;0;0;0;0;0 -9199;modération;positive;0;0;0;0;0;0 -9200;modérément;positive;0;0;0;0;0;0 -9201;moderne;positive;0;0;0;0;0;0 -9202;modernisme;positive;0;0;0;0;0;0 -9203;modestement;positive;0;0;0;0;0;0 -9204;modestie;positive;0;0;0;0;0;0 -9205;modifiable;positive;0;0;0;0;0;0 -9206;modification;negative;0;0;1;0;0;1 -9207;modifier;negative;0;0;1;0;0;1 -9208;modulation;positive;0;0;0;0;0;0 -9209;module;positive;0;0;0;0;0;0 -9210;moduler;positive;0;0;0;0;0;0 -9211;moelle;positive;0;0;0;0;0;0 -9212;moelle osseux;positive;0;0;0;0;0;0 -9213;moignon;negative;0;0;0;0;0;1 -9214;moindre;negative;0;0;1;0;0;1 -9215;moine;positive;0;0;0;0;0;0 -9216;moi|mois;positive;0;0;0;0;0;0 -9217;moisir;negative;0;0;0;0;0;1 -9218;moisissure;negative;0;0;0;0;0;1 -9219;moisson;positive;0;0;0;0;0;0 -9220;moissonner;positive;0;0;0;0;0;0 -9221;molaire;positive;0;0;0;0;0;0 -9222;moléculaire;positive;0;0;0;0;0;0 -9223;molécule;positive;0;0;0;0;0;0 -9224;mollusque;negative;0;0;0;0;0;1 -9225;moment;positive;0;0;0;0;0;0 -9226;momentané;negative;0;0;0;0;0;0 -9227;momie;negative;0;1;1;0;0;1 -9228;monade;positive;0;0;0;0;0;0 -9229;monarchie;positive;0;0;0;0;0;0 -9230;monarque;positive;0;0;0;0;0;0 -9231;monastère;positive;0;0;0;0;0;0 -9232;monastique;positive;0;0;0;0;0;0 -9233;monde;positive;0;0;0;0;0;0 -9234;mondial;positive;0;0;0;0;0;0 -9235;monétaire;positive;0;0;0;0;0;0 -9236;monnaie;positive;0;0;0;1;1;0 -9237;monochrome;negative;0;0;1;0;0;1 -9238;monocle;positive;0;0;0;0;0;0 -9239;monocouche;positive;0;0;0;0;0;0 -9240;monogamie;positive;0;0;0;0;0;0 -9241;monogramme;positive;0;0;0;0;0;0 -9242;monographie;positive;0;0;0;0;0;0 -9243;monologue;negative;0;0;0;0;0;0 -9244;monopole;positive;0;0;0;0;0;0 -9245;monopoliste;negative;0;0;0;1;0;0 -9246;monotone;negative;0;0;1;0;0;0 -9247;monotonie;negative;0;0;1;0;0;0 -9248;monsieur;positive;0;0;0;0;0;0 -9249;monstre;negative;0;1;0;1;1;1 -9250;monstruosité;negative;0;1;0;1;1;1 -9251;mont;positive;0;0;0;0;0;0 -9252;montage;positive;0;0;0;0;0;0 -9253;montagne;positive;0;0;0;0;0;0 -9254;montagne russe;negative;0;1;0;0;0;0 -9255;montant;positive;0;0;0;0;0;0 -9256;monter charge;positive;0;0;0;0;0;0 -9257;monticule;negative;0;0;0;0;0;1 -9258;montrer;positive;0;1;0;0;0;0 -9259;montrer bracelet;positive;0;0;0;0;0;0 -9260;monture;positive;0;0;0;0;0;0 -9261;monument;positive;0;0;0;0;0;0 -9262;monumental;positive;0;0;0;0;0;0 -9263;monumentaux;positive;0;0;0;0;0;0 -9264;moquerie;negative;0;1;1;1;0;1 -9265;moral;positive;0;0;0;1;0;0 -9266;moralité;positive;0;0;0;0;0;0 -9267;moratoire;negative;0;0;1;0;0;0 -9268;morbide;negative;0;0;1;0;0;1 -9269;morbidité;negative;0;1;1;1;0;1 -9270;mordillement;negative;0;1;1;0;1;0 -9271;mordre;negative;0;0;0;1;0;0 -9272;morgue;negative;0;1;1;0;0;1 -9273;moribond;negative;0;0;1;0;0;0 -9274;morphine;negative;0;0;0;0;0;0 -9275;morphisme;positive;0;0;0;0;0;0 -9276;morphologie;positive;0;0;0;0;0;0 -9277;morsure;negative;0;0;0;1;0;0 -9278;mort naître;negative;0;0;1;0;0;0 -9279;mortalité;negative;0;1;1;1;0;0 -9280;mourir;negative;0;0;1;0;0;1 -9281;mortier;negative;0;1;0;1;0;0 -9282;mortification;negative;0;1;1;0;1;1 -9283;mort;negative;0;0;1;0;0;1 -9284;mortuaire;negative;0;1;1;0;0;0 -9285;morue;negative;0;0;0;0;0;0 -9286;morveux;negative;0;0;0;1;0;0 -9287;mosaïque;positive;0;0;0;0;0;0 -9288;mosquée;positive;0;0;0;1;0;0 -9289;mot;positive;0;0;0;0;0;0 -9290;mot pour mot;positive;0;0;0;0;0;0 -9291;moteur;positive;0;0;0;0;0;0 -9292;motif;positive;0;0;0;0;0;0 -9293;motif écossais;positive;0;0;0;0;0;0 -9294;motion;positive;0;0;0;0;0;0 -9295;motivation;positive;0;0;0;0;0;0 -9296;moto;positive;0;0;0;0;0;0 -9297;motocycliste;positive;0;0;0;0;0;0 -9298;moucharder;negative;0;0;0;0;0;0 -9299;mouche;positive;0;0;0;0;0;0 -9300;moucher;negative;0;0;0;0;1;1 -9301;moucheron;negative;0;0;0;0;0;0 -9302;moucheter;negative;0;0;0;0;0;0 -9303;mouchoir;negative;0;0;1;0;0;1 -9304;moudre;negative;0;0;0;1;0;0 -9305;mouette;negative;0;1;0;0;0;1 -9306;mouillage;positive;0;0;1;0;0;0 -9307;mouillant;positive;0;0;0;0;0;0 -9308;mouiller;negative;0;0;0;0;0;1 -9309;mouler;positive;0;0;0;0;0;0 -9310;moulin à vent;positive;0;0;0;0;0;0 -9311;mouliner;negative;0;0;0;0;0;0 -9312;moulinet;negative;0;0;0;0;0;0 -9313;mourant;negative;0;1;1;1;0;1 -9314;mousquet;negative;0;1;0;0;0;0 -9315;moussant;negative;0;0;0;0;0;1 -9316;mousseline;positive;0;0;0;0;0;0 -9317;mousson;negative;0;1;1;0;0;0 -9318;moussu;negative;0;0;0;0;0;1 -9319;moustache;positive;0;0;0;0;0;0 -9320;moustique;negative;0;1;0;1;0;1 -9321;moutarde;negative;0;0;0;0;0;0 -9322;mouton;positive;0;0;0;0;0;0 -9323;mouture;negative;0;0;0;1;0;1 -9324;mouvement constant;negative;0;0;0;0;0;0 -9325;mouvementer;negative;0;1;0;1;0;0 -9326;moyen;positive;0;0;0;0;0;0 -9327;moyen de subsistance;positive;0;0;0;0;0;0 -9328;moyeu;positive;0;0;0;0;0;0 -9329;mucosité;negative;0;0;0;0;0;1 -9330;mucus;negative;0;0;0;0;0;1 -9331;muet;negative;0;1;1;0;1;1 -9332;mugir;negative;0;1;1;1;0;0 -9333;mule;negative;0;0;0;1;0;0 -9334;multilatéral;positive;0;0;0;0;0;0 -9335;multiple;positive;0;0;0;0;0;0 -9336;multiplex;positive;0;0;0;0;0;0 -9337;multiplicateur;positive;0;0;0;0;0;0 -9338;multiplication;positive;0;0;0;0;0;0 -9339;multiplicité;positive;0;0;0;0;0;0 -9340;multiplier;positive;0;0;0;0;0;0 -9341;multitude;positive;0;0;0;0;0;0 -9342;municipal;positive;0;0;0;0;0;0 -9343;municipalité;positive;0;0;0;0;0;0 -9344;munir;positive;0;0;0;0;0;0 -9345;munition;negative;0;1;0;1;0;0 -9346;mùouvenmentée;negative;0;1;0;1;0;0 -9347;muqueuse;negative;0;0;0;0;0;1 -9348;muqueux;negative;0;0;0;0;0;1 -9349;mûre;positive;0;0;0;0;0;0 -9350;mûrir;positive;0;0;0;0;0;0 -9351;murmure;negative;0;1;0;0;0;0 -9352;murmurer;negative;0;1;0;0;0;0 -9353;mûr;positive;0;0;0;0;0;0 -9354;musc;positive;0;0;0;0;0;0 -9355;muscade;positive;0;0;0;0;0;0 -9356;muscle;positive;0;0;0;0;0;0 -9357;musculaire;positive;0;0;0;0;0;0 -9358;muse;positive;0;0;0;0;0;0 -9359;museau;negative;0;1;1;1;0;1 -9360;musée;positive;0;0;0;0;0;0 -9361;museler;negative;0;1;1;1;0;0 -9362;muselière;negative;0;1;1;1;0;0 -9363;musique;positive;0;0;1;0;0;0 -9364;mustang;positive;0;0;0;0;0;0 -9365;mutable;positive;0;0;0;0;0;0 -9366;mutant;negative;0;1;0;0;0;1 -9367;mutation;negative;0;1;0;0;1;0 -9368;mutilation;negative;0;1;1;1;0;1 -9369;mutiler;negative;0;1;1;0;0;1 -9370;mutin;positive;1;0;0;0;0;0 -9371;mutinerie;negative;0;1;0;1;1;1 -9372;mutuellement;positive;0;0;0;0;0;0 -9373;mycose vaginal;negative;0;1;0;0;0;1 -9374;myope;negative;0;0;1;0;0;0 -9375;myopie;negative;0;1;1;1;0;0 -9376;myriade;positive;0;0;0;0;0;0 -9377;mystère;negative;0;1;1;0;1;0 -9378;mysticisme;negative;0;1;0;0;0;0 -9379;mystique;negative;0;1;0;0;1;0 -9380;mythe;positive;0;0;0;0;0;0 -9381;mythique;positive;0;0;0;0;0;0 -9382;mythologie;positive;0;0;0;0;0;0 -9383;mythologique;positive;0;0;0;0;0;0 -9384;nacelle;positive;0;0;0;0;0;0 -9385;nadir;positive;0;0;0;0;0;0 -9386;nager;positive;0;0;0;0;0;0 -9387;nageoire;positive;0;0;0;0;0;0 -9388;naïf;negative;0;0;1;0;0;0 -9389;naissance;positive;0;1;0;0;0;0 -9390;naître;positive;1;0;0;0;0;0 -9391;naissant;positive;1;0;0;0;0;0 -9392;nanomètre;positive;0;0;0;0;0;0 -9393;narcotique;negative;0;1;1;1;0;1 -9394;narine;negative;0;0;0;0;0;1 -9395;narratif;positive;0;0;0;0;0;0 -9396;narration;positive;0;0;0;0;0;0 -9397;narrer;positive;0;0;0;0;0;0 -9398;natal;positive;0;0;0;0;0;0 -9399;natation;positive;0;1;0;0;0;0 -9400;natif;positive;0;0;0;0;0;0 -9401;nation;positive;0;0;0;0;0;0 -9402;national;positive;0;0;0;0;0;0 -9403;nationalité;positive;0;0;0;0;0;0 -9404;national|nationaux;positive;0;0;0;0;0;0 -9405;nativité;positive;1;0;0;0;0;0 -9406;natte;positive;0;0;0;0;0;0 -9407;natter;positive;0;0;0;0;0;0 -9408;naturalisation;positive;0;0;0;0;0;0 -9409;naturaliser;positive;0;0;0;0;0;0 -9410;naturaliste;positive;0;0;0;0;0;0 -9411;nature;positive;0;0;0;0;0;0 -9412;naturel;positive;0;0;0;0;0;0 -9413;naturellement;positive;0;0;0;0;0;0 -9414;naufrage;negative;0;1;1;0;0;0 -9415;nauséabond;negative;0;0;0;0;0;1 -9416;nausée;negative;0;0;0;0;0;1 -9417;nautique;positive;0;0;0;0;0;0 -9418;naval;positive;0;0;0;0;0;0 -9419;navet;negative;0;0;0;0;0;1 -9420;navette;positive;0;0;0;0;0;0 -9421;navigable;positive;0;0;0;0;0;0 -9422;navigation;positive;0;0;0;0;0;0 -9423;navigation à voile;positive;0;0;0;0;0;0 -9424;navigation de plaisance;positive;0;0;0;0;0;0 -9425;naviguer;positive;0;0;0;0;0;0 -9426;navire;positive;0;0;0;0;0;0 -9427;navire prison;negative;0;1;1;0;0;0 -9428;ne pas aimer;negative;0;0;0;1;0;1 -9429;ne pas croire;negative;0;0;0;0;0;0 -9430;ne pas être d accord;negative;0;0;0;1;0;0 -9431;ne pas tenir compte;negative;0;0;0;0;0;1 -9432;néanmoins;negative;0;0;0;0;0;0 -9433;néant;negative;0;1;1;0;0;0 -9434;nébuleux;negative;0;1;1;0;0;0 -9435;nébulosité;negative;0;1;0;0;0;0 -9436;nécessiter;positive;0;0;1;0;0;0 -9437;nécessiteux;negative;0;0;1;0;0;0 -9438;nécro;negative;0;0;1;0;1;1 -9439;nécrologie;negative;0;0;1;0;0;0 -9440;nécrose;negative;0;1;1;0;0;1 -9441;nectar;positive;0;0;0;0;0;0 -9442;nef;positive;0;0;0;0;0;0 -9443;néfaste;negative;0;1;1;1;0;1 -9444;négatif;negative;0;1;1;1;0;1 -9445;négation;negative;0;0;1;1;0;0 -9446;négatif|négative;negative;0;0;1;0;0;0 -9447;négliger;negative;0;1;1;1;0;1 -9448;négligeable;negative;0;0;1;0;0;0 -9449;négligeante;negative;0;1;1;1;0;0 -9450;négligeantes;negative;0;1;1;1;0;0 -9451;négligeants;negative;0;1;1;1;0;0 -9452;négligemment;negative;0;1;1;0;0;0 -9453;négligence;negative;0;1;1;1;0;1 -9454;négligent;negative;0;1;1;1;0;1 -9455;négociation;positive;0;0;0;0;0;0 -9456;négocier;positive;0;0;0;0;0;0 -9457;nègre;negative;0;0;1;1;0;1 -9458;neige;positive;0;0;0;0;0;0 -9459;neige fondu;negative;0;1;1;0;1;1 -9460;neiger;positive;0;0;0;0;0;0 -9461;néonatal;negative;0;0;0;0;0;0 -9462;néophyte;negative;0;1;1;0;0;0 -9463;néoprène;positive;0;0;0;0;0;0 -9464;népotisme;negative;0;1;1;1;0;1 -9465;nerf;positive;0;0;0;0;0;0 -9466;nervosité;negative;0;1;0;1;0;0 -9467;net;positive;0;0;0;0;0;0 -9468;nettement;positive;0;0;0;0;0;0 -9469;netteté;positive;0;0;0;0;0;0 -9470;nettoyage;positive;0;0;0;0;0;0 -9471;nettoyant;positive;0;0;0;0;0;0 -9472;nettoyer;positive;0;0;0;0;0;0 -9473;neuf;positive;0;0;0;0;0;0 -9474;neurologie;positive;0;0;0;0;0;0 -9475;neutraliser;negative;0;0;0;1;1;0 -9476;neutralité;positive;0;0;0;0;0;0 -9477;neutre;positive;0;1;1;0;0;0 -9478;neuvième;positive;0;0;0;0;0;0 -9479;neveu;positive;0;0;0;0;0;0 -9480;névralgie;negative;0;1;1;0;0;0 -9481;névrose;negative;0;1;1;0;0;0 -9482;névrotique;negative;0;1;1;0;0;1 -9483;nez;positive;0;0;0;0;0;1 -9484;niais;negative;0;0;0;0;0;1 -9485;niaiserie;negative;0;0;0;1;0;1 -9486;nier;negative;0;0;0;1;0;0 -9487;nicher;positive;0;0;0;0;0;0 -9488;nickel;positive;0;0;0;0;0;0 -9489;nicotine;negative;0;0;0;0;0;1 -9490;nid;positive;0;0;0;0;0;0 -9491;nièce;positive;0;0;0;0;0;0 -9492;nihilisme;negative;0;0;0;1;0;1 -9493;niveau;positive;0;0;0;0;0;0 -9494;niveler;positive;0;0;0;0;0;0 -9495;noblesse;positive;0;0;0;0;0;0 -9496;nocturne;negative;0;1;1;0;0;0 -9497;nodulaire;negative;0;1;0;0;0;1 -9498;nodule;negative;0;1;0;0;0;1 -9499;n?ud coulant;positive;0;0;1;0;0;0 -9500;noir;negative;0;1;1;1;0;1 -9501;noirceur;negative;0;1;1;0;0;0 -9502;noir|noire;negative;0;1;1;0;0;0 -9503;noix de muscade;positive;0;0;0;0;0;0 -9504;nom;positive;0;0;0;0;0;0 -9505;nom de famille;positive;0;0;0;0;0;0 -9506;nomade;positive;0;0;0;0;0;0 -9507;nombre;positive;0;0;0;0;0;0 -9508;nombre de passager;positive;0;0;0;0;0;0 -9509;nombre entier;positive;0;0;0;0;0;0 -9510;nombreux;positive;0;0;0;0;0;0 -9511;nombril;positive;0;0;0;0;0;0 -9512;nomenclature;positive;0;0;0;0;0;0 -9513;nominal;positive;0;0;0;0;0;0 -9514;nomination;positive;0;0;0;0;0;0 -9515;nominé;positive;0;0;0;0;0;0 -9516;non accompagner;negative;0;0;1;0;0;0 -9517;non approuver;negative;0;0;0;0;0;1 -9518;non armer;negative;0;0;0;0;0;0 -9519;non armé;negative;0;0;0;0;0;0 -9520;non attacher;negative;0;1;0;0;0;0 -9521;non autoriser;negative;0;0;0;0;0;0 -9522;non confirmer;negative;0;0;0;0;0;0 -9523;non contenir;negative;0;1;0;0;0;0 -9524;non conventionnel;negative;0;0;0;0;0;0 -9525;non découvrir;negative;0;0;1;0;1;0 -9526;non découvert;negative;0;0;1;0;1;0 -9527;non déranger;positive;1;0;0;0;0;0 -9528;non désirer;negative;0;0;1;0;0;0 -9529;non développer;negative;0;0;0;0;0;0 -9530;non écrire;negative;0;0;0;0;0;0 -9531;non enregistrer;negative;0;0;1;0;0;0 -9532;non former;negative;0;0;1;0;0;0 -9533;non formé;negative;0;0;1;0;0;0 -9534;non garder;negative;0;1;0;0;1;0 -9535;non infecter;positive;0;0;0;0;0;0 -9536;non initier;negative;0;1;1;0;0;0 -9537;non inscrire;negative;0;1;1;0;0;0 -9538;non intentionnel;negative;0;0;0;0;1;0 -9539;non laver;negative;0;0;0;0;0;1 -9540;non lire;negative;0;0;1;0;0;0 -9541;non marier;negative;0;0;0;0;0;0 -9542;non marquer;positive;0;0;0;0;0;0 -9543;non meubler;negative;0;0;0;0;0;0 -9544;non numéroter;negative;0;0;0;0;0;0 -9545;non orienter;negative;0;0;0;0;0;0 -9546;non ouvrir;negative;0;0;0;0;0;0 -9547;non partager;negative;0;0;1;0;0;0 -9548;non protéger;negative;0;1;1;0;0;0 -9549;non réciproque;negative;0;0;1;0;0;0 -9550;non réclamer;negative;0;0;0;0;0;0 -9551;non reconnaître;negative;0;0;1;0;0;0 -9552;non réglementer;negative;0;1;1;0;0;0 -9553;non rémunérer;negative;0;0;1;1;0;0 -9554;non résoudre;negative;0;0;1;0;1;0 -9555;non révéler;negative;0;1;0;0;0;0 -9556;non scientifique;negative;0;0;0;0;0;0 -9557;non spécifier;negative;0;0;0;0;0;0 -9558;non sucrer;positive;0;0;0;0;0;0 -9559;non tester;negative;0;0;0;0;0;0 -9560;non traduire;negative;0;0;0;0;0;0 -9561;non troubler;positive;1;0;0;0;0;0 -9562;non valide;negative;0;0;1;0;0;0 -9563;non vérifier;negative;0;1;0;0;0;0 -9564;non viable;negative;0;0;1;0;0;0 -9565;non paiement;negative;0;1;1;0;0;0 -9566;non résider;negative;0;0;0;0;0;0 -9567;non respect;negative;0;1;1;1;0;0 -9568;non sen|sens;negative;0;0;0;1;0;0 -9569;normal;positive;0;0;0;0;0;0 -9570;normaliser;positive;0;0;0;0;0;0 -9571;normalité;positive;0;0;0;0;0;0 -9572;norme;positive;0;0;0;0;0;0 -9573;nostalgie;negative;0;0;1;0;0;0 -9574;nostalgique;negative;0;0;1;0;0;0 -9575;notable;positive;0;0;0;0;0;0 -9576;notaire;positive;0;0;0;0;0;0 -9577;notamment;positive;0;0;0;0;0;0 -9578;noter;positive;0;0;0;0;0;0 -9579;note;negative;0;0;0;0;0;0 -9580;notice nécrologique;negative;0;0;1;0;0;0 -9581;notification;positive;0;0;0;0;0;0 -9582;notifier;positive;0;0;0;0;0;0 -9583;notion;positive;0;0;0;0;0;0 -9584;notoire;negative;0;1;0;1;0;1 -9585;nouer;negative;0;0;0;0;0;0 -9586;nouille;positive;0;0;0;0;0;0 -9587;nounou;positive;0;0;0;0;0;0 -9588;nourrir;positive;0;0;1;0;0;0 -9589;nourrissant;positive;0;0;1;0;0;0 -9590;nourrisseur;positive;0;0;0;0;0;0 -9591;nourrisson;positive;0;1;0;0;1;0 -9592;nourriture;positive;0;0;0;0;0;0 -9593;nouveau venu;positive;0;1;0;0;1;0 -9594;nouveau naître;positive;0;0;0;0;0;0 -9595;nouveauté;positive;1;0;0;0;0;0 -9596;nouveau investissement;positive;0;0;0;0;0;0 -9597;nouveau session;positive;0;0;0;0;0;0 -9598;nouvellement;positive;0;0;0;0;0;0 -9599;novice;negative;0;1;0;0;0;0 -9600;noyau;positive;0;0;0;0;0;0 -9601;nu;negative;0;1;1;0;0;0 -9602;nuage;negative;0;0;1;0;0;0 -9603;nuageuges;negative;0;0;1;0;0;0 -9604;nuancer;positive;0;0;0;0;0;0 -9605;nuance;positive;0;0;0;0;0;0 -9606;nudité;negative;0;0;0;0;0;0 -9607;nue;negative;0;1;1;0;0;0 -9608;nuer;negative;0;1;0;0;0;1 -9609;nuire;negative;0;1;1;0;0;0 -9610;nuit;negative;0;1;1;0;0;0 -9611;numérateur;positive;0;0;0;0;0;0 -9612;numérique;positive;0;0;0;0;0;0 -9613;numériquement;positive;0;0;0;0;0;0 -9614;numéro;positive;0;0;0;0;0;0 -9615;numérotation;positive;0;0;0;0;0;0 -9616;numéroter;positive;0;0;0;0;0;0 -9617;nuptial;positive;0;0;0;0;0;0 -9618;nuque;positive;0;0;0;0;0;0 -9619;nutrition;positive;0;0;0;0;0;0 -9620;nymphe;negative;0;0;0;0;0;1 -9621;oasis;positive;0;0;0;0;0;0 -9622;obéir;positive;0;1;0;0;0;0 -9623;obéir à;positive;0;1;0;0;0;0 -9624;obéissance;positive;0;0;0;0;0;0 -9625;obéissant;positive;0;0;0;0;0;0 -9626;obélisque;positive;0;0;0;0;0;0 -9627;obèse;negative;0;0;0;0;0;1 -9628;obésité;negative;0;0;1;0;0;1 -9629;obi;positive;0;1;0;0;0;1 -9630;obit;negative;0;0;1;0;1;1 -9631;objection;negative;0;0;0;1;0;0 -9632;objet faire à le main;positive;0;0;0;0;0;0 -9633;objet;positive;0;0;0;0;0;0 -9634;obligation;negative;0;1;1;0;0;0 -9635;oblique;negative;0;0;0;0;0;0 -9636;obscène;negative;0;0;0;0;0;1 -9637;obscur;negative;0;1;1;0;0;0 -9638;obscurcir;negative;0;1;1;0;0;0 -9639;obscurité;negative;0;1;1;1;0;0 -9640;obsèques;negative;0;0;1;0;0;0 -9641;observance;positive;0;0;0;0;0;0 -9642;observant;positive;0;0;0;0;0;0 -9643;observante;positive;0;0;0;0;0;0 -9644;observantes;positive;0;0;0;0;0;0 -9645;observation;positive;0;0;0;0;0;0 -9646;observatoire;positive;0;0;0;0;0;0 -9647;observer;positive;0;0;0;0;0;0 -9648;obsession;negative;0;1;1;1;0;0 -9649;obsolescence;negative;0;0;1;0;0;1 -9650;obsolète;negative;0;0;1;0;0;1 -9651;obstacle;negative;0;1;1;1;1;0 -9652;obstination;negative;0;0;0;1;0;0 -9653;obstruction;negative;0;0;0;1;1;0 -9654;obstruer;negative;0;1;1;1;0;0 -9655;obtenir;positive;1;0;0;0;0;0 -9656;obturateur;negative;0;0;0;0;0;0 -9657;obtus;negative;0;0;0;1;0;0 -9658;ocarina;positive;0;0;0;0;0;0 -9659;occasionnellement;negative;0;0;0;0;0;0 -9660;occasionner;positive;0;0;0;0;1;0 -9661;occidental;positive;0;0;0;0;0;0 -9662;occlusion;negative;0;1;1;0;0;1 -9663;occultation;negative;0;1;1;1;0;0 -9664;occulte;negative;0;1;0;0;0;1 -9665;occupation;positive;0;0;0;0;0;0 -9666;occuper;negative;0;0;1;1;0;0 -9667;océan;positive;0;0;0;0;0;0 -9668;océanique;positive;0;0;0;0;0;0 -9669;octave;positive;0;0;0;0;0;0 -9670;octet;positive;0;0;0;0;0;0 -9671;octogone;positive;0;0;0;0;0;0 -9672;oculaire;positive;0;0;0;0;0;0 -9673;ode;positive;1;0;0;0;0;0 -9674;odomètre;positive;0;0;0;0;0;0 -9675;odontologie;positive;0;1;0;0;0;0 -9676;odorant;positive;0;0;0;0;0;0 -9677;odorat;negative;0;0;0;1;0;1 -9678;?cuménique;positive;0;0;0;0;0;0 -9679;?il;positive;0;0;0;0;0;0 -9680;?illet;positive;0;0;0;0;0;0 -9681;?uf;positive;0;0;0;0;0;0 -9682;?uf de poisson;negative;0;0;0;0;0;0 -9683;?uvre;positive;0;0;0;0;0;0 -9684;?uvre classique;positive;1;0;0;0;0;0 -9685;offenser;negative;0;1;1;1;0;1 -9686;offensant;negative;0;1;1;1;0;1 -9687;offensif;negative;0;0;1;1;0;1 -9688;offensive;negative;0;0;1;1;0;1 -9689;offrir;positive;1;0;0;0;0;0 -9690;officiel;positive;0;0;0;0;0;0 -9691;officier;positive;0;0;0;0;0;0 -9692;officieueses;positive;0;0;0;0;0;0 -9693;offrande;positive;0;0;0;0;0;0 -9694;offre;positive;0;0;0;0;0;0 -9695;ogre;negative;0;1;0;1;0;1 -9696;oie;negative;0;0;0;0;0;0 -9697;oignon;negative;0;0;0;0;0;1 -9698;oiseau;positive;0;0;0;0;0;0 -9699;oiseau mouche;positive;0;0;0;0;0;0 -9700;oisillon;positive;0;0;0;0;0;0 -9701;oisiveté;negative;0;0;1;0;0;1 -9702;olfactif;positive;0;0;0;0;0;0 -9703;oligarchie;negative;0;0;0;1;0;0 -9704;olive;positive;0;0;0;0;0;0 -9705;ombilic;positive;0;0;0;0;0;0 -9706;ombilical;positive;0;0;0;0;0;0 -9707;ombrager;negative;0;1;1;0;0;0 -9708;ombrer;positive;0;0;0;0;0;0 -9709;ombrelle;positive;0;0;0;0;0;0 -9710;ombre;positive;0;0;0;0;0;0 -9711;oméga;positive;0;0;0;0;0;0 -9712;omelette;positive;0;0;0;0;0;0 -9713;omettre;negative;0;1;0;0;0;1 -9714;omission;negative;0;1;1;0;0;0 -9715;omnibus;positive;0;0;0;0;0;0 -9716;omnipotence;positive;0;1;0;0;0;0 -9717;omnipotent;positive;0;0;0;0;0;0 -9718;omniprésent;positive;0;0;0;0;0;0 -9719;omniscient;positive;0;0;0;0;0;0 -9720;once;positive;0;0;0;0;0;0 -9721;oncle;positive;0;0;0;0;0;0 -9722;oncologue;positive;0;0;0;0;0;0 -9723;onction;positive;0;0;0;0;0;0 -9724;onde;positive;0;0;0;0;0;0 -9725;ondoyer;positive;0;0;0;0;0;0 -9726;onduler;positive;0;0;0;0;0;0 -9727;ongle;negative;0;0;0;0;0;1 -9728;ontologie;positive;0;0;0;0;0;0 -9729;onyx;positive;0;0;0;0;0;0 -9730;onze;positive;0;0;0;0;0;0 -9731;onzième;positive;0;0;0;0;0;0 -9732;opacité;negative;0;1;0;0;0;0 -9733;opale;positive;0;0;0;0;0;0 -9734;opaque;negative;0;1;1;0;0;0 -9735;opération;negative;0;1;0;0;0;0 -9736;ophtalmique;positive;0;0;0;0;0;0 -9737;ophtalmologiste;positive;0;0;0;0;0;0 -9738;opiacer;negative;0;1;0;0;0;1 -9739;opinion;positive;0;0;0;0;0;0 -9740;opium;negative;0;1;1;1;0;1 -9741;opportunisme;negative;0;0;0;0;0;0 -9742;opportunité;positive;0;0;0;0;1;0 -9743;opposant;negative;0;1;0;1;0;1 -9744;opposer;negative;0;1;1;1;0;1 -9745;opposer son veto;negative;0;0;0;1;0;0 -9746;opposition;negative;0;0;0;1;0;0 -9747;oppresser;negative;0;1;1;1;0;1 -9748;oppressant;negative;0;1;1;1;0;1 -9749;oppresseur;negative;0;1;1;1;0;0 -9750;oppression;negative;0;1;1;1;0;1 -9751;opprimer;negative;0;1;1;1;0;1 -9752;opressants;negative;0;1;1;1;0;1 -9753;optimisme;positive;0;0;0;0;1;0 -9754;optimiste;positive;0;0;0;0;0;0 -9755;option;positive;0;0;0;0;0;0 -9756;optique;positive;0;0;0;0;0;0 -9757;optométriste;positive;0;0;0;0;0;0 -9758;opulence;positive;1;0;0;0;0;0 -9759;opulent;positive;1;0;0;0;0;0 -9760;opus;positive;0;0;0;0;0;0 -9761;oracle;positive;0;0;0;0;0;0 -9762;orage;negative;0;1;0;1;1;0 -9763;oraison;positive;0;0;0;0;0;0 -9764;oral;positive;0;0;0;0;0;0 -9765;orange;positive;0;0;0;0;0;0 -9766;oratoire;positive;0;0;0;0;0;0 -9767;orbe;positive;0;0;0;0;0;0 -9768;orbite;positive;0;0;0;0;0;0 -9769;orchestre;positive;0;0;1;1;0;0 -9770;ordinateur;positive;0;0;0;0;0;0 -9771;ordination;positive;0;0;0;0;0;0 -9772;ordonnance;positive;0;0;0;0;0;0 -9773;ordonner;positive;0;0;0;0;0;0 -9774;ordre gestuel;positive;0;0;0;0;0;0 -9775;ordre;positive;0;0;0;0;0;0 -9776;ordure;negative;0;0;1;0;0;1 -9777;orée;positive;0;0;0;0;0;0 -9778;oreille;positive;0;0;0;0;0;0 -9779;oreiller;positive;0;0;0;0;0;0 -9780;oreillon;negative;0;1;1;0;0;1 -9781;organe;positive;1;0;0;0;0;0 -9782;organique;positive;0;0;0;0;0;0 -9783;organiser;positive;0;0;0;0;0;0 -9784;organisme;positive;0;0;0;0;1;0 -9785;organiste;positive;0;0;0;0;0;0 -9786;orgasme;positive;1;0;0;0;0;0 -9787;orgie;negative;0;0;0;0;0;1 -9788;orgue;positive;1;0;0;0;0;0 -9789;orgueil;negative;0;0;0;0;0;1 -9790;orient;positive;0;0;0;0;0;0 -9791;oriental;positive;0;0;0;0;0;0 -9792;orientation;positive;0;0;0;0;0;0 -9793;orienter;positive;0;0;0;0;0;0 -9794;orifice;negative;0;0;0;0;0;0 -9795;origan;positive;0;0;0;0;0;0 -9796;originaire;positive;0;0;0;0;0;0 -9797;originalité;positive;0;0;0;0;1;0 -9798;origine;positive;0;0;0;0;0;0 -9799;orner;positive;0;0;0;0;0;0 -9800;ornement;positive;0;0;0;0;0;0 -9801;ornemental;positive;0;0;0;0;0;0 -9802;ornementation;positive;0;0;0;0;0;0 -9803;ornière;positive;0;0;0;0;0;0 -9804;orphelin;negative;0;1;1;0;0;0 -9805;orque;negative;0;1;0;1;0;1 -9806;orteil;negative;0;0;0;0;0;1 -9807;orthodoxe;positive;0;0;0;0;0;0 -9808;orthodoxie;positive;0;0;0;0;0;0 -9809;orthogonal;positive;0;0;0;0;0;0 -9810;orthographe;positive;0;0;0;0;0;0 -9811;ortie;negative;0;0;1;1;0;1 -9812;os;negative;0;0;0;0;0;0 -9813;osciller;negative;0;1;1;0;0;0 -9814;oscillant;negative;0;1;1;0;0;0 -9815;oscillation;negative;0;1;1;0;0;0 -9816;oscillatoire;negative;0;1;1;0;0;0 -9817;oser;negative;0;0;0;1;0;0 -9818;osier;positive;0;0;0;0;0;0 -9819;ossement;negative;0;0;0;0;0;0 -9820;osseux;negative;0;0;1;0;0;0 -9821;ostensible;positive;0;0;0;0;0;0 -9822;ostensiblement;positive;0;0;0;0;0;0 -9823;otage;negative;0;1;1;1;0;0 -9824;ôter;negative;0;1;1;1;0;0 -9825;oubli;negative;0;1;1;1;0;0 -9826;oublier;negative;0;1;1;0;0;0 -9827;oublieux;negative;0;1;1;0;0;0 -9828;ouïr dire;negative;0;1;1;1;0;1 -9829;ouragan;negative;0;1;0;0;0;0 -9830;ourler;positive;0;0;0;0;0;0 -9831;ourlet;positive;0;0;0;0;0;0 -9832;outillage;positive;0;0;0;0;0;0 -9833;outil de coupe;positive;0;0;0;0;0;0 -9834;outrage;negative;0;1;0;1;0;1 -9835;outrageux;negative;0;0;0;0;1;0 -9836;ouvrir;positive;0;0;0;0;0;0 -9837;ouvertement;positive;0;0;0;0;0;0 -9838;ouverture;positive;0;0;0;0;0;0 -9839;ouvrage;positive;0;0;0;0;0;0 -9840;ouvranr;positive;0;0;0;0;0;0 -9841;ouvrer|ouvrir boîte;positive;0;0;0;0;0;0 -9842;ouvreur;positive;0;0;0;0;0;0 -9843;ouvreur|ouvreuse;positive;0;0;0;0;0;0 -9844;ovaire;positive;0;0;0;0;0;0 -9845;ovale;positive;0;0;0;0;0;0 -9846;ovation;positive;0;0;1;0;0;0 -9847;overdose;negative;0;1;1;0;0;1 -9848;ovoïde;negative;0;0;0;0;0;0 -9849;oxydation;negative;0;0;0;0;0;1 -9850;oxygène;positive;0;0;0;0;0;0 -9851;oxymore;negative;0;0;0;0;0;0 -9852;pacifier;positive;0;0;0;0;0;0 -9853;pacifique;positive;0;0;0;0;1;0 -9854;pack;positive;0;0;0;0;0;0 -9855;pacotille;negative;0;0;0;0;0;1 -9856;pacte;positive;0;0;0;0;0;0 -9857;pagaie;positive;0;0;0;0;0;0 -9858;pagaille;negative;0;0;0;1;0;1 -9859;paganisme;positive;0;0;0;0;0;0 -9860;pagayer|pagayer;positive;0;0;0;0;0;0 -9861;page;positive;0;0;0;0;0;0 -9862;pagination;positive;0;0;0;0;0;0 -9863;pagode;positive;0;0;0;0;0;0 -9864;paie;positive;0;0;0;0;0;0 -9865;paiement;positive;0;0;0;0;0;0 -9866;païen;negative;0;1;0;1;0;0 -9867;paillard;negative;0;0;0;0;0;1 -9868;paillasson;negative;0;0;0;0;0;0 -9869;paille;positive;0;0;0;0;0;0 -9870;paillette;positive;0;0;0;0;0;1 -9871;pain;positive;0;0;0;0;0;0 -9872;pair;positive;0;0;0;0;0;0 -9873;paire;positive;0;0;0;0;0;0 -9874;paisible;positive;0;0;0;0;1;0 -9875;paix;positive;0;0;0;0;0;0 -9876;palais;positive;0;0;0;0;0;0 -9877;palais de justice;positive;0;0;0;0;0;0 -9878;palan;positive;0;0;0;0;0;0 -9879;pale;negative;0;1;0;0;0;0 -9880;pâle;negative;0;1;1;0;1;0 -9881;paléontologie;positive;0;0;0;0;0;0 -9882;palet;positive;0;0;0;0;0;0 -9883;palette;positive;0;0;0;0;0;0 -9884;palladium;positive;0;0;0;0;0;0 -9885;palliatif;positive;0;1;1;0;0;0 -9886;palme;positive;0;0;0;0;0;0 -9887;palmier;positive;0;0;0;0;0;0 -9888;palourde;negative;0;0;0;0;0;1 -9889;palpable;positive;0;0;0;0;1;0 -9890;palper;positive;0;0;0;0;0;0 -9891;palpitation;negative;0;1;1;0;1;0 -9892;palpiter;negative;0;1;1;0;1;0 -9893;paludisme;negative;0;1;1;0;0;1 -9894;pâmoison;positive;1;0;0;0;0;0 -9895;pampille;positive;0;0;0;0;0;0 -9896;panacée;positive;0;0;0;0;0;0 -9897;panache;positive;1;0;0;0;0;0 -9898;panacher;positive;0;0;0;0;0;0 -9899;pancake;positive;0;0;0;0;0;0 -9900;pancarte;positive;0;0;0;0;1;0 -9901;pandémie;negative;0;1;1;0;0;1 -9902;pandémique;negative;0;1;1;0;0;1 -9903;panel;positive;0;0;0;0;0;0 -9904;panier;positive;0;0;0;0;0;0 -9905;panique;negative;0;1;0;1;0;0 -9906;paniquer;negative;0;1;0;0;0;0 -9907;panne;negative;0;1;1;0;0;1 -9908;panneau;positive;0;0;0;0;0;0 -9909;panorama;positive;0;0;0;0;0;0 -9910;panoramique;positive;0;0;0;0;0;0 -9911;pansement adhésif;negative;0;0;1;0;0;0 -9912;pantalon;positive;0;0;0;0;0;0 -9913;panthéon;positive;0;0;0;0;0;0 -9914;panthère;negative;0;1;0;0;0;0 -9915;pantin;negative;0;0;0;0;0;0 -9916;pantomime;positive;1;0;0;0;0;0 -9917;pantoufle;positive;0;0;0;0;0;0 -9918;paon;positive;0;0;0;0;0;0 -9919;papa;positive;0;0;0;0;0;0 -9920;papal;positive;0;0;0;0;0;0 -9921;papauté;positive;0;0;0;0;0;0 -9922;pape;positive;0;0;0;0;0;0 -9923;paperasse;negative;0;0;0;0;0;0 -9924;papeterie;positive;0;0;0;0;0;0 -9925;papier;positive;0;0;0;0;0;0 -9926;papier de garde;positive;0;0;0;0;0;0 -9927;papillon;positive;0;0;0;0;0;0 -9928;papoter;positive;0;0;0;0;0;0 -9929;paprika;positive;0;0;0;0;0;0 -9930;papyrus;positive;0;0;0;0;0;0 -9931;paquebot;positive;0;0;0;0;0;0 -9932;par accident;negative;0;1;1;0;1;0 -9933;par conséquent;positive;0;0;0;0;0;0 -9934;par défaut;negative;0;1;1;0;0;1 -9935;par dix;positive;0;0;0;0;0;0 -9936;par hasard;positive;0;0;0;0;1;0 -9937;par inadvertance;negative;0;1;1;0;1;0 -9938;par là;positive;0;0;0;0;0;0 -9939;par le force;negative;0;1;0;1;0;0 -9940;par le poste;positive;0;0;0;0;0;0 -9941;par le suite;negative;0;0;0;0;0;0 -9942;par lot;positive;0;0;0;0;0;0 -9943;par morceau;negative;0;0;1;0;0;0 -9944;par procuration;positive;0;0;0;0;0;0 -9945;par quatre;positive;0;0;0;0;0;0 -9946;par surprise;negative;0;1;0;0;1;0 -9947;parabole;positive;0;0;0;0;0;0 -9948;parabolique;positive;0;0;0;0;0;0 -9949;parachute;negative;0;1;0;0;0;0 -9950;parade;positive;0;1;0;0;1;0 -9951;paradigme;positive;0;0;0;0;0;0 -9952;paradisiaque;positive;0;0;0;0;0;0 -9953;paradoxal;negative;0;0;0;0;0;0 -9954;paradoxe;negative;0;0;0;0;0;0 -9955;paragraphe;positive;0;0;0;0;0;0 -9956;parallaxe;negative;0;0;0;0;0;0 -9957;parallèle;positive;0;0;0;0;0;0 -9958;parallélisme;positive;0;0;0;0;0;0 -9959;paralyser;negative;0;1;1;1;1;0 -9960;paralysie;negative;0;1;1;1;0;1 -9961;parangon;positive;0;0;0;0;0;0 -9962;paranoïa;negative;0;1;0;1;0;0 -9963;parapet;positive;0;0;0;0;0;0 -9964;paraphrase;positive;0;0;0;0;0;0 -9965;paraphraser;positive;0;0;0;0;0;0 -9966;parapluie;positive;0;0;0;0;0;0 -9967;parasite;negative;0;1;0;0;0;1 -9968;parasol;positive;0;0;0;0;0;0 -9969;parc;positive;0;0;0;0;0;0 -9970;parcelle;positive;0;0;0;0;0;0 -9971;parchemin;positive;0;0;0;0;0;0 -9972;parcimonie;positive;0;0;0;0;0;0 -9973;parcimonieux;negative;0;0;0;0;0;0 -9974;parcours;positive;0;0;0;0;0;0 -9975;pardessus;positive;0;0;0;0;0;0 -9976;pardon;positive;0;0;0;0;0;0 -9977;pardonner;positive;0;0;0;0;0;0 -9978;parer balle;positive;0;0;0;0;0;0 -9979;parer choc;positive;0;0;0;0;0;0 -9980;pareil;positive;0;0;0;0;0;0 -9981;parenchyme;positive;0;0;0;0;0;0 -9982;parent;positive;0;0;0;0;0;0 -9983;parental;positive;0;0;0;0;0;0 -9984;parentales;positive;0;0;0;0;0;0 -9985;parenthèse;positive;0;0;0;0;0;0 -9986;parent|parents;positive;0;0;0;0;0;0 -9987;parer;positive;0;0;0;0;1;0 -9988;paresse;negative;0;0;1;0;0;1 -9989;parfaire;positive;0;0;0;0;0;0 -9990;parfum;positive;1;0;0;0;0;0 -9991;parfumer;positive;0;0;0;0;0;0 -9992;paria;negative;0;1;1;0;0;1 -9993;pariétal;positive;0;0;0;0;0;0 -9994;pari;positive;0;1;0;0;1;0 -9995;parité;positive;0;0;0;0;0;0 -9996;parjure;negative;0;1;0;1;1;0 -9997;parjurer;negative;0;0;1;1;1;1 -9998;parler;positive;0;0;0;0;0;0 -9999;parlement;positive;0;0;0;0;0;0 -10000;parlementaire;positive;0;0;0;0;0;0 -10001;parodier;negative;0;0;0;0;0;0 -10002;paroi;negative;0;0;0;0;0;0 -10003;paroisse;positive;0;0;0;0;0;0 -10004;parole;positive;0;0;0;0;0;0 -10005;paroxysme;positive;0;0;0;0;1;0 -10006;parquet;positive;0;0;0;0;0;0 -10007;parrain;positive;0;0;0;0;0;0 -10008;parrainage;positive;0;0;0;0;0;0 -10009;parrainer;positive;0;0;0;0;0;0 -10010;partager;positive;0;0;0;0;0;0 -10011;partenaire;positive;0;0;0;0;0;0 -10012;partenariat;positive;0;0;0;0;0;0 -10014;parti prendre;negative;0;0;0;0;0;0 -10015;partial;negative;0;0;0;0;0;0 -10016;partialité;negative;0;0;0;0;0;0 -10017;participation;positive;0;0;0;1;0;0 -10018;participer;positive;0;0;0;0;0;0 -10019;particularité;negative;0;0;0;0;1;1 -10020;particulères;positive;0;0;0;0;0;0 -10021;partie;positive;1;0;0;0;0;0 -10022;partiel;negative;0;0;1;0;0;0 -10023;partiellement;negative;0;0;0;0;0;0 -10024;parure;positive;0;0;0;0;0;0 -10025;parvenir à;positive;0;0;0;0;0;0 -10026;pas cher;negative;0;0;0;0;0;0 -10027;pas complètement;negative;0;0;1;0;0;0 -10028;pas convaincre;negative;0;0;0;0;0;0 -10029;pas de côté;negative;0;1;0;0;0;0 -10030;pas digne de confiance;negative;0;1;0;1;0;0 -10031;pas disposer;negative;0;0;0;1;0;0 -10032;pas préparer;negative;0;1;0;0;1;0 -10033;passable;negative;0;0;0;0;0;0 -10034;passade;negative;0;0;0;0;0;0 -10035;passage;positive;0;0;0;0;0;0 -10036;passage à tabac;negative;0;1;1;1;0;0 -10037;passer temps;positive;1;0;0;0;0;0 -10038;passeport;positive;0;0;0;0;0;0 -10039;passer en contrebande;negative;0;1;0;0;0;0 -10040;passerelle;positive;0;0;0;0;0;0 -10041;passim;negative;0;0;0;0;0;0 -10042;passion;negative;0;0;0;0;0;0 -10043;passionée;positive;0;0;0;0;0;0 -10044;passionées;positive;0;0;0;0;0;0 -10045;passionés;positive;0;0;0;0;0;0 -10046;passionner;positive;0;0;0;0;1;0 -10047;passionnant;positive;0;0;0;0;1;0 -10048;passivité;negative;0;0;1;0;0;0 -10049;passoire;positive;0;0;0;0;0;0 -10050;pastel;positive;0;0;0;0;0;0 -10051;patauger;negative;0;1;1;1;0;1 -10052;patch;negative;0;0;0;0;0;0 -10053;patchwork;positive;0;0;0;0;0;0 -10054;patère;positive;0;0;0;0;0;0 -10055;paternité;positive;0;0;0;0;0;0 -10056;pathétique;negative;0;0;1;1;0;1 -10057;pathologie;negative;0;1;1;0;0;0 -10058;pathos;positive;0;0;0;0;0;0 -10059;patience;positive;0;0;0;0;0;0 -10060;patient;negative;0;1;1;0;0;0 -10061;patienter;negative;0;0;0;0;0;0 -10062;patin;positive;0;0;0;0;0;0 -10063;patinage;positive;0;0;0;0;0;0 -10064;patiner;positive;0;0;0;0;0;0 -10065;patinoire;positive;0;0;0;0;0;0 -10066;patio;positive;0;0;0;0;0;0 -10067;pâtisserie;positive;1;0;0;0;0;0 -10068;patriarcal;positive;0;0;0;0;0;0 -10069;patriarche;positive;0;0;0;0;0;0 -10070;patrimoine;positive;0;0;0;0;0;0 -10071;patriote;positive;0;0;0;0;0;0 -10072;patriotique;positive;0;0;0;0;0;0 -10073;patriotisme;positive;0;0;0;0;0;0 -10074;patron;positive;0;0;0;0;0;0 -10075;patronage;positive;0;0;0;0;0;0 -10076;patrouille;positive;0;0;0;0;0;0 -10077;patrouiller;positive;0;0;0;0;0;0 -10078;patte;positive;0;0;0;0;0;0 -10079;pâturage;positive;0;0;0;0;0;0 -10080;pâture;positive;0;0;0;0;0;0 -10081;paume;positive;0;0;0;0;0;0 -10082;pauvre;negative;0;1;1;0;0;0 -10083;pauvrement;negative;0;1;1;0;0;0 -10084;pauvreté;negative;0;1;1;1;0;1 -10085;pavage;positive;0;0;0;0;0;0 -10086;pavaner;negative;0;0;0;0;0;0 -10087;paver;positive;0;0;0;0;0;0 -10088;pavillon;positive;0;0;0;0;0;0 -10089;pavot;positive;0;0;0;0;0;0 -10090;pax;positive;0;0;0;0;0;0 -10091;paye;positive;1;0;0;0;0;0 -10092;payer|payer;positive;0;0;0;0;0;0 -10093;pays;positive;0;0;0;0;0;0 -10094;paysage;positive;0;0;0;0;0;0 -10095;péage;negative;0;0;0;0;0;0 -10096;peau de vache;negative;0;0;0;0;0;0 -10097;peaufinage;positive;0;0;0;0;0;0 -10098;peaufiner;positive;0;0;0;0;0;0 -10099;pêcher;positive;0;0;0;0;0;0 -10100;pêche à le ligne;positive;0;0;0;0;0;0 -10101;pêcher au chalut;positive;0;0;0;0;0;0 -10102;pécuniaire;negative;0;0;0;0;0;0 -10103;pédagogique;positive;0;0;0;0;0;0 -10104;pédale;positive;0;0;0;0;0;0 -10105;pédaler;positive;0;0;0;0;0;0 -10106;pédant;negative;0;0;0;1;0;1 -10107;pédiatrie;positive;0;0;0;0;0;0 -10108;pédicule;negative;0;0;0;0;0;0 -10109;pedigree;positive;0;0;0;0;0;0 -10110;pédoncule;negative;0;0;0;0;0;0 -10111;peigne;positive;0;0;0;0;0;0 -10112;peigner;positive;0;0;0;0;0;0 -10113;peignoir;positive;0;0;0;0;0;0 -10114;peindre;positive;0;0;0;0;0;0 -10115;peiner;negative;0;1;1;0;0;0 -10116;peintre;positive;0;0;0;0;0;0 -10117;peinture;positive;0;0;0;0;0;0 -10118;peinture mural;positive;0;0;0;0;0;0 -10119;pelage;positive;0;0;0;0;0;0 -10120;pélagien;positive;0;0;0;0;0;0 -10121;pélagique;positive;0;0;0;0;0;0 -10122;peler;negative;0;0;0;0;0;0 -10123;pèlerin;positive;0;0;0;0;0;0 -10124;pèlerinage;positive;0;0;0;0;0;0 -10125;pelle;positive;0;0;0;0;0;0 -10126;pelleter;positive;0;0;0;0;0;0 -10127;pellicule;positive;0;0;0;0;0;0 -10128;pelotage;negative;0;1;0;1;0;1 -10129;peloter;negative;0;1;0;1;0;1 -10130;peloton;positive;0;0;0;0;0;0 -10131;pelouse;positive;0;0;0;0;0;0 -10132;peluche;positive;0;0;0;0;0;0 -10133;pénal;negative;0;1;1;0;0;0 -10134;pénalité;negative;0;1;1;1;0;0 -10135;pencher;negative;0;0;0;0;0;0 -10136;pendaison;negative;0;1;1;1;0;1 -10137;pendant que;negative;0;0;0;0;0;0 -10138;pendentif;positive;0;0;0;0;0;0 -10139;pendre;negative;0;0;0;0;0;0 -10140;pendule;positive;0;0;0;0;0;0 -10141;pénétrer;positive;0;0;0;0;1;0 -10142;pénétrante;positive;0;0;0;0;1;0 -10143;pénétrant;positive;0;0;0;0;1;0 -10144;pénétrer illégalement dans un;negative;0;1;0;1;0;0 -10145;pénibilité;negative;0;0;0;1;0;0 -10146;pénible;negative;0;1;1;1;0;1 -10147;péniche;positive;0;0;0;0;0;0 -10148;péninsule;positive;0;0;0;0;0;0 -10149;pénitence;negative;0;1;1;0;0;0 -10150;pénitencier;negative;0;1;1;1;0;0 -10151;penny;positive;0;0;0;0;0;0 -10152;pénombre;negative;0;1;1;1;0;0 -10153;penser;positive;0;0;0;0;0;0 -10154;penser bête;positive;0;0;0;0;0;0 -10155;penser après coup;negative;0;1;1;0;0;0 -10156;pension;positive;0;0;0;0;0;0 -10157;pension alimentaire;negative;0;0;0;0;0;0 -10158;pensionnaire;positive;0;0;0;0;0;0 -10159;pentagone;positive;0;0;0;0;0;0 -10160;pente;negative;0;1;1;0;0;0 -10161;penthouse;positive;0;0;0;0;0;0 -10162;pénultième;negative;0;0;1;0;0;0 -10163;pénurie;negative;0;1;1;1;0;1 -10164;pépiement;positive;1;0;0;0;0;0 -10165;pépier;positive;1;0;0;0;0;0 -10166;pépin;negative;0;1;1;0;1;0 -10167;pépinière;positive;0;0;0;0;0;0 -10168;pépite;positive;1;0;0;0;0;0 -10169;perceptible;positive;0;0;0;0;0;0 -10170;percer;negative;0;1;0;1;0;0 -10171;perceur;negative;0;1;0;1;0;0 -10172;percevoir;positive;0;0;0;0;1;0 -10173;perche;positive;0;0;0;0;0;0 -10174;percher;positive;0;0;0;0;0;0 -10175;perchoir;positive;0;0;0;0;0;0 -10176;percolation;negative;0;1;0;0;0;1 -10177;percussion;positive;0;0;0;0;0;0 -10178;perdant;negative;0;0;1;1;1;0 -10179;perdition;negative;0;1;1;1;0;1 -10180;perdre;negative;0;1;1;0;1;0 -10181;péremption;negative;0;1;0;0;0;1 -10182;péremptoire;negative;0;1;1;0;0;0 -10183;pérenne;positive;0;0;0;0;0;0 -10184;pereuses;negative;0;1;1;0;0;0 -10185;perfection;positive;0;0;0;0;1;0 -10186;perforation;negative;0;1;0;0;0;0 -10187;perforer;negative;0;1;0;0;0;0 -10188;performance;positive;0;0;0;0;1;0 -10189;péridot;positive;0;0;0;0;0;0 -10190;péril;negative;0;1;1;0;0;0 -10191;périmètre;positive;0;0;0;0;0;0 -10192;période;negative;0;0;0;0;0;0 -10193;périodicité;positive;0;0;0;0;0;0 -10194;périodique;positive;0;0;0;0;0;0 -10195;périodiquement;positive;0;0;0;0;0;0 -10196;péripétie;positive;0;1;0;0;1;0 -10197;périr;negative;0;1;1;0;0;0 -10198;périssable;negative;0;0;0;0;0;1 -10199;perle;positive;0;0;0;0;0;0 -10200;perler;positive;0;0;0;0;0;0 -10201;permanence;positive;0;0;0;0;0;0 -10202;perméable;negative;0;0;0;0;0;0 -10203;permission;positive;0;0;0;0;0;0 -10204;permutable;positive;0;0;0;0;0;0 -10205;permutation;negative;0;1;1;0;0;0 -10206;permuter;positive;0;0;0;0;0;0 -10207;perpendiculaire;positive;0;0;0;0;0;0 -10208;perpétrer;negative;0;1;0;1;0;0 -10209;perpétuation;positive;0;0;0;0;0;0 -10210;perpétuellement;positive;0;0;0;0;0;0 -10211;perpétuer;positive;0;0;0;0;0;0 -10212;perpétuité;positive;0;0;0;0;0;0 -10213;perplexe;negative;0;1;1;0;1;0 -10214;perplexité;negative;0;1;1;0;1;0 -10215;perron;negative;0;1;0;0;0;0 -10216;perroquet;negative;0;0;0;0;0;1 -10217;perruque;negative;0;0;0;0;0;0 -10218;persécuter;negative;0;1;1;1;0;0 -10219;persécution;negative;0;1;1;1;0;1 -10220;persévérance;positive;0;0;0;0;0;0 -10221;persévérer;positive;0;0;0;0;0;0 -10222;persévérant;positive;0;0;0;0;0;0 -10223;persil;positive;0;0;0;0;0;0 -10224;persistance;positive;0;0;0;0;0;0 -10225;persistant;positive;0;0;0;0;0;0 -10226;personnage;positive;0;0;0;0;0;0 -10227;personnaliser;positive;0;0;0;0;0;0 -10228;personnalité;positive;0;0;0;0;0;0 -10229;personne âgé;positive;0;0;0;0;0;0 -10230;personne interroger;positive;0;0;0;0;0;0 -10231;personne qui changer qch;positive;0;0;0;0;0;0 -10232;personne qui fredonner;positive;0;0;0;0;0;0 -10233;personne qui prier;positive;0;0;0;0;0;0 -10234;personne qui se disputer;negative;0;0;0;1;0;0 -10235;personnel;positive;0;0;0;0;0;0 -10236;personne;positive;0;0;0;0;0;0 -10237;personnification;positive;0;0;0;0;0;0 -10238;perspective;positive;0;0;0;0;0;0 -10239;perspicacité;positive;0;0;0;0;0;0 -10240;persuasion;positive;0;0;0;0;0;0 -10241;perte;negative;0;1;1;1;0;0 -10242;perte de connaissance;negative;0;1;1;0;1;0 -10243;pertinence;positive;0;0;0;0;0;0 -10244;perturbation;negative;0;1;1;1;1;0 -10245;perversion;negative;0;0;1;1;0;1 -10246;pervertir;negative;0;1;0;1;0;1 -10247;pesage;positive;0;0;0;0;0;0 -10248;pesant;negative;0;1;1;0;0;0 -10249;pesanteur;positive;0;0;0;0;0;0 -10250;pessimisme;negative;0;1;1;1;0;0 -10251;pessimiste;negative;0;1;1;0;0;0 -10252;peste;negative;0;1;1;0;0;1 -10253;pestilence;negative;0;1;0;0;0;1 -10254;pétasse;negative;0;1;1;1;0;1 -10255;pétiller;positive;1;0;0;0;0;0 -10256;péter;positive;0;0;0;0;0;0 -10257;petit chat;positive;0;0;0;0;0;0 -10258;petit coin;negative;0;0;0;0;0;1 -10259;petit comité;positive;0;0;0;0;0;0 -10260;petit coup;negative;0;1;0;1;1;0 -10261;petit coup de coude;positive;0;0;0;0;0;0 -10262;petit déjeuner;positive;0;0;0;0;0;0 -10263;petit gros petit gros|grosse;negative;0;0;1;0;0;1 -10264;petit morceau;negative;0;0;1;0;0;0 -10265;petit oiseau;positive;0;0;0;0;0;0 -10266;petit pain;positive;0;0;0;0;0;0 -10267;petit salon;positive;0;0;0;0;0;0 -10268;petit;negative;0;0;1;0;0;0 -10269;petit bête;negative;0;1;0;0;0;1 -10270;petit enfance;positive;0;0;0;0;0;0 -10271;petit ferme;positive;0;0;0;0;0;0 -10272;petit idée;positive;0;0;0;0;0;0 -10273;petit morsure;negative;0;1;1;0;1;0 -10274;petit tache;negative;0;0;1;0;0;1 -10275;petit tape;positive;0;0;0;0;0;0 -10276;petitesse;negative;0;0;1;0;0;0 -10277;pétition;positive;0;0;0;0;0;0 -10278;pétitionnaire;positive;0;0;0;0;0;0 -10279;pétitionner;positive;0;0;0;0;0;0 -10280;petit cadeau;positive;1;0;0;0;0;0 -10281;petit enfant;positive;0;0;0;0;0;0 -10282;pétoncle;positive;0;0;0;0;0;0 -10283;pétrir;positive;0;0;0;0;0;0 -10284;peu à peu;positive;0;0;0;0;0;0 -10285;peu aimable;negative;0;1;1;1;0;1 -10286;peu amical;negative;0;1;1;1;0;1 -10287;peu attraire;negative;0;0;1;0;0;1 -10288;peu attrayant;negative;0;0;1;0;0;1 -10289;peu clément;negative;0;0;1;0;0;0 -10290;peu communepeu commun;negative;0;0;0;0;0;0 -10291;peu commune;negative;0;0;0;0;0;0 -10292;peu compatissant;negative;0;0;0;1;0;1 -10293;peu compatissante;negative;0;0;0;1;0;1 -10294;peu compatissantes;negative;0;0;0;1;0;1 -10295;peu compatissants;negative;0;0;0;1;0;1 -10296;peu conclure;negative;0;0;1;0;0;0 -10297;peu concluant;negative;0;0;1;0;0;0 -10298;peu coûteux;positive;1;0;0;0;0;0 -10299;peu critique;negative;0;0;0;0;0;0 -10300;peu familier;negative;0;1;0;0;0;0 -10301;peu fiable;negative;0;1;0;1;0;0 -10302;peu fréquemment;negative;0;0;0;0;1;0 -10303;peu fréquent;negative;0;0;0;0;1;0 -10304;peu importer;negative;0;0;0;0;0;0 -10305;peu instruire;negative;0;0;1;0;0;0 -10306;peu méfier;negative;0;1;1;0;1;0 -10307;peu méfiant;negative;0;1;1;0;1;0 -10308;peu original;negative;0;0;0;0;0;0 -10309;peu orthodoxe;negative;0;1;1;0;0;1 -10310;peu profitable;negative;0;0;1;0;0;0 -10311;peu réaliste;negative;0;1;1;0;0;0 -10312;peu rentable;negative;0;0;1;0;0;0 -10313;peu satisfaisant;negative;0;0;1;0;0;1 -10314;peu séduisant;negative;0;0;1;0;0;1 -10315;peu soigner;negative;0;0;0;0;0;1 -10316;peu sûr;negative;0;1;0;0;1;0 -10317;peuple;positive;0;0;0;0;0;0 -10318;peupler;positive;0;0;0;0;0;0 -10319;peur;negative;0;1;0;1;1;0 -10320;phalange;positive;0;1;0;0;0;0 -10321;phare;positive;0;0;0;0;0;0 -10322;pharmaceutique;positive;0;0;0;0;0;0 -10323;pharmacie;positive;0;0;0;0;0;0 -10324;pharmacologie;positive;0;0;0;0;0;0 -10325;phase;positive;0;0;0;0;0;0 -10326;phénix;positive;0;0;0;0;0;0 -10327;phénomène;positive;0;0;0;0;0;0 -10328;philanthrope;positive;0;0;0;0;0;0 -10329;philanthropie;positive;0;0;0;0;0;0 -10330;philosophe;positive;0;0;0;0;0;0 -10331;philosophie;positive;0;0;0;0;0;0 -10332;philosophique;positive;0;0;0;0;0;0 -10333;phonétique;positive;0;0;0;0;0;0 -10334;phonographe;positive;0;0;0;0;0;0 -10335;phonologie;positive;0;0;0;0;0;0 -10336;phoque;positive;0;0;0;0;0;0 -10337;phosphore;positive;0;0;0;0;0;0 -10338;photocopier;positive;0;0;0;0;0;0 -10339;photogénique;positive;0;0;0;0;0;0 -10340;photographe;positive;0;0;0;0;0;0 -10341;photographie;positive;0;0;0;0;0;0 -10342;photométrie;positive;0;0;0;0;0;0 -10343;phraséologie;positive;0;0;0;0;0;0 -10344;phylogénie;positive;0;0;0;0;0;0 -10345;physiologie;positive;0;0;0;0;0;0 -10346;pianiste;positive;0;0;0;0;0;0 -10347;piano;positive;0;0;0;0;0;0 -10348;piaulement;negative;0;1;1;0;0;0 -10349;piauler;negative;0;1;1;0;0;0 -10350;piazza;positive;0;0;0;0;0;0 -10351;pic;positive;0;1;0;0;0;0 -10352;piccolo;positive;0;0;0;0;0;0 -10353;pichet;positive;0;0;0;0;0;0 -10354;pick up;positive;0;0;0;0;0;0 -10355;picoler;negative;0;0;0;0;0;0 -10356;picorer;negative;0;0;0;1;0;0 -10357;picotement;negative;0;1;0;0;1;0 -10358;picoter;negative;0;1;0;0;0;0 -10359;pie;negative;0;1;0;0;0;1 -10360;pièce de dix cent;positive;0;0;0;0;0;0 -10361;pièce de monnaie;positive;0;0;0;0;0;0 -10362;pièce de théâtre;negative;0;1;1;0;1;0 -10363;pièce jointe;positive;0;0;0;0;0;0 -10364;pièce;positive;0;0;0;0;0;0 -10365;pied;positive;0;0;0;0;0;0 -10366;pied de biche;positive;0;0;0;0;0;0 -10367;piédestal;positive;0;0;0;0;0;0 -10368;pied nu;positive;0;0;0;0;0;0 -10369;piégeage;negative;0;1;0;0;1;0 -10370;piéger;negative;0;1;0;0;1;0 -10371;piège;negative;0;1;0;0;1;0 -10372;pierre;positive;0;0;0;1;0;0 -10373;pierre à feu;negative;0;1;0;0;0;0 -10374;pierre précieux;positive;1;0;0;0;0;0 -10375;pierre tombal;negative;0;0;1;0;0;0 -10376;pierreux;negative;0;1;0;0;0;0 -10377;piété;positive;0;0;0;0;0;0 -10378;piétiner;negative;0;1;1;0;0;0 -10379;piètre;negative;0;0;1;0;0;1 -10380;pieu;negative;0;1;1;0;0;0 -10381;pieuvre;negative;0;1;0;0;0;1 -10382;pigeon;negative;0;1;0;0;0;1 -10383;pigment;positive;0;0;0;0;0;0 -10384;pigmenter;positive;0;0;0;0;0;0 -10385;pilier;positive;0;0;0;0;0;0 -10386;pilote;positive;0;0;0;0;0;0 -10387;piloter;positive;0;0;0;0;0;0 -10388;pilule;positive;0;0;0;0;0;0 -10389;pimenter;negative;0;1;0;0;1;0 -10390;pin;positive;0;0;1;0;0;0 -10391;pinacle;positive;0;0;0;0;0;0 -10392;pince;negative;0;1;0;1;0;0 -10393;pince à linge;positive;0;0;0;0;0;0 -10394;pinceant;negative;0;1;0;0;0;0 -10395;pinceau;positive;0;0;0;0;0;0 -10396;pincée;negative;0;0;0;0;0;0 -10397;pincement;negative;0;1;0;0;0;0 -10398;pincer;negative;0;1;0;1;0;0 -10399;pion;negative;0;0;0;0;0;0 -10400;pipelet;negative;0;0;0;0;0;0 -10401;pipeline;positive;0;0;0;0;0;0 -10402;pipette;positive;0;0;0;0;0;0 -10403;pipi;negative;0;0;0;0;0;1 -10404;piquant;negative;0;1;0;0;1;0 -10405;pique;negative;0;1;0;1;0;0 -10406;pique niquer;positive;0;0;0;0;1;0 -10407;piquer niquer;positive;0;0;0;0;1;0 -10408;piquer sur;negative;0;1;0;1;1;0 -10409;piquet;negative;0;1;1;1;1;0 -10410;piquet de grève;negative;0;1;0;1;1;0 -10411;piqûre;negative;0;1;0;1;1;1 -10412;piratage;negative;0;1;0;1;0;0 -10413;pirate;negative;0;1;0;1;0;0 -10414;pirater;negative;0;1;0;1;0;0 -10415;piraterie;negative;0;1;0;1;0;0 -10416;pire;negative;0;1;1;0;0;0 -10417;pirogue;positive;0;0;0;0;0;0 -10418;piscine;positive;0;0;0;0;0;0 -10419;pister;positive;0;0;0;0;0;0 -10420;pistolet;negative;0;1;0;1;0;0 -10421;piston;positive;0;0;0;0;0;0 -10422;pitié;negative;0;0;1;0;0;0 -10423;pittoresque;positive;0;0;0;0;0;0 -10424;pivot;positive;0;0;0;0;0;0 -10425;pivoter;positive;0;0;0;0;0;0 -10426;placage;positive;0;0;0;0;0;0 -10427;placard;positive;0;0;0;0;0;0 -10428;place du marché;positive;0;0;0;0;0;0 -10429;placebo;positive;0;0;0;0;0;0 -10430;plafond;positive;0;0;0;0;0;0 -10431;plage;positive;1;0;0;0;0;0 -10432;plagiat;negative;0;0;1;1;0;1 -10433;plaid;positive;0;0;0;0;0;0 -10434;plaider;negative;0;1;1;1;0;1 -10435;plaideur;negative;0;0;1;1;0;0 -10436;plaie;negative;0;1;1;1;0;1 -10437;plaine;positive;0;0;0;0;0;0 -10438;plainte;negative;0;0;0;1;0;0 -10439;plaintif;negative;0;0;1;0;0;0 -10440;plaisance;positive;1;0;0;0;0;0 -10441;plaisanter;positive;1;0;0;0;0;0 -10442;plaisanterie;positive;0;0;0;0;1;0 -10443;planche;positive;0;0;0;0;0;0 -10444;plancher;positive;0;0;0;0;0;0 -10445;planéité;negative;0;0;1;0;0;0 -10446;planer;positive;1;0;0;0;0;0 -10447;planétarium;positive;0;0;0;0;0;0 -10448;planète;positive;0;0;0;0;0;0 -10449;planification;positive;0;0;0;0;0;0 -10450;planifier;positive;0;0;0;0;0;0 -10451;plantation;positive;0;0;0;0;0;0 -10452;plante;positive;0;0;0;0;0;0 -10453;plante du pied;negative;0;0;0;0;0;1 -10454;planter;positive;0;0;0;0;0;0 -10455;planteur|planteuse;positive;0;0;0;0;0;0 -10456;plantureux;positive;0;0;0;0;0;0 -10457;plaquage;positive;0;0;0;0;0;0 -10458;plaque chauffant;positive;0;0;0;0;0;0 -10459;plaque tournant;positive;0;0;0;0;0;0 -10460;plaquer;negative;0;1;1;0;0;0 -10461;plaquer au sol;positive;0;0;0;1;1;0 -10462;plaquette;positive;0;0;0;0;0;0 -10463;plasma;negative;0;0;0;0;0;1 -10464;plasticité;positive;0;0;0;0;0;0 -10465;plastifier;positive;0;0;0;0;0;0 -10466;plastique;negative;0;0;0;0;0;0 -10467;plat forme;positive;0;0;0;0;0;0 -10468;plateau;positive;0;0;0;0;0;0 -10469;plateforme;positive;0;0;0;0;0;0 -10470;platine;positive;0;0;0;0;0;0 -10471;platitude;negative;0;0;1;0;0;0 -10472;plâtre;negative;0;0;1;0;0;0 -10473;plâtrer;negative;0;0;1;0;0;0 -10474;plausibilité;positive;0;0;0;0;0;0 -10475;playa;positive;0;0;0;0;0;0 -10476;plein;positive;0;0;0;0;0;0 -10477;plein à craquer;negative;0;1;0;0;0;0 -10478;plein d espoir;positive;0;0;0;0;1;0 -10479;plein de bulle;positive;0;0;0;0;0;0 -10480;plein de monde;negative;0;1;0;0;0;0 -10481;plein de ressentiment;negative;0;0;0;1;0;0 -10482;plein propriété;positive;0;0;0;0;0;0 -10483;plénier;positive;0;0;0;0;0;0 -10484;plénitude;positive;0;0;0;0;0;0 -10485;pléthore;positive;0;0;0;0;0;0 -10486;pleur;negative;0;0;1;1;0;0 -10487;pleurant;negative;0;0;1;0;0;0 -10488;pleurer;negative;0;0;1;1;0;0 -10489;pleur|pleurs;negative;0;0;1;0;0;0 -10490;pleuvoir;negative;0;0;1;0;0;0 -10491;plexus;positive;0;0;0;0;0;0 -10492;pli;negative;0;1;1;0;0;1 -10493;pliage;positive;0;0;0;0;0;0 -10494;plier;negative;0;0;1;0;0;0 -10495;plinthe;positive;0;0;0;0;0;0 -10496;plisser;negative;0;0;1;0;0;0 -10497;ploiement;negative;0;0;1;0;0;0 -10498;plomb;positive;0;0;0;0;0;0 -10499;ployer;negative;0;0;1;0;0;0 -10500;pluie;negative;0;0;1;0;0;0 -10501;plumage;positive;0;0;0;0;0;0 -10502;plume;positive;0;0;0;0;0;0 -10503;plumeau;negative;0;0;0;0;0;1 -10504;pluralité;positive;0;0;0;0;0;0 -10505;plus âgé;positive;0;0;1;0;0;0 -10506;plus dodu;negative;0;0;0;0;0;0 -10507;plus élever;positive;0;0;0;0;0;0 -10508;plus grand que;positive;0;0;0;0;1;1 -10509;plus important;positive;0;0;0;0;0;0 -10510;plus jeune;positive;1;0;0;0;0;0 -10511;plus loin;negative;0;1;1;0;0;0 -10512;plus petit;negative;0;1;1;0;0;0 -10513;plus sec;positive;0;0;0;0;0;0 -10514;plus tôt;positive;0;0;0;0;0;0 -10515;plus vieux;positive;0;0;1;0;0;0 -10516;plusieurs foi|fois;negative;0;0;0;0;0;0 -10517;plutonium;positive;0;0;0;0;0;0 -10518;pluvier;positive;0;0;0;0;0;0 -10519;pneumonie;negative;0;1;1;0;0;0 -10520;poche;positive;0;0;0;0;0;0 -10521;poche ventral;positive;0;0;0;0;0;0 -10522;pochoir;positive;0;0;0;0;0;0 -10523;podium;positive;0;0;0;0;0;0 -10524;podomètre;positive;0;0;0;0;0;0 -10525;poêle;positive;0;0;0;0;0;0 -10526;poêle à frire;negative;0;0;0;0;0;0 -10527;poème;positive;0;0;0;0;0;0 -10528;poésie;positive;0;0;0;0;0;0 -10529;poète;positive;0;0;0;0;0;0 -10530;poétique;positive;0;0;0;0;0;0 -10531;poigner|poindre;positive;0;0;1;0;1;0 -10532;poignant;positive;0;0;1;0;1;0 -10533;poignarder;negative;0;1;1;1;1;0 -10534;poignet;positive;0;0;0;0;0;0 -10535;poing;positive;0;0;0;0;0;0 -10536;point culminer;positive;0;0;0;0;1;0 -10537;point de repère;positive;0;0;0;0;0;0 -10538;point de suture;negative;0;0;0;0;0;0 -10539;point de vue;positive;0;0;0;0;0;0 -10540;point fort;positive;0;0;0;0;0;0 -10541;point virgule;positive;0;0;0;0;0;0 -10542;pointer;positive;0;0;0;0;0;0 -10543;pointeur;positive;0;0;0;0;0;0 -10544;point de suspension;positive;0;0;0;0;0;0 -10545;pointu;negative;0;1;0;0;0;0 -10546;pointure;positive;0;0;0;0;0;0 -10547;pois;positive;0;0;0;0;0;0 -10548;poison;negative;0;1;1;1;0;1 -10549;poisseux;negative;0;0;0;0;0;1 -10550;poisson;positive;0;0;0;0;0;0 -10551;poissonnerie;positive;0;0;0;0;0;0 -10552;poitrine;positive;0;0;0;0;0;0 -10553;poivre;negative;0;0;0;0;0;0 -10554;poivron;negative;0;0;0;0;0;0 -10555;poker;positive;0;0;0;0;1;0 -10556;polaire;negative;0;1;0;0;0;0 -10557;polarité;positive;0;0;0;0;1;0 -10558;pôle;positive;0;0;0;0;0;0 -10559;polémique;negative;0;0;0;1;0;1 -10560;police de caractère;positive;0;0;0;0;0;0 -10561;polio;negative;0;1;1;0;0;0 -10562;politique;positive;0;0;0;1;0;1 -10563;polluer;negative;0;0;0;0;0;1 -10564;pollution;negative;0;0;0;0;0;1 -10565;polo;positive;0;0;0;0;0;0 -10566;polonais;positive;0;0;0;0;0;0 -10567;polygamie;negative;0;0;0;0;0;1 -10568;polygonal;positive;0;0;0;0;0;0 -10569;polygonales;positive;0;0;0;0;0;0 -10570;polygone;positive;0;0;0;0;0;0 -10571;polymère;positive;0;0;0;0;0;0 -10572;polymorphisme;positive;0;0;0;0;0;0 -10573;polyvalence;positive;0;0;0;0;0;0 -10574;polyvalent;positive;0;0;0;0;0;0 -10575;pommade;positive;0;0;0;0;0;0 -10576;pomme;positive;0;0;0;0;0;0 -10577;pompage;positive;0;0;0;0;0;0 -10578;pompe;positive;0;0;0;0;0;0 -10579;pomper;positive;0;0;0;0;0;0 -10580;pompette;negative;0;0;0;0;0;1 -10581;pompeux;negative;0;0;0;0;0;1 -10582;pompier;positive;0;0;0;0;0;0 -10583;ponceur;positive;0;0;0;0;0;0 -10584;poncho;positive;0;0;0;0;0;0 -10585;ponction;negative;0;1;1;0;1;0 -10586;ponctualité;positive;0;0;0;0;0;0 -10587;ponctuation;positive;0;0;0;0;0;0 -10588;ponctuellement;negative;0;0;0;0;0;0 -10589;pondérer;positive;0;0;0;0;0;0 -10590;poney;positive;0;0;0;0;0;0 -10591;pont;positive;0;0;0;0;0;0 -10592;pontife;positive;0;0;0;0;0;0 -10593;pontificat;positive;0;0;0;0;0;0 -10594;pontifier;positive;0;0;0;0;0;0 -10595;ponton;positive;0;0;0;0;0;0 -10596;pop;negative;0;1;0;0;1;0 -10597;populace;negative;0;1;0;1;0;1 -10598;populaire;positive;0;0;0;0;0;0 -10599;populariser;positive;0;0;0;0;0;0 -10600;popularité;positive;0;0;0;0;0;0 -10601;population;positive;0;0;0;0;0;0 -10602;porc épic;negative;0;1;0;0;0;1 -10603;porcelaine;positive;0;0;0;0;0;0 -10604;porche;positive;0;0;0;0;0;0 -10605;porcherie;negative;0;0;0;0;0;1 -10606;pore;negative;0;0;0;0;0;1 -10607;porno;negative;0;0;0;0;0;1 -10608;pornographie;negative;0;1;0;0;0;1 -10609;pornographique;negative;0;0;0;0;0;1 -10610;porosité;negative;0;0;0;0;0;1 -10611;porridge;positive;0;0;0;0;0;0 -10612;port;positive;0;0;0;0;0;0 -10613;port maritime;positive;0;0;0;0;0;0 -10614;portable;positive;0;0;0;0;0;0 -10615;portage;positive;0;0;0;0;0;0 -10616;portail;positive;0;0;0;0;0;0 -10617;porter;positive;0;0;1;0;0;0 -10618;portatif;positive;0;0;0;0;0;0 -10619;porte;positive;0;0;0;0;0;0 -10620;porte bonheur;positive;0;0;0;0;1;0 -10621;porte monnaie;positive;0;0;0;0;0;0 -10622;porte parole;positive;0;0;0;0;0;0 -10623;porte voix;negative;0;1;0;0;0;0 -10624;portefeuille;positive;0;0;0;0;0;0 -10625;porter atteindre;negative;0;1;1;1;0;1 -10626;porter un toast;positive;1;0;0;0;0;0 -10627;portion;positive;0;0;0;0;0;0 -10628;portique;positive;0;0;0;0;0;0 -10629;portraire;positive;0;0;0;0;0;0 -10630;pose;positive;0;0;0;0;0;0 -10631;poser;positive;0;0;0;0;0;0 -10632;pose de carrelage;positive;0;0;0;0;0;0 -10633;poser du tuile sur;positive;0;0;0;0;0;0 -10634;position;positive;0;0;0;0;0;0 -10635;position accroupir;negative;0;1;0;0;0;0 -10636;position debout;positive;0;0;0;0;0;0 -10637;possédant;positive;0;0;0;0;0;0 -10638;posséder;negative;0;1;0;1;0;1 -10639;posséedées;negative;0;1;0;1;0;1 -10640;possesseur;positive;0;0;0;0;0;0 -10641;possession;negative;0;1;1;1;0;1 -10642;possibilité;positive;0;0;0;0;0;0 -10643;possible;positive;0;0;0;0;1;0 -10644;post scriptum;positive;0;0;0;0;0;0 -10645;postal;positive;0;0;0;0;0;0 -10646;poste;positive;0;0;0;0;0;0 -10647;poste d amarrage;positive;0;0;0;0;0;0 -10648;poste de commandement;positive;0;0;0;0;0;0 -10649;poste de guet;positive;0;0;0;0;0;0 -10650;poste vacant;positive;1;0;0;0;0;0 -10651;poster;positive;0;0;0;0;0;0 -10652;postérieur;negative;0;0;0;0;0;0 -10653;postérieurement;negative;0;0;0;0;0;0 -10654;postériorité;negative;0;0;0;0;0;0 -10655;postérité;negative;0;0;1;0;0;0 -10656;posthume;negative;0;0;1;0;0;0 -10657;postillonner;negative;0;0;0;0;0;1 -10658;postulat;positive;0;0;0;0;0;0 -10659;postuler;positive;0;0;0;0;0;0 -10660;postuler à;positive;0;0;0;0;0;0 -10661;posture;positive;0;0;0;0;0;0 -10662;pot;positive;0;0;0;0;0;0 -10663;pot à crème;positive;0;0;0;0;0;0 -10664;pot de fleur;positive;0;0;0;0;0;0 -10665;pot au feu;positive;0;0;0;0;0;0 -10666;pot de vin;negative;0;0;0;0;0;0 -10667;pot pourri;positive;0;0;0;0;0;0 -10668;potable;positive;0;0;0;0;0;0 -10669;pote;positive;0;0;0;0;0;0 -10670;poteau indicateur;positive;0;0;0;0;0;0 -10671;potence;negative;0;1;1;1;0;0 -10672;poterie;positive;0;0;0;0;0;0 -10673;potier;positive;0;0;0;0;0;0 -10674;potion;positive;0;0;0;0;1;0 -10675;pou;negative;0;1;0;0;0;1 -10676;poubelle;negative;0;0;0;0;0;1 -10677;pouce;positive;0;0;0;0;0;0 -10678;poudre;negative;0;0;0;0;0;1 -10679;poudrer;negative;0;0;0;0;0;0 -10680;poudre à canon;negative;0;1;0;0;0;0 -10681;poudreux;negative;0;0;0;0;0;0 -10682;poulain;positive;0;0;0;0;0;0 -10683;poule;positive;0;0;0;0;0;0 -10684;poule mouillé;negative;0;1;0;0;0;1 -10685;poulet;positive;0;1;0;0;0;0 -10686;pouliche;positive;0;0;0;0;0;0 -10687;poulie;positive;0;0;0;0;0;0 -10688;poulpe;negative;0;1;0;0;0;1 -10689;pouls;positive;0;0;0;0;0;0 -10690;poumon;positive;0;0;0;0;0;0 -10691;poupée;positive;1;0;0;0;0;0 -10692;pour le jeune;positive;0;0;0;0;0;0 -10693;pour toujours;positive;0;0;0;0;0;0 -10694;pourboire;positive;0;0;0;0;0;0 -10695;pourcentage;positive;0;0;0;0;0;0 -10696;pourchasser;negative;0;1;0;1;0;0 -10697;pourpoint;positive;0;0;0;0;0;0 -10698;pourpre;positive;0;0;0;0;0;0 -10699;pourquoi;positive;0;0;0;0;0;0 -10700;pourrir;negative;0;0;1;0;0;1 -10701;pourriture;negative;0;1;1;0;1;1 -10702;poursuite judiciaire;negative;0;1;1;1;0;1 -10703;poursuite;negative;0;1;0;0;0;0 -10704;poursuivant;negative;0;1;0;0;0;0 -10705;poursuivre;negative;0;1;1;1;0;0 -10706;pourvoir au besoin de;positive;0;0;0;0;0;0 -10707;pourvu que;positive;0;0;0;0;0;0 -10708;pousse;negative;0;0;0;0;0;1 -10709;pousser;negative;0;1;0;0;1;0 -10710;poussée;negative;0;1;0;0;1;0 -10711;pousser du cri;negative;0;0;1;1;0;0 -10712;pousser du huée;negative;0;0;0;1;0;1 -10713;pousser doucement;negative;0;1;1;0;0;0 -10714;pousser du doigt;negative;0;1;0;1;1;0 -10715;pousser un cri perçant;negative;0;1;0;1;1;0 -10716;poussette;positive;0;0;0;0;0;0 -10717;poussière;negative;0;0;0;0;0;1 -10718;poutre;positive;0;0;0;0;0;0 -10719;pouvoir exécutif;positive;0;0;0;0;0;0 -10720;pouvoir judiciaire;positive;0;0;0;0;0;0 -10721;prairie;positive;0;0;0;0;0;0 -10722;praticable;positive;1;0;0;0;0;0 -10723;pratiquer;positive;0;0;0;0;1;0 -10724;pratiquement;positive;0;0;0;0;0;0 -10725;praxis;positive;0;0;0;0;0;0 -10726;pré;positive;0;0;0;0;0;0 -10727;préalable;positive;0;0;0;0;0;0 -10728;préambule;positive;0;0;0;0;0;0 -10729;précaire;negative;0;1;1;0;1;0 -10730;précaution;positive;0;0;0;0;0;0 -10731;précautionneux;positive;0;1;0;0;0;0 -10732;précéder;positive;0;0;0;0;0;0 -10733;précédemment;positive;0;0;0;0;0;0 -10734;précepte;positive;0;0;0;0;0;0 -10735;précepteur;positive;0;0;0;0;0;0 -10736;précession;positive;0;0;0;0;0;0 -10737;prêcher;positive;0;0;0;0;0;0 -10738;précicpités;negative;0;0;0;0;0;0 -10739;précipice;negative;0;1;0;0;0;0 -10740;précipitamment;negative;0;0;0;1;1;0 -10741;précipitation;negative;0;1;0;1;1;0 -10742;précis;positive;0;0;0;0;0;0 -10743;précisément;positive;0;0;0;0;0;0 -10744;précision;positive;0;0;0;0;0;0 -10745;préclusion;negative;0;1;0;0;0;0 -10746;précoce;negative;0;1;1;0;1;0 -10747;précurseur;positive;0;0;0;0;0;0 -10748;prédécesseur;positive;0;0;0;0;0;0 -10749;prédicat;positive;0;0;0;0;0;0 -10750;prédicateur;positive;0;0;0;0;0;0 -10751;prédication;positive;0;0;0;0;0;0 -10752;prédicteur;positive;0;0;0;0;0;0 -10753;prédictif;positive;0;0;0;0;0;0 -10754;prédiction;positive;0;0;0;0;0;0 -10755;prédilection;positive;0;0;0;0;0;0 -10756;prédire;positive;0;0;0;0;0;0 -10757;prédisposer;positive;0;0;0;0;0;0 -10758;prédisposition;positive;0;0;0;0;0;0 -10759;prédominer;positive;0;0;0;0;0;0 -10760;prédominant;positive;0;0;0;0;0;0 -10761;prééminent;positive;0;0;0;0;0;0 -10762;préemption;positive;0;0;0;0;0;0 -10763;préface;positive;0;0;0;0;0;0 -10764;préfacer;positive;0;0;0;0;0;0 -10765;préférer;positive;0;0;0;0;0;0 -10766;préférence;positive;0;0;0;0;0;0 -10767;préfet;positive;0;0;0;0;0;0 -10768;préfixe;positive;0;0;0;0;0;0 -10769;préhistorique;negative;0;1;0;0;0;0 -10770;préjudice;negative;0;1;1;1;0;0 -10771;préjudiciable;negative;0;1;1;1;0;0 -10772;préjuger;negative;0;1;0;1;0;1 -10773;prélude;positive;0;0;0;0;0;0 -10774;prématuré;negative;0;1;1;0;1;0 -10775;prématurément;negative;0;1;0;0;0;0 -10776;préméditation;positive;0;0;0;0;0;0 -10777;préméditer;negative;0;1;0;1;0;0 -10778;prémices;positive;0;0;0;0;0;0 -10779;premier plan;positive;0;0;0;0;0;0 -10780;prémisse;positive;0;0;0;0;0;0 -10781;prémonition;negative;0;1;0;0;0;0 -10782;prendre;negative;0;1;0;0;1;0 -10783;prendre feu;negative;0;1;0;1;1;0 -10784;prendre garde;negative;0;1;0;0;0;0 -10785;prendre le fuite;negative;0;1;0;0;0;0 -10786;prendre le petit déjeuner;positive;0;0;0;0;0;0 -10787;prendre le risque de;positive;0;0;0;0;1;0 -10788;prendre part à;positive;0;0;0;0;0;0 -10789;préoccupation;negative;0;1;1;0;0;0 -10790;préoccuper;negative;0;1;1;0;0;0 -10791;préparation;positive;0;0;0;0;0;0 -10792;préparatoire;positive;0;0;0;0;0;0 -10793;prépondérance;positive;0;0;0;0;0;0 -10794;prérequis;positive;0;0;0;0;0;0 -10795;prérogative;positive;0;0;0;0;0;0 -10796;présage;negative;0;1;0;1;0;0 -10797;présager;positive;0;0;0;0;0;0 -10798;presbytère;positive;0;0;0;0;0;0 -10799;prescient;positive;0;0;0;0;0;0 -10800;prescription;positive;0;0;0;0;0;0 -10801;prescrire;positive;0;0;0;0;0;0 -10802;préséance;positive;0;0;0;0;0;0 -10803;présence;positive;0;0;0;0;0;0 -10804;présent;positive;0;0;0;0;1;0 -10805;présentable;positive;0;0;0;0;0;0 -10806;présentation;positive;0;0;0;0;1;0 -10807;présenter;positive;0;0;0;0;0;0 -10808;présenter du excuse;positive;0;0;1;0;0;0 -10809;préservation;positive;0;0;0;0;0;0 -10810;présider;positive;0;0;0;0;0;0 -10811;présidence;positive;0;0;0;0;0;0 -10812;présomption;negative;0;1;0;0;0;0 -10813;presser;negative;0;1;0;0;0;0 -10814;pressant;negative;0;1;0;0;0;0 -10815;pression;negative;0;1;1;1;0;0 -10816;prestation;positive;0;0;0;0;0;0 -10817;prestidigitation;negative;0;1;0;0;1;0 -10818;prestige;positive;0;0;0;0;0;0 -10819;presto;positive;0;0;0;0;1;0 -10820;présumer;positive;0;0;0;0;0;0 -10821;présupposer;positive;0;0;0;0;0;0 -10822;prêt;positive;0;0;0;0;0;0 -10823;prétendant;positive;0;0;0;0;0;0 -10824;prétendre;negative;0;1;1;1;0;0 -10825;prêter;positive;0;0;0;0;0;0 -10826;prêter à confusion;negative;0;1;0;1;0;0 -10827;prêter serment;positive;0;0;0;0;0;0 -10828;prétexter;negative;0;0;0;1;0;0 -10829;prétexte;negative;0;0;0;0;0;1 -10830;prêtre;positive;0;0;0;0;0;0 -10831;prêtrise;positive;0;0;1;0;0;0 -10832;preuve;positive;0;0;0;0;0;0 -10833;prévalence;positive;0;0;0;0;0;0 -10834;prévaloir;positive;0;0;0;0;0;0 -10835;prévenance;positive;0;0;0;0;0;0 -10836;prévenir;positive;0;0;0;0;0;0 -10837;prévenant;positive;0;0;0;0;0;0 -10838;préventif;positive;0;0;0;0;0;0 -10839;prévention;positive;0;0;0;0;0;0 -10840;prévision;positive;0;0;0;0;0;0 -10841;prévisionniste;positive;0;0;0;0;0;0 -10842;prévoir;positive;0;0;0;0;1;0 -10843;prévoyance;positive;0;0;0;0;0;0 -10844;prier;positive;0;1;0;0;1;0 -10845;prière;positive;0;0;0;0;0;0 -10846;prieuré;positive;0;0;0;0;0;0 -10847;primate;negative;0;0;0;0;0;0 -10848;primauté;positive;0;0;0;0;0;0 -10849;prime;positive;0;0;0;0;1;0 -10850;primordial;positive;0;0;0;0;0;0 -10851;prince;positive;0;0;0;0;0;0 -10852;princesse;positive;0;0;0;0;0;0 -10853;principal;positive;0;0;0;0;0;0 -10854;principalement;positive;0;0;0;0;0;0 -10855;principe;positive;0;0;0;0;0;0 -10856;priorité;positive;0;0;0;0;0;0 -10857;prendre de vertige;negative;0;1;0;0;1;0 -10858;prise de bec;negative;0;0;0;1;0;0 -10859;prise de courant;negative;0;1;0;0;0;0 -10860;prise de vertige;negative;0;1;0;0;1;0 -10861;prise en compte;positive;0;0;0;0;0;0 -10862;prise en considération;positive;0;0;0;0;0;0 -10863;prismatique;positive;0;0;0;0;0;0 -10864;prisme;positive;0;0;0;0;0;0 -10865;prison;negative;0;1;1;1;0;0 -10866;prisonnier prisonnier;negative;0;1;1;1;0;1 -10867;privation;negative;0;1;1;1;0;1 -10868;priver;positive;0;0;0;0;0;0 -10869;priver de qch;negative;0;0;1;0;0;0 -10870;privilège;positive;0;0;0;0;0;0 -10871;privilégier;positive;0;0;0;0;0;0 -10872;privilégié;positive;0;0;0;0;0;0 -10873;probabilité;positive;0;0;0;0;0;0 -10874;probable;positive;0;0;0;0;0;0 -10875;probant;positive;1;0;0;0;0;0 -10876;probation;negative;0;1;1;0;0;0 -10877;probatoire;negative;0;1;0;0;0;0 -10878;probité;positive;0;0;0;0;0;0 -10879;problème;negative;0;1;1;1;1;0 -10880;procédé;positive;0;1;0;0;0;0 -10881;procéder;positive;0;0;0;0;0;0 -10882;procéder à un lavage interne;negative;0;1;0;0;0;1 -10883;procédure;positive;0;1;0;0;0;0 -10884;procession;positive;0;0;1;0;1;0 -10885;processus;positive;0;0;0;0;0;0 -10886;prochain;positive;0;0;0;0;0;0 -10887;prochainement;positive;0;0;0;0;0;0 -10888;prochain|prochaine;positive;0;0;0;0;0;0 -10889;proclamation;positive;0;0;0;0;0;0 -10890;proclamer;positive;0;0;0;0;0;0 -10891;procrastination;negative;0;1;1;0;0;0 -10892;procréation;positive;1;0;0;0;0;0 -10893;procréer;positive;0;0;0;0;0;0 -10894;procuration;positive;0;0;0;0;0;0 -10895;procureur;positive;0;0;0;0;0;0 -10896;prodige;positive;0;0;0;0;0;0 -10897;prodigue;positive;0;0;0;0;0;0 -10898;production;positive;0;0;0;0;0;0 -10899;productivité;positive;1;0;0;0;0;0 -10900;produire;positive;0;0;0;0;0;0 -10901;produit;positive;0;0;0;0;0;0 -10902;produit phare;positive;0;0;0;0;0;0 -10903;produit cosmétique;positive;0;0;0;0;0;0 -10904;produit de beauté;positive;0;0;0;0;0;0 -10905;profanation;negative;0;1;1;1;0;1 -10906;profaner;negative;0;0;1;1;0;1 -10907;professer;positive;0;0;0;0;0;0 -10908;professeur;positive;0;0;0;0;0;0 -10909;professeur particulier;positive;0;0;0;0;0;0 -10910;profession;positive;0;0;0;0;0;0 -10911;professionnel;positive;0;0;0;0;0;0 -10912;profil;positive;0;0;0;0;0;0 -10913;profit;positive;1;0;0;0;0;0 -10914;profiter de;positive;0;0;0;0;0;0 -10915;profondément;positive;0;0;0;0;0;0 -10916;profondeur;negative;0;1;0;0;0;0 -10917;profusion;positive;0;0;0;0;0;0 -10918;progéniture;positive;0;0;0;0;0;0 -10919;programme;positive;0;0;0;0;0;0 -10920;programmer;positive;0;0;0;0;0;0 -10921;programmeur;positive;0;0;0;0;0;0 -10922;progrès;positive;0;0;0;0;0;0 -10923;progresser;positive;0;1;0;0;1;0 -10924;progressiste;positive;0;0;0;0;0;0 -10925;progressivement;positive;0;0;0;0;0;0 -10926;prohiber;negative;0;1;1;1;0;1 -10927;prohibition;negative;0;1;1;1;0;1 -10928;proie;negative;0;1;1;0;0;0 -10929;projecteur;positive;0;0;0;0;0;0 -10930;projectile;negative;0;1;0;0;1;0 -10931;projection;positive;0;0;0;0;0;0 -10932;projet de loi;positive;0;0;0;0;0;0 -10933;projeter;positive;0;0;0;0;0;0 -10934;prolétaire;negative;0;0;0;0;0;0 -10935;prolétariat;negative;0;0;0;0;0;0 -10936;prolétarien;negative;0;0;0;0;0;0 -10937;prolifique;positive;0;0;0;0;0;0 -10938;prolixe;positive;0;0;0;0;0;0 -10939;prologue;positive;0;0;0;0;0;0 -10940;prolongation;positive;0;0;0;0;0;0 -10941;prolongement;positive;0;0;0;0;0;0 -10942;prolonger;positive;0;0;0;0;0;1 -10943;promenade;positive;1;0;0;0;0;0 -10944;promenade en barque;positive;0;0;0;0;0;0 -10945;promesse;positive;0;0;0;0;0;0 -10946;promettre;positive;0;0;0;0;0;0 -10947;promissoire;positive;0;0;0;0;0;0 -10948;promissoires;positive;0;0;0;0;0;0 -10949;promontoire;positive;0;0;0;0;0;0 -10950;promotion;positive;0;0;0;1;0;0 -10951;prompt;positive;0;0;0;0;0;0 -10952;promulgation;positive;0;0;0;0;0;0 -10953;promulguer;positive;0;0;0;0;0;0 -10954;prononcer;positive;0;0;0;0;0;0 -10955;prononciation;positive;0;0;0;0;0;0 -10956;pronostic;positive;0;1;0;0;0;0 -10957;propagande;negative;0;1;0;1;0;0 -10958;propagation;negative;0;1;0;0;0;0 -10959;propane;negative;0;0;0;0;0;1 -10960;propension;negative;0;0;1;0;0;0 -10961;prophète;positive;0;0;0;0;0;0 -10962;prophétie;positive;0;0;0;0;0;0 -10963;prophétique;positive;0;0;0;0;0;0 -10964;prophétiser;positive;0;0;0;0;0;0 -10965;prophylactique;positive;0;0;0;0;0;0 -10966;prophylaxie;positive;0;0;0;0;0;0 -10967;propice;positive;0;0;0;0;1;0 -10968;proportion;positive;0;0;0;0;0;0 -10969;proportionner;positive;0;0;0;0;0;0 -10970;propos insignifiant;negative;0;1;1;0;0;1 -10971;proposer;positive;0;0;0;0;0;0 -10972;proposition;positive;0;0;0;0;0;0 -10973;proposition de loi;positive;0;0;0;0;0;0 -10974;propre;positive;0;0;0;0;0;0 -10975;propreté;positive;0;0;0;0;0;0 -10976;propulser;negative;0;1;0;0;0;0 -10977;propulsion;negative;0;1;0;0;1;0 -10978;prorata;positive;0;0;0;0;0;0 -10979;proscrire;negative;0;1;0;1;0;0 -10980;prose;positive;0;0;0;0;0;0 -10981;prospecter;positive;0;0;0;0;0;0 -10982;prospectif;positive;0;0;0;0;0;0 -10983;prospective;positive;0;0;0;0;0;0 -10984;prospectivement;positive;0;0;0;0;0;0 -10985;prospère;positive;0;0;0;0;1;0 -10986;prospérer;positive;1;0;0;0;0;0 -10987;prospérité;positive;1;0;0;0;0;0 -10988;prostituer;negative;0;0;1;1;0;1 -10989;prostitution;negative;0;0;1;0;0;1 -10990;protagoniste;positive;0;0;0;0;0;0 -10991;protection;positive;0;0;0;0;0;0 -10992;protéger;positive;0;0;0;0;0;0 -10993;protéine;positive;0;0;0;0;0;0 -10994;protéiné;positive;0;0;0;0;0;0 -10995;protéique;positive;0;0;0;0;0;0 -10996;protestation;negative;0;0;0;1;0;0 -10997;protester;negative;0;0;0;1;0;0 -10998;protocole;positive;0;0;0;0;0;0 -10999;prototype;negative;0;1;0;0;0;0 -11000;protozoaire;positive;0;0;0;0;0;0 -11001;prouesse;positive;0;0;0;0;1;0 -11002;prouver;positive;0;0;0;0;0;0 -11003;provenir;positive;0;0;0;0;0;0 -11004;proverbe;positive;0;0;0;0;0;0 -11005;proverbial;positive;0;0;0;0;0;0 -11006;providence;positive;0;0;0;0;0;0 -11007;province;positive;0;0;0;0;0;0 -11008;proviseur;positive;0;0;0;0;0;0 -11009;provision;positive;0;0;0;0;0;0 -11010;provisoire;negative;0;1;0;0;0;0 -11011;provisoirement;negative;0;0;0;0;0;0 -11012;provocant;negative;0;0;0;1;1;1 -11013;provocation;negative;0;0;0;1;0;0 -11014;provoquer;negative;0;0;0;1;0;0 -11015;proximal;positive;0;0;0;0;0;0 -11016;prudent;positive;0;1;0;0;0;0 -11017;prune;positive;0;0;0;0;0;0 -11018;pruneau;negative;0;0;0;0;0;0 -11019;psaume;positive;0;0;0;0;0;0 -11020;pseudo;negative;0;1;1;1;0;0 -11021;psyché;negative;0;1;0;0;0;0 -11022;psychique;negative;0;1;0;0;0;0 -11023;psychisme;negative;0;1;0;0;0;0 -11024;psychologie;positive;0;0;0;0;0;0 -11025;psychologique;positive;0;0;0;0;0;0 -11026;psychologue;positive;0;0;0;0;0;0 -11027;psychose;negative;0;1;1;1;0;0 -11028;puer;negative;0;0;0;0;0;1 -11029;puant;negative;0;0;0;0;0;1 -11030;puanteur;negative;0;0;0;0;0;1 -11031;pub;positive;0;0;0;0;0;0 -11032;pubère;negative;0;0;0;0;0;0 -11033;puberté;negative;0;0;0;0;0;0 -11034;public;positive;0;0;0;0;0;0 -11035;publicitaire;negative;0;0;0;0;0;0 -11036;publicité;positive;0;0;0;0;0;0 -11037;publier;positive;0;0;0;0;0;0 -11038;publique;positive;0;0;0;0;0;0 -11039;publiquement;positive;0;0;0;0;0;0 -11040;puceron;negative;0;1;0;0;0;1 -11041;pudding;positive;0;0;0;0;0;0 -11042;puéril;negative;0;0;0;0;0;1 -11043;puisard;negative;0;0;0;0;0;1 -11044;puissamment;positive;0;1;0;0;0;0 -11045;puissance;positive;0;0;0;0;0;0 -11046;puits;positive;0;0;0;0;0;0 -11047;pull over;positive;0;0;0;0;0;0 -11048;pulmonaire;positive;0;0;0;0;0;0 -11049;pulpe;negative;0;0;0;0;0;1 -11050;pulsation;positive;0;0;0;0;0;0 -11051;pulvériser;positive;0;0;0;0;0;0 -11052;puma;negative;0;1;0;1;1;0 -11053;punaise;negative;0;0;0;0;0;0 -11054;punaiser;negative;0;0;0;0;0;0 -11055;punch;negative;0;1;1;1;1;0 -11056;punitif;negative;0;1;1;1;0;0 -11057;punition;negative;0;1;1;1;0;1 -11058;punk;negative;0;1;0;1;0;1 -11059;pupitre;positive;0;0;0;0;0;0 -11060;pur sang;positive;0;0;0;0;0;0 -11061;purée;negative;0;1;0;0;0;1 -11062;purée de pomme de terre;negative;0;0;0;0;0;0 -11063;purement;positive;0;0;0;0;0;0 -11064;pureté;positive;0;0;0;0;1;0 -11065;purgatoire;negative;0;1;0;0;0;1 -11066;purge;negative;0;1;0;0;0;1 -11067;purifier;positive;0;0;0;0;0;0 -11068;purification;positive;0;0;0;0;0;1 -11069;purin;negative;0;0;0;0;0;1 -11070;puriste;positive;0;0;0;0;0;0 -11071;pouvoir;negative;0;0;0;0;0;1 -11072;putain;negative;0;0;0;0;0;1 -11073;pute;negative;0;0;0;0;0;1 -11074;putois;negative;0;0;0;0;0;1 -11075;pygmée;negative;0;0;0;0;0;0 -11076;pyjama;positive;0;0;0;0;0;0 -11077;pyramidal;positive;0;0;0;0;0;0 -11078;pyramide;positive;0;0;0;0;0;0 -11079;pyrotechnie;positive;0;0;0;0;0;0 -11080;quadrant;positive;0;0;0;0;0;0 -11081;quadratique;positive;0;0;0;0;0;0 -11082;quadrilatère;positive;0;0;0;0;0;0 -11083;quadripolaire;positive;0;0;0;0;0;0 -11084;quadripôle;positive;0;0;0;0;0;0 -11085;quadruple;positive;0;0;0;0;0;0 -11086;quadrupler;positive;0;0;0;0;0;0 -11087;quai;positive;0;0;0;0;0;0 -11088;qualifier;positive;0;0;0;0;0;0 -11089;qualifiantes;positive;0;0;0;0;0;0 -11090;qualifiants;positive;0;0;0;0;0;0 -11091;qualification;positive;0;0;0;0;0;0 -11092;qualité;positive;0;0;0;0;0;0 -11093;quantifier;positive;0;0;0;0;0;0 -11094;quantique;positive;0;0;0;0;0;0 -11095;quantitativement;positive;0;0;0;0;0;0 -11096;quantité;positive;0;0;0;0;0;0 -11097;quantité suffisant;positive;0;0;0;0;0;0 -11098;quantum;positive;0;0;0;0;0;0 -11099;quarantaine;negative;0;1;0;0;0;1 -11100;quarante;positive;0;0;0;0;0;0 -11101;quart;positive;0;0;0;0;0;0 -11102;quartet;positive;0;0;0;0;0;0 -11103;quartier;positive;0;0;0;0;0;0 -11104;quartile;positive;0;0;0;0;0;0 -11105;quartz;positive;0;0;0;0;0;0 -11106;quasi;positive;0;0;0;0;0;0 -11107;quaternaire;positive;0;0;0;0;0;0 -11108;quatre vingt dix;positive;0;0;0;0;0;0 -11109;quatre vingts;positive;0;0;0;0;0;0 -11110;quatrième;positive;0;0;0;0;0;0 -11111;quatuor;positive;0;0;0;0;0;0 -11112;que ce être;negative;0;0;0;0;0;0 -11113;quel que être;negative;0;0;0;0;0;0 -11114;quémander;negative;0;0;1;0;0;1 -11115;querelle;negative;0;1;1;1;0;1 -11116;questionnaire;negative;0;0;0;0;0;0 -11117;questionner;negative;0;1;0;0;0;0 -11118;questionnement;negative;0;1;0;0;0;0 -11119;quête;positive;0;0;0;0;0;0 -11120;queue;negative;0;0;1;0;0;0 -11121;qui avoir du avis très arrêter;negative;0;0;0;1;0;0 -11122;qui avoir du préjugé;negative;0;1;0;1;0;1 -11123;qui avoir lieu;positive;0;0;0;0;0;0 -11124;qui avoir perdre;negative;0;0;1;1;1;0 -11125;qui avoir sommeil;negative;0;0;1;0;0;0 -11126;qui avoir un odeur de moisir;negative;0;0;0;0;0;1 -11127;qui approcher;positive;0;0;0;0;0;0 -11128;qui arriver;positive;0;0;0;0;0;0 -11129;qui attendre;negative;0;0;0;0;0;0 -11130;qui bâiller;negative;0;0;0;0;0;0 -11131;qui bouche;negative;0;0;0;1;1;0 -11132;qui calculer;positive;0;0;0;0;0;0 -11133;qui cause du tort;negative;0;0;1;1;0;1 -11134;qui commander;positive;0;0;0;0;0;0 -11135;qui consommer beaucoup;negative;0;0;0;0;0;1 -11136;qui court;positive;0;0;0;0;0;0 -11137;qui déborder;negative;0;1;0;0;1;0 -11138;qui délire;negative;0;1;1;1;1;0 -11139;qui désirer;positive;0;0;0;0;0;0 -11140;qui divaguer qui radoter;negative;0;1;1;0;0;0 -11141;qui dormir;positive;0;0;0;0;0;0 -11142;qui doute;negative;0;1;0;0;0;0 -11143;qui embaumer;positive;0;0;0;0;0;0 -11144;qui empêcher de se concentrer;negative;0;0;0;1;0;0 -11145;qui empire;negative;0;0;1;0;0;1 -11146;qui en résulter;positive;0;0;0;0;0;0 -11147;qui entrave;negative;0;0;1;1;0;0 -11148;qui être un échec;negative;0;0;1;0;0;0 -11149;qui établir;positive;0;0;0;0;0;0 -11150;qui extraire;positive;0;0;0;0;0;0 -11151;qui faire bouger le chose;positive;0;0;0;0;0;0 -11152;qui fond;negative;0;0;0;0;0;0 -11153;qui fuir;negative;0;1;0;0;1;1 -11154;qui gaspiller;negative;0;1;1;1;0;1 -11155;qui induire en erreur;negative;0;0;0;1;0;1 -11156;qui jouer de le batterie;positive;0;0;0;0;0;0 -11157;qui jouer du tambour;positive;0;0;0;0;0;0 -11158;qui manque de;negative;0;0;1;0;0;0 -11159;qui maudire;negative;0;1;0;1;0;1 -11160;qui mijoter;positive;0;0;0;0;0;0 -11161;qui monter;positive;0;1;0;0;0;0 -11162;qui monter à cru;positive;0;0;0;0;0;0 -11163;qui monter en flêche;negative;0;1;0;0;1;0 -11164;qui ne peser rien;positive;0;0;0;0;0;0 -11165;qui ne se douter de rien;negative;0;1;1;0;1;0 -11166;qui nettoyer;positive;0;0;0;0;0;0 -11167;qui observer en silence;negative;0;1;1;0;0;0 -11168;qui obstruer;negative;0;0;0;1;1;0 -11169;qui passer;negative;0;0;1;0;0;0 -11170;qui passer inaperçu;positive;0;0;0;0;0;0 -11171;qui perdre;negative;0;0;1;1;1;0 -11172;qui périr;negative;0;1;1;0;0;0 -11173;qui pouvoir se procurer;positive;1;0;0;0;0;0 -11174;qui prendre effet;positive;0;0;0;0;0;0 -11175;qui promettre;positive;0;0;0;0;0;0 -11176;qui protéger;positive;0;0;0;0;0;0 -11177;qui réchauffer;positive;1;0;0;0;0;0 -11178;qui recouvrer|recouvrir;positive;0;0;0;0;0;0 -11179;qui répondre;positive;0;0;0;0;0;0 -11180;qui représenter;positive;0;0;0;0;0;0 -11181;qui rester;negative;0;0;0;0;0;0 -11182;qui retenir;negative;0;0;0;0;0;0 -11183;qui rétrécir;negative;0;1;1;0;0;0 -11184;qui rime;positive;0;0;0;0;0;0 -11185;qui rire;positive;1;0;0;0;0;0 -11186;qui rougir;negative;0;0;0;0;1;0 -11187;qui roule;negative;0;0;0;0;0;0 -11188;qui s empiffrer;negative;0;0;0;0;0;1 -11189;qui s ennuyer;negative;0;0;1;0;0;0 -11190;qui se cacher;negative;0;1;1;0;0;0 -11191;qui se consumer;negative;0;1;1;0;0;0 -11192;qui se dégrader;negative;0;0;1;0;0;1 -11193;qui se détériorer;negative;0;0;1;0;0;1 -11194;qui se faire du souci;negative;0;1;1;0;0;0 -11195;qui se réduire;negative;0;1;1;0;0;0 -11196;qui se vanter;negative;0;0;0;0;0;0 -11197;qui se voir;positive;0;0;0;0;0;0 -11198;qui sombre;negative;0;1;1;0;0;0 -11199;qui sommeiller;positive;0;0;0;0;0;0 -11200;qui sonner;positive;0;0;0;0;1;0 -11201;qui soulager;positive;0;0;0;0;0;0 -11202;qui subsister;positive;1;0;0;0;0;0 -11203;qui suivre;positive;0;0;0;0;0;0 -11204;qui tendre ver|vers;positive;0;0;0;0;0;0 -11205;qui tomber;negative;0;1;1;0;0;0 -11206;qui tourner;negative;0;1;0;0;0;0 -11207;qui travailler;positive;0;0;0;0;0;0 -11208;quiétude;positive;0;0;0;0;0;0 -11209;quille;negative;0;1;0;0;0;0 -11210;quincaillerie;positive;0;0;0;0;0;0 -11211;quinine;positive;0;0;0;0;0;0 -11212;quiproquo;negative;0;1;1;1;0;0 -11213;quitter;negative;0;1;1;1;1;0 -11214;quiz;negative;0;0;0;0;0;0 -11215;quorum;positive;0;0;0;0;0;0 -11216;quota;positive;0;0;0;0;0;0 -11217;quotidien;positive;0;0;0;0;0;0 -11218;quotidiennement;positive;0;0;0;0;0;0 -11219;quotient;negative;0;0;0;0;0;0 -11220;rabais;positive;0;0;0;0;0;0 -11221;rabaisser;negative;0;1;1;1;0;1 -11222;rabat;negative;0;0;0;0;0;0 -11223;rabique;negative;0;1;1;1;0;1 -11224;rabougrir;negative;0;1;1;0;0;0 -11225;raccommodage;positive;0;0;0;0;0;0 -11226;raccord;positive;0;0;0;0;0;0 -11227;raccorder;positive;0;0;0;0;0;0 -11228;raccordement;positive;0;0;0;0;0;0 -11229;raccourcir;negative;0;0;0;0;0;0 -11230;raccourcissement;negative;0;0;0;0;0;0 -11231;rachat;positive;0;0;0;0;0;0 -11232;racheter;positive;0;0;0;0;0;0 -11233;rachis;positive;0;0;0;1;0;0 -11234;racine;positive;0;0;0;0;0;0 -11235;racket;negative;0;1;0;0;0;0 -11236;racler;negative;0;1;1;1;0;0 -11237;racoler;negative;0;0;0;0;0;0 -11238;racoleur;negative;0;0;0;0;0;0 -11239;raconter;positive;0;0;0;0;0;0 -11240;raconter un bobard;negative;0;0;0;1;0;1 -11241;radar;positive;0;0;0;0;0;0 -11242;radeau;negative;0;1;1;0;0;0 -11243;radiateur;positive;0;0;0;0;0;0 -11244;radiation;negative;0;1;0;0;0;0 -11245;radical;negative;0;0;1;0;0;0 -11246;radicalement;negative;0;1;0;0;1;0 -11247;radio;positive;0;0;0;0;0;0 -11248;radioactivité;negative;0;1;0;0;0;0 -11249;radiographie;positive;0;0;0;0;0;0 -11250;radiologie;positive;0;0;0;0;0;0 -11251;radium;negative;0;0;0;0;0;0 -11252;radius;positive;0;0;0;0;0;0 -11253;radon;negative;0;1;0;0;0;0 -11254;radotage;negative;0;0;0;0;0;1 -11255;radoter;negative;0;0;0;0;0;1 -11256;raffinage;positive;0;0;0;0;0;0 -11257;raffinement;positive;0;0;0;0;0;0 -11258;raffinerie;positive;0;0;0;0;0;0 -11259;rafraîchir;positive;1;0;0;0;0;0 -11260;rafraîchissant;positive;1;0;0;0;0;0 -11261;rage;negative;0;1;0;1;0;0 -11262;rage de dent;negative;0;1;1;0;0;1 -11263;ragot;negative;0;0;0;0;0;1 -11264;ragoût;positive;0;0;0;0;0;0 -11265;raid;negative;0;1;0;1;1;0 -11266;raide;negative;0;1;1;0;0;0 -11267;raideur;negative;0;1;1;1;0;0 -11268;raidir;negative;0;1;0;1;0;0 -11269;raie;positive;0;0;0;0;0;0 -11270;rail;positive;0;0;0;1;0;0 -11271;railler;negative;0;1;1;1;0;1 -11272;raisin;positive;0;0;0;0;0;0 -11273;raison;positive;0;0;0;0;0;0 -11274;raisonnablement;positive;0;0;0;0;0;0 -11275;raisonner;positive;0;0;0;0;0;0 -11276;raisonnement;positive;0;0;0;0;0;0 -11277;rajeunir;positive;1;0;0;0;0;0 -11278;ralentir;negative;0;0;1;0;0;0 -11279;râler;negative;0;1;1;1;0;1 -11280;râleur|râleux;negative;0;1;1;1;0;1 -11281;rallonge;positive;0;0;0;0;0;0 -11282;rallonger;positive;0;0;0;0;0;0 -11283;rallongement;positive;0;0;0;0;0;0 -11284;rallye;positive;0;0;0;0;0;0 -11285;rame de papier;positive;0;0;0;0;0;0 -11286;rampe;positive;0;0;0;1;0;0 -11287;ramper;negative;0;0;1;0;0;1 -11288;ramure;positive;0;0;0;0;0;0 -11289;rance;negative;0;0;0;0;0;1 -11290;ranch;positive;0;0;0;0;0;0 -11291;rançon;negative;0;1;0;1;0;0 -11292;rançonnement;negative;0;1;0;0;0;0 -11293;rançonner;negative;0;1;0;1;0;0 -11294;rancune;negative;0;0;1;1;0;1 -11295;randonner;positive;0;0;0;0;0;0 -11296;rang;positive;0;0;0;1;0;0 -11297;ranger;positive;0;0;0;0;0;0 -11298;rap;negative;0;0;0;0;0;0 -11299;rapace;negative;0;1;0;0;0;0 -11300;râper;negative;0;0;0;1;0;0 -11301;rapide;positive;0;0;0;0;1;0 -11302;rappel;positive;0;0;0;0;0;0 -11303;rappeler;positive;1;0;0;0;0;0 -11304;rapper;negative;0;0;0;0;0;0 -11305;rapport;positive;0;0;0;0;0;0 -11306;rapporter;positive;0;0;0;0;0;0 -11307;raquette;negative;0;1;0;0;0;0 -11308;rare;negative;0;1;1;0;1;0 -11309;rarement;negative;0;0;1;0;1;0 -11310;rareté;negative;0;1;1;1;1;0 -11311;rasage;positive;0;0;0;0;0;0 -11312;rasoir;negative;0;1;0;0;0;0 -11313;rassasier;positive;0;0;0;0;0;0 -11314;rassemblement;positive;0;0;0;0;0;0 -11315;rassembler;positive;0;0;0;0;0;0 -11316;rasseoir|rassir;negative;0;0;0;0;0;1 -11317;rassurer;positive;1;0;0;0;0;0 -11318;rassurant;positive;1;0;0;0;0;0 -11319;rat;negative;0;1;0;0;0;1 -11320;rate;negative;0;0;1;0;0;0 -11321;rater;negative;0;1;1;1;0;0 -11322;râteau;negative;0;0;0;0;0;0 -11323;ratification;positive;0;0;0;0;0;0 -11324;ratifier;positive;0;0;0;0;0;0 -11325;ratio;positive;0;0;0;0;0;0 -11326;ration;negative;0;0;1;0;0;0 -11327;rationalisme;positive;0;0;0;0;0;0 -11328;rationalité;positive;0;0;0;0;0;0 -11329;rationner;negative;0;0;1;0;0;0 -11330;ratisser;negative;0;0;0;0;0;0 -11331;rattraper;negative;0;0;1;0;0;0 -11332;rauque;negative;0;0;1;1;0;0 -11333;ravage;negative;0;1;1;1;0;0 -11334;ravir;positive;0;0;0;0;1;0 -11335;ravin;negative;0;1;0;0;0;0 -11336;ravissement;positive;1;0;0;0;0;0 -11337;ravisseur;negative;0;1;0;0;0;0 -11338;ravitailler;positive;0;0;0;0;0;0 -11339;rayaux;positive;0;0;0;0;0;0 -11340;rayon;positive;1;0;0;0;0;0 -11341;rayon de miel;positive;0;0;0;0;0;0 -11342;rayon de soleil;positive;1;0;0;0;0;0 -11343;rayonner;positive;1;0;0;0;0;0 -11344;rayure;negative;0;0;0;0;0;0 -11345;réaction;positive;0;0;0;0;0;0 -11346;réactionnaire;negative;0;1;0;1;0;1 -11347;réactivité;positive;0;0;0;0;0;0 -11348;réaffirmer;positive;0;0;0;0;0;0 -11349;réagir;negative;0;1;0;1;0;0 -11350;réajustement;positive;0;0;0;0;0;0 -11351;réalisation;positive;0;0;0;0;0;0 -11352;réaliser;positive;0;0;0;0;0;0 -11353;réalisme;positive;0;0;0;0;0;0 -11354;réaliste;positive;0;0;0;0;0;0 -11355;réalité;positive;0;0;0;0;0;0 -11356;réaménager;positive;0;0;0;0;0;0 -11357;réanimation;negative;0;1;1;0;0;0 -11358;réanimer;positive;0;0;0;0;0;0 -11359;réapparaître;positive;0;0;0;0;1;0 -11360;réapprovisionner;positive;0;0;0;0;0;0 -11361;réarrangement;positive;0;0;0;0;0;0 -11362;réarranger;positive;0;0;0;0;0;0 -11363;réassembler;positive;0;0;0;0;0;0 -11364;réassurance;positive;0;0;0;0;0;0 -11365;rebâtir;positive;0;0;0;0;0;0 -11366;rebelle;negative;0;1;0;1;0;0 -11367;rébellion;negative;0;1;0;1;1;1 -11368;rebond;positive;1;0;0;0;0;0 -11369;rebondir;positive;1;0;0;0;0;0 -11370;rebord;negative;0;1;0;0;0;0 -11371;récalcitrant;negative;0;0;0;1;0;1 -11372;recensement;positive;0;0;0;0;0;0 -11373;recenser;positive;0;0;0;0;0;0 -11374;récent;positive;0;0;0;0;0;0 -11375;récépissé;positive;0;0;0;0;0;0 -11376;réceptacle;positive;0;0;0;0;0;0 -11377;récepteur;positive;0;0;0;0;0;0 -11378;réception;positive;0;0;0;0;0;0 -11379;récession;negative;0;1;1;1;0;1 -11380;recette;positive;0;0;1;0;0;0 -11381;recevabilité;positive;0;0;0;0;0;0 -11382;réchauffer;positive;1;0;0;0;0;0 -11383;réchauffement;positive;1;0;0;0;0;0 -11384;recherche;positive;0;0;0;0;0;0 -11385;rechercher;positive;0;0;0;0;0;0 -11386;rechute;negative;0;1;1;0;1;0 -11387;rechuter;negative;0;1;1;0;0;0 -11388;récidive;negative;0;0;1;1;0;1 -11389;récidiver;negative;0;0;0;0;0;0 -11390;récidivisme;negative;0;0;1;1;0;1 -11391;récif;positive;0;0;0;0;0;0 -11392;réciprocité;positive;0;0;0;0;0;0 -11393;réciproque;positive;0;0;0;0;0;0 -11394;réciproquement;positive;0;0;0;0;0;0 -11395;récit;positive;0;0;0;0;0;0 -11396;récital;positive;0;0;0;0;0;0 -11397;récitation;positive;0;0;0;0;0;0 -11398;réciter;positive;0;0;0;0;0;0 -11399;reclure;negative;0;1;1;0;0;0 -11400;récolte;positive;0;0;0;0;0;0 -11401;récolter;positive;0;0;0;0;0;0 -11402;recombinaison;positive;0;0;0;0;0;0 -11403;recombiner;positive;0;0;0;0;0;0 -11404;recombinante;positive;0;0;0;0;0;0 -11405;recombinantes;positive;0;0;0;0;0;0 -11406;recombinants;positive;0;0;0;0;0;0 -11407;recommandation;positive;0;0;0;0;0;0 -11408;recommander;positive;0;0;0;0;0;0 -11409;récompense;positive;0;0;0;0;1;0 -11410;récompenser;positive;0;0;0;0;1;0 -11411;recompter;positive;0;0;0;0;0;0 -11412;réconciliation;positive;0;0;0;0;0;0 -11413;réconcilier;positive;0;0;0;0;0;0 -11414;réconfort;positive;0;0;0;0;0;0 -11415;réconforter;positive;1;0;0;0;0;0 -11416;réconfortant;positive;1;0;0;0;0;0 -11417;reconnaissable;positive;0;0;0;0;0;0 -11418;reconnaissance;positive;0;0;0;0;0;0 -11419;reconnaître;positive;0;0;0;0;0;0 -11420;reconnaissant;positive;0;0;0;0;0;0 -11421;reconsidérer;negative;0;0;0;0;0;0 -11422;reconstituer;positive;0;0;0;0;0;0 -11423;reconstitution;positive;0;0;0;0;0;0 -11424;reconstitution historique;positive;0;0;0;0;0;0 -11425;reconstruction;positive;0;0;0;0;0;0 -11426;reconstruire;positive;0;0;0;0;0;0 -11427;record;positive;0;0;0;0;0;0 -11428;recours;positive;0;0;0;0;0;0 -11429;recourir;positive;0;0;0;0;0;0 -11430;recouvrir;positive;0;0;0;0;0;0 -11431;recouvrer|recouvrir;positive;0;0;0;0;0;0 -11432;recouvrante;positive;0;0;0;0;0;0 -11433;recouvrantes;positive;0;0;0;0;0;0 -11434;recouvrants;positive;0;0;0;0;0;0 -11435;récréation;positive;1;0;0;0;0;0 -11436;recroître;positive;0;0;0;0;0;0 -11437;recruter;positive;0;0;0;0;0;0 -11438;recrutement;positive;0;0;0;0;0;0 -11439;rectangle;positive;0;0;0;0;0;0 -11440;rectangulaire;positive;0;0;0;0;0;0 -11441;recteur;positive;0;0;0;0;0;0 -11442;rectification;positive;0;0;0;0;0;0 -11443;rectifier;positive;0;0;0;0;0;0 -11444;recueillir;positive;0;0;0;0;0;0 -11445;récupérable;positive;0;0;0;0;0;0 -11446;récupération;positive;1;0;0;0;0;0 -11447;récupérer;positive;1;0;0;0;0;0 -11448;récurer;negative;0;0;0;0;0;1 -11449;récurrence;negative;0;0;0;0;0;0 -11450;récurrent;negative;0;0;1;0;0;0 -11451;récursif;positive;0;0;0;0;0;0 -11452;récursivement;positive;0;0;0;0;0;0 -11453;rédaction;positive;0;0;0;0;0;0 -11454;reddition;negative;0;1;1;0;0;0 -11455;rédemption;positive;1;0;0;0;0;0 -11456;redevable;negative;0;0;0;0;0;0 -11457;rédiger;positive;0;0;0;0;0;0 -11458;redire;negative;0;0;0;0;0;0 -11459;redondance;negative;0;0;1;0;0;0 -11460;redonder;negative;0;0;0;0;0;0 -11461;redondant;negative;0;0;0;0;0;0 -11462;redoublement;negative;0;0;1;0;0;0 -11463;redresser;positive;0;0;0;0;0;0 -11464;réduire au maximum;negative;0;0;1;0;0;0 -11465;réduire de moitié;negative;0;0;0;0;0;0 -11466;réel;positive;0;0;0;0;0;0 -11467;rééquipement;positive;0;0;0;0;0;0 -11468;rééquiper;positive;0;0;0;0;0;0 -11469;réexamen;positive;0;0;0;0;0;0 -11470;réexaminer;negative;0;0;0;0;0;0 -11471;refaire;positive;0;0;0;0;0;0 -11472;réfectoire;positive;0;0;0;0;0;0 -11473;référence;positive;0;0;0;0;0;0 -11474;referendum;positive;0;0;0;0;0;0 -11475;référendum;positive;0;0;0;0;0;0 -11476;réfléchir;positive;0;0;0;0;0;0 -11477;réfléchissant;positive;0;0;0;0;0;0 -11478;réflecteur;positive;0;0;0;0;0;0 -11479;reflet;positive;0;0;0;0;0;0 -11480;réflexe;positive;0;0;0;0;1;0 -11481;reflux;negative;0;0;1;0;0;1 -11482;refondre;positive;0;0;0;0;0;0 -11483;réforme;positive;0;0;0;0;0;0 -11484;réformer;positive;0;0;0;0;0;0 -11485;refouler;negative;0;0;1;0;0;0 -11486;refoulement;negative;0;1;1;1;0;0 -11487;réfractaire;negative;0;0;0;1;0;0 -11488;réfracteur;positive;0;0;0;0;0;0 -11489;réfraction;positive;0;0;0;0;0;0 -11490;refrain;positive;1;0;0;0;0;0 -11491;réfréner;negative;0;0;0;0;0;0 -11492;réfrigérateur;negative;0;0;0;0;0;0 -11493;réfrigération;negative;0;0;0;0;0;0 -11494;réfrigérer;negative;0;0;0;0;0;0 -11495;refroidir;negative;0;1;1;0;0;0 -11496;refroidissant;positive;0;0;0;0;0;0 -11497;refroidissement;positive;0;0;0;0;0;0 -11498;refroidisseur;positive;0;0;0;0;0;0 -11499;refuge;positive;0;0;0;0;0;0 -11500;refus;negative;0;0;0;0;0;0 -11501;refuser;negative;0;0;0;0;0;0 -11502;refuséesdémentis;negative;0;0;1;1;0;0 -11503;réfutation;negative;0;1;0;0;0;0 -11504;réfuter;negative;0;0;0;1;0;0 -11505;regagner;positive;0;0;0;0;0;0 -11506;regard;positive;0;0;0;0;0;0 -11507;regard méchant;negative;0;0;0;1;0;1 -11508;regarder;positive;0;0;0;0;0;0 -11509;regarder avec du ?il rond;positive;0;0;0;0;1;0 -11510;regarder bêtement;negative;0;0;0;0;1;0 -11511;regarder bouche bée;negative;0;0;0;0;1;0 -11512;regarder en face;positive;0;0;0;0;0;0 -11513;regarder méchamment;negative;0;0;0;1;0;1 -11514;régate;positive;0;0;0;0;0;0 -11515;régence;positive;0;0;0;0;0;0 -11516;régénération;positive;0;0;0;0;0;0 -11517;régénérer;positive;0;0;0;0;0;0 -11518;regent;positive;0;0;0;0;0;0 -11519;regimber;negative;0;1;0;1;0;0 -11520;régime politique;positive;0;0;0;0;0;0 -11521;régiment;negative;0;1;0;0;0;0 -11522;région;positive;0;0;0;0;0;0 -11523;région boisé;positive;0;0;0;0;0;0 -11524;région montagneux;positive;0;0;0;0;0;0 -11525;régional;positive;0;0;0;0;0;0 -11526;régionalisme;negative;0;0;0;0;0;0 -11527;registre;positive;0;0;0;0;0;0 -11528;règle;positive;0;1;0;0;0;0 -11529;régler;positive;0;0;0;0;0;0 -11530;réglementaire;positive;0;0;0;0;0;0 -11531;réglementation;positive;0;0;0;0;0;0 -11532;réglementer;positive;0;0;0;0;0;0 -11533;règne;positive;0;0;0;0;0;0 -11534;régner;positive;0;0;0;0;0;0 -11535;régner sur;positive;0;1;0;0;0;0 -11536;regorger;negative;0;1;0;0;1;1 -11537;régresser;negative;0;0;1;0;0;0 -11538;régression;negative;0;0;1;0;0;0 -11539;regrettable;negative;0;0;1;0;0;0 -11540;regretter;negative;0;0;1;0;0;0 -11541;regrouper;positive;0;0;0;0;0;0 -11542;régularisation;positive;0;0;0;0;0;0 -11543;régulariser;positive;0;0;0;0;0;0 -11544;régularité;positive;0;0;0;0;0;0 -11545;régulateur;positive;0;1;0;0;0;0 -11546;régulation;positive;0;0;0;0;0;0 -11547;réguler;positive;0;0;0;0;0;0 -11548;régulièrement;positive;0;0;0;0;0;0 -11549;régulier;positive;0;0;0;0;0;0 -11550;régurgitation;negative;0;0;0;0;0;1 -11551;réhabilitation;positive;0;0;0;0;0;0 -11552;réhabiliter;positive;0;0;0;0;0;0 -11553;rehaussement;positive;0;0;0;0;0;0 -11554;réimpression;positive;0;0;0;0;0;0 -11555;réimprimer;positive;0;0;0;0;0;0 -11556;réincarner;positive;1;0;0;0;0;0 -11557;reine;positive;0;0;0;0;0;0 -11558;réinsérer;positive;0;0;0;0;0;0 -11559;réinsertion;positive;0;0;0;0;0;0 -11560;réinstaller;positive;0;0;0;0;0;0 -11561;réintégration;positive;0;0;0;0;0;0 -11562;réinvestir;positive;0;0;0;0;0;0 -11563;réinvestissement;positive;0;0;0;0;0;0 -11564;rejeter;negative;0;1;1;0;0;1 -11565;rejoindre;positive;0;0;0;0;0;0 -11566;réjouissance;positive;0;0;0;0;1;0 -11567;relais;positive;0;0;0;0;0;0 -11568;relance;positive;0;0;0;0;0;0 -11569;relation;positive;0;0;0;0;0;0 -11570;relativement;positive;0;0;0;0;0;0 -11571;relativité;positive;0;0;0;0;0;0 -11572;relaxation;positive;1;0;0;0;0;0 -11573;relayer|relayer;positive;0;0;0;0;0;0 -11574;relégation;negative;0;0;1;0;0;0 -11575;relier;negative;0;0;0;0;0;0 -11576;religieux;positive;0;0;0;0;0;0 -11577;religion;positive;0;0;0;0;0;0 -11578;relique;negative;0;0;0;0;0;0 -11579;remake;positive;0;0;0;0;0;0 -11580;remaniement;positive;0;0;0;0;0;0 -11581;remarquablement;positive;0;0;0;0;1;0 -11582;remarquer;positive;0;0;0;0;0;0 -11583;remblai;positive;0;0;0;0;0;0 -11584;rembourser;positive;0;0;0;1;0;0 -11585;remède;positive;0;0;0;0;0;0 -11586;remédier;positive;0;0;0;0;0;0 -11587;remettre à plus tard;negative;0;0;1;0;0;0 -11588;remettre;positive;0;0;0;0;0;0 -11589;remettre du diplôme;positive;0;1;0;0;1;0 -11590;rémission;positive;1;0;0;0;0;0 -11591;remodeler;positive;0;0;0;0;0;0 -11592;remonter;positive;0;0;0;0;0;0 -11593;remonter le fermeture éclair;positive;0;0;0;0;0;0 -11594;remords;negative;0;0;1;0;0;0 -11595;remorquer;positive;0;0;0;0;0;0 -11596;remorqueur;positive;0;0;0;0;0;0 -11597;remous;negative;0;1;1;0;0;1 -11598;rempart;positive;0;0;0;0;0;0 -11599;remplacement;negative;0;0;1;0;0;0 -11600;remplir;positive;0;0;0;0;0;0 -11601;remplir de nouveau;positive;0;0;0;0;0;0 -11602;remplissage;positive;0;0;0;0;0;0 -11603;remue méninge;positive;0;0;0;0;0;0 -11604;rémunération;positive;0;0;0;0;0;0 -11605;rémunérer;positive;1;0;0;0;0;0 -11606;renaissance;positive;0;0;0;0;0;0 -11607;renard;positive;0;0;0;0;0;0 -11608;renarde;negative;0;0;0;0;0;0 -11609;rencontre;positive;0;0;0;0;1;0 -11610;rencontrer;positive;0;0;0;0;1;0 -11611;rendement;positive;0;0;0;0;0;0 -11612;rendre vous;positive;0;0;0;0;0;0 -11613;rendre;positive;0;0;0;0;0;0 -11614;rendre enclin;positive;0;0;0;0;0;1 -11615;rendre esclave;negative;0;0;0;1;0;0 -11616;rendre fou;negative;0;1;0;1;0;0 -11617;rendre le pareil;positive;0;0;0;0;0;0 -11618;rendre responsable;negative;0;0;0;1;0;1 -11619;rendre visite;positive;0;0;0;0;0;0 -11620;rêne;positive;0;0;0;0;0;0 -11621;renflement;negative;0;0;0;0;0;1 -11622;renfoncement;negative;0;1;1;0;0;0 -11623;renforcement;positive;0;0;0;0;0;0 -11624;renforcer;positive;0;0;0;1;0;0 -11625;renfort;positive;0;0;0;0;0;0 -11626;renfrogner;negative;0;0;1;1;0;1 -11627;reniflement;negative;0;0;1;0;0;1 -11628;renifler;negative;0;0;1;0;0;1 -11629;renne;positive;0;0;0;0;0;0 -11630;renom;positive;0;0;0;0;0;0 -11631;renommée;positive;0;0;0;0;0;0 -11632;renoncer;negative;0;0;1;1;0;0 -11633;renoncer à;negative;0;1;1;1;0;0 -11634;renonciation;negative;0;1;1;0;0;0 -11635;renouveau;positive;0;0;0;0;0;0 -11636;renouvellement;positive;0;0;0;0;0;0 -11637;rénovation;positive;1;0;0;0;0;0 -11638;rénover;positive;0;0;0;0;0;0 -11639;renseignement;positive;0;0;0;0;0;0 -11640;renseigner;positive;0;0;0;0;0;0 -11641;rente;positive;0;0;0;0;0;0 -11642;rentrer;positive;0;0;0;0;0;0 -11643;rentrée;positive;0;0;0;0;0;0 -11644;renverser;negative;0;1;0;0;0;0 -11645;réorganisation;positive;0;0;0;0;0;0 -11646;réorganiser;positive;0;0;0;0;0;0 -11647;repaire;positive;0;0;0;0;0;0 -11648;réparation;positive;0;0;0;0;0;0 -11649;réparer;positive;0;0;0;0;0;0 -11650;repartir;positive;1;0;0;0;0;0 -11651;répartition;positive;0;0;0;0;0;0 -11652;repas;positive;0;0;0;0;0;0 -11653;repasser;positive;0;0;0;0;0;0 -11654;repentir;negative;0;1;1;0;0;0 -11655;repérer;negative;0;0;0;0;0;0 -11656;répertoire;positive;0;0;0;0;0;0 -11657;répéter;negative;0;0;0;0;0;0 -11658;répéteur;negative;0;0;0;0;0;0 -11659;repli;negative;0;1;1;0;0;0 -11660;réplication;negative;0;0;0;0;0;0 -11661;répondre;positive;0;0;0;0;0;0 -11662;réponse;positive;0;0;0;0;0;0 -11663;reportage;positive;0;0;0;0;0;0 -11664;reporter;negative;0;0;1;0;0;0 -11665;repos;positive;1;0;0;0;0;0 -11666;reposer;positive;0;0;0;0;0;0 -11667;reposant;positive;0;0;0;0;0;0 -11668;repousser;negative;0;1;0;1;0;1 -11669;repoussant;negative;0;1;0;1;0;1 -11670;répréhensible;negative;0;0;0;1;0;0 -11671;reprendre;positive;1;0;0;0;0;0 -11672;représaille;negative;0;1;1;1;0;0 -11673;représenter;positive;0;0;0;0;0;0 -11674;représentation;positive;0;0;0;0;0;0 -11675;répression;negative;0;1;1;1;0;0 -11676;réprimande;negative;0;1;1;1;0;0 -11677;réprimander;negative;0;0;0;1;0;0 -11678;réprimer;negative;0;1;1;1;0;0 -11679;reprisage;positive;0;0;0;0;0;0 -11680;reprise;positive;0;0;0;0;0;0 -11681;repriser;positive;0;0;0;0;0;0 -11682;réprobation;negative;0;1;1;1;0;1 -11683;reproche;negative;0;0;1;1;0;1 -11684;reprocher;negative;0;0;1;1;0;1 -11685;reproducteur;positive;1;0;0;0;0;0 -11686;reproduire;positive;0;0;0;0;0;0 -11687;repsats;positive;0;0;0;0;0;0 -11688;reptile;negative;0;1;0;0;0;0 -11689;repaître;positive;0;0;0;0;0;0 -11690;république;positive;0;0;0;0;0;0 -11691;repudiation;negative;0;0;0;1;0;1 -11692;répudiation;negative;0;0;0;1;0;1 -11693;répugnance;negative;0;0;0;0;0;1 -11694;répugnant;negative;0;1;0;1;0;1 -11695;répulsif;negative;0;1;0;1;0;1 -11696;répulsion;negative;0;1;0;1;0;1 -11697;réputer;positive;0;0;0;0;0;0 -11698;requérir;negative;0;0;0;1;0;1 -11699;requiem;negative;0;0;1;0;0;0 -11700;requin;negative;0;1;0;0;0;0 -11701;réquisition;positive;0;0;0;0;0;0 -11702;réquisitionner;positive;0;0;0;0;0;0 -11703;réseau;positive;0;0;0;0;0;0 -11704;résection;negative;0;1;0;0;0;1 -11705;réséquer;negative;0;1;0;0;0;1 -11706;réservation;positive;0;0;0;0;0;0 -11707;réserver;positive;0;0;0;0;0;0 -11708;réservoir;positive;0;0;0;0;0;0 -11709;résider;positive;0;0;0;0;0;0 -11710;résidence;positive;0;0;0;0;0;0 -11711;résidu;negative;0;0;0;0;0;0 -11712;résignation;negative;0;0;1;0;1;0 -11713;résigner;negative;0;0;1;0;0;0 -11714;résiliation;negative;0;0;1;0;1;0 -11715;résilience;positive;0;0;0;0;0;0 -11716;résilient;positive;0;0;0;0;0;0 -11717;résilier;negative;0;1;1;0;0;0 -11718;résine;negative;0;0;0;0;0;1 -11719;résisitantes;negative;0;0;1;0;0;0 -11720;résister;negative;0;0;1;0;0;0 -11721;résistance;positive;0;0;0;1;0;0 -11722;résister à;positive;0;1;0;1;0;0 -11723;résoudre;positive;0;0;0;0;0;0 -11724;résolument;positive;0;0;0;0;0;0 -11725;résolution;positive;0;0;0;0;0;0 -11726;résonance;negative;0;1;0;0;0;0 -11727;résonateur;negative;0;0;0;0;0;0 -11728;résonner;negative;0;1;0;0;1;0 -11729;respect;positive;0;0;0;0;0;0 -11730;respectabilité;positive;0;0;0;0;0;0 -11731;respectable;positive;0;0;0;0;0;0 -11732;respecter;positive;0;0;0;0;0;0 -11733;respecteuses;positive;0;0;0;0;0;0 -11734;respirateur;positive;0;0;0;0;0;0 -11735;respiration;positive;0;0;0;0;0;0 -11736;respirer;positive;0;0;0;0;0;0 -11737;resplendissant;positive;1;0;0;0;0;0 -11738;responsabiliser;positive;0;0;0;0;0;0 -11739;responsable;positive;0;0;0;0;0;0 -11740;ressemblance;positive;0;0;0;0;0;0 -11741;ressembler;positive;0;0;0;0;0;0 -11742;ressemblant;positive;0;0;0;0;0;0 -11743;ressentir;positive;0;0;0;0;0;0 -11744;ressentiment;negative;0;0;1;1;0;1 -11745;resserrer;positive;0;0;0;1;0;0 -11746;ressource;positive;0;0;0;0;0;0 -11747;ressusciter;positive;1;0;0;0;0;0 -11748;restant;negative;0;0;0;0;0;0 -11749;restaurant;positive;0;0;0;0;0;0 -11750;restauration;positive;0;0;0;0;0;0 -11751;restaurer;positive;0;0;0;0;0;0 -11752;rester;positive;0;0;0;0;0;0 -11753;rester bouche bée;positive;0;0;0;0;1;0 -11754;rester tapir;negative;0;1;1;0;0;0 -11755;restitution;positive;0;0;0;1;0;0 -11756;restraindre;negative;0;1;0;1;0;0 -11757;restreindre;negative;0;1;1;0;0;0 -11758;restructuration;positive;0;0;0;0;0;0 -11759;résulter;positive;0;0;0;0;0;0 -11760;résultat;positive;0;0;0;0;0;0 -11761;résumer;positive;0;0;0;0;0;0 -11762;résurrection;positive;0;0;0;0;0;0 -11763;rétablir;positive;0;0;0;0;0;0 -11764;rétablissement;positive;1;0;0;0;0;0 -11765;retard;negative;0;1;1;1;0;1 -11766;retarder;negative;0;0;1;0;0;0 -11767;retenir;negative;0;0;0;0;0;0 -11768;rétention;positive;0;0;0;0;0;0 -11769;retentir;negative;0;1;0;1;1;0 -11770;retentissant;negative;0;1;0;1;1;0 -11771;réticence;negative;0;1;1;0;0;1 -11772;réticent;negative;0;1;0;0;0;0 -11773;rétine;positive;0;0;0;0;0;0 -11774;retirer;negative;0;0;1;0;0;0 -11775;rétorquer;negative;0;0;0;1;0;0 -11776;retour;positive;0;0;0;0;0;0 -11777;retour de flamme;negative;0;0;1;1;0;0 -11778;retour en arrière;positive;0;0;0;0;1;0 -11779;retourner voir;positive;0;0;0;0;0;0 -11780;retracer;positive;0;0;0;0;0;0 -11781;rétractation;negative;0;1;1;0;0;0 -11782;rétracter;negative;0;1;0;1;0;0 -11783;retraite;positive;0;1;1;0;0;0 -11784;retranchement;negative;0;1;1;0;0;0 -11785;rétrécir;negative;0;1;1;0;0;0 -11786;rétrécissement;negative;0;1;1;0;0;0 -11787;retriever;positive;0;0;0;0;0;0 -11788;rétrograde;negative;0;0;1;0;0;1 -11789;rétrograder;negative;0;0;1;0;0;1 -11790;rétrospectif;positive;0;0;0;0;0;0 -11791;rétrospection;positive;0;0;0;0;0;0 -11792;rétrospectif|rétrospective;positive;0;0;0;0;0;0 -11793;rétrospectivement;positive;0;0;0;0;0;0 -11794;retrouvaille;positive;0;0;0;0;0;0 -11795;retrouver;positive;0;0;0;0;0;0 -11796;reunion;positive;0;0;0;0;0;0 -11797;réunir;positive;0;0;0;0;0;0 -11798;réussiée;positive;0;0;0;0;0;0 -11799;réussite;positive;0;0;0;0;0;0 -11800;revalorisation;positive;0;0;0;0;0;0 -11801;revanche;negative;0;0;0;1;0;0 -11802;rêver;positive;1;0;0;0;0;0 -11803;rêve;positive;1;0;0;0;0;0 -11804;revêche;negative;0;0;0;1;0;1 -11805;réveiller;positive;0;0;0;0;0;0 -11806;réveillon;positive;0;0;0;0;0;0 -11807;révéler;positive;0;0;0;0;0;0 -11808;revendre;negative;0;0;0;0;0;0 -11809;revenir à;positive;0;0;0;0;0;0 -11810;revenir sur son pas;negative;0;1;1;0;0;0 -11811;revenir;positive;0;0;1;0;0;0 -11812;revenu;positive;0;0;1;0;0;0 -11813;réverbération;negative;0;1;0;0;1;0 -11814;révérence;positive;0;0;0;0;0;0 -11815;révérend;positive;0;0;0;0;0;0 -11816;révérer;positive;0;0;0;0;0;0 -11817;rêverie;positive;0;0;0;0;0;0 -11818;réversion;negative;0;0;0;0;0;0 -11819;revêtir;positive;0;0;0;0;0;0 -11820;revigorer;positive;0;0;0;0;0;0 -11821;revigorant;positive;0;0;0;0;0;0 -11822;réviser;positive;0;0;0;0;0;0 -11823;révision;positive;0;0;0;0;0;0 -11824;revisiter;positive;0;0;0;0;0;0 -11825;révolter;negative;0;1;0;1;0;1 -11826;révoltant;negative;0;1;0;1;0;1 -11827;révolte;negative;0;0;0;1;1;0 -11828;révolu;negative;0;0;1;0;0;0 -11829;révolutionnaire;negative;0;1;0;1;0;0 -11830;révolutionner;positive;0;0;0;0;1;0 -11831;révolvantes;negative;0;1;0;1;0;1 -11832;revolver;negative;0;1;1;1;0;0 -11833;révoquer;negative;0;1;1;1;0;1 -11834;rhabiller;positive;0;0;0;0;0;0 -11835;rhétorique;positive;0;0;0;0;0;0 -11836;rhum;positive;0;0;0;0;0;0 -11837;rhumatisme;negative;0;1;1;1;0;0 -11838;rhume;negative;0;0;1;0;0;0 -11839;ricanement;negative;0;0;0;1;0;1 -11840;ricaner;negative;0;0;0;1;0;1 -11841;riche;positive;0;0;1;0;0;1 -11842;richesse;positive;0;0;0;0;0;0 -11843;ride;negative;0;1;1;0;0;1 -11844;rider;negative;0;0;1;0;0;0 -11845;rideau;positive;0;0;0;0;0;0 -11846;ridicule;negative;0;0;1;1;1;1 -11847;ridiculiser;negative;0;0;1;1;0;1 -11848;rien de temps;negative;0;0;0;0;1;0 -11849;rigide;negative;0;0;0;1;0;0 -11850;rigidifier;negative;0;1;0;1;0;0 -11851;rigidité;negative;0;1;1;1;0;0 -11852;rigolade;positive;1;0;0;0;0;0 -11853;rigoler;positive;0;0;0;0;1;0 -11854;rigole;positive;0;0;0;0;0;0 -11855;rigueur;negative;0;1;0;1;0;1 -11856;rimer;positive;0;0;0;0;0;0 -11857;rime;positive;0;0;0;0;0;0 -11858;rinçage;positive;0;0;0;0;0;0 -11859;rincer;positive;0;0;0;0;0;0 -11860;riposte;negative;0;0;0;1;0;0 -11861;riposter;negative;0;0;0;1;0;0 -11862;rire;positive;0;0;0;0;1;0 -11863;rire bête;positive;1;0;0;0;0;0 -11864;rire bêtement;positive;1;0;0;0;0;0 -11865;risible;negative;0;0;0;0;0;1 -11866;risque;negative;0;1;0;0;0;0 -11867;risquer;negative;0;1;0;0;0;0 -11868;rite;positive;0;0;0;0;0;0 -11869;ritualiste;positive;0;0;0;0;0;0 -11870;rivage;positive;0;0;0;0;0;0 -11871;rivaliser;negative;0;1;0;1;0;0 -11872;rivalité;negative;0;0;0;1;0;0 -11873;rive;positive;0;0;0;0;0;0 -11874;riverain;positive;0;0;0;0;0;0 -11875;rivet;positive;0;0;0;0;0;0 -11876;riveter;positive;0;0;0;0;0;0 -11877;rivière;positive;0;0;0;0;0;0 -11878;rixe;negative;0;1;0;1;0;1 -11879;riz;positive;0;0;0;0;0;0 -11880;rizière;positive;0;0;0;0;0;0 -11881;roadster;positive;0;0;0;0;0;0 -11882;robe;positive;0;0;0;0;0;0 -11883;robinet;positive;0;0;0;0;0;0 -11884;robot;positive;0;0;0;0;0;0 -11885;robotique;positive;0;0;0;0;0;0 -11886;rocailleux;negative;0;1;0;0;0;0 -11887;roche;positive;0;0;0;0;0;0 -11888;rocher;positive;0;0;0;0;0;0 -11889;rock;positive;0;0;0;0;0;0 -11890;rôder;negative;0;1;0;0;1;0 -11891;rogner;positive;0;0;0;0;0;0 -11892;roi;positive;0;0;0;0;0;0 -11893;rôle;positive;0;0;0;0;0;0 -11894;romantique;positive;0;0;0;0;0;0 -11895;romantisme;positive;0;0;0;0;0;0 -11896;romarin;positive;0;0;0;0;0;0 -11897;rond;positive;0;0;0;0;0;0 -11898;rond point;positive;0;0;0;0;0;0 -11899;ronde;positive;0;0;0;0;0;0 -11900;rondin;positive;0;0;0;0;0;0 -11901;ronflement;negative;0;0;0;1;0;1 -11902;ronfler;negative;0;0;0;1;0;1 -11903;ronronnement;positive;0;0;0;0;0;0 -11904;ronronner;positive;0;0;0;0;0;0 -11905;roquette;negative;0;1;0;1;0;0 -11906;rosaire;positive;0;0;0;0;0;0 -11907;rose;positive;0;0;0;0;0;0 -11908;roser;positive;0;0;0;0;0;0 -11909;roseau;positive;0;0;0;0;0;0 -11910;rosette;positive;0;0;0;0;0;0 -11911;rosier;positive;0;0;0;0;0;0 -11912;rossignol;positive;1;0;0;0;0;0 -11913;rotatif;positive;0;0;0;0;0;0 -11914;rôtir;negative;0;0;0;0;0;0 -11915;rotin;positive;0;0;0;0;0;0 -11916;rôtisserie;positive;0;0;0;0;0;0 -11917;rotor;positive;0;0;0;0;0;0 -11918;rotule;positive;0;0;0;0;0;0 -11919;rouage;positive;0;0;0;0;0;0 -11920;roucoulement;positive;1;0;0;0;0;0 -11921;roucouler;positive;1;0;0;0;0;0 -11922;roue;positive;0;0;0;0;0;0 -11923;rouge à lèvre;positive;0;0;0;0;0;0 -11924;rougeâtre;negative;0;0;0;0;0;1 -11925;rougeaud;negative;0;0;0;0;0;1 -11926;rougeole;negative;0;1;1;0;0;1 -11927;rouge;negative;0;0;0;0;0;0 -11928;rougeur;negative;0;0;0;0;0;1 -11929;rougir;negative;0;0;0;0;1;0 -11930;rougissant;negative;0;0;0;0;1;0 -11931;rouille;negative;0;1;1;0;0;1 -11932;rouiller;negative;0;0;1;0;0;1 -11933;rouler;negative;0;0;0;0;0;0 -11934;rouleau;positive;0;0;0;0;0;0 -11935;rouleau compresseur;negative;0;1;0;0;0;0 -11936;roulement;positive;0;0;0;0;0;0 -11937;rouquin;negative;0;0;0;0;0;0 -11938;rousse;negative;0;0;0;0;0;0 -11939;route;positive;0;0;0;0;0;0 -11940;route à péage;positive;0;0;0;0;0;0 -11941;routine;positive;0;0;0;0;0;0 -11942;roux;negative;0;0;0;0;0;0 -11943;royal;positive;0;0;0;0;0;0 -11944;royaume;positive;0;0;0;0;0;0 -11945;royauté;positive;0;0;0;0;0;0 -11946;ruban;positive;0;0;0;1;0;0 -11947;ruban adhésif;positive;0;0;0;0;0;0 -11948;rubis;positive;0;0;0;0;0;0 -11949;rubrique;positive;0;0;0;0;0;0 -11950;ruche;negative;0;1;0;1;0;0 -11951;rude;negative;0;1;1;0;0;0 -11952;rudimentaire;negative;0;1;1;0;0;0 -11953;rudiment;positive;0;0;0;0;0;0 -11954;rue;positive;0;0;0;0;0;0 -11955;rue principal;positive;0;0;0;0;0;0 -11956;ruer;negative;0;1;0;1;1;0 -11957;ruelle;positive;0;0;0;0;0;0 -11958;rugir;negative;0;1;0;1;1;0 -11959;rugissement;negative;0;1;0;1;1;0 -11960;rugosité;negative;0;0;1;1;0;1 -11961;rugueux;negative;0;1;0;0;0;0 -11962;ruineux;negative;0;1;1;1;0;1 -11963;ruisseler;negative;0;0;0;0;0;0 -11964;ruisselant;negative;0;0;0;0;0;0 -11965;ruissellement;negative;0;0;0;0;0;0 -11966;rumeur;negative;0;1;1;1;0;1 -11967;rune;negative;0;0;0;0;0;0 -11968;rupture;negative;0;1;1;0;1;0 -11969;rural;negative;0;0;0;0;0;0 -11970;rush;negative;0;1;0;1;1;0 -11971;rustique;negative;0;0;0;0;0;0 -11972;rythme;positive;0;0;0;0;0;0 -11973;rythmer;positive;0;0;0;0;1;0 -11974;rythmique;positive;0;0;0;0;1;0 -11975;s abstenir;negative;0;1;1;0;0;0 -11976;s accroupir;negative;0;1;0;0;0;0 -11977;s adapter;positive;0;0;0;0;0;0 -11978;s agenouiller;negative;0;0;1;0;0;0 -11979;s armer;positive;0;0;0;0;0;0 -11980;s arrêter;negative;0;1;0;0;1;0 -11981;s attarder;negative;0;0;0;0;0;0 -11982;s attendre à;positive;0;0;0;0;1;0 -11983;s atténuer;negative;0;0;0;0;0;0 -11984;s attrouper;negative;0;1;0;0;0;0 -11985;s avérer;positive;0;0;0;0;0;0 -11986;s éclairer;positive;0;0;0;0;1;0 -11987;s écouler;positive;0;0;0;0;0;0 -11988;s efforcer;positive;0;0;0;0;0;0 -11989;s élever;positive;0;0;0;0;0;0 -11990;s émerveiller;positive;0;0;0;0;1;0 -11991;s emmêler;negative;0;1;0;1;0;0 -11992;s emporter;negative;0;1;0;1;0;0 -11993;s enchevêtrer;negative;0;1;0;1;0;0 -11994;s endurcir;negative;0;0;1;1;0;0 -11995;s enrager;negative;0;1;0;1;0;0 -11996;s ensuivre;positive;0;0;0;0;0;0 -11997;s entraînant;positive;0;0;0;0;0;0 -11998;s envaser;negative;0;1;0;0;0;1 -11999;s épanouir;positive;1;0;0;0;0;0 -12000;s éparpiller;negative;0;1;1;0;0;0 -12001;s estomper;negative;0;0;1;0;0;0 -12002;s étendre;positive;0;0;0;0;0;0 -12003;s évertuer;positive;0;0;0;0;0;0 -12004;s exécutant;positive;0;0;0;0;0;0 -12005;s expatrier;negative;0;1;1;0;0;0 -12006;s identifier;positive;0;0;0;0;0;0 -12007;s inclinant;negative;0;1;0;0;0;0 -12008;s incliner;positive;0;1;0;0;0;0 -12009;s inquiéter;negative;0;1;0;0;0;0 -12010;s inscrire;positive;0;0;0;0;0;0 -12011;s occupant de;positive;0;0;0;0;0;0 -12012;s opposer à;negative;0;0;0;1;0;0 -12013;sable;negative;0;0;0;0;0;0 -12014;sableux;negative;0;0;0;0;0;1 -12015;sableur|sableuse;negative;0;0;0;0;0;1 -12016;sablier;positive;0;0;0;0;0;0 -12017;sablonneux;negative;0;0;0;0;0;1 -12018;sabot;negative;0;0;0;0;0;0 -12019;sabotage;negative;0;1;1;1;1;1 -12020;saboter;negative;0;1;1;1;1;1 -12021;sabre;negative;0;1;0;1;0;0 -12022;sabrer;negative;0;1;0;1;0;0 -12023;sac;positive;0;0;0;1;0;0 -12024;sac à dos;positive;0;0;0;0;0;0 -12025;sac à main;positive;0;0;0;0;0;0 -12026;saccader;negative;0;0;0;0;0;0 -12027;saccage;negative;0;1;0;1;1;0 -12028;saccager;negative;0;1;1;1;1;1 -12029;sacerdotal;positive;0;0;0;0;0;0 -12030;savoir;positive;0;0;0;0;0;0 -12031;sacoche;positive;0;0;0;0;0;0 -12032;sacré;positive;0;0;0;0;0;0 -12033;sacrer;positive;0;0;0;0;0;0 -12034;sacrement;positive;0;0;0;0;0;0 -12035;sacrifice;negative;0;1;1;0;0;1 -12036;safran;positive;0;0;0;0;0;0 -12037;saga;positive;0;0;0;0;0;0 -12038;sage;positive;0;0;0;0;0;0 -12039;sage femme;positive;0;0;0;0;0;0 -12040;sagesse;positive;0;0;0;0;0;0 -12041;saignant;negative;0;1;1;0;0;1 -12042;saignement;negative;0;1;1;0;0;1 -12043;sailler|saillir;negative;0;1;0;0;1;0 -12044;saillant;positive;0;1;0;0;1;0 -12045;saillie;negative;0;1;0;0;0;1 -12046;sain;positive;0;0;0;0;0;0 -12047;saindoux;negative;0;0;0;0;0;1 -12048;sainteté;positive;0;1;0;0;1;0 -12049;saisissant;negative;0;1;0;0;1;0 -12050;saison;positive;0;0;0;0;0;0 -12051;salade;negative;0;0;0;0;0;0 -12052;salaire;positive;0;0;0;0;0;0 -12053;salamandre;negative;0;1;0;0;0;1 -12054;sale;negative;0;0;0;0;0;1 -12055;saler;negative;0;0;0;0;0;1 -12056;sale gosse;negative;0;0;0;1;0;1 -12057;saleté;negative;0;0;0;0;0;1 -12058;salin;negative;0;0;0;0;0;0 -12059;salin|saline;negative;0;0;0;0;0;0 -12060;salir;negative;0;0;0;0;0;1 -12061;salissant;negative;0;1;1;1;0;1 -12062;salive;positive;0;0;0;0;0;1 -12063;saliver;positive;0;0;0;0;0;1 -12064;salle;positive;0;0;0;0;0;0 -12065;salle de bain;positive;0;0;0;0;0;0 -12066;salle de bal;positive;0;0;0;0;0;0 -12067;salon;positive;1;0;0;0;0;0 -12068;salope;negative;0;0;0;1;0;1 -12069;salopette;positive;0;0;0;0;0;0 -12070;salubre;positive;0;0;0;0;0;0 -12071;saluer;positive;1;0;0;0;0;0 -12072;salut;negative;0;0;1;0;1;0 -12073;salutaire;positive;0;0;0;0;0;0 -12074;salutation;positive;0;0;0;0;1;0 -12075;salve;negative;0;1;0;0;0;0 -12076;samba;positive;1;0;0;0;0;0 -12077;samissants;negative;0;1;1;1;0;1 -12078;samouraï;positive;0;1;0;0;0;0 -12079;sanctification;positive;0;0;0;0;0;0 -12080;sanctifier;positive;0;0;0;0;0;0 -12081;sanction;negative;0;1;1;1;0;1 -12082;sanctionner;negative;0;1;1;0;0;0 -12083;sanctuaire;positive;0;0;0;0;0;0 -12084;sandale;positive;0;0;0;0;0;0 -12085;sang;negative;0;1;1;1;0;1 -12086;sang froid;positive;0;0;0;0;0;0 -12087;sangler;negative;0;1;1;1;0;1 -12088;sanglant;negative;0;1;1;1;0;1 -12089;sangle;negative;0;1;0;0;0;0 -12090;sanglier;negative;0;1;0;0;0;1 -12091;sanglot;negative;0;0;1;0;0;0 -12092;sangloter;negative;0;0;1;0;0;0 -12093;sangsue;negative;0;0;0;0;0;1 -12094;sanguinaire;negative;0;1;0;1;0;1 -12095;sanguin;positive;0;0;0;0;0;0 -12096;sanitaire;positive;0;0;0;0;0;0 -12097;sans abri;negative;0;1;1;1;0;1 -12098;sans accompagnement;negative;0;0;1;0;0;0 -12099;sans aide;negative;0;0;1;0;0;0 -12100;sans ambiguïté;positive;0;0;0;0;0;0 -12101;sans âme;negative;0;1;1;0;0;1 -12102;sans arme;negative;0;0;0;0;0;0 -12103;sans attache;negative;0;0;1;0;0;0 -12104;sans aucun doute;positive;0;0;0;0;0;0 -12105;sans borne;positive;0;0;0;0;0;0 -12106;sans bruit;positive;1;0;0;0;0;0 -12107;sans but;negative;0;0;1;0;0;0 -12108;sans c?ur;negative;0;0;1;1;0;1 -12109;sans conséquence;negative;0;0;1;0;0;0 -12110;sans contrainte;positive;0;0;0;0;0;0 -12111;sans couleur;negative;0;0;1;0;0;0 -12112;sans couture;positive;0;0;0;0;0;0 -12113;sans défense;negative;0;1;1;0;0;0 -12114;sans délai;positive;0;0;0;0;1;0 -12115;sans dent;negative;0;0;1;0;0;1 -12116;sans domicile fixe;negative;0;1;1;1;0;1 -12117;sans doute;positive;0;0;0;0;0;0 -12118;sans éclat;negative;0;0;1;0;0;0 -12119;sans emploi;negative;0;1;1;0;0;0 -12120;sans énergie;negative;0;0;1;0;0;0 -12121;sans équivoque;positive;0;0;0;0;0;0 -12122;sans espoir;negative;0;1;1;0;0;0 -12123;sans être voir;negative;0;0;1;0;0;0 -12124;sans faille;positive;0;0;0;0;0;0 -12125;sans faire exprès;negative;0;1;1;0;1;0 -12126;sans faute;positive;0;0;0;0;0;0 -12127;sans fil;positive;0;0;0;1;1;0 -12128;sans fond;negative;0;1;0;0;0;0 -12129;sans formation;negative;0;0;1;0;0;0 -12130;sans heurt;positive;1;0;0;0;0;0 -12131;sans importance;negative;0;0;1;0;0;0 -12132;sans instruction;negative;0;0;1;0;0;1 -12133;sans interruption;positive;1;0;0;0;0;0 -12134;sans le faire exprès;negative;0;1;1;0;0;0 -12135;sans le savoir;negative;0;1;1;0;0;0 -12136;sans le sou;negative;0;0;1;0;0;0 -12137;sans le vouloir;negative;0;1;1;0;1;0 -12138;sans lien;negative;0;0;1;0;0;0 -12139;sans limite;positive;0;0;0;0;0;0 -12140;sans manche;positive;0;0;0;0;0;0 -12141;sans nom;negative;0;1;1;0;0;1 -12142;sans obstacle;positive;0;0;0;0;0;0 -12143;sans permis;negative;0;0;0;0;0;0 -12144;sans peur;positive;0;1;0;0;0;0 -12145;sans précédent;positive;0;0;0;0;1;0 -12146;sans prétention;positive;0;0;0;0;0;0 -12147;sans rapport;negative;0;1;1;0;0;0 -12148;sans relâche;positive;0;0;0;0;0;0 -12149;sans résistance;positive;0;0;0;0;0;0 -12150;sans restriction;positive;1;0;0;0;0;0 -12151;sans retenue;positive;1;0;0;0;0;0 -12152;sans scrupule;negative;0;0;0;1;0;1 -12153;sans soleil;negative;0;0;1;0;0;0 -12154;sans sucre;positive;0;0;0;0;0;0 -12155;sans surveillance;negative;0;1;1;0;0;0 -12156;sans tache;positive;0;0;0;0;0;0 -12157;sans tenir compte de;negative;0;0;0;0;0;0 -12158;sans titre;negative;0;0;1;0;0;0 -12159;sans vie;negative;0;1;1;0;0;0 -12160;sans voix;negative;0;1;1;0;1;0 -12161;santé;positive;1;0;0;0;0;0 -12162;santé mental;positive;0;0;0;0;0;0 -12163;saoul;negative;0;0;0;0;0;1 -12164;sapeur pompier;positive;0;0;0;0;0;0 -12165;saphir;positive;0;0;0;0;0;0 -12166;sarcasme;negative;0;0;1;1;0;1 -12167;sarcastique;negative;0;0;0;1;0;1 -12168;sarcome;negative;0;1;1;0;0;0 -12169;sardonique;negative;0;0;0;1;0;1 -12170;satanique;negative;0;1;0;1;0;0 -12171;satellite;positive;0;0;0;0;0;0 -12172;satin;positive;0;0;0;0;0;0 -12173;satiner;positive;0;0;0;0;0;0 -12174;satire;negative;0;0;0;1;0;1 -12175;satirique;negative;0;0;0;1;0;1 -12176;satisfaction;positive;1;0;0;0;0;0 -12177;saturation;negative;0;0;0;0;0;0 -12178;saturer;negative;0;0;1;1;0;1 -12179;sauce;positive;0;0;0;0;0;0 -12180;sauge;positive;0;0;0;0;0;0 -12181;saule;positive;0;0;0;0;0;0 -12182;saumâtre;negative;0;0;0;0;0;1 -12183;saumure;negative;0;0;0;0;0;1 -12184;sauna;positive;0;0;0;0;0;0 -12185;saupoudrage;positive;0;0;0;0;0;0 -12186;saupoudrer;positive;0;0;0;0;0;0 -12187;saut;positive;1;0;0;0;0;0 -12188;sauter;negative;0;1;0;0;0;1 -12189;sauter en parachute;negative;0;1;0;0;0;0 -12190;sauterelle;positive;0;1;0;0;0;1 -12191;sautiller;positive;1;0;0;0;0;0 -12192;sauvagerie;negative;0;1;0;1;0;0 -12193;sauvegarde;positive;0;0;0;0;0;0 -12194;sauvegarder;positive;0;0;0;0;0;0 -12195;sauver;positive;0;0;0;0;0;0 -12196;sauvetage;positive;0;0;0;0;1;0 -12197;savane;positive;0;0;0;0;0;0 -12198;saveur;positive;0;0;1;0;0;1 -12199;savon;positive;0;0;0;0;0;0 -12200;savonner;positive;0;0;0;0;0;0 -12201;savonneux;negative;0;1;0;0;0;0 -12202;savourer;positive;0;0;1;0;0;1 -12203;saxo;positive;0;0;0;0;0;0 -12204;saxophone;positive;0;0;0;0;0;0 -12205;scalpel;negative;0;1;0;0;0;0 -12206;scalper;negative;0;1;0;0;0;1 -12207;scandale;negative;0;1;0;1;1;0 -12208;scander;positive;0;0;0;1;1;0 -12209;scanner;positive;0;0;0;0;0;0 -12210;scape;negative;0;0;0;0;0;0 -12211;scarabée;positive;0;1;0;0;0;1 -12212;sceau;positive;0;0;0;0;0;0 -12213;sceller;positive;0;0;0;0;0;0 -12214;scène;positive;0;0;0;0;0;0 -12215;scénique;positive;0;0;0;0;0;0 -12216;scepticisme;negative;0;1;0;0;1;0 -12217;schéma;positive;0;0;0;0;0;0 -12218;schématique;positive;0;0;0;0;0;0 -12219;schisme;negative;0;0;0;1;0;0 -12220;schizophrénie;negative;0;1;1;1;0;1 -12221;sciatique;negative;0;1;1;0;0;0 -12222;sciemment;positive;0;0;0;0;0;0 -12223;science;positive;0;0;0;0;0;0 -12224;science économique;positive;0;0;0;0;0;0 -12225;science humain;positive;0;0;0;0;0;0 -12226;scientifique;positive;0;0;0;0;0;0 -12227;scinder;negative;0;0;0;1;0;0 -12228;scintillant;positive;1;0;0;0;0;0 -12229;scintillateur;positive;0;0;0;0;0;0 -12230;scintillation;positive;0;0;0;0;1;0 -12231;scintillement;positive;0;0;0;0;1;0 -12232;scintiller;positive;0;0;0;0;1;1 -12233;scission;negative;0;0;1;1;0;0 -12234;sciure;negative;0;0;0;0;0;1 -12235;scolaire;positive;0;0;0;0;0;0 -12236;scolarité;positive;0;0;0;0;0;0 -12237;sconse;negative;0;0;0;0;0;1 -12238;scoop;positive;0;0;0;0;1;0 -12239;score;positive;0;0;0;0;1;0 -12240;scorie;negative;0;0;0;0;0;1 -12241;scorpion;negative;0;1;0;1;1;1 -12242;scotch;positive;0;0;0;0;0;0 -12243;scout;positive;0;0;0;0;0;0 -12244;scribe;positive;0;0;0;0;0;0 -12245;script;positive;0;0;0;0;0;0 -12246;scriptural;positive;0;0;0;0;0;0 -12247;scruter;negative;0;0;0;0;0;0 -12248;scrutin;positive;0;0;0;0;0;0 -12249;sculpter;positive;0;0;0;0;0;0 -12250;sculpteur;positive;0;0;0;0;0;0 -12251;sculpture;positive;0;0;0;0;0;0 -12252;se bagarrer;negative;0;1;0;1;0;1 -12253;se baigner;positive;0;0;0;0;0;0 -12254;se balader;positive;1;0;0;0;0;0 -12255;se balancer;positive;0;0;0;0;0;0 -12256;se baser;positive;0;0;0;0;0;0 -12257;se battre;negative;0;1;0;1;0;0 -12258;se battre pour qch;negative;0;1;0;1;0;0 -12259;se battre en duel;negative;0;1;0;1;0;0 -12260;se blottir;positive;0;0;0;0;0;0 -12261;se boursoufler;negative;0;0;0;0;0;1 -12262;se braquer;negative;0;1;0;0;1;0 -12263;se briser;negative;0;0;0;0;1;0 -12264;se camoufler;negative;0;0;0;0;1;0 -12265;se casser;negative;0;0;0;0;1;0 -12266;se casser net;negative;0;1;0;1;1;0 -12267;se charger de;positive;0;0;0;0;0;0 -12268;se chevaucher;negative;0;0;0;0;0;0 -12269;se composer de;positive;0;0;0;0;0;0 -12270;se concentrer;positive;0;0;0;0;0;0 -12271;se concrétiser;positive;0;0;0;0;0;0 -12272;se conformer;positive;0;0;0;0;0;0 -12273;se conjuguer;positive;0;0;0;0;0;0 -12274;se connaître;positive;0;0;0;0;0;0 -12275;se connecter;positive;0;0;0;0;0;0 -12276;se contracter;negative;0;1;0;1;0;0 -12277;se contredire;negative;0;0;0;1;0;0 -12278;se coucher;positive;0;0;0;0;0;0 -12279;se couper;negative;0;1;1;0;0;0 -12280;se courber;negative;0;1;0;0;0;0 -12281;se couvrir;positive;0;0;0;0;0;0 -12282;se crisper;negative;0;1;0;1;0;0 -12283;se débarrasser;negative;0;0;1;1;0;0 -12284;se débarrasser de;negative;0;0;1;1;0;1 -12285;se débattre;negative;0;1;1;1;0;0 -12286;se débrouiller;negative;0;1;1;1;0;0 -12287;se décomposer;negative;0;1;1;0;0;1 -12288;se décourager;negative;0;1;1;1;0;0 -12289;se déformer;negative;0;0;1;1;0;0 -12290;se dégonfler;negative;0;1;1;1;0;0 -12291;se dégrader;negative;0;0;1;0;0;1 -12292;se déguiser;negative;0;0;0;0;0;0 -12293;se délecter;positive;1;0;0;0;0;0 -12294;se délester;positive;0;0;0;0;0;0 -12295;se dépêcher;negative;0;1;0;1;1;0 -12296;se déployer;positive;0;0;0;0;0;0 -12297;se dépouiller de;negative;0;0;0;0;0;1 -12298;se déprécier;negative;0;0;1;1;0;1 -12299;se dérouler;positive;0;0;0;0;0;0 -12300;se déshabiller;positive;0;0;0;0;0;0 -12301;se désintégrer;negative;0;1;1;1;0;1 -12302;se désister;negative;0;1;1;0;0;0 -12303;se détendre;positive;0;0;0;0;0;0 -12304;se détériorer;negative;0;1;1;1;0;1 -12305;se développer;positive;0;0;0;0;0;0 -12306;se dilater;negative;0;1;0;0;0;0 -12307;se disperser;negative;0;1;1;0;0;0 -12308;se disputer;negative;0;0;0;1;0;0 -12309;se dissiper;negative;0;0;0;0;0;0 -12310;se dissoudre;negative;0;0;0;0;0;0 -12311;se diversifier;positive;0;0;0;0;0;0 -12312;se doucher;positive;0;0;0;0;0;0 -12313;se durcir;negative;0;0;1;1;0;0 -12314;se faire passer pour;negative;0;0;0;1;0;0 -12315;se faire plaisir;positive;1;0;0;0;0;0 -12316;se familiariser;positive;0;0;0;0;0;0 -12317;se fatiguer;negative;0;0;1;0;0;0 -12318;se faufiler;negative;0;1;0;1;1;0 -12319;se fissurer;negative;0;1;0;0;1;0 -12320;se fouler;negative;0;1;1;0;1;0 -12321;se frotter;negative;0;0;0;0;0;0 -12322;se glisser;negative;0;0;0;0;0;1 -12323;se glisser furtivement;negative;0;1;0;1;1;0 -12324;se gonfler;negative;0;0;0;0;0;1 -12325;se hérisser;negative;0;1;0;0;1;0 -12326;se jeter sur;negative;0;1;0;1;1;0 -12327;se joindre à;positive;0;0;0;0;0;0 -12328;se lamenter;negative;0;1;1;0;0;1 -12329;se lasser;negative;0;0;1;0;0;0 -12330;se loger;positive;0;0;0;0;0;0 -12331;se marier;positive;0;1;0;0;1;0 -12332;se masturber;positive;1;0;0;0;0;0 -12333;se matérialiser;positive;0;0;0;0;0;0 -12334;se méfier de;negative;0;1;0;1;0;1 -12335;se mélanger;positive;0;0;0;0;0;0 -12336;se mêler;negative;0;0;0;1;0;0 -12337;se méprendre;negative;0;1;1;1;0;0 -12338;se mettre à califourchon sur;positive;0;0;0;0;0;0 -12339;se mettre à genou;negative;0;0;1;0;0;0 -12340;se mettre en grève;negative;0;0;0;1;0;0 -12341;se mirer;positive;0;0;0;0;0;0 -12342;se moquer;negative;0;0;0;1;0;1 -12343;se moquer de;negative;0;1;1;1;0;0 -12344;se multiplier;positive;0;0;0;0;0;0 -12345;se noyer;negative;0;1;1;0;0;0 -12346;se pâmer;positive;1;0;0;0;0;0 -12347;se parjurer;negative;0;0;1;1;1;1 -12348;se pavaner;negative;0;0;0;0;0;0 -12349;se pencher;negative;0;1;0;0;0;0 -12350;se percher;positive;0;0;0;0;0;0 -12351;se périmer;negative;0;0;1;0;0;1 -12352;se permettre;positive;0;0;0;0;0;0 -12353;se plaindre;negative;0;0;1;1;0;0 -12354;se plier;negative;0;0;0;0;0;0 -12355;se plonger;positive;0;0;0;0;0;0 -12356;se porter garant;positive;0;0;0;0;0;0 -12357;se positionner;positive;0;0;0;0;0;0 -12358;se précipiter;negative;0;1;1;1;1;0 -12359;se prélasser;positive;1;0;0;0;0;0 -12360;se préparer;positive;0;0;0;0;0;0 -12361;se presser;negative;0;1;0;1;1;0 -12362;se procurer;positive;0;0;0;0;0;0 -12363;se produire;positive;0;0;0;0;0;0 -12364;se profiler;negative;0;1;0;0;0;0 -12365;se promener;positive;1;0;0;0;0;0 -12366;se propager;negative;0;1;0;0;0;0 -12367;se proposer;positive;0;1;0;0;0;0 -12368;se prostituer;negative;0;0;1;0;0;1 -12369;se qualifier;positive;1;0;0;0;0;0 -12370;se quereller;negative;0;0;0;1;0;0 -12371;se raidir;negative;0;1;0;1;0;0 -12372;se rappeler;positive;0;0;0;0;0;0 -12373;se rapprocher;positive;0;0;0;0;0;0 -12374;se raser;positive;0;0;0;0;0;0 -12375;se rassembler;positive;0;0;0;0;0;0 -12376;se rebeller;negative;0;1;0;1;0;0 -12377;se redresser;positive;0;0;0;0;0;0 -12378;se régaler;positive;1;0;0;0;0;0 -12379;se régénérer;positive;0;0;0;0;0;0 -12380;se rejoindre;positive;0;0;0;0;0;0 -12381;se réjouir;positive;0;0;0;0;1;0 -12382;se rendre;negative;0;1;1;0;0;0 -12383;se renseigner;positive;0;0;0;0;0;0 -12384;se répandre;negative;0;0;0;0;0;0 -12385;se repentir;positive;0;1;0;0;0;0 -12386;se reposer;positive;1;0;0;0;0;0 -12387;se représenter;positive;0;0;0;0;0;0 -12388;se reproduire;negative;0;0;0;0;0;0 -12389;se retirer;negative;0;1;1;0;0;0 -12390;se retourner contre qqn;negative;0;0;1;1;0;0 -12391;se rétracter;negative;0;1;0;1;0;0 -12392;se rétrécir;negative;0;1;1;0;0;0 -12393;se réveiller;positive;0;0;0;0;0;0 -12394;se révolter;negative;0;0;0;1;1;0 -12395;se séparer;negative;0;0;1;0;0;0 -12396;se solidifier;positive;0;0;0;0;0;0 -12397;se souvenir;positive;0;0;0;0;0;0 -12398;se spécialiser;positive;0;0;0;0;0;0 -12399;se suicider;negative;0;1;1;1;0;0 -12400;se taire;negative;0;0;0;0;0;0 -12401;se tapir;negative;0;1;1;0;0;0 -12402;se tenir debout;positive;0;0;0;0;0;0 -12403;se terminer;negative;0;1;1;0;0;0 -12404;se tortiller;negative;0;0;0;0;0;1 -12405;se tracasser;negative;0;1;0;0;0;0 -12406;se tromper;negative;0;1;1;0;0;0 -12407;se vanter;negative;0;0;0;0;0;0 -12408;se vautrer;negative;0;1;1;0;1;1 -12409;se venger;negative;0;1;0;1;1;0 -12410;séance;positive;0;0;0;0;0;0 -12411;seau;positive;0;0;0;0;0;0 -12412;sec;negative;0;1;0;1;1;0 -12413;sécable;negative;0;0;0;0;0;0 -12414;sécateur;negative;0;0;0;0;0;0 -12415;sécession;negative;0;1;0;0;0;0 -12416;sécher;negative;0;0;0;0;0;0 -12417;sèche cheveu;positive;0;0;0;0;0;0 -12418;sèche linge;positive;0;0;0;0;0;0 -12419;sécheresse;negative;0;1;1;0;0;0 -12420;secondaire;negative;0;0;1;0;0;0 -12421;second;positive;0;0;0;0;1;0 -12422;seconder;positive;0;0;0;0;0;0 -12423;secouer;negative;0;1;0;0;0;0 -12424;secourir;positive;0;0;0;0;1;0 -12425;secours;positive;0;0;0;0;1;0 -12426;secousse;negative;0;1;0;1;1;0 -12427;secret;negative;0;1;0;0;1;0 -12428;secrétaire;positive;0;0;0;0;0;0 -12429;secrétaire général;positive;0;0;0;0;0;0 -12430;secrétariat;positive;0;0;0;0;0;0 -12431;secrètement;negative;0;1;0;0;0;0 -12432;sécréter;negative;0;0;0;0;0;1 -12433;sécrétion;negative;0;0;0;0;0;1 -12434;sectaire;negative;0;1;1;1;0;1 -12435;sectarisme;negative;0;1;0;1;0;0 -12436;secte;negative;0;1;0;0;0;0 -12437;secteur;positive;0;0;0;0;0;0 -12438;section;positive;0;0;0;0;0;0 -12439;sectionner;negative;0;1;1;1;0;0 -12440;sécurité;positive;0;0;0;0;0;0 -12441;sédentaire;negative;0;0;0;0;0;0 -12442;sédiment;negative;0;0;0;0;0;1 -12443;sédimentaire;negative;0;0;0;0;0;1 -12444;sédition;negative;0;0;1;1;0;0 -12445;séduction;positive;0;0;0;0;0;0 -12446;séduire;positive;0;0;0;0;0;0 -12447;séduisant;positive;0;0;0;0;0;0 -12448;segment;positive;0;0;0;0;0;0 -12449;segmenter;positive;0;0;0;0;0;0 -12450;ségrégation;negative;0;0;1;0;0;0 -12451;seigle;positive;0;0;0;0;0;0 -12452;seigneur;positive;0;0;0;0;0;1 -12453;seigneurie;positive;0;0;0;0;0;0 -12454;sein;positive;0;0;0;0;0;0 -12455;séjour;positive;0;0;0;0;0;0 -12456;séjourner;positive;0;0;0;0;0;0 -12457;sel;negative;0;0;0;0;0;1 -12458;sélection;positive;0;0;0;0;0;0 -12459;selle;positive;0;0;0;0;0;0 -12460;seller;positive;0;0;0;0;0;0 -12461;semaine;positive;0;0;0;0;0;0 -12462;sémaphore;positive;0;0;0;0;0;0 -12463;semblant;positive;0;0;0;0;0;0 -12464;sembler;positive;0;0;0;0;0;0 -12465;semelle;negative;0;0;0;0;0;1 -12466;semence;positive;0;0;0;0;0;0 -12467;séminaire;positive;0;0;0;0;0;0 -12468;séminal;positive;0;0;0;0;0;0 -12469;sémiotique;positive;0;0;0;0;0;0 -12470;semis;positive;0;0;0;0;0;0 -12471;sénat;positive;0;0;0;0;0;0 -12472;sénateur;positive;0;0;0;0;0;0 -12473;sénescence;negative;0;0;1;0;0;0 -12474;sénile;negative;0;1;1;0;0;0 -12475;senior;positive;0;0;0;0;0;0 -12476;sénior;positive;0;0;0;0;0;0 -12477;sen|sens;positive;0;0;0;0;0;0 -12478;sen|sens général;positive;0;0;0;0;0;0 -12479;sensation;positive;0;1;1;1;1;1 -12480;sensibilité;positive;0;0;0;0;0;0 -12481;sensiblement;positive;0;0;0;0;0;0 -12482;sensiblerie;negative;0;0;0;0;1;1 -12483;sensualité;positive;0;0;0;0;0;0 -12484;sentence;negative;0;1;1;1;0;1 -12485;sentir;positive;0;0;0;0;0;0 -12486;sentimentalité;positive;0;0;0;0;0;0 -12487;sentinelle;positive;0;0;0;0;0;0 -12488;sentir mauvais;negative;0;0;0;0;0;1 -12489;sépaés;negative;0;0;1;0;0;0 -12490;séparable;negative;0;0;1;0;0;0 -12491;séparation;negative;0;1;1;0;0;0 -12492;séparatiste;negative;0;0;0;1;0;1 -12493;séparer;negative;0;1;1;1;0;1 -12494;séparément;negative;0;1;1;0;0;0 -12495;sépia;positive;0;0;0;0;0;0 -12496;sepsis;negative;0;1;1;0;0;1 -12497;septembre;positive;0;0;0;0;0;0 -12498;septième;positive;0;0;0;0;0;0 -12499;septique;negative;0;0;0;0;0;1 -12500;septum;positive;0;0;0;0;0;0 -12501;séquence;positive;0;0;0;0;0;0 -12502;séquestration;negative;0;1;1;0;0;0 -12503;séquestrer;negative;0;1;1;0;0;0 -12504;sérénité;positive;0;0;0;0;0;0 -12505;sergé;positive;0;0;0;0;0;0 -12506;sergent;positive;0;0;0;0;0;0 -12507;série;positive;0;0;0;0;0;0 -12508;sérier;positive;0;0;0;0;0;0 -12509;serin;positive;0;0;0;0;0;0 -12510;seringue;negative;0;1;0;0;0;0 -12511;sermon;positive;0;0;0;0;0;0 -12512;serpent;negative;0;1;0;0;0;1 -12513;serpent à sonnette;negative;0;1;0;0;0;1 -12514;serpenter;negative;0;1;0;0;0;1 -12515;serpentin;positive;0;0;0;0;0;0 -12516;serpillère;negative;0;0;0;0;0;1 -12517;serre;negative;0;0;0;0;0;0 -12518;serrement;negative;0;1;0;0;0;0 -12519;serrer;negative;0;1;0;1;0;0 -12520;serre|serres;negative;0;1;0;1;0;0 -12521;serrure;positive;0;0;0;0;0;0 -12522;serrurier;positive;0;0;0;0;0;0 -12523;sérum;positive;0;0;0;0;0;0 -12524;serveur;positive;0;0;0;0;0;0 -12525;serviable;positive;0;0;0;0;0;0 -12526;service;positive;0;0;0;0;0;0 -12527;serviette;positive;0;0;0;0;0;0 -12528;serviette de table;positive;0;0;1;0;0;0 -12529;servile;negative;0;1;1;1;0;1 -12530;servir;negative;0;0;0;0;0;0 -12531;servir à le louche;positive;0;0;0;0;0;0 -12532;serviteur;positive;0;0;0;0;0;0 -12533;servitude;negative;0;1;1;1;0;0 -12534;session;positive;0;0;0;0;0;0 -12535;setter;positive;0;0;0;0;0;0 -12536;seuil;positive;0;0;0;0;0;0 -12537;seul;negative;0;1;1;1;0;1 -12538;sève;positive;0;0;1;0;0;0 -12539;sévèrement;negative;0;1;1;0;0;0 -12540;sévérité;negative;0;1;1;1;0;0 -12541;sexe;positive;0;0;0;0;0;0 -12542;sexualité;positive;0;0;0;0;0;0 -12543;sexy;positive;1;0;0;0;0;0 -12544;shérif;positive;0;0;0;0;0;0 -12545;sherry;positive;0;0;0;0;0;0 -12546;shilling;positive;0;0;0;0;0;0 -12547;shopping;positive;0;0;0;0;1;0 -12548;short;positive;0;0;0;0;0;0 -12549;si que;positive;0;0;0;0;0;0 -12550;sic;positive;0;0;0;0;0;0 -12551;sidérant;negative;0;0;0;0;1;0 -12552;siècle;positive;0;0;0;0;0;0 -12553;siège;positive;0;1;1;1;1;0 -12554;siège social;positive;0;0;0;0;0;0 -12555;siéger;positive;0;0;0;0;0;0 -12556;sieste;positive;1;0;0;0;0;0 -12557;sifflant;negative;0;1;0;1;0;0 -12558;sifflement;negative;0;1;0;1;1;0 -12559;siffler;negative;0;1;0;1;1;0 -12560;sifflet;positive;0;0;0;0;0;0 -12561;sigle;positive;0;0;0;0;0;0 -12562;signal;positive;0;0;0;0;1;0 -12563;signal lumineux;positive;0;0;0;0;1;0 -12564;signaler;positive;0;0;0;0;0;0 -12565;signalement;positive;0;0;0;0;0;0 -12566;signature;positive;0;0;0;0;0;0 -12567;signe avant coureur;negative;0;1;0;1;0;0 -12568;signe de le main;positive;0;0;0;0;0;0 -12569;signer;positive;0;0;0;0;0;0 -12570;significatif;positive;0;0;0;0;0;0 -12571;signification;positive;0;0;0;0;0;0 -12572;signifier;positive;0;0;0;0;0;0 -12573;silence;negative;1;0;0;0;0;0 -12574;silencieusement;positive;1;0;0;0;0;0 -12575;silex;negative;0;1;0;0;0;0 -12576;silhouette;positive;0;0;0;0;0;0 -12577;sillon;negative;0;1;1;0;0;1 -12578;similaire;positive;0;0;0;0;0;0 -12579;similarité;positive;0;0;0;0;0;0 -12580;similitude;positive;0;0;0;0;0;0 -12581;simplement;positive;0;0;0;0;0;0 -12582;simplet;negative;0;0;0;0;0;0 -12583;simplifier;positive;0;0;0;0;1;0 -12584;simpliste;negative;0;0;1;0;0;1 -12585;simulacre;negative;0;1;1;1;0;1 -12586;simuler;negative;0;0;0;0;0;0 -12587;simulation;negative;0;0;0;0;0;0 -12588;simultané;positive;0;0;0;0;0;0 -12589;simultanément;positive;0;0;0;0;0;0 -12590;sincère;positive;0;0;1;0;1;0 -12591;singe;positive;0;0;0;0;0;0 -12592;singer;positive;0;0;0;0;0;0 -12593;singularité;positive;0;0;0;0;0;0 -12594;singulièrement;positive;0;0;0;0;1;0 -12595;sinistre;negative;0;1;1;1;0;1 -12596;sinuer;negative;0;1;0;0;0;1 -12597;sinus;negative;0;0;0;0;0;1 -12598;siphon;negative;0;1;0;0;0;0 -12599;siphonner;negative;0;1;0;0;0;0 -12600;sire;positive;0;0;0;0;0;0 -12601;sirène;positive;0;1;0;0;1;0 -12602;sirop;positive;0;0;0;0;0;0 -12603;siroter;positive;0;0;0;0;0;0 -12604;site;positive;0;0;0;0;0;0 -12605;situation;positive;0;0;0;0;0;0 -12606;situation délicat;negative;0;1;1;0;0;0 -12607;situer;positive;0;0;0;0;0;0 -12608;sixième;positive;0;0;0;0;0;0 -12609;sketch;positive;0;0;0;0;0;0 -12610;ski;positive;0;0;0;0;0;0 -12611;skier;positive;0;0;0;0;0;0 -12612;skiff;positive;0;0;0;0;0;0 -12613;skipper;positive;0;0;0;0;0;0 -12614;slip;positive;0;0;0;0;0;0 -12615;slogan;positive;0;0;0;0;0;0 -12616;sloop;positive;0;0;0;0;0;0 -12617;smash;negative;0;1;0;1;1;0 -12618;snob;negative;0;0;0;0;0;1 -12619;sobriété;positive;0;0;0;0;0;0 -12620;sociable;positive;0;0;0;0;0;0 -12621;social;positive;0;0;0;0;0;0 -12622;socialisme;positive;0;1;0;0;0;1 -12623;socialiste;positive;0;1;1;1;0;1 -12624;société;positive;0;0;0;0;0;0 -12625;socle;positive;0;0;0;0;0;0 -12626;s?ur;positive;0;0;0;0;0;0 -12627;sofa;positive;0;0;1;0;0;0 -12628;soi dire;negative;0;0;0;0;0;0 -12629;soi même;positive;0;0;0;0;0;0 -12630;soie;positive;0;0;0;0;0;0 -12631;soif;negative;0;0;1;0;1;0 -12632;soigner;positive;0;0;0;0;0;0 -12633;soigneux;positive;0;0;0;0;0;0 -12634;soigneusement;positive;0;0;0;0;0;0 -12635;soin;positive;0;0;0;0;0;0 -12636;soir;positive;0;0;0;0;0;0 -12637;soirée;positive;0;0;0;0;0;0 -12638;soixante;positive;0;0;0;0;0;0 -12639;soixante dix;positive;0;0;0;0;0;0 -12640;sol;positive;0;0;0;0;0;1 -12641;solaire;positive;1;0;0;0;0;0 -12642;soldat;positive;0;0;1;1;0;0 -12643;solde;positive;0;0;0;0;0;0 -12644;sole;negative;0;0;0;0;0;1 -12645;soleil;positive;0;0;0;0;1;0 -12646;solidarité;positive;0;0;0;0;0;0 -12647;solidarité féminin;positive;0;0;1;1;1;0 -12648;solide;positive;0;1;1;0;1;0 -12649;solidification;positive;0;0;0;0;0;0 -12650;solidité;positive;0;0;0;0;0;0 -12651;solitaire;negative;0;1;1;1;0;1 -12652;solitude;negative;0;1;1;0;0;0 -12653;sollicitation;positive;0;0;0;0;0;0 -12654;solliciter;positive;0;0;0;0;0;0 -12655;solo;negative;0;0;1;0;0;0 -12656;solubilité;positive;0;0;0;0;0;0 -12657;soluble;positive;0;0;0;0;0;0 -12658;solution;positive;0;0;0;0;0;0 -12659;solutionner;positive;1;0;0;0;0;0 -12660;solvabilité;positive;0;0;0;0;0;0 -12661;solvable;positive;0;0;0;0;0;0 -12662;solvant;positive;0;0;0;0;0;0 -12663;somatique;negative;0;1;0;0;1;0 -12664;sombrer;negative;0;1;1;0;0;1 -12665;sombrement;negative;0;0;1;0;0;0 -12666;sommaire;negative;0;0;1;0;0;0 -12667;sommairement;negative;0;0;1;0;0;0 -12668;somme;negative;0;0;1;0;0;0 -12669;sommeil;positive;0;0;0;0;0;0 -12670;sommeiller;positive;0;0;0;0;0;0 -12671;sommer;negative;0;0;0;0;0;0 -12672;somnolence;negative;0;0;0;0;0;0 -12673;somnolent;negative;0;0;1;0;0;0 -12674;somnoler;negative;0;0;1;0;0;0 -12675;somptueux étalage;positive;1;0;0;0;0;0 -12676;son;positive;0;0;0;0;0;1 -12677;son de blé;positive;0;0;0;0;0;1 -12678;sonar;positive;0;0;0;0;0;0 -12679;sonate;positive;0;0;0;0;0;0 -12680;sondage;positive;0;0;0;0;0;0 -12681;sonde;positive;0;0;0;0;0;0 -12682;songe;positive;1;0;0;0;0;0 -12683;songer;positive;1;0;0;0;0;0 -12684;sonner;negative;0;0;1;0;1;0 -12685;sonnerie;positive;0;0;0;0;1;0 -12686;sonnet;positive;0;0;1;0;0;0 -12687;sonnette;positive;0;0;0;0;0;0 -12688;sonneur;negative;0;1;0;1;1;0 -12689;sonore;negative;0;1;0;0;1;0 -12690;soporifique;negative;0;1;1;0;0;0 -12691;soprano;positive;0;0;0;0;0;0 -12692;sorcellerie;negative;0;1;1;1;1;0 -12693;sorcier;negative;0;1;0;0;0;0 -12694;sordide;negative;0;1;1;1;0;1 -12695;sorgho;positive;0;0;0;0;0;0 -12696;sororité;positive;0;0;1;1;1;0 -12697;sort;negative;0;1;0;0;0;0 -12698;sorte;positive;0;0;0;0;0;0 -12699;sortie;positive;0;1;0;0;1;0 -12700;sortir;positive;0;0;0;0;0;0 -12701;sortir avec qqn;positive;1;0;0;0;0;0 -12702;sosie;negative;0;1;0;1;1;0 -12703;sou;positive;0;0;0;0;0;0 -12704;souche;positive;0;0;0;0;0;1 -12705;souci;negative;0;1;1;0;0;0 -12706;soucier;negative;0;1;1;0;0;0 -12707;soucieux;negative;0;1;0;0;0;0 -12708;soucoupe;positive;0;0;0;0;0;0 -12709;soudage;positive;0;0;0;0;0;0 -12710;soudain;negative;0;0;0;0;1;0 -12711;souder;positive;0;0;0;0;0;0 -12712;soudure;positive;0;0;0;0;0;0 -12713;soufflant;negative;0;1;0;0;1;0 -12714;soufflante;negative;0;0;0;0;0;0 -12715;souffle;negative;0;1;0;1;1;0 -12716;souffler;negative;0;0;1;0;0;0 -12717;souffler en rafale;negative;0;1;0;0;1;0 -12718;soufflet;negative;0;0;0;1;0;0 -12719;souffrance;negative;0;1;1;1;0;1 -12720;souffrir;negative;0;1;1;0;0;1 -12721;souffrant;negative;0;1;1;0;0;0 -12722;souffrir douleur;negative;0;1;1;1;0;0 -12723;soufre;negative;0;1;0;1;0;1 -12724;souhaitable;positive;0;0;0;0;0;0 -12725;souhaiter;positive;0;0;0;0;1;0 -12726;souiller;negative;0;0;0;0;0;1 -12727;souillure;negative;0;0;0;0;0;0 -12728;souk;negative;0;0;0;0;0;0 -12729;soulagement;positive;0;0;0;0;0;0 -12730;soulager;positive;0;0;0;0;0;0 -12731;soulever;positive;0;0;0;0;0;0 -12732;soulèvement;negative;0;1;0;1;1;0 -12733;soulier;positive;0;0;0;0;0;0 -12734;soulignement;positive;0;0;0;0;0;0 -12735;souligner;positive;0;0;0;0;0;0 -12736;soumettre;negative;0;0;0;1;0;0 -12737;soumission;negative;0;1;1;1;0;1 -12738;soupape;positive;0;0;0;0;0;0 -12739;soupçonner;negative;0;1;0;0;0;0 -12740;soupçonneux;negative;0;1;0;1;0;0 -12741;soupçon;negative;0;1;0;0;0;0 -12742;soupe;positive;0;0;0;0;0;0 -12743;soupe épais;positive;0;0;0;0;0;0 -12744;souper;positive;0;0;0;0;0;0 -12745;soupeser;positive;0;1;0;0;0;0 -12746;soupir;negative;0;0;1;0;0;0 -12747;soupirer;negative;0;0;1;1;0;1 -12748;source;positive;0;0;0;0;0;0 -12749;sourd;negative;0;0;1;0;0;1 -12750;sourire;positive;1;0;0;0;0;0 -12751;souriant;positive;1;0;0;0;0;0 -12752;sourire bête;negative;0;0;0;0;0;1 -12753;sourire suffisant;negative;0;0;0;0;0;1 -12754;souris;negative;0;1;0;0;0;0 -12755;sournois;negative;0;1;1;1;0;1 -12756;sous condition;negative;0;0;0;0;0;0 -12757;sous peu;positive;0;0;0;0;0;0 -12758;sous terre;negative;0;1;0;0;0;0 -12759;sous bois;negative;0;1;1;0;0;0 -12760;sous comité;positive;0;0;0;0;0;0 -12761;sous cutané;negative;0;1;0;0;0;1 -12762;sous ensemble;positive;0;0;0;0;0;0 -12763;sous entendre;negative;0;0;0;0;0;0 -12764;sou entendre;positive;0;1;0;1;1;0 -12765;sous estimer;negative;0;0;0;0;1;0 -12766;sous marin;negative;0;1;0;0;0;0 -12767;sou payer|payer;negative;0;0;1;1;0;0 -12768;sous sol;negative;0;1;1;0;0;0 -12769;sous type;positive;0;0;0;0;0;0 -12770;sous vêtement;positive;0;0;0;0;0;0 -12771;souscripteur;positive;0;0;0;0;0;0 -12772;souscription;positive;0;0;0;0;0;0 -12773;souscrire;positive;0;0;0;0;0;0 -12774;soustraction;negative;0;0;0;0;0;0 -12775;soustraire;negative;0;0;0;0;0;0 -12776;soutenable;positive;0;0;0;0;0;0 -12777;soutenant;positive;0;0;0;0;0;0 -12778;souteneur;negative;0;1;0;0;0;1 -12779;soutenir;positive;0;0;0;0;0;0 -12780;souterrain;negative;0;1;0;0;0;0 -12781;souterrainne;negative;0;1;0;0;0;0 -12782;souterrainnes;negative;0;1;0;0;0;0 -12783;soutien;positive;0;0;0;0;0;0 -12784;soutirer;negative;0;0;0;0;0;0 -12785;souvenir;positive;0;0;0;0;0;0 -12786;souverain pontife;positive;0;0;0;0;0;0 -12787;souveraineté;positive;0;0;0;0;0;0 -12788;spa;positive;0;0;0;0;1;0 -12789;spasme;negative;0;1;0;0;0;0 -12790;spatule;positive;0;0;0;0;0;0 -12791;spécial;positive;1;0;0;0;0;0 -12792;spécialement;positive;0;0;0;0;0;0 -12793;spécialiser;positive;0;0;0;0;0;0 -12794;spécialiste;positive;0;0;0;0;0;0 -12795;spécialité;positive;0;0;0;0;0;0 -12796;spécification;positive;0;0;0;0;0;0 -12797;spécifique;positive;0;0;0;0;0;0 -12798;spécimen;positive;0;0;0;0;0;0 -12799;spectacle;positive;0;0;0;0;0;0 -12800;spectacle fabuleux;positive;1;0;0;0;0;0 -12801;spectaculaire;positive;0;0;0;0;1;0 -12802;spectre;negative;0;1;1;0;0;0 -12803;spectromètre;positive;0;0;0;0;0;0 -12804;spectrophotomètre;positive;0;0;0;0;0;0 -12805;spectroscopie;positive;0;0;0;0;0;0 -12806;spéculation;negative;0;1;1;0;0;0 -12807;spéculer;negative;0;0;0;0;0;0 -12808;spéculum;negative;0;1;0;0;0;1 -12809;spencer;positive;0;0;0;0;0;0 -12810;sperme;positive;0;0;0;0;0;1 -12811;sphère;positive;0;0;0;0;0;0 -12812;sphérique;positive;0;0;0;0;0;0 -12813;sphinx;positive;0;0;0;0;0;0 -12814;spinal;positive;0;0;0;0;0;0 -12815;spiral|spirale;positive;0;0;0;0;0;0 -12816;spiraler;positive;0;0;0;0;0;0 -12817;spiritualité;positive;0;0;0;0;0;0 -12818;spiritueux;negative;0;0;1;1;0;0 -12819;splendeur;positive;0;0;0;0;1;0 -12820;splendide;positive;0;0;0;0;1;0 -12821;spline;positive;0;0;0;0;0;0 -12822;spoiler;negative;0;1;1;1;0;0 -12823;sponsor;positive;0;0;0;0;0;0 -12824;sponsoring;positive;0;0;0;0;0;0 -12825;sponsoriser;positive;0;0;0;0;0;0 -12826;sporadique;negative;0;0;0;0;1;0 -12827;spore;negative;0;0;0;0;0;1 -12828;sport;positive;0;0;0;0;0;0 -12829;spray;positive;0;0;0;0;0;0 -12830;square;positive;0;0;0;0;0;0 -12831;squat;negative;0;1;0;0;0;0 -12832;squatter;negative;0;1;1;0;0;1 -12833;squelette;negative;0;1;1;0;0;0 -12834;stabilité;positive;0;0;0;0;0;0 -12835;stable;positive;0;1;0;0;1;0 -12836;staccato;negative;0;0;0;0;0;0 -12837;stade;positive;0;0;0;0;0;0 -12838;stagiaire;positive;0;0;0;0;0;0 -12839;stagner;negative;0;0;1;0;0;0 -12840;stagnant;negative;0;0;1;0;0;0 -12841;stagnation;negative;0;1;1;0;0;0 -12842;stalle;positive;0;0;0;0;0;1 -12843;stand;positive;0;0;0;0;0;1 -12844;standard;positive;0;0;0;0;0;0 -12845;standardiser;positive;0;0;0;0;0;0 -12846;star;positive;0;0;0;0;0;0 -12847;starter;negative;0;1;1;1;1;0 -12848;station;positive;0;0;0;0;0;0 -12849;stationnaire;positive;0;0;0;0;0;0 -12850;stationner;positive;0;0;0;0;0;0 -12851;statique;positive;0;0;0;0;0;0 -12852;statistique;positive;0;0;0;0;0;0 -12853;stator;positive;0;0;0;0;0;0 -12854;statuaire;positive;0;0;0;0;0;0 -12855;statue;positive;0;0;0;0;0;0 -12856;statuer sur;negative;0;1;0;0;0;0 -12857;statuette;positive;0;0;0;0;0;0 -12858;stature;positive;0;0;0;0;0;0 -12859;statut;positive;0;0;0;0;0;0 -12860;statutaire;positive;0;0;0;0;0;0 -12861;stellaire;positive;0;0;0;0;0;0 -12862;stencil;positive;0;0;0;0;0;0 -12863;sténo;positive;0;0;0;0;0;0 -12864;sténographie;positive;0;0;0;0;0;0 -12865;steppe;negative;0;1;1;0;0;0 -12866;stéréoscopique;positive;0;0;0;0;0;0 -12867;stéréotype;negative;0;0;0;0;0;1 -12868;stéréotyper;negative;0;0;0;0;0;1 -12869;stérile;negative;0;1;1;0;0;0 -12870;stériliser;positive;0;1;1;0;0;0 -12871;stérilité;negative;0;1;1;0;0;0 -12872;sterling;positive;0;0;0;1;0;0 -12873;sterne;positive;0;0;0;0;0;0 -12874;stéthoscope;positive;0;0;0;0;0;0 -12875;steward;positive;0;0;0;0;0;0 -12876;stigmate;negative;0;1;1;1;0;1 -12877;stimulant;positive;0;0;0;0;0;0 -12878;stimulation;positive;1;0;0;0;0;0 -12879;stimuler;positive;0;0;0;0;0;0 -12880;stimulus;positive;0;0;0;0;0;0 -12881;stipulation;positive;0;0;0;0;0;0 -12882;stipuler;positive;0;0;0;0;0;0 -12883;stock;positive;0;0;0;0;0;0 -12884;stockage;positive;0;0;0;0;0;0 -12885;stocker;positive;0;0;0;0;0;0 -12886;stoïque;positive;0;0;0;0;0;0 -12887;stratège;positive;0;0;0;0;0;0 -12888;stratégie;positive;0;0;0;0;0;0 -12889;stratégique;positive;0;0;0;0;0;0 -12890;stratification;positive;0;0;0;0;0;0 -12891;stratus;negative;0;0;1;0;0;0 -12892;stress;negative;0;1;0;1;0;0 -12893;stresser;negative;0;1;1;1;0;0 -12894;stressant;negative;0;1;1;1;0;0 -12895;strict;negative;0;0;1;0;0;0 -12896;strident;negative;0;1;0;1;1;0 -12897;strie;negative;0;0;0;0;0;0 -12898;strier;positive;0;0;0;0;0;0 -12899;stroboscopique;positive;0;0;0;0;0;0 -12900;strophe;positive;0;0;0;0;0;0 -12901;structure;positive;0;0;0;0;0;0 -12902;structurer;positive;0;0;0;0;0;0 -12903;stuc;positive;0;0;0;0;0;0 -12904;studio;positive;0;0;0;0;0;0 -12905;stupéfaction;positive;0;0;0;0;1;0 -12906;stupéfaire;negative;0;1;0;0;1;1 -12907;stupéfiant;negative;0;0;0;0;1;0 -12908;stupéfier;positive;0;0;0;0;1;0 -12909;stupide;negative;0;0;0;1;0;1 -12910;stupidité;negative;0;0;0;1;0;1 -12911;style;positive;0;0;0;0;0;0 -12912;stylet;negative;0;1;0;0;0;0 -12913;stylo;positive;0;0;0;0;0;0 -12914;suaire;negative;0;0;1;0;0;0 -12915;suer;negative;0;0;0;0;0;1 -12916;suavité;positive;0;0;0;0;0;0 -12917;subalterne;negative;0;0;1;0;0;1 -12918;subatomique;positive;0;0;0;0;0;0 -12919;subconscient;negative;0;0;0;0;0;0 -12920;subdiviser;positive;0;0;0;0;0;0 -12921;subdivision;positive;0;0;0;0;0;0 -12922;subduction;positive;0;0;0;0;0;0 -12923;subir;negative;0;0;1;0;0;0 -12924;subito;positive;0;0;0;0;1;0 -12925;sublimation;positive;1;0;0;0;0;0 -12926;subliminal;negative;0;0;0;0;1;0 -12927;submerger;negative;0;1;1;0;1;0 -12928;submersible;negative;0;1;0;0;0;0 -12929;submersion;negative;0;1;0;0;0;0 -12930;subordination;negative;0;0;0;0;0;0 -12931;subsidiaire;negative;0;0;0;0;0;0 -12932;subsistance;positive;1;0;0;0;0;0 -12933;subsister;positive;0;0;0;0;0;0 -12934;substance;positive;0;0;0;0;0;0 -12935;substantiellement;positive;0;0;0;0;0;0 -12936;substituer;negative;0;0;0;0;0;0 -12937;substitut;negative;0;0;0;0;0;0 -12938;substitution;negative;0;0;0;0;0;0 -12939;subtil;positive;0;0;0;0;1;0 -12940;subvenir;positive;0;0;0;0;0;0 -12941;subvention;positive;0;0;0;1;0;1 -12942;subventionner;positive;0;0;0;0;0;0 -12943;subversion;negative;0;1;0;1;0;0 -12944;subvertir;negative;0;1;1;0;0;1 -12945;sucer;negative;0;0;0;0;0;0 -12946;succès;positive;1;0;0;0;0;0 -12947;successeur;positive;0;0;0;0;0;0 -12948;succession;positive;0;0;0;0;0;0 -12949;succinct;positive;0;0;0;0;0;0 -12950;succion;negative;0;1;0;0;0;0 -12951;succomber;negative;0;1;1;0;0;0 -12952;succulent;positive;1;0;0;0;0;0 -12953;succursale;positive;0;0;0;0;0;0 -12954;sucette;positive;0;0;0;1;0;0 -12955;sucre;positive;0;0;0;0;0;0 -12956;sucrer;positive;0;0;0;0;1;0 -12957;sucrerie;positive;1;0;0;0;0;0 -12958;sudation;negative;0;0;0;0;0;1 -12959;sueur;negative;0;1;0;0;0;1 -12960;suffire;positive;0;0;0;0;0;0 -12961;suffisamment;positive;0;0;0;0;0;0 -12962;suffisance;negative;0;0;0;1;0;0 -12963;suffisant;positive;0;0;0;0;0;1 -12964;suffixe;positive;0;0;0;0;0;0 -12965;suffocant;negative;0;1;1;0;0;1 -12966;suffocation;negative;0;1;0;1;0;0 -12967;suggérer;positive;0;0;0;0;0;0 -12968;suggestion;positive;0;0;0;0;0;0 -12969;suicidaire;negative;0;1;1;1;0;1 -12970;suicide;negative;0;1;1;1;0;0 -12971;suicider;negative;0;1;1;1;0;0 -12972;suie;negative;0;0;0;0;0;1 -12973;suif;positive;0;0;0;0;0;0 -12974;suintement;negative;0;0;0;0;0;1 -12975;suinter;negative;0;0;0;0;0;1 -12976;suivant;negative;0;0;0;0;0;0 -12977;suivant|suivante;negative;0;0;0;0;0;0 -12978;suivre;positive;0;0;0;0;0;0 -12979;suivre à le trace;positive;0;0;0;0;0;0 -12980;suivre le trace de;positive;0;0;0;0;0;0 -12981;sujet;negative;0;0;1;1;0;1 -12982;sujétion;negative;0;1;1;0;0;0 -12983;sultan;positive;0;1;0;0;0;0 -12984;sumo;negative;0;1;0;0;0;0 -12985;super;positive;0;1;1;1;1;0 -12986;superbe;positive;1;0;0;0;0;0 -12987;superficie;positive;0;0;0;0;0;0 -12988;supériorité;positive;0;0;0;0;0;0 -12989;superlatif;positive;0;0;0;0;0;0 -12990;superman;positive;0;0;0;0;0;0 -12991;supermarché;positive;0;0;0;0;0;0 -12992;superposer;positive;0;0;0;0;0;0 -12993;superposition;positive;0;0;0;0;0;0 -12994;superstar;positive;0;0;0;0;0;0 -12995;superstition;negative;0;1;0;0;0;0 -12996;superviser;positive;0;0;0;0;0;0 -12997;superviseur;positive;0;0;0;0;0;0 -12998;supllier;negative;0;0;1;0;0;0 -12999;supplanter;positive;0;0;0;0;0;0 -13000;supplément;positive;0;0;1;1;0;1 -13001;supplémentaire;positive;0;0;0;0;0;0 -13002;supplication;positive;0;0;0;0;0;0 -13003;supplice;negative;0;1;1;1;1;0 -13004;support;positive;0;0;0;0;0;0 -13005;supporter qch;positive;0;0;0;0;0;0 -13006;supporteur;positive;0;0;0;0;0;0 -13007;supposer;negative;0;1;0;0;0;0 -13008;suppression;negative;0;1;1;1;0;1 -13009;supprimer;negative;0;1;1;1;0;0 -13010;suprématie;positive;0;1;0;1;1;0 -13011;suprême;positive;0;0;0;0;0;0 -13012;suprêmement;positive;0;0;0;0;0;0 -13013;sur ce;positive;0;0;0;0;0;0 -13014;sur qui on ne pouvoir compter;negative;0;1;0;1;0;0 -13015;sur le champ;positive;0;0;0;0;1;0 -13016;surabondance;negative;0;0;0;0;0;1 -13017;surcharge;negative;0;0;1;0;0;0 -13018;surcharger;negative;0;0;1;0;0;0 -13019;surdité;negative;0;1;1;0;0;0 -13020;surestimer;negative;0;0;0;0;1;0 -13021;sûreté;positive;0;0;0;0;0;0 -13022;surf;positive;0;0;0;0;0;0 -13023;surface;positive;0;0;0;0;0;0 -13024;surfacturé;negative;0;0;1;0;0;0 -13025;surfacturée;negative;0;0;1;0;0;0 -13026;surfacturées;negative;0;0;1;0;0;0 -13027;surfacturés;negative;0;0;1;0;0;0 -13028;surfer;positive;0;0;0;0;0;0 -13029;surgir;positive;0;0;0;0;1;0 -13030;surhomme;positive;0;0;0;0;0;0 -13031;surhumain;positive;0;0;0;0;0;0 -13032;surintendant;positive;0;0;0;0;0;0 -13033;surintendante;positive;0;0;0;0;0;0 -13034;surmenage;negative;0;1;1;0;0;0 -13035;surnageant;positive;0;0;0;0;0;0 -13036;surnom;positive;0;0;0;0;0;0 -13037;surnommer;positive;0;0;0;0;0;0 -13038;surpasser;positive;0;0;0;0;0;0 -13039;surpasser en nombre;positive;0;0;0;0;0;0 -13040;surpayer|surpayer;negative;0;0;0;0;0;0 -13041;surplomber;positive;0;0;0;0;0;0 -13042;surplombant;positive;0;0;0;0;0;0 -13043;surplus;negative;0;0;0;0;0;0 -13044;surprenant;positive;0;0;0;0;1;0 -13045;surseoir;positive;0;0;0;0;0;0 -13046;surstocker;negative;0;0;0;0;0;0 -13047;surtaxe;negative;0;0;1;1;0;1 -13048;surtout;positive;0;0;0;0;0;0 -13049;survaleur;positive;1;0;0;0;0;0 -13050;surveillance;positive;0;1;1;0;0;0 -13051;surveiller pénitentiaire;negative;0;1;0;1;0;0 -13052;surveillant pénitentiaire;negative;0;1;0;1;0;0 -13053;surveiller;positive;0;1;0;0;0;0 -13054;survenir;positive;0;0;0;0;1;0 -13055;survie;positive;0;0;0;0;0;0 -13056;survivant;positive;1;0;0;0;0;0 -13057;survivre;positive;1;0;0;0;0;0 -13058;survivre à;positive;1;0;0;0;0;0 -13059;susceptibilité;negative;0;0;1;0;0;0 -13060;susceptible;negative;0;1;1;1;0;0 -13061;susdit;positive;0;0;0;0;0;0 -13062;susmentionné;positive;0;0;0;0;0;0 -13063;suspect;negative;0;1;0;0;0;0 -13064;suspecter;negative;0;1;0;0;0;0 -13065;suspendre;negative;0;0;1;0;1;0 -13066;suspense;negative;0;1;0;0;1;0 -13067;suspension;negative;0;1;0;0;0;0 -13068;suspicieux;negative;0;1;0;1;0;0 -13069;suspicion;negative;0;1;0;0;0;0 -13070;suture;negative;0;1;0;0;0;1 -13071;suturer qch;negative;0;0;0;0;0;0 -13072;svastika;negative;0;1;0;1;0;1 -13073;svelte;positive;0;0;0;0;0;0 -13074;swag;positive;0;0;0;0;0;0 -13075;swastika;negative;0;1;0;1;0;1 -13076;syllabe;positive;0;0;0;0;0;0 -13077;syllabique;positive;0;0;0;0;0;0 -13078;symbole;positive;0;0;0;0;0;0 -13079;symbolique;positive;0;0;0;0;0;0 -13080;symboliquement;positive;0;0;0;0;0;0 -13081;symboliser;positive;0;0;0;0;0;0 -13082;symbolisme;positive;0;0;0;0;0;0 -13083;symétrie;positive;0;0;0;0;0;0 -13084;symétrique;positive;0;0;0;0;0;0 -13085;sympathique;positive;0;0;0;0;0;0 -13086;symphonie;positive;1;0;0;0;0;0 -13087;symptomatique;negative;0;0;1;0;0;0 -13088;symptôme;negative;0;1;0;0;0;0 -13089;synagogue;positive;0;0;0;0;0;0 -13090;synchrone;positive;0;0;0;0;0;0 -13091;synchroniser;positive;0;0;0;0;1;0 -13092;syncope;negative;0;1;1;0;1;0 -13093;syndicat;positive;0;0;0;0;0;0 -13094;synergie;positive;0;0;0;0;0;0 -13095;synode;positive;0;0;0;0;0;0 -13096;synonyme;positive;0;1;0;0;0;0 -13097;synopsis;positive;0;0;0;0;0;0 -13098;synoptique;positive;0;0;0;0;0;0 -13099;syntaxe;positive;0;0;0;0;0;0 -13100;synthèse;positive;0;0;0;0;0;0 -13101;synthétique;negative;0;0;0;0;0;1 -13102;systématique;positive;0;0;0;0;0;0 -13103;systématiquement;positive;0;0;0;0;0;0 -13104;système;positive;0;0;0;0;0;0 -13105;système hydraulique;negative;0;0;1;0;0;0 -13106;tabac;negative;0;0;0;0;0;1 -13107;tabac à priser;negative;0;0;0;0;1;1 -13108;tabagisme;negative;0;0;0;0;0;1 -13109;tabernacle;positive;0;0;0;0;0;0 -13110;table;positive;0;0;0;0;0;0 -13111;tableau;positive;0;0;0;0;0;0 -13112;tableau de bord;positive;0;0;0;0;0;0 -13113;tableau noir;positive;0;0;0;0;0;0 -13114;tablette;positive;0;0;0;0;0;0 -13115;tablier;positive;0;0;0;0;0;0 -13116;tabou;negative;0;1;0;0;0;1 -13117;tabouret;positive;0;0;0;0;0;0 -13118;tabulaire;positive;0;0;0;0;0;0 -13119;tabulation;positive;0;0;0;0;0;0 -13120;tabuler;positive;0;0;0;0;0;0 -13121;tache;negative;0;1;1;1;0;1 -13122;tâche;negative;0;1;1;0;0;1 -13123;tacher;negative;0;1;1;0;0;1 -13124;tâcher de;positive;0;0;0;0;0;0 -13125;tacheter;negative;0;0;0;0;0;0 -13126;tachymètre;positive;0;0;0;0;0;0 -13127;tacite;positive;0;0;0;0;0;0 -13128;tacot;negative;0;1;0;1;1;0 -13129;tact;positive;0;0;0;0;0;0 -13130;tactile;positive;0;0;0;0;0;0 -13131;tactique;positive;0;1;0;0;0;0 -13132;taffetas;positive;0;0;0;0;0;0 -13133;taie d oreiller;positive;0;0;0;0;0;0 -13134;taillader;negative;0;1;1;1;0;1 -13135;taillant;positive;0;0;0;0;0;0 -13136;taille;positive;0;0;0;0;0;0 -13137;tailler;negative;0;1;0;0;0;0 -13138;taille haie;negative;0;0;0;0;0;0 -13139;tailleur;positive;0;0;0;0;0;0 -13140;tailleuse;positive;0;0;0;0;0;0 -13141;taire;negative;0;1;1;1;0;1 -13142;talent;positive;0;0;0;0;0;0 -13143;talisman;positive;0;0;0;0;0;0 -13144;talon;positive;0;0;0;0;0;0 -13145;talus;positive;0;0;0;0;0;0 -13146;tambour;positive;0;0;0;0;0;0 -13147;tambourin;negative;0;0;0;0;0;0 -13148;tambourinement;positive;0;0;0;0;0;0 -13149;tambouriner;positive;0;0;0;0;0;0 -13150;tamis;positive;0;0;0;0;0;0 -13151;tamisage;positive;0;0;0;0;0;0 -13152;tamiser;negative;0;0;1;0;0;0 -13153;tampon;positive;0;0;0;0;0;1 -13154;tamponner;positive;0;0;0;0;0;0 -13155;tandem;positive;0;0;0;0;0;0 -13156;tangent;negative;0;0;0;0;0;0 -13157;tanière;positive;0;0;0;0;0;0 -13158;tanner;positive;0;0;0;0;0;0 -13159;tante;positive;0;0;0;0;0;0 -13160;taper;positive;0;0;0;0;0;0 -13161;tapir;negative;0;0;0;0;0;0 -13162;tapir de course;positive;0;0;0;0;0;0 -13163;tapis roulant;positive;0;0;0;0;0;0 -13164;tapisserie;positive;0;0;0;0;0;0 -13165;tapoter;positive;0;0;0;0;0;0 -13166;taquiner;positive;0;0;1;1;0;0 -13167;taquinerie;negative;0;1;0;1;0;0 -13168;tarer;negative;0;1;0;0;0;1 -13169;tarif;negative;0;0;1;1;0;1 -13170;tartan;positive;0;0;0;0;0;0 -13171;tarte;positive;0;0;0;0;0;0 -13172;tartre;negative;0;0;0;0;0;1 -13173;tas;positive;0;0;0;0;0;1 -13174;tasse;positive;0;0;0;0;0;0 -13175;tassement;negative;0;0;1;0;0;0 -13176;tatami;negative;0;0;0;0;0;0 -13177;tâtonner;negative;0;1;0;0;0;0 -13178;tatouage;positive;0;0;0;0;0;0 -13179;tatouer;positive;0;0;0;0;0;0 -13180;taudis;negative;0;1;1;0;0;1 -13181;taureau;negative;0;1;0;0;0;0 -13182;tau|taux;positive;0;0;0;0;0;0 -13183;taverne;positive;0;0;0;0;0;0 -13184;taxe;negative;0;0;1;1;0;0 -13185;taxer;negative;0;0;1;1;0;0 -13186;taxi;positive;0;0;0;0;0;0 -13187;taxinomie;positive;0;0;0;0;0;0 -13188;taxonomie;positive;0;0;0;0;0;0 -13189;teaser;positive;0;0;0;0;0;0 -13190;technicité;positive;0;0;0;0;0;0 -13191;technique;positive;0;0;0;0;0;0 -13192;technologie;positive;0;0;0;0;0;0 -13193;ted;positive;0;0;0;0;0;0 -13194;teflon;positive;0;0;0;0;0;0 -13195;téflon;positive;0;0;0;0;0;0 -13196;teindre;positive;0;0;0;0;0;0 -13197;teinte;positive;0;0;0;0;0;0 -13198;teinter;positive;0;0;0;0;0;0 -13199;teinture;positive;0;0;0;0;0;0 -13200;télégramme;positive;0;0;0;0;0;0 -13201;télégraphe;positive;0;0;0;0;0;0 -13202;téléphone;positive;0;0;0;0;0;0 -13203;téléphoner;positive;0;0;0;0;0;0 -13204;télescope;positive;0;0;0;0;0;0 -13205;téléscope;positive;0;0;0;0;0;0 -13206;télescopique;positive;0;0;0;0;0;0 -13207;téléscripteur;positive;0;0;0;0;0;0 -13208;télévision;positive;0;0;0;0;0;0 -13209;téméraire;positive;0;1;0;1;0;0 -13210;témérité;negative;0;1;0;1;1;1 -13211;témoignage;positive;0;0;0;0;0;0 -13212;témoigner;positive;0;0;0;0;0;0 -13213;témoigner de le sympathie;positive;0;0;1;0;0;0 -13214;témoin;positive;0;0;0;0;0;0 -13215;témoin oculaire;positive;0;0;0;0;0;0 -13216;tempera;positive;0;0;0;0;0;0 -13217;tempérer;positive;0;0;0;0;0;0 -13218;tempérament;positive;0;0;0;0;0;0 -13219;tempérance;positive;0;0;0;0;0;0 -13220;température;positive;0;0;0;0;0;0 -13221;tempête;negative;0;1;1;1;1;0 -13222;temple;positive;0;0;0;0;0;0 -13223;temporaire;negative;0;0;0;0;0;0 -13224;temporairement;negative;0;0;0;0;0;0 -13225;temporal;positive;0;0;0;0;0;0 -13226;temporisation;negative;0;1;1;0;0;0 -13227;temps;positive;0;0;0;0;0;0 -13228;ténacité;positive;0;0;0;0;0;0 -13229;tendon;positive;0;0;0;0;0;0 -13230;tendre;positive;0;0;0;0;0;0 -13231;tendre un embuscade à;negative;0;1;0;1;1;0 -13232;tendresse;positive;0;0;0;0;0;0 -13233;ténèbre;negative;0;1;1;1;0;0 -13234;teneur;positive;0;0;0;0;0;0 -13235;tenir;positive;0;0;0;0;0;0 -13236;tenir compte de;positive;0;0;0;0;0;0 -13237;tenir en laisse;negative;0;1;1;0;0;0 -13238;tennis;positive;0;0;0;0;0;0 -13239;tension;negative;0;1;0;1;0;0 -13240;tentacule;negative;0;1;0;0;0;1 -13241;tenter;positive;0;0;0;0;1;0 -13242;tentant;positive;0;0;0;0;1;0 -13243;tentation;negative;0;0;0;0;0;0 -13244;tentative;positive;0;0;0;0;0;0 -13245;tente;positive;0;0;0;0;0;0 -13246;tenture;positive;0;0;0;0;0;0 -13247;ténu;negative;0;1;1;0;0;0 -13248;tenue;positive;0;0;0;0;0;0 -13249;tercet;positive;0;0;0;0;0;0 -13250;terme;positive;0;0;1;0;0;0 -13251;terminal;positive;0;1;1;0;0;0 -13252;terminus;negative;0;1;1;0;0;0 -13253;termite;negative;0;0;0;0;0;1 -13254;ternaire;positive;0;0;0;0;0;0 -13255;terne;negative;0;0;1;0;0;1 -13256;ternir;negative;0;0;1;0;0;1 -13257;terrain;positive;0;1;1;1;1;0 -13258;terrasse;positive;0;0;0;0;0;0 -13259;terre;positive;0;0;0;0;0;0 -13260;terreau;positive;0;0;0;0;0;0 -13261;terre boisé;positive;0;0;0;0;0;0 -13262;terreur;negative;0;1;1;1;0;0 -13263;terreux;positive;0;0;0;0;0;0 -13264;terrible;negative;0;1;1;1;1;1 -13265;terriblement;negative;0;1;1;1;1;1 -13266;terrier;negative;0;0;0;0;0;0 -13267;terrifier;negative;0;1;1;1;1;1 -13268;terrifiant;negative;0;1;1;1;0;1 -13269;territoire;positive;0;0;0;0;0;0 -13270;territorial;positive;0;0;0;0;0;0 -13271;terroriser;negative;0;1;1;1;1;1 -13272;terrorisme;negative;0;1;1;1;0;1 -13273;terroriste;negative;0;1;1;1;1;1 -13274;tertiaire;positive;0;0;0;0;0;0 -13275;tertre;negative;0;0;0;0;0;1 -13276;test;positive;0;0;0;0;0;0 -13277;testament;positive;0;0;0;0;0;0 -13278;tester;positive;0;0;0;0;0;0 -13279;tétanos;negative;0;1;0;0;0;1 -13280;tête;positive;0;0;0;0;0;0 -13281;tête baisser;negative;0;0;0;1;1;0 -13282;tête de n?ud;negative;0;0;0;1;0;1 -13283;tête de puits;positive;0;0;0;0;0;0 -13284;téter;positive;0;0;0;0;0;0 -13285;tétine;positive;0;0;0;0;0;0 -13286;téton;positive;0;0;0;0;0;0 -13287;tétraédrique;positive;0;0;0;0;0;0 -13288;tétu;negative;0;0;0;1;0;0 -13289;texte;positive;0;0;0;0;0;0 -13290;texte sacré;positive;0;0;0;0;0;0 -13291;texte standard;negative;0;0;0;0;0;0 -13292;textile;positive;0;0;0;0;0;0 -13293;texto;positive;0;0;0;0;0;0 -13294;textuellement;positive;0;0;0;0;0;0 -13295;textural;positive;0;0;0;0;0;0 -13296;texturale;positive;0;0;0;0;0;0 -13297;texturales;positive;0;0;0;0;0;0 -13298;texturaux;positive;0;0;0;0;0;0 -13299;texture;positive;0;0;0;0;0;0 -13300;thanksgiving;positive;0;0;0;0;0;0 -13301;thé;positive;0;0;0;0;0;0 -13302;théâtral;negative;0;0;0;0;0;0 -13303;théâtre;positive;1;0;0;0;0;0 -13304;théisme;negative;0;0;0;0;0;1 -13305;thème;positive;0;0;0;0;0;0 -13306;thème majeur;positive;0;0;0;0;0;0 -13307;théocratie;positive;0;0;0;0;0;0 -13308;théocratique;negative;0;1;1;1;0;0 -13309;théologie;positive;0;0;0;0;0;0 -13310;théologique;positive;0;0;0;0;0;0 -13311;théorème;positive;0;0;0;0;0;0 -13312;théorie;positive;0;0;0;0;0;0 -13313;théorique;negative;0;0;0;0;0;0 -13314;thérapeutique;positive;0;0;0;0;0;0 -13315;thermique;positive;0;0;0;0;0;0 -13316;thermocouple;positive;0;0;0;0;0;0 -13317;thermodynamique;positive;0;0;0;0;0;0 -13318;thermomètre;positive;0;0;0;0;0;0 -13319;thermostat;positive;0;0;0;0;0;0 -13320;thèse;positive;0;0;0;0;0;0 -13321;thon;negative;0;0;0;0;0;0 -13322;thym;positive;0;0;0;0;0;0 -13323;tiare;positive;0;0;0;0;0;0 -13324;tibia;positive;0;0;0;0;0;0 -13325;tic;negative;0;1;0;0;1;0 -13326;ticket;positive;0;0;0;0;0;0 -13327;ticket de caisse;positive;0;0;0;0;0;0 -13328;tiède;negative;0;0;0;0;0;0 -13329;tiers;positive;0;0;0;0;0;0 -13330;tige;positive;0;1;0;0;0;0 -13331;tigre;negative;0;1;0;0;0;0 -13332;tigrer;positive;0;0;0;0;0;0 -13333;tilde;positive;0;0;0;0;0;0 -13334;timbre;positive;0;0;0;0;0;0 -13335;timbrer;negative;0;1;0;0;1;1 -13336;timide;negative;0;1;1;0;0;0 -13337;timidité;negative;0;1;1;0;0;0 -13338;tintement;positive;0;0;0;0;1;0 -13339;tinter;positive;1;0;0;0;0;0 -13340;tique;negative;0;0;0;0;0;0 -13341;tir;negative;0;1;1;1;1;0 -13342;tir à l arc;positive;0;0;0;0;0;0 -13343;tirage;positive;0;0;0;0;0;0 -13344;tirant;negative;0;1;1;1;0;0 -13345;tirer bouchon;positive;0;0;0;0;0;0 -13346;tirer à pile ou face;negative;0;1;0;0;1;0 -13347;tirer profit;positive;1;0;0;0;0;0 -13348;tirer profit de;positive;0;0;0;0;0;0 -13349;tiret;negative;0;1;1;0;0;0 -13350;tireur;negative;0;1;0;1;1;0 -13351;tiroir;positive;0;0;0;0;0;0 -13352;tisser;positive;0;0;0;0;0;0 -13353;tissu;positive;0;0;1;0;0;1 -13354;titanesque;negative;0;1;0;0;0;0 -13355;titre;positive;0;0;0;0;0;0 -13356;titrer;positive;0;0;0;0;0;0 -13357;titulaire;positive;0;0;0;0;0;0 -13358;titularisation;positive;0;0;0;0;0;0 -13359;toast;positive;1;0;0;0;0;0 -13360;toboggan;positive;0;1;0;0;1;0 -13361;toge;positive;0;0;0;0;0;0 -13362;toile;positive;0;0;0;0;0;0 -13363;toile de jute;negative;0;0;0;0;0;0 -13364;toilette;negative;0;0;0;0;0;1 -13365;toiletter;positive;0;0;0;0;0;0 -13366;toilette extérieur;negative;0;0;0;0;0;1 -13367;toison;positive;0;0;1;1;0;1 -13368;toit;positive;0;0;0;0;0;0 -13369;tolérer;positive;0;0;0;0;0;0 -13370;tolérant;positive;0;0;0;0;0;0 -13371;tollé;negative;0;1;0;1;1;1 -13372;tomahawk;positive;0;0;0;0;0;0 -13373;tomber;negative;0;1;1;0;0;0 -13374;tombant;negative;0;0;1;0;0;0 -13375;tombe;negative;0;1;1;0;0;0 -13376;tombeau;negative;0;1;1;0;0;0 -13377;tomber de le nuit;negative;0;1;1;0;0;0 -13378;tomber en flocon;negative;0;0;0;0;0;0 -13379;tomber en pâmoison;positive;1;0;0;0;0;0 -13380;tomber goutte à goutte;negative;0;0;0;0;0;1 -13381;tomber nez à nez;positive;0;0;0;0;1;0 -13382;tomber sur;positive;0;0;0;0;1;0 -13383;tombeur;positive;0;0;0;0;0;0 -13384;tombola;positive;0;0;0;0;1;0 -13385;tome;positive;0;0;0;0;0;0 -13386;ton;positive;0;0;0;0;0;0 -13387;ton monotone;negative;0;1;0;0;0;1 -13388;tondeur|tondeuse;negative;0;1;0;0;0;0 -13389;tondre;negative;0;1;0;0;0;0 -13390;tonifiant;positive;1;0;0;0;0;0 -13391;tonique;positive;1;0;0;0;0;0 -13392;tonitruer;negative;0;1;0;1;1;0 -13393;tonitruant;negative;0;1;0;1;1;0 -13394;tonnage;negative;0;0;0;0;0;0 -13395;tonne;negative;0;0;0;0;0;0 -13396;tonneau;positive;0;0;0;0;0;0 -13397;tonnelet;positive;0;0;0;0;0;0 -13398;tonnelle;positive;0;0;0;0;0;0 -13399;tonner;negative;0;1;0;1;1;0 -13400;tonnerre;negative;0;1;0;1;1;0 -13401;tonton;positive;0;0;0;0;0;0 -13402;topaze;positive;0;0;0;0;0;0 -13403;topographie;positive;0;0;0;0;0;0 -13404;topographique;positive;0;0;0;0;0;0 -13405;toquade;negative;0;0;0;0;0;0 -13406;toquer;negative;0;1;0;0;1;0 -13407;torche;positive;0;0;0;0;0;0 -13408;tordre;negative;0;1;0;1;0;0 -13409;tornade;negative;0;1;0;1;0;0 -13410;torpille;negative;0;1;0;1;0;0 -13411;torpiller;negative;0;1;0;1;0;0 -13412;torrent;negative;0;1;0;1;0;0 -13413;torsader;positive;0;0;0;0;0;0 -13414;torse;positive;0;0;0;0;0;0 -13415;torsion;negative;0;1;0;0;0;0 -13416;tort;negative;0;1;1;1;0;1 -13417;tortue;positive;0;0;0;0;0;0 -13418;torture;negative;0;1;1;1;0;1 -13419;torturer;negative;0;1;1;1;0;1 -13420;total;negative;0;0;0;0;0;0 -13421;totalement;positive;0;0;0;0;0;0 -13422;totalité;positive;0;0;0;0;0;0 -13423;totem;positive;0;0;0;0;0;0 -13424;touche;positive;0;0;0;0;0;0 -13425;toucher;positive;0;0;1;0;0;0 -13426;toucher par;negative;0;0;1;0;0;0 -13427;touffe;negative;0;0;0;0;0;0 -13428;touffu;negative;0;0;0;0;0;1 -13429;tour;positive;0;0;0;1;1;1 -13430;tour de main;positive;0;0;0;0;0;0 -13431;tour de taille;positive;0;0;0;0;0;0 -13432;tourbe;negative;0;0;0;0;0;1 -13433;tourbier|tourbière;negative;0;1;0;0;0;1 -13434;tourbillon;negative;0;1;0;0;1;0 -13435;tourbillonner;negative;0;1;0;0;1;0 -13436;tourelle;positive;0;0;0;0;0;0 -13437;touriste;positive;0;0;0;0;0;0 -13438;touristique;positive;0;0;0;0;0;0 -13439;tourmaline;positive;0;0;0;0;0;0 -13440;tourment;negative;0;1;1;1;0;0 -13441;tourmente;negative;0;1;1;1;0;0 -13442;tourmenter;negative;0;1;1;1;0;0 -13443;tournage;negative;0;1;0;1;0;0 -13444;tournant;negative;0;1;0;0;0;0 -13445;tourner autour de;positive;0;0;0;0;0;0 -13446;tournante;negative;0;1;0;0;0;0 -13447;tournée;positive;0;0;0;0;0;0 -13448;tournevis;positive;0;0;0;0;0;0 -13449;tournoi;positive;0;0;0;0;0;0 -13450;tournure;positive;0;0;0;0;0;0 -13451;tout le an;positive;0;0;0;0;0;0 -13452;tout le jour;positive;0;0;0;0;0;0 -13453;tout le quinze jour;positive;0;0;0;0;0;0 -13454;tousser;negative;0;0;0;0;0;1 -13455;tout à coup;negative;0;1;0;0;1;0 -13456;tout à fait;positive;0;0;0;0;0;0 -13457;tout autour;positive;0;0;0;0;0;0 -13458;tout comprendre;positive;0;0;0;0;0;0 -13459;tout de suite;positive;0;0;0;0;0;0 -13460;tout puissance;positive;0;1;0;0;0;0 -13461;tout le heure;positive;0;0;0;0;0;0 -13462;tout le semaine;positive;0;0;0;0;0;0 -13463;toux;negative;0;0;0;0;0;1 -13464;toxicologie;positive;0;0;0;0;0;0 -13465;toxine;negative;0;1;0;0;0;0 -13466;toxique;negative;0;1;1;1;1;1 -13467;tracer;positive;0;0;0;0;0;0 -13468;tracas;negative;0;1;1;1;0;0 -13469;tracasser;negative;0;1;1;1;0;0 -13470;tracassant;negative;0;1;1;1;0;0 -13471;trace;negative;0;0;0;0;0;1 -13472;tracé;positive;0;0;0;0;0;0 -13473;tracer du ligne;positive;0;0;0;0;0;0 -13474;trachée;positive;0;0;0;0;0;0 -13475;tract;positive;0;1;0;0;0;0 -13476;tracter;positive;0;0;0;0;0;0 -13477;tracteur;positive;0;0;0;0;0;0 -13478;traction;positive;0;0;0;0;0;0 -13479;tradition;positive;0;0;0;0;0;0 -13480;traditionnel;positive;0;0;0;0;0;0 -13481;traduction;positive;0;0;0;0;0;0 -13482;Traductionse;negative;0;0;0;0;0;0 -13483;Traductionses;negative;0;0;0;0;0;0 -13484;Traductionss;negative;0;0;0;0;0;0 -13485;traduire;positive;0;0;0;0;0;0 -13486;trafic;negative;0;0;1;0;0;0 -13487;tragédie;negative;0;1;1;0;1;0 -13488;tragique;negative;0;1;1;0;1;0 -13489;trahir;negative;0;0;1;1;1;1 -13490;trahison;negative;0;1;1;1;1;1 -13491;train;positive;0;0;0;0;0;0 -13492;train en marche;positive;0;0;0;0;0;0 -13493;traîneau;positive;1;0;0;0;0;0 -13494;traîner;negative;0;1;1;1;0;1 -13495;traîner le pied;negative;0;0;1;0;0;0 -13496;trait;positive;0;0;0;0;0;0 -13497;traire d union;positive;0;0;0;0;0;0 -13498;traiter;positive;0;0;0;0;0;0 -13499;traitement;positive;0;0;0;0;0;0 -13500;traiter avec condescendance;negative;0;0;0;0;0;1 -13501;traiteur;positive;0;0;0;0;0;0 -13502;traîtrise;negative;0;1;1;1;1;0 -13503;trajectoire;positive;0;0;0;0;0;0 -13504;tram;positive;0;0;0;0;0;0 -13505;tramway;positive;0;0;0;0;0;0 -13506;tranchant;negative;0;1;1;1;0;1 -13507;tranche;negative;0;0;0;0;0;0 -13508;trancher;negative;0;1;0;0;0;0 -13509;tranquille;positive;0;0;1;0;0;0 -13510;tranquillement;positive;1;0;0;0;0;0 -13511;tranquillité;positive;0;1;1;0;0;0 -13512;transatlantique;positive;0;0;0;0;0;0 -13513;transcendance;positive;0;0;0;0;1;0 -13514;transcender;positive;0;0;0;0;0;0 -13515;transcendantal;positive;0;0;0;0;0;0 -13516;transcendant;positive;0;0;0;0;0;0 -13517;transcendentaux;positive;0;0;0;0;0;0 -13518;transcripteur;positive;0;0;0;0;0;0 -13519;transcription;positive;0;0;0;0;0;0 -13520;transcrire;positive;0;0;0;0;0;0 -13521;transe;negative;0;1;0;0;0;0 -13522;transférer;positive;0;0;0;0;0;0 -13523;transfert;positive;0;0;0;0;0;0 -13524;transfert de propriété;positive;0;0;0;0;0;0 -13525;transformation;negative;0;1;1;0;0;0 -13526;transformer;positive;0;0;0;0;0;0 -13527;transfusion;positive;0;0;0;0;0;0 -13528;transgression;negative;0;1;1;1;0;0 -13529;transir;positive;0;0;0;0;0;0 -13530;transiter;positive;0;0;0;0;0;0 -13531;transition;positive;0;0;0;0;0;0 -13532;transitoire;negative;0;0;1;0;1;0 -13533;translocation;positive;0;0;0;0;0;0 -13534;translucide;negative;0;1;1;0;0;0 -13535;transmettre;positive;0;0;0;0;0;0 -13536;transmissible;negative;0;1;0;0;0;0 -13537;transmission;positive;0;0;0;0;0;0 -13538;transmutation;positive;0;0;0;0;0;0 -13539;transparence;positive;0;0;0;0;0;0 -13540;transparent;positive;0;0;0;0;0;0 -13541;transpercer;negative;0;1;1;1;0;0 -13542;transpirer;negative;0;0;0;0;0;1 -13543;transpiration;negative;0;1;0;0;0;1 -13544;transplantation;positive;0;0;0;0;0;0 -13545;transplanter;positive;0;0;0;0;0;0 -13546;transport;positive;0;0;0;0;0;0 -13547;transport maritime;positive;0;0;0;0;0;0 -13548;transport routier;positive;0;0;0;0;0;0 -13549;transporter;positive;0;0;0;0;0;0 -13550;transporteur;positive;0;0;0;0;0;0 -13551;transposer;positive;0;0;0;0;0;0 -13552;transposition;positive;0;0;0;0;0;0 -13553;transversal;negative;0;0;0;0;0;0 -13554;transversale;negative;0;0;0;0;0;0 -13555;trapu;negative;0;0;0;0;0;0 -13556;traquer;negative;0;1;0;0;0;0 -13557;traumatique;negative;0;1;1;1;1;0 -13558;traumatiser;negative;0;1;1;1;1;0 -13559;traumatisant;negative;0;1;1;1;1;0 -13560;travail;positive;0;0;0;0;1;0 -13561;travail de bureau travail admi;positive;0;0;0;0;0;0 -13562;travail pénible;negative;0;0;1;0;0;1 -13563;travail préparatoire;positive;0;0;0;0;0;0 -13564;travailler;positive;0;0;0;0;0;0 -13565;travailler dur;positive;0;0;0;0;1;0 -13566;travailler en indépendant;positive;0;0;0;0;0;0 -13567;travailleur;positive;0;0;0;0;0;0 -13568;traverser;positive;0;0;0;0;0;0 -13569;traversier;positive;0;0;0;0;0;0 -13570;travestir;negative;0;1;1;1;0;1 -13571;trébucher;negative;0;1;0;0;1;0 -13572;trèfle;positive;0;0;0;0;0;0 -13573;treillage;positive;0;0;0;0;0;0 -13574;treillis;negative;0;0;0;0;0;0 -13575;treize;positive;0;0;0;0;0;0 -13576;treizième;negative;0;1;0;0;0;0 -13577;trek;positive;0;0;0;0;0;0 -13578;tremblant;negative;0;1;0;1;0;0 -13579;tremblante;negative;0;1;1;1;0;0 -13580;tremblement;negative;0;1;1;1;1;0 -13581;tremblement de terre;negative;0;1;1;1;1;0 -13582;trembler;negative;0;1;0;0;1;0 -13583;trémie;positive;0;0;0;0;0;0 -13584;trempage;negative;0;0;1;0;0;1 -13585;tremper;negative;0;0;1;0;0;1 -13586;trémpée;negative;0;0;0;0;0;1 -13587;trépas;negative;0;1;1;0;0;0 -13588;trépied;positive;0;0;0;0;0;0 -13589;très courant;positive;0;0;0;0;0;0 -13590;très éprouver;negative;0;0;1;0;0;0 -13591;très facile;positive;1;0;0;0;0;0 -13592;très intelligent;positive;0;0;0;0;0;0 -13593;très long;negative;0;0;0;0;0;0 -13594;très longue;negative;0;0;0;0;0;0 -13595;très peupler;negative;0;0;0;0;0;0 -13596;trésor;positive;0;0;0;0;0;0 -13597;trésorerie;positive;0;0;0;0;0;0 -13598;trésorier;positive;0;0;0;0;0;0 -13599;tressaillir;negative;0;1;1;1;1;1 -13600;tresse;positive;0;0;0;0;0;0 -13601;tresser;positive;0;0;0;0;0;0 -13602;treuil;positive;0;0;0;0;0;0 -13603;trêve;positive;0;0;0;0;0;0 -13604;tri;positive;0;0;0;0;0;0 -13605;triade;positive;0;0;0;0;0;0 -13606;trial;negative;0;1;0;1;0;0 -13607;triangle;positive;0;0;0;0;0;0 -13608;triangulaire;positive;0;0;0;0;0;0 -13609;tribord;positive;0;0;0;0;0;0 -13610;tribu;positive;0;0;0;0;0;0 -13611;tribulation;negative;0;1;1;0;0;0 -13612;tribun;positive;0;0;0;0;0;0 -13613;tribunal;positive;0;1;0;1;0;1 -13614;tribune;positive;0;0;0;0;0;0 -13615;tribut;negative;0;0;1;0;0;0 -13616;tricher;negative;0;0;1;1;1;1 -13617;tricherie;negative;0;0;0;1;0;1 -13618;tricot;positive;0;0;0;0;0;0 -13619;tricoter;positive;0;0;0;0;0;0 -13620;tricycle;positive;0;0;0;0;0;0 -13621;trident;positive;0;0;0;0;0;0 -13622;trier;positive;0;0;0;0;0;0 -13623;trieur;positive;0;0;0;0;0;0 -13624;trieuse;positive;0;0;0;0;0;0 -13625;trigo;positive;0;0;0;0;0;0 -13626;trigone;positive;0;0;0;0;0;0 -13627;trigonométrie;positive;0;0;0;0;0;0 -13628;trimballer;negative;0;0;0;0;0;0 -13629;trimestre;positive;0;0;0;0;0;0 -13630;trinité;positive;0;0;0;0;0;0 -13631;trio;positive;0;0;0;0;0;0 -13632;triomphant;positive;0;0;0;0;0;0 -13633;triomphe;positive;1;0;0;0;0;0 -13634;triompher;positive;1;0;0;0;0;0 -13635;tripartite;positive;0;0;0;0;0;0 -13636;tripe;positive;0;0;0;1;0;0 -13637;triple;positive;0;0;0;0;0;0 -13638;tripotage;negative;0;1;0;1;0;1 -13639;tripoter;negative;0;1;0;1;0;1 -13640;triste;negative;0;1;1;0;0;0 -13641;triste notoriété;negative;0;1;1;1;0;1 -13642;tristement;negative;0;0;1;0;0;1 -13643;tristesse;negative;0;1;1;0;0;0 -13644;tritium;positive;0;0;0;0;0;0 -13645;troc;positive;0;0;0;0;0;0 -13646;trois foi|fois;positive;0;0;0;0;0;0 -13647;troisième;positive;0;0;0;0;0;0 -13648;troll;negative;0;1;0;1;0;1 -13649;trombone;positive;0;0;0;0;0;0 -13650;tromper;negative;0;0;1;0;0;1 -13651;trompe;positive;0;0;0;0;0;0 -13652;trompette;positive;0;0;0;0;0;0 -13653;trompettiste;positive;0;0;0;0;0;0 -13654;tronc;negative;0;0;0;0;0;0 -13655;trône;positive;0;0;0;0;0;0 -13656;tronquer;negative;0;1;1;1;0;0 -13657;trop diluer;negative;0;0;0;0;0;1 -13658;trop longue;negative;0;0;1;0;0;0 -13659;trop payer|payer;negative;0;0;0;0;0;0 -13660;trophée;positive;0;0;0;0;1;0 -13661;tropical;positive;0;0;0;0;0;0 -13662;troquer;positive;0;0;0;0;0;0 -13663;trot;positive;0;0;0;0;0;0 -13664;trotter;positive;0;0;0;0;0;0 -13665;trottiner;positive;0;0;0;0;0;0 -13666;trottoir;positive;0;0;0;0;0;0 -13667;trou;negative;0;1;1;0;0;0 -13668;trou de serrure;positive;0;0;0;0;0;0 -13669;trou du cul;negative;0;0;0;1;0;1 -13670;troubler;negative;0;0;0;1;0;0 -13671;trouer;negative;0;1;1;0;0;0 -13672;troupe;positive;0;0;0;0;0;0 -13673;troupeau;negative;0;1;0;1;0;0 -13674;trousse;positive;0;0;0;0;0;0 -13675;trouver;positive;0;0;0;0;0;0 -13676;truc;negative;0;1;0;0;0;0 -13677;truelle;negative;0;0;0;0;0;0 -13678;truie;negative;0;0;0;0;0;1 -13679;truisme;negative;0;0;0;0;0;0 -13680;truite;negative;0;0;0;0;0;1 -13681;truquer;negative;0;0;0;0;0;0 -13682;tsar;positive;0;0;0;0;0;0 -13683;tuer;negative;0;1;1;1;0;0 -13684;tube;positive;0;0;0;0;0;0 -13685;tube couder;positive;0;0;0;0;0;0 -13686;tubulaire;positive;0;0;0;0;0;0 -13687;tubule;positive;0;0;0;0;0;0 -13688;tubulure;negative;0;0;0;0;0;0 -13689;tuerie;negative;0;1;1;1;0;0 -13690;tufté;negative;0;0;0;0;0;1 -13691;tuile;positive;0;0;0;0;0;0 -13692;tulipe;positive;0;0;0;0;0;0 -13693;tumeur;negative;0;1;1;0;0;0 -13694;tumulte;negative;0;1;0;1;1;0 -13695;tunique;positive;0;0;0;0;0;0 -13696;tunnel;negative;0;1;0;0;0;0 -13697;turban;positive;0;0;0;0;0;0 -13698;turbidité;negative;0;1;0;0;0;1 -13699;turbine;positive;0;0;0;0;0;0 -13700;turbulence;negative;0;1;0;1;0;0 -13701;turbulent;negative;0;1;0;1;0;0 -13702;turquoise;positive;0;0;0;0;0;0 -13703;tutelle;positive;0;0;0;0;0;0 -13704;tuteur;positive;0;0;0;0;0;0 -13705;tuyau;positive;0;0;0;0;0;0 -13706;tva;negative;0;0;0;0;0;0 -13707;type;negative;0;0;0;0;0;0 -13708;typhon;negative;0;1;0;0;0;0 -13709;typiquement;positive;0;0;0;0;0;0 -13710;typographie;positive;0;0;0;0;0;0 -13711;tyran;negative;0;1;1;1;0;1 -13712;tyrannie;negative;0;1;1;1;0;1 -13713;tyrannique;negative;0;1;1;1;0;1 -13714;tyranniser;negative;0;1;0;1;0;0 -13715;ubiquité;positive;0;0;0;0;0;0 -13716;ulcère;negative;0;1;1;1;0;1 -13717;ultérieur;negative;0;0;1;0;0;0 -13718;ultérieurement;negative;0;0;0;0;0;0 -13719;ultériorité;negative;0;0;0;0;0;0 -13720;ultimatum;negative;0;1;0;1;1;0 -13721;ultraviolet;positive;0;0;0;0;0;0 -13722;ultraviolettes;positive;0;0;0;0;0;0 -13723;un petit coup;positive;0;0;0;0;0;0 -13724;un peu;positive;0;0;0;0;0;0 -13725;unanime;positive;0;0;0;0;0;0 -13726;unanimement;positive;0;0;0;0;0;0 -13727;unanimité;positive;0;0;0;0;0;0 -13728;unir;positive;0;0;0;0;0;0 -13729;unification;positive;0;0;0;0;0;0 -13730;uniforme;positive;0;0;0;0;0;0 -13731;uniformément;positive;0;0;0;0;0;0 -13732;uniformiser;positive;0;0;0;0;0;0 -13733;union;positive;0;0;0;0;0;0 -13734;unique;negative;0;0;0;0;1;0 -13735;unisson;positive;0;0;0;0;0;0 -13736;unitaire;positive;0;0;0;0;0;0 -13737;unité;positive;0;0;0;0;0;0 -13738;univers;positive;0;0;0;0;0;0 -13739;universalité;positive;0;0;0;0;0;0 -13740;universitaire;positive;0;0;0;0;0;0 -13741;université;positive;0;0;0;0;0;0 -13742;univoque;positive;0;0;0;0;0;0 -13743;uranium;positive;0;0;0;0;0;0 -13744;urbain;positive;0;0;0;0;0;0 -13745;urbaine;positive;0;0;0;0;0;0 -13746;urgence;negative;0;1;1;0;1;0 -13747;urne;negative;0;0;1;0;0;0 -13748;usage;positive;0;0;0;0;0;0 -13749;usage abusif;negative;0;1;1;1;0;1 -13750;usage impropre;negative;0;1;1;1;0;0 -13751;usant;negative;0;0;1;0;0;0 -13752;usine;negative;0;0;0;0;0;0 -13753;ustensile;positive;0;0;0;0;0;0 -13754;usure;negative;0;0;1;0;0;1 -13755;usurper;negative;0;1;1;1;0;1 -13756;utérus;positive;0;0;0;0;0;0 -13757;utile;positive;0;0;0;0;0;0 -13758;utilement;positive;0;0;0;0;0;0 -13759;utilisable;positive;0;0;0;0;0;0 -13760;utilisation;positive;0;0;0;0;0;0 -13761;utiliser;negative;0;0;0;0;0;0 -13762;utilitaire;positive;0;0;0;0;0;0 -13763;utilité;positive;0;0;0;0;0;0 -13764;utopique;positive;0;0;0;0;0;0 -13765;vacance;positive;1;0;0;0;0;0 -13766;vacant;negative;0;0;1;0;0;0 -13767;vacarme;negative;0;1;0;1;1;1 -13768;vaccin;positive;0;0;0;0;0;0 -13769;vaccination;positive;0;0;0;0;0;0 -13770;vache;positive;0;0;0;0;0;0 -13771;vacuolaire;positive;0;0;0;0;0;0 -13772;vacuole;positive;0;0;0;0;0;0 -13773;vagabond;negative;0;0;1;0;0;1 -13774;vagabondage;negative;0;0;1;0;0;0 -13775;vague;negative;0;1;1;1;1;0 -13776;vague idée;positive;0;0;0;0;0;0 -13777;vaincre;positive;1;0;0;0;0;0 -13778;vainement;negative;0;0;1;0;0;1 -13779;vainqueur;positive;0;0;0;0;1;0 -13780;vairon;positive;0;0;0;0;0;0 -13781;vaisseau;positive;0;0;0;0;0;0 -13782;vaisseau amiral;positive;0;0;0;0;0;0 -13783;vaisselle;positive;0;0;0;0;0;0 -13784;valet;positive;0;0;0;0;0;0 -13785;valeur;positive;0;0;0;0;0;0 -13786;validité;positive;0;1;0;0;0;0 -13787;vallée;positive;0;0;0;0;0;0 -13788;vallon;positive;0;0;0;0;0;0 -13789;vallonner;positive;0;0;0;0;0;0 -13790;valoir;positive;0;0;0;0;0;0 -13791;valoriser;positive;0;0;0;0;0;0 -13792;valse;positive;0;0;0;0;0;0 -13793;valser;positive;0;0;0;0;0;0 -13794;vamp;positive;0;0;0;0;0;0 -13795;vampire;negative;0;1;0;1;0;1 -13796;van;positive;0;0;0;0;0;0 -13797;vanille;positive;0;0;0;0;0;0 -13798;vanité;negative;0;0;0;1;0;1 -13799;vaniteux;negative;0;0;0;1;0;1 -13800;vannage;positive;0;0;0;0;0;0 -13801;vanne;positive;0;0;0;0;0;0 -13802;vantardise;negative;0;0;0;0;0;0 -13803;vanter;negative;0;0;0;0;0;0 -13804;vapeur;positive;0;0;0;0;0;0 -13805;vaporiser;positive;0;0;0;0;0;0 -13806;vara;positive;0;0;0;0;0;0 -13807;variable;negative;0;0;0;0;1;0 -13808;variance;negative;0;0;0;0;0;0 -13809;variation;negative;0;0;0;0;0;0 -13810;varicelle;negative;0;1;1;0;0;1 -13811;varier;positive;0;0;0;0;0;0 -13812;variété;positive;0;0;0;0;0;0 -13813;vasculaire;positive;0;0;0;0;0;0 -13814;vase;negative;0;1;0;0;0;1 -13815;vasistas;positive;0;0;0;0;0;0 -13816;vaste;positive;0;0;0;0;0;0 -13817;vaudeville;positive;0;0;0;0;0;0 -13818;vaudou;negative;0;1;0;0;0;1 -13819;vaurien;negative;0;1;0;1;0;1 -13820;vautour;negative;0;1;0;0;0;1 -13821;veau;positive;0;0;1;0;0;0 -13822;vecteur;positive;0;0;0;0;0;0 -13823;vedette;positive;0;0;0;0;0;0 -13824;vega;positive;0;0;0;0;0;0 -13825;véga;positive;0;0;0;0;0;0 -13826;végétal;positive;0;0;0;0;0;0 -13827;végétarisme;positive;0;0;0;0;0;0 -13828;végétatif;negative;0;0;1;0;0;1 -13829;végétation;positive;0;0;0;0;0;0 -13830;véhément;negative;0;1;0;1;0;0 -13831;véhicule;positive;0;0;0;0;0;0 -13832;véhiculer;positive;0;0;0;0;0;0 -13833;veille;positive;0;0;0;0;0;0 -13834;veiller;positive;0;0;0;0;0;0 -13835;veilleur;positive;0;0;0;0;0;0 -13836;veine;positive;0;0;0;0;0;1 -13837;veiner;negative;0;0;0;0;0;1 -13838;veineux;negative;0;0;0;0;0;1 -13839;vélin;positive;0;0;0;0;0;0 -13840;vélo;positive;0;0;0;0;0;0 -13841;vélocité;positive;0;0;0;0;0;0 -13842;velours;positive;0;0;0;0;0;0 -13843;velours côtelé;positive;0;0;0;0;0;0 -13844;velouter;positive;0;0;0;0;0;0 -13845;venaison;negative;0;0;0;0;0;1 -13846;vendanger;positive;0;0;0;0;0;0 -13847;vendetta;negative;0;1;1;1;0;0 -13848;vendeur ambulant;positive;0;0;0;0;0;0 -13849;vendre;positive;0;0;0;0;0;0 -13850;vendre au enchère;negative;0;0;0;0;0;0 -13851;vénérable;positive;0;0;1;0;0;0 -13852;vénération;positive;0;0;0;0;0;0 -13853;vénérer;positive;0;0;0;0;0;0 -13854;vengeance;negative;0;1;0;1;1;0 -13855;venin;negative;0;1;0;1;0;1 -13856;vent;positive;0;1;1;1;0;1 -13857;vente;positive;0;0;0;0;0;0 -13858;vente au détail;positive;0;0;0;0;0;0 -13859;vente au enchère;negative;0;0;0;0;0;0 -13860;venteux;negative;0;1;0;0;1;0 -13861;ventilateur;positive;0;0;0;0;0;0 -13862;ventilation;positive;0;0;0;0;0;0 -13863;ventouse;positive;0;0;0;1;0;0 -13864;ventre;positive;0;0;0;0;0;0 -13865;ventricule;positive;0;0;0;0;0;0 -13866;ver;negative;0;0;0;0;1;1 -13867;véracité;positive;0;0;0;0;1;0 -13868;véranda;positive;0;0;0;0;0;0 -13869;verbal;positive;0;0;0;0;0;0 -13870;verbiage;positive;0;0;0;0;0;0 -13871;verbosité;negative;0;0;0;0;0;0 -13872;verdâtre;negative;0;0;0;0;0;1 -13873;verdict;positive;0;1;0;0;0;0 -13874;verdoyer;positive;0;0;0;0;0;0 -13875;verdoyant;positive;0;0;0;0;0;0 -13876;verger;positive;0;0;0;0;0;0 -13877;véridique;positive;0;0;0;0;0;0 -13878;vérificateur;positive;0;0;0;0;0;0 -13879;vérification;positive;0;0;0;0;0;0 -13880;vérifier;positive;0;0;0;0;0;0 -13881;véritablement;positive;0;0;0;0;0;0 -13882;vérité;positive;0;0;0;0;0;0 -13883;vermifuger;negative;0;0;0;0;1;1 -13884;vermine;negative;0;1;0;1;0;1 -13885;vernaculaire;positive;0;0;0;0;0;0 -13886;vernal;positive;1;0;0;0;0;0 -13887;vérole;negative;0;1;0;0;0;1 -13888;véronique;positive;0;0;0;0;0;0 -13889;verre;positive;0;0;0;0;0;0 -13890;verrerie;positive;0;0;0;0;0;0 -13891;verrou;positive;0;0;0;0;0;0 -13892;verrouiller;positive;0;0;0;0;0;0 -13893;verrue;negative;0;0;0;0;0;1 -13894;vers l extérieur;positive;0;0;0;0;0;0 -13895;vers l intérieur;positive;0;0;0;0;0;0 -13896;vers le haut;positive;0;0;0;0;0;0 -13897;versatilité;negative;0;1;0;1;1;0 -13898;verser;positive;0;0;0;0;0;0 -13899;verser dans un tasse;positive;0;1;1;0;0;1 -13900;verser un pot de vin à;negative;0;0;0;0;0;0 -13901;verset;positive;0;0;0;0;0;0 -13902;version;positive;0;0;0;0;0;0 -13903;verso;negative;0;0;0;0;0;0 -13904;vert;positive;0;0;0;0;0;0 -13905;vert jade;positive;0;0;0;0;0;0 -13906;vertebral;positive;0;0;0;0;0;0 -13907;vertébral;positive;0;0;0;0;0;0 -13908;vertèbre;positive;0;0;0;0;0;0 -13909;vertical;positive;0;0;0;0;0;0 -13910;verticalement;positive;0;0;0;0;0;0 -13911;vertige;negative;0;1;0;0;1;0 -13912;vertu;positive;0;0;0;0;0;0 -13913;verve;positive;1;0;0;0;0;0 -13914;vésiculaire;negative;0;0;0;0;0;1 -13915;vésicule;positive;0;0;0;0;0;0 -13916;vessie;negative;0;0;0;0;0;1 -13917;vestibule;positive;0;0;0;0;0;0 -13918;vêtement;positive;0;0;0;0;0;0 -13919;vétéran;positive;0;0;0;0;0;0 -13920;vétérinaire;positive;0;0;0;0;0;0 -13921;veto;negative;0;0;0;1;0;0 -13922;vétuste;negative;0;0;0;0;0;1 -13923;veuf;negative;0;0;1;0;0;0 -13924;veuf|veuve;negative;0;0;1;0;0;0 -13925;viabilité;positive;0;0;0;0;0;0 -13926;viable;positive;0;0;0;0;0;0 -13927;viaduc;positive;0;0;0;0;0;0 -13928;viager;positive;0;0;0;0;0;0 -13929;vialins;negative;0;1;0;0;1;0 -13930;viande;positive;0;0;0;0;0;0 -13931;viande de porc;positive;0;0;0;0;0;0 -13932;vibrer;positive;0;0;1;0;0;0 -13933;vibrant;positive;0;0;1;0;0;0 -13934;vibration;negative;0;1;0;0;1;0 -13935;vibratoire;positive;0;0;0;0;0;0 -13936;vibreur sonore;positive;0;0;0;0;0;0 -13937;vicaire;positive;0;0;0;0;0;0 -13938;vice;negative;0;0;0;1;0;1 -13939;victime;negative;0;1;1;1;0;0 -13940;victimiser;negative;0;1;1;1;1;1 -13941;victoire;positive;0;0;0;0;0;0 -13942;victoria;positive;0;0;0;0;0;0 -13943;victuaille;positive;0;0;0;0;0;0 -13944;vide;negative;0;1;1;0;0;1 -13945;vider;negative;0;1;1;0;0;0 -13946;vie;positive;1;0;0;0;0;0 -13947;vieux âge;negative;0;0;0;0;0;0 -13948;vieux fille;negative;0;1;1;0;0;0 -13949;vieux sorcier;negative;0;1;0;1;0;1 -13950;vieillir;negative;0;1;1;0;0;0 -13951;vieillissement;negative;0;0;0;0;0;0 -13952;vieillot;negative;0;0;0;0;0;1 -13953;vierge;negative;0;1;1;0;0;0 -13954;vigilance;positive;0;1;0;0;1;0 -13955;vigiler;positive;0;1;0;1;1;0 -13956;vigilant;positive;0;1;0;1;1;0 -13957;vigile;positive;0;0;0;0;0;0 -13958;vigne;positive;0;0;0;0;0;0 -13959;vignette;positive;0;0;0;0;0;0 -13960;vignoble;positive;0;0;0;0;0;0 -13961;vigueur;positive;1;0;0;0;0;0 -13962;viking;negative;0;1;0;0;0;0 -13963;vil;negative;0;1;0;1;0;1 -13964;vilain;negative;0;1;0;0;1;0 -13965;villa;positive;0;0;0;0;0;0 -13966;village;positive;0;0;0;0;0;0 -13967;ville;positive;0;0;0;0;0;0 -13968;vin;positive;0;0;0;0;0;0 -13969;vinaigre;negative;0;1;0;0;0;1 -13970;vinaigrette;positive;0;0;0;0;0;0 -13971;vingt;positive;0;0;0;0;0;0 -13972;vingtième;positive;0;0;0;0;0;0 -13973;viol;negative;0;1;1;1;0;1 -13974;violation de propriété;negative;0;1;0;1;0;0 -13975;violemment;negative;0;1;1;1;0;1 -13976;violence;negative;0;1;1;1;0;0 -13977;violent;negative;0;1;0;1;1;1 -13978;violer;negative;0;1;1;1;0;1 -13979;violet;positive;0;0;0;0;0;0 -13980;violon;positive;0;0;0;0;0;0 -13981;violoniste;positive;0;0;0;0;0;0 -13982;vipère;negative;0;1;1;1;0;1 -13983;virage;positive;0;1;0;0;0;0 -13984;virer;negative;0;1;0;0;1;0 -13985;virer de bord;negative;0;1;0;0;1;0 -13986;virginité;positive;0;0;0;0;0;0 -13987;virgule;positive;0;0;0;0;0;0 -13988;viril;positive;0;0;0;0;0;0 -13989;virilité;positive;0;0;0;0;0;0 -13990;virologie;negative;0;0;0;0;0;0 -13991;virtuose;positive;0;0;0;0;0;0 -13992;virulence;negative;0;1;0;1;0;0 -13993;virus;negative;0;1;0;0;0;1 -13994;virus de l herpès;negative;0;0;0;0;0;1 -13995;vis;positive;0;0;0;1;0;0 -13996;visa;positive;0;0;0;0;0;0 -13997;visage;positive;0;0;0;0;0;0 -13998;viscosité;negative;0;0;0;0;0;1 -13999;viser;positive;0;0;0;0;0;0 -14000;visibilité;positive;0;0;0;0;0;0 -14001;visible;positive;0;0;0;0;0;0 -14002;visiblement;positive;0;0;0;0;0;0 -14003;visière;positive;0;0;0;0;1;0 -14004;vision;positive;0;0;0;0;1;0 -14005;visionnaire;positive;0;0;0;0;0;0 -14006;visiter;positive;0;0;0;0;0;0 -14007;visitation;positive;0;0;0;0;0;0 -14008;visite;positive;0;0;0;0;0;0 -14009;visser;negative;0;0;0;1;0;0 -14010;visualiser;positive;0;0;0;0;0;0 -14011;vital;positive;0;0;0;0;0;0 -14012;vitalité;positive;0;0;0;0;0;0 -14013;vitesse;negative;0;1;0;0;0;0 -14014;vitre;positive;0;0;0;0;0;0 -14015;vitreux;positive;0;0;0;0;0;0 -14016;vitrine;positive;0;0;0;0;0;0 -14017;vivant;positive;0;0;0;0;0;0 -14018;vivre|vivres;positive;0;0;0;0;0;0 -14019;voûte;positive;0;0;0;0;0;0 -14020;vocabulaire;positive;0;0;0;0;0;0 -14021;vocal;positive;0;0;0;0;0;0 -14022;vocation;positive;0;0;0;0;0;0 -14023;vogue;positive;0;0;0;0;0;0 -14024;voguer;positive;0;0;0;0;0;0 -14025;voie;positive;0;0;0;0;0;0 -14026;voie ferré;positive;0;0;0;0;0;0 -14027;voile;negative;0;1;1;0;0;0 -14028;voiler;negative;0;1;1;0;0;0 -14029;voisinage;positive;0;0;0;0;0;0 -14030;voiture;positive;0;0;0;0;0;0 -14031;voiturier;positive;0;0;0;0;0;0 -14032;voix;positive;0;0;0;0;0;0 -14033;vol;negative;0;1;1;1;1;1 -14034;vol à l étalage;negative;0;1;0;1;1;1 -14035;volage;negative;0;0;0;1;0;1 -14036;volaille;positive;0;1;0;0;0;0 -14037;volant;positive;0;1;0;0;0;0 -14038;voler moteur;positive;0;0;0;0;0;0 -14039;volante;positive;0;1;0;0;0;0 -14040;volatilité;negative;0;1;0;1;1;0 -14041;volcan;negative;0;1;0;0;1;0 -14042;volcanique;negative;0;1;0;0;1;0 -14043;voler;negative;0;1;1;1;1;0 -14044;voler en éclat;negative;0;1;1;1;1;0 -14045;volet;negative;0;0;0;0;0;0 -14046;volière;positive;0;0;0;0;0;0 -14047;volontaire;positive;0;0;0;0;0;0 -14048;volontairement;positive;0;0;0;0;0;0 -14049;volontariat;positive;0;0;0;0;0;0 -14050;volonté;positive;0;0;0;0;0;0 -14051;volontiers;positive;0;0;0;0;0;0 -14052;voltige;negative;0;1;1;0;0;0 -14053;voltmètre;positive;0;0;0;0;0;0 -14054;volume;negative;0;0;0;1;0;0 -14055;volumineux;negative;0;1;0;0;0;0 -14056;vomir;negative;0;0;0;0;0;1 -14057;vomissement;negative;0;0;0;0;0;1 -14058;vorace;negative;0;1;1;1;0;0 -14059;vortex;negative;0;1;0;0;1;0 -14060;votales;positive;0;0;0;0;0;0 -14061;votant;positive;0;0;0;0;0;0 -14062;vote;positive;0;0;1;1;1;0 -14063;voter;positive;0;0;1;1;1;0 -14064;voter pour;positive;0;0;0;0;0;0 -14065;votif;positive;0;0;0;0;0;0 -14066;vouer;positive;0;0;0;0;0;0 -14067;vouloir;negative;0;1;1;0;0;0 -14068;voûte;positive;0;1;1;0;0;0 -14069;voûter;negative;0;0;1;0;0;0 -14070;voyage;positive;0;1;0;0;1;0 -14071;voyager;positive;1;0;0;0;0;0 -14072;voyelle;positive;0;0;0;0;0;0 -14073;voyou;negative;0;1;0;1;0;1 -14074;VRAI;positive;0;0;0;0;0;0 -14075;vrai casse tête;negative;0;0;0;1;0;0 -14076;vraisemblance;positive;0;0;0;0;0;0 -14077;vriller;negative;0;0;0;0;0;0 -14078;vrombir;negative;0;1;0;0;1;0 -14079;vrombissement;negative;0;1;0;0;1;0 -14080;vue;positive;0;0;0;0;0;0 -14081;vulgaire;negative;0;0;0;0;0;1 -14082;vulgarité;negative;0;0;1;1;0;1 -14083;vulnérabilité;negative;0;1;1;0;0;0 -14084;vulnérable;negative;0;1;1;0;0;0 -14085;w c;negative;0;0;0;0;0;1 -14086;wagon;positive;0;0;0;0;0;0 -14087;wagon lit;positive;0;0;0;0;0;0 -14088;wapiti;positive;0;0;0;0;0;0 -14089;wc;negative;0;0;0;0;0;1 -14090;web;positive;0;0;0;0;0;0 -14091;whisky;negative;0;0;0;0;0;0 -14092;xénophobie;negative;0;1;0;1;0;0 -14093;xérès;positive;0;0;0;0;0;0 -14094;yacht;positive;0;0;0;0;0;0 -14095;yacht de croisière;positive;0;0;0;0;0;0 -14096;yachting;positive;0;0;0;0;0;0 -14097;yak;negative;0;0;0;0;0;0 -14098;yearling;positive;0;0;0;0;0;0 -14099;yeoman;positive;0;0;0;0;0;0 -14100;yogi;positive;0;0;0;0;0;0 -14101;zap;negative;0;1;0;1;1;0 -14102;zapper;negative;0;1;0;1;1;0 -14103;zèbre;positive;0;0;0;0;0;0 -14104;zébrure;negative;0;0;0;0;0;0 -14105;zèle;positive;0;0;0;0;1;0 -14106;zélé;negative;0;0;0;0;0;0 -14107;zénith;positive;1;0;0;0;0;0 -14108;zephyr;positive;0;0;0;0;0;0 -14109;zéphyr;positive;0;0;0;0;0;0 -14110;zeppelin;positive;0;0;0;0;0;0 -14111;zeste;positive;0;0;0;0;0;0 -14112;zézaiement;negative;0;1;1;1;0;0 -14113;zibeline;positive;0;0;0;0;0;0 -14114;zinzin;negative;0;1;0;0;1;0 -14115;zinzins;negative;0;1;0;0;1;0 -14116;zipper;positive;0;0;0;0;0;0 -14117;zodiaque;positive;0;0;0;0;0;0 -14118;zone;positive;0;0;0;0;0;0 -14119;zoo;positive;0;0;0;0;0;0 -14120;zoologie;positive;0;0;0;0;0;0 -14121;zoologique;positive;0;0;0;0;0;0 -14122;zoom;positive;0;0;0;0;0;0 -14123;zoomer;positive;0;0;0;0;0;0 -14124;zozotement;negative;0;1;1;1;0;0 -14125;zozoter;negative;0;1;1;1;0;0 -14126;merci;positive;1;0;0;0;0;0 -14127;remercier;positive;1;0;0;0;0;0 -14128;remerciment;positive;1;0;0;0;0;0 -14129;moins;negative;0;0;0;0;0;0 diff --git a/config/french_numbers.txt b/config/french_numbers.txt deleted file mode 100644 index 0dea605..0000000 --- a/config/french_numbers.txt +++ /dev/null @@ -1,101 +0,0 @@ -zéro -un -deux -trois -quatre -cinq -six -sept -huit -neuf -dix -onze -douze -treize -quatorze -quinze -seize -dix-sept -dix-huit -dix-neuf -vingt -vingt-et-un -vingt-deux -vingt-trois -vingt-quatre -vingt-cinq -vingt-six -vingt-sept -vingt-huit -vingt-neuf -trente -trente-et-un -trente-deux -trente-trois -trente-quatre -trente-cinq -trente-six -trente-sept -trente-huit -trente-neuf -quarante -quarante-et-un -quarante-deux -quarante-trois -quarante-quatre -quarante-cinq -quarante-six -quarante-sept -quarante-huit -quarante-neuf -cinquante -cinquante-et-un -cinquante-deux -cinquante-trois -cinquante-quatre -cinquante-cinq -cinquante-six -cinquante-sept -cinquante-huit -cinquante-neuf -soixante -soixante-et-un -soixante-deux -soixante-trois -soixante-quatre -soixante-cinq -soixante-six -soixante-sept -soixante-huit -soixante-neuf -soixante-dix -soixante-et-onze -soixante-douze -soixante-treize -soixante-quatorze -soixante-quinze -soixante-seize -soixante-dix-sept -soixante-dix-huit -soixante-dix-neuf -quatre-vingts -quatre-vingt-un -quatre-vingt-deux -quatre-vingt-trois -quatre-vingt-quatre -quatre-vingt-cinq -quatre-vingt-six -quatre-vingt-sept -quatre-vingt-huit -quatre-vingt-neuf -quatre-vingt-dix -quatre-vingt-onze -quatre-vingt-douze -quatre-vingt-treize -quatre-vingt-quatorze -quatre-vingt-quinze -quatre-vingt-seize -quatre-vingt-dix-sept -quatre-vingt-dix-huit -quatre-vingt-dix-neuf -cent diff --git a/config/french_stopwords.txt b/config/french_stopwords.txt deleted file mode 100644 index d482b0a..0000000 --- a/config/french_stopwords.txt +++ /dev/null @@ -1,689 +0,0 @@ -a -abord -absolument -afin -ah -ai -aie -aient -aies -ailleurs -ainsi -ait -allaient -allo -allons -allô -alors -anterieur -anterieure -anterieures -apres -après -as -assez -attendu -au -aucun -aucune -aucuns -aujourd -aujourd'hui -aupres -auquel -aura -aurai -auraient -aurais -aurait -auras -aurez -auriez -aurions -aurons -auront -aussi -autre -autrefois -autrement -autres -autrui -aux -auxquelles -auxquels -avaient -avais -avait -avant -avec -avez -aviez -avions -avoir -avons -ayant -ayez -ayons -b -bah -bas -basee -bat -beau -beaucoup -bien -bigre -bon -boum -bravo -brrr -c -car -ce -ceci -cela -celle -celle-ci -celle-là -celles -celles-ci -celles-là -celui -celui-ci -celui-là -celà -cent -cependant -certain -certaine -certaines -certains -certes -ces -cet -cette -ceux -ceux-ci -ceux-là -chacun -chacune -chaque -cher -chers -chez -chiche -chut -chère -chères -ci -cinq -cinquantaine -cinquante -cinquantième -cinquième -clac -clic -combien -comme -comment -comparable -comparables -compris -concernant -contre -couic -crac -d -da -dans -de -debout -dedans -dehors -deja -delà -depuis -dernier -derniere -derriere -derrière -des -desormais -desquelles -desquels -dessous -dessus -deux -deuxième -deuxièmement -devant -devers -devra -devrait -different -differentes -differents -différent -différente -différentes -différents -dire -directe -directement -dit -dite -dits -divers -diverse -diverses -dix -dix-huit -dix-neuf -dix-sept -dixième -doit -doivent -donc -dont -dos -douze -douzième -dring -droite -du -duquel -durant -dès -début -désormais -e -effet -egale -egalement -egales -eh -elle -elle-même -elles -elles-mêmes -en -encore -enfin -entre -envers -environ -es -essai -est -et -etant -etc -etre -eu -eue -eues -euh -eurent -eus -eusse -eussent -eusses -eussiez -eussions -eut -eux -eux-mêmes -exactement -excepté -extenso -exterieur -eûmes -eût -eûtes -f -fais -faisaient -faisant -fait -faites -façon -feront -fi -flac -floc -fois -font -force -furent -fus -fusse -fussent -fusses -fussiez -fussions -fut -fûmes -fût -fûtes -g -gens -h -ha -haut -hein -hem -hep -hi -ho -holà -hop -hormis -hors -hou -houp -hue -hui -huit -huitième -hum -hurrah -hé -hélas -i -ici -il -ils -importe -j -je -jusqu -jusque -juste -k -l -la -laisser -laquelle -las -le -lequel -les -lesquelles -lesquels -leur -leurs -longtemps -lors -lorsque -lui -lui-meme -lui-même -là -lès -m -ma -maint -maintenant -mais -malgre -malgré -maximale -me -meme -memes -merci -mes -mien -mienne -miennes -miens -mille -mince -mine -minimale -moi -moi-meme -moi-même -moindres -moins -mon -mot -moyennant -multiple -multiples -même -mêmes -n -na -naturel -naturelle -naturelles -ne -neanmoins -necessaire -necessairement -neuf -neuvième -ni -nombreuses -nombreux -nommés -non -nos -notamment -notre -nous -nous-mêmes -nouveau -nouveaux -nul -néanmoins -nôtre -nôtres -o -oh -ohé -ollé -olé -on -ont -onze -onzième -ore -ou -ouf -ouias -oust -ouste -outre -ouvert -ouverte -ouverts -o| -où -p -paf -pan -par -parce -parfois -parle -parlent -parler -parmi -parole -parseme -partant -particulier -particulière -particulièrement -pas -passé -pendant -pense -permet -personne -personnes -peu -peut -peuvent -peux -pff -pfft -pfut -pif -pire -pièce -plein -plouf -plupart -plus -plusieurs -plutôt -possessif -possessifs -possible -possibles -pouah -pour -pourquoi -pourrais -pourrait -pouvait -prealable -precisement -premier -première -premièrement -pres -probable -probante -procedant -proche -près -psitt -pu -puis -puisque -pur -pure -q -qu -quand -quant -quant-à-soi -quanta -quarante -quatorze -quatre -quatre-vingt -quatrième -quatrièmement -que -quel -quelconque -quelle -quelles -quelqu'un -quelque -quelques -quels -qui -quiconque -quinze -quoi -quoique -r -rare -rarement -rares -relative -relativement -remarquable -rend -rendre -restant -reste -restent -restrictif -retour -revoici -revoilà -rien -s -sa -sacrebleu -sait -sans -sapristi -sauf -se -sein -seize -selon -semblable -semblaient -semble -semblent -sent -sept -septième -sera -serai -seraient -serais -serait -seras -serez -seriez -serions -serons -seront -ses -seul -seule -seulement -si -sien -sienne -siennes -siens -sinon -six -sixième -soi -soi-même -soient -sois -soit -soixante -sommes -son -sont -sous -souvent -soyez -soyons -specifique -specifiques -speculatif -stop -strictement -subtiles -suffisant -suffisante -suffit -suis -suit -suivant -suivante -suivantes -suivants -suivre -sujet -superpose -sur -surtout -t -ta -tac -tandis -tant -tardive -te -tel -telle -tellement -telles -tels -tenant -tend -tenir -tente -tes -tic -tien -tienne -tiennes -tiens -toc -toi -toi-même -ton -touchant -toujours -tous -tout -toute -toutefois -toutes -treize -trente -tres -trois -troisième -troisièmement -trop -très -tsoin -tsouin -tu -té -u -un -une -unes -uniformement -unique -uniques -uns -v -va -vais -valeur -vas -vers -via -vif -vifs -vingt -vivat -vive -vives -vlan -voici -voie -voient -voilà -vont -vos -votre -vous -vous-mêmes -vu -vé -vôtre -vôtres -w -x -y -z -zut -à -â -ça -ès -étaient -étais -était -étant -état -étiez -étions -été -étée -étées -étés -êtes -être -ô From 0f7012d5853d5673931bd9697cfb8db363b87f8a Mon Sep 17 00:00:00 2001 From: Rafaelle AYGALENQ <rafaelle.aygalenq@artefact.com> Date: Tue, 26 Jan 2021 10:23:25 +0100 Subject: [PATCH 446/496] rebase master and fix conflicts --- config/__init__.py | 1 - nautilus_nlp/preprocessor.py | 70 ----------------------------------- preprocessing/preprocessor.py | 5 +++ 3 files changed, 5 insertions(+), 71 deletions(-) delete mode 100644 nautilus_nlp/preprocessor.py diff --git a/config/__init__.py b/config/__init__.py index 7643ec5..d46139b 100644 --- a/config/__init__.py +++ b/config/__init__.py @@ -15,4 +15,3 @@ # You should have received a copy of the GNU Lesser General Public License # along with this program; if not, write to the Free Software Foundation, # Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. -from nautilus_nlp.preprocessor import Preprocessor diff --git a/nautilus_nlp/preprocessor.py b/nautilus_nlp/preprocessor.py deleted file mode 100644 index 8078fc2..0000000 --- a/nautilus_nlp/preprocessor.py +++ /dev/null @@ -1,70 +0,0 @@ -from typing import List, Callable - -from sklearn.pipeline import Pipeline -from sklearn.preprocessing import FunctionTransformer - -from nautilus_nlp.preprocessing.social_preprocess import (remove_html_tags, remove_mentions, remove_emoji, - remove_hashtag) -from nautilus_nlp.preprocessing.text_preprocess import normalize_whitespace, remove_eol_characters, fix_bad_unicode - - -class Preprocessor(): - def __init__( - self): - """ - Initialize preprocessor object to apply all text transformation - """ - self.__operations = [] - self.pipeline = None - - def pipe(self, operation: Callable): - """ - Add an operation to pipe in the preprocessor - - Parameters - ---------- - operation : callable - text preprocessing function - """ - self.__operations.append(operation) - - @staticmethod - def build_pipeline(operation_list: List[Callable]) -> Pipeline: - """ - Build sklearn pipeline from a operation list - - Parameters - ---------- - operation_list : iterable - list of __operations of preprocessing - - Returns - ------- - sklearn.pipeline.Pipeline - """ - return Pipeline( - steps=[ - (operation.__name__, FunctionTransformer(operation)) - for operation in operation_list]) - - - def run(self, text: str) -> str: - """ - Apply pipeline to text - - Parameters - ---------- - text : string - text to preprocess - - Returns - ------- - string - """ - operations = self.__operations - if operations == []: - operations = (remove_html_tags, remove_mentions, remove_emoji, remove_hashtag, - remove_eol_characters, fix_bad_unicode, normalize_whitespace) - self.pipeline = self.build_pipeline(operations) - text = self.pipeline.fit_transform(text) - return text diff --git a/preprocessing/preprocessor.py b/preprocessing/preprocessor.py index 41ec77c..5cdcac0 100644 --- a/preprocessing/preprocessor.py +++ b/preprocessing/preprocessor.py @@ -20,6 +20,7 @@ def __init__( def pipe(self, operation: Callable): """ Add an operation to pipe in the preprocessor + Parameters ---------- operation : callable @@ -31,10 +32,12 @@ def pipe(self, operation: Callable): def build_pipeline(operation_list: List[Callable]) -> Pipeline: """ Build sklearn pipeline from a operation list + Parameters ---------- operation_list : iterable list of __operations of preprocessing + Returns ------- sklearn.pipeline.Pipeline @@ -48,10 +51,12 @@ def build_pipeline(operation_list: List[Callable]) -> Pipeline: def run(self, text: str) -> str: """ Apply pipeline to text + Parameters ---------- text : string text to preprocess + Returns ------- string From c0ffe8f532c611d377164f6a792ecdd955e9ede0 Mon Sep 17 00:00:00 2001 From: Rafaelle AYGALENQ <rafaelle.aygalenq@artefact.com> Date: Tue, 26 Jan 2021 10:54:57 +0100 Subject: [PATCH 447/496] rename main folder and update readme --- .github/workflows/ci_actions.yml | 4 +- README.md | 39 ++++++++----------- {preprocessing => nautilus_nlp}/__init__.py | 2 +- .../augmentation/text_augmentation.py | 0 .../classic/preprocess.py | 0 .../preprocessor.py | 4 +- .../social/preprocess.py | 2 +- .../token/preprocess.py | 0 .../token/tokenizer.py | 0 tests/test_data_augmentation.py | 2 +- tests/test_preprocessor.py | 8 ++-- 11 files changed, 27 insertions(+), 34 deletions(-) rename {preprocessing => nautilus_nlp}/__init__.py (94%) rename {preprocessing => nautilus_nlp}/augmentation/text_augmentation.py (100%) rename {preprocessing => nautilus_nlp}/classic/preprocess.py (100%) rename {preprocessing => nautilus_nlp}/preprocessor.py (92%) rename {preprocessing => nautilus_nlp}/social/preprocess.py (98%) rename {preprocessing => nautilus_nlp}/token/preprocess.py (100%) rename {preprocessing => nautilus_nlp}/token/tokenizer.py (100%) diff --git a/.github/workflows/ci_actions.yml b/.github/workflows/ci_actions.yml index 8cdb602..77e79f1 100644 --- a/.github/workflows/ci_actions.yml +++ b/.github/workflows/ci_actions.yml @@ -42,8 +42,8 @@ jobs: - name: Run pylint run: | - pylint config preprocessing utils tests + pylint config nautilus_nlp utils tests - name: Run pytest run: | - pytest --cov=preprocessing tests + pytest --cov=nautilus_nlp tests diff --git a/README.md b/README.md index 64ca8e4..ff1c142 100644 --- a/README.md +++ b/README.md @@ -96,30 +96,23 @@ You can now open the file index.html located in the build folder. **à updater** ├── LICENSE - ├── Makefile <- Makefile with commands like `make data` or `make train` - ├── README.md <- The top-level README for developers using this project. - ├── data <- Scripts & bits to download datasets to try nautilus - │ ├── external - │ ├── interim - │ ├── processed - │ └── raw - ├── docker <- Where to build a docker image using this lib - ├── docs <- Sphinx HTML documentation + ├── Makefile <- Makefile with commands like `make data` or `make train` + ├── README.md <- The top-level README for developers using this project. + ├── config <- Where the configuration and constants live + ├── datasets/external <- Bash scripts to download external datasets + ├── docker <- Where to build a docker image using this lib + ├── docs <- Sphinx HTML documentation │ ├── _build │ │ └── html │ ├── source - ├── models - ├── nautilus_nlp <- Main Nautilus Package. This is where the code lives - │ ├── config - │ ├── data - │ ├── models - │ ├── preprocessing - │ ├── scripts - │ └── utils - ├──notebooks <- Various notebooks explaining how to use Nautilus_NLP library - ├── tests <- Where the tests lives - │ └── testfolder_fileloader - ├── wiki <- Where the Markdown for the Wiki lives - ├── setup.py <- makes project pip installable (pip install -e .) so nautilus_nlp can be imported - ├── requirements.txt <- The requirements file for reproducing the analysis environment, e.g. + ├── nautilus_nlp <- Main Nautilus Package. This is where the code lives + │ ├── preprocessor.py <- Main preprocessing script + │ ├── augmentation <- Text augmentation script + │ ├── classic <- Classic text preprocessing + │ ├── social <- Social text preprocessing + │ └── token <- Token preprocessing + ├── utils <- Where preprocessing utils scripts lives + ├── tests <- Where the tests lives + ├── setup.py <- makes project pip installable (pip install -e .) so nautilus_nlp can be imported + ├── requirements.txt <- The requirements file for reproducing the analysis environment, e.g. generated with `pip freeze > requirements.txt` diff --git a/preprocessing/__init__.py b/nautilus_nlp/__init__.py similarity index 94% rename from preprocessing/__init__.py rename to nautilus_nlp/__init__.py index 97b4d25..7643ec5 100644 --- a/preprocessing/__init__.py +++ b/nautilus_nlp/__init__.py @@ -15,4 +15,4 @@ # You should have received a copy of the GNU Lesser General Public License # along with this program; if not, write to the Free Software Foundation, # Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. -from preprocessing.preprocessor import Preprocessor +from nautilus_nlp.preprocessor import Preprocessor diff --git a/preprocessing/augmentation/text_augmentation.py b/nautilus_nlp/augmentation/text_augmentation.py similarity index 100% rename from preprocessing/augmentation/text_augmentation.py rename to nautilus_nlp/augmentation/text_augmentation.py diff --git a/preprocessing/classic/preprocess.py b/nautilus_nlp/classic/preprocess.py similarity index 100% rename from preprocessing/classic/preprocess.py rename to nautilus_nlp/classic/preprocess.py diff --git a/preprocessing/preprocessor.py b/nautilus_nlp/preprocessor.py similarity index 92% rename from preprocessing/preprocessor.py rename to nautilus_nlp/preprocessor.py index 5cdcac0..e2e9912 100644 --- a/preprocessing/preprocessor.py +++ b/nautilus_nlp/preprocessor.py @@ -3,9 +3,9 @@ from sklearn.pipeline import Pipeline from sklearn.preprocessing import FunctionTransformer -from preprocessing.social.preprocess import ( +from nautilus_nlp.social.preprocess import ( remove_html_tags, remove_mentions, remove_emoji, remove_hashtag) -from preprocessing.classic.preprocess import normalize_whitespace, remove_eol_characters, fix_bad_unicode +from nautilus_nlp.classic.preprocess import normalize_whitespace, remove_eol_characters, fix_bad_unicode class Preprocessor(): diff --git a/preprocessing/social/preprocess.py b/nautilus_nlp/social/preprocess.py similarity index 98% rename from preprocessing/social/preprocess.py rename to nautilus_nlp/social/preprocess.py index b017f65..bc621ca 100644 --- a/preprocessing/social/preprocess.py +++ b/nautilus_nlp/social/preprocess.py @@ -21,7 +21,7 @@ import emoji as _emoji from config import constants -from preprocessing.classic.preprocess import normalize_whitespace +from nautilus_nlp.classic.preprocess import normalize_whitespace def remove_mentions(text) -> str: diff --git a/preprocessing/token/preprocess.py b/nautilus_nlp/token/preprocess.py similarity index 100% rename from preprocessing/token/preprocess.py rename to nautilus_nlp/token/preprocess.py diff --git a/preprocessing/token/tokenizer.py b/nautilus_nlp/token/tokenizer.py similarity index 100% rename from preprocessing/token/tokenizer.py rename to nautilus_nlp/token/tokenizer.py diff --git a/tests/test_data_augmentation.py b/tests/test_data_augmentation.py index d13245b..380a003 100644 --- a/tests/test_data_augmentation.py +++ b/tests/test_data_augmentation.py @@ -1,5 +1,5 @@ import pytest -from preprocessing.augmentation.text_augmentation import ( +from nautilus_nlp.augmentation.text_augmentation import ( process_entities_and_text, get_augmenter, CouldNotAugment, UnavailableAugmenter ) diff --git a/tests/test_preprocessor.py b/tests/test_preprocessor.py index 13564b0..b2b7830 100644 --- a/tests/test_preprocessor.py +++ b/tests/test_preprocessor.py @@ -17,22 +17,22 @@ # Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. import pytest import numpy as np -from preprocessing.classic.preprocess import ( +from nautilus_nlp.classic.preprocess import ( normalize_whitespace, remove_eol_characters, fix_bad_unicode, unpack_english_contractions, replace_urls, replace_emails, replace_phone_numbers, replace_numbers, replace_currency_symbols, remove_punct, remove_accents, remove_multiple_spaces_and_strip_text, filter_non_latin_characters ) -from preprocessing.social.preprocess import ( +from nautilus_nlp.social.preprocess import ( remove_mentions, extract_mentions, remove_html_tags, remove_emoji, convert_emoji_to_text, extract_emojis, extract_hashtags, remove_hashtag ) -from preprocessing.token.preprocess import ( +from nautilus_nlp.token.preprocess import ( remove_stopwords, remove_tokens_with_nonletters, remove_special_caracters_from_tokenslist, remove_smallwords ) -from preprocessing.preprocessor import Preprocessor +from nautilus_nlp.preprocessor import Preprocessor import utils.phone_number as phone from utils.stopwords import get_stopwords From 13cc87959637ba0da606d2e07a8e639ff881414a Mon Sep 17 00:00:00 2001 From: Rafaelle AYGALENQ <rafaelle.aygalenq@artefact.com> Date: Fri, 29 Jan 2021 18:06:15 +0100 Subject: [PATCH 448/496] adding remove stopwords function for text --- nautilus_nlp/classic/preprocess.py | 30 +++++++++++++++++++++++ tests/test_preprocessor.py | 39 ++++++++++++++++++++++++++++-- 2 files changed, 67 insertions(+), 2 deletions(-) diff --git a/nautilus_nlp/classic/preprocess.py b/nautilus_nlp/classic/preprocess.py index 691acae..597cbba 100644 --- a/nautilus_nlp/classic/preprocess.py +++ b/nautilus_nlp/classic/preprocess.py @@ -24,7 +24,9 @@ import unicodedata from ftfy import fix_text as _fix_text from config import constants +from nautilus_nlp.token.tokenizer import tokenize from utils.phone_number import extract_phone_numbers as _extract_phone_numbers +from utils.stopwords import get_stopwords def normalize_whitespace(text) -> str: @@ -48,6 +50,34 @@ def normalize_whitespace(text) -> str: return text +def remove_stopwords(text: str, lang: str, custom_stopwords: list = None) -> str: + """ + Given ``text`` str, remove classic stopwords for a given language and + custom stopwords given as a list. + + Parameters + ---------- + text : string + lang : string + custom_stopwords : list of strings + + Returns + ------- + string + """ + stopwords = get_stopwords(lang) + if custom_stopwords: + stopwords += custom_stopwords + if lang in ["fr", "en"]: + lang_module = { + "fr" : "fr_spacy", + "en" : "en_spacy" + }[lang] + return ' '.join( + [x for x in tokenize(text, lang_module) if x not in stopwords]) + return ' '.join([x for x in text.split() if x not in stopwords]) + + def remove_eol_characters(text) -> str: """ Remove end of line (\n) char. diff --git a/tests/test_preprocessor.py b/tests/test_preprocessor.py index b2b7830..10c3a6f 100644 --- a/tests/test_preprocessor.py +++ b/tests/test_preprocessor.py @@ -24,14 +24,20 @@ remove_punct, remove_accents, remove_multiple_spaces_and_strip_text, filter_non_latin_characters ) +from nautilus_nlp.classic.preprocess import ( + remove_stopwords as remove_stopwords_text +) from nautilus_nlp.social.preprocess import ( remove_mentions, extract_mentions, remove_html_tags, remove_emoji, convert_emoji_to_text, extract_emojis, extract_hashtags, remove_hashtag ) from nautilus_nlp.token.preprocess import ( - remove_stopwords, remove_tokens_with_nonletters, + remove_tokens_with_nonletters, remove_special_caracters_from_tokenslist, remove_smallwords ) +from nautilus_nlp.token.preprocess import ( + remove_stopwords as remove_stopwords_token +) from nautilus_nlp.preprocessor import Preprocessor import utils.phone_number as phone @@ -189,7 +195,36 @@ def test_get_stopwords(): ) def test_remove_stopwords_tokens(input_tokens, expected_output): stopwords = get_stopwords('en') - result = remove_stopwords(input_tokens, stopwords) + result = remove_stopwords_token(input_tokens, stopwords) + np.testing.assert_array_equal(result, expected_output) + + +@pytest.mark.parametrize( + "input_text, lang, expected_output", + [ + ('I like when you move your body !', 'en', 'I move body !'), + ('Can I get a beer?', 'en', 'Can I beer ?'), + ('Je vous recommande ce film !', 'fr', 'Je recommande film !'), + ('je vous recommande ce film !', 'fr', 'recommande film !'), + ('Quiero una cerveza, por favor.', 'es', 'Quiero cerveza, favor.') + ], +) +def test_remove_stopwords_text(input_text, lang, expected_output): + result = remove_stopwords_text(input_text, lang) + np.testing.assert_array_equal(result, expected_output) + + +@pytest.mark.parametrize( + "input_text, lang, custom_stopwords, expected_output", + [ + ('I like when you move your body !', 'en', ['body'], 'I move !'), + ('Je vous recommande ce film la scène de fin est géniale !', 'fr', + ['film', 'scène'], 'Je recommande fin géniale !'), + ], +) +def test_remove_custom_stopwords_text( + input_text, lang, custom_stopwords, expected_output): + result = remove_stopwords_text(input_text, lang, custom_stopwords) np.testing.assert_array_equal(result, expected_output) From 8ba75e7a09f071fce0d93f7b9f232f1e1c18abaf Mon Sep 17 00:00:00 2001 From: Amale EL HAMRI <amale.elhamri@artefact.com> Date: Thu, 11 Feb 2021 18:16:37 +0100 Subject: [PATCH 449/496] adding init files in all modules --- nautilus_nlp/augmentation/__init__.py | 0 nautilus_nlp/classic/__init__.py | 0 nautilus_nlp/social/__init__.py | 0 nautilus_nlp/token/__init__.py | 0 4 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 nautilus_nlp/augmentation/__init__.py create mode 100644 nautilus_nlp/classic/__init__.py create mode 100644 nautilus_nlp/social/__init__.py create mode 100644 nautilus_nlp/token/__init__.py diff --git a/nautilus_nlp/augmentation/__init__.py b/nautilus_nlp/augmentation/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/nautilus_nlp/classic/__init__.py b/nautilus_nlp/classic/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/nautilus_nlp/social/__init__.py b/nautilus_nlp/social/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/nautilus_nlp/token/__init__.py b/nautilus_nlp/token/__init__.py new file mode 100644 index 0000000..e69de29 From 5acb46c1990e107b17b7fbfad329fabb877491fe Mon Sep 17 00:00:00 2001 From: Amale EL HAMRI <amale.elhamri@artefact.com> Date: Fri, 12 Feb 2021 11:47:07 +0100 Subject: [PATCH 450/496] moving all lib essential folders in nautilus_nlp/ --- {config => nautilus_nlp/_config}/__init__.py | 0 {config => nautilus_nlp/_config}/config.py | 4 ++-- {config => nautilus_nlp/_config}/constants.py | 0 {config => nautilus_nlp/_config}/country_code.json | 0 {config => nautilus_nlp/_config}/stopwords.json | 0 {utils => nautilus_nlp/_utils}/__init__.py | 0 {utils => nautilus_nlp/_utils}/file_loader.py | 0 {utils => nautilus_nlp/_utils}/phone_number.py | 2 +- {utils => nautilus_nlp/_utils}/stopwords.py | 4 ++-- nautilus_nlp/classic/preprocess.py | 6 +++--- nautilus_nlp/social/preprocess.py | 2 +- setup.py | 1 - tests/test_document_loader.py | 2 +- tests/test_preprocessor.py | 2 +- 14 files changed, 11 insertions(+), 12 deletions(-) rename {config => nautilus_nlp/_config}/__init__.py (100%) rename {config => nautilus_nlp/_config}/config.py (98%) rename {config => nautilus_nlp/_config}/constants.py (100%) rename {config => nautilus_nlp/_config}/country_code.json (100%) rename {config => nautilus_nlp/_config}/stopwords.json (100%) rename {utils => nautilus_nlp/_utils}/__init__.py (100%) rename {utils => nautilus_nlp/_utils}/file_loader.py (100%) rename {utils => nautilus_nlp/_utils}/phone_number.py (98%) rename {utils => nautilus_nlp/_utils}/stopwords.py (96%) diff --git a/config/__init__.py b/nautilus_nlp/_config/__init__.py similarity index 100% rename from config/__init__.py rename to nautilus_nlp/_config/__init__.py diff --git a/config/config.py b/nautilus_nlp/_config/config.py similarity index 98% rename from config/config.py rename to nautilus_nlp/_config/config.py index df90e45..0be3a0d 100644 --- a/config/config.py +++ b/nautilus_nlp/_config/config.py @@ -20,10 +20,10 @@ import phonenumbers as _phonenumbers -ROOT_FOLDER = os.path.abspath(os.path.join(os.path.dirname(__file__), '..')) +ROOT_FOLDER = os.path.abspath(os.path.join(os.path.dirname(__file__), '../..')) # Stopwords config -STOPWORDS_JSON_FILEPATH = os.path.join(ROOT_FOLDER, "config", "stopwords.json") +STOPWORDS_JSON_FILEPATH = os.path.join(ROOT_FOLDER, "nautilus_nlp", "_config", "stopwords.json") # Country config COUNTRY_MAPPING_ISO = { diff --git a/config/constants.py b/nautilus_nlp/_config/constants.py similarity index 100% rename from config/constants.py rename to nautilus_nlp/_config/constants.py diff --git a/config/country_code.json b/nautilus_nlp/_config/country_code.json similarity index 100% rename from config/country_code.json rename to nautilus_nlp/_config/country_code.json diff --git a/config/stopwords.json b/nautilus_nlp/_config/stopwords.json similarity index 100% rename from config/stopwords.json rename to nautilus_nlp/_config/stopwords.json diff --git a/utils/__init__.py b/nautilus_nlp/_utils/__init__.py similarity index 100% rename from utils/__init__.py rename to nautilus_nlp/_utils/__init__.py diff --git a/utils/file_loader.py b/nautilus_nlp/_utils/file_loader.py similarity index 100% rename from utils/file_loader.py rename to nautilus_nlp/_utils/file_loader.py diff --git a/utils/phone_number.py b/nautilus_nlp/_utils/phone_number.py similarity index 98% rename from utils/phone_number.py rename to nautilus_nlp/_utils/phone_number.py index 6120155..1c364d5 100644 --- a/utils/phone_number.py +++ b/nautilus_nlp/_utils/phone_number.py @@ -17,7 +17,7 @@ # Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. from typing import Optional import phonenumbers as _phonenumbers -from config.config import SUPPORTED_COUNTRY, FORMAT_NUMBERS +from nautilus_nlp._config.config import SUPPORTED_COUNTRY, FORMAT_NUMBERS def find_phone_numbers(string: str, region_code: Optional[str] = None) -> str: diff --git a/utils/stopwords.py b/nautilus_nlp/_utils/stopwords.py similarity index 96% rename from utils/stopwords.py rename to nautilus_nlp/_utils/stopwords.py index 305ff2b..bda452c 100644 --- a/utils/stopwords.py +++ b/nautilus_nlp/_utils/stopwords.py @@ -23,8 +23,8 @@ import json from stop_words import LANGUAGE_MAPPING as _LANGUAGE_MAPPING from stop_words import get_stop_words as _get_stop_words -from config.config import STOPWORDS_JSON_FILEPATH -from utils.file_loader import documents_loader +from nautilus_nlp._config.config import STOPWORDS_JSON_FILEPATH +from nautilus_nlp._utils.file_loader import documents_loader def _load_stopwords_from_json(filepath=STOPWORDS_JSON_FILEPATH): diff --git a/nautilus_nlp/classic/preprocess.py b/nautilus_nlp/classic/preprocess.py index 597cbba..9b3b4e9 100644 --- a/nautilus_nlp/classic/preprocess.py +++ b/nautilus_nlp/classic/preprocess.py @@ -23,10 +23,10 @@ import re import unicodedata from ftfy import fix_text as _fix_text -from config import constants +from nautilus_nlp._config import constants from nautilus_nlp.token.tokenizer import tokenize -from utils.phone_number import extract_phone_numbers as _extract_phone_numbers -from utils.stopwords import get_stopwords +from nautilus_nlp._utils.phone_number import extract_phone_numbers as _extract_phone_numbers +from nautilus_nlp._utils.stopwords import get_stopwords def normalize_whitespace(text) -> str: diff --git a/nautilus_nlp/social/preprocess.py b/nautilus_nlp/social/preprocess.py index bc621ca..6b7a98d 100644 --- a/nautilus_nlp/social/preprocess.py +++ b/nautilus_nlp/social/preprocess.py @@ -20,7 +20,7 @@ from __future__ import absolute_import, division, print_function, unicode_literals import emoji as _emoji -from config import constants +from nautilus_nlp._config import constants from nautilus_nlp.classic.preprocess import normalize_whitespace diff --git a/setup.py b/setup.py index 33c165b..2399ed9 100644 --- a/setup.py +++ b/setup.py @@ -33,7 +33,6 @@ def run(self): with open(Path(__file__).resolve().parent.joinpath('VERSION'), 'r') as fh: version = fh.read() - setup( name='nautilus_nlp', packages=find_packages(), diff --git a/tests/test_document_loader.py b/tests/test_document_loader.py index 060af44..452b40e 100644 --- a/tests/test_document_loader.py +++ b/tests/test_document_loader.py @@ -20,7 +20,7 @@ import os import numpy as np -from utils.file_loader import (detect_encoding, documents_loader) +from nautilus_nlp._utils.file_loader import (detect_encoding, documents_loader) TESTDOC_LATIN1 = "J'aime les frites bien grasse étalon châpeau!" TESTDOC_UTF8 = "Un deuxième exemple de texte en utf-8 cette fois!" diff --git a/tests/test_preprocessor.py b/tests/test_preprocessor.py index 10c3a6f..f7688b7 100644 --- a/tests/test_preprocessor.py +++ b/tests/test_preprocessor.py @@ -41,7 +41,7 @@ from nautilus_nlp.preprocessor import Preprocessor import utils.phone_number as phone -from utils.stopwords import get_stopwords +from nautilus_nlp._utils.stopwords import get_stopwords @pytest.mark.parametrize("text, expected_result", From c6b6c2b0faa1e165b547b4c9734bc4433ff93e9f Mon Sep 17 00:00:00 2001 From: Amale EL HAMRI <amale.elhamri@artefact.com> Date: Fri, 12 Feb 2021 12:11:33 +0100 Subject: [PATCH 451/496] fix CI --- .github/workflows/ci_actions.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/ci_actions.yml b/.github/workflows/ci_actions.yml index 77e79f1..2c410da 100644 --- a/.github/workflows/ci_actions.yml +++ b/.github/workflows/ci_actions.yml @@ -42,7 +42,7 @@ jobs: - name: Run pylint run: | - pylint config nautilus_nlp utils tests + pylint nautilus_nlp tests - name: Run pytest run: | From da4ed487c3ca6a99f2d008c3e84f6947aa52e175 Mon Sep 17 00:00:00 2001 From: Amale EL HAMRI <amale.elhamri@artefact.com> Date: Fri, 12 Feb 2021 12:13:34 +0100 Subject: [PATCH 452/496] fix CI with python3.7 --- .github/workflows/ci_actions.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/ci_actions.yml b/.github/workflows/ci_actions.yml index 2c410da..920fc75 100644 --- a/.github/workflows/ci_actions.yml +++ b/.github/workflows/ci_actions.yml @@ -25,7 +25,7 @@ jobs: runs-on: ubuntu-latest strategy: matrix: - python-version: [3.6, 3.7, 3.8] + python-version: 3.7 steps: - uses: actions/checkout@v2 From b756b84623c8c28835fd2719cc6926111aa1427d Mon Sep 17 00:00:00 2001 From: Amale EL HAMRI <amale.elhamri@artefact.com> Date: Fri, 12 Feb 2021 12:16:26 +0100 Subject: [PATCH 453/496] fix CI --- .github/workflows/ci_actions.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/ci_actions.yml b/.github/workflows/ci_actions.yml index 920fc75..f4b3a1c 100644 --- a/.github/workflows/ci_actions.yml +++ b/.github/workflows/ci_actions.yml @@ -25,7 +25,7 @@ jobs: runs-on: ubuntu-latest strategy: matrix: - python-version: 3.7 + python-version: [3.7] steps: - uses: actions/checkout@v2 From a93b9e75fb152e734417862527e5cb051b813603 Mon Sep 17 00:00:00 2001 From: Amale EL HAMRI <amale.elhamri@artefact.com> Date: Fri, 12 Feb 2021 12:19:00 +0100 Subject: [PATCH 454/496] fix pylint --- tests/test_preprocessor.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/test_preprocessor.py b/tests/test_preprocessor.py index f7688b7..a63b823 100644 --- a/tests/test_preprocessor.py +++ b/tests/test_preprocessor.py @@ -40,7 +40,7 @@ ) from nautilus_nlp.preprocessor import Preprocessor -import utils.phone_number as phone +import nautilus_nlp._utils.phone_number as phone from nautilus_nlp._utils.stopwords import get_stopwords From ac008318e66d3399eee2946e212fc9c7ce680050 Mon Sep 17 00:00:00 2001 From: Amale EL HAMRI <amale.elhamri@artefact.com> Date: Fri, 12 Feb 2021 12:22:08 +0100 Subject: [PATCH 455/496] fix pylint --- tests/test_phone_number.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/test_phone_number.py b/tests/test_phone_number.py index 4b6c832..d95d496 100644 --- a/tests/test_phone_number.py +++ b/tests/test_phone_number.py @@ -15,7 +15,7 @@ # You should have received a copy of the GNU Lesser General Public License # along with this program; if not, write to the Free Software Foundation, # Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. -import utils.phone_number as phone +import nautilus_nlp._utils.phone_number as phone def test_extract_phone_number(): input_str = '(541) 754-3010 is a US. Phone' From bb0ce3f692ca1a5a22a3c14ff24ee93e880829d9 Mon Sep 17 00:00:00 2001 From: Amale EL HAMRI <amale.elhamri@artefact.com> Date: Fri, 12 Feb 2021 12:29:35 +0100 Subject: [PATCH 456/496] adding python 3.6 --- .github/workflows/ci_actions.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/ci_actions.yml b/.github/workflows/ci_actions.yml index f4b3a1c..aa9c08e 100644 --- a/.github/workflows/ci_actions.yml +++ b/.github/workflows/ci_actions.yml @@ -25,7 +25,7 @@ jobs: runs-on: ubuntu-latest strategy: matrix: - python-version: [3.7] + python-version: [3.6, 3.7] steps: - uses: actions/checkout@v2 From 03e240e5bf127c4db061fbda40068cf72d0d1930 Mon Sep 17 00:00:00 2001 From: Amale EL HAMRI <amale.elhamri@artefact.com> Date: Fri, 12 Feb 2021 12:34:18 +0100 Subject: [PATCH 457/496] adding python 3.8 --- .github/workflows/ci_actions.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/ci_actions.yml b/.github/workflows/ci_actions.yml index aa9c08e..2c410da 100644 --- a/.github/workflows/ci_actions.yml +++ b/.github/workflows/ci_actions.yml @@ -25,7 +25,7 @@ jobs: runs-on: ubuntu-latest strategy: matrix: - python-version: [3.6, 3.7] + python-version: [3.6, 3.7, 3.8] steps: - uses: actions/checkout@v2 From 2255353723e65ef8cf9ebf52ec1270ffb0a4ba47 Mon Sep 17 00:00:00 2001 From: Rafaelle AYGALENQ <rafaelle.aygalenq@artefact.com> Date: Wed, 3 Feb 2021 19:51:55 +0100 Subject: [PATCH 458/496] update readme and fix pipeline with arguments --- README.md | 86 ++++++++++++++++++++++++------ nautilus_nlp/classic/preprocess.py | 13 +++++ nautilus_nlp/preprocessor.py | 25 ++++++--- 3 files changed, 101 insertions(+), 23 deletions(-) diff --git a/README.md b/README.md index ff1c142..81b516b 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -Insert new lib name here +CasText ============================== **Insert new logo here** @@ -7,19 +7,20 @@ Insert new lib name here :disappointed_relieved: Need to efficiently extract email adresses from a document? Hashtags from tweets? Remove accents from a French post? -**Insert new lib name here** got you covered! :rocket: +CasText got you covered! :rocket: -**Insert new lib name here** packages in a unique library all the text preprocessing functions you need to ease your NLP project. +CasText packages in a unique library all the text preprocessing functions you need to ease your NLP project. -:mag: Quickly explore below our functions referential. +:mag: Quickly explore below our preprocessing pipelines and individual functions referential. -* [Replacing emails](#replace_emails) +* [Default preprocessing pipeline](#default_pipeline) +* [Custom preprocessing pipeline](#custom_pipeline) * [Replacing phone numbers](#replace_phone_numbers) * [Removing hashtags](#remove_hashtags) * [Extracting emojis](#extract_emojis) -Cannot find a new one? Feel free to open an [issue]((https://github.com/artefactory/nautilus-nlp/issues) )). +Cannot find what you were looking for? Feel free to open an [issue]((https://github.com/artefactory/castext/issues) ). @@ -30,7 +31,7 @@ This package has been tested on Python **3.7**. To install this library you should first clone the repository: ```bash -git clone git@github.com:artefactory/nautilus-nlp.git && cd nautilus_nlp/ +git clone git@github.com:artefactory/castext.git && cd castext/ ``` We strongly advise you to do the remaining steps in a virtual environnement. @@ -49,14 +50,55 @@ pip install -e . This library uses Spacy as tokenizer. Current models supported are `en_core_web_sm` and `fr_core_news_sm`. +# Preprocessing pipeline -# Functions +## Default pipeline <a name="default_pipeline"></a> + +Need to preprocess your text data but no clue about what function to use and in which order? The default preprocessing pipeline got you covered: + +```python +from castext import Preprocessor +text = "I just got the best dinner in my entire life @latourdargent !!! I recommend 😀 #food #paris \n" +preprocessor = Preprocessor() +text = preprocessor.run(text) +print(text) +# "I just got the best dinner in my entire life !!! I recommend" +``` + +## Create your custom pipeline <a name="custom_pipeline"></a> + +Another possibility is to create your custom pipeline if you know exactly what function to apply on your data, here's an example: + +```python +from castext import Preprocessor +from nautilus_nlp.classic.preprocess import normalize_whitespace, remove_punct, remove_eol_characters, remove_stopwords, lower_text +from nautilus_nlp.social.preprocess import remove_mentions, remove_hashtag, remove_emoji +text = "I just got the best dinner in my entire life @latourdargent !!! I recommend 😀 #food #paris \n" +preprocessor = Preprocessor() +preprocessor.pipe(lower_text) +preprocessor.pipe(remove_mentions) +preprocessor.pipe(remove_hashtag) +preprocessor.pipe(remove_emoji) +preprocessor.pipe(remove_eol_characters) +preprocessor.pipe(remove_stopwords, args={'lang': 'en'}) +preprocessor.pipe(remove_punct) +preprocessor.pipe(normalize_whitespace) +text = preprocessor.run(text) +print(text) +# "dinner entire life recommend" +``` + +Take a look at all the functions that are available [here](https://github.com/artefactory/nautilus-nlp/tree/master/nautilus_nlp) in the ```preprocess.py``` scripts in the different folders: classic, social, token. + + +# Individual Functions ## Replacing emails <a name="replace_emails"></a> ```python +from castext.classic.preprocess import replace_emails example = "I have forwarded this email to obama@whitehouse.gov" -example = replace_emails(replace_with="*EMAIL*") +example = replace_emails(example, replace_with="*EMAIL*") print(example) # "I have forwarded this email to *EMAIL*" ``` @@ -64,27 +106,39 @@ print(example) ## Replacing phone numbers <a name="replace_phone_numbers"></a> ```python -Insert example here +from castext.classic.preprocess import replace_phone_numbers +example = "My phone number is 0606060606" +example = replace_phone_numbers(example, country_to_detect=["FR"], replace_with="*PHONE*") +print(example) +# "My phone number is *PHONE*" ``` ## Removing Hashtags <a name="remove_hashtags"></a> ```python -Insert example here +from castext.social.preprocess import remove_hashtag +example = "This restaurant was amazing #food #foodie #foodstagram #dinner" +example = remove_hashtag(example) +print(example) +# "This restaurant was amazing" ``` ## Extracting emojis <a name="extract_emojis"></a> ```python -Insert example here +from castext.social.preprocess import extract_emojis +example = "I take care of my skin 😀" +example = extract_emojis(example) +print(example) +# [':grinning_face:'] ``` # Make HTML documentation **à updater** -In order to make the html Sphinx documentation, you need to run at the nautilus_nlp root path: -`sphinx-apidoc -f nautilus_nlp -o docs/` +In order to make the html Sphinx documentation, you need to run at the castext root path: +`sphinx-apidoc -f castext -o docs/` This will generate the .rst files. You can generate the doc with `cd docs && make html` @@ -105,7 +159,7 @@ You can now open the file index.html located in the build folder. │ ├── _build │ │ └── html │ ├── source - ├── nautilus_nlp <- Main Nautilus Package. This is where the code lives + ├── castext <- Main Package. This is where the code lives │ ├── preprocessor.py <- Main preprocessing script │ ├── augmentation <- Text augmentation script │ ├── classic <- Classic text preprocessing @@ -113,6 +167,6 @@ You can now open the file index.html located in the build folder. │ └── token <- Token preprocessing ├── utils <- Where preprocessing utils scripts lives ├── tests <- Where the tests lives - ├── setup.py <- makes project pip installable (pip install -e .) so nautilus_nlp can be imported + ├── setup.py <- makes project pip installable (pip install -e .) so the package can be imported ├── requirements.txt <- The requirements file for reproducing the analysis environment, e.g. generated with `pip freeze > requirements.txt` diff --git a/nautilus_nlp/classic/preprocess.py b/nautilus_nlp/classic/preprocess.py index 9b3b4e9..e928c7a 100644 --- a/nautilus_nlp/classic/preprocess.py +++ b/nautilus_nlp/classic/preprocess.py @@ -49,6 +49,19 @@ def normalize_whitespace(text) -> str: ).strip() return text +def lower_text(text: str): + """ + Given ``text`` str, transform it into lowercase + + Parameters + ---------- + text : string + + Returns + ------- + string + """ + return text.lower() def remove_stopwords(text: str, lang: str, custom_stopwords: list = None) -> str: """ diff --git a/nautilus_nlp/preprocessor.py b/nautilus_nlp/preprocessor.py index e2e9912..f5a4000 100644 --- a/nautilus_nlp/preprocessor.py +++ b/nautilus_nlp/preprocessor.py @@ -17,19 +17,24 @@ def __init__( self.__operations = [] self.pipeline = None - def pipe(self, operation: Callable): + def pipe(self, operation: Callable, args: dict = None): """ - Add an operation to pipe in the preprocessor + Add an operation and its arguments to pipe in the preprocessor Parameters ---------- operation : callable text preprocessing function + args : dict of arguments """ - self.__operations.append(operation) + self.__operations.append({ + 'operation': operation, + 'args': args + }) + @staticmethod - def build_pipeline(operation_list: List[Callable]) -> Pipeline: + def build_pipeline(operation_list: List[dict]) -> Pipeline: """ Build sklearn pipeline from a operation list @@ -44,7 +49,10 @@ def build_pipeline(operation_list: List[Callable]) -> Pipeline: """ return Pipeline( steps=[ - (operation.__name__, FunctionTransformer(operation)) + ( + operation['operation'].__name__, + FunctionTransformer(operation['operation'], kw_args=operation['args']) + ) for operation in operation_list]) @@ -63,8 +71,11 @@ def run(self, text: str) -> str: """ operations = self.__operations if operations == []: - operations = (remove_html_tags, remove_mentions, remove_emoji, remove_hashtag, - remove_eol_characters, fix_bad_unicode, normalize_whitespace) + operations_to_pipe = ( + remove_html_tags, remove_mentions, remove_emoji, remove_hashtag, + remove_eol_characters, fix_bad_unicode, normalize_whitespace + ) + operations = [{'operation': operation, 'args': None} for operation in operations_to_pipe] self.pipeline = self.build_pipeline(operations) text = self.pipeline.fit_transform(text) return text From cb167287921e3db0f97f0add879909cb271b22b0 Mon Sep 17 00:00:00 2001 From: Rafaelle AYGALENQ <rafaelle.aygalenq@artefact.com> Date: Thu, 4 Feb 2021 16:21:16 +0100 Subject: [PATCH 459/496] fix layout --- README.md | 21 +++++++++++---------- 1 file changed, 11 insertions(+), 10 deletions(-) diff --git a/README.md b/README.md index 81b516b..3988f7a 100644 --- a/README.md +++ b/README.md @@ -58,11 +58,11 @@ Need to preprocess your text data but no clue about what function to use and in ```python from castext import Preprocessor -text = "I just got the best dinner in my entire life @latourdargent !!! I recommend 😀 #food #paris \n" +text = "I just got the best dinner in my life @latourdargent !!! I recommend 😀 #food #paris \n" preprocessor = Preprocessor() text = preprocessor.run(text) print(text) -# "I just got the best dinner in my entire life !!! I recommend" +# "I just got the best dinner in my life !!! I recommend" ``` ## Create your custom pipeline <a name="custom_pipeline"></a> @@ -71,9 +71,10 @@ Another possibility is to create your custom pipeline if you know exactly what f ```python from castext import Preprocessor -from nautilus_nlp.classic.preprocess import normalize_whitespace, remove_punct, remove_eol_characters, remove_stopwords, lower_text -from nautilus_nlp.social.preprocess import remove_mentions, remove_hashtag, remove_emoji -text = "I just got the best dinner in my entire life @latourdargent !!! I recommend 😀 #food #paris \n" +from castext.basic.preprocess import (normalize_whitespace, remove_punct, remove_eol_characters, +remove_stopwords, lower_text) +from castext.social.preprocess import remove_mentions, remove_hashtag, remove_emoji +text = "I just got the best dinner in my life @latourdargent !!! I recommend 😀 #food #paris \n" preprocessor = Preprocessor() preprocessor.pipe(lower_text) preprocessor.pipe(remove_mentions) @@ -85,10 +86,10 @@ preprocessor.pipe(remove_punct) preprocessor.pipe(normalize_whitespace) text = preprocessor.run(text) print(text) -# "dinner entire life recommend" +# "dinner life recommend" ``` -Take a look at all the functions that are available [here](https://github.com/artefactory/nautilus-nlp/tree/master/nautilus_nlp) in the ```preprocess.py``` scripts in the different folders: classic, social, token. +Take a look at all the functions that are available [here](https://github.com/artefactory/nautilus-nlp/tree/master/nautilus_nlp) in the ```preprocess.py``` scripts in the different folders: basic, social, token. # Individual Functions @@ -96,7 +97,7 @@ Take a look at all the functions that are available [here](https://github.com/ar ## Replacing emails <a name="replace_emails"></a> ```python -from castext.classic.preprocess import replace_emails +from castext.basic.preprocess import replace_emails example = "I have forwarded this email to obama@whitehouse.gov" example = replace_emails(example, replace_with="*EMAIL*") print(example) @@ -106,7 +107,7 @@ print(example) ## Replacing phone numbers <a name="replace_phone_numbers"></a> ```python -from castext.classic.preprocess import replace_phone_numbers +from castext.basic.preprocess import replace_phone_numbers example = "My phone number is 0606060606" example = replace_phone_numbers(example, country_to_detect=["FR"], replace_with="*PHONE*") print(example) @@ -162,7 +163,7 @@ You can now open the file index.html located in the build folder. ├── castext <- Main Package. This is where the code lives │ ├── preprocessor.py <- Main preprocessing script │ ├── augmentation <- Text augmentation script - │ ├── classic <- Classic text preprocessing + │ ├── basic <- Basic text preprocessing │ ├── social <- Social text preprocessing │ └── token <- Token preprocessing ├── utils <- Where preprocessing utils scripts lives From c1c8a699c6da68beaf37d3bfa6ce03b1dc01dd2c Mon Sep 17 00:00:00 2001 From: Rafaelle AYGALENQ <rafaelle.aygalenq@artefact.com> Date: Thu, 4 Feb 2021 16:38:22 +0100 Subject: [PATCH 460/496] remove temporary text --- README.md | 3 --- 1 file changed, 3 deletions(-) diff --git a/README.md b/README.md index 3988f7a..f126d47 100644 --- a/README.md +++ b/README.md @@ -1,7 +1,6 @@ CasText ============================== -**Insert new logo here** :tired_face: Working on an NLP project and tired of always looking for the same silly preprocessing functions on the web? @@ -136,7 +135,6 @@ print(example) # Make HTML documentation -**à updater** In order to make the html Sphinx documentation, you need to run at the castext root path: `sphinx-apidoc -f castext -o docs/` @@ -148,7 +146,6 @@ You can now open the file index.html located in the build folder. # Project Organization ------------ -**à updater** ├── LICENSE ├── Makefile <- Makefile with commands like `make data` or `make train` From 638fbb93e15e0c392b223f499d877128e24d01c8 Mon Sep 17 00:00:00 2001 From: Rafaelle AYGALENQ <rafaelle.aygalenq@artefact.com> Date: Thu, 11 Feb 2021 17:11:47 +0100 Subject: [PATCH 461/496] update lib name --- .github/workflows/ci_actions.yml | 4 +-- CONTRIBUTING.md | 2 +- Makefile | 4 +-- README.md | 34 +++++++++---------- {nautilus_nlp => nlpretext}/__init__.py | 2 +- .../augmentation/text_augmentation.py | 0 .../classic/preprocess.py | 8 ++--- {nautilus_nlp => nlpretext}/preprocessor.py | 4 +-- .../social/preprocess.py | 4 +-- .../token/preprocess.py | 0 .../token/tokenizer.py | 0 setup.py | 2 +- tests/test_data_augmentation.py | 2 +- tests/test_preprocessor.py | 12 +++---- 14 files changed, 39 insertions(+), 39 deletions(-) rename {nautilus_nlp => nlpretext}/__init__.py (94%) rename {nautilus_nlp => nlpretext}/augmentation/text_augmentation.py (100%) rename {nautilus_nlp => nlpretext}/classic/preprocess.py (97%) rename {nautilus_nlp => nlpretext}/preprocessor.py (93%) rename {nautilus_nlp => nlpretext}/social/preprocess.py (97%) rename {nautilus_nlp => nlpretext}/token/preprocess.py (100%) rename {nautilus_nlp => nlpretext}/token/tokenizer.py (100%) diff --git a/.github/workflows/ci_actions.yml b/.github/workflows/ci_actions.yml index 2c410da..d5031d8 100644 --- a/.github/workflows/ci_actions.yml +++ b/.github/workflows/ci_actions.yml @@ -42,8 +42,8 @@ jobs: - name: Run pylint run: | - pylint nautilus_nlp tests + pylint nlpretext tests - name: Run pytest run: | - pytest --cov=nautilus_nlp tests + pytest --cov=nlpretext tests diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index d59a290..52d256f 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -1,4 +1,4 @@ -Nautilus_NLP +NLPretext ============================== # Docstring format diff --git a/Makefile b/Makefile index d20b93b..8fa6457 100644 --- a/Makefile +++ b/Makefile @@ -7,7 +7,7 @@ PROJECT_DIR := $(shell dirname $(realpath $(lastword $(MAKEFILE_LIST)))) BUCKET = [OPTIONAL] your-bucket-for-syncing-data (do not include 's3://') PROFILE = default -PROJECT_NAME = nautilus_nlp +PROJECT_NAME = nlpretext PYTHON_INTERPRETER = python3 ifeq (,$(shell which conda)) @@ -36,7 +36,7 @@ clean: ## Lint using flake8 lint: - black nautilus_nlp + black nlpretext ## Upload Data to S3 sync_data_to_s3: diff --git a/README.md b/README.md index f126d47..17a7df2 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -CasText +NLPretext ============================== @@ -6,9 +6,9 @@ CasText :disappointed_relieved: Need to efficiently extract email adresses from a document? Hashtags from tweets? Remove accents from a French post? -CasText got you covered! :rocket: +NLPretext got you covered! :rocket: -CasText packages in a unique library all the text preprocessing functions you need to ease your NLP project. +NLPretext packages in a unique library all the text preprocessing functions you need to ease your NLP project. :mag: Quickly explore below our preprocessing pipelines and individual functions referential. @@ -19,7 +19,7 @@ CasText packages in a unique library all the text preprocessing functions you ne * [Extracting emojis](#extract_emojis) -Cannot find what you were looking for? Feel free to open an [issue]((https://github.com/artefactory/castext/issues) ). +Cannot find what you were looking for? Feel free to open an [issue]((https://github.com/artefactory/nlpretext/issues) ). @@ -30,7 +30,7 @@ This package has been tested on Python **3.7**. To install this library you should first clone the repository: ```bash -git clone git@github.com:artefactory/castext.git && cd castext/ +git clone git@github.com:artefactory/nlpretext.git && cd nlpretext/ ``` We strongly advise you to do the remaining steps in a virtual environnement. @@ -56,7 +56,7 @@ This library uses Spacy as tokenizer. Current models supported are `en_core_web_ Need to preprocess your text data but no clue about what function to use and in which order? The default preprocessing pipeline got you covered: ```python -from castext import Preprocessor +from nlpretext import Preprocessor text = "I just got the best dinner in my life @latourdargent !!! I recommend 😀 #food #paris \n" preprocessor = Preprocessor() text = preprocessor.run(text) @@ -69,10 +69,10 @@ print(text) Another possibility is to create your custom pipeline if you know exactly what function to apply on your data, here's an example: ```python -from castext import Preprocessor -from castext.basic.preprocess import (normalize_whitespace, remove_punct, remove_eol_characters, +from nlpretext import Preprocessor +from nlpretext.basic.preprocess import (normalize_whitespace, remove_punct, remove_eol_characters, remove_stopwords, lower_text) -from castext.social.preprocess import remove_mentions, remove_hashtag, remove_emoji +from nlpretext.social.preprocess import remove_mentions, remove_hashtag, remove_emoji text = "I just got the best dinner in my life @latourdargent !!! I recommend 😀 #food #paris \n" preprocessor = Preprocessor() preprocessor.pipe(lower_text) @@ -88,7 +88,7 @@ print(text) # "dinner life recommend" ``` -Take a look at all the functions that are available [here](https://github.com/artefactory/nautilus-nlp/tree/master/nautilus_nlp) in the ```preprocess.py``` scripts in the different folders: basic, social, token. +Take a look at all the functions that are available [here](https://github.com/artefactory/nautilus-nlp/tree/master/nlpretext) in the ```preprocess.py``` scripts in the different folders: basic, social, token. # Individual Functions @@ -96,7 +96,7 @@ Take a look at all the functions that are available [here](https://github.com/ar ## Replacing emails <a name="replace_emails"></a> ```python -from castext.basic.preprocess import replace_emails +from nlpretext.basic.preprocess import replace_emails example = "I have forwarded this email to obama@whitehouse.gov" example = replace_emails(example, replace_with="*EMAIL*") print(example) @@ -106,7 +106,7 @@ print(example) ## Replacing phone numbers <a name="replace_phone_numbers"></a> ```python -from castext.basic.preprocess import replace_phone_numbers +from nlpretext.basic.preprocess import replace_phone_numbers example = "My phone number is 0606060606" example = replace_phone_numbers(example, country_to_detect=["FR"], replace_with="*PHONE*") print(example) @@ -116,7 +116,7 @@ print(example) ## Removing Hashtags <a name="remove_hashtags"></a> ```python -from castext.social.preprocess import remove_hashtag +from nlpretext.social.preprocess import remove_hashtag example = "This restaurant was amazing #food #foodie #foodstagram #dinner" example = remove_hashtag(example) print(example) @@ -126,7 +126,7 @@ print(example) ## Extracting emojis <a name="extract_emojis"></a> ```python -from castext.social.preprocess import extract_emojis +from nlpretext.social.preprocess import extract_emojis example = "I take care of my skin 😀" example = extract_emojis(example) print(example) @@ -136,8 +136,8 @@ print(example) # Make HTML documentation -In order to make the html Sphinx documentation, you need to run at the castext root path: -`sphinx-apidoc -f castext -o docs/` +In order to make the html Sphinx documentation, you need to run at the nlpretext root path: +`sphinx-apidoc -f nlpretext -o docs/` This will generate the .rst files. You can generate the doc with `cd docs && make html` @@ -157,7 +157,7 @@ You can now open the file index.html located in the build folder. │ ├── _build │ │ └── html │ ├── source - ├── castext <- Main Package. This is where the code lives + ├── nlpretext <- Main Package. This is where the code lives │ ├── preprocessor.py <- Main preprocessing script │ ├── augmentation <- Text augmentation script │ ├── basic <- Basic text preprocessing diff --git a/nautilus_nlp/__init__.py b/nlpretext/__init__.py similarity index 94% rename from nautilus_nlp/__init__.py rename to nlpretext/__init__.py index 7643ec5..cf137b0 100644 --- a/nautilus_nlp/__init__.py +++ b/nlpretext/__init__.py @@ -15,4 +15,4 @@ # You should have received a copy of the GNU Lesser General Public License # along with this program; if not, write to the Free Software Foundation, # Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. -from nautilus_nlp.preprocessor import Preprocessor +from nlpretext.preprocessor import Preprocessor diff --git a/nautilus_nlp/augmentation/text_augmentation.py b/nlpretext/augmentation/text_augmentation.py similarity index 100% rename from nautilus_nlp/augmentation/text_augmentation.py rename to nlpretext/augmentation/text_augmentation.py diff --git a/nautilus_nlp/classic/preprocess.py b/nlpretext/classic/preprocess.py similarity index 97% rename from nautilus_nlp/classic/preprocess.py rename to nlpretext/classic/preprocess.py index e928c7a..0247012 100644 --- a/nautilus_nlp/classic/preprocess.py +++ b/nlpretext/classic/preprocess.py @@ -23,10 +23,10 @@ import re import unicodedata from ftfy import fix_text as _fix_text -from nautilus_nlp._config import constants -from nautilus_nlp.token.tokenizer import tokenize -from nautilus_nlp._utils.phone_number import extract_phone_numbers as _extract_phone_numbers -from nautilus_nlp._utils.stopwords import get_stopwords +from nlpretext._config import constants +from nlpretext.token.tokenizer import tokenize +from nlpretext._utils.phone_number import extract_phone_numbers as _extract_phone_numbers +from nlpretext._utils.stopwords import get_stopwords def normalize_whitespace(text) -> str: diff --git a/nautilus_nlp/preprocessor.py b/nlpretext/preprocessor.py similarity index 93% rename from nautilus_nlp/preprocessor.py rename to nlpretext/preprocessor.py index f5a4000..c453aad 100644 --- a/nautilus_nlp/preprocessor.py +++ b/nlpretext/preprocessor.py @@ -3,9 +3,9 @@ from sklearn.pipeline import Pipeline from sklearn.preprocessing import FunctionTransformer -from nautilus_nlp.social.preprocess import ( +from nlpretext.social.preprocess import ( remove_html_tags, remove_mentions, remove_emoji, remove_hashtag) -from nautilus_nlp.classic.preprocess import normalize_whitespace, remove_eol_characters, fix_bad_unicode +from nlpretext.classic.preprocess import normalize_whitespace, remove_eol_characters, fix_bad_unicode class Preprocessor(): diff --git a/nautilus_nlp/social/preprocess.py b/nlpretext/social/preprocess.py similarity index 97% rename from nautilus_nlp/social/preprocess.py rename to nlpretext/social/preprocess.py index 6b7a98d..1f30891 100644 --- a/nautilus_nlp/social/preprocess.py +++ b/nlpretext/social/preprocess.py @@ -20,8 +20,8 @@ from __future__ import absolute_import, division, print_function, unicode_literals import emoji as _emoji -from nautilus_nlp._config import constants -from nautilus_nlp.classic.preprocess import normalize_whitespace +from nlpretext._config import constants +from nlpretext.classic.preprocess import normalize_whitespace def remove_mentions(text) -> str: diff --git a/nautilus_nlp/token/preprocess.py b/nlpretext/token/preprocess.py similarity index 100% rename from nautilus_nlp/token/preprocess.py rename to nlpretext/token/preprocess.py diff --git a/nautilus_nlp/token/tokenizer.py b/nlpretext/token/tokenizer.py similarity index 100% rename from nautilus_nlp/token/tokenizer.py rename to nlpretext/token/tokenizer.py diff --git a/setup.py b/setup.py index 2399ed9..8b6eaf3 100644 --- a/setup.py +++ b/setup.py @@ -34,7 +34,7 @@ def run(self): with open(Path(__file__).resolve().parent.joinpath('VERSION'), 'r') as fh: version = fh.read() setup( - name='nautilus_nlp', + name='nlpretext', packages=find_packages(), version=version, description='All the goto functions you need to handle NLP use-cases', diff --git a/tests/test_data_augmentation.py b/tests/test_data_augmentation.py index 380a003..8a9bfdc 100644 --- a/tests/test_data_augmentation.py +++ b/tests/test_data_augmentation.py @@ -1,5 +1,5 @@ import pytest -from nautilus_nlp.augmentation.text_augmentation import ( +from nlpretext.augmentation.text_augmentation import ( process_entities_and_text, get_augmenter, CouldNotAugment, UnavailableAugmenter ) diff --git a/tests/test_preprocessor.py b/tests/test_preprocessor.py index a63b823..49edc28 100644 --- a/tests/test_preprocessor.py +++ b/tests/test_preprocessor.py @@ -17,28 +17,28 @@ # Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. import pytest import numpy as np -from nautilus_nlp.classic.preprocess import ( +from nlpretext.classic.preprocess import ( normalize_whitespace, remove_eol_characters, fix_bad_unicode, unpack_english_contractions, replace_urls, replace_emails, replace_phone_numbers, replace_numbers, replace_currency_symbols, remove_punct, remove_accents, remove_multiple_spaces_and_strip_text, filter_non_latin_characters ) -from nautilus_nlp.classic.preprocess import ( +from nlpretext.classic.preprocess import ( remove_stopwords as remove_stopwords_text ) -from nautilus_nlp.social.preprocess import ( +from nlpretext.social.preprocess import ( remove_mentions, extract_mentions, remove_html_tags, remove_emoji, convert_emoji_to_text, extract_emojis, extract_hashtags, remove_hashtag ) -from nautilus_nlp.token.preprocess import ( +from nlpretext.token.preprocess import ( remove_tokens_with_nonletters, remove_special_caracters_from_tokenslist, remove_smallwords ) -from nautilus_nlp.token.preprocess import ( +from nlpretext.token.preprocess import ( remove_stopwords as remove_stopwords_token ) -from nautilus_nlp.preprocessor import Preprocessor +from nlpretext.preprocessor import Preprocessor import nautilus_nlp._utils.phone_number as phone from nautilus_nlp._utils.stopwords import get_stopwords From f75fd2aba6016b7345c64ad57095c6806147ee7d Mon Sep 17 00:00:00 2001 From: Rafaelle AYGALENQ <rafaelle.aygalenq@artefact.com> Date: Fri, 12 Feb 2021 15:52:04 +0100 Subject: [PATCH 462/496] updates with new name and minor fixes for json config files --- .github/workflows/ci_actions.yml | 2 +- README.md | 26 +- nautilus_nlp/_config/country_code.json | 1 - nautilus_nlp/_config/stopwords.json | 1 - nautilus_nlp/augmentation/__init__.py | 0 nautilus_nlp/classic/__init__.py | 0 nautilus_nlp/social/__init__.py | 0 nautilus_nlp/token/__init__.py | 0 .../_config/__init__.py | 0 {nautilus_nlp => nlpretext}/_config/config.py | 3 - .../_config/constants.py | 0 nlpretext/_config/stopwords.py | 13171 ++++++++++++++++ .../_utils/__init__.py | 0 .../_utils/file_loader.py | 0 .../_utils/phone_number.py | 2 +- .../_utils/stopwords.py | 11 +- tests/test_document_loader.py | 2 +- tests/test_phone_number.py | 2 +- tests/test_preprocessor.py | 4 +- 19 files changed, 13190 insertions(+), 35 deletions(-) delete mode 100644 nautilus_nlp/_config/country_code.json delete mode 100644 nautilus_nlp/_config/stopwords.json delete mode 100644 nautilus_nlp/augmentation/__init__.py delete mode 100644 nautilus_nlp/classic/__init__.py delete mode 100644 nautilus_nlp/social/__init__.py delete mode 100644 nautilus_nlp/token/__init__.py rename {nautilus_nlp => nlpretext}/_config/__init__.py (100%) rename {nautilus_nlp => nlpretext}/_config/config.py (98%) rename {nautilus_nlp => nlpretext}/_config/constants.py (100%) create mode 100644 nlpretext/_config/stopwords.py rename {nautilus_nlp => nlpretext}/_utils/__init__.py (100%) rename {nautilus_nlp => nlpretext}/_utils/file_loader.py (100%) rename {nautilus_nlp => nlpretext}/_utils/phone_number.py (98%) rename {nautilus_nlp => nlpretext}/_utils/stopwords.py (88%) diff --git a/.github/workflows/ci_actions.yml b/.github/workflows/ci_actions.yml index d5031d8..71c2aef 100644 --- a/.github/workflows/ci_actions.yml +++ b/.github/workflows/ci_actions.yml @@ -42,7 +42,7 @@ jobs: - name: Run pylint run: | - pylint nlpretext tests + pylint nlpretext tests --max-module-lines 15000 - name: Run pytest run: | diff --git a/README.md b/README.md index 17a7df2..7af4286 100644 --- a/README.md +++ b/README.md @@ -1,14 +1,14 @@ NLPretext ============================== +<font size="4"> **No more pretext for dirty text** :pencil: </font> +:tired_face: *Working on an NLP project and tired of always looking for the same silly preprocessing functions on the web?* -:tired_face: Working on an NLP project and tired of always looking for the same silly preprocessing functions on the web? +:disappointed_relieved: *Need to efficiently extract email adresses from a document? Hashtags from tweets? Remove accents from a French post?* -:disappointed_relieved: Need to efficiently extract email adresses from a document? Hashtags from tweets? Remove accents from a French post? +**NLPretext got you covered!** :rocket: -NLPretext got you covered! :rocket: - -NLPretext packages in a unique library all the text preprocessing functions you need to ease your NLP project. +NLPretext packages in a **unique** library all the text **preprocessing** functions you need to **ease** your NLP project. :mag: Quickly explore below our preprocessing pipelines and individual functions referential. @@ -25,30 +25,26 @@ Cannot find what you were looking for? Feel free to open an [issue]((https://git # Installation -This package has been tested on Python **3.7**. +This package has been tested on Python **3.6**, **3.7** and **3.8**. -To install this library you should first clone the repository: +To install this library you just have to run the following command: ```bash -git clone git@github.com:artefactory/nlpretext.git && cd nlpretext/ +pip install git+https://github.com/artefactory/NLPretext.git ``` We strongly advise you to do the remaining steps in a virtual environnement. -First install the required files: +This library uses Spacy as tokenizer. Current models supported are `en_core_web_sm` and `fr_core_news_sm`. If not installed, run the following commands: ```bash -pip install -r requirements.txt +pip install https://github.com/explosion/spacy-models/releases/download/en_core_web_sm-2.3.1/en_core_web_sm-2.3.1.tar.gz ``` -then install the library with pip: - ```bash -pip install -e . +pip install https://github.com/explosion/spacy-models/releases/download/fr_core_news_sm-2.3.0/fr_core_news_sm-2.3.0.tar.gz ``` -This library uses Spacy as tokenizer. Current models supported are `en_core_web_sm` and `fr_core_news_sm`. - # Preprocessing pipeline ## Default pipeline <a name="default_pipeline"></a> diff --git a/nautilus_nlp/_config/country_code.json b/nautilus_nlp/_config/country_code.json deleted file mode 100644 index 82ae350..0000000 --- a/nautilus_nlp/_config/country_code.json +++ /dev/null @@ -1 +0,0 @@ -[{"name":"Afghanistan","alpha-2":"AF","alpha-3":"AFG","country-code":"004","iso_3166-2":"ISO 3166-2:AF","region":"Asia","sub-region":"Southern Asia","intermediate-region":"","region-code":"142","sub-region-code":"034","intermediate-region-code":""},{"name":"Åland Islands","alpha-2":"AX","alpha-3":"ALA","country-code":"248","iso_3166-2":"ISO 3166-2:AX","region":"Europe","sub-region":"Northern Europe","intermediate-region":"","region-code":"150","sub-region-code":"154","intermediate-region-code":""},{"name":"Albania","alpha-2":"AL","alpha-3":"ALB","country-code":"008","iso_3166-2":"ISO 3166-2:AL","region":"Europe","sub-region":"Southern Europe","intermediate-region":"","region-code":"150","sub-region-code":"039","intermediate-region-code":""},{"name":"Algeria","alpha-2":"DZ","alpha-3":"DZA","country-code":"012","iso_3166-2":"ISO 3166-2:DZ","region":"Africa","sub-region":"Northern Africa","intermediate-region":"","region-code":"002","sub-region-code":"015","intermediate-region-code":""},{"name":"American Samoa","alpha-2":"AS","alpha-3":"ASM","country-code":"016","iso_3166-2":"ISO 3166-2:AS","region":"Oceania","sub-region":"Polynesia","intermediate-region":"","region-code":"009","sub-region-code":"061","intermediate-region-code":""},{"name":"Andorra","alpha-2":"AD","alpha-3":"AND","country-code":"020","iso_3166-2":"ISO 3166-2:AD","region":"Europe","sub-region":"Southern Europe","intermediate-region":"","region-code":"150","sub-region-code":"039","intermediate-region-code":""},{"name":"Angola","alpha-2":"AO","alpha-3":"AGO","country-code":"024","iso_3166-2":"ISO 3166-2:AO","region":"Africa","sub-region":"Sub-Saharan Africa","intermediate-region":"Middle Africa","region-code":"002","sub-region-code":"202","intermediate-region-code":"017"},{"name":"Anguilla","alpha-2":"AI","alpha-3":"AIA","country-code":"660","iso_3166-2":"ISO 3166-2:AI","region":"Americas","sub-region":"Latin America and the Caribbean","intermediate-region":"Caribbean","region-code":"019","sub-region-code":"419","intermediate-region-code":"029"},{"name":"Antarctica","alpha-2":"AQ","alpha-3":"ATA","country-code":"010","iso_3166-2":"ISO 3166-2:AQ","region":"","sub-region":"","intermediate-region":"","region-code":"","sub-region-code":"","intermediate-region-code":""},{"name":"Antigua and Barbuda","alpha-2":"AG","alpha-3":"ATG","country-code":"028","iso_3166-2":"ISO 3166-2:AG","region":"Americas","sub-region":"Latin America and the Caribbean","intermediate-region":"Caribbean","region-code":"019","sub-region-code":"419","intermediate-region-code":"029"},{"name":"Argentina","alpha-2":"AR","alpha-3":"ARG","country-code":"032","iso_3166-2":"ISO 3166-2:AR","region":"Americas","sub-region":"Latin America and the Caribbean","intermediate-region":"South America","region-code":"019","sub-region-code":"419","intermediate-region-code":"005"},{"name":"Armenia","alpha-2":"AM","alpha-3":"ARM","country-code":"051","iso_3166-2":"ISO 3166-2:AM","region":"Asia","sub-region":"Western Asia","intermediate-region":"","region-code":"142","sub-region-code":"145","intermediate-region-code":""},{"name":"Aruba","alpha-2":"AW","alpha-3":"ABW","country-code":"533","iso_3166-2":"ISO 3166-2:AW","region":"Americas","sub-region":"Latin America and the Caribbean","intermediate-region":"Caribbean","region-code":"019","sub-region-code":"419","intermediate-region-code":"029"},{"name":"Australia","alpha-2":"AU","alpha-3":"AUS","country-code":"036","iso_3166-2":"ISO 3166-2:AU","region":"Oceania","sub-region":"Australia and New Zealand","intermediate-region":"","region-code":"009","sub-region-code":"053","intermediate-region-code":""},{"name":"Austria","alpha-2":"AT","alpha-3":"AUT","country-code":"040","iso_3166-2":"ISO 3166-2:AT","region":"Europe","sub-region":"Western Europe","intermediate-region":"","region-code":"150","sub-region-code":"155","intermediate-region-code":""},{"name":"Azerbaijan","alpha-2":"AZ","alpha-3":"AZE","country-code":"031","iso_3166-2":"ISO 3166-2:AZ","region":"Asia","sub-region":"Western Asia","intermediate-region":"","region-code":"142","sub-region-code":"145","intermediate-region-code":""},{"name":"Bahamas","alpha-2":"BS","alpha-3":"BHS","country-code":"044","iso_3166-2":"ISO 3166-2:BS","region":"Americas","sub-region":"Latin America and the Caribbean","intermediate-region":"Caribbean","region-code":"019","sub-region-code":"419","intermediate-region-code":"029"},{"name":"Bahrain","alpha-2":"BH","alpha-3":"BHR","country-code":"048","iso_3166-2":"ISO 3166-2:BH","region":"Asia","sub-region":"Western Asia","intermediate-region":"","region-code":"142","sub-region-code":"145","intermediate-region-code":""},{"name":"Bangladesh","alpha-2":"BD","alpha-3":"BGD","country-code":"050","iso_3166-2":"ISO 3166-2:BD","region":"Asia","sub-region":"Southern Asia","intermediate-region":"","region-code":"142","sub-region-code":"034","intermediate-region-code":""},{"name":"Barbados","alpha-2":"BB","alpha-3":"BRB","country-code":"052","iso_3166-2":"ISO 3166-2:BB","region":"Americas","sub-region":"Latin America and the Caribbean","intermediate-region":"Caribbean","region-code":"019","sub-region-code":"419","intermediate-region-code":"029"},{"name":"Belarus","alpha-2":"BY","alpha-3":"BLR","country-code":"112","iso_3166-2":"ISO 3166-2:BY","region":"Europe","sub-region":"Eastern Europe","intermediate-region":"","region-code":"150","sub-region-code":"151","intermediate-region-code":""},{"name":"Belgium","alpha-2":"BE","alpha-3":"BEL","country-code":"056","iso_3166-2":"ISO 3166-2:BE","region":"Europe","sub-region":"Western Europe","intermediate-region":"","region-code":"150","sub-region-code":"155","intermediate-region-code":""},{"name":"Belize","alpha-2":"BZ","alpha-3":"BLZ","country-code":"084","iso_3166-2":"ISO 3166-2:BZ","region":"Americas","sub-region":"Latin America and the Caribbean","intermediate-region":"Central America","region-code":"019","sub-region-code":"419","intermediate-region-code":"013"},{"name":"Benin","alpha-2":"BJ","alpha-3":"BEN","country-code":"204","iso_3166-2":"ISO 3166-2:BJ","region":"Africa","sub-region":"Sub-Saharan Africa","intermediate-region":"Western Africa","region-code":"002","sub-region-code":"202","intermediate-region-code":"011"},{"name":"Bermuda","alpha-2":"BM","alpha-3":"BMU","country-code":"060","iso_3166-2":"ISO 3166-2:BM","region":"Americas","sub-region":"Northern America","intermediate-region":"","region-code":"019","sub-region-code":"021","intermediate-region-code":""},{"name":"Bhutan","alpha-2":"BT","alpha-3":"BTN","country-code":"064","iso_3166-2":"ISO 3166-2:BT","region":"Asia","sub-region":"Southern Asia","intermediate-region":"","region-code":"142","sub-region-code":"034","intermediate-region-code":""},{"name":"Bolivia (Plurinational State of)","alpha-2":"BO","alpha-3":"BOL","country-code":"068","iso_3166-2":"ISO 3166-2:BO","region":"Americas","sub-region":"Latin America and the Caribbean","intermediate-region":"South America","region-code":"019","sub-region-code":"419","intermediate-region-code":"005"},{"name":"Bonaire, Sint Eustatius and Saba","alpha-2":"BQ","alpha-3":"BES","country-code":"535","iso_3166-2":"ISO 3166-2:BQ","region":"Americas","sub-region":"Latin America and the Caribbean","intermediate-region":"Caribbean","region-code":"019","sub-region-code":"419","intermediate-region-code":"029"},{"name":"Bosnia and Herzegovina","alpha-2":"BA","alpha-3":"BIH","country-code":"070","iso_3166-2":"ISO 3166-2:BA","region":"Europe","sub-region":"Southern Europe","intermediate-region":"","region-code":"150","sub-region-code":"039","intermediate-region-code":""},{"name":"Botswana","alpha-2":"BW","alpha-3":"BWA","country-code":"072","iso_3166-2":"ISO 3166-2:BW","region":"Africa","sub-region":"Sub-Saharan Africa","intermediate-region":"Southern Africa","region-code":"002","sub-region-code":"202","intermediate-region-code":"018"},{"name":"Bouvet Island","alpha-2":"BV","alpha-3":"BVT","country-code":"074","iso_3166-2":"ISO 3166-2:BV","region":"Americas","sub-region":"Latin America and the Caribbean","intermediate-region":"South America","region-code":"019","sub-region-code":"419","intermediate-region-code":"005"},{"name":"Brazil","alpha-2":"BR","alpha-3":"BRA","country-code":"076","iso_3166-2":"ISO 3166-2:BR","region":"Americas","sub-region":"Latin America and the Caribbean","intermediate-region":"South America","region-code":"019","sub-region-code":"419","intermediate-region-code":"005"},{"name":"British Indian Ocean Territory","alpha-2":"IO","alpha-3":"IOT","country-code":"086","iso_3166-2":"ISO 3166-2:IO","region":"Africa","sub-region":"Sub-Saharan Africa","intermediate-region":"Eastern Africa","region-code":"002","sub-region-code":"202","intermediate-region-code":"014"},{"name":"Brunei Darussalam","alpha-2":"BN","alpha-3":"BRN","country-code":"096","iso_3166-2":"ISO 3166-2:BN","region":"Asia","sub-region":"South-eastern Asia","intermediate-region":"","region-code":"142","sub-region-code":"035","intermediate-region-code":""},{"name":"Bulgaria","alpha-2":"BG","alpha-3":"BGR","country-code":"100","iso_3166-2":"ISO 3166-2:BG","region":"Europe","sub-region":"Eastern Europe","intermediate-region":"","region-code":"150","sub-region-code":"151","intermediate-region-code":""},{"name":"Burkina Faso","alpha-2":"BF","alpha-3":"BFA","country-code":"854","iso_3166-2":"ISO 3166-2:BF","region":"Africa","sub-region":"Sub-Saharan Africa","intermediate-region":"Western Africa","region-code":"002","sub-region-code":"202","intermediate-region-code":"011"},{"name":"Burundi","alpha-2":"BI","alpha-3":"BDI","country-code":"108","iso_3166-2":"ISO 3166-2:BI","region":"Africa","sub-region":"Sub-Saharan Africa","intermediate-region":"Eastern Africa","region-code":"002","sub-region-code":"202","intermediate-region-code":"014"},{"name":"Cabo Verde","alpha-2":"CV","alpha-3":"CPV","country-code":"132","iso_3166-2":"ISO 3166-2:CV","region":"Africa","sub-region":"Sub-Saharan Africa","intermediate-region":"Western Africa","region-code":"002","sub-region-code":"202","intermediate-region-code":"011"},{"name":"Cambodia","alpha-2":"KH","alpha-3":"KHM","country-code":"116","iso_3166-2":"ISO 3166-2:KH","region":"Asia","sub-region":"South-eastern Asia","intermediate-region":"","region-code":"142","sub-region-code":"035","intermediate-region-code":""},{"name":"Cameroon","alpha-2":"CM","alpha-3":"CMR","country-code":"120","iso_3166-2":"ISO 3166-2:CM","region":"Africa","sub-region":"Sub-Saharan Africa","intermediate-region":"Middle Africa","region-code":"002","sub-region-code":"202","intermediate-region-code":"017"},{"name":"Canada","alpha-2":"CA","alpha-3":"CAN","country-code":"124","iso_3166-2":"ISO 3166-2:CA","region":"Americas","sub-region":"Northern America","intermediate-region":"","region-code":"019","sub-region-code":"021","intermediate-region-code":""},{"name":"Cayman Islands","alpha-2":"KY","alpha-3":"CYM","country-code":"136","iso_3166-2":"ISO 3166-2:KY","region":"Americas","sub-region":"Latin America and the Caribbean","intermediate-region":"Caribbean","region-code":"019","sub-region-code":"419","intermediate-region-code":"029"},{"name":"Central African Republic","alpha-2":"CF","alpha-3":"CAF","country-code":"140","iso_3166-2":"ISO 3166-2:CF","region":"Africa","sub-region":"Sub-Saharan Africa","intermediate-region":"Middle Africa","region-code":"002","sub-region-code":"202","intermediate-region-code":"017"},{"name":"Chad","alpha-2":"TD","alpha-3":"TCD","country-code":"148","iso_3166-2":"ISO 3166-2:TD","region":"Africa","sub-region":"Sub-Saharan Africa","intermediate-region":"Middle Africa","region-code":"002","sub-region-code":"202","intermediate-region-code":"017"},{"name":"Chile","alpha-2":"CL","alpha-3":"CHL","country-code":"152","iso_3166-2":"ISO 3166-2:CL","region":"Americas","sub-region":"Latin America and the Caribbean","intermediate-region":"South America","region-code":"019","sub-region-code":"419","intermediate-region-code":"005"},{"name":"China","alpha-2":"CN","alpha-3":"CHN","country-code":"156","iso_3166-2":"ISO 3166-2:CN","region":"Asia","sub-region":"Eastern Asia","intermediate-region":"","region-code":"142","sub-region-code":"030","intermediate-region-code":""},{"name":"Christmas Island","alpha-2":"CX","alpha-3":"CXR","country-code":"162","iso_3166-2":"ISO 3166-2:CX","region":"Oceania","sub-region":"Australia and New Zealand","intermediate-region":"","region-code":"009","sub-region-code":"053","intermediate-region-code":""},{"name":"Cocos (Keeling) Islands","alpha-2":"CC","alpha-3":"CCK","country-code":"166","iso_3166-2":"ISO 3166-2:CC","region":"Oceania","sub-region":"Australia and New Zealand","intermediate-region":"","region-code":"009","sub-region-code":"053","intermediate-region-code":""},{"name":"Colombia","alpha-2":"CO","alpha-3":"COL","country-code":"170","iso_3166-2":"ISO 3166-2:CO","region":"Americas","sub-region":"Latin America and the Caribbean","intermediate-region":"South America","region-code":"019","sub-region-code":"419","intermediate-region-code":"005"},{"name":"Comoros","alpha-2":"KM","alpha-3":"COM","country-code":"174","iso_3166-2":"ISO 3166-2:KM","region":"Africa","sub-region":"Sub-Saharan Africa","intermediate-region":"Eastern Africa","region-code":"002","sub-region-code":"202","intermediate-region-code":"014"},{"name":"Congo","alpha-2":"CG","alpha-3":"COG","country-code":"178","iso_3166-2":"ISO 3166-2:CG","region":"Africa","sub-region":"Sub-Saharan Africa","intermediate-region":"Middle Africa","region-code":"002","sub-region-code":"202","intermediate-region-code":"017"},{"name":"Congo, Democratic Republic of the","alpha-2":"CD","alpha-3":"COD","country-code":"180","iso_3166-2":"ISO 3166-2:CD","region":"Africa","sub-region":"Sub-Saharan Africa","intermediate-region":"Middle Africa","region-code":"002","sub-region-code":"202","intermediate-region-code":"017"},{"name":"Cook Islands","alpha-2":"CK","alpha-3":"COK","country-code":"184","iso_3166-2":"ISO 3166-2:CK","region":"Oceania","sub-region":"Polynesia","intermediate-region":"","region-code":"009","sub-region-code":"061","intermediate-region-code":""},{"name":"Costa Rica","alpha-2":"CR","alpha-3":"CRI","country-code":"188","iso_3166-2":"ISO 3166-2:CR","region":"Americas","sub-region":"Latin America and the Caribbean","intermediate-region":"Central America","region-code":"019","sub-region-code":"419","intermediate-region-code":"013"},{"name":"Côte d'Ivoire","alpha-2":"CI","alpha-3":"CIV","country-code":"384","iso_3166-2":"ISO 3166-2:CI","region":"Africa","sub-region":"Sub-Saharan Africa","intermediate-region":"Western Africa","region-code":"002","sub-region-code":"202","intermediate-region-code":"011"},{"name":"Croatia","alpha-2":"HR","alpha-3":"HRV","country-code":"191","iso_3166-2":"ISO 3166-2:HR","region":"Europe","sub-region":"Southern Europe","intermediate-region":"","region-code":"150","sub-region-code":"039","intermediate-region-code":""},{"name":"Cuba","alpha-2":"CU","alpha-3":"CUB","country-code":"192","iso_3166-2":"ISO 3166-2:CU","region":"Americas","sub-region":"Latin America and the Caribbean","intermediate-region":"Caribbean","region-code":"019","sub-region-code":"419","intermediate-region-code":"029"},{"name":"Curaçao","alpha-2":"CW","alpha-3":"CUW","country-code":"531","iso_3166-2":"ISO 3166-2:CW","region":"Americas","sub-region":"Latin America and the Caribbean","intermediate-region":"Caribbean","region-code":"019","sub-region-code":"419","intermediate-region-code":"029"},{"name":"Cyprus","alpha-2":"CY","alpha-3":"CYP","country-code":"196","iso_3166-2":"ISO 3166-2:CY","region":"Asia","sub-region":"Western Asia","intermediate-region":"","region-code":"142","sub-region-code":"145","intermediate-region-code":""},{"name":"Czechia","alpha-2":"CZ","alpha-3":"CZE","country-code":"203","iso_3166-2":"ISO 3166-2:CZ","region":"Europe","sub-region":"Eastern Europe","intermediate-region":"","region-code":"150","sub-region-code":"151","intermediate-region-code":""},{"name":"Denmark","alpha-2":"DK","alpha-3":"DNK","country-code":"208","iso_3166-2":"ISO 3166-2:DK","region":"Europe","sub-region":"Northern Europe","intermediate-region":"","region-code":"150","sub-region-code":"154","intermediate-region-code":""},{"name":"Djibouti","alpha-2":"DJ","alpha-3":"DJI","country-code":"262","iso_3166-2":"ISO 3166-2:DJ","region":"Africa","sub-region":"Sub-Saharan Africa","intermediate-region":"Eastern Africa","region-code":"002","sub-region-code":"202","intermediate-region-code":"014"},{"name":"Dominica","alpha-2":"DM","alpha-3":"DMA","country-code":"212","iso_3166-2":"ISO 3166-2:DM","region":"Americas","sub-region":"Latin America and the Caribbean","intermediate-region":"Caribbean","region-code":"019","sub-region-code":"419","intermediate-region-code":"029"},{"name":"Dominican Republic","alpha-2":"DO","alpha-3":"DOM","country-code":"214","iso_3166-2":"ISO 3166-2:DO","region":"Americas","sub-region":"Latin America and the Caribbean","intermediate-region":"Caribbean","region-code":"019","sub-region-code":"419","intermediate-region-code":"029"},{"name":"Ecuador","alpha-2":"EC","alpha-3":"ECU","country-code":"218","iso_3166-2":"ISO 3166-2:EC","region":"Americas","sub-region":"Latin America and the Caribbean","intermediate-region":"South America","region-code":"019","sub-region-code":"419","intermediate-region-code":"005"},{"name":"Egypt","alpha-2":"EG","alpha-3":"EGY","country-code":"818","iso_3166-2":"ISO 3166-2:EG","region":"Africa","sub-region":"Northern Africa","intermediate-region":"","region-code":"002","sub-region-code":"015","intermediate-region-code":""},{"name":"El Salvador","alpha-2":"SV","alpha-3":"SLV","country-code":"222","iso_3166-2":"ISO 3166-2:SV","region":"Americas","sub-region":"Latin America and the Caribbean","intermediate-region":"Central America","region-code":"019","sub-region-code":"419","intermediate-region-code":"013"},{"name":"Equatorial Guinea","alpha-2":"GQ","alpha-3":"GNQ","country-code":"226","iso_3166-2":"ISO 3166-2:GQ","region":"Africa","sub-region":"Sub-Saharan Africa","intermediate-region":"Middle Africa","region-code":"002","sub-region-code":"202","intermediate-region-code":"017"},{"name":"Eritrea","alpha-2":"ER","alpha-3":"ERI","country-code":"232","iso_3166-2":"ISO 3166-2:ER","region":"Africa","sub-region":"Sub-Saharan Africa","intermediate-region":"Eastern Africa","region-code":"002","sub-region-code":"202","intermediate-region-code":"014"},{"name":"Estonia","alpha-2":"EE","alpha-3":"EST","country-code":"233","iso_3166-2":"ISO 3166-2:EE","region":"Europe","sub-region":"Northern Europe","intermediate-region":"","region-code":"150","sub-region-code":"154","intermediate-region-code":""},{"name":"Eswatini","alpha-2":"SZ","alpha-3":"SWZ","country-code":"748","iso_3166-2":"ISO 3166-2:SZ","region":"Africa","sub-region":"Sub-Saharan Africa","intermediate-region":"Southern Africa","region-code":"002","sub-region-code":"202","intermediate-region-code":"018"},{"name":"Ethiopia","alpha-2":"ET","alpha-3":"ETH","country-code":"231","iso_3166-2":"ISO 3166-2:ET","region":"Africa","sub-region":"Sub-Saharan Africa","intermediate-region":"Eastern Africa","region-code":"002","sub-region-code":"202","intermediate-region-code":"014"},{"name":"Falkland Islands (Malvinas)","alpha-2":"FK","alpha-3":"FLK","country-code":"238","iso_3166-2":"ISO 3166-2:FK","region":"Americas","sub-region":"Latin America and the Caribbean","intermediate-region":"South America","region-code":"019","sub-region-code":"419","intermediate-region-code":"005"},{"name":"Faroe Islands","alpha-2":"FO","alpha-3":"FRO","country-code":"234","iso_3166-2":"ISO 3166-2:FO","region":"Europe","sub-region":"Northern Europe","intermediate-region":"","region-code":"150","sub-region-code":"154","intermediate-region-code":""},{"name":"Fiji","alpha-2":"FJ","alpha-3":"FJI","country-code":"242","iso_3166-2":"ISO 3166-2:FJ","region":"Oceania","sub-region":"Melanesia","intermediate-region":"","region-code":"009","sub-region-code":"054","intermediate-region-code":""},{"name":"Finland","alpha-2":"FI","alpha-3":"FIN","country-code":"246","iso_3166-2":"ISO 3166-2:FI","region":"Europe","sub-region":"Northern Europe","intermediate-region":"","region-code":"150","sub-region-code":"154","intermediate-region-code":""},{"name":"France","alpha-2":"FR","alpha-3":"FRA","country-code":"250","iso_3166-2":"ISO 3166-2:FR","region":"Europe","sub-region":"Western Europe","intermediate-region":"","region-code":"150","sub-region-code":"155","intermediate-region-code":""},{"name":"French Guiana","alpha-2":"GF","alpha-3":"GUF","country-code":"254","iso_3166-2":"ISO 3166-2:GF","region":"Americas","sub-region":"Latin America and the Caribbean","intermediate-region":"South America","region-code":"019","sub-region-code":"419","intermediate-region-code":"005"},{"name":"French Polynesia","alpha-2":"PF","alpha-3":"PYF","country-code":"258","iso_3166-2":"ISO 3166-2:PF","region":"Oceania","sub-region":"Polynesia","intermediate-region":"","region-code":"009","sub-region-code":"061","intermediate-region-code":""},{"name":"French Southern Territories","alpha-2":"TF","alpha-3":"ATF","country-code":"260","iso_3166-2":"ISO 3166-2:TF","region":"Africa","sub-region":"Sub-Saharan Africa","intermediate-region":"Eastern Africa","region-code":"002","sub-region-code":"202","intermediate-region-code":"014"},{"name":"Gabon","alpha-2":"GA","alpha-3":"GAB","country-code":"266","iso_3166-2":"ISO 3166-2:GA","region":"Africa","sub-region":"Sub-Saharan Africa","intermediate-region":"Middle Africa","region-code":"002","sub-region-code":"202","intermediate-region-code":"017"},{"name":"Gambia","alpha-2":"GM","alpha-3":"GMB","country-code":"270","iso_3166-2":"ISO 3166-2:GM","region":"Africa","sub-region":"Sub-Saharan Africa","intermediate-region":"Western Africa","region-code":"002","sub-region-code":"202","intermediate-region-code":"011"},{"name":"Georgia","alpha-2":"GE","alpha-3":"GEO","country-code":"268","iso_3166-2":"ISO 3166-2:GE","region":"Asia","sub-region":"Western Asia","intermediate-region":"","region-code":"142","sub-region-code":"145","intermediate-region-code":""},{"name":"Germany","alpha-2":"DE","alpha-3":"DEU","country-code":"276","iso_3166-2":"ISO 3166-2:DE","region":"Europe","sub-region":"Western Europe","intermediate-region":"","region-code":"150","sub-region-code":"155","intermediate-region-code":""},{"name":"Ghana","alpha-2":"GH","alpha-3":"GHA","country-code":"288","iso_3166-2":"ISO 3166-2:GH","region":"Africa","sub-region":"Sub-Saharan Africa","intermediate-region":"Western Africa","region-code":"002","sub-region-code":"202","intermediate-region-code":"011"},{"name":"Gibraltar","alpha-2":"GI","alpha-3":"GIB","country-code":"292","iso_3166-2":"ISO 3166-2:GI","region":"Europe","sub-region":"Southern Europe","intermediate-region":"","region-code":"150","sub-region-code":"039","intermediate-region-code":""},{"name":"Greece","alpha-2":"GR","alpha-3":"GRC","country-code":"300","iso_3166-2":"ISO 3166-2:GR","region":"Europe","sub-region":"Southern Europe","intermediate-region":"","region-code":"150","sub-region-code":"039","intermediate-region-code":""},{"name":"Greenland","alpha-2":"GL","alpha-3":"GRL","country-code":"304","iso_3166-2":"ISO 3166-2:GL","region":"Americas","sub-region":"Northern America","intermediate-region":"","region-code":"019","sub-region-code":"021","intermediate-region-code":""},{"name":"Grenada","alpha-2":"GD","alpha-3":"GRD","country-code":"308","iso_3166-2":"ISO 3166-2:GD","region":"Americas","sub-region":"Latin America and the Caribbean","intermediate-region":"Caribbean","region-code":"019","sub-region-code":"419","intermediate-region-code":"029"},{"name":"Guadeloupe","alpha-2":"GP","alpha-3":"GLP","country-code":"312","iso_3166-2":"ISO 3166-2:GP","region":"Americas","sub-region":"Latin America and the Caribbean","intermediate-region":"Caribbean","region-code":"019","sub-region-code":"419","intermediate-region-code":"029"},{"name":"Guam","alpha-2":"GU","alpha-3":"GUM","country-code":"316","iso_3166-2":"ISO 3166-2:GU","region":"Oceania","sub-region":"Micronesia","intermediate-region":"","region-code":"009","sub-region-code":"057","intermediate-region-code":""},{"name":"Guatemala","alpha-2":"GT","alpha-3":"GTM","country-code":"320","iso_3166-2":"ISO 3166-2:GT","region":"Americas","sub-region":"Latin America and the Caribbean","intermediate-region":"Central America","region-code":"019","sub-region-code":"419","intermediate-region-code":"013"},{"name":"Guernsey","alpha-2":"GG","alpha-3":"GGY","country-code":"831","iso_3166-2":"ISO 3166-2:GG","region":"Europe","sub-region":"Northern Europe","intermediate-region":"Channel Islands","region-code":"150","sub-region-code":"154","intermediate-region-code":"830"},{"name":"Guinea","alpha-2":"GN","alpha-3":"GIN","country-code":"324","iso_3166-2":"ISO 3166-2:GN","region":"Africa","sub-region":"Sub-Saharan Africa","intermediate-region":"Western Africa","region-code":"002","sub-region-code":"202","intermediate-region-code":"011"},{"name":"Guinea-Bissau","alpha-2":"GW","alpha-3":"GNB","country-code":"624","iso_3166-2":"ISO 3166-2:GW","region":"Africa","sub-region":"Sub-Saharan Africa","intermediate-region":"Western Africa","region-code":"002","sub-region-code":"202","intermediate-region-code":"011"},{"name":"Guyana","alpha-2":"GY","alpha-3":"GUY","country-code":"328","iso_3166-2":"ISO 3166-2:GY","region":"Americas","sub-region":"Latin America and the Caribbean","intermediate-region":"South America","region-code":"019","sub-region-code":"419","intermediate-region-code":"005"},{"name":"Haiti","alpha-2":"HT","alpha-3":"HTI","country-code":"332","iso_3166-2":"ISO 3166-2:HT","region":"Americas","sub-region":"Latin America and the Caribbean","intermediate-region":"Caribbean","region-code":"019","sub-region-code":"419","intermediate-region-code":"029"},{"name":"Heard Island and McDonald Islands","alpha-2":"HM","alpha-3":"HMD","country-code":"334","iso_3166-2":"ISO 3166-2:HM","region":"Oceania","sub-region":"Australia and New Zealand","intermediate-region":"","region-code":"009","sub-region-code":"053","intermediate-region-code":""},{"name":"Holy See","alpha-2":"VA","alpha-3":"VAT","country-code":"336","iso_3166-2":"ISO 3166-2:VA","region":"Europe","sub-region":"Southern Europe","intermediate-region":"","region-code":"150","sub-region-code":"039","intermediate-region-code":""},{"name":"Honduras","alpha-2":"HN","alpha-3":"HND","country-code":"340","iso_3166-2":"ISO 3166-2:HN","region":"Americas","sub-region":"Latin America and the Caribbean","intermediate-region":"Central America","region-code":"019","sub-region-code":"419","intermediate-region-code":"013"},{"name":"Hong Kong","alpha-2":"HK","alpha-3":"HKG","country-code":"344","iso_3166-2":"ISO 3166-2:HK","region":"Asia","sub-region":"Eastern Asia","intermediate-region":"","region-code":"142","sub-region-code":"030","intermediate-region-code":""},{"name":"Hungary","alpha-2":"HU","alpha-3":"HUN","country-code":"348","iso_3166-2":"ISO 3166-2:HU","region":"Europe","sub-region":"Eastern Europe","intermediate-region":"","region-code":"150","sub-region-code":"151","intermediate-region-code":""},{"name":"Iceland","alpha-2":"IS","alpha-3":"ISL","country-code":"352","iso_3166-2":"ISO 3166-2:IS","region":"Europe","sub-region":"Northern Europe","intermediate-region":"","region-code":"150","sub-region-code":"154","intermediate-region-code":""},{"name":"India","alpha-2":"IN","alpha-3":"IND","country-code":"356","iso_3166-2":"ISO 3166-2:IN","region":"Asia","sub-region":"Southern Asia","intermediate-region":"","region-code":"142","sub-region-code":"034","intermediate-region-code":""},{"name":"Indonesia","alpha-2":"ID","alpha-3":"IDN","country-code":"360","iso_3166-2":"ISO 3166-2:ID","region":"Asia","sub-region":"South-eastern Asia","intermediate-region":"","region-code":"142","sub-region-code":"035","intermediate-region-code":""},{"name":"Iran (Islamic Republic of)","alpha-2":"IR","alpha-3":"IRN","country-code":"364","iso_3166-2":"ISO 3166-2:IR","region":"Asia","sub-region":"Southern Asia","intermediate-region":"","region-code":"142","sub-region-code":"034","intermediate-region-code":""},{"name":"Iraq","alpha-2":"IQ","alpha-3":"IRQ","country-code":"368","iso_3166-2":"ISO 3166-2:IQ","region":"Asia","sub-region":"Western Asia","intermediate-region":"","region-code":"142","sub-region-code":"145","intermediate-region-code":""},{"name":"Ireland","alpha-2":"IE","alpha-3":"IRL","country-code":"372","iso_3166-2":"ISO 3166-2:IE","region":"Europe","sub-region":"Northern Europe","intermediate-region":"","region-code":"150","sub-region-code":"154","intermediate-region-code":""},{"name":"Isle of Man","alpha-2":"IM","alpha-3":"IMN","country-code":"833","iso_3166-2":"ISO 3166-2:IM","region":"Europe","sub-region":"Northern Europe","intermediate-region":"","region-code":"150","sub-region-code":"154","intermediate-region-code":""},{"name":"Israel","alpha-2":"IL","alpha-3":"ISR","country-code":"376","iso_3166-2":"ISO 3166-2:IL","region":"Asia","sub-region":"Western Asia","intermediate-region":"","region-code":"142","sub-region-code":"145","intermediate-region-code":""},{"name":"Italy","alpha-2":"IT","alpha-3":"ITA","country-code":"380","iso_3166-2":"ISO 3166-2:IT","region":"Europe","sub-region":"Southern Europe","intermediate-region":"","region-code":"150","sub-region-code":"039","intermediate-region-code":""},{"name":"Jamaica","alpha-2":"JM","alpha-3":"JAM","country-code":"388","iso_3166-2":"ISO 3166-2:JM","region":"Americas","sub-region":"Latin America and the Caribbean","intermediate-region":"Caribbean","region-code":"019","sub-region-code":"419","intermediate-region-code":"029"},{"name":"Japan","alpha-2":"JP","alpha-3":"JPN","country-code":"392","iso_3166-2":"ISO 3166-2:JP","region":"Asia","sub-region":"Eastern Asia","intermediate-region":"","region-code":"142","sub-region-code":"030","intermediate-region-code":""},{"name":"Jersey","alpha-2":"JE","alpha-3":"JEY","country-code":"832","iso_3166-2":"ISO 3166-2:JE","region":"Europe","sub-region":"Northern Europe","intermediate-region":"Channel Islands","region-code":"150","sub-region-code":"154","intermediate-region-code":"830"},{"name":"Jordan","alpha-2":"JO","alpha-3":"JOR","country-code":"400","iso_3166-2":"ISO 3166-2:JO","region":"Asia","sub-region":"Western Asia","intermediate-region":"","region-code":"142","sub-region-code":"145","intermediate-region-code":""},{"name":"Kazakhstan","alpha-2":"KZ","alpha-3":"KAZ","country-code":"398","iso_3166-2":"ISO 3166-2:KZ","region":"Asia","sub-region":"Central Asia","intermediate-region":"","region-code":"142","sub-region-code":"143","intermediate-region-code":""},{"name":"Kenya","alpha-2":"KE","alpha-3":"KEN","country-code":"404","iso_3166-2":"ISO 3166-2:KE","region":"Africa","sub-region":"Sub-Saharan Africa","intermediate-region":"Eastern Africa","region-code":"002","sub-region-code":"202","intermediate-region-code":"014"},{"name":"Kiribati","alpha-2":"KI","alpha-3":"KIR","country-code":"296","iso_3166-2":"ISO 3166-2:KI","region":"Oceania","sub-region":"Micronesia","intermediate-region":"","region-code":"009","sub-region-code":"057","intermediate-region-code":""},{"name":"Korea (Democratic People's Republic of)","alpha-2":"KP","alpha-3":"PRK","country-code":"408","iso_3166-2":"ISO 3166-2:KP","region":"Asia","sub-region":"Eastern Asia","intermediate-region":"","region-code":"142","sub-region-code":"030","intermediate-region-code":""},{"name":"Korea, Republic of","alpha-2":"KR","alpha-3":"KOR","country-code":"410","iso_3166-2":"ISO 3166-2:KR","region":"Asia","sub-region":"Eastern Asia","intermediate-region":"","region-code":"142","sub-region-code":"030","intermediate-region-code":""},{"name":"Kuwait","alpha-2":"KW","alpha-3":"KWT","country-code":"414","iso_3166-2":"ISO 3166-2:KW","region":"Asia","sub-region":"Western Asia","intermediate-region":"","region-code":"142","sub-region-code":"145","intermediate-region-code":""},{"name":"Kyrgyzstan","alpha-2":"KG","alpha-3":"KGZ","country-code":"417","iso_3166-2":"ISO 3166-2:KG","region":"Asia","sub-region":"Central Asia","intermediate-region":"","region-code":"142","sub-region-code":"143","intermediate-region-code":""},{"name":"Lao People's Democratic Republic","alpha-2":"LA","alpha-3":"LAO","country-code":"418","iso_3166-2":"ISO 3166-2:LA","region":"Asia","sub-region":"South-eastern Asia","intermediate-region":"","region-code":"142","sub-region-code":"035","intermediate-region-code":""},{"name":"Latvia","alpha-2":"LV","alpha-3":"LVA","country-code":"428","iso_3166-2":"ISO 3166-2:LV","region":"Europe","sub-region":"Northern Europe","intermediate-region":"","region-code":"150","sub-region-code":"154","intermediate-region-code":""},{"name":"Lebanon","alpha-2":"LB","alpha-3":"LBN","country-code":"422","iso_3166-2":"ISO 3166-2:LB","region":"Asia","sub-region":"Western Asia","intermediate-region":"","region-code":"142","sub-region-code":"145","intermediate-region-code":""},{"name":"Lesotho","alpha-2":"LS","alpha-3":"LSO","country-code":"426","iso_3166-2":"ISO 3166-2:LS","region":"Africa","sub-region":"Sub-Saharan Africa","intermediate-region":"Southern Africa","region-code":"002","sub-region-code":"202","intermediate-region-code":"018"},{"name":"Liberia","alpha-2":"LR","alpha-3":"LBR","country-code":"430","iso_3166-2":"ISO 3166-2:LR","region":"Africa","sub-region":"Sub-Saharan Africa","intermediate-region":"Western Africa","region-code":"002","sub-region-code":"202","intermediate-region-code":"011"},{"name":"Libya","alpha-2":"LY","alpha-3":"LBY","country-code":"434","iso_3166-2":"ISO 3166-2:LY","region":"Africa","sub-region":"Northern Africa","intermediate-region":"","region-code":"002","sub-region-code":"015","intermediate-region-code":""},{"name":"Liechtenstein","alpha-2":"LI","alpha-3":"LIE","country-code":"438","iso_3166-2":"ISO 3166-2:LI","region":"Europe","sub-region":"Western Europe","intermediate-region":"","region-code":"150","sub-region-code":"155","intermediate-region-code":""},{"name":"Lithuania","alpha-2":"LT","alpha-3":"LTU","country-code":"440","iso_3166-2":"ISO 3166-2:LT","region":"Europe","sub-region":"Northern Europe","intermediate-region":"","region-code":"150","sub-region-code":"154","intermediate-region-code":""},{"name":"Luxembourg","alpha-2":"LU","alpha-3":"LUX","country-code":"442","iso_3166-2":"ISO 3166-2:LU","region":"Europe","sub-region":"Western Europe","intermediate-region":"","region-code":"150","sub-region-code":"155","intermediate-region-code":""},{"name":"Macao","alpha-2":"MO","alpha-3":"MAC","country-code":"446","iso_3166-2":"ISO 3166-2:MO","region":"Asia","sub-region":"Eastern Asia","intermediate-region":"","region-code":"142","sub-region-code":"030","intermediate-region-code":""},{"name":"Madagascar","alpha-2":"MG","alpha-3":"MDG","country-code":"450","iso_3166-2":"ISO 3166-2:MG","region":"Africa","sub-region":"Sub-Saharan Africa","intermediate-region":"Eastern Africa","region-code":"002","sub-region-code":"202","intermediate-region-code":"014"},{"name":"Malawi","alpha-2":"MW","alpha-3":"MWI","country-code":"454","iso_3166-2":"ISO 3166-2:MW","region":"Africa","sub-region":"Sub-Saharan Africa","intermediate-region":"Eastern Africa","region-code":"002","sub-region-code":"202","intermediate-region-code":"014"},{"name":"Malaysia","alpha-2":"MY","alpha-3":"MYS","country-code":"458","iso_3166-2":"ISO 3166-2:MY","region":"Asia","sub-region":"South-eastern Asia","intermediate-region":"","region-code":"142","sub-region-code":"035","intermediate-region-code":""},{"name":"Maldives","alpha-2":"MV","alpha-3":"MDV","country-code":"462","iso_3166-2":"ISO 3166-2:MV","region":"Asia","sub-region":"Southern Asia","intermediate-region":"","region-code":"142","sub-region-code":"034","intermediate-region-code":""},{"name":"Mali","alpha-2":"ML","alpha-3":"MLI","country-code":"466","iso_3166-2":"ISO 3166-2:ML","region":"Africa","sub-region":"Sub-Saharan Africa","intermediate-region":"Western Africa","region-code":"002","sub-region-code":"202","intermediate-region-code":"011"},{"name":"Malta","alpha-2":"MT","alpha-3":"MLT","country-code":"470","iso_3166-2":"ISO 3166-2:MT","region":"Europe","sub-region":"Southern Europe","intermediate-region":"","region-code":"150","sub-region-code":"039","intermediate-region-code":""},{"name":"Marshall Islands","alpha-2":"MH","alpha-3":"MHL","country-code":"584","iso_3166-2":"ISO 3166-2:MH","region":"Oceania","sub-region":"Micronesia","intermediate-region":"","region-code":"009","sub-region-code":"057","intermediate-region-code":""},{"name":"Martinique","alpha-2":"MQ","alpha-3":"MTQ","country-code":"474","iso_3166-2":"ISO 3166-2:MQ","region":"Americas","sub-region":"Latin America and the Caribbean","intermediate-region":"Caribbean","region-code":"019","sub-region-code":"419","intermediate-region-code":"029"},{"name":"Mauritania","alpha-2":"MR","alpha-3":"MRT","country-code":"478","iso_3166-2":"ISO 3166-2:MR","region":"Africa","sub-region":"Sub-Saharan Africa","intermediate-region":"Western Africa","region-code":"002","sub-region-code":"202","intermediate-region-code":"011"},{"name":"Mauritius","alpha-2":"MU","alpha-3":"MUS","country-code":"480","iso_3166-2":"ISO 3166-2:MU","region":"Africa","sub-region":"Sub-Saharan Africa","intermediate-region":"Eastern Africa","region-code":"002","sub-region-code":"202","intermediate-region-code":"014"},{"name":"Mayotte","alpha-2":"YT","alpha-3":"MYT","country-code":"175","iso_3166-2":"ISO 3166-2:YT","region":"Africa","sub-region":"Sub-Saharan Africa","intermediate-region":"Eastern Africa","region-code":"002","sub-region-code":"202","intermediate-region-code":"014"},{"name":"Mexico","alpha-2":"MX","alpha-3":"MEX","country-code":"484","iso_3166-2":"ISO 3166-2:MX","region":"Americas","sub-region":"Latin America and the Caribbean","intermediate-region":"Central America","region-code":"019","sub-region-code":"419","intermediate-region-code":"013"},{"name":"Micronesia (Federated States of)","alpha-2":"FM","alpha-3":"FSM","country-code":"583","iso_3166-2":"ISO 3166-2:FM","region":"Oceania","sub-region":"Micronesia","intermediate-region":"","region-code":"009","sub-region-code":"057","intermediate-region-code":""},{"name":"Moldova, Republic of","alpha-2":"MD","alpha-3":"MDA","country-code":"498","iso_3166-2":"ISO 3166-2:MD","region":"Europe","sub-region":"Eastern Europe","intermediate-region":"","region-code":"150","sub-region-code":"151","intermediate-region-code":""},{"name":"Monaco","alpha-2":"MC","alpha-3":"MCO","country-code":"492","iso_3166-2":"ISO 3166-2:MC","region":"Europe","sub-region":"Western Europe","intermediate-region":"","region-code":"150","sub-region-code":"155","intermediate-region-code":""},{"name":"Mongolia","alpha-2":"MN","alpha-3":"MNG","country-code":"496","iso_3166-2":"ISO 3166-2:MN","region":"Asia","sub-region":"Eastern Asia","intermediate-region":"","region-code":"142","sub-region-code":"030","intermediate-region-code":""},{"name":"Montenegro","alpha-2":"ME","alpha-3":"MNE","country-code":"499","iso_3166-2":"ISO 3166-2:ME","region":"Europe","sub-region":"Southern Europe","intermediate-region":"","region-code":"150","sub-region-code":"039","intermediate-region-code":""},{"name":"Montserrat","alpha-2":"MS","alpha-3":"MSR","country-code":"500","iso_3166-2":"ISO 3166-2:MS","region":"Americas","sub-region":"Latin America and the Caribbean","intermediate-region":"Caribbean","region-code":"019","sub-region-code":"419","intermediate-region-code":"029"},{"name":"Morocco","alpha-2":"MA","alpha-3":"MAR","country-code":"504","iso_3166-2":"ISO 3166-2:MA","region":"Africa","sub-region":"Northern Africa","intermediate-region":"","region-code":"002","sub-region-code":"015","intermediate-region-code":""},{"name":"Mozambique","alpha-2":"MZ","alpha-3":"MOZ","country-code":"508","iso_3166-2":"ISO 3166-2:MZ","region":"Africa","sub-region":"Sub-Saharan Africa","intermediate-region":"Eastern Africa","region-code":"002","sub-region-code":"202","intermediate-region-code":"014"},{"name":"Myanmar","alpha-2":"MM","alpha-3":"MMR","country-code":"104","iso_3166-2":"ISO 3166-2:MM","region":"Asia","sub-region":"South-eastern Asia","intermediate-region":"","region-code":"142","sub-region-code":"035","intermediate-region-code":""},{"name":"Namibia","alpha-2":"NA","alpha-3":"NAM","country-code":"516","iso_3166-2":"ISO 3166-2:NA","region":"Africa","sub-region":"Sub-Saharan Africa","intermediate-region":"Southern Africa","region-code":"002","sub-region-code":"202","intermediate-region-code":"018"},{"name":"Nauru","alpha-2":"NR","alpha-3":"NRU","country-code":"520","iso_3166-2":"ISO 3166-2:NR","region":"Oceania","sub-region":"Micronesia","intermediate-region":"","region-code":"009","sub-region-code":"057","intermediate-region-code":""},{"name":"Nepal","alpha-2":"NP","alpha-3":"NPL","country-code":"524","iso_3166-2":"ISO 3166-2:NP","region":"Asia","sub-region":"Southern Asia","intermediate-region":"","region-code":"142","sub-region-code":"034","intermediate-region-code":""},{"name":"Netherlands","alpha-2":"NL","alpha-3":"NLD","country-code":"528","iso_3166-2":"ISO 3166-2:NL","region":"Europe","sub-region":"Western Europe","intermediate-region":"","region-code":"150","sub-region-code":"155","intermediate-region-code":""},{"name":"New Caledonia","alpha-2":"NC","alpha-3":"NCL","country-code":"540","iso_3166-2":"ISO 3166-2:NC","region":"Oceania","sub-region":"Melanesia","intermediate-region":"","region-code":"009","sub-region-code":"054","intermediate-region-code":""},{"name":"New Zealand","alpha-2":"NZ","alpha-3":"NZL","country-code":"554","iso_3166-2":"ISO 3166-2:NZ","region":"Oceania","sub-region":"Australia and New Zealand","intermediate-region":"","region-code":"009","sub-region-code":"053","intermediate-region-code":""},{"name":"Nicaragua","alpha-2":"NI","alpha-3":"NIC","country-code":"558","iso_3166-2":"ISO 3166-2:NI","region":"Americas","sub-region":"Latin America and the Caribbean","intermediate-region":"Central America","region-code":"019","sub-region-code":"419","intermediate-region-code":"013"},{"name":"Niger","alpha-2":"NE","alpha-3":"NER","country-code":"562","iso_3166-2":"ISO 3166-2:NE","region":"Africa","sub-region":"Sub-Saharan Africa","intermediate-region":"Western Africa","region-code":"002","sub-region-code":"202","intermediate-region-code":"011"},{"name":"Nigeria","alpha-2":"NG","alpha-3":"NGA","country-code":"566","iso_3166-2":"ISO 3166-2:NG","region":"Africa","sub-region":"Sub-Saharan Africa","intermediate-region":"Western Africa","region-code":"002","sub-region-code":"202","intermediate-region-code":"011"},{"name":"Niue","alpha-2":"NU","alpha-3":"NIU","country-code":"570","iso_3166-2":"ISO 3166-2:NU","region":"Oceania","sub-region":"Polynesia","intermediate-region":"","region-code":"009","sub-region-code":"061","intermediate-region-code":""},{"name":"Norfolk Island","alpha-2":"NF","alpha-3":"NFK","country-code":"574","iso_3166-2":"ISO 3166-2:NF","region":"Oceania","sub-region":"Australia and New Zealand","intermediate-region":"","region-code":"009","sub-region-code":"053","intermediate-region-code":""},{"name":"North Macedonia","alpha-2":"MK","alpha-3":"MKD","country-code":"807","iso_3166-2":"ISO 3166-2:MK","region":"Europe","sub-region":"Southern Europe","intermediate-region":"","region-code":"150","sub-region-code":"039","intermediate-region-code":""},{"name":"Northern Mariana Islands","alpha-2":"MP","alpha-3":"MNP","country-code":"580","iso_3166-2":"ISO 3166-2:MP","region":"Oceania","sub-region":"Micronesia","intermediate-region":"","region-code":"009","sub-region-code":"057","intermediate-region-code":""},{"name":"Norway","alpha-2":"NO","alpha-3":"NOR","country-code":"578","iso_3166-2":"ISO 3166-2:NO","region":"Europe","sub-region":"Northern Europe","intermediate-region":"","region-code":"150","sub-region-code":"154","intermediate-region-code":""},{"name":"Oman","alpha-2":"OM","alpha-3":"OMN","country-code":"512","iso_3166-2":"ISO 3166-2:OM","region":"Asia","sub-region":"Western Asia","intermediate-region":"","region-code":"142","sub-region-code":"145","intermediate-region-code":""},{"name":"Pakistan","alpha-2":"PK","alpha-3":"PAK","country-code":"586","iso_3166-2":"ISO 3166-2:PK","region":"Asia","sub-region":"Southern Asia","intermediate-region":"","region-code":"142","sub-region-code":"034","intermediate-region-code":""},{"name":"Palau","alpha-2":"PW","alpha-3":"PLW","country-code":"585","iso_3166-2":"ISO 3166-2:PW","region":"Oceania","sub-region":"Micronesia","intermediate-region":"","region-code":"009","sub-region-code":"057","intermediate-region-code":""},{"name":"Palestine, State of","alpha-2":"PS","alpha-3":"PSE","country-code":"275","iso_3166-2":"ISO 3166-2:PS","region":"Asia","sub-region":"Western Asia","intermediate-region":"","region-code":"142","sub-region-code":"145","intermediate-region-code":""},{"name":"Panama","alpha-2":"PA","alpha-3":"PAN","country-code":"591","iso_3166-2":"ISO 3166-2:PA","region":"Americas","sub-region":"Latin America and the Caribbean","intermediate-region":"Central America","region-code":"019","sub-region-code":"419","intermediate-region-code":"013"},{"name":"Papua New Guinea","alpha-2":"PG","alpha-3":"PNG","country-code":"598","iso_3166-2":"ISO 3166-2:PG","region":"Oceania","sub-region":"Melanesia","intermediate-region":"","region-code":"009","sub-region-code":"054","intermediate-region-code":""},{"name":"Paraguay","alpha-2":"PY","alpha-3":"PRY","country-code":"600","iso_3166-2":"ISO 3166-2:PY","region":"Americas","sub-region":"Latin America and the Caribbean","intermediate-region":"South America","region-code":"019","sub-region-code":"419","intermediate-region-code":"005"},{"name":"Peru","alpha-2":"PE","alpha-3":"PER","country-code":"604","iso_3166-2":"ISO 3166-2:PE","region":"Americas","sub-region":"Latin America and the Caribbean","intermediate-region":"South America","region-code":"019","sub-region-code":"419","intermediate-region-code":"005"},{"name":"Philippines","alpha-2":"PH","alpha-3":"PHL","country-code":"608","iso_3166-2":"ISO 3166-2:PH","region":"Asia","sub-region":"South-eastern Asia","intermediate-region":"","region-code":"142","sub-region-code":"035","intermediate-region-code":""},{"name":"Pitcairn","alpha-2":"PN","alpha-3":"PCN","country-code":"612","iso_3166-2":"ISO 3166-2:PN","region":"Oceania","sub-region":"Polynesia","intermediate-region":"","region-code":"009","sub-region-code":"061","intermediate-region-code":""},{"name":"Poland","alpha-2":"PL","alpha-3":"POL","country-code":"616","iso_3166-2":"ISO 3166-2:PL","region":"Europe","sub-region":"Eastern Europe","intermediate-region":"","region-code":"150","sub-region-code":"151","intermediate-region-code":""},{"name":"Portugal","alpha-2":"PT","alpha-3":"PRT","country-code":"620","iso_3166-2":"ISO 3166-2:PT","region":"Europe","sub-region":"Southern Europe","intermediate-region":"","region-code":"150","sub-region-code":"039","intermediate-region-code":""},{"name":"Puerto Rico","alpha-2":"PR","alpha-3":"PRI","country-code":"630","iso_3166-2":"ISO 3166-2:PR","region":"Americas","sub-region":"Latin America and the Caribbean","intermediate-region":"Caribbean","region-code":"019","sub-region-code":"419","intermediate-region-code":"029"},{"name":"Qatar","alpha-2":"QA","alpha-3":"QAT","country-code":"634","iso_3166-2":"ISO 3166-2:QA","region":"Asia","sub-region":"Western Asia","intermediate-region":"","region-code":"142","sub-region-code":"145","intermediate-region-code":""},{"name":"Réunion","alpha-2":"RE","alpha-3":"REU","country-code":"638","iso_3166-2":"ISO 3166-2:RE","region":"Africa","sub-region":"Sub-Saharan Africa","intermediate-region":"Eastern Africa","region-code":"002","sub-region-code":"202","intermediate-region-code":"014"},{"name":"Romania","alpha-2":"RO","alpha-3":"ROU","country-code":"642","iso_3166-2":"ISO 3166-2:RO","region":"Europe","sub-region":"Eastern Europe","intermediate-region":"","region-code":"150","sub-region-code":"151","intermediate-region-code":""},{"name":"Russian Federation","alpha-2":"RU","alpha-3":"RUS","country-code":"643","iso_3166-2":"ISO 3166-2:RU","region":"Europe","sub-region":"Eastern Europe","intermediate-region":"","region-code":"150","sub-region-code":"151","intermediate-region-code":""},{"name":"Rwanda","alpha-2":"RW","alpha-3":"RWA","country-code":"646","iso_3166-2":"ISO 3166-2:RW","region":"Africa","sub-region":"Sub-Saharan Africa","intermediate-region":"Eastern Africa","region-code":"002","sub-region-code":"202","intermediate-region-code":"014"},{"name":"Saint Barthélemy","alpha-2":"BL","alpha-3":"BLM","country-code":"652","iso_3166-2":"ISO 3166-2:BL","region":"Americas","sub-region":"Latin America and the Caribbean","intermediate-region":"Caribbean","region-code":"019","sub-region-code":"419","intermediate-region-code":"029"},{"name":"Saint Helena, Ascension and Tristan da Cunha","alpha-2":"SH","alpha-3":"SHN","country-code":"654","iso_3166-2":"ISO 3166-2:SH","region":"Africa","sub-region":"Sub-Saharan Africa","intermediate-region":"Western Africa","region-code":"002","sub-region-code":"202","intermediate-region-code":"011"},{"name":"Saint Kitts and Nevis","alpha-2":"KN","alpha-3":"KNA","country-code":"659","iso_3166-2":"ISO 3166-2:KN","region":"Americas","sub-region":"Latin America and the Caribbean","intermediate-region":"Caribbean","region-code":"019","sub-region-code":"419","intermediate-region-code":"029"},{"name":"Saint Lucia","alpha-2":"LC","alpha-3":"LCA","country-code":"662","iso_3166-2":"ISO 3166-2:LC","region":"Americas","sub-region":"Latin America and the Caribbean","intermediate-region":"Caribbean","region-code":"019","sub-region-code":"419","intermediate-region-code":"029"},{"name":"Saint Martin (French part)","alpha-2":"MF","alpha-3":"MAF","country-code":"663","iso_3166-2":"ISO 3166-2:MF","region":"Americas","sub-region":"Latin America and the Caribbean","intermediate-region":"Caribbean","region-code":"019","sub-region-code":"419","intermediate-region-code":"029"},{"name":"Saint Pierre and Miquelon","alpha-2":"PM","alpha-3":"SPM","country-code":"666","iso_3166-2":"ISO 3166-2:PM","region":"Americas","sub-region":"Northern America","intermediate-region":"","region-code":"019","sub-region-code":"021","intermediate-region-code":""},{"name":"Saint Vincent and the Grenadines","alpha-2":"VC","alpha-3":"VCT","country-code":"670","iso_3166-2":"ISO 3166-2:VC","region":"Americas","sub-region":"Latin America and the Caribbean","intermediate-region":"Caribbean","region-code":"019","sub-region-code":"419","intermediate-region-code":"029"},{"name":"Samoa","alpha-2":"WS","alpha-3":"WSM","country-code":"882","iso_3166-2":"ISO 3166-2:WS","region":"Oceania","sub-region":"Polynesia","intermediate-region":"","region-code":"009","sub-region-code":"061","intermediate-region-code":""},{"name":"San Marino","alpha-2":"SM","alpha-3":"SMR","country-code":"674","iso_3166-2":"ISO 3166-2:SM","region":"Europe","sub-region":"Southern Europe","intermediate-region":"","region-code":"150","sub-region-code":"039","intermediate-region-code":""},{"name":"Sao Tome and Principe","alpha-2":"ST","alpha-3":"STP","country-code":"678","iso_3166-2":"ISO 3166-2:ST","region":"Africa","sub-region":"Sub-Saharan Africa","intermediate-region":"Middle Africa","region-code":"002","sub-region-code":"202","intermediate-region-code":"017"},{"name":"Saudi Arabia","alpha-2":"SA","alpha-3":"SAU","country-code":"682","iso_3166-2":"ISO 3166-2:SA","region":"Asia","sub-region":"Western Asia","intermediate-region":"","region-code":"142","sub-region-code":"145","intermediate-region-code":""},{"name":"Senegal","alpha-2":"SN","alpha-3":"SEN","country-code":"686","iso_3166-2":"ISO 3166-2:SN","region":"Africa","sub-region":"Sub-Saharan Africa","intermediate-region":"Western Africa","region-code":"002","sub-region-code":"202","intermediate-region-code":"011"},{"name":"Serbia","alpha-2":"RS","alpha-3":"SRB","country-code":"688","iso_3166-2":"ISO 3166-2:RS","region":"Europe","sub-region":"Southern Europe","intermediate-region":"","region-code":"150","sub-region-code":"039","intermediate-region-code":""},{"name":"Seychelles","alpha-2":"SC","alpha-3":"SYC","country-code":"690","iso_3166-2":"ISO 3166-2:SC","region":"Africa","sub-region":"Sub-Saharan Africa","intermediate-region":"Eastern Africa","region-code":"002","sub-region-code":"202","intermediate-region-code":"014"},{"name":"Sierra Leone","alpha-2":"SL","alpha-3":"SLE","country-code":"694","iso_3166-2":"ISO 3166-2:SL","region":"Africa","sub-region":"Sub-Saharan Africa","intermediate-region":"Western Africa","region-code":"002","sub-region-code":"202","intermediate-region-code":"011"},{"name":"Singapore","alpha-2":"SG","alpha-3":"SGP","country-code":"702","iso_3166-2":"ISO 3166-2:SG","region":"Asia","sub-region":"South-eastern Asia","intermediate-region":"","region-code":"142","sub-region-code":"035","intermediate-region-code":""},{"name":"Sint Maarten (Dutch part)","alpha-2":"SX","alpha-3":"SXM","country-code":"534","iso_3166-2":"ISO 3166-2:SX","region":"Americas","sub-region":"Latin America and the Caribbean","intermediate-region":"Caribbean","region-code":"019","sub-region-code":"419","intermediate-region-code":"029"},{"name":"Slovakia","alpha-2":"SK","alpha-3":"SVK","country-code":"703","iso_3166-2":"ISO 3166-2:SK","region":"Europe","sub-region":"Eastern Europe","intermediate-region":"","region-code":"150","sub-region-code":"151","intermediate-region-code":""},{"name":"Slovenia","alpha-2":"SI","alpha-3":"SVN","country-code":"705","iso_3166-2":"ISO 3166-2:SI","region":"Europe","sub-region":"Southern Europe","intermediate-region":"","region-code":"150","sub-region-code":"039","intermediate-region-code":""},{"name":"Solomon Islands","alpha-2":"SB","alpha-3":"SLB","country-code":"090","iso_3166-2":"ISO 3166-2:SB","region":"Oceania","sub-region":"Melanesia","intermediate-region":"","region-code":"009","sub-region-code":"054","intermediate-region-code":""},{"name":"Somalia","alpha-2":"SO","alpha-3":"SOM","country-code":"706","iso_3166-2":"ISO 3166-2:SO","region":"Africa","sub-region":"Sub-Saharan Africa","intermediate-region":"Eastern Africa","region-code":"002","sub-region-code":"202","intermediate-region-code":"014"},{"name":"South Africa","alpha-2":"ZA","alpha-3":"ZAF","country-code":"710","iso_3166-2":"ISO 3166-2:ZA","region":"Africa","sub-region":"Sub-Saharan Africa","intermediate-region":"Southern Africa","region-code":"002","sub-region-code":"202","intermediate-region-code":"018"},{"name":"South Georgia and the South Sandwich Islands","alpha-2":"GS","alpha-3":"SGS","country-code":"239","iso_3166-2":"ISO 3166-2:GS","region":"Americas","sub-region":"Latin America and the Caribbean","intermediate-region":"South America","region-code":"019","sub-region-code":"419","intermediate-region-code":"005"},{"name":"South Sudan","alpha-2":"SS","alpha-3":"SSD","country-code":"728","iso_3166-2":"ISO 3166-2:SS","region":"Africa","sub-region":"Sub-Saharan Africa","intermediate-region":"Eastern Africa","region-code":"002","sub-region-code":"202","intermediate-region-code":"014"},{"name":"Spain","alpha-2":"ES","alpha-3":"ESP","country-code":"724","iso_3166-2":"ISO 3166-2:ES","region":"Europe","sub-region":"Southern Europe","intermediate-region":"","region-code":"150","sub-region-code":"039","intermediate-region-code":""},{"name":"Sri Lanka","alpha-2":"LK","alpha-3":"LKA","country-code":"144","iso_3166-2":"ISO 3166-2:LK","region":"Asia","sub-region":"Southern Asia","intermediate-region":"","region-code":"142","sub-region-code":"034","intermediate-region-code":""},{"name":"Sudan","alpha-2":"SD","alpha-3":"SDN","country-code":"729","iso_3166-2":"ISO 3166-2:SD","region":"Africa","sub-region":"Northern Africa","intermediate-region":"","region-code":"002","sub-region-code":"015","intermediate-region-code":""},{"name":"Suriname","alpha-2":"SR","alpha-3":"SUR","country-code":"740","iso_3166-2":"ISO 3166-2:SR","region":"Americas","sub-region":"Latin America and the Caribbean","intermediate-region":"South America","region-code":"019","sub-region-code":"419","intermediate-region-code":"005"},{"name":"Svalbard and Jan Mayen","alpha-2":"SJ","alpha-3":"SJM","country-code":"744","iso_3166-2":"ISO 3166-2:SJ","region":"Europe","sub-region":"Northern Europe","intermediate-region":"","region-code":"150","sub-region-code":"154","intermediate-region-code":""},{"name":"Sweden","alpha-2":"SE","alpha-3":"SWE","country-code":"752","iso_3166-2":"ISO 3166-2:SE","region":"Europe","sub-region":"Northern Europe","intermediate-region":"","region-code":"150","sub-region-code":"154","intermediate-region-code":""},{"name":"Switzerland","alpha-2":"CH","alpha-3":"CHE","country-code":"756","iso_3166-2":"ISO 3166-2:CH","region":"Europe","sub-region":"Western Europe","intermediate-region":"","region-code":"150","sub-region-code":"155","intermediate-region-code":""},{"name":"Syrian Arab Republic","alpha-2":"SY","alpha-3":"SYR","country-code":"760","iso_3166-2":"ISO 3166-2:SY","region":"Asia","sub-region":"Western Asia","intermediate-region":"","region-code":"142","sub-region-code":"145","intermediate-region-code":""},{"name":"Taiwan, Province of China","alpha-2":"TW","alpha-3":"TWN","country-code":"158","iso_3166-2":"ISO 3166-2:TW","region":"Asia","sub-region":"Eastern Asia","intermediate-region":"","region-code":"142","sub-region-code":"030","intermediate-region-code":""},{"name":"Tajikistan","alpha-2":"TJ","alpha-3":"TJK","country-code":"762","iso_3166-2":"ISO 3166-2:TJ","region":"Asia","sub-region":"Central Asia","intermediate-region":"","region-code":"142","sub-region-code":"143","intermediate-region-code":""},{"name":"Tanzania, United Republic of","alpha-2":"TZ","alpha-3":"TZA","country-code":"834","iso_3166-2":"ISO 3166-2:TZ","region":"Africa","sub-region":"Sub-Saharan Africa","intermediate-region":"Eastern Africa","region-code":"002","sub-region-code":"202","intermediate-region-code":"014"},{"name":"Thailand","alpha-2":"TH","alpha-3":"THA","country-code":"764","iso_3166-2":"ISO 3166-2:TH","region":"Asia","sub-region":"South-eastern Asia","intermediate-region":"","region-code":"142","sub-region-code":"035","intermediate-region-code":""},{"name":"Timor-Leste","alpha-2":"TL","alpha-3":"TLS","country-code":"626","iso_3166-2":"ISO 3166-2:TL","region":"Asia","sub-region":"South-eastern Asia","intermediate-region":"","region-code":"142","sub-region-code":"035","intermediate-region-code":""},{"name":"Togo","alpha-2":"TG","alpha-3":"TGO","country-code":"768","iso_3166-2":"ISO 3166-2:TG","region":"Africa","sub-region":"Sub-Saharan Africa","intermediate-region":"Western Africa","region-code":"002","sub-region-code":"202","intermediate-region-code":"011"},{"name":"Tokelau","alpha-2":"TK","alpha-3":"TKL","country-code":"772","iso_3166-2":"ISO 3166-2:TK","region":"Oceania","sub-region":"Polynesia","intermediate-region":"","region-code":"009","sub-region-code":"061","intermediate-region-code":""},{"name":"Tonga","alpha-2":"TO","alpha-3":"TON","country-code":"776","iso_3166-2":"ISO 3166-2:TO","region":"Oceania","sub-region":"Polynesia","intermediate-region":"","region-code":"009","sub-region-code":"061","intermediate-region-code":""},{"name":"Trinidad and Tobago","alpha-2":"TT","alpha-3":"TTO","country-code":"780","iso_3166-2":"ISO 3166-2:TT","region":"Americas","sub-region":"Latin America and the Caribbean","intermediate-region":"Caribbean","region-code":"019","sub-region-code":"419","intermediate-region-code":"029"},{"name":"Tunisia","alpha-2":"TN","alpha-3":"TUN","country-code":"788","iso_3166-2":"ISO 3166-2:TN","region":"Africa","sub-region":"Northern Africa","intermediate-region":"","region-code":"002","sub-region-code":"015","intermediate-region-code":""},{"name":"Turkey","alpha-2":"TR","alpha-3":"TUR","country-code":"792","iso_3166-2":"ISO 3166-2:TR","region":"Asia","sub-region":"Western Asia","intermediate-region":"","region-code":"142","sub-region-code":"145","intermediate-region-code":""},{"name":"Turkmenistan","alpha-2":"TM","alpha-3":"TKM","country-code":"795","iso_3166-2":"ISO 3166-2:TM","region":"Asia","sub-region":"Central Asia","intermediate-region":"","region-code":"142","sub-region-code":"143","intermediate-region-code":""},{"name":"Turks and Caicos Islands","alpha-2":"TC","alpha-3":"TCA","country-code":"796","iso_3166-2":"ISO 3166-2:TC","region":"Americas","sub-region":"Latin America and the Caribbean","intermediate-region":"Caribbean","region-code":"019","sub-region-code":"419","intermediate-region-code":"029"},{"name":"Tuvalu","alpha-2":"TV","alpha-3":"TUV","country-code":"798","iso_3166-2":"ISO 3166-2:TV","region":"Oceania","sub-region":"Polynesia","intermediate-region":"","region-code":"009","sub-region-code":"061","intermediate-region-code":""},{"name":"Uganda","alpha-2":"UG","alpha-3":"UGA","country-code":"800","iso_3166-2":"ISO 3166-2:UG","region":"Africa","sub-region":"Sub-Saharan Africa","intermediate-region":"Eastern Africa","region-code":"002","sub-region-code":"202","intermediate-region-code":"014"},{"name":"Ukraine","alpha-2":"UA","alpha-3":"UKR","country-code":"804","iso_3166-2":"ISO 3166-2:UA","region":"Europe","sub-region":"Eastern Europe","intermediate-region":"","region-code":"150","sub-region-code":"151","intermediate-region-code":""},{"name":"United Arab Emirates","alpha-2":"AE","alpha-3":"ARE","country-code":"784","iso_3166-2":"ISO 3166-2:AE","region":"Asia","sub-region":"Western Asia","intermediate-region":"","region-code":"142","sub-region-code":"145","intermediate-region-code":""},{"name":"United Kingdom of Great Britain and Northern Ireland","alpha-2":"GB","alpha-3":"GBR","country-code":"826","iso_3166-2":"ISO 3166-2:GB","region":"Europe","sub-region":"Northern Europe","intermediate-region":"","region-code":"150","sub-region-code":"154","intermediate-region-code":""},{"name":"United States of America","alpha-2":"US","alpha-3":"USA","country-code":"840","iso_3166-2":"ISO 3166-2:US","region":"Americas","sub-region":"Northern America","intermediate-region":"","region-code":"019","sub-region-code":"021","intermediate-region-code":""},{"name":"United States Minor Outlying Islands","alpha-2":"UM","alpha-3":"UMI","country-code":"581","iso_3166-2":"ISO 3166-2:UM","region":"Oceania","sub-region":"Micronesia","intermediate-region":"","region-code":"009","sub-region-code":"057","intermediate-region-code":""},{"name":"Uruguay","alpha-2":"UY","alpha-3":"URY","country-code":"858","iso_3166-2":"ISO 3166-2:UY","region":"Americas","sub-region":"Latin America and the Caribbean","intermediate-region":"South America","region-code":"019","sub-region-code":"419","intermediate-region-code":"005"},{"name":"Uzbekistan","alpha-2":"UZ","alpha-3":"UZB","country-code":"860","iso_3166-2":"ISO 3166-2:UZ","region":"Asia","sub-region":"Central Asia","intermediate-region":"","region-code":"142","sub-region-code":"143","intermediate-region-code":""},{"name":"Vanuatu","alpha-2":"VU","alpha-3":"VUT","country-code":"548","iso_3166-2":"ISO 3166-2:VU","region":"Oceania","sub-region":"Melanesia","intermediate-region":"","region-code":"009","sub-region-code":"054","intermediate-region-code":""},{"name":"Venezuela (Bolivarian Republic of)","alpha-2":"VE","alpha-3":"VEN","country-code":"862","iso_3166-2":"ISO 3166-2:VE","region":"Americas","sub-region":"Latin America and the Caribbean","intermediate-region":"South America","region-code":"019","sub-region-code":"419","intermediate-region-code":"005"},{"name":"Viet Nam","alpha-2":"VN","alpha-3":"VNM","country-code":"704","iso_3166-2":"ISO 3166-2:VN","region":"Asia","sub-region":"South-eastern Asia","intermediate-region":"","region-code":"142","sub-region-code":"035","intermediate-region-code":""},{"name":"Virgin Islands (British)","alpha-2":"VG","alpha-3":"VGB","country-code":"092","iso_3166-2":"ISO 3166-2:VG","region":"Americas","sub-region":"Latin America and the Caribbean","intermediate-region":"Caribbean","region-code":"019","sub-region-code":"419","intermediate-region-code":"029"},{"name":"Virgin Islands (U.S.)","alpha-2":"VI","alpha-3":"VIR","country-code":"850","iso_3166-2":"ISO 3166-2:VI","region":"Americas","sub-region":"Latin America and the Caribbean","intermediate-region":"Caribbean","region-code":"019","sub-region-code":"419","intermediate-region-code":"029"},{"name":"Wallis and Futuna","alpha-2":"WF","alpha-3":"WLF","country-code":"876","iso_3166-2":"ISO 3166-2:WF","region":"Oceania","sub-region":"Polynesia","intermediate-region":"","region-code":"009","sub-region-code":"061","intermediate-region-code":""},{"name":"Western Sahara","alpha-2":"EH","alpha-3":"ESH","country-code":"732","iso_3166-2":"ISO 3166-2:EH","region":"Africa","sub-region":"Northern Africa","intermediate-region":"","region-code":"002","sub-region-code":"015","intermediate-region-code":""},{"name":"Yemen","alpha-2":"YE","alpha-3":"YEM","country-code":"887","iso_3166-2":"ISO 3166-2:YE","region":"Asia","sub-region":"Western Asia","intermediate-region":"","region-code":"142","sub-region-code":"145","intermediate-region-code":""},{"name":"Zambia","alpha-2":"ZM","alpha-3":"ZMB","country-code":"894","iso_3166-2":"ISO 3166-2:ZM","region":"Africa","sub-region":"Sub-Saharan Africa","intermediate-region":"Eastern Africa","region-code":"002","sub-region-code":"202","intermediate-region-code":"014"},{"name":"Zimbabwe","alpha-2":"ZW","alpha-3":"ZWE","country-code":"716","iso_3166-2":"ISO 3166-2:ZW","region":"Africa","sub-region":"Sub-Saharan Africa","intermediate-region":"Eastern Africa","region-code":"002","sub-region-code":"202","intermediate-region-code":"014"}] diff --git a/nautilus_nlp/_config/stopwords.json b/nautilus_nlp/_config/stopwords.json deleted file mode 100644 index cb4625f..0000000 --- a/nautilus_nlp/_config/stopwords.json +++ /dev/null @@ -1 +0,0 @@ -{"af":["'n","aan","af","al","as","baie","by","daar","dag","dat","die","dit","een","ek","en","gaan","gesê","haar","het","hom","hulle","hy","in","is","jou","jy","kan","kom","ma","maar","met","my","na","nie","om","ons","op","saam","sal","se","sien","so","sy","te","toe","uit","van","vir","was","wat","ʼn"],"ha":["a","amma","ba","ban","ce","cikin","da","don","ga","in","ina","ita","ji","ka","ko","kuma","lokacin","ma","mai","na","ne","ni","sai","shi","su","suka","sun","ta","tafi","take","tana","wani","wannan","wata","ya","yake","yana","yi","za"],"so":["aad","albaabkii","atabo","ay","ayaa","ayee","ayuu","dhan","hadana","in","inuu","isku","jiray","jirtay","ka","kale","kasoo","ku","kuu","lakin","markii","oo","si","soo","uga","ugu","uu","waa","waxa","waxuu"],"st":["a","ba","bane","bona","e","ea","eaba","empa","ena","ha","hae","hape","ho","hore","ka","ke","la","le","li","me","mo","moo","ne","o","oa","re","sa","se","tloha","tsa","tse"],"sw":["akasema","alikuwa","alisema","baada","basi","bila","cha","chini","hadi","hapo","hata","hivyo","hiyo","huku","huo","ili","ilikuwa","juu","kama","karibu","katika","kila","kima","kisha","kubwa","kutoka","kuwa","kwa","kwamba","kwenda","kwenye","la","lakini","mara","mdogo","mimi","mkubwa","mmoja","moja","muda","mwenye","na","naye","ndani","ng","ni","nini","nonkungu","pamoja","pia","sana","sasa","sauti","tafadhali","tena","tu","vile","wa","wakati","wake","walikuwa","wao","watu","wengine","wote","ya","yake","yangu","yao","yeye","yule","za","zaidi","zake"],"yo":["a","an","bá","bí","bẹ̀rẹ̀","fún","fẹ́","gbogbo","inú","jù","jẹ","jẹ́","kan","kì","kí","kò","láti","lè","lọ","mi","mo","máa","mọ̀","ni","náà","ní","nígbà","nítorí","nǹkan","o","padà","pé","púpọ̀","pẹ̀lú","rẹ̀","sì","sí","sínú","ṣ","ti","tí","wà","wá","wọn","wọ́n","yìí","àti","àwọn","é","í","òun","ó","ń","ńlá","ṣe","ṣé","ṣùgbọ́n","ẹmọ́","ọjọ́","ọ̀pọ̀lọpọ̀"],"zu":["futhi","kahle","kakhulu","kanye","khona","kodwa","kungani","kusho","la","lakhe","lapho","mina","ngesikhathi","nje","phansi","phezulu","u","ukuba","ukuthi","ukuze","uma","wahamba","wakhe","wami","wase","wathi","yakhe","zakhe","zonke"],"da":["af","alle","andet","andre","at","begge","da","de","den","denne","der","deres","det","dette","dig","din","dog","du","ej","eller","en","end","ene","eneste","enhver","et","fem","fire","flere","fleste","for","fordi","forrige","fra","få","før","god","han","hans","har","hendes","her","hun","hvad","hvem","hver","hvilken","hvis","hvor","hvordan","hvorfor","hvornår","i","ikke","ind","ingen","intet","jeg","jeres","kan","kom","kommer","lav","lidt","lille","man","mand","mange","med","meget","men","mens","mere","mig","ned","ni","nogen","noget","ny","nyt","nær","næste","næsten","og","op","otte","over","på","se","seks","ses","som","stor","store","syv","ti","til","to","tre","ud","var"],"de":["Ernst","Ordnung","Schluss","a","ab","aber","ach","acht","achte","achten","achter","achtes","ag","alle","allein","allem","allen","aller","allerdings","alles","allgemeinen","als","also","am","an","andere","anderen","andern","anders","au","auch","auf","aus","ausser","ausserdem","außer","außerdem","b","bald","bei","beide","beiden","beim","beispiel","bekannt","bereits","besonders","besser","besten","bin","bis","bisher","bist","c","d","d.h","da","dabei","dadurch","dafür","dagegen","daher","dahin","dahinter","damals","damit","danach","daneben","dank","dann","daran","darauf","daraus","darf","darfst","darin","darum","darunter","darüber","das","dasein","daselbst","dass","dasselbe","davon","davor","dazu","dazwischen","daß","dein","deine","deinem","deiner","dem","dementsprechend","demgegenüber","demgemäss","demgemäß","demselben","demzufolge","den","denen","denn","denselben","der","deren","derjenige","derjenigen","dermassen","dermaßen","derselbe","derselben","des","deshalb","desselben","dessen","deswegen","dich","die","diejenige","diejenigen","dies","diese","dieselbe","dieselben","diesem","diesen","dieser","dieses","dir","doch","dort","drei","drin","dritte","dritten","dritter","drittes","du","durch","durchaus","durfte","durften","dürfen","dürft","e","eben","ebenso","ehrlich","ei","ei,","eigen","eigene","eigenen","eigener","eigenes","ein","einander","eine","einem","einen","einer","eines","einige","einigen","einiger","einiges","einmal","eins","elf","en","ende","endlich","entweder","er","erst","erste","ersten","erster","erstes","es","etwa","etwas","euch","euer","eure","f","folgende","früher","fünf","fünfte","fünften","fünfter","fünftes","für","g","gab","ganz","ganze","ganzen","ganzer","ganzes","gar","gedurft","gegen","gegenüber","gehabt","gehen","geht","gekannt","gekonnt","gemacht","gemocht","gemusst","genug","gerade","gern","gesagt","geschweige","gewesen","gewollt","geworden","gibt","ging","gleich","gott","gross","grosse","grossen","grosser","grosses","groß","große","großen","großer","großes","gut","gute","guter","gutes","h","habe","haben","habt","hast","hat","hatte","hatten","hattest","hattet","heisst","her","heute","hier","hin","hinter","hoch","hätte","hätten","i","ich","ihm","ihn","ihnen","ihr","ihre","ihrem","ihren","ihrer","ihres","im","immer","in","indem","infolgedessen","ins","irgend","ist","j","ja","jahr","jahre","jahren","je","jede","jedem","jeden","jeder","jedermann","jedermanns","jedes","jedoch","jemand","jemandem","jemanden","jene","jenem","jenen","jener","jenes","jetzt","k","kam","kann","kannst","kaum","kein","keine","keinem","keinen","keiner","kleine","kleinen","kleiner","kleines","kommen","kommt","konnte","konnten","kurz","können","könnt","könnte","l","lang","lange","leicht","leide","lieber","los","m","machen","macht","machte","mag","magst","mahn","mal","man","manche","manchem","manchen","mancher","manches","mann","mehr","mein","meine","meinem","meinen","meiner","meines","mensch","menschen","mich","mir","mit","mittel","mochte","mochten","morgen","muss","musst","musste","mussten","muß","mußt","möchte","mögen","möglich","mögt","müssen","müsst","müßt","n","na","nach","nachdem","nahm","natürlich","neben","nein","neue","neuen","neun","neunte","neunten","neunter","neuntes","nicht","nichts","nie","niemand","niemandem","niemanden","noch","nun","nur","o","ob","oben","oder","offen","oft","ohne","p","q","r","recht","rechte","rechten","rechter","rechtes","richtig","rund","s","sa","sache","sagt","sagte","sah","satt","schlecht","schon","sechs","sechste","sechsten","sechster","sechstes","sehr","sei","seid","seien","sein","seine","seinem","seinen","seiner","seines","seit","seitdem","selbst","sich","sie","sieben","siebente","siebenten","siebenter","siebentes","sind","so","solang","solche","solchem","solchen","solcher","solches","soll","sollen","sollst","sollt","sollte","sollten","sondern","sonst","soweit","sowie","später","startseite","statt","steht","suche","t","tag","tage","tagen","tat","teil","tel","tritt","trotzdem","tun","u","uhr","um","und","und?","uns","unser","unsere","unserer","unter","v","vergangenen","viel","viele","vielem","vielen","vielleicht","vier","vierte","vierten","vierter","viertes","vom","von","vor","w","wahr?","wann","war","waren","wart","warum","was","wegen","weil","weit","weiter","weitere","weiteren","weiteres","welche","welchem","welchen","welcher","welches","wem","wen","wenig","wenige","weniger","weniges","wenigstens","wenn","wer","werde","werden","werdet","weshalb","wessen","wie","wieder","wieso","will","willst","wir","wird","wirklich","wirst","wissen","wo","wohl","wollen","wollt","wollte","wollten","worden","wurde","wurden","während","währenddem","währenddessen","wäre","würde","würden","x","y","z","z.b","zehn","zehnte","zehnten","zehnter","zehntes","zeit","zu","zuerst","zugleich","zum","zunächst","zur","zurück","zusammen","zwanzig","zwar","zwei","zweite","zweiten","zweiter","zweites","zwischen","zwölf","über","überhaupt","übrigens"],"es":["a","actualmente","acuerdo","adelante","ademas","además","adrede","afirmó","agregó","ahi","ahora","ahí","al","algo","alguna","algunas","alguno","algunos","algún","alli","allí","alrededor","ambos","ampleamos","antano","antaño","ante","anterior","antes","apenas","aproximadamente","aquel","aquella","aquellas","aquello","aquellos","aqui","aquél","aquélla","aquéllas","aquéllos","aquí","arriba","arribaabajo","aseguró","asi","así","atras","aun","aunque","ayer","añadió","aún","b","bajo","bastante","bien","breve","buen","buena","buenas","bueno","buenos","c","cada","casi","cerca","cierta","ciertas","cierto","ciertos","cinco","claro","comentó","como","con","conmigo","conocer","conseguimos","conseguir","considera","consideró","consigo","consigue","consiguen","consigues","contigo","contra","cosas","creo","cual","cuales","cualquier","cuando","cuanta","cuantas","cuanto","cuantos","cuatro","cuenta","cuál","cuáles","cuándo","cuánta","cuántas","cuánto","cuántos","cómo","d","da","dado","dan","dar","de","debajo","debe","deben","debido","decir","dejó","del","delante","demasiado","demás","dentro","deprisa","desde","despacio","despues","después","detras","detrás","dia","dias","dice","dicen","dicho","dieron","diferente","diferentes","dijeron","dijo","dio","donde","dos","durante","día","días","dónde","e","ejemplo","el","ella","ellas","ello","ellos","embargo","empleais","emplean","emplear","empleas","empleo","en","encima","encuentra","enfrente","enseguida","entonces","entre","era","eramos","eran","eras","eres","es","esa","esas","ese","eso","esos","esta","estaba","estaban","estado","estados","estais","estamos","estan","estar","estará","estas","este","esto","estos","estoy","estuvo","está","están","ex","excepto","existe","existen","explicó","expresó","f","fin","final","fue","fuera","fueron","fui","fuimos","g","general","gran","grandes","gueno","h","ha","haber","habia","habla","hablan","habrá","había","habían","hace","haceis","hacemos","hacen","hacer","hacerlo","haces","hacia","haciendo","hago","han","hasta","hay","haya","he","hecho","hemos","hicieron","hizo","horas","hoy","hubo","i","igual","incluso","indicó","informo","informó","intenta","intentais","intentamos","intentan","intentar","intentas","intento","ir","j","junto","k","l","la","lado","largo","las","le","lejos","les","llegó","lleva","llevar","lo","los","luego","lugar","m","mal","manera","manifestó","mas","mayor","me","mediante","medio","mejor","mencionó","menos","menudo","mi","mia","mias","mientras","mio","mios","mis","misma","mismas","mismo","mismos","modo","momento","mucha","muchas","mucho","muchos","muy","más","mí","mía","mías","mío","míos","n","nada","nadie","ni","ninguna","ningunas","ninguno","ningunos","ningún","no","nos","nosotras","nosotros","nuestra","nuestras","nuestro","nuestros","nueva","nuevas","nuevo","nuevos","nunca","o","ocho","os","otra","otras","otro","otros","p","pais","para","parece","parte","partir","pasada","pasado","paìs","peor","pero","pesar","poca","pocas","poco","pocos","podeis","podemos","poder","podria","podriais","podriamos","podrian","podrias","podrá","podrán","podría","podrían","poner","por","porque","posible","primer","primera","primero","primeros","principalmente","pronto","propia","propias","propio","propios","proximo","próximo","próximos","pudo","pueda","puede","pueden","puedo","pues","q","qeu","que","quedó","queremos","quien","quienes","quiere","quiza","quizas","quizá","quizás","quién","quiénes","qué","r","raras","realizado","realizar","realizó","repente","respecto","s","sabe","sabeis","sabemos","saben","saber","sabes","salvo","se","sea","sean","segun","segunda","segundo","según","seis","ser","sera","será","serán","sería","señaló","si","sido","siempre","siendo","siete","sigue","siguiente","sin","sino","sobre","sois","sola","solamente","solas","solo","solos","somos","son","soy","soyos","su","supuesto","sus","suya","suyas","suyo","sé","sí","sólo","t","tal","tambien","también","tampoco","tan","tanto","tarde","te","temprano","tendrá","tendrán","teneis","tenemos","tener","tenga","tengo","tenido","tenía","tercera","ti","tiempo","tiene","tienen","toda","todas","todavia","todavía","todo","todos","total","trabaja","trabajais","trabajamos","trabajan","trabajar","trabajas","trabajo","tras","trata","través","tres","tu","tus","tuvo","tuya","tuyas","tuyo","tuyos","tú","u","ultimo","un","una","unas","uno","unos","usa","usais","usamos","usan","usar","usas","uso","usted","ustedes","v","va","vais","valor","vamos","van","varias","varios","vaya","veces","ver","verdad","verdadera","verdadero","vez","vosotras","vosotros","voy","vuestra","vuestras","vuestro","vuestros","w","x","y","ya","yo","z","él","ésa","ésas","ése","ésos","ésta","éstas","éste","éstos","última","últimas","último","últimos"],"et":["aga","ei","et","ja","jah","kas","kui","kõik","ma","me","mida","midagi","mind","minu","mis","mu","mul","mulle","nad","nii","oled","olen","oli","oma","on","pole","sa","seda","see","selle","siin","siis","ta","te","ära"],"fi":["aiemmin","aika","aikaa","aikaan","aikaisemmin","aikaisin","aikajen","aikana","aikoina","aikoo","aikovat","aina","ainakaan","ainakin","ainoa","ainoat","aiomme","aion","aiotte","aist","aivan","ajan","alas","alemmas","alkuisin","alkuun","alla","alle","aloitamme","aloitan","aloitat","aloitatte","aloitattivat","aloitettava","aloitettevaksi","aloitettu","aloitimme","aloitin","aloitit","aloititte","aloittaa","aloittamatta","aloitti","aloittivat","alta","aluksi","alussa","alusta","annettavaksi","annetteva","annettu","ansiosta","antaa","antamatta","antoi","aoua","apu","asia","asiaa","asian","asiasta","asiat","asioiden","asioihin","asioita","asti","avuksi","avulla","avun","avutta","edelle","edelleen","edellä","edeltä","edemmäs","edes","edessä","edestä","ehkä","ei","eikä","eilen","eivät","eli","ellei","elleivät","ellemme","ellen","ellet","ellette","emme","en","enemmän","eniten","ennen","ensi","ensimmäinen","ensimmäiseksi","ensimmäisen","ensimmäisenä","ensimmäiset","ensimmäisiksi","ensimmäisinä","ensimmäisiä","ensimmäistä","ensin","entinen","entisen","entisiä","entisten","entistä","enää","eri","erittäin","erityisesti","eräiden","eräs","eräät","esi","esiin","esillä","esimerkiksi","et","eteen","etenkin","etessa","ette","ettei","että","haikki","halua","haluaa","haluamatta","haluamme","haluan","haluat","haluatte","haluavat","halunnut","halusi","halusimme","halusin","halusit","halusitte","halusivat","halutessa","haluton","he","hei","heidän","heihin","heille","heiltä","heissä","heistä","heitä","helposti","heti","hetkellä","hieman","hitaasti","hoikein","huolimatta","huomenna","hyvien","hyviin","hyviksi","hyville","hyviltä","hyvin","hyvinä","hyvissä","hyvistä","hyviä","hyvä","hyvät","hyvää","hän","häneen","hänelle","hänellä","häneltä","hänen","hänessä","hänestä","hänet","ihan","ilman","ilmeisesti","itse","itsensä","itseään","ja","jo","johon","joiden","joihin","joiksi","joilla","joille","joilta","joissa","joista","joita","joka","jokainen","jokin","joko","joku","jolla","jolle","jolloin","jolta","jompikumpi","jonka","jonkin","jonne","joo","jopa","jos","joskus","jossa","josta","jota","jotain","joten","jotenkin","jotenkuten","jotka","jotta","jouduimme","jouduin","jouduit","jouduitte","joudumme","joudun","joudutte","joukkoon","joukossa","joukosta","joutua","joutui","joutuivat","joutumaan","joutuu","joutuvat","juuri","jälkeen","jälleen","jää","kahdeksan","kahdeksannen","kahdella","kahdelle","kahdelta","kahden","kahdessa","kahdesta","kahta","kahteen","kai","kaiken","kaikille","kaikilta","kaikkea","kaikki","kaikkia","kaikkiaan","kaikkialla","kaikkialle","kaikkialta","kaikkien","kaikkin","kaksi","kannalta","kannattaa","kanssa","kanssaan","kanssamme","kanssani","kanssanne","kanssasi","kauan","kauemmas","kaukana","kautta","kehen","keiden","keihin","keiksi","keille","keillä","keiltä","keinä","keissä","keistä","keitten","keittä","keitä","keneen","keneksi","kenelle","kenellä","keneltä","kenen","kenenä","kenessä","kenestä","kenet","kenettä","kennessästä","kenties","kerran","kerta","kertaa","keskellä","kesken","keskimäärin","ketkä","ketä","kiitos","kohti","koko","kokonaan","kolmas","kolme","kolmen","kolmesti","koska","koskaan","kovin","kuin","kuinka","kuinkan","kuitenkaan","kuitenkin","kuka","kukaan","kukin","kukka","kumpainen","kumpainenkaan","kumpi","kumpikaan","kumpikin","kun","kuten","kuuden","kuusi","kuutta","kylliksi","kyllä","kymmenen","kyse","liian","liki","lisäksi","lisää","lla","luo","luona","lähekkäin","lähelle","lähellä","läheltä","lähemmäs","lähes","lähinnä","lähtien","läpi","mahdollisimman","mahdollista","me","meidän","meille","meillä","melkein","melko","menee","meneet","menemme","menen","menet","menette","menevät","meni","menimme","menin","menit","menivät","mennessä","mennyt","menossa","mihin","mikin","miksi","mikä","mikäli","mikään","milloin","milloinkan","minne","minun","minut","minä","missä","mistä","miten","mitä","mitään","moi","molemmat","mones","monesti","monet","moni","moniaalla","moniaalle","moniaalta","monta","muassa","muiden","muita","muka","mukaan","mukaansa","mukana","mutta","muu","muualla","muualle","muualta","muuanne","muulloin","muun","muut","muuta","muutama","muutaman","muuten","myöhemmin","myös","myöskin","myöskään","myötä","ne","neljä","neljän","neljää","niiden","niin","niistä","niitä","noin","nopeammin","nopeasti","nopeiten","nro","nuo","nyt","näiden","näin","näissä","näissähin","näissälle","näissältä","näissästä","näitä","nämä","ohi","oikea","oikealla","oikein","ole","olemme","olen","olet","olette","oleva","olevan","olevat","oli","olimme","olin","olisi","olisimme","olisin","olisit","olisitte","olisivat","olit","olitte","olivat","olla","olleet","olli","ollut","oma","omaa","omaan","omaksi","omalle","omalta","oman","omassa","omat","omia","omien","omiin","omiksi","omille","omilta","omissa","omista","on","onkin","onko","ovat","paikoittain","paitsi","pakosti","paljon","paremmin","parempi","parhaillaan","parhaiten","perusteella","peräti","pian","pieneen","pieneksi","pienelle","pienellä","pieneltä","pienempi","pienestä","pieni","pienin","puolesta","puolestaan","päälle","runsaasti","saakka","sadam","sama","samaa","samaan","samalla","samallalta","samallassa","samallasta","saman","samat","samoin","sata","sataa","satojen","se","seitsemän","sekä","sen","seuraavat","siellä","sieltä","siihen","siinä","siis","siitä","sijaan","siksi","silloin","sillä","silti","sinne","sinua","sinulle","sinulta","sinun","sinussa","sinusta","sinut","sinä","sisäkkäin","sisällä","siten","sitten","sitä","ssa","sta","suoraan","suuntaan","suuren","suuret","suuri","suuria","suurin","suurten","taa","taas","taemmas","tahansa","tai","takaa","takaisin","takana","takia","tapauksessa","tarpeeksi","tavalla","tavoitteena","te","tietysti","todella","toinen","toisaalla","toisaalle","toisaalta","toiseen","toiseksi","toisella","toiselle","toiselta","toisemme","toisen","toisensa","toisessa","toisesta","toista","toistaiseksi","toki","tosin","tuhannen","tuhat","tule","tulee","tulemme","tulen","tulet","tulette","tulevat","tulimme","tulin","tulisi","tulisimme","tulisin","tulisit","tulisitte","tulisivat","tulit","tulitte","tulivat","tulla","tulleet","tullut","tuntuu","tuo","tuolla","tuolloin","tuolta","tuonne","tuskin","tykö","tähän","tällä","tällöin","tämä","tämän","tänne","tänä","tänään","tässä","tästä","täten","tätä","täysin","täytyvät","täytyy","täällä","täältä","ulkopuolella","usea","useasti","useimmiten","usein","useita","uudeksi","uudelleen","uuden","uudet","uusi","uusia","uusien","uusinta","uuteen","uutta","vaan","vahemmän","vai","vaiheessa","vaikea","vaikean","vaikeat","vaikeilla","vaikeille","vaikeilta","vaikeissa","vaikeista","vaikka","vain","varmasti","varsin","varsinkin","varten","vasen","vasenmalla","vasta","vastaan","vastakkain","vastan","verran","vielä","vierekkäin","vieressä","vieri","viiden","viime","viimeinen","viimeisen","viimeksi","viisi","voi","voidaan","voimme","voin","voisi","voit","voitte","voivat","vuoden","vuoksi","vuosi","vuosien","vuosina","vuotta","vähemmän","vähintään","vähiten","vähän","välillä","yhdeksän","yhden","yhdessä","yhteen","yhteensä","yhteydessä","yhteyteen","yhtä","yhtäälle","yhtäällä","yhtäältä","yhtään","yhä","yksi","yksin","yksittäin","yleensä","ylemmäs","yli","ylös","ympäri","älköön","älä"],"fr":["a","abord","absolument","afin","ah","ai","aie","ailleurs","ainsi","ait","allaient","allo","allons","allô","alors","anterieur","anterieure","anterieures","apres","après","as","assez","attendu","au","aucun","aucune","aujourd","aujourd'hui","aupres","auquel","aura","auraient","aurait","auront","aussi","autre","autrefois","autrement","autres","autrui","aux","auxquelles","auxquels","avaient","avais","avait","avant","avec","avoir","avons","ayant","b","bah","bas","basee","bat","beau","beaucoup","bien","bigre","boum","bravo","brrr","c","car","ce","ceci","cela","celle","celle-ci","celle-là","celles","celles-ci","celles-là","celui","celui-ci","celui-là","cent","cependant","certain","certaine","certaines","certains","certes","ces","cet","cette","ceux","ceux-ci","ceux-là","chacun","chacune","chaque","cher","chers","chez","chiche","chut","chère","chères","ci","cinq","cinquantaine","cinquante","cinquantième","cinquième","clac","clic","combien","comme","comment","comparable","comparables","compris","concernant","contre","couic","crac","d","da","dans","de","debout","dedans","dehors","deja","delà","depuis","dernier","derniere","derriere","derrière","des","desormais","desquelles","desquels","dessous","dessus","deux","deuxième","deuxièmement","devant","devers","devra","different","differentes","differents","différent","différente","différentes","différents","dire","directe","directement","dit","dite","dits","divers","diverse","diverses","dix","dix-huit","dix-neuf","dix-sept","dixième","doit","doivent","donc","dont","douze","douzième","dring","du","duquel","durant","dès","désormais","e","effet","egale","egalement","egales","eh","elle","elle-même","elles","elles-mêmes","en","encore","enfin","entre","envers","environ","es","est","et","etant","etc","etre","eu","euh","eux","eux-mêmes","exactement","excepté","extenso","exterieur","f","fais","faisaient","faisant","fait","façon","feront","fi","flac","floc","font","g","gens","h","ha","hein","hem","hep","hi","ho","holà","hop","hormis","hors","hou","houp","hue","hui","huit","huitième","hum","hurrah","hé","hélas","i","il","ils","importe","j","je","jusqu","jusque","juste","k","l","la","laisser","laquelle","las","le","lequel","les","lesquelles","lesquels","leur","leurs","longtemps","lors","lorsque","lui","lui-meme","lui-même","là","lès","m","ma","maint","maintenant","mais","malgre","malgré","maximale","me","meme","memes","merci","mes","mien","mienne","miennes","miens","mille","mince","minimale","moi","moi-meme","moi-même","moindres","moins","mon","moyennant","multiple","multiples","même","mêmes","n","na","naturel","naturelle","naturelles","ne","neanmoins","necessaire","necessairement","neuf","neuvième","ni","nombreuses","nombreux","non","nos","notamment","notre","nous","nous-mêmes","nouveau","nul","néanmoins","nôtre","nôtres","o","oh","ohé","ollé","olé","on","ont","onze","onzième","ore","ou","ouf","ouias","oust","ouste","outre","ouvert","ouverte","ouverts","o|","où","p","paf","pan","par","parce","parfois","parle","parlent","parler","parmi","parseme","partant","particulier","particulière","particulièrement","pas","passé","pendant","pense","permet","personne","peu","peut","peuvent","peux","pff","pfft","pfut","pif","pire","plein","plouf","plus","plusieurs","plutôt","possessif","possessifs","possible","possibles","pouah","pour","pourquoi","pourrais","pourrait","pouvait","prealable","precisement","premier","première","premièrement","pres","probable","probante","procedant","proche","près","psitt","pu","puis","puisque","pur","pure","q","qu","quand","quant","quant-à-soi","quanta","quarante","quatorze","quatre","quatre-vingt","quatrième","quatrièmement","que","quel","quelconque","quelle","quelles","quelqu'un","quelque","quelques","quels","qui","quiconque","quinze","quoi","quoique","r","rare","rarement","rares","relative","relativement","remarquable","rend","rendre","restant","reste","restent","restrictif","retour","revoici","revoilà","rien","s","sa","sacrebleu","sait","sans","sapristi","sauf","se","sein","seize","selon","semblable","semblaient","semble","semblent","sent","sept","septième","sera","seraient","serait","seront","ses","seul","seule","seulement","si","sien","sienne","siennes","siens","sinon","six","sixième","soi","soi-même","soit","soixante","son","sont","sous","souvent","specifique","specifiques","speculatif","stop","strictement","subtiles","suffisant","suffisante","suffit","suis","suit","suivant","suivante","suivantes","suivants","suivre","superpose","sur","surtout","t","ta","tac","tant","tardive","te","tel","telle","tellement","telles","tels","tenant","tend","tenir","tente","tes","tic","tien","tienne","tiennes","tiens","toc","toi","toi-même","ton","touchant","toujours","tous","tout","toute","toutefois","toutes","treize","trente","tres","trois","troisième","troisièmement","trop","très","tsoin","tsouin","tu","té","u","un","une","unes","uniformement","unique","uniques","uns","v","va","vais","vas","vers","via","vif","vifs","vingt","vivat","vive","vives","vlan","voici","voilà","vont","vos","votre","vous","vous-mêmes","vu","vé","vôtre","vôtres","w","x","y","z","zut","à","â","ça","ès","étaient","étais","était","étant","été","être","ô"],"hr":["a","ako","ali","bi","bih","bila","bili","bilo","bio","bismo","biste","biti","bumo","da","do","duž","ga","hoće","hoćemo","hoćete","hoćeš","hoću","i","iako","ih","ili","iz","ja","je","jedna","jedne","jedno","jer","jesam","jesi","jesmo","jest","jeste","jesu","jim","joj","još","ju","kada","kako","kao","koja","koje","koji","kojima","koju","kroz","li","me","mene","meni","mi","mimo","moj","moja","moje","mu","na","nad","nakon","nam","nama","nas","naš","naša","naše","našeg","ne","nego","neka","neki","nekog","neku","nema","netko","neće","nećemo","nećete","nećeš","neću","nešto","ni","nije","nikoga","nikoje","nikoju","nisam","nisi","nismo","niste","nisu","njega","njegov","njegova","njegovo","njemu","njezin","njezina","njezino","njih","njihov","njihova","njihovo","njim","njima","njoj","nju","no","o","od","odmah","on","ona","oni","ono","ova","pa","pak","po","pod","pored","prije","s","sa","sam","samo","se","sebe","sebi","si","smo","ste","su","sve","svi","svog","svoj","svoja","svoje","svom","ta","tada","taj","tako","te","tebe","tebi","ti","to","toj","tome","tu","tvoj","tvoja","tvoje","u","uz","vam","vama","vas","vaš","vaša","vaše","već","vi","vrlo","za","zar","će","ćemo","ćete","ćeš","ću","što"],"hu":["a","abba","abban","abból","addig","ahhoz","ahogy","ahol","aki","akik","akkor","akár","alapján","alatt","alatta","alattad","alattam","alattatok","alattuk","alattunk","alá","alád","alájuk","alám","alánk","alátok","alól","alóla","alólad","alólam","alólatok","alóluk","alólunk","amely","amelybol","amelyek","amelyekben","amelyeket","amelyet","amelyik","amelynek","ami","amikor","amit","amolyan","amott","amíg","annak","annál","arra","arról","attól","az","aznap","azok","azokat","azokba","azokban","azokból","azokhoz","azokig","azokkal","azokká","azoknak","azoknál","azokon","azokra","azokról","azoktól","azokért","azon","azonban","azonnal","azt","aztán","azután","azzal","azzá","azért","bal","balra","ban","be","belé","beléd","beléjük","belém","belénk","belétek","belül","belőle","belőled","belőlem","belőletek","belőlük","belőlünk","ben","benne","benned","bennem","bennetek","bennük","bennünk","bár","bárcsak","bármilyen","búcsú","cikk","cikkek","cikkeket","csak","csakhogy","csupán","de","dehogy","e","ebbe","ebben","ebből","eddig","egy","egyebek","egyebet","egyedül","egyelőre","egyes","egyet","egyetlen","egyik","egymás","egyre","egyszerre","egyéb","együtt","egész","egészen","ehhez","ekkor","el","eleinte","ellen","ellenes","elleni","ellenére","elmondta","első","elsők","elsősorban","elsőt","elé","eléd","elég","eléjük","elém","elénk","elétek","elő","előbb","elől","előle","előled","előlem","előletek","előlük","előlünk","először","előtt","előtte","előtted","előttem","előttetek","előttük","előttünk","előző","emilyen","engem","ennek","ennyi","ennél","enyém","erre","erről","esetben","ettől","ez","ezek","ezekbe","ezekben","ezekből","ezeken","ezeket","ezekhez","ezekig","ezekkel","ezekké","ezeknek","ezeknél","ezekre","ezekről","ezektől","ezekért","ezen","ezentúl","ezer","ezret","ezt","ezután","ezzel","ezzé","ezért","fel","fele","felek","felet","felett","felé","fent","fenti","fél","fölé","gyakran","ha","halló","hamar","hanem","harmadik","harmadikat","harminc","hat","hatodik","hatodikat","hatot","hatvan","helyett","hetedik","hetediket","hetet","hetven","hirtelen","hiszen","hiába","hogy","hogyan","hol","holnap","holnapot","honnan","hova","hozzá","hozzád","hozzájuk","hozzám","hozzánk","hozzátok","hurrá","huszadik","hány","hányszor","hármat","három","hát","hátha","hátulsó","hét","húsz","ide","ide-оda","idén","igazán","igen","ill","illetve","ilyen","ilyenkor","immár","inkább","is","ismét","ison","itt","jelenleg","jobban","jobbra","jó","jól","jólesik","jóval","jövőre","kell","kellene","kellett","kelljen","keressünk","keresztül","ketten","kettő","kettőt","kevés","ki","kiben","kiből","kicsit","kicsoda","kihez","kik","kikbe","kikben","kikből","kiken","kiket","kikhez","kikkel","kikké","kiknek","kiknél","kikre","kikről","kiktől","kikért","kilenc","kilencedik","kilencediket","kilencet","kilencven","kin","kinek","kinél","kire","kiről","kit","kitől","kivel","kivé","kié","kiért","korábban","képest","kérem","kérlek","kész","késő","később","későn","két","kétszer","kívül","körül","köszönhetően","köszönöm","közben","közel","közepesen","közepén","közé","között","közül","külön","különben","különböző","különbözőbb","különbözőek","lassan","le","legalább","legyen","lehet","lehetetlen","lehetett","lehetőleg","lehetőség","lenne","lenni","lennék","lennének","lesz","leszek","lesznek","leszünk","lett","lettek","lettem","lettünk","lévő","ma","maga","magad","magam","magatokat","magukat","magunkat","magát","mai","majd","majdnem","manapság","meg","megcsinál","megcsinálnak","megint","megvan","mellett","mellette","melletted","mellettem","mellettetek","mellettük","mellettünk","mellé","melléd","melléjük","mellém","mellénk","mellétek","mellől","mellőle","mellőled","mellőlem","mellőletek","mellőlük","mellőlünk","mely","melyek","melyik","mennyi","mert","mi","miatt","miatta","miattad","miattam","miattatok","miattuk","miattunk","mibe","miben","miből","mihez","mik","mikbe","mikben","mikből","miken","miket","mikhez","mikkel","mikké","miknek","miknél","mikor","mikre","mikről","miktől","mikért","milyen","min","mind","mindegyik","mindegyiket","minden","mindenesetre","mindenki","mindent","mindenütt","mindig","mindketten","minek","minket","mint","mintha","minél","mire","miről","mit","mitől","mivel","mivé","miért","mondta","most","mostanáig","már","más","másik","másikat","másnap","második","másodszor","mások","másokat","mást","még","mégis","míg","mögé","mögéd","mögéjük","mögém","mögénk","mögétek","mögött","mögötte","mögötted","mögöttem","mögöttetek","mögöttük","mögöttünk","mögül","mögüle","mögüled","mögülem","mögületek","mögülük","mögülünk","múltkor","múlva","na","nagy","nagyobb","nagyon","naponta","napot","ne","negyedik","negyediket","negyven","neked","nekem","neki","nekik","nektek","nekünk","nem","nemcsak","nemrég","nincs","nyolc","nyolcadik","nyolcadikat","nyolcat","nyolcvan","nála","nálad","nálam","nálatok","náluk","nálunk","négy","négyet","néha","néhány","nélkül","o","oda","ok","olyan","onnan","ott","pedig","persze","pár","például","rajta","rajtad","rajtam","rajtatok","rajtuk","rajtunk","rendben","rosszul","rá","rád","rájuk","rám","ránk","rátok","régen","régóta","részére","róla","rólad","rólam","rólatok","róluk","rólunk","rögtön","s","saját","se","sem","semmi","semmilyen","semmiség","senki","soha","sok","sokan","sokat","sokkal","sokszor","sokáig","során","stb.","szemben","szerbusz","szerint","szerinte","szerinted","szerintem","szerintetek","szerintük","szerintünk","szervusz","szinte","számára","száz","századik","százat","szépen","szét","szíves","szívesen","szíveskedjék","sőt","talán","tavaly","te","tegnap","tegnapelőtt","tehát","tele","teljes","tessék","ti","tied","titeket","tizedik","tizediket","tizenegy","tizenegyedik","tizenhat","tizenhárom","tizenhét","tizenkettedik","tizenkettő","tizenkilenc","tizenkét","tizennyolc","tizennégy","tizenöt","tizet","tovább","további","továbbá","távol","téged","tényleg","tíz","több","többi","többször","túl","tőle","tőled","tőlem","tőletek","tőlük","tőlünk","ugyanakkor","ugyanez","ugyanis","ugye","urak","uram","urat","utoljára","utolsó","után","utána","vagy","vagyis","vagyok","vagytok","vagyunk","vajon","valahol","valaki","valakit","valamelyik","valami","valamint","való","van","vannak","vele","veled","velem","veletek","velük","velünk","vissza","viszlát","viszont","viszontlátásra","volna","volnának","volnék","volt","voltak","voltam","voltunk","végre","végén","végül","által","általában","ám","át","éljen","én","éppen","érte","érted","értem","értetek","értük","értünk","és","év","évben","éve","évek","éves","évi","évvel","így","óta","ön","önbe","önben","önből","önhöz","önnek","önnel","önnél","önre","önről","önt","öntől","önért","önök","önökbe","önökben","önökből","önöket","önökhöz","önökkel","önöknek","önöknél","önökre","önökről","önöktől","önökért","önökön","önön","össze","öt","ötven","ötödik","ötödiket","ötöt","úgy","úgyis","úgynevezett","új","újabb","újra","úr","ő","ők","őket","őt"],"it":["IE","a","abbastanza","abbia","abbiamo","abbiano","abbiate","accidenti","ad","adesso","affinche","agl","agli","ahime","ahimè","ai","al","alcuna","alcuni","alcuno","all","alla","alle","allo","allora","altri","altrimenti","altro","altrove","altrui","anche","ancora","anni","anno","ansa","anticipo","assai","attesa","attraverso","avanti","avemmo","avendo","avente","aver","avere","averlo","avesse","avessero","avessi","avessimo","aveste","avesti","avete","aveva","avevamo","avevano","avevate","avevi","avevo","avrai","avranno","avrebbe","avrebbero","avrei","avremmo","avremo","avreste","avresti","avrete","avrà","avrò","avuta","avute","avuti","avuto","basta","bene","benissimo","berlusconi","brava","bravo","c","casa","caso","cento","certa","certe","certi","certo","che","chi","chicchessia","chiunque","ci","ciascuna","ciascuno","cima","cio","cioe","cioè","circa","citta","città","ciò","co","codesta","codesti","codesto","cogli","coi","col","colei","coll","coloro","colui","come","cominci","comunque","con","concernente","conciliarsi","conclusione","consiglio","contro","cortesia","cos","cosa","cosi","così","cui","d","da","dagl","dagli","dai","dal","dall","dalla","dalle","dallo","dappertutto","davanti","degl","degli","dei","del","dell","della","delle","dello","dentro","detto","deve","di","dice","dietro","dire","dirimpetto","diventa","diventare","diventato","dopo","dov","dove","dovra","dovrà","dovunque","due","dunque","durante","e","ebbe","ebbero","ebbi","ecc","ecco","ed","effettivamente","egli","ella","entrambi","eppure","era","erano","eravamo","eravate","eri","ero","esempio","esse","essendo","esser","essere","essi","ex","fa","faccia","facciamo","facciano","facciate","faccio","facemmo","facendo","facesse","facessero","facessi","facessimo","faceste","facesti","faceva","facevamo","facevano","facevate","facevi","facevo","fai","fanno","farai","faranno","fare","farebbe","farebbero","farei","faremmo","faremo","fareste","faresti","farete","farà","farò","fatto","favore","fece","fecero","feci","fin","finalmente","finche","fine","fino","forse","forza","fosse","fossero","fossi","fossimo","foste","fosti","fra","frattempo","fu","fui","fummo","fuori","furono","futuro","generale","gia","giacche","giorni","giorno","già","gli","gliela","gliele","glieli","glielo","gliene","governo","grande","grazie","gruppo","ha","haha","hai","hanno","ho","i","ieri","il","improvviso","in","inc","infatti","inoltre","insieme","intanto","intorno","invece","io","l","la","lasciato","lato","lavoro","le","lei","li","lo","lontano","loro","lui","lungo","luogo","là","ma","macche","magari","maggior","mai","male","malgrado","malissimo","mancanza","marche","me","medesimo","mediante","meglio","meno","mentre","mesi","mezzo","mi","mia","mie","miei","mila","miliardi","milioni","minimi","ministro","mio","modo","molti","moltissimo","molto","momento","mondo","mosto","nazionale","ne","negl","negli","nei","nel","nell","nella","nelle","nello","nemmeno","neppure","nessun","nessuna","nessuno","niente","no","noi","non","nondimeno","nonostante","nonsia","nostra","nostre","nostri","nostro","novanta","nove","nulla","nuovo","o","od","oggi","ogni","ognuna","ognuno","oltre","oppure","ora","ore","osi","ossia","ottanta","otto","paese","parecchi","parecchie","parecchio","parte","partendo","peccato","peggio","per","perche","perchè","perché","percio","perciò","perfino","pero","persino","persone","però","piedi","pieno","piglia","piu","piuttosto","più","po","pochissimo","poco","poi","poiche","possa","possedere","posteriore","posto","potrebbe","preferibilmente","presa","press","prima","primo","principalmente","probabilmente","proprio","puo","pure","purtroppo","può","qualche","qualcosa","qualcuna","qualcuno","quale","quali","qualunque","quando","quanta","quante","quanti","quanto","quantunque","quasi","quattro","quel","quella","quelle","quelli","quello","quest","questa","queste","questi","questo","qui","quindi","realmente","recente","recentemente","registrazione","relativo","riecco","salvo","sara","sarai","saranno","sarebbe","sarebbero","sarei","saremmo","saremo","sareste","saresti","sarete","sarà","sarò","scola","scopo","scorso","se","secondo","seguente","seguito","sei","sembra","sembrare","sembrato","sembri","sempre","senza","sette","si","sia","siamo","siano","siate","siete","sig","solito","solo","soltanto","sono","sopra","sotto","spesso","srl","sta","stai","stando","stanno","starai","staranno","starebbe","starebbero","starei","staremmo","staremo","stareste","staresti","starete","starà","starò","stata","state","stati","stato","stava","stavamo","stavano","stavate","stavi","stavo","stemmo","stessa","stesse","stessero","stessi","stessimo","stesso","steste","stesti","stette","stettero","stetti","stia","stiamo","stiano","stiate","sto","su","sua","subito","successivamente","successivo","sue","sugl","sugli","sui","sul","sull","sulla","sulle","sullo","suo","suoi","tale","tali","talvolta","tanto","te","tempo","ti","titolo","torino","tra","tranne","tre","trenta","troppo","trovato","tu","tua","tue","tuo","tuoi","tutta","tuttavia","tutte","tutti","tutto","uguali","ulteriore","ultimo","un","una","uno","uomo","va","vale","vari","varia","varie","vario","verso","vi","via","vicino","visto","vita","voi","volta","volte","vostra","vostre","vostri","vostro","è"],"ko":["!","\"","$","%","&","'","(",")","*","+",",","-",".","...","0","1","2","3","4","5","6","7","8","9",";","<","=",">","?","@","\\","^","_","`","|","~","·","—","——","‘","’","“","”","…","、","。","〈","〉","《","》","가","가까스로","가령","각","각각","각자","각종","갖고말하자면","같다","같이","개의치않고","거니와","거바","거의","것","것과 같이","것들","게다가","게우다","겨우","견지에서","결과에 이르다","결국","결론을 낼 수 있다","겸사겸사","고려하면","고로","곧","공동으로","과","과연","관계가 있다","관계없이","관련이 있다","관하여","관한","관해서는","구","구체적으로","구토하다","그","그들","그때","그래","그래도","그래서","그러나","그러니","그러니까","그러면","그러므로","그러한즉","그런 까닭에","그런데","그런즉","그럼","그럼에도 불구하고","그렇게 함으로써","그렇지","그렇지 않다면","그렇지 않으면","그렇지만","그렇지않으면","그리고","그리하여","그만이다","그에 따르는","그위에","그저","그중에서","그치지 않다","근거로","근거하여","기대여","기점으로","기준으로","기타","까닭으로","까악","까지","까지 미치다","까지도","꽈당","끙끙","끼익","나","나머지는","남들","남짓","너","너희","너희들","네","넷","년","논하지 않다","놀라다","누가 알겠는가","누구","다른","다른 방면으로","다만","다섯","다소","다수","다시 말하자면","다시말하면","다음","다음에","다음으로","단지","답다","당신","당장","대로 하다","대하면","대하여","대해 말하자면","대해서","댕그","더구나","더군다나","더라도","더불어","더욱더","더욱이는","도달하다","도착하다","동시에","동안","된바에야","된이상","두번째로","둘","둥둥","뒤따라","뒤이어","든간에","들","등","등등","딩동","따라","따라서","따위","따지지 않다","딱","때","때가 되어","때문에","또","또한","뚝뚝","라 해도","령","로","로 인하여","로부터","로써","륙","를","마음대로","마저","마저도","마치","막론하고","만 못하다","만약","만약에","만은 아니다","만이 아니다","만일","만큼","말하자면","말할것도 없고","매","매번","메쓰겁다","몇","모","모두","무렵","무릎쓰고","무슨","무엇","무엇때문에","물론","및","바꾸어말하면","바꾸어말하자면","바꾸어서 말하면","바꾸어서 한다면","바꿔 말하면","바로","바와같이","밖에 안된다","반대로","반대로 말하자면","반드시","버금","보는데서","보다더","보드득","본대로","봐","봐라","부류의 사람들","부터","불구하고","불문하고","붕붕","비걱거리다","비교적","비길수 없다","비로소","비록","비슷하다","비추어 보아","비하면","뿐만 아니라","뿐만아니라","뿐이다","삐걱","삐걱거리다","사","삼","상대적으로 말하자면","생각한대로","설령","설마","설사","셋","소생","소인","솨","쉿","습니까","습니다","시각","시간","시작하여","시초에","시키다","실로","심지어","아","아니","아니나다를가","아니라면","아니면","아니었다면","아래윗","아무거나","아무도","아야","아울러","아이","아이고","아이구","아이야","아이쿠","아하","아홉","안 그러면","않기 위하여","않기 위해서","알 수 있다","알았어","앗","앞에서","앞의것","야","약간","양자","어","어기여차","어느","어느 년도","어느것","어느곳","어느때","어느쪽","어느해","어디","어때","어떠한","어떤","어떤것","어떤것들","어떻게","어떻해","어이","어째서","어쨋든","어쩔수 없다","어찌","어찌됏든","어찌됏어","어찌하든지","어찌하여","언제","언젠가","얼마","얼마 안 되는 것","얼마간","얼마나","얼마든지","얼마만큼","얼마큼","엉엉","에","에 가서","에 달려 있다","에 대해","에 있다","에 한하다","에게","에서","여","여기","여덟","여러분","여보시오","여부","여섯","여전히","여차","연관되다","연이서","영","영차","옆사람","예","예를 들면","예를 들자면","예컨대","예하면","오","오로지","오르다","오자마자","오직","오호","오히려","와","와 같은 사람들","와르르","와아","왜","왜냐하면","외에도","요만큼","요만한 것","요만한걸","요컨대","우르르","우리","우리들","우선","우에 종합한것과같이","운운","월","위에서 서술한바와같이","위하여","위해서","윙윙","육","으로","으로 인하여","으로서","으로써","을","응","응당","의","의거하여","의지하여","의해","의해되다","의해서","이","이 되다","이 때문에","이 밖에","이 외에","이 정도의","이것","이곳","이때","이라면","이래","이러이러하다","이러한","이런","이럴정도로","이렇게 많은 것","이렇게되면","이렇게말하자면","이렇구나","이로 인하여","이르기까지","이리하여","이만큼","이번","이봐","이상","이어서","이었다","이와 같다","이와 같은","이와 반대로","이와같다면","이외에도","이용하여","이유만으로","이젠","이지만","이쪽","이천구","이천육","이천칠","이천팔","인 듯하다","인젠","일","일것이다","일곱","일단","일때","일반적으로","일지라도","임에 틀림없다","입각하여","입장에서","잇따라","있다","자","자기","자기집","자마자","자신","잠깐","잠시","저","저것","저것만큼","저기","저쪽","저희","전부","전자","전후","점에서 보아","정도에 이르다","제","제각기","제외하고","조금","조차","조차도","졸졸","좀","좋아","좍좍","주룩주룩","주저하지 않고","줄은 몰랏다","줄은모른다","중에서","중의하나","즈음하여","즉","즉시","지든지","지만","지말고","진짜로","쪽으로","차라리","참","참나","첫번째로","쳇","총적으로","총적으로 말하면","총적으로 보면","칠","콸콸","쾅쾅","쿵","타다","타인","탕탕","토하다","통하여","툭","퉤","틈타","팍","팔","퍽","펄렁","하","하게될것이다","하게하다","하겠는가","하고 있다","하고있었다","하곤하였다","하구나","하기 때문에","하기 위하여","하기는한데","하기만 하면","하기보다는","하기에","하나","하느니","하는 김에","하는 편이 낫다","하는것도","하는것만 못하다","하는것이 낫다","하는바","하더라도","하도다","하도록시키다","하도록하다","하든지","하려고하다","하마터면","하면 할수록","하면된다","하면서","하물며","하여금","하여야","하자마자","하지 않는다면","하지 않도록","하지마","하지마라","하지만","하하","한 까닭에","한 이유는","한 후","한다면","한다면 몰라도","한데","한마디","한적이있다","한켠으로는","한항목","할 따름이다","할 생각이다","할 줄 안다","할 지경이다","할 힘이 있다","할때","할만하다","할망정","할뿐","할수있다","할수있어","할줄알다","할지라도","할지언정","함께","해도된다","해도좋다","해봐요","해서는 안된다","해야한다","해요","했어요","향하다","향하여","향해서","허","허걱","허허","헉","헉헉","헐떡헐떡","형식으로 쓰여","혹시","혹은","혼자","훨씬","휘익","휴","흐흐","흥","힘입어","︿","!","#","$","%","&","(",")","*","+",",","0","1","2","3","4","5","6","7","8","9",":",";","<",">","?","@","[","]","{","|","}","~","¥"],"nl":["aan","achte","achter","af","al","alle","alleen","alles","als","ander","anders","beetje","behalve","beide","beiden","ben","beneden","bent","bij","bijna","bijv","blijkbaar","blijken","boven","bv","daar","daardoor","daarin","daarna","daarom","daaruit","dan","dat","de","deden","deed","derde","derhalve","dertig","deze","dhr","die","dit","doe","doen","doet","door","drie","duizend","echter","een","eens","eerst","eerste","eigen","eigenlijk","elk","elke","en","enige","er","erg","ergens","etc","etcetera","even","geen","genoeg","geweest","haar","haarzelf","had","hadden","heb","hebben","hebt","hedden","heeft","heel","hem","hemzelf","hen","het","hetzelfde","hier","hierin","hierna","hierom","hij","hijzelf","hoe","honderd","hun","ieder","iedere","iedereen","iemand","iets","ik","in","inderdaad","intussen","is","ja","je","jij","jijzelf","jou","jouw","jullie","kan","kon","konden","kun","kunnen","kunt","laatst","later","lijken","lijkt","maak","maakt","maakte","maakten","maar","mag","maken","me","meer","meest","meestal","men","met","mevr","mij","mijn","minder","miss","misschien","missen","mits","mocht","mochten","moest","moesten","moet","moeten","mogen","mr","mrs","mw","na","naar","nam","namelijk","nee","neem","negen","nemen","nergens","niemand","niet","niets","niks","noch","nochtans","nog","nooit","nu","nv","of","om","omdat","ondanks","onder","ondertussen","ons","onze","onzeker","ooit","ook","op","over","overal","overige","paar","per","recent","redelijk","samen","sinds","steeds","te","tegen","tegenover","thans","tien","tiende","tijdens","tja","toch","toe","tot","totdat","tussen","twee","tweede","u","uit","uw","vaak","van","vanaf","veel","veertig","verder","verscheidene","verschillende","via","vier","vierde","vijf","vijfde","vijftig","volgend","volgens","voor","voordat","voorts","waar","waarom","waarschijnlijk","wanneer","waren","was","wat","we","wederom","weer","weinig","wel","welk","welke","werd","werden","werder","whatever","wie","wij","wijzelf","wil","wilden","willen","word","worden","wordt","zal","ze","zei","zeker","zelf","zelfde","zes","zeven","zich","zij","zijn","zijzelf","zo","zoals","zodat","zou","zouden","zulk","zullen"],"no":["alle","at","av","bare","begge","ble","blei","bli","blir","blitt","både","båe","da","de","deg","dei","deim","deira","deires","dem","den","denne","der","dere","deres","det","dette","di","din","disse","ditt","du","dykk","dykkar","då","eg","ein","eit","eitt","eller","elles","en","enn","er","et","ett","etter","for","fordi","fra","før","ha","hadde","han","hans","har","hennar","henne","hennes","her","hjå","ho","hoe","honom","hoss","hossen","hun","hva","hvem","hver","hvilke","hvilken","hvis","hvor","hvordan","hvorfor","i","ikke","ikkje","ingen","ingi","inkje","inn","inni","ja","jeg","kan","kom","korleis","korso","kun","kunne","kva","kvar","kvarhelst","kven","kvi","kvifor","man","mange","me","med","medan","meg","meget","mellom","men","mi","min","mine","mitt","mot","mykje","ned","no","noe","noen","noka","noko","nokon","nokor","nokre","nå","når","og","også","om","opp","oss","over","på","samme","seg","selv","si","sia","sidan","siden","sin","sine","sitt","sjøl","skal","skulle","slik","so","som","somme","somt","så","sånn","til","um","upp","ut","uten","var","vart","varte","ved","vere","verte","vi","vil","ville","vore","vors","vort","vår","være","vært","å"],"pl":["aby","ach","aj","albo","ale","ani","aż","bardzo","bez","bo","bowiem","by","byli","bym","być","był","była","było","były","będzie","będą","chce","choć","ci","ciebie","cię","co","coraz","coś","czy","czyli","często","daleko","dla","dlaczego","dlatego","do","dobrze","dokąd","dość","dr","dużo","dwa","dwaj","dwie","dwoje","dzisiaj","dziś","gdy","gdyby","gdyż","gdzie","go","godz","hab","i","ich","ii","iii","ile","im","inne","inny","inż","iv","ix","iż","ja","jak","jakby","jaki","jakie","jako","je","jeden","jedna","jednak","jedno","jednym","jedynie","jego","jej","jemu","jest","jestem","jeszcze","jeśli","jeżeli","już","ją","każdy","kiedy","kierunku","kilku","kto","która","które","którego","której","który","których","którym","którzy","ku","lat","lecz","lub","ma","mają","mam","mamy","mgr","mi","miał","mimo","mnie","mną","mogą","moi","moja","moje","może","można","mu","musi","my","mój","na","nad","nam","nami","nas","nasi","nasz","nasza","nasze","natychmiast","nawet","nic","nich","nie","niego","niej","niemu","nigdy","nim","nimi","nią","niż","no","nowe","np","nr","o","o.o.","obok","od","ok","około","on","ona","one","oni","ono","oraz","owszem","pan","pl","po","pod","ponad","ponieważ","poza","prof","przed","przede","przedtem","przez","przy","raz","razie","roku","również","sam","sama","się","skąd","sobie","sposób","swoje","są","ta","tak","taki","takich","takie","także","tam","te","tego","tej","tel","temu","ten","teraz","też","to","tobie","tobą","trzeba","tu","tutaj","twoi","twoja","twoje","twój","ty","tych","tylko","tym","tys","tzw","tę","u","ul","vi","vii","viii","vol","w","wam","wami","was","wasi","wasz","wasza","wasze","we","wie","więc","wszystko","wtedy","www","wy","właśnie","wśród","xi","xii","xiii","xiv","xv","z","za","zawsze","zaś","ze","zł","żaden","że","żeby"],"pt":["a","acerca","adeus","agora","ainda","algmas","algo","algumas","alguns","ali","além","ambos","ano","anos","antes","ao","aos","apenas","apoio","apontar","após","aquela","aquelas","aquele","aqueles","aqui","aquilo","as","assim","através","atrás","até","aí","baixo","bastante","bem","bom","breve","cada","caminho","catorze","cedo","cento","certamente","certeza","cima","cinco","coisa","com","como","comprido","conhecido","conselho","contra","corrente","custa","cá","da","daquela","daquele","dar","das","de","debaixo","demais","dentro","depois","desde","desligado","dessa","desse","desta","deste","deve","devem","deverá","dez","dezanove","dezasseis","dezassete","dezoito","dia","diante","direita","diz","dizem","dizer","do","dois","dos","doze","duas","dá","dão","dúvida","e","ela","elas","ele","eles","em","embora","enquanto","entre","então","era","essa","essas","esse","esses","esta","estado","estar","estará","estas","estava","este","estes","esteve","estive","estivemos","estiveram","estiveste","estivestes","estou","está","estás","estão","eu","exemplo","falta","fará","favor","faz","fazeis","fazem","fazemos","fazer","fazes","fazia","faço","fez","fim","final","foi","fomos","for","fora","foram","forma","foste","fostes","fui","geral","grande","grandes","grupo","hoje","horas","há","iniciar","inicio","ir","irá","isso","ista","iste","isto","já","lado","ligado","local","logo","longe","lugar","lá","maior","maioria","maiorias","mais","mal","mas","me","meio","menor","menos","meses","mesmo","meu","meus","mil","minha","minhas","momento","muito","muitos","máximo","mês","na","nada","naquela","naquele","nas","nem","nenhuma","nessa","nesse","nesta","neste","no","noite","nome","nos","nossa","nossas","nosso","nossos","nova","nove","novo","novos","num","numa","nunca","não","nível","nós","número","o","obra","obrigada","obrigado","oitava","oitavo","oito","onde","ontem","onze","os","ou","outra","outras","outro","outros","para","parece","parte","partir","pegar","pela","pelas","pelo","pelos","perto","pessoas","pode","podem","poder","poderá","podia","ponto","pontos","por","porque","porquê","posição","possivelmente","posso","possível","pouca","pouco","povo","primeira","primeiro","promeiro","próprio","próximo","puderam","pôde","põe","põem","qual","qualquer","quando","quanto","quarta","quarto","quatro","que","quem","quer","quero","questão","quieto","quinta","quinto","quinze","quê","relação","sabe","saber","se","segunda","segundo","sei","seis","sem","sempre","ser","seria","sete","seu","seus","sexta","sexto","sim","sistema","sob","sobre","sois","somente","somos","sou","sua","suas","são","sétima","sétimo","tal","talvez","também","tanto","tarde","te","tem","temos","tempo","tendes","tenho","tens","tentar","tentaram","tente","tentei","ter","terceira","terceiro","teu","teus","teve","tipo","tive","tivemos","tiveram","tiveste","tivestes","toda","todas","todo","todos","trabalhar","trabalho","treze","três","tu","tua","tuas","tudo","tão","têm","um","uma","umas","uns","usa","usar","vai","vais","valor","veja","vem","vens","ver","verdade","verdadeiro","vez","vezes","viagem","vindo","vinte","você","vocês","vos","vossa","vossas","vosso","vossos","vários","vão","vêm","vós","zero","à","às","área","é","és","último"],"ru":["а","алло","без","белый","близко","более","больше","большой","будем","будет","будете","будешь","будто","буду","будут","будь","бы","бывает","бывь","был","была","были","было","быть","в","важная","важное","важные","важный","вам","вами","вас","ваш","ваша","ваше","ваши","вверх","вдали","вдруг","ведь","везде","вернуться","весь","вечер","взгляд","взять","вид","видеть","вместе","вниз","внизу","во","вода","война","вокруг","вон","вообще","вопрос","восемнадцатый","восемнадцать","восемь","восьмой","вот","впрочем","времени","время","все","всегда","всего","всем","всеми","всему","всех","всею","всю","всюду","вся","всё","второй","вы","выйти","г","где","главный","глаз","говорил","говорит","говорить","год","года","году","голова","голос","город","да","давать","давно","даже","далекий","далеко","дальше","даром","дать","два","двадцатый","двадцать","две","двенадцатый","двенадцать","дверь","двух","девятнадцатый","девятнадцать","девятый","девять","действительно","дел","делать","дело","день","деньги","десятый","десять","для","до","довольно","долго","должно","должный","дом","дорога","друг","другая","другие","других","друго","другое","другой","думать","душа","е","его","ее","ей","ему","если","есть","еще","ещё","ею","её","ж","ждать","же","жена","женщина","жизнь","жить","за","занят","занята","занято","заняты","затем","зато","зачем","здесь","земля","знать","значит","значить","и","идти","из","или","им","именно","иметь","ими","имя","иногда","их","к","каждая","каждое","каждые","каждый","кажется","казаться","как","какая","какой","кем","книга","когда","кого","ком","комната","кому","конец","конечно","которая","которого","которой","которые","который","которых","кроме","кругом","кто","куда","лежать","лет","ли","лицо","лишь","лучше","любить","люди","м","маленький","мало","мать","машина","между","меля","менее","меньше","меня","место","миллионов","мимо","минута","мир","мира","мне","много","многочисленная","многочисленное","многочисленные","многочисленный","мной","мною","мог","могут","мож","может","можно","можхо","мои","мой","мор","москва","мочь","моя","моё","мы","на","наверху","над","надо","назад","наиболее","найти","наконец","нам","нами","народ","нас","начала","начать","наш","наша","наше","наши","не","него","недавно","недалеко","нее","ней","некоторый","нельзя","нем","немного","нему","непрерывно","нередко","несколько","нет","нею","неё","ни","нибудь","ниже","низко","никакой","никогда","никто","никуда","ними","них","ничего","ничто","но","новый","нога","ночь","ну","нужно","нужный","нх","о","об","оба","обычно","один","одиннадцатый","одиннадцать","однажды","однако","одного","одной","оказаться","окно","около","он","она","они","оно","опять","особенно","остаться","от","ответить","отец","отовсюду","отсюда","очень","первый","перед","писать","плечо","по","под","подумать","пожалуйста","позже","пойти","пока","пол","получить","помнить","понимать","понять","пор","пора","после","последний","посмотреть","посреди","потом","потому","почему","почти","правда","прекрасно","при","про","просто","против","процентов","пятнадцатый","пятнадцать","пятый","пять","работа","работать","раз","разве","рано","раньше","ребенок","решить","россия","рука","русский","ряд","рядом","с","сам","сама","сами","самим","самими","самих","само","самого","самой","самом","самому","саму","самый","свет","свое","своего","своей","свои","своих","свой","свою","сделать","сеаой","себе","себя","сегодня","седьмой","сейчас","семнадцатый","семнадцать","семь","сидеть","сила","сих","сказал","сказала","сказать","сколько","слишком","слово","случай","смотреть","сначала","снова","со","собой","собою","советский","совсем","спасибо","спросить","сразу","стал","старый","стать","стол","сторона","стоять","страна","суть","считать","т","та","так","такая","также","таки","такие","такое","такой","там","твой","твоя","твоё","те","тебе","тебя","тем","теми","теперь","тех","то","тобой","тобою","товарищ","тогда","того","тоже","только","том","тому","тот","тою","третий","три","тринадцатый","тринадцать","ту","туда","тут","ты","тысяч","у","увидеть","уж","уже","улица","уметь","утро","хороший","хорошо","хотеть","хоть","хотя","хочешь","час","часто","часть","чаще","чего","человек","чем","чему","через","четвертый","четыре","четырнадцатый","четырнадцать","что","чтоб","чтобы","чуть","шестнадцатый","шестнадцать","шестой","шесть","эта","эти","этим","этими","этих","это","этого","этой","этом","этому","этот","эту","я"],"sv":["aderton","adertonde","adjö","aldrig","alla","allas","allt","alltid","alltså","andra","andras","annan","annat","artonde","artonn","att","av","bakom","bara","behöva","behövas","behövde","behövt","beslut","beslutat","beslutit","bland","blev","bli","blir","blivit","bort","borta","bra","bäst","bättre","båda","bådas","dag","dagar","dagarna","dagen","de","del","delen","dem","den","denna","deras","dess","dessa","det","detta","dig","din","dina","dit","ditt","dock","du","där","därför","då","efter","eftersom","ej","elfte","eller","elva","en","enkel","enkelt","enkla","enligt","er","era","ert","ett","ettusen","fanns","fem","femte","femtio","femtionde","femton","femtonde","fick","fin","finnas","finns","fjorton","fjortonde","fjärde","fler","flera","flesta","fram","framför","från","fyra","fyrtio","fyrtionde","få","får","fått","följande","för","före","förlåt","förra","första","genast","genom","gick","gjorde","gjort","god","goda","godare","godast","gott","gälla","gäller","gällt","gärna","gå","går","gått","gör","göra","ha","hade","haft","han","hans","har","heller","hellre","helst","helt","henne","hennes","hit","hon","honom","hundra","hundraen","hundraett","hur","här","hög","höger","högre","högst","i","ibland","icke","idag","igen","igår","imorgon","in","inför","inga","ingen","ingenting","inget","innan","inne","inom","inte","inuti","ja","jag","ju","jämfört","kan","kanske","knappast","kom","komma","kommer","kommit","kr","kunde","kunna","kunnat","kvar","legat","ligga","ligger","lika","likställd","likställda","lilla","lite","liten","litet","länge","längre","längst","lätt","lättare","lättast","långsam","långsammare","långsammast","långsamt","långt","man","med","mellan","men","mer","mera","mest","mig","min","mina","mindre","minst","mitt","mittemot","mot","mycket","många","måste","möjlig","möjligen","möjligt","möjligtvis","ned","nederst","nedersta","nedre","nej","ner","ni","nio","nionde","nittio","nittionde","nitton","nittonde","nog","noll","nr","nu","nummer","när","nästa","någon","någonting","något","några","nödvändig","nödvändiga","nödvändigt","nödvändigtvis","och","också","ofta","oftast","olika","olikt","om","oss","på","rakt","redan","rätt","sade","sagt","samma","sedan","senare","senast","sent","sex","sextio","sextionde","sexton","sextonde","sig","sin","sina","sist","sista","siste","sitt","sitta","sju","sjunde","sjuttio","sjuttionde","sjutton","sjuttonde","själv","sjätte","ska","skall","skulle","slutligen","små","smått","snart","som","stor","stora","stort","större","störst","säga","säger","sämre","sämst","så","sådan","sådana","sådant","tack","tidig","tidigare","tidigast","tidigt","till","tills","tillsammans","tio","tionde","tjugo","tjugoen","tjugoett","tjugonde","tjugotre","tjugotvå","tjungo","tolfte","tolv","tre","tredje","trettio","trettionde","tretton","trettonde","två","tvåhundra","under","upp","ur","ursäkt","ut","utan","utanför","ute","vad","var","vara","varför","varifrån","varit","varje","varken","vars","varsågod","vart","vem","vems","verkligen","vi","vid","vidare","viktig","viktigare","viktigast","viktigt","vilka","vilkas","vilken","vilket","vill","vänster","vänstra","värre","vår","våra","vårt","än","ännu","är","även","åt","åtminstone","åtta","åttio","åttionde","åttonde","över","övermorgon","överst","övre"],"tr":["acaba","acep","adeta","altmýþ","altmış","altý","altı","ama","ancak","arada","artýk","aslında","aynen","ayrıca","az","bana","bari","bazen","bazý","bazı","baţka","belki","ben","benden","beni","benim","beri","beþ","beş","beţ","bile","bin","bir","biraz","biri","birkaç","birkez","birçok","birþey","birþeyi","birşey","birşeyi","birţey","biz","bizden","bize","bizi","bizim","bu","buna","bunda","bundan","bunlar","bunları","bunların","bunu","bunun","burada","böyle","böylece","bütün","da","daha","dahi","dahil","daima","dair","dayanarak","de","defa","deđil","değil","diye","diđer","diğer","doksan","dokuz","dolayı","dolayısıyla","dört","edecek","eden","ederek","edilecek","ediliyor","edilmesi","ediyor","elli","en","etmesi","etti","ettiği","ettiğini","eđer","eğer","fakat","gibi","göre","halbuki","halen","hangi","hani","hariç","hatta","hele","hem","henüz","hep","hepsi","her","herhangi","herkes","herkesin","hiç","hiçbir","iken","iki","ila","ile","ilgili","ilk","illa","ise","itibaren","itibariyle","iyi","iyice","için","işte","iţte","kadar","kanýmca","karşın","katrilyon","kendi","kendilerine","kendini","kendisi","kendisine","kendisini","kere","kez","keţke","ki","kim","kimden","kime","kimi","kimse","kýrk","kýsaca","kırk","lakin","madem","međer","milyar","milyon","mu","mü","mý","mı","nasýl","nasıl","ne","neden","nedenle","nerde","nere","nerede","nereye","nitekim","niye","niçin","o","olan","olarak","oldu","olduklarını","olduğu","olduğunu","olmadı","olmadığı","olmak","olması","olmayan","olmaz","olsa","olsun","olup","olur","olursa","oluyor","on","ona","ondan","onlar","onlardan","onlari","onlarýn","onları","onların","onu","onun","otuz","oysa","pek","rağmen","sadece","sanki","sekiz","seksen","sen","senden","seni","senin","siz","sizden","sizi","sizin","sonra","tarafından","trilyon","tüm","var","vardı","ve","veya","veyahut","ya","yahut","yani","yapacak","yapmak","yaptı","yaptıkları","yaptığı","yaptığını","yapılan","yapılması","yapıyor","yedi","yerine","yetmiþ","yetmiş","yetmiţ","yine","yirmi","yoksa","yüz","zaten","çok","çünkü","öyle","üzere","üç","þey","þeyden","þeyi","þeyler","þu","þuna","þunda","þundan","þunu","şey","şeyden","şeyi","şeyler","şu","şuna","şunda","şundan","şunları","şunu","şöyle","ţayet","ţimdi","ţu","ţöyle"],"zh":["、","。","〈","〉","《","》","一","一切","一则","一方面","一旦","一来","一样","一般","七","万一","三","上下","不仅","不但","不光","不单","不只","不如","不怕","不惟","不成","不拘","不比","不然","不特","不独","不管","不论","不过","不问","与","与其","与否","与此同时","且","两者","个","临","为","为了","为什么","为何","为着","乃","乃至","么","之","之一","之所以","之类","乌乎","乎","乘","九","也","也好","也罢","了","二","于","于是","于是乎","云云","五","人家","什么","什么样","从","从而","他","他人","他们","以","以便","以免","以及","以至","以至于","以致","们","任","任何","任凭","似的","但","但是","何","何况","何处","何时","作为","你","你们","使得","例如","依","依照","俺","俺们","倘","倘使","倘或","倘然","倘若","借","假使","假如","假若","像","八","六","兮","关于","其","其一","其中","其二","其他","其余","其它","其次","具体地说","具体说来","再者","再说","冒","冲","况且","几","几时","凭","凭借","则","别","别的","别说","到","前后","前者","加之","即","即令","即使","即便","即或","即若","又","及","及其","及至","反之","反过来","反过来说","另","另一方面","另外","只是","只有","只要","只限","叫","叮咚","可","可以","可是","可见","各","各个","各位","各种","各自","同","同时","向","向着","吓","吗","否则","吧","吧哒","吱","呀","呃","呕","呗","呜","呜呼","呢","呵","呸","呼哧","咋","和","咚","咦","咱","咱们","咳","哇","哈","哈哈","哉","哎","哎呀","哎哟","哗","哟","哦","哩","哪","哪个","哪些","哪儿","哪天","哪年","哪怕","哪样","哪边","哪里","哼","哼唷","唉","啊","啐","啥","啦","啪达","喂","喏","喔唷","嗡嗡","嗬","嗯","嗳","嘎","嘎登","嘘","嘛","嘻","嘿","四","因","因为","因此","因而","固然","在","在下","地","多","多少","她","她们","如","如上所述","如何","如其","如果","如此","如若","宁","宁可","宁愿","宁肯","它","它们","对","对于","将","尔后","尚且","就","就是","就是说","尽","尽管","岂但","己","并","并且","开外","开始","归","当","当着","彼","彼此","往","待","得","怎","怎么","怎么办","怎么样","怎样","总之","总的来看","总的来说","总的说来","总而言之","恰恰相反","您","慢说","我","我们","或","或是","或者","所","所以","打","把","抑或","拿","按","按照","换句话说","换言之","据","接着","故","故此","旁人","无宁","无论","既","既是","既然","时候","是","是的","替","有","有些","有关","有的","望","朝","朝着","本","本着","来","来着","极了","果然","果真","某","某个","某些","根据","正如","此","此外","此间","毋宁","每","每当","比","比如","比方","沿","沿着","漫说","焉","然则","然后","然而","照","照着","甚么","甚而","甚至","用","由","由于","由此可见","的","的话","相对而言","省得","着","着呢","矣","离","第","等","等等","管","紧接着","纵","纵令","纵使","纵然","经","经过","结果","给","继而","综上所述","罢了","者","而","而且","而况","而外","而已","而是","而言","能","腾","自","自个儿","自从","自各儿","自家","自己","自身","至","至于","若","若是","若非","莫若","虽","虽则","虽然","虽说","被","要","要不","要不是","要不然","要么","要是","让","论","设使","设若","该","诸位","谁","谁知","赶","起","起见","趁","趁着","越是","跟","较","较之","边","过","还是","还有","这","这个","这么","这么些","这么样","这么点儿","这些","这会儿","这儿","这就是说","这时","这样","这边","这里","进而","连","连同","通过","遵照","那","那个","那么","那么些","那么样","那些","那会儿","那儿","那时","那样","那边","那里","鄙人","鉴于","阿","除","除了","除此之外","除非","随","随着","零","非但","非徒","靠","顺","顺着","首先","︿","!","#","$","%","&","(",")","*","+",",","0","1","2","3","4","5","6","7","8","9",":",";","<",">","?","@","[","]","{","|","}","~","¥"],"eo":["adiaŭ","ajn","al","ankoraŭ","antaŭ","aŭ","bonan","bonvole","bonvolu","bv","ci","cia","cian","cin","d-ro","da","de","dek","deka","do","doktor'","doktoro","du","dua","dum","eble","ekz","ekzemple","en","estas","estis","estos","estu","estus","eĉ","f-no","feliĉan","for","fraŭlino","ha","havas","havis","havos","havu","havus","he","ho","hu","ili","ilia","ilian","ilin","inter","io","ion","iu","iujn","iun","ja","jam","je","jes","k","kaj","ke","kio","kion","kiu","kiujn","kiun","kvankam","kvar","kvara","kvazaŭ","kvin","kvina","la","li","lia","lian","lin","malantaŭ","male","malgraŭ","mem","mi","mia","mian","min","minus","naŭ","naŭa","ne","nek","nenio","nenion","neniu","neniun","nepre","ni","nia","nian","nin","nu","nun","nur","ok","oka","oni","onia","onian","onin","plej","pli","plu","plus","por","post","preter","s-no","s-ro","se","sed","sep","sepa","ses","sesa","si","sia","sian","sin","sinjor'","sinjorino","sinjoro","sub","super","supren","sur","tamen","tio","tion","tiu","tiujn","tiun","tra","tri","tria","tuj","tute","unu","unua","ve","verŝajne","vi","via","vian","vin","ĉi","ĉio","ĉion","ĉiu","ĉiujn","ĉiun","ĉu","ĝi","ĝia","ĝian","ĝin","ĝis","ĵus","ŝi","ŝia","ŝin"],"he":["אבל","או","אולי","אותה","אותו","אותי","אותך","אותם","אותן","אותנו","אז","אחר","אחרות","אחרי","אחריכן","אחרים","אחרת","אי","איזה","איך","אין","איפה","איתה","איתו","איתי","איתך","איתכם","איתכן","איתם","איתן","איתנו","אך","אל","אלה","אלו","אם","אנחנו","אני","אס","אף","אצל","אשר","את","אתה","אתכם","אתכן","אתם","אתן","באיזומידה","באמצע","באמצעות","בגלל","בין","בלי","במידה","במקוםשבו","ברם","בשביל","בשעהש","בתוך","גם","דרך","הוא","היא","היה","היכן","היתה","היתי","הם","הן","הנה","הסיבהשבגללה","הרי","ואילו","ואת","זאת","זה","זות","יהיה","יוכל","יוכלו","יותרמדי","יכול","יכולה","יכולות","יכולים","יכל","יכלה","יכלו","יש","כאן","כאשר","כולם","כולן","כזה","כי","כיצד","כך","ככה","כל","כלל","כמו","כן","כפי","כש","לא","לאו","לאיזותכלית","לאן","לבין","לה","להיות","להם","להן","לו","לי","לכם","לכן","למה","למטה","למעלה","למקוםשבו","למרות","לנו","לעבר","לעיכן","לפיכך","לפני","מאד","מאחורי","מאיזוסיבה","מאין","מאיפה","מבלי","מבעד","מדוע","מה","מהיכן","מול","מחוץ","מי","מכאן","מכיוון","מלבד","מן","מנין","מסוגל","מעט","מעטים","מעל","מצד","מקוםבו","מתחת","מתי","נגד","נגר","נו","עד","עז","על","עלי","עליה","עליהם","עליהן","עליו","עליך","עליכם","עלינו","עם","עצמה","עצמהם","עצמהן","עצמו","עצמי","עצמם","עצמן","עצמנו","פה","רק","שוב","של","שלה","שלהם","שלהן","שלו","שלי","שלך","שלכה","שלכם","שלכן","שלנו","שם","תהיה","תחת"],"la":["a","ab","ac","ad","at","atque","aut","autem","cum","de","dum","e","erant","erat","est","et","etiam","ex","haec","hic","hoc","in","ita","me","nec","neque","non","per","qua","quae","quam","qui","quibus","quidem","quo","quod","re","rebus","rem","res","sed","si","sic","sunt","tamen","tandem","te","ut","vel"],"sk":["a","aby","aj","ako","aký","ale","alebo","ani","avšak","ba","bez","buï","cez","do","ho","hoci","i","ich","im","ja","jeho","jej","jemu","ju","k","kam","kde","kedže","keï","kto","ktorý","ku","lebo","ma","mi","mne","mnou","mu","my","mòa","môj","na","nad","nami","neho","nej","nemu","nich","nielen","nim","no","nám","nás","náš","ním","o","od","on","ona","oni","ono","ony","po","pod","pre","pred","pri","s","sa","seba","sem","so","svoj","taký","tam","teba","tebe","tebou","tej","ten","ti","tie","to","toho","tomu","tou","tvoj","ty","tá","tým","v","vami","veï","vo","vy","vám","vás","váš","však","z","za","zo","a","èi","èo","èí","òom","òou","òu","že"],"sl":["a","ali","april","avgust","b","bi","bil","bila","bile","bili","bilo","biti","blizu","bo","bodo","bojo","bolj","bom","bomo","boste","bova","boš","brez","c","cel","cela","celi","celo","d","da","daleč","dan","danes","datum","december","deset","deseta","deseti","deseto","devet","deveta","deveti","deveto","do","dober","dobra","dobri","dobro","dokler","dol","dolg","dolga","dolgi","dovolj","drug","druga","drugi","drugo","dva","dve","e","eden","en","ena","ene","eni","enkrat","eno","etc.","f","februar","g","g.","ga","ga.","gor","gospa","gospod","h","halo","i","idr.","ii","iii","in","iv","ix","iz","j","januar","jaz","je","ji","jih","jim","jo","julij","junij","jutri","k","kadarkoli","kaj","kajti","kako","kakor","kamor","kamorkoli","kar","karkoli","katerikoli","kdaj","kdo","kdorkoli","ker","ki","kje","kjer","kjerkoli","ko","koder","koderkoli","koga","komu","kot","kratek","kratka","kratke","kratki","l","lahka","lahke","lahki","lahko","le","lep","lepa","lepe","lepi","lepo","leto","m","maj","majhen","majhna","majhni","malce","malo","manj","marec","me","med","medtem","mene","mesec","mi","midva","midve","mnogo","moj","moja","moje","mora","morajo","moram","moramo","morate","moraš","morem","mu","n","na","nad","naj","najina","najino","najmanj","naju","največ","nam","narobe","nas","nato","nazaj","naš","naša","naše","ne","nedavno","nedelja","nek","neka","nekaj","nekatere","nekateri","nekatero","nekdo","neke","nekega","neki","nekje","neko","nekoga","nekoč","ni","nikamor","nikdar","nikjer","nikoli","nič","nje","njega","njegov","njegova","njegovo","njej","njemu","njen","njena","njeno","nji","njih","njihov","njihova","njihovo","njiju","njim","njo","njun","njuna","njuno","no","nocoj","november","npr.","o","ob","oba","obe","oboje","od","odprt","odprta","odprti","okoli","oktober","on","onadva","one","oni","onidve","osem","osma","osmi","osmo","oz.","p","pa","pet","peta","petek","peti","peto","po","pod","pogosto","poleg","poln","polna","polni","polno","ponavadi","ponedeljek","ponovno","potem","povsod","pozdravljen","pozdravljeni","prav","prava","prave","pravi","pravo","prazen","prazna","prazno","prbl.","precej","pred","prej","preko","pri","pribl.","približno","primer","pripravljen","pripravljena","pripravljeni","proti","prva","prvi","prvo","r","ravno","redko","res","reč","s","saj","sam","sama","same","sami","samo","se","sebe","sebi","sedaj","sedem","sedma","sedmi","sedmo","sem","september","seveda","si","sicer","skoraj","skozi","slab","smo","so","sobota","spet","sreda","srednja","srednji","sta","ste","stran","stvar","sva","t","ta","tak","taka","take","taki","tako","takoj","tam","te","tebe","tebi","tega","težak","težka","težki","težko","ti","tista","tiste","tisti","tisto","tj.","tja","to","toda","torek","tretja","tretje","tretji","tri","tu","tudi","tukaj","tvoj","tvoja","tvoje","u","v","vaju","vam","vas","vaš","vaša","vaše","ve","vedno","velik","velika","veliki","veliko","vendar","ves","več","vi","vidva","vii","viii","visok","visoka","visoke","visoki","vsa","vsaj","vsak","vsaka","vsakdo","vsake","vsaki","vsakomur","vse","vsega","vsi","vso","včasih","včeraj","x","z","za","zadaj","zadnji","zakaj","zaprta","zaprti","zaprto","zdaj","zelo","zunaj","č","če","često","četrta","četrtek","četrti","četrto","čez","čigav","š","šest","šesta","šesti","šesto","štiri","ž","že"],"br":["a","ainda","alem","ambas","ambos","antes","ao","aonde","aos","apos","aquele","aqueles","as","assim","com","como","contra","contudo","cuja","cujas","cujo","cujos","da","das","de","dela","dele","deles","demais","depois","desde","desta","deste","dispoe","dispoem","diversa","diversas","diversos","do","dos","durante","e","ela","elas","ele","eles","em","entao","entre","essa","essas","esse","esses","esta","estas","este","estes","ha","isso","isto","logo","mais","mas","mediante","menos","mesma","mesmas","mesmo","mesmos","na","nao","nas","nem","nesse","neste","nos","o","os","ou","outra","outras","outro","outros","pelas","pelo","pelos","perante","pois","por","porque","portanto","propios","proprio","quais","qual","qualquer","quando","quanto","que","quem","quer","se","seja","sem","sendo","seu","seus","sob","sobre","sua","suas","tal","tambem","teu","teus","toda","todas","todo","todos","tua","tuas","tudo","um","uma","umas","uns"],"ca":["a","abans","ací","ah","així","això","al","aleshores","algun","alguna","algunes","alguns","alhora","allà","allí","allò","als","altra","altre","altres","amb","ambdues","ambdós","apa","aquell","aquella","aquelles","aquells","aquest","aquesta","aquestes","aquests","aquí","baix","cada","cadascuna","cadascunes","cadascuns","cadascú","com","contra","d'un","d'una","d'unes","d'uns","dalt","de","del","dels","des","després","dins","dintre","donat","doncs","durant","e","eh","el","els","em","en","encara","ens","entre","eren","es","esta","estaven","esteu","està","estàvem","estàveu","et","etc","ets","fins","fora","gairebé","ha","han","has","havia","he","hem","heu","hi","ho","i","igual","iguals","ja","l'hi","la","les","li","li'n","llavors","m'he","ma","mal","malgrat","mateix","mateixa","mateixes","mateixos","me","mentre","meu","meus","meva","meves","molt","molta","moltes","molts","mon","mons","més","n'he","n'hi","ne","ni","no","nogensmenys","només","nosaltres","nostra","nostre","nostres","o","oh","oi","on","pas","pel","pels","per","perquè","però","poc","poca","pocs","poques","potser","propi","qual","quals","quan","quant","que","quelcom","qui","quin","quina","quines","quins","què","s'ha","s'han","sa","semblant","semblants","ses","seu","seus","seva","seves","si","sobre","sobretot","solament","sols","son","sons","sota","sou","sóc","són","t'ha","t'han","t'he","ta","tal","també","tampoc","tan","tant","tanta","tantes","teu","teus","teva","teves","ton","tons","tot","tota","totes","tots","un","una","unes","uns","us","va","vaig","vam","van","vas","veu","vosaltres","vostra","vostre","vostres","érem","éreu","és"],"cs":["a","aby","ahoj","aj","ale","anebo","ani","ano","asi","aspoň","atd","atp","ačkoli","až","bez","beze","blízko","bohužel","brzo","bude","budem","budeme","budete","budeš","budou","budu","by","byl","byla","byli","bylo","byly","bys","být","během","chce","chceme","chcete","chceš","chci","chtít","chtějí","chut'","chuti","co","což","cz","daleko","další","den","deset","devatenáct","devět","dnes","do","dobrý","docela","dva","dvacet","dvanáct","dvě","dál","dále","děkovat","děkujeme","děkuji","ho","hodně","i","jak","jakmile","jako","jakož","jde","je","jeden","jedenáct","jedna","jedno","jednou","jedou","jeho","jehož","jej","jejich","její","jelikož","jemu","jen","jenom","jestli","jestliže","ještě","jež","ji","jich","jimi","jinak","jiné","již","jsem","jseš","jsi","jsme","jsou","jste","já","jí","jím","jíž","k","kam","kde","kdo","kdy","když","ke","kolik","kromě","kterou","která","které","který","kteří","kvůli","mají","mezi","mi","mne","mnou","mně","moc","mohl","mohou","moje","moji","možná","musí","my","má","málo","mám","máme","máte","máš","mé","mí","mít","mě","můj","může","na","nad","nade","napište","naproti","načež","naše","naši","ne","nebo","nebyl","nebyla","nebyli","nebyly","nedělají","nedělá","nedělám","neděláme","neděláte","neděláš","neg","nejsi","nejsou","nemají","nemáme","nemáte","neměl","není","nestačí","nevadí","než","nic","nich","nimi","nové","nový","nula","nám","námi","nás","náš","ním","ně","něco","nějak","někde","někdo","němu","němuž","o","od","ode","on","ona","oni","ono","ony","osm","osmnáct","pak","patnáct","po","pod","podle","pokud","potom","pouze","pozdě","pořád","pravé","pro","prostě","prosím","proti","proto","protože","proč","první","pta","pět","před","přes","přese","při","přičemž","re","rovně","s","se","sedm","sedmnáct","si","skoro","smí","smějí","snad","spolu","sta","sto","strana","sté","své","svých","svým","svými","ta","tady","tak","takhle","taky","také","takže","tam","tamhle","tamhleto","tamto","tato","tebe","tebou","ted'","tedy","ten","tento","teto","ti","tipy","tisíc","tisíce","to","tobě","tohle","toho","tohoto","tom","tomto","tomu","tomuto","toto","trošku","tu","tuto","tvoje","tvá","tvé","tvůj","ty","tyto","téma","tím","tímto","tě","těm","těmu","třeba","tři","třináct","u","určitě","už","v","vaše","vaši","ve","vedle","večer","vlastně","vy","vám","vámi","vás","váš","více","však","všechno","všichni","vůbec","vždy","z","za","zatímco","zač","zda","zde","ze","zprávy","zpět","čau","či","článku","články","čtrnáct","čtyři","šest","šestnáct","že"],"el":["αλλα","αν","αντι","απο","αυτα","αυτεσ","αυτη","αυτο","αυτοι","αυτοσ","αυτουσ","αυτων","για","δε","δεν","εαν","ειμαι","ειμαστε","ειναι","εισαι","ειστε","εκεινα","εκεινεσ","εκεινη","εκεινο","εκεινοι","εκεινοσ","εκεινουσ","εκεινων","ενω","επι","η","θα","ισωσ","κ","και","κατα","κι","μα","με","μετα","μη","μην","να","ο","οι","ομωσ","οπωσ","οσο","οτι","παρα","ποια","ποιεσ","ποιο","ποιοι","ποιοσ","ποιουσ","ποιων","που","προσ","πωσ","σε","στη","στην","στο","στον","τα","την","τησ","το","τον","τοτε","του","των","ωσ"],"eu":["al","anitz","arabera","asko","baina","bat","batean","batek","bati","batzuei","batzuek","batzuetan","batzuk","bera","beraiek","berau","berauek","bere","berori","beroriek","beste","bezala","da","dago","dira","ditu","du","dute","edo","egin","ere","eta","eurak","ez","gainera","gu","gutxi","guzti","haiei","haiek","haietan","hainbeste","hala","han","handik","hango","hara","hari","hark","hartan","hau","hauei","hauek","hauetan","hemen","hemendik","hemengo","hi","hona","honek","honela","honetan","honi","hor","hori","horiei","horiek","horietan","horko","horra","horrek","horrela","horretan","horri","hortik","hura","izan","ni","noiz","nola","non","nondik","nongo","nor","nora","ze","zein","zen","zenbait","zenbat","zer","zergatik","ziren","zituen","zu","zuek","zuen","zuten"],"ga":["a","ach","ag","agus","an","aon","ar","arna","as","b'","ba","beirt","bhúr","caoga","ceathair","ceathrar","chomh","chtó","chuig","chun","cois","céad","cúig","cúigear","d'","daichead","dar","de","deich","deichniúr","den","dhá","do","don","dtí","dá","dár","dó","faoi","faoin","faoina","faoinár","fara","fiche","gach","gan","go","gur","haon","hocht","i","iad","idir","in","ina","ins","inár","is","le","leis","lena","lenár","m'","mar","mo","mé","na","nach","naoi","naonúr","ná","ní","níor","nó","nócha","ocht","ochtar","os","roimh","sa","seacht","seachtar","seachtó","seasca","seisear","siad","sibh","sinn","sna","sé","sí","tar","thar","thú","triúr","trí","trína","trínár","tríocha","tú","um","ár","é","éis","í","ó","ón","óna","ónár"],"gl":["a","alí","ao","aos","aquel","aquela","aquelas","aqueles","aquilo","aquí","as","así","aínda","ben","cando","che","co","coa","coas","comigo","con","connosco","contigo","convosco","cos","cun","cunha","cunhas","cuns","da","dalgunha","dalgunhas","dalgún","dalgúns","das","de","del","dela","delas","deles","desde","deste","do","dos","dun","dunha","dunhas","duns","e","el","ela","elas","eles","en","era","eran","esa","esas","ese","eses","esta","estaba","estar","este","estes","estiven","estou","está","están","eu","facer","foi","foron","fun","había","hai","iso","isto","la","las","lle","lles","lo","los","mais","me","meu","meus","min","miña","miñas","moi","na","nas","neste","nin","no","non","nos","nosa","nosas","noso","nosos","nun","nunha","nunhas","nuns","nós","o","os","ou","para","pero","pode","pois","pola","polas","polo","polos","por","que","se","senón","ser","seu","seus","sexa","sido","sobre","súa","súas","tamén","tan","te","ten","ter","teu","teus","teñen","teño","ti","tido","tiven","tiña","túa","túas","un","unha","unhas","uns","vos","vosa","vosas","voso","vosos","vós","á","é","ó","ós"],"hy":["այդ","այլ","այն","այս","դու","դուք","եմ","են","ենք","ես","եք","է","էի","էին","էինք","էիր","էիք","էր","ըստ","թ","ի","ին","իսկ","իր","կամ","համար","հետ","հետո","մենք","մեջ","մի","ն","նա","նաև","նրա","նրանք","որ","որը","որոնք","որպես","ու","ում","պիտի","վրա","և"],"id":["ada","adalah","adanya","adapun","agak","agaknya","agar","akan","akankah","akhirnya","aku","akulah","amat","amatlah","anda","andalah","antar","antara","antaranya","apa","apaan","apabila","apakah","apalagi","apatah","atau","ataukah","ataupun","bagai","bagaikan","bagaimana","bagaimanakah","bagaimanapun","bagi","bahkan","bahwa","bahwasanya","banyak","beberapa","begini","beginian","beginikah","beginilah","begitu","begitukah","begitulah","begitupun","belum","belumlah","berapa","berapakah","berapalah","berapapun","bermacam","bersama","betulkah","biasa","biasanya","bila","bilakah","bisa","bisakah","boleh","bolehkah","bolehlah","buat","bukan","bukankah","bukanlah","bukannya","cuma","dahulu","dalam","dan","dapat","dari","daripada","dekat","demi","demikian","demikianlah","dengan","depan","di","dia","dialah","diantara","diantaranya","dikarenakan","dini","diri","dirinya","disini","disinilah","dong","dulu","enggak","enggaknya","entah","entahlah","hal","hampir","hanya","hanyalah","harus","haruslah","harusnya","hendak","hendaklah","hendaknya","hingga","ia","ialah","ibarat","ingin","inginkah","inginkan","ini","inikah","inilah","itu","itukah","itulah","jangan","jangankan","janganlah","jika","jikalau","juga","justru","kala","kalau","kalaulah","kalaupun","kalian","kami","kamilah","kamu","kamulah","kan","kapan","kapankah","kapanpun","karena","karenanya","ke","kecil","kemudian","kenapa","kepada","kepadanya","ketika","khususnya","kini","kinilah","kiranya","kita","kitalah","kok","lagi","lagian","lah","lain","lainnya","lalu","lama","lamanya","lebih","macam","maka","makanya","makin","malah","malahan","mampu","mampukah","mana","manakala","manalagi","masih","masihkah","masing","mau","maupun","melainkan","melalui","memang","mengapa","mereka","merekalah","merupakan","meski","meskipun","mungkin","mungkinkah","nah","namun","nanti","nantinya","nyaris","oleh","olehnya","pada","padahal","padanya","paling","pantas","para","pasti","pastilah","per","percuma","pernah","pula","pun","rupanya","saat","saatnya","saja","sajalah","saling","sama","sambil","sampai","sana","sangat","sangatlah","saya","sayalah","se","sebab","sebabnya","sebagai","sebagaimana","sebagainya","sebaliknya","sebanyak","sebegini","sebegitu","sebelum","sebelumnya","sebenarnya","seberapa","sebetulnya","sebisanya","sebuah","sedang","sedangkan","sedemikian","sedikit","sedikitnya","segala","segalanya","segera","seharusnya","sehingga","sejak","sejenak","sekali","sekalian","sekaligus","sekalipun","sekarang","seketika","sekiranya","sekitar","sekitarnya","sela","selagi","selain","selaku","selalu","selama","selamanya","seluruh","seluruhnya","semacam","semakin","semasih","semaunya","sementara","sempat","semua","semuanya","semula","sendiri","sendirinya","seolah","seorang","sepanjang","sepantasnya","sepantasnyalah","seperti","sepertinya","sering","seringnya","serta","serupa","sesaat","sesama","sesegera","sesekali","seseorang","sesuatu","sesuatunya","sesudah","sesudahnya","setelah","seterusnya","setiap","setidaknya","sewaktu","siapa","siapakah","siapapun","sini","sinilah","suatu","sudah","sudahkah","sudahlah","supaya","tadi","tadinya","tak","tanpa","tapi","telah","tentang","tentu","tentulah","tentunya","terdiri","terhadap","terhadapnya","terlalu","terlebih","tersebut","tersebutlah","tertentu","tetapi","tiap","tidak","tidakkah","tidaklah","toh","waduh","wah","wahai","walau","walaupun","wong","yaitu","yakni","yang"],"ja":["あっ","あり","ある","い","いう","いる","う","うち","お","および","おり","か","かつて","から","が","き","ここ","こと","この","これ","これら","さ","さらに","し","しかし","する","ず","せ","せる","そして","その","その他","その後","それ","それぞれ","た","ただし","たち","ため","たり","だ","だっ","つ","て","で","でき","できる","です","では","でも","と","という","といった","とき","ところ","として","とともに","とも","と共に","な","ない","なお","なかっ","ながら","なく","なっ","など","なら","なり","なる","に","において","における","について","にて","によって","により","による","に対して","に対する","に関する","の","ので","のみ","は","ば","へ","ほか","ほとんど","ほど","ます","また","または","まで","も","もの","ものの","や","よう","より","ら","られ","られる","れ","れる","を","ん","及び","特に"],"lv":["aiz","ap","apakš","apakšpus","ar","arī","augšpus","bet","bez","bija","biji","biju","bijām","bijāt","būs","būsi","būsiet","būsim","būt","būšu","caur","diemžēl","diezin","droši","dēļ","esam","esat","esi","esmu","gan","gar","iekam","iekams","iekām","iekāms","iekš","iekšpus","ik","ir","it","itin","iz","ja","jau","jeb","jebšu","jel","jo","jā","ka","kamēr","kaut","kolīdz","kopš","kā","kļuva","kļuvi","kļuvu","kļuvām","kļuvāt","kļūs","kļūsi","kļūsiet","kļūsim","kļūst","kļūstam","kļūstat","kļūsti","kļūstu","kļūt","kļūšu","labad","lai","lejpus","līdz","līdzko","ne","nebūt","nedz","nekā","nevis","nezin","no","nu","nē","otrpus","pa","par","pat","pie","pirms","pret","priekš","pār","pēc","starp","tad","tak","tapi","taps","tapsi","tapsiet","tapsim","tapt","tapāt","tapšu","taču","te","tiec","tiek","tiekam","tiekat","tieku","tik","tika","tikai","tiki","tikko","tiklab","tiklīdz","tiks","tiksiet","tiksim","tikt","tiku","tikvien","tikām","tikāt","tikšu","tomēr","topat","turpretim","turpretī","tā","tādēļ","tālab","tāpēc","un","uz","vai","var","varat","varēja","varēji","varēju","varējām","varējāt","varēs","varēsi","varēsiet","varēsim","varēt","varēšu","vien","virs","virspus","vis","viņpus","zem","ārpus","šaipus"],"th":["กล่าว","กว่า","กัน","กับ","การ","ก็","ก่อน","ขณะ","ขอ","ของ","ขึ้น","คง","ครั้ง","ความ","คือ","จะ","จัด","จาก","จึง","ช่วง","ซึ่ง","ดัง","ด้วย","ด้าน","ตั้ง","ตั้งแต่","ตาม","ต่อ","ต่าง","ต่างๆ","ต้อง","ถึง","ถูก","ถ้า","ทั้ง","ทั้งนี้","ทาง","ที่","ที่สุด","ทุก","ทํา","ทําให้","นอกจาก","นัก","นั้น","นี้","น่า","นํา","บาง","ผล","ผ่าน","พบ","พร้อม","มา","มาก","มี","ยัง","รวม","ระหว่าง","รับ","ราย","ร่วม","ลง","วัน","ว่า","สุด","ส่ง","ส่วน","สําหรับ","หนึ่ง","หรือ","หลัง","หลังจาก","หลาย","หาก","อยาก","อยู่","อย่าง","ออก","อะไร","อาจ","อีก","เขา","เข้า","เคย","เฉพาะ","เช่น","เดียว","เดียวกัน","เนื่องจาก","เปิด","เปิดเผย","เป็น","เป็นการ","เพราะ","เพื่อ","เมื่อ","เรา","เริ่ม","เลย","เห็น","เอง","แต่","แบบ","แรก","และ","แล้ว","แห่ง","โดย","ใน","ให้","ได้","ไป","ไม่","ไว้"],"ar":["،","أ","ا","اثر","اجل","احد","اخرى","اذا","اربعة","اطار","اعادة","اعلنت","اف","اكثر","اكد","الا","الاخيرة","الان","الاول","الاولى","التى","التي","الثاني","الثانية","الذاتي","الذى","الذي","الذين","السابق","الف","الماضي","المقبل","الوقت","الى","اليوم","اما","امام","امس","ان","انه","انها","او","اول","اي","ايار","ايام","ايضا","ب","باسم","بان","برس","بسبب","بشكل","بعد","بعض","بن","به","بها","بين","تم","ثلاثة","ثم","جميع","حاليا","حتى","حوالى","حول","حيث","حين","خلال","دون","ذلك","زيارة","سنة","سنوات","شخصا","صباح","صفر","ضد","ضمن","عام","عاما","عدة","عدد","عدم","عشر","عشرة","على","عليه","عليها","عن","عند","عندما","غدا","غير","ـ","ف","فان","فى","في","فيه","فيها","قال","قبل","قد","قوة","كان","كانت","كل","كلم","كما","لا","لدى","لقاء","لكن","للامم","لم","لن","له","لها","لوكالة","ما","مايو","مساء","مع","مقابل","مليار","مليون","من","منذ","منها","نحو","نفسه","نهاية","هذا","هذه","هناك","هو","هي","و","و6","واحد","واضاف","واضافت","واكد","وان","واوضح","وفي","وقال","وقالت","وقد","وقف","وكان","وكانت","ولا","ولم","ومن","وهو","وهي","يكون","يمكن","يوم"],"bg":["а","автентичен","аз","ако","ала","бе","без","беше","би","бивш","бивша","бившо","бил","била","били","било","благодаря","близо","бъдат","бъде","бяха","в","вас","ваш","ваша","вероятно","вече","взема","ви","вие","винаги","внимава","време","все","всеки","всички","всичко","всяка","във","въпреки","върху","г","ги","главен","главна","главно","глас","го","година","години","годишен","д","да","дали","два","двама","двамата","две","двете","ден","днес","дни","до","добра","добре","добро","добър","докато","докога","дори","досега","доста","друг","друга","други","е","евтин","едва","един","една","еднаква","еднакви","еднакъв","едно","екип","ето","живот","за","забавям","зад","заедно","заради","засега","заспал","затова","защо","защото","и","из","или","им","има","имат","иска","й","каза","как","каква","какво","както","какъв","като","кога","когато","което","които","кой","който","колко","която","къде","където","към","лесен","лесно","ли","лош","м","май","малко","ме","между","мек","мен","месец","ми","много","мнозина","мога","могат","може","мокър","моля","момента","му","н","на","над","назад","най","направи","напред","например","нас","не","него","нещо","нея","ни","ние","никой","нито","нищо","но","нов","нова","нови","новина","някои","някой","няколко","няма","обаче","около","освен","особено","от","отгоре","отново","още","пак","по","повече","повечето","под","поне","поради","после","почти","прави","пред","преди","през","при","пък","първата","първи","първо","пъти","равен","равна","с","са","сам","само","се","сега","си","син","скоро","след","следващ","сме","смях","според","сред","срещу","сте","съм","със","също","т","т.н.","тази","така","такива","такъв","там","твой","те","тези","ти","то","това","тогава","този","той","толкова","точно","три","трябва","тук","тъй","тя","тях","у","утре","харесва","хиляди","ч","часа","че","често","чрез","ще","щом","юмрук","я","як"],"bn":["অনেক","অন্য","অবশ্য","আগে","আছে","আজ","আবার","আমরা","আমাদের","আর","ই","উত্তর","উপর","উপরে","এ","এই","এক্","এখন","এত","এব","এমন","এমনি","এর","এস","এসে","ও","ওই","কমনে","করা","করে","কাছে","কাজ","কাজে","কারণ","কি","কিছু","কে","কেউ","কেখা","কেন","কোটি","কোনো","কয়েক","খুব","গিয়ে","গেল","চার","চালু","চেষ্টা","ছিল","জানা","জ্নজন","টি","তখন","তবে","তা","তাই","তো","থাকা","থেকে","দিন","দু","দুই","দেওয়া","ধামার","নতুন","না","নাগাদ","নিয়ে","নেওয়া","নয়","পর","পরে","পাচ","পি","পেয়্র্","প্রতি","প্রথম","প্রযন্ত","প্রাথমিক","প্রায়","বক্তব্য","বন","বলা","বলে","বলেন","বহু","বা","বি","বিভিন্ন","বেশ","বেশি","মতো","মধ্যে","মনে","যখন","যদি","যা","যাওয়া","যে","র","রকম","লক্ষ","শুধু","শুরু","সঙ্গে","সব","সহ","সাধারণ","সামনে","সি","সে","সেই","হতে","হাজার","হয়"],"fa":["آباد","آره","آری","آمد","آمده","آن","آنان","آنجا","آنكه","آنها","آنچه","آورد","آورده","آيد","آیا","اثرِ","از","است","استفاده","اش","اكنون","البته","البتّه","ام","اما","امروز","امسال","اند","انکه","او","اول","اي","ايشان","ايم","اين","اينكه","اگر","با","بار","بارة","باره","باشد","باشند","باشيم","بالا","بالایِ","بايد","بدون","بر","برابرِ","براساس","براي","برایِ","برخوردار","برخي","برداري","بروز","بسيار","بسياري","بعد","بعری","بعضي","بلكه","بله","بلکه","بلی","بنابراين","بندي","به","بهترين","بود","بودن","بودند","بوده","بي","بيست","بيش","بيشتر","بيشتري","بين","بی","بیرونِ","تا","تازه","تاكنون","تان","تحت","تر","ترين","تمام","تمامي","تنها","تواند","توانند","توسط","تولِ","تویِ","جا","جاي","جايي","جدا","جديد","جريان","جز","جلوگيري","جلویِ","حتي","حدودِ","حق","خارجِ","خدمات","خواست","خواهد","خواهند","خواهيم","خود","خويش","خیاه","داد","دادن","دادند","داده","دارد","دارند","داريم","داشت","داشتن","داشتند","داشته","دانست","دانند","در","درباره","دنبالِ","ده","دهد","دهند","دو","دوم","ديده","ديروز","ديگر","ديگران","ديگري","دیگر","را","راه","رفت","رفته","روب","روزهاي","روي","رویِ","ريزي","زياد","زير","زيرا","زیرِ","سابق","ساخته","سازي","سراسر","سریِ","سعي","سمتِ","سوم","سوي","سویِ","سپس","شان","شايد","شد","شدن","شدند","شده","شش","شما","شناسي","شود","شوند","صورت","ضدِّ","ضمن","طبقِ","طريق","طور","طي","عقبِ","علّتِ","عنوانِ","غير","فقط","فكر","فوق","قابل","قبل","قصدِ","كرد","كردم","كردن","كردند","كرده","كسي","كل","كمتر","كند","كنم","كنند","كنيد","كنيم","كه","لطفاً","ما","مان","مانند","مانندِ","مثل","مثلِ","مختلف","مدّتی","مردم","مرسی","مقابل","من","مورد","مي","ميليارد","ميليون","مگر","ناشي","نام","نبايد","نبود","نخست","نخستين","نخواهد","ندارد","ندارند","نداشته","نزديك","نزدِ","نزدیکِ","نشان","نشده","نظير","نكرده","نمايد","نمي","نه","نوعي","نيز","نيست","ها","هاي","هايي","هر","هرگز","هزار","هست","هستند","هستيم","هفت","هم","همان","همه","همواره","همين","همچنان","همچنين","همچون","همین","هنوز","هنگام","هنگامِ","هنگامی","هيچ","هیچ","و","وسطِ","وقتي","وقتیکه","ولی","وي","وگو","يا","يابد","يك","يكديگر","يكي","ّه","پاعینِ","پس","پنج","پيش","پیش","پیشِ","چرا","چطور","چند","چندین","چنين","چه","چهار","چون","چيزي","چگونه","چیز","چیزی","چیست","کجا","کجاست","کدام","کس","کسی","کنارِ","که","کَی","کی","گذاري","گذاشته","گردد","گرفت","گرفته","گروهي","گفت","گفته","گويد","گويند","گيرد","گيري","یا","یک"],"hi":["अंदर","अत","अदि","अप","अपना","अपनि","अपनी","अपने","अभि","अभी","आदि","आप","इंहिं","इंहें","इंहों","इतयादि","इत्यादि","इन","इनका","इन्हीं","इन्हें","इन्हों","इस","इसका","इसकि","इसकी","इसके","इसमें","इसि","इसी","इसे","उंहिं","उंहें","उंहों","उन","उनका","उनकि","उनकी","उनके","उनको","उन्हीं","उन्हें","उन्हों","उस","उसके","उसि","उसी","उसे","एक","एवं","एस","एसे","ऐसे","ओर","और","कइ","कई","कर","करता","करते","करना","करने","करें","कहते","कहा","का","काफि","काफ़ी","कि","किंहें","किंहों","कितना","किन्हें","किन्हों","किया","किर","किस","किसि","किसी","किसे","की","कुछ","कुल","के","को","कोइ","कोई","कोन","कोनसा","कौन","कौनसा","गया","घर","जब","जहाँ","जहां","जा","जिंहें","जिंहों","जितना","जिधर","जिन","जिन्हें","जिन्हों","जिस","जिसे","जीधर","जेसा","जेसे","जैसा","जैसे","जो","तक","तब","तरह","तिंहें","तिंहों","तिन","तिन्हें","तिन्हों","तिस","तिसे","तो","था","थि","थी","थे","दबारा","दवारा","दिया","दुसरा","दुसरे","दूसरे","दो","द्वारा","न","नहिं","नहीं","ना","निचे","निहायत","नीचे","ने","पर","पहले","पुरा","पूरा","पे","फिर","बनि","बनी","बहि","बही","बहुत","बाद","बाला","बिलकुल","भि","भितर","भी","भीतर","मगर","मानो","मे","में","यदि","यह","यहाँ","यहां","यहि","यही","या","यिह","ये","रखें","रवासा","रहा","रहे","ऱ्वासा","लिए","लिये","लेकिन","व","वगेरह","वरग","वर्ग","वह","वहाँ","वहां","वहिं","वहीं","वाले","वुह","वे","वग़ैरह","संग","सकता","सकते","सबसे","सभि","सभी","साथ","साबुत","साभ","सारा","से","सो","हि","ही","हुअ","हुआ","हुइ","हुई","हुए","हे","हें","है","हैं","हो","होता","होति","होती","होते","होना","होने"],"mr":["अधिक","अनेक","अशी","असलयाचे","असलेल्या","असा","असून","असे","आज","आणि","आता","आपल्या","आला","आली","आले","आहे","आहेत","एक","एका","कमी","करणयात","करून","का","काम","काय","काही","किवा","की","केला","केली","केले","कोटी","गेल्या","घेऊन","जात","झाला","झाली","झाले","झालेल्या","टा","डॉ","तर","तरी","तसेच","ता","ती","तीन","ते","तो","त्या","त्याचा","त्याची","त्याच्या","त्याना","त्यानी","त्यामुळे","त्री","दिली","दोन","न","नाही","निर्ण्य","पण","पम","परयतन","पाटील","म","मात्र","माहिती","मी","मुबी","म्हणजे","म्हणाले","म्हणून","या","याचा","याची","याच्या","याना","यानी","येणार","येत","येथील","येथे","लाख","व","व्यकत","सर्व","सागित्ले","सुरू","हजार","हा","ही","हे","होणार","होत","होता","होती","होते"],"ro":["acea","aceasta","această","aceea","acei","aceia","acel","acela","acele","acelea","acest","acesta","aceste","acestea","aceşti","aceştia","acolo","acord","acum","ai","aia","aibă","aici","al","ale","alea","altceva","altcineva","am","ar","are","asemenea","asta","astea","astăzi","asupra","au","avea","avem","aveţi","azi","aş","aşadar","aţi","bine","bucur","bună","ca","care","caut","ce","cel","ceva","chiar","cinci","cine","cineva","contra","cu","cum","cumva","curând","curînd","când","cât","câte","câtva","câţi","cînd","cît","cîte","cîtva","cîţi","că","căci","cărei","căror","cărui","către","da","dacă","dar","datorită","dată","dau","de","deci","deja","deoarece","departe","deşi","din","dinaintea","dintr-","dintre","doi","doilea","două","drept","după","dă","ea","ei","el","ele","eram","este","eu","eşti","face","fata","fi","fie","fiecare","fii","fim","fiu","fiţi","frumos","fără","graţie","halbă","iar","ieri","la","le","li","lor","lui","lângă","lîngă","mai","mea","mei","mele","mereu","meu","mi","mie","mine","mult","multă","mulţi","mulţumesc","mâine","mîine","mă","ne","nevoie","nici","nicăieri","nimeni","nimeri","nimic","nişte","noastre","noastră","noi","noroc","nostru","nouă","noştri","nu","opt","ori","oricare","orice","oricine","oricum","oricând","oricât","oricînd","oricît","oriunde","patra","patru","patrulea","pe","pentru","peste","pic","poate","pot","prea","prima","primul","prin","printr-","puţin","puţina","puţină","până","pînă","rog","sa","sale","sau","se","spate","spre","sub","sunt","suntem","sunteţi","sută","sînt","sîntem","sînteţi","să","săi","său","ta","tale","te","timp","tine","toate","toată","tot","totuşi","toţi","trei","treia","treilea","tu","tăi","tău","un","una","unde","undeva","unei","uneia","unele","uneori","unii","unor","unora","unu","unui","unuia","unul","vi","voastre","voastră","voi","vostru","vouă","voştri","vreme","vreo","vreun","vă","zece","zero","zi","zice","îi","îl","îmi","împotriva","în","înainte","înaintea","încotro","încât","încît","între","întrucât","întrucît","îţi","ăla","ălea","ăsta","ăstea","ăştia","şapte","şase","şi","ştiu","ţi","ţie"],"en":["a","a's","able","about","above","according","accordingly","across","actually","after","afterwards","again","against","ain't","all","allow","allows","almost","alone","along","already","also","although","always","am","among","amongst","an","and","another","any","anybody","anyhow","anyone","anything","anyway","anyways","anywhere","apart","appear","appreciate","appropriate","are","aren't","around","as","aside","ask","asking","associated","at","available","away","awfully","b","be","became","because","become","becomes","becoming","been","before","beforehand","behind","being","believe","below","beside","besides","best","better","between","beyond","both","brief","but","by","c","c'mon","c's","came","can","can't","cannot","cant","cause","causes","certain","certainly","changes","clearly","co","com","come","comes","concerning","consequently","consider","considering","contain","containing","contains","corresponding","could","couldn't","course","currently","d","definitely","described","despite","did","didn't","different","do","does","doesn't","doing","don't","done","down","downwards","during","e","each","edu","eg","eight","either","else","elsewhere","enough","entirely","especially","et","etc","even","ever","every","everybody","everyone","everything","everywhere","ex","exactly","example","except","f","far","few","fifth","first","five","followed","following","follows","for","former","formerly","forth","four","from","further","furthermore","g","get","gets","getting","given","gives","go","goes","going","gone","got","gotten","greetings","h","had","hadn't","happens","hardly","has","hasn't","have","haven't","having","he","he's","hello","help","hence","her","here","here's","hereafter","hereby","herein","hereupon","hers","herself","hi","him","himself","his","hither","hopefully","how","howbeit","however","i","i'd","i'll","i'm","i've","ie","if","ignored","immediate","in","inasmuch","inc","indeed","indicate","indicated","indicates","inner","insofar","instead","into","inward","is","isn't","it","it'd","it'll","it's","its","itself","j","just","k","keep","keeps","kept","know","known","knows","l","last","lately","later","latter","latterly","least","less","lest","let","let's","like","liked","likely","little","look","looking","looks","ltd","m","mainly","many","may","maybe","me","mean","meanwhile","merely","might","more","moreover","most","mostly","much","must","my","myself","n","name","namely","nd","near","nearly","necessary","need","needs","neither","never","nevertheless","new","next","nine","no","nobody","non","none","noone","nor","normally","not","nothing","novel","now","nowhere","o","obviously","of","off","often","oh","ok","okay","old","on","once","one","ones","only","onto","or","other","others","otherwise","ought","our","ours","ourselves","out","outside","over","overall","own","p","particular","particularly","per","perhaps","placed","please","plus","possible","presumably","probably","provides","q","que","quite","qv","r","rather","rd","re","really","reasonably","regarding","regardless","regards","relatively","respectively","right","s","said","same","saw","say","saying","says","second","secondly","see","seeing","seem","seemed","seeming","seems","seen","self","selves","sensible","sent","serious","seriously","seven","several","shall","she","should","shouldn't","since","six","so","some","somebody","somehow","someone","something","sometime","sometimes","somewhat","somewhere","soon","sorry","specified","specify","specifying","still","sub","such","sup","sure","t","t's","take","taken","tell","tends","th","than","thank","thanks","thanx","that","that's","thats","the","their","theirs","them","themselves","then","thence","there","there's","thereafter","thereby","therefore","therein","theres","thereupon","these","they","they'd","they'll","they're","they've","think","third","this","thorough","thoroughly","those","though","three","through","throughout","thru","thus","to","together","too","took","toward","towards","tried","tries","truly","try","trying","twice","two","u","un","under","unfortunately","unless","unlikely","until","unto","up","upon","us","use","used","useful","uses","using","usually","uucp","v","value","various","very","via","viz","vs","w","want","wants","was","wasn't","way","we","we'd","we'll","we're","we've","welcome","well","went","were","weren't","what","what's","whatever","when","whence","whenever","where","where's","whereafter","whereas","whereby","wherein","whereupon","wherever","whether","which","while","whither","who","who's","whoever","whole","whom","whose","why","will","willing","wish","with","within","without","won't","wonder","would","wouldn't","x","y","yes","yet","you","you'd","you'll","you're","you've","your","yours","yourself","yourselves","z","zero"]} \ No newline at end of file diff --git a/nautilus_nlp/augmentation/__init__.py b/nautilus_nlp/augmentation/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/nautilus_nlp/classic/__init__.py b/nautilus_nlp/classic/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/nautilus_nlp/social/__init__.py b/nautilus_nlp/social/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/nautilus_nlp/token/__init__.py b/nautilus_nlp/token/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/nautilus_nlp/_config/__init__.py b/nlpretext/_config/__init__.py similarity index 100% rename from nautilus_nlp/_config/__init__.py rename to nlpretext/_config/__init__.py diff --git a/nautilus_nlp/_config/config.py b/nlpretext/_config/config.py similarity index 98% rename from nautilus_nlp/_config/config.py rename to nlpretext/_config/config.py index 0be3a0d..5717ac6 100644 --- a/nautilus_nlp/_config/config.py +++ b/nlpretext/_config/config.py @@ -22,9 +22,6 @@ ROOT_FOLDER = os.path.abspath(os.path.join(os.path.dirname(__file__), '../..')) -# Stopwords config -STOPWORDS_JSON_FILEPATH = os.path.join(ROOT_FOLDER, "nautilus_nlp", "_config", "stopwords.json") - # Country config COUNTRY_MAPPING_ISO = { 'af': 'Afghanistan', 'ax': 'Åland Islands', 'al': 'Albania', 'dz': 'Algeria', 'as': 'American Samoa', 'ad': diff --git a/nautilus_nlp/_config/constants.py b/nlpretext/_config/constants.py similarity index 100% rename from nautilus_nlp/_config/constants.py rename to nlpretext/_config/constants.py diff --git a/nlpretext/_config/stopwords.py b/nlpretext/_config/stopwords.py new file mode 100644 index 0000000..58f898e --- /dev/null +++ b/nlpretext/_config/stopwords.py @@ -0,0 +1,13171 @@ +STOPWORDS = { + "af": [ + "'n", + "aan", + "af", + "al", + "as", + "baie", + "by", + "daar", + "dag", + "dat", + "die", + "dit", + "een", + "ek", + "en", + "gaan", + "gesê", + "haar", + "het", + "hom", + "hulle", + "hy", + "in", + "is", + "jou", + "jy", + "kan", + "kom", + "ma", + "maar", + "met", + "my", + "na", + "nie", + "om", + "ons", + "op", + "saam", + "sal", + "se", + "sien", + "so", + "sy", + "te", + "toe", + "uit", + "van", + "vir", + "was", + "wat", + "ʼn" + ], + "ha": [ + "a", + "amma", + "ba", + "ban", + "ce", + "cikin", + "da", + "don", + "ga", + "in", + "ina", + "ita", + "ji", + "ka", + "ko", + "kuma", + "lokacin", + "ma", + "mai", + "na", + "ne", + "ni", + "sai", + "shi", + "su", + "suka", + "sun", + "ta", + "tafi", + "take", + "tana", + "wani", + "wannan", + "wata", + "ya", + "yake", + "yana", + "yi", + "za" + ], + "so": [ + "aad", + "albaabkii", + "atabo", + "ay", + "ayaa", + "ayee", + "ayuu", + "dhan", + "hadana", + "in", + "inuu", + "isku", + "jiray", + "jirtay", + "ka", + "kale", + "kasoo", + "ku", + "kuu", + "lakin", + "markii", + "oo", + "si", + "soo", + "uga", + "ugu", + "uu", + "waa", + "waxa", + "waxuu" + ], + "st": [ + "a", + "ba", + "bane", + "bona", + "e", + "ea", + "eaba", + "empa", + "ena", + "ha", + "hae", + "hape", + "ho", + "hore", + "ka", + "ke", + "la", + "le", + "li", + "me", + "mo", + "moo", + "ne", + "o", + "oa", + "re", + "sa", + "se", + "tloha", + "tsa", + "tse" + ], + "sw": [ + "akasema", + "alikuwa", + "alisema", + "baada", + "basi", + "bila", + "cha", + "chini", + "hadi", + "hapo", + "hata", + "hivyo", + "hiyo", + "huku", + "huo", + "ili", + "ilikuwa", + "juu", + "kama", + "karibu", + "katika", + "kila", + "kima", + "kisha", + "kubwa", + "kutoka", + "kuwa", + "kwa", + "kwamba", + "kwenda", + "kwenye", + "la", + "lakini", + "mara", + "mdogo", + "mimi", + "mkubwa", + "mmoja", + "moja", + "muda", + "mwenye", + "na", + "naye", + "ndani", + "ng", + "ni", + "nini", + "nonkungu", + "pamoja", + "pia", + "sana", + "sasa", + "sauti", + "tafadhali", + "tena", + "tu", + "vile", + "wa", + "wakati", + "wake", + "walikuwa", + "wao", + "watu", + "wengine", + "wote", + "ya", + "yake", + "yangu", + "yao", + "yeye", + "yule", + "za", + "zaidi", + "zake" + ], + "yo": [ + "a", + "an", + "bá", + "bí", + "bẹ̀rẹ̀", + "fún", + "fẹ́", + "gbogbo", + "inú", + "jù", + "jẹ", + "jẹ́", + "kan", + "kì", + "kí", + "kò", + "láti", + "lè", + "lọ", + "mi", + "mo", + "máa", + "mọ̀", + "ni", + "náà", + "ní", + "nígbà", + "nítorí", + "nǹkan", + "o", + "padà", + "pé", + "púpọ̀", + "pẹ̀lú", + "rẹ̀", + "sì", + "sí", + "sínú", + "ṣ", + "ti", + "tí", + "wà", + "wá", + "wọn", + "wọ́n", + "yìí", + "àti", + "àwọn", + "é", + "í", + "òun", + "ó", + "ń", + "ńlá", + "ṣe", + "ṣé", + "ṣùgbọ́n", + "ẹmọ́", + "ọjọ́", + "ọ̀pọ̀lọpọ̀" + ], + "zu": [ + "futhi", + "kahle", + "kakhulu", + "kanye", + "khona", + "kodwa", + "kungani", + "kusho", + "la", + "lakhe", + "lapho", + "mina", + "ngesikhathi", + "nje", + "phansi", + "phezulu", + "u", + "ukuba", + "ukuthi", + "ukuze", + "uma", + "wahamba", + "wakhe", + "wami", + "wase", + "wathi", + "yakhe", + "zakhe", + "zonke" + ], + "da": [ + "af", + "alle", + "andet", + "andre", + "at", + "begge", + "da", + "de", + "den", + "denne", + "der", + "deres", + "det", + "dette", + "dig", + "din", + "dog", + "du", + "ej", + "eller", + "en", + "end", + "ene", + "eneste", + "enhver", + "et", + "fem", + "fire", + "flere", + "fleste", + "for", + "fordi", + "forrige", + "fra", + "få", + "før", + "god", + "han", + "hans", + "har", + "hendes", + "her", + "hun", + "hvad", + "hvem", + "hver", + "hvilken", + "hvis", + "hvor", + "hvordan", + "hvorfor", + "hvornår", + "i", + "ikke", + "ind", + "ingen", + "intet", + "jeg", + "jeres", + "kan", + "kom", + "kommer", + "lav", + "lidt", + "lille", + "man", + "mand", + "mange", + "med", + "meget", + "men", + "mens", + "mere", + "mig", + "ned", + "ni", + "nogen", + "noget", + "ny", + "nyt", + "nær", + "næste", + "næsten", + "og", + "op", + "otte", + "over", + "på", + "se", + "seks", + "ses", + "som", + "stor", + "store", + "syv", + "ti", + "til", + "to", + "tre", + "ud", + "var" + ], + "de": [ + "Ernst", + "Ordnung", + "Schluss", + "a", + "ab", + "aber", + "ach", + "acht", + "achte", + "achten", + "achter", + "achtes", + "ag", + "alle", + "allein", + "allem", + "allen", + "aller", + "allerdings", + "alles", + "allgemeinen", + "als", + "also", + "am", + "an", + "andere", + "anderen", + "andern", + "anders", + "au", + "auch", + "auf", + "aus", + "ausser", + "ausserdem", + "außer", + "außerdem", + "b", + "bald", + "bei", + "beide", + "beiden", + "beim", + "beispiel", + "bekannt", + "bereits", + "besonders", + "besser", + "besten", + "bin", + "bis", + "bisher", + "bist", + "c", + "d", + "d.h", + "da", + "dabei", + "dadurch", + "dafür", + "dagegen", + "daher", + "dahin", + "dahinter", + "damals", + "damit", + "danach", + "daneben", + "dank", + "dann", + "daran", + "darauf", + "daraus", + "darf", + "darfst", + "darin", + "darum", + "darunter", + "darüber", + "das", + "dasein", + "daselbst", + "dass", + "dasselbe", + "davon", + "davor", + "dazu", + "dazwischen", + "daß", + "dein", + "deine", + "deinem", + "deiner", + "dem", + "dementsprechend", + "demgegenüber", + "demgemäss", + "demgemäß", + "demselben", + "demzufolge", + "den", + "denen", + "denn", + "denselben", + "der", + "deren", + "derjenige", + "derjenigen", + "dermassen", + "dermaßen", + "derselbe", + "derselben", + "des", + "deshalb", + "desselben", + "dessen", + "deswegen", + "dich", + "die", + "diejenige", + "diejenigen", + "dies", + "diese", + "dieselbe", + "dieselben", + "diesem", + "diesen", + "dieser", + "dieses", + "dir", + "doch", + "dort", + "drei", + "drin", + "dritte", + "dritten", + "dritter", + "drittes", + "du", + "durch", + "durchaus", + "durfte", + "durften", + "dürfen", + "dürft", + "e", + "eben", + "ebenso", + "ehrlich", + "ei", + "ei,", + "eigen", + "eigene", + "eigenen", + "eigener", + "eigenes", + "ein", + "einander", + "eine", + "einem", + "einen", + "einer", + "eines", + "einige", + "einigen", + "einiger", + "einiges", + "einmal", + "eins", + "elf", + "en", + "ende", + "endlich", + "entweder", + "er", + "erst", + "erste", + "ersten", + "erster", + "erstes", + "es", + "etwa", + "etwas", + "euch", + "euer", + "eure", + "f", + "folgende", + "früher", + "fünf", + "fünfte", + "fünften", + "fünfter", + "fünftes", + "für", + "g", + "gab", + "ganz", + "ganze", + "ganzen", + "ganzer", + "ganzes", + "gar", + "gedurft", + "gegen", + "gegenüber", + "gehabt", + "gehen", + "geht", + "gekannt", + "gekonnt", + "gemacht", + "gemocht", + "gemusst", + "genug", + "gerade", + "gern", + "gesagt", + "geschweige", + "gewesen", + "gewollt", + "geworden", + "gibt", + "ging", + "gleich", + "gott", + "gross", + "grosse", + "grossen", + "grosser", + "grosses", + "groß", + "große", + "großen", + "großer", + "großes", + "gut", + "gute", + "guter", + "gutes", + "h", + "habe", + "haben", + "habt", + "hast", + "hat", + "hatte", + "hatten", + "hattest", + "hattet", + "heisst", + "her", + "heute", + "hier", + "hin", + "hinter", + "hoch", + "hätte", + "hätten", + "i", + "ich", + "ihm", + "ihn", + "ihnen", + "ihr", + "ihre", + "ihrem", + "ihren", + "ihrer", + "ihres", + "im", + "immer", + "in", + "indem", + "infolgedessen", + "ins", + "irgend", + "ist", + "j", + "ja", + "jahr", + "jahre", + "jahren", + "je", + "jede", + "jedem", + "jeden", + "jeder", + "jedermann", + "jedermanns", + "jedes", + "jedoch", + "jemand", + "jemandem", + "jemanden", + "jene", + "jenem", + "jenen", + "jener", + "jenes", + "jetzt", + "k", + "kam", + "kann", + "kannst", + "kaum", + "kein", + "keine", + "keinem", + "keinen", + "keiner", + "kleine", + "kleinen", + "kleiner", + "kleines", + "kommen", + "kommt", + "konnte", + "konnten", + "kurz", + "können", + "könnt", + "könnte", + "l", + "lang", + "lange", + "leicht", + "leide", + "lieber", + "los", + "m", + "machen", + "macht", + "machte", + "mag", + "magst", + "mahn", + "mal", + "man", + "manche", + "manchem", + "manchen", + "mancher", + "manches", + "mann", + "mehr", + "mein", + "meine", + "meinem", + "meinen", + "meiner", + "meines", + "mensch", + "menschen", + "mich", + "mir", + "mit", + "mittel", + "mochte", + "mochten", + "morgen", + "muss", + "musst", + "musste", + "mussten", + "muß", + "mußt", + "möchte", + "mögen", + "möglich", + "mögt", + "müssen", + "müsst", + "müßt", + "n", + "na", + "nach", + "nachdem", + "nahm", + "natürlich", + "neben", + "nein", + "neue", + "neuen", + "neun", + "neunte", + "neunten", + "neunter", + "neuntes", + "nicht", + "nichts", + "nie", + "niemand", + "niemandem", + "niemanden", + "noch", + "nun", + "nur", + "o", + "ob", + "oben", + "oder", + "offen", + "oft", + "ohne", + "p", + "q", + "r", + "recht", + "rechte", + "rechten", + "rechter", + "rechtes", + "richtig", + "rund", + "s", + "sa", + "sache", + "sagt", + "sagte", + "sah", + "satt", + "schlecht", + "schon", + "sechs", + "sechste", + "sechsten", + "sechster", + "sechstes", + "sehr", + "sei", + "seid", + "seien", + "sein", + "seine", + "seinem", + "seinen", + "seiner", + "seines", + "seit", + "seitdem", + "selbst", + "sich", + "sie", + "sieben", + "siebente", + "siebenten", + "siebenter", + "siebentes", + "sind", + "so", + "solang", + "solche", + "solchem", + "solchen", + "solcher", + "solches", + "soll", + "sollen", + "sollst", + "sollt", + "sollte", + "sollten", + "sondern", + "sonst", + "soweit", + "sowie", + "später", + "startseite", + "statt", + "steht", + "suche", + "t", + "tag", + "tage", + "tagen", + "tat", + "teil", + "tel", + "tritt", + "trotzdem", + "tun", + "u", + "uhr", + "um", + "und", + "und?", + "uns", + "unser", + "unsere", + "unserer", + "unter", + "v", + "vergangenen", + "viel", + "viele", + "vielem", + "vielen", + "vielleicht", + "vier", + "vierte", + "vierten", + "vierter", + "viertes", + "vom", + "von", + "vor", + "w", + "wahr?", + "wann", + "war", + "waren", + "wart", + "warum", + "was", + "wegen", + "weil", + "weit", + "weiter", + "weitere", + "weiteren", + "weiteres", + "welche", + "welchem", + "welchen", + "welcher", + "welches", + "wem", + "wen", + "wenig", + "wenige", + "weniger", + "weniges", + "wenigstens", + "wenn", + "wer", + "werde", + "werden", + "werdet", + "weshalb", + "wessen", + "wie", + "wieder", + "wieso", + "will", + "willst", + "wir", + "wird", + "wirklich", + "wirst", + "wissen", + "wo", + "wohl", + "wollen", + "wollt", + "wollte", + "wollten", + "worden", + "wurde", + "wurden", + "während", + "währenddem", + "währenddessen", + "wäre", + "würde", + "würden", + "x", + "y", + "z", + "z.b", + "zehn", + "zehnte", + "zehnten", + "zehnter", + "zehntes", + "zeit", + "zu", + "zuerst", + "zugleich", + "zum", + "zunächst", + "zur", + "zurück", + "zusammen", + "zwanzig", + "zwar", + "zwei", + "zweite", + "zweiten", + "zweiter", + "zweites", + "zwischen", + "zwölf", + "über", + "überhaupt", + "übrigens" + ], + "es": [ + "a", + "actualmente", + "acuerdo", + "adelante", + "ademas", + "además", + "adrede", + "afirmó", + "agregó", + "ahi", + "ahora", + "ahí", + "al", + "algo", + "alguna", + "algunas", + "alguno", + "algunos", + "algún", + "alli", + "allí", + "alrededor", + "ambos", + "ampleamos", + "antano", + "antaño", + "ante", + "anterior", + "antes", + "apenas", + "aproximadamente", + "aquel", + "aquella", + "aquellas", + "aquello", + "aquellos", + "aqui", + "aquél", + "aquélla", + "aquéllas", + "aquéllos", + "aquí", + "arriba", + "arribaabajo", + "aseguró", + "asi", + "así", + "atras", + "aun", + "aunque", + "ayer", + "añadió", + "aún", + "b", + "bajo", + "bastante", + "bien", + "breve", + "buen", + "buena", + "buenas", + "bueno", + "buenos", + "c", + "cada", + "casi", + "cerca", + "cierta", + "ciertas", + "cierto", + "ciertos", + "cinco", + "claro", + "comentó", + "como", + "con", + "conmigo", + "conocer", + "conseguimos", + "conseguir", + "considera", + "consideró", + "consigo", + "consigue", + "consiguen", + "consigues", + "contigo", + "contra", + "cosas", + "creo", + "cual", + "cuales", + "cualquier", + "cuando", + "cuanta", + "cuantas", + "cuanto", + "cuantos", + "cuatro", + "cuenta", + "cuál", + "cuáles", + "cuándo", + "cuánta", + "cuántas", + "cuánto", + "cuántos", + "cómo", + "d", + "da", + "dado", + "dan", + "dar", + "de", + "debajo", + "debe", + "deben", + "debido", + "decir", + "dejó", + "del", + "delante", + "demasiado", + "demás", + "dentro", + "deprisa", + "desde", + "despacio", + "despues", + "después", + "detras", + "detrás", + "dia", + "dias", + "dice", + "dicen", + "dicho", + "dieron", + "diferente", + "diferentes", + "dijeron", + "dijo", + "dio", + "donde", + "dos", + "durante", + "día", + "días", + "dónde", + "e", + "ejemplo", + "el", + "ella", + "ellas", + "ello", + "ellos", + "embargo", + "empleais", + "emplean", + "emplear", + "empleas", + "empleo", + "en", + "encima", + "encuentra", + "enfrente", + "enseguida", + "entonces", + "entre", + "era", + "eramos", + "eran", + "eras", + "eres", + "es", + "esa", + "esas", + "ese", + "eso", + "esos", + "esta", + "estaba", + "estaban", + "estado", + "estados", + "estais", + "estamos", + "estan", + "estar", + "estará", + "estas", + "este", + "esto", + "estos", + "estoy", + "estuvo", + "está", + "están", + "ex", + "excepto", + "existe", + "existen", + "explicó", + "expresó", + "f", + "fin", + "final", + "fue", + "fuera", + "fueron", + "fui", + "fuimos", + "g", + "general", + "gran", + "grandes", + "gueno", + "h", + "ha", + "haber", + "habia", + "habla", + "hablan", + "habrá", + "había", + "habían", + "hace", + "haceis", + "hacemos", + "hacen", + "hacer", + "hacerlo", + "haces", + "hacia", + "haciendo", + "hago", + "han", + "hasta", + "hay", + "haya", + "he", + "hecho", + "hemos", + "hicieron", + "hizo", + "horas", + "hoy", + "hubo", + "i", + "igual", + "incluso", + "indicó", + "informo", + "informó", + "intenta", + "intentais", + "intentamos", + "intentan", + "intentar", + "intentas", + "intento", + "ir", + "j", + "junto", + "k", + "l", + "la", + "lado", + "largo", + "las", + "le", + "lejos", + "les", + "llegó", + "lleva", + "llevar", + "lo", + "los", + "luego", + "lugar", + "m", + "mal", + "manera", + "manifestó", + "mas", + "mayor", + "me", + "mediante", + "medio", + "mejor", + "mencionó", + "menos", + "menudo", + "mi", + "mia", + "mias", + "mientras", + "mio", + "mios", + "mis", + "misma", + "mismas", + "mismo", + "mismos", + "modo", + "momento", + "mucha", + "muchas", + "mucho", + "muchos", + "muy", + "más", + "mí", + "mía", + "mías", + "mío", + "míos", + "n", + "nada", + "nadie", + "ni", + "ninguna", + "ningunas", + "ninguno", + "ningunos", + "ningún", + "no", + "nos", + "nosotras", + "nosotros", + "nuestra", + "nuestras", + "nuestro", + "nuestros", + "nueva", + "nuevas", + "nuevo", + "nuevos", + "nunca", + "o", + "ocho", + "os", + "otra", + "otras", + "otro", + "otros", + "p", + "pais", + "para", + "parece", + "parte", + "partir", + "pasada", + "pasado", + "paìs", + "peor", + "pero", + "pesar", + "poca", + "pocas", + "poco", + "pocos", + "podeis", + "podemos", + "poder", + "podria", + "podriais", + "podriamos", + "podrian", + "podrias", + "podrá", + "podrán", + "podría", + "podrían", + "poner", + "por", + "porque", + "posible", + "primer", + "primera", + "primero", + "primeros", + "principalmente", + "pronto", + "propia", + "propias", + "propio", + "propios", + "proximo", + "próximo", + "próximos", + "pudo", + "pueda", + "puede", + "pueden", + "puedo", + "pues", + "q", + "qeu", + "que", + "quedó", + "queremos", + "quien", + "quienes", + "quiere", + "quiza", + "quizas", + "quizá", + "quizás", + "quién", + "quiénes", + "qué", + "r", + "raras", + "realizado", + "realizar", + "realizó", + "repente", + "respecto", + "s", + "sabe", + "sabeis", + "sabemos", + "saben", + "saber", + "sabes", + "salvo", + "se", + "sea", + "sean", + "segun", + "segunda", + "segundo", + "según", + "seis", + "ser", + "sera", + "será", + "serán", + "sería", + "señaló", + "si", + "sido", + "siempre", + "siendo", + "siete", + "sigue", + "siguiente", + "sin", + "sino", + "sobre", + "sois", + "sola", + "solamente", + "solas", + "solo", + "solos", + "somos", + "son", + "soy", + "soyos", + "su", + "supuesto", + "sus", + "suya", + "suyas", + "suyo", + "sé", + "sí", + "sólo", + "t", + "tal", + "tambien", + "también", + "tampoco", + "tan", + "tanto", + "tarde", + "te", + "temprano", + "tendrá", + "tendrán", + "teneis", + "tenemos", + "tener", + "tenga", + "tengo", + "tenido", + "tenía", + "tercera", + "ti", + "tiempo", + "tiene", + "tienen", + "toda", + "todas", + "todavia", + "todavía", + "todo", + "todos", + "total", + "trabaja", + "trabajais", + "trabajamos", + "trabajan", + "trabajar", + "trabajas", + "trabajo", + "tras", + "trata", + "través", + "tres", + "tu", + "tus", + "tuvo", + "tuya", + "tuyas", + "tuyo", + "tuyos", + "tú", + "u", + "ultimo", + "un", + "una", + "unas", + "uno", + "unos", + "usa", + "usais", + "usamos", + "usan", + "usar", + "usas", + "uso", + "usted", + "ustedes", + "v", + "va", + "vais", + "valor", + "vamos", + "van", + "varias", + "varios", + "vaya", + "veces", + "ver", + "verdad", + "verdadera", + "verdadero", + "vez", + "vosotras", + "vosotros", + "voy", + "vuestra", + "vuestras", + "vuestro", + "vuestros", + "w", + "x", + "y", + "ya", + "yo", + "z", + "él", + "ésa", + "ésas", + "ése", + "ésos", + "ésta", + "éstas", + "éste", + "éstos", + "última", + "últimas", + "último", + "últimos" + ], + "et": [ + "aga", + "ei", + "et", + "ja", + "jah", + "kas", + "kui", + "kõik", + "ma", + "me", + "mida", + "midagi", + "mind", + "minu", + "mis", + "mu", + "mul", + "mulle", + "nad", + "nii", + "oled", + "olen", + "oli", + "oma", + "on", + "pole", + "sa", + "seda", + "see", + "selle", + "siin", + "siis", + "ta", + "te", + "ära" + ], + "fi": [ + "aiemmin", + "aika", + "aikaa", + "aikaan", + "aikaisemmin", + "aikaisin", + "aikajen", + "aikana", + "aikoina", + "aikoo", + "aikovat", + "aina", + "ainakaan", + "ainakin", + "ainoa", + "ainoat", + "aiomme", + "aion", + "aiotte", + "aist", + "aivan", + "ajan", + "alas", + "alemmas", + "alkuisin", + "alkuun", + "alla", + "alle", + "aloitamme", + "aloitan", + "aloitat", + "aloitatte", + "aloitattivat", + "aloitettava", + "aloitettevaksi", + "aloitettu", + "aloitimme", + "aloitin", + "aloitit", + "aloititte", + "aloittaa", + "aloittamatta", + "aloitti", + "aloittivat", + "alta", + "aluksi", + "alussa", + "alusta", + "annettavaksi", + "annetteva", + "annettu", + "ansiosta", + "antaa", + "antamatta", + "antoi", + "aoua", + "apu", + "asia", + "asiaa", + "asian", + "asiasta", + "asiat", + "asioiden", + "asioihin", + "asioita", + "asti", + "avuksi", + "avulla", + "avun", + "avutta", + "edelle", + "edelleen", + "edellä", + "edeltä", + "edemmäs", + "edes", + "edessä", + "edestä", + "ehkä", + "ei", + "eikä", + "eilen", + "eivät", + "eli", + "ellei", + "elleivät", + "ellemme", + "ellen", + "ellet", + "ellette", + "emme", + "en", + "enemmän", + "eniten", + "ennen", + "ensi", + "ensimmäinen", + "ensimmäiseksi", + "ensimmäisen", + "ensimmäisenä", + "ensimmäiset", + "ensimmäisiksi", + "ensimmäisinä", + "ensimmäisiä", + "ensimmäistä", + "ensin", + "entinen", + "entisen", + "entisiä", + "entisten", + "entistä", + "enää", + "eri", + "erittäin", + "erityisesti", + "eräiden", + "eräs", + "eräät", + "esi", + "esiin", + "esillä", + "esimerkiksi", + "et", + "eteen", + "etenkin", + "etessa", + "ette", + "ettei", + "että", + "haikki", + "halua", + "haluaa", + "haluamatta", + "haluamme", + "haluan", + "haluat", + "haluatte", + "haluavat", + "halunnut", + "halusi", + "halusimme", + "halusin", + "halusit", + "halusitte", + "halusivat", + "halutessa", + "haluton", + "he", + "hei", + "heidän", + "heihin", + "heille", + "heiltä", + "heissä", + "heistä", + "heitä", + "helposti", + "heti", + "hetkellä", + "hieman", + "hitaasti", + "hoikein", + "huolimatta", + "huomenna", + "hyvien", + "hyviin", + "hyviksi", + "hyville", + "hyviltä", + "hyvin", + "hyvinä", + "hyvissä", + "hyvistä", + "hyviä", + "hyvä", + "hyvät", + "hyvää", + "hän", + "häneen", + "hänelle", + "hänellä", + "häneltä", + "hänen", + "hänessä", + "hänestä", + "hänet", + "ihan", + "ilman", + "ilmeisesti", + "itse", + "itsensä", + "itseään", + "ja", + "jo", + "johon", + "joiden", + "joihin", + "joiksi", + "joilla", + "joille", + "joilta", + "joissa", + "joista", + "joita", + "joka", + "jokainen", + "jokin", + "joko", + "joku", + "jolla", + "jolle", + "jolloin", + "jolta", + "jompikumpi", + "jonka", + "jonkin", + "jonne", + "joo", + "jopa", + "jos", + "joskus", + "jossa", + "josta", + "jota", + "jotain", + "joten", + "jotenkin", + "jotenkuten", + "jotka", + "jotta", + "jouduimme", + "jouduin", + "jouduit", + "jouduitte", + "joudumme", + "joudun", + "joudutte", + "joukkoon", + "joukossa", + "joukosta", + "joutua", + "joutui", + "joutuivat", + "joutumaan", + "joutuu", + "joutuvat", + "juuri", + "jälkeen", + "jälleen", + "jää", + "kahdeksan", + "kahdeksannen", + "kahdella", + "kahdelle", + "kahdelta", + "kahden", + "kahdessa", + "kahdesta", + "kahta", + "kahteen", + "kai", + "kaiken", + "kaikille", + "kaikilta", + "kaikkea", + "kaikki", + "kaikkia", + "kaikkiaan", + "kaikkialla", + "kaikkialle", + "kaikkialta", + "kaikkien", + "kaikkin", + "kaksi", + "kannalta", + "kannattaa", + "kanssa", + "kanssaan", + "kanssamme", + "kanssani", + "kanssanne", + "kanssasi", + "kauan", + "kauemmas", + "kaukana", + "kautta", + "kehen", + "keiden", + "keihin", + "keiksi", + "keille", + "keillä", + "keiltä", + "keinä", + "keissä", + "keistä", + "keitten", + "keittä", + "keitä", + "keneen", + "keneksi", + "kenelle", + "kenellä", + "keneltä", + "kenen", + "kenenä", + "kenessä", + "kenestä", + "kenet", + "kenettä", + "kennessästä", + "kenties", + "kerran", + "kerta", + "kertaa", + "keskellä", + "kesken", + "keskimäärin", + "ketkä", + "ketä", + "kiitos", + "kohti", + "koko", + "kokonaan", + "kolmas", + "kolme", + "kolmen", + "kolmesti", + "koska", + "koskaan", + "kovin", + "kuin", + "kuinka", + "kuinkan", + "kuitenkaan", + "kuitenkin", + "kuka", + "kukaan", + "kukin", + "kukka", + "kumpainen", + "kumpainenkaan", + "kumpi", + "kumpikaan", + "kumpikin", + "kun", + "kuten", + "kuuden", + "kuusi", + "kuutta", + "kylliksi", + "kyllä", + "kymmenen", + "kyse", + "liian", + "liki", + "lisäksi", + "lisää", + "lla", + "luo", + "luona", + "lähekkäin", + "lähelle", + "lähellä", + "läheltä", + "lähemmäs", + "lähes", + "lähinnä", + "lähtien", + "läpi", + "mahdollisimman", + "mahdollista", + "me", + "meidän", + "meille", + "meillä", + "melkein", + "melko", + "menee", + "meneet", + "menemme", + "menen", + "menet", + "menette", + "menevät", + "meni", + "menimme", + "menin", + "menit", + "menivät", + "mennessä", + "mennyt", + "menossa", + "mihin", + "mikin", + "miksi", + "mikä", + "mikäli", + "mikään", + "milloin", + "milloinkan", + "minne", + "minun", + "minut", + "minä", + "missä", + "mistä", + "miten", + "mitä", + "mitään", + "moi", + "molemmat", + "mones", + "monesti", + "monet", + "moni", + "moniaalla", + "moniaalle", + "moniaalta", + "monta", + "muassa", + "muiden", + "muita", + "muka", + "mukaan", + "mukaansa", + "mukana", + "mutta", + "muu", + "muualla", + "muualle", + "muualta", + "muuanne", + "muulloin", + "muun", + "muut", + "muuta", + "muutama", + "muutaman", + "muuten", + "myöhemmin", + "myös", + "myöskin", + "myöskään", + "myötä", + "ne", + "neljä", + "neljän", + "neljää", + "niiden", + "niin", + "niistä", + "niitä", + "noin", + "nopeammin", + "nopeasti", + "nopeiten", + "nro", + "nuo", + "nyt", + "näiden", + "näin", + "näissä", + "näissähin", + "näissälle", + "näissältä", + "näissästä", + "näitä", + "nämä", + "ohi", + "oikea", + "oikealla", + "oikein", + "ole", + "olemme", + "olen", + "olet", + "olette", + "oleva", + "olevan", + "olevat", + "oli", + "olimme", + "olin", + "olisi", + "olisimme", + "olisin", + "olisit", + "olisitte", + "olisivat", + "olit", + "olitte", + "olivat", + "olla", + "olleet", + "olli", + "ollut", + "oma", + "omaa", + "omaan", + "omaksi", + "omalle", + "omalta", + "oman", + "omassa", + "omat", + "omia", + "omien", + "omiin", + "omiksi", + "omille", + "omilta", + "omissa", + "omista", + "on", + "onkin", + "onko", + "ovat", + "paikoittain", + "paitsi", + "pakosti", + "paljon", + "paremmin", + "parempi", + "parhaillaan", + "parhaiten", + "perusteella", + "peräti", + "pian", + "pieneen", + "pieneksi", + "pienelle", + "pienellä", + "pieneltä", + "pienempi", + "pienestä", + "pieni", + "pienin", + "puolesta", + "puolestaan", + "päälle", + "runsaasti", + "saakka", + "sadam", + "sama", + "samaa", + "samaan", + "samalla", + "samallalta", + "samallassa", + "samallasta", + "saman", + "samat", + "samoin", + "sata", + "sataa", + "satojen", + "se", + "seitsemän", + "sekä", + "sen", + "seuraavat", + "siellä", + "sieltä", + "siihen", + "siinä", + "siis", + "siitä", + "sijaan", + "siksi", + "silloin", + "sillä", + "silti", + "sinne", + "sinua", + "sinulle", + "sinulta", + "sinun", + "sinussa", + "sinusta", + "sinut", + "sinä", + "sisäkkäin", + "sisällä", + "siten", + "sitten", + "sitä", + "ssa", + "sta", + "suoraan", + "suuntaan", + "suuren", + "suuret", + "suuri", + "suuria", + "suurin", + "suurten", + "taa", + "taas", + "taemmas", + "tahansa", + "tai", + "takaa", + "takaisin", + "takana", + "takia", + "tapauksessa", + "tarpeeksi", + "tavalla", + "tavoitteena", + "te", + "tietysti", + "todella", + "toinen", + "toisaalla", + "toisaalle", + "toisaalta", + "toiseen", + "toiseksi", + "toisella", + "toiselle", + "toiselta", + "toisemme", + "toisen", + "toisensa", + "toisessa", + "toisesta", + "toista", + "toistaiseksi", + "toki", + "tosin", + "tuhannen", + "tuhat", + "tule", + "tulee", + "tulemme", + "tulen", + "tulet", + "tulette", + "tulevat", + "tulimme", + "tulin", + "tulisi", + "tulisimme", + "tulisin", + "tulisit", + "tulisitte", + "tulisivat", + "tulit", + "tulitte", + "tulivat", + "tulla", + "tulleet", + "tullut", + "tuntuu", + "tuo", + "tuolla", + "tuolloin", + "tuolta", + "tuonne", + "tuskin", + "tykö", + "tähän", + "tällä", + "tällöin", + "tämä", + "tämän", + "tänne", + "tänä", + "tänään", + "tässä", + "tästä", + "täten", + "tätä", + "täysin", + "täytyvät", + "täytyy", + "täällä", + "täältä", + "ulkopuolella", + "usea", + "useasti", + "useimmiten", + "usein", + "useita", + "uudeksi", + "uudelleen", + "uuden", + "uudet", + "uusi", + "uusia", + "uusien", + "uusinta", + "uuteen", + "uutta", + "vaan", + "vahemmän", + "vai", + "vaiheessa", + "vaikea", + "vaikean", + "vaikeat", + "vaikeilla", + "vaikeille", + "vaikeilta", + "vaikeissa", + "vaikeista", + "vaikka", + "vain", + "varmasti", + "varsin", + "varsinkin", + "varten", + "vasen", + "vasenmalla", + "vasta", + "vastaan", + "vastakkain", + "vastan", + "verran", + "vielä", + "vierekkäin", + "vieressä", + "vieri", + "viiden", + "viime", + "viimeinen", + "viimeisen", + "viimeksi", + "viisi", + "voi", + "voidaan", + "voimme", + "voin", + "voisi", + "voit", + "voitte", + "voivat", + "vuoden", + "vuoksi", + "vuosi", + "vuosien", + "vuosina", + "vuotta", + "vähemmän", + "vähintään", + "vähiten", + "vähän", + "välillä", + "yhdeksän", + "yhden", + "yhdessä", + "yhteen", + "yhteensä", + "yhteydessä", + "yhteyteen", + "yhtä", + "yhtäälle", + "yhtäällä", + "yhtäältä", + "yhtään", + "yhä", + "yksi", + "yksin", + "yksittäin", + "yleensä", + "ylemmäs", + "yli", + "ylös", + "ympäri", + "älköön", + "älä" + ], + "fr": [ + "a", + "abord", + "absolument", + "afin", + "ah", + "ai", + "aie", + "ailleurs", + "ainsi", + "ait", + "allaient", + "allo", + "allons", + "allô", + "alors", + "anterieur", + "anterieure", + "anterieures", + "apres", + "après", + "as", + "assez", + "attendu", + "au", + "aucun", + "aucune", + "aujourd", + "aujourd'hui", + "aupres", + "auquel", + "aura", + "auraient", + "aurait", + "auront", + "aussi", + "autre", + "autrefois", + "autrement", + "autres", + "autrui", + "aux", + "auxquelles", + "auxquels", + "avaient", + "avais", + "avait", + "avant", + "avec", + "avoir", + "avons", + "ayant", + "b", + "bah", + "bas", + "basee", + "bat", + "beau", + "beaucoup", + "bien", + "bigre", + "boum", + "bravo", + "brrr", + "c", + "car", + "ce", + "ceci", + "cela", + "celle", + "celle-ci", + "celle-là", + "celles", + "celles-ci", + "celles-là", + "celui", + "celui-ci", + "celui-là", + "cent", + "cependant", + "certain", + "certaine", + "certaines", + "certains", + "certes", + "ces", + "cet", + "cette", + "ceux", + "ceux-ci", + "ceux-là", + "chacun", + "chacune", + "chaque", + "cher", + "chers", + "chez", + "chiche", + "chut", + "chère", + "chères", + "ci", + "cinq", + "cinquantaine", + "cinquante", + "cinquantième", + "cinquième", + "clac", + "clic", + "combien", + "comme", + "comment", + "comparable", + "comparables", + "compris", + "concernant", + "contre", + "couic", + "crac", + "d", + "da", + "dans", + "de", + "debout", + "dedans", + "dehors", + "deja", + "delà", + "depuis", + "dernier", + "derniere", + "derriere", + "derrière", + "des", + "desormais", + "desquelles", + "desquels", + "dessous", + "dessus", + "deux", + "deuxième", + "deuxièmement", + "devant", + "devers", + "devra", + "different", + "differentes", + "differents", + "différent", + "différente", + "différentes", + "différents", + "dire", + "directe", + "directement", + "dit", + "dite", + "dits", + "divers", + "diverse", + "diverses", + "dix", + "dix-huit", + "dix-neuf", + "dix-sept", + "dixième", + "doit", + "doivent", + "donc", + "dont", + "douze", + "douzième", + "dring", + "du", + "duquel", + "durant", + "dès", + "désormais", + "e", + "effet", + "egale", + "egalement", + "egales", + "eh", + "elle", + "elle-même", + "elles", + "elles-mêmes", + "en", + "encore", + "enfin", + "entre", + "envers", + "environ", + "es", + "est", + "et", + "etant", + "etc", + "etre", + "eu", + "euh", + "eux", + "eux-mêmes", + "exactement", + "excepté", + "extenso", + "exterieur", + "f", + "fais", + "faisaient", + "faisant", + "fait", + "façon", + "feront", + "fi", + "flac", + "floc", + "font", + "g", + "gens", + "h", + "ha", + "hein", + "hem", + "hep", + "hi", + "ho", + "holà", + "hop", + "hormis", + "hors", + "hou", + "houp", + "hue", + "hui", + "huit", + "huitième", + "hum", + "hurrah", + "hé", + "hélas", + "i", + "il", + "ils", + "importe", + "j", + "je", + "jusqu", + "jusque", + "juste", + "k", + "l", + "la", + "laisser", + "laquelle", + "las", + "le", + "lequel", + "les", + "lesquelles", + "lesquels", + "leur", + "leurs", + "longtemps", + "lors", + "lorsque", + "lui", + "lui-meme", + "lui-même", + "là", + "lès", + "m", + "ma", + "maint", + "maintenant", + "mais", + "malgre", + "malgré", + "maximale", + "me", + "meme", + "memes", + "merci", + "mes", + "mien", + "mienne", + "miennes", + "miens", + "mille", + "mince", + "minimale", + "moi", + "moi-meme", + "moi-même", + "moindres", + "moins", + "mon", + "moyennant", + "multiple", + "multiples", + "même", + "mêmes", + "n", + "na", + "naturel", + "naturelle", + "naturelles", + "ne", + "neanmoins", + "necessaire", + "necessairement", + "neuf", + "neuvième", + "ni", + "nombreuses", + "nombreux", + "non", + "nos", + "notamment", + "notre", + "nous", + "nous-mêmes", + "nouveau", + "nul", + "néanmoins", + "nôtre", + "nôtres", + "o", + "oh", + "ohé", + "ollé", + "olé", + "on", + "ont", + "onze", + "onzième", + "ore", + "ou", + "ouf", + "ouias", + "oust", + "ouste", + "outre", + "ouvert", + "ouverte", + "ouverts", + "o|", + "où", + "p", + "paf", + "pan", + "par", + "parce", + "parfois", + "parle", + "parlent", + "parler", + "parmi", + "parseme", + "partant", + "particulier", + "particulière", + "particulièrement", + "pas", + "passé", + "pendant", + "pense", + "permet", + "personne", + "peu", + "peut", + "peuvent", + "peux", + "pff", + "pfft", + "pfut", + "pif", + "pire", + "plein", + "plouf", + "plus", + "plusieurs", + "plutôt", + "possessif", + "possessifs", + "possible", + "possibles", + "pouah", + "pour", + "pourquoi", + "pourrais", + "pourrait", + "pouvait", + "prealable", + "precisement", + "premier", + "première", + "premièrement", + "pres", + "probable", + "probante", + "procedant", + "proche", + "près", + "psitt", + "pu", + "puis", + "puisque", + "pur", + "pure", + "q", + "qu", + "quand", + "quant", + "quant-à-soi", + "quanta", + "quarante", + "quatorze", + "quatre", + "quatre-vingt", + "quatrième", + "quatrièmement", + "que", + "quel", + "quelconque", + "quelle", + "quelles", + "quelqu'un", + "quelque", + "quelques", + "quels", + "qui", + "quiconque", + "quinze", + "quoi", + "quoique", + "r", + "rare", + "rarement", + "rares", + "relative", + "relativement", + "remarquable", + "rend", + "rendre", + "restant", + "reste", + "restent", + "restrictif", + "retour", + "revoici", + "revoilà", + "rien", + "s", + "sa", + "sacrebleu", + "sait", + "sans", + "sapristi", + "sauf", + "se", + "sein", + "seize", + "selon", + "semblable", + "semblaient", + "semble", + "semblent", + "sent", + "sept", + "septième", + "sera", + "seraient", + "serait", + "seront", + "ses", + "seul", + "seule", + "seulement", + "si", + "sien", + "sienne", + "siennes", + "siens", + "sinon", + "six", + "sixième", + "soi", + "soi-même", + "soit", + "soixante", + "son", + "sont", + "sous", + "souvent", + "specifique", + "specifiques", + "speculatif", + "stop", + "strictement", + "subtiles", + "suffisant", + "suffisante", + "suffit", + "suis", + "suit", + "suivant", + "suivante", + "suivantes", + "suivants", + "suivre", + "superpose", + "sur", + "surtout", + "t", + "ta", + "tac", + "tant", + "tardive", + "te", + "tel", + "telle", + "tellement", + "telles", + "tels", + "tenant", + "tend", + "tenir", + "tente", + "tes", + "tic", + "tien", + "tienne", + "tiennes", + "tiens", + "toc", + "toi", + "toi-même", + "ton", + "touchant", + "toujours", + "tous", + "tout", + "toute", + "toutefois", + "toutes", + "treize", + "trente", + "tres", + "trois", + "troisième", + "troisièmement", + "trop", + "très", + "tsoin", + "tsouin", + "tu", + "té", + "u", + "un", + "une", + "unes", + "uniformement", + "unique", + "uniques", + "uns", + "v", + "va", + "vais", + "vas", + "vers", + "via", + "vif", + "vifs", + "vingt", + "vivat", + "vive", + "vives", + "vlan", + "voici", + "voilà", + "vont", + "vos", + "votre", + "vous", + "vous-mêmes", + "vu", + "vé", + "vôtre", + "vôtres", + "w", + "x", + "y", + "z", + "zut", + "à", + "â", + "ça", + "ès", + "étaient", + "étais", + "était", + "étant", + "été", + "être", + "ô" + ], + "hr": [ + "a", + "ako", + "ali", + "bi", + "bih", + "bila", + "bili", + "bilo", + "bio", + "bismo", + "biste", + "biti", + "bumo", + "da", + "do", + "duž", + "ga", + "hoće", + "hoćemo", + "hoćete", + "hoćeš", + "hoću", + "i", + "iako", + "ih", + "ili", + "iz", + "ja", + "je", + "jedna", + "jedne", + "jedno", + "jer", + "jesam", + "jesi", + "jesmo", + "jest", + "jeste", + "jesu", + "jim", + "joj", + "još", + "ju", + "kada", + "kako", + "kao", + "koja", + "koje", + "koji", + "kojima", + "koju", + "kroz", + "li", + "me", + "mene", + "meni", + "mi", + "mimo", + "moj", + "moja", + "moje", + "mu", + "na", + "nad", + "nakon", + "nam", + "nama", + "nas", + "naš", + "naša", + "naše", + "našeg", + "ne", + "nego", + "neka", + "neki", + "nekog", + "neku", + "nema", + "netko", + "neće", + "nećemo", + "nećete", + "nećeš", + "neću", + "nešto", + "ni", + "nije", + "nikoga", + "nikoje", + "nikoju", + "nisam", + "nisi", + "nismo", + "niste", + "nisu", + "njega", + "njegov", + "njegova", + "njegovo", + "njemu", + "njezin", + "njezina", + "njezino", + "njih", + "njihov", + "njihova", + "njihovo", + "njim", + "njima", + "njoj", + "nju", + "no", + "o", + "od", + "odmah", + "on", + "ona", + "oni", + "ono", + "ova", + "pa", + "pak", + "po", + "pod", + "pored", + "prije", + "s", + "sa", + "sam", + "samo", + "se", + "sebe", + "sebi", + "si", + "smo", + "ste", + "su", + "sve", + "svi", + "svog", + "svoj", + "svoja", + "svoje", + "svom", + "ta", + "tada", + "taj", + "tako", + "te", + "tebe", + "tebi", + "ti", + "to", + "toj", + "tome", + "tu", + "tvoj", + "tvoja", + "tvoje", + "u", + "uz", + "vam", + "vama", + "vas", + "vaš", + "vaša", + "vaše", + "već", + "vi", + "vrlo", + "za", + "zar", + "će", + "ćemo", + "ćete", + "ćeš", + "ću", + "što" + ], + "hu": [ + "a", + "abba", + "abban", + "abból", + "addig", + "ahhoz", + "ahogy", + "ahol", + "aki", + "akik", + "akkor", + "akár", + "alapján", + "alatt", + "alatta", + "alattad", + "alattam", + "alattatok", + "alattuk", + "alattunk", + "alá", + "alád", + "alájuk", + "alám", + "alánk", + "alátok", + "alól", + "alóla", + "alólad", + "alólam", + "alólatok", + "alóluk", + "alólunk", + "amely", + "amelybol", + "amelyek", + "amelyekben", + "amelyeket", + "amelyet", + "amelyik", + "amelynek", + "ami", + "amikor", + "amit", + "amolyan", + "amott", + "amíg", + "annak", + "annál", + "arra", + "arról", + "attól", + "az", + "aznap", + "azok", + "azokat", + "azokba", + "azokban", + "azokból", + "azokhoz", + "azokig", + "azokkal", + "azokká", + "azoknak", + "azoknál", + "azokon", + "azokra", + "azokról", + "azoktól", + "azokért", + "azon", + "azonban", + "azonnal", + "azt", + "aztán", + "azután", + "azzal", + "azzá", + "azért", + "bal", + "balra", + "ban", + "be", + "belé", + "beléd", + "beléjük", + "belém", + "belénk", + "belétek", + "belül", + "belőle", + "belőled", + "belőlem", + "belőletek", + "belőlük", + "belőlünk", + "ben", + "benne", + "benned", + "bennem", + "bennetek", + "bennük", + "bennünk", + "bár", + "bárcsak", + "bármilyen", + "búcsú", + "cikk", + "cikkek", + "cikkeket", + "csak", + "csakhogy", + "csupán", + "de", + "dehogy", + "e", + "ebbe", + "ebben", + "ebből", + "eddig", + "egy", + "egyebek", + "egyebet", + "egyedül", + "egyelőre", + "egyes", + "egyet", + "egyetlen", + "egyik", + "egymás", + "egyre", + "egyszerre", + "egyéb", + "együtt", + "egész", + "egészen", + "ehhez", + "ekkor", + "el", + "eleinte", + "ellen", + "ellenes", + "elleni", + "ellenére", + "elmondta", + "első", + "elsők", + "elsősorban", + "elsőt", + "elé", + "eléd", + "elég", + "eléjük", + "elém", + "elénk", + "elétek", + "elő", + "előbb", + "elől", + "előle", + "előled", + "előlem", + "előletek", + "előlük", + "előlünk", + "először", + "előtt", + "előtte", + "előtted", + "előttem", + "előttetek", + "előttük", + "előttünk", + "előző", + "emilyen", + "engem", + "ennek", + "ennyi", + "ennél", + "enyém", + "erre", + "erről", + "esetben", + "ettől", + "ez", + "ezek", + "ezekbe", + "ezekben", + "ezekből", + "ezeken", + "ezeket", + "ezekhez", + "ezekig", + "ezekkel", + "ezekké", + "ezeknek", + "ezeknél", + "ezekre", + "ezekről", + "ezektől", + "ezekért", + "ezen", + "ezentúl", + "ezer", + "ezret", + "ezt", + "ezután", + "ezzel", + "ezzé", + "ezért", + "fel", + "fele", + "felek", + "felet", + "felett", + "felé", + "fent", + "fenti", + "fél", + "fölé", + "gyakran", + "ha", + "halló", + "hamar", + "hanem", + "harmadik", + "harmadikat", + "harminc", + "hat", + "hatodik", + "hatodikat", + "hatot", + "hatvan", + "helyett", + "hetedik", + "hetediket", + "hetet", + "hetven", + "hirtelen", + "hiszen", + "hiába", + "hogy", + "hogyan", + "hol", + "holnap", + "holnapot", + "honnan", + "hova", + "hozzá", + "hozzád", + "hozzájuk", + "hozzám", + "hozzánk", + "hozzátok", + "hurrá", + "huszadik", + "hány", + "hányszor", + "hármat", + "három", + "hát", + "hátha", + "hátulsó", + "hét", + "húsz", + "ide", + "ide-оda", + "idén", + "igazán", + "igen", + "ill", + "illetve", + "ilyen", + "ilyenkor", + "immár", + "inkább", + "is", + "ismét", + "ison", + "itt", + "jelenleg", + "jobban", + "jobbra", + "jó", + "jól", + "jólesik", + "jóval", + "jövőre", + "kell", + "kellene", + "kellett", + "kelljen", + "keressünk", + "keresztül", + "ketten", + "kettő", + "kettőt", + "kevés", + "ki", + "kiben", + "kiből", + "kicsit", + "kicsoda", + "kihez", + "kik", + "kikbe", + "kikben", + "kikből", + "kiken", + "kiket", + "kikhez", + "kikkel", + "kikké", + "kiknek", + "kiknél", + "kikre", + "kikről", + "kiktől", + "kikért", + "kilenc", + "kilencedik", + "kilencediket", + "kilencet", + "kilencven", + "kin", + "kinek", + "kinél", + "kire", + "kiről", + "kit", + "kitől", + "kivel", + "kivé", + "kié", + "kiért", + "korábban", + "képest", + "kérem", + "kérlek", + "kész", + "késő", + "később", + "későn", + "két", + "kétszer", + "kívül", + "körül", + "köszönhetően", + "köszönöm", + "közben", + "közel", + "közepesen", + "közepén", + "közé", + "között", + "közül", + "külön", + "különben", + "különböző", + "különbözőbb", + "különbözőek", + "lassan", + "le", + "legalább", + "legyen", + "lehet", + "lehetetlen", + "lehetett", + "lehetőleg", + "lehetőség", + "lenne", + "lenni", + "lennék", + "lennének", + "lesz", + "leszek", + "lesznek", + "leszünk", + "lett", + "lettek", + "lettem", + "lettünk", + "lévő", + "ma", + "maga", + "magad", + "magam", + "magatokat", + "magukat", + "magunkat", + "magát", + "mai", + "majd", + "majdnem", + "manapság", + "meg", + "megcsinál", + "megcsinálnak", + "megint", + "megvan", + "mellett", + "mellette", + "melletted", + "mellettem", + "mellettetek", + "mellettük", + "mellettünk", + "mellé", + "melléd", + "melléjük", + "mellém", + "mellénk", + "mellétek", + "mellől", + "mellőle", + "mellőled", + "mellőlem", + "mellőletek", + "mellőlük", + "mellőlünk", + "mely", + "melyek", + "melyik", + "mennyi", + "mert", + "mi", + "miatt", + "miatta", + "miattad", + "miattam", + "miattatok", + "miattuk", + "miattunk", + "mibe", + "miben", + "miből", + "mihez", + "mik", + "mikbe", + "mikben", + "mikből", + "miken", + "miket", + "mikhez", + "mikkel", + "mikké", + "miknek", + "miknél", + "mikor", + "mikre", + "mikről", + "miktől", + "mikért", + "milyen", + "min", + "mind", + "mindegyik", + "mindegyiket", + "minden", + "mindenesetre", + "mindenki", + "mindent", + "mindenütt", + "mindig", + "mindketten", + "minek", + "minket", + "mint", + "mintha", + "minél", + "mire", + "miről", + "mit", + "mitől", + "mivel", + "mivé", + "miért", + "mondta", + "most", + "mostanáig", + "már", + "más", + "másik", + "másikat", + "másnap", + "második", + "másodszor", + "mások", + "másokat", + "mást", + "még", + "mégis", + "míg", + "mögé", + "mögéd", + "mögéjük", + "mögém", + "mögénk", + "mögétek", + "mögött", + "mögötte", + "mögötted", + "mögöttem", + "mögöttetek", + "mögöttük", + "mögöttünk", + "mögül", + "mögüle", + "mögüled", + "mögülem", + "mögületek", + "mögülük", + "mögülünk", + "múltkor", + "múlva", + "na", + "nagy", + "nagyobb", + "nagyon", + "naponta", + "napot", + "ne", + "negyedik", + "negyediket", + "negyven", + "neked", + "nekem", + "neki", + "nekik", + "nektek", + "nekünk", + "nem", + "nemcsak", + "nemrég", + "nincs", + "nyolc", + "nyolcadik", + "nyolcadikat", + "nyolcat", + "nyolcvan", + "nála", + "nálad", + "nálam", + "nálatok", + "náluk", + "nálunk", + "négy", + "négyet", + "néha", + "néhány", + "nélkül", + "o", + "oda", + "ok", + "olyan", + "onnan", + "ott", + "pedig", + "persze", + "pár", + "például", + "rajta", + "rajtad", + "rajtam", + "rajtatok", + "rajtuk", + "rajtunk", + "rendben", + "rosszul", + "rá", + "rád", + "rájuk", + "rám", + "ránk", + "rátok", + "régen", + "régóta", + "részére", + "róla", + "rólad", + "rólam", + "rólatok", + "róluk", + "rólunk", + "rögtön", + "s", + "saját", + "se", + "sem", + "semmi", + "semmilyen", + "semmiség", + "senki", + "soha", + "sok", + "sokan", + "sokat", + "sokkal", + "sokszor", + "sokáig", + "során", + "stb.", + "szemben", + "szerbusz", + "szerint", + "szerinte", + "szerinted", + "szerintem", + "szerintetek", + "szerintük", + "szerintünk", + "szervusz", + "szinte", + "számára", + "száz", + "századik", + "százat", + "szépen", + "szét", + "szíves", + "szívesen", + "szíveskedjék", + "sőt", + "talán", + "tavaly", + "te", + "tegnap", + "tegnapelőtt", + "tehát", + "tele", + "teljes", + "tessék", + "ti", + "tied", + "titeket", + "tizedik", + "tizediket", + "tizenegy", + "tizenegyedik", + "tizenhat", + "tizenhárom", + "tizenhét", + "tizenkettedik", + "tizenkettő", + "tizenkilenc", + "tizenkét", + "tizennyolc", + "tizennégy", + "tizenöt", + "tizet", + "tovább", + "további", + "továbbá", + "távol", + "téged", + "tényleg", + "tíz", + "több", + "többi", + "többször", + "túl", + "tőle", + "tőled", + "tőlem", + "tőletek", + "tőlük", + "tőlünk", + "ugyanakkor", + "ugyanez", + "ugyanis", + "ugye", + "urak", + "uram", + "urat", + "utoljára", + "utolsó", + "után", + "utána", + "vagy", + "vagyis", + "vagyok", + "vagytok", + "vagyunk", + "vajon", + "valahol", + "valaki", + "valakit", + "valamelyik", + "valami", + "valamint", + "való", + "van", + "vannak", + "vele", + "veled", + "velem", + "veletek", + "velük", + "velünk", + "vissza", + "viszlát", + "viszont", + "viszontlátásra", + "volna", + "volnának", + "volnék", + "volt", + "voltak", + "voltam", + "voltunk", + "végre", + "végén", + "végül", + "által", + "általában", + "ám", + "át", + "éljen", + "én", + "éppen", + "érte", + "érted", + "értem", + "értetek", + "értük", + "értünk", + "és", + "év", + "évben", + "éve", + "évek", + "éves", + "évi", + "évvel", + "így", + "óta", + "ön", + "önbe", + "önben", + "önből", + "önhöz", + "önnek", + "önnel", + "önnél", + "önre", + "önről", + "önt", + "öntől", + "önért", + "önök", + "önökbe", + "önökben", + "önökből", + "önöket", + "önökhöz", + "önökkel", + "önöknek", + "önöknél", + "önökre", + "önökről", + "önöktől", + "önökért", + "önökön", + "önön", + "össze", + "öt", + "ötven", + "ötödik", + "ötödiket", + "ötöt", + "úgy", + "úgyis", + "úgynevezett", + "új", + "újabb", + "újra", + "úr", + "ő", + "ők", + "őket", + "őt" + ], + "it": [ + "IE", + "a", + "abbastanza", + "abbia", + "abbiamo", + "abbiano", + "abbiate", + "accidenti", + "ad", + "adesso", + "affinche", + "agl", + "agli", + "ahime", + "ahimè", + "ai", + "al", + "alcuna", + "alcuni", + "alcuno", + "all", + "alla", + "alle", + "allo", + "allora", + "altri", + "altrimenti", + "altro", + "altrove", + "altrui", + "anche", + "ancora", + "anni", + "anno", + "ansa", + "anticipo", + "assai", + "attesa", + "attraverso", + "avanti", + "avemmo", + "avendo", + "avente", + "aver", + "avere", + "averlo", + "avesse", + "avessero", + "avessi", + "avessimo", + "aveste", + "avesti", + "avete", + "aveva", + "avevamo", + "avevano", + "avevate", + "avevi", + "avevo", + "avrai", + "avranno", + "avrebbe", + "avrebbero", + "avrei", + "avremmo", + "avremo", + "avreste", + "avresti", + "avrete", + "avrà", + "avrò", + "avuta", + "avute", + "avuti", + "avuto", + "basta", + "bene", + "benissimo", + "berlusconi", + "brava", + "bravo", + "c", + "casa", + "caso", + "cento", + "certa", + "certe", + "certi", + "certo", + "che", + "chi", + "chicchessia", + "chiunque", + "ci", + "ciascuna", + "ciascuno", + "cima", + "cio", + "cioe", + "cioè", + "circa", + "citta", + "città", + "ciò", + "co", + "codesta", + "codesti", + "codesto", + "cogli", + "coi", + "col", + "colei", + "coll", + "coloro", + "colui", + "come", + "cominci", + "comunque", + "con", + "concernente", + "conciliarsi", + "conclusione", + "consiglio", + "contro", + "cortesia", + "cos", + "cosa", + "cosi", + "così", + "cui", + "d", + "da", + "dagl", + "dagli", + "dai", + "dal", + "dall", + "dalla", + "dalle", + "dallo", + "dappertutto", + "davanti", + "degl", + "degli", + "dei", + "del", + "dell", + "della", + "delle", + "dello", + "dentro", + "detto", + "deve", + "di", + "dice", + "dietro", + "dire", + "dirimpetto", + "diventa", + "diventare", + "diventato", + "dopo", + "dov", + "dove", + "dovra", + "dovrà", + "dovunque", + "due", + "dunque", + "durante", + "e", + "ebbe", + "ebbero", + "ebbi", + "ecc", + "ecco", + "ed", + "effettivamente", + "egli", + "ella", + "entrambi", + "eppure", + "era", + "erano", + "eravamo", + "eravate", + "eri", + "ero", + "esempio", + "esse", + "essendo", + "esser", + "essere", + "essi", + "ex", + "fa", + "faccia", + "facciamo", + "facciano", + "facciate", + "faccio", + "facemmo", + "facendo", + "facesse", + "facessero", + "facessi", + "facessimo", + "faceste", + "facesti", + "faceva", + "facevamo", + "facevano", + "facevate", + "facevi", + "facevo", + "fai", + "fanno", + "farai", + "faranno", + "fare", + "farebbe", + "farebbero", + "farei", + "faremmo", + "faremo", + "fareste", + "faresti", + "farete", + "farà", + "farò", + "fatto", + "favore", + "fece", + "fecero", + "feci", + "fin", + "finalmente", + "finche", + "fine", + "fino", + "forse", + "forza", + "fosse", + "fossero", + "fossi", + "fossimo", + "foste", + "fosti", + "fra", + "frattempo", + "fu", + "fui", + "fummo", + "fuori", + "furono", + "futuro", + "generale", + "gia", + "giacche", + "giorni", + "giorno", + "già", + "gli", + "gliela", + "gliele", + "glieli", + "glielo", + "gliene", + "governo", + "grande", + "grazie", + "gruppo", + "ha", + "haha", + "hai", + "hanno", + "ho", + "i", + "ieri", + "il", + "improvviso", + "in", + "inc", + "infatti", + "inoltre", + "insieme", + "intanto", + "intorno", + "invece", + "io", + "l", + "la", + "lasciato", + "lato", + "lavoro", + "le", + "lei", + "li", + "lo", + "lontano", + "loro", + "lui", + "lungo", + "luogo", + "là", + "ma", + "macche", + "magari", + "maggior", + "mai", + "male", + "malgrado", + "malissimo", + "mancanza", + "marche", + "me", + "medesimo", + "mediante", + "meglio", + "meno", + "mentre", + "mesi", + "mezzo", + "mi", + "mia", + "mie", + "miei", + "mila", + "miliardi", + "milioni", + "minimi", + "ministro", + "mio", + "modo", + "molti", + "moltissimo", + "molto", + "momento", + "mondo", + "mosto", + "nazionale", + "ne", + "negl", + "negli", + "nei", + "nel", + "nell", + "nella", + "nelle", + "nello", + "nemmeno", + "neppure", + "nessun", + "nessuna", + "nessuno", + "niente", + "no", + "noi", + "non", + "nondimeno", + "nonostante", + "nonsia", + "nostra", + "nostre", + "nostri", + "nostro", + "novanta", + "nove", + "nulla", + "nuovo", + "o", + "od", + "oggi", + "ogni", + "ognuna", + "ognuno", + "oltre", + "oppure", + "ora", + "ore", + "osi", + "ossia", + "ottanta", + "otto", + "paese", + "parecchi", + "parecchie", + "parecchio", + "parte", + "partendo", + "peccato", + "peggio", + "per", + "perche", + "perchè", + "perché", + "percio", + "perciò", + "perfino", + "pero", + "persino", + "persone", + "però", + "piedi", + "pieno", + "piglia", + "piu", + "piuttosto", + "più", + "po", + "pochissimo", + "poco", + "poi", + "poiche", + "possa", + "possedere", + "posteriore", + "posto", + "potrebbe", + "preferibilmente", + "presa", + "press", + "prima", + "primo", + "principalmente", + "probabilmente", + "proprio", + "puo", + "pure", + "purtroppo", + "può", + "qualche", + "qualcosa", + "qualcuna", + "qualcuno", + "quale", + "quali", + "qualunque", + "quando", + "quanta", + "quante", + "quanti", + "quanto", + "quantunque", + "quasi", + "quattro", + "quel", + "quella", + "quelle", + "quelli", + "quello", + "quest", + "questa", + "queste", + "questi", + "questo", + "qui", + "quindi", + "realmente", + "recente", + "recentemente", + "registrazione", + "relativo", + "riecco", + "salvo", + "sara", + "sarai", + "saranno", + "sarebbe", + "sarebbero", + "sarei", + "saremmo", + "saremo", + "sareste", + "saresti", + "sarete", + "sarà", + "sarò", + "scola", + "scopo", + "scorso", + "se", + "secondo", + "seguente", + "seguito", + "sei", + "sembra", + "sembrare", + "sembrato", + "sembri", + "sempre", + "senza", + "sette", + "si", + "sia", + "siamo", + "siano", + "siate", + "siete", + "sig", + "solito", + "solo", + "soltanto", + "sono", + "sopra", + "sotto", + "spesso", + "srl", + "sta", + "stai", + "stando", + "stanno", + "starai", + "staranno", + "starebbe", + "starebbero", + "starei", + "staremmo", + "staremo", + "stareste", + "staresti", + "starete", + "starà", + "starò", + "stata", + "state", + "stati", + "stato", + "stava", + "stavamo", + "stavano", + "stavate", + "stavi", + "stavo", + "stemmo", + "stessa", + "stesse", + "stessero", + "stessi", + "stessimo", + "stesso", + "steste", + "stesti", + "stette", + "stettero", + "stetti", + "stia", + "stiamo", + "stiano", + "stiate", + "sto", + "su", + "sua", + "subito", + "successivamente", + "successivo", + "sue", + "sugl", + "sugli", + "sui", + "sul", + "sull", + "sulla", + "sulle", + "sullo", + "suo", + "suoi", + "tale", + "tali", + "talvolta", + "tanto", + "te", + "tempo", + "ti", + "titolo", + "torino", + "tra", + "tranne", + "tre", + "trenta", + "troppo", + "trovato", + "tu", + "tua", + "tue", + "tuo", + "tuoi", + "tutta", + "tuttavia", + "tutte", + "tutti", + "tutto", + "uguali", + "ulteriore", + "ultimo", + "un", + "una", + "uno", + "uomo", + "va", + "vale", + "vari", + "varia", + "varie", + "vario", + "verso", + "vi", + "via", + "vicino", + "visto", + "vita", + "voi", + "volta", + "volte", + "vostra", + "vostre", + "vostri", + "vostro", + "è" + ], + "ko": [ + "!", + "\"", + "$", + "%", + "&", + "'", + "(", + ")", + "*", + "+", + ",", + "-", + ".", + "...", + "0", + "1", + "2", + "3", + "4", + "5", + "6", + "7", + "8", + "9", + ";", + "<", + "=", + ">", + "?", + "@", + "\\", + "^", + "_", + "`", + "|", + "~", + "·", + "—", + "——", + "‘", + "’", + "“", + "”", + "…", + "、", + "。", + "〈", + "〉", + "《", + "》", + "가", + "가까스로", + "가령", + "각", + "각각", + "각자", + "각종", + "갖고말하자면", + "같다", + "같이", + "개의치않고", + "거니와", + "거바", + "거의", + "것", + "것과 같이", + "것들", + "게다가", + "게우다", + "겨우", + "견지에서", + "결과에 이르다", + "결국", + "결론을 낼 수 있다", + "겸사겸사", + "고려하면", + "고로", + "곧", + "공동으로", + "과", + "과연", + "관계가 있다", + "관계없이", + "관련이 있다", + "관하여", + "관한", + "관해서는", + "구", + "구체적으로", + "구토하다", + "그", + "그들", + "그때", + "그래", + "그래도", + "그래서", + "그러나", + "그러니", + "그러니까", + "그러면", + "그러므로", + "그러한즉", + "그런 까닭에", + "그런데", + "그런즉", + "그럼", + "그럼에도 불구하고", + "그렇게 함으로써", + "그렇지", + "그렇지 않다면", + "그렇지 않으면", + "그렇지만", + "그렇지않으면", + "그리고", + "그리하여", + "그만이다", + "그에 따르는", + "그위에", + "그저", + "그중에서", + "그치지 않다", + "근거로", + "근거하여", + "기대여", + "기점으로", + "기준으로", + "기타", + "까닭으로", + "까악", + "까지", + "까지 미치다", + "까지도", + "꽈당", + "끙끙", + "끼익", + "나", + "나머지는", + "남들", + "남짓", + "너", + "너희", + "너희들", + "네", + "넷", + "년", + "논하지 않다", + "놀라다", + "누가 알겠는가", + "누구", + "다른", + "다른 방면으로", + "다만", + "다섯", + "다소", + "다수", + "다시 말하자면", + "다시말하면", + "다음", + "다음에", + "다음으로", + "단지", + "답다", + "당신", + "당장", + "대로 하다", + "대하면", + "대하여", + "대해 말하자면", + "대해서", + "댕그", + "더구나", + "더군다나", + "더라도", + "더불어", + "더욱더", + "더욱이는", + "도달하다", + "도착하다", + "동시에", + "동안", + "된바에야", + "된이상", + "두번째로", + "둘", + "둥둥", + "뒤따라", + "뒤이어", + "든간에", + "들", + "등", + "등등", + "딩동", + "따라", + "따라서", + "따위", + "따지지 않다", + "딱", + "때", + "때가 되어", + "때문에", + "또", + "또한", + "뚝뚝", + "라 해도", + "령", + "로", + "로 인하여", + "로부터", + "로써", + "륙", + "를", + "마음대로", + "마저", + "마저도", + "마치", + "막론하고", + "만 못하다", + "만약", + "만약에", + "만은 아니다", + "만이 아니다", + "만일", + "만큼", + "말하자면", + "말할것도 없고", + "매", + "매번", + "메쓰겁다", + "몇", + "모", + "모두", + "무렵", + "무릎쓰고", + "무슨", + "무엇", + "무엇때문에", + "물론", + "및", + "바꾸어말하면", + "바꾸어말하자면", + "바꾸어서 말하면", + "바꾸어서 한다면", + "바꿔 말하면", + "바로", + "바와같이", + "밖에 안된다", + "반대로", + "반대로 말하자면", + "반드시", + "버금", + "보는데서", + "보다더", + "보드득", + "본대로", + "봐", + "봐라", + "부류의 사람들", + "부터", + "불구하고", + "불문하고", + "붕붕", + "비걱거리다", + "비교적", + "비길수 없다", + "비로소", + "비록", + "비슷하다", + "비추어 보아", + "비하면", + "뿐만 아니라", + "뿐만아니라", + "뿐이다", + "삐걱", + "삐걱거리다", + "사", + "삼", + "상대적으로 말하자면", + "생각한대로", + "설령", + "설마", + "설사", + "셋", + "소생", + "소인", + "솨", + "쉿", + "습니까", + "습니다", + "시각", + "시간", + "시작하여", + "시초에", + "시키다", + "실로", + "심지어", + "아", + "아니", + "아니나다를가", + "아니라면", + "아니면", + "아니었다면", + "아래윗", + "아무거나", + "아무도", + "아야", + "아울러", + "아이", + "아이고", + "아이구", + "아이야", + "아이쿠", + "아하", + "아홉", + "안 그러면", + "않기 위하여", + "않기 위해서", + "알 수 있다", + "알았어", + "앗", + "앞에서", + "앞의것", + "야", + "약간", + "양자", + "어", + "어기여차", + "어느", + "어느 년도", + "어느것", + "어느곳", + "어느때", + "어느쪽", + "어느해", + "어디", + "어때", + "어떠한", + "어떤", + "어떤것", + "어떤것들", + "어떻게", + "어떻해", + "어이", + "어째서", + "어쨋든", + "어쩔수 없다", + "어찌", + "어찌됏든", + "어찌됏어", + "어찌하든지", + "어찌하여", + "언제", + "언젠가", + "얼마", + "얼마 안 되는 것", + "얼마간", + "얼마나", + "얼마든지", + "얼마만큼", + "얼마큼", + "엉엉", + "에", + "에 가서", + "에 달려 있다", + "에 대해", + "에 있다", + "에 한하다", + "에게", + "에서", + "여", + "여기", + "여덟", + "여러분", + "여보시오", + "여부", + "여섯", + "여전히", + "여차", + "연관되다", + "연이서", + "영", + "영차", + "옆사람", + "예", + "예를 들면", + "예를 들자면", + "예컨대", + "예하면", + "오", + "오로지", + "오르다", + "오자마자", + "오직", + "오호", + "오히려", + "와", + "와 같은 사람들", + "와르르", + "와아", + "왜", + "왜냐하면", + "외에도", + "요만큼", + "요만한 것", + "요만한걸", + "요컨대", + "우르르", + "우리", + "우리들", + "우선", + "우에 종합한것과같이", + "운운", + "월", + "위에서 서술한바와같이", + "위하여", + "위해서", + "윙윙", + "육", + "으로", + "으로 인하여", + "으로서", + "으로써", + "을", + "응", + "응당", + "의", + "의거하여", + "의지하여", + "의해", + "의해되다", + "의해서", + "이", + "이 되다", + "이 때문에", + "이 밖에", + "이 외에", + "이 정도의", + "이것", + "이곳", + "이때", + "이라면", + "이래", + "이러이러하다", + "이러한", + "이런", + "이럴정도로", + "이렇게 많은 것", + "이렇게되면", + "이렇게말하자면", + "이렇구나", + "이로 인하여", + "이르기까지", + "이리하여", + "이만큼", + "이번", + "이봐", + "이상", + "이어서", + "이었다", + "이와 같다", + "이와 같은", + "이와 반대로", + "이와같다면", + "이외에도", + "이용하여", + "이유만으로", + "이젠", + "이지만", + "이쪽", + "이천구", + "이천육", + "이천칠", + "이천팔", + "인 듯하다", + "인젠", + "일", + "일것이다", + "일곱", + "일단", + "일때", + "일반적으로", + "일지라도", + "임에 틀림없다", + "입각하여", + "입장에서", + "잇따라", + "있다", + "자", + "자기", + "자기집", + "자마자", + "자신", + "잠깐", + "잠시", + "저", + "저것", + "저것만큼", + "저기", + "저쪽", + "저희", + "전부", + "전자", + "전후", + "점에서 보아", + "정도에 이르다", + "제", + "제각기", + "제외하고", + "조금", + "조차", + "조차도", + "졸졸", + "좀", + "좋아", + "좍좍", + "주룩주룩", + "주저하지 않고", + "줄은 몰랏다", + "줄은모른다", + "중에서", + "중의하나", + "즈음하여", + "즉", + "즉시", + "지든지", + "지만", + "지말고", + "진짜로", + "쪽으로", + "차라리", + "참", + "참나", + "첫번째로", + "쳇", + "총적으로", + "총적으로 말하면", + "총적으로 보면", + "칠", + "콸콸", + "쾅쾅", + "쿵", + "타다", + "타인", + "탕탕", + "토하다", + "통하여", + "툭", + "퉤", + "틈타", + "팍", + "팔", + "퍽", + "펄렁", + "하", + "하게될것이다", + "하게하다", + "하겠는가", + "하고 있다", + "하고있었다", + "하곤하였다", + "하구나", + "하기 때문에", + "하기 위하여", + "하기는한데", + "하기만 하면", + "하기보다는", + "하기에", + "하나", + "하느니", + "하는 김에", + "하는 편이 낫다", + "하는것도", + "하는것만 못하다", + "하는것이 낫다", + "하는바", + "하더라도", + "하도다", + "하도록시키다", + "하도록하다", + "하든지", + "하려고하다", + "하마터면", + "하면 할수록", + "하면된다", + "하면서", + "하물며", + "하여금", + "하여야", + "하자마자", + "하지 않는다면", + "하지 않도록", + "하지마", + "하지마라", + "하지만", + "하하", + "한 까닭에", + "한 이유는", + "한 후", + "한다면", + "한다면 몰라도", + "한데", + "한마디", + "한적이있다", + "한켠으로는", + "한항목", + "할 따름이다", + "할 생각이다", + "할 줄 안다", + "할 지경이다", + "할 힘이 있다", + "할때", + "할만하다", + "할망정", + "할뿐", + "할수있다", + "할수있어", + "할줄알다", + "할지라도", + "할지언정", + "함께", + "해도된다", + "해도좋다", + "해봐요", + "해서는 안된다", + "해야한다", + "해요", + "했어요", + "향하다", + "향하여", + "향해서", + "허", + "허걱", + "허허", + "헉", + "헉헉", + "헐떡헐떡", + "형식으로 쓰여", + "혹시", + "혹은", + "혼자", + "훨씬", + "휘익", + "휴", + "흐흐", + "흥", + "힘입어", + "︿", + "!", + "#", + "$", + "%", + "&", + "(", + ")", + "*", + "+", + ",", + "0", + "1", + "2", + "3", + "4", + "5", + "6", + "7", + "8", + "9", + ":", + ";", + "<", + ">", + "?", + "@", + "[", + "]", + "{", + "|", + "}", + "~", + "¥" + ], + "nl": [ + "aan", + "achte", + "achter", + "af", + "al", + "alle", + "alleen", + "alles", + "als", + "ander", + "anders", + "beetje", + "behalve", + "beide", + "beiden", + "ben", + "beneden", + "bent", + "bij", + "bijna", + "bijv", + "blijkbaar", + "blijken", + "boven", + "bv", + "daar", + "daardoor", + "daarin", + "daarna", + "daarom", + "daaruit", + "dan", + "dat", + "de", + "deden", + "deed", + "derde", + "derhalve", + "dertig", + "deze", + "dhr", + "die", + "dit", + "doe", + "doen", + "doet", + "door", + "drie", + "duizend", + "echter", + "een", + "eens", + "eerst", + "eerste", + "eigen", + "eigenlijk", + "elk", + "elke", + "en", + "enige", + "er", + "erg", + "ergens", + "etc", + "etcetera", + "even", + "geen", + "genoeg", + "geweest", + "haar", + "haarzelf", + "had", + "hadden", + "heb", + "hebben", + "hebt", + "hedden", + "heeft", + "heel", + "hem", + "hemzelf", + "hen", + "het", + "hetzelfde", + "hier", + "hierin", + "hierna", + "hierom", + "hij", + "hijzelf", + "hoe", + "honderd", + "hun", + "ieder", + "iedere", + "iedereen", + "iemand", + "iets", + "ik", + "in", + "inderdaad", + "intussen", + "is", + "ja", + "je", + "jij", + "jijzelf", + "jou", + "jouw", + "jullie", + "kan", + "kon", + "konden", + "kun", + "kunnen", + "kunt", + "laatst", + "later", + "lijken", + "lijkt", + "maak", + "maakt", + "maakte", + "maakten", + "maar", + "mag", + "maken", + "me", + "meer", + "meest", + "meestal", + "men", + "met", + "mevr", + "mij", + "mijn", + "minder", + "miss", + "misschien", + "missen", + "mits", + "mocht", + "mochten", + "moest", + "moesten", + "moet", + "moeten", + "mogen", + "mr", + "mrs", + "mw", + "na", + "naar", + "nam", + "namelijk", + "nee", + "neem", + "negen", + "nemen", + "nergens", + "niemand", + "niet", + "niets", + "niks", + "noch", + "nochtans", + "nog", + "nooit", + "nu", + "nv", + "of", + "om", + "omdat", + "ondanks", + "onder", + "ondertussen", + "ons", + "onze", + "onzeker", + "ooit", + "ook", + "op", + "over", + "overal", + "overige", + "paar", + "per", + "recent", + "redelijk", + "samen", + "sinds", + "steeds", + "te", + "tegen", + "tegenover", + "thans", + "tien", + "tiende", + "tijdens", + "tja", + "toch", + "toe", + "tot", + "totdat", + "tussen", + "twee", + "tweede", + "u", + "uit", + "uw", + "vaak", + "van", + "vanaf", + "veel", + "veertig", + "verder", + "verscheidene", + "verschillende", + "via", + "vier", + "vierde", + "vijf", + "vijfde", + "vijftig", + "volgend", + "volgens", + "voor", + "voordat", + "voorts", + "waar", + "waarom", + "waarschijnlijk", + "wanneer", + "waren", + "was", + "wat", + "we", + "wederom", + "weer", + "weinig", + "wel", + "welk", + "welke", + "werd", + "werden", + "werder", + "whatever", + "wie", + "wij", + "wijzelf", + "wil", + "wilden", + "willen", + "word", + "worden", + "wordt", + "zal", + "ze", + "zei", + "zeker", + "zelf", + "zelfde", + "zes", + "zeven", + "zich", + "zij", + "zijn", + "zijzelf", + "zo", + "zoals", + "zodat", + "zou", + "zouden", + "zulk", + "zullen" + ], + "no": [ + "alle", + "at", + "av", + "bare", + "begge", + "ble", + "blei", + "bli", + "blir", + "blitt", + "både", + "båe", + "da", + "de", + "deg", + "dei", + "deim", + "deira", + "deires", + "dem", + "den", + "denne", + "der", + "dere", + "deres", + "det", + "dette", + "di", + "din", + "disse", + "ditt", + "du", + "dykk", + "dykkar", + "då", + "eg", + "ein", + "eit", + "eitt", + "eller", + "elles", + "en", + "enn", + "er", + "et", + "ett", + "etter", + "for", + "fordi", + "fra", + "før", + "ha", + "hadde", + "han", + "hans", + "har", + "hennar", + "henne", + "hennes", + "her", + "hjå", + "ho", + "hoe", + "honom", + "hoss", + "hossen", + "hun", + "hva", + "hvem", + "hver", + "hvilke", + "hvilken", + "hvis", + "hvor", + "hvordan", + "hvorfor", + "i", + "ikke", + "ikkje", + "ingen", + "ingi", + "inkje", + "inn", + "inni", + "ja", + "jeg", + "kan", + "kom", + "korleis", + "korso", + "kun", + "kunne", + "kva", + "kvar", + "kvarhelst", + "kven", + "kvi", + "kvifor", + "man", + "mange", + "me", + "med", + "medan", + "meg", + "meget", + "mellom", + "men", + "mi", + "min", + "mine", + "mitt", + "mot", + "mykje", + "ned", + "no", + "noe", + "noen", + "noka", + "noko", + "nokon", + "nokor", + "nokre", + "nå", + "når", + "og", + "også", + "om", + "opp", + "oss", + "over", + "på", + "samme", + "seg", + "selv", + "si", + "sia", + "sidan", + "siden", + "sin", + "sine", + "sitt", + "sjøl", + "skal", + "skulle", + "slik", + "so", + "som", + "somme", + "somt", + "så", + "sånn", + "til", + "um", + "upp", + "ut", + "uten", + "var", + "vart", + "varte", + "ved", + "vere", + "verte", + "vi", + "vil", + "ville", + "vore", + "vors", + "vort", + "vår", + "være", + "vært", + "å" + ], + "pl": [ + "aby", + "ach", + "aj", + "albo", + "ale", + "ani", + "aż", + "bardzo", + "bez", + "bo", + "bowiem", + "by", + "byli", + "bym", + "być", + "był", + "była", + "było", + "były", + "będzie", + "będą", + "chce", + "choć", + "ci", + "ciebie", + "cię", + "co", + "coraz", + "coś", + "czy", + "czyli", + "często", + "daleko", + "dla", + "dlaczego", + "dlatego", + "do", + "dobrze", + "dokąd", + "dość", + "dr", + "dużo", + "dwa", + "dwaj", + "dwie", + "dwoje", + "dzisiaj", + "dziś", + "gdy", + "gdyby", + "gdyż", + "gdzie", + "go", + "godz", + "hab", + "i", + "ich", + "ii", + "iii", + "ile", + "im", + "inne", + "inny", + "inż", + "iv", + "ix", + "iż", + "ja", + "jak", + "jakby", + "jaki", + "jakie", + "jako", + "je", + "jeden", + "jedna", + "jednak", + "jedno", + "jednym", + "jedynie", + "jego", + "jej", + "jemu", + "jest", + "jestem", + "jeszcze", + "jeśli", + "jeżeli", + "już", + "ją", + "każdy", + "kiedy", + "kierunku", + "kilku", + "kto", + "która", + "które", + "którego", + "której", + "który", + "których", + "którym", + "którzy", + "ku", + "lat", + "lecz", + "lub", + "ma", + "mają", + "mam", + "mamy", + "mgr", + "mi", + "miał", + "mimo", + "mnie", + "mną", + "mogą", + "moi", + "moja", + "moje", + "może", + "można", + "mu", + "musi", + "my", + "mój", + "na", + "nad", + "nam", + "nami", + "nas", + "nasi", + "nasz", + "nasza", + "nasze", + "natychmiast", + "nawet", + "nic", + "nich", + "nie", + "niego", + "niej", + "niemu", + "nigdy", + "nim", + "nimi", + "nią", + "niż", + "no", + "nowe", + "np", + "nr", + "o", + "o.o.", + "obok", + "od", + "ok", + "około", + "on", + "ona", + "one", + "oni", + "ono", + "oraz", + "owszem", + "pan", + "pl", + "po", + "pod", + "ponad", + "ponieważ", + "poza", + "prof", + "przed", + "przede", + "przedtem", + "przez", + "przy", + "raz", + "razie", + "roku", + "również", + "sam", + "sama", + "się", + "skąd", + "sobie", + "sposób", + "swoje", + "są", + "ta", + "tak", + "taki", + "takich", + "takie", + "także", + "tam", + "te", + "tego", + "tej", + "tel", + "temu", + "ten", + "teraz", + "też", + "to", + "tobie", + "tobą", + "trzeba", + "tu", + "tutaj", + "twoi", + "twoja", + "twoje", + "twój", + "ty", + "tych", + "tylko", + "tym", + "tys", + "tzw", + "tę", + "u", + "ul", + "vi", + "vii", + "viii", + "vol", + "w", + "wam", + "wami", + "was", + "wasi", + "wasz", + "wasza", + "wasze", + "we", + "wie", + "więc", + "wszystko", + "wtedy", + "www", + "wy", + "właśnie", + "wśród", + "xi", + "xii", + "xiii", + "xiv", + "xv", + "z", + "za", + "zawsze", + "zaś", + "ze", + "zł", + "żaden", + "że", + "żeby" + ], + "pt": [ + "a", + "acerca", + "adeus", + "agora", + "ainda", + "algmas", + "algo", + "algumas", + "alguns", + "ali", + "além", + "ambos", + "ano", + "anos", + "antes", + "ao", + "aos", + "apenas", + "apoio", + "apontar", + "após", + "aquela", + "aquelas", + "aquele", + "aqueles", + "aqui", + "aquilo", + "as", + "assim", + "através", + "atrás", + "até", + "aí", + "baixo", + "bastante", + "bem", + "bom", + "breve", + "cada", + "caminho", + "catorze", + "cedo", + "cento", + "certamente", + "certeza", + "cima", + "cinco", + "coisa", + "com", + "como", + "comprido", + "conhecido", + "conselho", + "contra", + "corrente", + "custa", + "cá", + "da", + "daquela", + "daquele", + "dar", + "das", + "de", + "debaixo", + "demais", + "dentro", + "depois", + "desde", + "desligado", + "dessa", + "desse", + "desta", + "deste", + "deve", + "devem", + "deverá", + "dez", + "dezanove", + "dezasseis", + "dezassete", + "dezoito", + "dia", + "diante", + "direita", + "diz", + "dizem", + "dizer", + "do", + "dois", + "dos", + "doze", + "duas", + "dá", + "dão", + "dúvida", + "e", + "ela", + "elas", + "ele", + "eles", + "em", + "embora", + "enquanto", + "entre", + "então", + "era", + "essa", + "essas", + "esse", + "esses", + "esta", + "estado", + "estar", + "estará", + "estas", + "estava", + "este", + "estes", + "esteve", + "estive", + "estivemos", + "estiveram", + "estiveste", + "estivestes", + "estou", + "está", + "estás", + "estão", + "eu", + "exemplo", + "falta", + "fará", + "favor", + "faz", + "fazeis", + "fazem", + "fazemos", + "fazer", + "fazes", + "fazia", + "faço", + "fez", + "fim", + "final", + "foi", + "fomos", + "for", + "fora", + "foram", + "forma", + "foste", + "fostes", + "fui", + "geral", + "grande", + "grandes", + "grupo", + "hoje", + "horas", + "há", + "iniciar", + "inicio", + "ir", + "irá", + "isso", + "ista", + "iste", + "isto", + "já", + "lado", + "ligado", + "local", + "logo", + "longe", + "lugar", + "lá", + "maior", + "maioria", + "maiorias", + "mais", + "mal", + "mas", + "me", + "meio", + "menor", + "menos", + "meses", + "mesmo", + "meu", + "meus", + "mil", + "minha", + "minhas", + "momento", + "muito", + "muitos", + "máximo", + "mês", + "na", + "nada", + "naquela", + "naquele", + "nas", + "nem", + "nenhuma", + "nessa", + "nesse", + "nesta", + "neste", + "no", + "noite", + "nome", + "nos", + "nossa", + "nossas", + "nosso", + "nossos", + "nova", + "nove", + "novo", + "novos", + "num", + "numa", + "nunca", + "não", + "nível", + "nós", + "número", + "o", + "obra", + "obrigada", + "obrigado", + "oitava", + "oitavo", + "oito", + "onde", + "ontem", + "onze", + "os", + "ou", + "outra", + "outras", + "outro", + "outros", + "para", + "parece", + "parte", + "partir", + "pegar", + "pela", + "pelas", + "pelo", + "pelos", + "perto", + "pessoas", + "pode", + "podem", + "poder", + "poderá", + "podia", + "ponto", + "pontos", + "por", + "porque", + "porquê", + "posição", + "possivelmente", + "posso", + "possível", + "pouca", + "pouco", + "povo", + "primeira", + "primeiro", + "promeiro", + "próprio", + "próximo", + "puderam", + "pôde", + "põe", + "põem", + "qual", + "qualquer", + "quando", + "quanto", + "quarta", + "quarto", + "quatro", + "que", + "quem", + "quer", + "quero", + "questão", + "quieto", + "quinta", + "quinto", + "quinze", + "quê", + "relação", + "sabe", + "saber", + "se", + "segunda", + "segundo", + "sei", + "seis", + "sem", + "sempre", + "ser", + "seria", + "sete", + "seu", + "seus", + "sexta", + "sexto", + "sim", + "sistema", + "sob", + "sobre", + "sois", + "somente", + "somos", + "sou", + "sua", + "suas", + "são", + "sétima", + "sétimo", + "tal", + "talvez", + "também", + "tanto", + "tarde", + "te", + "tem", + "temos", + "tempo", + "tendes", + "tenho", + "tens", + "tentar", + "tentaram", + "tente", + "tentei", + "ter", + "terceira", + "terceiro", + "teu", + "teus", + "teve", + "tipo", + "tive", + "tivemos", + "tiveram", + "tiveste", + "tivestes", + "toda", + "todas", + "todo", + "todos", + "trabalhar", + "trabalho", + "treze", + "três", + "tu", + "tua", + "tuas", + "tudo", + "tão", + "têm", + "um", + "uma", + "umas", + "uns", + "usa", + "usar", + "vai", + "vais", + "valor", + "veja", + "vem", + "vens", + "ver", + "verdade", + "verdadeiro", + "vez", + "vezes", + "viagem", + "vindo", + "vinte", + "você", + "vocês", + "vos", + "vossa", + "vossas", + "vosso", + "vossos", + "vários", + "vão", + "vêm", + "vós", + "zero", + "à", + "às", + "área", + "é", + "és", + "último" + ], + "ru": [ + "а", + "алло", + "без", + "белый", + "близко", + "более", + "больше", + "большой", + "будем", + "будет", + "будете", + "будешь", + "будто", + "буду", + "будут", + "будь", + "бы", + "бывает", + "бывь", + "был", + "была", + "были", + "было", + "быть", + "в", + "важная", + "важное", + "важные", + "важный", + "вам", + "вами", + "вас", + "ваш", + "ваша", + "ваше", + "ваши", + "вверх", + "вдали", + "вдруг", + "ведь", + "везде", + "вернуться", + "весь", + "вечер", + "взгляд", + "взять", + "вид", + "видеть", + "вместе", + "вниз", + "внизу", + "во", + "вода", + "война", + "вокруг", + "вон", + "вообще", + "вопрос", + "восемнадцатый", + "восемнадцать", + "восемь", + "восьмой", + "вот", + "впрочем", + "времени", + "время", + "все", + "всегда", + "всего", + "всем", + "всеми", + "всему", + "всех", + "всею", + "всю", + "всюду", + "вся", + "всё", + "второй", + "вы", + "выйти", + "г", + "где", + "главный", + "глаз", + "говорил", + "говорит", + "говорить", + "год", + "года", + "году", + "голова", + "голос", + "город", + "да", + "давать", + "давно", + "даже", + "далекий", + "далеко", + "дальше", + "даром", + "дать", + "два", + "двадцатый", + "двадцать", + "две", + "двенадцатый", + "двенадцать", + "дверь", + "двух", + "девятнадцатый", + "девятнадцать", + "девятый", + "девять", + "действительно", + "дел", + "делать", + "дело", + "день", + "деньги", + "десятый", + "десять", + "для", + "до", + "довольно", + "долго", + "должно", + "должный", + "дом", + "дорога", + "друг", + "другая", + "другие", + "других", + "друго", + "другое", + "другой", + "думать", + "душа", + "е", + "его", + "ее", + "ей", + "ему", + "если", + "есть", + "еще", + "ещё", + "ею", + "её", + "ж", + "ждать", + "же", + "жена", + "женщина", + "жизнь", + "жить", + "за", + "занят", + "занята", + "занято", + "заняты", + "затем", + "зато", + "зачем", + "здесь", + "земля", + "знать", + "значит", + "значить", + "и", + "идти", + "из", + "или", + "им", + "именно", + "иметь", + "ими", + "имя", + "иногда", + "их", + "к", + "каждая", + "каждое", + "каждые", + "каждый", + "кажется", + "казаться", + "как", + "какая", + "какой", + "кем", + "книга", + "когда", + "кого", + "ком", + "комната", + "кому", + "конец", + "конечно", + "которая", + "которого", + "которой", + "которые", + "который", + "которых", + "кроме", + "кругом", + "кто", + "куда", + "лежать", + "лет", + "ли", + "лицо", + "лишь", + "лучше", + "любить", + "люди", + "м", + "маленький", + "мало", + "мать", + "машина", + "между", + "меля", + "менее", + "меньше", + "меня", + "место", + "миллионов", + "мимо", + "минута", + "мир", + "мира", + "мне", + "много", + "многочисленная", + "многочисленное", + "многочисленные", + "многочисленный", + "мной", + "мною", + "мог", + "могут", + "мож", + "может", + "можно", + "можхо", + "мои", + "мой", + "мор", + "москва", + "мочь", + "моя", + "моё", + "мы", + "на", + "наверху", + "над", + "надо", + "назад", + "наиболее", + "найти", + "наконец", + "нам", + "нами", + "народ", + "нас", + "начала", + "начать", + "наш", + "наша", + "наше", + "наши", + "не", + "него", + "недавно", + "недалеко", + "нее", + "ней", + "некоторый", + "нельзя", + "нем", + "немного", + "нему", + "непрерывно", + "нередко", + "несколько", + "нет", + "нею", + "неё", + "ни", + "нибудь", + "ниже", + "низко", + "никакой", + "никогда", + "никто", + "никуда", + "ними", + "них", + "ничего", + "ничто", + "но", + "новый", + "нога", + "ночь", + "ну", + "нужно", + "нужный", + "нх", + "о", + "об", + "оба", + "обычно", + "один", + "одиннадцатый", + "одиннадцать", + "однажды", + "однако", + "одного", + "одной", + "оказаться", + "окно", + "около", + "он", + "она", + "они", + "оно", + "опять", + "особенно", + "остаться", + "от", + "ответить", + "отец", + "отовсюду", + "отсюда", + "очень", + "первый", + "перед", + "писать", + "плечо", + "по", + "под", + "подумать", + "пожалуйста", + "позже", + "пойти", + "пока", + "пол", + "получить", + "помнить", + "понимать", + "понять", + "пор", + "пора", + "после", + "последний", + "посмотреть", + "посреди", + "потом", + "потому", + "почему", + "почти", + "правда", + "прекрасно", + "при", + "про", + "просто", + "против", + "процентов", + "пятнадцатый", + "пятнадцать", + "пятый", + "пять", + "работа", + "работать", + "раз", + "разве", + "рано", + "раньше", + "ребенок", + "решить", + "россия", + "рука", + "русский", + "ряд", + "рядом", + "с", + "сам", + "сама", + "сами", + "самим", + "самими", + "самих", + "само", + "самого", + "самой", + "самом", + "самому", + "саму", + "самый", + "свет", + "свое", + "своего", + "своей", + "свои", + "своих", + "свой", + "свою", + "сделать", + "сеаой", + "себе", + "себя", + "сегодня", + "седьмой", + "сейчас", + "семнадцатый", + "семнадцать", + "семь", + "сидеть", + "сила", + "сих", + "сказал", + "сказала", + "сказать", + "сколько", + "слишком", + "слово", + "случай", + "смотреть", + "сначала", + "снова", + "со", + "собой", + "собою", + "советский", + "совсем", + "спасибо", + "спросить", + "сразу", + "стал", + "старый", + "стать", + "стол", + "сторона", + "стоять", + "страна", + "суть", + "считать", + "т", + "та", + "так", + "такая", + "также", + "таки", + "такие", + "такое", + "такой", + "там", + "твой", + "твоя", + "твоё", + "те", + "тебе", + "тебя", + "тем", + "теми", + "теперь", + "тех", + "то", + "тобой", + "тобою", + "товарищ", + "тогда", + "того", + "тоже", + "только", + "том", + "тому", + "тот", + "тою", + "третий", + "три", + "тринадцатый", + "тринадцать", + "ту", + "туда", + "тут", + "ты", + "тысяч", + "у", + "увидеть", + "уж", + "уже", + "улица", + "уметь", + "утро", + "хороший", + "хорошо", + "хотеть", + "хоть", + "хотя", + "хочешь", + "час", + "часто", + "часть", + "чаще", + "чего", + "человек", + "чем", + "чему", + "через", + "четвертый", + "четыре", + "четырнадцатый", + "четырнадцать", + "что", + "чтоб", + "чтобы", + "чуть", + "шестнадцатый", + "шестнадцать", + "шестой", + "шесть", + "эта", + "эти", + "этим", + "этими", + "этих", + "это", + "этого", + "этой", + "этом", + "этому", + "этот", + "эту", + "я" + ], + "sv": [ + "aderton", + "adertonde", + "adjö", + "aldrig", + "alla", + "allas", + "allt", + "alltid", + "alltså", + "andra", + "andras", + "annan", + "annat", + "artonde", + "artonn", + "att", + "av", + "bakom", + "bara", + "behöva", + "behövas", + "behövde", + "behövt", + "beslut", + "beslutat", + "beslutit", + "bland", + "blev", + "bli", + "blir", + "blivit", + "bort", + "borta", + "bra", + "bäst", + "bättre", + "båda", + "bådas", + "dag", + "dagar", + "dagarna", + "dagen", + "de", + "del", + "delen", + "dem", + "den", + "denna", + "deras", + "dess", + "dessa", + "det", + "detta", + "dig", + "din", + "dina", + "dit", + "ditt", + "dock", + "du", + "där", + "därför", + "då", + "efter", + "eftersom", + "ej", + "elfte", + "eller", + "elva", + "en", + "enkel", + "enkelt", + "enkla", + "enligt", + "er", + "era", + "ert", + "ett", + "ettusen", + "fanns", + "fem", + "femte", + "femtio", + "femtionde", + "femton", + "femtonde", + "fick", + "fin", + "finnas", + "finns", + "fjorton", + "fjortonde", + "fjärde", + "fler", + "flera", + "flesta", + "fram", + "framför", + "från", + "fyra", + "fyrtio", + "fyrtionde", + "få", + "får", + "fått", + "följande", + "för", + "före", + "förlåt", + "förra", + "första", + "genast", + "genom", + "gick", + "gjorde", + "gjort", + "god", + "goda", + "godare", + "godast", + "gott", + "gälla", + "gäller", + "gällt", + "gärna", + "gå", + "går", + "gått", + "gör", + "göra", + "ha", + "hade", + "haft", + "han", + "hans", + "har", + "heller", + "hellre", + "helst", + "helt", + "henne", + "hennes", + "hit", + "hon", + "honom", + "hundra", + "hundraen", + "hundraett", + "hur", + "här", + "hög", + "höger", + "högre", + "högst", + "i", + "ibland", + "icke", + "idag", + "igen", + "igår", + "imorgon", + "in", + "inför", + "inga", + "ingen", + "ingenting", + "inget", + "innan", + "inne", + "inom", + "inte", + "inuti", + "ja", + "jag", + "ju", + "jämfört", + "kan", + "kanske", + "knappast", + "kom", + "komma", + "kommer", + "kommit", + "kr", + "kunde", + "kunna", + "kunnat", + "kvar", + "legat", + "ligga", + "ligger", + "lika", + "likställd", + "likställda", + "lilla", + "lite", + "liten", + "litet", + "länge", + "längre", + "längst", + "lätt", + "lättare", + "lättast", + "långsam", + "långsammare", + "långsammast", + "långsamt", + "långt", + "man", + "med", + "mellan", + "men", + "mer", + "mera", + "mest", + "mig", + "min", + "mina", + "mindre", + "minst", + "mitt", + "mittemot", + "mot", + "mycket", + "många", + "måste", + "möjlig", + "möjligen", + "möjligt", + "möjligtvis", + "ned", + "nederst", + "nedersta", + "nedre", + "nej", + "ner", + "ni", + "nio", + "nionde", + "nittio", + "nittionde", + "nitton", + "nittonde", + "nog", + "noll", + "nr", + "nu", + "nummer", + "när", + "nästa", + "någon", + "någonting", + "något", + "några", + "nödvändig", + "nödvändiga", + "nödvändigt", + "nödvändigtvis", + "och", + "också", + "ofta", + "oftast", + "olika", + "olikt", + "om", + "oss", + "på", + "rakt", + "redan", + "rätt", + "sade", + "sagt", + "samma", + "sedan", + "senare", + "senast", + "sent", + "sex", + "sextio", + "sextionde", + "sexton", + "sextonde", + "sig", + "sin", + "sina", + "sist", + "sista", + "siste", + "sitt", + "sitta", + "sju", + "sjunde", + "sjuttio", + "sjuttionde", + "sjutton", + "sjuttonde", + "själv", + "sjätte", + "ska", + "skall", + "skulle", + "slutligen", + "små", + "smått", + "snart", + "som", + "stor", + "stora", + "stort", + "större", + "störst", + "säga", + "säger", + "sämre", + "sämst", + "så", + "sådan", + "sådana", + "sådant", + "tack", + "tidig", + "tidigare", + "tidigast", + "tidigt", + "till", + "tills", + "tillsammans", + "tio", + "tionde", + "tjugo", + "tjugoen", + "tjugoett", + "tjugonde", + "tjugotre", + "tjugotvå", + "tjungo", + "tolfte", + "tolv", + "tre", + "tredje", + "trettio", + "trettionde", + "tretton", + "trettonde", + "två", + "tvåhundra", + "under", + "upp", + "ur", + "ursäkt", + "ut", + "utan", + "utanför", + "ute", + "vad", + "var", + "vara", + "varför", + "varifrån", + "varit", + "varje", + "varken", + "vars", + "varsågod", + "vart", + "vem", + "vems", + "verkligen", + "vi", + "vid", + "vidare", + "viktig", + "viktigare", + "viktigast", + "viktigt", + "vilka", + "vilkas", + "vilken", + "vilket", + "vill", + "vänster", + "vänstra", + "värre", + "vår", + "våra", + "vårt", + "än", + "ännu", + "är", + "även", + "åt", + "åtminstone", + "åtta", + "åttio", + "åttionde", + "åttonde", + "över", + "övermorgon", + "överst", + "övre" + ], + "tr": [ + "acaba", + "acep", + "adeta", + "altmýþ", + "altmış", + "altý", + "altı", + "ama", + "ancak", + "arada", + "artýk", + "aslında", + "aynen", + "ayrıca", + "az", + "bana", + "bari", + "bazen", + "bazý", + "bazı", + "baţka", + "belki", + "ben", + "benden", + "beni", + "benim", + "beri", + "beþ", + "beş", + "beţ", + "bile", + "bin", + "bir", + "biraz", + "biri", + "birkaç", + "birkez", + "birçok", + "birþey", + "birþeyi", + "birşey", + "birşeyi", + "birţey", + "biz", + "bizden", + "bize", + "bizi", + "bizim", + "bu", + "buna", + "bunda", + "bundan", + "bunlar", + "bunları", + "bunların", + "bunu", + "bunun", + "burada", + "böyle", + "böylece", + "bütün", + "da", + "daha", + "dahi", + "dahil", + "daima", + "dair", + "dayanarak", + "de", + "defa", + "deđil", + "değil", + "diye", + "diđer", + "diğer", + "doksan", + "dokuz", + "dolayı", + "dolayısıyla", + "dört", + "edecek", + "eden", + "ederek", + "edilecek", + "ediliyor", + "edilmesi", + "ediyor", + "elli", + "en", + "etmesi", + "etti", + "ettiği", + "ettiğini", + "eđer", + "eğer", + "fakat", + "gibi", + "göre", + "halbuki", + "halen", + "hangi", + "hani", + "hariç", + "hatta", + "hele", + "hem", + "henüz", + "hep", + "hepsi", + "her", + "herhangi", + "herkes", + "herkesin", + "hiç", + "hiçbir", + "iken", + "iki", + "ila", + "ile", + "ilgili", + "ilk", + "illa", + "ise", + "itibaren", + "itibariyle", + "iyi", + "iyice", + "için", + "işte", + "iţte", + "kadar", + "kanýmca", + "karşın", + "katrilyon", + "kendi", + "kendilerine", + "kendini", + "kendisi", + "kendisine", + "kendisini", + "kere", + "kez", + "keţke", + "ki", + "kim", + "kimden", + "kime", + "kimi", + "kimse", + "kýrk", + "kýsaca", + "kırk", + "lakin", + "madem", + "međer", + "milyar", + "milyon", + "mu", + "mü", + "mý", + "mı", + "nasýl", + "nasıl", + "ne", + "neden", + "nedenle", + "nerde", + "nere", + "nerede", + "nereye", + "nitekim", + "niye", + "niçin", + "o", + "olan", + "olarak", + "oldu", + "olduklarını", + "olduğu", + "olduğunu", + "olmadı", + "olmadığı", + "olmak", + "olması", + "olmayan", + "olmaz", + "olsa", + "olsun", + "olup", + "olur", + "olursa", + "oluyor", + "on", + "ona", + "ondan", + "onlar", + "onlardan", + "onlari", + "onlarýn", + "onları", + "onların", + "onu", + "onun", + "otuz", + "oysa", + "pek", + "rağmen", + "sadece", + "sanki", + "sekiz", + "seksen", + "sen", + "senden", + "seni", + "senin", + "siz", + "sizden", + "sizi", + "sizin", + "sonra", + "tarafından", + "trilyon", + "tüm", + "var", + "vardı", + "ve", + "veya", + "veyahut", + "ya", + "yahut", + "yani", + "yapacak", + "yapmak", + "yaptı", + "yaptıkları", + "yaptığı", + "yaptığını", + "yapılan", + "yapılması", + "yapıyor", + "yedi", + "yerine", + "yetmiþ", + "yetmiş", + "yetmiţ", + "yine", + "yirmi", + "yoksa", + "yüz", + "zaten", + "çok", + "çünkü", + "öyle", + "üzere", + "üç", + "þey", + "þeyden", + "þeyi", + "þeyler", + "þu", + "þuna", + "þunda", + "þundan", + "þunu", + "şey", + "şeyden", + "şeyi", + "şeyler", + "şu", + "şuna", + "şunda", + "şundan", + "şunları", + "şunu", + "şöyle", + "ţayet", + "ţimdi", + "ţu", + "ţöyle" + ], + "zh": [ + "、", + "。", + "〈", + "〉", + "《", + "》", + "一", + "一切", + "一则", + "一方面", + "一旦", + "一来", + "一样", + "一般", + "七", + "万一", + "三", + "上下", + "不仅", + "不但", + "不光", + "不单", + "不只", + "不如", + "不怕", + "不惟", + "不成", + "不拘", + "不比", + "不然", + "不特", + "不独", + "不管", + "不论", + "不过", + "不问", + "与", + "与其", + "与否", + "与此同时", + "且", + "两者", + "个", + "临", + "为", + "为了", + "为什么", + "为何", + "为着", + "乃", + "乃至", + "么", + "之", + "之一", + "之所以", + "之类", + "乌乎", + "乎", + "乘", + "九", + "也", + "也好", + "也罢", + "了", + "二", + "于", + "于是", + "于是乎", + "云云", + "五", + "人家", + "什么", + "什么样", + "从", + "从而", + "他", + "他人", + "他们", + "以", + "以便", + "以免", + "以及", + "以至", + "以至于", + "以致", + "们", + "任", + "任何", + "任凭", + "似的", + "但", + "但是", + "何", + "何况", + "何处", + "何时", + "作为", + "你", + "你们", + "使得", + "例如", + "依", + "依照", + "俺", + "俺们", + "倘", + "倘使", + "倘或", + "倘然", + "倘若", + "借", + "假使", + "假如", + "假若", + "像", + "八", + "六", + "兮", + "关于", + "其", + "其一", + "其中", + "其二", + "其他", + "其余", + "其它", + "其次", + "具体地说", + "具体说来", + "再者", + "再说", + "冒", + "冲", + "况且", + "几", + "几时", + "凭", + "凭借", + "则", + "别", + "别的", + "别说", + "到", + "前后", + "前者", + "加之", + "即", + "即令", + "即使", + "即便", + "即或", + "即若", + "又", + "及", + "及其", + "及至", + "反之", + "反过来", + "反过来说", + "另", + "另一方面", + "另外", + "只是", + "只有", + "只要", + "只限", + "叫", + "叮咚", + "可", + "可以", + "可是", + "可见", + "各", + "各个", + "各位", + "各种", + "各自", + "同", + "同时", + "向", + "向着", + "吓", + "吗", + "否则", + "吧", + "吧哒", + "吱", + "呀", + "呃", + "呕", + "呗", + "呜", + "呜呼", + "呢", + "呵", + "呸", + "呼哧", + "咋", + "和", + "咚", + "咦", + "咱", + "咱们", + "咳", + "哇", + "哈", + "哈哈", + "哉", + "哎", + "哎呀", + "哎哟", + "哗", + "哟", + "哦", + "哩", + "哪", + "哪个", + "哪些", + "哪儿", + "哪天", + "哪年", + "哪怕", + "哪样", + "哪边", + "哪里", + "哼", + "哼唷", + "唉", + "啊", + "啐", + "啥", + "啦", + "啪达", + "喂", + "喏", + "喔唷", + "嗡嗡", + "嗬", + "嗯", + "嗳", + "嘎", + "嘎登", + "嘘", + "嘛", + "嘻", + "嘿", + "四", + "因", + "因为", + "因此", + "因而", + "固然", + "在", + "在下", + "地", + "多", + "多少", + "她", + "她们", + "如", + "如上所述", + "如何", + "如其", + "如果", + "如此", + "如若", + "宁", + "宁可", + "宁愿", + "宁肯", + "它", + "它们", + "对", + "对于", + "将", + "尔后", + "尚且", + "就", + "就是", + "就是说", + "尽", + "尽管", + "岂但", + "己", + "并", + "并且", + "开外", + "开始", + "归", + "当", + "当着", + "彼", + "彼此", + "往", + "待", + "得", + "怎", + "怎么", + "怎么办", + "怎么样", + "怎样", + "总之", + "总的来看", + "总的来说", + "总的说来", + "总而言之", + "恰恰相反", + "您", + "慢说", + "我", + "我们", + "或", + "或是", + "或者", + "所", + "所以", + "打", + "把", + "抑或", + "拿", + "按", + "按照", + "换句话说", + "换言之", + "据", + "接着", + "故", + "故此", + "旁人", + "无宁", + "无论", + "既", + "既是", + "既然", + "时候", + "是", + "是的", + "替", + "有", + "有些", + "有关", + "有的", + "望", + "朝", + "朝着", + "本", + "本着", + "来", + "来着", + "极了", + "果然", + "果真", + "某", + "某个", + "某些", + "根据", + "正如", + "此", + "此外", + "此间", + "毋宁", + "每", + "每当", + "比", + "比如", + "比方", + "沿", + "沿着", + "漫说", + "焉", + "然则", + "然后", + "然而", + "照", + "照着", + "甚么", + "甚而", + "甚至", + "用", + "由", + "由于", + "由此可见", + "的", + "的话", + "相对而言", + "省得", + "着", + "着呢", + "矣", + "离", + "第", + "等", + "等等", + "管", + "紧接着", + "纵", + "纵令", + "纵使", + "纵然", + "经", + "经过", + "结果", + "给", + "继而", + "综上所述", + "罢了", + "者", + "而", + "而且", + "而况", + "而外", + "而已", + "而是", + "而言", + "能", + "腾", + "自", + "自个儿", + "自从", + "自各儿", + "自家", + "自己", + "自身", + "至", + "至于", + "若", + "若是", + "若非", + "莫若", + "虽", + "虽则", + "虽然", + "虽说", + "被", + "要", + "要不", + "要不是", + "要不然", + "要么", + "要是", + "让", + "论", + "设使", + "设若", + "该", + "诸位", + "谁", + "谁知", + "赶", + "起", + "起见", + "趁", + "趁着", + "越是", + "跟", + "较", + "较之", + "边", + "过", + "还是", + "还有", + "这", + "这个", + "这么", + "这么些", + "这么样", + "这么点儿", + "这些", + "这会儿", + "这儿", + "这就是说", + "这时", + "这样", + "这边", + "这里", + "进而", + "连", + "连同", + "通过", + "遵照", + "那", + "那个", + "那么", + "那么些", + "那么样", + "那些", + "那会儿", + "那儿", + "那时", + "那样", + "那边", + "那里", + "鄙人", + "鉴于", + "阿", + "除", + "除了", + "除此之外", + "除非", + "随", + "随着", + "零", + "非但", + "非徒", + "靠", + "顺", + "顺着", + "首先", + "︿", + "!", + "#", + "$", + "%", + "&", + "(", + ")", + "*", + "+", + ",", + "0", + "1", + "2", + "3", + "4", + "5", + "6", + "7", + "8", + "9", + ":", + ";", + "<", + ">", + "?", + "@", + "[", + "]", + "{", + "|", + "}", + "~", + "¥" + ], + "eo": [ + "adiaŭ", + "ajn", + "al", + "ankoraŭ", + "antaŭ", + "aŭ", + "bonan", + "bonvole", + "bonvolu", + "bv", + "ci", + "cia", + "cian", + "cin", + "d-ro", + "da", + "de", + "dek", + "deka", + "do", + "doktor'", + "doktoro", + "du", + "dua", + "dum", + "eble", + "ekz", + "ekzemple", + "en", + "estas", + "estis", + "estos", + "estu", + "estus", + "eĉ", + "f-no", + "feliĉan", + "for", + "fraŭlino", + "ha", + "havas", + "havis", + "havos", + "havu", + "havus", + "he", + "ho", + "hu", + "ili", + "ilia", + "ilian", + "ilin", + "inter", + "io", + "ion", + "iu", + "iujn", + "iun", + "ja", + "jam", + "je", + "jes", + "k", + "kaj", + "ke", + "kio", + "kion", + "kiu", + "kiujn", + "kiun", + "kvankam", + "kvar", + "kvara", + "kvazaŭ", + "kvin", + "kvina", + "la", + "li", + "lia", + "lian", + "lin", + "malantaŭ", + "male", + "malgraŭ", + "mem", + "mi", + "mia", + "mian", + "min", + "minus", + "naŭ", + "naŭa", + "ne", + "nek", + "nenio", + "nenion", + "neniu", + "neniun", + "nepre", + "ni", + "nia", + "nian", + "nin", + "nu", + "nun", + "nur", + "ok", + "oka", + "oni", + "onia", + "onian", + "onin", + "plej", + "pli", + "plu", + "plus", + "por", + "post", + "preter", + "s-no", + "s-ro", + "se", + "sed", + "sep", + "sepa", + "ses", + "sesa", + "si", + "sia", + "sian", + "sin", + "sinjor'", + "sinjorino", + "sinjoro", + "sub", + "super", + "supren", + "sur", + "tamen", + "tio", + "tion", + "tiu", + "tiujn", + "tiun", + "tra", + "tri", + "tria", + "tuj", + "tute", + "unu", + "unua", + "ve", + "verŝajne", + "vi", + "via", + "vian", + "vin", + "ĉi", + "ĉio", + "ĉion", + "ĉiu", + "ĉiujn", + "ĉiun", + "ĉu", + "ĝi", + "ĝia", + "ĝian", + "ĝin", + "ĝis", + "ĵus", + "ŝi", + "ŝia", + "ŝin" + ], + "he": [ + "אבל", + "או", + "אולי", + "אותה", + "אותו", + "אותי", + "אותך", + "אותם", + "אותן", + "אותנו", + "אז", + "אחר", + "אחרות", + "אחרי", + "אחריכן", + "אחרים", + "אחרת", + "אי", + "איזה", + "איך", + "אין", + "איפה", + "איתה", + "איתו", + "איתי", + "איתך", + "איתכם", + "איתכן", + "איתם", + "איתן", + "איתנו", + "אך", + "אל", + "אלה", + "אלו", + "אם", + "אנחנו", + "אני", + "אס", + "אף", + "אצל", + "אשר", + "את", + "אתה", + "אתכם", + "אתכן", + "אתם", + "אתן", + "באיזומידה", + "באמצע", + "באמצעות", + "בגלל", + "בין", + "בלי", + "במידה", + "במקוםשבו", + "ברם", + "בשביל", + "בשעהש", + "בתוך", + "גם", + "דרך", + "הוא", + "היא", + "היה", + "היכן", + "היתה", + "היתי", + "הם", + "הן", + "הנה", + "הסיבהשבגללה", + "הרי", + "ואילו", + "ואת", + "זאת", + "זה", + "זות", + "יהיה", + "יוכל", + "יוכלו", + "יותרמדי", + "יכול", + "יכולה", + "יכולות", + "יכולים", + "יכל", + "יכלה", + "יכלו", + "יש", + "כאן", + "כאשר", + "כולם", + "כולן", + "כזה", + "כי", + "כיצד", + "כך", + "ככה", + "כל", + "כלל", + "כמו", + "כן", + "כפי", + "כש", + "לא", + "לאו", + "לאיזותכלית", + "לאן", + "לבין", + "לה", + "להיות", + "להם", + "להן", + "לו", + "לי", + "לכם", + "לכן", + "למה", + "למטה", + "למעלה", + "למקוםשבו", + "למרות", + "לנו", + "לעבר", + "לעיכן", + "לפיכך", + "לפני", + "מאד", + "מאחורי", + "מאיזוסיבה", + "מאין", + "מאיפה", + "מבלי", + "מבעד", + "מדוע", + "מה", + "מהיכן", + "מול", + "מחוץ", + "מי", + "מכאן", + "מכיוון", + "מלבד", + "מן", + "מנין", + "מסוגל", + "מעט", + "מעטים", + "מעל", + "מצד", + "מקוםבו", + "מתחת", + "מתי", + "נגד", + "נגר", + "נו", + "עד", + "עז", + "על", + "עלי", + "עליה", + "עליהם", + "עליהן", + "עליו", + "עליך", + "עליכם", + "עלינו", + "עם", + "עצמה", + "עצמהם", + "עצמהן", + "עצמו", + "עצמי", + "עצמם", + "עצמן", + "עצמנו", + "פה", + "רק", + "שוב", + "של", + "שלה", + "שלהם", + "שלהן", + "שלו", + "שלי", + "שלך", + "שלכה", + "שלכם", + "שלכן", + "שלנו", + "שם", + "תהיה", + "תחת" + ], + "la": [ + "a", + "ab", + "ac", + "ad", + "at", + "atque", + "aut", + "autem", + "cum", + "de", + "dum", + "e", + "erant", + "erat", + "est", + "et", + "etiam", + "ex", + "haec", + "hic", + "hoc", + "in", + "ita", + "me", + "nec", + "neque", + "non", + "per", + "qua", + "quae", + "quam", + "qui", + "quibus", + "quidem", + "quo", + "quod", + "re", + "rebus", + "rem", + "res", + "sed", + "si", + "sic", + "sunt", + "tamen", + "tandem", + "te", + "ut", + "vel" + ], + "sk": [ + "a", + "aby", + "aj", + "ako", + "aký", + "ale", + "alebo", + "ani", + "avšak", + "ba", + "bez", + "buï", + "cez", + "do", + "ho", + "hoci", + "i", + "ich", + "im", + "ja", + "jeho", + "jej", + "jemu", + "ju", + "k", + "kam", + "kde", + "kedže", + "keï", + "kto", + "ktorý", + "ku", + "lebo", + "ma", + "mi", + "mne", + "mnou", + "mu", + "my", + "mòa", + "môj", + "na", + "nad", + "nami", + "neho", + "nej", + "nemu", + "nich", + "nielen", + "nim", + "no", + "nám", + "nás", + "náš", + "ním", + "o", + "od", + "on", + "ona", + "oni", + "ono", + "ony", + "po", + "pod", + "pre", + "pred", + "pri", + "s", + "sa", + "seba", + "sem", + "so", + "svoj", + "taký", + "tam", + "teba", + "tebe", + "tebou", + "tej", + "ten", + "ti", + "tie", + "to", + "toho", + "tomu", + "tou", + "tvoj", + "ty", + "tá", + "tým", + "v", + "vami", + "veï", + "vo", + "vy", + "vám", + "vás", + "váš", + "však", + "z", + "za", + "zo", + "a", + "èi", + "èo", + "èí", + "òom", + "òou", + "òu", + "že" + ], + "sl": [ + "a", + "ali", + "april", + "avgust", + "b", + "bi", + "bil", + "bila", + "bile", + "bili", + "bilo", + "biti", + "blizu", + "bo", + "bodo", + "bojo", + "bolj", + "bom", + "bomo", + "boste", + "bova", + "boš", + "brez", + "c", + "cel", + "cela", + "celi", + "celo", + "d", + "da", + "daleč", + "dan", + "danes", + "datum", + "december", + "deset", + "deseta", + "deseti", + "deseto", + "devet", + "deveta", + "deveti", + "deveto", + "do", + "dober", + "dobra", + "dobri", + "dobro", + "dokler", + "dol", + "dolg", + "dolga", + "dolgi", + "dovolj", + "drug", + "druga", + "drugi", + "drugo", + "dva", + "dve", + "e", + "eden", + "en", + "ena", + "ene", + "eni", + "enkrat", + "eno", + "etc.", + "f", + "februar", + "g", + "g.", + "ga", + "ga.", + "gor", + "gospa", + "gospod", + "h", + "halo", + "i", + "idr.", + "ii", + "iii", + "in", + "iv", + "ix", + "iz", + "j", + "januar", + "jaz", + "je", + "ji", + "jih", + "jim", + "jo", + "julij", + "junij", + "jutri", + "k", + "kadarkoli", + "kaj", + "kajti", + "kako", + "kakor", + "kamor", + "kamorkoli", + "kar", + "karkoli", + "katerikoli", + "kdaj", + "kdo", + "kdorkoli", + "ker", + "ki", + "kje", + "kjer", + "kjerkoli", + "ko", + "koder", + "koderkoli", + "koga", + "komu", + "kot", + "kratek", + "kratka", + "kratke", + "kratki", + "l", + "lahka", + "lahke", + "lahki", + "lahko", + "le", + "lep", + "lepa", + "lepe", + "lepi", + "lepo", + "leto", + "m", + "maj", + "majhen", + "majhna", + "majhni", + "malce", + "malo", + "manj", + "marec", + "me", + "med", + "medtem", + "mene", + "mesec", + "mi", + "midva", + "midve", + "mnogo", + "moj", + "moja", + "moje", + "mora", + "morajo", + "moram", + "moramo", + "morate", + "moraš", + "morem", + "mu", + "n", + "na", + "nad", + "naj", + "najina", + "najino", + "najmanj", + "naju", + "največ", + "nam", + "narobe", + "nas", + "nato", + "nazaj", + "naš", + "naša", + "naše", + "ne", + "nedavno", + "nedelja", + "nek", + "neka", + "nekaj", + "nekatere", + "nekateri", + "nekatero", + "nekdo", + "neke", + "nekega", + "neki", + "nekje", + "neko", + "nekoga", + "nekoč", + "ni", + "nikamor", + "nikdar", + "nikjer", + "nikoli", + "nič", + "nje", + "njega", + "njegov", + "njegova", + "njegovo", + "njej", + "njemu", + "njen", + "njena", + "njeno", + "nji", + "njih", + "njihov", + "njihova", + "njihovo", + "njiju", + "njim", + "njo", + "njun", + "njuna", + "njuno", + "no", + "nocoj", + "november", + "npr.", + "o", + "ob", + "oba", + "obe", + "oboje", + "od", + "odprt", + "odprta", + "odprti", + "okoli", + "oktober", + "on", + "onadva", + "one", + "oni", + "onidve", + "osem", + "osma", + "osmi", + "osmo", + "oz.", + "p", + "pa", + "pet", + "peta", + "petek", + "peti", + "peto", + "po", + "pod", + "pogosto", + "poleg", + "poln", + "polna", + "polni", + "polno", + "ponavadi", + "ponedeljek", + "ponovno", + "potem", + "povsod", + "pozdravljen", + "pozdravljeni", + "prav", + "prava", + "prave", + "pravi", + "pravo", + "prazen", + "prazna", + "prazno", + "prbl.", + "precej", + "pred", + "prej", + "preko", + "pri", + "pribl.", + "približno", + "primer", + "pripravljen", + "pripravljena", + "pripravljeni", + "proti", + "prva", + "prvi", + "prvo", + "r", + "ravno", + "redko", + "res", + "reč", + "s", + "saj", + "sam", + "sama", + "same", + "sami", + "samo", + "se", + "sebe", + "sebi", + "sedaj", + "sedem", + "sedma", + "sedmi", + "sedmo", + "sem", + "september", + "seveda", + "si", + "sicer", + "skoraj", + "skozi", + "slab", + "smo", + "so", + "sobota", + "spet", + "sreda", + "srednja", + "srednji", + "sta", + "ste", + "stran", + "stvar", + "sva", + "t", + "ta", + "tak", + "taka", + "take", + "taki", + "tako", + "takoj", + "tam", + "te", + "tebe", + "tebi", + "tega", + "težak", + "težka", + "težki", + "težko", + "ti", + "tista", + "tiste", + "tisti", + "tisto", + "tj.", + "tja", + "to", + "toda", + "torek", + "tretja", + "tretje", + "tretji", + "tri", + "tu", + "tudi", + "tukaj", + "tvoj", + "tvoja", + "tvoje", + "u", + "v", + "vaju", + "vam", + "vas", + "vaš", + "vaša", + "vaše", + "ve", + "vedno", + "velik", + "velika", + "veliki", + "veliko", + "vendar", + "ves", + "več", + "vi", + "vidva", + "vii", + "viii", + "visok", + "visoka", + "visoke", + "visoki", + "vsa", + "vsaj", + "vsak", + "vsaka", + "vsakdo", + "vsake", + "vsaki", + "vsakomur", + "vse", + "vsega", + "vsi", + "vso", + "včasih", + "včeraj", + "x", + "z", + "za", + "zadaj", + "zadnji", + "zakaj", + "zaprta", + "zaprti", + "zaprto", + "zdaj", + "zelo", + "zunaj", + "č", + "če", + "često", + "četrta", + "četrtek", + "četrti", + "četrto", + "čez", + "čigav", + "š", + "šest", + "šesta", + "šesti", + "šesto", + "štiri", + "ž", + "že" + ], + "br": [ + "a", + "ainda", + "alem", + "ambas", + "ambos", + "antes", + "ao", + "aonde", + "aos", + "apos", + "aquele", + "aqueles", + "as", + "assim", + "com", + "como", + "contra", + "contudo", + "cuja", + "cujas", + "cujo", + "cujos", + "da", + "das", + "de", + "dela", + "dele", + "deles", + "demais", + "depois", + "desde", + "desta", + "deste", + "dispoe", + "dispoem", + "diversa", + "diversas", + "diversos", + "do", + "dos", + "durante", + "e", + "ela", + "elas", + "ele", + "eles", + "em", + "entao", + "entre", + "essa", + "essas", + "esse", + "esses", + "esta", + "estas", + "este", + "estes", + "ha", + "isso", + "isto", + "logo", + "mais", + "mas", + "mediante", + "menos", + "mesma", + "mesmas", + "mesmo", + "mesmos", + "na", + "nao", + "nas", + "nem", + "nesse", + "neste", + "nos", + "o", + "os", + "ou", + "outra", + "outras", + "outro", + "outros", + "pelas", + "pelo", + "pelos", + "perante", + "pois", + "por", + "porque", + "portanto", + "propios", + "proprio", + "quais", + "qual", + "qualquer", + "quando", + "quanto", + "que", + "quem", + "quer", + "se", + "seja", + "sem", + "sendo", + "seu", + "seus", + "sob", + "sobre", + "sua", + "suas", + "tal", + "tambem", + "teu", + "teus", + "toda", + "todas", + "todo", + "todos", + "tua", + "tuas", + "tudo", + "um", + "uma", + "umas", + "uns" + ], + "ca": [ + "a", + "abans", + "ací", + "ah", + "així", + "això", + "al", + "aleshores", + "algun", + "alguna", + "algunes", + "alguns", + "alhora", + "allà", + "allí", + "allò", + "als", + "altra", + "altre", + "altres", + "amb", + "ambdues", + "ambdós", + "apa", + "aquell", + "aquella", + "aquelles", + "aquells", + "aquest", + "aquesta", + "aquestes", + "aquests", + "aquí", + "baix", + "cada", + "cadascuna", + "cadascunes", + "cadascuns", + "cadascú", + "com", + "contra", + "d'un", + "d'una", + "d'unes", + "d'uns", + "dalt", + "de", + "del", + "dels", + "des", + "després", + "dins", + "dintre", + "donat", + "doncs", + "durant", + "e", + "eh", + "el", + "els", + "em", + "en", + "encara", + "ens", + "entre", + "eren", + "es", + "esta", + "estaven", + "esteu", + "està", + "estàvem", + "estàveu", + "et", + "etc", + "ets", + "fins", + "fora", + "gairebé", + "ha", + "han", + "has", + "havia", + "he", + "hem", + "heu", + "hi", + "ho", + "i", + "igual", + "iguals", + "ja", + "l'hi", + "la", + "les", + "li", + "li'n", + "llavors", + "m'he", + "ma", + "mal", + "malgrat", + "mateix", + "mateixa", + "mateixes", + "mateixos", + "me", + "mentre", + "meu", + "meus", + "meva", + "meves", + "molt", + "molta", + "moltes", + "molts", + "mon", + "mons", + "més", + "n'he", + "n'hi", + "ne", + "ni", + "no", + "nogensmenys", + "només", + "nosaltres", + "nostra", + "nostre", + "nostres", + "o", + "oh", + "oi", + "on", + "pas", + "pel", + "pels", + "per", + "perquè", + "però", + "poc", + "poca", + "pocs", + "poques", + "potser", + "propi", + "qual", + "quals", + "quan", + "quant", + "que", + "quelcom", + "qui", + "quin", + "quina", + "quines", + "quins", + "què", + "s'ha", + "s'han", + "sa", + "semblant", + "semblants", + "ses", + "seu", + "seus", + "seva", + "seves", + "si", + "sobre", + "sobretot", + "solament", + "sols", + "son", + "sons", + "sota", + "sou", + "sóc", + "són", + "t'ha", + "t'han", + "t'he", + "ta", + "tal", + "també", + "tampoc", + "tan", + "tant", + "tanta", + "tantes", + "teu", + "teus", + "teva", + "teves", + "ton", + "tons", + "tot", + "tota", + "totes", + "tots", + "un", + "una", + "unes", + "uns", + "us", + "va", + "vaig", + "vam", + "van", + "vas", + "veu", + "vosaltres", + "vostra", + "vostre", + "vostres", + "érem", + "éreu", + "és" + ], + "cs": [ + "a", + "aby", + "ahoj", + "aj", + "ale", + "anebo", + "ani", + "ano", + "asi", + "aspoň", + "atd", + "atp", + "ačkoli", + "až", + "bez", + "beze", + "blízko", + "bohužel", + "brzo", + "bude", + "budem", + "budeme", + "budete", + "budeš", + "budou", + "budu", + "by", + "byl", + "byla", + "byli", + "bylo", + "byly", + "bys", + "být", + "během", + "chce", + "chceme", + "chcete", + "chceš", + "chci", + "chtít", + "chtějí", + "chut'", + "chuti", + "co", + "což", + "cz", + "daleko", + "další", + "den", + "deset", + "devatenáct", + "devět", + "dnes", + "do", + "dobrý", + "docela", + "dva", + "dvacet", + "dvanáct", + "dvě", + "dál", + "dále", + "děkovat", + "děkujeme", + "děkuji", + "ho", + "hodně", + "i", + "jak", + "jakmile", + "jako", + "jakož", + "jde", + "je", + "jeden", + "jedenáct", + "jedna", + "jedno", + "jednou", + "jedou", + "jeho", + "jehož", + "jej", + "jejich", + "její", + "jelikož", + "jemu", + "jen", + "jenom", + "jestli", + "jestliže", + "ještě", + "jež", + "ji", + "jich", + "jimi", + "jinak", + "jiné", + "již", + "jsem", + "jseš", + "jsi", + "jsme", + "jsou", + "jste", + "já", + "jí", + "jím", + "jíž", + "k", + "kam", + "kde", + "kdo", + "kdy", + "když", + "ke", + "kolik", + "kromě", + "kterou", + "která", + "které", + "který", + "kteří", + "kvůli", + "mají", + "mezi", + "mi", + "mne", + "mnou", + "mně", + "moc", + "mohl", + "mohou", + "moje", + "moji", + "možná", + "musí", + "my", + "má", + "málo", + "mám", + "máme", + "máte", + "máš", + "mé", + "mí", + "mít", + "mě", + "můj", + "může", + "na", + "nad", + "nade", + "napište", + "naproti", + "načež", + "naše", + "naši", + "ne", + "nebo", + "nebyl", + "nebyla", + "nebyli", + "nebyly", + "nedělají", + "nedělá", + "nedělám", + "neděláme", + "neděláte", + "neděláš", + "neg", + "nejsi", + "nejsou", + "nemají", + "nemáme", + "nemáte", + "neměl", + "není", + "nestačí", + "nevadí", + "než", + "nic", + "nich", + "nimi", + "nové", + "nový", + "nula", + "nám", + "námi", + "nás", + "náš", + "ním", + "ně", + "něco", + "nějak", + "někde", + "někdo", + "němu", + "němuž", + "o", + "od", + "ode", + "on", + "ona", + "oni", + "ono", + "ony", + "osm", + "osmnáct", + "pak", + "patnáct", + "po", + "pod", + "podle", + "pokud", + "potom", + "pouze", + "pozdě", + "pořád", + "pravé", + "pro", + "prostě", + "prosím", + "proti", + "proto", + "protože", + "proč", + "první", + "pta", + "pět", + "před", + "přes", + "přese", + "při", + "přičemž", + "re", + "rovně", + "s", + "se", + "sedm", + "sedmnáct", + "si", + "skoro", + "smí", + "smějí", + "snad", + "spolu", + "sta", + "sto", + "strana", + "sté", + "své", + "svých", + "svým", + "svými", + "ta", + "tady", + "tak", + "takhle", + "taky", + "také", + "takže", + "tam", + "tamhle", + "tamhleto", + "tamto", + "tato", + "tebe", + "tebou", + "ted'", + "tedy", + "ten", + "tento", + "teto", + "ti", + "tipy", + "tisíc", + "tisíce", + "to", + "tobě", + "tohle", + "toho", + "tohoto", + "tom", + "tomto", + "tomu", + "tomuto", + "toto", + "trošku", + "tu", + "tuto", + "tvoje", + "tvá", + "tvé", + "tvůj", + "ty", + "tyto", + "téma", + "tím", + "tímto", + "tě", + "těm", + "těmu", + "třeba", + "tři", + "třináct", + "u", + "určitě", + "už", + "v", + "vaše", + "vaši", + "ve", + "vedle", + "večer", + "vlastně", + "vy", + "vám", + "vámi", + "vás", + "váš", + "více", + "však", + "všechno", + "všichni", + "vůbec", + "vždy", + "z", + "za", + "zatímco", + "zač", + "zda", + "zde", + "ze", + "zprávy", + "zpět", + "čau", + "či", + "článku", + "články", + "čtrnáct", + "čtyři", + "šest", + "šestnáct", + "že" + ], + "el": [ + "αλλα", + "αν", + "αντι", + "απο", + "αυτα", + "αυτεσ", + "αυτη", + "αυτο", + "αυτοι", + "αυτοσ", + "αυτουσ", + "αυτων", + "για", + "δε", + "δεν", + "εαν", + "ειμαι", + "ειμαστε", + "ειναι", + "εισαι", + "ειστε", + "εκεινα", + "εκεινεσ", + "εκεινη", + "εκεινο", + "εκεινοι", + "εκεινοσ", + "εκεινουσ", + "εκεινων", + "ενω", + "επι", + "η", + "θα", + "ισωσ", + "κ", + "και", + "κατα", + "κι", + "μα", + "με", + "μετα", + "μη", + "μην", + "να", + "ο", + "οι", + "ομωσ", + "οπωσ", + "οσο", + "οτι", + "παρα", + "ποια", + "ποιεσ", + "ποιο", + "ποιοι", + "ποιοσ", + "ποιουσ", + "ποιων", + "που", + "προσ", + "πωσ", + "σε", + "στη", + "στην", + "στο", + "στον", + "τα", + "την", + "τησ", + "το", + "τον", + "τοτε", + "του", + "των", + "ωσ" + ], + "eu": [ + "al", + "anitz", + "arabera", + "asko", + "baina", + "bat", + "batean", + "batek", + "bati", + "batzuei", + "batzuek", + "batzuetan", + "batzuk", + "bera", + "beraiek", + "berau", + "berauek", + "bere", + "berori", + "beroriek", + "beste", + "bezala", + "da", + "dago", + "dira", + "ditu", + "du", + "dute", + "edo", + "egin", + "ere", + "eta", + "eurak", + "ez", + "gainera", + "gu", + "gutxi", + "guzti", + "haiei", + "haiek", + "haietan", + "hainbeste", + "hala", + "han", + "handik", + "hango", + "hara", + "hari", + "hark", + "hartan", + "hau", + "hauei", + "hauek", + "hauetan", + "hemen", + "hemendik", + "hemengo", + "hi", + "hona", + "honek", + "honela", + "honetan", + "honi", + "hor", + "hori", + "horiei", + "horiek", + "horietan", + "horko", + "horra", + "horrek", + "horrela", + "horretan", + "horri", + "hortik", + "hura", + "izan", + "ni", + "noiz", + "nola", + "non", + "nondik", + "nongo", + "nor", + "nora", + "ze", + "zein", + "zen", + "zenbait", + "zenbat", + "zer", + "zergatik", + "ziren", + "zituen", + "zu", + "zuek", + "zuen", + "zuten" + ], + "ga": [ + "a", + "ach", + "ag", + "agus", + "an", + "aon", + "ar", + "arna", + "as", + "b'", + "ba", + "beirt", + "bhúr", + "caoga", + "ceathair", + "ceathrar", + "chomh", + "chtó", + "chuig", + "chun", + "cois", + "céad", + "cúig", + "cúigear", + "d'", + "daichead", + "dar", + "de", + "deich", + "deichniúr", + "den", + "dhá", + "do", + "don", + "dtí", + "dá", + "dár", + "dó", + "faoi", + "faoin", + "faoina", + "faoinár", + "fara", + "fiche", + "gach", + "gan", + "go", + "gur", + "haon", + "hocht", + "i", + "iad", + "idir", + "in", + "ina", + "ins", + "inár", + "is", + "le", + "leis", + "lena", + "lenár", + "m'", + "mar", + "mo", + "mé", + "na", + "nach", + "naoi", + "naonúr", + "ná", + "ní", + "níor", + "nó", + "nócha", + "ocht", + "ochtar", + "os", + "roimh", + "sa", + "seacht", + "seachtar", + "seachtó", + "seasca", + "seisear", + "siad", + "sibh", + "sinn", + "sna", + "sé", + "sí", + "tar", + "thar", + "thú", + "triúr", + "trí", + "trína", + "trínár", + "tríocha", + "tú", + "um", + "ár", + "é", + "éis", + "í", + "ó", + "ón", + "óna", + "ónár" + ], + "gl": [ + "a", + "alí", + "ao", + "aos", + "aquel", + "aquela", + "aquelas", + "aqueles", + "aquilo", + "aquí", + "as", + "así", + "aínda", + "ben", + "cando", + "che", + "co", + "coa", + "coas", + "comigo", + "con", + "connosco", + "contigo", + "convosco", + "cos", + "cun", + "cunha", + "cunhas", + "cuns", + "da", + "dalgunha", + "dalgunhas", + "dalgún", + "dalgúns", + "das", + "de", + "del", + "dela", + "delas", + "deles", + "desde", + "deste", + "do", + "dos", + "dun", + "dunha", + "dunhas", + "duns", + "e", + "el", + "ela", + "elas", + "eles", + "en", + "era", + "eran", + "esa", + "esas", + "ese", + "eses", + "esta", + "estaba", + "estar", + "este", + "estes", + "estiven", + "estou", + "está", + "están", + "eu", + "facer", + "foi", + "foron", + "fun", + "había", + "hai", + "iso", + "isto", + "la", + "las", + "lle", + "lles", + "lo", + "los", + "mais", + "me", + "meu", + "meus", + "min", + "miña", + "miñas", + "moi", + "na", + "nas", + "neste", + "nin", + "no", + "non", + "nos", + "nosa", + "nosas", + "noso", + "nosos", + "nun", + "nunha", + "nunhas", + "nuns", + "nós", + "o", + "os", + "ou", + "para", + "pero", + "pode", + "pois", + "pola", + "polas", + "polo", + "polos", + "por", + "que", + "se", + "senón", + "ser", + "seu", + "seus", + "sexa", + "sido", + "sobre", + "súa", + "súas", + "tamén", + "tan", + "te", + "ten", + "ter", + "teu", + "teus", + "teñen", + "teño", + "ti", + "tido", + "tiven", + "tiña", + "túa", + "túas", + "un", + "unha", + "unhas", + "uns", + "vos", + "vosa", + "vosas", + "voso", + "vosos", + "vós", + "á", + "é", + "ó", + "ós" + ], + "hy": [ + "այդ", + "այլ", + "այն", + "այս", + "դու", + "դուք", + "եմ", + "են", + "ենք", + "ես", + "եք", + "է", + "էի", + "էին", + "էինք", + "էիր", + "էիք", + "էր", + "ըստ", + "թ", + "ի", + "ին", + "իսկ", + "իր", + "կամ", + "համար", + "հետ", + "հետո", + "մենք", + "մեջ", + "մի", + "ն", + "նա", + "նաև", + "նրա", + "նրանք", + "որ", + "որը", + "որոնք", + "որպես", + "ու", + "ում", + "պիտի", + "վրա", + "և" + ], + "id": [ + "ada", + "adalah", + "adanya", + "adapun", + "agak", + "agaknya", + "agar", + "akan", + "akankah", + "akhirnya", + "aku", + "akulah", + "amat", + "amatlah", + "anda", + "andalah", + "antar", + "antara", + "antaranya", + "apa", + "apaan", + "apabila", + "apakah", + "apalagi", + "apatah", + "atau", + "ataukah", + "ataupun", + "bagai", + "bagaikan", + "bagaimana", + "bagaimanakah", + "bagaimanapun", + "bagi", + "bahkan", + "bahwa", + "bahwasanya", + "banyak", + "beberapa", + "begini", + "beginian", + "beginikah", + "beginilah", + "begitu", + "begitukah", + "begitulah", + "begitupun", + "belum", + "belumlah", + "berapa", + "berapakah", + "berapalah", + "berapapun", + "bermacam", + "bersama", + "betulkah", + "biasa", + "biasanya", + "bila", + "bilakah", + "bisa", + "bisakah", + "boleh", + "bolehkah", + "bolehlah", + "buat", + "bukan", + "bukankah", + "bukanlah", + "bukannya", + "cuma", + "dahulu", + "dalam", + "dan", + "dapat", + "dari", + "daripada", + "dekat", + "demi", + "demikian", + "demikianlah", + "dengan", + "depan", + "di", + "dia", + "dialah", + "diantara", + "diantaranya", + "dikarenakan", + "dini", + "diri", + "dirinya", + "disini", + "disinilah", + "dong", + "dulu", + "enggak", + "enggaknya", + "entah", + "entahlah", + "hal", + "hampir", + "hanya", + "hanyalah", + "harus", + "haruslah", + "harusnya", + "hendak", + "hendaklah", + "hendaknya", + "hingga", + "ia", + "ialah", + "ibarat", + "ingin", + "inginkah", + "inginkan", + "ini", + "inikah", + "inilah", + "itu", + "itukah", + "itulah", + "jangan", + "jangankan", + "janganlah", + "jika", + "jikalau", + "juga", + "justru", + "kala", + "kalau", + "kalaulah", + "kalaupun", + "kalian", + "kami", + "kamilah", + "kamu", + "kamulah", + "kan", + "kapan", + "kapankah", + "kapanpun", + "karena", + "karenanya", + "ke", + "kecil", + "kemudian", + "kenapa", + "kepada", + "kepadanya", + "ketika", + "khususnya", + "kini", + "kinilah", + "kiranya", + "kita", + "kitalah", + "kok", + "lagi", + "lagian", + "lah", + "lain", + "lainnya", + "lalu", + "lama", + "lamanya", + "lebih", + "macam", + "maka", + "makanya", + "makin", + "malah", + "malahan", + "mampu", + "mampukah", + "mana", + "manakala", + "manalagi", + "masih", + "masihkah", + "masing", + "mau", + "maupun", + "melainkan", + "melalui", + "memang", + "mengapa", + "mereka", + "merekalah", + "merupakan", + "meski", + "meskipun", + "mungkin", + "mungkinkah", + "nah", + "namun", + "nanti", + "nantinya", + "nyaris", + "oleh", + "olehnya", + "pada", + "padahal", + "padanya", + "paling", + "pantas", + "para", + "pasti", + "pastilah", + "per", + "percuma", + "pernah", + "pula", + "pun", + "rupanya", + "saat", + "saatnya", + "saja", + "sajalah", + "saling", + "sama", + "sambil", + "sampai", + "sana", + "sangat", + "sangatlah", + "saya", + "sayalah", + "se", + "sebab", + "sebabnya", + "sebagai", + "sebagaimana", + "sebagainya", + "sebaliknya", + "sebanyak", + "sebegini", + "sebegitu", + "sebelum", + "sebelumnya", + "sebenarnya", + "seberapa", + "sebetulnya", + "sebisanya", + "sebuah", + "sedang", + "sedangkan", + "sedemikian", + "sedikit", + "sedikitnya", + "segala", + "segalanya", + "segera", + "seharusnya", + "sehingga", + "sejak", + "sejenak", + "sekali", + "sekalian", + "sekaligus", + "sekalipun", + "sekarang", + "seketika", + "sekiranya", + "sekitar", + "sekitarnya", + "sela", + "selagi", + "selain", + "selaku", + "selalu", + "selama", + "selamanya", + "seluruh", + "seluruhnya", + "semacam", + "semakin", + "semasih", + "semaunya", + "sementara", + "sempat", + "semua", + "semuanya", + "semula", + "sendiri", + "sendirinya", + "seolah", + "seorang", + "sepanjang", + "sepantasnya", + "sepantasnyalah", + "seperti", + "sepertinya", + "sering", + "seringnya", + "serta", + "serupa", + "sesaat", + "sesama", + "sesegera", + "sesekali", + "seseorang", + "sesuatu", + "sesuatunya", + "sesudah", + "sesudahnya", + "setelah", + "seterusnya", + "setiap", + "setidaknya", + "sewaktu", + "siapa", + "siapakah", + "siapapun", + "sini", + "sinilah", + "suatu", + "sudah", + "sudahkah", + "sudahlah", + "supaya", + "tadi", + "tadinya", + "tak", + "tanpa", + "tapi", + "telah", + "tentang", + "tentu", + "tentulah", + "tentunya", + "terdiri", + "terhadap", + "terhadapnya", + "terlalu", + "terlebih", + "tersebut", + "tersebutlah", + "tertentu", + "tetapi", + "tiap", + "tidak", + "tidakkah", + "tidaklah", + "toh", + "waduh", + "wah", + "wahai", + "walau", + "walaupun", + "wong", + "yaitu", + "yakni", + "yang" + ], + "ja": [ + "あっ", + "あり", + "ある", + "い", + "いう", + "いる", + "う", + "うち", + "お", + "および", + "おり", + "か", + "かつて", + "から", + "が", + "き", + "ここ", + "こと", + "この", + "これ", + "これら", + "さ", + "さらに", + "し", + "しかし", + "する", + "ず", + "せ", + "せる", + "そして", + "その", + "その他", + "その後", + "それ", + "それぞれ", + "た", + "ただし", + "たち", + "ため", + "たり", + "だ", + "だっ", + "つ", + "て", + "で", + "でき", + "できる", + "です", + "では", + "でも", + "と", + "という", + "といった", + "とき", + "ところ", + "として", + "とともに", + "とも", + "と共に", + "な", + "ない", + "なお", + "なかっ", + "ながら", + "なく", + "なっ", + "など", + "なら", + "なり", + "なる", + "に", + "において", + "における", + "について", + "にて", + "によって", + "により", + "による", + "に対して", + "に対する", + "に関する", + "の", + "ので", + "のみ", + "は", + "ば", + "へ", + "ほか", + "ほとんど", + "ほど", + "ます", + "また", + "または", + "まで", + "も", + "もの", + "ものの", + "や", + "よう", + "より", + "ら", + "られ", + "られる", + "れ", + "れる", + "を", + "ん", + "及び", + "特に" + ], + "lv": [ + "aiz", + "ap", + "apakš", + "apakšpus", + "ar", + "arī", + "augšpus", + "bet", + "bez", + "bija", + "biji", + "biju", + "bijām", + "bijāt", + "būs", + "būsi", + "būsiet", + "būsim", + "būt", + "būšu", + "caur", + "diemžēl", + "diezin", + "droši", + "dēļ", + "esam", + "esat", + "esi", + "esmu", + "gan", + "gar", + "iekam", + "iekams", + "iekām", + "iekāms", + "iekš", + "iekšpus", + "ik", + "ir", + "it", + "itin", + "iz", + "ja", + "jau", + "jeb", + "jebšu", + "jel", + "jo", + "jā", + "ka", + "kamēr", + "kaut", + "kolīdz", + "kopš", + "kā", + "kļuva", + "kļuvi", + "kļuvu", + "kļuvām", + "kļuvāt", + "kļūs", + "kļūsi", + "kļūsiet", + "kļūsim", + "kļūst", + "kļūstam", + "kļūstat", + "kļūsti", + "kļūstu", + "kļūt", + "kļūšu", + "labad", + "lai", + "lejpus", + "līdz", + "līdzko", + "ne", + "nebūt", + "nedz", + "nekā", + "nevis", + "nezin", + "no", + "nu", + "nē", + "otrpus", + "pa", + "par", + "pat", + "pie", + "pirms", + "pret", + "priekš", + "pār", + "pēc", + "starp", + "tad", + "tak", + "tapi", + "taps", + "tapsi", + "tapsiet", + "tapsim", + "tapt", + "tapāt", + "tapšu", + "taču", + "te", + "tiec", + "tiek", + "tiekam", + "tiekat", + "tieku", + "tik", + "tika", + "tikai", + "tiki", + "tikko", + "tiklab", + "tiklīdz", + "tiks", + "tiksiet", + "tiksim", + "tikt", + "tiku", + "tikvien", + "tikām", + "tikāt", + "tikšu", + "tomēr", + "topat", + "turpretim", + "turpretī", + "tā", + "tādēļ", + "tālab", + "tāpēc", + "un", + "uz", + "vai", + "var", + "varat", + "varēja", + "varēji", + "varēju", + "varējām", + "varējāt", + "varēs", + "varēsi", + "varēsiet", + "varēsim", + "varēt", + "varēšu", + "vien", + "virs", + "virspus", + "vis", + "viņpus", + "zem", + "ārpus", + "šaipus" + ], + "th": [ + "กล่าว", + "กว่า", + "กัน", + "กับ", + "การ", + "ก็", + "ก่อน", + "ขณะ", + "ขอ", + "ของ", + "ขึ้น", + "คง", + "ครั้ง", + "ความ", + "คือ", + "จะ", + "จัด", + "จาก", + "จึง", + "ช่วง", + "ซึ่ง", + "ดัง", + "ด้วย", + "ด้าน", + "ตั้ง", + "ตั้งแต่", + "ตาม", + "ต่อ", + "ต่าง", + "ต่างๆ", + "ต้อง", + "ถึง", + "ถูก", + "ถ้า", + "ทั้ง", + "ทั้งนี้", + "ทาง", + "ที่", + "ที่สุด", + "ทุก", + "ทํา", + "ทําให้", + "นอกจาก", + "นัก", + "นั้น", + "นี้", + "น่า", + "นํา", + "บาง", + "ผล", + "ผ่าน", + "พบ", + "พร้อม", + "มา", + "มาก", + "มี", + "ยัง", + "รวม", + "ระหว่าง", + "รับ", + "ราย", + "ร่วม", + "ลง", + "วัน", + "ว่า", + "สุด", + "ส่ง", + "ส่วน", + "สําหรับ", + "หนึ่ง", + "หรือ", + "หลัง", + "หลังจาก", + "หลาย", + "หาก", + "อยาก", + "อยู่", + "อย่าง", + "ออก", + "อะไร", + "อาจ", + "อีก", + "เขา", + "เข้า", + "เคย", + "เฉพาะ", + "เช่น", + "เดียว", + "เดียวกัน", + "เนื่องจาก", + "เปิด", + "เปิดเผย", + "เป็น", + "เป็นการ", + "เพราะ", + "เพื่อ", + "เมื่อ", + "เรา", + "เริ่ม", + "เลย", + "เห็น", + "เอง", + "แต่", + "แบบ", + "แรก", + "และ", + "แล้ว", + "แห่ง", + "โดย", + "ใน", + "ให้", + "ได้", + "ไป", + "ไม่", + "ไว้" + ], + "ar": [ + "،", + "أ", + "ا", + "اثر", + "اجل", + "احد", + "اخرى", + "اذا", + "اربعة", + "اطار", + "اعادة", + "اعلنت", + "اف", + "اكثر", + "اكد", + "الا", + "الاخيرة", + "الان", + "الاول", + "الاولى", + "التى", + "التي", + "الثاني", + "الثانية", + "الذاتي", + "الذى", + "الذي", + "الذين", + "السابق", + "الف", + "الماضي", + "المقبل", + "الوقت", + "الى", + "اليوم", + "اما", + "امام", + "امس", + "ان", + "انه", + "انها", + "او", + "اول", + "اي", + "ايار", + "ايام", + "ايضا", + "ب", + "باسم", + "بان", + "برس", + "بسبب", + "بشكل", + "بعد", + "بعض", + "بن", + "به", + "بها", + "بين", + "تم", + "ثلاثة", + "ثم", + "جميع", + "حاليا", + "حتى", + "حوالى", + "حول", + "حيث", + "حين", + "خلال", + "دون", + "ذلك", + "زيارة", + "سنة", + "سنوات", + "شخصا", + "صباح", + "صفر", + "ضد", + "ضمن", + "عام", + "عاما", + "عدة", + "عدد", + "عدم", + "عشر", + "عشرة", + "على", + "عليه", + "عليها", + "عن", + "عند", + "عندما", + "غدا", + "غير", + "ـ", + "ف", + "فان", + "فى", + "في", + "فيه", + "فيها", + "قال", + "قبل", + "قد", + "قوة", + "كان", + "كانت", + "كل", + "كلم", + "كما", + "لا", + "لدى", + "لقاء", + "لكن", + "للامم", + "لم", + "لن", + "له", + "لها", + "لوكالة", + "ما", + "مايو", + "مساء", + "مع", + "مقابل", + "مليار", + "مليون", + "من", + "منذ", + "منها", + "نحو", + "نفسه", + "نهاية", + "هذا", + "هذه", + "هناك", + "هو", + "هي", + "و", + "و6", + "واحد", + "واضاف", + "واضافت", + "واكد", + "وان", + "واوضح", + "وفي", + "وقال", + "وقالت", + "وقد", + "وقف", + "وكان", + "وكانت", + "ولا", + "ولم", + "ومن", + "وهو", + "وهي", + "يكون", + "يمكن", + "يوم" + ], + "bg": [ + "а", + "автентичен", + "аз", + "ако", + "ала", + "бе", + "без", + "беше", + "би", + "бивш", + "бивша", + "бившо", + "бил", + "била", + "били", + "било", + "благодаря", + "близо", + "бъдат", + "бъде", + "бяха", + "в", + "вас", + "ваш", + "ваша", + "вероятно", + "вече", + "взема", + "ви", + "вие", + "винаги", + "внимава", + "време", + "все", + "всеки", + "всички", + "всичко", + "всяка", + "във", + "въпреки", + "върху", + "г", + "ги", + "главен", + "главна", + "главно", + "глас", + "го", + "година", + "години", + "годишен", + "д", + "да", + "дали", + "два", + "двама", + "двамата", + "две", + "двете", + "ден", + "днес", + "дни", + "до", + "добра", + "добре", + "добро", + "добър", + "докато", + "докога", + "дори", + "досега", + "доста", + "друг", + "друга", + "други", + "е", + "евтин", + "едва", + "един", + "една", + "еднаква", + "еднакви", + "еднакъв", + "едно", + "екип", + "ето", + "живот", + "за", + "забавям", + "зад", + "заедно", + "заради", + "засега", + "заспал", + "затова", + "защо", + "защото", + "и", + "из", + "или", + "им", + "има", + "имат", + "иска", + "й", + "каза", + "как", + "каква", + "какво", + "както", + "какъв", + "като", + "кога", + "когато", + "което", + "които", + "кой", + "който", + "колко", + "която", + "къде", + "където", + "към", + "лесен", + "лесно", + "ли", + "лош", + "м", + "май", + "малко", + "ме", + "между", + "мек", + "мен", + "месец", + "ми", + "много", + "мнозина", + "мога", + "могат", + "може", + "мокър", + "моля", + "момента", + "му", + "н", + "на", + "над", + "назад", + "най", + "направи", + "напред", + "например", + "нас", + "не", + "него", + "нещо", + "нея", + "ни", + "ние", + "никой", + "нито", + "нищо", + "но", + "нов", + "нова", + "нови", + "новина", + "някои", + "някой", + "няколко", + "няма", + "обаче", + "около", + "освен", + "особено", + "от", + "отгоре", + "отново", + "още", + "пак", + "по", + "повече", + "повечето", + "под", + "поне", + "поради", + "после", + "почти", + "прави", + "пред", + "преди", + "през", + "при", + "пък", + "първата", + "първи", + "първо", + "пъти", + "равен", + "равна", + "с", + "са", + "сам", + "само", + "се", + "сега", + "си", + "син", + "скоро", + "след", + "следващ", + "сме", + "смях", + "според", + "сред", + "срещу", + "сте", + "съм", + "със", + "също", + "т", + "т.н.", + "тази", + "така", + "такива", + "такъв", + "там", + "твой", + "те", + "тези", + "ти", + "то", + "това", + "тогава", + "този", + "той", + "толкова", + "точно", + "три", + "трябва", + "тук", + "тъй", + "тя", + "тях", + "у", + "утре", + "харесва", + "хиляди", + "ч", + "часа", + "че", + "често", + "чрез", + "ще", + "щом", + "юмрук", + "я", + "як" + ], + "bn": [ + "অনেক", + "অন্য", + "অবশ্য", + "আগে", + "আছে", + "আজ", + "আবার", + "আমরা", + "আমাদের", + "আর", + "ই", + "উত্তর", + "উপর", + "উপরে", + "এ", + "এই", + "এক্", + "এখন", + "এত", + "এব", + "এমন", + "এমনি", + "এর", + "এস", + "এসে", + "ও", + "ওই", + "কমনে", + "করা", + "করে", + "কাছে", + "কাজ", + "কাজে", + "কারণ", + "কি", + "কিছু", + "কে", + "কেউ", + "কেখা", + "কেন", + "কোটি", + "কোনো", + "কয়েক", + "খুব", + "গিয়ে", + "গেল", + "চার", + "চালু", + "চেষ্টা", + "ছিল", + "জানা", + "জ্নজন", + "টি", + "তখন", + "তবে", + "তা", + "তাই", + "তো", + "থাকা", + "থেকে", + "দিন", + "দু", + "দুই", + "দেওয়া", + "ধামার", + "নতুন", + "না", + "নাগাদ", + "নিয়ে", + "নেওয়া", + "নয়", + "পর", + "পরে", + "পাচ", + "পি", + "পেয়্র্", + "প্রতি", + "প্রথম", + "প্রযন্ত", + "প্রাথমিক", + "প্রায়", + "বক্তব্য", + "বন", + "বলা", + "বলে", + "বলেন", + "বহু", + "বা", + "বি", + "বিভিন্ন", + "বেশ", + "বেশি", + "মতো", + "মধ্যে", + "মনে", + "যখন", + "যদি", + "যা", + "যাওয়া", + "যে", + "র", + "রকম", + "লক্ষ", + "শুধু", + "শুরু", + "সঙ্গে", + "সব", + "সহ", + "সাধারণ", + "সামনে", + "সি", + "সে", + "সেই", + "হতে", + "হাজার", + "হয়" + ], + "fa": [ + "آباد", + "آره", + "آری", + "آمد", + "آمده", + "آن", + "آنان", + "آنجا", + "آنكه", + "آنها", + "آنچه", + "آورد", + "آورده", + "آيد", + "آیا", + "اثرِ", + "از", + "است", + "استفاده", + "اش", + "اكنون", + "البته", + "البتّه", + "ام", + "اما", + "امروز", + "امسال", + "اند", + "انکه", + "او", + "اول", + "اي", + "ايشان", + "ايم", + "اين", + "اينكه", + "اگر", + "با", + "بار", + "بارة", + "باره", + "باشد", + "باشند", + "باشيم", + "بالا", + "بالایِ", + "بايد", + "بدون", + "بر", + "برابرِ", + "براساس", + "براي", + "برایِ", + "برخوردار", + "برخي", + "برداري", + "بروز", + "بسيار", + "بسياري", + "بعد", + "بعری", + "بعضي", + "بلكه", + "بله", + "بلکه", + "بلی", + "بنابراين", + "بندي", + "به", + "بهترين", + "بود", + "بودن", + "بودند", + "بوده", + "بي", + "بيست", + "بيش", + "بيشتر", + "بيشتري", + "بين", + "بی", + "بیرونِ", + "تا", + "تازه", + "تاكنون", + "تان", + "تحت", + "تر", + "ترين", + "تمام", + "تمامي", + "تنها", + "تواند", + "توانند", + "توسط", + "تولِ", + "تویِ", + "جا", + "جاي", + "جايي", + "جدا", + "جديد", + "جريان", + "جز", + "جلوگيري", + "جلویِ", + "حتي", + "حدودِ", + "حق", + "خارجِ", + "خدمات", + "خواست", + "خواهد", + "خواهند", + "خواهيم", + "خود", + "خويش", + "خیاه", + "داد", + "دادن", + "دادند", + "داده", + "دارد", + "دارند", + "داريم", + "داشت", + "داشتن", + "داشتند", + "داشته", + "دانست", + "دانند", + "در", + "درباره", + "دنبالِ", + "ده", + "دهد", + "دهند", + "دو", + "دوم", + "ديده", + "ديروز", + "ديگر", + "ديگران", + "ديگري", + "دیگر", + "را", + "راه", + "رفت", + "رفته", + "روب", + "روزهاي", + "روي", + "رویِ", + "ريزي", + "زياد", + "زير", + "زيرا", + "زیرِ", + "سابق", + "ساخته", + "سازي", + "سراسر", + "سریِ", + "سعي", + "سمتِ", + "سوم", + "سوي", + "سویِ", + "سپس", + "شان", + "شايد", + "شد", + "شدن", + "شدند", + "شده", + "شش", + "شما", + "شناسي", + "شود", + "شوند", + "صورت", + "ضدِّ", + "ضمن", + "طبقِ", + "طريق", + "طور", + "طي", + "عقبِ", + "علّتِ", + "عنوانِ", + "غير", + "فقط", + "فكر", + "فوق", + "قابل", + "قبل", + "قصدِ", + "كرد", + "كردم", + "كردن", + "كردند", + "كرده", + "كسي", + "كل", + "كمتر", + "كند", + "كنم", + "كنند", + "كنيد", + "كنيم", + "كه", + "لطفاً", + "ما", + "مان", + "مانند", + "مانندِ", + "مثل", + "مثلِ", + "مختلف", + "مدّتی", + "مردم", + "مرسی", + "مقابل", + "من", + "مورد", + "مي", + "ميليارد", + "ميليون", + "مگر", + "ناشي", + "نام", + "نبايد", + "نبود", + "نخست", + "نخستين", + "نخواهد", + "ندارد", + "ندارند", + "نداشته", + "نزديك", + "نزدِ", + "نزدیکِ", + "نشان", + "نشده", + "نظير", + "نكرده", + "نمايد", + "نمي", + "نه", + "نوعي", + "نيز", + "نيست", + "ها", + "هاي", + "هايي", + "هر", + "هرگز", + "هزار", + "هست", + "هستند", + "هستيم", + "هفت", + "هم", + "همان", + "همه", + "همواره", + "همين", + "همچنان", + "همچنين", + "همچون", + "همین", + "هنوز", + "هنگام", + "هنگامِ", + "هنگامی", + "هيچ", + "هیچ", + "و", + "وسطِ", + "وقتي", + "وقتیکه", + "ولی", + "وي", + "وگو", + "يا", + "يابد", + "يك", + "يكديگر", + "يكي", + "ّه", + "پاعینِ", + "پس", + "پنج", + "پيش", + "پیش", + "پیشِ", + "چرا", + "چطور", + "چند", + "چندین", + "چنين", + "چه", + "چهار", + "چون", + "چيزي", + "چگونه", + "چیز", + "چیزی", + "چیست", + "کجا", + "کجاست", + "کدام", + "کس", + "کسی", + "کنارِ", + "که", + "کَی", + "کی", + "گذاري", + "گذاشته", + "گردد", + "گرفت", + "گرفته", + "گروهي", + "گفت", + "گفته", + "گويد", + "گويند", + "گيرد", + "گيري", + "یا", + "یک" + ], + "hi": [ + "अंदर", + "अत", + "अदि", + "अप", + "अपना", + "अपनि", + "अपनी", + "अपने", + "अभि", + "अभी", + "आदि", + "आप", + "इंहिं", + "इंहें", + "इंहों", + "इतयादि", + "इत्यादि", + "इन", + "इनका", + "इन्हीं", + "इन्हें", + "इन्हों", + "इस", + "इसका", + "इसकि", + "इसकी", + "इसके", + "इसमें", + "इसि", + "इसी", + "इसे", + "उंहिं", + "उंहें", + "उंहों", + "उन", + "उनका", + "उनकि", + "उनकी", + "उनके", + "उनको", + "उन्हीं", + "उन्हें", + "उन्हों", + "उस", + "उसके", + "उसि", + "उसी", + "उसे", + "एक", + "एवं", + "एस", + "एसे", + "ऐसे", + "ओर", + "और", + "कइ", + "कई", + "कर", + "करता", + "करते", + "करना", + "करने", + "करें", + "कहते", + "कहा", + "का", + "काफि", + "काफ़ी", + "कि", + "किंहें", + "किंहों", + "कितना", + "किन्हें", + "किन्हों", + "किया", + "किर", + "किस", + "किसि", + "किसी", + "किसे", + "की", + "कुछ", + "कुल", + "के", + "को", + "कोइ", + "कोई", + "कोन", + "कोनसा", + "कौन", + "कौनसा", + "गया", + "घर", + "जब", + "जहाँ", + "जहां", + "जा", + "जिंहें", + "जिंहों", + "जितना", + "जिधर", + "जिन", + "जिन्हें", + "जिन्हों", + "जिस", + "जिसे", + "जीधर", + "जेसा", + "जेसे", + "जैसा", + "जैसे", + "जो", + "तक", + "तब", + "तरह", + "तिंहें", + "तिंहों", + "तिन", + "तिन्हें", + "तिन्हों", + "तिस", + "तिसे", + "तो", + "था", + "थि", + "थी", + "थे", + "दबारा", + "दवारा", + "दिया", + "दुसरा", + "दुसरे", + "दूसरे", + "दो", + "द्वारा", + "न", + "नहिं", + "नहीं", + "ना", + "निचे", + "निहायत", + "नीचे", + "ने", + "पर", + "पहले", + "पुरा", + "पूरा", + "पे", + "फिर", + "बनि", + "बनी", + "बहि", + "बही", + "बहुत", + "बाद", + "बाला", + "बिलकुल", + "भि", + "भितर", + "भी", + "भीतर", + "मगर", + "मानो", + "मे", + "में", + "यदि", + "यह", + "यहाँ", + "यहां", + "यहि", + "यही", + "या", + "यिह", + "ये", + "रखें", + "रवासा", + "रहा", + "रहे", + "ऱ्वासा", + "लिए", + "लिये", + "लेकिन", + "व", + "वगेरह", + "वरग", + "वर्ग", + "वह", + "वहाँ", + "वहां", + "वहिं", + "वहीं", + "वाले", + "वुह", + "वे", + "वग़ैरह", + "संग", + "सकता", + "सकते", + "सबसे", + "सभि", + "सभी", + "साथ", + "साबुत", + "साभ", + "सारा", + "से", + "सो", + "हि", + "ही", + "हुअ", + "हुआ", + "हुइ", + "हुई", + "हुए", + "हे", + "हें", + "है", + "हैं", + "हो", + "होता", + "होति", + "होती", + "होते", + "होना", + "होने" + ], + "mr": [ + "अधिक", + "अनेक", + "अशी", + "असलयाचे", + "असलेल्या", + "असा", + "असून", + "असे", + "आज", + "आणि", + "आता", + "आपल्या", + "आला", + "आली", + "आले", + "आहे", + "आहेत", + "एक", + "एका", + "कमी", + "करणयात", + "करून", + "का", + "काम", + "काय", + "काही", + "किवा", + "की", + "केला", + "केली", + "केले", + "कोटी", + "गेल्या", + "घेऊन", + "जात", + "झाला", + "झाली", + "झाले", + "झालेल्या", + "टा", + "डॉ", + "तर", + "तरी", + "तसेच", + "ता", + "ती", + "तीन", + "ते", + "तो", + "त्या", + "त्याचा", + "त्याची", + "त्याच्या", + "त्याना", + "त्यानी", + "त्यामुळे", + "त्री", + "दिली", + "दोन", + "न", + "नाही", + "निर्ण्य", + "पण", + "पम", + "परयतन", + "पाटील", + "म", + "मात्र", + "माहिती", + "मी", + "मुबी", + "म्हणजे", + "म्हणाले", + "म्हणून", + "या", + "याचा", + "याची", + "याच्या", + "याना", + "यानी", + "येणार", + "येत", + "येथील", + "येथे", + "लाख", + "व", + "व्यकत", + "सर्व", + "सागित्ले", + "सुरू", + "हजार", + "हा", + "ही", + "हे", + "होणार", + "होत", + "होता", + "होती", + "होते" + ], + "ro": [ + "acea", + "aceasta", + "această", + "aceea", + "acei", + "aceia", + "acel", + "acela", + "acele", + "acelea", + "acest", + "acesta", + "aceste", + "acestea", + "aceşti", + "aceştia", + "acolo", + "acord", + "acum", + "ai", + "aia", + "aibă", + "aici", + "al", + "ale", + "alea", + "altceva", + "altcineva", + "am", + "ar", + "are", + "asemenea", + "asta", + "astea", + "astăzi", + "asupra", + "au", + "avea", + "avem", + "aveţi", + "azi", + "aş", + "aşadar", + "aţi", + "bine", + "bucur", + "bună", + "ca", + "care", + "caut", + "ce", + "cel", + "ceva", + "chiar", + "cinci", + "cine", + "cineva", + "contra", + "cu", + "cum", + "cumva", + "curând", + "curînd", + "când", + "cât", + "câte", + "câtva", + "câţi", + "cînd", + "cît", + "cîte", + "cîtva", + "cîţi", + "că", + "căci", + "cărei", + "căror", + "cărui", + "către", + "da", + "dacă", + "dar", + "datorită", + "dată", + "dau", + "de", + "deci", + "deja", + "deoarece", + "departe", + "deşi", + "din", + "dinaintea", + "dintr-", + "dintre", + "doi", + "doilea", + "două", + "drept", + "după", + "dă", + "ea", + "ei", + "el", + "ele", + "eram", + "este", + "eu", + "eşti", + "face", + "fata", + "fi", + "fie", + "fiecare", + "fii", + "fim", + "fiu", + "fiţi", + "frumos", + "fără", + "graţie", + "halbă", + "iar", + "ieri", + "la", + "le", + "li", + "lor", + "lui", + "lângă", + "lîngă", + "mai", + "mea", + "mei", + "mele", + "mereu", + "meu", + "mi", + "mie", + "mine", + "mult", + "multă", + "mulţi", + "mulţumesc", + "mâine", + "mîine", + "mă", + "ne", + "nevoie", + "nici", + "nicăieri", + "nimeni", + "nimeri", + "nimic", + "nişte", + "noastre", + "noastră", + "noi", + "noroc", + "nostru", + "nouă", + "noştri", + "nu", + "opt", + "ori", + "oricare", + "orice", + "oricine", + "oricum", + "oricând", + "oricât", + "oricînd", + "oricît", + "oriunde", + "patra", + "patru", + "patrulea", + "pe", + "pentru", + "peste", + "pic", + "poate", + "pot", + "prea", + "prima", + "primul", + "prin", + "printr-", + "puţin", + "puţina", + "puţină", + "până", + "pînă", + "rog", + "sa", + "sale", + "sau", + "se", + "spate", + "spre", + "sub", + "sunt", + "suntem", + "sunteţi", + "sută", + "sînt", + "sîntem", + "sînteţi", + "să", + "săi", + "său", + "ta", + "tale", + "te", + "timp", + "tine", + "toate", + "toată", + "tot", + "totuşi", + "toţi", + "trei", + "treia", + "treilea", + "tu", + "tăi", + "tău", + "un", + "una", + "unde", + "undeva", + "unei", + "uneia", + "unele", + "uneori", + "unii", + "unor", + "unora", + "unu", + "unui", + "unuia", + "unul", + "vi", + "voastre", + "voastră", + "voi", + "vostru", + "vouă", + "voştri", + "vreme", + "vreo", + "vreun", + "vă", + "zece", + "zero", + "zi", + "zice", + "îi", + "îl", + "îmi", + "împotriva", + "în", + "înainte", + "înaintea", + "încotro", + "încât", + "încît", + "între", + "întrucât", + "întrucît", + "îţi", + "ăla", + "ălea", + "ăsta", + "ăstea", + "ăştia", + "şapte", + "şase", + "şi", + "ştiu", + "ţi", + "ţie" + ], + "en": [ + "a", + "a's", + "able", + "about", + "above", + "according", + "accordingly", + "across", + "actually", + "after", + "afterwards", + "again", + "against", + "ain't", + "all", + "allow", + "allows", + "almost", + "alone", + "along", + "already", + "also", + "although", + "always", + "am", + "among", + "amongst", + "an", + "and", + "another", + "any", + "anybody", + "anyhow", + "anyone", + "anything", + "anyway", + "anyways", + "anywhere", + "apart", + "appear", + "appreciate", + "appropriate", + "are", + "aren't", + "around", + "as", + "aside", + "ask", + "asking", + "associated", + "at", + "available", + "away", + "awfully", + "b", + "be", + "became", + "because", + "become", + "becomes", + "becoming", + "been", + "before", + "beforehand", + "behind", + "being", + "believe", + "below", + "beside", + "besides", + "best", + "better", + "between", + "beyond", + "both", + "brief", + "but", + "by", + "c", + "c'mon", + "c's", + "came", + "can", + "can't", + "cannot", + "cant", + "cause", + "causes", + "certain", + "certainly", + "changes", + "clearly", + "co", + "com", + "come", + "comes", + "concerning", + "consequently", + "consider", + "considering", + "contain", + "containing", + "contains", + "corresponding", + "could", + "couldn't", + "course", + "currently", + "d", + "definitely", + "described", + "despite", + "did", + "didn't", + "different", + "do", + "does", + "doesn't", + "doing", + "don't", + "done", + "down", + "downwards", + "during", + "e", + "each", + "edu", + "eg", + "eight", + "either", + "else", + "elsewhere", + "enough", + "entirely", + "especially", + "et", + "etc", + "even", + "ever", + "every", + "everybody", + "everyone", + "everything", + "everywhere", + "ex", + "exactly", + "example", + "except", + "f", + "far", + "few", + "fifth", + "first", + "five", + "followed", + "following", + "follows", + "for", + "former", + "formerly", + "forth", + "four", + "from", + "further", + "furthermore", + "g", + "get", + "gets", + "getting", + "given", + "gives", + "go", + "goes", + "going", + "gone", + "got", + "gotten", + "greetings", + "h", + "had", + "hadn't", + "happens", + "hardly", + "has", + "hasn't", + "have", + "haven't", + "having", + "he", + "he's", + "hello", + "help", + "hence", + "her", + "here", + "here's", + "hereafter", + "hereby", + "herein", + "hereupon", + "hers", + "herself", + "hi", + "him", + "himself", + "his", + "hither", + "hopefully", + "how", + "howbeit", + "however", + "i", + "i'd", + "i'll", + "i'm", + "i've", + "ie", + "if", + "ignored", + "immediate", + "in", + "inasmuch", + "inc", + "indeed", + "indicate", + "indicated", + "indicates", + "inner", + "insofar", + "instead", + "into", + "inward", + "is", + "isn't", + "it", + "it'd", + "it'll", + "it's", + "its", + "itself", + "j", + "just", + "k", + "keep", + "keeps", + "kept", + "know", + "known", + "knows", + "l", + "last", + "lately", + "later", + "latter", + "latterly", + "least", + "less", + "lest", + "let", + "let's", + "like", + "liked", + "likely", + "little", + "look", + "looking", + "looks", + "ltd", + "m", + "mainly", + "many", + "may", + "maybe", + "me", + "mean", + "meanwhile", + "merely", + "might", + "more", + "moreover", + "most", + "mostly", + "much", + "must", + "my", + "myself", + "n", + "name", + "namely", + "nd", + "near", + "nearly", + "necessary", + "need", + "needs", + "neither", + "never", + "nevertheless", + "new", + "next", + "nine", + "no", + "nobody", + "non", + "none", + "noone", + "nor", + "normally", + "not", + "nothing", + "novel", + "now", + "nowhere", + "o", + "obviously", + "of", + "off", + "often", + "oh", + "ok", + "okay", + "old", + "on", + "once", + "one", + "ones", + "only", + "onto", + "or", + "other", + "others", + "otherwise", + "ought", + "our", + "ours", + "ourselves", + "out", + "outside", + "over", + "overall", + "own", + "p", + "particular", + "particularly", + "per", + "perhaps", + "placed", + "please", + "plus", + "possible", + "presumably", + "probably", + "provides", + "q", + "que", + "quite", + "qv", + "r", + "rather", + "rd", + "re", + "really", + "reasonably", + "regarding", + "regardless", + "regards", + "relatively", + "respectively", + "right", + "s", + "said", + "same", + "saw", + "say", + "saying", + "says", + "second", + "secondly", + "see", + "seeing", + "seem", + "seemed", + "seeming", + "seems", + "seen", + "self", + "selves", + "sensible", + "sent", + "serious", + "seriously", + "seven", + "several", + "shall", + "she", + "should", + "shouldn't", + "since", + "six", + "so", + "some", + "somebody", + "somehow", + "someone", + "something", + "sometime", + "sometimes", + "somewhat", + "somewhere", + "soon", + "sorry", + "specified", + "specify", + "specifying", + "still", + "sub", + "such", + "sup", + "sure", + "t", + "t's", + "take", + "taken", + "tell", + "tends", + "th", + "than", + "thank", + "thanks", + "thanx", + "that", + "that's", + "thats", + "the", + "their", + "theirs", + "them", + "themselves", + "then", + "thence", + "there", + "there's", + "thereafter", + "thereby", + "therefore", + "therein", + "theres", + "thereupon", + "these", + "they", + "they'd", + "they'll", + "they're", + "they've", + "think", + "third", + "this", + "thorough", + "thoroughly", + "those", + "though", + "three", + "through", + "throughout", + "thru", + "thus", + "to", + "together", + "too", + "took", + "toward", + "towards", + "tried", + "tries", + "truly", + "try", + "trying", + "twice", + "two", + "u", + "un", + "under", + "unfortunately", + "unless", + "unlikely", + "until", + "unto", + "up", + "upon", + "us", + "use", + "used", + "useful", + "uses", + "using", + "usually", + "uucp", + "v", + "value", + "various", + "very", + "via", + "viz", + "vs", + "w", + "want", + "wants", + "was", + "wasn't", + "way", + "we", + "we'd", + "we'll", + "we're", + "we've", + "welcome", + "well", + "went", + "were", + "weren't", + "what", + "what's", + "whatever", + "when", + "whence", + "whenever", + "where", + "where's", + "whereafter", + "whereas", + "whereby", + "wherein", + "whereupon", + "wherever", + "whether", + "which", + "while", + "whither", + "who", + "who's", + "whoever", + "whole", + "whom", + "whose", + "why", + "will", + "willing", + "wish", + "with", + "within", + "without", + "won't", + "wonder", + "would", + "wouldn't", + "x", + "y", + "yes", + "yet", + "you", + "you'd", + "you'll", + "you're", + "you've", + "your", + "yours", + "yourself", + "yourselves", + "z", + "zero" + ] +} diff --git a/nautilus_nlp/_utils/__init__.py b/nlpretext/_utils/__init__.py similarity index 100% rename from nautilus_nlp/_utils/__init__.py rename to nlpretext/_utils/__init__.py diff --git a/nautilus_nlp/_utils/file_loader.py b/nlpretext/_utils/file_loader.py similarity index 100% rename from nautilus_nlp/_utils/file_loader.py rename to nlpretext/_utils/file_loader.py diff --git a/nautilus_nlp/_utils/phone_number.py b/nlpretext/_utils/phone_number.py similarity index 98% rename from nautilus_nlp/_utils/phone_number.py rename to nlpretext/_utils/phone_number.py index 1c364d5..b574a7f 100644 --- a/nautilus_nlp/_utils/phone_number.py +++ b/nlpretext/_utils/phone_number.py @@ -17,7 +17,7 @@ # Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. from typing import Optional import phonenumbers as _phonenumbers -from nautilus_nlp._config.config import SUPPORTED_COUNTRY, FORMAT_NUMBERS +from nlpretext._config.config import SUPPORTED_COUNTRY, FORMAT_NUMBERS def find_phone_numbers(string: str, region_code: Optional[str] = None) -> str: diff --git a/nautilus_nlp/_utils/stopwords.py b/nlpretext/_utils/stopwords.py similarity index 88% rename from nautilus_nlp/_utils/stopwords.py rename to nlpretext/_utils/stopwords.py index bda452c..0897313 100644 --- a/nautilus_nlp/_utils/stopwords.py +++ b/nlpretext/_utils/stopwords.py @@ -20,18 +20,11 @@ from __future__ import (absolute_import, division, print_function, unicode_literals) -import json from stop_words import LANGUAGE_MAPPING as _LANGUAGE_MAPPING from stop_words import get_stop_words as _get_stop_words -from nautilus_nlp._config.config import STOPWORDS_JSON_FILEPATH -from nautilus_nlp._utils.file_loader import documents_loader +from nlpretext._config.stopwords import STOPWORDS -def _load_stopwords_from_json(filepath=STOPWORDS_JSON_FILEPATH): - stopwords = documents_loader(filepath) - stopwords = json.loads(stopwords) - return stopwords - def get_stopwords(lang: str = "en") -> list: """ @@ -60,7 +53,7 @@ def get_stopwords(lang: str = "en") -> list: """ if isinstance(lang, str) and len(lang) == 2: lang = lang.lower() - custom_stopwords = _load_stopwords_from_json(STOPWORDS_JSON_FILEPATH) + custom_stopwords = STOPWORDS stopwords = [] supported_lang_lib = list(_LANGUAGE_MAPPING.keys()) diff --git a/tests/test_document_loader.py b/tests/test_document_loader.py index 452b40e..b6cab3a 100644 --- a/tests/test_document_loader.py +++ b/tests/test_document_loader.py @@ -20,7 +20,7 @@ import os import numpy as np -from nautilus_nlp._utils.file_loader import (detect_encoding, documents_loader) +from nlpretext._utils.file_loader import (detect_encoding, documents_loader) TESTDOC_LATIN1 = "J'aime les frites bien grasse étalon châpeau!" TESTDOC_UTF8 = "Un deuxième exemple de texte en utf-8 cette fois!" diff --git a/tests/test_phone_number.py b/tests/test_phone_number.py index d95d496..7a471b5 100644 --- a/tests/test_phone_number.py +++ b/tests/test_phone_number.py @@ -15,7 +15,7 @@ # You should have received a copy of the GNU Lesser General Public License # along with this program; if not, write to the Free Software Foundation, # Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. -import nautilus_nlp._utils.phone_number as phone +import nlpretext._utils.phone_number as phone def test_extract_phone_number(): input_str = '(541) 754-3010 is a US. Phone' diff --git a/tests/test_preprocessor.py b/tests/test_preprocessor.py index 49edc28..5212015 100644 --- a/tests/test_preprocessor.py +++ b/tests/test_preprocessor.py @@ -40,8 +40,8 @@ ) from nlpretext.preprocessor import Preprocessor -import nautilus_nlp._utils.phone_number as phone -from nautilus_nlp._utils.stopwords import get_stopwords +import nlpretext._utils.phone_number as phone +from nlpretext._utils.stopwords import get_stopwords @pytest.mark.parametrize("text, expected_result", From 7d6b51d8eef76a1c3dbfb205f22813ac8fd2626a Mon Sep 17 00:00:00 2001 From: Rafaelle AYGALENQ <rafaelle.aygalenq@artefact.com> Date: Fri, 12 Feb 2021 15:58:34 +0100 Subject: [PATCH 463/496] update readme with slogan --- README.md | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 7af4286..bd7baa4 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,8 @@ NLPretext ============================== -<font size="4"> **No more pretext for dirty text** :pencil: </font> + +### **No more pretext for dirty text** :pencil: + :tired_face: *Working on an NLP project and tired of always looking for the same silly preprocessing functions on the web?* From 8519f356103093150b9a4105ed5111fd4791107e Mon Sep 17 00:00:00 2001 From: Rafaelle AYGALENQ <rafaelle.aygalenq@artefact.com> Date: Fri, 12 Feb 2021 16:01:02 +0100 Subject: [PATCH 464/496] update readme layout --- README.md | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index bd7baa4..aaf9be5 100644 --- a/README.md +++ b/README.md @@ -4,14 +4,16 @@ NLPretext ### **No more pretext for dirty text** :pencil: -:tired_face: *Working on an NLP project and tired of always looking for the same silly preprocessing functions on the web?* +> *Working on an NLP project and tired of always looking for the same silly preprocessing functions on the web?* :tired_face: + +> *Need to efficiently extract email adresses from a document? Hashtags from tweets? Remove accents from a French post?* :disappointed_relieved: -:disappointed_relieved: *Need to efficiently extract email adresses from a document? Hashtags from tweets? Remove accents from a French post?* **NLPretext got you covered!** :rocket: NLPretext packages in a **unique** library all the text **preprocessing** functions you need to **ease** your NLP project. + :mag: Quickly explore below our preprocessing pipelines and individual functions referential. * [Default preprocessing pipeline](#default_pipeline) From ec530386b0c244ffc706d13f521d83e200f7128e Mon Sep 17 00:00:00 2001 From: Rafaelle AYGALENQ <rafaelle.aygalenq@artefact.com> Date: Fri, 12 Feb 2021 16:02:13 +0100 Subject: [PATCH 465/496] update link readme --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index aaf9be5..db29773 100644 --- a/README.md +++ b/README.md @@ -88,7 +88,7 @@ print(text) # "dinner life recommend" ``` -Take a look at all the functions that are available [here](https://github.com/artefactory/nautilus-nlp/tree/master/nlpretext) in the ```preprocess.py``` scripts in the different folders: basic, social, token. +Take a look at all the functions that are available [here](https://github.com/artefactory/NLPretext/tree/feature/readme/nlpretext) in the ```preprocess.py``` scripts in the different folders: basic, social, token. # Individual Functions From dceebb60072914bf043a72cb88ce724562225902 Mon Sep 17 00:00:00 2001 From: Rafaelle AYGALENQ <rafaelle.aygalenq@artefact.com> Date: Fri, 12 Feb 2021 16:50:08 +0100 Subject: [PATCH 466/496] update structure --- .github/workflows/ci_actions.yml | 2 +- Makefile | 144 ------------------------------- README.md | 14 +-- pylintrc | 2 +- references/nautilus_nlp_logo.png | Bin 24573 -> 0 bytes 5 files changed, 10 insertions(+), 152 deletions(-) delete mode 100644 Makefile delete mode 100644 references/nautilus_nlp_logo.png diff --git a/.github/workflows/ci_actions.yml b/.github/workflows/ci_actions.yml index 71c2aef..d5031d8 100644 --- a/.github/workflows/ci_actions.yml +++ b/.github/workflows/ci_actions.yml @@ -42,7 +42,7 @@ jobs: - name: Run pylint run: | - pylint nlpretext tests --max-module-lines 15000 + pylint nlpretext tests - name: Run pytest run: | diff --git a/Makefile b/Makefile deleted file mode 100644 index 8fa6457..0000000 --- a/Makefile +++ /dev/null @@ -1,144 +0,0 @@ -.PHONY: clean data lint requirements sync_data_to_s3 sync_data_from_s3 - -################################################################################# -# GLOBALS # -################################################################################# - -PROJECT_DIR := $(shell dirname $(realpath $(lastword $(MAKEFILE_LIST)))) -BUCKET = [OPTIONAL] your-bucket-for-syncing-data (do not include 's3://') -PROFILE = default -PROJECT_NAME = nlpretext -PYTHON_INTERPRETER = python3 - -ifeq (,$(shell which conda)) -HAS_CONDA=False -else -HAS_CONDA=True -endif - -################################################################################# -# COMMANDS # -################################################################################# - -## Install Python Dependencies -requirements: test_environment - $(PYTHON_INTERPRETER) -m pip install -U pip setuptools wheel - $(PYTHON_INTERPRETER) -m pip install -r requirements.txt - -## Make Dataset -data: requirements - $(PYTHON_INTERPRETER) src/data/make_dataset.py - -## Delete all compiled Python files -clean: - find . -type f -name "*.py[co]" -delete - find . -type d -name "__pycache__" -delete - -## Lint using flake8 -lint: - black nlpretext - -## Upload Data to S3 -sync_data_to_s3: -ifeq (default,$(PROFILE)) - aws s3 sync data/ s3://$(BUCKET)/data/ -else - aws s3 sync data/ s3://$(BUCKET)/data/ --profile $(PROFILE) -endif - -## Download Data from S3 -sync_data_from_s3: -ifeq (default,$(PROFILE)) - aws s3 sync s3://$(BUCKET)/data/ data/ -else - aws s3 sync s3://$(BUCKET)/data/ data/ --profile $(PROFILE) -endif - -## Set up python interpreter environment -create_environment: -ifeq (True,$(HAS_CONDA)) - @echo ">>> Detected conda, creating conda environment." -ifeq (3,$(findstring 3,$(PYTHON_INTERPRETER))) - conda create --name $(PROJECT_NAME) python=3 -else - conda create --name $(PROJECT_NAME) python=2.7 -endif - @echo ">>> New conda env created. Activate with:\nsource activate $(PROJECT_NAME)" -else - $(PYTHON_INTERPRETER) -m pip install -q virtualenv virtualenvwrapper - @echo ">>> Installing virtualenvwrapper if not already intalled.\nMake sure the following lines are in shell startup file\n\ - export WORKON_HOME=$$HOME/.virtualenvs\nexport PROJECT_HOME=$$HOME/Devel\nsource /usr/local/bin/virtualenvwrapper.sh\n" - @bash -c "source `which virtualenvwrapper.sh`;mkvirtualenv $(PROJECT_NAME) --python=$(PYTHON_INTERPRETER)" - @echo ">>> New virtualenv created. Activate with:\nworkon $(PROJECT_NAME)" -endif - -## Test python environment is setup correctly -test_environment: - $(PYTHON_INTERPRETER) test_environment.py - -################################################################################# -# PROJECT RULES # -################################################################################# - - - -################################################################################# -# Self Documenting Commands # -################################################################################# - -.DEFAULT_GOAL := help - -# Inspired by <http://marmelab.com/blog/2016/02/29/auto-documented-makefile.html> -# sed script explained: -# /^##/: -# * save line in hold space -# * purge line -# * Loop: -# * append newline + line to hold space -# * go to next line -# * if line starts with doc comment, strip comment character off and loop -# * remove target prerequisites -# * append hold space (+ newline) to line -# * replace newline plus comments by `---` -# * print line -# Separate expressions are necessary because labels cannot be delimited by -# semicolon; see <http://stackoverflow.com/a/11799865/1968> -.PHONY: help -help: - @echo "$$(tput bold)Available rules:$$(tput sgr0)" - @echo - @sed -n -e "/^## / { \ - h; \ - s/.*//; \ - :doc" \ - -e "H; \ - n; \ - s/^## //; \ - t doc" \ - -e "s/:.*//; \ - G; \ - s/\\n## /---/; \ - s/\\n/ /g; \ - p; \ - }" ${MAKEFILE_LIST} \ - | LC_ALL='C' sort --ignore-case \ - | awk -F '---' \ - -v ncol=$$(tput cols) \ - -v indent=19 \ - -v col_on="$$(tput setaf 6)" \ - -v col_off="$$(tput sgr0)" \ - '{ \ - printf "%s%*s%s ", col_on, -indent, $$1, col_off; \ - n = split($$2, words, " "); \ - line_length = ncol - indent; \ - for (i = 1; i <= n; i++) { \ - line_length -= length(words[i]) + 1; \ - if (line_length <= 0) { \ - line_length = ncol - indent - length(words[i]) - 1; \ - printf "\n%*s ", -indent, " "; \ - } \ - printf "%s ", words[i]; \ - } \ - printf "\n"; \ - }' \ - | more $(shell test $(shell uname) = Darwin && echo '--no-init --raw-control-chars') diff --git a/README.md b/README.md index db29773..32339b2 100644 --- a/README.md +++ b/README.md @@ -148,11 +148,11 @@ You can now open the file index.html located in the build folder. ------------ ├── LICENSE - ├── Makefile <- Makefile with commands like `make data` or `make train` + ├── VERSION + ├── CONTRIBUTING.md <- Contribution guidelines ├── README.md <- The top-level README for developers using this project. - ├── config <- Where the configuration and constants live + ├── .github/workflows <- Where the CI lives ├── datasets/external <- Bash scripts to download external datasets - ├── docker <- Where to build a docker image using this lib ├── docs <- Sphinx HTML documentation │ ├── _build │ │ └── html @@ -162,9 +162,11 @@ You can now open the file index.html located in the build folder. │ ├── augmentation <- Text augmentation script │ ├── basic <- Basic text preprocessing │ ├── social <- Social text preprocessing - │ └── token <- Token preprocessing - ├── utils <- Where preprocessing utils scripts lives + │ ├── token <- Token text preprocessing + │ ├── _config <- Where the configuration and constants live + │ └── _utils <- Where preprocessing utils scripts lives ├── tests <- Where the tests lives ├── setup.py <- makes project pip installable (pip install -e .) so the package can be imported ├── requirements.txt <- The requirements file for reproducing the analysis environment, e.g. - generated with `pip freeze > requirements.txt` + generated with `pip freeze > requirements.txt` + └── pylintrc <- The linting configuration file diff --git a/pylintrc b/pylintrc index 54d4c85..590c124 100644 --- a/pylintrc +++ b/pylintrc @@ -169,7 +169,7 @@ single-line-if-stmt=no no-space-check=trailing-comma,dict-separator # Maximum number of lines in a module -max-module-lines=1000 +max-module-lines=15000 # String used as indentation unit. This is usually " " (4 spaces) or "\t" (1 # tab). diff --git a/references/nautilus_nlp_logo.png b/references/nautilus_nlp_logo.png deleted file mode 100644 index f91effef13885c1f27e57c6783fe156b8ea6cfaf..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 24573 zcmd42bzEHAvM!3dy96h}t#Nk`gy8OtL*woqBuJ1DoZ#;6?(Po3-CZtOYwdOReQ)n` z&U^R#aho6AW6oKlsz%8-YK}SP7X^7qWCQ{PFfcG=X(=&9FffSbx3)hV%-eUi3Sr&b z54^3Eh65NFBIfUZaIhaKcwk@%Ip)ghj_PtBd5l2Tj0VOaLm;E8we1@<7#N?RtF3{N zCD4)75NK*{!%u$N)J9HfZp=@v#xBP!XDbRcGnaC=2P(PCD;v368gUzw3ks0(x$?X* zum(CBkh)r1**NgH@{|9;m*=hh`!o|d=^rGHmi*+xzXg)2%PEkGg6x5$?2H@?Ml5X1 zq@3K0EF8>i>@4)80A?0WCT4afW)22s79M6U9smpJUmx-}Y4*k@Jc?oxf600~;wLwA zbhPDRVsdeDVRT_-1lgN1v2b&9Gcg00004$J3I+!^8%G0I1{(*8e{c{3IvClT+d7(q zY)F4|G%y4?Ir5XgY5M07tZn~hYvb^jncfV><Z58c#KOq@dq{r}8XNshXX|8d^@ng{ zBPO5~&>Cpt=<r6%@;B|9mE`39CjXagt*!s2c5oDTe$(i$vHeSG2W2-~Ad@1{0pw(F z1Qd6ElSuIo#T*<Jf&XEe|3>#W^1nOVnt>ca4rZW#V}!pi|7{9e9#MOsfg{LX83eNW zhnE%p!G%;*l$2V|z{uR@H&>e9D*n|0C}!XY<R^b~IXA<bzgf7ISvYvu-n<T=V+Qar zGyh2{_ZCFP295^*J28Mw8Nkc~;NW3r|KEr~#^xq&|0Suh5swMT-rC^J#OBrpra&fJ z8`D3e$;t6Z+c-EH*cbt&#rVnJRAn?bH|F8s-~uoMn2i}&0PO4xY@BbAWoX21%)nt{ zXaE2ha<Xs&4gb+!3}oc=+x@@$|CtHKAfq=Pf7^|Roy~~T$k>pZft3}&#bChBX3W3^ z<Thq7G+;M0GGOIo=QLpZ2e(i5=5NVpVD-;je`{s@#t~>_!e+!}!o~nJVdr3A127xD zX$9b5U}XUq8JTb!0hxgY<fQ*0R}^FgvX=uHzuBDipU+E+iYnNHOw6s`E;uMkijYc+ zi*m4Vb8s*K7+HSj%pbAKBW3RJ=3}?NvQP<V_gBlxob-=y<uNe&ol*ScM!%y0XiWas zY4d+!(Epz5f3kHk1HLi+Pom^cG6#@}ql<w(P}ua%`2S@TGW|Q{9SofRbJbZ4xY*eM zTwDw$KqCMHn+Yo?g8?%$H-n*}$=e5L0x)Lf`p3}!jp{6a2l)RV)&DZ9k(q&wDew)R znaKa`V2nUE&OrNr@`bH|y}=tQ1MMC7$xZA*)}#iuwpQjw2EQH0<ZNU77ufwBGo+3n z(*MYie=ElrXm9>cX8UI;f2%<HKPd0Nbdn((5NOEG`j%5%9NY|SKma!b7w22Xy?t?- zaIygm42(?vZ*kIpIhg+*`uwY8`4=epKNoRKzo*VWVSwrXi4cDti~SiE62AlOk12`g zUtz(2H=*9<D4sVc{Tp2Wzro<2@<IQnaQZt1{>~1bf1tAP+kEjG93B2b6%hl|zwt%j z-%J9mhHPAHtZWQM>;}dR#)fPh4BQ4lZUz7+Cp(7;kcFL_o0;zq6I+@8SG)|l3{5xy zEQSnR%-jG5P7^jZ21E8YNCGgk8!{WRu^KZQu>QY!{lk7-Cd_YttcDEC03*(~TzQ*{ z4Ov;Z7}yLr0EWgaEXGCv?tkk2hfaSEkm*0S#2=LZRBOEr<BwBs1>EoE-<9Lr!QZtf z(B=)%?B6QOdCl4wFfip8X)$4C*OcQ_m*#gW_pfWFwJQm$r0~*GQc`d%SF0YlXlPK| zmf|sma9Mkw#IY36d;If#)!RkNFl5XoJ*42kW5M>xo)fGcynXnpTn>jvPexapZg-mX z%G{1yc&kiDug3UxX=E%TJM@|HkYEBj#`P-Pn;_pBe;kYQv-r>b<4W28R2zP7QONAd zT=?qe$^1TZS2C}<<1~M@grYt#tKnITn#oxerwb*z{7H7)3-36LBRB#cm^Sp&WRf$C z1O%jCepLiAr61QgN-?Y|M3G-)JI}hPK7KilIuw1`qXeNlw1*O*-tr6bOZ6I}JqH_t zwQY~=RKwAIOZg(ljWY-dMpUr<#B94>8nON{nkw^WorlpLr#7zV=jtEOpmH-SUZ~pl zfXXX!{RQ;|9g7pRbuiLkxN)Qazr0`0X5JG_7`FGrocG&JN}(?7b%nMT7GIntNgog1 zk#4zI@~MM0!_b54f~SG6qGss)!;0XM?_F!eEh(iPxEMNXv2cn{LJg=W)F+_!_<(%a z^<CSEYxp>kugU|PWB?A`$V!HzLl@7aF@Y*Qgo+~$?5EnHdu>FdGS{ZCq@$1c2^9Xf z-0R+AP-Tev{C{~WnIHMR>+x4r#>H*!)|#oM6VVR2v-J=y`-@`H@|w=D9tUxdbQKd= zL3yKj;;y;5v|L`eB|4%lL8v+z#}T{LHI0y|Z?Y1+7T1(+dr-UK`dWKSD4cxb>-1mV zUl$jJ*R9TaAD7FX;2$^yFy}H)Ms0`+;o6z#s`&P~*tU+i8eMQv{fl1iqH#k^JK6oA zc-dR<`rjdxG?98Y?}ydp@nA87-zBh)z}UdP1e`yz{}FKd`QLjnnuTQOViHbjHRs_Z zKk4=oS>R9!xHH!>?yo9{P1XuQ*^!Y@JQ}jw5{~;z*$mx3YUD}szjt@wZckzq2|O+H zMRm_4`O6YsvB8+ltqScQxC|~ZUUEzw1}R`omkHT4;}MVPa>B63VICmI(}e?VG+Wh@ z+EB&1%L1Iu3vD7`TftM{wIP>7EA9w>CxSk6Tn-397p<iMTz+*2@?@j!-R<7S{1>y~ zFiP15O5a*TvYZZb<v6eTEOx_vIkW|Nx@XLLMRUn<6Z)n{@=|1OBB@NrvjWyZW~6$E zJBTyZbyWTp@ION$xK(ToyBVLOv*KH#ebhBtAHQ?IVbjlR8+u-Z?8d~38U47l<k_%M zV^>V+7C1ZWaiKu8BF>yn8f90gY=I;>^q51n&-7N|)&n{8txlNT-+T}KK7p@+>lV(1 z{i!_O1K=&_tiuf|7(>^$Su&zMo6t#9?Lb`4$w0YR>Csi&YeL?4Aa<wiXCW63hmGO6 z`>rhW<=5`5x#Ip{Ytqycn@^cawL#bmT){TsB_x@e^BtXQ`6<AI51y#vmAsy)G!X`W zLWX{SW+qfwn3LTtEGC!96QEa&*TK5FAwmd%6G8T^RCbvV#?zuRq|V!7GXxjh1A>?I z-a(v4()?lJX`i!fb)M}<?lfon=ywpi{!hm$Y#E{??0n(7-J9=CqI8>cO-!~p<%M~w zR)68s9$Uh?^~qMpZSL7@Tth_C7Og8qJ5sj0rhs&<^GhQhSF5e_H|(}3+df;m6t1TF z1sVD#x0X`d`$l^RW+E;~*NVhP!@qc;VFiP(8Ec^{7=KU@$InvwTD1%{FNc}ESKy#F z#ZP7RI|>`dvd^_0#iIQV7{aMlDN#|2IfeMlt`u!y4Lh?K{TE95WMtAeV=KsGHyWSM zaA;~>T%u`ihkdksU;dfynj=3-C<o2%IGbuHUw0*&&07Bxq=YX&n4_%39<BAa^VqYw znUhxZjImR=b;fmv(Y!yHItgbIT9r@fQ|Fc;tWH`e*faW$_}V1>;MEd0QkT=DYmqM+ zH_AAHob}fQcjs5P8xIHjgjqFR2Nwwr<A)6y96$htG%+YZaO4$df;PWlbx`@yL)Rr} z*dBjF>)RfYZyc2XbbVDq@PQaofrZ+^wy_cF&Ckfq01OBo+p^m^rH_)H6H3OnN_Y!` zsOvguIe5@S1!&o#v4+_nGZQe>``uLPb)l{Dt1A#bk2WGQg`t(hbHe6NB2l+Vl^Kxr z)m0kNxwIzuuhHzj%7I_e`FA61;j9fTXS-jxUk5C?S!@XK;9<$j-)0fk2Q4ePXMOa< z`u=5^m%QK0nT;6-|5-ciD8zZ)dL28XDgoO<nLVng%a^HX*aN1%HkdJfQ@tBbIZVsf z!_v%yz!tyq6wwV?`u*Zw1hltU`E4JSFSgWqX%vK29qmKbdX2B}``tjZ7h5AbEo2*? zfDgG7@_EhfhTsNrT>fFhGqfzo>d=b~Zfd{UiW0$OWuA6Ez#&h`AVbIpj|*#7lmPR3 z`>V*+rW<Q@ga!HFDY9;<*Ecc<kbPs?OQbAnzNVbA#vj{&c`rjgb79w~Y%Y3>MiZXw z$CVDxVN$QxwZFXIS?C{m^b6Dc*i~PPqM6LQ|1qS!P+7?iyK>AP`YSXNl=oLC`Ppz* z-*nPVhFb{yh-KwA-?oq&=ytdMp^rVh8Kcx&Pi@Hc+5T(Dj^3=1PhM!^qsNE^SK0$q zP)|hju<B}OUT_0w4wlHrup@PT4$+C_%bB&R>r7HUhdt=+r_s3O+IEDHtI+b0v(pAG zqR|oj=^}wAc*Y(>6G6%+o-p;Wt`P`&x+Oa(CM|8qE-kObeV`_>Q8b^^NnQx5hGAZK zH<OW)Y$o9RjFH!6zTDYYXn|h<5Wq|H3<X+%#5OtUxrM-O;sMcKdl#yiSnrCzqi8}* zLmnw;w2Gq|;5#GesSit@YOR*SeYs6{gV&%*9Hn~GH(K5N^%oOO1zr_IJ;XG&eq<fP zA<{T6t+kI#aV!40)~#Izntd!$p!RfRJD5Ibi%cPG$S==t!Re$ANuMy$tqEe}Ds6p* zXnqWs7Nkx~i^+0qJA38QaQKsjui6$vRaWwTZL7?IYO7Z_Y=!PXcKhR*`mJuL%1G2( zr^Wy+!gwND?N(%NwPmPLRrYHM`almbEgmH@B?~J-Gn4hzIes|(yWs$q{szskl4uXT zXnz;#*rZ(~{U%!PwZM06G@<iu*lxN{F`h<&ya{r7!O6HEP0}Zd@QJ_fMnTpq$*cR| zvhY9!B|5dK4*B5PznU|$l$9xq$w81%^pyCU)U!TAG~C!oAZd-w80eH<)vgnPJ&oU6 zN$gWe2Z5v(26bR-D=ls|V<cbqkB>!EmDD8IA*v6`YYy(C>LM7`n@83O1%K3Ew050r zj58z}i!Qh$x8Pl2gJ}k#_@8~%%o$VTsfnMYaTmI?@w>Y?`DCQ+nbh7Dvrrax)8P~v zU9f9gkSJ7WqOMWSu&A`5iMns+T4#%PA*8p{ByQ@<TT&FJGUJLGsg|8q)P6`?x}{zN zJDvyu(dJF(gjx}kX~Ef{bx2g6q9rERwc*r$nD&`V1dUCXss9kpS$X4If4(HU$Xp~* z>b^t&+06>jClgzB>BEV)ixy)NPsqlvP2p7ZJhFyuxz9N-K_a@P^03~K5hmCDW?CS` zRSx5NIjN9Zg4NpnVDO5#P7@?Ua4e8^xGhhK!18MwtV>J1r!j4XdAmm7BnQBevH+Xy zc6`_&Lc5ja{9Nj~GYtJ<{5+D>)nOtEJj%~0Ty<iq20>4MVc=ZDC8QC4jYbN8^V6&) zbdAC1vv-Tc1*9(KWsZ58)#L<n%oWz(^ynmMG-EQQnIuRHZoTzB4<RJDuuDtC9Xz=r zyHRf~BVT#zj0m&90)}?VnY>XvtG*te2I5J3`>SiVR4|yC?^>1}cUE<oPP~(WwUega zdeJ-4HQP%T^9zs0EoK4_KWOP(#cAd+v@?e;=hd9^vW&``2Oj;v;kbZeMnA7{@U-Q= zs+kcbmZmiH&<L2-(S9nQCDIIf&6|=-4YdA%Jg+Vy$&TQTZOag7Q_FA&$WdBT=J|3I z+qhB|1=;%bE|>$30PbhWhjHn+uivVkaY?~ln5NrE5aJ+omUI^7#TJ~W?Mvr3A~lQO zd2E2b-<i>3H`8!A74^`ovqscgXNDabJ!YR^L-Eg*#M=Y1ls{(N@-2lyAPkMp*2DWM zphZqcxw}K*d7i<p)A3iAo|2Y|rT2vddbRyjnG92Xt<>v}X&-GL@~bh+4|eXBo9bPA zrf~@PzGt)$5EB#l)Azl~^(a*fgDX3^8IW4O$hcdEx5wMuIgO~{b5v%>1k~{tWmEH^ zxC1m?KgQ6K4YkYK?R5r0L$M-IdX}zG8KhT?>c-=nLkk@@70};mpcXaoPvD?wOX!&l z@Hiy~%{<%MHh4Sh`9$LW?`Uz_6Phy?D|gjn+bCiH?&j^LZAwqmUhPs35MYQCMNHhC z+^jhh&bC>SxAhJm9B-a|Y2ANrJX|}(r=sbr6;5zOQILd$yo-eYJ6TxY-AnFn;J&3U zBF)f;g_&U$kle3W{7e5vBTfpNsJ;nT;oM}*F^JcYcaUuYb_8D-zJE3Tg|}UCMCB_P zjThbseA>6}cx18P5cfq>bsw1=1$TTe(l{W~CyR&fNm-{t{=E}EO$+cN;MIfr6Y&dL zKuE6CVx)>G1<5m4eqK%3GoHwra^sNO9yFt;7J6F}q`yr)$GeV<tgrDkOOq{xXABP# zah7OEuwTy`tPl;iubEu29UX(DOtlF(1WQHy$%<H%Ojf%`MFBV&)e^g>eRaO+<TuZX zG+~42<n#TGqOTjQQa4}h`M{pA2b#-+C%q3#q--bCq=LVRo_o)GV#B+?)GR^J#^qWn z5!Nvg4ZUv~`=&OePuw6$!GahCHTffxfa7!O^)<)t<!w7|3=$1`A}|j^jbc|*XV1DL z83xDM^plzF*=60$PCbk4RjZMjm<$rUDWeo8qEx*H3sI-VQg?Du?RrMY*Uf#*Q&VkO zSSA(R@+r|hO4~208w=xCoH>}HLrq-D?9KIpo6Ik_g^e1VYy^nP-FDV{JG|{)?T0N> zWeDS8K%E>2Coc!ARZwS;C&GZ*!V-7DBLZS-0S*ex%|LF$NKy114zi05{sTCLFWnG* z71Wn6_jOS>i>dpN>*-QfeeABN!mm)@gS2W%N)#%%&RsDtRgsJ}4}%9QjXWG^B+hO= z*pSaK$;KSXj*;OLNHo#A;E>0f&egZZLS?)l3>~Nnm}B?KqXsGyQj$-^mHa3l7t8P% zyzLp$mf*O^7~`VHiX79lCUm?0h5pWQO_+Xu9%&*tOy5CRFkj^kY{}wBnF<_8SW7)~ zgj0=_#+m>rQWd=#;ak-TLntt_l*z1Sak54=Un+JeuT4YNC{MNiiLsyh3#dBy#u3zZ zI4i*<`JNlZ)?kCQvRkNC$RCi2)B4rLy}>P%tSf4sp=TxZa6X)Ps2W1>%tDOa>AW|# zq~7jDticktPdHStEEB|v$QAhHxf-OcTNXb@?`mDtup^xZb5X}{dbvpRx^+3FCsQof zGfUYydowqj#A6iV<K?_rF!qkkD}ZPLJlr&8M!^4jTOQd9*%G(UYeRm3ra_JM)_uH@ ztHZTE+^wqSjLZbc-zi(QqOLnbNB&AA2%yi$k9)TsP;46wh)=3ZvAOA5v(=rM=4mej z@1$wv+i0=CUZAAZFTtSC{*fkVWoA=xe>plPYwSb<ta9vSwkl<#z}I*ehV(8qH2v6v zz0{P(mfUUPLi~^ix{Pl^Q<!UD-K>(BxbB)B&v1`>2Yl`9dmHDb1tu3b-?>Q5r$xi4 zOuA0ikm7~c-j#H|r}`2>zMcEq5Y(p~#K$qW79*jHbO+}ok83SfUDUe02qr~dW)fG} z0^LiL&6KuMV_a)Qy4fIXX<^YOHmodMf1Zh2!=b0})v!Arfb#4iwe?R&h@lga1tMzR zFRJ2w2ak8*55=XZ!faXCvPCZDca$&wQV86^lkj7*hCyt+D7vPKvG_<{0V~mp9o$<h zr>|nR4HkmrOxVUIlpImtAT`x;j=sG5>WUgUU@DSTVIkNZBc=q~nuCq}5VK-V<qIAW zH5h8;Ohb4@UO^~HrGTf>obs9{P@y>W<!P_YDjJfl45R4jQ@lrWUzZ9ifQn5ecW{u~ z6>E0^O`-Amf3P@_EJ3D@lou~QE(|n=I(;{wyK1{c>PPf4er89G;B4lAtj&t|fT2|7 zgVSS`?dt>G-0Jf!5uvhw(1STvIFIwrNBPViWM<Yp`ExeM-t=dF|Hq&VWU~xJXOcQv z@5SjkgPDY~@rl`1viAa0MVpaZ<a0)b8$@tkibZCPPds!dQ)+uNmqOf~vkY8iW*%R2 zGqqXl_bhe>iF6IG%D-Cpvzw3$INCg+HR`y_*kzrvo148o=#6x~Hm`#TFkmHP($Cl5 zI^_2sJBX3+4`j8>UKijaDp*}0{P+_Cmr<1Bk`0ih5N3T)(JA4&m>QYN<5iR(N5UG~ zA?8Pk6iNx}WAeoNuHt&>9g7=E6S4*}!PogtpZ7D112rN6f-D+kflm)Unn7iZa61V8 z$9`S@R^|2=Hu)UeKlgkBr;9=KlVr~LmBD7yr8{Uu;Z1Jd$QK-*=|i5;LSR0RlqkGk zHHLt!dObFvqWo`>A{5+4Y>IkF&#?pduR9uUyzl^Akpx`3G2JzZ=Kxm0PX5bbaplB| zv2pd{&Swq1MBGAMlo{1Wp$7u&#j6q7wUmN7SKf;T%-%MB&pHORzWH{ozKHv1qYvKH z;UB;Vy_<dwEnjxbI-RK5psAN^R>t-jECAceRIEPbT!SZt4S}DFuV-cu6rm#yIJkeX zjrEMTo7oe<`58@c7<rvr#&#Gx@n-NJ=QrUVNa~1uCl$kRTRqz!1nHD<x{F(r`}oHJ zsO*zcUMyF#7im+_yFYRTpz#wnp3jQv-j=fTVQgK$xGhnPg$T|zpawt0ia@-V{ft`| zuZz?C;65bZ4M+8<)ot~LBnIzcZLOKtdV5N8b#$1_GMnS$Ns}d#D(uOmf=Y0}DmnB4 zQVBT|wRO{Wg+snn@#&Y)er)z@My`an+cU97P_cN{t#SA3U2T@$EsTsPK*W?*d8D9P z5TLx<+cLU)*lt-bDV-kisUtktkpxBau!)}&kJd!^M35kIP#0W_tjB@_x_LCdok;$% zA&3qzF(q797A@EALc`z+&M4s-IXBZl68xZ8NG-FnCzlvZLYMj-#e97BrI7s|6kM|E zq2!TV<E~T;8*Zr@-&NatJ>##NrE-^hQHqSMk=wWKZM2VED@2bZ$W*mF!zPsgpNhch z+^^Y-Ts-JAH>B8t<T`%eggB76-z(f++d6C3vFM5w`&q$jY|>KX7%3T@sNt15)#U~? zFV<J(m0lD;eiR<@4wxH&ep`Sl`!eWuu7?>lTga&Cm*}^ovjYl<D`LO0cAsX?NrWm} z)Y-qPdrwPJ9hRwb_pZ9}n{DT6RzrQa=Bp_7lTHj;t9H>@=Y{HW*y3_cY|!Dy9r8Pt zSewyIvolw^bzJ@#8YV|cy1Y+GecoDS*<wLLOu^(p{*~{McRav)T=dqQ(3r%ssQ^YU z_b0_#q8g;sy%Jx`fR6Qm2FEsuC9`-pUB|UYrW|h;WOJE3RoX8^Q57?1D(?ghzC7v- zk|ZThj@h~_)WZ!d8@(0F(e7Y5`Qh7jxKL#T8IBL`IlnTkR7(11+L6J;6g`h?TK3FP z=Q3SX)ZQ0i&fJLhkzGNSJSjh3wtQ`YZ{(1_Hnzzp^m7<!>cCmC6byIaVOpDZRHc^l z0FX!J3=;6*NTcpbWDfNfwbKy~`49-I$>Sced$aR?)eMtoQ{2G}=ul`!lp3(0ERvhx zw?$GUu8)n~auR+|am2nuaYNKrsoIge;kNFb=tkjJ23?6G3S!2gAy5sQq<~|eB*a-A zB5Md}t`3@@eIVVFt>mwCvzRf%prO;(DKwAB#uCmvou=h0E8ns20F3695j9YVPqZU< zP_&;8(O){~+m_H3x_{R;mkQEYz%JUs;vF?wH4KBCv8rT5$@%^z-NG6NE#yYvU~*iF zZSb%vb1hZ~szkK6|A))Yab!L3@qEDZV3&Nzcm<<3`!5w16{y?#XB3PHrLaq1aKDm) z@oz^6NDfJL?c0w(_6(r&odd7b;^e_`YO!_T53-uYs|}@!zjZLcS8#Ideq>;#oz)Nz zqCPGz`{I4&x(GLmtm($fYnhWm#;iB}{#FM}8>Tt^xvpQP4cV!<O$Q}4jM<`}Kz_~L zE=M&|+O>&w*^iG$#%t~Krbo2pq6>SLG6}NwVR8!xUg3^=m<%kg4s;XbD`ct22?M_@ z?eK!q4y%Qb+PE9VPBhisC0@{LY}d|6tDS;Wjv8lLVV{f#mu$eZ(a=}Ua5_;WI4@{N z?@24VkzV6KQBxA(dD?zc3mT4I(fm*?_f|!-YJ^M`iKCl5Tij<sxUzt0{kr#YrF#VF zejd?6ph_GrSXZGJ1~;TJ;fv{)w^izRVJeD`?`k4`)oMT-7HqL!NHv#W-Zpv);?jt0 zd`O4_gMlC%bjnzexs^Vjmnvu{C}0Zq9@6YKy&gSMYcSQl<*$Gr(6@y-BUx8nZ%EtI zS2u5Ebt=sdGhQEg#kxbvVINZSTLTXtte(&`Y0ccN2YXw-(1ks*p=X~6z|nPzoh<m- z4J#0#y1^@iE15zkH;8iHzd68n^`cCy`JJ_eGu|}et0YaE!5PQ6UJoM}lNpd7ecgaB zns_+sGZ`v`&(Le3l!>;euu2xOu=!>|xw;D-FBX;CaI&nf+Zg%FFBT9XrBMK<UA@6B zF8<p#4(GyMm*fup{Lm)f%gZ)<uiQw9;73#5Db8re;Eq0XYC?|{h0#=wkk4IB{ue6@ zTh{BSjF&K^6~x<kSlTW~?6w%I_}@<`?+*NgqTqG0p&xN$<2yQQvxd%igyVyEoXr-L z`PiK{K24dC#{KFY$L+Q$(4V)*Wcs2dO1i|E)?2E7$)GQNvzBGOic-+2ie00=U)XQn zgt_Um+w0{jS@?o`s{LKJwZlKyK+aAiK}-0307-<?+<3qfK|SRw-I#hLUhM88u2lIU zJ>}zw0o2xGAtp;Lensr3PnsXObX4M{+qC^WR##a4+|{xH)1$k7ZJVY1zxwYraNP$x zJ!&Tl>|zz)BLsSfdITY(cH^p5V!G~T%+Ll}vroBnGa7p-(fzQQ7}Ug7fc;^1)Ze<@ z9(1pVeSfJ7bu?kbZy&0xTXRIYtP>U+%H9{=<C;hyfKqYc8v9YB_&7j=Aflhms#hC1 zMSg;n?Uq~Z0^zfi(4k8V?v5$CnlEHQN6Tj_!=uV=4Cl22quYLeef8k0I;<|VIu53X zFf=o<Wq+9GN~+CRSBix=hn%|)ZUs^SIk4T47Qt6JGE^y8#v4n*O~`V0-G|M`G@LLq zP)M-s2zW5G?HjRS#mywXnrP#hNK<#3n`@(63UN39q^B@qjFVbx^e;|!Q;cJ3_Ju)b zqlvt*Zg}xsvS%n=k}T-h{zR~4=M{y$Suttak<++cCS8Kj<Y+E&X~&1fDPOa%-QlEP zofyl3IYbqjiw%dz$Mr_5>H}d~YlxdL?Z?5_D%nTnWUdmV_`bABUnM-t^uUNk4ON@( z5YLu)u3D1Q;52#F_NS#xojCGkE!xOsa)EZOh;u`c25|Y1!jX{t7)M0D=lYy}7O)-^ z`E|l0kO_X?SQS#L!Z|-!9eD$tvAguG7mO|M?NBd}w@d`t9#vM)SCK0WmE#&R7uP9r z*tAqs>9^6E>9SU~t5P*W!$Y(t??3%gv6v6Gts05s6&$O*O<i}0hY83Ob|t*SvV~X` z7TQ`P2~Ugs+}&eAMY(>ABj$QX7*u1`7`KxP{cQnsMH?LQ3!_kp1P8J$`>Le{dSHH? zS2nVP^N}2QeAq*DCA8hlqt!7Dmot^F!t+Jdpc+93^5OZS?Na2eib<HAF<!y*$7!<Q zIfKnPriznaDRrD<VrV*496I5dto*g4;p~|O>@!t&p3{|a@e<xIO{Yn{Bixhp)e?&L zD1!H2(1doTe)QjahCAOK$=q|*3vLF^;^s(alUvECT%EXLoXqLszOVv|p@^@)w=pq~ zR6!#j?-R?<PLAy%;znfZIZ$C_yF*|MYmyggCEhh{CGp}6csydAVe47WArv`b-nMWC z)u|yJeW8xF9FSE?>KnK+WHc02dBWj}ci+09&RF%oRhP16!c{kZpTC9{ih)dqZF+R_ zYF&h1;(xWE^3%_f>^WlcOBwYFyXZbttSDDxz5JFBZK}jRmJC(J(VgSa$wTqvfQRri z&h!}=&$hoVWH)D(<Y{ETf;NiV5{Wnj-$A%Fi(R{Wmcd#FL060~I%isDQ(-LA$;J0M ze|6vG&uE`C#%G}7AIWYBA{}!H6JbOlqa{wDsVMGUeS+&H+_uiH_#CLnHPCH(qLKrw zg&kmbn;X7eWw+w)eGt1!5Fztl8NX`|P?qKoAx3Lb(Cb)2*uNAbl^CaWMBMA?U}M0? z>!#v5fXV{`u%XDEKY=}B=lt5$a`ue261{Ei1R~}lkq5?q4T(G9BRnz{KGxF^^fa|l zFN&|p0736Tce+XKXoZmH1wOw$CX?jrz2<G{5AD$L4mn4G>UA5wmElwk>+=mFzKrS^ z+KKg_2xy!)DncDUZ^dk`)kxij5d}8;*MB&IdKU!Mz_0gWDh}RGnoy_FK3&;{lH=xZ z4R@l$mP?iL9@Mci=s_RrKQjKEFVdJ`0kS@iN=;j`qbQdy^#?phEw)CG%W4h6gc){6 zt)@MI1L_9usdjRom%hnCS#{4OFdL4xB+Cq2v?w=DwW3C|N7Wo#t3-vKW=*pHL^Ej8 zoSwHea&li%DD|L?u9cO&81nGCx6<Pp4$&8ssIh}Eh<rFF)mcl+{oHJSY9j<?^}e{T zY5I&&D$vRtgV{!mclVPQ;>v>dMj`T>gT9Grr!fjEemf4is~6C5x0~DDbEHf>MbV{G z%4Bm^V_i$;{YkY<F#Ai_fI$Lzp9a}!1AgnfCk8ienM7E@6*YKsNPMFZRtD3sx(k^j z#U6G|S&?mv@S+=5yGz_jW0v}!ztLyiym)q!>5+^ym_=bKG>6hy&#r24ShM(-tjQY` z8B>WktGKTrep)pMRKl?86Cd-0TJqvWti5x~4$;xw%Ab-eE}Tz8Il5~)iUL7$%H=~; zq&T>o#G=7&wA;?>R*7z8l;R7R?{{fQp^JX?=5*-q^>w4SE$2n2G^c~fi)oX}Y?Uz( zFuV)GdRaiML-_iY>C``7>+F&H+x_Ad^tHUw4XW6%PgZxcQ4Bphzph(V`UOX<pc-vR zJXILqkglV5RiJx3Wq~gk6sSNliU6{}h%{1lf|7qjRs$1Z-9x6&htiO<PTQzAi|~O; zT@4Jhleoo5<Fe!X5UIK`W`@n9x8H3eWBTOz%d967O%tm5-MU0EVt#5XbrO?M@KFk_ zh<LIs90vG9pU|AeLUiav4AP^Dejf$IGIE__=k^`R8B7l7i4-&=*ezMG(JE4d&yEBG zncDw+;kHgC#p264P_>SOk0M0hBG@}5H(a?N%2|>9vtjl}s<+RxQukOr)><#zYR31d z6gsaTJPmB~rW($bBLl;>412U;AFn7M=+T=R%v&16)tbvxw%FE{$3d#Ou-Ag^i;_k2 z44XTooM=PxNKns&3Igd1t)6b2R=pVdDB_~(;*Xma`bDH_g}ho^o|C*sEY3A+)yujk zNOaNN%QNFaVirv-@B{M-1kln;vF+akL?}}C-zKbpOp#d%aQ#Q}Bx`$ebU+s8Dbgzf zb5{*}NxRI{JDE8P9*tdx2A_?CtPXG~Ms?BSt8it3Yu8SV_EJM=WXQrv(iCEe<1EJq zmmotm+Qyz$m_xYnI=3f*-BU%idU*&_3+($E<s>EFNFdb>*mI43EjXOXSw54d3#)dd zIuB782awrTE}Cxo9PiPlA<nLg=c)VqN#Na7<2jegt~Jd13*d64$C)>U+legXlRIvc z-Lq@Wp&*RtuW_|cBXUyBU3vY4@U)95cxOGt2T>$e>xxnL4J^bvD~_yrDE?~4Igai= zcF=JAknX}~hj18P(3A)_0U|}YP8ss_E3euHM-me?POYjjP1S?O-^#(CRrD29Rv15Q zU;wq?y{=7=CvPwNt7>qLqrOGw|B6*^-lb1=I{&`rPC`YFipbeaU+wLRe0pHjx0#?z zjV!8#8DVzfTfHllHK#iJxNNQt`>WM+;!3G`bjm$l64@i|VasM+b}MC86MIDxRT2sA zIvXP-G|$dwV-41B-@nzz3W;4274Z})M`?uos90++NQ&<@ACZCA?)%o|h!ZfhbdJ^$ zj=AiiR@M!_(4hta6un~e)6oJZU$jt9l2~}UR(iZHeT|7iKnLYLB%zPA>fLtgE4Fq0 zq`sD8uBdmn4Iw$#%AIdkN+<TWZeFb}=H)?rUO&roN4ThbNjX0vtzC~TG0&SSO_;5h zpN&m%uOS`2w=Lyg9&&%Z+kAT<my-ATA<wvikL0pZ02^<i%Zs*;J&wK}+<0Z>Ni!1p zInI~Ka|YtUxP(nJXjRmLf|I%sd2%h@l2Yv`c!KuHqZ|=pkWWPpQ_<2LD-D$UKmn(h zSaHGQXO$O#Kn`w!*2S(fT}5p?X3Kr%{-WmAWP(UZ!#j<}Zqb+go#la|_3}%@xUTa# zza1(yWPOxA#Nde-gyOQTi={$2EiooyS<~LNeS;b8TFZ~`agU#bQ8C$spvp51&IaMw zd><Yt<S)J_wpXEvp$DJ|PK(CSvnB1Lb??@u4Ya+;tfB9b;@g}!B;CSy4_cm}Cv$@% z>hi-VKGG6Fh>ZE(;0{jF?On#pBM-IZVxuj<9mx1t=coEQw0mP*0mg?qys@}CbbJo9 z$eIO=wxJ)<#sdbi63#@?INMP7GQ+5xx?x7CKzD^^Bxzqm$6XxSiuWSPhzxBVsD8pa zJ-CTe<8s-(-JIX(qr}4WMy}WnNvHTz)T&F!I>0Wjl#q>mYS#Ce;oY<jZ+1FtMvtqx zb310XVsuSKBs+LiOjr6`)sL-@9iN)#LDu?=3K_Nau`0T`era}c0?-`vRwfJYLLrBd zY<OF>39nYLSbc@E-bgiEFsG9I_TW)&4I3#SMPJ<TQcw0)j7jTWm&U&B4=8bb0OlMY z#+j()TwlsKL`}N;l%FbSuF06AKP0GTE@;%j!1xlV2*<$J6}<O-9LK!!LS*W9#)8Vn z=JzZW#?V*eWGrPHaO{tIJwfaCnTvGWf?k>#ZsXsn*-*9MLP;F{-Zw6MI6<QZsqVe5 z{(_P$@%;3VwS}CCle&94W8Tur9K(zpl32Dwx%HxhiUpVqiNG;A;a=H2Xj0}VJ^_BI z^|huw$@H02Hi@)>(uH1z7`_D)m<#Y?VIu{HTh*4$_WD3=MR$e1w@_1eT$`pzb)&Sn z%IiUaVHsl`G#3Uvo7*kQ4*O`IgSl&wqiUJcTC8H$s5(ogsnKT%l!I^r-%}Fa4J~aJ zpzmKrngWxYZuZc(1!G!qfZUV(c?Nk=o44nB;s@2BlBZUUf$MwmF3g3e+5>Ku$BlE9 z$*NE3K>Q=PG#-Jpdjs1RoNVOa9QKs&7wqe4!E~_Np%*R3{$-hn8@NcbgT-NuxL45X zJs|8MK9wjy9SFW1A+i-IMqgUqvhCVLeXL;M5wEaSza&}jKl%Jsky*xg{s~U#%p@>5 zXmY<LB~I4`ZEq<va<W4%Bg$8~cs`Zv3ap%Y&HhI?%-xU4{nvnT5jZ)>YpQXF7{YHb ztFYH}CDTm8Ua2Q!Tg|ls!)w>>o?yHKbn2Z<Bv9iLKgUtD_duU@@O-yhs#OC!X;27j zmd7YIjHBFWmY+upw?&QTry^5n;)&%TKi>^8js;BGBwy37;)k>p_Rn;F-h%4EepiHb zCXza9xtGl6SJ!sW;-q=%*DiF=YP2xY6q{C7-ZFRYom8ZCE!92ercbm~hI?stC!!X- zN-mWc+~S-0b-QvFOV*8=XfJ%ncAV<V*|9F<=3<U6%}wgavmUYnk5^4L17bR)yOTGe zTe=`@3&a(0p|(*EMHjM$@lnfqW~Zx&JR@%#q|`I)lKax#)sB3xM^jzdzt(0@9kwwy zUsRKo(-5$Be5KeR#);|M#kbQI=0aOx(eQKl>DP)0o0fSQ1lFZrV&yAN3sxE=()C1} zjF~8{FmUdNPnwUE*G*>TX=N;*-c42ncRKh7*k<`4Wl#FM!esU>9o|+cu(B<0vfEM{ zXGr<{a=Esn5Rbv(VaTe_4L{atqX-_*!5i7;VSR0a&lDkU3Z`VBxipr1)3jYNrw1)y zb?ItPcJ2qfiH|r+rnN%94{GFw=49+lr9#kssz)JZiu|^?ew?l~D`x~Z&#PAXN%jl^ zIaQ?8q7|8b_@xLOamhlW2(NY~&{{f|T%`jpZ8mIXTZiCl-;&G)>GgS1S|s1q3Kx7G zMjuYK7)FL{+LYZzAp!Pr*=Hy{?~7M5CKMF$XLmGAFKg;t{WywKZEJ9E;<E=vp|GL) zl1n>U7jv-w@E{uImq1@ScmX`RusFl9;&_Y>m+eh$_is7v>F!OK!Mzkhi7@<f!NDaS z!anLAO%3Y8@&Phi*kW{+WM|qh?ubFa2cdg`E2eQq?$^d8mC#SW4xZcy%Ilz4eqgT* zmarMhE2T|Q=Ny;Fssm^@t}nu`q-P=42A@UDrNyb@PXTshrCoPD)FZj0CX=-niz^7H z%T3Z2OdK1%ij=WSktH!3bDo>bZsC!hpa;UeYteRE^VZg&W-DZIk7N1^;ska(THDWW zQ_SHZgg5qhBhquYkJ8p`v`YnXh)YnZ3|DOP)0)C&V}0#(qQH0YRfmE-VnOJ7c(_Wj zO;nl-)X~ESqxMR$IW<)80FMOtE)yAFMr4a-3eR2GcltPNOIWDSbV4OCO&{HKQ!55> zVDQD!1-p!*>rVKE#~@&QA2iMhD}O{2A*yklN#qcIZcku8DU%C@&T6ygC7*uBmXNAt zBr4$5Mw{K~X*alpWG3ylU}{QUFt+T9Q}9)l>4b*$H9}EOQ+k92GlAK9TJfkfc5J+% zo#e8OcF~~?cJyXO)@2mtMcX8a(AUL6J1Wzepu&F!uwM977IqRPDD0nNvEjO|dQnJ? zql4-a%?VIM=djgyQ4?RXLn4oGDY7SOc#3<nZ_YUzgqotJm$0wogz#dyE7QY>TTjiZ zP6N-Z$sk4|?NJ@Y%66UgZTV!dn@WneYdtP&Ra7HSm<}bvJ;ar>c=fh|<ljmx{nHW8 zt<@Mofg*l3L`H@Uu|#AHlEmX!n`Fu9N3|L|NMW6B7WMwaS<F*`FP6-1pUOik-Fpg8 zhry+4SHxALv)abx6Bj3y3({55{70q2X<I5QL3e)12)$65`dsJMSU$v06KROxZQ}Iv z;&WQ~&XUCWZQ{XcE3WC}ML#kV&8C-E<{&`{8auq9Jr@eJgv7~Tn(tPmW6CU7ug_S{ zRuC2$dVa>Cb}uezoZu>_rO%0+z@mOuJi=)(sc-v8hrG{B_-%s#h7j@>)0O?82rPvw zVIUaosF~0)*nY=bsROlI+A^Ye2nT^ZQm>2UiTa*S2V1vdmQ^Ni)OWg7v&SU5W;`ca zbM=$|1KS=6B;uYo+7_~CDoR0t%+kCnR(UC`&IgA0xl~cImnr9@Z9cb*MUopbRSML! zHse->->W2I=_>l!ia&BvM?O|@)*oMdSiV?6usdiQ<0My2XKENG2@1XNv@C%x4taaP z-E)0vBWtRLsaj3FF=)ST8OQY9j!)6?m%%!Xsb-`$6HRy2iijuLtvK;w$mdpzWaru; zI*he(hm^4FEd(W!BuwGbM47TA#w|Xtcc+tcu;l)ycI(nxd^-NkqaR|95y(27L6ky| z)XPunm)zm{X<ydFCNGKBD?Sn`>Te8%-g&JiCB(MuU@aWuM`fGx;VtCayOZu;bv;8< z5g95Re#k{$UDw^K+nx7q=F(HL>EK~aEgo}i(S_{n@4r0V<2b@YfY0yFvJaki%M)N? z6;7p~MdC?d5^8!p>=G+{wb05OV&LW0rt?D152#dCg(e3eq-;CfhP>Snp3<cX(IJ+Q zgZx|D5*Q$E{I2o|o?JM=eTphjy@Ir&F}_imNTAa5Za|f&l%H0MB%&M)mh-N114wdB z?fYI3T{;jenO;6-F4kq%aQC<^4eu7Jxd``d=5HRi5Z=)mieHlZhpv9CX+RM>qe3$v zgwY%V$q?&h_%yAvaf#oK@~0G}A!RitcANTsqL>qD5J5?rY$4q>$3P$XY+885*Allb zVXr6^)c?AEObd;H<;AyPMW5P#jU!ph8m65XfA_rjwi9F+aDwQ>QPr32!tKx$M9%54 zHt2zQhOKYGbYt-DB1-`jD-~^Igs2<D1vb;fVG0j{){HPtk#l=cvOac33SC_*?8K$| z`C{b*-n!AsF<Ps7(R5_Oic^L)yB_?((!w^@z0a;4*1Vdgvmx_3)JF|LXr12F%y&2Y z38^-v25oDiP7_^T@rdY_o1w*)0erAeCmqp1qj;3PL0gNY4=35CPsHgGo;Gz3Nj}sU zq|}UDv4M2A-l;dr-`AQeFfH0)WQ=X@AQg3v5uWmBEIO7{I>IAEuMg5yURKf2G&QF8 zBvfePm8t2r<kw%LFK5ckMpAwT@Fmj9Vbnw20kPYz4QcF0Uck}Yyv=iKGitG73Cf!d z#LVeSDr>h^O^Fok??_sfqtf*GBlkZsnQgJtLFv7&+0ZXC<6+w|&DpN0lvWjffI|c& zPu_sXk|^+F33*&oe%TTo7BwFaGw2CVY&5)<)9m@G(D(~$=%l&3_J<3k6H2Md;53v% z9(8K7$i5h!Rkejk(HSrUR01@LzRlLL;OiTLhPmbx0Be=311fTB5Iz~y)tyHsm6eax z&)Bd>!^G5>BpAL2EYD*)k|(Hhb|k~s(hImu`68z$*M}~xCiVVs>}Rm-QW-t<2{QJ{ z$2}#RJy>wkmJI3-ufoc;jL7pCi(c3f=vj-weH2{x=7;J~q$F`_0hCu$fai^oby)p8 zs7^zA>ow3c#9)>uiY9l~mzoBu&g!lso4vtrS&13Jk-M$$#5FzbigYj$q29jvSU@O@ z7Z2;tFFxs5zztrlCKL^BON(rwbKW%ogSVqz;P7Eiz-z4b$L?UXYoDJ?o*q~!xD!tP zCqEwO>4o;Oc5mtZI~AF}t_)VgTgCAj30TMjt{f!+sItS_VF}M!_W)hI@x2|?t?kc@ z()%w9I9-N1VidJYHiE>bik+V(tFVtxdOW^wv0ac46JeF3I}_cqgnV>G_2?4fQyy)R zvR%~cm({?5EAl<1=&G-Rv}w|89$i^gY`xY6fpp8zhHv;Iv6SziJ9gi#`9dWeOFVbm zFt!Poe$i7*f7(xurpIaeC3*y*ujOf;d>?^7y*~%@%Sj&Et<`*R7q-mF3x92IHCvU$ zz05klWL!!tcgpm%C(<FWtKCW6n(%E+UMJ5TEi?!h59Wct{BS*&_|EIeiSpe0MYEb; zp3V~2Q>AO-)YmE0y5>n||ISaQPb*#(S7sJE-W;{Wwoqi@E28L@Q%Nz%pC~Yh3E^h$ zS%XR^XpsF%-b@(ol#FBU3JlzyIF`UFRFWj@lR(bfcIIY7s9SMo*B?(rBqB$|{QT87 z5Syp&V3UWP0@fi%0h?gV&{qDkwI0c)YBn9P$JY6wmd%5T#`AXs#`V{%?enycRumK0 zF60RfE=5*(x~?m6?wiXD-JQI?g;qgv0P5y|R(JmlS`V*?E$0_Z#hXWmb`JJxP7=3` zCVbbT*-@2#5lX3J7-QvqO0kUDi*ZjPJN!o6{9#|9mZ#66mVNHs(9%W(MZ+j!tPcf+ z80@UM7ePbYtqFAFvUc)J^g^&=Up7xF+P7J&rOj93wE&;yXZY#%>l{N7cc>go`lX^? zZ*$X}DJJut5q&R#?=~}-PGOVhZ>!ssx2+i}cqN8<u#YZ`ZFJW<SX}5wvhnhuGRHwT z*=hM?9JGVU!5>r$cz3Yn16^Z@N2f!nXa{0Bn02xiC57^7l76Cv_Xc3qWT?r)TWbUi zTfufz{J+#ZnE}Hpt{yfb?_OU;HzF12G^cP--#sutMrf!EmKbnp_{HE>gf2_DQy6#< zYUp)$3TT9?GkA5)T^#D1@JA#jM)q1<=uBH-U7W3;R}@A{=-R_jyj<Xi%ixmN&XME4 zOA{|XEmKNfGvQyr{9+OHtxYf)EmPO#iqy=oou-}nVr(02vh7t-tJN?_yUZxY`a~L_ zn)g;lgM?Y}2AY{Mxj*%h?e3Fi%NR<uQ$}055N+bz@+poSzbD8$P-nGoIsO_^|52pY z2x{|Nikku@TKLrmQ+L9JI)`W^Y!w|BXTIJ`$>lzqpMp19kLB14uQ~I+cSo?&SPQs0 z>YuD{lkx1IuX91)A|paoEV~gX9`oXAn!+phl^opBA%ASN)L1V+uX1^Fn|>haNiHXs z&b|_Io0NUk_0B|qCudkdtFS1{vj7!Isw;ZRTlA3^<*7Qi9zg9awKvMq9h#MNPQ_gD zeU@g=RrPh33sZ>0Y!J8hpfCC$@}Ne(SR|q((BR6y5GXcw!x5!eAXoyds%VM75$m@` zvvL{$c_a=8l-OgTg^2NNZBHtMVM_@ae=s$LLSOwAW0?)#z+NgLw%J(tFvrVx_%TxC z-JK=T(wtO6z)L?5WzN=ff4K|ZoAr2<=<KnJg)idgHXcTi(@F=xX1+AzJ)zn;DTHRE zARvhwhe~v>NJ{Z_NE|4wE~6e};o22OWCfC?QARsDT$6sqLwNwuSg`j~>r)qNFLV<* zd^nGETbf!}{qWKlBbGB3-3~8uc9K&qL8oF=3qE%fU;`>poz=`KA-hi^uxb~O2T&=y zkF&Qw#~Oab_Ks?^&ZjP!cS=ab(-NhvJUrWOG@urtgUf-}TFk~Qi=Z^@(UJ9{8^%Yf zi53w%<Dn&*EDKw%+gUdKOlr2}ewdWViX1>baAI(DB3Iy!HW`3NKE+x){Ly4X6ZRT$ z07@$;#c3NAi4b6{n}cz7ZR)%oBW~nsx}c6%jZ)O`Q#m+Ymkf?Xm#QtbRB7d)-DTPW zuEmd%U`+UJA+TAsf<kx=?@DH+;O?MVVSnqheT`ZTNC3=RVFVTV?PV=AEE_vToX8ZN zL2TK}-iMAoJj2tEA$W_+1N|{NfL3M8LI9!NVrYBQA*}7t66XC9?-UppF!|ooV6o{V ze)VVKNTO++;N1P%>oQ$zqw8M3kMAy6Cdg{Jw5FAJ3)1x|emQ<tug{G1X=U{z+_4_( zlq=CUFU~9y)<ULmCc{HK)!(wNm-pwi<?wG*DjI*mP)HEpXVY9*13&y=>tIv5Sf~lP za)Oqw%Ht(xAg%3Ue+dC;KXgxi{pH|~x8Rrtd(FnBM5PF{!;jTRnQO4+><6nJO`B3f zE3V5`Jbjw#xE-E6r%7dIS+8sC5%FM7nXG?xh+}fOoP2a7moWjVjU)}IT;@3(S95Y1 z9*SG>nuuC!n8QLG+g_&7JQ<(V(%;!az<x>_N>W<et-{0^1Q1;jO%%l>1~F^Ef9qwa z$!)vQG#Gd=Ay%(v-yKbrZmyEn#`)2-l``IvI-m2Ml)gEjM$uAehNeB65%;-BGw7R4 zo;`UKD>u8+x9YGoRBf&0C~dtW%_<+|N*#oC<(w%_*_gn>IUi&Uv)}KD1vhRI1Z-T^ z`89GX2c<@Y28~vB^h6HTPO8gvM^@S|`)Ms|)Z3A!r#r#<5Vs+Re9|5UE{zP>#HOQR zA$ODFtED_|o$%GWvdJby1$S6hWZj>Ct5wxLTlS9d^Z`gl>J5TwJz{2O<Emq_pC~wg z!id<;94?)&KVrHXp3gGtQ&`N)5bN-KmBf|XEIkkBGQZ$W;c$vkFD2Y<$;Oj&k<Zp^ zt7Tv+TgITn>5~s$uvmxjZtgl<0Mfz3TLhtU)Y`6#N}j(AGU%UaD$}o?JqY^JBkQTd zHNzZGx{uwrD2lXqC9Jq96jZ4cslV-@GRSbSpWX@k*ybZzQO}?~Ypr|odhjmi+uRpm zokhhXm@QJIm)i~e(WnVA_YpWsS~>Y$aaE)gp1}EfOml+;rD}0rz!h?Et5o!C2{BGf zLL^a?uv$a~g(|w7WW8~(<vV6)al4x!xRkqT@8%kJ;~21G3G*X4NYXgtC1JvQA6DIs z=yO@T37j#3Nc!%@?}rpcejlV3Y^RGwlWO#}%$6vV46PEMEf?m`KkS78yw@e<=XZ!k zS8N0@VR;5(cn}urqMxvFJez5He}&g=RdTwRygYzMhZ)vb4->}D`K~g<kxScf?|l~F zb;=BU25us=LMPL48xJlxGbN&$>N!&JACYTOFNULyBM5r9@!$$pm8t89(k%E)KrNxn z_t)jN^-f?48vd_d&a)q`@9V=lL5v}KpAo(Hk`OIwh|UlaHG1!Tv{9lHHAs+PFhq?K zVj@})ZFEAk=o!H<_><rL8t!NNJUO3p_S$=`?_O)KE2((|yQc5VA~i;&EsdNxEqxal z@!b=S%e0uPepljU4$)(deey81UA!`-XVu2P*vs4d72h(JQ;XKXtGngy`Qqg4ILE)A z<Qb#mFFK2}v-<$q6;k!4WUP0&S#(kQfr_>9uZG^9O+S0dd}nLAR>EJMzn2KUd02UH z)V?h&_CYr9$#XNaTv^hZ(#DpRAEec8;AS_`h+Z58^f9jM-)Y9$rK73+67iyBZ*0t| z6Ke*oX-x9W*VV0ffc^ApjlRnC+pH6-*KRM=s3<iNGE2xNpO($JfC{g@W0b5NmRN`F zqt%?AeapHv`dcOiuTV%B*FnSs%W(&_46`Rkpld_I4@x_TOrV1F1<u<t%<;`>-Po4I zx2CBTU8MQuzE6_B9^V%y>g8+#?;YNh5CCrU^QBd#j%H_09vSBa5Yb(|oKd$4^3Q?x zd~}NKbd8O+v4%2)c)tQ&UDvcn_j>!=n9inBg#E|@ieTQzRyA^l^kLT2WTxH<2a4cB zo+WE}@@hZBXGr(Xo5X9C1EaKc1>LDLO}PH{SS^NiODx%L_UNH&^)~Qnd~_}Qs10wD zo8$-lN7f#*32q<jI>Y0?{5h}3)6`mG!dTyU;?m+$%d7oLzu++I@<U^Y7Jh)FXh&1@ zZ2W_KVT#4EG;e||Zb*W)qd>~t&{ij$_uu6n$SVTvQC?)SHah^!4}XtG^ck8-Dh@2e znQSTF7+bqmSGf5Z4^AF-t;}B1{~00GT?)RVIKQt(M4@+79JJON)??>x@c=kZ+vxkq z&~X~O-mFlA_`>VDGN}$AzIdVV&`ne^Fo*~s$ovhR)DriSuqite=pN`HrmhPa{yMR- zQ9z-Ba59YXP^cHbHkZhe<ZmI65O0ADr&~ny>$QXkUMOUFY4)4dTKs%nr?dXn@iaPz zLSSgb-Eib+tb1_8K{rI=G!U6vKLtveJ6EYKJjsXclY}C=V(||Y6Hledg&M+73GqCg z&TL4J*Si7H+Xg=ve^0<0JLAVI-)HZWW`FXM`O0HO;Kw&}a1mg;<*r!Qi9J}bWSmqT zQ#6nZ%NS2Ev;SG5mh<Z_j7i0MAbo*bMCdM2?}iT8qLFWOy;^_k6+V06N<~=l>e$Ve zpIErh;63E#OyD2BrD0`Wf8S&{KtJC`fT_LnZll8m$4;wVylG(I04>&UX}AjMK5#-U zy7kiG3+)j7SjOu2?C2L0?C_|aDi=d1uS=5mxuT(h9^s9IC5Sn`#^8<CP*+7e{N)Q| z(ylCI{Gs(jN4cAuBME9dL@GXxr<bVxm$8jD=PQ1p_U*ETVnL!75&;f^N2ImkP9Z{= zWreW?4nj7*+4!8r&Xhf(y3GZKI<Moi`@5$rr2-If1EhPAVEbQBClcjDcbrRnPWCE_ z$;-Q|TIFl6H4>H#Jcei?YA6?)b1BcTlZz6<x;g5}ftzGhlo6+e*i5mpX*H#mBcCK+ zS^!!PY@9=mYeP`igJ>%yRbXO?&@E#eJEB*AWjW$xxb!o5k1p|`!W!THDHPQ+O}Z-T zNsv#YMQjD{)>Z8>q13dGKdV-A+BKrjcmcbQFv`XZGSlI&io&=M%FPofSgTW3>w*6P z|B!>Hg*@uu5HB5Z_eE~I1Lbmv7Xa4hGS|1T_9AwCW`M**Vir7-{_1yc0rGlXpU_Va z-~XnzPo35LK8qGErS*+i>FgAumO`{cG<Hh#(OHsShGs@>`<O0Ew{rI^J)*i6_N<^V z>@Tk8gF|PLONpCE`aQji%U9g4uT7huTAqc9?3pR`=E0#DYX3Cx!B?^{jSzZmr<cFK zOlx8NcIs0s1EL{<-x%~+2hTW+X07_ZcF+3H=lC0OZqM1A{^|ZyOaFdEK_H}6rP<8C zsJZ%nogPFsXSJ$e#}C@yJ0H6|IBRT(;+e`WNolH?`Iy7P2H90!DGZcL7~i&SOk^%K z-XeSo0Iz!~_5}o~N_GR=)S*|LWi7^YZ#btd=kxfOxW)#(k?sK;iKda_kwG+)cDHJP znQ_*y2hipuA<4rePZO0wI|q@Q30a88`t~vVGdDmUS2+uk1KCZ4UzhAX;al`4<8-ss zb~Da@i29+IqE1P>BxzLKHN!pSAbXf}N#O}~Q)6r14TLuu%i8WeiODtzaiUowo0M*B zppEon`|uk0b3S%KPT;91XI}ryG2*Dsr14<pnI~HBYv5_4@Vap(IA7!L70Vfs0eJBi zctG>RRPd7(>~N}5<Q-&g)_#cQ=EJmy>6>&}Wxbqv7Mw(mS)i01LrPP#UkXaC-kO&B z{?;5Tp5i;vE2pmVMVL)rPgnX&J#}(%MEFnhfz2c#yjdfEe>4?cuODEWNv}^(%Q}k8 zt}EBLinR!iTPVP>c4<NCzO(&-7n|pWsGgQwwPnlLRr@TFinLPM{dtXLwhJXykMrd; z#uDS*(KKc6<-rbvA+puPG?ydOxgpTAoucv&dybJF_<E=r#LWv`AD=z>Yew}xoF<Q> z+0qpWp010npb4T4cxv9sABo$K4xnE5{>fiZ>#Nbn(P{8%eFEyb38_L08ujxyR%WTr zZ6_?drQnG2jbhlmr!#pCAsQ7})k<4)jg7KxWLQK@dRWfM?3>4r<1Pz@qYr)HmlH9r zA+;s5F`sSUrmgAo>HErlu^VzbrdKixye1PMEh!RfwO1ygs2`q_<}1>8NrQQ3QdJq+ z6R-8TE_;8^gSb{@yytIP?5zdP#iGo;Q;EY9Nn%7WfCT>)@Ji4M>q?WD8w)9xA(yOh z13L|{#_QT?jF9WuOs-EeI2Moc!2QhMG&VlsP}lvzEowfE@ddB}Z&X=zp7A-Z2-6vW zO3IX!(2|T<yWUOCRHTnGs(}BVjRxy^W+XtnF^uPsN%fb#b6(q>S83v5fYz_}d1R4w z@|VMfOztu1uis@xN<YlOmz55ucmQL*fY6hM-jyLdQyn>#I#fhH`~wI)4P*L+bq86u zLhLdb%tk`J=L}%|S4^H>f=v3nN+e5)H#JE7Qk)A9t#5QrG?zst^$a$9dxEJ~8Oqni z-NNZiRkxl0I0qrVC8r1a-FBM?G9ai}3=rsb?=Z~qJVD)J6omJJZ3W%Et}wkE*INII z@G6F_-o*m`M3sN`ZaZ#>Ttozw=1`u;)THN8vkzvvy8V;A34J7q!_BWA(F{*g7Lf0z z5I~BfVTeu3^N;rtG?>*vE`DWkyBL!=5l}N&XfNdvk}0c2Ca&-baAM}*@*Ii|pj(pT z--Ul1u+1Yc#(fMHmNw-OCY=(wdnPTih`DxqF4_=L0owejph0mx;T3Tw0hc=cb<D!0 zN$bNl!gpR*6u98(-H0gyj=&2J(lI@L7DXI*bt7rSKy&_6xom1qlU&mlp|FxiTMC4h zQ3Ex%y6yg!=sVTE!806BRtz3Llq7Q$uUKV&wjk2Fy|D=|;d3j+Sp&MQcKBQ|8ny@k z?v!!+%OP)y?q}aqgpD#(j}e8RPl@`#_P^1so`dt2a*o8Sm7csk1wiEku*s3`pPCLq z-T6%%dG_fc{74kp+>h?rZu?(=mU-BRE*hZAd-l9UQbG@AO_X`!Fv+$6QfwzS7A7go zAG)#7N>Q&Bzd(0Crh`O4=;Km-KN$%u_d(=uf`goXS$W(*U=Tw{$}Xmv&{O6Q)L-Jz z;+K8dO~G|9?Xutkltn~A<c?#dEHDvE=Rj^|rFQM|g~Up4k`eJ4?)%4`Bn$vwY#dB} zTE=oz5K`Fb-fX4NSssq+48;q)Cws&Sl38ZCaTQzY$1iy_H!3<w1M863Hkf?(MK^#F z6&(RuZN3+wwm{T}%Z(=;44=mv@w>XB-luI9fYfuj)lVRrvIAFHS3~_d!uu`^l@En> zTpzz4{X3U(k#_0Q&2rN=sSBHt%UOLR^z9j^y|;I#+V<K{wF)$wVds>@>*0h}df6)_ z1i%IuMw|<UjVqe`7y$t5FQ^()$wt4ecUz}j9?IDK>;wkFRV_3ZPXFeNY(8FD<U2Q~ zJ6A%Ock1Ju@)j)_ZX-9dbsq@YNF<x+J0`L#%b+gV1Mq5;bt_kg?<rSPV&d5kZqAMz zWxZ*o^%tTxxBMZ-1aFlertEJWIn7Ta4dC1^xLr7>KLaAyBKLsTsEqI?wHc0)f@2Ea ztYwkhJ<6oj5WA1pp$(Hzh)P3f-mDJ$Yo;N}9e*krXz1s0Z*tD|&qSt&?aDTi*yejR zxXpfL=pa#$2|yj*l`TSZhG*laNO$^Lm{M^`Q9dG~^vmB!0#wv#(83yh&kh^Y%{@ba zzML0){AedzS7<b4*p9%Hye6Ntg5G<f_Yr-$lGC1@e?N8G4yEJKL{ukbL<M(nu*$7C z_V|GaYBGS8lQ)FFb;r`wBfdY1yIz!;$8=Db?Y*Z44sDD(c>q(KKSNJ(RB;p%&CbSQ z{fs89CH6`dGHK5*Ow-^hv^Lw4Bq~6cU3C~uDD7%*XF%*;D5+OzZftw8uTX$&@dbM= zcNi-;ke{34x5A1`+M7z>KLq8}(tI}(Xd5Y3*>B>kRpQHBE^glC)@_A*PFQ9$f2ZH# zFGIH?&%uQ4ZFHU+Px?#XQaFlhpJQ=nVHX?LH6+%~VNN)`#{GPup&muC4z2VM2{r4; z2vs1KD;@<+qogUx_Hcu=%b)*R5xPR4(Uhmu0meC|g`+jlm+)c)od^N2%IQ~bWNVkv z7uJ#Y%k(8}Bb$LpxrI$pg$~J56Oe~ez`%7d-j*JFxLI$1g~q^NKMlN{M`0u#I{28D zTT~E-=VRGorci+p7OL(h=~ZzHnJ)ov&=`4DSn%65QLa?W9!+XR_QF4Ii;Gl8%TGWm z^Xx}pc~F#2%chX4dH&BILUogN*=Yk(Kv?iTci~E?!fI$&GJz87E3*hx*10}zUNSwq zIRh4frztNL7jDBW36(aZ{Q;IuxJ@y!OEmgP6EXk7UM8ZT6x!*}%gEA`aoeB)@+(HF zyJw_k<3)lxET7XB`@#e`%&+W*SYg7u)OOLWS7erns>^^!(DcIWM++xfs!xGyg?fr0 zcb^g(U`G+Gow#524*@6;pa$g_`mv$260yvcj_nqOjvg)WACpbF-&*8*x>ZC>whz@A zFO}sn-c|LBE5?BlA2E!|z$Pf?(>zbQU@1urtnX9q!Y9pN8Q0JJV$c{7^MXUNZYtHZ z{oVHRK@zZuTR+A7Q_iD5Nk*!aN*fpK`{crD2ODPybWrlBfBpdEyF9;H1XWN^RmGrH z?+byBe-tF6Z=Rgr4YS}f$+F8uDQ0$x>;+NXfTT3?hnu+8xLr|pK{EJ2eMR&H?52m! z`w$Xdzs8?^w%?paqu++tNj-4ym<IVd!2gt)uxNmi^X=FtU}JTI5O==NW2_ooW|PAS zr%L);;M3q4_LvTsK##TN0=udWmw4YL;j$yvGgTGdy%(6dv$gbYJ(TGVIPlgKW5nCW zrg6!w4;g`xZTIco*~v>Un^%l4AW&fQ;4VDNn0xszRR-(3)>?psGrY0(n3Ls2V&44v zwAGCMYrk_JnGE+QT4ugI3Tq}_3t2%67d_J-Dl&+W5=*p`9}A_F#!G6@Q}fSd@8zyx zpZ)&TkY*acc&I?cpcEwK?Vj~V-K0P1$3#Eb6W*ISn`h(8m1fh_YbLXyiRgZ(SU%lp zetYV;)iCsTGxJK5T+L1TH*%9f#?{UDEv#BIhUL*|D+t3Vm&nV)gSr#6t=lZ6$7&pl z!wbo6EutN9ydC|-=-n$~xSAHO9tW7h5V1a{>(5eOc+<f$eFI)0s^zqBmi|~w#34kL zch3UF{#7D4`kwjqv;ns%!7TT>^OU_nyDe`qzw~cW4@czcgV*C~^81eo4mgas0;MgI zSN>%jOU1;XTkfh^v{aABH7_Z7g*&K05R?fbr8;e)GVh-Kb$2JkoK=q1cDaW3<F}k@ zeg-oDc-o@hfuP@BHpB2tRn;zG#rP4`G`G$3Y|FgI3xq;PW~U(<v66M9K7TiG8!EfB zF!nrl9y#dm-?yp?D78B+dS3A?ePt8N-rx7kyQcJ%6@wl=<3oR66!<@|Tv&1(VjtRG zsDrBq>iv}puEpB~+s9r0VLTK@(zTMEl^<C9OZxnrlqF})piJ2F2-qXgQGsSTv<sj~ zK%}YowR=}4O6q*%&4gNX6+DJ8#07BGCBHt-;}JF^RV{8a#BdkN{BigQ{`Fc4oU;k) zahRf1iGjb$Iv4z^4bw&{z$9n*c^X~_<t`yftp15|j^KylDnjdWnRs2%ux0Tyju1sm zpg5Kq*dYwYdoSRxPWJ7|o6(*%)Bb#{cF|=~d2!$3pIo5vMcQ4FXo+MGm-oE1-08qh z47|jb;nyambRu=svnaZ-Q>j3xLcMdPt`v=zsaZm6s;g%Bwk=c89msEN1kVywT1o1q z*cR1bSX|sEpZ~yoqk;ImWbz4v{4jg0+K}2$$9ffVx8HWpeHt>5W*iMFTYz8zX#j8; zsA_kI#q(&mZCBzPygN>V0%g%c*w}LxNe-VZckW#?Z-l0(ib*_3FoF!}q=NDUbiH!q zsbu5aT{(CDjBV6ga)ijZ0cuvH?<UnB-lEV-Q^&Z~9SmXj-33GtUzQ!9`B=s3Y_4>Q zgqgpe+qu{k`kb^b4jeQ%pe~LpJl^=ju87X+nl^@+TEY?4MCRk>>=ylgBh!M|j(b@R zwA{e-5a!jC2I~C_p%kNyf=IKC%U?0>YS{dE_RT)St4~X<^gXvCFizo7ubsn(dur3l zCd=KR@|$a=_8pbu&zht&6n11e*R$z9MtXojF9{G;iElRkNEzs?T}OJPH$mKMb?{FJ zOu+6UH$;bPQ^&S<hvDXdi%tQKD+dba^)w*=3E0*?n*Q}a|3?4&o6K{N!9qaLL({Se zjycGjtoyNgb`D*?o#UDCIt#}ebxVmjjyxXd3Q8kYk#Lv(X+c;vxM=h}kFY<-4%DFb zH>A%y;z79&K3zi+8YB1k-=y`78A_D-q4Z?q(P@r*YiHCVQvqBIFRDw~eD;qq*+!;J zx>DEsu53dsnKj3Lp8LruzO5oE(biUk`^qO1EmcnJIN0os4~pO9imkdP+a9DOGw+hP z9@H;fYMi&!MAcoqJk{Amvobm^PsRZMdFq#*j3@f*#^a?70}n%T(ANidDi+}KTA4cW zWu{ktn_aM>uf+FEO?|-NKma#2fqidrKzK?{j=yVr)tcWcbP(gxml~@x;Zc1>E_Mcy zL5#s>19>3c(dNS$+cqI24Pn^>ze?;6cE^!&4azmS;5tf;6?(RRyF^0duG{P)@QjaY zB~#u*gv#l2J9;rS>RWJ?4~=&r8Y6S1eSQVd43;9CCDto_v9Tf<qwJ&+piTDdaQo{= zm@!%diHDIa4m+9;Z(AP05%RtAH{2x!=A{1I7q%FXqRZelyp%9lniW0;nVk1VSqBN6 zvN>L1x@)>|VfJCNRP3^Mj!G4l%&!EVYZ6}eKOIu|!1SLLN|l_<hTOTFuc%?`)2~qJ z0tC{gZEtk=>Y`vXq>xACTss#S>(q5pbLD1|uk|uO>`tb>Z<n@8#kI;&fJohq(=?5; zpafb{klm?;y6Pus^>@Hs^`-|cQ+7P*I-+kB63q!%dHU7L5^03|5at2Z46cXvC836F zh6fmW0;d`h@Z4xO4&qm@_++V4E-wBbO!KZrZ{jmbYg7^?U92TAA6Q-x830_K{3{9H zG)4-phW)k`OaiN*UWDcdj{FoTV?Ja|wWkGP{7`A%d3V3Ma$58TVna9ra9(rBy3n0r zp9qZ_o}1ltH(mVJOtruIeQfI=dr5*Dp@Q76p}F$MJv2w&|Drdt!3N3`O;Hl_O;#O= zC4_|_1vs@;o9ssB<4FAtA<|i2XK!NGKX@QXR$O?j)PG|UdgrhI`NErLmCt?ukK>JN Ze3d*JEyK<W_gg@}rkbv5t@3l|{{Yo3k^BGv From ee446e0ba93467b5d1503f7b8a707f32c3d44de2 Mon Sep 17 00:00:00 2001 From: Rafaelle AYGALENQ <rafaelle.aygalenq@artefact.com> Date: Fri, 12 Feb 2021 16:51:11 +0100 Subject: [PATCH 467/496] fix typo readme --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 32339b2..ffd52f4 100644 --- a/README.md +++ b/README.md @@ -168,5 +168,5 @@ You can now open the file index.html located in the build folder. ├── tests <- Where the tests lives ├── setup.py <- makes project pip installable (pip install -e .) so the package can be imported ├── requirements.txt <- The requirements file for reproducing the analysis environment, e.g. - generated with `pip freeze > requirements.txt` + │ generated with `pip freeze > requirements.txt` └── pylintrc <- The linting configuration file From e504f96a41abfd0e2c74d7813c09201721e32a35 Mon Sep 17 00:00:00 2001 From: Rafaelle AYGALENQ <rafaelle.aygalenq@artefact.com> Date: Fri, 12 Feb 2021 16:52:12 +0100 Subject: [PATCH 468/496] update project organization readme --- README.md | 3 --- 1 file changed, 3 deletions(-) diff --git a/README.md b/README.md index ffd52f4..9cde61d 100644 --- a/README.md +++ b/README.md @@ -154,9 +154,6 @@ You can now open the file index.html located in the build folder. ├── .github/workflows <- Where the CI lives ├── datasets/external <- Bash scripts to download external datasets ├── docs <- Sphinx HTML documentation - │ ├── _build - │ │ └── html - │ ├── source ├── nlpretext <- Main Package. This is where the code lives │ ├── preprocessor.py <- Main preprocessing script │ ├── augmentation <- Text augmentation script From ed3ee85bef53eaaab128a9ef1619632659fb1cf0 Mon Sep 17 00:00:00 2001 From: Rafaelle AYGALENQ <rafaelle.aygalenq@artefact.com> Date: Fri, 12 Feb 2021 17:59:17 +0100 Subject: [PATCH 469/496] update readme --- README.md | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/README.md b/README.md index 9cde61d..ab94f9b 100644 --- a/README.md +++ b/README.md @@ -70,7 +70,7 @@ Another possibility is to create your custom pipeline if you know exactly what f ```python from nlpretext import Preprocessor -from nlpretext.basic.preprocess import (normalize_whitespace, remove_punct, remove_eol_characters, +from nlpretext.classic.preprocess import (normalize_whitespace, remove_punct, remove_eol_characters, remove_stopwords, lower_text) from nlpretext.social.preprocess import remove_mentions, remove_hashtag, remove_emoji text = "I just got the best dinner in my life @latourdargent !!! I recommend 😀 #food #paris \n" @@ -88,7 +88,7 @@ print(text) # "dinner life recommend" ``` -Take a look at all the functions that are available [here](https://github.com/artefactory/NLPretext/tree/feature/readme/nlpretext) in the ```preprocess.py``` scripts in the different folders: basic, social, token. +Take a look at all the functions that are available [here](https://github.com/artefactory/NLPretext/tree/master/nlpretext) in the ```preprocess.py``` scripts in the different folders: classic, social, token. # Individual Functions @@ -96,7 +96,7 @@ Take a look at all the functions that are available [here](https://github.com/ar ## Replacing emails <a name="replace_emails"></a> ```python -from nlpretext.basic.preprocess import replace_emails +from nlpretext.classic.preprocess import replace_emails example = "I have forwarded this email to obama@whitehouse.gov" example = replace_emails(example, replace_with="*EMAIL*") print(example) @@ -106,7 +106,7 @@ print(example) ## Replacing phone numbers <a name="replace_phone_numbers"></a> ```python -from nlpretext.basic.preprocess import replace_phone_numbers +from nlpretext.classic.preprocess import replace_phone_numbers example = "My phone number is 0606060606" example = replace_phone_numbers(example, country_to_detect=["FR"], replace_with="*PHONE*") print(example) @@ -157,7 +157,7 @@ You can now open the file index.html located in the build folder. ├── nlpretext <- Main Package. This is where the code lives │ ├── preprocessor.py <- Main preprocessing script │ ├── augmentation <- Text augmentation script - │ ├── basic <- Basic text preprocessing + │ ├── classic <- Classic text preprocessing │ ├── social <- Social text preprocessing │ ├── token <- Token text preprocessing │ ├── _config <- Where the configuration and constants live From 2ced84d40e28c76d0df58cceba4c4b8656535446 Mon Sep 17 00:00:00 2001 From: Amale EL HAMRI <amale.elhamri@artefact.com> Date: Mon, 15 Feb 2021 16:16:37 +0100 Subject: [PATCH 470/496] rename ci_actions.yml > ci.yml --- .github/workflows/{ci_actions.yml => ci.yml} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename .github/workflows/{ci_actions.yml => ci.yml} (100%) diff --git a/.github/workflows/ci_actions.yml b/.github/workflows/ci.yml similarity index 100% rename from .github/workflows/ci_actions.yml rename to .github/workflows/ci.yml From a1a7b4e7609c6ad1a618036a0fdd2adedd697c02 Mon Sep 17 00:00:00 2001 From: Amale EL HAMRI <amale.elhamri@artefact.com> Date: Mon, 15 Feb 2021 16:19:17 +0100 Subject: [PATCH 471/496] update setup.py --- setup.py | 29 ++++++++++------------------- 1 file changed, 10 insertions(+), 19 deletions(-) diff --git a/setup.py b/setup.py index 8b6eaf3..4e17403 100644 --- a/setup.py +++ b/setup.py @@ -15,38 +15,29 @@ # You should have received a copy of the GNU Lesser General Public License # along with this program; if not, write to the Free Software Foundation, # Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. -from setuptools import find_packages, setup import setuptools -import setuptools.command.install from pathlib import Path -class PostInstallCommand(setuptools.command.install.install): - """Post-installation command.""" - def run(self): - setuptools.command.install.install.run(self) - try: - import spacy - spacy.cli.validate() - except ModuleNotFoundError: - pass - with open(Path(__file__).resolve().parent.joinpath('VERSION'), 'r') as fh: version = fh.read() -setup( + +with open("requirements.txt", "r") as fr: + requirements = [req for req in fr.read().splitlines() if not req.startswith("#")] + +setuptools.setup( name='nlpretext', - packages=find_packages(), + packages=setuptools.find_packages(), + scripts=["VERSION", "requirements.txt"], version=version, description='All the goto functions you need to handle NLP use-cases', author='Artefact', license='MIT', - url='https://github.com/artefactory/nautilus-nlp', + url='https://github.com/artefactory/NLPretext', + install_requires=requirements, classifiers=[ - 'Programming Language :: Python :: 3.6', + 'Programming Language :: Python :: 3.7', 'License :: OSI Approved :: MIT License', 'Operating System :: OS Independent', ], - cmdclass={ - 'install': PostInstallCommand, - }, ) From bcb3e61c4d13d7f4d6529b787273280f88a6fe1e Mon Sep 17 00:00:00 2001 From: Amale EL HAMRI <amale.elhamri@artefact.com> Date: Mon, 15 Feb 2021 16:35:59 +0100 Subject: [PATCH 472/496] adding requirements_dev --- .github/workflows/ci.yml | 2 +- requirements.txt | 15 --------------- requirements_dev.txt | 8 ++++++++ 3 files changed, 9 insertions(+), 16 deletions(-) create mode 100644 requirements_dev.txt diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index d5031d8..ab7d269 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -38,7 +38,7 @@ jobs: - name: Install requirements run: | python -m pip install --upgrade pip - pip install -r requirements.txt + pip install -r requirements_dev.txt - name: Run pylint run: | diff --git a/requirements.txt b/requirements.txt index f2cb8e3..e06f872 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,15 +1,3 @@ -# local package -#-e . - -# external requirements -coverage -pillow -pytest==6.1.1 -pytest-cov==2.10.1 -python-dotenv>=0.5.1 -Sphinx -sphinx_rtd_theme - #library requirements chardet==3.0.4 emoji>=0.5.2 @@ -24,8 +12,5 @@ pylint==2.4.4 regex==2019.8.19 sacremoses==0.0.13 scikit_learn==0.23.2 -setuptools==40.8.0 spacy==2.3.4 -https://github.com/explosion/spacy-models/releases/download/en_core_web_sm-2.3.1/en_core_web_sm-2.3.1.tar.gz -https://github.com/explosion/spacy-models/releases/download/fr_core_news_sm-2.3.0/fr_core_news_sm-2.3.0.tar.gz stop_words==2018.7.23 \ No newline at end of file diff --git a/requirements_dev.txt b/requirements_dev.txt new file mode 100644 index 0000000..b16d405 --- /dev/null +++ b/requirements_dev.txt @@ -0,0 +1,8 @@ +coverage==5.3 +pytest==6.1.1 +pytest-cov==2.10.1 +python-dotenv>=0.5.1 +Sphinx==3.2.1 +sphinx_rtd_theme==0.5.0 +setuptools==40.8.0 +-r requirements.txt \ No newline at end of file From e072f011eacb9f0ff54d24f9d5af41898e16b3e7 Mon Sep 17 00:00:00 2001 From: Amale EL HAMRI <amale.elhamri@artefact.com> Date: Mon, 15 Feb 2021 16:37:00 +0100 Subject: [PATCH 473/496] adding CD to publish package to pypi --- .github/workflows/cd.yml | 52 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 52 insertions(+) create mode 100644 .github/workflows/cd.yml diff --git a/.github/workflows/cd.yml b/.github/workflows/cd.yml new file mode 100644 index 0000000..987e708 --- /dev/null +++ b/.github/workflows/cd.yml @@ -0,0 +1,52 @@ +# GNU Lesser General Public License v3.0 only +# Copyright (C) 2020 Artefact +# licence-information@artefact.com +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 3 of the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public License +# along with this program; if not, write to the Free Software Foundation, +# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +name: CD + +on: [push, pull_request] + +jobs: + CI: + name: Launching CD + runs-on: ubuntu-latest + strategy: + matrix: + python-version: [3.7] + + steps: + - uses: actions/checkout@v2 + + - name: Set up Python ${{ matrix.python-version }} + uses: actions/setup-python@v2 + with: + python-version: ${{ matrix.python-version }} + + - name: Install requirements + run: | + python -m pip install --upgrade pip + pip install setuptools wheel + + - name: Building package distribution + run: | + python setup.py sdist bdist_wheel + ls + + - name: Publish new package version on PyPI + uses: pypa/gh-action-pypi-publish@master + with: + user: __token__ + password: ${{ secrets.PYPI_API_TOKEN }} From f86f36afed5f0f86bbb8c39f84009a8d5344f4d2 Mon Sep 17 00:00:00 2001 From: Amale EL HAMRI <amale.elhamri@artefact.com> Date: Mon, 15 Feb 2021 16:42:17 +0100 Subject: [PATCH 474/496] adding spacy model download in CI --- .github/workflows/ci.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index ab7d269..07567dd 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -39,6 +39,8 @@ jobs: run: | python -m pip install --upgrade pip pip install -r requirements_dev.txt + pip install https://github.com/explosion/spacy-models/releases/download/en_core_web_sm-2.3.1/en_core_web_sm-2.3.1.tar.gz + pip install https://github.com/explosion/spacy-models/releases/download/fr_core_news_sm-2.3.0/fr_core_news_sm-2.3.0.tar.gz - name: Run pylint run: | From 040a62e24bd0af3067161e5835aad617c4af69e8 Mon Sep 17 00:00:00 2001 From: Amale EL HAMRI <amale.elhamri@artefact.com> Date: Mon, 15 Feb 2021 16:51:37 +0100 Subject: [PATCH 475/496] adding pypi publication only when master is merged --- .github/workflows/cd.yml | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/.github/workflows/cd.yml b/.github/workflows/cd.yml index 987e708..acbdcd1 100644 --- a/.github/workflows/cd.yml +++ b/.github/workflows/cd.yml @@ -17,10 +17,14 @@ # Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. name: CD -on: [push, pull_request] +on: + pull_request: + branches: + - master + types: [closed] jobs: - CI: + CD: name: Launching CD runs-on: ubuntu-latest strategy: @@ -43,7 +47,6 @@ jobs: - name: Building package distribution run: | python setup.py sdist bdist_wheel - ls - name: Publish new package version on PyPI uses: pypa/gh-action-pypi-publish@master From 04ae61ee6ddbabc0d18e4fa1a472b333a4a434e4 Mon Sep 17 00:00:00 2001 From: Amale EL HAMRI <amale.elhamri@artefact.com> Date: Mon, 15 Feb 2021 16:51:59 +0100 Subject: [PATCH 476/496] renaming classic > basic --- nlpretext/{classic => basic}/preprocess.py | 0 nlpretext/preprocessor.py | 2 +- tests/test_preprocessor.py | 4 ++-- 3 files changed, 3 insertions(+), 3 deletions(-) rename nlpretext/{classic => basic}/preprocess.py (100%) diff --git a/nlpretext/classic/preprocess.py b/nlpretext/basic/preprocess.py similarity index 100% rename from nlpretext/classic/preprocess.py rename to nlpretext/basic/preprocess.py diff --git a/nlpretext/preprocessor.py b/nlpretext/preprocessor.py index c453aad..e05f4be 100644 --- a/nlpretext/preprocessor.py +++ b/nlpretext/preprocessor.py @@ -5,7 +5,7 @@ from nlpretext.social.preprocess import ( remove_html_tags, remove_mentions, remove_emoji, remove_hashtag) -from nlpretext.classic.preprocess import normalize_whitespace, remove_eol_characters, fix_bad_unicode +from nlpretext.basic.preprocess import normalize_whitespace, remove_eol_characters, fix_bad_unicode class Preprocessor(): diff --git a/tests/test_preprocessor.py b/tests/test_preprocessor.py index 5212015..66bc04d 100644 --- a/tests/test_preprocessor.py +++ b/tests/test_preprocessor.py @@ -17,14 +17,14 @@ # Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. import pytest import numpy as np -from nlpretext.classic.preprocess import ( +from nlpretext.basic.preprocess import ( normalize_whitespace, remove_eol_characters, fix_bad_unicode, unpack_english_contractions, replace_urls, replace_emails, replace_phone_numbers, replace_numbers, replace_currency_symbols, remove_punct, remove_accents, remove_multiple_spaces_and_strip_text, filter_non_latin_characters ) -from nlpretext.classic.preprocess import ( +from nlpretext.basic.preprocess import ( remove_stopwords as remove_stopwords_text ) from nlpretext.social.preprocess import ( From ec1ad6392fe9b1c9a6e7b5c3d17a2d01013a03a9 Mon Sep 17 00:00:00 2001 From: Amale EL HAMRI <amale.elhamri@artefact.com> Date: Mon, 15 Feb 2021 18:32:18 +0100 Subject: [PATCH 477/496] nlpretext/social/preprocess.py --- nlpretext/social/preprocess.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/nlpretext/social/preprocess.py b/nlpretext/social/preprocess.py index 1f30891..ebbdb8a 100644 --- a/nlpretext/social/preprocess.py +++ b/nlpretext/social/preprocess.py @@ -21,7 +21,7 @@ import emoji as _emoji from nlpretext._config import constants -from nlpretext.classic.preprocess import normalize_whitespace +from nlpretext.basic.preprocess import normalize_whitespace def remove_mentions(text) -> str: From da35f1339d5580d8ed8d81097f7f53125d767019 Mon Sep 17 00:00:00 2001 From: Amale EL HAMRI <amale.elhamri@artefact.com> Date: Tue, 16 Feb 2021 09:46:33 +0100 Subject: [PATCH 478/496] removing CD --- .github/workflows/cd.yml | 55 ---------------------------------------- 1 file changed, 55 deletions(-) delete mode 100644 .github/workflows/cd.yml diff --git a/.github/workflows/cd.yml b/.github/workflows/cd.yml deleted file mode 100644 index acbdcd1..0000000 --- a/.github/workflows/cd.yml +++ /dev/null @@ -1,55 +0,0 @@ -# GNU Lesser General Public License v3.0 only -# Copyright (C) 2020 Artefact -# licence-information@artefact.com -# -# This program is free software; you can redistribute it and/or -# modify it under the terms of the GNU Lesser General Public -# License as published by the Free Software Foundation; either -# version 3 of the License, or (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public License -# along with this program; if not, write to the Free Software Foundation, -# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. -name: CD - -on: - pull_request: - branches: - - master - types: [closed] - -jobs: - CD: - name: Launching CD - runs-on: ubuntu-latest - strategy: - matrix: - python-version: [3.7] - - steps: - - uses: actions/checkout@v2 - - - name: Set up Python ${{ matrix.python-version }} - uses: actions/setup-python@v2 - with: - python-version: ${{ matrix.python-version }} - - - name: Install requirements - run: | - python -m pip install --upgrade pip - pip install setuptools wheel - - - name: Building package distribution - run: | - python setup.py sdist bdist_wheel - - - name: Publish new package version on PyPI - uses: pypa/gh-action-pypi-publish@master - with: - user: __token__ - password: ${{ secrets.PYPI_API_TOKEN }} From 0772036c6ae6b6520a56959a8e9a05de29419353 Mon Sep 17 00:00:00 2001 From: Amale EL HAMRI <amale.elhamri@artefact.com> Date: Tue, 16 Feb 2021 09:52:51 +0100 Subject: [PATCH 479/496] update link readme --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 9cde61d..4a31283 100644 --- a/README.md +++ b/README.md @@ -88,7 +88,7 @@ print(text) # "dinner life recommend" ``` -Take a look at all the functions that are available [here](https://github.com/artefactory/NLPretext/tree/feature/readme/nlpretext) in the ```preprocess.py``` scripts in the different folders: basic, social, token. +Take a look at all the functions that are available [here](https://github.com/artefactory/NLPretext/tree/master) in the ```preprocess.py``` scripts in the different folders: basic, social, token. # Individual Functions From b9a7006c535efe37bacbbe29e476ebe61e42ff13 Mon Sep 17 00:00:00 2001 From: Amale EL HAMRI <amale.elhamri@artefact.com> Date: Tue, 16 Feb 2021 10:03:42 +0100 Subject: [PATCH 480/496] update remove_stopwords token with arg lang instead of list --- nlpretext/token/preprocess.py | 13 +++++++++++-- tests/test_preprocessor.py | 9 ++++----- 2 files changed, 15 insertions(+), 7 deletions(-) diff --git a/nlpretext/token/preprocess.py b/nlpretext/token/preprocess.py index 989bd9a..058dd8e 100644 --- a/nlpretext/token/preprocess.py +++ b/nlpretext/token/preprocess.py @@ -20,16 +20,22 @@ from __future__ import absolute_import, division, print_function, unicode_literals import re +from nlpretext._utils.stopwords import get_stopwords -def remove_stopwords(tokens, stopwords: list) -> str: +def remove_stopwords(tokens: list, lang: str, custom_stopwords: list = None) -> str: """ Remove stopwords from a text. eg. 'I like when you move your body !' -> 'I move body !' Parameters ---------- - stopwords : list of stopwords to remove + tokens: list(str) + list of tokens + lang: str + language iso code (e.g : "en") + custom_stopwords : list(str)|None + list of custom stopwords to add. None by default Returns ------- @@ -41,6 +47,9 @@ def remove_stopwords(tokens, stopwords: list) -> str: ValueError When inputs is not a list """ + stopwords = get_stopwords(lang) + if custom_stopwords: + stopwords += custom_stopwords tokens = [word for word in tokens if word not in stopwords] return tokens diff --git a/tests/test_preprocessor.py b/tests/test_preprocessor.py index 66bc04d..a11ba16 100644 --- a/tests/test_preprocessor.py +++ b/tests/test_preprocessor.py @@ -188,14 +188,13 @@ def test_get_stopwords(): @pytest.mark.parametrize( - "input_tokens, expected_output", + "input_tokens, lang, expected_output", [ - (['I', 'like', 'when', 'you', 'move', 'your', 'body', '!'], ['I', 'move', 'body', '!']) + (['I', 'like', 'when', 'you', 'move', 'your', 'body', '!'], "en", ['I', 'move', 'body', '!']) ], ) -def test_remove_stopwords_tokens(input_tokens, expected_output): - stopwords = get_stopwords('en') - result = remove_stopwords_token(input_tokens, stopwords) +def test_remove_stopwords_tokens(input_tokens, lang, expected_output): + result = remove_stopwords_token(input_tokens, lang) np.testing.assert_array_equal(result, expected_output) From adf57391bf0db7ddad2733c299d1d6b74f5d6d59 Mon Sep 17 00:00:00 2001 From: Amale EL HAMRI <amale.elhamri@artefact.com> Date: Tue, 16 Feb 2021 10:12:44 +0100 Subject: [PATCH 481/496] update version 1.0.0 --- VERSION | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/VERSION b/VERSION index f514a2f..afaf360 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -0.9.1 \ No newline at end of file +1.0.0 \ No newline at end of file From 09db3b48876d18e3ff2c5af81f88a89ed1e5aeec Mon Sep 17 00:00:00 2001 From: Amale EL HAMRI <amale.elhamri@artefact.com> Date: Tue, 16 Feb 2021 10:21:16 +0100 Subject: [PATCH 482/496] add mosestekonizer version --- requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements.txt b/requirements.txt index e06f872..a4774f8 100644 --- a/requirements.txt +++ b/requirements.txt @@ -3,7 +3,7 @@ chardet==3.0.4 emoji>=0.5.2 flashtext==2.7 ftfy<5.0.0,>=4.2.0 -mosestokenizer +mosestokenizer==1.1.0 nlpaug==1.0.1 nltk>=3.4.5 numpy>1.15.4 From 633af6149419a04814c72f8695c4774b1beba0b3 Mon Sep 17 00:00:00 2001 From: Amale EL HAMRI <amale.elhamri@artefact.com> Date: Tue, 16 Feb 2021 10:28:07 +0100 Subject: [PATCH 483/496] typo README --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 4a31283..b26156d 100644 --- a/README.md +++ b/README.md @@ -88,7 +88,7 @@ print(text) # "dinner life recommend" ``` -Take a look at all the functions that are available [here](https://github.com/artefactory/NLPretext/tree/master) in the ```preprocess.py``` scripts in the different folders: basic, social, token. +Take a look at all the functions that are available [here](https://github.com/artefactory/NLPretext/tree/master/nlpretext) in the ```preprocess.py``` scripts in the different folders: basic, social, token. # Individual Functions From 2a95b1dd1c3bbc91296fff075bfd6f14103f1d95 Mon Sep 17 00:00:00 2001 From: Amale EL HAMRI <amale.elhamri@artefact.com> Date: Tue, 16 Feb 2021 10:57:56 +0100 Subject: [PATCH 484/496] update project documentation --- docs/conf.py | 21 ++--- docs/index.rst | 52 ++++++------ docs/modules.rst | 6 +- docs/nautilus_nlp.config.rst | 22 ------ docs/nautilus_nlp.data.rst | 22 ------ docs/nautilus_nlp.features.rst | 22 ------ docs/nautilus_nlp.models.rst | 70 ----------------- docs/nautilus_nlp.rst | 42 ---------- docs/nautilus_nlp.utils.rst | 118 ---------------------------- docs/nautilus_nlp.visualization.rst | 22 ------ docs/nlpretext.augmentation.rst | 7 ++ docs/nlpretext.basic.rst | 7 ++ docs/nlpretext.rst | 8 ++ docs/nlpretext.social.rst | 7 ++ docs/nlpretext.token.rst | 7 ++ 15 files changed, 74 insertions(+), 359 deletions(-) delete mode 100644 docs/nautilus_nlp.config.rst delete mode 100644 docs/nautilus_nlp.data.rst delete mode 100644 docs/nautilus_nlp.features.rst delete mode 100644 docs/nautilus_nlp.models.rst delete mode 100644 docs/nautilus_nlp.rst delete mode 100644 docs/nautilus_nlp.utils.rst delete mode 100644 docs/nautilus_nlp.visualization.rst create mode 100644 docs/nlpretext.augmentation.rst create mode 100644 docs/nlpretext.basic.rst create mode 100644 docs/nlpretext.rst create mode 100644 docs/nlpretext.social.rst create mode 100644 docs/nlpretext.token.rst diff --git a/docs/conf.py b/docs/conf.py index fffe634..a6769f8 100644 --- a/docs/conf.py +++ b/docs/conf.py @@ -31,17 +31,20 @@ # import os import sys +from pathlib import Path + sys.path.insert(0, os.path.abspath('../')) # -- Project information ----------------------------------------------------- -project = 'Nautilus_nlp' +project = 'NLPretext' copyright = '2020, Artefact' author = 'Artefact' -# The short X.Y version -version = '0.1.0' +with open(Path(__file__).resolve().parent.joinpath('../VERSION'), 'r') as fh: + version = fh.read() + # The full version, including alpha/beta/rc tags release = '' @@ -129,7 +132,7 @@ # -- Options for HTMLHelp output --------------------------------------------- # Output file base name for HTML help builder. -htmlhelp_basename = 'Nautilus_nlpdoc' +htmlhelp_basename = 'NLPretextdoc' # -- Options for LaTeX output ------------------------------------------------ @@ -156,8 +159,8 @@ # (source start file, target name, title, # author, documentclass [howto, manual, or own class]). latex_documents = [ - (master_doc, 'Nautilus_nlp.tex', 'Nautilus\\_nlp Documentation', - 'Robin Doumerc', 'manual'), + (master_doc, 'NLPretext.tex', 'Nautilus\\_nlp Documentation', + 'Artefact', 'manual'), ] @@ -166,7 +169,7 @@ # One entry per manual page. List of tuples # (source start file, name, description, authors, manual section). man_pages = [ - (master_doc, 'nautilus_nlp', 'Nautilus_nlp Documentation', + (master_doc, 'NLPretext', 'NLPretext Documentation', [author], 1) ] @@ -177,8 +180,8 @@ # (source start file, target name, title, author, # dir menu entry, description, category) texinfo_documents = [ - (master_doc, 'Nautilus_nlp', 'Nautilus_nlp Documentation', - author, 'Nautilus_nlp', 'One line description of project.', + (master_doc, 'NLPretext', 'NLPretext Documentation', + author, 'NLPretext', 'One line description of project.', 'Miscellaneous'), ] diff --git a/docs/index.rst b/docs/index.rst index 91dd094..eb204fd 100644 --- a/docs/index.rst +++ b/docs/index.rst @@ -1,63 +1,57 @@ -Welcome to Nautilus_nlp's documentation! +Welcome to NLPretext's documentation! ======================================== -The Nautilus NLP library aimed to be a meta-library to be used to help you get started on handling your NLP use-case. +The NLPretext library aimed to be a meta-library to be used to help you get started on handling your NLP use-case preprocessing. -This library can help you with: - 1. Cleaning text data - 2. Normalizing your dataset - 3. Training automatically multiclass, multilabel classifier - 4. Help you discover topics and cluster your data +# Installation +Beware, this package has been tested on Python **3.6** & **3.7** & **3.8**, and will probably not be working under python **2.7** as **Python2.7** EOL is scheduled for December 2019. -# Feature Request +To install this library you should first clone the repository: -As an Artefact user, you might be working on a NLP use case, and wish to use Nautilus. +pip install nlpretext - However, if you think Nautilus is lacking features that can be useful not only to your use case but also others, feel free to to fill up an issue with the label "Feature-request". +This library uses Spacy as tokenizer. Current models supported are `en_core_web_sm` and `fr_core_news_sm`. If not installed, run the following commands: - We will try to put it in the roadmap and implement it as soon as possible. +pip install https://github.com/explosion/spacy-models/releases/download/en_core_web_sm-2.3.1/en_core_web_sm-2.3.1.tar.gz -# Installation +pip install https://github.com/explosion/spacy-models/releases/download/fr_core_news_sm-2.3.0/fr_core_news_sm-2.3.0.tar.gz -Beware, this package has been tested on Python **3.6** & **3.7**, and will probably not be working under python **2.7** as **Python2.7** EOL is scheduled for December 2019. -To install this library you should first clone the repository: -`git clone https://github.com/artefactory/nautilus_nlp/ && cd nautilus_nlp` - -**If you don't use the docker container, we strongly advise you to do these steps in a virtual environnement** - -First you need to install the required files: +.. toctree:: + :maxdepth: 2 + :caption: Text Preprocessing Functions: -`pip install -r requirements.txt` + modules -then you can install it via pip: +.. toctree:: + :maxdepth: 2 + :caption: Basic preprocessing: -`pip install -e .` + nlpretext.basic .. toctree:: :maxdepth: 2 - :caption: Preprocessing and utility functions: + :caption: Social preprocessing: - modules + nlpretext.social .. toctree:: :maxdepth: 2 - :caption: Preprocessing and utility functions: - - nautilus_nlp.utils + :caption: Token preprocessing: + nlpretext.token .. toctree:: :maxdepth: 2 - :caption: Machine learning: + :caption: Text Augmentation: - nautilus_nlp.models + nlpretext.augmentation Indices and tables ================== diff --git a/docs/modules.rst b/docs/modules.rst index 26ca8ee..f7251b8 100644 --- a/docs/modules.rst +++ b/docs/modules.rst @@ -1,7 +1,7 @@ -nautilus_nlp -============ +nlpretext +========= .. toctree:: :maxdepth: 4 - nautilus_nlp + nlpretext diff --git a/docs/nautilus_nlp.config.rst b/docs/nautilus_nlp.config.rst deleted file mode 100644 index 8864121..0000000 --- a/docs/nautilus_nlp.config.rst +++ /dev/null @@ -1,22 +0,0 @@ -nautilus\_nlp.config package -============================ - -Submodules ----------- - -nautilus\_nlp.config.config module ----------------------------------- - -.. automodule:: nautilus_nlp.config.config - :members: - :undoc-members: - :show-inheritance: - - -Module contents ---------------- - -.. automodule:: nautilus_nlp.config - :members: - :undoc-members: - :show-inheritance: diff --git a/docs/nautilus_nlp.data.rst b/docs/nautilus_nlp.data.rst deleted file mode 100644 index 4b12cc2..0000000 --- a/docs/nautilus_nlp.data.rst +++ /dev/null @@ -1,22 +0,0 @@ -nautilus\_nlp.data package -========================== - -Submodules ----------- - -nautilus\_nlp.data.make\_dataset module ---------------------------------------- - -.. automodule:: nautilus_nlp.data.make_dataset - :members: - :undoc-members: - :show-inheritance: - - -Module contents ---------------- - -.. automodule:: nautilus_nlp.data - :members: - :undoc-members: - :show-inheritance: diff --git a/docs/nautilus_nlp.features.rst b/docs/nautilus_nlp.features.rst deleted file mode 100644 index c4b764c..0000000 --- a/docs/nautilus_nlp.features.rst +++ /dev/null @@ -1,22 +0,0 @@ -nautilus\_nlp.features package -============================== - -Submodules ----------- - -nautilus\_nlp.features.build\_features module ---------------------------------------------- - -.. automodule:: nautilus_nlp.features.build_features - :members: - :undoc-members: - :show-inheritance: - - -Module contents ---------------- - -.. automodule:: nautilus_nlp.features - :members: - :undoc-members: - :show-inheritance: diff --git a/docs/nautilus_nlp.models.rst b/docs/nautilus_nlp.models.rst deleted file mode 100644 index ee38f75..0000000 --- a/docs/nautilus_nlp.models.rst +++ /dev/null @@ -1,70 +0,0 @@ -nautilus\_nlp.models package -============================ - -Submodules ----------- - -nautilus\_nlp.models.Fasttext\_classifier module ------------------------------------------------- - -.. automodule:: nautilus_nlp.models.Fasttext_classifier - :members: - :undoc-members: - :show-inheritance: - -nautilus\_nlp.models.Fasttext\_embedding module ------------------------------------------------ - -.. automodule:: nautilus_nlp.models.Fasttext_embedding - :members: - :undoc-members: - :show-inheritance: - -nautilus\_nlp.models.Language\_detector module ----------------------------------------------- - -.. automodule:: nautilus_nlp.models.Language_detector - :members: - :undoc-members: - :show-inheritance: - -nautilus\_nlp.models.Sentiment\_detector module ------------------------------------------------ - -.. automodule:: nautilus_nlp.models.Sentiment_detector - :members: - :undoc-members: - :show-inheritance: - -nautilus\_nlp.models.Spacy\_model module ----------------------------------------- - -.. automodule:: nautilus_nlp.models.Spacy_model - :members: - :undoc-members: - :show-inheritance: - -nautilus\_nlp.models.sentiment module -------------------------------------- - -.. automodule:: nautilus_nlp.models.sentiment - :members: - :undoc-members: - :show-inheritance: - -nautilus\_nlp.models.sk\_vectorizer module ------------------------------------------- - -.. automodule:: nautilus_nlp.models.sk_vectorizer - :members: - :undoc-members: - :show-inheritance: - - -Module contents ---------------- - -.. automodule:: nautilus_nlp.models - :members: - :undoc-members: - :show-inheritance: diff --git a/docs/nautilus_nlp.rst b/docs/nautilus_nlp.rst deleted file mode 100644 index e240841..0000000 --- a/docs/nautilus_nlp.rst +++ /dev/null @@ -1,42 +0,0 @@ -nautilus\_nlp package -===================== - -Subpackages ------------ - -.. toctree:: - - nautilus_nlp.config - nautilus_nlp.data - nautilus_nlp.features - nautilus_nlp.models - nautilus_nlp.utils - nautilus_nlp.visualization - -Submodules ----------- - -nautilus\_nlp.corpus module ---------------------------- - -.. automodule:: nautilus_nlp.corpus - :members: - :undoc-members: - :show-inheritance: - -nautilus\_nlp.doc module ------------------------- - -.. automodule:: nautilus_nlp.doc - :members: - :undoc-members: - :show-inheritance: - - -Module contents ---------------- - -.. automodule:: nautilus_nlp - :members: - :undoc-members: - :show-inheritance: diff --git a/docs/nautilus_nlp.utils.rst b/docs/nautilus_nlp.utils.rst deleted file mode 100644 index 1b9e43a..0000000 --- a/docs/nautilus_nlp.utils.rst +++ /dev/null @@ -1,118 +0,0 @@ -nautilus\_nlp.utils package -=========================== - -Submodules ----------- - -nautilus\_nlp.utils.Text\_processor module ------------------------------------------- - -.. automodule:: nautilus_nlp.utils.Text_processor - :members: - :undoc-members: - :show-inheritance: - -nautilus\_nlp.utils.compat module ---------------------------------- - -.. automodule:: nautilus_nlp.utils.compat - :members: - :undoc-members: - :show-inheritance: - -nautilus\_nlp.utils.constants module ------------------------------------- - -.. automodule:: nautilus_nlp.utils.constants - :members: - :undoc-members: - :show-inheritance: - -nautilus\_nlp.utils.emoji module --------------------------------- - -.. automodule:: nautilus_nlp.utils.emoji - :members: - :undoc-members: - :show-inheritance: - -nautilus\_nlp.utils.encoding module ------------------------------------ - -.. automodule:: nautilus_nlp.utils.encoding - :members: - :undoc-members: - :show-inheritance: - -nautilus\_nlp.utils.export module ---------------------------------- - -.. automodule:: nautilus_nlp.utils.export - :members: - :undoc-members: - :show-inheritance: - -nautilus\_nlp.utils.file\_loader module ---------------------------------------- - -.. automodule:: nautilus_nlp.utils.file_loader - :members: - :undoc-members: - :show-inheritance: - -nautilus\_nlp.utils.lemmatizer module -------------------------------------- - -.. automodule:: nautilus_nlp.utils.lemmatizer - :members: - :undoc-members: - :show-inheritance: - -nautilus\_nlp.utils.preprocess module -------------------------------------- - -.. automodule:: nautilus_nlp.utils.preprocess - :members: - :undoc-members: - :show-inheritance: - -nautilus\_nlp.utils.stemmer module ----------------------------------- - -.. automodule:: nautilus_nlp.utils.stemmer - :members: - :undoc-members: - :show-inheritance: - -nautilus\_nlp.utils.text\_vectorizer module -------------------------------------------- - -.. automodule:: nautilus_nlp.utils.text_vectorizer - :members: - :undoc-members: - :show-inheritance: - -nautilus\_nlp.utils.tokenizer module ------------------------------------- - -.. automodule:: nautilus_nlp.utils.tokenizer - :members: - :undoc-members: - :show-inheritance: - -nautilus\_nlp.utils.vector\_similarity module ---------------------------------------------- - -.. automodule:: nautilus_nlp.utils.vector_similarity - :members: - :undoc-members: - :show-inheritance: - - -Module contents ---------------- - -.. automodule:: nautilus_nlp.utils - :members: - :undoc-members: - :show-inheritance: diff --git a/docs/nautilus_nlp.visualization.rst b/docs/nautilus_nlp.visualization.rst deleted file mode 100644 index 3f312ce..0000000 --- a/docs/nautilus_nlp.visualization.rst +++ /dev/null @@ -1,22 +0,0 @@ -nautilus\_nlp.visualization package -=================================== - -Submodules ----------- - -nautilus\_nlp.visualization.visualize module --------------------------------------------- - -.. automodule:: nautilus_nlp.visualization.visualize - :members: - :undoc-members: - :show-inheritance: - - -Module contents ---------------- - -.. automodule:: nautilus_nlp.visualization - :members: - :undoc-members: - :show-inheritance: diff --git a/docs/nlpretext.augmentation.rst b/docs/nlpretext.augmentation.rst new file mode 100644 index 0000000..11afca2 --- /dev/null +++ b/docs/nlpretext.augmentation.rst @@ -0,0 +1,7 @@ +nlpretext.augmentation module +----------------------------- + +.. automodule:: nlpretext.augmentation.preprocess + :members: + :undoc-members: + :show-inheritance: diff --git a/docs/nlpretext.basic.rst b/docs/nlpretext.basic.rst new file mode 100644 index 0000000..ca40843 --- /dev/null +++ b/docs/nlpretext.basic.rst @@ -0,0 +1,7 @@ +nlpretext.basic module +----------------------------- + +.. automodule:: nlpretext.basic.preprocess + :members: + :undoc-members: + :show-inheritance: diff --git a/docs/nlpretext.rst b/docs/nlpretext.rst new file mode 100644 index 0000000..7fa285f --- /dev/null +++ b/docs/nlpretext.rst @@ -0,0 +1,8 @@ +nlpretext.preprocessor module +----------------------------- + +.. automodule:: nlpretext.preprocessor + :members: + :undoc-members: + :show-inheritance: + diff --git a/docs/nlpretext.social.rst b/docs/nlpretext.social.rst new file mode 100644 index 0000000..06a10a0 --- /dev/null +++ b/docs/nlpretext.social.rst @@ -0,0 +1,7 @@ +nlpretext.social module +----------------------------- + +.. automodule:: nlpretext.social.preprocess + :members: + :undoc-members: + :show-inheritance: diff --git a/docs/nlpretext.token.rst b/docs/nlpretext.token.rst new file mode 100644 index 0000000..28adcb7 --- /dev/null +++ b/docs/nlpretext.token.rst @@ -0,0 +1,7 @@ +nlpretext.token module +----------------------------- + +.. automodule:: nlpretext.token.preprocess + :members: + :undoc-members: + :show-inheritance: From 7112402bd1443be4a447235b92aa2fd63cf639bb Mon Sep 17 00:00:00 2001 From: Amale EL HAMRI <amale.elhamri@artefact.com> Date: Tue, 16 Feb 2021 11:01:55 +0100 Subject: [PATCH 485/496] fix Nautilus > NLPretext --- docs/conf.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/conf.py b/docs/conf.py index a6769f8..ef88628 100644 --- a/docs/conf.py +++ b/docs/conf.py @@ -159,7 +159,7 @@ # (source start file, target name, title, # author, documentclass [howto, manual, or own class]). latex_documents = [ - (master_doc, 'NLPretext.tex', 'Nautilus\\_nlp Documentation', + (master_doc, 'NLPretext.tex', 'NLPretext Documentation', 'Artefact', 'manual'), ] From 4fbb35093b9b93ed1b72732f6e466e19ef4d93da Mon Sep 17 00:00:00 2001 From: Rafaelle AYGALENQ <rafaelle.aygalenq@artefact.com> Date: Tue, 16 Feb 2021 17:33:37 +0100 Subject: [PATCH 486/496] add init files --- nlpretext/augmentation/__init__.py | 17 +++++++++++++++++ nlpretext/basic/__init__.py | 17 +++++++++++++++++ nlpretext/social/__init__.py | 17 +++++++++++++++++ nlpretext/token/__init__.py | 17 +++++++++++++++++ 4 files changed, 68 insertions(+) create mode 100644 nlpretext/augmentation/__init__.py create mode 100644 nlpretext/basic/__init__.py create mode 100644 nlpretext/social/__init__.py create mode 100644 nlpretext/token/__init__.py diff --git a/nlpretext/augmentation/__init__.py b/nlpretext/augmentation/__init__.py new file mode 100644 index 0000000..d46139b --- /dev/null +++ b/nlpretext/augmentation/__init__.py @@ -0,0 +1,17 @@ +# GNU Lesser General Public License v3.0 only +# Copyright (C) 2020 Artefact +# licence-information@artefact.com +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 3 of the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public License +# along with this program; if not, write to the Free Software Foundation, +# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. diff --git a/nlpretext/basic/__init__.py b/nlpretext/basic/__init__.py new file mode 100644 index 0000000..d46139b --- /dev/null +++ b/nlpretext/basic/__init__.py @@ -0,0 +1,17 @@ +# GNU Lesser General Public License v3.0 only +# Copyright (C) 2020 Artefact +# licence-information@artefact.com +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 3 of the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public License +# along with this program; if not, write to the Free Software Foundation, +# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. diff --git a/nlpretext/social/__init__.py b/nlpretext/social/__init__.py new file mode 100644 index 0000000..d46139b --- /dev/null +++ b/nlpretext/social/__init__.py @@ -0,0 +1,17 @@ +# GNU Lesser General Public License v3.0 only +# Copyright (C) 2020 Artefact +# licence-information@artefact.com +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 3 of the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public License +# along with this program; if not, write to the Free Software Foundation, +# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. diff --git a/nlpretext/token/__init__.py b/nlpretext/token/__init__.py new file mode 100644 index 0000000..d46139b --- /dev/null +++ b/nlpretext/token/__init__.py @@ -0,0 +1,17 @@ +# GNU Lesser General Public License v3.0 only +# Copyright (C) 2020 Artefact +# licence-information@artefact.com +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 3 of the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public License +# along with this program; if not, write to the Free Software Foundation, +# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. From 3cbf230ac60ffbefdf0977dd8e7db2c7ac2d88a9 Mon Sep 17 00:00:00 2001 From: Rafaelle AYGALENQ <rafaelle.aygalenq@artefact.com> Date: Tue, 16 Feb 2021 17:35:02 +0100 Subject: [PATCH 487/496] update readme classic changed to basic --- README.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index bb1480f..b26156d 100644 --- a/README.md +++ b/README.md @@ -70,7 +70,7 @@ Another possibility is to create your custom pipeline if you know exactly what f ```python from nlpretext import Preprocessor -from nlpretext.classic.preprocess import (normalize_whitespace, remove_punct, remove_eol_characters, +from nlpretext.basic.preprocess import (normalize_whitespace, remove_punct, remove_eol_characters, remove_stopwords, lower_text) from nlpretext.social.preprocess import remove_mentions, remove_hashtag, remove_emoji text = "I just got the best dinner in my life @latourdargent !!! I recommend 😀 #food #paris \n" @@ -96,7 +96,7 @@ Take a look at all the functions that are available [here](https://github.com/ar ## Replacing emails <a name="replace_emails"></a> ```python -from nlpretext.classic.preprocess import replace_emails +from nlpretext.basic.preprocess import replace_emails example = "I have forwarded this email to obama@whitehouse.gov" example = replace_emails(example, replace_with="*EMAIL*") print(example) @@ -106,7 +106,7 @@ print(example) ## Replacing phone numbers <a name="replace_phone_numbers"></a> ```python -from nlpretext.classic.preprocess import replace_phone_numbers +from nlpretext.basic.preprocess import replace_phone_numbers example = "My phone number is 0606060606" example = replace_phone_numbers(example, country_to_detect=["FR"], replace_with="*PHONE*") print(example) @@ -157,7 +157,7 @@ You can now open the file index.html located in the build folder. ├── nlpretext <- Main Package. This is where the code lives │ ├── preprocessor.py <- Main preprocessing script │ ├── augmentation <- Text augmentation script - │ ├── classic <- Classic text preprocessing + │ ├── basic <- Basic text preprocessing │ ├── social <- Social text preprocessing │ ├── token <- Token text preprocessing │ ├── _config <- Where the configuration and constants live From b2d22ea1e88ae524e29cb149159245081979c7f1 Mon Sep 17 00:00:00 2001 From: Amale EL HAMRI <amale.elhamri@artefact.com> Date: Wed, 17 Feb 2021 14:03:01 +0100 Subject: [PATCH 488/496] change Licence to Apache --- LICENSE | 432 ++++++++++++++++++++------------- docs/conf.py | 23 +- nlpretext/_config/constants.py | 23 +- nlpretext/basic/preprocess.py | 23 +- nlpretext/social/preprocess.py | 23 +- nlpretext/token/preprocess.py | 23 +- tests/test_document_loader.py | 23 +- 7 files changed, 327 insertions(+), 243 deletions(-) diff --git a/LICENSE b/LICENSE index 153d416..751384f 100644 --- a/LICENSE +++ b/LICENSE @@ -1,165 +1,267 @@ - GNU LESSER GENERAL PUBLIC LICENSE - Version 3, 29 June 2007 - - Copyright (C) 2007 Free Software Foundation, Inc. <https://fsf.org/> - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - - - This version of the GNU Lesser General Public License incorporates -the terms and conditions of version 3 of the GNU General Public -License, supplemented by the additional permissions listed below. - - 0. Additional Definitions. - - As used herein, "this License" refers to version 3 of the GNU Lesser -General Public License, and the "GNU GPL" refers to version 3 of the GNU -General Public License. - - "The Library" refers to a covered work governed by this License, -other than an Application or a Combined Work as defined below. - - An "Application" is any work that makes use of an interface provided -by the Library, but which is not otherwise based on the Library. -Defining a subclass of a class defined by the Library is deemed a mode -of using an interface provided by the Library. - - A "Combined Work" is a work produced by combining or linking an -Application with the Library. The particular version of the Library -with which the Combined Work was made is also called the "Linked -Version". - - The "Minimal Corresponding Source" for a Combined Work means the -Corresponding Source for the Combined Work, excluding any source code -for portions of the Combined Work that, considered in isolation, are -based on the Application, and not on the Linked Version. - - The "Corresponding Application Code" for a Combined Work means the -object code and/or source code for the Application, including any data -and utility programs needed for reproducing the Combined Work from the -Application, but excluding the System Libraries of the Combined Work. - - 1. Exception to Section 3 of the GNU GPL. - - You may convey a covered work under sections 3 and 4 of this License -without being bound by section 3 of the GNU GPL. - - 2. Conveying Modified Versions. - - If you modify a copy of the Library, and, in your modifications, a -facility refers to a function or data to be supplied by an Application -that uses the facility (other than as an argument passed when the -facility is invoked), then you may convey a copy of the modified -version: - - a) under this License, provided that you make a good faith effort to - ensure that, in the event an Application does not supply the - function or data, the facility still operates, and performs - whatever part of its purpose remains meaningful, or - - b) under the GNU GPL, with none of the additional permissions of - this License applicable to that copy. - - 3. Object Code Incorporating Material from Library Header Files. - - The object code form of an Application may incorporate material from -a header file that is part of the Library. You may convey such object -code under terms of your choice, provided that, if the incorporated -material is not limited to numerical parameters, data structure -layouts and accessors, or small macros, inline functions and templates -(ten or fewer lines in length), you do both of the following: - - a) Give prominent notice with each copy of the object code that the - Library is used in it and that the Library and its use are - covered by this License. - - b) Accompany the object code with a copy of the GNU GPL and this license - document. - - 4. Combined Works. - - You may convey a Combined Work under terms of your choice that, -taken together, effectively do not restrict modification of the -portions of the Library contained in the Combined Work and reverse -engineering for debugging such modifications, if you also do each of -the following: - - a) Give prominent notice with each copy of the Combined Work that - the Library is used in it and that the Library and its use are - covered by this License. - - b) Accompany the Combined Work with a copy of the GNU GPL and this license - document. - - c) For a Combined Work that displays copyright notices during - execution, include the copyright notice for the Library among - these notices, as well as a reference directing the user to the - copies of the GNU GPL and this license document. - - d) Do one of the following: - - 0) Convey the Minimal Corresponding Source under the terms of this - License, and the Corresponding Application Code in a form - suitable for, and under terms that permit, the user to - recombine or relink the Application with a modified version of - the Linked Version to produce a modified Combined Work, in the - manner specified by section 6 of the GNU GPL for conveying - Corresponding Source. - - 1) Use a suitable shared library mechanism for linking with the - Library. A suitable mechanism is one that (a) uses at run time - a copy of the Library already present on the user's computer - system, and (b) will operate properly with a modified version - of the Library that is interface-compatible with the Linked - Version. - - e) Provide Installation Information, but only if you would otherwise - be required to provide such information under section 6 of the - GNU GPL, and only to the extent that such information is - necessary to install and execute a modified version of the - Combined Work produced by recombining or relinking the - Application with a modified version of the Linked Version. (If - you use option 4d0, the Installation Information must accompany - the Minimal Corresponding Source and Corresponding Application - Code. If you use option 4d1, you must provide the Installation - Information in the manner specified by section 6 of the GNU GPL - for conveying Corresponding Source.) - - 5. Combined Libraries. - - You may place library facilities that are a work based on the -Library side by side in a single library together with other library -facilities that are not Applications and are not covered by this -License, and convey such a combined library under terms of your -choice, if you do both of the following: - - a) Accompany the combined library with a copy of the same work based - on the Library, uncombined with any other library facilities, - conveyed under the terms of this License. - - b) Give prominent notice with the combined library that part of it - is a work based on the Library, and explaining where to find the - accompanying uncombined form of the same work. - - 6. Revised Versions of the GNU Lesser General Public License. - - The Free Software Foundation may publish revised and/or new versions -of the GNU Lesser General Public License from time to time. Such new -versions will be similar in spirit to the present version, but may -differ in detail to address new problems or concerns. - - Each version is given a distinguishing version number. If the -Library as you received it specifies that a certain numbered version -of the GNU Lesser General Public License "or any later version" -applies to it, you have the option of following the terms and -conditions either of that published version or of any later version -published by the Free Software Foundation. If the Library as you -received it does not specify a version number of the GNU Lesser -General Public License, you may choose any version of the GNU Lesser -General Public License ever published by the Free Software Foundation. - - If the Library as you received it specifies that a proxy can decide -whether future versions of the GNU Lesser General Public License shall -apply, that proxy's public statement of acceptance of any version is -permanent authorization for you to choose that version for the -Library. \ No newline at end of file +Skip to content +Search or jump to… + +Pull requests +Issues +Marketplace +Explore + +@amaleelhamri +fastai +/ +fastai +630 +20.5k +6.9k +Code +Issues +56 +Pull requests +12 +Discussions +Actions +Projects +1 +Wiki +Security +Insights +fastai/LICENSE +fastai/fastai is licensed under the + +Apache License 2.0 +A permissive license whose main conditions require preservation of copyright and license notices. Contributors provide an express grant of patent rights. Licensed works, modifications, and larger works may be distributed under different terms and without source code. + +Permissions + Commercial use + Modification + Distribution + Patent use + Private use +Limitations + Trademark use + Liability + Warranty +Conditions + License and copyright notice + State changes +This is not legal advice. Learn more about repository licenses. +@jph00 +jph00 Initial commit +Latest commit ff0dff1 on 23 Nov 2019 + History + 1 contributor + 201 lines (169 sloc) 11.1 KB + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +© 2021 GitHub, Inc. +Terms +Privacy +Security +Status +Docs +Contact GitHub +Pricing +API +Training +Blog +About diff --git a/docs/conf.py b/docs/conf.py index ef88628..ae7ccbc 100644 --- a/docs/conf.py +++ b/docs/conf.py @@ -1,21 +1,18 @@ -# GNU Lesser General Public License v3.0 only +# coding=utf-8 # Copyright (C) 2020 Artefact # licence-information@artefact.com # -# This program is free software; you can redistribute it and/or -# modify it under the terms of the GNU Lesser General Public -# License as published by the Free Software Foundation; either -# version 3 of the License, or (at your option) any later version. +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at # -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# Lesser General Public License for more details. +# http://www.apache.org/licenses/LICENSE-2.0 # -# You should have received a copy of the GNU Lesser General Public License -# along with this program; if not, write to the Free Software Foundation, -# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. -# -*- coding: utf-8 -*- +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License # # Configuration file for the Sphinx documentation builder. # diff --git a/nlpretext/_config/constants.py b/nlpretext/_config/constants.py index 401811b..d7c4b20 100644 --- a/nlpretext/_config/constants.py +++ b/nlpretext/_config/constants.py @@ -1,21 +1,18 @@ -# GNU Lesser General Public License v3.0 only +# coding=utf-8 # Copyright (C) 2020 Artefact # licence-information@artefact.com # -# This program is free software; you can redistribute it and/or -# modify it under the terms of the GNU Lesser General Public -# License as published by the Free Software Foundation; either -# version 3 of the License, or (at your option) any later version. +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at # -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# Lesser General Public License for more details. +# http://www.apache.org/licenses/LICENSE-2.0 # -# You should have received a copy of the GNU Lesser General Public License -# along with this program; if not, write to the Free Software Foundation, -# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. -# -*- coding: utf-8 -*- +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License """ Collection of regular expressions and other (small, generally useful) constants. """ diff --git a/nlpretext/basic/preprocess.py b/nlpretext/basic/preprocess.py index 0247012..f7eedf2 100644 --- a/nlpretext/basic/preprocess.py +++ b/nlpretext/basic/preprocess.py @@ -1,21 +1,18 @@ -# GNU Lesser General Public License v3.0 only +# coding=utf-8 # Copyright (C) 2020 Artefact # licence-information@artefact.com # -# This program is free software; you can redistribute it and/or -# modify it under the terms of the GNU Lesser General Public -# License as published by the Free Software Foundation; either -# version 3 of the License, or (at your option) any later version. +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at # -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# Lesser General Public License for more details. +# http://www.apache.org/licenses/LICENSE-2.0 # -# You should have received a copy of the GNU Lesser General Public License -# along with this program; if not, write to the Free Software Foundation, -# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. -# -*- coding: utf-8 -*- +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License from __future__ import (absolute_import, division, print_function, unicode_literals) diff --git a/nlpretext/social/preprocess.py b/nlpretext/social/preprocess.py index ebbdb8a..4fa0247 100644 --- a/nlpretext/social/preprocess.py +++ b/nlpretext/social/preprocess.py @@ -1,21 +1,18 @@ -# GNU Lesser General Public License v3.0 only +# coding=utf-8 # Copyright (C) 2020 Artefact # licence-information@artefact.com # -# This program is free software; you can redistribute it and/or -# modify it under the terms of the GNU Lesser General Public -# License as published by the Free Software Foundation; either -# version 3 of the License, or (at your option) any later version. +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at # -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# Lesser General Public License for more details. +# http://www.apache.org/licenses/LICENSE-2.0 # -# You should have received a copy of the GNU Lesser General Public License -# along with this program; if not, write to the Free Software Foundation, -# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. -# -*- coding: utf-8 -*- +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License from __future__ import absolute_import, division, print_function, unicode_literals diff --git a/nlpretext/token/preprocess.py b/nlpretext/token/preprocess.py index 058dd8e..682aae1 100644 --- a/nlpretext/token/preprocess.py +++ b/nlpretext/token/preprocess.py @@ -1,21 +1,18 @@ -# GNU Lesser General Public License v3.0 only +# coding=utf-8 # Copyright (C) 2020 Artefact # licence-information@artefact.com # -# This program is free software; you can redistribute it and/or -# modify it under the terms of the GNU Lesser General Public -# License as published by the Free Software Foundation; either -# version 3 of the License, or (at your option) any later version. +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at # -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# Lesser General Public License for more details. +# http://www.apache.org/licenses/LICENSE-2.0 # -# You should have received a copy of the GNU Lesser General Public License -# along with this program; if not, write to the Free Software Foundation, -# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. -# -*- coding: utf-8 -*- +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License from __future__ import absolute_import, division, print_function, unicode_literals diff --git a/tests/test_document_loader.py b/tests/test_document_loader.py index b6cab3a..b4caf2d 100644 --- a/tests/test_document_loader.py +++ b/tests/test_document_loader.py @@ -1,21 +1,18 @@ -# GNU Lesser General Public License v3.0 only +# coding=utf-8 # Copyright (C) 2020 Artefact # licence-information@artefact.com # -# This program is free software; you can redistribute it and/or -# modify it under the terms of the GNU Lesser General Public -# License as published by the Free Software Foundation; either -# version 3 of the License, or (at your option) any later version. +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at # -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# Lesser General Public License for more details. +# http://www.apache.org/licenses/LICENSE-2.0 # -# You should have received a copy of the GNU Lesser General Public License -# along with this program; if not, write to the Free Software Foundation, -# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. -# -*- coding: utf-8 -*- +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License import os From 789438b64abe00afc7c0ab123a6b5883c0dbc081 Mon Sep 17 00:00:00 2001 From: Amale EL HAMRI <amale.elhamri@artefact.com> Date: Thu, 18 Feb 2021 09:31:11 +0100 Subject: [PATCH 489/496] correct license --- LICENSE | 30 ------------------------------ nlpretext/_utils/stopwords.py | 23 ++++++++++------------- 2 files changed, 10 insertions(+), 43 deletions(-) diff --git a/LICENSE b/LICENSE index 751384f..1607e15 100644 --- a/LICENSE +++ b/LICENSE @@ -1,33 +1,3 @@ -Skip to content -Search or jump to… - -Pull requests -Issues -Marketplace -Explore - -@amaleelhamri -fastai -/ -fastai -630 -20.5k -6.9k -Code -Issues -56 -Pull requests -12 -Discussions -Actions -Projects -1 -Wiki -Security -Insights -fastai/LICENSE -fastai/fastai is licensed under the - Apache License 2.0 A permissive license whose main conditions require preservation of copyright and license notices. Contributors provide an express grant of patent rights. Licensed works, modifications, and larger works may be distributed under different terms and without source code. diff --git a/nlpretext/_utils/stopwords.py b/nlpretext/_utils/stopwords.py index 0897313..e0f0013 100644 --- a/nlpretext/_utils/stopwords.py +++ b/nlpretext/_utils/stopwords.py @@ -1,21 +1,18 @@ -# GNU Lesser General Public License v3.0 only +# coding=utf-8 # Copyright (C) 2020 Artefact # licence-information@artefact.com # -# This program is free software; you can redistribute it and/or -# modify it under the terms of the GNU Lesser General Public -# License as published by the Free Software Foundation; either -# version 3 of the License, or (at your option) any later version. +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at # -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# Lesser General Public License for more details. +# http://www.apache.org/licenses/LICENSE-2.0 # -# You should have received a copy of the GNU Lesser General Public License -# along with this program; if not, write to the Free Software Foundation, -# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. -# -*- coding: utf-8 -*- +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License from __future__ import (absolute_import, division, print_function, unicode_literals) From 29090447a7db5cc58796d2199a05d66a5c1484d2 Mon Sep 17 00:00:00 2001 From: Amale EL HAMRI <amale.elhamri@artefact.com> Date: Thu, 18 Feb 2021 09:36:21 +0100 Subject: [PATCH 490/496] correct license --- LICENSE | 26 +------------------------- 1 file changed, 1 insertion(+), 25 deletions(-) diff --git a/LICENSE b/LICENSE index 1607e15..aa7be8d 100644 --- a/LICENSE +++ b/LICENSE @@ -1,28 +1,4 @@ -Apache License 2.0 -A permissive license whose main conditions require preservation of copyright and license notices. Contributors provide an express grant of patent rights. Licensed works, modifications, and larger works may be distributed under different terms and without source code. - -Permissions - Commercial use - Modification - Distribution - Patent use - Private use -Limitations - Trademark use - Liability - Warranty -Conditions - License and copyright notice - State changes -This is not legal advice. Learn more about repository licenses. -@jph00 -jph00 Initial commit -Latest commit ff0dff1 on 23 Nov 2019 - History - 1 contributor - 201 lines (169 sloc) 11.1 KB - - Apache License + Apache License Version 2.0, January 2004 http://www.apache.org/licenses/ From 84dec97879cc45777f1fd23954bc3a39229fae8b Mon Sep 17 00:00:00 2001 From: Rafaelle AYGALENQ <rafaelle.aygalenq@artefact.com> Date: Mon, 10 May 2021 11:40:03 +0200 Subject: [PATCH 491/496] add credits --- README.md | 16 +++++++++++ nlpretext/_config/constants.py | 1 + nlpretext/basic/preprocess.py | 50 ++++++++++++++++++++++++++++++++++ 3 files changed, 67 insertions(+) diff --git a/README.md b/README.md index 4ec57a9..5e389b8 100644 --- a/README.md +++ b/README.md @@ -183,3 +183,19 @@ You can now open the file index.html located in the build folder. ├── requirements.txt <- The requirements file for reproducing the analysis environment, e.g. │ generated with `pip freeze > requirements.txt` └── pylintrc <- The linting configuration file + + +# Credits + +- [textacy](https://github.com/chartbeat-labs/textacy) for the following basic preprocessing functions: + - `fix_bad_unicode` + - `normalize_whitespace` + - `unpack_english_contractions` + - `replace_urls` + - `replace_emails` + - `replace_numbers` + - `replace_currency_symbols` + - `remove_punct` + - `remove_accents` + - `replace_phone_numbers` *(with some modifications of our own)* + diff --git a/nlpretext/_config/constants.py b/nlpretext/_config/constants.py index d7c4b20..218cc17 100644 --- a/nlpretext/_config/constants.py +++ b/nlpretext/_config/constants.py @@ -15,6 +15,7 @@ # limitations under the License """ Collection of regular expressions and other (small, generally useful) constants. +Credits to textacy for some of them: https://github.com/chartbeat-labs/textacy """ from __future__ import unicode_literals diff --git a/nlpretext/basic/preprocess.py b/nlpretext/basic/preprocess.py index f7eedf2..3aa942a 100644 --- a/nlpretext/basic/preprocess.py +++ b/nlpretext/basic/preprocess.py @@ -28,6 +28,11 @@ def normalize_whitespace(text) -> str: """ + ---- + Copyright 2016 Chartbeat, Inc. + Code from textacy: https://github.com/chartbeat-labs/textacy + ---- + Given ``text`` str, replace one or more spacings with a single space, and one or more linebreaks with a single newline. Also strip leading/trailing whitespace. @@ -106,6 +111,11 @@ def remove_eol_characters(text) -> str: def fix_bad_unicode(text, normalization: str = "NFC") -> str: """ + ---- + Copyright 2016 Chartbeat, Inc. + Code from textacy: https://github.com/chartbeat-labs/textacy + ---- + Fix unicode text that's "broken" using `ftfy <http://ftfy.readthedocs.org/>`_; this includes mojibake, HTML entities and other code cruft, @@ -133,6 +143,11 @@ def fix_bad_unicode(text, normalization: str = "NFC") -> str: def unpack_english_contractions(text) -> str: """ + ---- + Copyright 2016 Chartbeat, Inc. + Code from textacy: https://github.com/chartbeat-labs/textacy + ---- + Replace *English* contractions in ``text`` str with their unshortened forms. N.B. The "'d" and "'s" forms are ambiguous (had/would, is/has/possessive), @@ -173,6 +188,11 @@ def unpack_english_contractions(text) -> str: def replace_urls(text, replace_with: str = "*URL*") -> str: """ + ---- + Copyright 2016 Chartbeat, Inc. + Code from textacy: https://github.com/chartbeat-labs/textacy + ---- + Replace all URLs in ``text`` str with ``replace_with`` str. Parameters @@ -193,6 +213,11 @@ def replace_urls(text, replace_with: str = "*URL*") -> str: def replace_emails(text, replace_with="*EMAIL*") -> str: """ + ---- + Copyright 2016 Chartbeat, Inc. + Code from textacy: https://github.com/chartbeat-labs/textacy + ---- + Replace all emails in ``text`` str with ``replace_with`` str Parameters @@ -213,6 +238,11 @@ def replace_phone_numbers(text, country_to_detect: list, replace_with: str = "*PHONE*", method: str = "regex") -> str: """ + ---- + Copyright 2016 Chartbeat, Inc. + Inspired code from textacy: https://github.com/chartbeat-labs/textacy + ---- + Replace all phone numbers in ``text`` str with ``replace_with`` str Parameters @@ -249,6 +279,11 @@ def replace_phone_numbers(text, country_to_detect: list, def replace_numbers(text, replace_with="*NUMBER*") -> str: """ + ---- + Copyright 2016 Chartbeat, Inc. + Code from textacy: https://github.com/chartbeat-labs/textacy + ---- + Replace all numbers in ``text`` str with ``replace_with`` str. Parameters @@ -267,6 +302,11 @@ def replace_numbers(text, replace_with="*NUMBER*") -> str: def replace_currency_symbols(text, replace_with=None) -> str: """ + ---- + Copyright 2016 Chartbeat, Inc. + Code from textacy: https://github.com/chartbeat-labs/textacy + ---- + Replace all currency symbols in ``text`` str with string specified by ``replace_with`` str. @@ -294,6 +334,11 @@ def replace_currency_symbols(text, replace_with=None) -> str: def remove_punct(text, marks=None) -> str: """ + ---- + Copyright 2016 Chartbeat, Inc. + Code from textacy: https://github.com/chartbeat-labs/textacy + ---- + Remove punctuation from ``text`` by replacing all instances of ``marks`` with whitespace. @@ -327,6 +372,11 @@ def remove_punct(text, marks=None) -> str: def remove_accents(text, method: str = "unicode") -> str: """ + ---- + Copyright 2016 Chartbeat, Inc. + Code from textacy: https://github.com/chartbeat-labs/textacy + ---- + Remove accents from any accented unicode characters in ``text`` str, either by transforming them into ascii equivalents or removing them entirely. From aaea0e0610979500f4b84f1d449cdb45d0844196 Mon Sep 17 00:00:00 2001 From: Rafaelle AYGALENQ <rafaelle.aygalenq@artefact.com> Date: Mon, 10 May 2021 11:40:18 +0200 Subject: [PATCH 492/496] clean test --- tests/test_preprocessor.py | 49 ++++++++++++++++++-------------------- 1 file changed, 23 insertions(+), 26 deletions(-) diff --git a/tests/test_preprocessor.py b/tests/test_preprocessor.py index a11ba16..1003001 100644 --- a/tests/test_preprocessor.py +++ b/tests/test_preprocessor.py @@ -249,7 +249,6 @@ def test_remove_accents(): ('proportienelle', 'proportienelle'), ('Pour plus de démocratie participative', 'Pour plus de démocratie participative'), ('Transparence de la vie public', 'Transparence de la vie public'), - ('18 mois de trop....ca suffit macron', '18 mois de trop....ca suffit macron'), ('Egalité devant les infractions routières', 'Egalité devant les infractions routières')],) def test_fix_bad_unicode(input_str, expected_str): result = fix_bad_unicode(input_str) @@ -287,14 +286,14 @@ def test_unpack_english_contractions(input_str, expected_str): @pytest.mark.parametrize( "input_str, expected_str", [( - "Wan't to contribute to Nautilus? read https://github.com/artefactory/nautilus-nlp/blob/docs/CONTRIBUTING.md"\ + "Wan't to contribute to NLPretext? read https://github.com/artefactory/NLPretext/blob/master/CONTRIBUTING.md"\ " first", - "Wan't to contribute to Nautilus? read *URL* first"), - ("The ip address of my VM is http://34.76.182.5:8888", "The ip address of my VM is *URL*"), + "Wan't to contribute to NLPretext? read *URL* first"), + ("The ip address of my VM is http://00.00.000.0:8888", "The ip address of my VM is *URL*"), ("If you go to http://internet.org, you will find a website hosted by FB.", "If you go to *URL*, you will find a website hosted by FB."), ("Ishttps://waaaou.com/ available?", 'Is*URL* available?'), - ("mailto:hugo.vasselin@artefact.com", '*URL*')]) + ("mailto:hugo.dupont@artefact.com", '*URL*')]) def test_replace_urls(input_str, expected_str): result = replace_urls(input_str) np.testing.assert_equal(result, expected_str) @@ -303,10 +302,9 @@ def test_replace_urls(input_str, expected_str): @pytest.mark.parametrize( "input_str, expected_str", [ - ("my email:hugo.vasselin@artefact.com", "my email:*EMAIL*"), + ("my email:hugo.dupont@artefact.com", "my email:*EMAIL*"), ("v543143@nwytg.net is a temporary email", "*EMAIL* is a temporary email"), - ("our emails used to be name.surname@artefact.is", "our emails used to be *EMAIL*"), - ("chaudasse_du_13@hotmail.fr,C ton email bb?", '*EMAIL*,C ton email bb?') + ("our emails used to be name.surname@artefact.is", "our emails used to be *EMAIL*") ] ) def test_replace_emails(input_str, expected_str): @@ -317,17 +315,17 @@ def test_replace_emails(input_str, expected_str): @pytest.mark.parametrize( "input_str, expected_str", [ - ("mon 06 bb: 0625093267", "mon 06 bb: *PHONE*"), - ("mon 06 bb: 06.25.09.32.67", "mon 06 bb: *PHONE*"), - ("call me at +33625093267", "call me at *PHONE*"), - ("call me at +33 6 25 09 32 67", "call me at *PHONE*"), - ("call me at +33 625 093 267", "call me at *PHONE*"), + ("mon 06: 0601020304", "mon 06: *PHONE*"), + ("mon 06: 06.01.02.03.04", "mon 06: *PHONE*"), + ("call me at +33601020304", "call me at *PHONE*"), + ("call me at +33 6 01 02 03 04", "call me at *PHONE*"), + ("call me at +33 601 020 304", "call me at *PHONE*"), ("if this unit test doesn't work, call 3615 and says 'ROBIN'", "if this unit test doesn't work, call *PHONE* and says 'ROBIN'"), - ('(541) 754-3010 is a US. Phone', '*PHONE* is a US. Phone'), - ('+1-541-754-3010 is an international Phone', '*PHONE* is an international Phone'), - ('+1-541-754-3010 Dialed in the US', '*PHONE* Dialed in the US'), - ('+1-541-754-3010 Dialed from Germany', '*PHONE* Dialed from Germany') + ('(541) 754-0000 is a US. Phone', '*PHONE* is a US. Phone'), + ('+1-541-754-0000 is an international Phone', '*PHONE* is an international Phone'), + ('+1-541-754-0000 Dialed in the US', '*PHONE* Dialed in the US'), + ('+1-541-754-0000 Dialed from Germany', '*PHONE* Dialed from Germany') ] ) def test_replace_phone_numbers(input_str, expected_str): @@ -343,9 +341,8 @@ def test_replace_phone_numbers(input_str, expected_str): "input_str, expected_str", [ ("123, 3 petits chats", "*NUMBER*, *NUMBER* petits chats"), - ("l0ve 2 twa <3", "l0ve *NUMBER* twa <*NUMBER*"), ("Give me 45bucks!", "Give me *NUMBER*bucks!"), - ("call me at +33625093267", "call me at *NUMBER*") + ("call me at +33601020304", "call me at *NUMBER*") ] ) def test_replace_numbers(input_str, expected_str): @@ -384,9 +381,9 @@ def test_replace_currency_symbols(input_str, param, expected_str): ("Seriously.,.", '.,;', "Seriously "), ("Seriously...", '.,;', "Seriously "), ("Seriously.!.", '.,;', "Seriously ! "), - ("hugo.vasselin@artefact.com", '.,;', "hugo vasselin@artefact com"), - ("hugo.vasselin@artefact.com", None, "hugo vasselin artefact com"), - ("hugo-vasselin@artefact.com", None, "hugo vasselin artefact com") + ("hugo.dupont@artefact.com", '.,;', "hugo dupont@artefact com"), + ("hugo.dupont@artefact.com", None, "hugo dupont artefact com"), + ("hugo-dupont@artefact.com", None, "hugo dupont artefact com") ] ) def test_remove_punct(input_str, param, expected_str): @@ -401,10 +398,10 @@ def test_remove_punct(input_str, param, expected_str): ("🎅🏿⌚", ""), ("🥖✊💦", ""), ("✊", ""), - ("J'espère que les 🚓 vont pas lire ce test", - "J'espère que les vont pas lire ce test"), - ("J'espère que les vont pas lire ce test🚓", - "J'espère que les vont pas lire ce test") + ("J'espère que les 🚓 vont bien", + "J'espère que les vont bien"), + ("J'espère que les vont bien🚓", + "J'espère que les vont bien") ] ) def test_remove_emoji(input_str, expected_str): From 4a470f99efddf2e447ffefcd38226d1b82327390 Mon Sep 17 00:00:00 2001 From: Rafaelle AYGALENQ <rafaelle.aygalenq@artefact.com> Date: Mon, 10 May 2021 11:45:10 +0200 Subject: [PATCH 493/496] fix test replace url --- tests/test_preprocessor.py | 1 - 1 file changed, 1 deletion(-) diff --git a/tests/test_preprocessor.py b/tests/test_preprocessor.py index 1003001..7e1e5a3 100644 --- a/tests/test_preprocessor.py +++ b/tests/test_preprocessor.py @@ -289,7 +289,6 @@ def test_unpack_english_contractions(input_str, expected_str): "Wan't to contribute to NLPretext? read https://github.com/artefactory/NLPretext/blob/master/CONTRIBUTING.md"\ " first", "Wan't to contribute to NLPretext? read *URL* first"), - ("The ip address of my VM is http://00.00.000.0:8888", "The ip address of my VM is *URL*"), ("If you go to http://internet.org, you will find a website hosted by FB.", "If you go to *URL*, you will find a website hosted by FB."), ("Ishttps://waaaou.com/ available?", 'Is*URL* available?'), From 7545f26d250da0996f128f4ba407b34706ef78b0 Mon Sep 17 00:00:00 2001 From: hugovasselin <waaaouu@gmail.com> Date: Mon, 10 May 2021 12:18:34 +0200 Subject: [PATCH 494/496] fix: englify tests --- tests/test_preprocessor.py | 36 +++++++++++++++++------------------- 1 file changed, 17 insertions(+), 19 deletions(-) diff --git a/tests/test_preprocessor.py b/tests/test_preprocessor.py index 7e1e5a3..3909113 100644 --- a/tests/test_preprocessor.py +++ b/tests/test_preprocessor.py @@ -190,7 +190,7 @@ def test_get_stopwords(): @pytest.mark.parametrize( "input_tokens, lang, expected_output", [ - (['I', 'like', 'when', 'you', 'move', 'your', 'body', '!'], "en", ['I', 'move', 'body', '!']) + (['I', 'like', 'this', 'song', 'very', 'much', '!'], "en", ['I', 'song', '!']) ], ) def test_remove_stopwords_tokens(input_tokens, lang, expected_output): @@ -201,7 +201,7 @@ def test_remove_stopwords_tokens(input_tokens, lang, expected_output): @pytest.mark.parametrize( "input_text, lang, expected_output", [ - ('I like when you move your body !', 'en', 'I move body !'), + ('I like this song very much !', 'en', 'I song !'), ('Can I get a beer?', 'en', 'Can I beer ?'), ('Je vous recommande ce film !', 'fr', 'Je recommande film !'), ('je vous recommande ce film !', 'fr', 'recommande film !'), @@ -216,7 +216,7 @@ def test_remove_stopwords_text(input_text, lang, expected_output): @pytest.mark.parametrize( "input_text, lang, custom_stopwords, expected_output", [ - ('I like when you move your body !', 'en', ['body'], 'I move !'), + ('I like this song very much !', 'en', ['song'], 'I !'), ('Je vous recommande ce film la scène de fin est géniale !', 'fr', ['film', 'scène'], 'Je recommande fin géniale !'), ], @@ -291,8 +291,8 @@ def test_unpack_english_contractions(input_str, expected_str): "Wan't to contribute to NLPretext? read *URL* first"), ("If you go to http://internet.org, you will find a website hosted by FB.", "If you go to *URL*, you will find a website hosted by FB."), - ("Ishttps://waaaou.com/ available?", 'Is*URL* available?'), - ("mailto:hugo.dupont@artefact.com", '*URL*')]) + ("Ishttps://internet.org/ available?", 'Is*URL* available?'), + ("mailto:john.doe@artefact.com", '*URL*')]) def test_replace_urls(input_str, expected_str): result = replace_urls(input_str) np.testing.assert_equal(result, expected_str) @@ -301,7 +301,7 @@ def test_replace_urls(input_str, expected_str): @pytest.mark.parametrize( "input_str, expected_str", [ - ("my email:hugo.dupont@artefact.com", "my email:*EMAIL*"), + ("my email:john.doe@artefact.com", "my email:*EMAIL*"), ("v543143@nwytg.net is a temporary email", "*EMAIL* is a temporary email"), ("our emails used to be name.surname@artefact.is", "our emails used to be *EMAIL*") ] @@ -319,8 +319,8 @@ def test_replace_emails(input_str, expected_str): ("call me at +33601020304", "call me at *PHONE*"), ("call me at +33 6 01 02 03 04", "call me at *PHONE*"), ("call me at +33 601 020 304", "call me at *PHONE*"), - ("if this unit test doesn't work, call 3615 and says 'ROBIN'", - "if this unit test doesn't work, call *PHONE* and says 'ROBIN'"), + ("if this unit test doesn't work, call 3615 and says 'HELP'", + "if this unit test doesn't work, call *PHONE* and says 'HELP'"), ('(541) 754-0000 is a US. Phone', '*PHONE* is a US. Phone'), ('+1-541-754-0000 is an international Phone', '*PHONE* is an international Phone'), ('+1-541-754-0000 Dialed in the US', '*PHONE* Dialed in the US'), @@ -380,9 +380,9 @@ def test_replace_currency_symbols(input_str, param, expected_str): ("Seriously.,.", '.,;', "Seriously "), ("Seriously...", '.,;', "Seriously "), ("Seriously.!.", '.,;', "Seriously ! "), - ("hugo.dupont@artefact.com", '.,;', "hugo dupont@artefact com"), - ("hugo.dupont@artefact.com", None, "hugo dupont artefact com"), - ("hugo-dupont@artefact.com", None, "hugo dupont artefact com") + ("john.doe@artefact.com", '.,;', "john doe@artefact com"), + ("john.doe@artefact.com", None, "john doe artefact com"), + ("john-doe@artefact.com", None, "john doe artefact com") ] ) def test_remove_punct(input_str, param, expected_str): @@ -393,14 +393,12 @@ def test_remove_punct(input_str, param, expected_str): @pytest.mark.parametrize( "input_str, expected_str", [ - ("👉👌", ""), + ("⚽️👌", ""), ("🎅🏿⌚", ""), - ("🥖✊💦", ""), + ("🥖🍷🇫🇷", ""), ("✊", ""), - ("J'espère que les 🚓 vont bien", - "J'espère que les vont bien"), - ("J'espère que les vont bien🚓", - "J'espère que les vont bien") + ("Save 🐼 and 🐟", + "Save and "), ] ) def test_remove_emoji(input_str, expected_str): @@ -411,9 +409,9 @@ def test_remove_emoji(input_str, expected_str): @pytest.mark.parametrize( "input_str, expected_str", [ - ("👉👌", ":backhand_index_pointing_right::OK_hand:"), + ("⚽️👌", ":soccer_ball::OK_hand:"), ("🎅🏿⌚", ":Santa_Claus_dark_skin_tone::watch:"), - ("🥖✊💦", ":baguette_bread::raised_fist::sweat_droplets:"), + ("🥖🍷🇫🇷", ":baguette_bread::wine_glass::France:"), ("✊", ":raised_fist:") ] ) From 4ca5127453f87910391b039ea2940e861b967a83 Mon Sep 17 00:00:00 2001 From: hugovasselin <waaaouu@gmail.com> Date: Mon, 10 May 2021 12:30:27 +0200 Subject: [PATCH 495/496] fix: emoji test --- tests/test_preprocessor.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/tests/test_preprocessor.py b/tests/test_preprocessor.py index 3909113..6c9db84 100644 --- a/tests/test_preprocessor.py +++ b/tests/test_preprocessor.py @@ -393,7 +393,7 @@ def test_remove_punct(input_str, param, expected_str): @pytest.mark.parametrize( "input_str, expected_str", [ - ("⚽️👌", ""), + ("⚽👌", ""), ("🎅🏿⌚", ""), ("🥖🍷🇫🇷", ""), ("✊", ""), @@ -403,7 +403,8 @@ def test_remove_punct(input_str, param, expected_str): ) def test_remove_emoji(input_str, expected_str): result = remove_emoji(input_str) - np.testing.assert_equal(result, expected_str) + assert len(result) == len(expected_str) + assert result == expected_str @pytest.mark.parametrize( From 45f00dc8976c34eb40bfe9890759cc68d4e0e486 Mon Sep 17 00:00:00 2001 From: hugovasselin <waaaouu@gmail.com> Date: Mon, 10 May 2021 12:35:38 +0200 Subject: [PATCH 496/496] fix: update version number --- VERSION | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/VERSION b/VERSION index 6d7de6e..21e8796 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -1.0.2 +1.0.3