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

Напишите простой суммизатор с помощью питона и обработки естественного языка

Предварительные условия в этой статье предполагается, что вы знакомы с программированием в Python и делаете … Tagged с Python, Machinelearning, NLP.

Предварительные условия

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

У вас уже должна быть установленная версия Python 3.2 или более; Мы рассмотрим установку библиотеки NLTK и корпуса.

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

Обработка естественного языка – это изучение естественного языка как письменного, так и устного с использованием алгоритмов и технологий. Это точка Nexus многих областей, таких как лингвистика, машинное обучение, наука о данных и программирование. Его можно использовать для широкого спектра вещей, таких как анализ настроений текста, чтобы определить настроение писателя, диктовный разговорной язык в текст или суммирование больших тел текста в более мелкие тела текста.

Натуральный язык инструментарий

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

Как суммировать тест программно

Python и NLTK – это всего лишь один состав для решения этой проблемы; Но большинство наивных избирателей, таких как этот, будут следовать очень похожему на процесс, который я описываю ниже. Мы начнем с теории, а затем погрузимся в пример рабочего кода.

Сбор данных

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

Настройка данных/подготовка

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

Реальный мир является случайным и хаотичным, и часто данные также. Это этап, на которой мы получаем данные в форме и формате, который нам нужно, чтобы начать работать с ним. Например, «остановить слова», такие как к и A И пунктуация не имеет отношения к процессу оценки и оценки нашего кода, поэтому мы удалим его перед началом работы.

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

Токенизация

Токенизация – это процесс, с помощью которого мы возьмем наши предложения и разбиваем их словами, которые они содержат. Возможно, вы уже знакомы с этим, поскольку он составляет основу многих других подходов, таких как компиляция или интерпретация исходного кода.

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

The giant yellow bumblebee flew to the next juicy flower.

Мы должны получить что -то очень похожее на это:

{
  'giant': 1,
  'yellow: 2,
  'bumblebee': 1,
  'flew': 1,
  'next': 1,
  'juicy': 1,
  'flower: 1
}

Есть несколько выборов, которые вы должны отметить на этом этапе:

  • Заметьте, что для желтый У нас есть количество 2, это играет в вес/счет в следующем разделе
  • Обратите внимание, что пунктуация и остановите такие слова, как или к был удален. В этом случае они не важны для общего резюме, но в будущих проектах НЛП вы можете включить их в зависимости от того, что вы делаете.

Взвешивание и забивание

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

Давайте пойдем вперед и перейдем к еще некоторым конкретным примерам. Не волнуйтесь, если все будет немного неясно, так как они, вероятно, будут иметь гораздо больше смысла с небольшим кодом.

Настройка среды

Давайте начнем с создания каталога и установкой пакетов Python, которые нам понадобятся. Приведенные ниже примеры ссылаются на VirtualEnv, но не требуется следовать вместе с этим уроком. Для получения дополнительной информации о VirtualEnv см.: Укрощение зависимостей с питоном с виртуальным

$ mkdir nlp-simple-summarizer && cd npl-simple-summarizer
$ virtualenv venv
$ source venv/bin/activate
$ pip3 install nltk
$ python3

Как только библиотека будет установлена, мы можем перейти в Python Reply, чтобы установить корпус.

>>> import nltk
>>> nltk.download('punkt')
>>> nltk.download()

Это должно привести к экрану, который появляется, по крайней мере, в основном похожим на следующее:

Я выбрал все корпусы, но не стесняйтесь проверить некоторые другие замечательные справочные материалы в этой коллекции.

Найти Немного текста

Первым шагом для обобщения некоторого текста является то, что нам нужно найти немного текста. Я выбрал следующую историю, сделанную свободно Доступно Голос Америки Анкет

Малави женится будущие женщины -ученые через научный лагерь

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

Создайте текстовое резюме

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

Создайте новый каталог под названием SRC и файл с именем Summarize.py где наш код будет жить со следующим содержимым.

$ mkdir src
$ touch src/summarizer.py
from nltk.tokenize import sent_tokenize, word_tokenize
from nltk.corpus import stopwords
from string import punctuation
from nltk.probability import FreqDist
from heapq import nlargest
from collections import defaultdict

Пока не беспокойтесь об этом, мы рассмотрим каждого из них, когда мы их используем. Если вы выполняете свой файл summarizer.py и не получаете никаких ошибок, то это подтверждает, что наша установка была успешной.

Очистите текст

Объем работы, который необходимо проделать на этом этапе, в значительной степени будет зависеть от источника и качества ваших данных. Например, если у вас динамически покраснели контент, используя BeautifulSoup или аналогичный, вам придется написать код, чтобы очистить все не связанные с UN-связанными тегами HTML.

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

with open("data.txt") as f:
    data = f.read()
    replace = {
        ord('\f') : ' ',
        ord('\t') : ' ',
        ord('\n') : ' ',
        ord('\r') : None
    }

    data = data.translate(replace)

print(data)

После повторного сценария вы должны получить выходной текст в одном непрерывном параграфе.

Токенизация текста

Следующим шагом будет токенизировать текст. Что касается жестокости, было упомянуто только разбивание текста на токены отдельными словами, но мы также будем делать это с предложениями. Это то, что позволяет нам определить последнюю оценку предложения и выбрать наши самые сильные предложения для окончательного резюме.

stop_words = set(stopwords.words('english') + list(punctuation))
words = word_tokenize(content.lower())

word_tokens = [word for word in words if word not in stop_words]
sentence_tokens = sent_tokenize(content)

print(word_tokens)
print(sentence_tokens)

Мы начнем с создания набора, который будет содержать английские слова остановки (такие слова, как «это» или «»), а также пунктуацию, которую мы загрузили из корпуса NLTK.

Мы используем предоставленную NLTK Word_Tokenize Функция для создания списка каждого уникального слова в примере текста и sent_tokenize делать это для каждого уникального предложения. Последующее понимание списка просто проходит через каждое слово в нашем списке, если оно не является одним из наших остановок или пунктуации, то он добавляет его в наш список, хранящийся в Word_tokens Анкет

Забить наши жетоны

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

word_freq = FreqDist(word_tokens)

ranking = defaultdict(int)

for i, sentence in enumerate(sentence_tokens):
    for word in word_tokenize(sentence.lower()):
        if word in word_freq:
            ranking[i] += word_freq[word]

print(ranking)

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

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

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

Сделать все это вместе

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

indexes = nlargest(5, ranking, key=ranking.get)
final_sentences = [sentence_tokens[j] for j in sorted(indexes)]
print(' '.join(final_sentences))

nlargest Функция – это еще одна функция, которую мы принесли, чтобы упростить эту работу для нас, она принимает список ранжирования, который мы составили ранее, и может дать нам количество предложений, которые мы хотим. Первый параметр состоит в том, чтобы показать, что мы хотим пять результатов (предложения) из таблицы ранжирования, которую мы создали ранее.

Последняя картина

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

THYOLO, MALAWI - One hundred teenage girls from high
schools in Malawi recently attended a "Girls in Science"
camp at the Malawi University of Science and Technology,
known as MUST. Actually when we go to the population, 52
percent of Malawi population is female, but when we go
through the landscape of science and technologies and
innovation, you find that the number of females is lower,"
Mweta said. Role model and Engineering Student at MUST,
Rachael Nyanda  shared her knowledge with the campers
Rachael Nyanda shared her knowledge with the campers.
"Even if I go home now, I know how to program an app,
as if I see any other problems I am pretty sure I am
able to able to find some solutions to it and create
more apps and help a lot of people in Malawi," Juma
said. "We have learned about ecology, like they have
taught us how to catch mammals so that we can make
some other experiments, let's say, test their blood
sample like to find out the diseases that
affect birds…" Sipyagule said.

Учитывая простоту нашей модели, это не слишком потертая!

Вывод

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

Вы можете найти готовый код на GitHub Анкет

Оригинал: “https://dev.to/jodylecompte/write-a-simple-summarizer-with-python-and-natural-language-processing-11mk”