Обработка естественного языка с Python

Содержание
  1. Задача
  2. Обработка естественного языка. Начало работы
  3. Предобработка данных
  4. Визуализация NLP
  5. Библиотеки
  6. Natasha
  7. Yargy
  8. Razdel
  9. Corus
  10. Navec
  11. Slovnet
  12. Ipymarkup
  13. Nerus
  14. 3. Извлечение признаков из текста
  15. Другие необходимые пакеты
  16. gensim
  17. шаблон
  18. Извлечение существительного из предложений
  19. NLP пайплайн шаг за шагом
  20. Шаг 1. Выделение предложений
  21. Шаг 2. Токенизация, или выделение слов
  22. Шаг 3. Определение частей речи
  23. Шаг 4. Лемматизация
  24. Шаг 5. Определение стоп-слов
  25. Зачем использовать Python для обработки естественного языка (NLP)?
  26. 1. Инструментарий естественного языка (NLTK)
  27. 2. TextBlo
  28. 3. CoreNLP
  29. 4. Gensim
  30. 5 spaCy
  31. 6. Polyglot
  32. 7. Scikit–learn
  33. 8. Pattern
  34. лемматизации
  35. Пакет WordNetLemmatizer
  36. 4. О словаре для частотного анализа
  37. лексемизацию
  38. пример
  39. пакет sent_tokenize
  40. пакет word_tokenize
  41. Пакет WordPunctTokenizer
  42. Токенизация
  43. 3. Лемматизация текстовых данных
  44. Морфологический
  45. PorterStemmer пакет
  46. LancasterStemmer пакет
  47. SnowballStemmer пакет
  48. 2 stemming данные
  49. Портер stemmer.
  50. Ланкастер Стемемер
  51. Загрузка данных НЛТК
  52. 6. Общая схема системы
  53. Исправление ошибок в орфографии
  54. 2. Формализация задачи

Задача

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

Сам набор данных: https://www.kaggle.com/extralime/math-lectures.

Для скачивания нам нужно зарегистрироваться на Kaggle (наверняка они все там есть), скачать архив и распаковать.

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

Обработка естественного языка. Начало работы

Уже просмотрев список импорта, мы можем понять, что здесь не все так просто, как в обычных задачах классификации или регрессии.

Рассмотрим самые неочевидные места:

  • string — модуль стандартной библиотеки Python для расширенного управления строками
  • seaborn — надстройка для matplotlib (здесь просто нужно задать стиль графиков)
  • CountVectorizer — класс, с которым мы будем векторизовать

Предобработка данных

Загрузим наш набор данных в объект DataFrame:

Убедимся, что у нас нет пустых значений:

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

Создаем хеш-таблицу и обратную таблицу (в дальнейшем нам она пригодится).

Series.unique () — возвращает список уникальных значений для столбца Series.

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

Получаем такой словарь:

Используя метод Series.map (), закодируйте значения:

Series.map (dict) — заменяет значения столбца значениями, указанными в словаре.

Теперь давайте создадим массив с помощью векторизатора, который мы импортировали ранее:

Так же создаем обратную таблицу, в дальнейшем она нам понадобится. Векторизатор возвращает массив CSR (документация здесь).

stop_words — список стоп-слов (они будут просто удалены). В нашем случае мы указываем список слишком распространенных английских слов. К сожалению, не все эти слова удалены, подробнее об этом позже. Вы хотите создать свой список запрещенных слов? В этом вопросе о StackOverFlow (сегодня он имеет особый дизайн) описывается, как это сделать.

vectorizer.get_feature_names () — получает список всех слов, которые будут использоваться для кодирования.

vectorizer.vocabulary_ — это словарь со значениями, аналогичный тому, что мы делали выше с метками классов.

vectorizer.fit_transform () — метод «тренирует» векторизатор и сразу возвращает результат для заданного набора слов.

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

Теперь выведем наиболее часто встречающиеся слова (это не совсем так) в разных «категориях» текста.

Давайте создадим функцию, которая векторизует отдельные фрагменты DataFrame:

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

Также нам понадобится функция, которая возвращает индексы N наиболее распространенных элементов (функция была выбрана из ответов на вопрос о переполнении стека):

