Міністерство освіти і науки України
Національний університет
“Львівська політехніка”
Кафедра “Системи автоматизованого проектування”
ЗВІТ
до лабораторної роботи №4
з дисципліни «Комп’ютерна лінгвістика»
на тему:
ВИВЧЕННЯ БІБЛІОТЕКИ ПРИКЛАДНИХ ПРОГРАМ NLTK, ДЛЯ ОПРАЦЮВАННЯ ТЕКСТІВ ПРИРОДНОЮ МОВОЮ.
ОБРОБКА ОКРЕМИХ СЛІВ (підрахунок слів та лексична база даних англійської мови).
Виконала:
студентка групи ПРЛс-1
ЛЬВІВ-2008
МЕТА РОБОТИ
Вивчення основ програмування на мові Python.
Ознайомлення із способами підрахунку слів.
Ознайомлення з лексичною базою даних англійської мови WordNet.
КОРОТКІ ТЕОРЕТИЧНІ ВІДОМОСТІ
Оскільки, при роботі з текстом часто потрібно здійснювати подібні обчислення то в NLTK реалізовано окремий клас FreqDist().
Розподіл (місця в тексті де вони зустрічаються) tokens слів змінюється по тексту. Можна візуалізувати такий розподіл.
Можна використати частотний розподіл для визначення довжин слів у корпусі. Для кожного слова визначаємо його довжину і збільшуємо лічильник, який відповідає словам з даною довжиною.
Частотні розподіли дозволяють проводити підрахунок кількості вживання кожного слова в тексті. Узагальнимо цю ідею, щоб проаналізувати розповсюдження слів в певному контексті. Умовний частотний розподіл це набір частотних розподілів, кожен один для іншої умови. За умову приймемо попереднє слово. У наступні програмі визначена функція train_model(), яка використовує ConditionalFreqDist() щоб перерахувати слова, в залежності від контексту, визначеного попереднім словом (запам'ятовується в prev). Ця функція переглядає корпус, збільшуючи відповідний лічильник, і оновлюючи значення, яке відповідає попередньому слову.
Функція generate_model() містить простий цикля, який генерує текст: встановлюємо початковий контекст і програма вибирає слово, яке найчастіше зустрічається в цьому контексті. Це слово буде наступним після поточного слова (використовується метод max()), і яке потім використовується, як новий контекст. Цей простий підхід до генерації тексту швидко приводить до зациклювання, потрібен інший метод для вибору наступного слова серед доступних слів.
Колокації це пари слів, які зустрічаються частіше ніж окремі слова в тексті. Можна знайти колокації підрахувавши, як часто пари слів зустрічаються в тексті порівняно з загальною кількістю вживань цих слів у тексті. Наступна програма здійснює такі підрахунки (стор.8).
WordNet, це семантично орієнтований словник англійської мови, подібний до традиційних тезаурусів але з більш багатою структурою. У WordNet слова групуються у набори синонімів – синсети, кожен із своїм визначенням і зв’язками з іншими синсетами. WordNet 3.0 розповсюджується разом з NLTK і містить 145000 синсетів. Хоча WordNet розроблявся для психолінгвістики - цей словник широко використовується в NLP та в задачах інформаційного пошуку.
Семантична подібність двох понять пов’язана з довжиною шляху між цими поняттями в WordNet . Пакет wordnet містить багато засобів для здійснення таких вимірювань (Leacock-Chodorow, Wu-Palmer, Resnik, Jiang-Conrath, Lin ). Наприклад path_similarity (присвоює значення від 0 до 1) базується на найкоротшому шляху, який поєднує поняття за ієрархією гіперонімів (-1 означає що шлях (спільний гіперонім) не знайдено).
ТЕКСТИ ПРОГРАМ НА МОВІ Python
Модифікувати функцію generate_model() використовуючи random.choose() метод для випадкового вибору наступного слова з набору доступних слів.
>>> import nltk
>>> from nltk import corpus
>>> import random
>>> def train_model(text):
cfdist = nltk.ConditionalFreqDist()
prev = None
for word in text:
cfdist[prev].inc(word)
prev = word
return cfdist
>>> def generate_model(cfdist, word, num=20):
for i in range(num):
print word,
word = random.choice(list(cfdist[word]))
>>> model = train_model(nltk.corpus.genesis.words('english-kjv.txt'))
>>> generate_model(model, 'die')
die before they and came and followed the excellency of Ur of Aholibamah , Cast out this pit : wherefore
7. .Модифікуйте програму генерації текстів (п.1.1.5) здійснюючи тренування на текстах, які належать до різних жанрів Brown Corpus, або на окремих текстах корпусу Gutenberg. Порівняйте отримані результати, якщо використовувати різні стартові слова.
>>> import nltk
>>> from nltk import corpus
>>> def train_model(text):
cfdist = nltk.ConditionalFreqDist()
prev = None
for word in text:
cfdist[prev].inc(word)
prev = word
return cfdist
>>> def generate_model(cfdist, word, num=30):
for i in range(num):
print word,
word = cfdist[word].max()
>>> model = train_model(nltk.corpus.brown.words(categories='a'))
>>> model['fear']
<FreqDist with 4 samples>
>>> list(model['fear'])
['being', 'failure', 'Peterson', 'in']
>>> generate_model(model, 'fear')
fear being done , and the first time , and the first time , and the first time , and the first time , and the first time , and
>>>
model = train_model(nltk.corpus.brown.words(categories='d'))
>>> model['fear']
<FreqDist with 24 samples>
>>> list(model['fear'])
['most', 'has', 'that', 'these', 'of', 'is', 'parties', ',', '.', 'will', 'to', 'which', 'in', 'the', ':', '?', 'more']
>>> generate_model(model, 'fear')
fear , and the world , and the world , and the world , and the world , and the world , and the world , and the world ,
>>> model = train_model(nltk.corpus.brown.words(categories='g'))
>>> model['fear']
<FreqDist with 37 samples>
>>> list(model['fear'])
['set', 'may', 'to', 'that', 'I', 'of', 'is', 'persists', ',', '.', '--', 'have', 'without', 'through', 'which', '(', 'alone']
>>> generate_model(model, 'fear')
fear of the `` I have been a few days , and the `` I have been a few days , and the `` I have been a few days
>>> model = train_model(nltk.corpus.brown.words(categories='r'))
>>> model['fear']
<FreqDist with 5 samples>
>>> list(model['fear'])
['things', 'entered', 'of', 'explanations', 'that']
>>> generate_model(model, 'fear')
fear things . `` I was a `` I was a `` I was a `` I was a `` I was a `` I was a `` I was
>>> model = train_model(nltk.corpus.brown.words(categories='r'))
>>> model['smile']
<FreqDist with 4 samples>
>>> list(model['fear'])
['things', 'entered', 'of', 'explanations', 'that']
>>> generate_model(model, 'fear')
fear things . `` I was a `` I was a `` I was a `` I was a `` I was a `` I was a `` I was
>>> model = train_model(nltk.corpus.brown.words(categories='d'))
>>> model['hate']
<FreqDist with 3 samples>
>>> generate_model(model, 'fear')
fear , and the world , and the world , and the world , and the world , and the world , and the world , and the world ,
>>> generate_model(model, 'hate')
hate to the world , and the world , and the world , and the world , and the world , and the world , and the world , and
>>> model = train_model(nltk.corpus.brown.words(categories='g'))
>>> model['hate']
<FreqDist with 4 samples>
>>> generate_model(model, 'hate')
hate of the `` I have been a few days , and the `` I have been a few days , and the `` I have been a few days
>>> generate_model(model, 'yes')
yes , and the `` I have been a few days , and the `` I have been a few days , and the `` I have been a few
>>> generate_model(model, 'solitude')
solitude None Northern liberals in the `` I have been a few days , and the `` I have been a few days , and the `` I have been
9. . Напишіть програму, яка виводить на екран пари слів, які найчастіше зустрічаються в тексті, виключивши неінформативні слова і впорядкувавши їх по спаданню за частотою.
>>> import nltk
>>> from nltk import corpus
>>> def collocations(words):
from operator import itemgetter
# Count the words and bigrams
wfd = nltk.FreqDist(words)
pfd = nltk.FreqDist(tuple(words[i:i+2]) for i in range(len(words)-1))
#
scored = [((w1,w2), score(w1, w2, wfd, pfd)) for w1, w2 in pfd]
scored.sort(key=itemgetter(1), reverse=True)
return map(itemgetter(0), scored)
>>> def score(word1, word2, wfd, pfd, power=3):
freq1 = wfd[word1]
freq2 = wfd[word2]
freq12 = pfd[(word1, word2)]
return freq12 ** power / float(freq1 * freq2)
>>> ignored_words=list(corpus.stopwords.words('english'))
>>> for file in nltk.corpus.webtext.files():
words = [word.lower() for word in nltk.corpus.webtext.words(file) if len(word) > 2]
if word not in ignored_words:
print file, [w1+' '+w2 for w1, w2 in collocations(words)[:15]]
overheard ['new york', 'teen boy', 'teen girl', 'you know', 'middle aged', 'flight attendant', 'puerto rican', 'last night', 'little boy', 'taco bell', 'statue liberty', 'bus driver', 'ice cream', 'don know', 'high school']
pirates ['jack sparrow', 'will turner', 'elizabeth swann', 'davy jones', 'flying dutchman', 'lord cutler', 'cutler beckett', 'black pearl', 'tia dalma', 'heh heh', 'edinburgh trader', 'port royal', 'bamboo pole', 'east india', 'jar dirt']
singles ['non smoker', 'would like', 'dining out', 'like meet', 'age open', 'sense humour', 'looking for', 'social drinker', 'down earth', 'long term', 'quiet nights', 'easy going', 'medium build', 'nights home', 'weekends away']
wine ['high toned', 'top ***', 'not rated', 'few years', 'medium weight', 'year two', 'cigar box', 'cote rotie', 'mixed feelings', 'demi sec', 'from half', 'brown sugar', 'bare ****', 'tightly wound', 'sous bois']
10.. Напишіть програму для створення таблиці частотності слів для різних жанрів (подібно до модальних дієслів). Виберіть довільні слова і знайдіть слова чия присутність або відсутність є типовою для певного жанру.
>>> import nltk
>>> from operator import itemgetter
>>> from nltk import corpus
>>> ignored_words=list(corpus.stopwords.words('english'))
>>> def CBfreq(sec):
fd=nltk.FreqDist(sec)
sorted_words_counts=sorted(fd.items(),key=itemgetter(1),reverse=True)
for token in sorted_words_counts:
if token not in ignored_words:
print token
>>> CBfreq(nltk.corpus.brown.words(categories='b'))