МІНІСТЕРСТВО ОСВІТИ І НАУКИ УКРАЇНИ
НАЦІОНАЛЬНИЙ УНІВЕРСИТЕТ “ЛЬВІВСЬКА ПОЛІТЕХНІКА”
ІНСТИТУТ КОМП’ЮТЕРНИХ НАУК ТА ІНФОРМАЦІЙНИХ ТЕХНОЛОГІЙ
Кафедра “Системи автоматизованого проектування”
/
Звіт
до лабораторної роботи №7
на тему:
«ВИВЧЕННЯ БІБЛІОТЕКИ ПРИКЛАДНИХ ПРОГРАМ NLTK, ДЛЯ ОПРАЦЮВАННЯ ТЕКСТІВ ПРИРОДНОЮ МОВОЮ.
СТРУКТУРНЕ ПРОГРАМУВАННЯ МОВОЮ PYTHON (частина1).»
МЕТА
Вивчення основ програмування на мові Python. Вивчення основ структурного програмування мовою Python. Повторення та закріплення знань отриманих при виконанні попередніх лабораторних робіт. Покращення загальних навичок у програмуванні.
ТЕОРЕТИЧНІ ВІДОМОСТІ
1. Основи програмування
1.3 Умовні твердження(висловлювання)
В частині умов if твердження, не пусті стрічки вважаються «true», а пусті стрічки чи списки вважаються «false» і не обробляються.
Тому, не потрібно використовувати додаткову перевірку if len(element) > 0: в умові.
Для пояснення відмінностей між використанням if...elif та використання декількох if тверджень розглянемо наступний приклад:
Якщо if вираз твердження задовольняється то, Python ніколи не буде робити спроби перевірити чи справджується elif вираз. На екран «2» ніколи не буде виведено. Навпаки, якщо замінити elif на if, на екран буде виведено і «1» і «2». elif вираз потенційно є більш інформативний ніж простий if вираз; коли він справджується то це означає не тільки те що умова задовольняється але і те, що умова if виразу не справджується.
Вбудовані функції all() та any() можуть бути застосовані до списку або іншої послідовності для перевірки, чи всі, або будь-який з елементів задовольняють умову:
2. Послідовності
В попередніх прикладах використовувалися наступні послідовності: стрічки, списки та кортежі. Змінна, тип якої – кортеж, створюється за допомогою ком (#1) і переважно обмежується дужками. В попередніх лабораторних роботах кортежі використовувалися для представлення пар значень (елементів послідовності з двох членів). Зазвичай, кортежі можуть містити будь-яку кількість елементів та членів. Аналогічно до списків та стрічок, елементи кортежів можуть бути проіндексовані (#2), до них можна доступитися за допомогою зрізів (#3) та визначити кількість елементів (#4). Кортежі створюються за допомогою ком (оператор - кома). Для створення кортежу, який містить єдиний елемент 'snark' , кома ставиться безпосередньо після цього елементу 'snark',. Пустий кортеж створюється за допомогою пустих дужок t=().
Виконати самостійно. Визначити набір, використовуючи set(text). Що станеться, якщо перетворити цей набір в список list(set(text)) або проітерувати його елементи.
2.1 Операції над послідовностями різних типів
Елементи послідовності s можна обробляти почергово (здійснювати над ними ітерації, ітерувати) різними способами, основні з яких, наведено у таблиці 1.
Послідовності різних типів можна перетворювати між собою. Наприклад, tuple(s) – перетворення послідовності будь-якого типу в кортеж, list(s) – перетворення послідовності будь-якого типу в список. Для перетворення списку стрічок в єдину стрічку потрібно використовувати функцію join(), наприклад, ':'.join(words).
Деякі інші об’єкти, такі як FreqDist, також можуть бути перетворені в послідовність, використовуючи list(), а також їх можна й ітерувати. В наступному прикладі показано, як можна використовувати кортежі для переміщення елементів в списку. Круглі дужки, при створенні кортежів можна опустити, оскільки кома має вищий пріоритет ніж оператор присвоювання, але запис з дужками є більш зрозумілий ((words[2], words[3], words[4]) = (words[3], words[4], words[2])). Аналогічного результату можна досягнути і традиційним шляхом, без використання кортежів, але тоді виникає необхідність у створенні нової змінної tmp. Python, за допомогою таких функцій, як sorted() and reversed(), дозволяє змінювати порядок елементів у послідовностях. Також існують функції, які модифікують структуру послідовностей, що знаходить широке використання при обробці мови. Функція, zip() приймає елементи двох або більше послідовностей і "zip" переміщує їх, попарно, один з одним, в один список пар. Маючи послідовність s, і скориставшись вбудованою функцією мови програмування Python enumerate(s) отримуємо пари, які містять індекс та елемент послідовності, який відповідає цьому індексу. Для вирішення деяких задач NLP часто необхідно ділити послідовності на декілька окремих частин. Наприклад, якщо необхідно тренувати ("train") систему на 90% даних а потім її тестувати на 10% даних , що залишились. Для цього, визначаємо місце поділу даних (#1) і в цьому місці ділимо дані (#2). . Можна пересвідчитись, що дані не дублюються і не втрачаються (#3), а також що дані поділені на дві частини в заданих пропорціях (#4).
3. Стиль програмування
Програмування це більше мистецтво ніж наука. Одна з найгрунтовніших книг по програмуванню, написана Дональдом Кнутом (Donald Knuth) так і називається The Art of Computer Programming. Приклади програм у більшості підручників написані таким чином, щоб не тільки комп’ютери але і люди змогли прочитати і зрозуміти текст програми. При програмуванні важливе значення має стиль програмування, який впливає на розуміння тексту програми і передбачає такі складові, як розміщення тексту програми, вибір процедурного чи декларативного стилю, використання змінних в циклах та багато інших.
3.1 Стиль програм Python
При написанні програм необхідно вміло вибирати імена змінних, вставляти пробіли, додавати коментарі та робити інші кроки, для того щоб, текст програми був зрозумілий і зручний для читання не тільки автору але й іншим. Розробники мови програмування Python опублікували (http://www.python.org/dev/peps/pep-0008/) керівництво по стилю програм мовою Python. Основне поняття, представлене в цьому керівництві, це узгодженість, для забезпечення максимальної читабельності тексту програми. В лабораторній роботі коротко розглядаються основні рекомендації описані у керівництві.
При розміщенні тексту програми потрібно використовувати чотири пробіли перед вкладеною частиною програми. При записі тексту програми у файлі потрібно уникати використання табуляції для цих відступів, оскільки вони можуть бути помилково інтерпретовані деякими текстовими редакторами і не збережені. Рядок програми повинен бути меншим за 80 символів. При необхідності, та частина рядка в круглих, квадратних та фігурних дужках, може бути розділена на декілька рядків (зроблений перенос).
4. Функції, як основа структурного програмування
Функції забезпечують ефективний спосіб збереження та повторного використання частин програм. Наприклад, припустимо, що існує необхідність часто читати тексти з HTML файлу. Це потребує виконання певної послідовності кроків: відкриття файлу, читання, нормалізація, видалення HTML розмітки. Можна зібрати ці кроки у функцію get_text().
Тепер, в будь-який момент, можна отримати текст з HTML файлу викликавши функцію get_text() вказавши назву файлу, як її аргумент. Функція повертає стрічку, значення, якої можна присвоїти будь-якій змінній, наприклад: contents = get_text("test.html").
При створенні функції важливе значення має вибір назви функції, що дозволяє зробити програму більш читабельною. У випадку попереднього прикладу, кожен раз коли програма повинна читати текст, немає потреби засмічувати текст основної програми чотирма рядками , потрібно тільки викликати функцію get_text (). Назва цієї функції має певну «семантичну інтерпретацію» і допомагає відразу зрозуміти що програма робить.
Перший рядок функції містить опис функції і його називають docstring. Така стрічка не тільки допомагає при читанні програми, вона також доступна програмісту при завантаженні тексту програми з файлу:
>>> help(get_text)
Help on function get_text:
get_text(file)
Read text from a file, normalizing whitespace
and stripping HTML markup.
Функції дозволяють не тільки повторно використовувати текст частини програми та підвищують читабельність програми але також підвищують достовірність тексту програми. Коли використовується текст програми, який вже попередньо розроблений і перевірений, то можна сподіватися що він працює правильно. Зменшується імовірність помилки та пропуску важливого кроку роботи програми.
Функція це фрагмент тексту програми, який має чітку, зрозумілу назву та виконує конкретне завдання.
ВИКОНАННЯ ПРАКТИЧНИХ ЗАВДАНЬ
Варіант № 16
Завдання № 1,2,3,4,5,6,7,8,9,10
Знайти в Python's help додаткову інформацію про послідовності. В інтерпретаторі, набрати по черзі help(str), help(list), та help(tuple). На екрані буде відображено повний список функцій властивих кожному з типів. Деякі функції мають спеціальні імена з подвійними підкреслюваннями. Кожній такій функції відповідає і інший запис показаний в документації. Наприклад x.__getitem__(y) відповідає x[y].
class str(basestring)
| str(object) -> string
| Return a nice string representation of the object.
| If the argument is a string, the return value is the same object.
| Method resolution order:
| str
| basestring
| object
| Methods defined here:
| __add__(...)
| x.__add__(y) <==> x+y
class list(object)
| list() -> new empty list
| list(iterable) -> new list initialized from iterable's items
| Methods defined here:
| __add__(...)
| x.__add__(y) <==> x+y
class tuple(object)
| tuple() -> empty tuple
| tuple(iterable) -> tuple initialized from iterable's items
|
| If the argument is a tuple, the return value is the same object.
|
| Methods defined here:
|
| __add__(...)
| x.__add__(y) <==> x+y
Знайти три операції, які можна здійснювати і зі списками та із кортежами. Знайти три операції, які не можна здійснювати над кортежами. Знайдіть коли використання списку замість кортежу приводить до Python помилки.
Спільні:
| __add__(...)
| x.__add__(y) <==> x+y
| __contains__(...)
| x.__contains__(y) <==> y in x
| __eq__(...)
| x.__eq__(y) <==> x==y
Не можна з кортежами:
| __imul__(...)
| x.__imul__(y) <==> x*=y
| __delitem__(...)
| x.__delitem__(y) <==> del x[y]
| __iadd__(...)
| x.__iadd__(y) <==> x+=y
3.Яким чином можна створити кортеж з одного елемента. Продемонструвати два різні способи.
/
Створити список words = ['is', 'NLP', 'fun', '?']. Використовуючи операції присвоювання подібні до words[1] = words[2] та тимчасову змінну tmp перетворити цей список в список ['NLP', 'is', 'fun', '!']. Здійснити аналогічні перетворення використовуючи присвоювання в кортежах.
/
Прочитати про вбудовану функцію здійснення порівнянь cmp, набравши help(cmp). Продемонструвати чим поведінка цієї функції відрізняється від поведінки операторів порівняння.
/
Написати програму для коректного виділення в тексті n-грамів з врахуванням граничних випадків: n = 1, та n = len(sent)?
/
Використати оператори нерівності для порівняння стрічок, наприклад. 'Monty' < 'Python'. Що станеться, якщо виконати 'Z' < 'a'? Порівняти стрічки,як мають однаковий префікс, наприклад 'Monty' < 'Montague'. Спробувати порівняти структуровані об’єкти ,наприклад. ('Monty', 1) < ('Monty', 2). Чи отримали очікувані результати?
/
Написати програму видалення пробілів на початку і в кінці стрічки та для видалення зайвих пробілів між словами. Використовувати split() та join(). Оформити у вигляді функції. Функція повинна містити повну стрічку документування.
/
Написати програму видалення пробілів на початку і в кінці стрічки та для видалення зайвих пробілів між словами. Використовувати re.sub() . Оформити у вигляді функції. Функція повинна містити повну стрічку документування
/
Написати програму сортування слів за їх довжиною. Визначити допоміжну функцію cmp_len, яка буде використовувати функцію cmp для порівняння довжин слів. Функція повинна містити повну стрічку документування.
/
ВИСНОВОК
В даній лабораторній роботі я навчилася писати гарні структуровані, чіткі, сприйнятливі програми, придатні для неодноразового використання, яким чином працюють основні конструкційні блоки, а саме: цикл, функція, присвоювання, які можуть бути пастки при програмуванні на Python та як їх уникати.