МІНІСТЕРСТВО ОСВІТИ І НАУКИ УКРАЇНИ
НАЦІОНАЛЬНИЙ УНІВЕРСИТЕТ “ЛЬВІВСЬКА ПОЛІТЕХНІКА”
ІНСТИТУТ КОМП’ЮТЕРНИХ НАУК ТА ІНФОРМАЦІЙНИХ ТЕХНОЛОГІЙ
Кафедра “Системи автоматизованого проектування”
/
ВИВЧЕННЯ БІБЛІОТЕКИ ПРИКЛАДНИХ ПРОГРАМ NLTK, ДЛЯ ОПРАЦЮВАННЯ ТЕКСТІВ ПРИРОДНОЮ МОВОЮ.
ДОСТУП ТА РОБОТА З КОРПУСАМИ ТЕКСТІВ.
Методичні вказівки до лабораторної роботи № 3
з дисципліни “Комп’ютерна лінгвістика”
для студентів спеціальності 8.030005 “Прикладна лінгвістика”.
Затверджено
на засіданні кафедри
“Системи автоматизованого проектування”
Протокол № __ від ________ р.
на засіданні методичної ради ІКНІ
Протокол № _____ від _______ р.
ВАК № _____ від ___________ р.
Львів-2018
ВИВЧЕННЯ БІБЛІОТЕКИ ПРИКЛАДНИХ ПРОГРАМ NLTK, ДЛЯ ОПРАЦЮВАННЯ ТЕКСТІВ ПРИРОДНОЮ МОВОЮ. ДОСТУП ТА РОБОТА З КОРПУСАМИ ТЕКСТІВ. Методичні вказівки до лабораторної роботи №3 з дисципліни “Комп’ютерна лінгвістика” для студентів спеціальності 8.030005 “Прикладна лінгвістика” для стаціонарної та заочної форм навчання/Укл. Д.В.Корпильов. - Львів: Національний університет ”Львівська політехніка”, 2018. - 28с.
Укладачі: Корпильов Д.В., ст. викладач
Відповідальний за випуск: Лобур М. В., доктор технічних наук, професор
Рецензенти: Каркульовський В. І., канд. техн. наук, доцент
Зміст
МЕТА РОБОТА 4
КОРОТКІ ТЕОРЕТИЧНІ ВІДОМОСТІ 4
1.Доступ до корпусів текстів. 4
1.1. Корпус Гутенберга. 4
1.2 Текст з Інтернету. 8
1.3 Корпус Brown 9
1.4 Корпус інформаційного агентства Рейтер. 10
1.5 Корпус інаугураційних примов президентів США. 11
1.6 Анотовані (розмічені) корпуси текстів. 12
1.7 Корпуси іншомовних текстів. 12
1.8 Структура корпусів текстів. 13
1.9 Доступ до власних корпусів текстів. 14
2. Умовний частотний розподіл. Клас ConditionalFreqDist. 16
2.1 Умови і події. 16
2.2 Підрахунок слів для окремих жанрів. 17
3. Використання текстового редактора при створенні програм. 19
3.1. Поняття функції та модуля. 20
ПОРЯДОК ВИКОНАННЯ РОБОТИ 21
ЗМІСТ ЗВІТУ 23
ЛІТЕРАТУРА 24
ДОДАТОК А 25
ДОДАТОК В 26
МЕТА РОБОТА
Вивчення основ програмування на мові Python.
Вивчення методів доступу до корпусів текстів.
Вивчення класу ConditionalFreqDist.
КОРОТКІ ТЕОРЕТИЧНІ ВІДОМОСТІ
Вирішення задач обробки текстів природною мовою передбачає використання великих об’ємів лінгвістичних даних, або інишими словами передбачає роботу з корпусами текстів. Виконання даної лабораторної роботи допоможе знайти відповідь на наступні питання: які є відомі корпуси текстів та лексичні ресурси і як отримати до них доступ використовуючи Python; які корисні конструкції має Python для виконання цієї роботи.
1.Доступ до корпусів текстів.
Корпус текстів це великий набір текстів. Багато корпусів розроблені їз збереженням балансу між текстами різних жанрів, або авторів. В попередній лабораторній роботі ми працювали з промовами президентів США, які є частиною корпуса US Presidential Inaugural Addresses. З промовами ми працювали, як з одним текстом не зважаючи на те, що кожна промова має окремого автора.Обробку ми здійснювали . При роботі з копусами важливо мати засоби доступу як до окремих тексті так і до окремих частин цих тексів а також і до окремих слів.
1.1. Корпус Гутенберга.
В NLTK входить невелика частина текстів з електронного архіву текстів Project Gutenberg , який містить 25000 безкоштовних електронних книжок різних авторів (http://www.gutenberg.org/). Тексти творів в окремих файлах. Для одержання назв файлів (ідентифікаторів файлів) в яких зберігаються текстів потрібно використати наступну функцію:
Лістинг №1
>>> 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 і можемо знайти скільки слів має цей текст.
Лістинг №2
>>> emma = nltk.corpus.gutenberg.words('austen-emma.txt')
>>> len(emma)
192427
/
/
При створенні змінної emma було використано функцію words() об’єкта gutenberg пакета corpus бібліотеки NLTK. Аналогічний результат можна досягнути використавши більш компактний запис констркуцій Python.
Лістинг №3
>>> from nltk.corpus import gutenberg
>>> gutenberg.fileids()
['austen-emma.txt', 'austen-persuasion.txt', 'austen-sense.txt', ...]
>>> emma = gutenberg.words('austen-emma.txt')
Для побудови конкордансу необхідно використати наступні вирази:
Лістинг №4
>>> emma = nltk.Text(nltk.corpus.gutenberg.words('austen-emma.txt'))
>>> emma.concordance("surprize")
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
he appeared , to have her share of surprize , introduction , and pleasure . Th
ir plans ; and it was an agreeable surprize to her , therefore , to perceive t
talking aunt had taken me quite by surprize , it must have been the death of m
f all the dialogue which ensued of surprize , and inquiry , and congratulation
the present . They might chuse to surprize her ." Mrs . Cole had many to agre
the mode of it , the mystery , the surprize , is more like a young woman ' s s
to her song took her agreeably by surprize -- a second , slightly but correct
" " Oh ! no -- there is nothing to surprize one at all .-- A pretty fortune ;
t to be considered . Emma ' s only surprize was that Jane Fairfax should accep
of your admiration may take you by surprize some day or other ." Mr . Knightle
ation for her will ever take me by surprize .-- I never had a thought of her i
expected by the best judges , for surprize -- but there was great joy . Mr .
sound of at first , without great surprize . " So unreasonably early !" she w
d Frank Churchill , with a look of surprize and displeasure .-- " That is easy
; and Emma could imagine with what surprize and mortification she must be retu
tled that Jane should go . Quite a surprize to me ! I had not the least idea !
. It is impossible to express our surprize . He came to speak to his father o
g engaged !" Emma even jumped with surprize ;-- and , horror - struck , exclai
>>>
Спробуємо написати невелику програму для одержання інформації про кожен текст з корпуса. Побудуємо цикл по змінній fileid, яка відповідає ідентифікатору файла з текстом, і на кожному кроці будемо визначати деяку статистичну інформацію, яку для компактності запису будемо відображати цілими числами int().
Лістинг №5
>>> 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 24 26 austen-emma.txt
4 26 16 austen-persuasion.txt
4 28 22 austen-sense.txt
4 33 79 bible-kjv.txt
4 19 5 blake-poems.txt
4 19 14 bryant-stories.txt
4 17 12 burgess-busterbrown.txt
4 20 12 carroll-alice.txt
4 20 11 chesterton-ball.txt
4 22 11 chesterton-brown.txt
4 18 10 chesterton-thursday.txt
4 20 24 edgeworth-parents.txt
4 25 15 melville-moby_dick.txt
4 52 10 milton-paradise.txt
4 11 8 shakespeare-caesar.txt
4 12 7 shakespeare-hamlet.txt
4 12 6 shakespeare-macbeth.txt
4 36 12 whitman-leaves.txt
>>>
Операція ділення дає цілочисленні результати (з округленням). Для одержання результатів без округлення потрібно використати from __future__ import division
Лістинг №6
>>> 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((num_chars/num_words), (num_words/num_sents),(num_words/num_vocab), fileid)
...
4.609909212324673 24.822884416924666 26.201933551198255 austen-emma.txt
4.749793727271801 26.19989324793168 16.82450728363325 austen-persuasion.txt
4.753785952421314 28.32086417283457 22.11088552241137 austen-sense.txt
4.286881563819072 33.57319868451649 79.16143181640166 bible-kjv.txt
4.567033756284415 19.073059360730593 5.442345276872964 blake-poems.txt
>>>
Дана програма відображає наступні статистичні дані для кожного з текстів: середня довжина слова; середня довжина речення; значення лексичної різноманітності (відношення загальної кількості слів до кільності оригінальних слів). Числові значення (однакові для всіх текстів) вказують, що для англійської мови середнє значення довжини слова становить 4 символи (насправді 3 оскільки змінна num_chars включає і пробіли). На відміну від довжини слова наступні числові значення відрізняються і є до певної міри характерними для різних авторів.
В попередньому прикладі використовувалась функція .raw() для доступу до тексту книжки, без його поділу на окремі слова. Ця функція дозволяє доступитися до вмісту файла без будь-якої його попередньої лінгвістичної обробки. Тому використання len(gutenberg.raw('blake-poems.txt') дозволяє встановити скільки символів (разом з пробілами) є в тексті. Функція .sents() ділить текст на окремі речення і кожне речення представляється, як список стрічок, де стічки – окремі слова.
Лістинг №7
>>> macbeth_sentences = gutenberg.sents('shakespeare-macbeth.txt')
>>> macbeth_sentences
[['[', 'The', 'Tragedie', 'of', 'Macbeth', 'by', 'William', 'Shakespeare', '1603', ']'], ['Actus', 'Primus', '.'], ...]
>>> macbeth_sentences[1037]
['Good', 'night', ',', 'and', 'better', 'health', 'Attend', 'his', 'Maiesty']
>>> 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', '(', 'Worthie', 'to', 'be', 'a', 'Rebell', ',', 'for', 'to', 'that', 'The', 'multiplying', 'Villanies', 'of', 'Nature', 'Doe', 'swarme', 'vpon', 'him', ')', 'from', 'the', 'Westerne', 'Isles', 'Of', 'Kernes', 'and', 'Gallowgrosses', 'is', 'supply', "'", 'd', ',', 'And', 'Fortune', 'on', 'his', 'damned', 'Quarry', 'smiling', ',', 'Shew', "'", 'd', 'like', 'a', 'Rebells', 'Whore', ':', 'but', 'all', "'", 's', 'too', 'weake', ':', 'For', 'braue', 'Macbeth', '(', 'well', 'hee', 'deserues', 'that', 'Name', ')', 'Disdayning', 'Fortune', ',', 'with', 'his', 'brandisht', 'Steele', ',', 'Which', 'smoak', "'", 'd', 'with', 'bloody', 'execution', '(', 'Like', 'Valours', 'Minion', ')', 'caru', "'", 'd', 'out', 'his', 'passage', ',', 'Till', 'hee', 'fac', "'", 'd', 'the', 'Slaue', ':', 'Which', 'neu', "'", 'r', 'shooke', 'hands', ',', 'nor', 'bad', 'farwell', 'to', 'him', ',', 'Till', 'he', 'vnseam', "'", 'd', 'him', 'from', 'the', 'Naue', 'toth', "'", 'Chops', ',', 'And', 'fix', "'", 'd', 'his', 'Head', 'vpon', 'our', 'Battlements']]
>>>
1.2 Текст з Інтернету.
Project Gutenberg включає тисячі книжок і він представляє літературну мову. Для роботи з менш формальною мовою NLTK містить набір текстів з Інтернету: тексти з форуму, тексти з фільму “Пірати карибського моря”, тексти особистих оголошень,телефонні розмови, огляд вин:
Лістинг №8
>>> 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 року.
Лістинг №9
>>> 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 можна отримати доступ до цього корпусу, як до списку слів або списку речень (кожне речення – список слів). Також доступна можливість вибору текстів окремої категорії або з окремого файлу.
Лістинг №10
>>> 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', 'Grand', 'Jury', 'said', 'Friday', 'an', 'investigation', 'of', "Atlanta's", 'recent', 'primary', 'election', 'produced', '``', 'no', 'evidence', "''", 'that', 'any', 'irregularities', 'took', 'place', '.'], ['The', 'jury', 'further', 'said', 'in', 'term-end', 'presentments', 'that', 'the', 'City', 'Executive', 'Committee', ',', 'which', 'had', 'over-all', 'charge', 'of', 'the', 'election', ',', '``', 'deserves', 'the', 'praise', 'and', 'thanks', 'of', 'the', 'City', 'of', 'Atlanta', "''", 'for', 'the', 'manner', 'in', 'which', 'the', 'election', 'was', 'conducted', '.'], ...]
>>>
Корпус Brown – зручний ресурс для систематичного вивчення відмінностей між жанрами, або іншими словами для дослідження стилістики текстів. Спробуємо порівняти жанри і встановити, яким чином в текстах різних жанрів використовуються модальні дієслова. Для цього потрібно зробити підрахунки вживання різних модальних дієслів для різних жанрів.
Лістинг №11
>>> 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 темами і поділені на два набори (тренування та тестування). Такий поділ необхідний для тренування та тестування алгоритмів автоматичного визначення тематики тексту.
Лістинг №12
>>> 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 можна звернутися до тем, яких торкаються в одному або декількох текстах або навпаки дізнатися весь перелік текстів, які належать до певної категорії.
Лістинг №13
>>> 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', ...]
Корпус інаугураційних примов президентів США.
Знайомлячись з бібліотекою програм NLTK ми працювали з цим корпусом і розглядали весь корпус як один текст, що давало можливість знайти місце окремого слова в текстах промов починаючи від першого слова першої промови. Насправді корпус це набір 55 текстів, кожен з яких є промовою одного президента. Цікавою особливістю цього корпуса є можливість дослідити розподіл текстів за часовими проміжками. Назва кожного тексту містить рік проголошення промови і відповідно є можливість доступитися до цієї інформації , доступившись до перших чотирьох символів назви файлу [fileid[:4].
Лістинг №14
>>> from nltk.corpus import inaugural
>>> inaugural.fileids()
['1789-Washington.txt', '1793-Washington.txt', '1797-Adams.txt', '1801-Jefferson.txt', '1805-Jefferson.txt', '1809-Madison.txt', '1813-Madison.txt', '1817-Monroe.txt', '1821-Monroe.txt', '1825-Adams.txt', '1829-Jackson.txt', '1833-Jackson.txt', '1837-VanBuren.txt', '1841-Harrison.txt', '1845-Polk.txt', '1849-Taylor.txt', '1853-Pierce.txt', '1857-Buchanan.txt', '1861-Lincoln.txt', '1865-Lincoln.txt', '1869-Grant.txt', '1873-Grant.txt', '1877-Hayes.txt', '1881-Garfield.txt', '1885-Cleveland.txt', '1889-Harrison.txt', '1893-Cleveland.txt', '1897-McKinley.txt', '1901-McKinley.txt', '1905-Roosevelt.txt', '1909-Taft.txt', '1913-Wilson.txt', '1917-Wilson.txt', '1921-Harding.txt', '1925-Coolidge.txt', '1929-Hoover.txt', '1933-Roosevelt.txt', '1937-Roosevelt.txt', '1941-Roosevelt.txt', '1945-Roosevelt.txt', '1949-Truman.txt', '1953-Eisenhower.txt', '1957-Eisenhower.txt', '1961-Kennedy.txt', '1965-Johnson.txt', '1969-Nixon.txt', '1973-Nixon.txt', '1977-Carter.txt', '1981-Reagan.txt', '1985-Reagan.txt', '1989-Bush.txt', '1993-Clinton.txt', '1997-Clinton.txt', '2001-Bush.txt', '2005-Bush.txt', '2009-Obama.txt']
>>> [fileid[:4] for fileid in inaugural.fileids()]
['1789', '1793', '1797', '1801', '1805', '1809', '1813', '1817', '1821', '1825', '1829', '1833', '1837', '1841', '1845', '1849', '1853', '1857', '1861', '1865', '1869', '1873', '1877', '1881', '1885', '1889', '1893', '1897', '1901', '1905', '1909', '1913', '1917', '1921', '1925', '1929', '1933', '1937', '1941', '1945', '1949', '1953', '1957', '1961', '1965', '1969', '1973', '1977', '1981', '1985', '1989', '1993', '1997', '2001', '2005', '2009']
>>>
1.6 Анотовані (розмічені) корпуси текстів.
Більшість корпусів текстів є лінгвістично анотованими, тобто містять різного типу розмітку – морфологічну, синтаксичну, семантичну, в них можуть бути виділені власні назви, вказані семантичні ролі і т.п. NLTK забезпечує способи доступу до багатьох корпусів і розповсюджується з цими корпусами або їх фрагментами (при використанні NLTK всі корпуси по замовчуванню повинні зберігатися за наступним шляхом C:\nltk_data\corpora (C:\Users\korpy_000\AppData\Roaming\nltk_data\corpora)). В Додатку В наведений перелік доступних корпусів текстів та їх короткий опис.
1.7 Корпуси іншомовних текстів.
NLTK включає та має засоби роботи з корпусами текстів іншими мовами крім англійської. Для роботи з цими корпусами потрібно попередньо ознайомитися з питаннями кодування символів в Python (Лабораторна робота №4).
Лістинг №15
>>> 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')
['पूर्ण', 'प्रतिबंध', 'हटाओ', ':', 'इराक', 'संयुक्त', ...]
>>> 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:]
['Saben', 'umat', 'manungsa', 'lair', '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 корпуса текстів
Відмінності між методами доступу до корпусів можна проілюструвати наступним прикладом.
Лістинг №16
>>> 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. Потрібно знати розміщення файлів на диску. (в прикладі шлях наступний 'C:/Project/WindowsMEMSAplication’) Змінній присвоюється це значення (#1). Клас PlaintextCorpusReader має два параметри шлях до файлів та шаблон вибору файлів (#2) і повертає список назв файлів.
Лістинг №17
>>> import nltk
>>> from nltk.corpus import PlaintextCorpusReader
>>> corpus_root = 'C:/Project/WindowsMEMSAplication' /
>>> wordlists = PlaintextCorpusReader(corpus_root, '.*') /
>>> print(wordlists.fileids())
['MEMS.mdb', 'NLTK Book.html', 'NLTK Book_files/default.css', 'Programming the Finite Element Method, Fifth Edition/16.810_L4_CAE.pdf', 'Programming the Finite Element Method, Fifth Edition/5 (1).pdf', 'Programming the Finite Element Method, Fifth Edition/5.pdf', 'Programming the Finite Element Method, Fifth Edition/6-5_zenkevich_1975.pdf', 'Programming the Finite Element Method, Fifth Edition/658_0.pdf', 'Programming the Finite Element Method, Fifth Edition/9903231.pdf', 'Programming the Finite Element Method, Fifth Edition/Computer Programming.pdf', 'Programming the Finite Element Method, Fifth Edition/Finite Element Methods.pdf', 'Programming the Finite Element Method, Fifth Edition/Iglin_Shape_Optim.pdf', 'Programming the Finite Element Method, Fifth Edition/L-G-0003967953-0002476231.pdf', 'Programming the Finite Element Method, Fifth Edition/Preparata,Sheimos,Vychislitelnaya geometriya, 1989.pdf', 'Programming the Finite Element Method, Fifth Edition/SkvortsovAV-2002-01.Book(Trn) (1).pdf', 'Programming the Finite Element Method, Fifth Edition/SkvortsovAV-2002-01.Book(Trn).pdf', 'Programming the Finite Element Method, Fifth Edition/The Finite Element Method Vol3 - Fluid Dynamics - R. Taylor.pdf', 'Programming the Finite Element Method, Fifth Edition/Zienkiewicz O_C_, Taylor R_L_ Vol_ 1_ The finite element met.pdf', 'Programming the Finite Element Method, Fifth Edition/andreev_finit_diff.pdf', 'Programming the Finite Element Method, Fifth Edition/art1_2.pdf', 'Programming the Finite Element Method, Fifth Edition/beginning-visual-c-2010.pdf', 'Programming the Finite Element Method, Fifth Edition/diplom.pdf', 'Programming the Finite Element Method, Fifth Edition/e-maxx_algo.pdf', 'Programming the Finite Element Method, Fifth Edition/fmatter.pdf', 'Programming the Finite Element Method, Fifth Edition/linq.pdf', 'Programming the Finite Element Method, Fifth Edition/manual.pdf', 'Programming the Finite Element Method, Fifth Edition/seminar2.pdf', 'Programming the Finite Element Method, Fifth Edition/ulstu2011-36.pdf', 'Programming the Finite Element Method, Fifth Edition/zbirnyk-2016.pdf', 'Programming the Finite Element Method, Fifth Edition/ДубенецьВГ.Основи МСЕ.pdf', . . . ...
, . . . ...
, . . . ...
'WindowFrmAplMEMS/obj/Debug/WindowFrmAplMEMS.pdb', 'WindowFrmAplMEMS/rheolef.pdf', 'WindowFrmAplMEMS/task_152104.pdf', 'WindowFrmAplMEMS/tsoi_rv.pdf', "WindowFrmAplMEMS/Методичні рекомендації до виконання лабораторних робіт з навчальної дисципліни Об'єктно-орієнтоване програмування. Парфьонов Ю.Е..pdf", 'Разработка программы рисования графика функции двух переменных.docx', 'Рисование объемных фигур.docx']
>>> print(wordlists.words('NLTK Book.html'))
['<!--?', 'xml', 'version', '="', '1', '.', '0', '"', ...]