МІНІСТЕРСТВО ОСВІТИ І НАУКИ УКРАЇНИ
НАЦІОНАЛЬНИЙ УНІВЕРСИТЕТ «ЛЬВІВСЬКА ПОЛІТЕХНІКА»
Кафедра САПР
ЗВІТ
до лабораторної роботи № 6
на тему:
ВИВЧЕННЯ БІБЛІОТЕКИ ПРИКЛАДНИХ ПРОГРАМ NLTK, ДЛЯ ОПРАЦЮВАННЯ ТЕКСТІВ ПРИРОДНОЮ МОВОЮ.
ВИКОРИСТАННЯ РЕГУЛЯРНИХ ВИРАЗІВ ДЛЯ ОБРОБКИ ТЕКСТУ.
з дисципліни “Комп’ютерна лінгвістика”
Мета роботи: Вивчення основ програмування на мові Python. Використання регулярних виразів для обробки текстів.
Теоретичні відомості
Синтаксис регулярних висловів залежить від інтерпретатора, що використовується для їх обробки. Пошук слів із закінченням ed можна здійснити використовуючи регулярний вираз «ed$». Потрібно використати функцію re.search(p, s), яка перевіряє чи може зразок p бути знайдений у будь-якому місці стрічки s. Потрібно визначити символи, які шукаємо та використати символ долара , який в регулярних виразах позначає кінець слова:
Символ ”.” універсальний символ , якому відповідає будь-який один символ. Нехай потрібно знайти слова з восьми літер, де j – третя літера та t – шоста літера. При створенні регулярного виразу у місцях де може бути будь-який символ вказується крапка. Символ ”^” вказує на початок стрічки:
Символ “ ? “ вказує на те що попередній символ не є обовязковим. Вираз «^e-?mail$» відповідає двом стрічкам email та e-mail. Можна знайти загальну кількість таких стрічок (врахувавши різні способи їх запису) у будь-якому тексті скориставшись sum(1 for w in text if re.search('^e-?mail$', w)).
Вираз re.search(regexp, w) дозволяє знаходити слова w , які відповідають регулярному виразу regexp . Регулярні вирази також можна використовувати для виявлення фрагментів слів, або для модифікації слів різними способами.
Метод re.findall() ("знайти всеl") дозволяє знайти всі відповідності даному регулярному виразу. В наступному прикладі показано знаходження та підрахунок всіх голосних:
Тут, re.findall() знаходить тільки суфікс, хоча регулярний вираз відповідає всьому слову. Це сталося тому, що круглі дужки задають не тільки область дії оператора диз’юнкції але і виконують функцію вибору підстрічки яку потрібно вилучити. Коли потрібно в регулярному виразі використовувати круглі дужки для вказання області дії оператор,а але не потрібно здійснювати вилучення в регулярний вираз потрібно додати ?: , .
Спеціальний тип регулярних виразів може використовуватися для пошуку серед слів у тексті (текст – послідовність окремих слів). Наприклад, за допомогою виразу "<a> <man>" можна знайти всі випадки вживання a man в тексті. Кутові дужки використовуються для позначення меж і всі пробіли мід цими дужками ігноруються (індивідуальна особливість NLTK's findall() методу для тексту). В наступному прикладі включено <.*> #1 для виявлення всіх окремих слів, а круглі дужки дозволять вибрати ці слова окремо від словосполучень ( a monied man).
ТЕКСТИ ПРОГРАМ НА МОВІ PYTHON
ВАРІАНТ №2
1. Описати, які класи стрічок відповідають наступному регулярному виразу. [a-zA-Z]+. Результати перевірити використовуючи nltk.re_show( ).
>>> from __future__ import division
>>> import nltk, re, pprint
>>> f = open ('d://text.txt')
>>> raw = f.read ()
>>> nltk.re_show ('[a-zA-Z]+', raw)
{So}, {at} {the} {start} {of} 2012, {I} {set} {myself} {the} {challenge} {of} {trying} {to} {read} {a} {book} {from} {every} {country} ({well}, {all} 195 {UN}-{recognised} {states} {plus} {former} {UN} {member} {Taiwan}) {in} {a} {year} {to} {find} {out} {what} {I} {was} {missing}.
Виділяє всі слова, які складаються з літер, але не виділяє цифри і розділові знаки.
2. Описати, які класи стрічок відповідають наступному регулярному виразу. [A-Z][a-z]*. Результати перевірити використовуючи nltk.re_show()
>>> from __future__ import division
>>> import nltk, re, pprint
>>> f = open ('d://text.txt')
>>> raw = f.read ()
>>> nltk.re_show ('[A-Z][a-z]*', raw)
{So}, at the start of 2012, {I} set myself the challenge of trying to read a book from every country (well, all 195 {U}{N}-recognised states plus former {U}{N} member {Taiwan}) in a year to find out what {I} was missing.
Виділяє лише слова, які починаються з великої літери.
3. Описати, які класи стрічок відповідають наступному регулярному виразу. \d+(\.\d+)?. Результати перевірити використовуючи nltk.re_show()
>>> from __future__ import division
>>> import nltk, re, pprint
>>> f = open ('d://text.txt')
>>> raw = f.read ()
>>> nltk.re_show ('\d+(\.\d+)?', raw)
So, at the start of {2012}, I set myself the challenge of trying to read a book from every country (well, all {195} UN-recognised states plus former UN member Taiwan) in a year to find out what I was missing.
Виділяє послідовність цифр.
4. Описати, які класи стрічок відповідають наступному регулярному виразу. ([^aeiou][aeiou][^aeiou])*. Результати перевірити використовуючи nltk.re_show()
>>> from __future__ import division
>>> import nltk, re, pprint
>>> f = open ('d://text.txt')
>>> raw = f.read ()
>>> nltk.re_show ('([^aeiou][aeiou][^aeiou])*', raw)
{So, at} {}t{he }s{tar}t{ of} {}2{}0{}1{}2{},{} {}I{} {set} {}m{}y{sel}f{} {}t{he }c{hallenge }o{}f{} {}t{}r{yin}g{} {to }r{}e{}a{}d{ a }b{}o{}o{}k{} {}f{rom ev}e{}r{}y{} {}c{}o{}u{}n{}t{}r{}y{} {}({wel}l{},{ al}l{} {}1{}9{}5{} {}U{}N{}-{rec}o{}g{nis}e{}d{} {}s{tat}e{}s{} {}p{lus} {former} {}U{}N{} {member} {}T{}a{}i{wan}){ in a }y{}e{}a{}r{} {to fin}d{} {}o{}u{}t{} {}w{hat} {}I{} {was} {missin}g{}.{}
Виділяється послідовності символів, що складаються з трьох символів, перший і третій з яких не є голосною, а другий – будь-яка голосна з [aeiou] і зустрічаються 0 і більше разів.
5. Описати, які класи стрічок відповідають наступному регулярному виразу. \w+|[^\w\s]+.. Результати перевірити використовуючи nltk.re_show()
>>> from __future__ import division
>>> import nltk, re, pprint
>>> f = open ('d://text.txt')
>>> raw = f.read ()
>>> nltk.re_show ('\w+|[^\w\s]+.', raw)
{With} {no} {idea} {how} {to} {go} {about} {this} {beyond} {a} {sneaking} {suspicion} {that} {I} {was} {unlikely} {to} {find} {publications} {from} {nearly} {200} {nations} {on} {the} {shelves} {of} {my} {local} {bookshop}{, }{I} {decided} {to} {ask} {the} {planet}{’s} {readers} {for} {help}{. }{I} {created} {a} {blog} {called} {A} {Year} {of} {Reading} {the} {World} {and} {put} {out} {an} {appeal} {for} {suggestions} {of} {titles} {that} {I} {could} {read} {in} {English}.
Виділяє всі слова, цифри та символи.
6. Описати, які класи стрічок відповідають наступному регулярному виразу. p[aeiou]{,2}t Результати перевірити використовуючи nltk.re_show()
>>> from __future__ import division
>>> import nltk, re, pprint
>>> f = open ('d://text1.txt')
>>> raw = f.read ()
>>> nltk.re_show ('p[aeiou]{,2}t', raw)
Writer Ann Morgan set herself a challenge – to read a book from every country in the world in one year. She describes the experience and what she learned.
{pot}
Виділяємо стрічку, які складаються з літери “p”, від 0 до 2 голосних і літери “t”.
7. Написати регулярний вираз, який встановлює відповідність наступному класу стрічок: всі артиклі (a, an, the).
Рис. 1. Текст програми №7.
10. Зберегти довільний текст у файлі corpus.txt. Визначити функцію для читання з цього файлу (назва файлу аргумент функції) і повертає стрічку, яка містить текст з файлу. Використовуючи nltk.regexp_tokenize() розробити токенізатор для токенізації різних типів виразів: грошові одиниці, дати, імена людей та організацій. Використовувати багаторядковий запис регулярного виразу з коментарями та «verbose flag».
Рис. 7. Текст програми №10.
13. Напишіть програму, яка конвертує текст в Pig Latin. String->ingstray, idle->idleay. (Конвертація відбувається переміщенням приголосної або групи приголосних на початок слова та додаванням до слова ay ).
Рис. 3. Текст програми №13.
15. Прочитати Додаток А. Дослідити явища описані у Додатку А використовуючи корпуси текстів та метод findall()для пошуку в токенізованому тексті.
Рис. 4. Текст програми №15.
ВИСНОВОК
Під час виконання даної лабораторної роботи були вивчені основи програмування мови Python, а саме використання регулярних виразів для обробки текстів.