Извлечение значений из текстов: работа с Pandas и NumPy

Раздел: Data Science -> Pandas и NumPy

Основные подходы к анализу текстовых данных

Как реализовать эффективный анализ текстов с помощью векторизации TF-IDF?

Наиболее универсальное решение для анализа текстовых данных - использование матрицы TF-IDF (Term Frequency-Inverse Document Frequency). Она преобразует набор документов в числовую матрицу, где каждый столбец соответствует уникальному слову, а значение в ячейке отражает важность слова для конкретного документа с учетом его редкости во всем корпусе. Для работы с TF-IDF в Python применяется класс TfidfVectorizer из библиотеки scikit-learn, который тесно интегрируется с Pandas и NumPy.

Пример базовой реализации:


import pandas as pd
from sklearn.feature_extraction.text import TfidfVectorizer

# Исходные текстовые данные
data = {
    'text': [
        'Python отлично подходит для анализа данных',
        'NumPy и Pandas - основа научных вычислений',
        'Обработка текстов требует предварительной очистки'
    ]
}
df = pd.DataFrame(data)

# Создание векторизатора
vectorizer = TfidfVectorizer()
X = vectorizer.fit_transform(df['text'])

# Преобразование в DataFrame для наглядности
tfidf_df = pd.DataFrame(X.toarray(), columns=vectorizer.get_feature_names_out())
print(tfidf_df)

Python для анализа данных (python для анализа данных)

   анализа  данных  для  научных  numpy  обработка  основа  отлично  очистки  pandas …
0   0.447  0.447  0.0     0.0    0.0       0.0    0.0   0.447     0.0    0.0 …
1   0.0    0.0    0.0     0.447  0.447     0.0    0.447 0.0       0.0    0.447…
2   0.0    0.0    0.447   0.0    0.0       0.447   0.0   0.0       0.447  0.0…

анализ больших данных python (анализ больших данных в python)

Типичные проблемы:

  • Пропуск этапа очистки текста (знаки препинания, цифры, регистр) приводит к появлению большого числа ненужных признаков. Решение: использовать параметр strip_accents='unicode', lowercase=True, token_pattern.
  • Отсутствие удаления стоп-слов увеличивает размерность и снижает качество. Добавление stop_words='english' (или собственного списка) решает проблему.
  • Недостаток памяти при обработке больших корпусов - TF-IDF создает разреженную матрицу, её следует хранить в разреженном формате (X.toarray() использует только для демонстрации).

Как выполнить простой подсчет частот слов с помощью CountVectorizer?

Когда требуется простое взвешивание по частоте (без учета обратной частоты документа), применяется CountVectorizer. Он создает матрицу, где значения - целые числа, равные количеству вхождений слова в документ. Этот подход подходит для задач поиска ключевых слов или построения облака тегов.


from sklearn.feature_extraction.text import CountVectorizer

count_vec = CountVectorizer()
X_count = count_vec.fit_transform(df['text'])
count_df = pd.DataFrame(X_count.toarray(), columns=count_vec.get_feature_names_out())
print(count_df)

Python анализ данных excel (анализ данных excel в python)

Основная ошибка - не учитывать, что длинные документы будут иметь большие значения счетчиков, что может исказить анализ. Нормализация через TfidfVectorizer часто предпочтительнее.

Как провести токенизацию и очистку только средствами Pandas?

Для быстрой предварительной обработки без внешних библиотек можно использовать строковые методы Pandas (серия .str). Они позволяют удалить пунктуацию, привести к нижнему регистру, разбить текст на слова и подсчитать частоты каждой лексемы.


# Очистка и токенизация
clean_series = df['text'].str.lower().str.replace('[^a-zа-яё\s]', '', regex=True)
tokens_series = clean_series.str.split()
# Подсчет вхождений всех слов
word_counts = tokens_series.explode().value_counts()
print(word_counts.head())

анализ данных python pdf (анализ данных pdf в python)

данных          2
pandas          2
обработка       1
основа         1
отлично        1

Python анализ данных и машинное обучение (анализ данных и машинное обучение на python)

Недостаток метода - отсутствие учета стемминга/лемматизации, а также невозможность построения n-грамм. Для полноценного анализа все же стоит комбинировать Pandas с другими инструментами.

Как работать с n-граммами для учета контекста?

Если одиночные слова (униграммы) недостаточно информативны, можно добавить биграммы или триграммы. Параметр ngram_range в TfidfVectorizer или CountVectorizer задает диапазон длин n-грамм.


vectorizer_ng = TfidfVectorizer(ngram_range=(2, 3))
X_ng = vectorizer_ng.fit_transform(df['text'])
print(pd.DataFrame(X_ng.toarray(), columns=vectorizer_ng.get_feature_names_out()))

Увеличение n-грамм резко расширяет количество признаков, что может привести к переобучению. Рекомендуется начинать с (1,2) и использовать отбор признаков.

- аналитик данных python sql (аналитик данных python sql)
- Python библиотеки numpy и pandas (библиотеки numpy и pandas в python)
- библиотеки python для обработки данных (библиотеки python для обработки данных (pandas, numpy и др.))

