4721

Використання регулярних виразів для обробки текстів

Лабораторная работа

Информатика, кибернетика и программирование

Мета робота Використання регулярних виразів для обробки текстів. Короткі теоретичні відомості Виконанні цієї лабораторної роботи необхідно розпочати з регулярних виразів...

Украинкский

2012-11-25

331.5 KB

2 чел.

Мета робота

Використання регулярних виразів для обробки текстів.

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

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

>>> from __future__ import division

>>> import nltk, re, pprint

1. Регулярні вирази

Розглянутих раніше стандартних можливостей для роботи з текстом є недостатньо. Наприклад, в методах find() і replace() задається лише одна стрічка. В реальних завданнях така однозначність зустрічається досить рідко, частіше потрібно знайти або замінити стрічки, що відповідають деякому шаблону.

Регулярні вирази (regular expressions) описують множину стрічок, використовуючи спеціальну мову, яка зараз і буде розглянута.

Стрічка, в якій задано регулярний вираз будемо  називати шаблоном.

Для роботи з регулярними виразами в Python використовується модуль re. В наступному прикладі регулярний вираз допомагає виділити з тексту всі числа:

>>> import re

>>> pattern = r"[0-9]+"

>>> number_re = re.compile(pattern)

>>> number_re.findall("122 234 65435")

['122', '234', '65435']

В даному прикладі шаблон pattern описує множину стрічок, які складаються з одного або більше символів з набору "0", "1" ..., "9" . Функція re.compile() компілює шаблон в спеціальний Regex-об'єкт, який має декілька методів, зокрема метод findall() для отримання списку всіх непересічних входжень стрічок, що задовольняють шаблону, до заданої стрічки.

Те ж саме можна було зробити і так:

>>> import re

>>> re.findall(r"[0-9]+", "122 234 65435")

['122', '234', '65435']

1.1. Синтаксис регулярного виразу

Частина символів (в основному букви і цифри) позначають самі себе. Стрічка задовольняє (відповідає) шаблону, якщо вона входить в множину стрічок, які цей шаблон описує.

Тут варто також відзначити, що різні операції використовують шаблон по-різному. Так, search() шукає перше входження стрічки, що задовольняє шаблону, в заданій стрічці, а match() вимагає, щоб стрічка задовольняла шаблону із самого початку.

Символи, що мають спеціальне значення в запису регулярних виразів:

Символ

Що позначає в регулярному виразі

"."

Будь-який символ

"^"

Початок рядка

"$"

Кінець рядка

"*"

Повторення фрагмента нуль або більше разів (жадібне)

"+"

Повторення фрагмента один або більше разів (жадібне)

"?"

Попередній фрагмент або присутній, або відсутній

"{m,n}"

Повторення попереднього фрагмента від m до n разів включно (жадібне)

"[...]"

Будь-який символ з набору в дужках. Можна задавати діапазони символів з тими, що йдуть підряд кодами, наприклад: a-z

"[^...]"

Будь-який символ не з набору в дужках

"\"

Зворотна коса межа відміняє спеціальне значення наступного за нею символу

"|"

Фрагмент справа або фрагмент зліва

"*?"

Повторення фрагмента нуль або більше разів (не жадібне)

"+?"

Повторення фрагмента один або більше разів (не жадібне)

"{m,n}?"

Повторення попереднього фрагмента від m до n разів включно (не жадібне)

Якщо A і B - регулярні вирази, то їх конкатенація AB є новим регулярним виразом, причому конкатенація рядків а і b задовольнятиме AB, якщо а задовольняє A і b задовольняє B. Можна вважати, що конкатенація - основний спосіб складання регулярних виразів.

Дужки, описані нижче, застосовуються для завдання пріоритетів і виділення груп (фрагментів тексту, які потім можна отримати по номеру або із словника, і навіть послатися в тому ж регулярному виразі).

Алгоритм, який зіставляє рядки з регулярним виразом, перевіряє відповідність того або іншого фрагмента рядка регулярному виразу. Наприклад, рядок "a" відповідає регулярному виразу "[a-z]", рядок "fruit" відповідає "fruit|vegetable", а ось рядок "apple" не відповідає шаблону "pineapple".

У таблиці нижче замість регвир може бути записаний регулярний вираз, замість ім'я - ідентифікатор, а прапори будуть розглянуті нижче.

Позначення

Опис

"(регвир)"

Виокремлює регулярний вираз в дужках і виділяє групу

"(?:регвир)"

Виокремлює регулярний вираз в дужках без виділення групи

"(?=регвир)"

Погляд вперед: рядок повинен відповідати заданому регулярному виразу, але подальше порівняння з шаблоном почнеться з того ж місця

"(?!регвир)"

То ж, але із запереченням відповідності

"(?<=регвир)"

Погляд назад: рядок повинен відповідати, якщо до цього моменту відповідає регулярному виразу. Не займає місця в стрічці, до якї застосовується шаблон. Параметр регвир повинен бути фіксованої довжини (тобто, без "+" і "*")

"(?<!регвир)"

То ж, але із запереченням відповідності

"(?P<имя>регвир)"

Виділяє іменовану групу з ім'ям ім'я

"(?P=і’мя)"

Точно відповідає виділеній раніше іменованій групі з ім'ям ім'я

"(?#регвир)"

Коментар (ігнорується)

"(?(ім'я)рв1|рв2)"

Якщо група з номером або ім'ям ім'я опинилася визначена, результатом буде порівняння з рв1, інакше - з рв2. Частина |рв2 може бути відсутньою

"(?прапор)"

Задає прапор для всього даного регулярного виразу. Прапори необхідно задавати на початку шаблону

У таблиці нижче описані спеціальні послідовності, що використовують зворотній слеш:

Послідовність

Чому відповідає

"\1" - "\9"

Група з вказаним номером. Групи нумеруються, починаючи з 1

"\A"

Проміжок перед початком всього рядка (майже аналогічно "^")

"\Z"

Проміжок перед кінцем всього рядка (майже аналогічно "$")

"\b"

Проміжок між символами перед словом або після нього

"\B"

Навпаки, не відповідає проміжку між символами на границі слова

"\d"

Цифра. Аналогічно "[0-9]"

"\s"

Будь-який пробільний символ. Аналогічно "[\t\n\r\f\v]"

"\S"

Будь-який непробільний символ. Аналогічно "[^\t\n\r\f\v]"

"\w"

Будь-яка цифра або буква (залежить від прапора LOCALE)

"\W"

Будь-який символ, що не є цифрою або буквою (залежить від прапора LOCALE)

Прапорці, що використовуються з регулярними виразами:

