POS тегування за допомогою NLTK і Chunking у NLP [ПРИКЛАДИ]

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

POS-тегування призначає частину мови кожному слову в реченні, тоді як Chunking групує ці позначені тегами слова у змістовні фрази, такі як іменникові фрази, додаючи поверхневу структуру, яку NLTK будує за допомогою регулярних виразів у Python.

  • 🏷️ Маркування POS-терміналів: Кожне слово отримує граматичну лексему, таку як NN, VB або JJ, з контексту.
  • ???? Чанкінг: Позначені тегами слова групуються у фрази, цей процес також називається поверхневим розбором.
  • 🔤 Процедура: Спочатку токенізуйте текст, потім застосуйте pos_tag, а потім проаналізуйте за допомогою граматики RegexpParser.
  • 📊 Підрахунок тегів: Counter та FreqDist показують частоти тегів та слів для розробки ознак.
  • 🔗 Сполучення: Біграми та триграми фіксують пари слів та трійки для кращої видимості тексту.
  • 🤖 Використання ШІ: Машинне навчання та тегери на основі HMM обробляють неоднозначні слова ймовірнісно.

Маркування POS за допомогою NLTK та фрагментування в NLP

POS тегування

POS тегування (Тегування частин мови) – це процес розмітки слів у текстовому форматі для певної частини мови на основі її визначення та контексту. Він відповідає за читання тексту мовою та присвоєння певного токена (частин мови) кожному слову. Його також називають граматичним тегуванням.

Давайте навчимося на прикладі частини мови NLTK:

Input: Everything to permit us.
Output: [('Everything', NN),('to', TO), ('permit', VB), ('us', PRP)]

Кроки, що входять до прикладу маркування POS-терміналу

  • Токенізувати текст (word_tokenize)
  • Застосуйте pos_tag до вищевказаного кроку, тобто nltk.pos_tag(tokenize_text)

Приклади тегів POS NLTK наведено нижче:

Скорочення Сенс
CC координаційна спілка
CD кардинальна цифра
DT визначити
EX екзистенціальний там
FW іноземне слово
IN прийменниковий/підрядний сполучник
JJ прикметник
JJR прикметник, порівняльний
JJS прикметник, найвищий ступінь
LS список ринку
MD модальний
NN іменник, однина
NNS іменник множина
НПП власна назва, однина
NNPS власна назва, множина
PDT зумовлювач
POS присвійне закінчення
PRP особовий займенник
PRP$ присвійний займенник
RB прислівник
Розширення RBR прислівник, порівняльний стан
RBS прислівник, найвищий ступінь
RP частинка
TO нескінченний маркер
UH втручання
VB дієслово
ГЗН дієслово герундій
VBD дієслово минулого часу
ВБН дієприкметник минулого часу
VBP дієслово, теперішній час не 3-ї особи однини
VBZ дієслово теперішнього часу з 3-ю особою однини
вага wh-визначник
WP займенник wh
WRB що-прислівник

Наведений вище список тегів NLTK POS містить усі теги NLTK POS. Тегер NLTK POS використовується для призначення граматичної інформації кожному слову речення. Встановлення, імпорт та завантаження всіх пакетів POS NLTK завершено.

Що таке Чанкінг в НЛП?

Чунчінг У НЛП це процес групування невеликих фрагментів інформації у великі одиниці. Основне застосування фрагментації (chunking) — це створення груп «іменникових фраз». Вона використовується для додавання структури до речення шляхом використання тегів POS у поєднанні з регулярними виразами. Отримана група слів називається «фрагментами». Її також називають поверхневим розбором.

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

Правила чанкінгу

Немає попередньо визначених правил, але ви можете комбінувати їх відповідно до потреб та вимог. Наприклад, припустимо, що вам потрібно виділити іменник, дієслово (минулий час), прикметник та сурядний сполучник з речення. Ви можете скористатися наведеним нижче правилом:

chunk:{***?}

У наступній таблиці показано значення різних символів:

Назва символу Опис
. Будь-який символ, крім нового рядка
* Зіставте 0 або більше повторень
? Зіставте 0 або 1 повторення

