Стемминг и лемматизация в Python НЛТК с примерами
Что такое стемминг и лемматизация в Python НЛТК?
Стемминг и лемматизация in Python NLTK — это методы нормализации текста для обработки естественного языка. Эти методы широко используются для предварительной обработки текста. Разница между стеммингом и лемматизацией заключается в том, что стемминг быстрее, поскольку он обрезает слова без знания контекста, в то время как лемматизация медленнее, поскольку она знает контекст слов до обработки.
Что такое Стемминг?
Морфологический это метод нормализации слов в Обработка естественного языка. Это метод, при котором набор слов в предложении преобразуется в последовательность, чтобы сократить поиск. В этом методе нормализуются слова, имеющие одинаковое значение, но имеющие некоторые вариации в зависимости от контекста или предложения.
Другими словами, корень одного слова, но существует множество вариаций одного и того же слова. Например, корневое слово — «есть», а его варианты — «ест, ест, ест и тому подобное». Таким же образом с помощью Стемминга в Python, мы можем найти корень слова в любых вариациях.
Например
He was riding. He was taking the ride.
В двух приведенных выше предложениях смысл один и тот же: верховая езда в прошлом. Человек легко может понять, что оба значения одинаковы. Но для машин оба предложения разные. Таким образом, стало сложно преобразовать его в ту же строку данных. Если мы не предоставим тот же набор данных, машина не сможет предсказать. Поэтому необходимо дифференцировать значение каждого слова, чтобы подготовить набор данных для машинного обучения. И здесь стемминг используется для категоризации одного и того же типа данных путем получения его корневого слова.
Давайте реализуем это с помощью Python program.NLTK имеет алгоритм под названием «PorterStemmer». Этот алгоритм принимает список токенизированных слов и объединяет его в корневое слово.
Программа для понимания стемминга
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
Пояснение к коду:
- В NLTk есть модуль 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
Пояснение к коду:
- Пакет PorterStemer импортируется из основы модуля.
- Импортируются пакеты для токенизации предложений, а также слов.
- Написано предложение, которое должно быть токенизировано на следующем этапе.
- На этом этапе реализуется токенизация слов, связанная с лемматизацией.
- Здесь создается объект для PorterStemmer.
- Запускается цикл, и каждое слово выполняется с использованием объекта, созданного в строке кода 5.
Вывод:
Stemming — это модуль предварительной обработки данных. В английском языке существует множество вариантов одного и того же слова. Эти различия создают неоднозначность в обучении и прогнозировании машинного обучения. Чтобы создать успешную модель, крайне важно фильтровать такие слова и преобразовывать их в однотипные секвенированные данные с помощью стемминга. Кроме того, это важный метод получения данных строк из набора предложений и удаления избыточных данных, также известный как нормализация.
Что такое лемматизация?
лемматизации в НЛТК — это алгоритмический процесс нахождения леммы слова в зависимости от его значения и контекста. Лемматизация обычно относится к морфологическому анализу слов, целью которого является удаление флективных окончаний. Это помогает вернуть базовую или словарную форму слова, известного как лемма.
Метод лемматизации NLTK основан на встроенной функции морфинга WorldNet. Предварительная обработка текста включает в себя как стемминг, так и лемматизацию. Многие люди находят эти два термина запутанными. Некоторые считают это одним и тем же, но есть разница между стеммингом и лемматизацией. Лемматизация предпочтительнее первой по следующей причине.
Почему лемматизация лучше стемминга?
Алгоритм стемминга работает путем вырезания суффикса из слова. В более широком смысле обрезает либо начало, либо конец слова.
Напротив, лемматизация — более мощная операция, учитывающая морфологический анализ слов. Он возвращает лемму, которая является базовой формой всех ее флективных форм. Для создания словарей и поиска правильной формы слова необходимы глубокие лингвистические знания. Стемминг — это общая операция, а лемматизация — интеллектуальная операция, при которой правильная форма будет искаться в словаре. Следовательно, лемматизация помогает лучше формировать обучение с помощью машины особенности.
Код, позволяющий различать лемматизацию и стемминг
Код стемминга:
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
Код лемматизации:
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
Обсуждение результатов
Если вы посмотрите на учебу и учебу, результат будет одинаковым (изучение), но лемматизатор NLTK предоставляет разные леммы как для токенов «учеба для учебы», так и для «учеба для учебы». Поэтому, когда нам нужно создать набор функций для обучения машины, было бы здорово, если бы предпочтительна лемматизация.
Вариант использования лемматизатора
Лемматизатор минимизирует двусмысленность текста. Примеры таких слов, как велосипед или велосипеды, преобразуются в базовое слово велосипед. По сути, он преобразует все слова, имеющие одинаковое значение, но разное представление, в их базовую форму. Это уменьшает плотность слов в данном тексте и помогает подготовить точные характеристики для обучающей машины. Чем чище данные, тем умнее и точнее будет ваша модель машинного обучения. NLTK Lemmatizer также сэкономит память и вычислительные затраты.
Пример в реальном времени, демонстрирующий использование лемматизации Wordnet и маркировки POS в 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)
Код Пояснение
- Во-первых, импортируется Wordnet для чтения корпуса.
- WordNetLemmatizer импортируется из wordnet.
- Токенизация слова, а также части речевого тега импортируются из nltk.
- Словарь по умолчанию импортируется из коллекций.
- Создается словарь, где pos_tag (первая буква) — это значения ключей, значения которых сопоставляются со значением из словаря Wordnet. Мы взяли единственную первую букву, поскольку будем использовать ее позже в цикле.
- Текст записывается и токенизируется.
- Создается объект lemma_function, который будет использоваться внутри цикла.
- Запускается цикл, и lemmatize принимает два аргумента: один — токен, а другой — сопоставление pos_tag со значением wordnet.
Результат:
guru99 => guru99 is => be totally => totally new => new kind => kind of => of learning => learn experience => experience . => .
Python Лемматизация имеет тесную связь с словарь WordNet, поэтому очень важно изучить эту тему, поэтому мы оставим ее следующей темой.