Основной частью нашего представления будет хеш-таблица, ключом которой будет закодированное значение категории, а значениями будет список часто встречающихся слов с позиции 90 до 100.

Почему от 90 до 100, а не от 0 до 10? Как я указал выше, не все стоп-слова удаляются во время векторизации. Таким образом, первые 10 слов совпали на 70-80% по каждой категории. С 90-й по 100-ю позицию слова существенно различаются, поэтому мы будем использовать эти слова.

np.array.sum () — добавляет один элемент массива, возвращая новый. В отличие от обычной функции суммы, мы можем указать ось, в нашем случае для суммирования столбцов.

Здесь нет новых методов, кроме приведенных выше, вам просто нужно внимательно прочитать все функции.

Вывод такой:

Слово «частота» имеет разные значения для разных категорий. Это связано с тем, что набор данных неоднороден, и количество примеров для одной категории не соответствует количеству примеров для другой.

Теперь построим серию «баров»:

plt.sublots (rows, columns, figsize) — добавьте много графиков, вы также можете указать значение для общего размера фигуры в дюймах.

axes.flat — поскольку оси изначально имеют вид (5, 2), для упрощения работы с ними мы будем использовать одномерный массив. Вы можете получить такой массив из массива любой формы, используя атрибут flat.

Axes.set_ylabel (string) — установка заголовка для оси y.

Axes.set_xticks (array) — устанавливает желаемый список значений по оси x.

Axes.set_xticklabels (array) — устанавливает список меток по оси x.

Axes.set_title (строка) — задает заголовок для «диаграммы».

Axes.bar () — создание гистограммы.

Встроенная волшебная команда IPython% matplotlib дает нам вывод графика прямо в блокнот:

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

Библиотеки

Natasha

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

Yargy

Аналог парсера Яндекс Томита. Используя словари и правила, извлекает структурированную информацию из естественных русских текстов.

Razdel

Разделите текст на слова и фразы.

Corus

Коллекция ссылок на общедоступные русскоязычные наборы данных.

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

Slovnet

Компактные модели для обработки естественного русского языка: морфологический теггер, синтаксический синтаксический анализатор, теггер NER.

Ipymarkup

Инструменты для просмотра разметки NER и синтаксических ссылок.

Nerus

Большой корпус с автоматической разметкой именованных сущностей, морфологии и синтаксиса.

3. Извлечение признаков из текста

В этом разделе мы описываем метод извлечения характеристик из текста, называемый частотным анализом (другое название — много слов) 1 и его модификации.

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

Точнее, схема частотного анализа выглядит так.

  1. построить словарь $ V $ из всех слов, используемых в источнике $ T$
  2. для каждого текста $ t_i in T$
    и для каждого словарного слова $ v_j in V$,
    подсчитывает количество вхождений $ x_ {ij} $ слова $ v_j $ в текст $ t_i$

Таким образом, для каждого текста $ t_i in T $ мы получаем вектор неотрицательных целых чисел $ x_i $, длина которого равна количеству слов в словаре $ V$.
Это основная форма метода частотного анализа текста.

Для текстов разного размера значение частоты $ x $ может сильно отличаться, т.е чем больше текст, тем больше может быть повторений слов. Чтобы уменьшить этот эффект, используется метод нормализованного частотного анализа или TF (term frequency) 2, значения частот $ x $ делятся на общее количество слов в тексте $ t $. begin {уравнение} TF (t, V) = frac {x (t, V)} {измерение (t)} end {уравнение}

Другие необходимые пакеты

Многие другие пакеты Python, такие как gensim и pattern, также очень необходимы для синтаксического анализа текста, а для создания приложений обработки естественного языка с использованием пакетов NLTK можно установить, как показано ниже —

gensim

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

pip install gensim

шаблон

Его можно использовать для правильной работы пакета gensim. Следующая команда помогает в установке модели —

шаблон установки pip

Извлечение существительного из предложений

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

from textblob import TextBlob nouns = TextBlob («Космический корабль« Надежда ОАЭ »вышел на орбиту Марса на прошлой неделе и уже отправил просто великолепное изображение красной планеты.») для существительных в существительных noun_phrases: print (имя существительное)

Выйти из программы

арабские эмираты надежда марс красная планета

NLP пайплайн шаг за шагом

Давайте посмотрим на следующий отрывок из Википедии:

Лондон — столица и самый густонаселенный город Англии и Соединенного Королевства. Лондон, расположенный на берегу Темзы на юго-востоке острова Великобритания, был важным поселением на протяжении двух тысячелетий. Он был основан римлянами, которые назвали его Лондиниум.

В этом разделе собраны некоторые полезные факты. Я хотел бы, чтобы компьютер понимал, что Лондон — это город, что он находится в Англии, что он был основан римлянами и так далее, но прежде всего мы должны научить его самым основным понятиям письменного языка.

Шаг 1. Выделение предложений

Первый шаг в конвейере — разбить текст на отдельные предложения. В результате получаем следующее:

  1. Лондон — столица и самый густонаселенный город Англии и Соединенного Королевства.
  2. Лондон, расположенный на берегу Темзы на юго-востоке острова Великобритания, был важным поселением на протяжении двух тысячелетий.
  3. Он был основан римлянами, которые назвали его Лондиниумом.

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

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

Шаг 2. Токенизация, или выделение слов

Теперь мы можем обрабатывать поступившие предложения по очереди. Начнем с первого:

Лондон — столица и самый густонаселенный город Англии и Соединенного Королевства.

Следующим шагом в конвейере является выбор отдельных слов или токенов: токенизация. Результат на этом этапе выглядит так:

Лондон — столица и самый густонаселенный город Англии и Королевства »,« Королевство», «.»

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

Шаг 3. Определение частей речи

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

На этом этапе мы проанализируем каждое слово вместе с его ближайшим окружением, используя заранее подготовленную модель классификации:

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

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

После обработки получаем следующий результат:

Обладая этой информацией, вы уже можете приступить к анализу смысла. Например, в предложении мы видим названия «Лондон» и «столица», вероятно, относящиеся к Лондону.

Шаг 4. Лемматизация

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

У меня была пони.
У меня было две пони.

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

В НЛП этот процесс называется лемматизацией: поиск базовой формы (леммы) каждого слова в предложении.

То же самое и с глаголами. Мы можем привести их к неопределенному виду. Таким образом, фраза «У меня было два пони» превращается в «Я я два пони».

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

Вот как выглядит наше предложение после обработки:

Единственное изменение — это преобразование «есть» в «бытие».

Шаг 5. Определение стоп-слов

Теперь мы хотим определить важность каждого слова в предложении. В английском языке много вспомогательных слов, например «е», «the», «a». При статистическом анализе текста эти токены создают много шума, так как появляются чаще других. Некоторые конвейеры НЛП помечают их как стоп-слова и фильтруют их перед подсчетом числа.

Наше предложение теперь выглядит так:

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

Например, если вы решили создать движок для поиска рок-групп, вы, вероятно, не проигнорируете статью «the». Он появляется в названиях многих групп, а известную группу 80-х даже называют «The!».

Зачем использовать Python для обработки естественного языка (NLP)?

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

Но в этом универсальном языке есть еще кое-что, что делает его такой отличной технологией для обработки естественного языка. Python предоставляет разработчикам большой набор инструментов и библиотек для решения проблем, связанных с НЛП. Он охватывает классификацию документов, моделирование тем, маркировку частей речи (POS), векторы слов и анализ тональности.

1. Инструментарий естественного языка (NLTK)

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

Библиотека была разработана Стивеном Бердом и Эдвардом Лаупером из Пенсильванского университета. Он сыграл ключевую роль в новаторских исследованиях НЛП. NLTK, наряду с другими библиотеками и инструментами Python, теперь используется в своих учебных программах университетами по всему миру.

Библиотека довольно универсальна, однако (и надо признать!) Ее сложно использовать для обработки естественного языка. NLTK может работать довольно медленно и не соответствовать требованиям быстро меняющегося производственного использования. Кривая обучения очень крутая, но разработчики могут воспользоваться такими ресурсами, как эта полезная книга. Узнайте больше о концепциях, лежащих в основе операций языковой обработки, поддерживаемых этим набором инструментов.

2. TextBlo

