МІНІСТЕРСТВО ОСВІТИ І НАУКИ УКРАЇНИ
НАЦІОНАЛЬНИЙ УНІВЕРСИТЕТ “ЛЬВІВСЬКА ПОЛІТЕХНІКА”
іНСТИТУТ КОМП’ютерних НАУК та ІНФОРМАЦІЙНИХ ТЕХНОЛОГІЙ
Кафедра “Системи автоматизованого проектування”
ЗВІТ
До лабораторної роботи №2
ВИВЧЕННЯ БІБЛІОТЕКИ ПРИКЛАДНИХ ПРОГРАМ NLTK, ДЛЯ ОПРАЦЮВАННЯ ТЕКСТІВ ПРИРОДНОЮ МОВОЮ.
ОСНОВИ ПРОГРАМУВАННЯ НА МОВІ PYTHON(частина 2).
Виконав:
Студент групи ПРЛ-1
Львів-2007
МЕТА РОБОТИ
Вивчення основ програмування на мові Python.
Ознайомлення з регулярними виразами.
ТЕОРЕТИЧНІ ВІДОМОСТІ
1.1 Засоби керування логікою.
Програми, які згадувалися в лабораторній роботі №1, доволі прості але дозволяють здійснювати операції над послідовностями слів і зокрема над кожним з них. Ми працювали зі списками, які містять декілька слів , але є потреба працювати з такими списками, які містять тисячі слів . Це зумовлює необхідність мати засоби керувати поведінкою програм.
1.1.1 Засоби здійснення простого керування.
Більшість мов програмування дозволяють виконання окремих блоків програми коли використовуються умовні вирази або if твердження. В наступній програмі ми створили змінну word, яка містить значення ‘cat’ типу стрічка. If- вираз перевіряє умову чи довжина слова <5 чи ні. Якщо умова виразу справджується то виконується тіло if твердження і виконується оператор print .
Якщо змінити умови виразу (довжина слова більша або рівна 5) вираз не справджується і оператор print не виконується.
If твердження так як і For твердження це є керуючі (управляючі) структури, вони керують виконанням програми. Вони вибирають, яка частина коду в тілі програми буде виконуватися. Стрічка з операторами If та For повинна завершуватися двокрапкою. Якщо потрібно, щоб щось відбувалося, коли умовний вираз не справджується, використовується оператор else в If – твердженні.
1.1.2 Умовні вирази
Python підтримує широкий набір операторів для встановлення взаємозв’язків між змінними (значеннями). Повний набір цих операторів наведений у таблиці 1.
Таблиця 1.
Звичайно ми використовуємо оператори умовних переходів як частину If виразів (твердження). Але ми можемо використовувати ці оператори безпосередньо.
В результаті отримали вирази з булевими значеннями True, False. In not це є булевий оператор. Стрічки і списки також підтримують умовні вирази.
Стрічки також мають методи для перевірки чи послідовність символів відповідає початковим або в кінцевим елементам стрічки.
Цілі, стрічки і списки є типами даних в Python. Кожне значення (змінна) мають свій тип. Цей тип визначає, які операції ви можете виконувати зі змінною. Наприклад, ми можемо індексувати стрічки і списки але не можемо індексувати цілі.
1.2.2 Проведення обчислень з використанням словників.
Значення зібрані у словнику можуть бути будь-яким об’єктом але найчастіше це цілі. Це дає можливість використовувати словники для організації різноманітних лічильників для різних типів даних. Наприклад можна обчислити (створити лічильник) для всіх літер абетки.
Зверніть увагу як in використовується в двох різних місцях: for letter in phrase – ітерації для кожної літери і виконується тіло for циклу. Всередині цього циклу умовний вираз if letter not in count перевіряє наявність літери у словнику. Якщо вона відсутня створюється новий запис у словнику і встановлюється його значення в нуль. Тепер відомо, що записи існують і мають значення нуль або не нуль. На завершення збільшується лічильник на одиницю використовуючи оператор +=. Виводимо вміст count на екран. Це саме можна записати із використанням модуля defaultdict.
Для впорядкування словника за абеткою використовується функція sorted(). Ця функція подібна до sort() метода для послідовностей але вона формує нову копію відсортованих значень.
1.2.3 Отримання унікальних записів
Розглянемо приклад. Нехай необхідно створити словник на основі документу. Таким словником буде відсортований список слів, що зустрічаються без врахування їх повторюваності. У цьому випадку потрібно провести не обчислення а запис даних, які аналізуються незалежно від їх повторюваності. Цього можна досягнути двома шляхами. Перший – використовуючи списки.
Аналогічний результат можна отримати використавши словники. Кожне слово, яке зустрічається записуємо в словник як ключ. Всі значення ставимо рівними 1 або інше.
Третій шлях здійснити те саме найкращий зі всіх: використовуючи тип даних властивий Python set()(набір). Можна конвертувати речення(тип даних список) в набір, використовуючи set(sentence) .
Порядок слів не є таким важливим. Основне, що перетворення списку в набір приводить до видалення повторень і наступне сортування перетворює набір назад у список. Наступна програма виконує все вище перелічене.
Завжди існує більш ніж один шлях розв’язання проблеми з написанням програми. В даному випадку використано три підходи, які використовують різні типи (списки, словники, набори). Використання типу даних Set найбільш точно розв’язує задачу і потребує найменше роботи.
1.2.4.Пропорційне збільшення.
Можна використати словники для обрахунку розповсюдження слів. Наприклад наступний код перегляне драму Макбет і визначить частоту кожного слова.
Цей приклад демонструє зручність NLTK для доступу до корпусу. . Зараз ми дізналися що gutenberg.tokenized повертає список слів, в цьому випадку з Макбета, кожне з яких обробляється в циклі for. Ми перетворили кожне слово в нижній регістр використовуючи метод для стрічок і використали словник для організації набору лічильників один на кожне слово. Можна перевірити вміст словника.
Хід роботи
Python 2.5.1 (r251:54863, Apr 18 2007, 08:51:08) [MSC v.1310 32 bit (Intel)] on win32
Type "copyright", "credits" or "license()" for more information.
****************************************************************
Personal firewall software may warn about the connection IDLE
makes to its subprocess using this computer's internal loopback
interface. This connection is not visible on any external
interface and no data is sent to or received from the Internet.
****************************************************************
IDLE 1.2.1
>>> sentence='she sells sea shells by the sea shore'
>>> word=sentence.split()
>>> words
['she', 'sells', 'sea', 'shells', 'by', 'the', 'sea', 'shore']
>>> for word in words:
if word.startswith('sh'):
print word
she
shells
shore
>>> sentence1=[]
>>> for word in words:
if word.startswith('se'):
sentence1.append('like'+' '+word)
else:
sentence1.append(word)
>>> sentence1
['she', 'like sells', 'like sea', 'shells', 'by', 'the', 'like sea', 'shore']
>>>
>>> import string
>>> sentence2=string.join(sentence1)
>>> sentence2
'she like sells like sea shells by the like sea shore'
3.2
>>> str='Viktor Ivanna Volodymyrivna'
>>> str1=''
>>> str2=''
>>> for letter in str:
if letter not in 'U,u,I,i,O,o,A,a,E,e,Y,y':
str1=str1+letter
else:
str2+letter
'i'
'o'
'I'
'a'
'a'
'o'
'o'
'y'
'y'
'i'
'a'
>>> for letter in str:
if letter not in ['U','u','I','i','O','o','A','a','E','e','Y','y']:
str1=str1+letter
>>> str1
'Vktr vnn VldmrvnVktr vnn Vldmrvn'
>>>
3.3
>>> text='Many people assume that any literate person who knows more than one language can automatically translate or interpret.'
>>> text1=''
>>> for char in text:
if char in ['e']:
text1=text1+'3'
elif char in ['i']:
text1=text1+'1'
elif char in ['o']:
text1=text1+'0'
elif char in ['l']:
text1=text1+'1'
elif char in ['s']:
text1=text1+'5'
elif char in ['.']:
text1=text1+'5w33t!'
elif char in ['ate']:
text1=text1+'8'
else:
text1=text1+char
>>> text1
'Many people assume that any literate person who knows more than one language can automatically translate or interpret.5w33t!Many p30p13 a55um3 that any 11t3rat3 p3r50n wh0 kn0w5 m0r3 than 0n3 1anguag3 can aut0mat1ca11y tran51at3 0r 1nt3rpr3t5w33t!'
>>>
3.4
>>> d={}
>>> d['nose']='n'
>>> d['nice']='adj'
>>> d['write']='v'
>>> d
{'write': 'v', 'nose': 'n', 'nice': 'adj'}
>>> del d['nice']
>>> d
{'write': 'v', 'nose': 'n'}
>>>
3.5
>>> e={}
>>> e['headword']='Goverla'
>>> e['part-of-speach']='noun'
>>> e['sense']='mountain'
>>> e['example']='Goverla is the highest mountain in Ukraine'
>>> e
{'headword': 'Goverla', 'part-of-speach': 'noun', 'example': 'Goverla is the highest mountain in Ukraine', 'sense': 'mountain'}
>>>
3.6
>>> d1{}
SyntaxError: invalid syntax
>>> d1={}
>>> d1['mother']='noun'
>>> d1['read']='verb'
>>> d1['big']='adj'
>>> d1
{'read': 'verb', 'big': 'adj', 'mother': 'noun'}
>>> d2={}
>>> d2['machen']='do'
>>> d2['Muter']='mather'
>>> d2['Schule']='school'
>>> d2
{'Schule': 'school', 'machen': 'do', 'Muter': 'mather'}
>>> d1.update(d2)
>>> d1
{'Schule': 'school', 'machen': 'do', 'mother': 'noun', 'read': 'verb', 'big': 'adj', 'Muter': 'mather'}
>>> d2
{'Schule': 'school', 'machen': 'do', 'Muter': 'mather'}
>>>
3.7
>>> sentence='The process of translation involves delicate decision-making at every step and on many levels.Translation is a complex process.'
>>> sen=sentence.split()
>>> sen
['The', 'process', 'of', 'translation', 'involves', 'delicate', 'decision-making', 'at', 'every', 'step', 'and', 'on', 'many', 'levels.Translation', 'is', 'a', 'complex', 'process.']
>>> count1={}
>>> for word in sen:
if word not in count1:
count1[word]=0
count1[word]+=1
>>> count1
{'and': 1, 'on': 1, 'process.': 1, 'levels.Translation': 1, 'process': 1, 'of': 1, 'is': 1, 'decision-making': 1, 'step': 1, 'complex': 1, 'every': 1, 'delicate': 1, 'a': 1, 'many': 1, 'The': 1, 'translation': 1, 'involves': 1, 'at': 1}
>>>
>>> m=sorted(count1.items())
>>> for word in m:
print word
('The', 1)
('a', 1)
('and', 1)
('at', 1)
('complex', 1)
('decision-making', 1)
('delicate', 1)
('every', 1)
('involves', 1)
('is', 1)
('levels.Translation', 1)
('many', 1)
('of', 1)
('on', 1)
('process', 1)
('process.', 1)
('step', 1)
('translation', 1)
>>>
3.8.
>>> t=’Many people assume that any literate person who knows more than one language can automatically translate or interpret.’
>>> import re
>>> from nltk import re_show
>>> re_show('[a-zA-Z]+',t)
{Many} {people} {assume} {that} {any} {literate} {person} {who} {knows} {more} {than} {one} {language} {can} {automatically} {translate} {or} {interpret}.
>>> re_show('[A-Z][a-z]*',t)
’{Many} people assume that any literate person who knows more than one language can automatically translate or interpret.’
>>> re_show('\d+(\.\d+)?',t)
’Many people assume that any literate person who knows more than one language can automatically translate or interpret.’
>>> re_show('\w+|[^\w\s]+',t)
{Many} {people} {assume} {that} {any} {literate} {person} {who} {knows} {more} {than} {one} {language} {can} {automatically} {translate} {or} {interpret}{.}
>>>
3.9
>>> text='It is devised as 2*3+8 an intensive training program, exposing the real demands and the difficulties faced by a professional translator.'
>>> import re
>>> re.findall(r'\s\d+[*]\d+[+]\d+',text)
[' 2*3+8']
>>> re.findall(r'\s(a|an|the)\s',text)
['an', 'the', 'the', 'a']
>>>
3.10
>>>str=international.txt:Ivanna@vvt.ukr.com(Inet)international.txt:Ivanna@kyivstar.com.ua;internat.txt: created by Ted Broun (Ted.Broun@bigmir.com)'
>>> re.findall(r'(\w+\@)',str)
['Ivanna@', 'Ivanna@', 'Broun@']
>>> re.findall(r'(\w+\.)',str)
['international.', 'vvt.', 'ukr.', 'international.', 'kyivstar.', 'com.', 'internat.', 'Ted.', 'bigmir.']
3.11
>>> str='string comes to idle'
>>> str1=[]
>>> str2=str.split()
>>> str2
['string', 'comes', 'to', 'idle']
>>> for word in str2:
if word[0] in 'aueio':
str1.append(word+'ay')
elif word[0] in 'qwrtypsdfghkljzxcvbnm':
str1.append(word[1:]+word[0] +'ay')
>>> str1
['tringsay', 'omescay', 'otay', 'idleay']
>>> str1=[]
>>> for word in str2:
if word[0] in 'aueio':
str1.append(word+'ay')
elif word[0] in 'qwrtypsdfghkljzxcvbnm':
str1.append('in'+word[:3]+'ay')
>>> str1
['instray', 'incomay', 'intoay', 'idleay']
>>>
>>>
3.12
>>> text='She ate delicious dish.'
>>> text=re.sub('ate','8',text)
>>> text1=''
>>> count=0
>>> for char in text:
count=text.index(char)
if char='e':
text1+=re.sub(char,'3',text[count:count+1])
elif char='o':
text1+=re.sub(char,'0',text[count:count+1])
elif char='1':
text1+=re.sub(char,'l',text[count:count+1])
elif char='s':
text1+=re.sub(char,'5',text[count:count+1])
elif char='.':
text1+=re.sub(char,'5w33t!',text[count:count+1])
else:
text1+=char
>>> text1
'Sh3 8 d3|lclOu5 dl5h5w33t!'
Висновок. На цій лабораторній роботі я вивчила основи програмування на мові Python.
Ознайомилася з регулярними виразами.