File size: 4,443 Bytes
708c7f3
24d75a8
 
 
e6299f1
 
24d75a8
5269150
05e7340
0558690
24d75a8
 
05e7340
24d75a8
3099456
e6299f1
 
 
 
 
 
 
 
 
 
 
3099456
24d75a8
e6299f1
 
 
 
 
 
 
 
24d75a8
 
 
 
3099456
24d75a8
 
 
e6299f1
 
 
 
 
24d75a8
 
 
 
 
 
 
 
 
 
 
 
c5d8201
e6299f1
 
 
0558690
e6299f1
05e7340
a998357
e6299f1
 
24d75a8
 
a998357
e6299f1
 
a998357
e6299f1
 
a998357
e6299f1
 
 
24d75a8
 
e6299f1
24d75a8
a998357
24d75a8
e6299f1
 
24d75a8
 
a998357
e6299f1
 
 
 
 
 
 
 
21ab89f
 
95f0067
21ab89f
95f0067
21ab89f
95f0067
 
e6299f1
3099456
 
95f0067
0558690
95f0067
0558690
3099456
af5803e
95f0067
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
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}")