Поиск по базе сайта:
Методичні вказівки до лабораторної роботи №5 з дисципліни «Комп’ютерна лінгвістика» для студентів спеціальності 02030303 «Прикладна лінгвістика» icon

Методичні вказівки до лабораторної роботи №5 з дисципліни «Комп’ютерна лінгвістика» для студентів спеціальності 02030303 «Прикладна лінгвістика»




Скачати 366.46 Kb.
НазваМетодичні вказівки до лабораторної роботи №5 з дисципліни «Комп’ютерна лінгвістика» для студентів спеціальності 02030303 «Прикладна лінгвістика»
Сторінка1/6
Дата конвертації06.01.2013
Розмір366.46 Kb.
ТипМетодичні вказівки
  1   2   3   4   5   6


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

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

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


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





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


ПОЧАТКОВА ЕТАПИ ОБРОБКИ ТЕКСТІВ ПРИРОДНОЮ МОВОЮ.


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

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

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

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


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

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

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


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

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


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

№ 3522 від 2.06.2011


Львів-2011

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



Укладачі:

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

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



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

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



Рецензент:

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

Мета робота


  1. Вивчення методів роботи з файлами на локальних дисках та з Інтернету.

  2. Використання Юнікоду при обробці текстів.

  3. Нормалізація текстів, стемінг, лематизація та сегментація.
^

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


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

>>> import nltk, re, pprint

>>> from __future__ import division

В модулі nltk містяться корпуси текстів та різноманітні функції, що призначені для обробки текстів.

Модуль re містить функції, що призначені для роботи з регулярними виразами.

Функції, що містяться у модулі pprint використовуються для зручного виводу на екран списків, кортежів та словників.

Функція division з модулю __future__ призначена для виведення на екран результатів ділення у вигляді дробу. За замовченням в Питоні результати ділення виводяться як ціле число.
^

В результаті виконання лабораторної роботи будуть вирішені наступні питання:


  1. Як написати програму для доступу до текстів з локальних файлів та з Інтернету, які є необмеженими джерелами лінгвістичних даних?

  2. Як поділити текст на окремі слова та розділові знаки, для одержання можливості проводити подальший аналіз тексту?

  3. Як написати програму для представлення результатів роботи в певному форматі та зберегти їх у файлі?
^

1. Доступ до текстів з Інтернету та локальних дисків.


Важливими джерелами даних для здійснення лінгвістичних досліджень є корпуси текстів, що містяться в модулі nltk. Звичайно, що дослідник може використовувати і власноруч зібрані тексти, що містяться на його комп’ютері та тексти з Інтернету. Розглянемо різні засоби для доступу до них.
^

1.1. Електронні книжки


Частина електронних книжок з Project Gutenberg розповсюджується разом з NLTK у вигляді корпуса текстів. Для використання інших текстів з цього проекту можна переглянути каталог 25000 електронних книжок за адресою http://www.gutenberg.org/catalog/ та встановити адресу (URL) потрібного текстового файлу в ASCII кодуванні.

90% текстів в Project Gutenberg є англійською мовою, але він включає також тексти більше ніж 50-ма іншими мовами (каталонська, китайська, датська, фінська, французька, німецька, італійська, португальська, іспанська…).

Текст за номером 2554 це переклад англійською ^ Crime and Punishment (Злочин і кара). Отримати доступ до тексту можна за допомогою функції urlopen, що міститься у модулі urllib. Для доступу до мережних ресурсів призначені також модулі httplib, ftplib і nntplib.

>>> from urllib import urlopen

>>> url = “http://www.gutenberg.org/files/2554/2554.txt”

>>> raw = urlopen(url).read()

>>> type(raw)



>>> len(raw)

1176831

>>> raw[:400]

'The Project Gutenberg EBook of Crime and Punishment, by Fyodor Dostoevsky\r\n\r\nThis eBook is for the use of anyone anywhere at no cost and with\r\nalmost no restrictions whatsoever. You may copy it, give it away or\r\nre-use it under the terms of the Project Gutenberg License included\r\nwith this eBook or online at www.gutenberg.org\r\n\r\n\r\nTitle: Crime and Punishment\r\n\r\nAuthor: Fyodor Dostoevsky\r\n\r\nReleas'

Виконання read() займає певний час протягом якого відбувається завантаження цієї великої книжки. При використанні проксі сервера для доступу до Інтернету, при необхідності, його параметри потрібно вказати:

>>> proxies = {'http': 'http://www.someproxy.com:3128'}

>>> raw = urlopen(url, proxies=proxies).read()

Змінна raw в якій збережено текст книжки є стрічкою довжиною 1,176,831 символів.

