Напишите функцию, которая принимает на вход два txt-файла (их названия) и делает следующее:
Считывает из файлов тексты и формирует на их основе строки: одна строка для каждого текста.
Удаляет из строк всю пунктуацию и цифры, приводит все буквы к нижнему регистру.
Приводит все слова в каждой строке к начальной форме и сохраняет преобразованные тексты.
На основе нормализованных текстов (слова в начальной форме, в нижнем регистре без лишних символов) считает меру косинусной близости и возвращает её значение, то есть одно число типа float.
Подсказка: почитайте обзор по мерам близости текстов в Python. Обратите внимание на следующий код в обзоре:
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()
Посмотрите на результат исполнения следующего кода:
get_cosine_sim("very good dog", "very good bird")
Напишите функцию, которая принимает на вход текст, сохранённый в одну строку, строит по нему облако слов (настройки можете выбрать самостоятельно) и сохраняет в файл wordcloud.png
.
Внимание: облако слов должно выводиться на белом или чёрном фоне, цвет фона должен выбираться в зависимости от тональности: положительно окрашенный – белый, отрицательно окрашенный – чёрный.
Тональность текста должна определяться простым способом, без обучения, на основе списков тональных слов. Если доля положительно окрашенных слов больше доли отрицательно окрашенных слов, то текст считается положительным, иначе – отрицательным. Списки положительно и отрицательно окрашенных слов можно создать на основе файла emo_dict.csv
(ссылка на тональный словарь русского языка).
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()
term | tag | value | |
---|---|---|---|
0 | счастливая | PSTV | 3.0 |
1 | адреналин | PSTV | 3.0 |
2 | телепортация | PSTV | 3.0 |
3 | сбора | PSTV | 3.0 |
4 | партнёрша | PSTV | 3.0 |
# отбираем слова с положительным и отрицательным тэгами
df_pos = df[df['tag'] == 'PSTV']
df_neg = df[df['tag'] == 'NGTV']
# создаём списки положительно и отрицательно окрашенных слов
positive = list(df_pos['term'])
negative = list(df_neg['term'])