TextBlob является обязательным условием для разработчиков, начинающих свое путешествие по НЛП на Python. Идеально подходит для вашего первого опыта НЛП. TextBlob предоставляет новичкам простой интерфейс, который помогает им освоить базовые действия НЛП, такие как анализ тональности, теги POS или выделение номинальных фраз.

Мы считаем, что любой, кто хочет сделать свои первые шаги к НЛП с Python, должен использовать эту библиотеку. Это очень полезно при разработке прототипов. Однако он также унаследовал основные недостатки NLTK. Эта библиотека слишком медленная, чтобы эффективно помогать разработчикам справляться с требованиями использования Python NLP в производстве.

3. CoreNLP

Эта библиотека была разработана в Стэнфордском университете и написана на языке Java. Однако он поставляется с оболочками для многих языков, включая Python, что делает его полезным для разработчиков, которые хотят попробовать свои силы в обработке естественного языка в Python. В чем заключается самое большое преимущество CoreNLP? Библиотека действительно быстрая и хорошо работает в средах разработки продуктов. Кроме того, некоторые компоненты CoreNLP могут быть интегрированы с NLTK, что неизбежно повысит эффективность последнего.

4. Gensim

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

5 spaCy

spaCy — относительно молодая библиотека, предназначенная для производственного использования. Вот почему он намного более доступен, чем другие библиотеки NLP Python, такие как NLTK spaCy, предлагающий самый быстрый синтаксический анализатор на рынке сегодня. Кроме того, поскольку инструментарий написан на Cython, он также очень быстр и эффективен.

Но идеального инструмента нет. По сравнению с библиотеками, которые мы видели до сих пор, spaCy поддерживает наименьшее количество языков (семь). Однако растущая популярность машинного обучения, NLP и spaCy в качестве ключевой библиотеки означает, что этот инструмент вскоре может начать поддерживать больше языков программирования.

6. Polyglot

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

7. Scikit–learn

Эта библиотека НЛП проста в использовании. Он предоставляет разработчикам широкий спектр алгоритмов для построения моделей машинного обучения. Его функциональные возможности позволяют использовать модель набора слов для создания объектов, предназначенных для решения задач классификации текста. Сильная сторона этой библиотеки — ее интуитивно понятные методы класса. Кроме того, scikit-learn содержит отличную документацию, которая поможет разработчикам максимально эффективно использовать свои навыки.

Однако библиотека не использует нейронные сети для предварительной обработки текста. Поэтому, если вы хотите выполнять более сложные задачи предварительной обработки, такие как маркировка POS для текстовых корпусов, лучше всего использовать другие библиотеки NLP, а затем вернуться к scikit-learn, чтобы построить свои собственные модели.

8. Pattern

Еще одна жемчужина среди библиотек NLP, используемых разработчиками Python для работы с естественными языками. Шаблон предоставляет инструменты для частей кодирования речи, анализа тональности, векторных пространств, моделирования (SVM), классификации, кластеризации, поиска по n-граммам и WordNet. Вы можете воспользоваться парсером DOM, поисковым роботом и некоторыми полезными API, такими как Twitter или Facebook API. Однако этот инструмент по сути является веб-майнером и может быть недостаточным для других задач обработки естественного языка.

лемматизации

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

Модуль NLTK предоставляет следующий пакет лемматизации —

Пакет WordNetLemmatizer

Этот пакет извлекает основную форму слова в зависимости от того, используется ли оно как существительное или как глагол. Для импорта этого пакета можно использовать следующую команду —

из nltk.stem импортировать WordNetLemmatizer

4. О словаре для частотного анализа

Создание словаря — важная часть системы обработки текста. Информативность векторных знаков и, как следствие, качество системы зависит от того, какие слова в них появляются. Словарь состоит из целого ряда текстов, основанных на деятельности.

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

Однако для задачи определения авторства текста частота употребления предлогов может оказаться очень полезными знаками.

Удалять часто используемые слова или нет? Есть компромиссный вариант для формирования векторных объектов. Его имя — TF-IDF 2, этот метод не удаляет часто используемые слова из словаря, но снижает их вес в векторе признаков. Для этого рассчитывается обратный коэффициент частоты документа (IDF) для всех слов в словаре, это выглядит так. begin {уравнение} IDF (v_i) = log frac {size (T)} {size (T (v_i))} end {уравнение} то есть логарифм дроби, в числителе которой содержится общее количество текстов а знаменатель содержит количество текстов, содержащих слово $ v_i $, то есть чем чаще встречается слово, тем ниже его значение IDF.

