Misnik commited on
Commit
c4397ff
·
verified ·
1 Parent(s): 50458b0

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +48 -11
app.py CHANGED
@@ -1,11 +1,52 @@
1
  import gradio as gr
2
  from keybert import KeyBERT
3
  from sentence_transformers import SentenceTransformer
 
4
 
5
  # Инициализация модели
6
  model = SentenceTransformer('all-mpnet-base-v2')
7
  kw_model = KeyBERT(model)
8
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
9
  def extract_keywords_interface(text, top_n=10, diversity=0.5, max_ngram=3):
10
  """
11
  Извлечение ключевых слов через Gradio интерфейс.
@@ -14,7 +55,7 @@ def extract_keywords_interface(text, top_n=10, diversity=0.5, max_ngram=3):
14
  return []
15
 
16
  # Разбиваем текст на блоки
17
- segments = [text[i:i+1000] for i in range(0, len(text), 1000)]
18
  all_keywords = []
19
 
20
  for segment in segments:
@@ -26,27 +67,23 @@ def extract_keywords_interface(text, top_n=10, diversity=0.5, max_ngram=3):
26
  )
27
  all_keywords.extend(keywords)
28
 
29
- # Удаляем дубликаты
30
- seen = set()
31
- unique_keywords = []
32
- for kw in all_keywords:
33
- if kw[0] not in seen:
34
- seen.add(kw[0])
35
- unique_keywords.append(kw)
36
 
37
- return [{"keyword": kw[0], "score": kw[1]} for kw in unique_keywords]
38
 
39
  # Gradio интерфейс
40
  iface = gr.Interface(
41
  fn=extract_keywords_interface,
42
  inputs=[
43
- gr.Textbox(label="Введите текст", lines=10),
44
  gr.Slider(5, 50, value=10, step=1, label="Количество ключевых слов (top_n)"),
45
  gr.Slider(0.0, 1.0, value=0.5, step=0.1, label="Разнообразие ключевых слов (diversity)"),
46
  gr.Slider(1, 3, value=3, step=1, label="Максимальная длина фраз (n-gram)")
47
  ],
48
  outputs="json",
49
- title="KeyBERT Extractor"
 
50
  )
51
 
52
  if __name__ == "__main__":
 
1
  import gradio as gr
2
  from keybert import KeyBERT
3
  from sentence_transformers import SentenceTransformer
4
+ from nltk.tokenize import sent_tokenize
5
 
6
  # Инициализация модели
7
  model = SentenceTransformer('all-mpnet-base-v2')
8
  kw_model = KeyBERT(model)
9
 
10
+ def segment_text(text, max_segment_length=1000):
11
+ """
12
+ Разделение текста на блоки, предпочтительно по предложениям.
13
+ """
14
+ sentences = sent_tokenize(text)
15
+ segments = []
16
+ current_segment = ""
17
+
18
+ for sentence in sentences:
19
+ if len(current_segment) + len(sentence) <= max_segment_length:
20
+ current_segment += " " + sentence
21
+ else:
22
+ segments.append(current_segment.strip())
23
+ current_segment = sentence
24
+
25
+ if current_segment:
26
+ segments.append(current_segment.strip())
27
+
28
+ return segments
29
+
30
+ def postprocess_keywords(keywords):
31
+ """
32
+ Постобработка ключевых слов: удаление вложенных ключей и коротких/шумных фраз.
33
+ """
34
+ unique_keywords = []
35
+ seen = set()
36
+
37
+ for kw in sorted(keywords, key=lambda x: len(x[0]), reverse=True):
38
+ if kw[0] not in seen:
39
+ # Удаляем вложенные ключи
40
+ if not any(kw[0] in u_kw[0] for u_kw in unique_keywords):
41
+ unique_keywords.append(kw)
42
+ seen.add(kw[0])
43
+
44
+ # Удаляем слишком короткие ключевые слова
45
+ filtered_keywords = [
46
+ kw for kw in unique_keywords if len(kw[0].split()) > 1
47
+ ]
48
+ return filtered_keywords
49
+
50
  def extract_keywords_interface(text, top_n=10, diversity=0.5, max_ngram=3):
51
  """
52
  Извлечение ключевых слов через Gradio интерфейс.
 
55
  return []
56
 
57
  # Разбиваем текст на блоки
58
+ segments = segment_text(text, max_segment_length=1000)
59
  all_keywords = []
60
 
61
  for segment in segments:
 
67
  )
68
  all_keywords.extend(keywords)
69
 
70
+ # Постобработка: удаление повторений и вложений
71
+ processed_keywords = postprocess_keywords(all_keywords)
 
 
 
 
 
72
 
73
+ return [{"keyword": kw[0], "score": kw[1]} for kw in processed_keywords]
74
 
75
  # Gradio интерфейс
76
  iface = gr.Interface(
77
  fn=extract_keywords_interface,
78
  inputs=[
79
+ gr.Textbox(label="Введите текст", lines=10, placeholder="Введите текст для извлечения ключевых слов"),
80
  gr.Slider(5, 50, value=10, step=1, label="Количество ключевых слов (top_n)"),
81
  gr.Slider(0.0, 1.0, value=0.5, step=0.1, label="Разнообразие ключевых слов (diversity)"),
82
  gr.Slider(1, 3, value=3, step=1, label="Максимальная длина фраз (n-gram)")
83
  ],
84
  outputs="json",
85
+ title="KeyBERT Extractor",
86
+ description="Введите текст, настройте параметры и получите ключевые слова"
87
  )
88
 
89
  if __name__ == "__main__":