4718

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

Лабораторная работа

Информатика, кибернетика и программирование

Вивчення основ програмування на мові Python. Вивчення методів доступу до корпусів текстів. Вивчення класу ConditionalFreqDist. Виконання лабораторних робіт починаємо з: import nltk from nltk.book import Короткі теорет...

Украинкский

2012-11-25

1004 KB

13 чел.

Мета робота

  •  Вивчення основ програмування на мові Python.
  •  Вивчення методів доступу до корпусів текстів.
  •  Вивчення класу ConditionalFreqDist.

Виконання лабораторних робіт починаємо з:

import nltk

from nltk.book import *

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

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

1. Клас FreqDist  для простих статистичних досліджень

>>> import nltk

>>> from nltk.book import *

*** Introductory Examples for the NLTK Book ***

Loading text1, ..., text9 and sent1, ..., sent9

Type the name of the text or sentence to view it.

Type: 'texts()' or 'sents()' to list the materials.

text1: Moby Dick by Herman Melville 1851

text2: Sense and Sensibility by Jane Austen 1811

text3: The Book of Genesis

text4: Inaugural Address Corpus

text5: Chat Corpus

text6: Monty Python and the Holy Grail

text7: Wall Street Journal

text8: Personals Corpus

text9: The Man Who Was Thursday by G . K . Chesterton 1908

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

Частотний розподіл вказує на частоту з якою в тексті зустрічається кожне зі слів. Такий частотний список називають розподілом тому, що він вказує яким чином загальна кількість слів розподіляється між словниковими статями (оригінальні слова) в тексті.

Враховуючи, що побудова частотних розподілів часто необхідна при обробці природної мови в NLTK реалізовано окремий клас FreqDist в модулі nltk.probability.

Застосуємо цей клас для знаходження 50 найчастотніших слів в тексті Moby Dick.

>>> fdist=FreqDist(text1) #назва тексту вказується як аргумент класу

>>> fdist    #підрахунок загальної кількості слів

<FreqDist with 260819 outcomes>

>>> vocab=fdist.keys()# встановлення списку оригінальних слів тексту і сортування їх за кількістю у тексті

>>> vocab[:50]    #перегляд перших 50 найуживаніших слів

[',', 'the', '.', 'of', 'and', 'a', 'to', ';', 'in', 'that', "'", '-', 'his', 'it', 'I', 's', 'is', 'he', 'with', 'was', 'as', '"', 'all', 'for', 'this', '!', 'at', 'by', 'but', 'not', '--', 'him', 'from', 'be', 'on', 'so', 'whale', 'one', 'you', 'had', 'have', 'there', 'But', 'or', 'were', 'now', 'which', '?', 'me', 'like']

>>>

>>> fdist1['the']

13721

>>> fdist1['of']

6536

>>> fdist1['with']

1659

>>> fdist1['whale']

906

>>>

Серед цих 50 слів тільки одне дає певну інформацію про текст (whale) і це слово зустрічається в тексті 906 раз. Всі інші слова  є не інформативними, або службовими.

Для визначення, яку частину тексту займають службові слова знайдемо їх сумарну частоту побудувавши графік (Рис.1.) за допомогою fdist.plot(50)

Рис.1. Частотний розподіл 50 слів тексту Moby Dick.

Якщо найбільш частотні слова не дають уяви про текст то спробуємо за допомогою fdist1.hapaxes() побудувати список слів які зустрічаються тільки один раз.

>>> word_1=fdist.hapaxes()

>>> len(word_1)

9002

>>> word_1[:50]

['funereal', 'unscientific', 'prefix', 'plaudits', 'woody', 'disobeying', 'Westers', 'DRYDEN', 'Untried', 'superficially', 'Western', 'Spurn', 'treasuries', 'invasion', 'powders', 'tinkerings', 'bolting', 'stabbed', 'elevations', 'ferreting', 'wooded', 'songster', 'Saco', 'clings', 'Winding', 'Sands', 'ornamental', 'charter', 'puissant', 'miller', 'cordially', 'railing', 'mail', 'Hecla', 'compliance', 'haughtily', 'relieving', 'BERMUDAS', 'contributed', 'shamble', 'fossil', 'sneering', 'artificialness', 'avers', 'intellects', 'Plate', 'gayer', 'Fiery', 'primogenitures', 'gaffs']

