Spaces:
Sleeping
Sleeping
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("Пожалуйста, введите имя и выберите навыки для сравнения.")
|