Стемминг и лемматизация с Python NLTK

Содержание:

Anonim

Что такое стемминг?

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

Другими словами, есть одно корневое слово, но есть много вариантов одних и тех же слов. Например, корень слова - «есть», а его варианты - «есть, есть, есть и так далее». Таким же образом с помощью Stemming мы можем найти корневое слово любых вариаций.

Например

He was riding.He was taking the ride.

В двух приведенных выше предложениях значение одно и то же, т. Е. Верховая езда в прошлом. Человек может легко понять, что оба значения одинаковы. Но для машин оба предложения разные. Таким образом, стало трудно преобразовать его в одну и ту же строку данных. Если мы не предоставим тот же набор данных, машина не сможет предсказать. Поэтому необходимо различать значение каждого слова, чтобы подготовить набор данных для машинного обучения. И здесь стемминг используется для категоризации одного и того же типа данных по его корневому слову.

Давайте реализуем это с помощью программы Python. У NLTK есть алгоритм, названный «PorterStemmer». Этот алгоритм принимает список токенизированных слов и преобразует его в корневое слово.

Программа для понимания стемминга

from nltk.stem import PorterStemmere_words= ["wait", "waiting", "waited", "waits"]ps =PorterStemmer()for w in e_words:rootWord=ps.stem(w)print(rootWord)

Выход :

waitwaitwaitwait

Пояснение к коду:

  • В NLTk есть модуль основы, который импортируется. Если вы импортируете весь модуль, программа станет тяжелой, поскольку она содержит тысячи строк кода. Итак, из всего модуля основы мы импортировали только «PorterStemmer».
  • Мы подготовили фиктивный список вариационных данных одного и того же слова.
  • Создается объект, принадлежащий к классу nltk.stem.porter.PorterStemmer.
  • Далее мы передали их в PorterStemmer один за другим, используя цикл for. Наконец, мы получили выходное корневое слово каждого слова, упомянутого в списке.

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

Теперь мы передаем полное предложение и проверяем его поведение на выходе.

Программа:

from nltk.stem import PorterStemmerfrom nltk.tokenize import sent_tokenize, word_tokenizesentence="Hello Guru99, You have to build a very good site and I love visiting your site."words = word_tokenize(sentence)ps = PorterStemmer()for w in words:rootWord=ps.stem(w)print(rootWord)

Выход:

helloguru99,youhavebuildaverigoodsiteandIlovevisityoursite

Код Пояснение

  • Пакет PorterStemer импортируется из основы модуля
  • Импортируются пакеты для токенизации предложения и слов.
  • Написано предложение, которое будет токенизироваться на следующем шаге.
  • На этом этапе выполняется токенизация Word.
  • Здесь создается объект для PorterStemmer.
  • Цикл запускается, и определение основы каждого слова выполняется с использованием объекта, созданного в строке кода 5.

Вывод:

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

Что такое лемматизация?

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

Почему лемматизация лучше стемминга?

Алгоритм стемминга работает путем отсечения суффикса от слова. В более широком смысле обрезает либо начало, либо конец слова.

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

Код для различения лемматизации и стемминга

Код стемминга

import nltkfrom nltk.stem.porter import PorterStemmerporter_stemmer = PorterStemmer()text = "studies studying cries cry"tokenization = nltk.word_tokenize(text)for w in tokenization:print("Stemming for {} is {}".format(w,porter_stemmer.stem(w)))

Выход:

Stemming for studies is studiStemming for studying is studiStemming for cries is criStemming for cry is cri

Код лемматизации

import nltkfrom nltk.stem import WordNetLemmatizerwordnet_lemmatizer = WordNetLemmatizer()text = "studies studying cries cry"tokenization = nltk.word_tokenize(text)for w in tokenization:print("Lemma for {} is {}".format(w, wordnet_lemmatizer.lemmatize(w)))

Выход:

Lemma for studies is studyLemma for studying is studyingLemma for cries is cryLemma for cry is cry

Обсуждение вывода:

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

Пример использования лемматизатора:

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

Пример в реальном времени, показывающий использование лемматизации Wordnet и тегов POS в Python

from nltk.corpus import wordnet as wnfrom nltk.stem.wordnet import WordNetLemmatizerfrom nltk import word_tokenize, pos_tagfrom collections import defaultdicttag_map = defaultdict(lambda : wn.NOUN)tag_map['J'] = wn.ADJtag_map['V'] = wn.VERBtag_map['R'] = wn.ADVtext = "guru99 is a totally new kind of learning experience."tokens = word_tokenize(text)lemma_function = WordNetLemmatizer()for token, tag in pos_tag(tokens):lemma = lemma_function.lemmatize(token, tag_map[tag[0]])print(token, "=>", lemma)

Код Пояснение

  • Во-первых, импортируется wordnet для чтения корпуса.
  • WordNetLemmatizer импортируется из wordnet
  • Токенизация слова, а также части тега речи импортируются из nltk
  • Словарь по умолчанию импортируется из коллекций
  • Создается словарь, в котором pos_tag (первая буква) - это ключевые значения, значения которых сопоставляются со значением из словаря wordnet. Мы взяли единственную первую букву, поскольку будем использовать ее позже в цикле.
  • Текст пишется и маркируется.
  • Создается объект lemma_function, который будет использоваться внутри цикла
  • Цикл запускается, и lemmatize примет два аргумента: один - токен, а другой - отображение pos_tag со значением wordnet.

Выход:

guru99 => guru99is => betotally => totallynew => newkind => kindof => oflearning => learnexperience => experience. => .

Лемматизация имеет тесную связь со словарем wordnet, поэтому очень важно изучить эту тему, поэтому мы сохраняем ее в качестве следующей темы.