File size: 5,765 Bytes
9d84392 6066b59 2e09f93 9d84392 b7d7e12 d3b6ad7 9d84392 b7d7e12 9d84392 98c27d3 9d84392 |
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 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 |
import re
import pandas as pd
import pymorphy2
from sklearn.metrics.pairwise import cosine_similarity
import language_tool_python
import torch
from transformers import AutoTokenizer, AutoModel
import nltk
from nltk.corpus import stopwords
from tqdm import tqdm
import numpy as np
import tempfile
import streamlit as st
# Загрузка стоп-слов для русского языка
nltk.download('stopwords')
stop_words = set(stopwords.words('russian'))
# Инициализация морфологического анализатора и корректора текста
# Инициализация модели BERT
bert_model_name = "sberbank-ai/sbert_large_nlu_ru"
tokenizer = AutoTokenizer.from_pretrained(bert_model_name)
model = AutoModel.from_pretrained(bert_model_name)
def preprocess_text(text):
"""Функция для предобработки текста."""
if not isinstance(text, str):
return ""
# Очистка текста
text = text.lower().strip()
text = re.sub(r'[^\w\s]', ' ', text)
text = re.sub(r'-', ' ', text)
text = re.sub(r'[a-zA-Z0-9]', ' ', text)
text = generate(text)
text = correct_text(text)
return text
def get_embedding(text):
"""Получение эмбеддингов BERT для текста."""
inputs = tokenizer(text, return_tensors="pt", padding=True, truncation=True)
with torch.no_grad():
outputs = model(**inputs)
# Берем среднее значение скрытых состояний по всем токенам
return outputs.last_hidden_state.mean(dim=1).squeeze()
def find_best_matches(profession, nkz_list, embeddings_nkz, top_n=10):
"""Находит топ-N наилучших соответствий для профессии в списке НКЗ."""
# Предобработка профессии
processed_profession = preprocess_text(profession)
print(f"Предобработанная профессия: {processed_profession}")
processed_profession = re.sub(r'-', ' ', processed_profession)
# Получение эмбеддинга профессии
profession_embedding = get_embedding(processed_profession).numpy().reshape(1, -1)
# Вычисление косинусного сходства
similarity = cosine_similarity(profession_embedding, embeddings_nkz)
# Получаем индексы топ-N самых схожих профессий
top_n_idx = similarity[0].argsort()[-top_n:][::-1]
top_matches = []
for idx in top_n_idx:
top_matches.append({
'profession': profession,
'nkz_ru': nkz_list.iloc[idx]['NAME_RU'],
'nkz_kz': nkz_list.iloc[idx]['NAME_KZ'],
'nkz_code': nkz_list.iloc[idx]['CODE'],
'similarity': similarity[0][idx]
})
return pd.DataFrame(top_matches)
from transformers import AutoModelForSeq2SeqLM, AutoTokenizer
def generate(text, **kwargs):
inputs = tr_tokenizer(text, return_tensors='pt')
with torch.no_grad():
hypotheses = tr_model.generate(**inputs, num_beams=5, **kwargs)
return tr_tokenizer.decode(hypotheses[0], skip_special_tokens=True)
tr_model = AutoModelForSeq2SeqLM.from_pretrained('deepvk/kazRush-kk-ru')
tr_tokenizer = AutoTokenizer.from_pretrained('deepvk/kazRush-kk-ru')
import hunspell
def correct_text(text: str, dict_path: str = 'ru_RU.dic', aff_path: str = 'ru_RU.aff') -> str:
# Инициализация hunspell с указанием путей к словарям
h = hunspell.HunSpell(dict_path, aff_path)
# Разбиваем текст на слова
words = text.split()
# Проверяем и исправляем каждое слово
corrected_words = []
for word in words:
if not h.spell(word): # Если слово написано с ошибкой
suggestions = h.suggest(word) # Получаем список вариантов исправлений
if suggestions:
corrected_words.append(suggestions[0]) # Выбираем первое предложение
else:
corrected_words.append(word) # Если исправлений нет, оставляем как есть
else:
corrected_words.append(word) # Если слово правильное, оставляем его
# Собираем исправленный текст
corrected_text = ' '.join(corrected_words)
return corrected_text
import numpy as np
# Assuming nkz_list is your DataFrame loaded from 'nkz_list_emb.csv'
nkz_list = pd.read_csv('nkz_list_emb_df.csv')
import numpy as np
# Assuming nkz_list is your DataFrame loaded from 'nkz_list_emb.csv'
# Convert the 'EMB' column strings into actual lists of floats
nkz_list['EMB'] = nkz_list['EMB'].apply(lambda x: np.fromstring(x[1:-1], sep=', '))
# Now you can convert the lists of floats into a numpy array
embeddings_nkz_df = np.vstack(nkz_list['EMB'])
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, embeddings_nkz_df, 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}") |