МІНІСТЕРСТВО ОСВІТИ І НАУКИ УКРАЇНИ
НАЦІОНАЛЬНИЙ УНІВЕРСИТЕТ “ЛЬВІВСЬКА ПОЛІТЕХНІКА”
ІНСТИТУТ КОМП’ЮТЕРНИХ НАУК ТА ІНФОРМАЦІЙНИХ ТЕХНОЛОГІЙ
Кафедра “Системи автоматизованого проектування”
ЗВІТ
до лабораторної роботи №5
ВИВЧЕННЯ БІБЛІОТЕКИ ПРИКЛАДНИХ ПРОГРАМ NLTK, ДЛЯ ОПРАЦЮВАННЯ ТЕКСТІВ ПРИРОДНОЮ МОВОЮ.
АВТОМАТИЧНИЙ МОРФОЛОГІЧНИЙ АНАЛІЗ
МЕТА РОБОТА
Вивчення основ програмування на мові Python.
Ознайомлення з автоматичним морфологічним аналізом в NLTK.
КОРОТКІ ТЕОРЕТИЧНІ ВІДОМОСТІ
1.1 Вступ.
Виконуючи попередні лабораторні роботи слова оброблялися, як слова в загальному розумінні. Ми бачили що деякі розбіжності можна зменшити використовуючи нормалізацію, але подальші узагальнення не робилися. Розглядаючи частотний розподіл слова often фіксувалися слова які йдуть після цього слова і визначено що often часто виконує роль «модифікатора» дієслів. Дійсно, це слово належить до класу слів, які модифікують дієслова – adverbs. Для глибшого розуміння термінології розглянемо програму, яка для заданого слова знаходить інші слова які зустрічаються в тому самому контексті (listing1). Наприклад, для слова women будуть знайдені всі контексти в яких це слово зустрічається в корпусі і будуть знайдені інші слова які зустрічаються в такому контексті.
Коли запустити на виконання функцію dist_sim() для певного переліку слів то отримаємо інші слова, які мають подібне розповсюдження. Для слова women такими словами будуть переважно іменники, для слова bought –дієслова, для over – прийменники, для the – артиклі. В загальному для назв цих груп слів вживаються терміни – класи слів, лексичні категорії, частини мови.
Одною з відомих особливостей Броунівського корпусу є те, що всі слова в ньому промарковані (tagged) за їх частиномовною приналежністю. Тепер замість того щоб розглядати слова які йдуть після often можна аналізувати до якої частини мови вони належать. В таблиці 1 наведені перші вісім таких слів які впорядковані за частотою та з поясненням кожного тега. Бачимо, що більшість слів це дієслова.
Таблиця 1.Частини мови слів Броунівського корпусу, які зустрічаються перед often .
1.2 Загальна інформація про автоматичний морфологічний аналіз в NLTK
Деякі великі корпуси текстів такі як Броунівський(Brown) і частково Wall Street Journal містять морфологічну розмітку (позначенні частини мови всіх слів) і дозволяють працювати з цими даними. Файл морфологічно розміченого корпусу текстів переважно містить текст в наступному вигляді (Броунівський корпус).
1.2.1 Представлення тегів і читання морфологічно розміченого корпусу текстів.
За домовленістю в NLTK промарковані слова (tokens) представляються з використанням типу даних – кортеж. Кортежі подібні до списків, але їх неможна змінювати. До елементів кортежу можна отримати доступ використовуючи їх індекси.
1.3 Класифікація слів.
Іменники англійської мови можуть бути морфологічно складними. Наприклад books і women це множина. Слова з –ness суфіксом це іменники утворені з прикметників: happiness, illness. Суфікс –ment з’являється в деяких іменниках, які походять від дієслів: government, establishment.
Дієслова англійської мови також можуть бути морфологічно складними. Наприклад теперішній тривалий час в дієсловах характеризується закінченням –ing і описує триваючу незавершену дію (falling, eating). Суфікс –ing також з’являється і у іменників, які походять від дієслів (the falling of the leaves (герундій)). В Броунівському корпусі вони маркуються як VBG. Минулий час в дієсловах часто характеризується закінченням –ed і описує завершену дію, маркується VBD.
Загальні набори тегів часто охоплюють деяку морфологічно-синтаксичну інформацію – це є інформація про види морфологічного маркування, які отримують слова в залежності від їх синтаксичної ролі. Розглянемо, наприклад, вибрані різні граматичні форми слова “go” , які ілюструються в наступних реченнях.
ТЕКСТ ПРОГРАМИ
***************************************1****************************************
>>> import nltk
>>> from nltk import corpus
>>> corpus.brown.tagged('b')[4]
[('The', 'AT'), ('jury', 'NN'), ('said', 'VBD'), ('it', 'PPS'), ('did', 'DOD'), ('find', 'VB'), ('that', 'CS'), ('many', 'AP'), ('of', 'IN'), ("Georgia's", 'NP$'), ('registration', 'NN'), ('and', 'CC'), ('election', 'NN'), ('laws', 'NNS'), ('``', '``'), ('are', 'BER'), ('outmoded', 'JJ'), ('or', 'CC'), ('inadequate', 'JJ'), ('and', 'CC'), ('often', 'RB'), ('ambiguous', 'JJ'), ("''", "''"), ('.', '.')]
>>> corpus.brown.tagged('d')[5]
[('It', 'PPS'), ('recommended', 'VBD'), ('that', 'CS'), ('Fulton', 'NP'), ('legislators', 'NNS'), ('act', 'VB'), ('``', '``'), ('to', 'TO'), ('have', 'HV'), ('these', 'DTS'), ('laws', 'NNS'), ('studied', 'VBN'), ('and', 'CC'), ('revised', 'VBN'), ('to', 'IN'), ('the', 'AT'), ('end', 'NN'), ('of', 'IN'), ('modernizing', 'VBG'), ('and', 'CC'), ('improving', 'VBG'), ('them', 'PPO'), ("''", "''"), ('.', '.')]
***************************************2****************************************
>>> import nltk
>>> from nltk import corpus
>>> fd=nltk.FreqDist()
>>> for (wd, tg) in corpus.brown.tagged('b')[3]:
fd.inc(tg)
>>> fd.max()
'NN'
>>>tokens=tokenize.whitespace('I hate studying at school')
>>>default_tagger=tag.Default('nn')
>>>list(default_tagger.tag(tokens))
[('I' , 'nn'), ('hate', 'nn'), ('studying', 'nn'), ('at', 'nn'), ('school', 'nn')]
Tag.accuracy(default_tagger, corpus.brown.tagger)
***************************************3****************************************
from nltk import corpus
>>> fd=nltk.FreqDist()
>>> for (wd, tg) in corpus.brown.tagged('b')[4]:
if tg[:2]=='vb':
fd.inc(wd + '/' + tg)
>>> fd.sorted()[:15]
['went/vbd' , 'be/vb' , 'tell/vb' , 'done/vbn' , 'finished/vbd' , 'healed/vbd' , 'fakes/vbz' , 'run/vb' , 'goes/vbz' , 'been/vbn' , 'cursed/vbd' , 'fixed/vbd' , 'stridden/vbn' , 'struck/vbd , 'makes/vbz' ]
***************************************4****************************************
>>> import nltk
>>> from nltk import tokenize
>>> def build_wc_map():
cw_map=nltk.defaultdict(list)
for item in corpus.brown.items:
for sent in corpus.brown.tokenized(item):
sent=[w.lower() for w in sent]
for i in range(l, len(sent)-1):
cw_map=[(sent[i-1],sent[i+1])], append(sent[i])
return nltk.invert_dict(cw_map)
>>> def dist_sim(wc_map, word, num=10):
if word in wc_map:
contexts=set(wc_map[word])
fd=nltk.FreqDist(w for w in wc_map for c in wc_map[w] if c in contexts)
return fd.sorted()[:num]
return []
>>> wc_map=build_wc_map()
>>>dist_sim(wc_map, 'world')
['time' , 'man' , 'number' , 'estate' , 'power' , 'universe' , 'star' , 'person' , 'jury' , 'future']
>>>dist_sim(wc_map, 'finished')
['thought' , 'meant' , 'used' , 'took' , 'spoilt' , 'paid' , 'lit' , 'met' , 'used' , 'killed']
>>>dist_sim(wc_map, 'in' )
['for' , 'between', 'for' , 'out' , 'and', 'at' , 'among' , 'to' , 'across' , 'with']
>>>dist_sim(wc_map, 'her')
['his' , 'and' , 'their' , 'this' , 'that' , 'our' , 'no' , 'some', 'your' , 'the']
***************************************5****************************************
>>>import nltk
>>> from nltk import corpus
>>> def findtags(tag_prefix, tagged_text):
cfd=nltk.ConditionalFreqDist()
for (wd, tg) in tagged_text:
if tg.startswith(tag_prefix):
cfd[tg].inc(wd)
tagdict={}
for tg in cfd.conditions():
tagdict[tg]=cfd[tg].sorted()[:5]
return tagdict
>>> tagdict=findtags('nn', corpus.brown.tagged('b'))
>>>for tg in sorted(tagdict):
print tg, tgdict[tg]
nn ['woman' , 'month' , 'duty' , 'child' , 'world']
nn$ ['day’s', 'state’s' , 'world’s' , 'nation’s' , 'child’s']
nn$-hl ['Grove’s', 'Jury’s' ]
nn$-tl ['Minister’s' , 'General’s' , 'Admiral’s' , 'President’s']
nns ['women' , 'states' , 'cities' , 'fees']
nns$ ['women’s' , 'men’s' , 'children’s']
nn-tl ['Governor' , 'City' , 'State' , 'President']
***************************************6****************************************
>>> patterns=[
(r'.*ing$', 'vbg'), # gerunds
(r'.*ed$', 'vbd'), # simple past
(r'.*es$', 'vbz'), # 3rd singular present
(r'.*ould$', 'md'), # modals
(r'.*\'s$', 'nn$'), # possessive nouns
(r'.*s$', 'nns'), # plural nouns
(r'^-?[0-9]+(.[0-9]+)?$', 'cd'), # cardinal numbers
(r'.*', 'nn') # nouns (default)
]
>>>regexp_tagger = tag.Regexp(patterns)
>>>list(regexp_tagger.tag(brown.raw('a')))[3]
[('``', '``'), ('Only', 'RB'), ('a', 'AT'), ('relative', 'JJ'), ('handful', 'NN'), ('of', 'IN'), ('such', 'JJ'), ('reports', 'NNS'), ('was', 'BEDZ'), ('received', 'VBN'), ("''", "''"), (',', ','), ('the', 'AT'), ('jury', 'NN'), ('said', 'VBD'), (',', ','), ('``', '``'), ('considering', 'IN'), ('the', 'AT'), ('widespread', 'JJ'), ('interest', 'NN'), ('in', 'IN'), ('the', 'AT'), ('election', 'NN'), (',', ','), ('the', 'AT'), ('number', 'NN'), ('of', 'IN'), ('voters', 'NNS'), ('and', 'CC'), ('the', 'AT'), ('size', 'NN'), ('of', 'IN'), ('this', 'DT'), ('city', 'NN'), ("''", "''"), ('.', '.')]
ВИСНОВОК:
На даній лабораторній роботі я продовжила знайомство з мовою програмування Python, а також ознайомилась з автоматичним морфологічним аналізом NLTK і працювала з промаркованим корпусом Brown.
МІНІСТЕРСТВО ОСВІТИ І НАУКИ УКРАЇНИ
НАЦІОНАЛЬНИЙ УНІВЕРСИТЕТ “ЛЬВІВСЬКА ПОЛІТЕХНІКА”
ІНСТИТУТ КОМП’ЮТЕРНИХ НАУК ТА ІНФОРМАЦІЙНИХ ТЕХНОЛОГІЙ
Кафедра “Системи автоматизованого проектування”
ЗВІТ
до лабораторної роботи №5
ВИВЧЕННЯ БІБЛІОТЕКИ ПРИКЛАДНИХ ПРОГРАМ NLTK, ДЛЯ ОПРАЦЮВАННЯ ТЕКСТІВ ПРИРОДНОЮ МОВОЮ.
АВТОМАТИЧНИЙ МОРФОЛОГІЧНИЙ АНАЛІЗ
Виконала:
студентка групи ПРЛ-12м
Бак Тетяна
Прийняв:
Тимощук П. В.
Львів-2008
МЕТА РОБОТА
Вивчення основ програмування на мові Python.
Ознайомлення з автоматичним морфологічним аналізом в NLTK.
КОРОТКІ ТЕОРЕТИЧНІ ВІДОМОСТІ
1.1 Вступ.
Виконуючи попередні лабораторні роботи слова оброблялися, як слова в загальному розумінні. Ми бачили що деякі розбіжності можна зменшити використовуючи нормалізацію, але подальші узагальнення не робилися. Розглядаючи частотний розподіл слова often фіксувалися слова які йдуть після цього слова і визначено що often часто виконує роль «модифікатора» дієслів. Дійсно, це слово належить до класу слів, які модифікують дієслова – adverbs. Для глибшого розуміння термінології розглянемо програму, яка для заданого слова знаходить інші слова які зустрічаються в тому самому контексті (listing1). Наприклад, для слова women будуть знайдені всі контексти в яких це слово зустрічається в корпусі і будуть знайдені інші слова які зустрічаються в такому контексті.
Коли запустити на виконання функцію dist_sim() для певного переліку слів то отримаємо інші слова, які мають подібне розповсюдження. Для слова women такими словами будуть переважно іменники, для слова bought –дієслова, для over – прийменники, для the – артиклі. В загальному для назв цих груп слів вживаються терміни – класи слів, лексичні категорії, частини мови.
Одною з відомих особливостей Броунівського корпусу є те, що всі слова в ньому промарковані (tagged) за їх частиномовною приналежністю. Тепер замість того щоб розглядати слова які йдуть після often можна аналізувати до якої частини мови вони належать. В таблиці 1 наведені перші вісім таких слів які впорядковані за частотою та з поясненням кожного тега. Бачимо, що більшість слів це дієслова.
Таблиця 1.Частини мови слів Броунівського корпусу, які зустрічаються перед often .
1.2 Загальна інформація про автоматичний морфологічний аналіз в NLTK
Деякі великі корпуси текстів такі як Броунівський(Brown) і частково Wall Street Journal містять морфологічну розмітку (позначенні частини мови всіх слів) і дозволяють працювати з цими даними. Файл морфологічно розміченого корпусу текстів переважно містить текст в наступному вигляді (Броунівський корпус).
1.2.1 Представлення тегів і читання морфологічно розміченого корпусу текстів.
За домовленістю в NLTK промарковані слова (tokens) представляються з використанням типу даних – кортеж. Кортежі подібні до списків, але їх неможна змінювати. До елементів кортежу можна отримати доступ використовуючи їх індекси.
1.3 Класифікація слів.
Іменники англійської мови можуть бути морфологічно складними. Наприклад books і women це множина. Слова з –ness суфіксом це іменники утворені з прикметників: happiness, illness. Суфікс –ment з’являється в деяких іменниках, які походять від дієслів: government, establishment.
Дієслова англійської мови також можуть бути морфологічно складними. Наприклад теперішній тривалий час в дієсловах характеризується закінченням –ing і описує триваючу незавершену дію (falling, eating). Суфікс –ing також з’являється і у іменників, які походять від дієслів (the falling of the leaves (герундій)). В Броунівському корпусі вони маркуються як VBG. Минулий час в дієсловах часто характеризується закінченням –ed і описує завершену дію, маркується VBD.
Загальні набори тегів часто охоплюють деяку морфологічно-синтаксичну інформацію – це є інформація про види морфологічного маркування, які отримують слова в залежності від їх синтаксичної ролі. Розглянемо, наприклад, вибрані різні граматичні форми слова “go” , які ілюструються в наступних реченнях.
ТЕКСТ ПРОГРАМИ
***************************************1****************************************
>>> import nltk
>>> from nltk import corpus
>>> corpus.brown.tagged('b')[4]
[('The', 'AT'), ('jury', 'NN'), ('said', 'VBD'), ('it', 'PPS'), ('did', 'DOD'), ('find', 'VB'), ('that', 'CS'), ('many', 'AP'), ('of', 'IN'), ("Georgia's", 'NP$'), ('registration', 'NN'), ('and', 'CC'), ('election', 'NN'), ('laws', 'NNS'), ('``', '``'), ('are', 'BER'), ('outmoded', 'JJ'), ('or', 'CC'), ('inadequate', 'JJ'), ('and', 'CC'), ('often', 'RB'), ('ambiguous', 'JJ'), ("''", "''"), ('.', '.')]
>>> corpus.brown.tagged('d')[5]
[('It', 'PPS'), ('recommended', 'VBD'), ('that', 'CS'), ('Fulton', 'NP'), ('legislators', 'NNS'), ('act', 'VB'), ('``', '``'), ('to', 'TO'), ('have', 'HV'), ('these', 'DTS'), ('laws', 'NNS'), ('studied', 'VBN'), ('and', 'CC'), ('revised', 'VBN'), ('to', 'IN'), ('the', 'AT'), ('end', 'NN'), ('of', 'IN'), ('modernizing', 'VBG'), ('and', 'CC'), ('improving', 'VBG'), ('them', 'PPO'), ("''", "''"), ('.', '.')]
***************************************2****************************************
>>> import nltk
>>> from nltk import corpus
>>> fd=nltk.FreqDist()
>>> for (wd, tg) in corpus.brown.tagged('b')[3]:
fd.inc(tg)
>>> fd.max()
'NN'
>>>tokens=tokenize.whitespace('I hate studying at school')
>>>default_tagger=tag.Default('nn')
>>>list(default_tagger.tag(tokens))
[('I' , 'nn'), ('hate', 'nn'), ('studying', 'nn'), ('at', 'nn'), ('school', 'nn')]
Tag.accuracy(default_tagger, corpus.brown.tagger)
***************************************3****************************************
from nltk import corpus
>>> fd=nltk.FreqDist()
>>> for (wd, tg) in corpus.brown.tagged('b')[4]:
if tg[:2]=='vb':
fd.inc(wd + '/' + tg)
>>> fd.sorted()[:15]
['went/vbd' , 'be/vb' , 'tell/vb' , 'done/vbn' , 'finished/vbd' , 'healed/vbd' , 'fakes/vbz' , 'run/vb' , 'goes/vbz' , 'been/vbn' , 'cursed/vbd' , 'fixed/vbd' , 'stridden/vbn' , 'struck/vbd , 'makes/vbz' ]
***************************************4****************************************
>>> import nltk
>>> from nltk import tokenize
>>> def build_wc_map():
cw_map=nltk.defaultdict(list)
for item in corpus.brown.items:
for sent in corpus.brown.tokenized(item):
sent=[w.lower() for w in sent]
for i in range(l, len(sent)-1):
cw_map=[(sent[i-1],sent[i+1])], append(sent[i])
return nltk.invert_dict(cw_map)
>>> def dist_sim(wc_map, word, num=10):
if word in wc_map:
contexts=set(wc_map[word])
fd=nltk.FreqDist(w for w in wc_map for c in wc_map[w] if c in contexts)
return fd.sorted()[:num]
return []
>>> wc_map=build_wc_map()
>>>dist_sim(wc_map, 'world')
['time' , 'man' , 'number' , 'estate' , 'power' , 'universe' , 'star' , 'person' , 'jury' , 'future']
>>>dist_sim(wc_map, 'finished')
['thought' , 'meant' , 'used' , 'took' , 'spoilt' , 'paid' , 'lit' , 'met' , 'used' , 'killed']
>>>dist_sim(wc_map, 'in' )
['for' , 'between', 'for' , 'out' , 'and', 'at' , 'among' , 'to' , 'across' , 'with']
>>>dist_sim(wc_map, 'her')
['his' , 'and' , 'their' , 'this' , 'that' , 'our' , 'no' , 'some', 'your' , 'the']
***************************************5****************************************
>>>import nltk
>>> from nltk import corpus
>>> def findtags(tag_prefix, tagged_text):
cfd=nltk.ConditionalFreqDist()
for (wd, tg) in tagged_text:
if tg.startswith(tag_prefix):
cfd[tg].inc(wd)
tagdict={}
for tg in cfd.conditions():
tagdict[tg]=cfd[tg].sorted()[:5]
return tagdict
>>> tagdict=findtags('nn', corpus.brown.tagged('b'))
>>>for tg in sorted(tagdict):
print tg, tgdict[tg]
nn ['woman' , 'month' , 'duty' , 'child' , 'world']
nn$ ['day’s', 'state’s' , 'world’s' , 'nation’s' , 'child’s']
nn$-hl ['Grove’s', 'Jury’s' ]
nn$-tl ['Minister’s' , 'General’s' , 'Admiral’s' , 'President’s']
nns ['women' , 'states' , 'cities' , 'fees']
nns$ ['women’s' , 'men’s' , 'children’s']
nn-tl ['Governor' , 'City' , 'State' , 'President']
***************************************6****************************************
>>> patterns=[
(r'.*ing$', 'vbg'), # gerunds
(r'.*ed$', 'vbd'), # simple past
(r'.*es$', 'vbz'), # 3rd singular present
(r'.*ould$', 'md'), # modals
(r'.*\'s$', 'nn$'), # possessive nouns
(r'.*s$', 'nns'), # plural nouns
(r'^-?[0-9]+(.[0-9]+)?$', 'cd'), # cardinal numbers
(r'.*', 'nn') # nouns (default)
]
>>>regexp_tagger = tag.Regexp(patterns)
>>>list(regexp_tagger.tag(brown.raw('a')))[3]
[('``', '``'), ('Only', 'RB'), ('a', 'AT'), ('relative', 'JJ'), ('handful', 'NN'), ('of', 'IN'), ('such', 'JJ'), ('reports', 'NNS'), ('was', 'BEDZ'), ('received', 'VBN'), ("''", "''"), (',', ','), ('the', 'AT'), ('jury', 'NN'), ('said', 'VBD'), (',', ','), ('``', '``'), ('considering', 'IN'), ('the', 'AT'), ('widespread', 'JJ'), ('interest', 'NN'), ('in', 'IN'), ('the', 'AT'), ('election', 'NN'), (',', ','), ('the', 'AT'), ('number', 'NN'), ('of', 'IN'), ('voters', 'NNS'), ('and', 'CC'), ('the', 'AT'), ('size', 'NN'), ('of', 'IN'), ('this', 'DT'), ('city', 'NN'), ("''", "''"), ('.', '.')]
ВИСНОВОК:
На даній лабораторній роботі я продовжив знайомство з мовою програмування Python, а також ознайомився з автоматичним морфологічним аналізом NLTK і працював з промаркованим корпусом Brown.