Spaces:
Sleeping
Sleeping
add fastapi endpoint
Browse files- .gitignore +3 -0
- app.py +40 -12
- main.py +47 -0
- poetry.lock +14 -14
- pyproject.toml +2 -0
.gitignore
ADDED
@@ -0,0 +1,3 @@
|
|
|
|
|
|
|
|
|
1 |
+
__pycache__
|
2 |
+
.venv
|
3 |
+
flagged
|
app.py
CHANGED
@@ -1,6 +1,7 @@
|
|
1 |
import re
|
2 |
|
3 |
import gradio as gr
|
|
|
4 |
from transformers import pipeline, AutoTokenizer, AutoModelForSeq2SeqLM
|
5 |
from loguru import logger
|
6 |
|
@@ -44,6 +45,21 @@ DEFAULT_RU_TEXT = """В результате взрыва на заправке,
|
|
44 |
доноров для их пополнения на данный час тоже уже немало», — написало ведомство.
|
45 |
"""
|
46 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
47 |
class Summarizer():
|
48 |
ru_summary_pipe: pipeline
|
49 |
ru_sentiment_pipe: pipeline
|
@@ -96,21 +112,33 @@ class Summarizer():
|
|
96 |
'ru': self.ru_sentiment_pipe,}
|
97 |
return summary[lang], sentiment[lang]
|
98 |
|
99 |
-
def summarize(self, text: str, lang: str = 'en') -> str:
|
100 |
-
|
101 |
-
|
|
|
|
|
|
|
|
|
102 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
103 |
response_summary = sum_pipe(text)
|
104 |
logger.info(response_summary)
|
105 |
-
result["summary"] = response_summary[0]["summary_text"]
|
106 |
-
|
107 |
response_sentiment = sent_pipe(text)
|
108 |
logger.info(response_sentiment)
|
109 |
-
result
|
110 |
-
|
111 |
-
|
112 |
-
|
113 |
-
|
|
|
114 |
|
115 |
if __name__ == "__main__":
|
116 |
pipe = Summarizer()
|
@@ -133,12 +161,12 @@ if __name__ == "__main__":
|
|
133 |
ru_inbtn = gr.Button("Запустить")
|
134 |
|
135 |
en_inbtn.click(
|
136 |
-
pipe.summarize,
|
137 |
[en_inputs, en_lang],
|
138 |
[en_outputs],
|
139 |
)
|
140 |
ru_inbtn.click(
|
141 |
-
pipe.summarize,
|
142 |
[ru_inputs, ru_lang],
|
143 |
[ru_outputs],
|
144 |
)
|
|
|
1 |
import re
|
2 |
|
3 |
import gradio as gr
|
4 |
+
from pydantic import BaseModel
|
5 |
from transformers import pipeline, AutoTokenizer, AutoModelForSeq2SeqLM
|
6 |
from loguru import logger
|
7 |
|
|
|
45 |
доноров для их пополнения на данный час тоже уже немало», — написало ведомство.
|
46 |
"""
|
47 |
|
48 |
+
class Request(BaseModel):
|
49 |
+
text: str
|
50 |
+
|
51 |
+
|
52 |
+
class Result(BaseModel):
|
53 |
+
sentiment_score: float
|
54 |
+
sentiment_label: str
|
55 |
+
summary: str
|
56 |
+
|
57 |
+
def to_str(self):
|
58 |
+
return f"Summary: {self.summary}\n Sentiment: {self.sentiment_label} ({self.sentiment_score:.3f})"
|
59 |
+
|
60 |
+
# class Response(BaseModel):
|
61 |
+
# results: List[Result] # list of Result objects
|
62 |
+
|
63 |
class Summarizer():
|
64 |
ru_summary_pipe: pipeline
|
65 |
ru_sentiment_pipe: pipeline
|
|
|
112 |
'ru': self.ru_sentiment_pipe,}
|
113 |
return summary[lang], sentiment[lang]
|
114 |
|
115 |
+
# def summarize(self, text: str, lang: str = 'en') -> str:
|
116 |
+
# result = {}
|
117 |
+
# sum_pipe, sent_pipe = self.get_pipe(lang)
|
118 |
+
|
119 |
+
# response_summary = sum_pipe(text)
|
120 |
+
# logger.info(response_summary)
|
121 |
+
# result["summary"] = response_summary[0]["summary_text"]
|
122 |
|
123 |
+
# response_sentiment = sent_pipe(text)
|
124 |
+
# logger.info(response_sentiment)
|
125 |
+
# result["sentiment_label"] = response_sentiment[0]["label"]
|
126 |
+
# result["sentiment_score"] = response_sentiment[0]["score"]
|
127 |
+
|
128 |
+
# return f"Summary: {result['summary']}\n Sentiment: {result['sentiment_label']} ({result['sentiment_score']:.3f})"
|
129 |
+
|
130 |
+
def summarize(self, text: Request, lang: str = 'en') -> str:
|
131 |
+
sum_pipe, sent_pipe = self.get_pipe(lang)
|
132 |
response_summary = sum_pipe(text)
|
133 |
logger.info(response_summary)
|
|
|
|
|
134 |
response_sentiment = sent_pipe(text)
|
135 |
logger.info(response_sentiment)
|
136 |
+
result = Result(
|
137 |
+
summary=response_summary[0]["summary_text"],
|
138 |
+
sentiment_label=response_sentiment[0]["label"],
|
139 |
+
sentiment_score=response_sentiment[0]["score"],
|
140 |
+
)
|
141 |
+
return result
|
142 |
|
143 |
if __name__ == "__main__":
|
144 |
pipe = Summarizer()
|
|
|
161 |
ru_inbtn = gr.Button("Запустить")
|
162 |
|
163 |
en_inbtn.click(
|
164 |
+
pipe.summarize.to_str(),
|
165 |
[en_inputs, en_lang],
|
166 |
[en_outputs],
|
167 |
)
|
168 |
ru_inbtn.click(
|
169 |
+
pipe.summarize.to_str(),
|
170 |
[ru_inputs, ru_lang],
|
171 |
[ru_outputs],
|
172 |
)
|
main.py
ADDED
@@ -0,0 +1,47 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
import gradio as gr
|
2 |
+
from fastapi import FastAPI
|
3 |
+
from typing import List
|
4 |
+
from app import Summarizer, Request, Result
|
5 |
+
from app import EN_SENTIMENT_MODEL, EN_SUMMARY_MODEL, RU_SENTIMENT_MODEL, RU_SUMMARY_MODEL
|
6 |
+
from app import DEFAULT_EN_TEXT, DEFAULT_RU_TEXT
|
7 |
+
|
8 |
+
app = FastAPI()
|
9 |
+
pipe = Summarizer()
|
10 |
+
|
11 |
+
|
12 |
+
@app.post("/summ_ru", response_model=Result)
|
13 |
+
async def ru_summ_api(request: Request):
|
14 |
+
results = pipe.summarize(request.text)
|
15 |
+
return results
|
16 |
+
|
17 |
+
|
18 |
+
if __name__ == "__main__":
|
19 |
+
|
20 |
+
with gr.Blocks() as demo:
|
21 |
+
with gr.Row():
|
22 |
+
with gr.Column(scale=2, min_width=600):
|
23 |
+
en_sum_description=gr.Markdown(value=f"Model for Summary: {EN_SUMMARY_MODEL}")
|
24 |
+
en_sent_description=gr.Markdown(value=f"Model for Sentiment: {EN_SENTIMENT_MODEL}")
|
25 |
+
en_inputs=gr.Textbox(label="en_input", lines=5, value=DEFAULT_EN_TEXT, placeholder=DEFAULT_EN_TEXT)
|
26 |
+
en_lang=gr.Textbox(value='en',visible=False)
|
27 |
+
en_outputs=gr.Textbox(label="en_output", lines=5, placeholder="Summary and Sentiment would be here...")
|
28 |
+
en_inbtn = gr.Button("Proceed")
|
29 |
+
with gr.Column(scale=2, min_width=600):
|
30 |
+
ru_sum_description=gr.Markdown(value=f"Model for Summary: {RU_SUMMARY_MODEL}")
|
31 |
+
ru_sent_description=gr.Markdown(value=f"Model for Sentiment: {RU_SENTIMENT_MODEL}")
|
32 |
+
ru_inputs=gr.Textbox(label="ru_input", lines=5, value=DEFAULT_RU_TEXT, placeholder=DEFAULT_RU_TEXT)
|
33 |
+
ru_lang=gr.Textbox(value='ru',visible=False)
|
34 |
+
ru_outputs=gr.Textbox(label="ru_output", lines=5, placeholder="Здесь будет обобщение и эмоциональный окрас текста...")
|
35 |
+
ru_inbtn = gr.Button("Запустить")
|
36 |
+
|
37 |
+
en_inbtn.click(
|
38 |
+
pipe.summarize.to_str(),
|
39 |
+
[en_inputs, en_lang],
|
40 |
+
[en_outputs],
|
41 |
+
)
|
42 |
+
ru_inbtn.click(
|
43 |
+
pipe.summarize.to_str(),
|
44 |
+
[ru_inputs, ru_lang],
|
45 |
+
[ru_outputs],
|
46 |
+
)
|
47 |
+
demo.launch(show_api=False)
|
poetry.lock
CHANGED
@@ -327,20 +327,20 @@ test = ["pytest (>=6)"]
|
|
327 |
|
328 |
[[package]]
|
329 |
name = "fastapi"
|
330 |
-
version = "0.
|
331 |
description = "FastAPI framework, high performance, easy to learn, fast to code, ready for production"
|
332 |
category = "main"
|
333 |
optional = false
|
334 |
-
python-versions = ">=3.
|
335 |
files = [
|
336 |
-
{file = "fastapi-0.
|
337 |
-
{file = "fastapi-0.
|
338 |
]
|
339 |
|
340 |
[package.dependencies]
|
341 |
pydantic = ">=1.7.4,<1.8 || >1.8,<1.8.1 || >1.8.1,<2.0.0 || >2.0.0,<2.0.1 || >2.0.1,<2.1.0 || >2.1.0,<3.0.0"
|
342 |
-
starlette = ">=0.
|
343 |
-
typing-extensions = ">=4.
|
344 |
|
345 |
[package.extras]
|
346 |
all = ["email-validator (>=2.0.0)", "httpx (>=0.23.0)", "itsdangerous (>=1.1.0)", "jinja2 (>=2.11.2)", "orjson (>=3.2.1)", "pydantic-extra-types (>=2.0.0)", "pydantic-settings (>=2.0.0)", "python-multipart (>=0.0.5)", "pyyaml (>=5.3.1)", "ujson (>=4.0.1,!=4.0.2,!=4.1.0,!=4.2.0,!=4.3.0,!=5.0.0,!=5.1.0)", "uvicorn[standard] (>=0.12.0)"]
|
@@ -2158,14 +2158,14 @@ files = [
|
|
2158 |
|
2159 |
[[package]]
|
2160 |
name = "starlette"
|
2161 |
-
version = "0.
|
2162 |
description = "The little ASGI library that shines."
|
2163 |
category = "main"
|
2164 |
optional = false
|
2165 |
-
python-versions = ">=3.
|
2166 |
files = [
|
2167 |
-
{file = "starlette-0.
|
2168 |
-
{file = "starlette-0.
|
2169 |
]
|
2170 |
|
2171 |
[package.dependencies]
|
@@ -2552,14 +2552,14 @@ zstd = ["zstandard (>=0.18.0)"]
|
|
2552 |
|
2553 |
[[package]]
|
2554 |
name = "uvicorn"
|
2555 |
-
version = "0.
|
2556 |
description = "The lightning-fast ASGI server."
|
2557 |
category = "main"
|
2558 |
optional = false
|
2559 |
python-versions = ">=3.8"
|
2560 |
files = [
|
2561 |
-
{file = "uvicorn-0.
|
2562 |
-
{file = "uvicorn-0.
|
2563 |
]
|
2564 |
|
2565 |
[package.dependencies]
|
@@ -2683,4 +2683,4 @@ dev = ["black (>=19.3b0)", "pytest (>=4.6.2)"]
|
|
2683 |
[metadata]
|
2684 |
lock-version = "2.0"
|
2685 |
python-versions = "^3.10"
|
2686 |
-
content-hash = "
|
|
|
327 |
|
328 |
[[package]]
|
329 |
name = "fastapi"
|
330 |
+
version = "0.109.0"
|
331 |
description = "FastAPI framework, high performance, easy to learn, fast to code, ready for production"
|
332 |
category = "main"
|
333 |
optional = false
|
334 |
+
python-versions = ">=3.8"
|
335 |
files = [
|
336 |
+
{file = "fastapi-0.109.0-py3-none-any.whl", hash = "sha256:8c77515984cd8e8cfeb58364f8cc7a28f0692088475e2614f7bf03275eba9093"},
|
337 |
+
{file = "fastapi-0.109.0.tar.gz", hash = "sha256:b978095b9ee01a5cf49b19f4bc1ac9b8ca83aa076e770ef8fd9af09a2b88d191"},
|
338 |
]
|
339 |
|
340 |
[package.dependencies]
|
341 |
pydantic = ">=1.7.4,<1.8 || >1.8,<1.8.1 || >1.8.1,<2.0.0 || >2.0.0,<2.0.1 || >2.0.1,<2.1.0 || >2.1.0,<3.0.0"
|
342 |
+
starlette = ">=0.35.0,<0.36.0"
|
343 |
+
typing-extensions = ">=4.8.0"
|
344 |
|
345 |
[package.extras]
|
346 |
all = ["email-validator (>=2.0.0)", "httpx (>=0.23.0)", "itsdangerous (>=1.1.0)", "jinja2 (>=2.11.2)", "orjson (>=3.2.1)", "pydantic-extra-types (>=2.0.0)", "pydantic-settings (>=2.0.0)", "python-multipart (>=0.0.5)", "pyyaml (>=5.3.1)", "ujson (>=4.0.1,!=4.0.2,!=4.1.0,!=4.2.0,!=4.3.0,!=5.0.0,!=5.1.0)", "uvicorn[standard] (>=0.12.0)"]
|
|
|
2158 |
|
2159 |
[[package]]
|
2160 |
name = "starlette"
|
2161 |
+
version = "0.35.1"
|
2162 |
description = "The little ASGI library that shines."
|
2163 |
category = "main"
|
2164 |
optional = false
|
2165 |
+
python-versions = ">=3.8"
|
2166 |
files = [
|
2167 |
+
{file = "starlette-0.35.1-py3-none-any.whl", hash = "sha256:50bbbda9baa098e361f398fda0928062abbaf1f54f4fadcbe17c092a01eb9a25"},
|
2168 |
+
{file = "starlette-0.35.1.tar.gz", hash = "sha256:3e2639dac3520e4f58734ed22553f950d3f3cb1001cd2eaac4d57e8cdc5f66bc"},
|
2169 |
]
|
2170 |
|
2171 |
[package.dependencies]
|
|
|
2552 |
|
2553 |
[[package]]
|
2554 |
name = "uvicorn"
|
2555 |
+
version = "0.27.0"
|
2556 |
description = "The lightning-fast ASGI server."
|
2557 |
category = "main"
|
2558 |
optional = false
|
2559 |
python-versions = ">=3.8"
|
2560 |
files = [
|
2561 |
+
{file = "uvicorn-0.27.0-py3-none-any.whl", hash = "sha256:890b00f6c537d58695d3bb1f28e23db9d9e7a17cbcc76d7457c499935f933e24"},
|
2562 |
+
{file = "uvicorn-0.27.0.tar.gz", hash = "sha256:c855578045d45625fd027367f7653d249f7c49f9361ba15cf9624186b26b8eb6"},
|
2563 |
]
|
2564 |
|
2565 |
[package.dependencies]
|
|
|
2683 |
[metadata]
|
2684 |
lock-version = "2.0"
|
2685 |
python-versions = "^3.10"
|
2686 |
+
content-hash = "a0a8f5d7bbfd3d08c83e048ee2f8e18cf31729338afa2484b5f817c387457622"
|
pyproject.toml
CHANGED
@@ -16,6 +16,8 @@ pretrainedmodels = "^0.7.4"
|
|
16 |
sentencepiece = "^0.1.99"
|
17 |
protobuf = "^4.25.1"
|
18 |
loguru = "^0.7.2"
|
|
|
|
|
19 |
|
20 |
|
21 |
[tool.poetry.group.dev.dependencies]
|
|
|
16 |
sentencepiece = "^0.1.99"
|
17 |
protobuf = "^4.25.1"
|
18 |
loguru = "^0.7.2"
|
19 |
+
fastapi = "^0.109.0"
|
20 |
+
uvicorn = "^0.27.0"
|
21 |
|
22 |
|
23 |
[tool.poetry.group.dev.dependencies]
|