File size: 3,699 Bytes
a3ca71c
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
74
75
76
77
78
79
80
81
82
83
84
# -*- coding: utf-8 -*-
import os

os.system("pip3 install torch==1.10.1+cpu torchvision==0.11.2+cpu torchaudio==0.10.1+cpu -f "
          "https://download.pytorch.org/whl/cpu/torch_stable.html")

import gradio as gr
from transformers import pipeline

import spacy
from spacy import displacy

POS_TAG_MAP = {"NOUN": "PODMET", "VERB": "PRÍSUDOK", "ADJ": "PRÍDAVNÉ MENO", "ADP": "ADPOZÍCIA",
               "ADV": "PRÍSLOVKA", "AUX": "POMOCNÉ", "CCONJ": "KORDINAČNÁ KONJUKCIA", "DET": "DETERMINANT",
               "INTJ": "CYTOSLOVCIA", "NUM": "NUMERICKÉ", "PART": "ČASTICA", "PRON": "ZÁMMENO",
               "PROPN": "VLASTNÉ MENO", "PUNCT": "INTERPUNKCIA", "SCONJ": "", "SYM": "SYMBÓL", "X": "INÉ"}

options = {"ents": list(POS_TAG_MAP.values()),
           "colors": {"PODMET": "lightblue", "PRÍSUDOK": "lightcoral",
                      "PRÍDAVNÉ MENO": "lightgreen", "VLASTNÉ MENO": "papayawhip"}}

pipe = pipeline(task='token-classification', model="crabz/slovakbert-ner")
nlp = spacy.blank("sk")


def exists_double_class(classified_ents):
    for i in range(len(classified_ents) - 1):
        if classified_ents[i][2] == classified_ents[i + 1][1]:
            return i
    return -1


def postprocess(classifications):
    entities = []
    for i in range(len(classifications)):
        entities.append((POS_TAG_MAP[classifications[i]['entity']], classifications[i]['start'],
                         classifications[i]['end']))

    while True:
        i = exists_double_class(entities)
        if i == -1:
            break

        entities.append((entities[i][0], entities[i][1], entities[i + 1][2]))
        del entities[i]
        del entities[i]
    return entities


def set_entities(sentence, entities):
    doc = nlp(sentence)
    ents = []
    for label, start, end in entities:
        ents.append(doc.char_span(start, end, label))
    try:
        doc.ents = ents
    except TypeError:
        pass
    return doc


def apply_pos(Sentence: str):
    classifications = pipe(Sentence.replace(",", " ,")
                           .replace(".", " .")
                           .replace("!", " !")
                           .replace("?", " ?")
                           .replace(":", " :"))
    entities = postprocess(classifications)
    doc = set_entities(Sentence, entities)
    displacy_html = displacy.render(doc, style="ent", options=options)
    return displacy_html


intf = gr.Interface(fn=apply_pos, inputs="text", outputs="html", title='Slovak Part-Of-Speech Tagging',
                    allow_flagging=False,
                    examples=[["Laboratóriá Úradu verejného zdravotníctva sekvenovaním potvrdili výskyt ďalších štyroch prípadov variantu omikron na Slovensku."],
                              ["Čaputová opakovane tvrdí, že \"spravodlivosť na Slovensku neplatí vždy pre všetkých rovnako\"."],
                              ["Informácie o týchto veľkolepých plánoch prišli týždeň po tom, ako sa japonský miliardár Jusaku Maezawa vrátil z 12-dňového pobytu na Medzinárodnej vesmírnej stanici (ISS), čím sa stal prvým vesmírnym turistom, ktorý cestoval na ISS za viac ako desať rokov."],
                              ["Minister financií a líder mandátovo najsilnejšieho hnutia OĽaNO Igor Matovič upozorňuje, že následky tretej vlny budú na Slovensku veľmi veľké."],
                              ["Začiatkom roka 2021 sa objavili nezhody medzi Richardom Sulíkom a šéfom hnutia OĽANO Igorom Matovičom, ktoré v istej miere pretrvávajú aj dodnes."]],
                    description="",
                    article="",
                    analytics_enabled=False)
intf.launch()