|
import gradio as gr |
|
import googlemaps |
|
from dotenv import load_dotenv |
|
import requests |
|
import pyperclip |
|
import os |
|
from PIL import Image |
|
from io import BytesIO |
|
from transformers import pipeline |
|
|
|
from messages import * |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
load_dotenv() |
|
API_KEY = os.getenv("GOOGLE_MAPS_API_KEY") |
|
gmaps = googlemaps.Client(key=API_KEY) |
|
|
|
|
|
save_path = "./saved_model" |
|
oracle = pipeline('question-answering', tokenizer=save_path, model=save_path) |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def extract_func(text, question_input, prev_addresses): |
|
oracle_output = oracle(question=question_input, context=text) |
|
answer = oracle_output['answer'] |
|
prev_addresses += f'{answer}\n' |
|
return prev_addresses |
|
|
|
def get_address(address): |
|
|
|
geocode_result = gmaps.geocode(address) |
|
formatted_address = geocode_result[0].get('formatted_address', address) |
|
|
|
return formatted_address |
|
|
|
def undo_func(addresses): |
|
new_addresses = [line for line in addresses.splitlines()] |
|
return_value = '\n'.join(new_addresses[0:-1]) |
|
return_value += '\n' |
|
return return_value |
|
|
|
def get_static_map(addresses, zoom=13): |
|
adr_list = [] |
|
adr_str = '' |
|
line_id = 1 |
|
for line in addresses.splitlines(): |
|
if len(line) < 2: |
|
continue |
|
address = get_address(line) |
|
adr_list.append(address) |
|
adr_str += f'&markers=color:red|label:{line_id}|{address}' |
|
line_id += 1 |
|
|
|
url = ( |
|
"https://maps.googleapis.com/maps/api/staticmap" |
|
"?size=900x900" |
|
f"&zoom={zoom}" |
|
f"{adr_str}" |
|
f"&key={API_KEY}" |
|
) |
|
response = requests.get(url) |
|
image = Image.open(BytesIO(response.content)) |
|
return image |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
with gr.Blocks() as demo: |
|
gr.Markdown("# ๐โโ๏ธโโก๏ธ๐ฆ๐ฆ๐ฆ๐ฉโโค๏ธโ๐จ๐ Locate All Necessary Addresses on the Google Map By Couple Clicks") |
|
with gr.Accordion("About the project", open=False): |
|
gr.Markdown(""" |
|
|
|
My wife orders _so many_ things online that sometimes I find myself chasing down a thousand packages scattered all |
|
over the cityโand occasionally even in multiple cities. The pickup locations are so random that I have to keep a |
|
mental map of all of them and try to figure out the most efficient route, like Iโm collecting Pokรฉmons. |
|
|
|
Thatโs the pain. And thatโs why I built this little spaceโfor me at first, and now for you too! |
|
Here, you can simply paste the message you get from the courier (limited only to Hebrew by now), |
|
and the amazing model [dicta-il/dictabert-heq](https://huggingface.co/dicta-il/dictabert-heq) will extract the |
|
address and add it to your list. Each new line in the address list represents a new location, |
|
so feel free to correct or clean up the entries to help the system organize better. |
|
Then hit the "Locate" button, and itโll drop pins for all your packages on the map. |
|
When you can literally see all the locations in front of you, it becomes way easier to plan your route! |
|
|
|
A bit about me: |
|
Hi, Iโm Arseniyโand Iโm currently looking for a job. This project is one of several Iโve created to support my |
|
applications. |
|
If you like this demo, please consider sharing it, giving it a like on Hugging Face, mentioning it on LinkedIn โ |
|
or OMG if you're hiring an algorithm developer / scientific researcher (please contact me!!), Iโd be thrilled to connect. ๐ฅ |
|
|
|
Thanks so much :) |
|
|
|
""") |
|
with gr.Row(): |
|
|
|
with gr.Column(): |
|
|
|
question = gr.Radio([ |
|
"ืื ืืืชืืืช?", |
|
"ืื ืืืชืืืช ืฉื ืืืฉืืื ืฉืืฉ ืืืืืขื?", |
|
"ืืืื ืืชืืืช ืืืฉืจืื ืืฉ ืืืืืขื?" |
|
], value="ืื ืืืชืืืช?", label="Questions to the Courier's Message", info="Try different questions...") |
|
message_inp = gr.Textbox(label='Input Courier Message', placeholder='Enter the text message...', lines=5) |
|
with gr.Row(): |
|
clear_btn_1 = gr.Button('Clear') |
|
new_paste_btn = gr.Button('Paste') |
|
extreact_btn = gr.Button('Extract Address', variant='primary') |
|
addresses_inp = gr.Textbox(placeholder='Enter the address...', label='Addresses (every new line is a new address and you can correct it, if needed)', |
|
lines=5, max_lines=None) |
|
undo_btn = gr.Button('Clear last row...') |
|
locate_btn = gr.Button('Locate All', variant='primary') |
|
clear_btn_2 = gr.Button('Clear') |
|
gr.Markdown('### Examples of messages of couriers') |
|
with gr.Row(): |
|
example_1_btn = gr.Button('1') |
|
example_2_btn = gr.Button('2') |
|
example_3_btn = gr.Button('3') |
|
example_4_btn = gr.Button('4') |
|
|
|
with gr.Column(): |
|
zoom = gr.Slider(1, 20, 14, step=1) |
|
with gr.Row(): |
|
b_further = gr.Button('Zoom Out') |
|
b_closer = gr.Button('Zoom In') |
|
map_out = gr.Image() |
|
|
|
|
|
extreact_btn.click(fn=extract_func, inputs=[message_inp, question, addresses_inp], outputs=addresses_inp) |
|
|
|
clear_btn_1.click(fn=lambda x: '', inputs=message_inp, outputs=message_inp) |
|
new_paste_btn.click(fn=lambda _: pyperclip.paste(), inputs=message_inp, outputs=message_inp) |
|
undo_btn.click(fn=undo_func, inputs=addresses_inp, outputs=addresses_inp) |
|
locate_btn.click(fn=get_static_map, inputs=[addresses_inp, zoom], outputs=map_out) |
|
locate_btn.click(fn=lambda x: '', inputs=message_inp, outputs=message_inp) |
|
clear_btn_2.click(fn=lambda x: '', inputs=addresses_inp, outputs=addresses_inp) |
|
|
|
example_1_btn.click(fn=lambda x: examples_dict[x], inputs=example_1_btn, outputs=message_inp) |
|
example_2_btn.click(fn=lambda x: examples_dict[x], inputs=example_2_btn, outputs=message_inp) |
|
example_3_btn.click(fn=lambda x: examples_dict[x], inputs=example_3_btn, outputs=message_inp) |
|
example_4_btn.click(fn=lambda x: examples_dict[x], inputs=example_4_btn, outputs=message_inp) |
|
|
|
zoom.change(fn=get_static_map, inputs=[addresses_inp, zoom], outputs=map_out) |
|
b_further.click(fn=lambda x: max(x-1, 1), inputs=zoom, outputs=zoom) |
|
b_closer.click(fn=lambda x: min(x+1, 20), inputs=zoom, outputs=zoom) |
|
|
|
|
|
|
|
demo.launch() |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|