vanessbut commited on
Commit
3398f67
·
1 Parent(s): 32a6c52

Добавлено описание.

Browse files
Files changed (1) hide show
  1. app.py +20 -2
app.py CHANGED
@@ -15,7 +15,22 @@ os.system("python3 -m spacy download en")
15
  st.markdown("""### TL;DR: give me the keywords!
16
  Здесь вы можете получить отранжированный список ключевых слов по названию и аннотации статьи.
17
 
18
- Единственным поддерживаемым языком является английский.""")
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
19
 
20
  st.markdown("<p style=\"text-align:center\"><img width=100% src='https://c.tenor.com/IKt-6tAk9CUAAAAd/thats-a-lot-of-words-lots-of-words.gif'></p>", unsafe_allow_html=True)
21
 
@@ -52,9 +67,9 @@ def get_nlp(nlp_name):
52
  # Вообще, стоит найти pipeline, заточенный под научный текст.
53
  # Но этим займёмся потом, если будет время.
54
  nlp_name = 'en_core_web_sm'
 
55
  main_nlp = get_nlp(nlp_name)
56
 
57
-
58
  # Получение модели.
59
 
60
  #@st.cache(hash_funcs={transformers.tokenizers.Tokenizer: lambda _: None})
@@ -65,11 +80,13 @@ def get_model_and_tokenizer(model_name):
65
  return model, tokenizer
66
 
67
  model_name = "distilroberta-base"
 
68
  main_model, main_tokenizer = get_model_and_tokenizer(model_name)
69
 
70
 
71
  # Обработка текста.
72
 
 
73
  text = preprocess([title + ". " + abstract])[0]
74
 
75
  if not text is None and len(text) > 0:
@@ -93,6 +110,7 @@ if not text is None and len(text) > 0:
93
  ax.set_title("95% самых важных ключевых слов")
94
  ax.grid(color='#000000', alpha=0.15, linestyle='-', linewidth=1, which='major')
95
  ax.grid(color='#000000', alpha=0.1, linestyle='-', linewidth=0.5, which='minor')
 
96
 
97
  bar_width = 0.75
98
  indexes = -np.arange(len(labels))
 
15
  st.markdown("""### TL;DR: give me the keywords!
16
  Здесь вы можете получить отранжированный список ключевых слов по названию и аннотации статьи.
17
 
18
+ Единственным поддерживаемым языком является английский.
19
+
20
+ *Примечание:* сервис использует трансформеры для получения эмбеддингов текста, а не для классификации напрямую.
21
+ Этот подход имеет свои плюсы и минусы.
22
+
23
+ Плюсы:
24
+ - Возможность работы с любым текстом, для которого трансформер более-менее корректно генерирует эмбеддинги.
25
+ - Ключевые слова берутся из самого текста, их набор не ограничен заранее заданным множеством классов.
26
+ - Нет сильного перевеса в сторону одного ключевого слова, как это бывает у хорошо обученных классификаторов.
27
+
28
+ Минусы:
29
+ - Чем меньше текст, тем меньше вариантов для ключевых слов. Зачастую, только по названию можно получить не более одного ключевого слова.
30
+ - Чем больше текст, тем больше мусорных слов будут попадать в список. Правда, обычно нейронная сеть даёт им маленький скор, отправляя вниз списка.
31
+
32
+ *К сожалению, я не успел реализовать анализ тематики текстов (дополнительная функциональность, которую я тоже хотел сделать), так как для этого требуется загружать на spaces массивные файлы.
33
+ Пример анализа тематики можно увидеть в приложенном блокноте.*""")
34
 
35
  st.markdown("<p style=\"text-align:center\"><img width=100% src='https://c.tenor.com/IKt-6tAk9CUAAAAd/thats-a-lot-of-words-lots-of-words.gif'></p>", unsafe_allow_html=True)
36
 
 
67
  # Вообще, стоит найти pipeline, заточенный под научный текст.
68
  # Но этим займёмся потом, если будет время.
69
  nlp_name = 'en_core_web_sm'
70
+ st.markdown("*Загрузка языка...* (~1 с)")
71
  main_nlp = get_nlp(nlp_name)
72
 
 
73
  # Получение модели.
74
 
75
  #@st.cache(hash_funcs={transformers.tokenizers.Tokenizer: lambda _: None})
 
80
  return model, tokenizer
81
 
82
  model_name = "distilroberta-base"
83
+ st.markdown("*Загрузка модели...* (~3 с)")
84
  main_model, main_tokenizer = get_model_and_tokenizer(model_name)
85
 
86
 
87
  # Обработка текста.
88
 
89
+ st.markdown("*Обработка текста...* (~1 с)")
90
  text = preprocess([title + ". " + abstract])[0]
91
 
92
  if not text is None and len(text) > 0:
 
110
  ax.set_title("95% самых важных ключевых слов")
111
  ax.grid(color='#000000', alpha=0.15, linestyle='-', linewidth=1, which='major')
112
  ax.grid(color='#000000', alpha=0.1, linestyle='-', linewidth=0.5, which='minor')
113
+ ax.set_ylim([-1, len(keywords)])
114
 
115
  bar_width = 0.75
116
  indexes = -np.arange(len(labels))