POS маркиране с NLTK и Chunking в NLP [ПРИМЕРИ]
POS маркиране
POS маркиране (Маркетиране на части от речта) е процес за маркиране на думите в текстов формат за определена част от реч въз основа на нейното определение и контекст. Той отговаря за четенето на текст на даден език и присвояването на определена лексема (Части на речта) на всяка дума. Нарича се още граматично маркиране.
Нека научим с пример за част от речта на NLTK:
Вход: Всичко, за да ни позволи.
Изход: [('Всичко', NN),('до', TO), ('разрешително', VB), ('нас', PRP)]
Стъпки, включени в примера за маркиране на POS
- Токенизиране на текст (word_tokenize)
- приложете pos_tag към горната стъпка, която е nltk.pos_tag(tokenize_text)
Примерите за NLTK POS етикети са както следва:
съкращението | Значение |
---|---|
CC | координираща връзка |
CD | кардинална цифра |
DT | определител |
EX | екзистенциален там |
FW | чужда дума |
IN | предлог/подчинителен съюз |
JJ | Този NLTK POS етикет е прилагателно (голям) |
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 | wh- наречие (как) |
Горният списък с NLTK POS тагове съдържа всички NLTK POS тагове. NLTK POS маркерът се използва за присвояване на граматическа информация на всяка дума от изречението. Инсталирането, импортирането и изтеглянето на всички пакети на POS NLTK е завършено.
Какво е Chunking в НЛП?
трясък в НЛП е процес за вземане на малки парчета информация и групирането им в големи единици. Основната употреба на Chunking е създаване на групи от „съществителни фрази“. Използва се за добавяне на структура към изречението чрез следване на POS етикети, комбинирани с регулярни изрази. Получената група от думи се нарича "парчета". Нарича се още плитък анализ.
При плиткия анализ има максимум едно ниво между корените и листата, докато дълбокият анализ включва повече от едно ниво. Плиткото парсиране се нарича още леко парсиране или накъсване.
Правила за нарязване
Няма предварително дефинирани правила, но можете да ги комбинирате според нуждите и изискванията.
Например, трябва да маркирате съществително, глагол (минало време), прилагателно и координиращо съединение от изречението. Можете да използвате правилото по-долу
парче:{ * * * ?}
Следната таблица показва какво означават различните символи:
Име на символа | 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:{<NN.?>*<VBD.?>*<JJ.?>*<CC>?}""" 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: <ChunkRule: '<NN.?>*<VBD.?>*<JJ.?>*<CC>?'> 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: {<DT>?<JJ>*<NN>}" 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
Крива
От графиката можем да заключим, че „learn“ и „guru99“ са два различни токена, но са категоризирани като съществителна фраза, докато токенът „от“ не принадлежи към съществителна фраза.
Разкъсването се използва за категоризиране на различни токени в едно и също парче. Резултатът ще зависи от граматиката, която е избрана. Допълнително разцепване NLTK се използва за маркиране на модели и за изследване на текстови корпуси.
БРОЯНЕ НА POS ЕТИКЕТИ
Обсъждали сме различни pos_tag в предишния раздел. В този конкретен урок ще научите как да броите тези тагове. Етикетите за преброяване са от решаващо значение за класификацията на текста, както и за подготовката на характеристиките за операции, базирани на естествен език. Ще обсъдя с вас подхода, който guru99 следваше, докато подготвяше код, заедно с обсъждане на изхода. Надявам се това да ви помогне.
Как да броим етикети:
Тук първо ще напишем работещ код и след това ще напишем различни стъпки, за да обясним кода.
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)
Изход:
Брояч({'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})
Разработване на кода
- За да преброите етикетите, можете да използвате пакета Counter от модула на колекцията. Броячът е речников подклас, който работи на принципа на операцията ключ-стойност. Това е неподредена колекция, където елементите се съхраняват като речников ключ, докато броят е тяхната стойност.
- Импортирайте nltk, който съдържа модули за токенизиране на текста.
- Напишете текста, чийто pos_tag искате да преброите.
- Някои думи са с главни букви, а други с малки, така че е подходящо да трансформирате всички думи с малки букви, преди да приложите токенизация.
- Прекарайте думите през word_tokenize от nltk.
- Изчислете pos_tag на всеки токен
Output = [('guru99', 'NN'), ('is', 'VBZ'), ('one', 'CD'), ('of', 'IN'), ('the', 'DT'), ('best', 'JJS'), ('site', 'NN'), ('to', 'TO'), ('learn', 'VB'), ('web', 'NN'), (',', ','), ('sap', 'NN'), (',', ','), ('ethical', 'JJ'), ('hacking', 'NN'), ('and', 'CC'), ('much', 'RB'), ('more', 'JJR'), ('online', 'JJ')]
- Сега идва ролята на брояча на речника. Импортирахме в кодовия ред 1. Думите са ключът, а етикетите са стойността и броячът ще отчита общия брой на всеки етикет, присъстващ в текста.
Честотно разпределение
Честотното разпределение се нарича броят пъти, в които се появява резултат от даден експеримент. Използва се за намиране на честотата на всяка дума, срещаща се в документ. То използва FreqDistclass и дефиниран от nltk.вероятността модул.
Честотното разпределение обикновено се създава чрез преброяване на пробите от многократно провеждане на експеримента. Броят на преброяванията се увеличава с единица всеки път. напр
freq_dist = FreqDist()
за токена в документа:
freq_dist.inc(token.type())
За всяка дума можем да проверим колко пъти се е появила в определен документ. напр
- Метод на преброяване: freq_dist.count('and') Този израз връща стойността на броя пъти, когато се е появило 'и'. Нарича се метод на преброяване.
- Честотен метод: 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()
Обяснение на кода:
- Импортиране на модул nltk.
- Напишете текста, чието разпределение на думите трябва да намерите.
- Маркирайте всяка дума в текста, който се служи като вход към модула FreqDist на nltk.
- Приложете всяка дума към nlk.FreqDist под формата на списък
- Нанесете думите в графиката с помощта на plot()
Моля, визуализирайте графиката, за да разберете по-добре написания текст
ЗАБЕЛЕЖКА: Трябва да имате инсталиран matplotlib, за да видите горната графика
Наблюдавайте графиката по-горе. Това съответства на преброяването на всяка дума в текста. Помага при изучаването на текст и по-нататък при прилагането на базиран на текст сантиментален анализ. Накратко, може да се заключи, че nltk има модул за отчитане на появата на всяка дума в текста, който помага при изготвянето на статистиката за характеристиките на естествения език. Той играе важна роля при намирането на ключовите думи в текста. Можете също така да извлечете текста от pdf, като използвате библиотеки като екстракт, PyPDF2 и подадете текста към nlk.FreqDist.
Ключовият термин е „токенизиране“. След токенизиране, той проверява за всяка дума в даден параграф или текстов документ, за да определи колко пъти се е появила. За това не се нуждаете от инструментариума NLTK. Можете също да го направите със собствените си умения за програмиране на Python. NLTK инструментариумът предоставя само готов за използване код за различните операции.
Преброяването на всяка дума може да не е много полезно. Вместо това човек трябва да се съсредоточи върху колокацията и биграмите, които се занимават с много думи в двойка. Тези двойки идентифицират полезни ключови думи за по-добри характеристики на естествения език, които могат да бъдат подавани към машината. Моля, погледнете по-долу за техните подробности.
Колокации: биграми и триграми
Какво е Collocations?
Колокациите са двойки думи, които се срещат заедно много пъти в документ. Изчислява се от броя на тези двойки, които се срещат заедно към общия брой думи в документа.
Помислете за електромагнитен спектър с думи като ултравиолетови лъчи, инфрачервени лъчи.
Думите ултравиолетови и лъчи не се използват отделно и следователно могат да се третират като колокация. Друг пример е компютърната томография. Ние не казваме CT и Scan поотделно и следователно те също се третират като колокация.
Можем да кажем, че намирането на колокации изисква изчисляване на честотите на думите и тяхното появяване в контекста на други думи. Тези специфични колекции от думи изискват филтриране, за да запазят термини с полезно съдържание. След това всеки грам от думи може да бъде оценен според някаква асоциативна мярка, за да се определи относителната вероятност всеки Ingram да бъде колокация.
Колокацията може да бъде категоризирана в два вида-
- Биграми cкомбинация от две думи
- Триграмикомбинация от три думи
Биграмите и триграмите предоставят по-смислени и полезни функции за етапа на извличане на характеристики. Те са особено полезни при базиран на текст сантиментален анализ.
Примерен код на Bigrams
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', '.')]
Примерен код за триграми
Понякога става важно да видите двойка от три думи в изречението за статистически анализ и преброяване на честотата. Това отново играе решаваща роля при формирането НЛП (характеристики за обработка на естествен език), както и базирано на текст сантиментално предсказване.
Същият код се изпълнява за изчисляване на триграмите.
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 етикети е сложен процес. По този начин общото маркиране на 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)))
Изход:
[('Здравей', 'NNP'), ('Guru99', 'NNP'), (',', ','), ('Вие', 'PRP'), ('имате', 'VBP') , ('build', 'VBN'), ('a', 'DT'), ('very', 'RB'), ('good', 'JJ'), ('site', 'NN') , ('и', 'CC'), ('аз', 'PRP'), ('любов', 'VBP'), ('посещение', 'VBG'), ('ваш', 'PRP$' ), ('сайт', 'NN'), ('.', '.')]
Обяснение на кода:
- Код за импортиране на nltk (Набор от инструменти за естествен език, който съдържа подмодули като токенизиране на изречения и токенизиране на думи.)
- Текст, чиито етикети трябва да бъдат отпечатани.
- Токенизация на изречение
- Реализира се цикъл for, където думите се токенизират от изречението и етикетът на всяка дума се отпечатва като изход.
В Corpus има два вида POS маркери:
- Базиран на правила
- Стохастични POS маркери
1. Базиран на правила POS маркер: За думите с двусмислено значение се прилага подход, основан на правила, базиран на контекстуална информация. Това става чрез проверка или анализ на значението на предходната или следващата дума. Информацията се анализира от обкръжението на думата или вътре в нея. Следователно думите се маркират според граматическите правила на конкретен език, като главни букви и пунктуация. напр. тагер на Brill.
2. Стохастичен POS маркер: При този метод се прилагат различни подходи като честота или вероятност. Ако една дума е маркирана най-вече с конкретен етикет в набора за обучение, тогава в тестовото изречение й се дава този конкретен етикет. Етикетът на думата зависи не само от собствения си таг, но и от предишния таг. Този метод не винаги е точен. Друг начин е да се изчисли вероятността за поява на конкретен таг в изречение. По този начин крайният таг се изчислява чрез проверка на най-голямата вероятност за дадена дума с определен таг.
POS маркиране със скрит модел на Марков
Проблемите с маркирането могат също да бъдат моделирани с помощта на HMM. Той третира входните токени като наблюдаема последователност, докато етикетите се считат за скрити състояния и целта е да се определи последователността на скритите състояния. например х = х1,x2,…………,xn където x е последователност от токени, докато y = y1,y2,y3,y4………гnе скритата последователност.
Как работи скрития модел на Марков (HMM)?
HMM използва разпределение на присъединяване, което е P(x, y), където x е входната последователност/токен последователност, а y е последователност от маркери.
Последователността на етикети за x ще бъде argmaxy1….ynp(x1,x2,….xn,y1,y2,y3,…..). Имаме категоризирани тагове от текста, но статистиката на такива тагове е жизненоважна. Така че следващата част е преброяването на тези маркери за статистическо изследване.
Oбобщение
- POS маркиране в NLTK е процес за маркиране на думите в текстов формат за определена част от реч въз основа на нейното определение и контекст.
- Някои примери за маркиране на NLTK POS са: CC, CD, EX, JJ, MD, NNP, PDT, PRP$, TO и др.
- POS тагерът се използва за присвояване на граматична информация на всяка дума от изречението. Инсталирането, импортирането и изтеглянето на всички пакети за маркиране на част от речта с NLTK е завършено.
- Разкъсването в НЛП е процес за вземане на малки парчета информация и групирането им в големи единици.
- Няма предварително дефинирани правила, но можете да ги комбинирате според нуждите и изискванията.
- Разкъсването се използва за откриване на обекти. Субектът е тази част от изречението, чрез която машината получава стойността за всяко намерение.
- Разкъсването се използва за категоризиране на различни токени в едно и също парче.