Spaces:
Sleeping
Sleeping
from PIL import Image | |
import pytesseract | |
import gradio as gr | |
from datetime import datetime | |
import os | |
from flair.data import Sentence | |
from flair.models import SequenceTagger | |
from segtok.segmenter import split_single | |
import pandas as pd | |
# tagger = SequenceTagger.load("ner-ontonotes") | |
tagger = SequenceTagger.load("flair/ner-english-ontonotes") | |
langs = [] | |
choices = os.popen("tesseract --list-langs").read().split("\n")[1:-1] | |
blocks = gr.Blocks() | |
def get_named_entities(ocr_text: str): | |
sentence = [Sentence(sent, use_tokenizer=True) for sent in split_single(ocr_text)] | |
tagger.predict(sentence) | |
entities = [] | |
for token in sentence: | |
for entity in token.get_spans("ner"): | |
entity = str(entity) | |
entities.append(entity) | |
entities = "\n".join(entities) | |
return entities | |
def run(image, lang="eng"): | |
result = pytesseract.image_to_string(image, lang=None if lang == [] else lang) | |
ner = get_named_entities(result) | |
return result, ner | |
def download_output(ocr_text: str, named_entities: str, image_name="ocr_ner_output"): | |
try: | |
named_entities_list = named_entities.split("\n") | |
now = datetime.now() | |
datetime_now = now.strftime("%Y%m%d_%H%M%S") | |
output_file = f"{image_name}_{datetime_now}.xlsx" | |
ocr_df = pd.Series(ocr_text) | |
ner_df = pd.Series(named_entities_list) | |
with pd.ExcelWriter(output_file, engine="xlsxwriter") as writer: | |
ocr_df.to_excel(writer, sheet_name="OCR text") | |
ner_df.to_excel(writer, sheet_name="Named entities") | |
return output_file | |
except Exception as e: | |
raise gr.Error(f"Something went wrong: here's the error: {e}") | |
with gr.Blocks() as demo: | |
gr.Markdown("## Theatre Programmer") | |
with gr.Row(): | |
with gr.Column(): | |
image_in = gr.Image(type="pil", mirror_webcam=False) | |
lang = gr.Dropdown(choices, value="eng", label="Select language") | |
btn = gr.Button("Run") | |
with gr.Column(): | |
ocr_text = gr.TextArea(label="OCR output") | |
with gr.Column(): | |
ner = gr.TextArea(label="Named entities") | |
# with gr.Column(): | |
# gr.CheckboxGroup(ner, label="Named entities") | |
with gr.Row(): | |
download_btn = gr.Button("Download output") | |
btn.click(fn=run, inputs=[image_in, lang], outputs=[ocr_text, ner]) | |
download_btn.click( | |
fn=download_output, | |
inputs=[ocr_text, ner], | |
outputs=[gr.components.File()], | |
) | |
demo.launch() | |