Shalltear1990 commited on
Commit
91f0d2a
1 Parent(s): 3b95975

Lab_Work_4

Browse files
Files changed (3) hide show
  1. README.md +22 -12
  2. lab_work_1.py +11 -0
  3. streamlit_app.py +70 -0
README.md CHANGED
@@ -1,12 +1,22 @@
1
- ---
2
- title: URFU 1 Sem Project
3
- emoji: 📊
4
- colorFrom: pink
5
- colorTo: yellow
6
- sdk: streamlit
7
- sdk_version: 1.29.0
8
- app_file: app.py
9
- pinned: false
10
- ---
11
-
12
- Check out the configuration reference at https://huggingface.co/docs/hub/spaces-config-reference
 
 
 
 
 
 
 
 
 
 
 
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
+