МІНІСТЕРСТВО ОСВІТИ І НАУКИ УКРАЇНИ
НАЦІОНАЛЬНИЙ УНІВЕРСИТЕТ “ЛЬВІВСЬКА ПОЛІТЕХНІКА”
ІНСТИТУТ КОМП’ЮТЕРНИХ НАУК ТА ІНФОРМАЦІЙНИХ ТЕХНОЛОГІЙ
Кафедра “Системи автоматизованого проектування”
/
Звіт
до лабораторної роботи №8
на тему:
«ВИВЧЕННЯ БІБЛІОТЕКИ ПРИКЛАДНИХ ПРОГРАМ NLTK, ДЛЯ ОПРАЦЮВАННЯ ТЕКСТІВ ПРИРОДНОЮ МОВОЮ.
СТРУКТУРНЕ ПРОГРАМУВАННЯ МОВОЮ PYTHON (частина2).»
МЕТА
Вивчення основ програмування на мові Python. Вивчення основ структурного програмування мовою Python. Повторення та закріплення знань отриманих при виконанні попередніх лабораторних робіт. Покращення загальних навичок у програмуванні.
ВИКОНАННЯ ПРАКТИЧНИХ ЗАВДАНЬ
Варіант № 16
Завдання № 1,4,9,12,15,17
3. Створити список списків слів [ [‘’,’’,’’… ], [[‘’,’’,’’… ], [[‘’,’’,’’…],…] (наприклад текст складається з речень, які складаються з стрічок). Здійснити операцію присвоювання text2 = text1[:], та здійснити операцію присвоювання нового значення одному зі слів (text1[1][1] = 'Monty'). Перевірити як ці операції вплинули на text2. Результат письмово пояснити.
/
Змінна text2 не змінилась, бо рядок text2= text1[:] означає копіювання вмісту змінної.
6. Написати програму для створення двовимірного масиву word_vowels елементами якого є набори. Програма повинна обробити список слів і додати результати обробки до word_vowels[l][v] де l – довжина слова, v – кількість голосних у слові.
/
11. Гематрія – метод виявлення прихованого змісту слів на основі порівняння чисел, які відповідають словам. Слова з однаковими числами мають однаковий зміст. Число слова визначається сумуванням чисел, як відповідають його літерам. Написати функцію decode() для обробки тексту, яка випадковим чином замінює слова на їх Гематрія-еквіваленти. Чи вдалося виявити "прихований зміст" тексту? (Використовувати letter_vals з попередньої задачі).
/
14. Написати функцію, яка обробляє список слів (з дублюванням слів) і повертає список слів (без дублювання) відсортований в порядку спадання їх частоти.
/
15. Написати функцію, яка приймає текст і словник , як аргументи і повертає набір слів, які є у тексті але відсутні у словнику. Аргументи повинні бути представлені, як списки стрічок. Чи може функція мати один рядок при використанні set.difference()?
/
17. В NLTK реалізовано алгоритм Левенштайна для порівняння стрічок. Спробуйте скористатись цим модулем nltk.edit_dist(). Яким чином в цьому модулі використовується динамічне програмування? Який підхід використовується знизу-вверх чи зверху-вниз? Пояснити письмово.
/
/
Відстань Левенштайна обраховує відстань між двома стрічками, використовуючи підхід знизу-вверх.
ВИСНОВОК
На цій лабораторній роботі я ознайомилася з явищем гематрії, та навчилася обраховувати відстань Левенштайна у мові програмування Python.
1.Створити список слів і зберегти їх в змінній sent1. Здійснити операцію присвоювання sent2 = sent1. Змінити один з елементів в sent1 і перевірити чи змінився sent2. Результат письмово пояснити.
4.Завантажити функцію Python deepcopy() ( from copy import deepcopy). Прочитати документацію про цю функцію. Перевірити яким чином ця функція створює нові копії об’єктів.
>>> letter_vals = {'a':1, 'b':2, 'c':3, 'd':4, 'e':5, 'f':80, 'g':3, 'h':8,'i':10, 'j':10, 'k':20, 'l':30, 'm':40, 'n':50, 'o':70, 'p':80, 'q':100, 'r':200, 's':300, 't':400, 'u':6, 'v':6, 'w':800, 'x':60, 'y':10, 'z':7}
9.Гематрія – метод виявлення прихованого змісту слів на основі порівняння чисел, які відповідають словам. Слова з однаковими числами мають однаковий зміст. Число слова визначається сумуванням чисел, як відповідають його літерам. Написати функцію gematria() для сумування числових значень літер в слові згідно наступних значень letter_vals:
Функція decode() повинна приймати один аргумент текст, який повинен бути списком слів або якщо текст стрічка то його потрібно буде перетворити у список. Слова з тексту повинні переглядатися одне за одним і для слова визначається його гематрія (число). Серед довільного списку слів вибираються слова які мають таке саме значення гематрії і серед них на екран виводиться випадково вибране слово.# -*- coding: utf-8 -*-# імпортуємо все що буде потрібноimport nltkimport random# слова для заміни будемо брати з корпуса слівfrom nltk.corpus.words import wordsletter_vals = {'a':1, 'b':2, 'c':3, 'd':4, 'e':5, 'f':80, 'g':3, 'h':8,'i':10, 'j':10, 'k':20, 'l':30, 'm':40, 'n':50, 'o':70, 'p':80, 'q':100, 'r':200, 's':300, 't':400, 'u':6, 'v':6, 'w':800, 'x':60, 'y':10, 'z':7}def gematr(word):"""Функція для визначення значення гематрії довільного слова (стрічки символів)""" assert isinstance(word, basestring), "argument to gematr() must be a string" return sum([letter_vals[char] for char in word.lower()])def decode(text):"""Функція для заміни слів їх гематрія еквівалентами"""
assert isinstance(word, basestring), "argument to decode() must be a string"
words_for_choice=words.words() for word in text.split(): if word.isalpha(): print word, random.choice([w for w in words_for_choice if gematr(w)==gematr(word)]) else: print word>>> decode('I love Sveta')I adelove JulienSveta irrenderable>>>
12.Написати функцію shorten(text, n) обробки тексту , для вилучення n найбільш частотних слів в тексті. Яким чином змінилась читабельність тексту, після вилучення цих слів?
15.Написати функцію, яка приймає текст і словник, як аргументи і повертає набір слів, які є у тексті але відсутні у словнику. Аргументи повинні бути представлені, як списки стрічок. Чи може функція мати один рядок при використанні set.difference()?
/
17.В NLTK реалізовано алгоритм Левінштейна для порівняння стрічок. Спробуйте скористатись цим модулем nltk.edit_dist(). Яким чином в цьому модулі використовується динамічне програмування? Який підхід використовується знизу-вверх чи зверху-вниз? Пояснити письмово.
/
/
Відстань Левенштайна обраховує відстань між двома стрічками, використовуючи підхід знизу-вверх.
6. Написати програму для створення двовимірного масиву word_vowels елементами якого є набори. Програма повинна обробити список слів і додати кожне зі слів до word_vowels[l][v] де l – довжина слова, v – кількість голосних у слові.Отже, якщо у мене, наприклад, список слів Іван, Петро, Василь - то я повинен в комірку масиву з індексами 4,2 записати слово Іван, в комірку масиву з індексами 5,2 записати слово Петро, в комірку масиву з індексами 6,2 записати слово Василь.import nltkfrom nltk.corpus import brownlist_w=[w.lower() for w in brown.words()[:10]] # список слів# побудова двовимірного масиву# сторінка 12 лаб.робота №7#>>> m, n = 3, 7#>>> array = [[set() for i in range(n)] for j in range(m)] #>>> array[2][5].add('Alice')#>>> pprint.pprint(array)#[[set([]), set([]), set([]), set([]), set([]), set([]), set([])],#[set([]), set([]), set([]), set([]), set([]), set([]), set([])],#[set([]), set([]), set([]), set([]), set([]), set(['Alice']), set([])]]#m, n - розміри масиву #як їх отримати,#максимальне значення, яке може мати m - це довжина найдовшого слова зі списку #максимальне значення, яке може мати n - це найбільша кількість голосних у слові зі списку len_m_of_array=max([len(w) for w in list_w])len_n_of_array=max([len([char for char in w if char in 'aoieu']) for w in list_w])array = [[set() for i in range(len_n_of_array+1)] for j in range(len_m_of_array+1)]# заповнення масивуfor w in list_w: array[len(w)][len([char for char in w if char in 'aoieu'])].add(w)# переглядаю масивpprint.pprint(array)Це рішення має одну проблему. Я два рази для кожного слова знаходжу його довжину та кількість голосних. Перший раз при визначенні розміру масиву, а другий при його заповненні. Потрібно подумати, як уникнути цих подвійних обчислень.
ВИСНОВОК
На цій лабораторній роботі я ознайомилася з явищем гематрії, та навчилася обраховувати відстань Левенштайна у мові програмування Python.