Лематизація з Використанням POS-Тегування
Англійська мова містить багато слів, які можуть виконувати декілька частин мови з різними значеннями. Наприклад, "running" може бути дієсловом ("He is running.") або іменником ("Running is fun.").
Як ми вже бачили, лематизатор може точно звести слово до його базової форми лише тоді, коли йому відома частина мови слова в даному контексті. POS-тегування надає цей контекст, роблячи лематизацію більш точною.
Лематизація з POS-тегуванням у NLTK
Оскільки ми вже знайомі з обома цими техніками окремо, настав час їх поєднати. Однак існує один важливий аспект, який слід врахувати, а саме різниця у форматі POS-тегів між pos_tag та форматом, який очікує WordNet Lemmatizer.
Функція 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-тегування:
123456789101112131415161718192021222324252627282930313233from 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))
Як ви можете бачити, спочатку ми виконали POS-тегування за допомогою функції pos_tag(), далі використали list comprehension для створення списку лематизованих токенів, застосовуючи метод lemmatize() з поточним токеном і правильно відформатованим тегом (за допомогою нашої функції get_wordnet_pos(tag)) як аргументами. Ми навмисно не видаляли стоп-слова, щоб продемонструвати, що код ефективно обробляє всі токени.
Дякуємо за ваш відгук!
Запитати АІ
Запитати АІ
Запитайте про що завгодно або спробуйте одне із запропонованих запитань, щоб почати наш чат
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
Лематизація з Використанням POS-Тегування
Свайпніть щоб показати меню
Англійська мова містить багато слів, які можуть виконувати декілька частин мови з різними значеннями. Наприклад, "running" може бути дієсловом ("He is running.") або іменником ("Running is fun.").
Як ми вже бачили, лематизатор може точно звести слово до його базової форми лише тоді, коли йому відома частина мови слова в даному контексті. POS-тегування надає цей контекст, роблячи лематизацію більш точною.
Лематизація з POS-тегуванням у NLTK
Оскільки ми вже знайомі з обома цими техніками окремо, настав час їх поєднати. Однак існує один важливий аспект, який слід врахувати, а саме різниця у форматі POS-тегів між pos_tag та форматом, який очікує WordNet Lemmatizer.
Функція 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-тегування:
123456789101112131415161718192021222324252627282930313233from 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))
Як ви можете бачити, спочатку ми виконали POS-тегування за допомогою функції pos_tag(), далі використали list comprehension для створення списку лематизованих токенів, застосовуючи метод lemmatize() з поточним токеном і правильно відформатованим тегом (за допомогою нашої функції get_wordnet_pos(tag)) як аргументами. Ми навмисно не видаляли стоп-слова, щоб продемонструвати, що код ефективно обробляє всі токени.
Дякуємо за ваш відгук!