Рубрики
Без рубрики

Как извлечь ключевые слова из текста с помощью TF-IDF и Scikit-Python

Автор оригинала: FreeCodeCapm Team.

Кавита Ганесан

Вернувшись в 2006 году, когда мне пришлось использовать TF-IDF для добычи ключевых слов в Java, я закончил написать весь код с нуля. Ни наука, ни Github, ни Github, и библиотеки были просто ограничены.

Мир сегодня сильно отличается. У вас есть несколько Библиотеки и Репозитории кода с открытым исходным кодом на GitHub которые обеспечивают приличную реализацию TF-IDF. Если вам не нужно много контроля над тем, как вычисляется математика TF-IDF, я настоятельно рекомендую повторно использовать библиотеки из известных пакетов, таких как Спарк Миллыб или Scikit – Узнайте Отказ

Одна проблема Что я заметил эти библиотеки, заключается в том, что они предназначены для предварительного шага для других задач, таких как кластеризация, моделирование темы и текстовая классификация. TF-IDF На самом деле может использоваться для извлечения важных ключевых слов из документа, чтобы получить ощущение того, что характеризует документ. Например, если вы имеете дело с статьями Wikipedia, вы можете использовать TF-IDF для извлечения слов, которые являются уникальными для данной статьи. Эти ключевые слова могут быть использованы в качестве очень простого резюме документа, а также для текстовой аналитики, когда мы смотрим на эти ключевые слова в совокупности.

В этой статье Я покажу вам, как вы можете использовать Scikit – научитесь извлечь ключевые слова из документов с использованием TF-IDF. Мы специально сделаем это на набор данных переполнения стека. Если вы хотите получить доступ к Полная ноутбука Jupyter , пожалуйста, Перейти к моему репо Отказ

Важное примечание: Я предполагаю, что люди, следующие в этом руководстве, уже знакомы с концепцией TF-IDF. Если вы нет, пожалуйста, ознакомьтесь с концепцией перед чтением. Есть пара Видео онлайн Это дает интуитивное объяснение того, что это такое. Для более академического объяснения я бы порекомендовал мой Объяснение PH.D Advisor Отказ

Набор данных

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

Обратите внимание, что есть Два файла Отказ Больший файл, Stackoverflow-data-idf.json С 20 000 постов используется для вычисления обратной частоты документа (IDF). Меньший файл, Stackoverflow-test.json С 500 постами будут использоваться в качестве теста для нас, чтобы извлечь ключевые слова. Этот набор данных основан на общедоступных Слож переполнения сброса из большого запроса Google Отказ

Давайте пройдим на нашем наборе данных. Код ниже читает на одну строку JSON из Данные/Stackoverflow-data-idf.json в рамку данных PandaS и распечатывает свою схему и общее количество сообщений.

Здесь строки = правда Проще означает, что мы рассматриваем каждую строку в текстовом файле как отдельная строка JSON.

Обратите внимание, что этот набор данных переполнения стека содержит 19 полей, включая заголовок поста, тело, теги, даты и другие метаданные, которые нам не нужно для этого руководства. Для этого учебника мы в основном заинтересованы в теле и названии. Это станет нашим источником текста для добычи ключевых слов.

Теперь мы создадим поле, которое объединяет оба Тело и Название Таким образом, у нас есть два в одном поле. Мы также распечатаем вторую запись текста в нашем новом поле, чтобы увидеть, как выглядит текст.

Э-э, это не выглядит очень читаемо! Ну, это из-за всей уборки, которая продолжалась в Pre_Process (..) Отказ Вы можете сделать намного больше вещей в Pre_Process (..) , например, исключить все секции кода и нормализовать слова к его корню. Для простоты мы будем выполнять только немного мягкой предварительной обработки.

Создание словарного запаса и количества слов для IDF

Теперь нам нужно создать словарный запас и начать процесс подсчета. Мы можем использовать CountVectorizer Создать словарный запас от всего текста в нашем df_idf [«Текст»] с последующим количеством слов в словаре:

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

Примечание Что, с этим представлением количество некоторых слов может быть 0, если слово не появилось в соответствующем документе.

Здесь мы передаем два параметра для CountVectorizer, max_df и Stop_words Отказ Первый – просто игнорировать все слова, появившиеся в 85% документов, поскольку те могут быть неважными. Позже является пользовательским списком слов стоп. Вы также можете использовать «Стоп», которые являются родными для Sklearn, установив Stop_words = 'English' Отказ Список стоп слов, используемый для этого урока, можно найти здесь Отказ