"(?i)", re.I, re.IGNORECASE

Порівняння проводиться без врахування регістра букв.

"(?L)", re.L, re.LOCALE

Впливає на визначення букви в "\w", "\W", "\b", "\B" залежно від поточного культурного середовища (locale).

"(?m)", re.M, re.MULTILINE

Якщо цей прапор заданий, "^" і "$" відповідають початку і кінцю будь-якого рядка.

"(?s)", re.S, re.DOTALL

Якщо заданий, "." відповідає також і символу кінця рядка "\n".

"(?x)", re.X, re.VERBOSE

Якщо заданий, пробільні символи, не екрановані в шаблоні зворотною косою межею, є незначущими, а все, що розташоване після символу "#" -- коментарі. Дозволяє записувати регулярний вираз в декілька рядків для поліпшення його читаності і запису коментарів.

"(?u)", re.U, re.UNICODE

У шаблоні і в рядку використаний Unicode.

2. Використання регулярних виразів для виявлення слів за заданими шаблонами.

Багато задач лінгвістичних досліджень передбачають встановлення відповідності заданому шаблону. Наприклад, можна знайти слова, які закінчуються на “ed” використовуючи метод endswith('ed'). Подібні методи перевірки слів перелічені в Таблиці  Методичних вказівок до лабораторної роботи №2. Регулярні вирази є більш потужним і гнучким методом опису шаблонів символів, які необхідно виявити у послідовностях символів.

Регулярний вираз (вислів) (в програмуванні) — це рядок що описує або збігається з множиною рядків, відповідно до набору спеціальних синтаксичних правил. Регулярні вислови використовуються в багатьох текстових редакторах та допоміжних інструментах для пошуку та зміни тексту на основі заданих шаблонів.

Для роботи з регулярними виразами у Python потрібно імпортувати бібліотеку re скориставшись: import re. Корпус слів англійської мови Words Corpus буде використовуватися в якості лінгвістичних даних серед яких буде проводитися пошук. Попередня підготовка списку слів передбачає видалення власних імен.

>>> import re

>>> wordlist = [w for w in nltk.corpus.words.words('en') if w.islower()]

2.1. Використання основних метасимволів (операторів повтору).

Синтаксис регулярних висловів залежить від інтерпретатора, що використовується для їх обробки. Однак, із незначними відхиленнями, майже всі поширені механізми інтерпретатори регулярних висловів мають спільні правила.

Найпростіший регулярний вислів, з якого формуються складні, є звичайний символ. Більшість символів, включаючи усі літери та цифри, є регулярними висловами, що співпадають із відповідними символами в рядках.

Пошук слів із закінченням ed можна здійснити використовуючи регулярний вираз «ed$». Потрібно використати функцію re.search(p, s), яка перевіряє чи може зразок p бути знайдений у будь-якому місці стрічки s. Потрібно визначити символи, які шукаємо та використати символ долара , який в регулярних виразах позначає кінець слова:

>>> [w for w in wordlist if re.search('ed$', w)]

['abaissed', 'abandoned', 'abased', 'abashed', 'abatised', 'abed', 'aborted', ...]

Символ ”.” універсальний символ , якому відповідає будь-який один символ. Нехай потрібно знайти слова з восьми літер, де  j – третя літера та t – шоста літера. При створенні регулярного виразу у місцях де може бути будь-який символ вказується крапка. Символ ”^” вказує на початок стрічки:

>>> [w for w in wordlist if re.search('^..j..t..$', w)]

['abjectly', 'adjuster', 'dejected', 'dejectly', 'injector', 'majestic', ...]

Виконати самостійно. Повторіть попередній приклад використовуючи регулярний вираз «..j..t..». Результати порівняйте.

Символ “ ? “ вказує на те що попередній символ не є обовязковим. Вираз «^e-?mail$» відповідає двом стрічкам email та e-mail. Можна знайти загальну кількість таких стрічок (врахувавши різні способи їх запису) у будь-якому тексті скориставшись sum(1 for w in text if re.search('^e-?mail$', w)).

Рис 1. Система T9 для воду тексту за допомогою 9-ти клавіш.

В мобільних телефонах для вводу тексту використовується  система T9 (Рис.1.). Два або більше слів, які  можуть бути введені тією самою послідовністю клавіш називають  textonyms. Наприклад два слова  hole та golf вводяться натисненням послідовності 4653. Які інші слова можуть бути створені натисненням тієї самої послідовності клавіш? Використовуючи регулярний вираз «^[ghi][mno][jlk][def]$» це не складно зробити:

>>> [w for w in wordlist if re.search('^[ghi][mno][jlk][def]$', w)]

['gold', 'golf', 'hold', 'hole']

Перша частина виразу, «^[ghi]», вказує на початок слова після якого йде один з символів g, h, чи i. Наступна частина виразу, «[mno]», містить другий символ m, n, або o. Обмеження на вибір третього та четвертого символів встановлюються аналогічно. Тільки чотири слова відповідають заданому шаблону. Порядок символів у квадратних дужках є довільним і не впливає на результат. could have written «^[hig][nom][ljk][fed]$» and matched the same words.

Виконати самостійно.

Знайдіть слова, які відповідають наступним регулярним виразам: «^[ghijklmno]+$», «^[g-o]+$», «^[a-fj-o]+$». Що означають символи - та + у цих виразах.

Символ  + може використовуватися як після окремих літер так і після послідовності літер у квадратних дужках:

>>> chat_words = sorted(set(w for w in nltk.corpus.nps_chat.words()))

>>> [w for w in chat_words if re.search('^m+i+n+e+$', w)]

['miiiiiiiiiiiiinnnnnnnnnnneeeeeeeeee', 'miiiiiinnnnnnnnnneeeeeeee', 'mine',

'mmmmmmmmiiiiiiiiinnnnnnnnneeeeeeee']

>>> [w for w in chat_words if re.search('^[ha]+$', w)]

['a', 'aaaaaaaaaaaaaaaaa', 'aaahhhh', 'ah', 'ahah', 'ahahah', 'ahh',

'ahhahahaha', 'ahhh', 'ahhhh', 'ahhhhhh', 'ahhhhhhhhhhhhhh', 'h', 'ha', 'haaa',

'hah', 'haha', 'hahaaa', 'hahah', 'hahaha', 'hahahaa', 'hahahah', 'hahahaha', ...]

Символ  + означає одне або більше повторення: окремих символів, подібно до  m, символів з набору, подібно до [fed] або символів з проміжку, подібно до [d-f]. Заміна  + на символh * , який означає нуль або більше повторень - «^m*i*n*e*$» дозволить встановити відповідність до всіх слів , які знаходяться виразом «^m+i+n+e+$», а також до слів де немає деяких літер, наприклад me, min, and mmmmm.

