Max Bushuev commited on
Commit
cf509fc
1 Parent(s): 2751beb
__pycache__/app.cpython-39.pyc ADDED
Binary file (487 Bytes). View file
 
__pycache__/main.cpython-39.pyc ADDED
Binary file (807 Bytes). View file
 
api/__pycache__/base_router.cpython-39.pyc ADDED
Binary file (457 Bytes). View file
 
api/__pycache__/ml.cpython-39.pyc ADDED
Binary file (694 Bytes). View file
 
api/__pycache__/prediction.cpython-39.pyc ADDED
Binary file (920 Bytes). View file
 
api/base_router.py ADDED
@@ -0,0 +1,11 @@
 
 
 
 
 
 
 
 
 
 
 
 
1
+ from fastapi import APIRouter
2
+ from api import prediction
3
+
4
+
5
+ base_router = APIRouter()
6
+ base_router.include_router(prediction.router)
7
+
8
+
9
+ @base_router.get('/', name='Default page')
10
+ async def default():
11
+ return 'Привет!'
api/prediction.py ADDED
@@ -0,0 +1,23 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ from transformers import pipeline
2
+ import os
3
+ from fastapi import APIRouter
4
+ from models.prediction import Prediction
5
+
6
+ from services.answers_service import AnswersService
7
+ router = APIRouter(
8
+ prefix='/prediction',
9
+ tags=['prediction'],
10
+ )
11
+
12
+
13
+ nlp_task = os.getenv('NLP_TASK')
14
+ model_name = os.getenv('MODEL')
15
+ model = pipeline(nlp_task, model=model_name)
16
+
17
+
18
+ @router.post("/get_prediction", name='Получение предсказания модели')
19
+ def get_prediction(message_from_user: str):
20
+ output = model(message_from_user)
21
+ prediction = Prediction.from_output(dictionary=output[0])
22
+ answer = AnswersService.get_answer_by_id(prediction=prediction)
23
+ return answer
app.py ADDED
@@ -0,0 +1,19 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ from fastapi import FastAPI
2
+ from fastapi.middleware.cors import CORSMiddleware
3
+
4
+ from api.base_router import base_router
5
+
6
+
7
+ app = FastAPI(
8
+ docs_url='/docs',
9
+ )
10
+
11
+ app.include_router(base_router)
12
+
13
+ app.add_middleware(
14
+ CORSMiddleware,
15
+ allow_origins=["*"],
16
+ allow_credentials=True,
17
+ allow_methods=["*"],
18
+ allow_headers=["*"],
19
+ )
core/__pycache__/settings.cpython-39.pyc ADDED
Binary file (323 Bytes). View file
 
core/settings.py ADDED
@@ -0,0 +1,2 @@
 
 
 
1
+ class Config:
2
+ threshold = 0.5
main.py ADDED
@@ -0,0 +1,9 @@
 
 
 
 
 
 
 
 
 
 
1
+ import uvicorn
2
+ from dotenv import load_dotenv
3
+
4
+ if __name__ == '__main__':
5
+ load_dotenv()
6
+ uvicorn.run(
7
+ 'app:app',
8
+ reload=True,
9
+ )
models/__pycache__/prediction.cpython-39.pyc ADDED
Binary file (866 Bytes). View file
 
models/prediction.py ADDED
@@ -0,0 +1,12 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ class Prediction:
2
+ def __init__(self, label: str, score: float):
3
+ self.label = label
4
+ self.score = score
5
+
6
+ @staticmethod
7
+ def from_output(dictionary: dict):
8
+ return Prediction(Prediction.get_label(dictionary["label"]), dictionary["score"])
9
+
10
+ @staticmethod
11
+ def get_label(label: str):
12
+ return int(label.split('_')[1])
repositories/__pycache__/answers_repository.cpython-39.pyc ADDED
Binary file (6.48 kB). View file
 
repositories/__pycache__/repository.cpython-39.pyc ADDED
Binary file (479 Bytes). View file
 
