File size: 3,261 Bytes
2fc3c84
 
13d7daa
2fc3c84
1e516ec
 
2fc3c84
1e516ec
2fc3c84
1e516ec
 
2fc3c84
 
 
1e516ec
2fc3c84
1e516ec
 
 
 
 
 
 
 
2fc3c84
 
1e516ec
 
 
 
 
 
 
 
 
 
 
13d7daa
 
dfd905e
 
1e516ec
 
13d7daa
1e516ec
 
 
 
 
 
 
 
 
 
 
 
2fc3c84
1e516ec
 
 
 
13d7daa
1e516ec
 
 
 
 
 
 
2fc3c84
1e516ec
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
import gradio as gr
import torch
from transformers import AutoTokenizer, AutoModelForTokenClassification, pipeline

def get_ner_bio(pipe,text):
    tok_text = pipe.tokenizer(text, return_tensors='pt')
    with torch.no_grad():
        logits = pipe.model(**tok_text).logits.argmax(-1)
        predicted_tokens_classes = [
          pipe.model.config.id2label[t.item()] for t in logits[0]
        ]

        predicted_labels = []
        previous_token_id = 0
        word_ids = tok_text.word_ids()
        for word_index in range(len(word_ids)):
          if not (word_ids[word_index] == None or word_ids[word_index] == previous_token_id):
              predicted_labels.append(predicted_tokens_classes[word_index])
          previous_token_id = word_ids[word_index]

        ner_output = [
            (word, label if label!="O" else None) 
            for word, label in zip(text.split(" "),predicted_labels)
        ]
        return ner_output

def get_ner(pipe,text,aggregation_strategy="first"):

  if aggregation_strategy == "bio_first":
    return get_ner_bio(pipe,text)
  else:
    results = pipe(text,aggregation_strategy=aggregation_strategy)
    for result in results:
      result["entity"] = result["entity_group"]
    return {"text": text, "entities": results} 

ner_models = [
  "livinNector/TaNER-500",
  "livinNector/TaNER-1k",
  "livinNector/IndicBERTv2-MLM-only-NER",
  "ai4bharat/IndicNER",
  "livinNector/IndicBERTNER",
  "livinNector/IndicNER",
  "livinNector/xlm-roberta-base-ner",
  "livinNector/distilbert-multilingual-base-ner"
]
ner_pipes = [pipeline("token-classification",model) for model in ner_models]

def get_ner_outputs(text,aggregation_strategy):
  return [get_ner(pipe,text,aggregation_strategy) for pipe in ner_pipes]
examples = [
        ["ஆனந்த் மற்றும் லிவின் நெக்டர் ஆகியொர் அண்ணாமலை பல்கலைக்கழகத்தில் படித்து வருகின்றனர்.","first"],
        ["இந்தியன் இன்ஸ்டிட்யூட் ஆஃப் டெக்னாலஜி மெட்ராஸ் கிண்டியில் அமைந்துள்ளது.","average"],
        ["சச்சின் டெண்டுல்கர் மும்பை மாநகரத்தைச் சேர்ந்த ஒரு நடுத்தரக் குடும்பத்தில் நான்காவது குழந்தையாகப் பிறந்தார். பல துடுப்பாட்ட வீரர்களை உருவாக்கிய சாரதாஷ்ரம் வித்யாமந்திர் பள்ளியில் சேர்ந்தார்.","bio_first"]

    ]

iface = gr.Interface(
    get_ner_outputs,
    [
        gr.Textbox(value=examples[0][0]),
        gr.Dropdown(["bio_first", "first", "max", "average"],value=examples[0][1])
     ],
    [gr.Highlight(label=model) for model in ner_models], 
    description='Named Entity Recongnition Interface Comparing Various Transformer Based NER models for Tamil Language.',
    examples=examples, 
    title='TaNER',
    
    )

iface.launch(enable_queue=True)