В даному тексті таких 9002 слова і серед них є такі слова як: exicographer, cetological, contraband, expostulations . Деякі слова без контексту тяжко зрозуміти і вони також не дають уяву про текст.

1.1.Вибір слів з тексту

Спробуємо знайти найдовші слова сподіваючись що вони є більш інформативними:

>>> V = set(text1)

>>> long_words = [w for w in V if len(w) > 15]

>>> sorted(long_words)

['CIRCUMNAVIGATION', 'Physiognomically', 'apprehensiveness', 'cannibalistically',

'characteristically', 'circumnavigating', 'circumnavigation', 'circumnavigations',

'comprehensiveness', 'hermaphroditical', 'indiscriminately', 'indispensableness',

'irresistibleness', 'physiognomically', 'preternaturalness', 'responsibilities',

'simultaneousness', 'subterraneousness', 'supernaturalness', 'superstitiousness',

'uncomfortableness', 'uncompromisedness', 'undiscriminating', 'uninterpenetratingly']

>>>

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

Виконати самостійно:

Виконати попередній приклад для інших текстів зміннючи довжину слів. Результати порівняти і пояснити.

Повертаючись до задачі пошуку характерних для текста слів зазначимо, що довгі слова в тексті№4 constitutionally, transcontinental вказують на його державницький характер а довгі слова тексту№5 boooooooooooglyyyyyy and yuuuuuuuuuuuummmmmmmmmmmm вказують на його неформальний характер. Але довгі слова часто зустрічаються в тексті тільки один раз і тому потрібно знайти ті довгі слова які зустрічаються в тексті з певною частотою. Одночасно ми уникаємо врахування коротких не нформативних слів а також уникаємо врахування довгих але рідкісних слів. В наступному прикладі показано, як з текста №5 вибираються слова які мають довжину більше ніж 7 символів і зустрічаються в тесті більше ніж 7 разів.

>>> fdist5 = FreqDist(text5)

>>> sorted([w for w in set(text5) if len(w) > 7 and fdist5[w] > 7])

['#14-19teens', '#talkcity_adults', '((((((((((', '........', 'Question',

'actually', 'anything', 'computer', 'cute.-ass', 'everyone', 'football',

'innocent', 'listening', 'remember', 'seriously', 'something', 'together',

'tomorrow', 'watching']

>>>

1.2. Колокації та біграми

Колокація (collocation)  позначає стійку фразеологічну одиницю, тобто це словосполучення, яке зустрічається набагато частіше, ніж його складові по окремості. Наприклад, red wine –це колокація а the wine – ні . Характерною рисою колокацій є те що вони є стійкі до заміни одного зі слів на інше подібне за змістом (maroon wine).

Для того щоб побудувати колокації спочатку потрібно побудувати на основі тексту пари слів, або біграми. Для цього можна використати функцію bigrams(): 

>>> bigrams(['more', 'is', 'said', 'than', 'done'])

[('more', 'is'), ('is', 'said'), ('said', 'than'), ('than', 'done')]

>>>

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

>>> text4.collocations()

Building collocations list

United States; fellow citizens; years ago; Federal Government; General

Government; American people; Vice President; Almighty God; Fellow

citizens; Chief Magistrate; Chief Justice; God bless; Indian tribes;

public debt; foreign nations; political parties; State governments;

National Government; United Nations; public money

>>> text8.collocations()

Building collocations list

medium build; social drinker; quiet nights; long term; age open;

financially secure; fun times; similar interests; Age open; poss

rship; single mum; permanent relationship; slim build; seeks lady;

