NKZ_NAME / app.py
Yerzhxn's picture
Update app.py
05e7340 verified
import re
import pandas as pd
import pymorphy2
from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.metrics.pairwise import cosine_similarity
from sklearn.metrics import accuracy_score
from translate import Translator
import streamlit as st
# Инициализация морфологического анализатора
morph = pymorphy2.MorphAnalyzer()
nkz_list = pd.read_csv('filtered_nkz.csv')
# Предобработка данных
from translate import Translator
def translate_text(text, from_lang='kk', to_lang='ru'):
"""
Перевод текста с одного языка на другой.
:param text: Исходный текст для перевода.
:param from_lang: Язык исходного текста (по умолчанию казахский 'kk').
:param to_lang: Язык перевода (по умолчанию русский 'ru').
:return: Переведённый текст.
"""
try:
translator = Translator(from_lang=from_lang, to_lang=to_lang)
translated_text = translator.translate(text)
return translated_text
except Exception as e:
print(f"Ошибка перевода: {e}")
return text # Возвращаем исходный текст в случае ошибки
# Уникальные казахские буквы
kazakh_letters = set("әғқңөұүі")
def preprocess_text(text):
"""Функция для предобработки текста: перевод, очистка, приведение к нижнему регистру, лемматизация."""
if not isinstance(text, str):
return ""
# Проверка на наличие уникальных казахских букв
if any(char in kazakh_letters for char in text.lower()):
text = translate_text(text)
# Очистка текста
text = text.lower().strip() # Приведение к нижнему регистру
text = re.sub(r'[^\w\s]', '', text) # Удаление пунктуации
text = re.sub(r'[a-zA-Z0-9]', '', text)
words = text.split()
lemmas = [morph.parse(word)[0].normal_form for word in words] # Лемматизация
return ' '.join(lemmas)
def find_best_matches(profession, nkz_list, vectorizer, tfidf_nkz, top_n=10):
"""Находит топ-10 наилучших соответствий для одной профессии в списке НКЗ."""
# Предобработка профессии
processed_profession = preprocess_text(profession)
print(processed_profession)
# Преобразование векторной модели
tfidf_profession = vectorizer.transform([processed_profession])
# Вычисление схожести
similarity = cosine_similarity(tfidf_profession, tfidf_nkz)
# Получаем индексы топ-N самых схожих профессий
top_n_idx = similarity[0].argsort()[-top_n:][::-1] # Сортируем по убыванию
# Формируем результат
top_matches = []
for idx in top_n_idx:
top_matches.append({
'profession': processed_profession,
'nkz_match': nkz_list.iloc[idx]['NAME_RU2'],
'nkz_code': nkz_list.iloc[idx]['CODE'], # Код НКЗ
'similarity': similarity[0][idx]
})
dfs = pd.DataFrame(top_matches)
return dfs
nkz_list['cleaned'] = nkz_list['NAME_RU2'].apply(preprocess_text)
vectorizer = TfidfVectorizer()
tfidf_nkz = vectorizer.fit_transform(nkz_list['cleaned'])
# Streamlit app
st.title("Occupation Similarity Finder")
text1 = st.text_input("Enter the occupation to compare:", "Оператор пульта управления")
if st.button("Find Similar Occupations"):
try:
# Find similar occupations
results = find_best_matches(text1, nkz_list, vectorizer, tfidf_nkz, top_n=10)
# similar_texts = find_similar_combined(text1, k=5)
# similar_texts_df = pd.DataFrame(similar_texts)
# Display results
if results is not None:
st.write("Similar Occupations:")
st.dataframe(results)
# st.dataframe(similar_texts_df)
else:
st.warning("No similar occupations found.")
except Exception as e:
st.error(f"An error occurred: {e}")