МІНІСТЕРСТВО ОСВІТИ І НАУКИ УКРАЇНИ
НАЦІОНАЛЬНИЙ УНІВЕРСИТЕТ “ЛЬВІВСЬКА ПОЛІТЕХНІКА”
іНСТИТУТ КОМП’ютерних НАУК та ІНФОРМАЦІЙНИХ ТЕХНОЛОГІЙ
Кафедра “Системи автоматизованого проектування”
Звіт до лабораторної роботи № 4
«Обробка окремих слів: підрахунок слів та лексична база даних англійської мови»
з дисципліни “Комп’ютерна лінгвістика”
Виконала:
ст. гр. ПРЛ-1
Львів-2008
Мета: вивчення основ програмування на мові Python, ознайомлення зі способами підрахунку слів та лексичною базою даних англійської мови WordNet.
Результати отримані в попередньому прикладі, які відповідають певній абстрактній структурі – набору елементів і їх частот – називають частотним розподілом. Оскільки, при роботі з текстом часто потрібно здійснювати подібні обчислення то в NLTK реалізовано окремий клас FreqDist(). Використовуючи цей клас попередній приклад можна переписати наступним чином:
В таблиці 1 наведені, реалізовані в NLTK, методи властиві частотному розподілу.
Таблиця1
Отримані, у попередніх прикладах, результати не надто цікаві. Можливо більш інформативним буде список найчастотніших слів (tokens). Об’єкт FreqDist є певного виду словником і тому можна легко побудувати пари ключ-значення і відсортувати їх по спаданню, як показано нижче:
Зазначимо, що функція sorted() повертає новий відсортований список тем, які є її першим аргументом. Другий аргумент key визначає функцію одного аргументу, яка використовується для встановлення ключа, за яким будуть порівнюватися елементи списку. itemgetter(1) вказує на те, що порівнюватися елементи списку, які є кортежами, будуть за елементами кортежу з індексом 1. Третій аргумент reverse=True вказує на те, що сортування буде проводитись в зворотному порядку. В результаті буде отримано список в якому слова з максимальною частотою будуть першими.
Стилістика, це доволі широкий термін, який відноситься і до літературних жанрів і до інших різноманітних випадків вживання мови. Можна проаналізувати набір документів (слів), які згруповані за жанрами і спробувати дізнатися якусь інформацію про використання слів. Наприклад таблиця 2 показує кількість різних (за часовим параметром) модальних дієслів в різних частинах корпусу.
Зауважимо, що найбільшу частоту в жанрі репортажу має модальне дієслово will, вказуючи нам на майбутнє, разом з тим найбільш частотним дієсловом в жанрі романтика є could що вказує на можливість.
Можна також виміряти лексичну різноманітність жанру обчисливши співвідношення типів слів і tokens слів, як показано в таблиці 3. Жанри з нижчою різноманітністю мають більше значення відношення token на тип. Гумористична проза майже вдвічі лексично бідніша ніж романтична проза.
Можна здійснювати різноманітні дослідження здійснюючи подібні підрахунки слів. Одним з напрямків корпусної лінгвістики є підрахунок і обробка результатів підрахунку слів.
Таблиця 2
Таблиця 3
WordNet, це семантично орієнтований словник англійської мови, подібний до традиційних тезаурусів але з більш багатою структурою. У WordNet слова групуються у набори синонімів – синсети, кожен із своїм визначенням і зв’язками з іншими синсетами. WordNet 3.0 розповсюджується разом з NLTK і містить 145000 синсетів. Хоча WordNet розроблявся для психолінгвістики - цей словник широко використовується в NLP та в задачах інформаційного пошуку
Розглянемо наступне речення:
Якщо замінити слово motorcar на automobile зміст речення не зміниться.
Можна вважати, що оскільки заміна слів не вплинула на зміст речень то ці слова синоніми. Для одержання значення слова потрібно вибрати до якої частини мови воно належить. WordNet містить чотири словники (іменники, дієслова, прикметники, прислівники ).
Завдання 5.
>>>import nltk
>>>from nltk import corpus
>>>sl=[]
>>>for categories in nltk.corpus.brown.categories():
ct = categories
sl=[]
for words in nltk.corpus.brown.words(categories=ct):
sl.append(words)
print categories+’:’+’tokens_’,len(nltk.corpus.brown.words(categories=ct)), ‘types_’,len(set(sl))
a: tokens_100554 types_14394
b: tokens_61604 types_9890
c: tokens_40704 types_8626
d: tokens_39399 types_6373
e: tokens_82345 types_11935
f: tokens_110299 types_14503
g: tokens_173096 types_18421
h: tokens_70117 types_8181
j: tokens_181888 types_16859
k: tokens_68488 types_9302
l: tokens_57169 types_6982
m: tokens_14470 types_3233
n: tokens_69342 types_8874
p: tokens_70022 types_8452
r: tokens_21695 types_5017
Завдання 9.
>>> from operator import itemgetter
>>>def train_model(text):
i_w = list(nltk.corpus.stopwords.words(‘english’))
cfdist = nltk.ConditionalFreqDist()
colloc = ()
prev = None
for word in text:
word = word.lower()
if word not in i_w:
if prev not in i_w:
cfdist[prev].inc(word)
prev = word
for condition in cfdist.conditions():
for i in range(len(list(cfdist[condition].sorted()))):
colloc[condition, list(cfdist[condition].sorted())[i],sorted(list(cfdist[condition]. values()), reverse = True) [i]] =’’
a = sorted(colloc,key = itemgetter(2),reverse=True)
for i in range(10):
print a[i]
>>>train_model (nltk.corpus.gutenberg.words (‘austen-persuasion.txt‘))
('captain', 'wentworth', 196)
('mr', 'elliot', 174)
('lady', 'russell', 147)
('sir', 'walter', 131)
('mrs', 'clay', 66)
('mrs', 'musgrove', 66)
('mrs', 'smith', 64)
('captain', 'benwick', 56)
('anne', "'", 50)
('miss', 'elliot', 48)
Завдання 10.
>>>def andy (words,word):
n=0
for i in words:
if i = = word:
n+=1
print n, word
>>>andy (nltk.corpus.brown.words(categories=‘p‘), ‘love‘)
32 love
>>> andy (nltk.corpus.brown.words(categories=‘e‘), ‘love‘)
6 love
>>> andy (nltk.corpus.brown.words(categories=‘p‘), ‘experience‘)
4 experience
>>> andy (nltk.corpus.brown.words(categories=‘e‘), ‘experience‘)
20 experience
>>>
Завдання 11.
>>> def freq (h, num=50):
g= nltk.corpus.brown.words(categories=h)
fd=nltk.FreDist (g)
commulative= 0.0
for word in fd.sorted() [: num] :
cumulative= fd[word]* 1000/fd.N()
print “%3.3d%% %s” % (cumulative,word)
>>>freg (‘a‘,10)
055% the
051% ,
040% .
028% of
021% and
021% to
019% a
018% in
009% for
008% The
>>>
Завдання 13.
>>> import nltk
>>> from nltk import wordnet
>>> print (wordnet.N['eye'][0].tree(wordnet.PART_MERONYM))
[{noun: eye, oculus, optic}, [{noun: visual_system}], [{noun: face, human_face}, [{noun: head, caput}, [{noun: body, organic_structure, physical_structure}], [{noun: animal, animate_being, beast, brute, creature, fauna}]], [{noun: homo, man, human_being, human}]]]
>>> print (wordnet.N['eye'][0].tree(wordnet.SUBSTANCE_MERONYM))
[{noun: eye, oculus, optic}]
>>> print (wordnet.N['eye'][0].tree(wordnet.MEMBER_MERONYM))
[{noun: eye, oculus, optic}]
>>> print (wordnet.N['eye'][0].tree(wordnet.MEMBER_HOLONYM))
[{noun: eye, oculus, optic}]
>>> print (wordnet.N['eye'][0].tree(wordnet.SUBSTANCE_HOLONYM))
[{noun: eye, oculus, optic}]
>>> print (wordnet.N['eye'][0].tree(wordnet.PART_HOLONYM))
[{noun: eye, oculus, optic}, [{noun: choroid, choroid_coat}], [{noun: ciliary_body}], [{noun: eyelid, lid, palpebra}, [{noun: eyelash, lash, cilium}], [{noun: conjunctiva}]], [{noun: canthus}], [{noun: epicanthus, epicanthic_fold}], [{noun: nictitating_membrane, third_eyelid}], [{noun: conjunctiva}], [{noun: eyeball, orb}], [{noun: ocular_muscle, eye_muscle}], [{noun: cornea}], [{noun: uvea}], [{noun: uveoscleral_pathway}], [{noun: iris}, [{noun: pupil}]], [{noun: lens, crystalline_lens, lens_of_the_eye}, [{noun: lens_cortex, cortex}], [{noun: lens_capsule}]], [{noun: central_artery_of_the_retina, arteria_centralis_retinae}], [{noun: ciliary_artery, arteria_ciliaris}], [{noun: lacrimal_artery, arteria_lacrimalis}], [{noun: lacrimal_vein, vena_lacrimalis}], [{noun: lacrimal_apparatus}, [{noun: lacrimal_gland, lachrymal_gland, tear_gland}], [{noun: lacrimal_duct, lachrymal_duct, tear_duct}], [{noun: lacrimal_sac, tear_sac, dacryocyst}]], [{noun: retina}, [{noun: neuroepithelium}], [{noun: fovea, fovea_centralis}], [{noun: parafovea}], [{noun: macula, macula_lutea, macular_area, yellow_spot}], [{noun: visual_cell}], [{noun: blind_spot, optic_disc, optic_disk}], [{noun: cone, cone_cell, retinal_cone}, [{noun: iodopsin}]], [{noun: rod, rod_cell, retinal_rod}, [{noun: visual_purple, rhodopsin, retinal_purple}]]], [{noun: sclera, sclerotic_coat}], [{noun: pupillary_sphincter, musculus_sphincter_pupillae}], [{noun: aperture}]]
Завдання 16.
>>> import nltk
>>> from nltk import wordnet
>>> wordnet.N['desk'][0].path_similarity(wordnet.N['table'][1])
0.5
>>> wordnet.N['thumb'][0].path_similarity(wordnet.N['finger'][1])
0.066666666666666666
>>> wordnet.N['book'][0].path_similarity(wordnet.N['script'][1])
0.066666666666666666
>>> wordnet.N['eye'][0].path_similarity(wordnet.N['ear'][1])
0.058823529411764705
>>> wordnet.N['sky'][0].path_similarity(wordnet.N['earth'][1])
0.125
>>> wordnet.N['sky'][0].path_similarity(wordnet.N['lip'][1])
0.090909090909090912
>>> wordnet.N['earth'][0].path_similarity(wordnet.N['planet'][1])
-1
>>> wordnet.N['road'][0].path_similarity(wordnet.N['way'][1])
0.076923076923076927
>>> wordnet.N['girl'][0].path_similarity(wordnet.N['woman'][1])
0.25
>>> wordnet.N['boy'][0].path_similarity(wordnet.N['man'][1])
0.16666666666666666
>>> wordnet.N['wall'][0].path_similarity(wordnet.N['floor'][1])
0.25
>>> wordnet.N['house'][0].path_similarity(wordnet.N['hut'][1])
0.20000000000000001
>>> wordnet.N['house'][0].path_similarity(wordnet.N['government'][1])
0.071428571428571425
>>>
wordnet.N['pig'][0].path_similarity(wordnet.N['art'][1])
0.045454545454545456
>>> wordnet.N['pig'][0].path_similarity(wordnet.N['flower'][1])
0.058823529411764705
Висновок: на цій лабораторній роботі я ознайомилася з бібліотекою прикладних програм NLTK для опрацювання текстів природною мовою, я також навчилася працювати зі семантично орієнтованим словником англійської мови WordNet, підрахувати частоту появи певних слів у тексті, визначати наявність певних слів у текстах різних жанрів, підраховувати частоту появи словосполучень у тексті.