Результирующая частотная характеристика, по-видимому, является произведением частотной характеристики TF на обратный частотный коэффициент IDF. begin {уравнение} TFIDF (t, T, v) = TF (t, v) cdot IDF (t, T, v) end {уравнение}

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

Далее поговорим о предварительной очистке текста.

лексемизацию

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

пример

Прихожая — кровать и стул — это виды мебели.

Кровать и стул

У нас есть несколько пакетов токенизации, предоставляемых NLTK. Мы можем использовать эти пакеты в соответствии с нашими потребностями. Пакеты и детали их установки:

пакет sent_tokenize

Этот пакет можно использовать для разделения вводимого текста на предложения. Мы можем импортировать его, используя следующую команду —

из nltk.tokenize импорт sent_tokenize

пакет word_tokenize

Этот пакет можно использовать для разбиения вводимого текста на слова. Мы можем импортировать его, используя следующую команду —

из nltk.tokenize import word_tokenize

Пакет WordPunctTokenizer

Этот пакет можно использовать для разделения вводимого текста на слова и знаки препинания. Мы можем импортировать его, используя следующую команду —

из nltk.tokenize импорт WordPuncttokenizer

Токенизация

Токенизация — это этап, на котором длинные строки текста разбиваются на более мелкие блоки или токены. Большие блоки текста можно преобразовать в предложения, предложения в слова и т.д. Дальнейшая обработка обычно выполняется после того, как фрагмент текста составлен правильно. Токенизация также известна как сегментация текста или лексический анализ.

Сегментация иногда используется для обозначения разделения большого фрагмента текста на более крупные части слова (например, абзацы или предложения), в то время как токенизация предназначена для процесса разделения только на слова.

Для нашей задачи мы добавим наш образец текста в список слов. Для этого используется функция NTLK word_tokenize().

Примечание. Если вы получаете сообщение об ошибке «punkt resource not found», просто добавьте строку nltk.download (‘punkt’) в свой код и запустите. Система автоматически загрузит пункт. Так что эту строку можно удалить.

words = nltk.word_tokenize (образец) print (слова) Язык кода: PHP (php)

А вот наши токены за слова:

«Здесь», «Заголовок», «Страницы», «Полужирный», «Текст», «Текст», «Курсив», «Но», «Это», «Все», «Еще», «Будет», ‘здесь’, ‘! ‘,’ Я бегу ‘,’. ‘,’ он ‘,’ он бежал ‘,’. ‘,’ она бежит ‘,’. ‘,’ Остановится ‘,’ если ‘,’ они ‘,’ беги ‘,’? ‘,’ Я ‘,’ говорил ‘,’. ‘,’ Она ‘,’ говорил ‘,’. ‘,’ Они ‘,’ говорил ‘,’ с ‘,’ они ‘или’, ‘беги’, ‘. ‘,’ Кто ‘,’ побежал ‘,’ а ‘,’ говорящий ‘,’ бегун ‘,’? ‘,’ (‘,’ Здесь ‘,’ есть ‘,’ текст ‘,’, ‘,’ который ‘,’ мы ‘,’ не ‘,’ хочу ‘,’ сохранить ‘,’) ‘,’ Иван ‘ , ‘,’, ‘Сергей’, ‘,’, ‘Александр’, ‘и’, ‘Василий’, ‘пойдут в’, ‘в’, ‘магазин’, ‘завтра’, ‘утром’, ‘ ! ‘,’ Что-то ‘,’… ‘,’ не ‘,’ вот так ‘,’! ‘,’ С. ‘,’, ‘,’; ‘,’ Это ‘,’: ‘,’: ‘, ‘фраза’, ‘.’ , «Я», «больше», «не», «я могу», «это», «делаю», «. ‘,’ Я ‘,’ не ‘,’ я знал ‘,’ они ‘,’. ‘,’ Почему ‘,’ ты ‘,’ не ‘,’ ты мог бы ‘,’ пообедать ‘,’ в ‘,’ ресторане ‘,’? ‘,’ мой ‘,’ любимый ‘,’ франшиза ‘,’, ‘,’ Индианы, ‘Джонса’, ‘; ‘,’ Кино ‘,’ Вселенная ‘,’ Марвел ‘,’; ‘,’ Звездное ‘,’ Войны ‘,’; ‘,’ Назад ‘,’ В ‘,’ Будущее ‘,’; ‘,’ Гарри ‘,’ Поттер ‘,’. ‘,’ Не делай ‘,’ делай ‘,’ это ‘,’…. ‘,’ Просто ‘,’ не делай ‘,’ делай ‘, ‘.’, ‘Билли’, ‘!’ , ‘Я’, ‘Я знаю’, ‘,’, ‘что’, ‘ты’, ‘делаю’, ‘.’, ‘U’, ‘ты’, ‘здесь’, ‘большой’, ‘дом’, ‘. ‘,’ John ‘,’: ‘,’ « ‘,’ So ‘,’, ‘,’ so ‘,’, ‘,’ so ‘, «‘ ‘»,’. ‘,’ Джеймс ‘,’: ‘,’ « ‘,’ Здесь ‘,’, ‘,’ здесь ‘,’. ‘,’ Там там ‘,’. ‘, «‘ ‘»,’ Есть ‘,’ много ‘,’ причин ‘,’ не ‘,’ делать ‘,’ это ‘,’. ‘,’ там ‘,’ 101 ‘,’ причина ‘,’ не ‘,’ делать ‘,’ это ‘,’. ‘ , ‘1000000’, ‘причины’, ‘,’, ‘о’, ‘то же’, ‘бизнес’, ‘.’, ‘Я’, ‘слишком много’, ‘нужно’, ‘купить’, ‘2’, «пакеты», «в», «два», «разные», «магазины», «. ‘,’ 22 ‘,’ 45 ‘,’ 1067 ‘,’ 445 ‘,’ {‘,’ {‘,’ Здесь ‘,’ некоторые ‘,’ слова ‘,’ внутри ‘,’ двойной ‘,’ ёжик ‘, ‘скобка’, ‘}’, ‘}’, ‘{‘, ‘здесь’, ‘другой’, ‘текст’, ‘в’, ‘одиночный’, ‘фигурный’, ‘родители’, ‘.’, ‘} ‘ Язык кода: JavaScript (javascript)

3. Лемматизация текстовых данных

Процесс лемматизации похож на стемминг.

После лемматизации вывод, который мы можем получить, называется «леммой», которая является корневым словом, а не корнем корня.

В отличие от стемминга, мы получаем правильное слово после лемматизации, что подразумевает то же самое.

nltk.download (‘wordnet’) из nltk.stem импорт WordNetLemmatizer lemmatizer = WordNetLemmatizer () для слова в text.split (): если len (word)> 5 и слово! = lemmatizer.lemmatize (слово): print ((слово), lemmatizer.lemmatize (слово))) elif len (слово)> 10: print ((слово, lemmatizer.lemmatize (слово)))

дает нам:

(‘лампа накаливания’, ‘лампа накаливания’) (‘огни’, ‘свет’) (‘лилии’, ‘лилия’) (‘пузыри’, ‘пузырь’) (‘после обеда’, ‘после обеда’) (‘атмосфера ‘,’ атмосфера ‘) (‘ trammel ‘,’ trammel ‘) (‘ указатель ‘,’ указатель ‘) (‘ points ‘,’ point ‘) (‘ index-like ‘,’ index -As ‘) (‘ серьезность ‘ , ‘серьезность’) (‘универсально’, ‘универсально’) (‘неправильное представление.’, ‘неправильное представление.’) (‘аргументативный’, ‘аргументативный’) (‘математик’, ‘математик’) (‘математик’, ‘математик’) (‘вещи’, ‘вещь’) (‘абстракции.’, ‘абстракции.’ ‘) (‘ Психолог. ‘,’ Психолог. ‘) (‘ существование. ‘,’ существование. ‘) (‘_instant_’, ‘_instant_’) (‘существование? «‘, ‘существование?»‘) (‘направления:’, ‘направления:’) (‘e-Duration.’, ‘e — Duration.’) (‘ измерения, ‘,’ измерения, ‘) (‘ плоскости ‘,’ плоскость ‘) (‘ различие ‘,’ различие ‘) (‘ измерения ‘,’ измерение ‘) (‘ сознание ‘,’ сознание ‘) (‘ прерывистое ‘, ‘прерывистый’)

