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

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




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


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

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

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


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





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

СТРУКТУРНЕ ПРОГРАМУВАННЯ МОВОЮ PYTHON (частина2).


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

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

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


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

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

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


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

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


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

№ 3513 від 2.06.2011


Львів-2011

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



Укладачі:

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

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



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

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



Рецензент:

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



^ МЕТА РОБОТА


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

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

  • Повторення та закріплення знань отриманих при виконанні попередніх лабораторних робіт.

  • Покращення загальних навичок у програмуванні.


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

^

1. Складні випадки використання функцій

1.1 Функція, як аргумент


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

 

>>> sent = ['Take', 'care', 'of', 'the', 'sense', ',', 'and', 'the',

... 'sounds', 'will', 'take', 'care', 'of', 'themselves', '.']

>>> def extract_property(prop):

... return [prop(word) for word in sent]

...

>>> extract_property(len)

[4, 4, 2, 3, 5, 1, 3, 3, 6, 4, 4, 4, 2, 10, 1]

>>> def last_letter(word):

... return word[-1]

>>> extract_property(last_letter)

['e', 'e', 'f', 'e', 'e', ',', 'd', 'e', 's', 'l', 'e', 'e', 'f', 's', '.']




Об’єкти len та last_letter передаються у функцію як списки та словники (тип даних словник буде розглянуто пізніше). Зауважимо, що дужки після імені функції використовуються тільки при її виклику, а якщо функція трактується, як об’єкт (аргумент іншої функції) то дужки опускаються.

Python підтримує ще один спосіб визначення функцій як аргументів іншої функції , це так званий лямбда-вираз (анонімна функція). Спробуємо виконати дії функції last_letter() без її створення і відповідно не використовуючи її імя. За допомогою лямбда-виразу отримаємо наступний результат:

 

>>> extract_property(lambda w: w[-1])

['e', 'e', 'f', 'e', 'e', ',', 'd', 'e', 's', 'l', 'e', 'e', 'f', 's', '.']




Наступний приклад ілюструє передавання функції до функції sorted(). У випадку виклику функції sorted() з одним аргументом #1 (сортування списку) ця функція використовує для порівняння вбудовану функцію cmp() (про що свідчить #2). Звичайно, можна, як аргумент, використати і власну функцію, наприклад функцію сортування в порядку спадання довжин елементів.

 

>>> sorted(sent) #1

[',', '.', 'Take', 'and', 'care', 'care', 'of', 'of', 'sense', 'sounds',

'take', 'the', 'the', 'themselves', 'will']

>>> sorted(sent, cmp) #2

[',', '.', 'Take', 'and', 'care', 'care', 'of', 'of', 'sense', 'sounds',

'take', 'the', 'the', 'themselves', 'will']

>>> sorted(sent, lambda x, y: cmp(len(y), len(x))) #3

['themselves', 'sounds', 'sense', 'Take', 'care', 'will', 'take', 'care',

'the', 'and', 'the', 'of', 'of', ',', '.']



^

1.2 Функції накопичення


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

 

def search1(substring, words):

result = []

for word in words:

if substring in word:

result.append(word)

return result


def search2(substring, words):

for word in words:

if substring in word:

yield word


print "search1:"

for item in search1('zz', nltk.corpus.brown.words()):

print item

print "search2:"

for item in search2('zz', nltk.corpus.brown.words()):

print item







Функція search2() – це генератор. Після першого виклику цієї функції, вона виконується аж до yield твердження і зупиняється. Програма, з якої викликалася ця функція, отримує перше слово і виконує всі необхідні дії. Тільки коли програма готова до обробки наступного слова, виконання функції продовжується з того самого місця в якому вона була зупинена і функція знову виконується аж до yield твердження. Такий підхід є типовим і більш ефективним, оскільки функція генерує дані тільки тоді коли їх потребує основна програма і не потребує виділення додаткового об’єму памяті для збереження результатів.

Розглянемо більш складний приклад генератора, який здійснює всі можливі перестановки слів у списку. Для одержання всіх можливих результатів викликаємо функцію permutations() як аргумент функції list() #1.

 

>>> def permutations(seq):

... if len(seq) <= 1:

... yield seq

... else:

... for perm in permutations(seq[1:]):

... for i in range(len(perm)+1):

... yield perm[:i] + seq[0:1] + perm[i:]

...

>>> list(permutations(['police', 'fish', 'buffalo'])) #1

[['police', 'fish', 'buffalo'], ['fish', 'police', 'buffalo'],

['fish', 'buffalo', 'police'], ['police', 'buffalo', 'fish'],

['buffalo', 'police', 'fish'], ['buffalo', 'fish', 'police']]



Функція використовує рекурсію – техніку яка буде розглядатися в подальшому. Перестановки слів у наборах слів корисно використовувати при створенні даних для тестування граматик.

^

1.3 Функції вищого рівня


Python підтримує деякі функції вищого порядку, які є стандартними для мов функціонального програмування, таких як Haskell. Розглянемо ці функції разом з еквівалентними виразами , які використовують list comprehensions.

Визначимо функцію is_content_word(), яка перевіряє чи належить слово до відкритого класу слів. Ця функція використовується, як перший параметр функції вищого порядку filter(). Функція filter() застосовує функцію is_content_word() до кожного елементу послідовності, яка є її другим параметром і зберігає тільки ті елементи для яких функція is_content_word() повертає значення True.

 

>>> def is_content_word(word):

