Update app.py
Browse files
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
|
|
|
|
|
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 |
-
|
66 |
-
|
67 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
68 |
# Предобработка профессии
|
69 |
processed_profession = preprocess_text(profession)
|
70 |
|
71 |
-
# Преобразование
|
72 |
-
tfidf_profession = vectorizer.transform([processed_profession])
|
73 |
|
74 |
-
#
|
75 |
-
|
76 |
|
77 |
-
# Получаем индексы топ-N самых схожих профессий
|
78 |
-
top_n_idx = similarity[0].argsort()[-top_n:][::-1] # Сортируем по убыванию
|
79 |
-
|
80 |
# Формируем результат
|
81 |
top_matches = []
|
82 |
-
for idx in
|
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':
|
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 |
-
|
111 |
# similar_texts = find_similar_combined(text1, k=5)
|
112 |
# similar_texts_df = pd.DataFrame(similar_texts)
|
113 |
# Display results
|
114 |
-
if
|
115 |
st.write("Similar Occupations:")
|
116 |
-
st.dataframe(
|
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.")
|