File size: 4,764 Bytes
b5d0459
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
import os
import time
import re

import streamlit as st
import requests
from wordcloud import WordCloud
import matplotlib.pyplot as plt


# Установка API URL и заголовков
API_URL_TRA = "https://api-inference.huggingface.co" \
              "/models/Helsinki-NLP/opus-mt-en-ru"
API_URL_KEY = "https://api-inference.huggingface.co" \
              "/models/ml6team/keyphrase-extraction-kbir-inspec"
API_URL_SUM = "https://api-inference.huggingface.co" \
              "/models/facebook/bart-large-cnn"

TOKEN = os.getenv('API_TOKEN')
HEADERS = {"Authorization": TOKEN}


def hugging_api_request(url, payload):
    response = requests.post(url, headers=HEADERS, json=payload, timeout=120)
    body = response.json()
    if 'error' in body:
        print(response.status_code, body)
        if 'estimated_time' in body:
            time.sleep(body['estimated_time'])
        else:
            return
        hugging_api_request(url, payload)
    return body


# Функция для получения ключевых слов
def get_key_words(payload):
    return hugging_api_request(API_URL_KEY, payload)


# Функция для перевода слова
def translate_key_words(payload):
    return hugging_api_request(API_URL_TRA, payload)


# Функция для составления конспекта
def make_summary(payload):
    return hugging_api_request(API_URL_SUM, payload)


# Очищаем список слов
def clean_list(words_list):
    cleaned_words_list = []
    for word in words_list:
        word = word.lower()
        word = re.sub(r"[^а-яА-Яa-zA-Z\s]", "", word)
        word = word.lstrip()
        word = word.rstrip()
        cleaned_words_list.append(word)
    return cleaned_words_list


# Настраиваем заголовок и название страницы
st.set_page_config(layout="wide", page_title="Students' Personal Assistant")
st.markdown(' # :female-student: Персональный помощник для студентов')

st.divider()
st.markdown('# :blue_book:  Конспект на английском языке')

col1, col2 = st.columns(2)
text_from_tarea = col1.text_area('Введите тект статьи на английском языке',
                                 key='t_area', height=500)

button_start = st.button('Обработать текст')
key_words_list = []

if button_start:
    with st.spinner('Составляем конспект...'):
        # Составляем конспект
        summary_text = make_summary({"inputs": text_from_tarea})
        col2.text_area('Конспект статьи', height=500,
                       key='sum_area', value=summary_text[0]['summary_text'])

    with st.spinner('Получаем ключевые слова...'):
        # Извлекаем ключевые слова
        kew_words = get_key_words({"inputs": text_from_tarea})
        for key_word in kew_words:
            key_words_list.append(key_word['word'].lower())

        sorted_keywords = set(sorted(key_words_list))
        sorted_keywords = clean_list(sorted_keywords)

    with st.spinner('Переводим ключевые слова...'):
        # Переводим ключевые слова
        translated_words_dict = translate_key_words(
            {"inputs": sorted_keywords})
        translated_words_list = [
            word['translation_text'] for word in translated_words_dict]

        # Создаем карточки
        cleaned_words_list_ru = clean_list(translated_words_list)
        cards_list = []
        for item1, item2 in zip(sorted_keywords, cleaned_words_list_ru):
            cards_list.append([item1, item2])

    st.success('Готово')

    with st.spinner('Создаем WordCloud...'):
        # Выводим Word Cloud
        st.set_option('deprecation.showPyplotGlobalUse', False)
        words_str = ', '.join(sorted_keywords)
        w = WordCloud(background_color="white",
                      width=1600, height=800).generate(words_str)
        plt.imshow(w, interpolation='bilinear')
        plt.imshow(w)
        plt.axis("off")
        st.pyplot()

    # Выводим карточки
    st.markdown('# :bookmark_tabs: Карточки из ключевых слов')
    col1, col2, col3 = st.columns(3)
    columns = [col1, col2, col3]
    for index, el in enumerate(cards_list):
        with columns[(index + 1) % 3]:
            with st.container(border=True):
                col4, col5 = st.columns([0.1, 0.9])
                with col4:
                    st.write("# :flower_playing_cards:")
                with col5:
                    st.write(f'## :green[{el[0]}]')
                    st.write(f'### :blue[{el[1]}]')