230 likes | 495 Views
Машинная обработка естественных языков Петр Новиков http://novikov.amikeco.ru. Санкт-Петербург, 13.04.2014. Why Natural Language Processing?. Проблема взаимодействия человек-компьютер Проблема автоматизированной обработки неструктурированных баз знаний. Языки программирования.
E N D
Машинная обработкаестественных языковПетр Новиков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) Если , взаимно независимы,
Вероятностный подход.Наивный байесовский метод Как классифицировать документ?D1: Строим дерево поиска. КОМП -- Компьютерные науки D2: Строим из дерева. СТРО -- Строительство и ремонт P( КОМП | строим дерево поиска ) = > P(СТРО | строим дерево поиска) = = P( КОМП ) 0.500 = P( СТРО ) 0.500 * P( строим | КОМП ) 0.010 * P( строим | СТРО ) 0.010 * P( дерево | КОМП ) 0.010 * P( дерево | СТРО ) 0.010 * P( поиска | КОМП ) 0.010 * P( поиска | СТРО ) 0.001 / P( строим дерево поиска ) / P( строим дерево поиска ) P( КОМП | строим дом из дерева ) = P( СТРО | строим дом из дерева ) = = P( КОМП ) 0.500 < = P( СТРО ) 0.500 * P( строим | КОМП ) 0.010 * P( строим | СТРО ) 0.010 * P( дом | КОМП ) 0.001 * P( дом | СТРО ) 0.010 * P( из | КОМП ) 0.001 * P( из | СТРО ) 0.001 * P( дерева | КОМП ) 0.010 * P( дерева | СТРО ) 0.010 / P( строим дом из дерева ) / P( строим дом из дерева )
Вероятностный подход.Наивный байесовский метод Как классифицировать документ?D1: Строим дерево поиска. КОМП -- Компьютерные науки D2: Строим из дерева. СТРО -- Строительство и ремонт P( КОМП | строим дерево поиска ) = > P(СТРО | строим дерево поиска) = = P( КОМП ) 0.500 = P( СТРО ) 0.500 * P( строим | КОМП ) 0.010 * P( строим | СТРО ) 0.010 * P( дерево | КОМП ) 0.010 * P( дерево | СТРО ) 0.010 * P( поиска | КОМП ) 0.010 * P( поиска | СТРО ) 0.001 / P( строим дерево поиска ) / P( строим дерево поиска ) P( КОМП | строим из дерева ) = P( СТРО | строим из дерева ) = = P( КОМП ) 0.500 = = P( СТРО ) 0.500 * P( строим | КОМП ) 0.010 * P( строим | СТРО ) 0.010 * P( из | КОМП ) 0.001 * P( из | СТРО ) 0.001 * P( дерева | КОМП ) 0.010 * P( дерева | СТРО ) 0.010 / P( строим из дерева ) / P( строим из дерева )
Вероятностный подход.Наивный байесовский метод Как классифицировать документ? D1: Строим дерево поиска. КОМП -- Компьютерные науки D2: Строим из дерева. СТРО -- Строительство и ремонт P( КОМП | строим дерево поиска ) = > P(СТРО | строим дерево поиска) = = P( КОМП ) 0.500 = P( СТРО ) 0.500 * P( строим | NULL, КОМП ) 0.010 * P( строим | NULL, СТРО ) 0.010 * P( дерево | строим, КОМП ) 0.010 * P( дерево | строим, СТРО ) 0.001 * P( поиска | дерево, КОМП ) 0.010 * P( поиска | дерево, СТРО ) 0.001 / P( строим дерево поиска ) / P( строим дерево поиска ) P( КОМП | строим из дерева ) = P( СТРО | строим из дерева ) = = P( КОМП ) 0.500 < = P( СТРО ) 0.500 * P( строим | NULL, КОМП ) 0.010 * P( строим | СТРО ) 0.010 * P( из | строим, КОМП ) 0.001 * P( из | СТРО ) 0.001 * P( дерева | из, КОМП ) 0.005 * P( дерева | СТРО ) 0.010 / P( строим из дерева ) / P( строим из дерева )
Вероятностный подход.Наивный байесовский метод Как правильно перевести слово «дерево»: «arbo» или«ligno»? ARBO -- дерево (растение или структура данных) LIGNO -- дерево (строительный материал) P( ARBO | строим дерево поиска ) = = P(LIGNO | строим дерево поиска) = = P( ARBO ) 0.500 = P( LIGNO ) 0.500 * P( строим | ARBO ) 0.001 * P( строим | LIGNO ) 0.010 * P( дерево | ARBO ) 0.010 * P( дерево | LIGNO ) 0.010 * P( поиска | ARBO ) 0.010 * P( поиска | LIGNO ) 0.001 / P( строим дерево поиска ) / P( строим дерево поиска ) P( ARBO | строим дом из дерева ) = P( LIGNO | строим дом из дерева ) = = P( ARBO ) 0.500 < = P( СТРLIGNO ) 0.500 * P( строим | ARBO ) 0.001 * P( строим | LIGNO ) 0.010 * P( дом | ARBO ) 0.005 * P( дом | LIGNO ) 0.010 * P( из | ARBO ) 0.001 * P( из | LIGNO ) 0.001 * P( дерева | ARBO ) 0.010 * P( дерева | LIGNO ) 0.010 / P( строим дом из дерева ) / P( строим дом из дерева )
Вероятностный подход.Векторная модель документа • Дан набор из n документов, в которых встречается mслов. • Пусть X=[xij], i=1 ,.., m, j=1, ..., n - матрица с m строк и n столбцов, у которой (i,j)-й элемент описывает вероятность встретить слово i в документе j • К этой матрице можно относиться, как к матрице ковариаций • Для такой ситуации разработаны статистические методы • Попробовать использовать спектральное разложение? Метод главных компонент?
Чего не хватает «чистым» вероятностным методам • Теряется информация о частях речи • Никак не используется структура предложения и связи слов в предложении • … (дополните)
Контекстно-свободная грамматика import nltk groucho_grammar = nltk.parse_cfg(""" S -> NP VP PP -> P NP NP -> Det N | Det N PP | 'I' VP -> V NP | VP PP Det -> 'an' | 'my' 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() NP – noun phrase (именная группа) N – noun (существительное) S – sentence (предложение) JJ – adjective (прилагательное) V – verb (глагол) VP – verb phrase (глагольная группа) Det – determiner (определитель) P – preposition (предлог)
Контекстно-свободная грамматика 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 badboy_grammar = nltk.parse_cfg(""" S -> NP VP PP -> P NP NP -> Det NP | N | Det N PP | JJ NP | 'I' VP -> V NP | VP PP Det -> 'an' | 'my' | 'The' | 'that' N -> 'elephant' | 'pajamas' | 'boy' | 'mess' 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() NP – noun phrase (именная группа) N – noun (существительное) S – sentence (предложение) JJ – adjective (прилагательное) V – verb (глагол) VP – verb phrase (глагольная группа) Det – determiner (определитель) P – preposition (предлог)
Контекстно-свободная грамматика 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/NV = (NP\S)/N PDet = 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 / FormeelNederlands / gellish.net • The Eiffel tower is located in Paris. • The Eiffel tower is classified as a tower. • Paris is classified as a city.
Formal English / FormeelNederlands / 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.orghttp://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-computer-linguist/ • Gellish English http://gellish.net • Wolfram Alpha http://alpha.wolfram.com