Як бачимо, стрічка містить багато не цікавої для аналізу інформації: пробіли, пусті стрічки, межі стрічки. Символи \r and \n , які є в тексті, це символи переводу каретки та початку нового рядка.

Для подальшої роботи з текстом потрібно розділити текст на окремі слова та виділити розділові знаки. Такий процес називають токенізацією. Можна скористатися вже відомим підходом перетворення стрічки у список, наприклад, за допомогою функції split(). А можна використати функцію токенізації word_tokenize з модуля NLTK, и отримати список слів та розділових знаків.

>>> tokens = nltk.word_tokenize(raw)

>>> type(tokens)



>>> len(tokens)

255809

>>> tokens[:100]

['The', 'Project', 'Gutenberg', 'EBook', 'of', 'Crime', 'and', 'Punishment', ',', 'by', 'Fyodor', 'Dostoevsky', 'This', 'eBook', 'is', 'for', 'the', 'use', 'of', 'anyone', 'anywhere', 'at', 'no', 'cost', 'and', 'with', 'almost', 'no', 'restrictions', 'whatsoever.', 'You', 'may', 'copy', 'it', ',', 'give', 'it', 'away', 'or', 're-use', 'it', 'under', 'the', 'terms', 'of', 'the', 'Project', 'Gutenberg', 'License', 'included', 'with', 'this', 'eBook', 'or', 'online', 'at', 'www.gutenberg.org', 'Title', ':', 'Crime', 'and', 'Punishment', 'Author', ':', 'Fyodor', 'Dostoevsky', 'Release', 'Date', ':', 'March', '28', ',', '2006', '[', 'EBook', '#', '2554', ']', 'Language', ':', 'English', 'Character', 'set', 'encoding', ':', 'ASCII', '*', '*', '*', 'START', 'OF', 'THIS', 'PROJECT', 'GUTENBERG', 'EBOOK', 'CRIME', 'AND', 'PUNISHMENT', '*', '*']

Тут, бібліотеку NLTK ми використовуємо лише для токенізації, вона не використовувалась при доступі за адресою в Інтернеті та при читанні стрічки.

Для подальшої роботи список слід перетворити в NLTK текст, щоб здійснювати різноманітні операції з ним:

>>> text = nltk.Text(tokens)

>>> type(text)



>>> text[:100]

['The', 'Project', 'Gutenberg', 'EBook', 'of', 'Crime', 'and', 'Punishment', ',', 'by', 'Fyodor', 'Dostoevsky', 'This', 'eBook', 'is', 'for', 'the', 'use', 'of', 'anyone', 'anywhere', 'at', 'no', 'cost', 'and', 'with', 'almost', 'no', 'restrictions', 'whatsoever.', 'You', 'may', 'copy', 'it', ',', 'give', 'it', 'away', 'or', 're-use', 'it', 'under', 'the', 'terms', 'of', 'the', 'Project', 'Gutenberg', 'License', 'included', 'with', 'this', 'eBook', 'or', 'online', 'at', 'www.gutenberg.org', 'Title', ':', 'Crime', 'and', 'Punishment', 'Author', ':', 'Fyodor', 'Dostoevsky', 'Release', 'Date', ':', 'March', '28', ',', '2006', '[', 'EBook', '#', '2554', ']', 'Language', ':', 'English', 'Character', 'set', 'encoding', ':', 'ASCII', '*', '*', '*', 'START', 'OF', 'THIS', 'PROJECT', 'GUTENBERG', 'EBOOK', 'CRIME', 'AND', 'PUNISHMENT', '*', '*']

Для отримання початкового уявлення про жанр тексту побудуємо колокації

>>> text.collocations()

Katerina Ivanovna; Pulcheria Alexandrovna; Avdotya Romanovna; Pyotr

Petrovitch; Project Gutenberg; Marfa Petrovna; Rodion Romanovitch;

Sofya Semyonovna; Nikodim Fomitch; did not; Hay Market; Andrey

Semyonovitch; old woman; Literary Archive; Dmitri Prokofitch; great

deal; United States; Praskovya Pavlovna; Porfiry Petrovitch; ear rings

В побудованих колокаціях зустрічається словосполучення Project Gutenberg, яке не відноситься до тексту книги. Це відбулося тому, що завантажений текст з сайту містить метатекстову розмітку (інформацію про автора, про текст, про людей які готували електронний варіант та ін.). Ця інформація зазвичай може бути розміщена як на початку тексту так і наприкінці. Для роботи власне з текстом книжки потрібно в ручному режимі знайти межі цих додаткових даних і за допомогою зрізів доступитися до тексту.

