Стемминг и лемматизация в Python НЛТК с примерами

⚡ Умное резюме

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

  • ???? Стебель: Инструмент PorterStemmer отсекает суффиксы, чтобы получить корень, который может и не являться настоящим словом.
  • 📚 Лемматизация: Функция WordNetLemmatizer возвращает базовую форму словаря, называемую леммой.
  • Разница: Стемминг быстрее, лемматизация медленнее, но точнее и учитывает контекст.
  • 🔤 Нормализация: Оба метода уменьшают плотность слов, так что машины рассматривают варианты как один признак.
  • 🏷️ POS-теги: Передача тега части речи значительно повышает точность лемматизатора.
  • 🤖 Преимущества ИИ: Более чистый и нормализованный текст позволяет создавать более эффективные модели и признаки для машинного обучения.

Стемминг и лемматизация в Python НЛТК

Что такое стемминг и лемматизация в Python НЛТК?

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

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

Морфологический это метод нормализации слов в Обработка естественного языкаЭто метод, при котором набор слов в предложении преобразуется в последовательность для сокращения поиска. В этом методе слова, имеющие одинаковое значение, но с некоторыми вариациями в зависимости от контекста или предложения, нормализуются. Другими словами, существует одно корневое слово, но много вариантов этого слова. Например, корневое слово — «eat», а его варианты — «eats, eating, eaten и так далее». Аналогичным образом, с помощью стемминга в PythonТаким образом, мы можем найти корневое слово для любого варианта.

Например:

He was riding.
He was taking the ride.

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

Давайте реализуем это с помощью Python Программа. В NLTK есть алгоритм под названием ПортерЭтот алгоритм принимает список токенизированных слов и преобразует их в корневые слова.

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

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

Выход:

wait
wait
wait
wait

Code Объяснение:

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

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

from nltk.stem import PorterStemmer
from nltk.tokenize import sent_tokenize, word_tokenize
sentence="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)

Выход:

hello
guru99
,
you
have
build
a
veri
good
site
and
I
love
visit
your
site

Code Объяснение:

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

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

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

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

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

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

Code различать лемматизацию и стемминг

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

import nltk
from nltk.stem.porter import PorterStemmer
porter_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 studi
Stemming for studying is studi
Stemming for cries is cri
Stemming for cry is cri

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

import nltk
	from nltk.stem import 	WordNetLemmatizer
	wordnet_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 study
Lemma for studying is studying
Lemma for cries is cry
Lemma for cry is cry

Обсуждение результатов

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

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

Лемматизатор минимизирует неоднозначность текста. Слова типа bicycle или bicycles преобразуются в базовое слово bicycle. Он преобразует все слова с одинаковым значением, но разным представлением, в их базовую форму, уменьшая плотность слов и сложность.ping Подготовьте точные признаки для обучения машины. Чем чище данные, тем точнее будет ваша модель машинного обучения. Лемматизатор NLTK также экономит память и вычислительные ресурсы.

Пример в реальном времени, демонстрирующий использование лемматизации WordNet и разметки частей речи. Python:

from nltk.corpus import wordnet as wn
	from nltk.stem.wordnet import WordNetLemmatizer
	from nltk import word_tokenize, pos_tag
	from collections import defaultdict
	tag_map = defaultdict(lambda : wn.NOUN)
	tag_map['J'] = wn.ADJ
	tag_map['V'] = wn.VERB
	tag_map['R'] = wn.ADV
	text = "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)

Выход:

guru99 => guru99
is => be
totally => totally
new => new
kind => kind
of => of
learning => learn
experience => experience
. => .

Code Объяснение:

  • Импортируется программа для чтения корпусов WordNet, а из WordNet импортируется WordNetLemmatizer.
  • Функции токенизации слов и тегирования частей речи импортируются из библиотеки nltk, а словарь по умолчанию — из коллекции.
  • Создается словарь, где первая буква pos_tag является ключом, сопоставленным со значением из словаря WordNet.
  • Текст написан и разложен на токены, а затем создан объект lemma_function для использования внутри цикла.
  • Цикл выполняется, и функция lemmatize принимает два аргумента: токен и карту.ping значением pos_tag со значением wordnet.

Python Лемматизация тесно связана с Словарь WordNetПоэтому крайне важно изучить эту тему далее.

Часто задаваемые вопросы (FAQ)

Стеммер Портера — это класс PorterStemmer из библиотеки NLTK. Он применяет суффиксную очистку.ping Правила взяты из алгоритма Мартина Портера 1980 года, позволяющего сводить английские слова к их основе, поэтому слова «waiting», «waited» и «waits» превращаются в «wait».

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

Нормализация текста преобразует различные формы слова в одно общее представление. Стемминг и лемматизация — это две техники нормализации, которые уменьшают плотность слов, так что модель рассматривает варианты, такие как «study» и «studies», как единый признак.

NLTK предоставляет PorterStemmer (и другие стеммеры, такие как Snowball) для стемминга, а также WordNetLemmatizer для лемматизации. Лемматизатор использует словарь WordNet для возврата правильной базовой формы каждого слова.

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

Современные модели ИИ автоматически определяют контекст, но WordNetLemmatizer от NLTK нуждается в теге части речи для разрешения неоднозначности. Предоставление этого тега позволяет ему выбрать правильную лемму, например, превратить «learning» в «learn», если оно помечено как глагол.

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

Нет. Стемминг удаляет только суффиксы, поэтому «studies» становится «studi», а «cries» становится «cri», что не является допустимыми словами. Лемматизация, напротив, всегда возвращает настоящее словарное слово, например, «study».

Подведем итог этой публикации следующим образом: