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

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




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

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

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

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


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





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

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


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

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

для магістрів за фахом 8. 02030303 «Прикладна лінгвістика»
денної та заочної форм навчання


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

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

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


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

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


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

№ 3510 від 2.06.2011


Львів-2011

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



Укладачі:

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

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



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

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



Рецензент:

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



^ МЕТА РОБОТА


  • Вивчення основ програмування на мові Python.

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

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

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


^ КОРОТКІ ТЕОРЕТИЧНІ ВІДОМОСТІ


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

 

>>> from __future__ import division

>>> import nltk, re, pprint

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

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

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

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

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

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

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

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

Текст за номером 2554 це переклад англійською ^ Crime and Punishment(Злочин і кара), і отримати доступ до тексту можна наступним чином:

 

>>> from urllib import urlopen

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

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

>>> type(raw)



>>> len(raw)

1176831

>>> raw[:75]

'The Project Gutenberg EBook of Crime and Punishment, by Fyodor Dostoevsky\r\n'




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


 

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

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



Текст книжки збережений як значення змінної raw . Змінна raw містить стрічку довжиною 1,176,831 символів. (Перевірити тип змінної можна скориставшись type(raw).) Стрічка яка відповідає вмісту книжки містить багато не цікавої для аналізу інформації: пробіли, пусті стрічки, межі стрічки. Символи \r and \n , які є в тексті, це символи переводу каретки та початку нового рядка. Для подальшої роботи з текстом потрібно розділити текст на окремі слова та виділити розділові знаки. Такий процес називають токенізацією. При використанні програми токенізації з NLTK отримуємо список слів та розділових знаків.

 

>>> tokens = nltk.word_tokenize(raw)

>>> type(tokens)



>>> len(tokens)

255809

>>> tokens[:10]

['The', 'Project', 'Gutenberg', 'EBook', 'of', 'Crime', 'and', 'Punishment', ',', 'by']




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

 

>>> text = nltk.Text(tokens)

>>> type(text)



>>> text[1020:1060]

['CHAPTER', 'I', 'On', 'an', 'exceptionally', 'hot', 'evening', 'early', 'in',

'July', 'a', 'young', 'man', 'came', 'out', 'of', 'the', 'garret', 'in',

'which', 'he', 'lodged', 'in', 'S', '.', 'Place', 'and', 'walked', 'slowly',

',', 'as', 'though', 'in', 'hesitation', ',', 'towards', 'K', '.', 'bridge', '.']

>>> 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, словосполучення, яке не міститься в тексті книжки. Завантажений текст з сайту містить метатекстову розмітку (інформацію про автора, про текст, про людей які готували електронний варіант та ін.). Ця інформація може бути, як на початку тексту так і в його кінці . Для роботи власне з текстом книжки потрібно в ручному режимі знайти межі цих додаткових даних і за допомогою зрізів доступитися до тексту.

 

>>> 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. Робота з HTML файлами.

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

 

>>> url = "http://news.bbc.co.uk/2/hi/health/2284783.stm"

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

>>> html[:60]

\'




Текст, який вивели на екран містить HTML розмітку (мета теги, JavaScript, форми , таблиці). Вилучення тексту з HTML файлу доволі розповсюджена задача, яка в NLTK вирішується за допомогою функції nltk.clean_html(). Ця функція обробляє HTML стрічку і повертає текст у вигляді зручному для подальшої обробки (токенізації).

 

>>> raw = nltk.clean_html(html)

>>> tokens = nltk.word_tokenize(raw)

>>> tokens

