Поиск по базе сайта:
Методичні вказівки до лабораторної роботи №10 з дисципліни «Комп’ютерна лінгвістика» для магістрів за фахом 02030303 «Прикладна лінгвістика» icon

Методичні вказівки до лабораторної роботи №10 з дисципліни «Комп’ютерна лінгвістика» для магістрів за фахом 02030303 «Прикладна лінгвістика»




Скачати 317.29 Kb.
НазваМетодичні вказівки до лабораторної роботи №10 з дисципліни «Комп’ютерна лінгвістика» для магістрів за фахом 02030303 «Прикладна лінгвістика»
Дата конвертації06.01.2013
Розмір317.29 Kb.
ТипМетодичні вказівки


МІНІСТЕРСТВО ОСВІТИ І НАУКИ, МОЛОДІ ТА СПОРТУ УКРАЇНИ

НУ «ЛЬВІВСЬКА ПОЛІТЕХНІКА»

іНСТИТУТ КОМП’ютерних НАУК та ІНФОРМАЦІЙНИХ ТЕХНОЛОГІЙ


Кафедра систем автоматизованого проектування





ВИВЧЕННЯ БІБЛІОТЕКИ ПРИКЛАДНИХ ПРОГРАМ NLTK, ДЛЯ ОПРАЦЮВАННЯ ТЕКСТІВ ПРИРОДНОЮ МОВОЮ.

АВТОМАТИЧНИЙ МОРФОЛОГІЧНИЙ АНАЛІЗ (частина2).


Методичні вказівки до лабораторної роботи № 10

з дисципліни «Комп’ютерна лінгвістика»

для магістрів за фахом 8. 02030303 «Прикладна лінгвістика»
денної та заочної форм навчання


Затверджено на засіданні кафедри

«Системи автоматизованого проектування»

Протокол № 16 від 17.05.2011 р.


Затверджено на засіданні методичної ради ІКНІ

Протокол № 9-10/11 від 18.05.2011 р.


Зареєстровано в НМУ НУ «ЛП»

№ 3515 від 2.06.2011


Львів-2011

ВИВЧЕННЯ БІБЛІОТЕКИ ПРИКЛАДНИХ ПРОГРАМ NLTK, ДЛЯ ОПРАЦЮ­ВАННЯ ТЕКСТІВ ПРИРОДНОЮ МОВОЮ. АВТОМАТИЧНИЙ МОРФОЛОГІЧНИЙ АНАЛІЗ (частина2). Методичні вказівки до лабораторної роботи № 10 з дисципліни «Комп’ютерна лінгвістика» для магістрів за фахом 8.02030303 «Прикладна лінгвістика» денної та заочної форм навчання/Укл. А.Б.Романюк, І.Ю Юрчак. - Львів: Національний університет «Львівська політехніка», 2011. – 16 с.



Укладачі:

Романюк А. Б., канд. техн. наук, доцент

Юрчак І.Ю., канд. техн. наук, доцент



Відповідальна за випуск:

Юрчак І.Ю., канд. техн. наук, доцент



Рецензент:

Теслюк В.М., д.т.н., професор кафедри САПР



^ МЕТА РОБОТА


  • Вивчення основ програмування на мові Python.

  • Ознайомлення з автоматичним морфологічним аналізом в NLTK.


КОРОТКІ ТЕОРЕТИЧНІ ВІДОМОСТІ


1. Вступ.
^

1.   Розробка автоматичного морфологічного аналізатора


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

 

>>> from nltk.corpus import brown

>>> brown_tagged_sents = brown.tagged_sents(categories='news')

>>> brown_sents = brown.sents(categories='news')



^

Автоматичний морфологічний аналізатор по замовчуванню


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

 

>>> tags = [tag for (word, tag) in brown.tagged_words(categories='news')]

>>> nltk.FreqDist(tags).max()

'NN'




Тепер можна створити аналізатор default_tagger , який позначить всі слова як NN.

 

>>> raw = 'I do not like green eggs and ham, I do not like them Sam I am!'

>>> tokens = nltk.word_tokenize(raw)

>>> default_tagger = nltk.DefaultTagger('NN')

>>> default_tagger.tag(tokens)

[('I', 'NN'), ('do', 'NN'), ('not', 'NN'), ('like', 'NN'), ('green', 'NN'), ('eggs', 'NN'), ('and', 'NN'), ('ham', 'NN'), (',', 'NN'), ('I', 'NN'), ('do', 'NN'), ('not', 'NN'), ('like', 'NN'), ('them', 'NN'), ('Sam', 'NN'), ('I', 'NN'), ('am', 'NN'), ('!', 'NN')]




Зауважимо, що аналізатор це генератор тегів слів. Роздрукувати його безпосередньо не можна, але можна перетворити у список і тоді роздрукувати, як показано у попередньому прикладі. Генератор ми можемо використати тільки один раз, але якщо результати його роботи зберегти у списку то їх можна використовувати і в подальшому.

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

 

>>> default_tagger.evaluate(brown_tagged_sents)

0.13089484257215028





^

Автоматичний морфологічний аналізатор на основі регулярних виразів


Аналізатор побудований на регулярних виразах встановлює відповідність тегів до слів на основі їх відповідності певним шаблонам. Наприклад можна передбачити, що кожне слово, яке закінчується на –ed це є past participle в дієсловах, а будь-яке слово, яке закінчується на ‘s це є присвійний іменник. Подібні правила можна описати, як список регулярних виразів:

 

>>> patterns = [

... (r'.*ing$', 'VBG'), # gerunds

... (r'.*ed$', 'VBD'), # simple past

... (r'.*es$', 'VBZ'), # 3rd singular present

... (r'.*ould$', 'MD'), # modals

... (r'.*\'s$', 'NN$'), # possessive nouns

... (r'.*s$', 'NNS'), # plural nouns

... (r'^-?[0-9]+(.[0-9]+)?$', 'CD'), # cardinal numbers

... (r'.*', 'NN') # nouns (default)

... ]




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

 

>>> regexp_tagger = nltk.RegexpTagger(patterns)

>>> regexp_tagger.tag(brown_sents[3])

[('``', 'NN'), ('Only', 'NN'), ('a', 'NN'), ('relative', 'NN'), ('handful', 'NN'), ('of', 'NN'), ('such', 'NN'), ('reports', 'NNS'), ('was', 'NNS'), ('received', 'VBD'), ("''", 'NN'), (',', 'NN'), ('the', 'NN'), ('jury', 'NN'), ('said', 'NN'), (',', 'NN'), ('``', 'NN'), ('considering', 'VBG'), ('the', 'NN'), ('widespread', 'NN'), ...]

>>> regexp_tagger.evaluate(brown_tagged_sents)

0.20326391789486245




Останній регулярний вираз «.*» вказує на те, що всі слова, які не відповідають попереднім регулярним виразам будуть промарковані, як іменники. Цей регулярний вираз еквівалентний до аналізатора позамовчуванню.
^

The Lookup Tagger Пошуковий морфологічний аналізатор


Слова, які мають високу частоту (часто зустрічаються в текстах), необов’язково мають тег nn. Спробуємо знайти найчастотніші слова та відповідні до них теги. Таку інформацію можна буде в подальшому використати, як модель для пошукового аналізатора "lookup tagger" в NLTK UnigramTagger.

Наступна програма обробляє послідовність речень, підраховує частоту слів і виводить на екран 100 слів, які найчастіше зустрічаються :

 

>>> fd = nltk.FreqDist(brown.words(categories='news'))

>>> most_freq_words = fd.keys()[:100]

>>> most_freq_words

['the', ',', '.', 'of', 'and', 'to', 'a', 'in', 'for', 'The', 'that', '``', 'is', 'was', "''", 'on', 'at', 'with', 'be', 'by', 'as', 'he', 'said', 'his', 'will', 'it', 'from', 'are', ';', 'has', 'an', '--', 'had', 'who', 'have', 'not', 'Mrs.', 'were', 'this', 'would', 'which', 'their', 'been', 'they', 'He', 'one', 'I', 'its', 'but', 'or', 'more', ')', 'Mr.', 'up', '(', 'all', 'last', 'out', 'two', ':', 'other', 'new', 'first', 'year', 'than', 'A', 'about', 'there', 'when', 'home', 'after', 'In', 'also', 'over', 'It', 'into', 'no', 'But', 'made', 'her', 'only', 'years', 'time', 'three', 'them', 'some', 'can', 'New', 'him', 'state', '?', 'any', 'President', 'could', 'before', 'week', 'under', 'against',

'we', 'now']




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


>>> [(w,t) for (w,t) in nltk.corpus.brown.tagged_words(categories='news')

... if w in most_freq_words]