Расширенная практика: глубокий анализ текстов

Пример 1. Лемматизация и стемминг с последующей векторизацией

Для русского текста важно привести слова к нормальной форме. Используются библиотеки pymorphy2 (лемматизация) или nltk.stem.SnowballStemmer (стемминг). Ниже показан полный пайплайн с Pandas и TfidfVectorizer.

Пример

import pandas as pd
from sklearn.feature_extraction.text import TfidfVectorizer
import pymorphy2
import nltk
from nltk.corpus import stopwords

nltk.download('stopwords')
morph = pymorphy2.MorphAnalyzer()
stop_words = set(stopwords.words('russian'))

def lemmatize_text(text):
    words = text.lower().split()
    lemmatized = [morph.parse(w)[0].normal_form for w in words if w not in stop_words]
    return ' '.join(lemmatized)

# Пример данных
corpus = [
    'Анализ текстовых данных требует лемматизации',
    'Лемматизация помогает улучшить качество анализа',
    'Текстовые данные часто содержат шум'
]
df = pd.DataFrame({'text': corpus})

df['clean'] = df['text'].apply(lemmatize_text)

vectorizer = TfidfVectorizer()
X = vectorizer.fit_transform(df['clean'])
terms = vectorizer.get_feature_names_out()
print('Лемматизированные токены:', terms)
Лемматизированные токены: ['анализ' 'данные' 'качество' 'лемматизация' 'помогать' 'содержать' 'текстовый' 'требовать' 'улучшать' 'часто' 'шум']

Пример 2. Косинусное сходство между документами

После получения TF-IDF матрицы часто вычисляют сходство между документами для кластеризации или поиска дубликатов. Используется косинусная мера из sklearn.metrics.pairwise.

Пример

from sklearn.metrics.pairwise import cosine_similarity

cos_sim = cosine_similarity(X)
sim_df = pd.DataFrame(cos_sim, index=df['text'], columns=df['text'])
print(sim_df.round(3))
                                        Анализ текстовых ... | Лемматизация помогает ... | Текстовые данные ...
Анализ текстовых данных требует лемматизации          1.000               0.412                0.218
Лемматизация помогает улучшить качество анализа       0.412               1.000                0.101
Текстовые данные часто содержат шум                   0.218               0.101                1.000

Пример 3. Кластеризация текстов методом K-means

На основе TF-IDF можно сгруппировать документы по тематикам. Используется KMeans из sklearn.cluster.

Пример

from sklearn.cluster import KMeans

kmeans = KMeans(n_clusters=2, random_state=42)
labels = kmeans.fit_predict(X)
df['cluster'] = labels
print(df[['text', 'cluster']])
                                                text  cluster
0  Анализ текстовых данных требует лемматизации         0
1  Лемматизация помогает улучшить качество анализа      0
2  Текстовые данные часто содержат шум                 1

Пример 4. Визуализация облака слов с WordCloud

Для быстрого анализа частотности слов после подсчета через Pandas часто строят облако тегов.

Пример

from wordcloud import WordCloud
import matplotlib.pyplot as plt

# Предположим, word_counts уже получена как pd.Series
wordcloud = WordCloud(width=800, height=400, background_color='white').generate_from_frequencies(word_counts.to_dict())
plt.imshow(wordcloud, interpolation='bilinear')
plt.axis('off')
plt.show()
[изображение облака слов, в тексте вывода не передается]

Пример 5. Использование пользовательских стоп-слов и регулярных выражений

В TfidfVectorizer можно передать собственный список стоп-слов и настроить токенизацию через регулярные выражения. Это позволяет исключить, например, короткие слова или числа.

Пример

custom_stop = ['для', 'или', 'это']
vectorizer_custom = TfidfVectorizer(
    stop_words=custom_stop,
    token_pattern=r'(?u)\b[а-яёa-zA-Z]{3,}\b',  # только слова длиннее 2 букв
    ngram_range=(1,2)
)
X_custom = vectorizer_custom.fit_transform(df['text'])
print(vectorizer_custom.get_feature_names_out())
['анализ' 'анализ текстовых' 'данных' 'качество' 'лемматизации' 'помогает' ...]

Пример 6. Обработка больших данных с итеративным чтением

Если файл не помещается в память, можно использовать pd.read_csv с chunksize и частичный расчет TF-IDF через mini-batch или HashingVectorizer.

Пример

from sklearn.feature_extraction.text import HashingVectorizer
import pandas as pd

chunk_iter = pd.read_csv('big_texts.csv', chunksize=10000, usecols=['text'])
vectorizer_hash = HashingVectorizer(n_features=2**18, alternate_sign=False)

for chunk in chunk_iter:
    # Преобразование каждого чанка и, например, сохранение признаков
    X_chunk = vectorizer_hash.transform(chunk['text'].fillna(''))
    # ... дальнейшая обработка

При использовании HashingVectorizer теряется возможность обратного отображения хешей в слова, что усложняет интерпретацию. Рекомендуется использовать для моделей, где важна только предсказательная способность.

Анализ текстовых данных в Python - comments

En
Python анализ текстовых данных (python)