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

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




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


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

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

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


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





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

ДОСТУП ТА РОБОТА З КОРПУСАМИ ТЕКСТІВ.


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

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

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


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

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

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


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

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


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

№ 3508 від 2.06.2011


Львів-2011

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



Укладачі:

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

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



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

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



Рецензент:

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

^ МЕТА РОБОТА


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

  • Вивчення методів доступу до корпусів текстів.

  • Вивчення класу ConditionalFreqDist.


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


Вирішення задач обробки текстів природною мовою передбачає використання великих об’ємів лінгвістичних даних, або інишими словами передбачає роботу з корпусами текстів. Виконання даної лабораторної роботи допоможе знайти відповідь на наступні питання: які є відомі корпуси текстів та лексичні ресурси і як отримати до них доступ використовуючи Python; які корисні конструкції має Python для виконання цієї роботи.

  1. Доступ до корпусів текстів.

Корпус текстів це великий набір текстів. Багато корпусів розроблені їз збереженням балансу між текстами різних жанрів, або авторів. В попередній лабораторній роботі ми працювали з промовами президентів США, які є частиною корпуса US Presidential Inaugural Addresses. З промовами ми працювали, як з одним текстом не зважаючи на те, що кожна промова має окремого автора.Обробку ми здійснювали . При роботі з копусами важливо мати засоби доступу як до окремих тексті так і до окремих частин цих тексів а також і до окремих слів.


1.1 Корпус Гутенберга.