[\'BBC\', \'NEWS\', \'|\', \'Health\', \'|\', \'Blondes\', "\'", \'to\', \'die\', \'out\', ...]




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

 

>>> tokens = tokens[96:399]

>>> text = nltk.Text(tokens)

>>> text.concordance(\'gene\')

they say too few people now carry the gene for blondes to last beyond the next tw

t blonde hair is caused by a recessive gene . In order for a child to have blonde

to have blonde hair , it must have the gene on both sides of the family in the gra

there is a disadvantage of having that gene or by chance . They don \' t disappear

ondes would disappear is if having the gene was a disadvantage and I do not think







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

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

    1. Обробка 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. Читання локальних файлів.

Для читання локальних файлів необхідно використовувати вбудовану функцію Python open() та read() метод. Якщо існує файл document.txt, то змінній raw можна присвоїти його вміст:

 

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

>>> raw = f.read()




Якщо інтерпретатор не знайде файл, він видасть помилку, подібну до наступної:

 

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

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. Можна також перевірити вміст директорії наступним чином:

 

>>> import os

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




Інша можлива проблема при читанні текстових файлів – це різні способи маркування нового рядка у файлах різних операційних систем. При виклику функція 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()

Time flies like an arrow.

Fruit flies like a banana.




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

 

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

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







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

Для вводу тексту з клавіатури (при взаємодії користувача з програмою) потрібно використати функцію 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. Схема роботи з текстами при їх початковій обробці.

Коли відбувається доступ до вмісту файлу чи вмісту вебсторінки і коли видаляється 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. Використання Unicode при обробці текстів.

Програми обробки природної мови повинні працювати з різними мовами та з різними наборами символів. Твердження «1 байт = 1 символ» є застарілим і в переважній більшості практичних випадків є хибним. В англомовному світі переважно використовується ASCII кодування символів. В Європі використовується розширений Latin набір символів, який містить такі символи датської та норвежської, як "ø", угорської - "ő", іспанської та бретонської -"ñ" та "ň" чеської та словацької мов. Розглянемо, як використовується Unicode при обробці текстів, що містять відмінні від ASCII символи.

    1. Поняття Юнікод (Unicode).

Юніко́д, (
англ. Unicode) — це промисловий стандарт розроблений, щоб зробити можливим для текстів і символів (графічних знаків) всіх писемних систем світу узгоджене представлення (репрезентацію) і обробку комп’ютерами. Юнікод підтримує більш ніж мільйон символів. Кожному символу ставиться у відповідність число, яке називають кодовою точкою. В Python кодові точки записуються у вигляді \uXXXX , де XXXX - чотири символи шістнадцяткового числа.

В межах програми обробка стрічок Unicode відбувається аналогічно до звичайних стрічок. Однак, коли Unicode символи зберігаються у файл або виводяться на екран, вони повинні бути закодовані, як потік байт. Деякі кодування (такі як ASCII та Latin-2) використовують один байт для представлення одної кодової точки і відповідно підтримують невеликий набір символів Unicode, достатній для одної мови. Інші кодування (такі як UTF-8) використовують послідовності байтів і можуть представити весь набір символів Unicode.

Текст у файлах є в певному кодування і потрібен певний механізм для перетворення його до Unicode. Такий механізм називають — декодування. Навпаки записати Unicode символи у файл або вивести на екран можна тільки попередньо перетворивши їх у потрібне кодування. Таке перетворення називають кодуванням. Рис.2.



Рис.2. Кодування і декодування Unicode.

From a Unicode perspective, characters are abstract entities which can be realized as one or more glyphs. Only glyphs can appear on a screen or be printed on paper. A font is a mapping from characters to glyphs.

    1. Одержання закодованого тексту з файлів.

Нехай існують невеликі текстові файли відомого кодування. Файл Ukrainian1-Cyrillic (перше речення декларації прав людини) з текстом українською мовою в кодуванні Сyrillic та файл polish-lat2.txt з текстом польською мовою у кодуванні Latin-2 (ISO-8859-2). За допомогою функції nltk.data.find() знайдемо місцезнаходження цих файлів:

 

>>> path = nltk.data.find('corpora/udhr/Ukrainian1-Cyrillic')

>>> path1 = nltk.data.find('corpora/unicode_samples/polish-lat2.txt')




Модуль Python codecs забезпечує функції читання кодованих даних в Unicode стрічку і запису Unicode стрічки в кодовану форму. Функція codecs.open() потребує параметра кодування файлу для читання чи запису. Перед використанням модуля потрібно його імпортувати і при читанні вказувати тип кодування:

 

>>> import codecs

>>> f = codecs.open(path, encoding='cyrillic')

>>> f1 = codecs.open(path1, encoding='latin2')




Список параметрів кодування модуля codecs, можна переглянути за адресою http://docs.python.org/lib/standard-encodings.html. Для запису даних у файл потрібно скористатись наступною конструкцією: f = codecs.open(path, 'w', encoding='utf-8').

Текст прочитаний з f буде в Unicode. Для представлення цього тексту на екрані потрібно його закодувати. В Python кодування unicode_escape перетворює всі не ASCII символи в їх представлення \uXXXX . Кодові точки вище ASCII 0=127 але до 256 представляються у двоцифровій формі \хХХ.

 

>>> for line in f1:

... line = line.strip()

... print line.encode('unicode_escape')

Pruska Biblioteka Pa\u0144stwowa. Jej dawne zbiory znane pod nazw\u0105

"Berlinka" to skarb kultury i sztuki niemieckiej. Przewiezione przez

Niemc\xf3w pod koniec II wojny \u015bwiatowej na Dolny \u015al\u0105sk, zosta\u0142y

odnalezione po 1945 r. na terytorium Polski. Trafi\u0142y do Biblioteki

^ Jagiello\u0144skiej w Krakowie, obejmuj\u0105 ponad 500 tys. zabytkowych

archiwali\xf3w, m.in. manuskrypty Goethego, Mozarta, Beethovena, Bacha.




В першій стрічці послідовність \u0144, починається з символу \u. Відповідний Unicode символ буде відображатися на екрані, як ń. В третій стрічці є символ \xf3, який відповідає ó, оскільки він є з проміжку 128-255.

В Python, Unicode стрічку записують вказавши на початку символ u, ( u'hello' –Юнікод стрічка). Довільний Unicode символ може бути визначений всередині Unicode стрічки використовуючи представлення \uXXXX . Можна знайти числове значення кодової точки використовуючи функцію ord():

 

>>> ord('a')

97




>>> ord('à')

224




В шістнадцятковій формі 97 це 0061 а 224 це 00Е0 , що дозволяє представити ці символи відповідними кодовими точками:

 

>>> a = u'\u0061'

>>> b = u'\u00E0'

>>> a

u'a'

>>> print a

a




>>> b

u'\xe0'




>>> print b

à



  1   2



Схожі:




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