Отличие: класс Porterstemmer отбрасывает слово «es». Класс WordNetLemMatizer рассматривает это как настоящее слово.

Проще говоря, основание выглядит только в словоформе, тогда как лемматизация смотрит на значение слова.

Морфологический

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

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

Ниже представлены различные пакеты стержней, предоставляемые модулем NLTK:

PorterStemmer пакет

Этот пакет вывода использует алгоритм Портера для извлечения основной формы слов. С помощью следующей команды мы можем импортировать этот пакет —

из nltk.stem.porter import PorterStemmer

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

LancasterStemmer пакет

Этот пакет вывода использует алгоритм Ланкастера для извлечения основной формы слов. С помощью следующей команды мы можем импортировать этот пакет —

из nltk.stem.lancaster import LancasterStemmer

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

SnowballStemmer пакет

Этот пакет вывода использует алгоритм Snowball для извлечения основной формы слов. С помощью следующей команды мы можем импортировать этот пакет —

из nltk.stem.snowball import SnowballStemmer

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

2 stemming данные

Выделение основы — это процесс, который используется путем извлечения из них аффиксов для удаления основной структуры терминов.

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

В NLTK (который расшифровывается как Natural Language Toolkit) у нас есть две основные функции вывода:

  • Герб Портера.
  • Ланкастер Стеммер

Портер stemmer.

Без сомнения, Port Stemmer — наиболее часто используемый стеммер, а также один из самых маленьких стеммеров.

это также самый старый и самый крупный алгоритм вывода.

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

import re text = re.sub (» n», «», text) импортировать nltk из nltk.stem import PorterStemmer word_stemmer = PorterStemmer () для слова в text.split («»): если len (word)> 10: print ((слово, word_stemmer.stem (слово)))

Итак, мы получаем результат как:

(‘лампа накаливания’, ‘лампа накаливания’) (‘после обеда’, ‘после обеда’) (‘атмосфера’, ‘атмосфера’) (‘указатель’, ‘указатель’) (‘указатель-как’, ‘указатель -a ‘) (‘ честность ‘,’ серьезный ‘) (‘ универсальный ‘,’ универсальный ‘) (‘ неправильная идея. », «неправильная идея.» ‘) (‘ аргументированный ‘,’ аргумент ‘) (‘ математик ‘ , ‘математик’) (‘математик’, ‘математик’) (‘абстракции.’, ‘абстракции.’ ‘) (‘ психолог. ‘,’ психолог. ‘) (‘ существование. ‘,’ существование. ») (‘_ мгновенное_’, ‘_ мгновенное_’) (‘существование? «‘, ‘существование?»‘) (‘направления:’, ‘направления:’) (‘e-Duration.’, ‘e-duration.’) (‘измерения’, ‘измерения’) (‘различие’, ‘различие’) (‘сознание’, ‘сознание’) (‘прерывистое’, ‘прерывистое’)

Итак, как видите, большинство слов были сокращены правильно. Однако те, которые не были, например, «Mathemat», будут давать одно и то же слово для всех похожих слов. Так что это не проблема.

Ланкастер Стемемер

Алгоритм стемминга Ланкастера очень груб.

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

из nltk.stem import LancasterStemmer Lanc_stemmer = LancasterStemmer () для слова в text.split («»): если len (word)> 10: print ((word, Lanc_stemmer.stem (word)))

из:

(‘incandescente’, ‘incandescente’) (‘после обеда’, ‘после обеда’) (‘атмосфера’, ‘атмосфера’) (‘указатель’, ‘указатель’) (‘указатель-как’, ‘указатель-как ‘) (‘ единственность ‘,’ серьезность ‘) (‘ универсальность ‘,’ универсальность ‘) (‘ неправильное представление. », ‘неправильное представление.’ ‘) (‘ аргументированный ‘,’ аргумент ‘) (‘ математик ‘,’ математик ‘) (‘математик’, ‘математик’) (‘абстракции.’, ‘абстракции.’ ‘) (‘ психолог. ‘,’ психолог. ‘) (‘ существование. ‘,’ существование. ») (‘_ мгновенное_ ‘,’ мгновенное_ ‘) (‘ существование? «‘,’ существование?» ‘) (‘ направления: ‘,’ направления: ‘) (‘ электронная продолжительность. ‘,’ электронная длительность. ‘) (‘ размеры, ‘,’ размеры, ‘) (‘ различие ‘,’ различие ‘) (‘ сознание ‘,’ сознание ‘) (‘ прерывистое ‘,’ прерывистое’)

