Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
2011-kl-lab7.doc
Скачиваний:
9
Добавлен:
12.11.2019
Размер:
871.42 Кб
Скачать

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

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

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

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

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

РЕГУЛЯРНІ ВИРАЗИ ТА ЇХ ВИКОРИСТАННЯ ДЛЯ ОБРОБКИ ТЕКСТУ.

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

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

для студентів спеціальності 7.02030303 «Прикладна лінгвістика»

денної та заочної форм навчання

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

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

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

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

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

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

№ 3523 від 2.06.2011

Львів-2011

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

Укладачі:

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

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

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

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

Рецензент:

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

Мета робота

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

  • Використання регулярних виразів для обробки текстів.

Короткі теоретичні відомості

Виконанні цієї лабораторної роботи необхідно розпочати з:

 

>>> from __future__ import division

>>> import nltk, re, pprint

  1. Використання регулярних виразів для виявлення слів за заданими шаблонами.

Багато задач лінгвістичних досліджень передбачають встановлення відповідності заданому шаблону. Наприклад, можна знайти слова, які закінчуються на “ed” використовуючи метод endswith('ed'). Подібні методи перевірки слів перелічені в Таблиці Методичних вказівок до лабораторної роботи №2. Регулярні вирази є більш потужним і гнучким методом опису шаблонів символів, які необхідно виявити у послідовностях символів. Регулярний вираз (вислів)програмуванні) — це рядок що описує або збігається з множиною рядків, відповідно до набору спеціальних синтаксичних правил. Регулярні вислови використовуються в багатьох текстових редакторах та допоміжних інструментах для пошуку та зміни тексту на основі заданих шаблонів.

Для роботи з регулярними виразами у Python потрібно імпортувати бібліотеку re скориставшись: import re. Корпус слів англійської мови Words Corpus буде використовуватися в якості лінгвістичних даних серед яких буде проводитися пошук. Попередня підготовка списку слів передбачає видалення власних імен.

 

>>> import re

>>> wordlist = [w for w in nltk.corpus.words.words('en') if w.islower()]

    1. Використання основних метасимволів (операторів повтору).

Синтаксис регулярних висловів залежить від інтерпретатора, що використовується для їх обробки. Однак, із незначними відхиленнями, майже всі поширені механізми інтерпретатори регулярних висловів мають спільні правила.

Найпростіший регулярний вислів, з якого формуються складні, є звичайний символ. Більшість символів, включаючи усі літери та цифри, є регулярними висловами, що співпадають із відповідними символами в рядках.

Пошук слів із закінченням ed можна здійснити використовуючи регулярний вираз «ed$». Потрібно використати функцію re.search(p, s), яка перевіряє чи може зразок p бути знайдений у будь-якому місці стрічки s. Потрібно визначити символи, які шукаємо та використати символ долара , який в регулярних виразах позначає кінець слова:

 

>>> [w for w in wordlist if re.search('ed$', w)]

['abaissed', 'abandoned', 'abased', 'abashed', 'abatised', 'abed', 'aborted', ...]

Символ ”.” універсальний символ , якому відповідає будь-який один символ. Нехай потрібно знайти слова з восьми літер, де j – третя літера та t – шоста літера. При створенні регулярного виразу у місцях де може бути будь-який символ вказується крапка. Символ ”^” вказує на початок стрічки:

 

>>> [w for w in wordlist if re.search('^..j..t..$', w)]

['abjectly', 'adjuster', 'dejected', 'dejectly', 'injector', 'majestic', ...]

Виконати самостійно. Повторіть попередній приклад використовуючи регулярний вираз «..j..t..». Результати порівняйте.

Символ “ ? “ вказує на те що попередній символ не є обовязковим. Вираз «^e-?mail$» відповідає двом стрічкам email та e-mail. Можна знайти загальну кількість таких стрічок (врахувавши різні способи їх запису) у будь-якому тексті скориставшись sum(1 for w in text if re.search('^e-?mail$', w)).

В мобільних телефонах для вводу тексту використовується система T9. Два або більше слів, які можуть бути введені тією самою послідовністю клавіш називають textonyms. Наприклад два слова hole та golf вводяться натисненням послідовності 4653. Які інші слова можуть бути створені натисненням тієї самої послідовності клавіш? Використовуючи регулярний вираз «^[ghi][mno][jlk][def]$» це не складно зробити:

 

>>> [w for w in wordlist if re.search('^[ghi][mno][jlk][def]$', w)]

['gold', 'golf', 'hold', 'hole']

Перша частина виразу, «^[ghi]», вказує на початок слова після якого йде один з символів g, h, чи i. Наступна частина виразу, «[mno]», містить другий символ m, n, або o. Обмеження на вибір третього та четвертого символів встановлюються аналогічно. Тільки чотири слова відповідають заданому шаблону. Порядок символів у квадратних дужках є довільним і не впливає на результат. could have written «^[hig][nom][ljk][fed]$» and matched the same words.

Виконати самостійно. Знайдіть слова, які відповідають наступним регулярним виразам: «^[ghijklmno]+$», «^[g-o]+$», «^[a-fj-o]+$». Що означають символи - та + у цих виразах.

Символ + може використовуватися як після окремих літер так і після послідовності літер у квадратних дужках:

 

>>> chat_words = sorted(set(w for w in nltk.corpus.nps_chat.words()))

>>> [w for w in chat_words if re.search('^m+i+n+e+$', w)]

