From 494dd80838f2e8392fe8c7341796cd654ba083a1 Mon Sep 17 00:00:00 2001 From: Mokhov Andrey Date: Sun, 5 Mar 2023 21:51:24 +0300 Subject: [PATCH] lab03 --- README.md | 9 + labs/OATD_LR3.md | 77 +++ labs/OATD_LR3_metod.ipynb | 218 ++++++ .../notebooks/lec5_text2vec_classifier.ipynb | 627 ++++++++++++++++++ 4 files changed, 931 insertions(+) create mode 100644 labs/OATD_LR3.md create mode 100644 labs/OATD_LR3_metod.ipynb create mode 100644 lections/notebooks/lec5_text2vec_classifier.ipynb diff --git a/README.md b/README.md index 1004668..3bde15d 100644 --- a/README.md +++ b/README.md @@ -37,6 +37,15 @@ ### Лабораторная работа №3 +| Группа | Дата | +| :--- | :---: | +| А-01-19 | 06.03.2023 | +| А-03-19 | 06.03.2023 | + +* [Задание](labs/OATD_LR3.md) +* [Методические указания](labs/OATD_LR3_metod.ipynb) + + ### Лабораторная работа №4 diff --git a/labs/OATD_LR3.md b/labs/OATD_LR3.md new file mode 100644 index 0000000..44982bf --- /dev/null +++ b/labs/OATD_LR3.md @@ -0,0 +1,77 @@ +# Лабораторная работа №3. Классификация текстовых данных + +## Цель работы + +Получить практические навыки решения задачи классификации текстовых данных в среде Jupiter Notebook. +Научиться проводить предварительную обработку текстовых данных, настраивать параметры методов классификации и обучать модели, оценивать точность полученных моделей + +## Задание + +1. Загрузить выборки по варианту из лабораторной работы №2. Стемминг проводить не нужно. +2. Используя GridSearchCV произвести предварительную обработку данных и настройку методов классификации в соответствие с заданием, +вывести оптимальные значения параметров и результаты классификации модели (полнота, точность, f1-мера и аккуратности) с данными параметрами. +3. Перевести выборку к векторному представлению word embedding согласно варианту. +4. Провести обучение и настройку тех же алгоритмов классификации и с теми же параметрами, что и в п.2, но на векторизованной выборке +5. По каждому пункту работы занести в отчет программный код и результат вывода. +6. Оформить сравнительную таблицу с результатами классификации различными методами с разными настройками. +Сделать выводы о наиболее подходящем методе классификации ваших данных с указанием параметров метода и описанием предварительной обработки данных. + + + +## Варианты заданий + +| Вариант | Метод | Word embedding | +| :--- | :---: | :--- | +| 1 | KNN, SVM | glove-wiki-gigaword-100 | +| 2 | RF, MNB | glove-wiki-gigaword-50 +| 3 | KNN, DT | glove-wiki-gigaword-200 | +| 4 | RF, KNN | glove-wiki-gigaword-25 | +| 5 | LR, MNB | word2vec-google-news-300 | +| 6 | DT, LR | glove-wiki-gigaword-200 | +| 7 | RF, SVM | glove-wiki-gigaword-100 | +| 8 | SVM, DT | glove-wiki-gigaword-50 | +| 9 | RF, SVM | glove-wiki-gigaword-200 | +| 10 | MNB, SVM | glove-wiki-gigaword-25 | +| 11 | MNB, DT | word2vec-google-news-300 | +| 12 | RF, LR | glove-wiki-gigaword-200 | + +## Параметры, которые необходимо настроить + +Помимо параметров предварительной обработки, таких как: взвешивание, отсечение стоп-слов, +количество информативных терминов, для каждого метода классификации необходимо настроить следующие параметры: +*К-ближайших соседей (KNN): * +• количество ближайших соседей, +• метрика (евклидова, косинусная) + +*Дерево решений (DT): * +• критерий (параметр criterion: ‘gini’, ‘entropy’), +• глубина дерева (параметр max_depth: {5, 15, 50, 100}). + +*Случайный лес (RF): * +• количество деревьев решений, +• критерий (параметр criterion: ‘gini’, ‘entropy’), +• глубина дерева (5, 15, 50, 100). + +*Логистическая регрессия (LR): * +• метод нахождения экстремума (параметр solver: ‘newton-cg’, ‘lbfgs’, ‘sag’, ‘liblinear’), +• регуляризация (параметр penalty: ‘L1’, ‘L2’) +Обратить внимание, что разные виды регуляризации работают с разными методами нахождения экстремума. + +*Метод опорных векторов (SVM): * +• функция потерь (параметр loss: ‘hinge’, ‘squared_hinge’), +• регуляризация (параметр penalty: ‘L1’, ‘L2’) +Обратить внимание, что разные виды регуляризации работают с разными функциями потерь + +*Мультиномиальный Наивный Байесовский метод (MNB) * +• параметр сглаживания α (параметр alpha {0.1, 1, 2} + +## Контрольные вопросы + +1. Алгоритм и особенности метода опорных векторов. +2. Алгоритм и особенности метода логистической регрессии. +3. Алгоритм и особенности метода деревьев решений. +4. Что такое регуляризация? +5. Что такое метрика расстояния? Какие метрики вам известны? + + + diff --git a/labs/OATD_LR3_metod.ipynb b/labs/OATD_LR3_metod.ipynb new file mode 100644 index 0000000..cb4a6de --- /dev/null +++ b/labs/OATD_LR3_metod.ipynb @@ -0,0 +1,218 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# \tМетодические указания к лабораторной работе №3\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "В данной работе мы продолжаем работать с библиотекой scikit-learn \n", + "(http://scikit-learn.org), и хотим выяснить ее возможности при работе с текстовыми документами.\n", + "\n", + "Ниже приведены новые модули, которые будут использованы в данной работе:\n", + "\n", + "GridSearchCV - http://scikit-learn.org/stable/modules/generated/sklearn.model_selection.GridSearchCV.html - полный перебор по сетке заданных значений параметров для классификации \n", + "\n", + "Decision Tree - http://scikit-learn.org/stable/modules/generated/sklearn.tree.DecisionTreeClassifier.html#sklearn.tree.DecisionTreeClassifier – Метод деревьев решений\n", + "\n", + "MultinominalNB - http://scikit-learn.org/stable/modules/generated/sklearn.naive_bayes.MultinomialNB.html - Полиномиальный (Мультиномиальный) Наивный Байесовский метод – разновидность Наивного Байесовского метода, которая хорошо работает с текстами, длины которых сильно варьируются.\n", + "\n", + "LogisticRegression - http://scikit-learn.org/stable/modules/generated/sklearn.linear_model.LogisticRegression.html - Логистическая регрессия\n", + " " + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Импорт библиотек" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": {}, + "outputs": [], + "source": [ + "from sklearn.neighbors import KNeighborsClassifier\n", + "from sklearn.datasets import fetch_20newsgroups\n", + "from sklearn.feature_extraction.text import CountVectorizer, TfidfTransformer \n", + "import numpy as np\n", + "from sklearn.pipeline import Pipeline\n", + "from sklearn.model_selection import GridSearchCV" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Настройка параметров с использованием grid search" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "С помощью конвейерной обработки (`pipelines`), рассмотренной в лабораторной работе №2, стало гораздо проще указывать параметры обучения модели, однако перебирать все возможные варианты вручную даже в нашем простом случае выйдет затратно. В случае, рассмотренном в лабораторной работе №2, имеется четыре настраиваемых параметра: `max_features`, `stop_words`, `use_idf` и `n_neighbors`:" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [], + "source": [ + "text_clf = Pipeline([('vect', CountVectorizer(max_features= 1000, stop_words = 'english')),\n", + " ('tfidf', TfidfTransformer(use_idf = True)),\n", + " ('clf', KNeighborsClassifier (n_neighbors=1)),]) \n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Вместо поиска лучших параметров в конвейере вручную, можно запустить поиск (методом полного перебора) лучших параметров в сетке возможных значений. Сделать это можно с помощью объекта класса GridSearchCV.\n", + " \n", + "Для того чтобы задать сетку параметров необходимо создать переменную-словарь, ключами которого являются конструкции вида: «НазваниеШагаКонвейера__НазваниеПараметра», а значениями – кортеж из значений параметра\n" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": {}, + "outputs": [], + "source": [ + "parameters = {'vect__max_features': (100,500,1000,5000,10000),\n", + " 'vect__stop_words': ('english', None),\n", + " 'tfidf__use_idf': (True, False), \n", + " 'clf__n_neighbors': (1,3,5,7)} " + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Далее необходимо создать объект класса `GridSearchCV`, передав в него объект `pipeline` или классификатор, список параметров сетки, а также при необходимости, задав прочие параметры, такие так количество задействованых ядер процессора `n_jobs`, количество фолдов кросс-валидации `cv` и другие" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": {}, + "outputs": [], + "source": [ + "gs_clf = GridSearchCV(text_clf, parameters, n_jobs=-1, cv=3)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Теперь объект `gs_clf` можно обучить по всем параметрам, как обычный классификатор, методом `fit()`.\n", + "После того как прошло обучение, узнать лучшую совокупность параметров можно, обратившись к атрибуту `best_params_`. Для необученной модели атрибуты будут отсутствовать.\n" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "metadata": { + "collapsed": true + }, + "outputs": [ + { + "ename": "AttributeError", + "evalue": "'GridSearchCV' object has no attribute 'best_params_'", + "output_type": "error", + "traceback": [ + "\u001b[1;31m---------------------------------------------------------------------------\u001b[0m", + "\u001b[1;31mAttributeError\u001b[0m Traceback (most recent call last)", + "Cell \u001b[1;32mIn[11], line 1\u001b[0m\n\u001b[1;32m----> 1\u001b[0m \u001b[43mgs_clf\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mbest_params_\u001b[49m()\n", + "\u001b[1;31mAttributeError\u001b[0m: 'GridSearchCV' object has no attribute 'best_params_'" + ] + } + ], + "source": [ + "gs_clf.best_params_" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Аккуратность классификации – обратившись к параметру `best_score_`:" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "metadata": { + "collapsed": true + }, + "outputs": [ + { + "ename": "AttributeError", + "evalue": "'GridSearchCV' object has no attribute 'best_score_'", + "output_type": "error", + "traceback": [ + "\u001b[1;31m---------------------------------------------------------------------------\u001b[0m", + "\u001b[1;31mAttributeError\u001b[0m Traceback (most recent call last)", + "Cell \u001b[1;32mIn[12], line 1\u001b[0m\n\u001b[1;32m----> 1\u001b[0m \u001b[43mgs_clf\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mbest_score_\u001b[49m\n", + "\u001b[1;31mAttributeError\u001b[0m: 'GridSearchCV' object has no attribute 'best_score_'" + ] + } + ], + "source": [ + "gs_clf.best_score_" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "А результаты по всей сетке параметров - `cv_results_`" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "gs_clf.cv_results_" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Для векторного представления выборки с помощью готовых моделей " + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.9.13" + } + }, + "nbformat": 4, + "nbformat_minor": 4 +} diff --git a/lections/notebooks/lec5_text2vec_classifier.ipynb b/lections/notebooks/lec5_text2vec_classifier.ipynb new file mode 100644 index 0000000..8d2999f --- /dev/null +++ b/lections/notebooks/lec5_text2vec_classifier.ipynb @@ -0,0 +1,627 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 4, + "id": "3dda6a69", + "metadata": {}, + "outputs": [], + "source": [ + "from sklearn.neighbors import KNeighborsClassifier\n", + "from sklearn.datasets import fetch_20newsgroups\n", + "from sklearn.feature_extraction.text import CountVectorizer, TfidfTransformer \n", + "import numpy as np\n", + "import pandas as pd\n", + "from sklearn.metrics import confusion_matrix, classification_report, accuracy_score, roc_auc_score\n", + "from sklearn.pipeline import Pipeline" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "id": "7fd6636b", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "['fasttext-wiki-news-subwords-300', 'conceptnet-numberbatch-17-06-300', 'word2vec-ruscorpora-300', 'word2vec-google-news-300', 'glove-wiki-gigaword-50', 'glove-wiki-gigaword-100', 'glove-wiki-gigaword-200', 'glove-wiki-gigaword-300', 'glove-twitter-25', 'glove-twitter-50', 'glove-twitter-100', 'glove-twitter-200', '__testing_word2vec-matrix-synopsis']\n" + ] + } + ], + "source": [ + "import gensim.downloader\n", + "print(list(gensim.downloader.info()['models'].keys()))" + ] + }, + { + "cell_type": "markdown", + "id": "3f93b5f6", + "metadata": {}, + "source": [ + "# GloVe" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "id": "be870586", + "metadata": {}, + "outputs": [], + "source": [ + "glove_model = gensim.downloader.load(\"glove-twitter-25\") # load glove vectors\n" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "id": "599d6406", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[-0.96419 -0.60978 0.67449 0.35113 0.41317 -0.21241 1.3796\n", + " 0.12854 0.31567 0.66325 0.3391 -0.18934 -3.325 -1.1491\n", + " -0.4129 0.2195 0.8706 -0.50616 -0.12781 -0.066965 0.065761\n", + " 0.43927 0.1758 -0.56058 0.13529 ]\n" + ] + }, + { + "data": { + "text/plain": [ + "[('dog', 0.9590820074081421),\n", + " ('monkey', 0.920357882976532),\n", + " ('bear', 0.9143136739730835),\n", + " ('pet', 0.9108031392097473),\n", + " ('girl', 0.8880629539489746),\n", + " ('horse', 0.8872726559638977),\n", + " ('kitty', 0.8870542049407959),\n", + " ('puppy', 0.886769711971283),\n", + " ('hot', 0.886525571346283),\n", + " ('lady', 0.8845519423484802)]" + ] + }, + "execution_count": 7, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "print(glove_model['cat']) # word embedding for 'cat'\n", + "glove_model.most_similar(\"cat\") # show words that similar to word 'cat'" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "id": "2db71cfb", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "0.60927683" + ] + }, + "execution_count": 8, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "glove_model.similarity('cat', 'bus')" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "id": "7788acf5", + "metadata": {}, + "outputs": [], + "source": [ + "categories = ['alt.atheism', 'comp.graphics', 'sci.space'] \n", + "remove = ('headers', 'footers', 'quotes')\n", + "twenty_train = fetch_20newsgroups(subset='train', shuffle=True, random_state=42, categories = categories, remove = remove )\n", + "twenty_test = fetch_20newsgroups(subset='test', shuffle=True, random_state=42, categories = categories, remove = remove )\n" + ] + }, + { + "cell_type": "markdown", + "id": "79dd1ac1", + "metadata": {}, + "source": [ + "# Векторизуем обучающую выборку\n", + "Получаем матрицу \"Документ-термин\"" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "id": "0565dd1a", + "metadata": {}, + "outputs": [], + "source": [ + "vectorizer = CountVectorizer(stop_words='english')" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "id": "a681a1d6", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "(1657, 23297)\n" + ] + }, + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
00000000000000000000000005102000000062david42000100255pixel000410320004136...zurbrinzurichzuszvizwaartepuntenzwakzwakkezwarezwartezyxel
00000000000...0000000000
10000000000...0000000000
20000000000...0000000000
30000000000...0000000000
40000000000...0000000000
\n", + "

