Упрощенная обработка естественного языка (NLP)

Я всегда нахожусь в поиске новых инструментов, которые помогут мне упростить процедуру обработки естественного языка, поэтому, когда я наткнулся на короткий видеоклип, показывающий функциональность Texthero, я знал, что должен его попробовать. Texthero разработан как оболочка Pandas, поэтому предварительно обрабатывать и анализировать текстовые ряды Pandas стало проще, чем когда-либо. Я сразу же достал документацию, открыл ноутбук и загрузил пару тысяч дискуссий из Reddit для анализа, чтобы протестировать новую библиотеку.

Примечание: библиотека Texthero все еще находится в бета-версии! Там могут быть ошибки и процедура обработки может измениться. Я нашел ошибку в функциональности wordcloudи сообщил об этом. Это должно быть исправлено в ближайшем обновлении!

Обзор Texthero

Я рассмотрю все гораздо детальнее при работе с кодом, но для краткости, Texthero разбит на четыре функциональных модуля:

Предварительная обработка

Модуль Предварительной обработки — это все, что нужно для эффективной чистки текстовых серий Pandas. Под капотом он в основном использует регулярные выражения (regex).

Обработка естественного языка (NLP)

Модуль NLP содержит несколько основных функций, таких как распознавание именованных сущностей и имен существительных. Он использует Spacy.

Представление

Модуль Представления используется для создания векторов слов с использованием различных алгоритмов. Он также включает в себя Метод Главных Компонент и k-Средних. Использует scikit-learn для TF-IDF и Count, а вложения загружаются предварительно вычисленными из языковых моделей.

Визуализация

Модуль Визуализации используется для показа представлений в виде точечной диаграммы или генерации облаков слов. Этот модуль в настоящее время имеет только несколько функций и использует Plotly и WordCloud.

Ознакомьтесь с документацией для получения полного списка функций:Texthero · Text preprocessing, representation and visualization from zero to hero.Text preprocessing, representation and visualization from zero to hero.texthero.org

Зависимости и данные

Благодаря pip установка была проста, но я столкнулся с конфликтом при попытке выполнить ее в моей среде с Apache Airflow из-за проблемы с версией pandas. Кроме того, потребовалось некоторое время, чтобы установить его в новой среде, так как он использует много других библиотек на бэкенде. Он также загружает пару дополнительных элементов после импорта в первый раз.

Также я использую PRAW для извлечения данных из Reddit.

!pip install texthero
import praw
import pandas as pd
import texthero as hero
from config import cid, csec, ua # Данные для PRAW 

Обратите внимание, когда вы импортируете Texthero впервые, он загружает кое-что из NLTK и Spacy:

Загрузки Texthero при первоначальном импорте
Загрузки Texthero при первоначальном импорте

Получение данных

Я извлекаю данные из субреддита Teaching, чтобы посмотреть, сможем ли мы определить какие-либо темы вокруг беспокойства о начале обучения в школе осенью в страдающей от COVID Америке.

# Создание соединения с reddit
reddit = praw.Reddit(client_id= cid,
                     client_secret= csec,
                     user_agent= ua)
# Список для конверсии фрейма данных
posts = []
# Возврат 1000 новых постов из teaching
new = reddit.subreddit('teaching').new(limit=1000)
# Возврат важных атрибутов
for post in new:
posts.append([post.title, post.score, post.num_comments, post.selftext, post.created, post.pinned, post.total_awards_received])
# Создание фрейма данных
df = pd.DataFrame(posts,columns=['title', 'score', 'comments', 'post', 'created', 'pinned', 'total awards'])
# Возврат 3-х верхних рядов из фрейма данных
df.head(3)

С помощью PRAW можно с легкостью извлекать данные из Reddit и загружать их во фрейм pandas.

Тут я получаю 1000 новых постов из teaching. df.head(3) выведет фрейм данных примерно таким образом:

Первые 3 ряда фрейма данных
Первые 3 ряда фрейма данных

Предварительная обработка с помощью Texthero

Настоящая фишка библиотеки texthero — это упрощенная процедура предварительной обработки. Не можете вспомнить синтаксис регулярных выражений? Texthero тебя прикроет! Просто вызовите метод .clean() и передайте ему ряд фреймов данных:

df['clean_title'] = hero.clean(df['title'])

При использовании clean() по умолчанию выполняются следующие семь функций:

  1. fillna(s) заменяет неприсвоенные значения пустыми пробелами;

  2. lowercase(s) переводит весь текст в нижний регистр;

  3. remove_digits() удаляет все блоки цифр;

  4. remove_punctuation() убирает всю пунктуацию (!»#$%&'()*+,-./:;<=>?@[\]^_`{|}~);

  5. remove_diacritics() удаляет все знаки ударенийиз строк;

  6. remove_stopwords() удаляет все стоп-слова;

  7. remove_whitespace() удаляет все пробелы между словами.

Настраиваемая чистка

Если функционал по умолчанию не делает того, что необходимо, можно очень просто создать свою процедуру настраиваемой чистки. Например, если я хочу сохранить стоп-слова и удалить включенные, я могу закомментировать remove_stopwords и добавить texthero.preprocessing.stem() к процедуре:

from texthero import preprocessing
# Создание настраиваемой процедуры чистки
custom_pipeline = [preprocessing.fillna
, preprocessing.lowercase
, preprocessing.remove_digits
, preprocessing.remove_punctuation
, preprocessing.remove_diacritics
#, preprocessing.remove_stopwords
, preprocessing.remove_whitespace
, preprocessing.stem]
# Передача custom_pipeline аргументу процедуры
df['clean_title'] = hero.clean(df['title'], pipeline = custom_pipeline)
# Передача custom_pipeline аргументу процедуры
df['clean_title'] = hero.clean(df['title'], pipeline = custom_pipeline)
df.head()

Обратите внимание, что custom_pipeline — это список функций предварительной обработки. Ознакомьтесь с документацией для получения полного списка!

Clean_title добавлены в фрейм данных
Clean_title добавлены в фрейм данных

Проверка популярных слов

Это всего лишь 1 строка кода, и я оставляю её, чтобы проверить, есть ли еще слова, которые можно добавить в список стоп-слов. Texthero еще не имеет встроенных гистограмм, у него есть только точечная диаграмма, поэтому я буду использовать Plotly express для визуализации популярных слов в гистограмме.

tw = hero.visualization.top_words(df['clean_title']).head(10)
import plotly.express as px
fig = px.bar(tw)
fig.show()
tw.head()
График популярных слов
График популярных слов

Добавление новых стоп-слов

Стемминг слов и добавление “ ‘ “ (обратите внимание на это между teachers и students) к стоп-словам должны предоставить более уникальные слова. Стемминг уже был добавлен в настраиваемую процедуру, но должны быть еще и стоп-слова. Их можно добавить в список с помощью объединения двух других:

from texthero import stopwords
default_stopwords = stopwords.DEFAULT
# Добавление списка стоп-слов к стоп-словам
custom_stopwords = default_stopwords.union(set(["'"]))
# Вызов remove_stopwords и передача списка custom_stopwords
df['clean_title'] = hero.remove_stopwords(df['clean_title'], custom_stopwords)

Обратите внимание, что список custom_stopwords передается в hero.remove_stopwords(). Я заново визуализирую его и проверю результаты!

Результаты после стемминга
Результаты после стемминга

Результаты выглядят немного лучше после того, как был применен стемминг и дополнительные стоп-слова!

Создание процедуры

Благодаря .pipe() от Pandas связать компоненты модуля Texthero очень просто. Чтобы визуализировать заголовок, я собираюсь использовать метод главных компонент (PCA) для сжатия векторного пространства. Я также собираюсь запустить кластеризацию K-средних, чтобы добавить цвет. Помните, что Texthero принимает ряд в качестве входных данных и выходных, поэтому я могу установить выход как новый столбец во фрейме данных.

# Добавление значения метода главных компонент к фрейму данных, чтобы использовать его как координаты визуализации
df['pca'] = (
            df['clean_title']
            .pipe(hero.tfidf)
            .pipe(hero.pca)
   )
# Добавление кластера k-средних к фрейму данных 
df['kmeans'] = (
df['clean_title']
.pipe(hero.tfidf)
.pipe(hero.kmeans)
)
df.head()

Кластеризация PCA и K-средних была применена с использованием всего нескольких строк кода! Теперь данные можно визуализировать с помощью hero.scatterplot()

# Генерация точечной диаграммы
hero.scatterplot(df, 'pca', color = 'kmeans', hover_data=['title'] )

Поскольку он использует Plotly, точечная диаграмма получилась интерактивной, согласно ожиданиям! Её можно увеличить по мере необходимости. Теперь пришло время изучить визуализированные результаты и посмотреть, какую информацию можно получить!

Заглавная точечная диаграмма
Заглавная точечная диаграмма

Последние мысли

Хотя Texthero все еще находится в бета-версии, я вижу многообещающее будущее для неё и надеюсь, что она получит ту любовь, которую заслуживает. Библиотека делает чистку и подготовку текста в фреймах данных panda легким ветерком. Я надеюсь, что будет добавлено еще несколько вариантов визуализации, но точечный график — это отличное начало.

Полный код

Спасибо за чтение. Вот полный код:

# Создание соединения с reddit
reddit = praw.Reddit(client_id= cid,
                     client_secret= csec,
                     user_agent= ua)
# Список для конверсии фрейма данных
posts = []
# Возврат 1000 новых постов из teaching
new = reddit.subreddit('teaching').new(limit=1000)
# Возврат важных атрибутов
for post in new:
posts.append([post.title, post.score, post.num_comments, post.selftext, post.created, post.pinned, post.total_awards_received])
# Создание фрейма данных
df = pd.DataFrame(posts,columns=['title', 'score', 'comments', 'post', 'created', 'pinned', 'total awards'])
# Возврат 3-х верхних рядов из фрейма данных
df.head(3)
from texthero import preprocessing
custom_pipeline = [preprocessing.fillna
, preprocessing.lowercase
, preprocessing.remove_digits
, preprocessing.remove_punctuation
, preprocessing.remove_diacritics
, preprocessing.remove_stopwords
, preprocessing.remove_whitespace
, preprocessing.stem]
df['clean_title'] = hero.clean(df['title'], pipeline = custom_pipeline)
df.head()
from texthero import stopwords
default_stopwords = stopwords.DEFAULT
custom_stopwords = default_stopwords.union(set(["'"]))
df['clean_title'] = hero.remove_stopwords(df['clean_title'], custom_stopwords)
hero.visualization.top_words(df['clean_title'])tw = hero.visualization.top_words(df['clean_title']).head(10)
import plotly.express as px
fig = px.bar(tw)
fig.show()
df['pca'] = (
df['clean_title']
.pipe(hero.tfidf)
.pipe(hero.pca)
)
df['kmeans'] = (
df['clean_title']
.pipe(hero.tfidf)
.pipe(hero.kmeans)
)
hero.scatterplot(df, 'pca', color = 'kmeans', hover_data=['title'] )

Для применения ко всем столбцам.

import texthero
import pandas as pd

df = pd.read_excel('data.xlsx')
df = df.astype(str)


def cleaner(column):
    return texthero.clean(column)

# Определим функцию, которая будет применяться к каждому столбцу
def clean_column(column):
    return texthero.clean(column)

# Применим функцию к каждому столбцу DataFrame
df = df.apply(clean_column)
df

Комментарии (0)