- •Мета робота
- •Короткі теоретичні відомості
- •1. Поняття функції та модуля.
- •1.1. Створення скриптів
- •2. Генерація випадкового тексту за допомогою біграмів
- •3. Лексичні ресурси nltk. Корпуси слів
- •3.1. Корпус words
- •3.2. Корпус стоп-слів
- •3.3. Корпус імен
- •4. Словники
- •4.1. Словник із позначенням вимови
- •Виконати самостійно
- •4.2. Порівняльні (компаративні) словники
- •5. WordNet – лексична база даних англійської мови
- •5.1. Значення і синоніми
- •5.2. Ієрархія в WordNet
- •5.3. Лексичні зв’язки в WordNet.
- •5.4. Оцінка подібності в WordNet
- •Додаток а
- •Порядок виконання роботи
- •Література
- •Інтернет посилання
- •Методичні вказівки
3.2. Корпус стоп-слів
В NLTK також включений корпус стоп-слів (незначущі слова). Ці слова часто зустрічаються в текстах, але переважно не мають окремого лексичного значення і переважно видаляються з тексту при його подальшій обробці.
>>> from nltk.corpus import stopwords
>>> stopwords.words('english')
['a', "a's", 'able', 'about', 'above', 'according', 'accordingly', 'across', 'actually', 'after', 'afterwards', 'again', 'against', "ain't", 'all', 'allow', 'allows', 'almost', 'alone', 'along', 'already', 'also', 'although', 'always', ...]
Можна визначити функцію для визначення, який відсоток слів тексту не належить до незначущих слів.
>>> def content_fraction(text):
... stopwords = nltk.corpus.stopwords.words('english')
... content = [w for w in text if w.lower() not in stopwords]
... return len(content) / len(text)
...
>>> from __future__ import division
>>> content_fraction(nltk.corpus.inaugural.words())
0.45629395821182284
За допомогою списку стоп-слів відкинуто третину слів з тексту. Дана програма працює з двома видами корпусів: текстовим корпусом і лексичним ресурсом-словником.
3.3. Корпус імен
Наступний корпус NLTK це корпус імен, об’ємом 8000 одиниць, які поділені на категорії за родами (чоловічим та жіночим). В наступному прикладі здійснюється пошук імен, які зустрічаються в обох категоріях, тобто імен, які належать і жінкам і чоловікам.
>>> names = nltk.corpus.names
>>> names.fileids()
['female.txt', 'male.txt']
>>> male_names = names.words('male.txt')
>>> female_names = names.words('female.txt')
>>> [w for w in male_names if w in female_names]
['Abbey', 'Abbie', 'Abby', 'Addie', 'Adrian', 'Adrien', 'Ajay', 'Alex', 'Alexis', 'Alfie', 'Ali', 'Alix', 'Allie', 'Allyn', 'Andie', 'Andrea', 'Andy', 'Angel', 'Angie', 'Ariel', 'Ashley', 'Aubrey', 'Augustine', 'Austin', 'Averil', ...]
Переважно імена, які закінчуються на букву «а» належать жінкам. Для перевірки цього твердження можна побудувати умовний частотний розподіл і переглянути графічне зображення цього розподілу Рис.3.
>>> cfd = nltk.ConditionalFreqDist(
... (fileid, name[-1])
... for fileid in names.fileids()
... for name in names.words(fileid))
>>> cfd.plot()
Рис.3. Умовний частотний розподіл останніх букв чоловічих та жіночих імен.
Можна також відобразити частотний розподіл жіночих та чоловічих імен за першою літерою
>>> cfd_1_litera = nltk.ConditionalFreqDist(
(fileid, name[0])
for fileid in names.fileids()
for name in names.words(fileid))
>>> cfd_1_litera.plot()
4. Словники
Інший тип даних Python - словники. Словники іноді можна зустріти в інших мовах програмування, як "асоціативні блоки пам'яті" або "асоціативні масиви". На відміну від послідовностей, які індексуються за допомогою діапазону чисел, словники індексуються ключами, які можуть бути будь-яким незмінним типом; рядки і числа можуть завжди бути використані як ключі. Кортежі можуть використовуватися як ключі, якщо вони містять лише стрічки, числа, або кортежі; якщо кортеж містить будь-який змінний об'єкт або безпосередньо чи побічно, то кортеж не може використовуватися як ключ. Ви не можете використовувати списки як ключі, оскільки списки можна змінити в словнику через методи, такі як append() і extend() або можна змінити зрізами чи індексованими призначеннями
Словник по суті є неврегульованим набором ключів: ключ завжди виконує вимогу унікальності (в межах одного словника). Пара фігурних дужок створює порожній словник: {. Розміщення відокремленого комами списку пар key:value в межах фігурних дужок додає початкові пари key:value до словника; описаний прийом також допустимий при виведенні словника на друк.
Основні операції над словником - збереження значення з деяким ключем і витягання значення, за вказаним ключем. Також можливо видалити пару key:value за допомогою del. Якщо Ви зберігаєте ключ, який знаходиться вже у використанні, про старе значення, що пов'язане з цим ключем, інтерпретатор забуває. При спробі звернеться до такого неіснуючого ключа - виникне помилка.
Метод keys() об'єкту словник повертає список всіх ключів, використовуваних в словнику, в довільному порядку (якщо Ви хочете сортувати ключі, слід застосувати метод sort() для списку ключів). Перевірка, чи знаходиться єдиний ключ в словнику, слід використовувати метод has_key() словника.
Тут приведений маленький приклад, використання словника:
>>> tel = {'jack': 4098, 'sape': 4139}
>>> type(tel)
<type 'dict'>
>>> help(dict)
Help on class dict in module __builtin__:
class dict(object)
>>> tel['guido']= 4127
>>> tel
{'sape': 4139, 'guido': 4127, 'jack': 4098}
>>> tel['jack']
4098
>>> del tel['sape']
>>> tel['irv']= 4127
>>> tel
{'guido': 4127, 'irv': 4127, 'jack': 4098}
>>> tel.keys()
['guido', 'irv', 'jack']
>>> tel.has_key('guido')
True
>>> 'guido' in tel
True
dict() конструктор формує словник безпосередньо із списків пар "ключ:значення", збережених як кортежі. Коли пари формують шаблон, останній вноситься до списку для використання, шаблони можна стисло визначити із списками ключових значень.
>>> dict([('sape', 4139), ('guido', 4127), ('jack', 4098)])
{'sape': 4139, 'jack': 4098, 'guido': 4127}
>>> dict([(x, x**2) for x in (2, 4, 6)]) # безпосереднє використання списку
{2: 4, 4: 16, 6: 36}
Коли ключі - прості стрічки, іноді простіше визначати такі пари, що використовують параметри з ключами:
>>> dict(sape=4139, guido=4127, jack=4098)
{'sape': 4139, 'jack': 4098, 'guido': 4127}