['miiiiiiiiiiiiinnnnnnnnnnneeeeeeeeee', 'miiiiiinnnnnnnnnneeeeeeee', 'mine',

'mmmmmmmmiiiiiiiiinnnnnnnnneeeeeeee']

>>> [w for w in chat_words if re.search('^[ha]+$', w)]

['a', 'aaaaaaaaaaaaaaaaa', 'aaahhhh', 'ah', 'ahah', 'ahahah', 'ahh',

'ahhahahaha', 'ahhh', 'ahhhh', 'ahhhhhh', 'ahhhhhhhhhhhhhh', 'h', 'ha', 'haaa',

'hah', 'haha', 'hahaaa', 'hahah', 'hahaha', 'hahahaa', 'hahahah', 'hahahaha', ...]

Символ + означає одне або більше повторення: окремих символів, подібно до m, символів з набору, подібно до [fed] або символів з проміжку, подібно до [d-f]. Заміна + на символh * , який означає нуль або більше повторень - «^m*i*n*e*$» дозволить встановити відповідність до всіх слів , які знаходяться виразом «^m+i+n+e+$», а також до слів де немає деяких літер, наприклад me, min, and mmmmm.

Оператор ^ виконує іншу функцію, якщо його записати першим символом в квадратних дужках. Наприклад вираз «[^aeiouAEIOU]» встановлює відповідність до будь-яких символів крім голосних. В корпусі NPS Chat Corpus можна знайти , за допомогою виразу «^[^aeiouAEIOU]+$» всі слова в яких повністю відсутні голосні : :):):), grrr, cyb3r , zzzzzzzz. Також сюди увійшли слова які містять інші символи крім букв.

В наступних прикладах показані інші регулярні вирази для пошуку слів, які відповідають заданим шаблонам та показано використання символів: \, {}, (), та |:

 

>>> wsj = sorted(set(nltk.corpus.treebank.words()))

>>> [w for w in wsj if re.search('^[0-9]+\.[0-9]+$', w)]

['0.0085', '0.05', '0.1', '0.16', '0.2', '0.25', '0.28', '0.3', '0.4', '0.5',

'0.50', '0.54', '0.56', '0.60', '0.7', '0.82', '0.84', '0.9', '0.95', '0.99',

'1.01', '1.1', '1.125', '1.14', '1.1650', '1.17', '1.18', '1.19', '1.2', ...]

>>> [w for w in wsj if re.search('^[A-Z]+\$$', w)]

['C$', 'US$']

>>> [w for w in wsj if re.search('^[0-9]{4}$', w)]

['1614', '1637', '1787', '1901', '1903', '1917', '1925', '1929', '1933', ...]

>>> [w for w in wsj if re.search('^[0-9]+-[a-z]{3,5}$', w)]

['10-day', '10-lap', '10-year', '100-share', '12-point', '12-year', ...]

>>> [w for w in wsj if re.search('^[a-z]{5,}-[a-z]{2,3}-[a-z]{,6}$', w)]

['black-and-white', 'bread-and-butter', 'father-in-law', 'machine-gun-toting',

'savings-and-loan']

>>> [w for w in wsj if re.search('(ed|ing)$', w)]

['62%-owned', 'Absorbed', 'According', 'Adopting', 'Advanced', 'Advancing', ...]

Виконати самостійно. Повторити попередні приклади і пояснити використання символів : \, {}, (), та |.

Символ зворотної похилої риски (backslash) означає що наступний метасимвол втрачає своє спеціальне. Отже \. означає просто крапку. Послідовність у фігурних дужках, подібна до {3,5}, вказує на кількість повторів. Вертикальна риска вказує на можливість вибору між елементами, які стоять справа і зліва від неї. Круглі дужки вказують на область дії оператора. Вони можуть використовуватися з вертикальною рискою (диз'юнкція), подібно до виразу «w(i|e|ai|oo)t», який встановлює відповідність до слів wit, wet, wait, та woot.

Загальний перелік метасимволів регулярних виразів показаний у таблиці 1.

Основні метасимволи регулярних виразів

Таблиця 1.

Оператор

Дія

.

Відповідність до будь-якого символу

^abc

Відповідність до шаблону abc на початку стрічки

abc$

Відповідність до шаблону abc в кінці стрічки

[abc]

Відповідність до одного символу з набора

[A-Z0-9]

Відповідність до одного символу з проміжку

ed|ing|s

Відповідність до одної з визначених стрічок (диз’юнкція)

*

Нуль або більше повторів

+

Один або більше повторів

?

Нуль або один,наприклад. a?, [a-z]?- вказує на опціональність

{n}

Точно n повторів, де n не відємне ціле значенняr

{n,}

Мінімум n повторів

{,n}

Не більше ніж n повторів (максимум)

{m,n}

Мінімум m та максимум n повторів

a(b|c)+

Круглі дужки вказують на облась дії оператора

Інтерпретатор Python обробляє регулярний вираз, як звичайну стрічку. Якщо стрічка містить зворотну косу риску то наступний після неї символ інтерпретується спеціальним способом. Наприклад \b буде інтерпретуватися як backspace символ. В загальному, якщо використовувати регулярні вирази з зворотними косими рисками, необхідно вказати інтерпретатору не обробляти цю стрічку а відразу віддати її на обробку бібліотеці re . Це можна зробити додавши до регулярного виразу (стрічки) префікс r. Наприклад , стрічка r'\band\b' містить два символи \b , які інтерпретовані бібліотекою re відповідають границям слова а не символу backspace..

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]