Notice: This page requires JavaScript to function properly.
Please enable JavaScript in your browser settings or update your browser.
Вивчайте Лематизація з Використанням POS-Тегування | Стемінг і лематизація
Вступ до NLP

bookЛематизація з Використанням POS-Тегування

Англійська мова містить багато слів, які можуть виконувати декілька частин мови з різними значеннями. Наприклад, "running" може бути дієсловом ("He is running.") або іменником ("Running is fun.").

Як ми вже бачили, лематизатор може точно звести слово до його базової форми лише тоді, коли йому відома частина мови слова в даному контексті. POS-тегування надає цей контекст, роблячи лематизацію більш точною.

Лематизація з POS-тегуванням у NLTK

Оскільки ми вже знайомі з обома цими техніками окремо, настав час їх поєднати. Однак існує один важливий аспект, який слід врахувати, а саме різниця у форматі POS-тегів між pos_tag та форматом, який очікує WordNet Lemmatizer.

Note
Дізнайтеся більше

Функція NLTK pos_tag використовує набір тегів Penn Treebank, який містить широкий спектр тегів для детальної граматичної категоризації. WordNet Lemmatizer, натомість, очікує POS-теги у спрощеному вигляді, що відповідає категоріям WordNet. Зокрема, він розрізняє лише іменники ('n'), дієслова ('v'), прикметники ('a' або 's' для сателітних прикметників) та прислівники ('r').

Процес зіставлення полягає у перетворенні детальних тегів Penn Treebank на ширші категорії, які розпізнає WordNet. Наприклад, як 'VBD' (дієслово у минулому часі), так і 'VBG' (герундій або дієприкметник теперішнього часу) з Penn Treebank змінюються на 'v' (дієслово) при використанні у WordNet Lemmatizer.

Напишемо функцію для цієї мети:

from nltk.corpus import wordnet as wn


def get_wordnet_pos(treebank_tag):
    if treebank_tag.startswith('J'):
        return wn.ADJ
    elif treebank_tag.startswith('V'):
        return wn.VERB
    elif treebank_tag.startswith('R'):
        return wn.ADV
    else:
        # Default to noun if no match is found or starts with 'N'
        return wn.NOUN  

Ця функція просто перевіряє першу літеру тега Penn Treebank: якщо це 'J', повертає тег WordNet для прикметників; якщо 'V' — для дієслів; якщо 'R' — для прислівників. В усіх інших випадках, включаючи ті, коли тег починається з 'N' або не відповідає жодній із зазначених умов, функція повертає тег WordNet для іменників.

Константи ADJ, VERB та інші, які ви бачите у коді, взяті з WordNet. Їхні значення: ADJ = 'a', ADJ_SAT = 's', ADV = 'r', NOUN = 'n', VERB = 'v'.

За допомогою цієї функції виконаємо лематизацію з урахуванням POS-тегування:

123456789101112131415161718192021222324252627282930313233
from nltk.stem import WordNetLemmatizer from nltk.tokenize import word_tokenize from nltk import pos_tag from nltk.corpus import wordnet as wn import nltk nltk.download('wordnet') nltk.download('averaged_perceptron_tagger_eng') nltk.download('punkt_tab') # Initialize the lemmatizer lemmatizer = WordNetLemmatizer() # Function to map NLTK's POS tags to the format used by the WordNet lemmatizer def get_wordnet_pos(treebank_tag): if treebank_tag.startswith('J'): return wn.ADJ elif treebank_tag.startswith('V'): return wn.VERB elif treebank_tag.startswith('R'): return wn.ADV else: # Default to noun if no match is found or starts with 'N' return wn.NOUN text = "The leaves on the tree were turning a bright red, indicating that fall was leaving its mark." text = text.lower() tokens = word_tokenize(text) tagged_tokens = pos_tag(tokens) # Lemmatize each token with its POS tag lemmatized_tokens = [lemmatizer.lemmatize(token, get_wordnet_pos(tag)) for token, tag in tagged_tokens] print("Original text:", text) print("Lemmatized text:", ' '.join(lemmatized_tokens))
copy

Як ви можете бачити, спочатку ми виконали POS-тегування за допомогою функції pos_tag(), далі використали list comprehension для створення списку лематизованих токенів, застосовуючи метод lemmatize() з поточним токеном і правильно відформатованим тегом (за допомогою нашої функції get_wordnet_pos(tag)) як аргументами. Ми навмисно не видаляли стоп-слова, щоб продемонструвати, що код ефективно обробляє всі токени.

question mark

Чому функція get_wordnet_pos є необхідною під час лематизації з WordNetLemmatizer бібліотеки NLTK після POS-тегування?

Select the correct answer

Все було зрозуміло?

Як ми можемо покращити це?

Дякуємо за ваш відгук!

Секція 2. Розділ 7

Запитати АІ

expand

Запитати АІ

ChatGPT

Запитайте про що завгодно або спробуйте одне із запропонованих запитань, щоб почати наш чат

Suggested prompts:

Can you explain why mapping POS tags is necessary for lemmatization?

What would happen if we didn't provide the correct POS tag to the lemmatizer?

Can you show more examples of lemmatization with different sentences?

Awesome!

Completion rate improved to 3.45

bookЛематизація з Використанням POS-Тегування

Свайпніть щоб показати меню

Англійська мова містить багато слів, які можуть виконувати декілька частин мови з різними значеннями. Наприклад, "running" може бути дієсловом ("He is running.") або іменником ("Running is fun.").

Як ми вже бачили, лематизатор може точно звести слово до його базової форми лише тоді, коли йому відома частина мови слова в даному контексті. POS-тегування надає цей контекст, роблячи лематизацію більш точною.

Лематизація з POS-тегуванням у NLTK

Оскільки ми вже знайомі з обома цими техніками окремо, настав час їх поєднати. Однак існує один важливий аспект, який слід врахувати, а саме різниця у форматі POS-тегів між pos_tag та форматом, який очікує WordNet Lemmatizer.

Note
Дізнайтеся більше

Функція NLTK pos_tag використовує набір тегів Penn Treebank, який містить широкий спектр тегів для детальної граматичної категоризації. WordNet Lemmatizer, натомість, очікує POS-теги у спрощеному вигляді, що відповідає категоріям WordNet. Зокрема, він розрізняє лише іменники ('n'), дієслова ('v'), прикметники ('a' або 's' для сателітних прикметників) та прислівники ('r').

Процес зіставлення полягає у перетворенні детальних тегів Penn Treebank на ширші категорії, які розпізнає WordNet. Наприклад, як 'VBD' (дієслово у минулому часі), так і 'VBG' (герундій або дієприкметник теперішнього часу) з Penn Treebank змінюються на 'v' (дієслово) при використанні у WordNet Lemmatizer.

Напишемо функцію для цієї мети:

from nltk.corpus import wordnet as wn


def get_wordnet_pos(treebank_tag):
    if treebank_tag.startswith('J'):
        return wn.ADJ
    elif treebank_tag.startswith('V'):
        return wn.VERB
    elif treebank_tag.startswith('R'):
        return wn.ADV
    else:
        # Default to noun if no match is found or starts with 'N'
        return wn.NOUN  

Ця функція просто перевіряє першу літеру тега Penn Treebank: якщо це 'J', повертає тег WordNet для прикметників; якщо 'V' — для дієслів; якщо 'R' — для прислівників. В усіх інших випадках, включаючи ті, коли тег починається з 'N' або не відповідає жодній із зазначених умов, функція повертає тег WordNet для іменників.

Константи ADJ, VERB та інші, які ви бачите у коді, взяті з WordNet. Їхні значення: ADJ = 'a', ADJ_SAT = 's', ADV = 'r', NOUN = 'n', VERB = 'v'.

За допомогою цієї функції виконаємо лематизацію з урахуванням POS-тегування:

123456789101112131415161718192021222324252627282930313233
from nltk.stem import WordNetLemmatizer from nltk.tokenize import word_tokenize from nltk import pos_tag from nltk.corpus import wordnet as wn import nltk nltk.download('wordnet') nltk.download('averaged_perceptron_tagger_eng') nltk.download('punkt_tab') # Initialize the lemmatizer lemmatizer = WordNetLemmatizer() # Function to map NLTK's POS tags to the format used by the WordNet lemmatizer def get_wordnet_pos(treebank_tag): if treebank_tag.startswith('J'): return wn.ADJ elif treebank_tag.startswith('V'): return wn.VERB elif treebank_tag.startswith('R'): return wn.ADV else: # Default to noun if no match is found or starts with 'N' return wn.NOUN text = "The leaves on the tree were turning a bright red, indicating that fall was leaving its mark." text = text.lower() tokens = word_tokenize(text) tagged_tokens = pos_tag(tokens) # Lemmatize each token with its POS tag lemmatized_tokens = [lemmatizer.lemmatize(token, get_wordnet_pos(tag)) for token, tag in tagged_tokens] print("Original text:", text) print("Lemmatized text:", ' '.join(lemmatized_tokens))
copy

Як ви можете бачити, спочатку ми виконали POS-тегування за допомогою функції pos_tag(), далі використали list comprehension для створення списку лематизованих токенів, застосовуючи метод lemmatize() з поточним токеном і правильно відформатованим тегом (за допомогою нашої функції get_wordnet_pos(tag)) як аргументами. Ми навмисно не видаляли стоп-слова, щоб продемонструвати, що код ефективно обробляє всі токени.

question mark

Чому функція get_wordnet_pos є необхідною під час лематизації з WordNetLemmatizer бібліотеки NLTK після POS-тегування?

Select the correct answer

Все було зрозуміло?

Як ми можемо покращити це?

Дякуємо за ваш відгук!

Секція 2. Розділ 7
some-alt