Python для сбора данных

Алла Тамбовцева

Домашнее задание 2 (продвинутая часть)

Формат сдачи

Дедлайн: 22 марта, 23:59 Формат сдачи: ipynb-файл или py-файл с решением задач нужно загрузить на Dropbox по ссылке.

Задание основано на обзоре по работе с текстами и материалах по облакам слов на DataCamp.

Задание 1

Напишите функцию, которая принимает на вход два txt-файла (их названия) и делает следующее:

  • Считывает из файлов тексты и формирует на их основе строки: одна строка для каждого текста.

  • Удаляет из строк всю пунктуацию и цифры, приводит все буквы к нижнему регистру.

  • Приводит все слова в каждой строке к начальной форме и сохраняет преобразованные тексты.

  • На основе нормализованных текстов (слова в начальной форме, в нижнем регистре без лишних символов) считает меру косинусной близости и возвращает её значение, то есть одно число типа float.

Подсказка: почитайте обзор по мерам близости текстов в 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 (ссылка на тональный словарь русского языка).

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()
Out[1]:
term tag value
0 счастливая PSTV 3.0
1 адреналин PSTV 3.0
2 телепортация PSTV 3.0
3 сбора PSTV 3.0
4 партнёрша PSTV 3.0
In [ ]:
# отбираем слова с положительным и отрицательным тэгами
df_pos = df[df['tag'] == 'PSTV']
df_neg = df[df['tag'] == 'NGTV']

# создаём списки положительно и отрицательно окрашенных слов
positive = list(df_pos['term'])
negative = list(df_neg['term'])