lab03
Этот коммит содержится в:
@@ -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
|
||||
|
||||
|
||||
|
||||
77
labs/OATD_LR3.md
Обычный файл
77
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. Что такое метрика расстояния? Какие метрики вам известны?
|
||||
|
||||
|
||||
|
||||
218
labs/OATD_LR3_metod.ipynb
Обычный файл
218
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
|
||||
}
|
||||
627
lections/notebooks/lec5_text2vec_classifier.ipynb
Обычный файл
627
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": [
|
||||
"<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>00</th>\n",
|
||||
" <th>000</th>\n",
|
||||
" <th>0000</th>\n",
|
||||
" <th>00000</th>\n",
|
||||
" <th>000000</th>\n",
|
||||
" <th>000005102000</th>\n",
|
||||
" <th>000062david42</th>\n",
|
||||
" <th>000100255pixel</th>\n",
|
||||
" <th>00041032</th>\n",
|
||||
" <th>0004136</th>\n",
|
||||
" <th>...</th>\n",
|
||||
" <th>zurbrin</th>\n",
|
||||
" <th>zurich</th>\n",
|
||||
" <th>zus</th>\n",
|
||||
" <th>zvi</th>\n",
|
||||
" <th>zwaartepunten</th>\n",
|
||||
" <th>zwak</th>\n",
|
||||
" <th>zwakke</th>\n",
|
||||
" <th>zware</th>\n",
|
||||
" <th>zwarte</th>\n",
|
||||
" <th>zyxel</th>\n",
|
||||
" </tr>\n",
|
||||
" </thead>\n",
|
||||
" <tbody>\n",
|
||||
" <tr>\n",
|
||||
" <th>0</th>\n",
|
||||
" <td>0</td>\n",
|
||||
" <td>0</td>\n",
|
||||
" <td>0</td>\n",
|
||||
" <td>0</td>\n",
|
||||
" <td>0</td>\n",
|
||||
" <td>0</td>\n",
|
||||
" <td>0</td>\n",
|
||||
" <td>0</td>\n",
|
||||
" <td>0</td>\n",
|
||||
" <td>0</td>\n",
|
||||
" <td>...</td>\n",
|
||||
" <td>0</td>\n",
|
||||
" <td>0</td>\n",
|
||||
" <td>0</td>\n",
|
||||
" <td>0</td>\n",
|
||||
" <td>0</td>\n",
|
||||
" <td>0</td>\n",
|
||||
" <td>0</td>\n",
|
||||
" <td>0</td>\n",
|
||||
" <td>0</td>\n",
|
||||
" <td>0</td>\n",
|
||||
" </tr>\n",
|
||||
" <tr>\n",
|
||||
" <th>1</th>\n",
|
||||
" <td>0</td>\n",
|
||||
" <td>0</td>\n",
|
||||
" <td>0</td>\n",
|
||||
" <td>0</td>\n",
|
||||
" <td>0</td>\n",
|
||||
" <td>0</td>\n",
|
||||
" <td>0</td>\n",
|
||||
" <td>0</td>\n",
|
||||
" <td>0</td>\n",
|
||||
" <td>0</td>\n",
|
||||
" <td>...</td>\n",
|
||||
" <td>0</td>\n",
|
||||
" <td>0</td>\n",
|
||||
" <td>0</td>\n",
|
||||
" <td>0</td>\n",
|
||||
" <td>0</td>\n",
|
||||
" <td>0</td>\n",
|
||||
" <td>0</td>\n",
|
||||
" <td>0</td>\n",
|
||||
" <td>0</td>\n",
|
||||
" <td>0</td>\n",
|
||||
" </tr>\n",
|
||||
" <tr>\n",
|
||||
" <th>2</th>\n",
|
||||
" <td>0</td>\n",
|
||||
" <td>0</td>\n",
|
||||
" <td>0</td>\n",
|
||||
" <td>0</td>\n",
|
||||
" <td>0</td>\n",
|
||||
" <td>0</td>\n",
|
||||
" <td>0</td>\n",
|
||||
" <td>0</td>\n",
|
||||
" <td>0</td>\n",
|
||||
" <td>0</td>\n",
|
||||
" <td>...</td>\n",
|
||||
" <td>0</td>\n",
|
||||
" <td>0</td>\n",
|
||||
" <td>0</td>\n",
|
||||
" <td>0</td>\n",
|
||||
" <td>0</td>\n",
|
||||
" <td>0</td>\n",
|
||||
" <td>0</td>\n",
|
||||
" <td>0</td>\n",
|
||||
" <td>0</td>\n",
|
||||
" <td>0</td>\n",
|
||||
" </tr>\n",
|
||||
" <tr>\n",
|
||||
" <th>3</th>\n",
|
||||
" <td>0</td>\n",
|
||||
" <td>0</td>\n",
|
||||
" <td>0</td>\n",
|
||||
" <td>0</td>\n",
|
||||
" <td>0</td>\n",
|
||||
" <td>0</td>\n",
|
||||
" <td>0</td>\n",
|
||||
" <td>0</td>\n",
|
||||
" <td>0</td>\n",
|
||||
" <td>0</td>\n",
|
||||
" <td>...</td>\n",
|
||||
" <td>0</td>\n",
|
||||
" <td>0</td>\n",
|
||||
" <td>0</td>\n",
|
||||
" <td>0</td>\n",
|
||||
" <td>0</td>\n",
|
||||
" <td>0</td>\n",
|
||||
" <td>0</td>\n",
|
||||
" <td>0</td>\n",
|
||||
" <td>0</td>\n",
|
||||
" <td>0</td>\n",
|
||||
" </tr>\n",
|
||||
" <tr>\n",
|
||||
" <th>4</th>\n",
|
||||
" <td>0</td>\n",
|
||||
" <td>0</td>\n",
|
||||
" <td>0</td>\n",
|
||||
" <td>0</td>\n",
|
||||
" <td>0</td>\n",
|
||||
" <td>0</td>\n",
|
||||
" <td>0</td>\n",
|
||||
" <td>0</td>\n",
|
||||
" <td>0</td>\n",
|
||||
" <td>0</td>\n",
|
||||
" <td>...</td>\n",
|
||||
" <td>0</td>\n",
|
||||
" <td>0</td>\n",
|
||||
" <td>0</td>\n",
|
||||
" <td>0</td>\n",
|
||||
" <td>0</td>\n",
|
||||
" <td>0</td>\n",
|
||||
" <td>0</td>\n",
|
||||
" <td>0</td>\n",
|
||||
" <td>0</td>\n",
|
||||
" <td>0</td>\n",
|
||||
" </tr>\n",
|
||||
" </tbody>\n",
|
||||
"</table>\n",
|
||||
"<p>5 rows × 23297 columns</p>\n",
|
||||
"</div>"
|
||||
],
|
||||
"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
|
||||
}
|
||||
Ссылка в новой задаче
Block a user