Тепер давайте напишемо код, щоб краще зрозуміти правило.

from nltk import pos_tag
from nltk import RegexpParser
text ="learn php from guru99 and make study easy".split()
print("After Split:",text)
tokens_tag = pos_tag(text)
print("After Token:",tokens_tag)
patterns= """mychunk:{***?}"""
chunker = RegexpParser(patterns)
print("After Regex:",chunker)
output = chunker.parse(tokens_tag)
print("After Chunking",output)

вихід:

After Split: ['learn', 'php', 'from', 'guru99', 'and', 'make', 'study', 'easy']
After Token: [('learn', 'JJ'), ('php', 'NN'), ('from', 'IN'), ('guru99', 'NN'), ('and', 'CC'), ('make', 'VB'), ('study', 'NN'), ('easy', 'JJ')]
After Regex: chunk.RegexpParser with 1 stages:
RegexpChunkParser with 1 rules:
       '***?'>
After Chunking (S
  (mychunk learn/JJ)
  (mychunk php/NN)
  from/IN
  (mychunk guru99/NN and/CC)
  make/VB
  (mychunk study/NN easy/JJ))

Висновок із наведеного вище позначення частини мови Python Наприклад, дієслово «make» не входить до правила, тому воно не позначене тегом mychunk.

Випадок використання фрагментації

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

Example:
Temperature of New York.
Here Temperature is the intention and New York is an entity.

Іншими словами, фрагментація використовується для вибору підмножин токенів. Будь ласка, виконайте наведений нижче код, щоб зрозуміти, як фрагментація використовується для вибору токенів. У цьому прикладі ви побачите графік, який відповідає фрагменту іменникової фрази.

 import nltk
text = "learn php from guru99"
tokens = nltk.word_tokenize(text)
print(tokens)
tag = nltk.pos_tag(tokens)
print(tag)
grammar = "NP: {
?*}" cp =nltk.RegexpParser(grammar) result = cp.parse(tag) print(result) result.draw() # It will draw the pattern graphically which can be seen in Noun Phrase chunking

вихід:

['learn', 'php', 'from', 'guru99']  -- These are the tokens
[('learn', 'JJ'), ('php', 'NN'), ('from', 'IN'), ('guru99', 'NN')]   -- These are the pos_tag
(S (NP learn/JJ php/NN) from/IN (NP guru99/NN))        -- Noun Phrase Chunking

Іменник Phrase Chunking Graph

Іменник Phrase chunking Graph

З графіка можна зробити висновок, що «learn» та «guru99» – це дві різні лексеми, але вони класифікуються як іменникова фраза, тоді як лексема «from» не належить до іменникової фрази. Розбиття на фрагменти використовується для категоризації різних токенів в один фрагмент. Результат залежатиме від вибраної граматики. Крім того, розбиття на фрагменти в NLTK використовується для позначення шаблонів та дослідження текстових корпусів.

Підрахунок POS-міток

Ми обговорювали різне pos_tag значення раніше. Тут ви дізнаєтесь, як підраховувати ці теги. Підрахунок тегів має вирішальне значення для класифікації тексту та підготовки функцій для операцій з природною мовою. Спочатку ми пишемо робочий код, а потім пояснюємо кроки.

from collections import Counter
import nltk
text = "Guru99 is one of the best sites to learn WEB, SAP, Ethical Hacking and much more online."
lower_case = text.lower()
tokens = nltk.word_tokenize(lower_case)
tags = nltk.pos_tag(tokens)
counts = Counter( tag for word,  tag in tags)
print(counts)

вихід:

Counter({'NN': 5, ',': 2, 'TO': 1, 'CC': 1, 'VBZ': 1, 'NNS': 1, 'CD': 1, '.': 1, 'DT': 1, 'JJS': 1, 'JJ': 1, 'JJR': 1, 'IN': 1, 'VB': 1, 'RB': 1})