В NLTK входить невелика частина текстів з електронного архіву текстів Project Gutenberg , який містить 25000 безкоштовних електронних книжок різних авторів (http://www.gutenberg.org/). Тексти творів в окремих файлах. Для одержання назв файлів (ідентифікаторів файлів) в яких зберігаються текстів потрібно використати наступну функцію:

>>> import nltk

>>> nltk.corpus.gutenberg.fileids()

['austen-emma.txt', 'austen-persuasion.txt', 'austen-sense.txt', 'bible-kjv.txt',

'blake-poems.txt', 'bryant-stories.txt', 'burgess-busterbrown.txt',

'carroll-alice.txt', 'chesterton-ball.txt', 'chesterton-brown.txt',

'chesterton-thursday.txt', 'edgeworth-parents.txt', 'melville-moby_dick.txt',

'milton-paradise.txt', 'shakespeare-caesar.txt', 'shakespeare-hamlet.txt',

'shakespeare-macbeth.txt', 'whitman-leaves.txt']

Для роботи з першим текстом цього корпусу (роман Емма, автор Джейн Остін) створюємо змінну emma і можемо знайти скільки слів має цей текст.

>>> emma = nltk.corpus.gutenberg.words('austen-emma.txt')

>>> len(emma)

192427

При створенні змінної emma було використано функцію words()об’єкта gutenberg пакета corpus бібліотеки NLTK. Аналогічний результат можна досягнути використавши більш компактний запис констркуцій Python.

>>> from nltk.corpus import gutenberg

>>> gutenberg.fileids()

['austen-emma.txt', 'austen-persuasion.txt', 'austen-sense.txt', ...]

>>> emma = gutenberg.words('austen-emma.txt')

Для побудови конкордансу необхідно використати наступні вирази:

>>> emma = nltk.Text(nltk.corpus.gutenberg.words('austen-emma.txt'))

>>> emma.concordance("surprize")

Спробуємо написати невелику програму для одержання інформаціх про кожен текст з корпуса. Побудуємо цикл по змінній fileid, яка відповідає ідентифікатору файла з текстом, і на кожному кроці будемо визначати деяку статистичну інформацію, яку для компактності запису будемо відображати цілими числами int().

>>> for fileid in gutenberg.fileids():

num_chars = len(gutenberg.raw(fileid)) #1

num_words = len(gutenberg.words(fileid))

num_sents = len(gutenberg.sents(fileid))

num_vocab = len(set([w.lower() for w in gutenberg.words(fileid)]))

print int(num_chars/num_words), int(num_words/num_sents), int(num_words/num_vocab), fileid

...

4 21 26 austen-emma.txt

4 23 16 austen-persuasion.txt

4 24 22 austen-sense.txt

4 33 79 bible-kjv.txt

4 18 5 blake-poems.txt

4 17 14 bryant-stories.txt

4 17 12 burgess-busterbrown.txt

4 16 12 carroll-alice.txt

4 17 11 chesterton-ball.txt

4 19 11 chesterton-brown.txt

4 16 10 chesterton-thursday.txt

4 18 24 edgeworth-parents.txt

4 24 15 melville-moby_dick.txt

4 52 10 milton-paradise.txt

4 12 8 shakespeare-caesar.txt

4 13 7 shakespeare-hamlet.txt

4 13 6 shakespeare-macbeth.txt

4 35 12 whitman-leaves.txt

Операція ділення дає цілочисленні результати (з округленням). Для одержання результатів без округлення потрібно використати from __future__ import division

>>> from __future__ import division

>>> for fileid in gutenberg.fileids():

num_chars = len(gutenberg.raw(fileid)) #1

num_words = len(gutenberg.words(fileid))

num_sents = len(gutenberg.sents(fileid))

num_vocab = len(set([w.lower() for w in gutenberg.words(fileid)]))

print int(num_chars/num_words), int(num_words/num_sents), int(num_words/num_vocab), fileid

...

4.60990921232 21.6477669029 26.2019335512 austen-emma.txt

4.74979372727 23.7128019324 16.8245072836 austen-persuasion.txt

4.75378595242 24.1721017586 22.1108855224 austen-sense.txt


Дана програма відображає наступні статистичні дані для кожного з текстів: середня довжина слова; середня довжина речення; значення лексичної різноманітності (відношення загальної кількості слів до кільності оригінальних слів). Числові значення (однакові для всіх текстів) вказують, що для англійської мови середнє значення довжини слова становить 4 символи (насправді 3 оскільки змінна num_chars включає і пробіли). На відміну від довжини слова наступні числові значення відрізняються і є до певної міри характерними для різних авторів.

В попередньому прикладі використовувалась функція .raw() для доступу до тексту книжки, без його поділу на окремі слова. Ця функція дозволяє доступитися до вмісту файла без будь-якої його попередньої лінгвістичної обробки. Тому використання len(gutenberg.raw('blake-poems.txt') дозволяє встановити скільки символів (разом з пробілами) є в тексті. Функція sents() ділить текст на оремі речення і кожне речення представляється, як список стрічок, де стічки – окремі слова.

>>> macbeth_sentences = gutenberg.sents('shakespeare-macbeth.txt')

>>> macbeth_sentences

[['[', 'The', 'Tragedie', 'of', 'Macbeth', 'by', 'William', 'Shakespeare',

'1603', ']'], ['Actus', 'Primus', '.'], ...]

>>> macbeth_sentences[1037]

['Double', ',', 'double', ',', 'toile', 'and', 'trouble', ';',

'Fire', 'burne', ',', 'and', 'Cauldron', 'bubble']

>>> longest_len = max([len(s) for s in macbeth_sentences])

>>> [s for s in macbeth_sentences if len(s) == longest_len]

[['Doubtfull', 'it', 'stood', ',', 'As', 'two', 'spent', 'Swimmers', ',', 'that',

'doe', 'cling', 'together', ',', 'And', 'choake', 'their', 'Art', ':', 'The',

'mercilesse', 'Macdonwald', ...], ...]


1.2 Текст з Інтернету.

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

>>> from nltk.corpus import webtext

>>> for fileid in webtext.fileids():

... print fileid, webtext.raw(fileid)[:65], '...'

...

firefox.txt Cookie Manager: "Don't allow sites that set removed cookies to se...

grail.txt SCENE 1: [wind] [clop clop clop] KING ARTHUR: Whoa there! [clop...

overheard.txt White guy: So, do you have any plans for this evening? Asian girl...

pirates.txt PIRATES OF THE CARRIBEAN: DEAD MAN'S CHEST, by Ted Elliott & Terr...

singles.txt 25 SEXY MALE, seeks attrac older single lady, for discreet encoun...

wine.txt Lovely delicate, fragrant Rhone wine. Polished leather and strawb...

Також в NLTK входить корпус повідомлень з чатів, створений в Naval Postgraduate School для досліджень з метою автоматичного виявлення Інтернет злочинців. Цей корпус містить 10000 анонімних повідомлень в яких імена користувачів замінені за шаблоном "UserNNN" а також видалена інша персональна інформація, Корпус організований ,як 15 окремих файлів, кожен з яких містить декілька сотень повідомлень з певною датою створення та вікових даних авторів (підлітки, 20ти, 30ти та 40ка річні, дорослі). Назва файла містить інформацію про дату, вікову групу та кількість повідомлень, наприклад файл 10-19-20s_706posts.xml містить 706 повідомлень двадцятирічних дописувачів від 19 жовтня 2006 року.

>>> from nltk.corpus import nps_chat

>>> chatroom = nps_chat.posts('10-19-20s_706posts.xml')

>>> chatroom[123]

['i', 'do', "n't", 'want', 'hot', 'pics', 'of', 'a', 'female', ',',

'I', 'can', 'look', 'in', 'a', 'mirror', '.']


1.3 Корпус Brown

Корпус Brown – це перший корпус англійської мови об’ємом один мільйон слів було створено в 1961-1964 роках в університеті Brown. Цей корпус містить тексти з 500 різних джерел, які відповідають різним жанрам. В Табл.1. наведено приклади для кожного з жанрів.


Таблиця 1

Приклади текстів для кожного з жанрів корпуса Brown.



ID

Файл

Жанр

Опис тексту

A16

ca16

news

Chicago Tribune: ^ Society Reportage

B02

cb02

editorial

Christian Science Monitor: Editorials

C17

cc17

reviews

Time Magazine: Reviews

D12

cd12

religion

Underwood: ^ Probing the Ethics of Realtors

E36

ce36

hobbies

Norling: Renting a Car in Europe

F25

cf25

lore

Boroff: ^ Jewish Teenage Culture

G22

cg22

belles_lettres

Reiner: Coping with Runaway Technology

H15

ch15

government

US Office of Civil and Defence Mobilization: ^ The Family Fallout Shelter

J17

cj19

learned

Mosteller: Probability with Statistical Applications

K04

ck04

fiction

W.E.B. Du Bois: ^ Worlds of Color

L13

cl13

mystery

Hitchens: Footsteps in the Night

M01

cm01

science_fiction

Heinlein: ^ Stranger in a Strange Land

N14

cn15

adventure

Field: Rattlesnake Ridge

P12

cp12

romance

Callaghan: ^ A Passion in Rome

R06

cr06

humor

Thurber: The Future, If Any, of Comedy


Використовуючи засоби NLTK можна отримати доступ до цього корпусу, як до списку слів або списку речень (кожне речення – список слів). Також доступна можливість вибору текстів окремої категорії або з окремого файлу.

>>> from nltk.corpus import brown

>>> brown.categories()

['adventure', 'belles_lettres', 'editorial', 'fiction', 'government', 'hobbies',

'humor', 'learned', 'lore', 'mystery', 'news', 'religion', 'reviews', 'romance',

'science_fiction']

>>> brown.words(categories='news')

['The', 'Fulton', 'County', 'Grand', 'Jury', 'said', ...]

>>> brown.words(fileids=['cg22'])

['Does', 'our', 'society', 'have', 'a', 'runaway', ',', ...]

>>> brown.sents(categories=['news', 'editorial', 'reviews'])

[['The', 'Fulton', 'County'...], ['The', 'jury', 'further'...], ...]

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

>>> from nltk.corpus import brown

>>> news_text = brown.words(categories='news')

>>> fdist = nltk.FreqDist([w.lower() for w in news_text])

>>> modals = ['can', 'could', 'may', 'might', 'must', 'will']

>>> for m in modals:

... print m + ':', fdist[m],

...

can: 94 could: 87 may: 93 might: 38 must: 53 will: 389


Виконати самостійно! Здійснити розрахунки для інших жанрів та для інших слів. Наприклад для wh слів, таких як what, when, where, who, та why.


1.4 Корпус інформаційного агентства Рейтер.

Корпус Reuters містить 10788 текстів новин загальним об’ємом 1.3 мільйона слів. Всі тексти поділені на категорії за 90 темами і поділені на два набори (тренування та тестування). Такий поділ необхідний для тренування та тестування алгоритмів автоматичного визначення тематики тексту.

>>> from nltk.corpus import reuters

>>> reuters.fileids()

['test/14826', 'test/14828', 'test/14829', 'test/14832', ...]

>>> reuters.categories()

['acq', 'alum', 'barley', 'bop', 'carcass', 'castor-oil', 'cocoa',

'coconut', 'coconut-oil', 'coffee', 'copper', 'copra-cake', 'corn',

'cotton', 'cotton-oil', 'cpi', 'cpu', 'crude', 'dfl', 'dlr', ...]

На відміну від корпуса Brown, категорії текстів в цьому корпусі можуть накладатися одна на одну, оскільки тематика новин (газетних публікацій) переважно торкається багатьох тем. Засобами NLTK можна звернутися до тем, яких торкаються в одному або декількох текстах або навпаки дізнатися весь перелік текстів, які належать до певної категорії.

>>> reuters.categories('training/9865')

['barley', 'corn', 'grain', 'wheat']

>>> reuters.categories(['training/9865', 'training/9880'])

['barley', 'corn', 'grain', 'money-fx', 'wheat']

>>> reuters.fileids('barley')

['test/15618', 'test/15649', 'test/15676', 'test/15728', 'test/15871', ...]

>>> reuters.fileids(['barley', 'corn'])

['test/14832', 'test/14858', 'test/15033', 'test/15043', 'test/15106',

'test/15287', 'test/15341', 'test/15618', 'test/15618', 'test/15648', ...]


1.5 Корпус інаугураційних примов президентів США.

Знайомлячись з бібліотекою програм NLTK ми працювали з цим корпусом і розглядали весь корпус як один текст, що давало можливість знайти місце окремого слова в текстах промов починаючи від першого слова першої промови. Насправді корпус це набір 55 текстів, кожен з яких є промовою одного президента. Цікавою особливістю цього корпуса є можливість дослідити розподіл текстів за часовими проміжками. Назва кожного тексту містить рік проголошення промови і відповідно є можливість доступитися до цієї інформації , доступившись до перших чотирьох символів назви файлу [fileid[:4].

>>> from nltk.corpus import inaugural

>>> inaugural.fileids()

['1789-Washington.txt', '1793-Washington.txt', '1797-Adams.txt', ...]

>>> [fileid[:4] for fileid in inaugural.fileids()]

['1789', '1793', '1797', '1801', '1805', '1809', '1813', '1817', '1821', ...]


1.6 Анотовані (розмічені) корпуси текстів.

Більшість корпусів текстів є лінгвістично анотованими, тобто містять різного типу розмітку – морфологічну, синтаксичну, семантичну, в них можуть бути виділені власні назви, вказані семантичні ролі і т.п. NLTK забезпечує способи доступу до багатьох корпусів і розповсюджується з цими корпусами або їх фрагментами (при використанні NLTK всі корпуси по замовчуванню повинні зберігатися за наступним шляхом C:\nltk_data\corpora). В Додатку В наведений перелік доступних корпусів текстів та їх короткий опис.


1.7 Корпуси іншомовних текстів.

NLTK включає та має засоби роботи з корпусами текстів іншими мовами крім англійської. Для роботи з цими корпусами потрібно попередньо ознайомитися з питаннями кодування символів в Python (Лабораторна робота №4).

>>> nltk.corpus.cess_esp.words()

['El', 'grupo', 'estatal', 'Electricit\xe9_de_France', ...]

>>> nltk.corpus.floresta.words()

['Um', 'revivalismo', 'refrescante', 'O', '7_e_Meio', ...]

>>> nltk.corpus.indian.words('hindi.pos')

['\xe0\xa4\xaa\xe0\xa5\x82\xe0\xa4\xb0\xe0\xa5\x8d\xe0\xa4\xa3',

'\xe0\xa4\xaa\xe0\xa5\x8d\xe0\xa4\xb0\xe0\xa4\xa4\xe0\xa4\xbf\xe0\xa4\xac\xe0\xa4

\x82\xe0\xa4\xa7', ...]

>>> nltk.corpus.udhr.fileids()

['Abkhaz-Cyrillic+Abkh', 'Abkhaz-UTF8', 'Achehnese-Latin1', 'Achuar-Shiwiar-Latin1',

'Adja-UTF8', 'Afaan_Oromo_Oromiffa-Latin1', 'Afrikaans-Latin1', 'Aguaruna-Latin1',

'Akuapem_Twi-UTF8', 'Albanian_Shqip-Latin1', 'Amahuaca', 'Amahuaca-Latin1', ...]

>>> nltk.corpus.udhr.words('Javanese-Latin1')[11:]

[u'Saben', u'umat', u'manungsa', u'lair', u'kanthi', ...]

Останній з розглянутих в попередньому прикладів корпусів (udhr) це набір текстів різними мовами (300 мов) Декларації прав людини.


1.8 Структура корпусів текстів.

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



Рис.1. Загальні структури корпусів текстів.

Засоби NLTK забезпечують ефективні способи доступу до різних корпусів та роботи з існуючими та новими корпусами. Таблиця 2. Містить набір функцій які підтримує NLTK для роботи з корпусами.

Таблиця 2.

Основні функції NLTK для роботи з корпусами.


^ Приклад використання функції

Опис

fileids()

Файли корпуса

fileids([categories])

Файли корпуса, що відповідають цій категорії

categories()

Категорії корпуса

categories([fileids])

Категорії корпуса, що відповідають цим файлам

raw()

Корпус, як послідовність символів

raw(fileids=[f1,f2,f3])

Послідовність символів з наступних файлів

raw(categories=[c1,c2])

Послідовність символів з наступних категорій

words()

Слова корпуса

words(fileids=[f1,f2,f3])

Слова з наступних файлів

words(categories=[c1,c2])

Слова з наступних категорій

sents()

Речення корпуса

sents(fileids=[f1,f2,f3])

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

sents(categories=[c1,c2])

Речення корпуса з наступних категорій

abspath(fileid)

Місцезнаходження даного файлу на диску

encoding(fileid)

Кодування файлу (якщо відоме)

open(fileid)

Відкриття файла з корпуса для читання

root()

Шлях до місця де встановлено корпус

readme()

Вміст файла README корпуса текстів



Відмінності між методами доступу до корпусів можна проілюструвати наступним прикладом.

>>> raw = gutenberg.raw("burgess-busterbrown.txt")

>>> raw[1:20]

'The Adventures of B'

>>> words = gutenberg.words("burgess-busterbrown.txt")

>>> words[1:20]

['The', 'Adventures', 'of', 'Buster', 'Bear', 'by', 'Thornton', 'W', '.',

'Burgess', '1920', ']', 'I', 'BUSTER', 'BEAR', 'GOES', 'FISHING', 'Buster',

'Bear']

>>> sents = gutenberg.sents("burgess-busterbrown.txt")

>>> sents[1:20]

[['I'], ['BUSTER', 'BEAR', 'GOES', 'FISHING'], ['Buster', 'Bear', 'yawned', 'as',

'he', 'lay', 'on', 'his', 'comfortable', 'bed', 'of', 'leaves', 'and', 'watched',

'the', 'first', 'early', 'morning', 'sunbeams', 'creeping', 'through', ...], ...]


1.9 Доступ до власних корпусів текстів.

При наявності власного набору текстових файлів, до них також можна організувати доступ використовуючи вище перелічені методи попередньо використавши клас NLTK PlaintextCorpusReader . Потрібно знати розміщення файлів на диску. (в прикладі шлях наступний D:\Oles\Romanyuk-S\KL\KL. ) Змінній присвоюється це значення (#1). Клас PlaintextCorpusReader має два параметри шлях до файлів та шаблон вибору файлів (#2) і повертає список назв файлів.

>>> import nltk

>>> from nltk.corpus import PlaintextCorpusReader

>>> corpus_root = 'D:\Oles\Romanyuk-S\KL\KL' #1

>>> wordlists = PlaintextCorpusReader(corpus_root, '.*') #2

>>> wordlists.fileids()

['004556.html', '036_Dobroff_Lukashevich.doc', '048.htm', '2.doc', '2.rtf', '240-0679.rar', '240-0701.DOC', '36.pdf', '41.htm', '48.htm', '57224_1.rtf', '7.doc', 'about_pc-kimmo.html', 'ai00011f.htm', 'archive_article.asp.htm']

>>> wordlists.words('about_pc-kimmo.html')

['

В наступному прикладі показано яким чином можна доступитися до локальної копії корпуса PennTreebank використовуючи клас BracketParseCorpusReader.

>>> from nltk.corpus import BracketParseCorpusReader

>>> corpus_root = r"C:\corpora\penntreebank\parsed\mrg\wsj"

>>> file_pattern = r".*/wsj_.*\.mrg"

>>> ptb = BracketParseCorpusReader(corpus_root, file_pattern)

>>> ptb.fileids()

[\'00/wsj_0001.mrg\', \'00/wsj_0002.mrg\', \'00/wsj_0003.mrg\', \'00/wsj_0004.mrg\', ...]

>>> len(ptb.sents())

49208

>>> ptb.sents(fileids=\'20/wsj_2013.mrg\')[19]

[\'The\', \'55-year-old\', \'Mr.\', \'Noriega\', \'is\', "n\'t", \'as\', \'smooth\', \'as\', \'the\',

\'shah\', \'of\', \'Iran\', \',\', \'as\', \'well-born\', \'as\', \'Nicaragua\', "\'s", \'Anastasio\',

\'Somoza\', \',\', \'as\', \'imperial\', \'as\', \'Ferdinand\', \'Marcos\', \'of\', \'the\', \'Philippines\',

\'or\', \'as\', \'bloody\', \'as\', \'Haiti\', "\'s", \'Baby\', Doc\', \'Duvalier\', \'.\']



  1. Умовний частотний розподіл. Клас ConditionalFreqDist.


Якщо тексти в корпусі поділені на різні категорії, (за жанром, тематикою, авторами) то можна побудувати частотні розподіли для кожної з категорій. Такі дані дозволяють досліджувати відмінності між жанрами. Умовний частотний розподіл це набір частотних розподілів, кожен з яких відповідає певній «умові». Такою умовою може бути категорія тексту.


2.1 Умови і події.

Частотний розподіл визначає числові значення для кожної події (подіями можемо вважати вживання слів в тексті). Умовний частотний розподіл поєднує в пари кожну подію та умову. Замість обробки послідовності слів ( #1) обробляються послідовності пар (#2).

>>> text = ['The', 'Fulton', 'County', 'Grand', 'Jury', 'said', ...] #1

>>> pairs = [('news', 'The'), ('news', 'Fulton'), ('news', 'County'), ...] #2

Кожна пара відповідає шаблону (condition, event). Якщо розглядати корпус Brown за жанрами то отримаємо 15 умов (одна для жанру) і 1161192 подій (одна для слова).


2.2 Підрахунок слів для окремих жанрів.

Використовуючи клас ConditionalFreqDist можна визначити частоту слів для різних жанрів. У випадку модальних дієслів програма буде виглядати наступним чином.

>>> cfd = nltk.ConditionalFreqDist(

... (genre, word)

... for genre in brown.categories()

... for word in brown.words(categories=genre))

>>> genres = ['news', 'religion', 'hobbies', 'science_fiction', 'romance', 'humor']

>>> modals = ['can', 'could', 'may', 'might', 'must', 'will']

>>> cfd.tabulate(conditions=genres, samples=modals)

can could may might must will

news 93 86 66 38 50 389

religion 82 59 78 12 54 71

hobbies 268 58 131 22 83 264

science_fiction 16 49 4 12 8 16

romance 74 193 11 51 45 43

humor 16 30 8 8 9 13

Тоді як для класу FreqDist() вхідними даними є список, то для класу ConditionalFreqDist() вхідними даними є список пар.

Розглянемо окремо тільки два жанри, новини і романтика. Для кожного жанру #2 в циклі обробляємо кожне слово цього жанру #3 і отримуємо пари, які містять жанр і слово #1.

>>> genre_word = [(genre, word) #1

... for genre in ['news', 'romance'] #2

... for word in brown.words(categories=genre)] #3

>>> len(genre_word)

170576

Пари на початку списку genre_word будуть мати форму ('news', word) тоді як з кінця списку їх форма буде наступна ('romance', word).

>>> genre_word[:4]

[('news', 'The'), ('news', 'Fulton'), ('news', 'County'), ('news', 'Grand')] # [_start-genre]

>>> genre_word[-4:]

[('romance', 'afraid'), ('romance', 'not'), ('romance', "''"), ('romance', '.')] # [_end-genre]

Можна використати цей список пар для побудови умовного частотного розподілу. Результати побудови збережемо в окремій змінній cfd. Перевіривши значення змінної #1 дізнаємося про кількість умов а також можемо переглянути ці умови #2 та пересвідчитись що для кожної з умов побудовано частотний розподіл #3.

>>> cfd = nltk.ConditionalFreqDist(genre_word)

>>> cfd #1



>>> cfd.conditions() #2

['news', 'romance'] # [_conditions-cfd]

>>> cfd['news'] #3



>>> cfd['romance']



>>> list(cfd['romance'])

[',', '.', 'the', 'and', 'to', 'a', 'of', '``', "''", 'was', 'I', 'in', 'he', 'had', '?', 'her', 'that', 'it', 'his', 'she', 'with', 'you', 'for', 'at', 'He', 'on', 'him', 'said', '!', '--', 'be', 'as', ';', 'have', 'but', 'not', 'would', 'She', 'The', ...]

>>> cfd['romance']['could']

193

За допомогою умовного частотного розподілу можна дослідити вживання слів в часовому проміжку. Досліджуємо слова America та citizen . Спочатку перетворюємо всі слова корпусу промов президентів США до одного вигляду #1, і перевіряємо початкові літери слів для врахування різних форм American's and Citizens. Далі будуємо умовний частотний розподіл і результати представляємо в графічному вигляді (Рис.2.).

>>> cfd = nltk.ConditionalFreqDist(

... (target, fileid[:4])

... for fileid in inaugural.fileids()

... for w in inaugural.words(fileid)

... for target in ['america', 'citizen']

... if w.lower().startswith(target)) #1

>>> cfd.plot()





Рис.2. Умовний частотний розподіл для визначення частоти вживання слів в різні частові проміжки.


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

>>> from nltk.corpus import udhr

>>> languages = ['Chickasaw', 'English', 'German_Deutsch',

... 'Greenlandic_Inuktikut', 'Hungarian_Magyar', 'Ibibio_Efik']

>>> cfd = nltk.ConditionalFreqDist(

... (lang, len(word))

... for lang in languages

... for word in udhr.words(lang + '-Latin1'))

>>> cfd.plot(cumulative=True)




Рис.3. Умовний частотний розподіл довжин слів для різних мов.


Метод plot() а також метод tabulate() дозволяють визначати, які з умов будуть відображатися на екрані за допомогою параметра conditions= parameter. Так само визначають кількість прикладів для відображення за допомогою параметра samples= parameter. Наприклад в наступній таблиці відображаються довжини слів до 10 символів для двох мов.

>>> cfd.tabulate(conditions=['English', 'German_Deutsch'],

... samples=range(10), cumulative=True)

0 1 2 3 4 5 6 7 8 9

English 0 185 525 883 997 1166 1283 1440 1558 1638

German_Deutsch 0 171 263 614 717 894 1013 1110 1213 1275


Виконати самостійно! Здійснити аналіз двох жанрів корпуса Brown (новини, романтика) для визначення, які з днів тижня є більш романтичні а які містять більше новин. Для вирішення цієї задачі потрібно побудувати умовний частотний розподіл де умовами є жанри а подіями є дні тижня. Результати представити в табличній і графічній формах.


  1. Використання текстового редактора при створенні програм.

Інтерпретатор виконує оператори програми відразу після їх введення. Часто виникає потреба спочатку написати програму , яка складається з багатьох рядків використовуючи текстовий редактор а потім запустити її на виконання. Використовуючи IDLE можна це зробити відкривши нове вікно за допомогою пункту меню File, зберігши текст програми у файлі *py і запустивши програму на виконання за допомогою команди Run Module пункту меню Run.


4. Поняття функції та модуля.

При програмуванні часто необхідно частину програми виконати (використати) декілька разів. Наприклад, потрібно написати програму, яка здійснює утворення множини з однини іменників і вона буде виконуватись в різних місцях програми. Швидше ніж повторювати той самий код декілька разів і більш ефективно і надійно організувати цю роботу через функцію. Функція - це програмна конструкція, яку можна викликати з одним або більше вхідними параметрами, і отримувати результат на виході. Визначаємо функцію, використовуючи ключове слово def далі потрібно дати назву функції і визначити вхідні параметри, після двокрапки записується тіло функції. Ключове слово return використовується для відображення значення, яке ми хочемо отримати на виході функції. Розглянемо приклад. Функція plural () отримує на вході однину іменника і формує множину на виході.

def plural(word):

if word.endswith('y'):

return word[:-1] + 'ies'

elif word[-1] in 'sx' or word[-2:] in ['sh', 'ch']:

return word + 'es'

elif word.endswith('an'):

return word[:-2] + 'en'

else:

return word + 's'




 

>>> plural('fairy')

'fairies'

>>> plural('woman')

'women'


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


>>> from textproc import plural

>>> plural('wish')

wishes

>>> plural('fan')

fen

Множина змінних і функцій збережених у файлі називаються в Python – модулем. Множина пов’язаних між собою модулів називають – пакетом. Програма обробки корпуса Brown це є приклад модуля, а множина програм для роботи зі всіма корпусами це є приклад пакету. NLTK це множина пакетів, яку називають бібліотекою.


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


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

  2. Виконати приклади, які використовуються в теоретичних відомостях.

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

    1. Використовуючи модуль corpus прочитайте текст austin-persuasion.txt. Визначить скільки tokens (слів) і type (унікальних слів)містить ця книжка.

    2. Напишіть, використовуючи модуль читання корпусу текстів Brown nltk.corpus.brown.words(), програму, яка дозволяє доступитися до фрагментів текстів у двох різних жанрах корпусу Brown, і назва яких відповідає першій літері прізвища і імені студента.

    3. Прочитайте тексти з корпусу State of the Union addresses використовуючи state_union модуль читання. Визначити частоту вживання слів men, women, people в кожному з документів. Як змінилася частота вживання цих слів з часом?.

    4. Використовуючи конкорданси поясніть відмінності у вживанні слова however на початку речення ("in whatever way", "to whatever extent", або "nevertheless”).

    5. Виберіть пару текстів і дослідіть відмінності між ними (кількість оригінальних слів, багатство мови, жанр). Знайдіть слова, які мають різний зміст в цих текстах, подібно до слова monstrous в Moby Dick та у Sense and Sensibility.

    6. Проаналізуйте таблицю частот модальних дієслів для різних жанрів. Спробуйте її пояснити. Знайдіть інші класи слів вживання яких також відрізняються в різних жанрах.

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

    8. Напишіть програму генерації таблиці відношень кількість слів/кількість оригінальних слів для всіх жанрів корпуса Brown. Проаналізуйте отримані результати та поясніть їх.

    9. Напишіть програму для знаходження 50 найчастотніших слів в тексті, за виключенням незначущих слів.

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

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

    12. Напишіть функцію word_freq(), яка приймає слово і назву частини корпуса Brown як аргументи і визначає частоту слова в заданій частині корпуса.

    13. Визначити функцію hedge(text), яка обробляє текст і створює нову версію цього тексту додаючи слово ‘like’ перед кожним третім словом.


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


Варіант

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

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

1

2

3

4

1

2

3

4

1

2

3

4

1

2

3

5

6

5

6

5

6

5

6

5

6

5

6

5

5

6

7

7

7

7

7

7

7

7

7

7

7

7

7

7

7

8

8

8

8

8

8

8

8

8

8

8

8

8

8

8

9

10

11

9

10

11

9

10

11

9

10

11

9

10

11

12

13

12

13

12

13

12

13

12

13

12

13

12

12

13







Варіант

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

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

1

2

3

4

1

2

3

4

1

2

3

1

2

3

4

5

6

5

6

5

6

5

6

5

6

5

6

5

5

6

7

7

7

7

7

7

7

7

7

7

7

7

7

7

7

9

10

9

10

11

9

10

11

9

10

11

9

9

10

11

13

12

13

12

13

12

13

12

13

12

13

12

13

12

13

8

8

8

8

8

8

8

8

8

8

8

8

8

8

8





^ ЗМІСТ ЗВІТУ


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


ДОДАТОК А


Сьогодні ми вивчили:

Приклади корпусів тексті та методи доступу до них.

Побудова умовного частотного розподілу

Поняття функції та модуля.


Функції побудови та відображення умовних частотних розподілів.


^ Приклад застосування

Опис

cfdist = ConditionalFreqDist(pairs)

Створити умовний частотний розподіл зі спису пар

cfdist.conditions()

Відсортований список умов

cfdist[condition]

Частотний розподіл для вказаної умови

cfdist[condition][sample]

Частота для вказаного прикладу та вказаної умови

cfdist.tabulate()

Представлення умовного частотного розподілу у вигляді таблиці

cfdist.tabulate(samples, conditions)

Представлення умовного частотного розподілу у вигляді таблиці для зазначених умов та прикладів

cfdist.plot()

Побудова графічного представлення умовного частотного розподілу

cfdist.plot(samples, conditions)

Побудова графічного представлення умовного частотного розподілу для зазначених умов та прикладів

cfdist1 < cfdist2

Порівняння частот для прикладів в різних умовних частотних розподілах.



^ ДОДАТОК В


Перелік корпусів тексті, які розповсюджуються разом з NLTK.


Corpus

Compiler

Contents

Brown Corpus

Francis, Kucera

15 genres, 1.15M words, tagged, categorized

CESS Treebanks

CLiC-UB

1M words, tagged and parsed (Catalan, Spanish)

Chat-80 Data Files

Pereira & Warren

World Geographic Database

CMU Pronouncing Dictionary

CMU

127k entries

CoNLL 2000 Chunking Data

CoNLL

270k words, tagged and chunked

CoNLL 2002 Named Entity

CoNLL

700k words, pos- and named-entity-tagged (Dutch, Spanish)

CoNLL 2007 Dependency Treebanks (sel)

CoNLL

150k words, dependency parsed (Basque, Catalan)

Dependency Treebank

Narad

Dependency parsed version of Penn Treebank sample

Floresta Treebank

Diana Santos et al

9k sentences, tagged and parsed (Portuguese)

Gazetteer Lists

Various

Lists of cities and countries

Genesis Corpus

Misc web sources

6 texts, 200k words, 6 languages

Gutenberg (selections)

Hart, Newby, et al

18 texts, 2M words

Inaugural Address Corpus

CSpan

US Presidential Inaugural Addresses (1789-present)

Indian POS-Tagged Corpus

Kumaran et al

60k words, tagged (Bangla, Hindi, Marathi, Telugu)

MacMorpho Corpus

NILC, USP, Brazil

1M words, tagged (Brazilian Portuguese)

Movie Reviews

Pang, Lee

2k movie reviews with sentiment polarity classification

Names Corpus

Kantrowitz, Ross

8k male and female names

NIST 1999 Info Extr (selections)

Garofolo

63k words, newswire and named-entity SGML markup

NPS Chat Corpus

Forsyth, Martell

10k IM chat posts, POS-tagged and dialogue-act tagged

PP Attachment Corpus

Ratnaparkhi

28k prepositional phrases, tagged as noun or verb modifiers

Proposition Bank

Palmer

113k propositions, 3300 verb frames

Question Classification

Li, Roth

6k questions, categorized

Reuters Corpus

Reuters

1.3M words, 10k news documents, categorized

Roget's Thesaurus

Project Gutenberg

200k words, formatted text

RTE Textual Entailment

Dagan et al

8k sentence pairs, categorized

SEMCOR

Rus, Mihalcea

880k words, part-of-speech and sense tagged

Senseval 2 Corpus

Pedersen

600k words, part-of-speech and sense tagged

Shakespeare texts (selections)

Bosak

8 books in XML format

State of the Union Corpus

CSPAN

485k words, formatted text

Stopwords Corpus

Porter et al

2,400 stopwords for 11 languages

Swadesh Corpus

Wiktionary

comparative wordlists in 24 languages

Switchboard Corpus (selections)

LDC

36 phonecalls, transcribed, parsed

Univ Decl of Human Rights

United Nations

480k words, 300+ languages

Penn Treebank (selections)

LDC

40k words, tagged and parsed

TIMIT Corpus (selections)

NIST/LDC

audio files and transcripts for 16 speakers

VerbNet 2.1

Palmer et al

5k verbs, hierarchically organized, linked to WordNet

Wordlist Corpus

OpenOffice.org et al

960k words and 20k affixes for 8 languages

WordNet 3.0 (English)

Miller, Fellbaum

145k synonym sets



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


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


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

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

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

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




Схожі:




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