Spaces:
Sleeping
Sleeping
Shalltear1990
commited on
Commit
•
91f0d2a
1
Parent(s):
3b95975
Lab_Work_4
Browse files- README.md +22 -12
- lab_work_1.py +11 -0
- streamlit_app.py +70 -0
README.md
CHANGED
@@ -1,12 +1,22 @@
|
|
1 |
-
|
2 |
-
|
3 |
-
|
4 |
-
|
5 |
-
|
6 |
-
|
7 |
-
|
8 |
-
|
9 |
-
|
10 |
-
|
11 |
-
|
12 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
# urfu_1_semester
|
2 |
+
For a software engineering course
|
3 |
+
|
4 |
+
(добавлено при выполнении лабораторной работы №1)
|
5 |
+
|
6 |
+
Сформированная команда (1 человек): Никульшин Сергей Сергеевич (РИМ-130963)
|
7 |
+
|
8 |
+
Задача, выбранная для лабораторной работы №1, а также для итогового проекта: «Суммирование (создание аннотации) текста на русском языке»
|
9 |
+
|
10 |
+
В результате выполнения данной работы были протестированы все 22 предобученные модели машинного обучения, доступные на сайте huggingface.co по запросу «summarization» и выбранному языку – русскому. В итоге, наилучшие результаты (по субъективным ощущениям) показала модель «IlyaGusev/rut5_base_sum_gazeta», которая и была выбрана и будет использоваться для всей дальнейшей работы. Так же был создан файл «lab_work_1.py», в котором реализовано решение выбранной задачи с использованием данной модели машинного обучения для выбранного заранее текста-примера.
|
11 |
+
|
12 |
+
Для запуска «lab_work_1.py» должны быть установлены «transformers» и «pytorch».
|
13 |
+
|
14 |
+
(добавлено при выполнении лабораторной работы №2)
|
15 |
+
|
16 |
+
Результатом выполнения данной работы является файл «streamlit_app.py».
|
17 |
+
|
18 |
+
Для запуска «streamlit_app.py» должны быть установлены «transformers», «pytorch» и «streamlit», а также необходимо около 1 Гигабайта свободного пространства и наличие интернет-соединения для скачивания и установки выбранной ранее модели МО.
|
19 |
+
|
20 |
+
Тут не будет дана техническая документация о веб приложении, т.к. в самом приложении есть раскрывающееся краткое описание, объясняющее, как использовать данное приложение.
|
21 |
+
|
22 |
+
|
lab_work_1.py
ADDED
@@ -0,0 +1,11 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
from transformers import pipeline
|
2 |
+
|
3 |
+
summarizer = pipeline("summarization", "IlyaGusev/rut5_base_sum_gazeta")
|
4 |
+
|
5 |
+
text_for_example = "Высота башни составляет 324 метра (1063 фута), примерно такая же высота, как у 81-этажного здания, и самое высокое сооружение в Париже. Его основание квадратно, размером 125 метров (410 футов) с любой стороны. Во время строительства Эйфелева башня превзошла монумент Вашингтона, став самым высоким искусственным сооружением в мире, и этот титул она удерживала в течение 41 года до завершения строительство здания Крайслер в Нью-Йорке в 1930 году. Это первое сооружение которое достигло высоты 300 метров. Из-за добавления вещательной антенны на вершине башни в 1957 году она сейчас выше здания Крайслер на 5,2 метра (17 футов). За исключением передатчиков, Эйфелева башня является второй самой высокой отдельно стоящей структурой во Франции после виадука Мийо."
|
6 |
+
|
7 |
+
print("ТЕКСТ ИСТОЧНИК:\n")
|
8 |
+
print("\""+text_for_example+"\"")
|
9 |
+
print("\nСГЕНЕРИРОВАННАЯ АННОТАЦИЯ:\n")
|
10 |
+
|
11 |
+
print("\""+summarizer(text_for_example)[0]['summary_text']+"\"\n")
|
streamlit_app.py
ADDED
@@ -0,0 +1,70 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
import streamlit as st
|
2 |
+
from transformers import AutoTokenizer, T5ForConditionalGeneration
|
3 |
+
import re
|
4 |
+
|
5 |
+
# Данная функция считает примерное количество "слов" в тексте (словом будет считаться непрерывная последовательность букв и цифр (с небольшими исключениями)).
|
6 |
+
# Т.к. данное веб-приложение создано для работы с простыми русскими текстами (преимущественно, с новостными и научно-популярными статьями),
|
7 |
+
# логика подсчета слов примитивная и не гарантируется корректная работа, если текст будет содержать большое количество
|
8 |
+
# сложных конструкций (например, формул или нестандартных email-адресов и т.д.), будет перегружен сложными символьными небуквенными конструкциями
|
9 |
+
# или будет иметь большое количество синтаксических ошибок (например, пропусков пробелов между словами)
|
10 |
+
# Т.к. модель МО все равно не рассчитана на подобные тексты, нет смысла сильно усложнять данную функцию.
|
11 |
+
def get_word_count(text_str):
|
12 |
+
text_str_mod = re.sub(r'(?:(?<=\d)[,]{1}(?=\d)|[-_@.])', '', text_str)
|
13 |
+
res = re.findall(r'[0-9a-zA-Zа-яА-ЯёЁ]+', text_str_mod)
|
14 |
+
return len(res)
|
15 |
+
|
16 |
+
@st.cache_resource
|
17 |
+
def load_model(name_of_model):
|
18 |
+
tokenizer = AutoTokenizer.from_pretrained(name_of_model)
|
19 |
+
model = T5ForConditionalGeneration.from_pretrained(name_of_model)
|
20 |
+
return model, tokenizer
|
21 |
+
|
22 |
+
def get_sum(model, article_text):
|
23 |
+
input_ids = model[1](
|
24 |
+
[article_text],
|
25 |
+
max_length=600,
|
26 |
+
add_special_tokens=True,
|
27 |
+
padding="max_length",
|
28 |
+
truncation=True,
|
29 |
+
return_tensors="pt")["input_ids"]
|
30 |
+
|
31 |
+
output_ids = model[0].generate(
|
32 |
+
input_ids=input_ids,
|
33 |
+
no_repeat_ngram_size=4)[0]
|
34 |
+
|
35 |
+
summary = model[1].decode(output_ids, skip_special_tokens=True)
|
36 |
+
|
37 |
+
return summary
|
38 |
+
|
39 |
+
model_name = "IlyaGusev/rut5_base_sum_gazeta"
|
40 |
+
summarizer = load_model(model_name)
|
41 |
+
|
42 |
+
st.markdown("<h1 style='text-align: center;'>Создание аннотации текста</h1>", unsafe_allow_html=True)
|
43 |
+
|
44 |
+
description_text = "Данное streamlit веб-приложение умеет автоматически генерировать аннотацию текста на русском языке с помощью предобученной модели машинного обучения [IlyaGusev/rut5_base_sum_gazeta](https://huggingface.co/IlyaGusev/rut5_base_sum_gazeta). Для корректной работы исходный текст должен быть:\n\
|
45 |
+
- на русском языке\n\
|
46 |
+
- объемом не менее 100 слов и не более 600 слов\n\
|
47 |
+
- содержать минимум грамматических и синтаксических ошибок\n\
|
48 |
+
- быть простым (не содержать слишком много формул, сложных небуквенных конструкций, слов на английском языке и т.д.)\n\n\
|
49 |
+
Для генерации аннотации вставьте текст в поле ввода и нажмите кнопку **Создать аннотацию**, либо нажмите сочетание клавиш **Ctrl+Enter** при активном курсоре в поле ввода, \
|
50 |
+
либо просто **уберите курсор** из поля ввода (кликнув мышкой вне области ввода)."
|
51 |
+
|
52 |
+
with st.expander("Краткое описание данного веб-приложения"):
|
53 |
+
st.write(description_text)
|
54 |
+
|
55 |
+
source_text = st.text_area("Введите текст для обработки")
|
56 |
+
st.button("Создать аннотацию") # В данном конкретном случае нет необходимости как-то отдельно обрабатывать событие нажатия кнопки, т.к. сам факт нажатия запустит перевыполнение всего кода
|
57 |
+
|
58 |
+
if source_text != "":
|
59 |
+
word_in_text = get_word_count(source_text)
|
60 |
+
if 100 <= word_in_text <= 600:
|
61 |
+
st.success("Слов в тексте - "+str(word_in_text)+", текст подходит по объему!")
|
62 |
+
elif word_in_text != 0:
|
63 |
+
st.warning("Слов в тексте - "+str(word_in_text)+", текст не подходит по объему! Приложение попытается создать аннотацию, но корректный результат не гарантируется!")
|
64 |
+
elif word_in_text == 0:
|
65 |
+
st.error("В поле ввода не обнаружено ни одного слова. Генерация аннотации отменена.")
|
66 |
+
|
67 |
+
if word_in_text != 0:
|
68 |
+
st.write(get_sum(summarizer, source_text))
|
69 |
+
|
70 |
+
|