Полученная форма word_count_vector Есть (20000 124901), поскольку у нас есть 20 000 документов в нашем наборе данных (строки), а размер словаря 124 901.

В некоторых текстовых приложениях добычи, такие как кластеризация и классификация текста, мы обычно ограничиваем размер словаря. Это действительно легко сделать это, установив max_features = vocab_size при создании усаживания CountVectorizer. Для этого учебника давайте ограничим наш словарный запас до 10000:

Теперь давайте посмотрим на 10 слов из нашего словаря:

['serializing', 'private', 'struct', 'public', 'class', 'contains', 'properties', 'string', 'serialize', 'attempt']

Сладкие, это в основном, связанные с программированием.

Tfidftransformer для вычисления IDF

В настоящее время время вычислить значения IDF.

В приведенном ниже коде мы по сути, мы предпринимаем редкую матрицу из CountVectorizer ( word_count_vector ) для создания IDF при вызове Fit (...) :

Чрезвычайно важный момент : IDF всегда должен основываться на большой корпусе, а также должен быть представлен тексты, которые вы будете использовать для извлечения ключевых слов. Я видел несколько статей в Интернете, который вычисляет IDF, используя несколько документов. Вы будете победить всю цель Взвешении IDF, если он не основан на большой корпусе как:

  1. Ваш словарный запас становится слишком маленьким, а
  2. У вас есть ограниченные возможности наблюдать за поведением слов, о которых вы знаете.

Вычисление TF-IDF и извлечение ключевых слов

После того, как у нас будет наш IDF вычислен, мы готовы вычислить TF-IDF, а затем извлечь ключевые слова главных из векторов TF-IDF.

В этом примере мы извлеким главные ключевые слова для вопросов в Data/Stackoverflow-test.json Отказ Этот файл данных имеет 500 вопросов с полями, идентичными для этого Данные/Stackoverflow-data-idf.json Как мы видели выше. Мы начнем с чтения нашего тестового файла, извлекая необходимые поля – заголовок и тело – и получать тексты в список.

Следующим шагом является вычисление стоимости TF-IDF для данного документа в нашем тесте, установленном, вызовом tfidf_transformer.transform (...) Отказ Это генерирует вектор баллов TF-IDF.

Далее мы сортируем слова в векторе в нисходящий Порядок ценностей TF-IDF, а затем переоценить, чтобы извлечь ключевые слова Top-n. В приведенном ниже примере мы извлекаем ключевые слова для первого документа в нашем тестовом наборе.

sort_coo (...) Метод по существу сортирует значения в векторе при сохранении индекса колонны. После того, как у вас есть индекс колонна, то это действительно легко найти соответствующее значение слова, как вы увидели в Extract_topn_from_vector (...) где мы делаем feature_vals.append (функция_Names [IDX]) Отказ

Некоторые результаты!

В этом разделе вы увидите вопрос переполнения стека, за которыми следуют соответствующие извлеченные ключевые слова.

Вопрос о интеграции плагинов Eclipse

Из ключевых слов выше главные ключевые слова действительно имеют смысл, он говорит о Eclipse , Maven , Интеграция , война и Tomcat Все уникальные для этого конкретного вопроса.

Есть пара ключевых слов, которые могли бы быть устранены, такие как Возможность И, возможно, даже Проект Отказ Вы можете сделать это, добавив более распространенные слова в свой список остановок. Вы даже можете создать свой собственный набор Stop Seit, Очень специфично для вашего домена Отказ

Теперь давайте посмотрим на другой пример.

Вопрос о импорте SQL

Даже со всеми тегами HTML из-за предварительной обработки мы можем извлечь некоторые довольно хорошие ключевые слова здесь. Последнее слово соответственно будет квалифицировать как сложное слово. Вы можете поддерживать разные примеры, чтобы получить идеи того, как правильно настроить результаты.

Воила! Теперь вы можете извлечь важные ключевые слова из любого типа текста!

Ресурсы

Следуй за моим блогем Чтобы узнать больше текстового добычи, NLP и машинного обучения на примененной перспективе.

Эта статья была первоначально опубликована в kavita-ganesan.com Отказ