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

Інформація про навчальний заклад

ВУЗ:
Національний університет Львівська політехніка
Інститут:
Не вказано
Факультет:
Не вказано
Кафедра:
Системи автоматизованого проектуваня

Інформація про роботу

Рік:
2008
Тип роботи:
Лабораторна робота
Предмет:
Комп’ютерна лінгвістика
Група:
ПРЛ

Частина тексту файла (без зображень, графіків і формул):

Міністерство освіти та науки України Національний університет «Львівська політехніка» кафедра САПР ЗВІТ до лабораторної роботи № 5 ВИВЧЕННЯ БІБЛІОТЕКИ ПРИКЛАДНИХ ПРОГРАМ NLTK, ДЛЯ ОПРАЦЮВАННЯ ТЕКСТІВ ПРИРОДНОЮ МОВОЮ. АВТОМАТИЧНИЙ МОРФОЛОГІЧНИЙ АНАЛІЗ (частина1) Виконав: ст. гр. ПРЛ-1 Львів 2008 МЕТА РОБОТИ Вивчення основ програмування на мові Python. Ознайомлення з автоматичним морфологічним аналізом в NLTK. КОРОТКІ ТЕОРЕТИЧНІ ВІДОМОСТІ 1.1 Вступ. Виконуючи попередні лабораторні роботи слова оброблялися, як слова в загальному розумінні. Ми бачили що деякі розбіжності можна зменшити використовуючи нормалізацію, але подальші узагальнення не робилися. Розглядаючи частотний розподіл слова often фіксувалися слова які йдуть після цього слова і визначено що often часто виконує роль «модифікатора» дієслів. Дійсно, це слово належить до класу слів, які модифікують дієслова – adverbs. Для глибшого розуміння термінології розглянемо програму, яка для заданого слова знаходить інші слова які зустрічаються в тому самому контексті (listing1). Наприклад, для слова women будуть знайдені всі контексти в яких це слово зустрічається в корпусі і будуть знайдені інші слова які зустрічаються в такому контексті. Коли запустити на виконання функцію dist_sim() для певного переліку слів то отримаємо інші слова, які мають подібне розповсюдження. Для слова women такими словами будуть переважно іменники, для слова bought –дієслова, для over – прийменники, для the – артиклі. В загальному для назв цих груп слів вживаються терміни – класи слів, лексичні категорії, частини мови. Процес класифікації слів за їх приналежністю до частини мови і їх відповідне маркування називається морфологічним аналізом (tagging, POS tagging). Перелік тегів, який використовується для цієї специфічної задачі називається набором тегів. Наголос в цій та наступній лабораторних роботах буде зроблено на вивченні використання тегів і автоматичному морфологічному аналізі. Автоматичний морфологічний аналіз це дуже важливий, цінний етап опрацювання текстів природною мовою, який дозволяє отримати корисну інформацію. У попередньому прикладі було показано, як використовуються теги при аналізі корпусів – було отримано достовірну інформацію про частотний розподіл often на основі тегів сусідніх слів. Автоматичний морфологічний аналіз також допомагає передбачити поведінку попередньо невідомих слів. Наприклад, якщо зустрічається слово blogging можна передбачити що це дієслово, з основою blog і ймовірно воно вживається після допоміжного слова to be (he was blogging). Відомості про частини мови слів також використовуються при синтезі мови та її розпізнаванні. Наприклад wing/nn як в wind blew, вимовляється з коротким голосним, тоді як wind/vb, як в wind a clock вимовляється з довгим голосним. Можна навести і інші приклади в яких поведінка слів залежить чи вони належать до іменників чи до дієслів (contest, insult, present, rebel, suspect). Не знаючи, яка це частина мови не можна бути впевненому у вимові слова. 1.2 Загальна інформація про автоматичний морфологічний аналіз в NLTK Деякі великі корпуси текстів такі як Броунівський(Brown) і частково Wall Street Journal містять морфологічну розмітку (позначенні частини мови всіх слів) і дозволяють працювати з цими даними. Файл морфологічно розміченого корпусу текстів переважно містить текст в наступному вигляді (Броунівський корпус). 1.2.1 Представлення тегів і читання морфологічно розміченого корпусу текстів. За домовленістю в NLTK промарковані слова (tokens) представляються з використанням типу даних – кортеж. Кортежі подібні до списків, але їх неможна змінювати. До елементів кортежу можна отримати доступ використовуючи їх індекси. Можна також коректно доступитись до морфологічно розмічених корпусів текстів безпосередньо засобами Python. Спочатку завантажуємо модуль читання (brown) Броунівського корпусу. Далі використовуємо одну з його функцій brown.tagged() для створення послідовності речень, кожне з яких є списком промаркованих слів. Іменники можуть класифікуватися, як загальні іменники та власні імена. Власні іменники ідентифікують специфічних (окремий конкретний предмет) людей або об’єкти (Moses, Scotland). До загальних належать всі решта. Інший поділ іменників, це іменники які можна полічити (одиничні іменники) (dog, one dog, two dog , не можуть вживатися зі словом much) та матеріально-речовинні і збірні іменники, які не мають множини і не вживаються разом з числівниками (sand, two sand можуть вживатися зі словом much). Аналогічно дослідивши іменники за допомогою наступної програми, яка знаходить всі теги з початковими літерами NN і для кожного тега вибирає декілька прикладі, бачимо величезну кількість тегів, якими маркуються іменники. Найбільш важливі з них: $- присвійний іменник, S- множина, P – власне ім’я. Зауважимо, що аналізатор це генератор тегів слів. Роздрукувати його безпосередньо не можна, але можна перетворити у список і тоді роздрукувати, як показано у попередньому прикладі. Генератор ми можемо використати тільки один раз, але якщо результати його роботи зберегти у списку то їх можна використовувати і в подальшому. 1.3 Класифікація слів. Іменники англійської мови можуть бути морфологічно складними. Наприклад books і women це множина. Слова з –ness суфіксом це іменники утворені з прикметників: happiness, illness. Суфікс –ment з’являється в деяких іменниках, які походять від дієслів: government, establishment. Дієслова англійської мови також можуть бути морфологічно складними. Наприклад теперішній тривалий час в дієсловах характеризується закінченням –ing і описує триваючу незавершену дію (falling, eating). Суфікс –ing також з’являється і у іменників, які походять від дієслів (the falling of the leaves (герундій)). В Броунівському корпусі вони маркуються як VBG. Минулий час в дієсловах часто характеризується закінченням –ed і описує завершену дію, маркується VBD. Загальні набори тегів часто охоплюють деяку морфологічно-синтаксичну інформацію – це є інформація про види морфологічного маркування, які отримують слова в залежності від їх синтаксичної ролі. Розглянемо, наприклад, вибрані різні граматичні форми слова “go” , які ілюструються в наступних реченнях. Ці розбіжності між формами позначаються в корпусі наступним чином. Це означає, що автоматичний аналізатор, який використовує цей набір тегів в дійсності виконує обмежений морфологічний аналіз. Більшість наборів тегів для маркування частин мови використовує базові категорії такі як іменник, дієслово. Але набори тегів можуть і відрізнятися в залежності від того як точно поділені слова на категорії і яким чином визначені самі категорії. Наприклад, слово is може бути промарковане як дієслово в одному наборі тегів, але як форма дієслова be в іншому наборі тегів (так як в Броунівському корпусі). Ці розбіжності (варіації) в наборах тегів є неминучі, так як теги частин мови використовуються різними способами і для різних задач. Іншими словами немає єдиного правильного шляху для встановлення відповідності тегів, тільки є більш чи менш корисні способи в залежності від мети. В додатках наведено частину набору тегів Броунівського корпусу. 1.3.1 Аналізатор побудований на регулярних виразах. Аналізатор побудований на регулярних виразах встановлює відповідність тегів до слів на основі їх відповідності зразкам. Наприклад можна передбачити, що кожне слово, яке закінчується на –ed це є past participle в дієсловах а будь-яке слово, яке закінчується на ‘s це є присвійний іменник. Подібні правила можна описати, як набір регулярних виразів. 1.1 def findtags(tag_prefix, tagged_text): cfd = nltk.ConditionalFreqDist() for (wd, tg) in tagged_text: if tg.startswith(tag_prefix): cfd[tg].inc(wd) tagdict = {} for tg in cfd.conditions(): tagdict[tg] = cfd[tg].sorted()[:5] return tagdict >>> tagdict = findtags('NN', nltk.corpus.brown.tagged_words(categories='a')) >>> for tg in sorted(tagdict): print tg, tagdict[tg] NN ['year', 'time', 'state', 'week', 'man'] NN$ ["year's", "world's", "state's", "nation's", "company's"] NN$-HL ["Golf's", "Navy's"] NN$-TL ["President's", "University's", "League's", "Gallery's", "Army's"] NN-HL ['cut', 'Salary', 'condition', 'Question', 'business'] NN-NC ['eva', 'ova', 'aya'] NN-TL ['President', 'House', 'State', 'University', 'City'] NN-TL-HL ['Fort', 'City', 'Commissioner', 'Grove', 'House'] NNS ['years', 'members', 'people', 'sales', 'men'] NNS$ ["children's", "women's", "men's", "janitors'", "taxpayers'"] NNS$-HL ["Dealers'", "Idols'"] NNS$-TL ["Women's", "States'", "Giants'", "Officers'", "Bombers'"] NNS-HL ['years', 'idols', 'Creations', 'thanks', 'centers'] NNS-TL ['States', 'Nations', 'Masters', 'Rules', 'Communists'] NNS-TL-HL ['Nations'] 2.6 >>> import nltk >>> from nltk import corpus >>> from operator import itemgetter >>> words = {} >>> words_sort = [] >>> ambiguous = [] >>> count = 1 >>> for (wd, tg) in corpus.brown.tagged('a',group_by_sent=False): if wd not in words: words[wd] = tg elif tg not in words[wd]: words[wd] += ' / '+tg >>> for wd in words: if '/' in words[wd]: words_sort.append((wd, words[wd])) >>> ambiguous.sort(key=itemgetter(2), reverse=True) >>> for word in ambiguous[:20]: print word >>> print 'Percentage of ambiguous words ->', len(ambiguous)*100.00/len(corpus.brown.tagged('a',group_by_sent=False)), '%' ('by', 'in / in-hl / in-tl / rb', 4) ('open', 'jj / rb / vb / nn', 4) ('French', 'jj / np / jj-hl / jj-tl / nps', 5) ('half', 'abn / rb / nn / ql', 4) ('near', 'rb / rb-hl / jj / in / ql', 5) ('to', 'to / in / in-hl / to-hl / in-tl / nps', 6) ('for', 'in / in-tl / in-hl / cs / rb', 5) ('as', 'cs / ql / cs-hl / in', 4) Percentage of ambiguous words -> 1.47482944488 % 3.8 >>> fd = nltk.FreqDist() >>> for (wd, tg) in nltk.corpus.brown.tagged_words(categories='a'): ... fd.inc(tg) >>> fd.max() 'NN' >>> tokens = 'John saw 3 polar bears .'.split() >>> default_tagger = nltk.DefaultTagger('NN') >>> default_tagger.tag(tokens) [('John', 'NN'), ('saw', 'NN'), ('3', 'NN'), ('polar', 'NN'), ('bears', 'NN'), ('.', 'NN')] >>> nltk.tag.accuracy(default_tagger, nltk.corpus.brown.tagged_sents(categories='a')) 0.13089484257215028 4.9 1. Short story of British Advertising. - AT/ JJ/ NN/ IN/ FW-JJ/ VBG. 2. Latest UK inflation figures. – JJT/ FW-JJ / NN/ NNS. Знання про набори тегів дозволяє розв’язати неоднозначності. За допомогою цих знань ми отримуємо достовірну інформацію про те чи інше слово, оскільки ми беремо до уваги контекст, тобто біля яких слів вживається дане слово. Наприклад проаналізуємо другий заголовок: Слово «Latest» - за допомогою закінчення ‘st’ ми бачимо, що це прикметник найвищого ступеня порівняння. UK – ця абревіатура означає назву держави і відповідно маркується як FW-JJ. Inflation – це звичайний іменник і маркується NN. Figures – за допомогою закінчення s ми можемо сказати, що це іменник множини. 5.11 >>> import nltk >>> from nltk import corpus >>> fd1=nltk.FreqDist() >>> fd2=nltk.FreqDist() >>> for(wd,tg)in corpus.brown.tagged('a',group =False): if tg[:4]=='nns': fd1.inc(wd) elif tg[:4]=='vbz': fd2.inc(wd) >>> for word in fd1.items(): if word in fd2.items(): print word ('reports', 3) ('details',1) ('expects', 1) ('gives', 2) ('eliminates', 1) ('deserves', 1) ('members ',3) ('years',1) ('polls', 2) 6.14 >>> import nltk >>> from nltk import corpus >>> fd = nltk.FreqDist() >>> for (wd, tg) in nltk.corpus.brown.tagged_words(categories='a'): if tg[:3]=='QL': fd.inc(wd + "/" + tg) >>> fd.sorted()[:6] ['well/QL', 'even/QL', 'how/QL', 'too/QL', 'more/QL', 'far/QL'] 7.15 >>> import nltk >>> from nltk import corpus >>> patterns = [ ... (r'.*ing$', 'vbg'), # gerunds (r'.*ed§', 'vbd'), # simple past ... (r'.*es$', 'vbz'), # 3rd singular present (r'.*ould$', 'md'), # raodals ... (rf.*\'s$'f 'nn$'), # possessive nouns ... (r'.*s$', 'nns'), # plural nouns (r'A-?[0-9]+(.[0-9]+)?$', 'cd'), # cardinal numbers (r'.*', 'nn' ) # nouns (default) ... ] >>> regexp_tagger = tag.Regexp(patterns) >>> list (regexp_tagger.tag (corpus.brown.tokenized(' a' ))) [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'), (' v w , 'nn'), (' considering' , 'vbg' ) , ('the' , 'nn' ) , ('widespread' , 'nn'), (' .' , 'nn') ] >>> tag.accuracy(regexp_tagger, corpus.brown.tagged('a' )) 0.20326391789486245 Висновок: на цій лабораторній роботі я ознайомився з автоматичним морфологічним аналізом в NLTK.
Антиботан аватар за замовчуванням

01.01.1970 03:01-

Коментарі

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

Ділись своїми роботами та отримуй миттєві бонуси!

Маєш корисні навчальні матеріали, які припадають пилом на твоєму комп'ютері? Розрахункові, лабораторні, практичні чи контрольні роботи — завантажуй їх прямо зараз і одразу отримуй бали на свій рахунок! Заархівуй всі файли в один .zip (до 100 МБ) або завантажуй кожен файл окремо. Внесок у спільноту – це легкий спосіб допомогти іншим та отримати додаткові можливості на сайті. Твої старі роботи можуть приносити тобі нові нагороди!
Нічого не вибрано
0%

Оголошення від адміністратора

Антиботан аватар за замовчуванням

Подякувати Студентському архіву довільною сумою

Admin

26.02.2023 12:38

Дякуємо, що користуєтесь нашим архівом!