Скористаємося функціями find() та rfind() ("пошук з кінця") з модулю re.

>>> raw.find("PART I")

5303

>>> raw.rfind("End of Project Gutenberg's Crime")

1157681

>>> raw = raw[5303:1157681]

>>> raw.find("PART I")

0

Методи find() та rfind() ("пошук з кінця") допомагають знайти індекси зазначених фрагментів для їх подальшого використання в зрізах. Значення зрізу переприсвоюємо змінній raw.
^

1.2. Робота з HTML файлами.


Більшість текстів в Інтернеті є у вигляді HTML документів (файлів). Інтернет сторінки можна зберігати на диску у вигляді файлів і доступатися до них. Python також дозволяє працювати Інтернет сторінками безпосередньо використовуючи функцію urlopen. Для прикладу переглянемо текст з BBC News story з назвою Blondes to die out in 200 years:

>>> url = "http://www.pollenation.net/"

>>> html = urlopen(url).read()

>>> html[:1000]

'\n\n\n \n \n Web Design, Ecommerce & Bespoke Software Development for Leeds, Yorkshire \n \n
Побудуємо графік, що показує частотний розподіл з 30 найвживаніших слів тексту

>>> fdist.plot(30)



Тепер можна створити конкорданс для слова 'web'

>>> text.concordance('web')

Building index...

Displaying 5 of 5 matches:

web Design , Ecommerce Bespoke Software D

we have to cover a lot of bases as a web development company , from design mar

of our business are based on building web pages , software development and sear

' where we offer help and support for web design development , ecommerce , sear

y featured and seo friendly ecommerce web development . Click on Crafts Bespoke
^

1.3. Обробка результатів пошукових запитів.


Виконати самостійно: Здійсніть аналіз результатів пошуку в Інтернеті наступного словосполучення "the of" . Чи можна аналогічним чином знайти найчастотніші колокації англійської мови?
^

1.4. Обробка RSS стрічок


Блогосфера важливе джерело текстів, як формальних так і не формальних. З допомогою бібліотеки Python Universal Feed Parser, http://feedparser.org/, можна отримати доступ до вмісту блогів, як показано у наступному прикладі:

>>> import feedparser

>>> llog = feedparser.parse("http://languagelog.ldc.upenn.edu/nll/?feed=atom")

>>> llog['feed']['title']

u'Language Log'

>>> len(llog.entries)

15

>>> post = llog.entries[2]

>>> post.title

u"He's My BF"

>>> content = post.content[0].value

>>> content[:70]

u'
Today I was chatting with three of our visiting graduate students f'

>>> nltk.word_tokenize(nltk.html_clean(content))

>>> nltk.word_tokenize(nltk.clean_html(llog.entries[2].content[0].value))

[u'Today', u'I', u'was', u'chatting', u'with', u'three', u'of', u'our', u'visiting', u'graduate', u'students', u'from', u'the', u'PRC', u'.', u'Thinking', u'that', u'I', u'was', u'being', u'au', u'courant', u',', u'I', u'mentioned', u'the', u'expression', u'DUI4XIANG4', u'\u5c0d\u8c61', u'("', u'boy', u'/', u'girl', u'friend', u'"', ...]
^

1.5. Читання локальних файлів.


Для того, щоб дизнатися перелік об’єктів, що містяться у директоріях скористаємося функціями з модулю os.

>>> import os

Для отримання переліку об’єктів, що містяться у батьківській директорії С:\Python26\ використовують наступне

>>> os.listdir('.')

['w9xpopen.exe', 'README.txt', 'NEWS.txt', 'LICENSE.txt', 'python.exe', 'pythonw.exe', 'Lib', 'DLLs', 'include', 'libs', 'tcl', 'Tools', 'Doc', 'matplotlib-wininst.log', 'Removematplotlib.exe', 'numpy-wininst.log', 'Removenumpy.exe', 'Scripts', 'test', 'test.py', 'test.pyc', 'document.txt', 'test.txt', 'corpus.txt', 'appetite.html']

Для отримання переліку об’єктів, що міститься у кореневій директорії С:\

>>> os.listdir('..')

['WINDOWS', 'Bootfont.bin', 'ntldr', 'NTDETECT.COM', 'boot.ini', 'Documents and Settings', 'Program Files', 'CONFIG.SYS', 'AUTOEXEC.BAT', 'IO.SYS', 'MSDOS.SYS', 'System Volume Information', 'Recycled', 'temp', 'totalcmd', 'pagefile.sys', 'smartFTP', 'Corel', 'nltk_data', 'Python26', '$AVG', 'Sounds', 'audio.log']

Щоб дістатися до певної директорії, слід вказати шлях доступу

