Yerzhxn commited on
Commit
0558690
·
verified ·
1 Parent(s): dd4787a

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +35 -56
app.py CHANGED
@@ -2,36 +2,21 @@ import re
2
  import pandas as pd
3
  import pymorphy2
4
  from sklearn.feature_extraction.text import TfidfVectorizer
5
- from sklearn.metrics.pairwise import cosine_similarity
6
- from sklearn.metrics import accuracy_score
7
  from translate import Translator
8
- import streamlit as st
 
 
9
  # Инициализация морфологического анализатора
10
  morph = pymorphy2.MorphAnalyzer()
11
 
 
12
  nkz_list = pd.read_csv('filtered_nkz.csv')
13
 
14
-
15
-
16
- # Предобработка данных
17
-
18
-
19
-
20
-
21
-
22
-
23
-
24
- from translate import Translator
25
 
26
  def translate_text(text, from_lang='kk', to_lang='ru'):
27
- """
28
- Перевод текста с одного языка на другой.
29
-
30
- :param text: Исходный текст для перевода.
31
- :param from_lang: Язык исходного текста (по умолчанию казахский 'kk').
32
- :param to_lang: Язык перевода (по умолчанию русский 'ru').
33
- :return: Переведённый текст.
34
- """
35
  try:
36
  translator = Translator(from_lang=from_lang, to_lang=to_lang)
37
  translated_text = translator.translate(text)
@@ -40,11 +25,6 @@ def translate_text(text, from_lang='kk', to_lang='ru'):
40
  print(f"Ошибка перевода: {e}")
41
  return text # Возвращаем исходный текст в случае ошибки
42
 
43
- # Уникальные казахские буквы
44
- kazakh_letters = set("әғқңөұүі")
45
-
46
-
47
-
48
  def preprocess_text(text):
49
  """Функция для предобработки текста: перевод, очистка, приведение к нижнему регистру, лемматизация."""
50
  if not isinstance(text, str):
@@ -61,44 +41,43 @@ def preprocess_text(text):
61
  lemmas = [morph.parse(word)[0].normal_form for word in words] # Лемматизация
62
  return ' '.join(lemmas)
63
 
64
-
65
- # Updated model paths
66
- def find_best_matches(profession, nkz_list, vectorizer, tfidf_nkz, top_n=10):
67
- """Находит топ-10 наилучших соответствий для одной профессии в списке НКЗ."""
 
 
 
 
 
 
 
 
 
 
 
 
68
  # Предобработка профессии
69
  processed_profession = preprocess_text(profession)
70
 
71
- # Преобразование векторной модели
72
- tfidf_profession = vectorizer.transform([processed_profession])
73
 
74
- # Вычисление схожести
75
- similarity = cosine_similarity(tfidf_profession, tfidf_nkz)
76
 
77
- # Получаем индексы топ-N самых схожих профессий
78
- top_n_idx = similarity[0].argsort()[-top_n:][::-1] # Сортируем по убыванию
79
-
80
  # Формируем результат
81
  top_matches = []
82
- for idx in top_n_idx:
83
  top_matches.append({
84
  'profession': profession,
85
  'nkz_match': nkz_list.iloc[idx]['NAME_RU2'],
86
- 'nkz_code': nkz_list.iloc[idx]['CODE'], # Код НКЗ
87
- 'similarity': similarity[0][idx]
88
  })
 
89
  dfs = pd.DataFrame(top_matches)
90
- return dfs
91
-
92
-
93
-
94
-
95
-
96
-
97
- nkz_list['cleaned'] = nkz_list['NAME_RU2'].apply(preprocess_text)
98
-
99
- vectorizer = TfidfVectorizer()
100
- tfidf_nkz = vectorizer.fit_transform(nkz_list['cleaned'])
101
-
102
  # Streamlit app
103
  st.title("Occupation Similarity Finder")
104
 