repositories/answers_repository.py ADDED
@@ -0,0 +1,21 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ from repositories.repository import Repository
2
+
3
+
4
+ class AnswersRepository(Repository):
5
+
6
+ answers = ["Общее количество бюджетных мест составляет 2 598 по 90 программам бакалавриата, специалитета и магистратуры. Из них на очной форме обучения: 1 724 – бакалавриат, 518 – магистратура, 296 – специалитет. 60 мест (42 – бакалавриат, 18 – магистратура) выделены для очно-заочной (вечерней) формы обучения. Еще 150 мест выделено в колледже технического университета – там доступно 9 специальностей и 1 профессия. Распределение мест представлено в информационных бюллетенях.",
7
+ "Среди испытаний: информационные технологии; безопасность жизнедеятельности; метрология, стандартизация и сертификация; история изобразительного искусства; основы педагогики и психологии; менеджмент; экономика организации.",
8
+ "Молодые люди, имеющие гражданство РФ и получившие среднее профессиональное образование, проходят вступительные испытания по предметам профессиональной направленности и по русскому языку либо по результатам ЕГЭ общеобразовательных предметов.",
9
+ "Абитуриенты могут получить дополнительные баллы за различные достижения, такие как аттестат или диплом с отличием, высокий балл по ЕГЭ или вступительным испытаниям, а также за знаки ГТО (золотой, серебряный, бронзовый). В этом году расширился перечень способов подтверждения достижений, и награды могут быть проверены онлайн. В общей сложности, абитуриенты могут получить до 10 дополнительных баллов, учитываемых при поступлении на бюджетное место. Полный список индивидуальных достижений доступен на сайте ОмГТУ в разделе «Абитуриенту».",
10
+ "Абитуриент политеха вправе подать документы на 5 направлений подготовки бакалавриата и программ специалитета. Он может участвовать в конкурсе и на бюджет, и на коммерческое место, если предусмотрены обе формы финансирования.",
11
+ "ОмГТУ имеет 6 общежитий, всего 2,374 спальных мест. Общежития предоставляются студентам и аспирантам с гражданством РФ, не имеющим омской прописки, а также иностранным студентам на время обучения. Иногородние студенты заочной формы обучения могут воспользоваться общежитием во время сессии и сдачи выпускных работ при наличии свободных мест. Также иногородние абитуриенты могут получить общежитие на время вступительных испытаний.",
12
+ "Необходимо подготовить следующие документы: документ, удостоверяющий личность; документ об образовании; СНИЛС (для граждан РФ); фото в электронном виде; документы об особых правах; индивидуальные достижения. Подать документы можно: лично в приемной комиссии (пр. Мира, 11, корпус 8, кабинет 115), онлайн через личный кабинет на сайте ОмГТУ во вкладке «Абитуриенту», с помощью суперсервиса «Поступление в вуз онлайн», с помощью почты/курьерской доставки на адрес приемной комиссии. ",
13
+ "Приемная кампания завершится 20 июля для тех, кто поступает по направлениям подготовки с дополнительными вступительными испытаниями и по результатам вступительных испытаний. Для абитуриентов, поступающих по результатам ЕГЭ, срок окончания - 25 июля. Абитуриенты магистратуры на бюджетные места могут подавать документы до 10 августа.",
14
+ "Нет, очередность значения не имеет. Распределение кандидатов на поступление будет осуществляться по указанным в заявлении приоритетным направлениям или специальностям.",
15
+ ]
16
+
17
+ default_answer = "Затрудняюсь ответить на ваш вопрос. Уточните свой вопрос, пожалуйста."
18
+
19
+ @staticmethod
20
+ def get_elem_by_id(id: int):
21
+ return AnswersRepository.answers[id]
repositories/intents_repository.py ADDED
@@ -0,0 +1,13 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ from repositories.repository import Repository
2
+
3
+
4
+ class IntentsRepository(Repository):
5
+
6
+ intents = ['Бюджетные места', 'Вступительные испытания', 'Вуз после колледжа',
7
+ 'Индивидуальные достижения', 'Количество специальностей',
8
+ 'Общежитие', 'Подача документов', 'Приемная компания',
9
+ 'Приоритет от подачи оригинала']
10
+
11
+ @staticmethod
12
+ def get_elem_by_id(id: int):
13
+ return IntentsRepository.intents[id]
repositories/repository.py ADDED
@@ -0,0 +1,4 @@
 
 
 
 
 
1
+ class Repository:
2
+ @staticmethod
3
+ def get_elem_by_id(id: int):
4
+ pass
requirements.txt ADDED
@@ -0,0 +1,5 @@
 
 
 
 
 
 
1
+ fastapi
2
+ uvicorn
3
+ transformers
4
+ torch
5
+ python-dotenv
services/__pycache__/answers_service.cpython-39.pyc ADDED
Binary file (768 Bytes). View file
 
services/answers_service.py ADDED
@@ -0,0 +1,14 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ from models.prediction import Prediction
2
+ from core.settings import Config
3
+ from repositories.answers_repository import AnswersRepository
4
+
5
+
6
+ class AnswersService:
7
+
8
+ @staticmethod
9
+ def get_answer_by_id(prediction: Prediction):
10
+ if prediction.score > Config.threshold:
11
+
12
+ return AnswersRepository.get_elem_by_id(prediction.label)
13
+
14
+ return AnswersRepository.default_answer
services/intents_service.py ADDED
@@ -0,0 +1,8 @@
 
 
 
 
 
 
 
 
 
1
+ from models.prediction import Prediction
2
+ from repositories.intents_repository import IntentsRepository
3
+
4
+
5
+ class IntentsService:
6
+ @staticmethod
7
+ def get_intent_by_id(prediction: Prediction):
8
+ return IntentsRepository.get_elem_by_id[prediction.label]