#!/usr/bin/env python # coding: utf-8 # # Python для сбора данных # # *Алла Тамбовцева* # # ## Домашнее задание 2 (продвинутая часть) # # ### Формат сдачи # # Дедлайн: 22 марта, 23:59 Формат сдачи: ipynb-файл или py-файл с решением задач нужно загрузить на Dropbox по [ссылке](https://www.dropbox.com/request/vE9rHdMyDnAtv4TwMhlO). # # Задание основано на [обзоре](https://nbviewer.jupyter.org/github/allatambov/py-icef/blob/master/2-26-02/texts.ipynb) по работе с текстами и [материалах](https://www.datacamp.com/community/tutorials/wordcloud-python) по облакам слов на DataCamp. # ### Задание 1 # # Напишите функцию, которая принимает на вход два txt-файла (их названия) и делает следующее: # # * Считывает из файлов тексты и формирует на их основе строки: одна строка для каждого текста. # # * Удаляет из строк всю пунктуацию и цифры, приводит все буквы к нижнему регистру. # # * Приводит все слова в каждой строке к начальной форме и сохраняет преобразованные тексты. # # * На основе нормализованных текстов (слова в начальной форме, в нижнем регистре без лишних символов) считает меру косинусной близости и возвращает её значение, то есть одно число типа *float*. # **Подсказка:** почитайте [обзор](https://towardsdatascience.com/overview-of-text-similarity-metrics-3397c4601f50) по мерам близости текстов в Python. Обратите внимание на следующий код в обзоре: # In[ ]: from collections import Counter from sklearn.feature_extraction.text import CountVectorizer from sklearn.metrics.pairwise import cosine_similarity def get_cosine_sim(*strs): vectors = [t for t in get_vectors(*strs)] return cosine_similarity(vectors) def get_vectors(*strs): text = [t for t in strs] vectorizer = CountVectorizer(text) vectorizer.fit(text) return vectorizer.transform(text).toarray() # Посмотрите на результат исполнения следующего кода: # In[ ]: get_cosine_sim("very good dog", "very good bird") # ### Задание 2 # # Напишите функцию, которая принимает на вход текст, сохранённый в одну строку, строит по нему облако слов (настройки можете выбрать самостоятельно) и сохраняет в файл `wordcloud.png`. # # **Внимание:** облако слов должно выводиться на белом или чёрном фоне, цвет фона должен выбираться в зависимости от тональности: положительно окрашенный – белый, отрицательно окрашенный – чёрный. # # Тональность текста должна определяться простым способом, без обучения, на основе списков тональных слов. Если доля положительно окрашенных слов больше доли отрицательно окрашенных слов, то текст считается положительным, иначе – отрицательным. Списки положительно и отрицательно окрашенных слов можно создать на основе файла `emo_dict.csv` ([ссылка](https://github.com/dkulagin/kartaslov/tree/master/dataset/emo_dict) на тональный словарь русского языка). # In[1]: import pandas as pd # encoding - кодировка файла # sep - разделитель столбцов (указывается, если в качестве разделителя используется не запятая) df = pd.read_csv("https://raw.githubusercontent.com/dkulagin/kartaslov/master/dataset/emo_dict/emo_dict.csv", encoding = "UTF-8", sep = ";") df.head() # In[ ]: # отбираем слова с положительным и отрицательным тэгами df_pos = df[df['tag'] == 'PSTV'] df_neg = df[df['tag'] == 'NGTV'] # создаём списки положительно и отрицательно окрашенных слов positive = list(df_pos['term']) negative = list(df_neg['term'])