POS маркиране с NLTK и Chunking в NLP [ПРИМЕРИ]

⚡ Умно обобщение

POS Tagging присвоява част на речта на всяка дума в изречението, докато Chunking групира тези маркирани думи в смислени фрази, като например съществителни фрази, добавяйки плитка структура, която NLTK изгражда с регулярни изрази в Python.

  • ???? ️ Маркиране на ПОС: Всяка дума получава граматически токен като NN, VB или JJ от контекста си.
  • ???? Накъсване: Маркираните думи се групират във фрази, процес, наричан още плитък парсинг.
  • 🔤 Workflow: Първо токенизирайте текста, след това приложете pos_tag и накрая го анализирайте с граматика на RegexpParser.
  • 📊 Броене на етикети: Counter и FreqDist разкриват честотите на тагове и думи за инженерство на характеристики.
  • 🔗 Колокации: Биграмите и триграмите улавят двойки и тройки думи за по-силни текстови характеристики.
  • 🤖 Използване на изкуствен интелект: Машинното обучение и HMM-базираните маркери обработват двусмислените думи вероятностно.

POS маркиране с NLTK и Chunking в NLP

POS маркиране

POS маркиране (Тагиране на части на речта) е процес за маркиране на думи в текстов формат за определена част на речта въз основа на нейното определение и контекст. Той е отговорен за четенето на текст на даден език и присвояването на специфичен токен (части на речта) на всяка дума. Нарича се още граматическо маркиране.

Нека се поучим с пример за част от речта на NLTK:

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

Стъпки, включени в примера за маркиране на ПОС

  • Токенизиране на текст (word_tokenize)
  • Приложете pos_tag към горната стъпка, т.е. nltk.pos_tag(tokenize_text)

Примери за NLTK POS етикети са изброени по-долу:

съкращението Значение
CC координираща връзка
CD кардинална цифра
DT определител
EX екзистенциален там
FW чужда дума
IN предлог/подчинителен съюз
JJ прилагателно
JJR прилагателно, сравнително
JJS прилагателно, превъзходна степен
LS списък на пазара
MD модален
NN съществително, единствено число
NNS съществително множествено число
NNP собствено съществително, единствено число
NNPS собствено съществително, множествено число
PDT предопределител
POS притежателно окончание
PRP лично местоимение
PRP$ притежателно местоимение
RB наречие
RBR разширение наречие, сравнително
RBS наречие, превъзходна степен
RP частица
ДА безкраен маркер
UH междуметие
VB глагол
GBV глагол герундий
VBD глагол минало време
VBN глагол минало причастие
VBP глагол, сегашно време, не 3-то лице, единствено число
VBZ глагол, сегашно време с 3-то лице единствено число
wdt wh-определител
WP wh-местоимение
WRB какво наречие

Горният списък с NLTK POS тагове съдържа всички NLTK POS тагове. NLTK POS тагерът се използва за присвояване на граматическа информация на всяка дума от изречението. Инсталирането, импортирането и изтеглянето на всички пакети на POS NLTK вече е завършено.

Какво е Chunking в НЛП?

трясък В НЛП е процес на групиране на малки части информация в големи единици. Основното приложение на разделянето на части е създаването на групи от „съществителни фрази“. Използва се за добавяне на структура към изречението чрез следване на POS етикетиране, комбинирано с регулярни изрази. Получената група от думи се нарича „парчета“. Нарича се още плитък парсинг.

При плиткия парсинг има максимум едно ниво между корените и листата, докато дълбокият парсинг обхваща повече от едно ниво. Плиткият парсинг се нарича още лек парсинг или разделяне на фрагменти.

Правила за нарязване

Няма предварително дефинирани правила, но можете да ги комбинирате според нуждите и изискванията. Например, да предположим, че трябва да маркирате съществително име, глагол (минало време), прилагателно име и съчинителен съюз от изречението. Можете да използвате правилото по-долу:

chunk:{***?}

Следната таблица показва какво означават различните символи:

Име на символа Descriptйон
. Всеки знак с изключение на нов ред
* Свържете 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

Съществителна фраза Chunking Graph

Графика за разделяне на съществителна фраза

От графиката можем да заключим, че „learn“ и „guru99“ са две различни лексеми, но са категоризирани като съществителна фраза, докато лексемата „from“ не принадлежи към съществителна фраза. Разделянето на фрагменти се използва за категоризиране на различни лексеми в един и същ фрагмент. Резултатът ще зависи от избраната граматика. Освен това, разделянето на фрагменти в NLTK се използва за маркиране на модели и за изследване на текстови корпуси.

Броене на ПОС етикети

Обсъждали сме различни 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 от модула collections. 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 Toolкомплект, който съдържа подмодули като токенизиране на изречения и токенизиране на думи).
  2. Текст, чиито етикети трябва да бъдат отпечатани.
  3. Токенизация на изреченията.
  4. Реализиран е цикъл for, при който думите от изречението се токенизират и тагът на всяка дума се отпечатва като изход.

В корпуса има два вида POS етикетиращи устройства:

1. POS Tagger, базиран на правила: За думи с двусмислено значение се прилага подход, базиран на правила, базиран на контекстуална информация. Той се извършва чрез анализ на значението на предходната или следващата дума. Следователно думите се маркират според граматическите правила на даден език, като например главни букви и пунктуация. Например, тагерът на Брил.

2. Стохастичен POS Tagger: При този метод се прилагат подходи като честота или вероятност. Ако дадена дума е предимно маркирана с определен етикет в обучаващия набор, ѝ се дава този етикет в тестваното изречение. Етикетът на думата зависи не само от собствения си етикет, но и от предишния етикет, така че този метод не винаги е точен.

Маркиране на 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 маркирането обозначава всяка отделна дума с нейната част на речта, като например съществително име или глагол. Chunking отива още една стъпка и групира тези маркирани думи във фрази като съществителни фрази, придавайки на изречението плитка структура.

Плиткият парсинг, наричан още „чункинг“ или „лесен парсинг“, поддържа максимум едно ниво между корените и листата. Той идентифицира границите на фразите, без да изгражда пълно дърво на парсинга, което го прави по-бърз от дълбокия парсинг.

Разделяне на групи с етикети думи във фрази, което позволява на системата да открива обекти като хора, местоположения, дати или продукти. Разпознаването на именувани обекти разчита на тези фрагменти, за да...tracсмислени стойности от суров текст.

Функцията nltk.pos_tag() присвоява тагове за части на речта. Първо токенизирате текста с word_tokenize, след което предавате списъка с токени на pos_tag, който връща всяка дума, сдвоена със съответния таг, като NN, VB или JJ.

Да. Съвременните AI маркери, обучени с машинно обучение и дълбоки невронни мрежи, разрешават двусмислени думи, като изучават контекст от големи корпуси, достигайки по-висока точност от методите, базирани на правила, върху текст от реалния свят.

Стохастичните маркери използват вероятност, получена от данни за обучение. Машинното обучение оценява колко е вероятно всеки маркер да се среща с дадена дума, като се имат предвид околните маркери, след което избира последователността с най-висока обща вероятност.

Освен това NLTK, популярните опции включват просторна за бързи производствени тръбопроводи, Stanford CoreNLP и Hugging Face Transformers за маркиране на базата на трансформатори.

В граматиката на фрагменти, точката съвпада с всеки символ, с изключение на нов ред, звездичката съвпада с нула или повече повторения, а въпросителният знак съвпада с нула или едно повторение на предходния шаблон на POS таг.

Обобщете тази публикация с: