Витвір і лематизація в Python NLTK з прикладами

⚡ Розумний підсумок

Стемінг та лематизація – це методи нормалізації тексту в Python NLTK, які зводять варіанти слів до спільної основи, де стемінг швидко обрізає суфікси без контексту, а лематизація повертає справжнє словникове слово, використовуючи його значення.

  • ???? Породження: Стемер Портера обрізає суфікси, щоб дістатися до кореня, який може не бути справжнім словом.
  • 📚 Лематизація: WordNetLemmatizer повертає базову форму словника, яка називається лемою.
  • 🇧🇷 Різниця: Стемінг швидший, лематизація повільніша, але точніша та контекстно-залежна.
  • 🔤 Нормалізація: Обидва зменшують щільність слів, тому машини обробляють варіанти як одну ознаку.
  • 🏷️ Теги POS: Передача тегу частини мови робить лематизатор набагато точнішим.
  • 🤖 Перевага ШІ: Чистіший нормалізований текст створює кращі функції та моделі машинного навчання.

Витвір і лематизація в Python НЛТК

Що таке стемінг і лемматизація Python NLTK?

Стеммінг і лемматизація in Python NLTK – це методи нормалізації тексту для обробки природної мови. Ці методи широко використовуються для попередньої обробки тексту. Різниця між стеммінгом та лематизацією полягає в тому, що стеммінгом можна скористатися швидше, оскільки він скорочує слова без знання контексту, тоді як лематизація – повільніше, оскільки вона знає контекст слів до обробки.

Що таке Стемінг?

Стерління це метод нормалізації слів у Обробка природних мовЦе техніка, за якої набір слів у реченні перетворюється на послідовність для скорочення пошуку. У цьому методі слова, які мають однакове значення, але деякі варіації залежно від контексту або речення, нормалізуються. Іншими словами, є одне кореневе слово, але існує багато варіантів одного й того ж слова. Наприклад, кореневе слово — «їсти», а його варіанти — «їсть, їсти, з'їдений тощо». Так само, за допомогою стемінгу в 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. Тому, коли нам потрібно створити набір функцій для навчання машини, було б чудово, якби перевага була надаватися лематизації.

Випадок використання Lemmatizer

Лематизатор мінімізує неоднозначність тексту. Слова на кшталт bicycle або bicycles перетворюються на базове слово bicycle. Він перетворює всі слова з однаковим значенням, але різним представленням, на їхню базову форму, зменшуючи щільність слів та допомогу.ping підготувати точні функції для навчання машини. Чим чистіші дані, тим точнішою буде ваша модель машинного навчання. Лематизатор NLTK також економить пам'ять та обчислювальні витрати.

Приклад у реальному часі, що демонструє використання лематизації 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)

вихід:

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

Code Пояснення:

  • Імпортовано зчитувач корпусу Wordnet, а WordNetLemmatizer імпортовано з Wordnet.
  • Токенізація слів та тег частин мови імпортуються з nltk, а словник за замовчуванням — з колекцій.
  • Створюється словник, де перша літера pos_tag є ключем, що відповідає значенню зі словника Wordnet.
  • Текст записується та токенізується, а об'єкт lemma_function створюється для використання всередині циклу.
  • Цикл виконується, і lemmatize приймає два аргументи: токен та мапу.ping з pos_tag зі значенням wordnet.

Python Лематизація має тісний зв'язок з Словник WordNet, тому важливо вивчити цю тему далі.

Поширені запитання

Стемер Портера – це клас 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».

Підсумуйте цей пост за допомогою: