Изучаем анализ данных на языках R и Python
15 subscribers
1 photo
4 files
Изучаем анализ данных на языках R и Python. NLP, стилометрия и анализ текстовых данных. А так же - поддержка и помощь начинающим аналитикам данных!
Download Telegram
NLP в R

NLP (обработка естественного языка) включает широкий спектр методов для анализа текстов и извлечения информации. R активно используется для таких задач, как:

Токенизация: Разбиение текста на слова, предложения или другие значимые элементы.
Лемматизация и стемминг: Приведение слов к их исходной или базовой форме.
Анализ тональности: Определение эмоциональной окраски текста (положительная, отрицательная, нейтральная).
Обнаружение тем: Выявление ключевых тем или скрытых структур в больших текстовых коллекциях.

Пакеты quanteda, text2vec, topicmodels и wordcloud предоставляют мощные инструменты для выполнения этих задач.

Примеры задач NLP в R:

Анализ тональности для классификации отзывов, постов в социальных сетях или новостных статей.
Моделирование тем для обнаружения ключевых тем в больших текстовых массивах, таких как форумы или статьи.

Преимущества использования R для стилометрии и NLP

Обширные библиотеки: R обладает множеством пакетов, которые облегчают решение задач в области обработки текста.
Визуализация данных: Встроенные инструменты для визуализации, такие как ggplot2, позволяют создавать графики и диаграммы для представления результатов анализа.
Интеграция с другими инструментами: R легко интегрируется с другими языками и платформами, такими как Python или Hadoop, что расширяет его возможности.
При работе с большими объемами текстов, такими как собрание сочинений автора, важно учитывать, что простые количественные метрики, такие как длина текста, могут быть недостаточными для глубокого анализа.

В таких случаях следует применять более сложные методы анализа, включая:

1. Анализ частот слов

Можно использовать TF-IDF (Term Frequency-Inverse Document Frequency) для оценки значимости слов в текстах. Это поможет выявить ключевые темы и идеи в сочинениях.

2. Тематическое моделирование и кластеризация

Тематическое моделирование, например, с использованием LDA (Latent Dirichlet Allocation), помогает обнаружить скрытые темы в больших объемах текстов.
Кластеризация текстов может помочь группировать сочинения по схожести содержания.

3. Анализ тональности

Можно оценить эмоциональную окраску текстов, что поможет понять настроение или настроение автора в различных произведениях.

4. Семантический анализ

Использование методов обработки естественного языка (NLP) для извлечения значений и смыслов, таких как анализ синтаксиса и семантики.

5. Статистический анализ

Если необходимо сравнить характеристики разных текстов (например, стиль, длина, сложность), можно использовать более сложные метрики, такие как средняя длина предложений, количество уникальных слов и т. д.
Кульбак-Лейбнер (Kullback-Leibler Divergence): используется для измерения различия между двумя распределениями вероятностей, что может быть полезно в задачах сравнения текстов.

Мера Жаккара (Jaccard Similarity): используется для сравнения сходства между множествами (например, набором слов в текстах).

Косинусное сходство: часто используется для измерения сходства между векторными представлениями текстов.
Channel name was changed to «NLP в Data Science. Стилометрия и борьба с плагиатом.»
Channel name was changed to «Изучаем анализ данных на языках R и Python»
Подготовка данных и проведение факторного анализа.

Шаг 1: Генерация данных

Реальные данные могут быть представлены в различных формах: текст, изображения, аудио, видео и т.д. На начальном этапе данные могут находиться в форме текста, изображений, аудиофайлов и т.п., но для анализа они должны быть приведены к численному формату. В R это делается с помощью функций, которые считывают данные из файлов или преобразуют их в числовой формат.

Например, если данные находятся в формате Excel, то сначала загружается файл с данными, затем выбирается нужный лист, и данные конвертируются в численный формат.

Шаг 2: Преобразование данных

Преобразование в числовые данные включает в себя очистку данных от лишних символов, таких как пробелы, запятые, скобки и т. д. Затем данные переводятся в числовую форму с помощью специальных функций, таких как as.numeric().

Также могут использоваться функции для преобразования текстовых данных в числовые. Например, функция as.factor() позволяет преобразовывать текстовые данные в категориальный формат.

Шаг 3: Нормализация данных

Нормализация данных выполняется для того, чтобы привести данные к общему масштабу. Это облегчает сравнение данных, так как разные данные могут иметь разные единицы измерений и шкалы. Например, температура может измеряться в градусах Цельсия, а расстояние — в километрах. Нормализация позволяет работать с данными независимо от их единиц измерения.

Для нормализации данных используются специальные функции, такие как scale(). Они помогают перевести данные в диапазон от 0 до 1, что делает их удобными для сравнения.

Шаг 4: Объединение данных в одну матрицу

Объединение данных производится с помощью функции cbind(). Она объединяет данные из разных источников в одну таблицу. Это удобно для последующего анализа, потому что все данные хранятся в одном месте.

Шаг 5: Проведение факторного анализа

Факторный анализ проводится с помощью специальной функции factor() из библиотеки stats. Эта функция принимает аргументы, такие как данные, метод анализа и количество факторов. По умолчанию она использует метод главного компонента для определения факторов.

Параметры функции включают:

method: метод анализа, например, "principal", "promax", minres.
rotation: метод вращения факторов, например, Varimax, Promax, Quartimax.
scores: количество факторов, которые следует извлечь, например 2, 3, 5.
Функция возвращает объект класса "factor" с параметрами, такими как факторы, их загрузки, коэффициенты корреляции и индексы адекватности.

Как выбрать параметры для функции fa()

При выборе параметров для функции fa() необходимо учитывать природу данных и цели анализа.

Метод анализа: определяет, как данные обрабатываются. Часто используются методы principal, promax, varimax.
Вращение факторов: выбирает метод вращения, например Varimax или Promax.
Количество факторов: задаётся параметром scores. Оно определяет, сколько факторов извлекать из данных.
Выбор метода анализа и метода вращения факторов зависит от типа данных и целей анализа. Выбор количества факторов основывается на природе данных и целях анализа.
Пример кода на Python с использованием spaCy для выделения имен собственных.

import spacy

# Загрузка многоязычной модели для spaCy
nlp = spacy.load("xx_ent_wiki_sm")

# Текст для анализа
text = "Иван и Марья Ивановна были в парке. Петр и Ирина пошли в магазин."

# Применяем spaCy для анализа текста
doc = nlp(text)

# Выделяем имена собственные (на основе модели NER)
persons = []

for ent in doc.ents:
if ent.label_ == "PERSON":
persons.append(ent.text)

# Выводим имена собственные
print("Найденные имена собственные:", persons)
Поиск имен собственных с использованием pymorphy3

import pandas as pd
from sklearn.feature_extraction.text import CountVectorizer
from sklearn.metrics.pairwise import cosine_similarity
import nltk
from nltk.corpus import stopwords
import pymorphy3
from wordcloud import WordCloud
import matplotlib.pyplot as plt

# Загрузка стоп-слов для русского языка
nltk.download('stopwords')
russian_stopwords = stopwords.words('russian')

# Чтение файла
with open(path_to_text_file, 'r', encoding='utf-8') as file:
text_data = file.readlines()

# Объединение текста в один большой текст для анализа
full_text = ' '.join(text_data)

# Создание экземпляра морфологического анализатора
morph = pymorphy3.MorphAnalyzer()

# Разделение текста на слова
words = full_text.split()

# Поиск имен собственных с использованием pymorphy3
proper_nouns = set()
for word in words:
parsed_word = morph.parse(word)[0]
if 'Name' in parsed_word.tag: # Проверка, является ли слово именем собственным
proper_nouns.add(word)

# Выводим найденные имена собственные таблицей
proper_nouns_df = pd.DataFrame(list(proper_nouns), columns=["Имена собственные"])
print("\nНайденные имена собственные:")
print(proper_nouns_df)
Задача: узнать методом Монте-Карло, какое в среднем будет расстояние между двумя случайными точками в круге

import numpy as np
import matplotlib.pyplot as plt
# Метод Монте Карло
# Количество точек для симуляции
num_points = 10000

# Генерация случайных точек в квадрате [0, 1] x [0, 1]
x = np.random.uniform(0, 1, num_points)
y = np.random.uniform(0, 1, num_points)

# Определение, попадает ли точка в круг (радиус = 1, центр = (0, 0))
inside_circle = x**2 + y**2 <= 1

# Оценка числа π
pi_estimate = 4 * np.sum(inside_circle) / num_points

# Графическое отображение
plt.figure(figsize=(8, 8))
plt.scatter(x, y, c=inside_circle, cmap='coolwarm', s=1, label='Точки')
circle = plt.Circle((0, 0), 1, color='blue', fill=False, linewidth=2, label='Круг радиусом 1')
plt.gca().add_artist(circle)
plt.title(f'Оценка числа π методом Монте-Карло\nЧисло точек: {num_points}, π ≈ {pi_estimate:.4f}')
plt.xlabel('x')
plt.ylabel('y')
plt.legend()
plt.axis('equal')
plt.show()
Пример использования цепей Маркова для генерации текста

import os
import pandas as pd
import markovify
from tqdm import tqdm

# Папка с текстами
folder_path = "data"

# Чтение текстовых файлов в один DataFrame
files = [f for f in os.listdir(folder_path) if f.endswith(".txt")]

# Создаем список для хранения данных
data = []

# Чтение каждого файла и добавление в DataFrame
for file in tqdm(files, desc="Чтение файлов"):
with open(os.path.join(folder_path, file), 'r', encoding='utf-8') as f:
text = f.read().lower() # Приводим текст к нижнему регистру
data.append({'id': os.path.splitext(file)[0], 'text': text})

# Создаем DataFrame
df_texts = pd.DataFrame(data)

# Объединяем все тексты в один
all_text = " ".join(df_texts['text'])

# Строим марковскую модель
# Используем прогресс-бар для анализа текста
print("Создание марковской цепи...")
text_model = markovify.Text(all_text, state_size=2)

# Функция для генерации фразы
def generate_phrase(model, length=10):
phrase = []
current_sentence = model.make_sentence()
if not current_sentence:
return ""

phrase.append(current_sentence)

# Генерация дополнительных фраз
for _ in range(length - 1):
current_sentence = model.make_sentence()
if not current_sentence:
break
phrase.append(current_sentence)

return " ".join(phrase)

# Пример генерации фразы
generated_phrase = generate_phrase(text_model, length=10)
print("Generated phrase:", generated_phrase)