File size: 3,156 Bytes
e35b927
 
 
 
 
ee970b2
e35b927
 
622b4cb
ee970b2
e35b927
 
ee970b2
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
e35b927
 
 
 
 
ee970b2
e35b927
ee970b2
 
 
 
622b4cb
 
 
 
ee970b2
 
 
 
 
 
 
e35b927
ee970b2
 
 
 
 
 
 
e35b927
 
ee970b2
e35b927
ee970b2
e35b927
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73


import gradio as gr
from transformers import pipeline
import tokenizer
from difflib import Differ, SequenceMatcher

title = "Textaleiðrétting fyrir íslensku"
description = "Hér má leiðrétta íslenskan texta með hjálp tauganets. Netið reynir að „þýða“ yfir í texta sem er í samræmi við málstaðal, og er þjálfað á bæði tilbúnum gögnum og textum úr villumálheildum sem safnað var hjá Háskóla Íslands.  \n\nBest er að setja ekki inn meira en nokkrar setningar í einu, því annars getur biðin orðið löng. Þetta er prufuútgáfa sem hefur ekki lært að leiðrétta öll þau atriði sem upp geta komið í texta og er í stöðugri þróun.  \nÞetta verkefni er unnið hjá Miðeind sem hluti af máltækniáætlun stjórnvalda."

translator = pipeline("translation", model="mideind/yfirlestur-icelandic-correction-byt5", max_length=512)

def mark_text(text, tag):
    """Helper for the diff method, returns a tuple with the text and the tag"""
    return (text, tag)
    
def mark_span(text, tag):
    """Helper for the diff method, returns the span as a list of (text, tag) tuples"""
    return [mark_text(token, tag) for token in text]
    
def markup_diff(a, b,
                mark=mark_span,
                isjunk=None):
    """Obtains the diff for the sentence along with the opcodes (tags). Returns the corrected sentence tokens along with their correction tag (in Icelandic)
    """
    seqmatcher = SequenceMatcher(isjunk=isjunk, a=a, b=b, autojunk=False)
    out_sentence_tokens = []
    # renaming tags 
    tags = {"equal": None, "delete": "eytt út", "replace": "skipt út", "insert": "bætt inn"}
    
    for tag, a0, a1, b0, b1 in seqmatcher.get_opcodes():
        if tag == "delete":
            out_sentence_tokens += mark(" ", tags[tag])
        out_sentence_tokens += mark(b[b0:b1], tags[tag])
    return out_sentence_tokens

def split_text(text):
    sentence_list = [i for i in tokenizer.split_into_sentences(text, original=True)]
    return sentence_list

def predict(text):
    texts = text.split("\n")
    translated = ""
    original = ""
    # TODO: check for way too long inputs 
    # TODO: if a sentence after splitting is over 512 bytes = split? error?
    for text in texts:
        # one or more sentences in each paragraph
        for sentence in split_text(text):
            original += sentence.strip() + " "
            translated += translator(sentence.strip())[0]["translation_text"] + " "
        original += "\n"
        translated += "\n"
    return markup_diff(original.split(" "), translated.split(" "))


demo = gr.Interface(
    fn=predict,
    inputs='text',
    outputs= gr.HighlightedText(
        show_label=False,
        show_legend=True,
        combine_adjacent=True,
        adjacent_separator=" ",
    ).style(
        color_map={"skipt út": "blue", "bætt inn": "green", "eytt út": "purple"}),
    title=title,
    description=description,
    examples=[["Kvitu fiðrildinn fljua firir utan gluggan."], ["Ég held þetta er ekki góður tími fara heimsókn."], ["Mer hlakar til jólana"], ["Kver a þenan bússtað ja eða nei"]],
)
demo.launch()