Оператор ^ виконує іншу функцію, якщо його записати першим символом в квадратних дужках. Наприклад вираз «[^aeiouAEIOU]» встановлює відповідність до будь-яких символів крім голосних. В корпусі  NPS Chat Corpus можна знайти , за допомогою виразу «^[^aeiouAEIOU]+$» всі слова в яких повністю відсутні голосні : :):):), grrr, cyb3r , zzzzzzzz. Також сюди увійшли слова які містять інші символи крім букв.

В наступних прикладах показані інші регулярні вирази для пошуку слів, які відповідають заданим шаблонам та показано використання символів: \, {}, (), та |:

>>> wsj = sorted(set(nltk.corpus.treebank.words()))

>>> [w for w in wsj if re.search('^[0-9]+\.[0-9]+$', w)]

['0.0085', '0.05', '0.1', '0.16', '0.2', '0.25', '0.28', '0.3', '0.4', '0.5',

'0.50', '0.54', '0.56', '0.60', '0.7', '0.82', '0.84', '0.9', '0.95', '0.99',

'1.01', '1.1', '1.125', '1.14', '1.1650', '1.17', '1.18', '1.19', '1.2', ...]

>>> [w for w in wsj if re.search('^[A-Z]+\$$', w)]

['C$', 'US$']

>>> [w for w in wsj if re.search('^[0-9]{4}$', w)]

['1614', '1637', '1787', '1901', '1903', '1917', '1925', '1929', '1933', ...]

>>> [w for w in wsj if re.search('^[0-9]+-[a-z]{3,5}$', w)]

['10-day', '10-lap', '10-year', '100-share', '12-point', '12-year', ...]

>>> [w for w in wsj if re.search('^[a-z]{5,}-[a-z]{2,3}-[a-z]{,6}$', w)]

['black-and-white', 'bread-and-butter', 'father-in-law', 'machine-gun-toting',

'savings-and-loan']

>>> [w for w in wsj if re.search('(ed|ing)$', w)]

['62%-owned', 'Absorbed', 'According', 'Adopting', 'Advanced', 'Advancing', ...]

Виконати самостійно.

Повторити попередні приклади і пояснити використання символів : \, {}, (), та |.