@@ -107,13 +86,13 @@ text1 = st.text_input("Enter the occupation to compare:", "Оператор пу
107
  if st.button("Find Similar Occupations"):
108
  try:
109
  # Find similar occupations
110
- result = find_best_matches(text1, nkz_list, vectorizer, tfidf_nkz, top_n=10)
111
  # similar_texts = find_similar_combined(text1, k=5)
112
  # similar_texts_df = pd.DataFrame(similar_texts)
113
  # Display results
114
- if result is not None:
115
  st.write("Similar Occupations:")
116
- st.dataframe(result)
117
  # st.dataframe(similar_texts_df)
118
  else:
119
  st.warning("No similar occupations found.")
 
2
  import pandas as pd
3
  import pymorphy2
4
  from sklearn.feature_extraction.text import TfidfVectorizer
 
 
5
  from translate import Translator
6
+ import faiss
7
+ import numpy as np
8
+
9
  # Инициализация морфологического анализатора
10
  morph = pymorphy2.MorphAnalyzer()
11
 
12
+ # Загрузка списка НКЗ
13
  nkz_list = pd.read_csv('filtered_nkz.csv')
14
 
15
+ # Уникальные казахские буквы
16
+ kazakh_letters = set("әғқңөұүі")
 
 
 
 
 
 
 
 
 
17
 
18
  def translate_text(text, from_lang='kk', to_lang='ru'):
19
+ """Перевод текста с одного языка на другой."""
 
 
 
 
 
 
 
20
  try:
21
  translator = Translator(from_lang=from_lang, to_lang=to_lang)
22
  translated_text = translator.translate(text)
 
25
  print(f"Ошибка перевода: {e}")
26
  return text # Возвращаем исходный текст в случае ошибки
27
 
 
 
 
 
 
28
  def preprocess_text(text):
29
  """Функция для предобработки текста: перевод, очистка, приведение к нижнему регистру, лемматизация."""
30
  if not isinstance(text, str):
 
41
  lemmas = [morph.parse(word)[0].normal_form for word in words] # Лемматизация
42
  return ' '.join(lemmas)
43
 
44
+ # Очистка данных в НКЗ
45
+ nkz_list['cleaned'] = nkz_list['NAME_RU2'].apply(preprocess_text)
46
+
47
+ # Векторизация данных с использованием TF-IDF
48
+ vectorizer = TfidfVectorizer()
49
+ tfidf_nkz = vectorizer.fit_transform(nkz_list['cleaned']).toarray() # Преобразуем в плотный массив
50
+
51
+ # Создание FAISS индекса
52
+ dimension = tfidf_nkz.shape[1] # Размерность векторов
53
+ faiss_index = faiss.IndexFlatL2(dimension) # Индекс с метрикой L2 (евклидово расстояние)
54
+
55
+ # Добавление данных в FAISS
56
+ faiss_index.add(np.array(tfidf_nkz, dtype='float32'))
57
+
58
+ def find_best_matches_faiss(profession, nkz_list, vectorizer, faiss_index, top_n=10):
59
+ """Находит топ-N наилучших соответствий для одной профессии с использованием FAISS."""
60
  # Предобработка профессии
61
  processed_profession = preprocess_text(profession)
62
 
63
+ # Преобразование профессии в TF-IDF вектор
64
+ tfidf_profession = vectorizer.transform([processed_profession]).toarray().astype('float32')
65
 
66
+ # Поиск ближайших соседей в FAISS
67
+ distances, indices = faiss_index.search(tfidf_profession, top_n)
68
 
 
 
 
69
  # Формируем результат
70
  top_matches = []
71
+ for i, idx in enumerate(indices[0]):
72
  top_matches.append({
73
  'profession': profession,
74
  'nkz_match': nkz_list.iloc[idx]['NAME_RU2'],
75
+ 'nkz_code': nkz_list.iloc[idx]['CODE'],
76
+ 'similarity': 1 / (1 + distances[0][i]) # Преобразование расстояния L2 в условную схожесть
77
  })
78
+
79
  dfs = pd.DataFrame(top_matches)
80
+ return dfs
 
 
 
 
 
 
 
 
 
 
 
81
  # Streamlit app
82
  st.title("Occupation Similarity Finder")
83
 
 
86
  if st.button("Find Similar Occupations"):
87
  try:
88
  # Find similar occupations
89
+ results = find_best_matches_faiss(profession, nkz_list, vectorizer, faiss_index)
90
  # similar_texts = find_similar_combined(text1, k=5)
91
  # similar_texts_df = pd.DataFrame(similar_texts)
92
  # Display results
93
+ if results is not None:
94
  st.write("Similar Occupations:")
95
+ st.dataframe(results)
96
  # st.dataframe(similar_texts_df)
97
  else:
98
  st.warning("No similar occupations found.")