Загрузка данных НЛТК

После установки NLTK еще одной важной задачей является загрузка предустановленных текстовых репозиториев, чтобы их можно было легко использовать. Однако перед этим нам нужно импортировать NLTK так же, как мы импортируем любой другой модуль Python. Следующая команда поможет нам импортировать NLTK —

импортировать nltk

Теперь загрузите данные NLTK, используя следующую команду —

nltk.download()

Установка всех доступных пакетов NLTK займет некоторое время.

6. Общая схема системы

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

  1. собирать и аннотировать дидактические тексты $ T$
  2. убирать ненужные слова из текстов (по активности)
  3. выполнять корчевание (нормализация слов)
  4. построить словарь $ V $ из чистого набора текстов $ T$
  5. использовать словарь $ V $ для анализа частоты текста
  6. построить массив обучающих примеров $ X $ из векторов частотных характеристик и списка текстовых меток $ L$
  7. перемешать набор $ X $ случайным образом (переупорядочить строки матрицы)
  8. разделить набор $ X $ на две части — обучающий набор $ X_l $, тестовый набор $ X_t$
  9. обучить классификатор (или кластеризатор) $ g $ на множестве $ X_l $ и сохранить его параметры $ W$
  10. проверить качество системы на наборе $ X_t$

Далее мы рассмотрим реализацию описанной выше схемы на языке Python.

Исправление ошибок в орфографии

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

from textblob import TextBlob text = «привет, меня зовут joohn, я люблю читать bookz» out = TextBlob (text) .correct () print (out)

Выйти из программы

привет, меня зовут Джон, я люблю читать книги

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

2. Формализация задачи

Для решения упомянутых выше проблем воспользуемся методами машинного обучения. Чтобы использовать их, нам нужен помеченный набор текстов $ T $ для обучения системы, то есть каждый учебный текст помечен для определенного класса. Вам также необходимо выбрать способ формализации этих данных, например, способ построить отображение $ f $ из текста $ T $, установленного в $ X $ begin {уравнение} f: T rightarrow X end {уравнение}

Функция $ f $ называется извлечением признаков.

После определения $ f $ и построения пространства признаков $ X $ каждому тексту из $ T $ присваивается точка из $ X $, у нас есть возможность применить весь арсенал математических методов, чтобы разделить все точки $ X $ на подмножества.

Таким образом, задача поиска похожих текстов — это задача группировки $ X $ точек, задача сортировки текстов по темам сводится к задаче ранжирования $ X $ точек$.

Формально говоря, нам нужно построить отображение $ g $ из набора векторных признаков $ X $ в набор меток $ L $. begin {уравнение} g: X rightarrow L end {уравнение}

Поэтому наша задача по составлению текста делится на два основных этапа.

  1. пространство элементов здания (извлечение элементов)
  2. разделить функциональное пространство на части
Источники

  • https://shwanoff.ru/nlp/
  • https://natasha.github.io/
  • [http://mechanoid.su/ml-text-proc.html]
  • [https://coderlessons.com/tutorials/akademicheskii/obrabotka-estestvennogo-iazyka/obrabotka-estestvennogo-iazyka-python]
  • [https://egorovegor.ru/textblob-python-nlp/]
  • [https://proglib.io/p/fun-nlp]
  • [https://pythonist.ru/8-luchshih-bibliotek-obrabotki-estestvennogo-yazyka-dlya-python-nlp/]
  • [https://dvsemenov.ru/predvaritelnaya-obrabotka-tekstovyx-dannyx-v-python-dlya-nlp/]
  • [https://pythobyte.com/natural-language-processing-tasks-14e01bb6/]

Оцените статью
Блог о Python