Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Metodichni_vkazivki.doc
Скачиваний:
13
Добавлен:
21.02.2016
Размер:
951.3 Кб
Скачать

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

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

Наступна програма обробляє послідовність речень, підраховує частоту слів і виводить на екран 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 показано залежність продуктивності роботи такого аналізатора від розміру списку найчастотніших слів. Продуктивність роботи спочатку зростає швидко при збільшенні розміру списку, а потім переходить в стан насичення, коли значне збільшення розміру списку приводить до незначного збільшення продуктивності (графік більш плаский).

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]