Late 30s; Photo pls; Vibrant personality; European background; ASIAN

LADY; country drives

>>>

Колокації є характерними для текстів різних тематик та жанрів.

Крім підрахунку окремих слів цікаво також здійснити підрахунок довжин слів в тексті використовуючи FreqDist.

>>> [len(w) for w in text1] # будуємо список довжин слів в тексті

[1, 4, 4, 2, 6, 8, 4, 1, 9, 1, 1, 8, 2, 1, 4, 11, 5, 2, 1, 7, 6, 1, 3, 4, 5, 2, ...]

>>> fdist = FreqDist([len(w) for w in text1]) # підрахунок кількості вживань слів різної довжини

>>> fdist  # розподіл в якому довжині слова відповідає кількість таких слів в тексті

<FreqDist with 260819 outcomes>

>>> fdist.keys()

[3, 1, 4, 2, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 20]

>>>

Бачимо, що в тексті зустрічаються слова різної довжини від 1 до 20 символів. Частоту різних довжин слів можна переглянути:

>>> fdist.items()

[(3, 50223), (1, 47933), (4, 42345), (2, 38513), (5, 26597), (6, 17111), (7, 14399),

(8, 9966), (9, 6428), (10, 3528), (11, 1873), (12, 1053), (13, 567), (14, 177),

(15, 70), (16, 22), (17, 12), (18, 1), (20, 1)]

>>> fdist.max()

3

>>> fdist[3]

50223

>>> fdist.freq(3)

0.19255882431878046

>>>

Найчастіше зустрічаються слова з довжиною 3 символи і такі слова становлять близько 20% всього тексту. Можна здійснити аналіз довжин слів для текстів різних жанрів, авторів та мов.

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

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

Для того щоб доступитися до корпусів перед початком роботи слід їх імпортувати

>>> import nltk

>>> from nltk.corpus import *

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

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

fileids() – назви файлів у корпусі

>>> 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')

2.1.1. Конкорданс

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

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

Для побудови конкордансу слова "surprize" у тексті 'austen-emma.txt' необхідно використати наступні вирази:

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

>>> emma.concordance("surprize")

Building index...

Displaying 25 of 37 matches:

er father , was sometimes taken by surprize at his being still able to pity `

hem do the other any good ." " You surprize me ! Emma must do Harriet good : a

Knightley actually looked red with surprize and displeasure , as he stood up ,

r . Elton , and found to his great surprize , that Mr . Elton was actually on

d aid ." Emma saw Mrs . Weston ' s surprize , and felt that it must be great ,

father was quite taken up with the surprize of so sudden a journey , and his f

y , in all the favouring warmth of surprize and conjecture . She was , moreove

…..

>>>

2.1.2. Статистичні дані про текст

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

Побудуємо цикл по змінній 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', ...], ...]

2.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', '.']

2.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.

2.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', ...]

2.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', ...]

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

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

2.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 мов) Декларації прав людини.

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

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

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

3.1. Засоби NLTK

Засоби 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', ...], ...]

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

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

['<!', 'DOCTYPE', 'HTML', 'PUBLIC', '"-//', 'W3C', ...]

В наступному прикладі показано яким чином можна доступитися до локальної копії корпуса 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', '.']

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

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

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

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

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

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

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

4.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

<ConditionalFreqDist with 2 conditions>

>>> cfd.conditions()     #2

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

>>> cfd['news']      #3

<FreqDist with 100554 outcomes>

>>> cfd['romance']

<FreqDist with 70022 outcomes>

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

Додаток А

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

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

Функції класу FreqDist

Приклад

Пояснення

fdist = FreqDist(samples)

Побудувати частотний розподіл на основі даних samples

fdist.inc(sample)

Збільшити значення для даного випадку sample

fdist['monstrous']

Скільки разів зустрічається даний прикладsample

fdist.freq('monstrous')

Частота для даного прикладу sample

fdist.N()

Загальна кількість врахованих випадків

fdist.keys()

Приклади відсортовані за частотою по спаданню

for sample in fdist:

Перебір всіх прикладів за частотою по спаданню

fdist.max()

Приклад з максимальною кількістю

fdist.tabulate()

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

fdist.plot()

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

fdist.plot(cumulative=True)

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

fdist1 < fdist2

Перевірка чи приклади  fdist1 зустрічаються з меншою частотою ніж в fdist2

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

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

Опис

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

Порядок виконання роботи

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.  Побудуйте колокації для текстів №1 та №9. Результати порівняйте.
  13.  Побудуйте колокації для текстів №2 та №4. Результати порівняйте.

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

Зміст звіту

  1.  Титульний аркуш.
  2.  Мета роботи.
  3.  Короткі теоретичні відомості.
  4.  Тексти програм на мові Python.
  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.


 

А также другие работы, которые могут Вас заинтересовать

19365. Мито. Ставки, пільги, порядок сплати до бюджету 111.02 KB
  Тема 4: Мито Види мита Платники та об’єкт оподаткування Ставки пільги порядок сплати до бюджету. Види: За напрямками руху товарів Ввізне Вивізне Сезонне митона 4 місяці Особливі видизахист виробника від конкуренції з іноземними товарами Сп
19366. Податок на прибуток підприємств 112.08 KB
  Тема 5: Податок на прибуток підприємств Загальна характеристика податку на прибуток Платники та об’єкт оподаткування Склад доходів та порядок їх визнання Склад витрат та порядок їх визнання Порядок нарахування амортизації Ставки податку на прибуток ...
19367. Податок на доходи фізичних осіб 129.21 KB
  Тема 6: Податок на доходи фізичних осіб Платники та об’єкт оподаткування Види доходів що включаються і не включаються до загального оподатковуваного доходу Податкові соціальні пільги Податкова знижка Ставки податку та особливості оподакування окре...
19368. Плата за землю 113.24 KB
  Тема 7: Плата за землю Загальна характеристика плати за землю Платники об’єкт оподаткування та ставки плати за землю Пільги щодо сплати за землю порядок сплати до бюджету 24 зведеного бюджету Платники: Фізичні особи – власники землі і землекористу...
19369. Екологічне оподаткування 132.41 KB
  Тема 8: Екологічне оподаткування Система екологічного оподаткування Екологічний податок Збір за першу реєстрацію транспортного засобу Рентна плата за нафту природний газ і газовий конденсат що видобуваються в Україні Рентна плата за транспорттуванн
19370. Платежі за ресурси 112.72 KB
  Тема 9: Платежі за ресурси Збір за спеціальне використання води Збір за використання лісових ресурсів Плата за користування ресурсами Збір за користування радіочастотним ресурсом Платники збору – водокористувачі: Юридичні особи Фізичні особи – підп
19371. Міни спеціального призначення 28.5 KB
  Міни спеціального призначення: а освітлювальна міна б димова міна Основні складові частини: оболонка; запалюючий стакан; вибуховий заряд; димоутворююча речовина; стабілізатор; виштовхуючий заряд; діафрагма; смолоскип; парашут; нап...
19372. Дивизионная артиллерийская ремонтная мастерская ДАРМ-70 38 KB
  Дивизионная артиллерийская ремонтная мастерская ДАРМ70 Предназначена для проведения текущего ремонта артиллерийского вооружения в полевых условиях. Принята на вооружение в 1975 г. в начале 80х гг. появился несколько улучшенный вариант ДАРМ70М.ДАРМ70 состоит на осна...
19373. Автоматичні лінії з агрегатних верстатів та нормалізованих вузлів 86.5 KB
  ЛАБОРАТОРНА РОБОТА №1 Автоматичні лінії з агрегатних верстатів та нормалізованих вузлів. Мета роботи: 1. Ознайомлення з роботою лінії та її устаткуванням. 2. Вивчення принципу керування і послідовності роботи механізму лінії. 3. Вивчення конструкції та принципу ді