... return word.lower() not in ['a', 'of', 'the', 'and', 'will', ',', '.']

>>> sent = ['Take', 'care', 'of', 'the', 'sense', ',', 'and', 'the',

... 'sounds', 'will', 'take', 'care', 'of', 'themselves', '.']

>>> filter(is_content_word, sent)

['Take', 'care', 'sense', 'sounds', 'take', 'care', 'themselves']

>>> [w for w in sent if is_content_word(w)]

['Take', 'care', 'sense', 'sounds', 'take', 'care', 'themselves']




Інша функція вищого порядку map(), також застосовує функцію до кожного з елементів послідовності. Наступний приклад ілюструє застосування цієї функції для одержання аналогічних з функцією extract_property()(пункт 1.1) результатів. В прикладі показано простий спосіб знаходження середньої довжини речень в корпусі Brown Corpus, та еквівалентний варіант цих обчислень за допомогою list comprehension:

 

>>> lengths = map(len, nltk.corpus.brown.sents(categories='news'))

>>> sum(lengths) / len(lengths)

21.7508111616

>>> lengths = [len(w) for w in nltk.corpus.brown.sents(categories='news'))]

>>> sum(lengths) / len(lengths)

21.7508111616




В попередніх прикладах використовувалась функція is_content_word() та вбудована функція len(). Наступні два приклади демонструють використання лямбда виразів в подібних програмах. В цих прикладах визначається кількість голосних в кожному зі слів вхідної послідовності.

 

>>> map(lambda w: len(filter(lambda c: c.lower() in "aeiou", w)), sent)

[2, 2, 1, 1, 2, 0, 1, 1, 2, 1, 2, 2, 1, 3, 0]

>>> [len([c for c in w if c.lower() in "aeiou"]) for w in sent]

[2, 2, 1, 1, 2, 0, 1, 1, 2, 1, 2, 2, 1, 3, 0]




Рішення на основі list comprehensions є зазвичай більш зручні для читання і розуміння ніж рішення на основі функцій вищого порядку.
^

1.4 Зазначені (поіменовані) аргументи.


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

 

>>> def repeat(msg='', num=1):

... return msg * num

>>> repeat(num=3)

''

>>> repeat(msg='Alice')

'Alice'

>>> repeat(num=5, msg='Alice')

'AliceAliceAliceAliceAlice'




При спільному використанні двох типів параметрів потрібно пересвідчитись, що спочатку йдуть звичайні параметри а потім поіменовані параметри. Така послідовність необхідна, бо звичайні параметри визначаються позицією, яку вони займають у списку аргументів функції. Можна визначити функцію з довільними неіменованими (звичайними), та іменованими (ключами) параметрами і доступатися до них через список аргументів *args (список ) та через ключі у словнику **kwargs(словник).

 

>>> def generic(*args, **kwargs):

... print args

... print kwargs

...

>>> generic(1, "African swallow", monty="python")

(1, 'African swallow')

{'monty': 'python'}




Коли *args зустрічається, як параметр функції то він відповідає всім неіменованим параметрам функції. Наступний приклад також ілюструє цю особливість синтаксису Python. Функція zip() може мати довільну кількість аргументів #1. Використання імені змінної *song демонструє, аналогічний результат з використанням імені змінної *args в попередньому прикладі.

 

>>> song = [['four', 'calling', 'birds'],

... ['three', 'French', 'hens'],

... ['two', 'turtle', 'doves']]

>>> zip(song[0], song[1], song[2]) #1

[('four', 'three', 'two'), ('calling', 'French', 'turtle'), ('birds', 'hens', 'doves')]

>>> zip(*song) #2

[('four', 'three', 'two'), ('calling', 'French', 'turtle'), ('birds', 'hens', 'doves')]




Зрозуміло, що *song зручніше записати ніж song[0], song[1], song[2], і отримати еквівалентний результат.

Наступний приклад демонструє використання поіменованих аргументів (ключів) при визначенні функції, а також три різні способи виклику цієї функції:

 

>>> def freq_words(file, min=1, num=10):

... text = open(file).read()

... tokens = nltk.word_tokenize(text)

... freqdist = nltk.FreqDist(t for t in tokens if len(t) >= min)

... return freqdist.keys()[:num]

>>> fw = freq_words('ch01.rst', 4, 10)

>>> fw = freq_words('ch01.rst', min=4, num=10)

>>> fw = freq_words('ch01.rst', num=10, min=4)




Прихований ефект, який забезпечує використання поіменованих аргументів, це їх опціональність ( необов’язковість ). Буде отримано однаковий результат і при виклику функції : freq_words('ch01.rst', min=4),і при виклику freq_words('ch01.rst', 4). Значення num=10 зберігається по замовчуванню. Іншй приклад опціональних аргументів функції, це використання прапорців (позначок). Оновлена версія попередньої функції виводить інформацію про хід свого виконання , якщо встановлений прапорець verbose (спробуйте також присвоїти значення прапорця verbose=True):

 

>>> def freq_words(file, min=1, num=10, verbose=False):

... freqdist = FreqDist()

... if trace: print "Opening", file

... text = open(file).read()

... if trace: print "Read in %d characters" % len(file)

... for word in nltk.word_tokenize(text):

... if len(word) >= min:

... freqdist.inc(word)

... if trace and freqdist.N() % 100 == 0: print "."

... if trace: print

... return freqdist.keys()[:num]



  1   2   3   4



Схожі:




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