student2222333051 commited on
Commit
3196524
·
verified ·
1 Parent(s): f7744a1

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +48 -11
app.py CHANGED
@@ -15,6 +15,7 @@ ner_tagger = NewsNERTagger(embedding)
15
  # HuggingFace для английского
16
  # ============================
17
  from transformers import pipeline
 
18
  english_ner = pipeline(
19
  "ner",
20
  model="dbmdz/bert-large-cased-finetuned-conll03-english",
@@ -22,10 +23,19 @@ english_ner = pipeline(
22
  aggregation_strategy="simple"
23
  )
24
 
 
 
 
 
 
25
  # ============================
26
  # Функция распознавания сущностей
27
  # ============================
28
- def recognize_entities_auto(text):
 
 
 
 
29
  # Определяем язык
30
  try:
31
  lang = detect(text)
@@ -34,6 +44,9 @@ def recognize_entities_auto(text):
34
 
35
  entities = {"PER": [], "ORG": [], "LOC": []}
36
 
 
 
 
37
  if lang == "en":
38
  results = english_ner(text)
39
  for res in results:
@@ -52,25 +65,49 @@ def recognize_entities_auto(text):
52
  if label in ["PER", "ORG", "LOC"]:
53
  entities[label].append(span.text)
54
 
55
- # Формируем текстовый вывод
56
- output_text = ""
 
 
 
 
 
 
57
  for key, items in entities.items():
58
- if items:
59
- # Убираем дубликаты
60
- unique_items = list(dict.fromkeys(items))
61
- output_text += f"{key}: {'; '.join(unique_items)}\n"
 
 
 
 
 
 
 
 
 
 
 
 
62
 
63
- return output_text.strip() if output_text else "Сущности не найдены."
64
 
65
  # ============================
66
  # Gradio интерфейс
67
  # ============================
68
  iface = gr.Interface(
69
  fn=recognize_entities_auto,
70
- inputs=gr.Textbox(lines=15, placeholder="Введите русский или английский текст здесь..."),
71
- outputs=gr.Textbox(label="Распознанные сущности (PER/ORG/LOC)"),
 
 
 
 
 
 
72
  title="Автоматический NER для русского и английского текста",
73
- description="PER – человек, ORG – организация, LOC – место. Текст любого языка обрабатывается автоматически."
74
  )
75
 
76
  iface.launch()
 
15
  # HuggingFace для английского
16
  # ============================
17
  from transformers import pipeline
18
+
19
  english_ner = pipeline(
20
  "ner",
21
  model="dbmdz/bert-large-cased-finetuned-conll03-english",
 
23
  aggregation_strategy="simple"
24
  )
25
 
26
+ # ============================
27
+ # Метрики
28
+ # ============================
29
+ from sklearn.metrics import precision_score, recall_score, f1_score
30
+
31
  # ============================
32
  # Функция распознавания сущностей
33
  # ============================
34
+ def recognize_entities_auto(text, gold_entities=None):
35
+ """
36
+ text: текст пользователя
37
+ gold_entities: словарь с эталонными сущностями {'PER': [...], 'ORG': [...], 'LOC': [...]}
38
+ """
39
  # Определяем язык
40
  try:
41
  lang = detect(text)
 
44
 
45
  entities = {"PER": [], "ORG": [], "LOC": []}
46
 
47
+ # ============================
48
+ # NER
49
+ # ============================
50
  if lang == "en":
51
  results = english_ner(text)
52
  for res in results:
 
65
  if label in ["PER", "ORG", "LOC"]:
66
  entities[label].append(span.text)
67
 
68
+ # Убираем дубликаты
69
+ for key in entities:
70
+ entities[key] = list(dict.fromkeys(entities[key]))
71
+
72
+ # ============================
73
+ # Формируем подсветку для Gradio
74
+ # ============================
75
+ highlighted = []
76
  for key, items in entities.items():
77
+ for item in items:
78
+ highlighted.append((item, key))
79
+
80
+ # ============================
81
+ # Метрики
82
+ # ============================
83
+ metrics_text = ""
84
+ if gold_entities:
85
+ for key in ['PER','ORG','LOC']:
86
+ y_true = [1 if item in gold_entities.get(key,[]) else 0 for item in entities[key]]
87
+ y_pred = [1]*len(y_true)
88
+ if len(y_true) > 0:
89
+ precision = precision_score(y_true, y_pred, zero_division=0)
90
+ recall = recall_score(y_true, y_pred, zero_division=0)
91
+ f1 = f1_score(y_true, y_pred, zero_division=0)
92
+ metrics_text += f"{key}: Precision={precision:.2f}, Recall={recall:.2f}, F1={f1:.2f}\n"
93
 
94
+ return highlighted, metrics_text.strip()
95
 
96
  # ============================
97
  # Gradio интерфейс
98
  # ============================
99
  iface = gr.Interface(
100
  fn=recognize_entities_auto,
101
+ inputs=[
102
+ gr.Textbox(lines=15, placeholder="Введите русский или английский текст здесь..."),
103
+ gr.JSON(label="Эталонные сущности (опционально)", value={"PER":[],"ORG":[],"LOC":[]})
104
+ ],
105
+ outputs=[
106
+ gr.HighlightedText(label="Выделенные сущности"),
107
+ gr.Textbox(label="Метрики (если указаны эталонные сущности)")
108
+ ],
109
  title="Автоматический NER для русского и английского текста",
110
+ description="PER – человек, ORG – организация, LOC – место. Текст любого языка обрабатывается автоматически. Можно передать эталонные сущности для подсчёта Precision/Recall/F1."
111
  )
112
 
113
  iface.launch()