Розробка коду:

  1. Використайте пакет Counter з модуля колекцій. Counter — це підклас словника, який зберігає елементи як ключі, а їх кількість — як значення.
  2. Імпортуйте nltk для токенізації тексту.
  3. Напишіть текст, чий pos_tag ви хочете підрахувати.
  4. Перетворіть усі слова на малі регістри перед токенізацією.
  5. Пропустіть слова через word_tokenize та обчисліть pos_tag кожного токена.
  6. Потім Counter підраховує загальну кількість зустрічань кожного тегу в тексті.

Розподіл частоти

Розподіл частот стосується кількості разів, коли виникає результат експерименту. Він використовується для визначення частоти кожного слова, що зустрічається в документі. Він використовує FreqDist клас, визначений nltk.ймовірність модуль. Кількість збільшується на одиницю кожного разу, коли відбувається вибірка.

Для будь-якого слова ми можемо перевірити, скільки разів воно зустрічалося в документі. Наприклад:

  • Метод підрахунку: freq_dist.count('і') повертає кількість разів, коли виникла фраза 'і'. Це називається методом count.
  • Частотний метод: freq_dist.freq('і') повертає частоту заданого семплу.

Ми напишемо невелику програму, яка обчислює розподіл частот кожного слова в тексті.

import nltk
a = "Guru99 is the site where you can find the best tutorials for Software Testing     Tutorial, SAP Course for Beginners. Java Tutorial for Beginners and much more. Please     visit the site guru99.com and much more."
words = nltk.tokenize.word_tokenize(a)
fd = nltk.FreqDist(words)
fd.plot()

Пояснення коду:

  1. Імпортуйте модуль nltk.
  2. Запишіть текст, розподіл слів якого потрібно знайти.
  3. Токенізувати кожне слово в тексті, який подається як вхідні дані для модуля FreqDist класу nltk.
  4. Застосуйте кожне слово до nltk.FreqDist у формі списку.
  5. Побудуйте слова на графіку за допомогою функції plot().

ПРИМІТКА: для перегляду графіка необхідно встановити matplotlib. Він підраховує кількість зустрічань кожного слова в тексті та допомагає в аналізі настроїв на основі тексту. Ключовим терміном є «токенізація»: після токенізації кожне слово перевіряється, щоб визначити, скільки разів воно зустрічалося.

Сполучення: біграми та триграми

Колокації – це пари слів, які зустрічаються разом багато разів у документі. Вони розраховуються як відношення кількості цих пар, що зустрічаються разом, до загальної кількості слів у документі.

Розглянемо такі слова, як ультрафіолетові промені та інфрачервоні промені. Слова «ультрафіолетові» та «промені» не використовуються окремо, тому їх можна розглядати як словосполучення. Іншим прикладом є комп'ютерна томографія (КТ), оскільки ми не використовуємо слова КТ та сканування окремо. Словосполучення можна розділити на два типи:

  • Біграми: поєднання двох слів
  • Триграми: поєднання трьох слів

Біграми та триграми забезпечують більш змістовні та корисні функції для позначення, наприклад,tracетапі. Вони особливо корисні для аналізу настроїв на основі тексту.

Приклад біграмів Code:

import nltk
text = "Guru99 is a totally new kind of learning experience."
Tokens = nltk.word_tokenize(text)
output = list(nltk.bigrams(Tokens))
print(output)

вихід:

[('Guru99', 'is'), ('is', 'totally'), ('totally', 'new'), ('new', 'kind'), ('kind', 'of'), ('of', 'learning'), ('learning', 'experience'), ('experience', '.')]

Приклад триграм Code:

Іноді для статистичного аналізу та підрахунку частот стає важливо побачити пару з трьох слів у реченні. Це знову відіграє вирішальну роль у формуванні НЛП (обробка природної мови), а також прогнозування настроїв на основі тексту. Той самий код виконується для обчислення триграм.

import nltk
text = "Guru99 is a totally new kind of learning experience."
Tokens = nltk.word_tokenize(text)
output = list(nltk.trigrams(Tokens))
print(output)

вихід:

[('Guru99', 'is', 'totally'), ('is', 'totally', 'new'), ('totally', 'new', 'kind'), ('new', 'kind', 'of'), ('kind', 'of', 'learning'), ('of', 'learning', 'experience'), ('learning', 'experience', '.')]

Позначення речень

Позначення речення тегами означає додавання таких міток, як дієслово чи іменник, на основі контексту речення. Визначення тегів POS є складним процесом, тому загальне позначення тегами вручну неможливе, оскільки деякі слова мають неоднозначне значення залежно від структури речення. Перетворення тексту на список є важливим кроком перед позначенням тегами, оскільки кожне слово зациклюється та підраховується для певного тегу.

import nltk
text = "Hello Guru99, You have to build a very good site, and I love visiting your site."
sentence = nltk.sent_tokenize(text)
for sent in sentence:
	 print(nltk.pos_tag(nltk.word_tokenize(sent)))

Code Пояснення:

  1. Code імпортувати nltk (природний Language Toolkit, який містить такі підмодулі, як токенізація речень та токенізація слів).
  2. Текст, теги якого потрібно надрукувати.
  3. Токенізація речень.
  4. Реалізовано цикл for, у якому слова з речення виділяються за допомогою токенізацій, а тег кожного слова виводиться як вихідний код.

У корпусі існує два типи POS-теггерів:

1. Теґер POS на основі правил: Для слів з неоднозначним значенням застосовується підхід на основі правил, що базується на контекстуальній інформації. Це робиться шляхом аналізу значення попереднього або наступного слова. Таким чином, слова позначаються граматичними правилами певної мови, такими як вживання великих літер та пунктуація. Наприклад, теґер Брілла.

2. Стохастичний POS-теггер: У цьому методі застосовуються такі підходи, як частота або ймовірність. Якщо слово здебільшого позначено певним тегом у навчальному наборі, йому надається цей тег у тестовому реченні. Тег слова залежить не лише від власного тегу, а й від попереднього тегу, тому цей метод не завжди точний.

Маркування POS за допомогою прихованої моделі Маркова

Проблеми тегування також можна моделювати за допомогою прихованої марковської моделі (HMM). Вона розглядає вхідні токени як спостережувану послідовність, тоді як теги вважаються прихованими станами, і метою є визначення послідовності прихованих станів. Наприклад, x = x1,x2,…,xn, де x – послідовність токенів, а y = y1,y2,y3,y4…yn – прихована послідовність.

Як працює прихована модель Маркова (HMM)?

HMM використовує спільний розподіл P(x, y), де x – це вхідна послідовність токенів, а y – послідовність тегів. Послідовність тегів для x буде argmax над y1…yn для p(x1,x2,…xn,y1,y2,y3,…). Ми класифікували теги з тексту, але статистика таких тегів є життєво важливою, тому наступна частина – підрахунок цих тегів для статистичного дослідження.

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

Теґування POS позначає кожне окреме слово відповідною частиною мови, такою як іменник чи дієслово. Поділ на фрагменти йде ще далі та групує ці позначені тегами слова у фрази, подібні до іменникових фраз, надаючи реченню поверхневу структуру.

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

Розбиття груп слів, позначених тегами, на фрази, що дозволяє системі виявляти такі сутності, як люди, місця розташування, дати або продукти. Розпізнавання іменованих сутностей спирається на ці фрагменти дляtracзначущі значення з необробленого тексту.

Функція nltk.pos_tag() призначає теги частин мови. Спочатку ви токенізуєте текст за допомогою word_tokenize, потім передаєте список токенів до pos_tag, яка повертає кожне слово, пов'язане з його тегом, наприклад, NN, VB або JJ.

Так. Сучасні ШІ-тегери, навчені за допомогою машинного навчання та глибоких нейронних мереж, вирішують неоднозначні слова, вивчаючи контекст з великих корпусів, досягаючи вищої точності, ніж методи, засновані на правилах, для реального тексту.

Стохастичні теґери використовують ймовірність, отриману з навчальних даних. Машинне навчання оцінює ймовірність кожного тегу для слова, враховуючи навколишні теги, а потім вибирає послідовність з найвищою загальною ймовірністю.

Крім НЛТК, популярні варіанти включають просторий для швидкісних виробничих конвеєрів, Stanford CoreNLP та Hugging Face Transformers для маркування на основі трансформаторів.

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

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