Машинная обработка естественных языков

Report
Машинная обработка
естественных языков
Петр Новиков
http://novikov.amikeco.ru
Санкт-Петербург, 13.04.2014
Why Natural Language Processing?
• Проблема взаимодействия человеккомпьютер
• Проблема автоматизированной обработки
неструктурированных баз знаний
Языки программирования
Не ломимся ли мы в открытую дверь?
Что автор хотел сказать?
• То, что понятно машине, непонятно
человеку, и наоборот.
• Для человека наиболее предпочтительно
изъясняться на своем родном языке
• Человеческий язык неоднозначен и сильно
зависит от контекста
• => Используем вероятностные методы!
Вероятностный подход.
Наивный байесовский подход
• Задача классификации документа
• Предположим, что есть база знаний (корпус), из
которых мы можем получить априорные вероятности
nltk.download()
• Предположим, что имеем в распоряжении «стеммер» –
средство, позволяющее извлекать основу слова
from nltk import stem
stem.SnowballStemmer.languages
russian_stemmer = stem.SnowballStemmer('russian')
print russian_stemmer.stem(u'поиска')
print russian_stemmer.stem(u'строим')
pymorph?
Вероятностный подход.
Наивный байесовский метод
Теорема Байеса
  (|)
  =
()
Томас Байес (1702 – 1761)
Если 1 , 2 , 3 взаимно независимы,
   1  (2  (3 |)
  1 2 3 =
(1 2 3 )
Вероятностный подход.
Наивный байесовский метод
Как классифицировать документ?
D1: Строим дерево поиска.
D2: Строим из дерева.
P( КОМП | строим дерево поиска ) =
= P( КОМП )
0.500
* P( строим | КОМП )
0.010
* P( дерево | КОМП )
0.010
* P( поиска | КОМП )
0.010
/ P( строим дерево поиска )
P( КОМП | строим дом из дерева ) =
= P( КОМП )
0.500
* P( строим | КОМП )
0.010
* P( дом
| КОМП )
0.001
* P( из
| КОМП )
0.001
* P( дерева | КОМП )
0.010
/ P( строим дом из дерева )
КОМП -- Компьютерные науки
СТРО -- Строительство и ремонт
>
<
P(СТРО | строим дерево поиска) =
= P( СТРО )
0.500
* P( строим | СТРО )
0.010
* P( дерево | СТРО )
0.010
* P( поиска | СТРО )
0.001
/ P( строим дерево поиска )
P( СТРО | строим дом из дерева ) =
= P( СТРО )
0.500
* P( строим | СТРО )
0.010
* P( дом
| СТРО )
0.010
* P( из
| СТРО )
0.001
* P( дерева | СТРО )
0.010
/ P( строим дом из дерева )
Вероятностный подход.
Наивный байесовский метод
Как классифицировать документ?
D1: Строим дерево поиска.
D2: Строим из дерева.
P( КОМП | строим дерево поиска ) =
= P( КОМП )
0.500
* P( строим | КОМП )
0.010
* P( дерево | КОМП )
0.010
* P( поиска | КОМП )
0.010
/ P( строим дерево поиска )
P( КОМП | строим из дерева ) =
= P( КОМП )
0.500
* P( строим | КОМП )
0.010
* P( из
| КОМП )
0.001
* P( дерева | КОМП )
0.010
/ P( строим из дерева )
КОМП -- Компьютерные науки
СТРО -- Строительство и ремонт
>
=
P(СТРО | строим дерево поиска) =
= P( СТРО )
0.500
* P( строим | СТРО )
0.010
* P( дерево | СТРО )
0.010
* P( поиска | СТРО )
0.001
/ P( строим дерево поиска )
P( СТРО | строим из дерева ) =
= P( СТРО )
0.500
* P( строим | СТРО )
0.010
* P( из
| СТРО )
0.001
* P( дерева | СТРО )
0.010
/ P( строим из дерева )
Вероятностный подход.
Наивный байесовский метод
Как классифицировать документ?
D1: Строим дерево поиска.
D2: Строим из дерева.
P( КОМП | строим дерево поиска ) =
= P( КОМП )
0.500
* P( строим | NULL, КОМП )
0.010
* P( дерево | строим, КОМП ) 0.010
* P( поиска | дерево, КОМП ) 0.010
/ P( строим дерево поиска )
P( КОМП | строим из дерева ) =
= P( КОМП )
0.500
* P( строим | NULL, КОМП )
0.010
* P( из
| строим, КОМП ) 0.001
* P( дерева | из, КОМП )
0.005
/ P( строим из дерева )
КОМП -- Компьютерные науки
СТРО -- Строительство и ремонт
>
<
P(СТРО | строим дерево поиска) =
= P( СТРО )
0.500
* P( строим | NULL, СТРО )
0.010
* P( дерево | строим, СТРО ) 0.001
* P( поиска | дерево, СТРО ) 0.001
/ P( строим дерево поиска )
P( СТРО | строим из дерева ) =
= P( СТРО )
0.500
* P( строим | СТРО )
0.010
* P( из
| СТРО )
0.001
* P( дерева | СТРО )
0.010
/ P( строим из дерева )
Вероятностный подход.
Наивный байесовский метод
Как правильно перевести слово «дерево»: «arbo» или «ligno»?
ARBO -- дерево (растение или структура данных)
LIGNO -- дерево (строительный материал)
P( ARBO | строим дерево поиска ) =
= P( ARBO )
0.500
* P( строим | ARBO )
0.001
* P( дерево | ARBO )
0.010
* P( поиска | ARBO )
0.010
/ P( строим дерево поиска )
P( ARBO | строим дом из дерева ) =
= P( ARBO )
0.500
* P( строим | ARBO )
0.001
* P( дом
| ARBO )
0.005
* P( из
| ARBO )
0.001
* P( дерева | ARBO )
0.010
/ P( строим дом из дерева )
=
<
P(LIGNO | строим дерево поиска) =
= P( LIGNO )
0.500
* P( строим | LIGNO )
0.010
* P( дерево | LIGNO )
0.010
* P( поиска | LIGNO )
0.001
/ P( строим дерево поиска )
P( LIGNO | строим дом из дерева ) =
= P( СТРLIGNO )
0.500
* P( строим | LIGNO )
0.010
* P( дом
| LIGNO )
0.010
* P( из
| LIGNO )
0.001
* P( дерева | LIGNO )
0.010
/ P( строим дом из дерева )
Вероятностный подход.
Векторная модель документа
• Дан набор из n документов, в которых встречается m слов.
• Пусть X=[xij], i=1 ,.., m, j=1, ..., n - матрица с m строк и n
столбцов, у которой (i,j)-й элемент описывает вероятность
встретить слово i в документе j
• К этой матрице можно относиться, как к матрице
ковариаций
• Для такой ситуации разработаны статистические методы
• Попробовать использовать спектральное разложение?
Метод главных компонент?
Чего не хватает «чистым»
вероятностным методам
• Теряется информация о частях речи
• Никак не используется структура
предложения и связи слов в предложении
• … (дополните)
Контекстно-свободная грамматика
import nltk
NP – noun phrase (именная группа)
groucho_grammar = nltk.parse_cfg("""
N – noun (существительное)
S -> NP VP
S – sentence (предложение)
PP -> P NP
JJ – adjective (прилагательное)
NP -> Det N | Det N PP | 'I'
V – verb (глагол)
VP – verb phrase (глагольная группа)
VP -> V NP | VP PP
Det – determiner (определитель)
Det -> 'an' | 'my'
P – preposition (предлог)
N -> 'elephant' | 'pajamas'
V -> 'shot'
P -> 'in'
""")
sent = nltk.word_tokenize('I shot an elephant in my
pajamas')
parser = nltk.ChartParser(groucho_grammar)
trees = parser.nbest_parse(sent)
for tree in trees:
print tree
for tree in trees:
tree.draw()
Контекстно-свободная грамматика
I saw an elephant in my
pajamas.
NP – noun phrase (именная группа)
N – noun (существительное)
S – sentence (предложение)
JJ – adjective (прилагательное)
V – verb (глагол)
VP – verb phrase (глагольная группа)
Det – determiner (определитель)
P – preposition (предлог)
Контекстно-свободная грамматика
import nltk
NP – noun phrase (именная группа)
badboy_grammar = nltk.parse_cfg("""
N – noun (существительное)
S -> NP VP
S – sentence (предложение)
PP -> P NP
JJ – adjective (прилагательное)
NP -> Det NP | N | Det N PP | JJ NP | 'I'
V – verb (глагол)
VP -> V NP | VP PP
VP – verb phrase (глагольная группа)
Det -> 'an' | 'my' | 'The' | 'that'
Det – determiner (определитель)
N -> 'elephant' | 'pajamas' | 'boy' | 'mess'
P – preposition (предлог)
V -> 'shot' | 'made'
P -> 'in'
JJ -> 'bad'
""")
sent = nltk.word_tokenize('The bad boy made that mess')
parser = nltk.ChartParser(badboy_grammar)
trees = parser.nbest_parse(sent)
for tree in trees:
print tree
for tree in trees:
tree.draw()
Контекстно-свободная грамматика
The bad boy made that mess.
NP – noun phrase (именная группа)
N – noun (существительное)
S – sentence (предложение)
JJ – adjective (прилагательное)
V – verb (глагол)
VP – verb phrase (глагольная группа)
Det – determiner (определитель)
P – preposition (предлог)
Категориальная грамматика
Правила вывода:
NP – noun phrase (именная группа)
N – noun (существительное)
S – sentence (предложение)
JJ – adjective (прилагательное)
V – verb (глагол)
VP – verb phrase (глагольная группа)
Det – determiner (определитель)
JJ = N/N
V = (NP\S)/N P
Det = N P /N
Еще пример
import nltk
sentence = """At eight o'clock on Thursday morning
Arthur didn't feel very good."""
tokens = nltk.word_tokenize(sentence)
tokens
tagged = nltk.pos_tag(tokens)
tagged[0:6]
entities = nltk.chunk.ne_chunk(tagged)
entities
from nltk.corpus import treebank
t = treebank.parsed_sents('wsj_0001.mrg')[0]
t.draw()
Проблемы формальных грамматик
• Даже языки с фиксированным порядком слов
(английский, французский) трудно формализуемы,
не говоря о языках с произвольным порядком слов
(русский, эсперанто)
• При построении контекстно-свободной грамматики
с некоторого момента обнаруживается, что
используемые абстракции перестают содержать
лингвистический смысл (похоже на проблему
современной физики)
• => В базах знаний ограничимся «легко»
формализуемым подмножеством языка!
Formal English / Formeel Nederlands /
gellish.net
• The Eiffel tower is located in Paris.
• The Eiffel tower is classified as a tower.
• Paris is classified as a city.
Left hand object
Relation type
Right hand object
The Eiffel tower
is located in
Paris
The Eiffel tower
is classified as a
tower
Paris
is classified as a
city
Formal English / Formeel Nederlands /
gellish.net
GELLISH ENGLISH A structured and formalized subset of natural English that is computer interpretable. Its definition
includes a Formal English Dictionary-Taxonomy of concepts in which the concepts are arranged in a taxonomy hierarchy
and is an ontology as far as required to define the language.
The Gellish Formal English Dictionary-Taxonomy contains the following Domain Dictionaries-Taxonomies:
•
Generic concepts and relation types (TOPini)
•
Units of Measures, scales and currencies
•
Activities, Events, Processes and Functions
•
Physical objects of various kinds, such as:
•
- Static equipment, process units and piping
•
- Buildings, civil and structural items
•
- Electrical and Instrumentation, Control and Valves
•
- Rotating equipment, Transport equipment and Solids Handling
•
- Roles of physical objects (applications)
•
Aspects, Properties, Qualities and Roles of aspects
•
Materials of constructions (steel and non-steel), Fluids and Waves
•
Documents and Identification, Information, Symbols and Annotation
•
Geographic objects, including countries
•
Biology
•
Organizations and Procurement
•
Mathematics, Geometry and Shapes
•
Waste water and water treatment
• В реальности методы комбинируются
• Например, можно использовать
формальные грамматики там, где это
применимо, а в остальных частях
«догадываться» статистически
• Несколько машин, работающих по разным
алгоритмам, вырабатывают каждая свое
решение, а затем вопрос решается
«голосованием»
Полезные ссылки
• Сайт автора лекции: http://novikov.amikeco.ru
• Natural Language ToolKit (NLTK) http://www.nltk.org
http://www.nltk.org/book
• Parsing of Esperanto, диссертация на тему автоматизированного
разбора языка эсперанто
https://www.duo.uio.no/bitstream/handle/10852/9411/thesis.pdf
• Онлайн-курсы Natural Language Processing на Coursera:
https://class.coursera.org/nlp/lecture/preview (Jurafsky &
Manning) https://www.coursera.org/course/nlangp (Collins)
• Как стать хорошим компьютерным лингвистом?
http://mathlingvo.ru/2013/03/becoming-a-good-computerlinguist/
• Gellish English http://gellish.net
• Wolfram Alpha http://alpha.wolfram.com

similar documents