>>> os.listdir('C:\\Python26\\Tools')

['i18n', 'pynche', 'Scripts', 'versioncheck', 'webchecker']

Для читання локальних файлів можна використати вбудовану функцію Python open() та read() метод.

>>> f = open('document.txt')

За замовченням файл буде шукатися у корні директорії С:\Python26\. Якщо інтерпретатор не знайде файл, він видасть помилку, подібну до наступної:

Traceback (most recent call last):

File "
", line 1, in -toplevel-

f = open('document.txt')

IOError: [Errno 2] No such file or directory: 'document.txt'

Для перевірки чи дійсно файл є в потрібній директорії у графічному інтерфейсі IDLE використовується команда ^ Open з пункту меню File.

Для відкривання файлу з іншої директорії слід явно вказати шлях доступу.

>>> f = open('C:\\Python26\\document.txt')

Можливою проблемою при читанні текстових файлів можуть бути різні способи маркування нового рядка у файлах різних операційних систем.

При виклику функція open() може містити другий параметр для контролю відкривання файлу open('document.txt', 'rU') («r» файл для читання, «U» universal дозволяє ігнорувати різні способи, які використовуються для маркування нового рядка).

Для читання вмісту файлу можна використати багато різних методів. Метод read(), використаний до об’єкту файл (f), читає вміст файлу і представляє його стрічкою:

>>> f.read()

'Time flies like an arrow.\nFruit flies like a banana.\n'

Символ '\n' – це символ нового рядка.

Файл можна вивести на екран і порядкОво - стрічка за стрічкою, використовуючи for-цикл і використовувати зріз [:-1] або метод strip() для видалення символів нового рядка:

>>> f = open('document.txt', 'rU')

>>> for line in f:

print line.strip()

For Windows (2000/NT/ME/98/95), assuming you have MS VC++ 7.1, the

project files are in PCbuild, the workspace is pcbuild.dsw. See

PCbuild\readme.txt for detailed instructions.


For other non-Unix Windows compilers, in particular MS VC++ 6.0 and

for OS/2, enter the directory "PC" and read the file "readme.txt".

За допомогою цих методів також можна доступитися і до файлів з корпусів, які розповсюджуються з NLTK. Потрібно використати nltk.data.find() для одержання шляху до будь-якого файлу корпуса, а далі відкривати та читати файл, як показано:

>>> path = nltk.data.find('corpora/gutenberg/melville-moby_dick.txt')

>>> raw = open(path, 'rU').read()
^

1.6. Ввід тексту з клавіатури.


Для вводу тексту з клавіатури (при взаємодії користувача з програмою) потрібно використати функцію raw_input(). Після збереження введеного тексту у змінній з ним можна працювати як зі звичайною стрічкою.

>>> s = raw_input("Enter some text: ")

Enter some text: On an exceptionally hot evening early in July

>>> print "You typed", len(nltk.word_tokenize(s)), "words."

You typed 8 words.
^

1.7. Схема роботи з текстами при їх початковій обробці


Отже, початкова обробка текстів природною мовою містити наступні етапи:

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

  • Видалення розмітки.

  • Токенізація.

  • Перетворення тексту в NLTK текст.

Коли відбувається доступ до вмісту файлу чи вмісту вебсторінки і коли видаляється HTML розмітка то відбувається обробка стрічки:

>>> raw = open('document.txt').read()

>>> type(raw)



Результати токенізації список в який входять всі слова з тексту. Нормалізація та сортування цього списку приводить до отримання інших списків:

>>> tokens = nltk.word_tokenize(raw)

>>> type(tokens)



>>> words = [w.lower() for w in tokens]

>>> type(words)



>>> vocab = sorted(set(words))

>>> type(vocab)



Тип об’єкту визначає, які операції можуть бути здійснені з цим об’єктом. Наприклад, можна додавати елементи до списку але не можна до стрічки:

>>> vocab.append('blog')

>>> raw.append('blog')

Traceback (most recent call last):

File "", line 1, in

AttributeError: 'str' object has no attribute 'append'

Стрічки та списки можна поєднувати з іншими стрічками та списками, але не можна поєднувати стрічки зі списками:

>>> query = 'Who knows?'

>>> beatles = ['john', 'paul', 'george', 'ringo']

>>> query + beatles

Traceback (most recent call last):

File "", line 1, in

TypeError: cannot concatenate 'str' and 'list' objects
  1   2   3   4   5   6



Схожі:




База даних захищена авторським правом ©lib.exdat.com
При копіюванні матеріалу обов'язкове зазначення активного посилання відкритою для індексації.
звернутися до адміністрації