{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# Python для сбора данных\n", "\n", "*Алла Тамбовцева*\n", "\n", "## Домашнее задание 2 (продвинутая часть)\n", "\n", "### Формат сдачи\n", "\n", "Дедлайн: 22 марта, 23:59 Формат сдачи: ipynb-файл или py-файл с решением задач нужно загрузить на Dropbox по [ссылке](https://www.dropbox.com/request/vE9rHdMyDnAtv4TwMhlO).\n", "\n", "Задание основано на [обзоре](https://nbviewer.jupyter.org/github/allatambov/py-icef/blob/master/2-26-02/texts.ipynb) по работе с текстами и [материалах](https://www.datacamp.com/community/tutorials/wordcloud-python) по облакам слов на DataCamp." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Задание 1\n", "\n", "Напишите функцию, которая принимает на вход два txt-файла (их названия) и делает следующее:\n", "\n", "* Считывает из файлов тексты и формирует на их основе строки: одна строка для каждого текста.\n", "\n", "* Удаляет из строк всю пунктуацию и цифры, приводит все буквы к нижнему регистру. \n", "\n", "* Приводит все слова в каждой строке к начальной форме и сохраняет преобразованные тексты.\n", "\n", "* На основе нормализованных текстов (слова в начальной форме, в нижнем регистре без лишних символов) считает меру косинусной близости и возвращает её значение, то есть одно число типа *float*. " ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**Подсказка:** почитайте [обзор](https://towardsdatascience.com/overview-of-text-similarity-metrics-3397c4601f50) по мерам близости текстов в Python. Обратите внимание на следующий код в обзоре:" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "from collections import Counter\n", "from sklearn.feature_extraction.text import CountVectorizer\n", "from sklearn.metrics.pairwise import cosine_similarity\n", "def get_cosine_sim(*strs): \n", " vectors = [t for t in get_vectors(*strs)]\n", " return cosine_similarity(vectors)\n", " \n", "def get_vectors(*strs):\n", " text = [t for t in strs]\n", " vectorizer = CountVectorizer(text)\n", " vectorizer.fit(text)\n", " return vectorizer.transform(text).toarray()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Посмотрите на результат исполнения следующего кода: " ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "get_cosine_sim(\"very good dog\", \"very good bird\")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Задание 2\n", "\n", "Напишите функцию, которая принимает на вход текст, сохранённый в одну строку, строит по нему облако слов (настройки можете выбрать самостоятельно) и сохраняет в файл `wordcloud.png`. \n", "\n", "**Внимание:** облако слов должно выводиться на белом или чёрном фоне, цвет фона должен выбираться в зависимости от тональности: положительно окрашенный – белый, отрицательно окрашенный – чёрный. \n", "\n", "Тональность текста должна определяться простым способом, без обучения, на основе списков тональных слов. Если доля положительно окрашенных слов больше доли отрицательно окрашенных слов, то текст считается положительным, иначе – отрицательным. Списки положительно и отрицательно окрашенных слов можно создать на основе файла `emo_dict.csv` ([ссылка](https://github.com/dkulagin/kartaslov/tree/master/dataset/emo_dict) на тональный словарь русского языка)." ] }, { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [ { "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", "
termtagvalue
0счастливаяPSTV3.0
1адреналинPSTV3.0
2телепортацияPSTV3.0
3сбораPSTV3.0
4партнёршаPSTV3.0
\n", "
" ], "text/plain": [ " term tag value\n", "0 счастливая PSTV 3.0\n", "1 адреналин PSTV 3.0\n", "2 телепортация PSTV 3.0\n", "3 сбора PSTV 3.0\n", "4 партнёрша PSTV 3.0" ] }, "execution_count": 1, "metadata": {}, "output_type": "execute_result" } ], "source": [ "import pandas as pd\n", "\n", "# encoding - кодировка файла\n", "# sep - разделитель столбцов (указывается, если в качестве разделителя используется не запятая)\n", "\n", "df = pd.read_csv(\"https://raw.githubusercontent.com/dkulagin/kartaslov/master/dataset/emo_dict/emo_dict.csv\", \n", " encoding = \"UTF-8\", sep = \";\")\n", "df.head()" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "# отбираем слова с положительным и отрицательным тэгами\n", "df_pos = df[df['tag'] == 'PSTV']\n", "df_neg = df[df['tag'] == 'NGTV']\n", "\n", "# создаём списки положительно и отрицательно окрашенных слов\n", "positive = list(df_pos['term'])\n", "negative = list(df_neg['term'])" ] } ], "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.6.5" } }, "nbformat": 4, "nbformat_minor": 2 }