ВИВЧЕННЯ БІБЛІОТЕКИ ПРИКЛАДНИХ ПРОГРАМ NLTK, ДЛЯ ОПРАЦЮВАННЯ ТЕКСТІВ ПРИРОДНОЮ МОВОЮ. ОБРОБКА ОКРЕМИХ СЛІВ (токенізація та нормалізація).

Інформація про навчальний заклад

ВУЗ:
Національний університет Львівська політехніка
Інститут:
Не вказано
Факультет:
Не вказано
Кафедра:
Системи автоматизованого проектуваня

Інформація про роботу

Рік:
2005
Тип роботи:
Методичні вказівки до лабораторної роботи
Предмет:
Комп’ютерна лінгвістика

Частина тексту файла (без зображень, графіків і формул):

МІНІСТЕРСТВО ОСВІТИ І НАУКИ УКРАЇНИ НАЦІОНАЛЬНИЙ УНІВЕРСИТЕТ “ЛЬВІВСЬКА ПОЛІТЕХНІКА” ІНСТИТУТ КОМП’ЮТЕРНИХ НАУК ТА ІНФОРМАЦІЙНИХ ТЕХНОЛОГІЙ Кафедра “Системи автоматизованого проектування”  ВИВЧЕННЯ БІБЛІОТЕКИ ПРИКЛАДНИХ ПРОГРАМ NLTK, ДЛЯ ОПРАЦЮВАННЯ ТЕКСТІВ ПРИРОДНОЮ МОВОЮ. ОБРОБКА ОКРЕМИХ СЛІВ (токенізація та нормалізація). Методичні вказівки до лабораторної роботи № 3 з дисципліни “Комп’ютерна лінгвістика” для студентів спеціальності 7.030.505 “Прикладна лінгвістика” та магістрів за фахом 8.030.505 “Прикладна лінгвістика”. Затверджено на засіданні кафедри “Системи автоматизованого проектування” Протокол № 8 від 21.XI.2005 р. на засіданні методичної ради ІКНІ Протокол № 4-05/06 від 1.XII.2005 р. ВАК № 1769 від 12.XII.2005 р. Львів-2005 ВИВЧЕННЯ БІБЛІОТЕКИ ПРИКЛАДНИХ ПРОГРАМ NLTK, ДЛЯ ОПРАЦЮВАННЯ ТЕКСТІВ ПРИРОДНОЮ МОВОЮ. ОБРОБКА ОКРЕМИХ СЛІВ (токенізація та нормалізація). Методичні вказівки до лабораторної роботи № 3 з дисципліни “Комп’ютерна лінгвістика” для студентів спеціальності 7.030.505 “Прикладна лінгвістика” та магістрів за фахом 8.030.505 “Прикладна лінгвістика” для стаціонарної та заочної форм навчання/Укл. А.Б.Романюк. - Львів: Національний університет ”Львівська політехніка”, 2005. - 24с. Укладачі: Романюк А. Б., канд. техн. наук, ст. викладач Відповідальний за випуск: Лобур М. В., доктор технічних наук, професор Рецензенти: Каркульовський В. І., канд. техн. наук, доцент Шуневич Б.І., канд. філол. наук, доцент. МЕТА РОБОТА Вивчення основ програмування на мові Python. Ознайомлення з токенізацією та нормалізацією. КОРОТКІ ТЕОРЕТИЧНІ ВІДОМОСТІ Мова (мовлення) може бути розділена на частини різного розміру: починаючи від морфем і до параграфів. Ця лабораторна робота присвячена словам. Це дуже важливий рівень опрацювання текстів природною мовою (NLP). Тільки що вважати словом і як вони повинні бути представити в РС? Це просте питання, але проблеми у самому визначенні слова і його представленні залишаються актуальним. В лабораторній роботі буде розглянуто питання розділення тексту на слова, відмінностей між двома видами слів в текстах (token, type), доступу до джерел текстових даних, включаючи файли, веб-сторінки, лінгвістичні корпуси, які використовує Python і NLTK, а також стемінг і нормалізація. 1.1 Tokens, Types і тексти В одній з попередніх лабораторних робіт розглядався приклад, яким чином стрічка може бути перетворена (розділена) на список слів. Використовуючи функцію len() можна визначити кількість елементів списку – визначити кількість слів:  Цей процес сегментування стрічки символів на слова відомий як токенізація. Токенізація – початковий етап всього того, що відбувається з текстом при його автоматичному опрацюванні. Розглянемо токенізацію більш докладно. З попередніх лабораторних робіт відомо, як зібрати список унікальних елементів стрічки, використовуючи вбудовану функцію Python set ( ) для видалення дублікатів.  Відповідаючи на запитання скільки слів у sentence, - отримано два різні значення в залежності від того, враховувалося дублювання чи ні. Отже, „слово” в цих двох прикладах має різні значення. Щоб розрізнити ці значення вводяться поняття token (словоформа) і type (тип). Слово token є індивідуальний окремий випадок вживання слова у конкретному визначеному контексті, воно існує в часі і просторі. Слово type є більш абстрактним, це те, коли ми говоримо, що „the” зустрічається у sentence три рази „те саме слово”(унікальні слова тексту). Відмінність цих значень слова ілюструє наступний фрагмент Python.  Оператор = = перевіряє, чи є два вирази однакові, перевіряє ідентичність стрічок. Це поняття ідентичності, яке було прийняте, коли використовувалась функція set ( ). На відміну від цього оператор is перевіряє чи збережені два об’єкти в тому самому місці пам’яті і він визначає token-ідентичність. Коли використовується метод split() для перетворення стрічки в список слів то такий метод токенізації означає, що будь-які стрічки, розділені пробілами, рахуються як token слова. Але такий підхід не завжди забезпечує бажані результати. Крім того, ідентичність стрічок не завжди є хорошим критерієм для встановлення відповідності tokens і type. Тому потрібно відповісти на два запитання. Перше з них: токенізація – які підстрічки оригінального тексту повинні бути оброблені як tokens слова. Друге: визначення type – як визначити чи мають два різні tokens той самий type. Для того, щоб зрозуміти проблему у визначенні tokens і type у sentensce переглянемо вміст набору set().  По-перше, time і time. визначені як різні type внаслідок того, що крапка з’єднана зі словом. По-друге, ‘—‘ визначено як token хоча це не словом. По-третє, this і This повинні були одного типу без урахування великої літери. Якщо розглядати інші мови, наприклад китайську, японську, то токенізація таких текстів є ще складнішою проблемою. Терміни token і type можуть бути застосовані і до інших лінгвістичних об’єктів. Наприклад, sentence token є окремим реченням, але sentence type є абстрактним реченням без врахування контексту. Якщо повторити одне речення двічі, то прозвучали два token речення, але використовувався лише один type. Підсумовуючи, не можна сказати, що два token слова мають той самий type, якщо вони є однаковими стрічками символів. Потрібно враховувати множину інших факторів при визначенні, що рахувати тим самим словом. Крім того, слід бути обережними при першій ідентифікації token. Вихідні тексти у всіх попередніх прикладах були отримані шляхом визначення стрічки у фрагменті коду Python. Такий підхід викликає труднощі при представленні реалістичних прикладів з великими фрагментами текстів. Розглянемо, як отримати текст з файлу, з мережі Internet та з корпусів текстів, які розповсюджуються разом з NLTK. 1.1.1 Отримання тексту з файлу Доступитися до файлу в Python просто. Наприклад, створіть файл corpus.txt використовуючи текстовий редактор і наберіть в ньому наступний текст.  Переконайтеся, що це звичайний текстовий файл. Зберегти його потрібно в тій самій директорії або папці, з якої запускається інтерпретатор Python. Наступний крок для того, щоб відкрити файл – використання вбудованої функції open(), яка має два аргументи: ім’я файла і метод (mode) відкривання файла („r” файл для читання, ”U” universal дозволяє ігнорувати різні домовленості (методи), які використовуються для маркування нової стрічки).  Якщо інтерпретатор не знайде файл, він видасть помилку, подібну до наступної.  Для перевірки чи дійсно файл є в потрібній директорії у графічному інтерфейсі використовується команда Open. Можна також перевірити вміст директорії наступним чином:  Для читання вмісту файлу можна використати багато різних методів. Метод read , використаний до об’єкта файл (f), читає вміст файлу і представляє його стрічкою.  Символ /n вказує на початок нового рядка і є еквівалентом Enter на клавіатурі. Можна відкрити і прочитати файл одночасно (записавши попередні оператори одною стрічкою).  Файл можна читати стрічка за стрічкою, використовуючи for-цикл і використовуючи зріз [:-1] для видалення символів нового рядка.  1.1.2 Отримання тексту з Інтернет сторінок Для читання web-сторінки ми використаємо функцію urlopen():  Сторінки в мережі Інтернет звичайно представляють у HTML форматі. Тому в результаті виконання попереднього прикладу ми вивели на екран частину такої розмітки. Для доступу до тексту нам потрібно видалити HTML розмітку. Наступний приклад демонструє таку спробу видалення використовуючи регулярний вираз:   Результат також отримано незадовільний. Використання наступних регулярних виразів дозволяє отримани необхідний результат.  В NLTK також реалізована окрема функція nltk.clean_html(), яка обробляє HTML стрічки і повертає текст. 1.1.3 Отримання тексту з корпусів, які розповсюджуються разом з NLTK. NLTK розповсюджується з багатьма корпусами і прикладами корпусів а роботу з ними забезпечує пакет corpus. Розглянемо приклад використання вибраних текстів з електронного архіву текстів Project Gutenberg. Даний корпус містить наступний список файлів:  Можна здійснити підрахунок слів (token)в кожному з текстів корпуса наступним чином:  NLTK також включає Brown Corpus. Це перший корпус англійської мови, який містив мільйон слів, і був морфологічно розмічений. Кожна його частина (a - z) представляє різні жанри (Таблиця 1) Таблиця 1  В пакеті corpus реалізована можливість доступу до корпуса як до списку слів, як до списку речень (кожне речення це список слів). Можна визначити також, яка частина корпусу буде причитана  NLTK включає корпуси багатьох мов і для роботи з ними потрібно враховувати особливості кодування символів в Python.  Можливість доступу до великих фрагментів різноманітних текстів дозволяє виконувати різноманітні цікаві обчислення. Наступний приклад відображає зростання (співвідношення type до token) словника президентів США. Результати відображаються у вигляді графіка рис.1.(використовується бібліотека mathplotlib).   Рис.1. Співвідношення type до token в промовах президентів США. 1.2 Токенізація і нормалізація Токенізація – це задача екстракції (вилучення) послідовності елементарних tokens, які є складовою частиною лінгвістичних даних. Перші спроби, це здійснити, починалися зі стрічки символів і використовувався метод split() для розбиття стрічки за пробілами (під пробілом ми розуміємо проміжок між словами, знаки табуляції і нової стрічки). Токенізація, яка базується на розбитті за пробілами, є дуже спрощеним підходом, але її використовують у багатьох програмах. Потрібно розглянути більш складний підхід, який використовує регулярні вирази для визначення послідовностей символів, які повинні опрацьовуватися, як слова. Також потрібно розглянути способи нормалізації tokens. 1.2.1 Токенізація з використанням регулярних виразів Функція nltk.tokenize.regexp_tokenize() має два аргументи: текстова стрічка та регулярний вираз і повертає підстрічки, які відповідають регулярному виразу. Щоб описати (визначити) токенізатор, який враховує пунктуацію, як окремі tokens потрібно зробити наступне:  Регулярний вираз у цьому прикладі позначає послідовність, яка містить один або більше символів слова, як \w+. Він також позначає послідовність, яка містить один або більше символів пунктуації (не слова, не пробіли) [^\w\s]+. Цей другий вираз – це заперечення (один або більше символів, що не є символами слів і не є символами пробілу). Оператор -| використовується для комбінування виразів в один окремий комплексний вираз. Існує багато способів (шляхів) вдосконалення цього регулярного виразу. Наприклад, існуючий вираз розділить стрічку $22,50 на чотири tokens, але необхідно, щоб це була одна окрема одиниця. Аналогічно, абревіатуру USA також потрібно розглядати, як одну одиницю. Цього можна досягнути додаючи подальші пункти до регулярного виразу, який здійснює токенізацію. Для покращення відображення (читабельності) регулярний вираз у прикладі розділений на окремі частини , додано коментарі і використано re.verbose прапорець (?x) для того, щоб Python розрізняв вкладені пробіли і коментарі.  Інколи більш зручно написати регулярний вираз, який відповідає вмісту, що є між tokens (пробіл і пунктуація). Функція дозволяє булевий параметр gaps, коли він встановлений в true, то pattern відповідає проміжку.  Також можна використовувати токенізатор за пробілами nltk.WhitespaceTokenizer(text). 1.2.2 Лематизація і нормалізація. В попередніх прикладах здійснювався підрахунок tokens слів і повністю ігнорувалася решта речення в якому зустрічаються ці tokens . Таким чином, наприклад при обробці I saw the saw, обидва tokens розглядаються, як випадки одного і того самого типу. Але одна словоформа це форма дієслова, а інша іменник (пристрій для різання). Як дізнатися, що ці дві словоформи різні. Відповідь одна – це є окремі записи у словнику. З іншого боку більш емпірично, якщо переглянути більшу кількість текстів то стало б зрозуміло, що ці дві форми мають різне розповсюдження. Наприклад тільки іменник saw може йти після артикля the. Різні слова, які мають таку саму форму написання називаються омонімами. Можна розрізнити омоніми з допомогою контексту - дуже часто достатньо проаналізувати попереднє слово. Дослідження розповсюдження слів почнемо з аналізу біграмів в яких вони зустрічаються. Біграм це проста пара слів. Наприклад в реченні She sells sea shells by the sea shore, біграмами є She sells, sells sea, sea shells, shells by, by the, the sea, sea shore. Розглянемо всі біграми з корпусу Brown. які містять слово often, як перший елемент. Отримаємо наступну вибірку впорядковану за кількістю вживань.  Перший запис вказує, що often найчастіше супроводжується з комою. Це означає, що often звичайно йде в кінці фрази. Також often передує дієсловам, напевно, як обставина (прислівниковий модифікатор). Можна з цього зробити висновок, що якщо often зустрічається в контексті з saw, то saw використовується як дієслово. Також цей список включає різні граматичні форми того самого дієслова і можна сформувати окремі групи, які будуть містити appear ~ appears ~ appeared; call ~ called; do ~ did; and been ~ were ~ are ~ is . В загальному в лінгвістиці говорять що дві форми, наприклад appear ~ appeared, належать до більш абстрактного поняття слова і називаються лексемою, appeared і called належать до різних лексем. Вважаємо лексемою запис у словнику і лемою - основне слово (заголовок) цього запису. Хоча appeared і called належать до різних лексем, вони мають дещо спільне це минулий час. Про це інформує частина –ed, яку називають морфологічним суфіксом. Також прийнято говорити, що такі морфологічні складні форми є флективними. Якщо видалити суфікс то отримуємо основу (stem) appear і call відповідно. appear основна форма і в англійській мові вказує на лему слова. Якщо згрупувати різні форми різних дієслів в їх леми , тоді можна вивчити, які лексеми дієслів змінюються (модифікуються) відповідними, специфічними прислівниками. Лематизація – процес відображення граматичної форми в їх леми, привів до наступної картини розподілу(often).  Лематизація доволі складний процес, який потребує поєднання правил для регулярних флексій і таблиць пошуку для нерегулярних морфологічних варіантів. В межах NLTK більш простий підхід пропонує Porter Stemmer, який виділяє флективні суфікси від слів і поєднує (згортає) різні форми. Враховуючи простоту алгоритму цей лематизатор не пробує ідентифікувати were як форму леми be. В NLTK також реалізований Lancaster Stemmer, програми стемінгу для різних мов (RSLP Portuguese Stemmer, nltk.RSLPStemmer()  Лематизація і одержання основної форми можуть вважатися спеціальними випадками нормалізації. Вони ідентифікують канонічні представлення груп пов’язаних форм слів. По своїй природі нормалізація згортає (видаляє) розбіжності. Наприклад регістрова нормалізація, де всі варіанти зводяться до одного регістру, що приводить до спрощення контексту. Часто ми перетворюємо все в нижній регістр, для того щоб слова написані з великої літери були оброблені так само, як би вони були в іншому місці в реченні. Метод для стрічки lower() дозволяє це здійснити.  Остання проблема нормалізації наявність скорочень, таких як didn’t. Для аналізу змісту речення, ймовірно більш корисно було б нормалізувати цю форму до двох окремих форм did і n’t (not). 1.2.3 Перетворення списків Лематизація і нормалізація передбачає виконання тих самих дій для кожного слова в тексті. List Comprehensions це є корисна конструкція Python для здійснення цих дій. Для приведення всіх слів до нижнього регістру можна записати:  List Comprehensions звичайно моє форму [item.foo() for item in sequence], or [foo(item) for item in sequence]. Створюється список і виконуються операції з кожним елементом послідовності. Можна переписати цикл для ідентифікації основ дієслів з попереднього прикладу  В наступному прикладі видаляються не значущі слова із списку слів  Можна поєднати попередні приклади залишивши значущі слова і перевівши їх в нижній регістр  List Comprehensions також дозволяє будувати вкладені структури. В наступному прикладі будується список кортежів кожен з яких містить слово і його основу.  1.2.4 Поділ тексту на речення Здійснюючи обробку текстів часто необхідно здійснювати поділ тексту не тільки на окремі слова але і на окремі речення. Деякі корпуси передбачають доступ до текстів на рівні окремих речень. В наступному прикладі показано яким чином можна визначити середнє значення слів у реченні в корпусі Brown:  В інших випадках, коли текст подається, як послідовність символів, перед токенізацією необхідно поділити текст на оремі речення. NLTK містить Punkt сегментатор. Наступний приклад демонструє його використання для серментації тексту.  Необхідно зазначити, що в даному прикладі це все є одне речення – пряма мова Gregory, але вона містить декілька окремих речень і вони виділені в окремих рядках. Такий підхід до сегментації прямої мови є найбільш доцільний. ПОРЯДОК ВИКОНАННЯ РОБОТИ Ознайомитися з теоретичними відомостями. Виконати приклади, які використовуються в теоретичних відомостях. Виконати наступні вправи. 1Створіть невеликий текстовий файл з текстом, який містить декілька стрічок (ім’я, по батькові та прізвище студента). Напишіть програму, яка читає і виводить вміст файлу на екран стрічка за стрічкою з вказанням номера стрічки. 2Напишіть програму, яка читає файл і виводить вміст файлу на екран стрічка за стрічкою у зворотньопу порядку (остання стрічка виводиться першою і т.д.) 3Використовуючи модуль corpus прочитайте текст austin-persuasion.txt. Визначіть скільки tokens (слів) і type (унікальних слів)містить ця книжка. 4Напишіть, використовуючи модуль читання корпусу текстів Brown nltk.corpus.brown.words(), програму, яка дозволяє доступитися до фрагментів текстів у двох різних жанрах корпусу Brown, і назва яких відповідає першій літері прізвища і імені студента. 5Напишіть, використовуючи модуль читання корпусу текстів Brown nltk.corpus.brown.sents(), програму, яка дозволяє знайти всі речення, які починаються з however. Зробіть аналіз вживання however. Визначіть речення де however вживається у значенні “although” 6Прочитайте тексти з корпусу State of the Union addresses використовуючи відповідний модуль читання. Визначіть частоту вживання слів men, women, people в кожному з документів. Як змінилася частота вживання цих слів з часом? 7Напишіть програму доступу до будь-якої web-сторінки і вилучення з неї певного фрагмену. 8Прочитайте будь-який текст з корпусу, здійсніть його токенізацію і виведіть на екран список всіх wh- слів (who, which, what….) впорядкований за абеткою. Чи дублюються слова в цьому списку і якщо так, то чому? 9Використовуючи демонстраційний приклад NLTK nltk.chat.demo() оцініть якість роботи різних програм генерації тексту. Перегляньте тексти програм і опишіть основні принципи їх роботи. 10Збережіть текст, який містить прізвище, ім’я та по-батькові студента у файл. Напишіть функцію load(f), яка читає файл, назва якого є її аргументом, і повертає стрічку, яка містить текст з файлу. 11Використовуючи nltk.tokenize.regexp_tokenize() створіть токенізатор, який буде виділяти різні види розділових знаків у довільному тексті. Використайте один регулярний вираз з коментарями до кожного рядка і VERBOSE прапорці. 12Використовуючи nltk.tokenize.regexp_tokenize() створіть токенізатор, який буде виділяти наступні види виразів: дати, імена людей, назви компаній, грошові суми. 13Перепишіть наступний цикл як list comprehensions  14Використайте Porter Stemmer для нормалізації будь-якого токенізованого тексту (необхідно обробити кожне слово). Повторіть експеримент з використанням Lancaster Stemmer . Результати порівняйте і поясніть. Підготувати і оформити звіт. Варіант 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15  Номери завдань 1 2 1 2 1 2 1 2 1 2 1 2 1 2 1   3 3 3 3 3 3 3 3 3 3 3 3 3 3 3   4 5 6 8 4 5 6 8 4 5 6 8 4 5 6   7 7 7 7 7 7 7 7 7 7 7 7 7 7 7   9 9 9 9 9 9 9 9 9 9 9 9 9 9 9   10 10 10 10 10 10 10 10 10 10 10 10 10 10 10   11 12 11 12 11 12 11 12 11 12 11 12 11 12 11   13 13 13 13 13 13 13 13 13 13 13 13 13 13 13   14 14 14 14 14 14 14 14 14 14 14 14 14 14 14   Варіант 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30  Номери завдань 2 1 2 1 2 1 2 1 2 1 2 1 2 1 2   3 3 3 3 3 3 3 3 3 3 3 3 3 3 3   8 4 5 6 8 4 5 6 8 4 5 6 8 4 5   7 7 7 7 7 7 7 7 7 7 7 7 7 7 7   9 9 9 9 9 9 9 9 9 9 9 9 9 9 9   10 10 10 10 10 10 10 10 10 10 10 10 10 10 10   12 11 12 11 12 11 12 11 12 11 12 11 12 11 12   13 13 13 13 13 13 13 13 13 13 13 13 24 25 24   14 14 14 14 14 14 14 14 14 14 14 14 14 14 14   ЗМІСТ ЗВІТУ 5.1 Титульний аркуш. 5.2 Мета роботи. 5.3 Короткі теоретичні відомості. 5.4 Тексти програм на мові Python. 5.5 Висновок. ЛІТЕРАТУРА Steven Bird, Ewan Klein, Edward Loper Introduction to Natural Language Processing. 2001-2007 University of Pennsylvania. Г. Россум, Ф.Л.Дж. Дрейк, Д.С. Откидач, М. Задка, М. Левис, С.Монтаро, Э.С.Реймонд, А.М.Кучлинг, М.-А.Лембург, К.-П.Йи, Д.Ксиллаг, Х.ГПетрилли, Б.А.Варсав, Дж.К.Ахлстром, Дж.Рокинд, Н.Шеменон, С.Мулендер. Язык программирования Python./ 2001 – 452c. Сузи Р. А. Язык программирования Python.- 206с. David Mertz Text Processing in Python Addison WesleyBiber, 2003 - 544. ІНТЕРНЕТ ПОСИЛАННЯ http://www.nltk.org http://python.org НАВЧАЛЬНЕ ВИДАННЯ МЕТОДИЧНІ ВКАЗІВКИ до лабораторної роботи № 3 з дисципліни “Комп’ютерна лінгвістика” для студентів спеціальності 7.030.505 “Прикладна лінгвістика” та магістрів за фахом 8.030.505 “Прикладна лінгвістика”. для стаціонарної та заочної форм навчання Укладачі: Романюк Андрій Богданович
Антиботан аватар за замовчуванням

01.01.1970 03:01-

Коментарі

Ви не можете залишити коментар. Для цього, будь ласка, увійдіть або зареєструйтесь.

Ділись своїми роботами та отримуй миттєві бонуси!

Маєш корисні навчальні матеріали, які припадають пилом на твоєму комп'ютері? Розрахункові, лабораторні, практичні чи контрольні роботи — завантажуй їх прямо зараз і одразу отримуй бали на свій рахунок! Заархівуй всі файли в один .zip (до 100 МБ) або завантажуй кожен файл окремо. Внесок у спільноту – це легкий спосіб допомогти іншим та отримати додаткові можливості на сайті. Твої старі роботи можуть приносити тобі нові нагороди!
Нічого не вибрано
0%

Оголошення від адміністратора

Антиботан аватар за замовчуванням

Подякувати Студентському архіву довільною сумою

Admin

26.02.2023 12:38

Дякуємо, що користуєтесь нашим архівом!