Misnik commited on
Commit
8b0efbb
·
verified ·
1 Parent(s): 5da25f1

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +47 -9
app.py CHANGED
@@ -4,16 +4,39 @@ from sentence_transformers import SentenceTransformer
4
  from langdetect import detect
5
  import re
6
 
7
- # Инициализация модели
8
- model = SentenceTransformer('all-mpnet-base-v2')
9
  kw_model = KeyBERT(model)
10
 
 
 
 
 
 
 
 
 
 
 
 
11
  def detect_language(text):
 
 
 
12
  try:
13
  return detect(text)
14
  except:
15
  return "en" # По умолчанию английский
16
 
 
 
 
 
 
 
 
 
 
17
  def segment_text(text, max_segment_length=1000):
18
  """
19
  Разделение текста на сегменты по предложениям.
@@ -36,7 +59,7 @@ def segment_text(text, max_segment_length=1000):
36
 
37
  def postprocess_keywords(keywords, min_score=0.65):
38
  """
39
- Постобработка ключевых слов.
40
  """
41
  unique_keywords = []
42
  seen = set()
@@ -49,14 +72,24 @@ def postprocess_keywords(keywords, min_score=0.65):
49
 
50
  return [kw for kw in unique_keywords if len(kw[0].split()) > 1]
51
 
 
 
 
 
 
 
 
 
52
  def extract_keywords_interface(text, top_n=15, diversity=0.4, max_ngram=3):
53
  """
54
- Извлечение ключевых слов через Gradio интерфейс.
55
  """
56
  if not text or not text.strip():
57
  return []
58
 
59
- segments = segment_text(text)
 
 
60
  all_keywords = []
61
 
62
  for segment in segments:
@@ -69,20 +102,25 @@ def extract_keywords_interface(text, top_n=15, diversity=0.4, max_ngram=3):
69
  all_keywords.extend(keywords)
70
 
71
  processed_keywords = postprocess_keywords(all_keywords)
 
72
 
73
- return [{"keyword": kw[0], "score": kw[1]} for kw in processed_keywords]
 
 
 
74
 
 
75
  iface = gr.Interface(
76
  fn=extract_keywords_interface,
77
  inputs=[
78
- gr.Textbox(label="Введите текст", lines=10),
79
- gr.Slider(5, 50, value=10, step=1, label="Количество ключевых слов (top_n)"),
80
  gr.Slider(0.0, 1.0, value=0.4, step=0.1, label="Разнообразие ключевых слов (diversity)"),
81
  gr.Slider(1, 3, value=3, step=1, label="Максимальная длина фраз (n-gram)")
82
  ],
83
  outputs="json",
84
  title="KeyBERT Extractor",
85
- description="Извлечение ключевых слов с мультиязычной поддержкой"
86
  )
87
 
88
  if __name__ == "__main__":
 
4
  from langdetect import detect
5
  import re
6
 
7
+ # Инициализация мультиязычной модели
8
+ model = SentenceTransformer('paraphrase-multilingual-MiniLM-L12-v2')
9
  kw_model = KeyBERT(model)
10
 
11
+ # Стоп-слова для разных языков
12
+ STOP_WORDS = {
13
+ "en": ["the", "and", "for", "of", "a", "in", "on", "at", "to", "is"],
14
+ "es": ["en", "de", "y", "el", "la", "un", "una", "con", "es", "por"],
15
+ "fr": ["le", "la", "un", "une", "et", "de", "en", "avec", "est"],
16
+ "pt": ["em", "de", "e", "o", "a", "com", "é", "por"],
17
+ "de": ["der", "die", "das", "und", "ein", "eine", "mit", "ist", "zu"],
18
+ "ar": ["في", "من", "و", "على", "مع", "إلى", "هو", "عن"],
19
+ # Добавьте другие языки, если необходимо
20
+ }
21
+
22
  def detect_language(text):
23
+ """
24
+ Определение языка текста.
25
+ """
26
  try:
27
  return detect(text)
28
  except:
29
  return "en" # По умолчанию английский
30
 
31
+ def clean_text(text, lang):
32
+ """
33
+ Удаление стоп-слов из текста на основе языка.
34
+ """
35
+ stop_words = STOP_WORDS.get(lang, [])
36
+ words = text.split()
37
+ cleaned_text = " ".join([word for word in words if word.lower() not in stop_words])
38
+ return cleaned_text
39
+
40
  def segment_text(text, max_segment_length=1000):
41
  """
42
  Разделение текста на сегменты по предложениям.
 
59
 
60
  def postprocess_keywords(keywords, min_score=0.65):
61
  """
62
+ Улучшенная постобработка ключевых слов.
63
  """
64
  unique_keywords = []
65
  seen = set()
 
72
 
73
  return [kw for kw in unique_keywords if len(kw[0].split()) > 1]
74
 
75
+ def evaluate_keywords(keywords, text_length):
76
+ """
77
+ Оценка качества ключевых слов.
78
+ """
79
+ avg_score = sum([kw["score"] for kw in keywords]) / len(keywords)
80
+ coverage = len(keywords) / (text_length / 100) # Ключевые слова на 100 символов
81
+ return {"average_score": avg_score, "coverage": coverage}
82
+
83
  def extract_keywords_interface(text, top_n=15, diversity=0.4, max_ngram=3):
84
  """
85
+ Извлечение ключевых слов через Gradio интерфейс с улучшенной фильтрацией.
86
  """
87
  if not text or not text.strip():
88
  return []
89
 
90
+ lang = detect_language(text)
91
+ cleaned_text = clean_text(text, lang)
92
+ segments = segment_text(cleaned_text)
93
  all_keywords = []
94
 
95
  for segment in segments:
 
102
  all_keywords.extend(keywords)
103
 
104
  processed_keywords = postprocess_keywords(all_keywords)
105
+ metrics = evaluate_keywords(processed_keywords, len(text))
106
 
107
+ return {
108
+ "keywords": [{"keyword": kw[0], "score": kw[1]} for kw in processed_keywords],
109
+ "metrics": metrics
110
+ }
111
 
112
+ # Gradio интерфейс
113
  iface = gr.Interface(
114
  fn=extract_keywords_interface,
115
  inputs=[
116
+ gr.Textbox(label="Введите текст", lines=10, placeholder="Введите текст для извлечения ключевых слов"),
117
+ gr.Slider(5, 50, value=15, step=1, label="Количество ключевых слов (top_n)"),
118
  gr.Slider(0.0, 1.0, value=0.4, step=0.1, label="Разнообразие ключевых слов (diversity)"),
119
  gr.Slider(1, 3, value=3, step=1, label="Максимальная длина фраз (n-gram)")
120
  ],
121
  outputs="json",
122
  title="KeyBERT Extractor",
123
+ description="Извлечение ключевых слов мирового уровня с поддержкой мультиязычности"
124
  )
125
 
126
  if __name__ == "__main__":