Символ зворотної похилої риски (backslash) означає що наступний метасимвол втрачає своє спеціальне. Отже \. означає просто крапку. Послідовність у фігурних дужках, подібна до {3,5}, вказує на кількість повторів. Вертикальна риска вказує на можливість вибору між елементами, які стоять справа і зліва від неї. Круглі дужки вказують на область дії оператора. Вони можуть використовуватися з вертикальною рискою (диз'юнкція), подібно до виразу «w(i|e|ai|oo)t», який встановлює відповідність до слів wit, wet, wait, та woot.

Загальний перелік метасимволів регулярних виразів показаний у таблиці 1.

Основні метасимволи регулярних виразів     

Таблиця 1.

Оператор

Дія

.

Відповідність до будь-якого символу

^abc

Відповідність до шаблону abc на початку стрічки

abc$

Відповідність до шаблону abc в кінці стрічки

[abc]

Відповідність до одного символу з набора

[A-Z0-9]

Відповідність до одного символу з проміжку

ed|ing|s

Відповідність до одної з визначених стрічок (дизюнкція)

*

Нуль або більше повторів

+

Один або більше повторів

?

Нуль або один,наприклад. a?, [a-z]?- вказує на опціональність

{n}

Точно  n повторів, де  n не відємне ціле значенняr

{n,}

Мінімум n повторів

{,n}

Не більше ніж n повторів (максимум)

{m,n}

Мінімум m та максимум n повторів

a(b|c)+

Круглі дужки вказують на облась дії оператора

Інтерпретатор Python обробляє регулярний вираз, як звичайну стрічку. Якщо стрічка містить зворотну косу риску то наступний після неї символ інтерпретується спеціальним способом. Наприклад \b буде інтерпретуватися як backspace символ. В загальному, якщо використовувати регулярні вирази з зворотними косими рисками, необхідно вказати інтерпретатору не обробляти цю стрічку а відразу віддати її на обробку бібліотеці re . Це можна зробити додавши до регулярного виразу (стрічки) префікс r. Наприклад , стрічка r'\band\b' містить два символи \b , які інтерпретовані бібліотекою re відповідають границям слова а не символу  backspace..

2. Застосування регулярних виразів

Вираз re.search(regexp, w) дозволяє знаходити слова  w , які відповідають регулярному виразу regexp . Регулярні вирази також можна використовувати для виявлення фрагментів слів, або для модифікації слів різними способами.

2.1. Виявлення фрагментів слів

Метод re.findall() ("знайти всеl") дозволяє знайти всі відповідності даному регулярному виразу. В наступному прикладі показано знаходження та підрахунок всіх голосних:

>>> word = 'supercalifragilisticexpialidocious'

>>> re.findall(r'[aeiou]', word)

['u', 'e', 'a', 'i', 'a', 'i', 'i', 'i', 'e', 'i', 'a', 'i', 'o', 'i', 'o', 'u']

>>> len(re.findall(r'[aeiou]', word))

16

Подібним способом можна знайти та побудувати частотний розподіл для послідовностей з двох і більше голосних в довільному тексті:

>>> wsj = sorted(set(nltk.corpus.treebank.words()))

>>> fd = nltk.FreqDist(vs for word in wsj

...                      for vs in re.findall(r'[aeiou]{2,}', word))

>>> fd.items()

[('io', 549), ('ea', 476), ('ie', 331), ('ou', 329), ('ai', 261), ('ia', 253),

('ee', 217), ('oo', 174), ('ua', 109), ('au', 106), ('ue', 105), ('ui', 95),

('ei', 86), ('oi', 65), ('oa', 59), ('eo', 39), ('iou', 27), ('eu', 18), ...]

Виконати самостійно. Замініть символ ? у регулярному вразі у виразі [int(n) for n in re.findall(?, '2009-12-31')] для представлення стрічки з датою '2009-12-31' у вигляді списку [2009, 12, 31].

2.2. Обробка фрагментів слів

Використавши  re.findall() для виявлення фрагментів слів, можна спробувати обробляти ці фрагменти різними способами.

Існує думка що англійска мова є надлишкова, оскільки текст зручно читати навіть опустивши у словах всі внутрішні голосні. Наприклад у словах, declaration -  dclrtn, та inalienable -  inlnble, залишились голосні тільки на початку та у кінці слова. Регулярний вираз у наступному виразі встановлю відповідність до початкових послідовностей голосних, кінцевих послідовностей голосних та всіх приголосних всі інші символи ігноруються. Метод re.findall() використовується для  виявлення фрагментів слів а метод ''.join() для їх поєднання.

>>> regexp = r'^[AEIOUaeiou]+|[AEIOUaeiou]+$|[^AEIOUaeiou]'

>>> def compress(word):

...    pieces = re.findall(regexp, word)

...    return ''.join(pieces)

...

>>> english_udhr = nltk.corpus.udhr.words('English-Latin1')

>>> print nltk.tokenwrap(compress(w) for w in english_udhr[:75])

Unvrsl Dclrtn of Hmn Rghts Prmble Whrs rcgntn of the inhrnt dgnty and

of the eql and inlnble rghts of all mmbrs of the hmn fmly is the fndtn

of frdm , jstce and pce in the wrld , Whrs dsrgrd and cntmpt fr hmn

rghts hve rsltd in brbrs acts whch hve outrgd the cnscnce of mnknd ,

and the advnt of a wrld in whch hmn bngs shll enjy frdm of spch and

В наступному прикладі показано спільне використання регулярного виразу та умовного частотного розподілу. В програмі зі слів мовою  Rotokas вилучаються всі послідовності приголосна – голосна. Оскільки вилучаються пари то на їх основі можна побудувати умовний частотний розподіл і представити його у вигляді таблиці:

>>> rotokas_words = nltk.corpus.toolbox.words('rotokas.dic')

>>> cvs = [cv for w in rotokas_words for cv in re.findall(r'[ptksvr][aeiou]', w)]

>>> cfd = nltk.ConditionalFreqDist(cvs)

>>> cfd.tabulate()

    a    e    i    o    u

k  418  148   94  420  173

p   83   31  105   34   51

r  187   63   84   89   79

s    0    0  100    2    1

t   47    8    0  148   37

v   93   27  105   48   49

Переглянувши рядки  s та t, бачимо що ці приголосні утворюють цілком окремі фонеми в цій мові. Літеру s можна видалити з абетки Rotokas і записати правило що літера t вимовляється як  s перед i. (Тільки одне слово kasuari містить su, оскільки це запозичення з англійської, 'cassowary' ).

Для перегляду слів , які відповідають тим чи іншим послідовностям приголосна – голосна зручно побудувати структуру де слова згруповані за тими послідовностями, які в них зустрічаються. Цього можна досягнути наступним чином:

>>> cv_word_pairs = [(cv, w) for w in rotokas_words

...                         for cv in re.findall(r'[ptksvr][aeiou]', w)]

>>> cv_index = nltk.Index(cv_word_pairs)

>>> cv_index['su']

['kasuari']

>>> cv_index['po']

['kaapo', 'kaapopato', 'kaipori', 'kaiporipie', 'kaiporivira', 'kapo', 'kapoa',

'kapokao', 'kapokapo', 'kapokapo', 'kapokapoa', 'kapokapoa', 'kapokapora', ...]

В цій програмі обробляється кожне слово, для якого здійснюється пошук підстрічок, які відповідають регулярному виразу «[ptksvr][aeiou]». У випадку слова kasuari, будуть знайдені ka, su та ri і список  cv_word_pairs буде містити ('ka', 'kasuari'), ('su', 'kasuari') та ('ri', 'kasuari'). Наступний крок це за допомогою  nltk.Index(), перетворення  цього списку до вигляду: defaultdict(<type 'list'>, {'va': ['kaaova', 'Kaareva', 'kaava', 'kaavaaua', 'kakuva', 'kapaava', 'karaava', 'karaova',…...

2.3. Встановлення основ слів (стемінг)

Для обробки мови часто буває необхідно опустити закінчення слів і працювати тільки з їх основами. Існують різні способи встановлення основи слова. Найпростіший спосіб, це відкидання будь-яких послідовностей, які нагадують суфікс.

>>> def stem(word):

...    for suffix in ['ing', 'ly', 'ed', 'ious', 'ies', 'ive', 'es', 's', 'ment']:

...        if word.endswith(suffix):

...            return word[:-len(suffix)]

...     return word

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

>>> re.findall(r'^.*(ing|ly|ed|ious|ies|ive|es|s|ment)$', 'processing')

['ing']

Тут, re.findall() знаходить тільки суфікс, хоча регулярний вираз відповідає всьому слову. Це сталося тому, що круглі дужки задають не тільки область дії оператора диз’юнкції але і виконують функцію вибору підстрічки яку  потрібно вилучити. Коли потрібно в регулярному виразі використовувати круглі дужки для вказання області дії оператор,а але не потрібно здійснювати вилучення в регулярний вираз потрібно додати ?: , так як у наступному прикладі.

>>> re.findall(r'^.*(?:ing|ly|ed|ious|ies|ive|es|s|ment)$', 'processing')

['processing']

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

>>> re.findall(r'^(.*)(ing|ly|ed|ious|ies|ive|es|s|ment)$', 'processing')

[('process', 'ing')]

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

>>> re.findall(r'^(.*)(ing|ly|ed|ious|ies|ive|es|s|ment)$', 'processes')

[('processe', 's')]

Регулярний вираз помилково знайшов суфікс -s замість суфікса  -es . Оператор * в частині виразу «.*» приводить до поглинання максимальної кількості символів. Доцільно використати вираз *?, який дозволяє уникнути цього ефекту:

>>> re.findall(r'^(.*?)(ing|ly|ed|ious|ies|ive|es|s|ment)$', 'processes')

[('process', 'es')]

Даний регулярний вираз працює навіть зі словами з відсутнім суфіксом:

>>> re.findall(r'^(.*?)(ing|ly|ed|ious|ies|ive|es|s|ment)?$', 'language')

[('language', '')]

Звичайно цей підхід має ще багато інших проблем. Для їх виявлення розроблена функція для здійснення операції стемінгу. Використовуючи цю функцію можна опрацьовувати довільний текст:

>>> def stem(word):

...     regexp = r'^(.*?)(ing|ly|ed|ious|ies|ive|es|s|ment)?$'

...    stem, suffix = re.findall(regexp, word)[0]

...    return stem

...

>>> raw = """DENNIS: Listen, strange women lying in ponds distributing swords

... is no basis for a system of government.  Supreme executive power derives from

... a mandate from the masses, not from some farcical aquatic ceremony."""

>>> tokens = nltk.word_tokenize(raw)

>>> [stem(t) for t in tokens]

['DENNIS', ':', 'Listen', ',', 'strange', 'women', 'ly', 'in', 'pond',

'distribut', 'sword', 'i', 'no', 'basi', 'for', 'a', 'system', 'of', 'govern',

'.', 'Supreme', 'execut', 'power', 'deriv', 'from', 'a', 'mandate', 'from',

'the', 'mass', ',', 'not', 'from', 'some', 'farcical', 'aquatic', 'ceremony', '.']

Потрібно зазначити, що регулярний вираз видалив  s не тільки зі слова ponds а також зі слів is та basis. Також утворені слова невластиві мові distribut та deriv, хоча ці основи прийнятні для певного застосування .

2.4. Пошук у токенізованому тексті

Спеціальний тип регулярних виразів може використовуватися  для пошуку серед слів у тексті (текст – послідовність окремих слів). Наприклад, за допомогою виразу "<a> <man>" можна знайти всі випадки вживання  a man в тексті. Кутові дужки використовуються для позначення меж і всі пробіли мід цими дужками ігноруються (індивідуальна особливість  NLTK's findall() методу для тексту). В наступному прикладі включено  <.*> #1 для виявлення всіх окремих слів, а круглі дужки дозволять вибрати ці слова окремо від словосполучень ( a monied man). Інший приклад дозволяє знайти всі словосполучення з трьох слів де останнє слово  bro #2. Останній приклад це знаходження послідовностей з трьох і більше слів , які починаються з літери l #3.

>>> from nltk.corpus import gutenberg, nps_chat

>>> moby = nltk.Text(gutenberg.words('melville-moby_dick.txt'))

>>> moby.findall(r"<a> (<.*>) <man>") #1

monied; nervous; dangerous; white; white; white; pious; queer; good;

mature; white; Cape; great; wise; wise; butterless; white; fiendish;

pale; furious; better; certain; complete; dismasted; younger; brave;

brave; brave; brave

>>> chat = nltk.Text(nps_chat.words())

>>> chat.findall(r"<.*> <.*> <bro>") #2

you rule bro; telling you bro; u twizted bro

>>> chat.findall(r"<l.*>{3,}") #3

lol lol lol; lmao lol lol; lol lol lol; la la la la la; la la la; la

la la; lovely lol lol love; lol lol lol.; la la la; la la la

Виконати самостійно.

Для поглиблення розуміння особливостей роботи з регулярними виразами використайте функцію  nltk.re_show(p, s), яка у стрічці s позначає всі частини, які відповідають шаблону p. Для дослідження регулярних виразів зручно використати програму nemo_app.py(C:\Python26\Lib\site-packages\nltk\app)

Побудова пошукових шаблонів для вивчення лінгвістичних явищ, які пов’язані зі словами не є складною. Чи можна будувати складніші шаблони на основі регулярних виразів? Наприклад, для знаходження в корпусі текстів слово зворотів таких, як  x and other ys , які дозволяють дослідити гіперніми, можна розробити наступну програму

>>> from nltk.corpus import brown

>>> hobbies_learned = nltk.Text(brown.words(categories=['hobbies', 'learned']))

>>> hobbies_learned.findall(r"<\w*> <and> <other> <\w*s>")

speed and other activities; water and other liquids; tomb and other

landmarks; Statues and other monuments; pearls and other jewels;

charts and other items; roads and other features; figures and other

objects; military and other areas; demands and other factors;

abstracts and other compilations; iron and other metals

При достатніх об’ємах лінгвістичних даних дана програма дозволяє зібрати інформацію про таксономію об’єктів без додаткової ручної праці. Звичайно результати роботи програми містять і хибні результати, якими потрібно нехтувати. Наприклад, результат: demands and other factors вказує на те що demand це тип factor, але в цьому реченні йдеться про збільшення заробітної плати (wage demands).

Виконати самостійно.

 Використовуючи шаблон as x as y дослідити інформацію про об’єкти та їх властивості.

3. Використання регулярних виразів для токенізації тексту

Регулярні вирази дозволяють також здійснювати токенізацію текстів та контролювати процес токенізації.

3.1. Найпростіший токенізатор

Найпростіший спосіб токенізації тексту – це поділ його за пробілами. Розглянемо наступний текст з  Alice's Adventures in Wonderland:

>>> raw = """'When I'M a Duchess,' she said to herself, (not in a very hopeful tone

... though), 'I won't have any pepper in my kitchen AT ALL. Soup does very

... well without--Maybe it's always pepper that makes people hot-tempered,'..."""

Можна розділити цей текст за пробілами скориставшись raw.split(). Реалізовуючи те саме за допомогою регулярних виразів, недостатньо встановити відповідність до всіх символів пробілів #1 тому що  результат містить символ  \n, потрібно враховувати будь-яку кількість пробілів табуляній та символів нового рядка #2:

>>> re.split(r' ', raw) #1

["'When", "I'M", 'a', "Duchess,'", 'she', 'said', 'to', 'herself,', '(not', 'in',

'a', 'very', 'hopeful', 'tone\nthough),', "'I", "won't", 'have', 'any', 'pepper',

'in', 'my', 'kitchen', 'AT', 'ALL.', 'Soup', 'does', 'very\nwell', 'without--Maybe',

"it's", 'always', 'pepper', 'that', 'makes', 'people', "hot-tempered,'..."]

>>> re.split(r'[ \t\n]+', raw) #2

["'When", "I'M", 'a', "Duchess,'", 'she', 'said', 'to', 'herself,', '(not', 'in',

'a', 'very', 'hopeful', 'tone', 'though),', "'I", "won't", 'have', 'any', 'pepper',

'in', 'my', 'kitchen', 'AT', 'ALL.', 'Soup', 'does', 'very', 'well', 'without--Maybe',

"it's", 'always', 'pepper', 'that', 'makes', 'people', "hot-tempered,'..."]

Регулярний вираз «[ \t\n]+» встановлює відповідність одному або більше пробілам, табуляціям (\t) чи символам нового рядка (\n). Інші символи пробілів, такі як «Enter» «нова сторінка» також повинні враховуватися. Замість цього, можна використати властивий re символ, \s, який означає будь-який символ пробілу. Вираз з попереднього прикладу буде переписаний наступним чином re.split(r'\s+', raw).

Поділ тексту на окремі слова за пробілами дає очікувані помилкові результати '(not' та 'herself,'. Python підтримує символ \w ,якому відповідає клас символів слів аналогічних до [a-zA-Z0-9_], та символ \W , який визначає клас символів – всі символи не літери не цифри і не підкреслення. Можна використати \W в регулярному виразі для поділу вхідного тексту на окремі слова за будь-якими символами відмінним від символів з яких складаються слів:

>>> re.split(r'\W+', raw)

['', 'When', 'I', 'M', 'a', 'Duchess', 'she', 'said', 'to', 'herself', 'not', 'in',

'a', 'very', 'hopeful', 'tone', 'though', 'I', 'won', 't', 'have', 'any', 'pepper',

'in', 'my', 'kitchen', 'AT', 'ALL', 'Soup', 'does', 'very', 'well', 'without',

'Maybe', 'it', 's', 'always', 'pepper', 'that', 'makes', 'people', 'hot', 'tempered',

'']

Результати використання цього регулярного виразу містять пусті стрічки на початку і в кінці списку (спробуйте 'xx'.split('x')). Аналогічні слова, але без додаткових пустих стрічок можна отримати використавши  re.findall(r'\w+', raw), де шаблону відповідають всі слова замість пробілів. Наступний регулярний вираз «\w+|\S\w*» дозволяє охопити більшу кількість різних випадків. Спочатку цей вираз встановлює відповідність до будь-яких послідовностей символів слів, далі якщо відповідностей більше немає встановлюється відповідність до всіх символів які не є символами пробілу (\S) і зустрічаються перед символами слів. Такий підхід дозволяє відділяти розділові знаки разом з літерою перед якою вони йдуть (наприклад 's), але послідовності двох і більше розділових знаків розділені.

>>> re.findall(r'\w+|\S\w*', raw)

["'When", 'I', "'M", 'a', 'Duchess', ',', "'", 'she', 'said', 'to', 'herself', ',',

'(not', 'in', 'a', 'very', 'hopeful', 'tone', 'though', ')', ',', "'I", 'won', "'t",

'have', 'any', 'pepper', 'in', 'my', 'kitchen', 'AT', 'ALL', '.', 'Soup', 'does',

'very', 'well', 'without', '-', '-Maybe', 'it', "'s", 'always', 'pepper', 'that',

'makes', 'people', 'hot', '-tempered', ',', "'", '.', '.', '.']

Для виявлення слів з дефісом або апострофом вираз \w+ потрібно розширити до: «\w+([-']\w+)*». Цей вираз означає що після \w+ може йти нуль або більше випадків [-']\w+; що дозволить виділити слова  hot-tempered або it's. Символи  ?: також потрібно додати до регулярного виразу, та шаблон для виявлення символів лапок.

>>> print re.findall(r"\w+(?:[-']\w+)*|'|[-.(]+|\S\w*", raw)

["'", 'When', "I'M", 'a', 'Duchess', ',', "'", 'she', 'said', 'to', 'herself', ',',

'(', 'not', 'in', 'a', 'very', 'hopeful', 'tone', 'though', ')', ',', "'", 'I',

"won't", 'have', 'any', 'pepper', 'in', 'my', 'kitchen', 'AT', 'ALL', '.', 'Soup',

'does', 'very', 'well', 'without', '--', 'Maybe', "it's", 'always', 'pepper',

'that', 'makes', 'people', 'hot-tempered', ',', "'", '...']

Частина виразу «[-.(]+» дозволяє виявити подвійний дефіс, еліпсис а також відкриту дужку.

Таблиця 2 містить список символів регулярних виразів.

Символи в регулярних виразах.      Таблиця 2

Символ

Функція

\b

Межі слова

\d

Будь-яка десяткова цифра (== [0-9])

\D

Будь-яка не десяткова цифра (== [^0-9])

\s

Будь-який символ пробілу  (== [ \t\n\r\f\v]

\S

Будь-який не символ пробілу (==  [^ \t\n\r\f\v])

\w

Будь-який символ літери чи цифри (== [a-zA-Z0-9_])

\W

Будь-який не символ літери чи цифри (== [^a-zA-Z0-9_])

\t

Символ табуляції

\n

Символ нової стрічки

3.2.  Токенізатор на основі регулярних виразів в NLTK

Функція nltk.regexp_tokenize()подібна до re.findall() (у випадку використання останньої для токенізаці). Але, nltk.regexp_tokenize() є більш ефективною для здійснення цієї операції, та не потребує використання круглих дужок. Для покращення читабельності регулярний вираз поділений на окремі рядки до яких доданий коментар.. Спеціальний (?x) "verbose flag" – вказує Python на те, що оператор складається з декількох частин і пробілами між ними та коментарами потрібно знехтувати.

>>> text = 'That U.S.A. poster-print costs $12.40...'

>>> pattern = r'''(?x)    # set flag to allow verbose regexps

...     ([A-Z]\.)+        # abbreviations, e.g. U.S.A.

...   | \w+(-\w+)*        # words with optional internal hyphens

...   | \$?\d+(\.\d+)?%?  # currency and percentages, e.g. $12.40, 82%

...   | \.\.\.            # ellipsis

...   | [][.,;"'?():-_`]  # these are separate tokens

... '''

>>> nltk.regexp_tokenize(text, pattern)

['That', 'U.S.A.', 'poster-print', 'costs', '$12.40', '...']

У випадку використання «verbose flag», символ ' ' пробілів потрібно замінити на \s. Функція regexp_tokenize() може містити не обов’язковий параметр gaps . Коли цей параметр має значення True, регулярний вираз виділить проміжки між словами, аналогічно до re.split().

Виконати самостійно.

Перевірити правильність роботи токенізатора, порівнявши списки set(tokens).difference(wordlist)

3.3. Проблеми токенізації тексту

Токенізація - це доволі складна задача, яка не має однозначного рішення. Той чи інший спосіб токенізації та що важаєти окремим словом вибираються в залежності від предметної області..

Для полегшення розробки токенізаторів існує можливість доступу до текстів, які токенізовані вручну. Порівнюючи результати токенізації з таким «gold-standard» токенізатором можна оцінити якість роботи програми. Набір корпусівNLTK включає приклади  Penn Treebank , а саме тексти Wall Street Journal (nltk.corpus.treebank_raw.raw()) та їх токенізовану версію (nltk.corpus.treebank.words()).

Порядок виконання роботи

1. Ознайомитися з теоретичними відомостями.

2. Виконати приклади, які використовуються в теоретичних відомостях.

3. Виконати наступні вправи.

  1.  Описати, які класи стрічок відповідають наступному регулярному виразу. [a-zA-Z]+. Результати перевірити використовуючи nltk.re_show()
  2.  Описати, які класи стрічок відповідають наступному регулярному виразу. [A-Z][a-z]*. Результати перевірити використовуючи nltk.re_show()
  3.  Описати, які класи стрічок відповідають наступному регулярному виразу. \d+(\.\d+)?. Результати перевірити використовуючи nltk.re_show()
  4.  Описати, які класи стрічок відповідають наступному регулярному виразу. ([^aeiou][aeiou][^aeiou])*. Результати перевірити використовуючи nltk.re_show()
  5.  Описати, які класи стрічок відповідають наступному регулярному виразу. \w+|[^\w\s]+.. Результати перевірити використовуючи nltk.re_show()
  6.  Описати, які класи стрічок відповідають наступному регулярному виразу. p[aeiou]{,2}t Результати перевірити використовуючи nltk.re_show()
  7.  Написати регулярний вираз, який встановлює відповідність наступному класу стрічок: всі артиклі (a, an, the).
  8.  Написати регулярний вираз, який встановлює відповідністьнаступному класу стрічок:арифметичний вираз з цілими значеннями і, який містить операції множення та додавання (2*3+8).
  9.  Зберегти довільний текст у файлі corpus.txt. Визначити функцію  для читання з цього файлу (назва файлу аргумент функції) і повертає стрічку, яка містить текст з файлу. Використовуючи nltk.regexp_tokenize() розробити токенізатор для токенізації різних типів пунктуації в цьому тексті. Використовувати багаторядковий запис регулярного виразу з коментарями та «verbose flag»
  10.  Зберегти довільний текст у файлі corpus.txt. Визначити функцію  для читання з цього файлу (назва файлу аргумент функції) і повертає стрічку, яка містить текст з файлу. Використовуючи nltk.regexp_tokenize() розробити токенізатор для токенізації різних типів виразів: грошові одиниці, дати, імена людей та організацій. Використовувати багаторядковий запис регулярного виразу з коментарями та «verbose flag».
  11.  Написати функцію unknown(), яка приймає інтернет адресу як аргумент і повертає не відомі слова, які зустрічаються в тексті. При розробці функції використовувати re.findall() для виявлення всіх підстрічок та корпус Words Corpus (nltk.corpus.words) для виявлення не відомих слів.
  12.  Написати регулярний вираз для токенізації такого тексту, як don't до  do та n't? Пояснити  чому цей регулярний вираз не працює: «n't|\w+».
  13.  Напишіть програму, яка конвертує текст в Pig Latin. String->ingstray, idle->idleay. (Конвертація відбувається переміщенням приголосної або групи приголосних на початок слова та додаванням до слова ay ).
  14.  Прочитати файл допомоги  про функцію re.sub() використовуючи help(re.sub) . Використовуючи re.sub напишіть програму видалення HTML розмітки замінивши її на пробіли.
  15.  Прочитати Додаток А. Дослідити явища описані у Додатку А використовуючи корпуси текстів та метод findall()для пошуку в токенізованому тексті.

4. Підготувати і оформити звіт.

Варіант

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

Номери завдань

1

1

1

1

1

1

1

1

1

1

1

1

1

1

1

2

2

2

2

2

2

2

2

2

2

2

2

2

2

2

3

3

3

3

3

3

3

3

3

3

3

3

3

3

3

4

4

4

4

4

4

4

4

4

4

4

4

4

4

4

5

5

5

5

5

5

5

5

5

5

5

5

5

5

5

6

6

6

6

6

6

6

6

6

6

6

6

6

6

6

8

7

8

7

8

7

8

7

8

7

8

7

8

7

8

9

10

12

9

10

12

9

10

12

9

10

12

9

10

12

11

13

14

11

13

14

11

13

14

11

13

14

11

13

14

15

15

15

15

15

15

15

15

15

15

15

15

15

15

15

Варіант

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

Номери завдань

1

1

1

1

1

1

1

1

1

1

1

1

1

1

1

2

2

2

2

2

2

2

2

2

2

2

2

2

2

2

3

3

3

3

3

3

3

3

3

3

3

3

3

3

3

4

4

4

4

4

4

4

4

4

4

4

4

4

4

4

5

5

5

5

5

5

5

5

5

5

5

5

5

5

5

6

6

6

6

6

6

6

6

6

6

6

6

6

6

6

7

8

7

8

7

8

7

8

7

8

7

8

7

8

7

9

10

12

9

10

12

9

10

12

9

10

12

9

10

12

11

13

14

11

13

14

11

13

14

11

13

14

11

13

14

15

15

15

15

15

15

15

15

15

15

15

15

15

15

15

Зміст звіту

  1.  Титульний аркуш.
  2.  Мета роботи.
  3.  Короткі теоретичні відомості.
  4.  Тексти програм на мові Python.
  5.  Висновок.

Література

  1.  Steven Bird, Ewan Klein, Edward Loper Introduction to Natural Language Processing. 2001-2007 University of Pennsylvania.
  2.  Г. Россум, Ф.Л.Дж. Дрейк, Д.С. Откидач, М. Задка, М. Левис, С.Монтаро, Э.С.Реймонд, А.М.Кучлинг, М.-А.Лембург, К.-П.Йи, Д.Ксиллаг, Х.ГПетрилли, Б.А.Варсав, Дж.К.Ахлстром, Дж.Рокинд, Н.Шеменон, С.Мулендер. Язык программирования Python./ 2001 – 452c.
  3.  Сузи Р. А. Язык программирования Python.- 206с.
  4.  David Mertz Text Processing in Python Addison WesleyBiber, 2003 - 544.

Інтернет посилання

  •  http://www.nltk.org
    •  http://python.org

Додаток А

Language Log

December 29, 2005

Asbestos she can

A few days ago, Nathan Bierma asked me (by email) whether the construction exemplified by "as best (as) I can" might be a blend of "the best (that) I can" and "as well as I can". The puzzle is why we say "as best (as) I can", but not "as hardest (as) I can", or indeed "as ___ (as) I can" for any other superlative.

Whatever the exact history, "as best <SUBJ> <MODAL>" is an old pattern. For instance, an anonymous drama from 1634, "The Mirror of New Reformation", has the lines

... I wil straight dispose,
as best I can, th'inferiour Magistrate ...

And in "The Taming of the Shrew" (1594), Shakespeare has Petruchio say

And I haue thrust my selfe into this maze,
Happily to wiue and thriue, as best I may ...

The pattern "as best as" seems to be more recent. The earlier citation I could find was from 1856, in "Night and Morning" (a play adapted from the novel by Bulwer-Lytton), where Gawtry says:

In fine, my life is that of a great schoolboy, getting into scrapes for the fun of it, and fighting my way out as best as I can!

It continues to be used by reputable authors, as in William Carlos Williams' poem 1917 poem "Sympathetic Portrait of a Child":

As best as she can
she hides herself
in the full sunlight

But whatever the origins and history of the construction, Nathan's suggestion might have something to do with the forces that keep it in current use. So I thought I'd look at some current web counts; and since different search engines sometimes give counts that differ in random-seeming ways, I tried MSN, Yahoo and Google. I started by looking at the patterns "as best __ can" and "as best as __ can", across the different pronouns. I might still discover something relevant to Nathan's question, but along the way I stumbled on a strange pattern in the web search count, which I'll share with you now.

[MSN]

I

you

he

she

it

we

they

[total]

as best __ can

183,672

152,044

31,785

11,353

28,837

217,952

98,167

 

as best as __ can

74,551

35,688

4,869

1,938

6,133

33,812

12,724

 

best/best as ratio

2.4

4.3

6.5

5.9

4.7

6.4

7.7

4.3

 

[Yahoo]

I

you

he

she

it

we

they

[total]

as best __ can

1,070,000

659,000

210,000

80,300

114,000

853,000

495,000

 

as best as __ can

438,000

148,000

33,400

2,800

30,300

148,000

67,500

 

best/best as ratio

2.4

4.5

6.3

28.7

3.8

5.8

7.3

4.0

Helpful Yahoo asks "Did you mean 'asbestos they can'?", although the suggested substitution gets only 95 yits compared to 67,500 for "as best as they can", andYahoo doesn't make any such suggestion for any of the other pronouns in this pattern.

[Google]

I

you

he

she

it

we

they

[total]

as best __ can

830,000

466,000

132,000

51,000

95,100

667,000

377,000

 

as best as __ can

320,000

102,000

21,600

851

22,400

114,000

49,300

 

best/best as ratio

2.6

4.6

6.1

60.0

4.2

5.9

7.6

4.2

In this case, the (proportional) counts are generally pretty consistent across the search engines:

However, there's something funny going on with "she", as we can see better if we display the proportions on a log scale:

The oddity is even clearer if we plot the best/best as ratios:

Google and Yahoo have many fewer hits for the string "as best as she can" than they ought to, in proportion to their counts "as best she can" and their counts for other pronouns in both patterns. What could be going on?

If all three search engines showed the same deficit, we might explore the idea that this is telling us something about our culture's thought and language. But they don't, and so I strongly suspect that instead this is showing us something about the algorithms that Google and Yahoo use to prune SEO-blackhat web pages.

For linguistic as well as algorithmic comparison, here are the analogous numbers and pictures for the pattern "the best (that) __ can":

[MSN]

I

you

he

she

it

we

they

[total]

the best __ can

462,164

659,558

65,128

23,822

284,798

508,639

277,363

 

the best that __ can

64,998

60,047

7,715

2,812

36,476

52,614

43,164

 

best/best as ratio

7.1

11.0

8.4

8.5

7.8

9.7

6.4

8.5

This time, by the way, helpful MSN asks "Were you looking for 'the beast that we can'?"

[Yahoo]

I

you

he

she

it

we

they

[total]

the best __ can

2,940,000

3,180,000

422,000

183,000

1,050,000

2,700,000

1,350,000

 

the best that __ can

343,000

267,000

47,300

4,240

127,000

244,000

168,000

 

best/best as ratio

8.6

11.9

8.9

43.2

8.3

11.1

8.0

9.8

[Google]

I

you

he

she

it

we

they

[total]

the best __ can

1,830,000

1,700,000

280,000

93,100

795,000

1,660,000

1,280,000

 

the best that __ can

225,000

175,000

28,600

12,600

75,100

161,000

126,000

 

best/best as ratio

8.1

9.7

9.8

7.3

10.6

10.3

10.2

9.5

Again, the (proportional) counts are generally pretty consistent across the search engines:

But again, there's something funny going on with "she", though this time it only shows up in Yahoo's counts:

I remain puzzled about what is really behind this -- maybe something about the typical language of porn site link nests? My interest in reverse engineering search engines is not great enough to motivate me to spend much more time investigating it. But if you know, or have a good guess, tell me and I'll tell the world.


 

А также другие работы, которые могут Вас заинтересовать

66565. Налаштування конфігурації системи в CMOS-Setup 173 KB
  Мета: Вивчити основні принципи роботи BIOS та призначення розділів і пунктів CMOS-Setup. Навчитися налаштовувати параметри CMOS-Setup на максимальну продуктивність. Перед завантаженням операційної системи в комп'ютері починає виконання вбудована в чіп материнської плати програма BIOS (Base Input/Output System, основна система вводу-виводу).
66566. Освоєння технології структурного та модульного програмування при розробці й створенні програми мовою Турбо Паскаль при реалізації на ПЕОМ задач з використанням функцій 137 KB
  Мета роботи Дослідити роботу операторів функцій мови Паскаль; знати призначення, форму запису та особливості вживання функцій. Освоїти методику розробки, відладки Паскаль-програм (ПП) з використанням функцій на персональних ЕОМ.
66567. Работа с графической средой ОС UNIX и Windows 44 KB
  Цель работы – изучить архитектуру системы X Window, базовых механизмов отображения графической информации и способов управления графическими окнами в UNIX, основные компоненты оконного интерфейса в Windows.
66568. РАБОТА С ГРАФИЧЕСКОЙ СРЕДОЙ ОС UNIX И WINDOWS 118.91 KB
  Цель работы – изучить архитектуру системы X Window, базовых механизмов отображения графической информации и способов управления графическими окнами в UNIX, основные компоненты оконного интерфейса в Windows.
66569. Исследование схемы автоматического управления электроприводом в функции изменения частоты вращения 112.5 KB
  Целью работы является изучение схем управления электроприводом и исследование режимов работы экспериментальной установки Автоматизированное управление электроприводом в функции изменения частоты вращения. Схемы управления электроприводом...
66570. Построение сети типа «hot-spot» на основе шлюза DSA-3100 42 KB
  Цель работы: получить практические навыки в построение сетей типа «hot-spot». I. Конфигурирование точек доступа Настраиваем первую точку доступа DWL-2100AP публичной подсети: а) заходим на web-интерфейс первой точки доступа.
66571. ВИМІРЮВАННЯ ПОТУЖНОСТІ В ТРИФАЗНИХ КОЛАХ 1.03 MB
  Електричні схеми трифазного електричного кола при з’єднанні споживачів зіркою а трикутником б для вимірювання активної потужності фази одним ватметром Ватметром PW вимірюють активну потужність тільки в одній фазі: PФ = UФIФcos φФ де PФ UФ IФ відповідно фазні потужність...