[('The', 'AT'), ('said', 'VBD'), ('an', 'AT'), ('of', 'IN'), ('``', '``'), ('no', 'AT'), ("''", "''"), ('that', 'CS'), ('any', 'DTI'), ('.', '.'), ..., ("''", "''")]


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

 

>>> cfd = nltk.ConditionalFreqDist(brown.tagged_words(categories='news'))

>>> likely_tags = dict((word, cfd[word].max()) for word in most_freq_words)

>>> likely_tags['The']

'AT'




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

 

>>> baseline_tagger = nltk.UnigramTagger(model=likely_tags)

>>> baseline_tagger.evaluate(brown_tagged_sents)

0.45578495136941344




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

 

>>> sent = brown.sents(categories='news')[3]

>>> baseline_tagger.tag(sent)

[('``', '``'), ('Only', None), ('a', 'AT'), ('relative', None), ('handful', None), ('of', 'IN'), ('such', None), ('reports', None), ('was', 'BEDZ'), ('received', None), ("''", "''"), (',', ','), ('the', 'AT'), ('jury', None), ('said', 'VBD'), (',', ','), ('``', '``'), ('considering', None), ('the', 'AT'), ('widespread', None), ('interest', None), ('in', 'IN'), ('the', 'AT'), ('election', None), (',', ','), ('the', 'AT'), ('number', None), ('of', 'IN'), ('voters', None), ('and', 'CC'), ('the', 'AT'), ('size', None), ('of', 'IN'), ('this', 'DT'), ('city', None), ("''", "''"), ('.', '.')]




В результатах роботи аналізатора бачимо, що багатьом словам у відповідність поставлено тег ^ None. Тобто ці слова відсутні у списку найчастотніших і в такому випадку логічно поставити їм у відповідність тег nn. Такий процес називають багатопрохідним аналізом (backoff).

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

 

>>> baseline_tagger = nltk.UnigramTagger(model=likely_tags,

backoff=nltk.DefaultTagger('NN'))

>>> baseline_tagger.evaluate(brown_tagged_sents)

0.58177695566561249




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

 

def performance(cfd, wordlist):

lt = dict((word, cfd[word].max()) for word in wordlist)

baseline_tagger = nltk.UnigramTagger(model=lt, backoff=nltk.DefaultTagger('NN'))

return baseline_tagger.evaluate(brown.tagged_sents(categories='news'))


def display():

import pylab

words_by_freq = list(nltk.FreqDist(brown.words(categories='news')))

cfd = nltk.ConditionalFreqDist(brown.tagged_words(categories='news'))

sizes = 2 ** pylab.arange(15)

perfs = [performance(cfd, words_by_freq[:size]) for size in sizes]

pylab.plot(sizes, perfs, '-bo')

pylab.title('Lookup Tagger Performance with Varying Model Size')

pylab.xlabel('Model Size')

pylab.ylabel('Performance')

pylab.show()




 

>>> display()









Рис. 1.: Продуктивність роботи аналізатора на основі підстановок.


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

2.   Використання N-грамів в автоматичному морфологічному аналізі

Уніграм аналізатор


Уніграм аналізатор (Unigram taggers) реалізовує простий статистичний алгоритм маркування слів. Кожному слову (tokens) ставиться у відповідність тег, який є найбільш імовірний для цього слова. Наприклад, згідно цього алгоритму тег jj буде поставлений у відповідність до кожного слова frequent в тексті, оскільки це слово частіше використовується, як прикметник (a frequent word) і рідко, як дієслово (I frequent this lecture).

Перед використанням уніграм аналізатора для аналізу тексту потрібно провести його тренування (навчання) на розміченому корпусі текстів. Аналізатор використовує корпус для визначення тегів, які властиві кожному слову. В наступному прикладі, здійснюється ініціалізація і тренування аналізатора #1. При створенні (ініціалізації) аналізатора промарковані речення вказуються, як параметр аналізатора, що і забезпечує тренування аналізатора. Процес тренування полягає в перегляді тегів кожного зі слів і збереження найбільш імовірних тегів (тегів, які найчастіше зустрічаються з кожним зі слів) у словнику, який зберігається в аналізаторі. Далі застосовується даний аналізатор для попередньо визначеного тексту і проводиться аналіз точності роботи створеного аналізатора:

 

>>> from nltk.corpus import brown

>>> brown_tagged_sents = brown.tagged_sents(categories='news')

>>> brown_sents = brown.sents(categories='news')

>>> unigram_tagger = nltk.UnigramTagger(brown_tagged_sents) #1

>>> unigram_tagger.tag(brown_sents[2007])

[('Various', 'JJ'), ('of', 'IN'), ('the', 'AT'), ('apartments', 'NNS'),

('are', 'BER'), ('of', 'IN'), ('the', 'AT'), ('terrace', 'NN'), ('type', 'NN'), (',', ','), ('being', 'BEG'), ('on', 'IN'), ('the', 'AT'), ('ground', 'NN'), ('floor', 'NN'), ('so', 'QL'), ('that', 'CS'), ('entrance', 'NN'), ('is', 'BEZ'), ('direct', 'JJ'), ('.', '.')]

>>> unigram_tagger.evaluate(brown_tagged_sents)

0.9349006503968017




Уніграм аналізатор ставить тег None всім словам, які не зустрічаються в текстах на основі яких тренувався аналізатор.
^

Розділення даних для тренування та тестування аналізаторів


Оскільки, для створення аналізатора необхідно здійснювати його тренування на певних даних, то тестувати аналізатор та оцінювати точність його роботи потрібно на інших даних. Для отримання реальної точності роботи аналізатора дані для тренування та тестування не повинні бути одними і тими ж, як в останньому прикладі. Оцінюючи точність аналізатора на даних, які використовувались для його тренування будуть отримані високі результати, які не відповідають дійсності. Пререважно дані діляться у співідношенні 90% для тренування і 10% для тестування:

 

>>> size = int(len(brown_tagged_sents) * 0.9)

>>> size

4160

>>> train_sents = brown_tagged_sents[:size]

>>> test_sents = brown_tagged_sents[size:]

>>> unigram_tagger = nltk.UnigramTagger(train_sents)

>>> unigram_tagger.evaluate(test_sents)

0.81202033290142528




Точність аналізу є нижча, але вона краще характеризує роботу аналізатора при маркуванні довільного тексту.
^

Морфологічний аналіз на основі N-грамів


В одному з попередніх пунктів розглядався уніграм аналізатор, який встановлює тег на основі тотожності цього слова до слова, яке зустрічається в корпусі на якому тренувався аналізатор. В такому випадку, кожне слово розглядається окремо без врахування контексту і наприклад, слово wind буде промарковане однаковим тегом незалежно від контексту чи the wind чи to wind . В цьому пункті розглянемо аналізатор, який використовує відомості про контекст слова при визначенні відповідного тега. N – грам аналізатор це більш загальний випадок уніграм аналізатора, коли для встановлення тега для поточного слова використовуються теги n-1 попередніх слів (рис.2.). Тег, який встановлюється –Tn , а контекст затоновано.



Рис. 2.: Контекстне вікно N – грам аналізатора.


В прикладі, який показаний на рис.2. n=3 , тобто розглядаються теги двох попередніх слів. N- грам аналізатор вибирає тег, який має більшу ймовірність появи в даному контексті.

В NLTK NgramTagger - аналізатор реалізовано, як клас який використовує розмічений корпус для визначення найбільш ймовірного тега (тег, який відповідає частині мови) для кожного з контекстів. Наступний приклад демонструє використання одного з варіантів N-грам аналізатора – Біграм аналізатор. Спочатку проводиться його тренування, а далі створений аналізатор використовується для маркування довільного тексту.

 

>>> bigram_tagger = nltk.BigramTagger(train_sents)

>>> bigram_tagger.tag(brown_sents[2007])

[('Various', 'JJ'), ('of', 'IN'), ('the', 'AT'), ('apartments', 'NNS'),

('are', 'BER'), ('of', 'IN'), ('the', 'AT'), ('terrace', 'NN'),

('type', 'NN'), (',', ','), ('being', 'BEG'), ('on', 'IN'), ('the', 'AT'), ('ground', 'NN'), ('floor', 'NN'), ('so', 'CS'), ('that', 'CS'),

('entrance', 'NN'), ('is', 'BEZ'), ('direct', 'JJ'), ('.', '.')]

>>> unseen_sent = brown_sents[4203]

>>> bigram_tagger.tag(unseen_sent)

[('The', 'AT'), ('population', 'NN'), ('of', 'IN'), ('the', 'AT'), ('Congo', 'NP'), ('is', 'BEZ'), ('13.5', None), ('million', None), (',', None), ('divided', None), ('into', None), ('at', None), ('least', None), ('seven', None), ('major', None), ('``', None), ('culture', None), ('clusters', None), ("''", None), ('and', None), ('innumerable', None), ('tribes', None), ('speaking', None), ('400', None), ('separate', None), ('dialects', None), ('.', None)]




Як і інші аналізатори N-грам аналізатор ставить у відповідність всім словам, які не зустрічались при тренування тег None.

При аналізі речення з даних для тренування аналізатор промаркував кожне зі слів, але при аналізі невідомого тексту більшість слів не промарковано. Як тільки в тексті зустрілося нове слово (наприклад, 13.5), аналізатор не може для нього встановити тег. Так само аналізатор не маркує наступне слово (наприклад, million) навіть , якщо воно зустрічалося при тренувані, оскільки це слово в даних для тренування ніколи не зустрічалося після слова тег якого None . Це приводить до того що і всі наступні слова в реченні не маркуються і точність роботи аналізатора надзвичайно низька:

 

>>> bigram_tagger.evaluate(test_sents)

0.10276088906608193




При збільшенні n кількість окремих контекстних вікон зменшується і вони можуть бути не представлені в даних, на основі яких, проводиться тренування. Такі випадки називають – розрідження даних. N- грам аналізатор не розглядає контекст, який перетинає межі речення. Відповідно, аналізатори в NLTK розробляються для роботи зі послідовностями речень де кожне речення є списком слів. Першому слову речення завжди ставиться у відповідність тег None.
^

Поєднання (комбінування) аналізаторів


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

  1. Визначаємо теги за допомогою біграм аналізатора

  2. Якщо біграм аналізатор не встановив тег для поточного слова – використовується унігам аналізатор.

  3. Якщо уніграм аналізатор не встановив тег для поточного слова – використовується аналізатор по замовчуванню.

Кожен NLTK аналізатор, крім аналізатора по замовчуванню може мати вказівку на використання іншого аналізатора для побудови багатопрохідного аналізатора:

 

>>> t0 = nltk.DefaultTagger('NN')

>>> t1 = nltk.UnigramTagger(train_sents, backoff=t0)

>>> t2 = nltk.BigramTagger(train_sents, backoff=t1)

>>> t2.evaluate(test_sents)

0.84491179108940495





Виконати самостійно. Доповнити попередній приклад аналізатором TrigramTagger

t3 = nltk.TrigramTagger(train_sents, backoff=t2). Та оцінити точність роботи такого аналізатора.

Потрібно зазначити, що backoff аналізатор вказується при ініціалізації аналізатора, що дозволяє використати при тренуванні результати тренування backoff аналізатора. Тому, якщо біграм аналізатор призначив би такий самий тег, як його backoff аналізатор (уніграм) в певному контексті то навчальний зразок не враховується при тренуванн.я Такий підхід дозволяє зберігати біграм модель максимально компактною. Можна вказати, що аналізатор потребує більш ніж один зразок контексту, наприклад запис nltk.BigramTagger(sents, cutoff=2, backoff=t1) відкине контексти , які зустрічаються раз або два.
^

Морфологічний аналіз невідомих слів


Для маркування невідомих слів будуються багатопрохідні аналізатири і невідоме слово маркується за допомогою аналізатора на основі регулярних виразів або аналізатора по замовчуванню. Такий підхід не дозволяє враховувати контекст. Наприклад, якщо слово blog не зустрілося в даних для тренування, то аналізатор промаркує його тим самим тегом незважаючи на те чи це слово в контексті the blog чи to blog. Чи існують кращі способи аналізу невідомих слів, або слів ,які не зустрічаються у словнику?

Один з методів маркування невідомих слів з врахуванням контексту полягає в обмеженні розміру словника аналізатора в межах найуживаніших n слів, і заміні всіх інших слів спеціальним словом UNK (за допомогою способу описаного в попередній лабораторній роботі). При тренуванні уніграм аналізатор звичайно зафіксує що UNK це іменник. Однак, n-грам аналізатори визначать що в інших контекстах це слово має інший тег. Наприклад, якщо попереднє слово - to (промарковане TO), то UNK імовірно буде промарковано як дієслово.
^

Збереження результатів тренування аналізаторів


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

 

>>> from cPickle import dump

>>> output = open('t2.pkl', 'wb')

>>> dump(t2, output, -1)

>>> output.close()




