Update app.py
Browse files
app.py
CHANGED
|
@@ -1,14 +1,13 @@
|
|
| 1 |
import gradio as gr
|
| 2 |
from keybert import KeyBERT
|
| 3 |
from sentence_transformers import SentenceTransformer
|
| 4 |
-
from nltk.tokenize import sent_tokenize
|
| 5 |
from langdetect import detect
|
| 6 |
-
import
|
| 7 |
|
| 8 |
-
#
|
| 9 |
-
|
|
|
|
| 10 |
|
| 11 |
-
# Поддерживаемые языки
|
| 12 |
SUPPORTED_LANGUAGES = {
|
| 13 |
"en": "english",
|
| 14 |
"es": "spanish",
|
|
@@ -19,10 +18,6 @@ SUPPORTED_LANGUAGES = {
|
|
| 19 |
"ar": "arabic"
|
| 20 |
}
|
| 21 |
|
| 22 |
-
# Инициализация модели
|
| 23 |
-
model = SentenceTransformer('all-mpnet-base-v2')
|
| 24 |
-
kw_model = KeyBERT(model)
|
| 25 |
-
|
| 26 |
def detect_language(text):
|
| 27 |
"""
|
| 28 |
Определение языка текста.
|
|
@@ -31,17 +26,20 @@ def detect_language(text):
|
|
| 31 |
lang = detect(text)
|
| 32 |
return SUPPORTED_LANGUAGES.get(lang, "english") # По умолчанию английский
|
| 33 |
except:
|
| 34 |
-
return "english"
|
| 35 |
|
| 36 |
def segment_text(text, max_segment_length=1000):
|
| 37 |
"""
|
| 38 |
-
Разделение текста на блоки
|
| 39 |
"""
|
| 40 |
-
|
| 41 |
-
|
|
|
|
|
|
|
|
|
|
| 42 |
segments = []
|
| 43 |
current_segment = ""
|
| 44 |
-
|
| 45 |
for sentence in sentences:
|
| 46 |
if len(current_segment) + len(sentence) <= max_segment_length:
|
| 47 |
current_segment += " " + sentence
|
|
@@ -51,7 +49,7 @@ def segment_text(text, max_segment_length=1000):
|
|
| 51 |
|
| 52 |
if current_segment:
|
| 53 |
segments.append(current_segment.strip())
|
| 54 |
-
|
| 55 |
return segments
|
| 56 |
|
| 57 |
def postprocess_keywords(keywords):
|
|
@@ -63,12 +61,10 @@ def postprocess_keywords(keywords):
|
|
| 63 |
|
| 64 |
for kw in sorted(keywords, key=lambda x: len(x[0]), reverse=True):
|
| 65 |
if kw[0] not in seen:
|
| 66 |
-
# Удаляем вложенные ключи
|
| 67 |
if not any(kw[0] in u_kw[0] for u_kw in unique_keywords):
|
| 68 |
unique_keywords.append(kw)
|
| 69 |
seen.add(kw[0])
|
| 70 |
-
|
| 71 |
-
# Удаляем слишком короткие ключевые слова
|
| 72 |
filtered_keywords = [
|
| 73 |
kw for kw in unique_keywords if len(kw[0].split()) > 1
|
| 74 |
]
|
|
@@ -94,7 +90,6 @@ def extract_keywords_interface(text, top_n=10, diversity=0.5, max_ngram=3):
|
|
| 94 |
)
|
| 95 |
all_keywords.extend(keywords)
|
| 96 |
|
| 97 |
-
# Постобработка: удаление повторений и вложений
|
| 98 |
processed_keywords = postprocess_keywords(all_keywords)
|
| 99 |
|
| 100 |
return [{"keyword": kw[0], "score": kw[1]} for kw in processed_keywords]
|
|
|
|
| 1 |
import gradio as gr
|
| 2 |
from keybert import KeyBERT
|
| 3 |
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 |
SUPPORTED_LANGUAGES = {
|
| 12 |
"en": "english",
|
| 13 |
"es": "spanish",
|
|
|
|
| 18 |
"ar": "arabic"
|
| 19 |
}
|
| 20 |
|
|
|
|
|
|
|
|
|
|
|
|
|
| 21 |
def detect_language(text):
|
| 22 |
"""
|
| 23 |
Определение языка текста.
|
|
|
|
| 26 |
lang = detect(text)
|
| 27 |
return SUPPORTED_LANGUAGES.get(lang, "english") # По умолчанию английский
|
| 28 |
except:
|
| 29 |
+
return "english"
|
| 30 |
|
| 31 |
def segment_text(text, max_segment_length=1000):
|
| 32 |
"""
|
| 33 |
+
Разделение текста на блоки по предложениям без использования punkt.
|
| 34 |
"""
|
| 35 |
+
# Определяем язык (может быть полезно для будущих улучшений)
|
| 36 |
+
detect_language(text)
|
| 37 |
+
|
| 38 |
+
# Разбиваем текст на предложения по точкам, восклицательным и вопросительным знакам
|
| 39 |
+
sentences = re.split(r'(?<=[.!?]) +', text)
|
| 40 |
segments = []
|
| 41 |
current_segment = ""
|
| 42 |
+
|
| 43 |
for sentence in sentences:
|
| 44 |
if len(current_segment) + len(sentence) <= max_segment_length:
|
| 45 |
current_segment += " " + sentence
|
|
|
|
| 49 |
|
| 50 |
if current_segment:
|
| 51 |
segments.append(current_segment.strip())
|
| 52 |
+
|
| 53 |
return segments
|
| 54 |
|
| 55 |
def postprocess_keywords(keywords):
|
|
|
|
| 61 |
|
| 62 |
for kw in sorted(keywords, key=lambda x: len(x[0]), reverse=True):
|
| 63 |
if kw[0] not in seen:
|
|
|
|
| 64 |
if not any(kw[0] in u_kw[0] for u_kw in unique_keywords):
|
| 65 |
unique_keywords.append(kw)
|
| 66 |
seen.add(kw[0])
|
| 67 |
+
|
|
|
|
| 68 |
filtered_keywords = [
|
| 69 |
kw for kw in unique_keywords if len(kw[0].split()) > 1
|
| 70 |
]
|
|
|
|
| 90 |
)
|
| 91 |
all_keywords.extend(keywords)
|
| 92 |
|
|
|
|
| 93 |
processed_keywords = postprocess_keywords(all_keywords)
|
| 94 |
|
| 95 |
return [{"keyword": kw[0], "score": kw[1]} for kw in processed_keywords]
|