Машинная обработка естественных языков Петр Новиков 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