Цей аналізатор можна завантажити використовуючи окремий процес Python.

 

>>> from cPickle import load

>>> input = open('t2.pkl', 'rb')

>>> tagger = load(input)

>>> input.close()




Аналізатор можна далі використати наступним чином.

 

>>> text = """The board's action shows what free enterprise

... is up against in our complex maze of regulatory laws ."""

>>> tokens = text.split()

>>> tagger.tag(tokens)

[('The', 'AT'), ("board's", 'NN$'), ('action', 'NN'), ('shows', 'NNS'),

('what', 'WDT'), ('free', 'JJ'), ('enterprise', 'NN'), ('is', 'BEZ'),

('up', 'RP'), ('against', 'IN'), ('in', 'IN'), ('our', 'PP$'), ('complex', 'JJ'), ('maze', 'NN'), ('of', 'IN'), ('regulatory', 'NN'), ('laws', 'NNS'), ('.', '.')]



^

3.   Transformation-Based Tagging


 Морфологічний аналізатор Брілла (Brill tagger) або TBL (Transfomation-Based Learning) аналізатор розроблений на основі методів машинного навчання. Такий підхід передбачає автоматичнее визначення правил маркування граматичних класів слов на основі попередньр розміченних корпусів і потім застосування цих правил для морфологічного аналузу.

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

Розглянемо морфологічний аналіз згідно запропонованого підходу наступного речення:

(1)




The President said he will ask Congress to increase grants to states for vocational rehabilitation

Рис 3. ілюструє процес аналізу. Спочатку We will examine the operation of two rules: (a) Replace NN with VB when the previous word is TO; (b) Replace TO with IN when the next tag is NNS.

Table 5.6 illustrates this process, first tagging with the unigram tagger, then applying the rules to fix the errors.

Етапи виконання морфологічного аналізу на основі Brill аналізатора.

Phrase

to

increase

grants

to

states

for

vocational

rehabilitation

Unigram

TO

NN

NNS

TO

NNS

IN

JJ

NN

Rule 1

 

VB

 

 

 

 

 

 

Rule 2

 

 

 

IN

 

 

 

 

Output

TO

VB

NNS

IN

NNS

IN

JJ

NN

Gold

TO

VB

NNS

IN

NNS

IN

JJ

NN

In this table we see two rules. All such rules are generated from a template of the following form: "replace T1 with T2 in the context C". Typical contexts are the identity or the tag of the preceding or following word, or the appearance of a specific tag within 2-3 words of the current word. During its training phase, the tagger guesses values for T1, T2 and C, to create thousands of candidate rules. Each rule is scored according to its net benefit: the number of incorrect tags that it corrects, less the number of correct tags it incorrectly modifies.

Наступний приклад демонструє реалізацію Brill аналізатора в NLTK.

 

>>> nltk.tag.brill.demo()

Training Brill tagger on 80 sentences...

^ Finding initial useful rules...

Found 6555 useful rules.


B |

S F r O | Score = Fixed - Broken

c i o t | R Fixed = num tags changed incorrect -> correct

o x k h | u Broken = num tags changed correct -> incorrect

r e e e | l Other = num tags changed incorrect -> incorrect

e d n r | e

------------------+-------------------------------------------------------

12 13 1 4 | NN -> VB if the tag of the preceding word is 'TO'

8 9 1 23 | NN -> VBD if the tag of the following word is 'DT'

8 8 0 9 | NN -> VBD if the tag of the preceding word is 'NNS'

6 9 3 16 | NN -> NNP if the tag of words i-2...i-1 is '-NONE-'

5 8 3 6 | NN -> NNP if the tag of the following word is 'NNP'

5 6 1 0 | NN -> NNP if the text of words i-2...i-1 is 'like'

5 5 0 3 | NN -> VBN if the text of the following word is '*-1'

...

>>> print(open("errors.out").read())

left context | word/test->gold | right context

--------------------------+------------------------+--------------------------

| Then/NN->RB | ,/, in/IN the/DT guests/N

, in/IN the/DT guests/NNS | '/VBD->POS | honor/NN ,/, the/DT speed

'/POS honor/NN ,/, the/DT | speedway/JJ->NN | hauled/VBD out/RP four/CD

NN ,/, the/DT speedway/NN | hauled/NN->VBD | out/RP four/CD drivers/NN

^ DT speedway/NN hauled/VBD | out/NNP->RP | four/CD drivers/NNS ,/, c

dway/NN hauled/VBD out/RP | four/NNP->CD | drivers/NNS ,/, crews/NNS

hauled/VBD out/RP four/CD | drivers/NNP->NNS | ,/, crews/NNS and/CC even

P four/CD drivers/NNS ,/, | crews/NN->NNS | and/CC even/RB the/DT off

^ NNS and/CC even/RB the/DT | official/NNP->JJ | Indianapolis/NNP 500/CD a

| After/VBD->IN | the/DT race/NN ,/, Fortun

ter/IN the/DT race/NN ,/, | Fortune/IN->NNP | 500/CD executives/NNS dro

s/NNS drooled/VBD like/IN | schoolboys/NNP->NNS | over/IN the/DT cars/NNS a

olboys/NNS over/IN the/DT | cars/NN->NNS | and/CC drivers/NNS ./.






^

4.  Категорії слів англійської мови


Іменники англійської мови можуть бути морфологічно складними. Наприклад books і women це множина. Слова з –ness суфіксом - це іменники утворені з прикметників: happiness, illness. Суфікс –ment з’являється в деяких іменниках, які походять від дієслів: government, establishment.

Дієслова англійської мови також можуть бути морфологічно складними. Наприклад теперішній тривалий час в дієсловах характеризується закінченням –ing і описує триваючу незавершену дію (falling, eating). Суфікс –ing також з’являється і у іменників, які походять від дієслів (the falling of the leaves (герундій)). В Броунівському корпусі вони маркуються як VBG. Минулий час в дієсловах часто характеризується закінченням –ed , описує завершену дію і маркується VBD.

Загальні набори тегів часто охоплюють деяку морфологічно-синтаксичну інформацію – це є інформація про види морфологічного маркування, які отримують слова в залежності від їх синтаксичної ролі. Розглянемо, наприклад, вибрані різні граматичні форми слова “go” в наступних реченнях.



Кожна з цих форм go, goes, gone, went – морфологічно відрізняється від інших. Розглянемо форму “goes” (йде). Ця форма не охоплює всі граматичні контексти, але вимагає третю особу однини об’єкту. Таким чином наступні речення є граматично невірними.



Навпаки, gone це є форма минулого часу, яка вживається після have (не може бути змінена на goes в цьому контексті) і не може розглядатися як основне слово клаузи(фрагмент речення).



Можна легко вибрати набір тегів для цих чотирьох різних граматичних форм але і можемо позначити їх, як VB (дієслово). Звичайно це було б адекватно для деяких цілей, Але більш детальний набір тегів забезпечує більше корисної інформації по ці форми, яка може бути значимою для інших процесів визначення синтаксичних шаблонів з послідовності тегів. Набір тегів Броунівського корпусу охоплює ці розбіжності як показано в таблиці 4.

Таблиця 4.



Більшість наборів тегів для маркування частин мови використовує базові категорії такі, як іменник, дієслово. Але набори тегів можуть і відрізнятися в залежності від того як точно поділені слова на категорії і яким чином визначені самі категорії. Наприклад, слово is може бути промарковане, як дієслово в одному наборі тегів, але як форма дієслова be в іншому наборі тегів (так як в Броунівському корпусі). Ці розбіжності (варіації) в наборах тегів є неминучі, так як теги частин мови використовуються різними способами і для різних задач. Іншими словами немає єдиного правильного шляху для встановлення відповідності тегів, тільки є більш чи менш корисні способи в залежності від мети. В додатках наведено частину набору тегів Броунівського корпусу.


^ ПОРЯДОК ВИКОНАННЯ РОБОТИ


  1. Ознайомитися з теоретичними відомостями.

  2. Виконати приклади, які використовуються в теоретичних відомостях (всі програми потрібно починати з виконання оператора import nltk, re, pprint).

  3. Виконати наступні вправи.

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

3.2. Прочитати файл допомого про морфологічний аналізатор на основі афіксів (help(nltk.AffixTagger)). Напишіть програму, яка викликає аналізатор на основі афіксів в циклі, з різними значеннями довжини афіксів і мінімальними довжинами слів. При яких значеннях можна отримати кращі результати.

3.3. Здійсніть тренування біграм аналізатора на частинах корпуса з вправи 3.1 без backoff аналізатора. Перевірте його роботу. Що відбулося з продуктивністю аналізатора? Чому?

3.4. Дослідити наступні проблеми. що виникають при роботі з аналізатором на основі підстановок: що відбудеться з продуктивністю аналізатора, якщо опустити backoff аналізатор (дослідити на частині броунівського корпусу, яка відповідає першій або другій літері прізвища студента); на основі рис.1. та відповідного фрагмента програми встановити точку максимальної продуктивності незважаючи на розмір списку (об’єм оперативної пам’яті) і точку достатньої продуктивності при мінімальному розмірі списку.

3.5. Знайдіть розмічені корпуси текстів для інших мов які вивчаєте або володієте (українська, польська, німецька, російська, італійська, японська). Здійсніть тренування та оцініть продуктивність роботи різних аналізаторів та комбінацій різних аналізаторів. Точність роботи аналізаторів порівняйте з точністю роботи аналізаторів для англійських корпусів. Результати поясніть.

3.6. Створити аналізатор по замовчуванню та набір юніграм і n-грам аналізаторів. Використовуючи backoff здійсніть тренування аналізаторів на частині корпуса з вправи 3.2. Дослідіть три різні комбінації поєднання цих аналізаторів. Перевірте точність роботи аналізаторів. Визначіть комбінацію аналізаторів з максимальною точністю аналізу. Змініть розмір даних на яких проводилось тренування. Повторіть експерименти для змінених даних для тренування. Результати порівняйти і пояснити.

3.7. Прочитати стрічку документування функції demo Brill аналізатора. Здійснити експерименти з різними значення параметрів цієї функції. Встановити який взаємозв’язок є між часом тренування (навчання аналізатора) і точністю його роботи.



  1. Підготувати і оформити звіт.




Варіант

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

Номери завдань

1

1

1

1

1

1

1

1

1

1

1

1

1

1

1

2

2

2

2

2

2

2

2

2

2

2

2

2

2

2

3

3

3

3

3

3

3

3

3

3

3

3

3

3

3

4

4

4

4

4

4

4

4

4

4

4

4

4

4

4

5

5

5

5

5

5

5

5

5

5

5

5

5

5

5

6

6

6

6

6

6

6

6

6

6

6

6

6

6

6

7

7

7

7

7

7

7

7

7

7

7

7

7

7

7






























































































Варіант

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

Номери завдань

1

1

1

1

1

1

1

1

1

1

1

1

1

1

1

3

3

3

3

3

3

3

3

3

3

3

3

3

3

3

4

4

4

4

4

4

4

4

4

4

4

4

4

4

4

5

5

5

5

5

5

5

5

5

5

5

5

5

5

5

6

6

6

6

6

6

6

6

6

6

6

6

6

6

6

7

7

7

7

7

7

7

7

7

7

7

7

7

7

7

2

2

2

2

2

2

2

2

2

2

2

2

2

2

2




























































































^ ЗМІСТ ЗВІТУ


5.1 Титульний аркуш.

5.2 Мета роботи.

5.3 Короткі теоретичні відомості.

5.4 Тексти програм на мові Python.

5.5 Висновок.


ЛІТЕРАТУРА


  1. Steven Bird, Ewan Klein, Edward Loper Introduction to Natural Language Processing. 2001-2007 University of Pennsylvania.

  2. Г. Россум, Ф.Л.Дж. Дрейк, Д.С. Откидач, М. Задка, М. Левис, С.Монтаро, Э.С.Реймонд, А.М.Кучлинг, М.-А.Лембург, К.-П.Йи, Д.Ксиллаг, Х.ГПетрилли, Б.А.Варсав, Дж.К.Ахлстром, Дж.Рокинд, Н.Шеменон, С.Мулендер. Язык программирования Python./ 2001 – 452c.

  3. Сузи Р. А. Язык программирования Python.- 206с.

  4. David Mertz Text Processing in Python Addison WesleyBiber, 2003 - 544.

ІНТЕРНЕТ ПОСИЛАННЯ


http://www.nltk.org

http://python.org


Романюк Андрій Богданович, Юрчак Ірина Юріївна


МЕТОДИЧНІ ВКАЗІВКИ


до лабораторної роботи № 10

з дисципліни «Комп’ютерна лінгвістика»

для магістрів за фахом 8.02030303 «Прикладна лінгвістика»

денної та заочної форм навчання




Схожі:




База даних захищена авторським правом ©lib.exdat.com
При копіюванні матеріалу обов'язкове зазначення активного посилання відкритою для індексації.
звернутися до адміністрації