File size: 5,114 Bytes
561c472
 
55031b9
07f0697
561c472
a4648d8
be6b2fb
 
561c472
e890e86
561c472
 
 
 
 
 
 
52b2523
 
 
 
561c472
 
9ec1240
561c472
 
 
 
 
 
 
 
 
52b2523
 
55031b9
561c472
 
 
a4648d8
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
9ec1240
 
 
52b2523
 
 
 
 
55031b9
07f0697
9ec1240
52b2523
 
 
07f0697
 
 
 
 
 
 
 
55031b9
52b2523
 
55031b9
52b2523
 
 
 
 
07f0697
52b2523
 
 
 
9ec1240
52b2523
9ec1240
 
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
import pandas as pd
import streamlit as st
import numpy as np
from scipy.spatial.distance import hamming

# Загррузка данных из Excel файлов
vacancy = 'vacancy_new_new.xlsx'
resume = 'resume_new_new.xlsx'
file_nkz = 'label_NKZ.xlsx'
file_skills = 'label_skills_new.xlsx'

df_vacancy = pd.read_excel(vacancy)
df_resume = pd.read_excel(resume)
df_nkz = pd.read_excel(file_nkz)
df_skills = pd.read_excel(file_skills)

# Проверка, что в файлах есть нужные колонки
required_columns = {'skills', 'name', 'NKZ', 'id'}
for df, fname in zip([df_vacancy, df_resume, df_nkz, df_skills], [vacancy, resume, file_nkz, file_skills]):
    if not required_columns.intersection(df.columns):
        raise ValueError(f"Файл {fname} должен содержать колонки {required_columns}")

# Streamlit интерфейс
st.title("Поиск совпадений по навыкам")

# Ввод текста для добавления в колонку 'name'
new_name = st.text_input("Введите название")

# Выбор из колонки 'NKZ' из файла label_NKZ
nkz_options = df_nkz['name'].unique().tolist()
selected_nkz = st.selectbox("Выберите профессию по НКЗ", nkz_options)

# Множественный выбор из колонки 'skills' из файла label_skills
skills_options = sorted(df_skills[df_skills['NKZ'] == df_nkz[df_nkz['name'] == selected_nkz]['NKZ'].values[0]]['skills'].unique().tolist())
selected_skills = st.multiselect("Выберите навыки", skills_options)

# Выбор файла для поиска совпадений
file_option = st.selectbox("Выберите тип", ("Вакансия", "Резюме"))

# Выбор файла для записи новой записи
write_option = "vacancy" if file_option == "Вакансия" else "resume"

# Кнопка для добавления новой записи
add_entry = st.button("Добавить новую запись")
if add_entry:
    if new_name and selected_skills:
        skills_ids = df_skills[df_skills['skills'].isin(selected_skills)]['id'].values
        skills_ids_str = ','.join(map(str, skills_ids))
        new_entry = pd.DataFrame({'name': [new_name], 'NKZ': [selected_nkz], 'skills': [' '.join(selected_skills)], 'arr': [skills_ids_str]})
        df_to_update = df_vacancy if write_option == "vacancy" else df_resume
        df_to_update = pd.concat([df_to_update, new_entry], ignore_index=True)
        df_to_update.to_excel(vacancy if write_option == "vacancy" else resume, index=False)
        st.success("Новая запись была успешно добавлена.")
    else:
        st.error("Пожалуйста, введите имя и выберите навыки для добавления записи.")

# Кнопка для поиска совпадений
if st.button("Найти совпадения"):
    if new_name and selected_skills:
        # Определение DataFrame для поиска совпадений
        df_to_search = df_vacancy if file_option == "Вакансия" else df_resume
        skills_ids = df_skills[df_skills['skills'].isin(selected_skills)]['id'].values

        # Преобразование в array для поиска
        selected_skills_array = np.array(skills_ids, dtype=int)

        # Поиск совпадений по методу Hamming Distance
        matching_results = []
        for index, row in df_to_search.iterrows():
            if 'arr' in row and isinstance(row['arr'], str):
                arr_values = np.array([int(x) for x in row['arr'].split(',')], dtype=int)
                if len(arr_values) == len(selected_skills_array):
                    hamming_distance = hamming(selected_skills_array, arr_values)
                    similarity = 1 - hamming_distance
                    if similarity > 0.5:
                        matching_results.append({
                            'Name': row['name'],
                            'Similarity': similarity
                        })

        # Вывод результатов, где совпадение больше 50%
        st.write("Результаты с совпадением более 50%:")
        if matching_results:
            for result in matching_results:
                st.markdown(
                    f"""
                    <div style="border: 1px solid #ddd; padding: 10px; border-radius: 5px; margin-bottom: 10px;">
                        <h4 style="margin: 0;">{result['Name']}</h4>
                        <p><strong>Коэффициент совпадения:</strong> {result['Similarity']:.2f}</p>
                    </div>
                    """,
                    unsafe_allow_html=True
                )
        else:
            st.write("Нет совпадений с коэффициентом совпадения более 50%.")
    else:
        st.error("Пожалуйста, введите имя и выберите навыки для сравнения.")