File size: 6,786 Bytes
3d4ee72
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
3cfcf7e
3d4ee72
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
3cfcf7e
3d4ee72
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
import streamlit as st
from spacy import displacy
from Model.NER.VLSP2021.Predict_Ner import ViTagger
import re

import torch




device = torch.device("cuda" if torch.cuda.is_available() else "cpu")

def process_text(text):
    # Loại bỏ dấu cách thừa và dấu cách ở đầu và cuối văn bản
    processed_text = re.sub(r'\s+', ' ', text.strip())
    return processed_text

def show_ner():

    st.sidebar.title('Datasets')
    dataset = st.sidebar.selectbox("Datasets", ("VLSP2016", "VLSP2021"))
    st.header("NER")
    text = st.text_area("Enter your text for NER:", height=300)
    text = process_text(text)
    if st.button("Process NER"):
        if dataset == "VLSP2021":
                tagger = ViTagger(model_path='Model/NER/VLSP2021/best_model.pt')
                a = text
                b = tagger.extract_entity_doc(a)

                # Danh sách các từ và nhãn NER
                # words_and_labels = [('Dự', 'O'), ('báo', 'O'), ('thời', 'O'), ('tiết', 'O'), ('2 ngày', 'DATETIME-DATERANGE'), ('tới', 'O'), ('Nam   Bộ', 'LOCATION-GPE'), ('có', 'O'), ('mưa', 'O'), ('dông', 'O')]
                words_and_labels = b
                # Tạo danh sách từ
                words = [word for word, _ in words_and_labels]
                # Tạo danh sách thực thể và nhãn cho mỗi từ, loại bỏ nhãn 'O'
                entities = [{'start': sum(len(word) + 1 for word, _ in words_and_labels[:i]),
                             'end': sum(len(word) + 1 for word, _ in words_and_labels[:i + 1]), 'label': label} for
                            i, (word, label)
                            in enumerate(words_and_labels) if label != 'O']
                # print(entities)

                # Render the visualization without color for 'O' labels
                html = displacy.render(
                    {"text": " ".join(words), "ents": entities, "title": None},
                    style="ent",
                    manual=True,
                    options={"colors": {"DATETIME-DATERANGE": "#66c2ff",
                                        "LOCATION-GPE": "#ffcc99",
                                        "O": None,  # Màu cho nhãn 'O'
                                        "QUANTITY-NUM": "#ffdf80",
                                        "EVENT-CUL": "#bfbfbf",
                                        "DATETIME": "#80ff80",
                                        "PERSONTYPE": "#ff80ff",
                                        "PERSON": "#bf80ff",
                                        "QUANTITY-PER": "#80cccc",
                                        "ORGANIZATION": "#ff6666",
                                        "LOCATION-GEO": "#66cc66",
                                        "LOCATION-STRUC": "#cccc66",
                                        "PRODUCT-COM": "#ffff66",
                                        "DATETIME-DATE": "#66cccc",
                                        "QUANTITY-DIM": "#6666ff",
                                        "PRODUCT": "#cc6666",
                                        "QUANTITY": "#6666cc",
                                        "DATETIME-DURATION": "#9966ff",
                                        "QUANTITY-CUR": "#ff9966",
                                        "DATETIME-TIME": "#cdbf93",
                                        "QUANTITY-TEM": "#cc9966",
                                        "DATETIME-TIMERANGE": "#cc8566",
                                        "EVENT-GAMESHOW": "#8c8c5a",
                                        "QUANTITY-AGE": "#70db70",
                                        "QUANTITY-ORD": "#e699ff",
                                        "PRODUCT-LEGAL": "#806699",
                                        "LOCATION": "#993366",
                                        "ORGANIZATION-MED": "#339933",
                                        "URL": "#ff4d4d",
                                        "PHONENUMBER": "#99cc99",
                                        "ORGANIZATION-SPORTS": "#6666ff",
                                        "EVENT-SPORT": "#ffff80",
                                        "SKILL": "#b38f66",
                                        "EVENT-NATURAL": "#ff9966",
                                        "ADDRESS": "#cc9966",
                                        "IP": "#b38f66",
                                        "EMAIL": "#cc8566",
                                        "ORGANIZATION-STOCK": "#666633",
                                        "DATETIME-SET": "#70db70",
                                        "PRODUCT-AWARD": "#e699ff",
                                        "MISCELLANEOUS": "#806699",
                                        "LOCATION-GPE-GEO": "#99ffff"}}
                )
                # print(html)
                st.markdown(html, unsafe_allow_html=True)
        elif dataset == "VLSP2016":
                tagger = ViTagger(model_path='Model/NER/VLSP2016/best_model.pt')
                a = text
                b = tagger.extract_entity_doc(a)

                # Danh sách các từ và nhãn NER
                # words_and_labels = [('Dự', 'O'), ('báo', 'O'), ('thời', 'O'), ('tiết', 'O'), ('2 ngày', 'DATETIME-DATERANGE'), ('tới', 'O'), ('Nam   Bộ', 'LOCATION-GPE'), ('có', 'O'), ('mưa', 'O'), ('dông', 'O')]
                words_and_labels = b
                # Tạo danh sách từ
                words = [word for word, _ in words_and_labels]
                # Tạo danh sách thực thể và nhãn cho mỗi từ, loại bỏ nhãn 'O'
                entities = [{'start': sum(len(word) + 1 for word, _ in words_and_labels[:i]),
                             'end': sum(len(word) + 1 for word, _ in words_and_labels[:i + 1]), 'label': label} for
                            i, (word, label)
                            in enumerate(words_and_labels) if label != 'O']
                # print(entities)

                # Render the visualization without color for 'O' labels
                html = displacy.render(
                    {"text": " ".join(words), "ents": entities, "title": None},
                    style="ent",
                    manual=True,
                    options={"colors": {"MISC": "#806699",
                                        "ORG": "#ff6666",
                                        "LOC": "#66cc66",
                                        "PER": "#bf80ff",
                                        "O": None}}
                )
                # print(html)
                st.markdown(html, unsafe_allow_html=True)





        # Sử dụng widget st.html để hiển thị HTML

    # Hiển thị văn bản đã nhập
    # st.write("Văn bản đã nhập:", text)