/
Giryeest
/
Course_Project_datasets_analysis
Обзор
Документация
Войти
/
Giryeest
/
Course_Project_datasets_analysis
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
Безопасность
main
Codes/Text/notebook_text.py
268 строк
11 KB
Giryeest
create: Datasets/ Codes/ folders for each type of data was added, and all related files was moved in them
04 июн 2026, 19:12
04 июн 2026, 19:12
645d18b
Код
Авторство
О чём код?
#============================================================================ #Очистка #============================================================================ import re import pandas as pd df = pd.read_json('dataset.jsonl', lines=True) def clean_text(text): text = text.lower() # Всё в нижний регистр text = re.sub(r'[^a-z ]', '', text) # Удаляем всё, кроме английских букв и пробелов text = ' '.join(text.split()) # Убираем лишние пробелы return text # Применяем очистку к plain_text df['clean_plain_text'] = df['plain_text'].apply(clean_text) # Применяем очистку к summary: df['clean_summary'] = df['summary'].apply(clean_text) # Покажем, как изменился текст на примере summary print(f"До очистки:") print("Первое summary - ", df['summary'].iloc[0]) print("Второе summary - ", df['summary'].iloc[1], "\n") print(f"После очистки:") print("Первое summary - ", df['clean_summary'].iloc[0]) print("Второе summary - ", df['clean_summary'].iloc[1], "\n") #============================================================================ #Лемматизация #============================================================================ import spacy # Загрузка английской модели nlp = spacy.load("en_core_web_sm") def lemmatize_text(text): doc = nlp(text) lemmas = [token.lemma_ for token in doc] return ' '.join(lemmas) # Собираем обратно в строку # Применяем функцию к очищенному столбцу plain_text df['lemmas_plain_text'] = df['clean_plain_text'].apply(lemmatize_text) # Применяем функцию к очищенному столбцу summary df['lemmas_summary'] = df['clean_summary'].apply(lemmatize_text) # Покажем, как изменился текст на примере summary print(f"До лемматизации:") print("Первое summary - ", df['clean_summary'].iloc[0]) print("Второе summary - ", df['clean_summary'].iloc[1], "\n") print(f"После лемматизации:") print("Первое summary - ", df['lemmas_summary'].iloc[0]) print("Второе summary - ", df['lemmas_summary'].iloc[1], "\n") #============================================================================ #Подсчёт частоты слов #============================================================================ from collections import Counter # Объединяем все леммы в один список слов по отдельности для исходных текстов и резюме all_words_plain = ' '.join(df['lemmas_plain_text']).split() all_words_summary = ' '.join(df['lemmas_summary']).split() # Считаем частоту каждого слова word_counts_plain = Counter(all_words_plain) word_counts_summary = Counter(all_words_summary) print("Топ-10 самых частых слов в исходных текстах:") for word, count in word_counts_plain.most_common(10): print(f"{word}: {count}") print() print("Топ-10 самых частых слов в резюме:") for word, count in word_counts_summary.most_common(10): print(f"{word}: {count}") print() # Строим столбчатый график топ-10 слов в исходных текстах import matplotlib.pyplot as plt # Берём топ-10 и разделяем на слова и частоты top_words_plain = word_counts_plain.most_common(10) words_plain, counts_plain = zip(*top_words_plain) plt.figure(figsize=(10, 5)) plt.bar(words_plain, counts_plain, color='steelblue') plt.title('Топ-10 самых частых слов в исходных текстах') plt.xlabel('Слово') plt.ylabel('Частота') plt.xticks(rotation=45) plt.tight_layout() plt.show() #Аналогичные действия производим для резюме top_words_summary = word_counts_summary.most_common(10) words_summary, counts_summary = zip(*top_words_summary) plt.figure(figsize=(10, 5)) plt.bar(words_summary, counts_summary, color='steelblue') plt.title('Топ-10 самых частых слов в резюме') plt.xlabel('Слово') plt.ylabel('Частота') plt.xticks(rotation=45) plt.tight_layout() plt.show() from wordcloud import WordCloud # Создаём облако слов для исходных текстов all_plain_text = ' '.join(df['lemmas_plain_text']) wc_plain = WordCloud(width=800, height=400, max_words=10, background_color='white').generate(all_plain_text) # Показываем plt.figure(figsize=(10, 5)) plt.imshow(wc_plain, interpolation='bilinear') plt.axis('off') plt.title('Частые слова в исходных текстах') plt.show() # Создаём облако слов для резюме all_summary_text = ' '.join(df['lemmas_summary']) wc_summary = WordCloud(width=800, height=400, max_words=10, background_color='white').generate(all_summary_text) # Показываем plt.figure(figsize=(10, 5)) plt.imshow(wc_summary, interpolation='bilinear') plt.axis('off') plt.title('Частые слова в резюме') plt.show() #============================================================================ #Удаление стоп-слов #============================================================================ import nltk from nltk.corpus import stopwords # Скачиваем список стоп-слов nltk.download('stopwords') stop_words = set(stopwords.words('english')) # загружаем английские стоп-слова #print("Примеры стоп-слов:", list(stop_words)[:20]) # первые 20 стоп-слов # удаляем стоп-слова из лемматизированных текстов def remove_stopwords(text, stop_words): words = text.split() return ' '.join([w for w in words if w not in stop_words]) df['no_stopwords_plain'] = df['lemmas_plain_text'].apply(lambda x: remove_stopwords(x, stop_words)) df['no_stopwords_summary'] = df['lemmas_summary'].apply(lambda x: remove_stopwords(x, stop_words)) # Объединяем по отдельности все исходные тексты и резюме после удаления стоп-слов в один список all_words_plain = ' '.join(df['no_stopwords_plain']).split() all_words_summary = ' '.join(df['no_stopwords_summary']).split() # Считаем частоту слов после удаления стоп-слов word_counts_plain = Counter(all_words_plain) word_counts_summary = Counter(all_words_summary) print("Топ-10 самых частых слов в исходных текстах после очистки от стоп-слов:") for word, count in word_counts_plain.most_common(10): print(f"{word}: {count}") print() print("Топ-10 самых частых слов в резюме после очистки от стоп-слов:") for word, count in word_counts_summary.most_common(10): print(f"{word}: {count}") print() # Отобразим примеры резюме без стоп-слов print(f"До удаления стоп-слов:") print("Первое summary - ", df['lemmas_summary'].iloc[0]) print("Второе summary - ", df['lemmas_summary'].iloc[1], "\n") print(f"После удаления:") print("Первое summary - ", df['no_stopwords_plain'].iloc[0]) print("Второе summary - ", df['no_stopwords_summary'].iloc[1], "\n") #============================================================================ #TF_IDF #============================================================================ from sklearn.feature_extraction.text import TfidfVectorizer # создаём и обучаем векторайзеры по отдельности для исходных текстов и резюме vectorizer_plain = TfidfVectorizer(stop_words=list(stop_words)) vectorizer_summary = TfidfVectorizer(stop_words=list(stop_words)) tfidf_matrix_plain = vectorizer_plain.fit_transform(df['no_stopwords_plain']) tfidf_matrix_summary = vectorizer_summary.fit_transform(df['no_stopwords_summary']) # получаем список всех слов (словарь) feature_names_plain = vectorizer_plain.get_feature_names_out() print(f"Размер словаря для исходных текстов: {len(feature_names_plain)} слов") feature_names_summary = vectorizer_summary.get_feature_names_out() print(f"Размер словаря для резюме: {len(feature_names_summary)} слов") print(f"\nВнешний вид словаря для исходных текстов:", feature_names_plain, "\n") # первое резюме в виде вектора print(f"Текст - {df['no_stopwords_summary'].iloc[0]}") print(f"Вектор - {tfidf_matrix_summary[0].toarray()}") #============================================================================ #Информационный поиск #============================================================================ import numpy as np from sklearn.metrics.pairwise import cosine_similarity # функция поиска наиболее близких текстов к запросу def search_texts(query, vectorizer, tfidf_matrix, texts, top_n=3): #Ищет top_n текстов, наиболее похожих на запрос. query = clean_text(query) # очищаем запрос query = lemmatize_text(query) # лемматизируем запрос query_vec = vectorizer.transform([query]) # векторизуем запрос # считаем похожесть запроса со всеми текстами similarities = cosine_similarity(query_vec, tfidf_matrix)[0] # находим индексы топ-n самых похожих top_indices = similarities.argsort()[-top_n:][::-1] results = [] for idx in top_indices: results.append({ 'Текст': texts.iloc[idx], 'Похожесть': similarities[idx] }) return results vectorizer_plain = TfidfVectorizer(stop_words=list(stop_words)) tfidf_matrix_plain = vectorizer_plain.fit_transform(df['no_stopwords_plain']) # Пример 1-ого поиска query = "responsibility" results = search_texts(query, vectorizer_plain, tfidf_matrix_plain, df['no_stopwords_plain'], top_n=2) print(f"\nПоисковый запрос: '{query}'") print(f"Найдено {len(results)} наиболее похожих отзывов:\n") for i, res in enumerate(results, 1): print(f"{i}. Похожесть: {res['Похожесть']:.8f}") print(f"Текст - {res['Текст']}") print("\n\n") # Пример 2-ого поиска query = "law" results = search_texts(query, vectorizer_plain, tfidf_matrix_plain, df['no_stopwords_plain'], top_n=2) print(f"\nПоисковый запрос: '{query}'") print(f"Найдено {len(results)} наиболее похожих отзывов:\n") for i, res in enumerate(results, 1): print(f"{i}. Похожесть: {res['Похожесть']:.8f}") print(f"Текст - {res['Текст']}")