5 rows × 23297 columns

\n", + "
" + ], + "text/plain": [ + " 00 000 0000 00000 000000 000005102000 000062david42 000100255pixel \\\n", + "0 0 0 0 0 0 0 0 0 \n", + "1 0 0 0 0 0 0 0 0 \n", + "2 0 0 0 0 0 0 0 0 \n", + "3 0 0 0 0 0 0 0 0 \n", + "4 0 0 0 0 0 0 0 0 \n", + "\n", + " 00041032 0004136 ... zurbrin zurich zus zvi zwaartepunten zwak \\\n", + "0 0 0 ... 0 0 0 0 0 0 \n", + "1 0 0 ... 0 0 0 0 0 0 \n", + "2 0 0 ... 0 0 0 0 0 0 \n", + "3 0 0 ... 0 0 0 0 0 0 \n", + "4 0 0 ... 0 0 0 0 0 0 \n", + "\n", + " zwakke zware zwarte zyxel \n", + "0 0 0 0 0 \n", + "1 0 0 0 0 \n", + "2 0 0 0 0 \n", + "3 0 0 0 0 \n", + "4 0 0 0 0 \n", + "\n", + "[5 rows x 23297 columns]" + ] + }, + "execution_count": 11, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "train_data = vectorizer.fit_transform(twenty_train['data'])\n", + "CV_data=pd.DataFrame(train_data.toarray(), columns=vectorizer.get_feature_names_out())\n", + "print(CV_data.shape)\n", + "CV_data.head()" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "id": "b20aef46", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Index(['00', '000', '0000', '00000', '000000', '000005102000', '000062david42',\n", + " '000100255pixel', '00041032', '0004136'],\n", + " dtype='object')\n" + ] + } + ], + "source": [ + "# Создадим список слов, присутствующих в словаре.\n", + "words_vocab=CV_data.columns\n", + "print(words_vocab[0:10])" + ] + }, + { + "cell_type": "markdown", + "id": "d1893e86", + "metadata": {}, + "source": [ + "## Векторизуем с помощью GloVe\n", + "\n", + "Нужно для каждого документа сложить glove-вектора слов, из которых он состоит.\n", + "В результате получим вектор документа как сумму векторов слов, из него состоящих" + ] + }, + { + "cell_type": "markdown", + "id": "bc36b98d", + "metadata": {}, + "source": [ + "### Посмотрим на примере как будет работать векторизация" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "0d6af65a", + "metadata": {}, + "outputs": [], + "source": [ + "text_data = ['Hello world I love python', 'This is a great computer game! 00 000 zyxel']\n", + "# Векторизуем с помощью обученного CountVectorizer\n", + "X = vectorizer.transform(text_data)\n", + "CV_text_data=pd.DataFrame(X.toarray(), columns=vectorizer.get_feature_names_out())\n", + "CV_text_data\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "11dda58a", + "metadata": {}, + "outputs": [], + "source": [ + "# Создадим датафрейм, в который будем сохранять вектор документа\n", + "glove_data=pd.DataFrame()\n", + "\n", + "# Пробегаем по каждой строке (по каждому документу)\n", + "for i in range(CV_text_data.shape[0]):\n", + " \n", + " # Вектор одного документа с размерностью glove-модели:\n", + " one_doc = np.zeros(25) \n", + " \n", + " # Пробегаемся по каждому документу, смотрим, какие слова документа присутствуют в нашем словаре\n", + " # Суммируем glove-вектора каждого известного слова в one_doc\n", + " for word in words_vocab[CV_text_data.iloc[i,:] >= 1]:\n", + " if word in glove_model.key_to_index.keys(): \n", + " print(word, ': ', glove_model[word])\n", + " one_doc += glove_model[word]\n", + " print(text_data[i], ': ', one_doc)\n", + " glove_data=glove_data.append(pd.DataFrame([one_doc])) \n", + "print('glove_data: ', glove_data)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "ff68d8dc", + "metadata": {}, + "outputs": [], + "source": [ + "def text2vec(text_data):\n", + " \n", + " # Векторизуем с помощью обученного CountVectorizer\n", + " X = vectorizer.transform(text_data)\n", + " CV_text_data=pd.DataFrame(X.toarray(), columns=vectorizer.get_feature_names_out())\n", + " CV_text_data\n", + " # Создадим датафрейм, в который будем сохранять вектор документа\n", + " glove_data=pd.DataFrame()\n", + "\n", + " # Пробегаем по каждой строке (по каждому документу)\n", + " for i in range(CV_text_data.shape[0]):\n", + "\n", + " # Вектор одного документа с размерностью glove-модели:\n", + " one_doc = np.zeros(25) \n", + "\n", + " # Пробегаемся по каждому документу, смотрим, какие слова документа присутствуют в нашем словаре\n", + " # Суммируем glove-вектора каждого известного слова в one_doc\n", + " for word in words_vocab[CV_text_data.iloc[i,:] >= 1]:\n", + " if word in glove_model.key_to_index.keys(): \n", + " #print(word, ': ', glove_model[word])\n", + " one_doc += glove_model[word]\n", + " #print(text_data[i], ': ', one_doc)\n", + " glove_data = pd.concat([glove_data, pd.DataFrame([one_doc])], axis = 0)\n", + " #print('glove_data: ', glove_data)\n", + " return glove_data" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "b778776c", + "metadata": {}, + "outputs": [], + "source": [ + "\n", + "glove_data\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "cb6edbdf", + "metadata": {}, + "outputs": [], + "source": [ + "one_doc" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "1bdb459e", + "metadata": {}, + "outputs": [], + "source": [ + "train_data_glove = text2vec(twenty_train['data']);\n", + "train_data_glove" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "3a7ea7c6", + "metadata": {}, + "outputs": [], + "source": [ + "train_data\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "5ac20e79", + "metadata": {}, + "outputs": [], + "source": [ + "clf = KNeighborsClassifier(n_neighbors = 5)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "08164a25", + "metadata": {}, + "outputs": [], + "source": [ + "clf.fit(train_data_glove, twenty_train['target'])" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "e459faaf", + "metadata": {}, + "outputs": [], + "source": [ + "test_data_glove = text2vec(twenty_test['data']);" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "d8144e75", + "metadata": {}, + "outputs": [], + "source": [ + "test_data_glove" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "a69830f0", + "metadata": {}, + "outputs": [], + "source": [ + "predict = clf.predict(test_data_glove )" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "9ac5cf20", + "metadata": {}, + "outputs": [], + "source": [ + "print (confusion_matrix(twenty_test['target'], predict))\n", + "print(classification_report(twenty_test['target'], predict))" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "b8cce5a9", + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "1b9bff90", + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.9.13" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +}